Need help getting started? Try the player guide. These notes include older work; the game overview explains what’s ready now.

Native sprite clipping, 2026-10-21

Death sprites and explosion artwork can extend below an actor's logical floor. The native per-pixel world depth test sliced off those texels. Raising the sprite or adding a depth bias would move original artwork or expose walls.

Original rendering rule

The recovered actor_queue.c insertion (08001238), wall_renderer.c wall results, and actor_projection.c agree on a different rule: actors are painted back-to-front through wall silhouette clips. Floor and ceiling pixels do not independently depth-test the sprite. Wall depth endpoints choose front/behind; when those depths straddle the actor, its XY origin chooses the wall side. Portal bottom/top silhouettes are gated by the actor body's bottom/top Z, not the artwork's opaque texel bounds. One-sided and closed walls hide the whole overlapping interval. The existing explicit step_adjust crop remains. These recovered routines already have ROM differential validation; their GBA implementation is unchanged by this correction.

Shared native implementation

pc_actor_clip.inc owns reusable clipping scratch. pc_renderer_pitch.inc projects nearer wall intervals into the upright billboard plane, applies the original body-height silhouette gates, splits at interval endpoints, and clips against the resulting linear upper/lower bounds. The visible pieces are triangulated before camera pitch and near/water-plane clipping. This preserves native resolution, FOV and vertical aim without scaling a 120-column GBA mask.

Software and Vulkan now use those same prepared actor triangles and stable far-to-near ordering, including reflections. They do not retest those triangles against floor/ceiling depth. The returned actor depth remains geometric for later effects. Transparent texels still discard; fixed-screen weapon effects paint after all world actors. Vulkan retains its two batched pipelines and no longer needs a sprite depth bias. World geometry still uses normal depth tests.

Native floating-point coverage is not claimed pixel-identical to GBA's integer rasterizer. GBA's original clipping/rasterization path remains intact.

Validation

tests/sprite_clip_fixture.h runs through both real backends. A grounded sprite extends below its own floor at three pitch/FOV combinations. It must retain thousands of covered pixels that the old depth test discarded; lowering all floors must not expose any additional sprite rows. A sprite behind a real one-sided wall must remain fully hidden at each tested pitch. Existing Vulkan priority/transparent-layer and paired scene/reflection checks still run.