From f47895cc738a0d4644716dec0b16392051852e25 Mon Sep 17 00:00:00 2001 From: Erik Date: Sun, 31 May 2026 14:32:19 +0200 Subject: [PATCH] =?UTF-8?q?research(render):=20Phase=20U.4c=20=E2=80=94=20?= =?UTF-8?q?CONVERGED=20root=20cause=20(eye-rooted=20grace-stale=20root)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Live ACDREAM_PROBE_FLAP moving capture: flap frames are uniformly res=Grace eyeInRoot=n terrain=Skip; good frames eyeInRoot=Y terrain=Planes. The 3rd-person camera EYE drifts out of the player's cell -> FindCameraCell returns the stale cell for 3 grace frames -> from that stale root the doorway portal is behind the eye (D=+1.26 CULL) -> exit cell drops -> terrain+shells Skip. Clip math is fine (clip=5 when eye inside). Fix: (1) root visibility at the PLAYER's cell (retail CellManager::ChangePosition tracks curr_cell by player; acdream already does this for lighting at GameWindow:7152); (2) keep a player-reachable cell + exit when the threshold eye-projection degenerates. Supersedes H2 and the earlier idle-frame 'stale root refuted' note. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../2026-05-31-u4c-flap-characterization.md | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/docs/research/2026-05-31-u4c-flap-characterization.md b/docs/research/2026-05-31-u4c-flap-characterization.md index b638163..de7c3a0 100644 --- a/docs/research/2026-05-31-u4c-flap-characterization.md +++ b/docs/research/2026-05-31-u4c-flap-characterization.md @@ -1,5 +1,25 @@ # U.4c flap characterization — real-dat evidence (Task U.4c-1) +> **✅ CONVERGED ROOT CAUSE (2026-05-31, live ACDREAM_PROBE_FLAP moving capture) — read this first.** +> The flap is the **visibility root being driven by the 3rd-person camera EYE instead of the +> player.** Live data (`u4c-flap2.log`): every flap frame is `res=Grace eyeInRoot=n terrain=Skip`; +> every good frame is `eyeInRoot=Y terrain=Planes`. When the chase eye drifts out of the player's +> cell (through a wall into an adjacent cell / an AABB gap), `CellVisibility.FindCameraCell(camPos)` +> finds no cell and returns the **stale previous cell for 3 grace frames**; from that stale root the +> doorway portal is behind the eye (`p0->0x0170 D=+1.26 CULL`) → the exit cell `0170` drops → +> `outPolys=0` → terrain + shells Skip. Pose where it works: eye genuinely inside (`D=-0.97 TRV +> proj=4 clip=5 → outPolys=1`). The clip math is NOT broken (clip=5 when the eye is inside); the +> ROOT is wrong. At the exact threshold the eye-projection of the doorway also degenerates +> (`proj=0`) even when the player would reach it — so the fix has two parts: +> **(1) root visibility at the PLAYER's cell, not the eye** (retail `CellManager::ChangePosition` +> tracks `curr_cell` by the player; acdream already does this for lighting at GameWindow.cs:7152); +> **(2) a player-reachable cell + its exit render even when the per-frame eye-projection +> degenerates** (the spec's "set stable, clip refines WHERE not WHICH" principle, correctly rooted). +> This supersedes BOTH the H2 (side-test) conclusion below AND the earlier "stale root refuted" +> note (which was judged from a single idle frame; the moving capture proves the eye does leave the +> cell). Apparatus: `RenderingDiagnostics.ProbeFlapEnabled` ([flap]/[flap-cam] lines), commits +> `b5f2bf2`/`8941d1e` + the probe commits. + > **⚠️ CORRECTION (2026-05-31, later same day) — the H2 conclusion below is WRONG.** > Two follow-on evidence steps overturned the "port the side test (H2)" conclusion this note reaches: > 1. **PortalSide swap is a no-op** (`docs/research/2026-05-31-u4c-initcell-pseudocode.md`): the