diag #176/#180: isolation toggles pin the residual stripes on the camera sweep, not the render

The #176 gate-2 failure ("stripes/triangles flickering when the camera
is pushed into walls; nothing when zoomed out") is NOT a render defect.
Isolation apparatus added this commit:

- ACDREAM_LIGHT_DEBUG shader modes (mesh_modern.vert/frag + uLightDebug
  upload in EnvCellRenderer/WbDrawDispatcher): 1 = ambient-only,
  2 = dynamics killed, 3 = raw vLit field (texture ignored). The
  pattern SURVIVES mode 3 -> not texture; lives above the light data.
- ACDREAM_CLIP_DEBUG=1 (RenderingDiagnostics.ClipDebugNoShellTrim +
  the EnvCellRenderer slot-fill gate): shell pass draws cells WHOLE
  (retail's shape). Pattern survives -> the per-cell clip trim is
  exonerated.

With every render suspect dead, an autonomous visual loop (synthetic
back-into-wall input + GDI window captures + the [flap-sweep] probe)
pinned the mechanism numerically: at a compressed moving boom the
camera-collision sweep is BISTABLE - consecutive sweeps with ~1.4 mm
input drift flip the first-contact solution 0.27 m along the boom
(pulledIn 0.27<->0.53, every ~5-10 frames, all 368k sweeps ok=True),
and at ~1700 fps unsynced every monitor refresh tear-interleaves the
two views = the stripe/hatch patterns. Filed as #180 with the retail
anchor: viewer_sought_position is STATEFUL (SmartBox 0x00452d75 feeds
the CURRENT swept viewer into CameraManager::UpdateCamera 0x00456660
and assigns the return to the sought, 0x00452d84) - the target
converges to the collided position instead of re-rolling the full
knife-edge ray per frame like our RetailChaseCamera does. SweepEye
itself ports update_viewer 0x00453ce0 faithfully and is exonerated.

Also recorded in #176: the site-A weenie light-registration leak (a
portal's I100 light stacked x2->x4 over one session as re-CreateObject
re-registered it under fresh entity ids).

The #176 lighting fix (d8984e87) remains live-verified; #176 re-gates
after #180 lands. ISSUES: #180 filed, #176 updated. Suites: Core
2599+2skip; toggles inert by default.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-07-06 16:19:38 +02:00
parent d8984e877f
commit 6aabe0b5ac
6 changed files with 120 additions and 2 deletions

View file

@ -46,6 +46,57 @@ Copy this block when adding a new issue:
---
## #180 — Camera-collision sweep bistable at a compressed boom → per-frame eye strobe (the #176 "stripes")
**Status:** OPEN — mechanism PINNED numerically; fix = port retail's stateful sought-position
**Severity:** HIGH (the visible flicker/stripe artifact the #176 gate keeps failing on; corridor camera constantly rides walls)
**Filed:** 2026-07-06
**Component:** camera / physics (NOT render — every render suspect eliminated by isolation)
**Description (user, Facility Hub):** "geometrical patterns, triangles, that get
weird stripes… especially when I push the camera to the wall or the openings of
the corridor. If I zoom out and the camera does not touch the walls I get no
pattern." Reproduced autonomously (synthetic back-into-wall + GDI window
captures, `launch-176-cameye.log`).
**Root cause (probe-pinned):** while the compressed chase boom moves along/near
a wall, the `SweepEye` first-contact solution is BISTABLE: consecutive
`[flap-sweep]` records show the sweep INPUT moving ~1.4 mm (the player's glide)
while the OUTPUT flips 0.27 m along the boom (`pulledIn` 0.27 ↔ 0.53, eye
(78.500,38.633,3.845) ↔ (78.669,38.815,3.938)), re-flipping every ~510
frames — a knife-edge graze on the corridor's double-faced slabs (the #137
threshold family, camera edition; all 368k sweeps returned ok=True — this is
NOT the fallback path). Each flip hard-cuts the whole view matrix; at ~1700 fps
with no vsync every monitor refresh tear-interleaves BOTH views → fine
stripe/hatch patterns over surfaces (worst near seams where the 0.27 m parallax
is largest), flickering with movement. Confirmed present in the pure light
field (`ACDREAM_LIGHT_DEBUG=3` still shows it → not texture) and with the
shell clip trim disabled (`ACDREAM_CLIP_DEBUG=1` → not the clip gate).
Explains the residual #176 flicker reports post-lighting-fix: one of the two
alternating eyes sees the purple under-room parallax, the other doesn't.
**Retail anchor (the fix):** retail's sought position is STATEFUL —
`SmartBox` (0x00452d75) calls `CameraManager::UpdateCamera(mgr, &ret,
&this->viewer)` with the CURRENT swept viewer and assigns the RETURN to
`viewer_sought_position` (0x00452d84): the next frame's target derives from
the collided position (converges; re-extends gradually), so mm-jitter never
re-tests the full-length knife-edge ray per frame. acdream's
`RetailChaseCamera` recomputes the full-length desired boom from scratch every
frame. Fix = read `CameraManager::UpdateCamera` (0x00456660) + the sought
derivation and port the stateful shape — NO damping band-aid on the swept
result without that reading (workaround rule).
**Files:** `src/AcDream.App/Rendering/RetailChaseCamera.cs` (boom/desired-eye),
`src/AcDream.App/Rendering/PhysicsCameraCollisionProbe.cs` (`SweepEye` — port
verbatim per update_viewer 0x00453ce0, exonerated), `[flap-sweep]` probe
(ACDREAM_PROBE_FLAP) is the apparatus.
**Acceptance:** camera pressed into walls/openings while moving → no
stripe/hatch patterns, no per-frame view jumps (consecutive-frame eye deltas
stay continuous in `[flap-sweep]`); camera glides along walls like retail.
---
## #179 — Lightning flash has no indoor gate (dormant until weather strobes ship)
**Status:** OPEN (dormant — zero production impact today)
@ -179,7 +230,21 @@ gate passes, then strip.
**Gate:** stand in the `0x8A020164` corridor, turn back-and-forth across the seam — the
purple wedge must hold steady (its faceted SHAPE is retail-correct and stays).
**Status:** 🟡 FIX SHIPPED — pending user gate
**⚠️ GATE 2026-07-06 (evening): FAILED on a RESIDUAL that turned out to be a
SEPARATE mechanism — flickering stripe/triangle patterns when the camera is
pushed into walls/openings. Isolation toggles killed every render suspect
(texture via `ACDREAM_LIGHT_DEBUG=3`, shell clip trim via `ACDREAM_CLIP_DEBUG=1`,
coplanar dat pairs, double-draws, seals); the artifact is the CAMERA-COLLISION
sweep strobing the eye 0.27 m per few frames at a compressed boom → tear-
interleaved views = stripes. Split to #180 (camera/physics). The lighting half
of #176 (the pool tracking the camera via flood scoping) remains FIXED and
live-verified; re-gate #176 after #180 lands. Also filed from this arc: the
site-A weenie light-registration LEAK (a portal's I100 light stacked ×2→×4
over one session as CreateObject re-sends re-registered it under fresh
entity ids — `[seam-ent]` L= showed `01D4:I100` four times) — fold into the
A7 arc or fix with #180's gate.**
**Status:** 🟡 lighting fix SHIPPED + verified; residual flicker = #180 (camera strobe)
**Severity:** MEDIUM (visible artifact along every corridor seam in the M1.5 dungeon)
**Filed:** 2026-07-06
**Component:** render — floor-portal polygons / portal surface state