fix #130 (the real strip): drawn-shell lift vs draw-space portal consumers
The user's re-gate refuted the scissor fix as THE strip (6c4b6d6was a real but sub-pixel under-coverage): the strip survived, screenshot at a doorway, full width of the opening, top edge only, "very subtle". Root cause (pinned by Issue130DoorwayStripTests.UnliftedGate_*): the +0.02 m shell render lift. Cell shells DRAW 2 cm above the dat origin (z-fight vs coplanar terrain);f35cb8b(the #119-residual fix, 2026-06-11) deliberately reverted the VISIBILITY graph to the physics (unlifted) transform - but the OutsideView color gate (terrain/sky/ scissor through the doorway) and the seal/punch depth fans are DRAW-space consumers and kept projecting the unlifted polygons. The drawn lintel therefore sits one lift-projection above the gate's top edge - measured 6.7 px at a 2.4 m doorway - and that band never receives terrain/sky color while the seal also stamps 2 cm low. A regression fromf35cb8b, NOT from the W=0 clip port (987313astays exonerated). Vertical aperture edges are immune (the lift slides them along themselves) - top edge only, exactly as reported; explains the "also NOW" timing precisely. Fix - draw space draws lifted, visibility stays physics (thef35cb8binvariant, now symmetric): - PortalVisibilityBuilder.Build gains drawLiftZ: the exit-portal branch projects the OutsideView region with the lifted transform; flood admission, side tests, and CellViews are untouched (default 0 keeps every existing visibility test bit-identical). - The seal/punch fans (DrawRetailPViewPortalDepthWrite) lift their world verts to the drawn shell's space. - One shared constant PortalVisibilityBuilder.ShellDrawLiftZ feeds the shell registration (GameWindow:5604), the gate, and the fans. Register: AP-32 ADDED - the +0.02 lift had NO row (a pre-register deviation the 2026-06-12 sweep missed). The row records the split invariant both ways: a draw-space consumer that forgets the lift re-opens the #130 strip; a visibility consumer that picks the lifted transform re-opens the #119-residual side-cull. Pins: the lifted gate covers the drawn (lifted) aperture to 0.00 px across the 147-combo sweep; the unlifted gate shows the 6.7 px strip (sensitivity proof - if the lift is ever removed, this test says the drawLiftZ plumbing can go too). Suites: App 257+1skip / Core 1439+2skip / UI 420 / Net 294 green. Awaiting the user re-gate at a doorway with the lintel on screen. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
4ba714835d
commit
5135066733
6 changed files with 191 additions and 38 deletions
|
|
@ -4514,45 +4514,50 @@ cap constant (0.5 m) is the tuning knob — see AD-18.
|
|||
|
||||
## #130 — Background-color strip along the TOP outer edge of a doorway when looking out from inside
|
||||
|
||||
**Status:** FIX SHIPPED — awaiting user visual gate
|
||||
**Status:** FIX 2 SHIPPED — awaiting user visual re-gate
|
||||
**Severity:** LOW-MEDIUM (small strip, but on the most-stared-at pixels in the game)
|
||||
**Filed:** 2026-06-12 (user report, post-#119-close session)
|
||||
**Component:** render — doorway-slice scissor box math (AD-17 family)
|
||||
**Component:** render — drawn-shell lift vs draw-space portal consumers (AP-32)
|
||||
|
||||
**Symptom (user):** standing inside looking out through a doorway, a
|
||||
thin strip of background (clear/world) color runs along the OUTER edge
|
||||
of the TOP of the doorway opening.
|
||||
of the TOP of the doorway opening. Survived the scissor fix (`6c4b6d6`)
|
||||
— user screenshot 2026-06-12 evening, "very subtle".
|
||||
|
||||
**Root cause (pinned headlessly 2026-06-12, `Issue130DoorwayStripTests`
|
||||
— 147 eye/gaze combos at the real A9B4 0x0170 exit door):** the
|
||||
`BeginDoorwayScissor` NDC→pixel conversion (`Floor(origin) +
|
||||
Ceiling(size)`) put the box's far edge at `floor(min)+ceil(max−min)` —
|
||||
up to ONE PIXEL SHORT of the true top/right edge at unlucky fractional
|
||||
alignments. The scissor brackets the ENTIRE landscape slice (sky,
|
||||
terrain, statics, weather), the seal stamps the full aperture at true
|
||||
depth, and the shell ends at the aperture edge — so the cut pixel row
|
||||
never receives color: a background strip along the top edge that comes
|
||||
and goes as the eye moves (alignment shifts). Captured live by the
|
||||
harness: top edge y=0.7938 at 1080p → row 968 cut; right edge column
|
||||
1296 cut at 1920. This violated AD-17's own doctrine (over-inclusion
|
||||
safe, under-inclusion is the bug class).
|
||||
**Root cause (the REAL strip, pinned by
|
||||
`Issue130DoorwayStripTests.UnliftedGate_LeavesTheStripAtTheDrawnTopEdge`):
|
||||
the +0.02 m shell render lift.** Cell shells DRAW 2 cm above the dat
|
||||
origin (z-fight vs terrain, AP-32); since `f35cb8b` (the #119-residual
|
||||
fix) the visibility graph deliberately uses the PHYSICS (unlifted)
|
||||
transform — but the OutsideView color gate and the seal fans, which are
|
||||
DRAW-space consumers, kept the unlifted polygons. The drawn lintel
|
||||
therefore sits one lift-projection ABOVE the gate's top edge —
|
||||
**6.7 px at a 2.4 m doorway** (measured) — and that band gets no
|
||||
terrain/sky color while the seal also stamps 2 cm low. Regression from
|
||||
`f35cb8b` (2026-06-11), NOT from the W=0 clip port. Vertical edges are
|
||||
immune (the lift slides them along themselves) — top edge only, exactly
|
||||
as reported.
|
||||
|
||||
**Lead 1 REFUTED:** the W=0 clip port `987313a` is exonerated by the
|
||||
same harness — the CPU polygon pipeline (ProjectToClip → ClipToRegion
|
||||
merges → ClipPlaneSet planes) is sub-pixel exact against the raw
|
||||
aperture projection (worst 0.54 px; 0.00 px in the aligned case). For
|
||||
an all-in-front doorway polygon the port is bit-identical to the old
|
||||
path by construction (the W clip pass only runs when a vertex has
|
||||
w < 0).
|
||||
**Fix 2:** draw-space consumers re-apply the lift —
|
||||
`PortalVisibilityBuilder.Build(drawLiftZ:)` projects the exit-portal
|
||||
OutsideView region with the lifted transform (flood admission, side
|
||||
tests, CellViews stay physics-space per f35cb8b), and the seal/punch
|
||||
fans lift their world verts. One shared constant
|
||||
`PortalVisibilityBuilder.ShellDrawLiftZ` now feeds the shell
|
||||
registration, the gate, and the fans. AP-32 register row added (the
|
||||
lift had no row). Pins: the lifted gate covers the drawn aperture to
|
||||
0.00 px across the 147-combo sweep; the unlifted gate shows the 6.7 px
|
||||
strip (sensitivity).
|
||||
|
||||
**Fix:** conservative outer bound `floor(min)/ceil(max)` extracted to
|
||||
`NdcScissorRect.ToPixels` (GL-free, unit-tested); `BeginDoorwayScissor`
|
||||
delegates. Pins: `NdcScissorRectTests` (containment property + both
|
||||
captured alignments) + `Issue130DoorwayStripTests` (scissor never cuts
|
||||
plane-admitted fragments; CPU-pipeline exactness canary ≤1.2 px).
|
||||
**Fix 1 (also real, sub-pixel): `6c4b6d6`** — the doorway-slice scissor
|
||||
`Floor(origin)+Ceiling(size)` cut up to 1 px off the top/right edges;
|
||||
now a conservative outer bound (`NdcScissorRect`, AD-17 doctrine).
|
||||
The W=0 clip port `987313a` is exonerated (CPU pipeline sub-pixel exact
|
||||
in like-for-like space).
|
||||
|
||||
**Gate:** stand inside any cottage, look out the door, sweep the gaze —
|
||||
no background strip at the top edge at any alignment.
|
||||
**Gate:** stand inside, look out the door with the lintel on screen,
|
||||
sweep the gaze — no background strip at the top edge at any alignment
|
||||
or distance.
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue