Commit Graph
7 Commits
Author SHA1 Message Date
pkuzicandClaude Opus 5.5 18914f02f6 MONKEY: enhanced water module (Water Quality: Classic/Enhanced/High) + lava glow
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>
2026-09-24 23:15:57 +01:00
pkuzicandClaude Fable 5.1 45594e2cb4 MONKEY: lighting round 6 — Advanced Graphics options page, moon shadows, ground-effect spell lights
- 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>
2026-09-18 14:32:04 +01:00
pkuzicandClaude Fable 5.1 de13395555 MONKEY: lighting round 5 — 12 exterior light slots, slope-scaled torch bias, spell-light room lane + spellLightGain, Stormwind daylight quota
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-17 01:46:47 +01:00
pkuzicandClaude Fable 5.1 f8b05f25ae MONKEY: lighting round 3 — daylight fixtures, spell lights, shadow quality, 8-light exterior selection
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>
2026-09-13 14:38:53 +01:00
pkuzicandClaude Fable 5.1 9fc7017f34 MONKEY: lighting round 2 — seams, flicker, outdoor torch shadows, perf knobs
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>
2026-09-10 22:50:17 +01:00
pkuzicandClaude Fable 5.1 de0d237a9a 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
pkuzicandClaude Fable 5.1 693d45ac84 MONKEY: dynamic WMO interiors + cube-map torch shadows (surfaces + entities)
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>
2026-09-07 20:12:47 +01:00