diff --git a/docs/ISSUES.md b/docs/ISSUES.md index 71a3d0cb..9da21c58 100644 --- a/docs/ISSUES.md +++ b/docs/ISSUES.md @@ -46,37 +46,37 @@ Copy this block when adding a new issue: --- -## #186 — Indoor→indoor GREY flap at a connecting room (top floor, new house type) +## #186 — [DONE 2026-07-08 · `8257b9ba`] Indoor→indoor GREY flap at a connecting room (top floor, new house type) -**Status:** OPEN (diagnosed by class only — NOT captured for this instance; investigation report-only) -**Severity:** MEDIUM · **Filed:** 2026-07-08 · **Component:** render / indoor visibility (viewer-cell root) +**Status:** CLOSED 2026-07-08 — live gate PASSED (no grey at any camera angle) + probe +(216 `root=0118` frames, 0 still grey; `0118->0116` now `TRV`, `vis=4`). +**Severity:** MEDIUM · **Filed:** 2026-07-08 · **Component:** render / indoor visibility (portal side-cull) -**Description:** Top floor of a house type not tried before; a connecting opening/room between two -parts of the house. Passing through → a brief **GREY** flap (world background). Stopping at the precise -spot → the WHOLE screen is grey and stays; **turning the camera clears it, turning back → grey again** -(camera-direction dependent, player stationary). +**Description:** Top floor of a new house type; a thin connecting cell between two rooms. Passing +through → brief GREY flap; stopping at the spot → whole screen grey and stays; turning the camera +clears it, turning back → grey again (camera-direction dependent, player stationary). -**Root cause — NARROWED (report-only; retail SEAMLESS at the same spot → real acdream bug). FULL HANDOFF: -`docs/research/2026-07-08-186-connector-grey-flap-handoff.md`.** The eye seats in a sparse 5-render-poly -CONNECTOR cell `0xF6820118` (between player room `0116` and room `0117`), in the doorway threshold looking -BACK toward `0116`; acdream's render DROPS `0116` (its back-portal is side-culled) so the doorway aperture -shows the fog clear color = grey. Retail keeps `0116` drawn. **RULED OUT (do not revisit):** null-root/AD-21 -(root valid indoor 88248/88249 frames); viewer-cell root-lag/AD-20 (`eyeInRoot=Y` — eye genuinely inside -`0118`'s BSP); the color-clear gating (retail's gated `Clear` @ DrawCells `0x005a48a9` is depth/stencil, -fires AFTER `LScape::draw` — the tempting "3-line fix" is DEAD). Confirmed via workflow `wf_362bbeda-933` -(4 tracers + synthesis) + live `ACDREAM_PROBE_FLAP` capture + offline cell dump. It's the doorway-FLAP -FLOOD/PICK family (frozen render, DO-NOT-RETRY-heavy — the deleted `EyeInsidePortalOpening` rescue, the -`PortalSideEpsilon` root-lag). +**Root cause (CONFIRMED via live retail cdb trace + dat diagnostic — the report-only "narrowed" note +was the right FAMILY but the WRONG mechanism):** the render portal side-cull reconstructed each +doorway's interior side (`PortalClipPlane.InsideSide`) from the cell's **AABB centroid**. For the thin +connector `0xF6820118` (5 render polys) the bounding-box center falls on the WRONG side of the +`0118->0116` doorway → the eye read as a back-portal → the forward room `0116` was culled → the +aperture showed the fog clear color = grey. Retail's `PView::InitCell` (0x005a4b70) AND acdream's own +PHYSICS path (`CellTransit.cs:190`) read the explicit dat **`PortalSide` bit** (`(Flags&2)==0`); the +render path was the only one guessing from geometry. -**Next step (retail cdb, do FIRST — binary MATCHES `refs/acclient.pdb`):** at the grey pose, `bp -SmartBox::update_viewer 0x00453ce0` (dump `viewer_cell` id) and/or `bp PView::DrawCells 0x005a4840` (dump -`cell_draw_list`). retail `viewer_cell==0116` → PICK fix (acdream over-switches to the connector / -boom coasts the eye in at `pulledIn=-0.00`); retail roots `0118` but draws `0116` too → FLOOD fix -(retail admits the back-portal; acdream's side-CULL is the site). Apparatus + code sites + DO-NOT-RETRY -in the handoff. +**Fix (`8257b9ba`):** `GameWindow.BuildLoadedCell` derives `InsideSide` from the dat `PortalSide` bit, +matching retail + physics. Surgical — the dat diagnostic +(`Issue186…PortalSide_CentroidVsDatBit_AtGreyEye`) shows the bit agrees with the old centroid on every +portal of these cells EXCEPT the one #186 breaks; the `CornerFlood`/`Issue113` dat helpers updated to the +same bit keep every real Holtburg/tower/hall flood identical (App 741 / Core 2631 green). Touches neither +`PortalSideEpsilon` nor the deleted `EyeInsidePortalOpening` rescue. -**Acceptance:** no grey flap passing through OR stopping in the connecting room at any camera angle; -regression pass on the outside→inside doorway + other multi-room houses. +**The retail trace OVERTURNED both prior hypotheses:** NOT PICK (both clients root at `0118` at the pose, +eye ≈ identical) and NOT the handoff's FLOOD-epsilon framing — retail draws `0116` from the `0118` root +because its dat side bit admits the portal; acdream's centroid guess culled it. Apparatus (kept): +`tools/cdb/issue186-connector-decider.cdb` (viewer_cell + cell_draw_list decider) + the offline geometry +test. Handoff (now historical): `docs/research/2026-07-08-186-connector-grey-flap-handoff.md`. --- diff --git a/docs/research/2026-07-08-186-connector-grey-flap-handoff.md b/docs/research/2026-07-08-186-connector-grey-flap-handoff.md index 66db80ea..e48edf59 100644 --- a/docs/research/2026-07-08-186-connector-grey-flap-handoff.md +++ b/docs/research/2026-07-08-186-connector-grey-flap-handoff.md @@ -1,6 +1,19 @@ # Handoff: #186 — indoor GREY flap at a top-floor connecting room (new house type) -**Date:** 2026-07-08 · **Status:** ROOT CAUSE NARROWED (report-only) — fix NOT started. It lives in +> **✅ RESOLVED 2026-07-08 · fix `8257b9ba` · live gate PASSED.** The retail cdb trace (§3, run via +> `tools/cdb/issue186-connector-decider.cdb`) OVERTURNED both hypotheses below. Retail roots at the +> connector `0118` at the grey pose (same as acdream — so NOT the PICK fork) AND still DRAWS the player +> room `0116` from that root — because retail's `PView::InitCell` side test reads the dat **`PortalSide` +> bit**, while acdream's render path reconstructed the portal's interior side from the cell **AABB +> centroid**, which mis-sides a THIN connector cell (`0118`, 5 render polys → centroid on the wrong side +> of the `0118→0116` doorway → back-portal cull → grey). Fix = derive `InsideSide` from the dat bit in +> `GameWindow.BuildLoadedCell`, matching retail + acdream's own physics (`CellTransit.cs:190`). Surgical +> (dat diagnostic: agrees with the old centroid on every portal but the one #186 broke). **The §2/§3 +> "acdream drops the room" read was right; the "acdream over-switches the root / flood-epsilon" mechanism +> was WRONG — it was the InsideSide *source*, not the pick or the epsilon.** Everything below is the +> pre-fix investigation, kept for the trail. + +**Date:** 2026-07-08 · **Status:** ~~ROOT CAUSE NARROWED (report-only) — fix NOT started.~~ RESOLVED (see banner). It lives in the FROZEN portal-flood / viewer-cell render code (the doorway-FLAP family that cost weeks), so it needs a **retail cdb trace** to pin the last fork BEFORE any code, then a careful change. Milestone: M1.5.