Skip to content

OpenMoHAA VR for Quest 3 — 0.1.0

Pre-release
Pre-release

Choose a tag to compare

@bearstonem bearstonem released this 31 Jul 21:36

A native OpenXR port of OpenMoHAA — the
open-source Medal of Honor: Allied Assault engine — running standalone on a Meta
Quest 3. No PC, no streaming.

This is a pre-release: it plays, but it is a port in progress and several
things below are known to be unfinished.

You need the original game data

The APK is the engine only. Medal of Honor: Allied Assault is not free software
and none of its content is distributed here — you need a copy you own (the GOG
War Chest release is what this was developed against).

Copy the main/ folder from your install to:

/sdcard/Android/data/org.openmoh.openmohaa/files/main/

Install

adb install -r openmohaa-vr-quest3-0.1.0.apk
adb push autoexec.cfg /sdcard/Android/data/org.openmoh.openmohaa/files/main/autoexec.cfg
adb shell am force-stop org.openmoh.openmohaa

Then launch it from inside the headset, from Unknown Sources. Do not start it
with adb shell am start — the launch goes through an interstitial and the
app comes up without a usable surface.

autoexec.cfg is optional. It is the only way to set a cvar on a device with no
console, and it is worth having if you want to change anything, but every value
the port needs to be correct is compiled in — the APK behaves without it.

Two traps worth knowing, both of which cost time here:

  • adb install -r does not kill the running process. Force-stop after
    installing, or the next launch resumes the old build.
  • Never create main/save or main/configs yourself with adb. A directory
    made by adb shell mkdir is owned by shell and no chmod makes it
    app-writable. The game autosaves on mission start and treats the failure as
    fatal, so the symptom is a black screen after New Game. Let the engine create
    them.

What works

Stereo VR at 90 Hz with 6DoF head tracking. Stick locomotion, snap turning, and
menus on a quad layer fixed in the room. The weapon is held in your hand and
aimed by the controller rather than by your head, with a hand model on each
controller anchored to its own bone. Missions start and play.

Known limits

  • It does not hold 90 fps while moving. The eyes render at the full
    1680×1760 per eye: 90 fps standing, 77–85 while moving, so most frames in
    motion are reprojected by the compositor. This is a deliberate trade — it
    plays well and the picture is much sharper — and vr_resolutionScale is the
    first thing to give back.
  • The HUD is still flat screen space during gameplay, so it does not
    converge properly. Menus are fine; they are on the quad layer.
  • Weapon grip alignment is one global setting (vr_weaponAdjust) shared
    across every weapon, so a pistol and a bazooka sit the same way in the hand.
  • Untested on device: the two-handed hold, the reload gesture (tap the weapon
    hand's grip), and off-hand steering.
  • Some foliage still rotates with head movement.
  • A SIGSEGV in the Adreno driver appears in the log at every launch. It predates
    all VR work, was present in the flat builds, and the process survives it.

Only the Quest 3 has been tested. Other Android XR devices may work and none are
supported.

Notes

The APK is debug-signed — there is no release signing config in the tree — which
is why it installs as an unknown source. It is a Release CMake build of the
engine; only the APK wrapper is the debug variant.

The renderer is renderergl1 on gl4es rather than renderergl2. rend2 ran this
content at 10–15 fps, spending 50–60 ms of CPU per eye binding GLSL programs for
lighting that art authored in 2002 has no maps to feed, while the GPU finished
in 3 ms.

Build instructions are in docs/markdown/04-coding/03-android.md. The state of
the port, including what was learned that contradicts the original plan, is in
VR_PORT_STATUS.md. QUEST_PORTING_GUIDE.md is the reusable version, written
for the next id Tech port rather than for this one.

Built on Team Beef's RTCWQuest, which is
the reference this port was checked against throughout, and on the work of the
OpenMoHAA project.