feat(shadows): cast sun shadows from posts, palms and the net
Merged
NO
9d ago+1196+1196+0123456789012345678901234567890123456789-56-56-01234567890123456789
Stacked on #132 (shared presenter code). Review and merge after it.
Summary
Extends the opt-in sun shadows (#122) from characters and the ball to court props, and hides the game's baked shadow overlays that would otherwise double up.
caster pass + posts, palm trunks and leaves (alpha-tested), net tape and rope
- net mesh (wires finer than a map texel smeared), fading particles
visible pass legacy palm/post overlays -> depth/stencil only, matched by texture content
net overlay keeps only its net line; the posts in it cast into the sun map
filter one 5x5 kernel scaled by the pixel footprint, for distant thin shadows
- The game culls scenery spheres beside or behind the camera at 0x0017D2A0, so palms and posts left the shadow map while their shadows were still on screen. With sun shadows on, the runtime routes that test through
recomp_lookup_manualand also keeps spheres within 96 units of the camera. RECOMP_PERF_COUNTER=1reports hidden overlays asprop_shadows.- Research:
docs/wayfinder/research/net-shadow-*.md.
Verification
- MSVC Debug build and
ctestat this layer: 39/39 passed. python tools/public_export.py verify --require-public-treepasses.- clang, macOS and Linux: covered by this PR's
public-cirun. - Player play tests on Zack Island morning, dusk and sunset, Niki Beach and Private Beach: one palm shadow per palm (the dusk double shadow is gone), post shadows correct, no old overlays left over.
Merge danger
One-way for players: this adds manual call target 0x0017D2A0 to the generation recipe (RECIPE_SHA256 changes). After merge, every player must rerun BuildGame; regeneration changes the 15 functions that call it. With sun shadows off, the culling test behaves as before.
Contribution checklist
- The change follows
AGENTS.mdandCONTRIBUTING.md. - No XBE, generated game C, retail instruction bytes, extracted assets or
filenames, saves, BIOS data, private paths, or run evidence are included. - Third-party material and its license are identified, if applicable.