Water (Enhanced/High only; Classic stays byte-identical to upstream):
- scene depth resolved after the main opaque pass and bound to liquids
(liquid/scene_depth.rs, water_depth.rs)
- procedural multi-band waves with analytic normals; long ocean swell moves
vertices, mirrored on the CPU (liquid/waves.rs)
- separate ocean and inland profiles; depth-driven colour and soft edge
- Fresnel sky reflection, sun path, moon path, point-light glints
- beach surf driven by the shore wave phase: continuous front, dissolving
lace, swash sheet; only where the authored sea bed is shallow, so sunken
objects never foam; thin bed clutter (grass, reeds) ignored for contact foam
- swimmers: wake foam, treading rings, visual-only bob with the swell
- river flow effect tried and removed at the owner's request
Lava: magma surfaces emit warm point lights through the lighting module
(lighting/lava_light.rs, lavaLightGain).
Options: Water Quality + Lava Glow rows (EN, RU strings prepared).
Docs: WATER.md. Credits: design reference WarcraftXL wxl-experimental-water,
author iThorgrim (reuse permitted with attribution).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Advanced Graphics page: Lighting Quality preset (Off/Low/Medium/High/Custom, one const table,
Off = the original client's look), shadow rows moved from Graphics, Shadow Resolution, Moon
Shadows, interior/torch/fire/spell/night rows; EN+RU strings; works in player builds.
- Moon shadows: the single shadow rig re-aims at the moon at night (MoonShadowStrength 0.35);
attenuates only the night sky term, never point lights; covers terrain, WMO exteriors, models
and retained doodads; stateful hand-over for clock jumps; blob gated on a built silhouette;
zero cost at strength 0. Signed fog_params.z carries +sun / -moon*strength.
- Area spell lights: SpellLightMode::Area for Flamestrike, Rain of Fire, Consecration, Flare,
Explosive Trap (school-based where the model says nothing); Blizzard/Hurricane/Volley/frost
traps stay dark; repeating impacts deduped; benilla-extract spellvis prints the area block.
1121 world+formats tests; 8/8 WGSL probes; UI and world smoke scenes clean.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Interiors
- Daylight fixtures (lighting/daylight.rs): PORTAL/APERTURE/BOUNDARY seeds calibrated so the
room law at a door equals the sunlit reference; BLEED fixtures at interior↔interior portals
carry 0.6× the brighter side; interiorDaylight default 0 (daylight only through doors/windows).
- Darkness gains: nightGain 0.45, interiorGain 0.5 (Dim preset), interiorAmbient 0.015, fill 0.08.
- Enclosed day floor + shell candle add + TRANS night floor (capped 1.5× room, sun-gated).
- interiorBakeFloor 0.12: a per-fragment floor from the authored MOCV so fixture-starved rooms
(the Lion's Pride vestibule, 2 % of tex before) are never black; packed in sh_c16.w's fraction.
- TRANS blend continuity: smooth-max replaces the per-channel max whose crossing loci drew a
hard diagonal across the vestibule floor by day.
- Debug panel "Lighting & shadows" (Ctrl+Shift+D) with sliders for every lighting cvar + presets.
Torch cube-map shadows
- Owner exclusion (LightOwner placement/instance + flame-in-bounds) — the swinging lantern.
- torchShadowStrength 0.7 shadow floor (packed with soft into TorchTable.count.y), PCSS-lite
contact hardening (raw depth blocker search), interiorShadowSoft 1.5.
- Moving fixtures (carried lights) re-render every frame (cap 2) instead of publishing a stale map.
- Normal offset on the WMO surface lane (interior + exterior) — the imp's boxy/moiré pool.
Spell and firework lights (benilla-formats fire_light.rs spell route)
- Fire / Holy / Fel effects emit a short-lived point light (kits, missiles, impacts, firework
GO shells); frost/nature/arcane/shadow vetoed by name; lifecycle envelope; cap 24;
WOW_SPELL_LIGHT=0 kill switch.
Exterior point lights
- ≤3-nearest per draw unit → 8 (8-bit ranks, table cap 255), ranked by distance to the chunk's
box; cube occlusion only for ranks 0..2. Removes the chunk-edge "scars" at the Darkmoon Faire
(15 synthesised fixtures in one chunk's reach) and the lit-bench-over-dark-ground disagreement.
Tooling: benilla-extract wmolights --verts <group>; missing-model placements retire instead of
pinning the loading screen.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Seams
- An exterior-class MOBA batch inside an interior group (the inn's cellar stair) took the
night sky; its authored day weight is now scaled by the sun, so it joins the room law after
dark. Exterior-class SHELL groups keep the sky law (moving them to the room law painted
facades black at dusk).
- Containment claims cross portals larger than 28 yd² (floor splits, gallery voids) at full
weight, so a floor cut by a group boundary lights continuously. interiorDebug 4 colours WMO
fragments by lane. wmolights prints group names, lane, portal areas.
Fire
- Flame lights flicker: band-limited sines + smoothed noise per fixture, candle fast/light to
bonfire slow/deep, seeded by position, mean exactly 1; lamps never; authored fixtures only
when warm. Cvar fireFlicker.
Outdoor torch shadows (step a)
- At night exterior fire lights become cube-map casters (half the map budget), WMO exteriors
and models receive them with a world-distance fade; held torches never cast; a fire's own
model is excluded from its map; daylight is bit-identical. Cvar exteriorShadows.
Performance
- Torch lane: static-scene fingerprint walk gated on a residency/part census (was 4 full
walks per frame), entity caster rebuilt at interiorShadowEntityRate Hz (30) and gathered
only within each fixture's reach, receiver shadow taps skipped at zero contribution, table
and claim uploads and the torch bind group skipped when unchanged. Live bank sized to 8
dynamic slots (VRAM 192 -> 144 MiB).
- Sun lanes: live cvars shadowMapSize (default 2048, was 4096), shadowFilter,
characterShadowRate / worldShadowRate (30 Hz proxy rebuilds), shadowCasterReach.
- Measured (inn, 1080p): debug 45 -> 61 FPS, release 83 FPS with everything on.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
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>
Interior rooms light per fragment from their authored fixtures instead of
the MOCV bake (direct + fill + ambient, soft rolloff; live cvars
interiorLight/interiorAmbient/interiorFill/interiorExposure/interiorShadows/
interiorDebug), TRANS/EXT batches blend to the day/night reference at the
portal seam, and fixtures admit camera-independently (90 yd).
Torch shadows are a from-scratch depth-map renderer (Bevy point shadows are
dead under ClusterConfig::None): a shared Depth32Float 512^2 x 24-layer Image
+ depth-only pipeline + ViewNode rendering the static caster and a per-frame
entity caster into 6 cube faces for the nearest <=4 fixtures (reverse-Z,
GreaterEqual compare, 4-tap PCF, far fade). WMO surfaces receive through
static_gx group 3; entities receive on the wow_model path through
WowModelExt bindings 91/92/93 (depth array, comparison sampler, 1616-byte
torch table) with a 0.15 yd normal offset against CPU-vs-GPU skinning
self-shadow.
The entity lane is gated on is_interior OR the new MATTE_INDOOR tag bit
(exterior payload bit 14, written by the classifier's Matte law), so a unit
whose verdict flickers Bake<->Matte at one spot keeps its room lighting.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>