Files
benilla-octo/crates/benilla-app
pkuzicandClaude Fable 5.1 082f3ebe50 MONKEY: lighting round — fire/lamp lights, light lanes, room gating, static torch cache
Point lights
- Synthesised lights for fire and lamp models that author none (benilla-formats
  fire_light.rs: flame route from the particle emitter's over-life colour, name and
  emissive-glass routes for lampposts/lanterns/candelabra; NoOmni braziers included —
  they are Orgrimmar's street lighting). Spawned on every lane: ADT doodads, WMO props
  in interior and exterior groups (2.5 yd dedupe against authored MOLT fixtures),
  GameObjects and creatures (carried). Cvar fireLightGain (synthetic only).
- Light LANE decided by a down-ray at the light's position: exterior consumers
  (terrain, models, WMO exterior batches — new per-vertex point term) read exterior
  lights; the interior room lane reads interior fixtures. Fixes interior fixtures
  leaking onto lawns and street torches lighting nothing.
- Interior attenuation: the authored MOLT reach replaces the flat 48 yd, with a soft
  long-tailed profile (constant 1.75 yd core so energy no longer scales with reach),
  cvar interiorAttenScale; a 1.6x default.
- ROOM GATE: a WMO surface takes an interior fixture only if the fixture claims its
  group — claims = containment ∪ MOLR ∪ portal-adjacent rooms (2 hops), shared rule in
  benilla-formats room_claim.rs, packed per light into a 32 KB storage buffer; portal
  claims are weighted (1 across the door frame, fading into the next room) so doorways
  carry no seam; in-building exterior-class groups take claimed fixtures. Carried
  lights (GameObjects, pets) claim rooms from their world position once settled.
  Cvar interiorRoomGate.

Torch shadows
- Casters ranked by contribution at the player with hysteresis and fade weights
  (no pop-in); eligibility 4R+3 and the shadowDistance setting; caster geometry
  gathered around the fixtures, not the camera.
- Static cube maps cached per fixture (rendered once), entity casters rendered per
  frame only for the nearest interiorShadowDynamic fixtures via a depth copy; up to
  16 resident maps (interiorShadowCasters), interiorShadowSoft PCF radius.
- Carried lights: rest-pose flame position (no hand-bone jitter), lane from the
  bearer's cross-fade weight, caster only while settled — the imp no longer strobes.

Entities
- Portal lane cross-fade (tag bits 15..18) and MATTE_INDOOR bit so a unit keeps its
  room lighting across a Bake/Matte flicker; hover highlight folded into the room lane;
  the blob shadow returns whenever the realtime sun lane is inactive (night, beyond
  shadow distance) with a crossfade at dusk/dawn.

Robustness
- A placement or WMO prop whose model fails to load is retired instead of pinning
  the loading screen forever (Stormwind's alliancebrasscannon_flat.m2).
- benilla-extract: wmolights (MOLT + claims + group classes), wmolamps (corpus audit),
  m2firescan (synthesis routes).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-09 16:08:36 +01:00
..