revert #176/#177 cap raise: the uncapped light pool exposes unported per-cell reach semantics — defer to A7
The MaxGlobalLights 128->1024 fix (4d25e04d) was live-tested and made
the eviction pops stop — but with the full 366-fixture pool active,
three unported retail lighting semantics dominate the Facility Hub:
(a) lights reach THROUGH solid floors/walls: retail registers lights
per-CELL (insert_light 0x0054d1b0) so the under-room portals'
purple light never touches the corridor above; our flat
sphere-overlap selection has no reach/occlusion notion — rooms
washed magenta (user screenshot).
(b) stationary weenie fixtures ride the DYNAMIC 1/d falloff (~9x
retail's static 1/d3 bake curve at 3m) — the #143 isDynamic
assignment is wrong for ACE-served world fixtures.
(c) an unexplained striped z-fight-like artifact on lit floor regions
(user screenshot; no coincident dat geometry — the coplanar-pair
sweep came back empty; not a striped texture — all corridor
surfaces are plain Base1Image stone).
Reverted to 128. The cap is now documented as a LOAD-BEARING STOPGAP:
it accidentally approximates per-cell reach by keeping the pool local
to the camera. The #176/#177 root cause (cap eviction popping per-cell
light sets) stays CONFIRMED and fully documented; the real fix is the
A7 dungeon-lighting arc: per-cell light registration + the static
fixture curve + the stripe hunt, THEN uncap. The desired-end-state pin
is kept as Skip with the full pointer. Register row AP-85 rewritten to
match reality; ISSUES #176/#177 back to OPEN with the complete
mechanism story.
Suites: Core 2591+3skip / App 719 green.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
4d25e04d83
commit
d591e3bbe5
5 changed files with 169 additions and 48 deletions
|
|
@ -176,18 +176,28 @@ public sealed class LightManager
|
|||
public const int MaxLightsPerObject = 8;
|
||||
|
||||
/// <summary>Hard cap on the per-frame global point-light snapshot the shader
|
||||
/// indexes. #176/#177 (2026-07-06): the old value of 128 BIT in the Facility
|
||||
/// Hub — 366 registered fixtures, so 238 were evicted per frame by camera
|
||||
/// distance. An in-range torch of a VISIBLE cell that ranked past the cap
|
||||
/// dropped out of the cell's 8-light set, so per-cell Gouraud lighting popped
|
||||
/// as the camera moved (the purple seam flash / the stair-room pop-in).
|
||||
/// Retail's <c>minimize_object_lighting</c> (0x0054d480) has NO global
|
||||
/// camera-nearest cap — every registered light reaching an object is a
|
||||
/// candidate. 1024 is a pure safety valve (the whole Facility Hub registers
|
||||
/// 366; GlobalLightPacker grows to fit, 64 B/light on the GPU) and must never
|
||||
/// bite at real content scale — if it ever does, raise it, don't tune it.
|
||||
/// Pin: LightManagerTests.PointSnapshot_HubScaleLightCount_ObjectSelectionIsCameraInvariant.</summary>
|
||||
public const int MaxGlobalLights = 1024;
|
||||
/// indexes. ⚠️ LOAD-BEARING STOPGAP — read before touching (#176/#177,
|
||||
/// 2026-07-06): this cap BITES in the Facility Hub (366 registered fixtures →
|
||||
/// 238 camera-distance evictions/frame), and the eviction is the CONFIRMED
|
||||
/// mechanism of the #176 purple seam flash + the #177 stair-room light
|
||||
/// pop-in — an in-range torch of a visible cell that ranks past the cap
|
||||
/// drops out of that cell's 8-set, so per-cell Gouraud lighting pops as the
|
||||
/// camera moves. Retail's <c>minimize_object_lighting</c> (0x0054d480) has
|
||||
/// NO global camera-nearest cap. HOWEVER: raising the cap to 1024 was
|
||||
/// live-tested 2026-07-06 and REVERTED — with the full pool active, three
|
||||
/// unported retail lighting semantics dominate the frame: (a) lights reach
|
||||
/// THROUGH solid floors/walls (retail registers lights per-CELL via
|
||||
/// <c>insert_light</c> 0x0054d1b0 — a portal's purple light below never
|
||||
/// touches the corridor above; our flat sphere-overlap selection has no
|
||||
/// reach/occlusion notion), (b) stationary weenie fixtures ride the DYNAMIC
|
||||
/// 1/d falloff (~9× stronger at 3 m than retail's static 1/d³ bake curve),
|
||||
/// (c) an unexplained striped z-fight-like artifact on lit floor regions
|
||||
/// (user screenshot, launch-176-texflush session). The proper fix is the
|
||||
/// A7 dungeon-lighting arc: per-cell light registration + the static curve
|
||||
/// for fixtures + the stripe hunt, THEN uncap. Register row AP-85; desired
|
||||
/// end-state pin (currently Skip):
|
||||
/// LightManagerTests.PointSnapshot_HubScaleLightCount_ObjectSelectionIsCameraInvariant.</summary>
|
||||
public const int MaxGlobalLights = 128;
|
||||
|
||||
private readonly List<LightSource> _pointSnapshot = new();
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue