From cd12d3dbbca5110e0ac16013367e48bceb2ec883 Mon Sep 17 00:00:00 2001 From: Erik Date: Thu, 11 Jun 2026 18:53:17 +0200 Subject: [PATCH] capture run decoded: #126 spawn-through-roof + #127 bistable flood admissions + #128 session-sticky invisible staircase filed; [viewer] probe gains fwd= The users tower capture (tower-viewer-capture.log, 551 [viewer] lines) decodes into three distinct issues: - #126 (HIGH, #107/#111 family): an OUTDOOR spawn claim on the tower roof (z=127.2) is grounded to TERRAIN z=112 - the player is warped through the roof into the tower interior, outdoor-classified -> the transparent-interior spawn. The snap outdoor branch must ground to the nearest WALKABLE surface (roofs/GfxObj floors), not terrain. - #127 (HIGH, the flap mechanism): per-building flood admissions are BISTABLE per frame under the outdoor root - flood size oscillates +-1-3 cells at millimetre eye deltas (45<->52 standing on the roof, including a byte-static eye flip). Every oscillation = building interiors dropping in/out -> the roof/edge flap; running past a building = #123. Interior side shows the same family (flood 1<->3, outPolys 0<->1 during the climb). - #128: the staircase was invisible the WHOLE climb under a HEALTHY interior root (0xAAB30107 FullScreen views - the cone cannot cull a root-cell static), while the SAME build rendered it perfectly in a different session (diag spawn + screenshot, meshMissing=0). Session-sticky nondeterminism; the barrel tracks this bug (a partial subset of staircase parts), NOT dat content (user axiom: no barrel in retail). Needs a diag-instrumented repro of the users session shape. The [viewer] probe now logs the camera forward (fwd=) so the next capture can be replayed headlessly - Build clip results depend on the view-projection, not just the eye. Suites: App 238+1skip, Core 1422+2skip, UI 420, Net 294. Co-Authored-By: Claude Fable 5 --- docs/ISSUES.md | 74 +++++++++++++++++++++++++ src/AcDream.App/Rendering/GameWindow.cs | 6 +- 2 files changed, 79 insertions(+), 1 deletion(-) diff --git a/docs/ISSUES.md b/docs/ISSUES.md index 6b417a2f..3f0340ac 100644 --- a/docs/ISSUES.md +++ b/docs/ISSUES.md @@ -4334,6 +4334,80 @@ meshMissing counters. --- +## #126 — Outdoor spawn claim on a building roof is grounded THROUGH the roof to terrain (transparent-interior spawn) + +**Status:** OPEN — HIGH (every login/logout on any walkable roof) +**Filed:** 2026-06-11 (tower capture run, `tower-viewer-capture.log` line 1) +**Component:** physics — login snap (the #107/#111 family) + +**Evidence:** the user logged out standing ON TOP of the AAB3 tower +(z=127.2). The next login: `[snap] claim=0xAAB30023 pos=(297.160, +-129.182,127.200) … terrainZ=112.000 indoor=False -> targetZ=112.000 +targetCell=0xAAB30023`. The snap's OUTDOOR branch always grounds to +TERRAIN Z — it warped the player from the roof down INTO the tower's +interior volume at ground level, still outdoor-classified → the +transparent-interior spawn the user reported ("spawned in the tower and +it was transparent"), self-healing only after walking out and back in. +**Fix shape:** an outdoor claim must ground to the nearest WALKABLE +surface at/below the claim Z (building roofs and GfxObj floors via the +physics walkable query — the #111 `WalkableFloorZNearest` machinery), +not raw terrain. Note the snap line even shows a candidate it rejected +(`bestCell=0xAAB30101 bestZ=124.3`). + +--- + +## #127 — Per-building flood admissions are BISTABLE per frame under the outdoor root (the building-flap mechanism) + +**Status:** OPEN — HIGH (the live mechanism behind the tower roof/edge +flap; almost certainly #123 and related flap reports) +**Filed:** 2026-06-11 (tower capture run) +**Component:** render — BuildFromExterior seed admission / per-building +flood stability + +**Evidence (`tower-viewer-capture.log`, 551 [viewer] lines in one short +run):** under the outdoor root near the tower, the merged per-building +flood size oscillates ±1–3 cells nearly EVERY frame at millimetre eye +deltas — standing on the tower roof: flood 45↔46↔47↔48 per line with +the eye moving mm at a time (and one stretch flipping at a byte-static +eye). Every oscillation = some building's interior cells (including +this tower's roof-lip cells) dropping in/out of the visible set → the +roof/edges flap; a building whose cells flap while running past = +#123. The INTERIOR side shows the same family: inside the tower the +flood flickers 1↔2–3 with outPolys 0↔1 during the climb. +**Next:** the [viewer] probe now logs the camera forward (fwd=) — one +more capture run gives exact (eye, fwd) pairs to replay in a +deterministic harness; then pin WHICH admission gate is bistable +(seed side test / in-plane reject / clip-empty / the frustum pre-gate +on PortalBounds) and stabilize it retail-shaped. + +--- + +## #128 — Tower staircase invisible with a HEALTHY interior root (session-sticky; renders fine in other sessions) + +**Status:** OPEN — investigation; needs a diag-instrumented repro +**Filed:** 2026-06-11 (tower capture run + user report) +**Component:** render — entity draw path (suspect: session-order state) + +**Evidence:** during the user's climb the root was the tower's main +cell 0xAAB30107 (FullScreen views — the cone CANNOT cull a 0107 +static), yet the 43-part staircase was invisible the whole way up; in a +different session same build (the in-tower diag spawn, +`tower-wbdiag4.log` + screenshot) the same staircase rendered perfectly +with meshMissing=0. Session-sticky, nondeterministic across sessions: +suspect state accumulated by session order — Tier-1 classification +cache shapes (#53 family — though the known veto paths read correct), +LRU eviction + the no-re-prepare-on-re-registration gap, or the #125 +sticky-drop cousin. The user's "barrel" sighting tracks this bug (a +partial subset of staircase parts rendering ≈ a barrel-shaped pile) — +NOT dat content (the barrel is NOT in retail — user axiom). **Next:** +reproduce under ACDREAM_WB_DIAG=1 with the user's session shape (spawn +mis-grounded inside via #126, walk out/in, climb) and read +meshMissing + [indoor-lookup]; if meshMissing>0 persists at standstill +the parts are unloaded (eviction/registration); if 0, instrument the +staircase entity's per-frame draw decision. + +--- + # Recently closed ## #113 — Phantom staircase: REOPENED 2026-06-11, folded into the HOLISTIC BUILDING-RENDER PORT diff --git a/src/AcDream.App/Rendering/GameWindow.cs b/src/AcDream.App/Rendering/GameWindow.cs index 97b22e5f..34434354 100644 --- a/src/AcDream.App/Rendering/GameWindow.cs +++ b/src/AcDream.App/Rendering/GameWindow.cs @@ -9692,8 +9692,12 @@ public sealed class GameWindow : IDisposable if (sig != _lastViewerProbeSig) { _lastViewerProbeSig = sig; + // fwd = camera forward (3rd view column negated) — required to + // REPLAY a captured frame headlessly: Build's clip results + // depend on the view-projection, not just the eye. + var v = _cameraController?.Active.View ?? System.Numerics.Matrix4x4.Identity; Console.WriteLine(System.FormattableString.Invariant( - $"[viewer] {sig} eye=({camPos.X:F3},{camPos.Y:F3},{camPos.Z:F3}) viewerCell=0x{viewerCellId:X8}")); + $"[viewer] {sig} eye=({camPos.X:F3},{camPos.Y:F3},{camPos.Z:F3}) fwd=({-v.M13:F4},{-v.M23:F4},{-v.M33:F4}) viewerCell=0x{viewerCellId:X8}")); } } if (AcDream.Core.Rendering.RenderingDiagnostics.ProbeVisibilityEnabled)