u/Background-Concert-1

Image 1 — [WIP] OpenMoHAA on PS Vita Fat — walls are rendering now!!!
Image 2 — [WIP] OpenMoHAA on PS Vita Fat — walls are rendering now!!!
Image 3 — [WIP] OpenMoHAA on PS Vita Fat — walls are rendering now!!!
Image 4 — [WIP] OpenMoHAA on PS Vita Fat — walls are rendering now!!!
Image 5 — [WIP] OpenMoHAA on PS Vita Fat — walls are rendering now!!!
Image 6 — [WIP] OpenMoHAA on PS Vita Fat — walls are rendering now!!!
▲ 207 r/vitahacks

[WIP] OpenMoHAA on PS Vita Fat — walls are rendering now!!!

Medal of Honor: Allied Assault running on PS Vita Fat. After weeks of debugging, the BSP world finally renders clean.


The bug

For weeks, brush faces would shoot broken triangles into the sky — basically unplayable. The Q3-style SF_FACE surface path just doesn't play well with vitaGL.

The fix

Routing those surfaces through SF_TRIANGLES at BSP load time. Walls, floors, ceilings — all clean now.

> Bonus: MP3 playback also works. libmad from vdpm was built with -fshort-enums, breaking the ABI. Rebuilt from source — audio came alive. All 2630 retail audio files from Disc 1+2 load fine.


What works

  • m1l1 (Algerian intro mission) playable end-to-end
  • All BSP geometry renders correctly
  • NPCs animate, shooting, save/load
  • Full retail audio: MP3 music, WAV SFX, RoQ cutscenes

What's not there yet

  • Performance — ~5-15 FPS in dense outdoor scenes (locked at 30 cap). Bottleneck is GPU draw-call throughput. Next step is surface batching, which is a renderer rewrite.
  • No crosshair / reticle — 2D UI stripped for perf (intentional)
  • Truck headlight cones render as solid triangles instead of glowy beams (cosmetic)

Vita Fat compatible. Source → https://github.com/HenryKun55/openmohaa/tree/vita-port

First photo is the OLD broken vertex shot — look at that triangle reaching into the sky. The rest is current state running on my Fat.

u/Background-Concert-1 — 14 hours ago
▲ 188 r/vitahacks+1 crossposts

[WIP] OpenMoHAA on PS Vita — Medal of Honor: Allied Assault native port

TL;DR: WIP native PS Vita port of OpenMoHAA (the open-source engine for Medal of Honor: Allied Assault, 2002). The full intro flow plays, the main menu works, Mission 1 (m1l1) loads to completion and the player can move / aim / shoot. Not playable yet — vitaGL's shader translator mangles some vertices after scripted cutscenes.

What works ✅

  • EA / 2015 / MOHAA / legal screen intros
  • Main menu with touchscreen + gamepad navigation
  • Mission briefing screens
  • Mission 1 (m1l1 — submarine) loads to completion
  • HUD: compass, health, crosshair, weapon model
  • All Vita Fat controls bound (Cross/Square/Triangle/Circle, L/R, both analogs)
  • DXT texture compression (engine R_LoadImage → glCompressedTexImage2D — 4× VRAM savings)
  • 30 FPS cap for stable framerate
  • vitaGL boot splash removed (custom OpenMoHAA splash continues from LiveArea zoom)

What's broken / TODO ❌

  • Vertex artefacts in m1l1 starting at the Nazi-inspection scripted scene. Theory: vitaGL's GLSL→GXM translator can't reset client vertex attribute state between TIKI skeletal-mesh batches and BSP world batches. qglLockArraysEXT already force-disabled (matching vitaQuakeIII / vitaRTCW); doesn't fix it alone.
  • Performance ~15–25 fps under load — shader-translation bound, not GPU fillrate
  • Briefing → m1l1 transition crashes on the second InitGame because the .suprx PRX modules can't truly reload on Vita. Worked around by redirecting map briefing/briefingNmap mNl1 in SV_Map_f.
  • Audio in OGG instead of native MP3 — engine's libmad path produced 0-byte reads; converted to OGG as workaround. Future TODO: restore MP3 native via libmad.
  • Some MP / training maps not yet tested
  • No save-game integration yet

Technical highlights

  • Custom dlopen wrapper around sceKernelLoadStartModule for fgame / cgame .suprx PRX modules (similar pattern to vitaQuakeIII / vitaRTCW).
  • C++ operator new/delete overridden in the .suprx modules to route through the engine's 240 MiB newlib heap via the g_engsysfuncs imports table — the per-module 2 MiB libstdc++ heap was the original bad_alloc ceiling.
  • Custom vita_boot_splash.c loads app0:/sce_sys/livearea/contents/bg.png via libpng and paints it as a fullscreen quad immediately after vglInit, so the LiveArea zoom transitions straight into a static splash that holds until the EA intro takes over.
  • Rebuilt vitaGL locally with NO_SPLASHSCREEN=1 to remove the vitaGL logo flash.
  • Sized the engine + .suprx newlib heaps (240 MiB main + 2 MiB per module) so the kernel still has enough PHYCONT to sceKernelLoadStartModule both modules at boot.

Source / build

Source not public yet — still cleaning up Vita-specific patches. DM if you're a developer interested in collaborating on the vertex-state issue or the briefing-transition workaround; happy to share commits privately.

Requirements (when it ships):

  • vitasdk + cmake
  • Original MOHAA assets required — Pak0–Pak5.pk3, .scr / .shader. Not distributed. Get them from your own copy of the game.

Screenshots / video

Video

Tested on Vita Fat. Slim / PSTV should work too (untested).

Credits

  • OpenMoHAA team — engine
  • Rinnegatamante — vitaGL, vitaQuakeIII reference port
  • isage — SDL2-Vita

Happy to take suggestions on the vertex bug — drop a comment.

u/Background-Concert-1 — 2 days ago