Refactor the shadow feature into a shared framework + two equal lanes, and
add two visual improvements. Confirmed in-game.
- shadow_core.rs (NEW): the shared rig both lanes plug into — one directional
sun on the private layer, the camera-layer plumbing, the shadow map, the
invisible proxy material, the sun aiming, and the shared caster-collection
helpers. Lanes coordinate through a ShadowDemand/ShadowFrame handshake (rig
runs first each frame, publishes the frame; lanes declare demand + build their
casters after). character_shadow and world_shadow are now EQUAL, independent
lane plugins that depend only on shadow_core, never on each other — add,
remove or reorder either freely.
- character_shadow.rs: slimmed to just the CREATURE caster lane.
- world_shadow.rs: the WORLD lane — static_gx solid + alpha-tested foliage +
a per-frame entity-resident environment caster (the two entity casters were
one shared mesh before; splitting them is what makes the lanes independent).
- Moving sun: the shadow basis now tracks the VISIBLE celestial sun (which
genuinely rises/sets) instead of the near-fixed lighting sun, so shadows sweep
through the day. Elevation clamped to ~18..65 deg so a set/zenith sun never
inverts or degenerates the basis; azimuth preserved.
- Edge fade: the realtime shadow lightens toward the cascade's max distance so
it fades in rather than popping at the resolve boundary.
- Night fade: shadow strength ramps by the real sun height (packed into the free
fog_params.z light lane), so shadows soften and vanish at night; the baked MCSH
terrain shadows fade back IN at night for the world lane, keyed off the same.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>