fix #176 #177: the camera-capped light snapshot evicted visible cells' torches — per-cell lighting popped at seams
The probe launch discriminated it: the user reproduced the purple floor flash while [light] (ambient branch) and [pv-input] (portal flood) read provably healthy — eliminating the last CPU-side theories and exposing the one channel the probes could not see: per-cell 8-light set composition. BuildPointLightSnapshot kept the MaxGlobalLights=128 point lights nearest THE CAMERA; the Facility Hub registers 366 fixtures, so 238 were evicted per frame by camera distance. SelectForObject (faithfully camera-independent, and unit-pinned as such) could only choose from the surviving 128 — an in-range torch of a visible cell that ranked past the cap dropped out of that cell's 8-set, so per-cell Gouraud lighting flipped as the chase boom swung the camera: - #176: the flipping unit is a CELL -> discontinuity lines at exactly cell-seam granularity; a torch-losing floor drops to dim blue-grey stone at 0.2 ambient (the perceived purple), camera-angle dependent. - #177: a stair room whose torches all ranked past the cap rendered at bare 0.2 ambient (near-black = 'not visible'); approach re-admitted them ('pops into existence'); the sweeping boundary dropped the ramp's lights mid-descent ('disappears on the last step'). The geometry never vanished - its lights did. Retail's minimize_object_lighting (0x0054d480) has NO global camera-nearest pool cap (lights register per cell, insert_light 0x0054d1b0). Fix: MaxGlobalLights 128 -> 1024, a non-biting safety valve (GlobalLightPacker grows to fit; 64 B/light). Register row AP-85. TDD pin: PointSnapshot_HubScaleLightCount_ObjectSelectionIsCameraInvariant (RED at 128 with a Hub-scale 401-light layout, GREEN at 1024). The pre-existing camera-independence pin covered the SELECTOR but not the SNAPSHOT it selects from - the pop re-entered one stage upstream. Suites: Core 2588 / App 719 / UI 425 / Net 385 green. Pending user gate. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
b8e9e204ad
commit
4d25e04d83
5 changed files with 151 additions and 28 deletions
|
|
@ -106,18 +106,23 @@ corridor, and (c) pops into existence on entering the room. Classic
|
|||
portal-visibility miss: the stair geometry's cell is not reached by the
|
||||
portal flood from the viewer's cell until the viewer crosses into it.
|
||||
|
||||
**Root cause / status:** INVESTIGATED 2026-07-06 (session 2) — the #119
|
||||
class is REFUTED for this issue: the "stairs" are a RAMP owned by shell
|
||||
cell 0x8A020182 (no statics anywhere near), connected by VERTICAL portals
|
||||
(not floor-portals), and the portal flood admits 0x0182/0x0183 correctly
|
||||
from every tested corridor eye/pitch (headless replays
|
||||
`Issue176177FacilityHubFloodReplayTests`). Membership transits are
|
||||
plane-exact; mesh/frustum/texture layers verified healthy. Twelve
|
||||
candidate mechanisms refuted — full ledger + the surviving theories +
|
||||
the ONE-launch probe protocol in
|
||||
**Status update:** 🟡 FIX SHIPPED 2026-07-06 — pending user gate.
|
||||
**Root cause (found via the probe launch):** the geometry never vanished —
|
||||
its LIGHTS did. `BuildPointLightSnapshot` kept only the `MaxGlobalLights=128`
|
||||
point lights nearest THE CAMERA; the Facility Hub registers 366 fixtures, so
|
||||
238 were evicted per frame by camera distance. A room whose torches all
|
||||
ranked past the cap rendered at bare 0.2 ambient (near-black in a dungeon =
|
||||
"not visible"); approaching re-admitted them ("pops into existence"); the
|
||||
eviction boundary sweeping with the camera dropped the ramp's lights
|
||||
mid-descent ("disappears on the last step"). Retail's
|
||||
`minimize_object_lighting` (0x0054d480) has no global camera-nearest cap.
|
||||
**FIX:** cap raised to a non-biting 1024 safety valve (register row AP-85);
|
||||
pin `LightManagerTests.PointSnapshot_HubScaleLightCount_ObjectSelectionIsCameraInvariant`
|
||||
(RED at 128, GREEN at 1024). Investigation ledger (12 refuted mechanisms +
|
||||
the probe run that discriminated):
|
||||
`docs/research/2026-07-06-176-177-render-pair-investigation.md`.
|
||||
NEXT: run the probe protocol (ACDREAM_PROBE_LIGHT + ACDREAM_PROBE_PVINPUT
|
||||
+ ACDREAM_PROBE_CELL) during the pending #175 door-gate launch.
|
||||
**Gate:** stairs/stair room stay visible (lit) from the corridor, through
|
||||
the descent, at all approach angles.
|
||||
|
||||
**Acceptance:** the staircase renders whenever its room is visible through
|
||||
the connecting opening, and stays rendered through the full descent.
|
||||
|
|
@ -138,20 +143,25 @@ render; the physics fix landed (seam shake gone, user-gated) and the flash
|
|||
REMAINS — so it is a render-side issue in its own right, correlated with
|
||||
camera angle.
|
||||
|
||||
**Root cause / status:** INVESTIGATED 2026-07-06 (session 2) — the
|
||||
placeholder-texture theory is REFUTED (all surfaces resolve; the floor
|
||||
IS drawn: the textured PortalSide floor-portal strips are included by
|
||||
CellMesh.Build; the under-hall reciprocal is NoPos). So are eleven other
|
||||
mechanisms (seal z-fight, root/eye incoherence, flood bistability, DXT
|
||||
alpha/undefined mips, fog mix, lightning leak, viewer-light pops…) —
|
||||
full refutation ledger, the two surviving theories (T-A outdoor-ambient
|
||||
flip on playerRoot gaps: sun-on-floors explains the FLOOR selectivity;
|
||||
T-B flood misbehavior under real production inputs), and the ONE-launch
|
||||
probe protocol in
|
||||
**Status update:** 🟡 FIX SHIPPED 2026-07-06 — pending user gate.
|
||||
**Root cause (found via the probe launch):** per-cell LIGHTING pops, not a
|
||||
draw failure. The probe run reproduced the flash while the ambient branch
|
||||
([light] insideCell/0.2 grey — stable) and the portal flood ([pv-input] —
|
||||
zero drops in 54k frames) were provably healthy — which eliminated the
|
||||
last CPU-side theories and exposed the one channel the probes could not
|
||||
see: per-cell 8-light SET COMPOSITION. `BuildPointLightSnapshot` kept the
|
||||
128 lights nearest THE CAMERA of the Hub's 366 registered fixtures; an
|
||||
in-range torch of a visible cell that ranked past the cap was evicted, so
|
||||
that CELL's Gouraud lighting flipped as the camera moved — discontinuity
|
||||
lines at exactly cell-seam granularity, camera-angle dependent (the chase
|
||||
boom swings the camera position, re-ranking the 128), and a torch-losing
|
||||
floor drops to dim blue-grey stone (the perceived purple flash). Twelve
|
||||
other mechanisms refuted first — ledger in
|
||||
`docs/research/2026-07-06-176-177-render-pair-investigation.md`.
|
||||
The purple itself can only be the fog-tinted clear color (undrawn
|
||||
pixels) or the outdoor ambient+sun tint — every other purple source in
|
||||
the pipeline is now excluded. NEXT: the probe launch (see #177).
|
||||
**FIX:** `MaxGlobalLights` 128 → 1024 non-biting safety valve (AP-85);
|
||||
pin `LightManagerTests.PointSnapshot_HubScaleLightCount_ObjectSelectionIsCameraInvariant`.
|
||||
**Gate:** no purple/lighting flashes on floors at corridor seams from any
|
||||
camera angle while running the 015E↔017A loop.
|
||||
|
||||
**Acceptance:** no purple/placeholder flashes on dungeon floors from any
|
||||
camera angle at the corridor seams.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue