feat(shadows): cast sun shadows from posts, palms and the net

Merged
NO
9d ago
+1196-56

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_manual and also keeps spheres within 96 units of the camera.
  • RECOMP_PERF_COUNTER=1 reports hidden overlays as prop_shadows.
  • Research: docs/wayfinder/research/net-shadow-*.md.

Verification

  • MSVC Debug build and ctest at this layer: 39/39 passed.
  • python tools/public_export.py verify --require-public-tree passes.
  • clang, macOS and Linux: covered by this PR's public-ci run.
  • 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.md and CONTRIBUTING.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.