- Cross-build against the Steam Runtime 4 arm64 SDK (build_linux.sh,
cmake/steamrt4-arm64.cmake): the executable sits at 0x98000000 next to
the game's 32-bit window, with the OpenXR loader and jsoncpp beside it
(RPATH $ORIGIN); build_linux.sh also packs a release archive.
- OpenXR on SteamVR: EGL surfaceless through XR_MNDX_egl_enable, the
Frame controller profile (both names), a flick or a wrist turn as the
Wii Remote's shake, the D-pad as look; the refresh rate goes to 120 Hz
through vrcmd where the runtime offers only its current rate.
- Timewarp in the app: SteamVR shows frames that arrive in time as they
were rendered, so at 120 Hz every game frame stood still for two
refreshes while the head turned. The game frame's eyes now go into a
scene set, and every refresh composites the last finished set turned
to its own head pose (timewarp.h, checked by tools/timewarp_test and
by the simulator's PETARI_XRSIM_WARP); sharpening runs once per game
frame; the pacing changes only after a new display period has held.
- Fixes found on the way: libstdc++'s <cstdio>/<cwchar> against the MSL
renames (compat.h), language archives a disc carries damaged (cook.py
takes another language's), host allocations on the DVD and DSP
threads, quitting without waiting on the game's threads, case of two
include names.
- ANLEITUNG-STEAM-FRAME.md: the player's guide in German.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Version code 7, for the release with the American disc, the settings
panel's tabs, the language choice, the inverted camera turns, passthrough
around the giant screen and the screen picture that follows the GPU's
load.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The settings panel beside the pause menu held nine of the settings of
petari_vr.ini; the others needed the file edited over adb. Players asked
for all of them in the game, for a choice of language, for the camera's
turns the other way round and for the room around the giant screen.
- One table of the numeric settings (vr::Setting in vr_game.cpp: key,
range, default, how to read and change it) now serves the file's loader
and the panel. Values outside a setting's range are clamped instead of
ignored.
- The panel (vr_settings.cpp) is drawn from tables of rows (a switch, a
stepper or a slider) on four tabs: Screen, Diorama, Picture, Game, with
a Defaults button for the open tab. It writes only the lines of the
settings changed on it, in one pass, so the rest keep following the
defaults. The refresh rate and the highest resolution now apply at
once; the clock levels and the language at the next start.
- language: each disc's languages (European: English, French, German,
Spanish, Italian; American: English, French, Spanish) with their
folders; SCGetLanguage answers with the one asked for when the copy has
its texts. The European disc's EuDutch folder holds the English texts
again and is not offered.
- invert_camera (on by default): the game moves its camera round Mario
the way the D-pad is pressed, so the view turns the other way. With
the setting CameraLocalUtil's two tests swap sides (and CameraInfo's
two arrows), and the diorama's snap turn takes the other sign: pushing
the right stick right turns the view to the right. Pages and menus
keep their sides.
- passthrough (off by default): XR_FB_passthrough, with
com.oculus.feature.PASSTHROUGH declared (not required) in the manifest.
The feature and a reconstruction layer are made when the setting first
asks, and paused while it does not. While they run the passthrough
layer goes out first and the eye layer blends by its alpha; around the
giant screen the eye images are cleared to transparent, fading over
0.3 s. The diorama's eye images stay opaque.
Checked headless on the headset (every tab and control, the saved file,
the camera's direction with the setting off and on, French and Spanish
texts on the two discs) and in the app unworn (the language from the
file, passthrough started, paused and started again without an error,
the refresh rate changed from the panel). Measured there with
passthrough: the compositor's GPU time goes from 1.9 to 3.1-4.2 ms a
refresh; worn, a player's heavy scene fell from 60 to 44 frames a second.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Version code 6, for the release that keeps the stage music playing and
plays it at its full volume.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Version code 5, for the release with stereoscopic 3D on the giant screen,
the view that starts facing the player, the comet filter left out of the
diorama, and the converter as a download of its own.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The emulated accelerometer had its own axes (x right, y along the
pointer, z out of the button face) where KPAD's are x left, y out of the
button face, z along the pointer ((0, -1, 0) held level, KPADReset),
which the game then remaps (WPadAcceleration::update). A level
controller read as a remote standing on end: the surfing coach's "Point
your Wii Remote at the screen" never passed, and the Star Ball would
roll forward at full speed.
- wpad.cpp adds gravity in KPAD's axes. While the game steers by tilt
(port_input_use_tilt), it follows the right controller pitched up by
the game's neutral angle, so a level controller gives the grip the
game asks for; a controller whose orientation is unknown counts as
level. PortPadState carries which way is down from the controller
(xr_app.cpp) and, as accelerations, only the motion on top (shakes).
- Star Ball: neutral 80 degrees (90 - sCoreBaseDegreeYZ), not 100. Its
tutorial reads the tilt only while it checks that the remote is
raised, so aiming near the sign never counts as a shake.
- PETARI_INPUT scripts tilt the controller with PITCH= and ROLL=.
- docs/CONTROLS.md: the in-game instructions in controller terms.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A native port built on the Petari decompilation (previous commit): an
HLE platform layer (OS, DVD, GX, audio, input, NAND) under the game's
own code, an OpenXR presentation (a diorama around the player, a giant
screen, the HUD and settings as compositor layers, SpaceWarp, dynamic
resolution), Touch Plus controls, the tools that convert your own game
files (tools/cook, which also takes the few pieces of data the game's
executable holds from your sys/main.dol), and the port's changes to the
decompilation (`git diff petari-base -- decomp`). README.md explains
installing and building, docs/TECHNICAL.md how it works.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>