BR-1: RESOLVED as already-equivalent - premise falsified by pre-check, equivalence pinned, #113 attribution corrected
The plan's BR-1 ('implement the skipNoTexture draw-time surface gate')
died on its pre-check: acdream ALREADY suppresses every portal fill.
ReplicateProductionEmission_OnPortalFills replicates the exact emission
conditions of the production extractors on the hall/cottage fills:
pos=False neg=False for every one (Stippling.NoPos skips the positive
side at ObjectMeshManager.PrepareGfxObjMeshData:1046,
PrepareCellStructMeshData:1394, CellMesh.Build:44, GfxObjMesh.Build:71;
the fills have no negative surface). There is nothing to gate.
What ships instead: StipplingSurfaceEquivalenceTests - 2,607 polys across
13 building models + 13 environments, ZERO violations both directions:
NoPos <=> untextured-surface. Our build-time skip is proven equivalent to
retail's draw-time skipNoTexture rule (Ghidra 0x0059d4a4, default on
@0x00820e30) on this content. The pin fails loudly if future content
breaks the invariant - the cue to implement the draw-time gate then.
Corrections folded into the plan + comparison docs:
- The #113 phantom residual CANNOT be GfxObj fills (they never reach a
vertex buffer). Plausible true sites are cell-side: flood-admitted
cells drawn with the pass-all NoClipSlice when slot-less
(RetailPViewRenderer.cs:71), and/or cell statics drawn unclipped +
un-viewcone'd (object-lists-skip-portal-view-gate, confirmed).
BR-2 opens with the probe that pins which.
- The e46d3d9 user-gate observations (filter removed phantom/doors) were
confounded - the filter was a provable mesh no-op on shells AND doors.
- Ledger rows solid-surface-skip-missing + the acdream half of
portal-polys-baked-unconditional re-marked REFUTED-for-fills; the
retail mechanism descriptions and the un-consumed PortalIndex->
CBldPortal pairing (BR-4) stand.
Suites: Core 1398 green (1392 baseline + 6 new facts) + the 4 pre-existing
#99-era failures + 1 skip. No production code.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
eb689ae73f
commit
695eca2c1f
4 changed files with 265 additions and 32 deletions
|
|
@ -57,28 +57,42 @@ gate) and the client stays playable after every phase. Conformance pins come
|
|||
from the dat harness + the flood replay harnesses; retail constants are cited
|
||||
inline when ported.
|
||||
|
||||
### BR-1 — The draw-time surface gate (kills the phantom class)
|
||||
### BR-1 — The surface gate — ✅ RESOLVED AS ALREADY-EQUIVALENT (2026-06-11, execution day 1)
|
||||
|
||||
**What:** classify every mesh batch at decode by surface texturedness
|
||||
(`Surface.Type & (Base1Image|Base1ClipMap)`); at draw, skip untextured
|
||||
batches for **building-shell entities and cell meshes only** (plain objects
|
||||
keep drawing them — retail's bypass). Align the cell-side build-time
|
||||
`NoPos`/`NoNeg` drop with this rule: run a dat-wide sweep (all CellStructs +
|
||||
all building models in the populated landblocks) proving
|
||||
`portal-fill ⇔ untextured`; keep the cheaper build-time drop only where the
|
||||
sweep proves equivalence, otherwise move to the draw-time gate. GfxObj-side:
|
||||
fills stay in the mesh but never draw (matches retail exactly).
|
||||
**Premise falsified before implementation (the BR-1 pre-check,
|
||||
`ReplicateProductionEmission_OnPortalFills`):** acdream **already suppresses
|
||||
every portal fill** — all four extraction paths skip `Stippling.NoPos`
|
||||
positive sides (`ObjectMeshManager.PrepareGfxObjMeshData:1046`,
|
||||
`PrepareCellStructMeshData:1394`, `CellMesh.Build:44`, `GfxObjMesh.Build:71`),
|
||||
and the Holtburg fills have no negative surface. The planned "draw-time
|
||||
surface gate" has nothing to gate.
|
||||
|
||||
- **Closes:** #113 phantom staircase class (hall ramp, cottage "flying
|
||||
stairs", every building's baked fills) — without touching doors (entities).
|
||||
- **Acceptance:** `DumpPortalFillSurfaceTypes`-derived conformance sweep
|
||||
green; hall + hill-cottage phantom gone and doors/windows intact at
|
||||
Holtburg (user gate); all suites green.
|
||||
- **Risk note:** apertures whose flood fails become true holes
|
||||
(retail-identical); per-building floods + DrawPortal look-in already cover
|
||||
the visible cases. If a hole shows at an unflooded aperture, that is BR-2/
|
||||
BR-4 evidence, not a BR-1 regression.
|
||||
- **Size:** ~2 commits (batch metadata plumb + draw gate; sweep test).
|
||||
**What shipped instead — the equivalence pin**
|
||||
(`StipplingSurfaceEquivalenceTests`): 2,607 polys across 13 building models +
|
||||
13 environments, **zero violations both directions** — `NoPos ⇔ untextured
|
||||
surface`. Our build-time skip is therefore *proven equivalent* to retail's
|
||||
draw-time `skipNoTexture` rule on this content; the
|
||||
`portal-poly-suppression-criterion` divergence closes as
|
||||
equivalent-with-proof. The pin fails loudly if future content breaks the
|
||||
invariant (the cue to implement the draw-time gate then).
|
||||
|
||||
**Consequences (the honest part):**
|
||||
- The **#113 phantom residual is NOT GfxObj fills** — it cannot be, they
|
||||
never reach a vertex buffer. The "root cause #2" attribution from the
|
||||
e46d3d9 session is corrected; the e46d3d9 user-gate observations (filter
|
||||
removed phantom/doors) were confounded — the filter was a provable mesh
|
||||
no-op on both shells and door parts.
|
||||
- The phantom's plausible true sites are cell-side: flood-admitted stair
|
||||
CELLS drawn with a pass-all slice when the assembler hands them no slot
|
||||
(`RetailPViewRenderer.cs:71` draws ALL visible cells; `NoClipSlice`
|
||||
default), and/or stair-cell STATICS drawn unclipped + un-viewcone'd by
|
||||
design (`object-lists-skip-portal-view-gate`, confirmed). **BR-2's first
|
||||
task is a 10-minute probe at the hall bisect spot pinning which** —
|
||||
the closure moves to BR-2/BR-3 (shells) and BR-5 (statics).
|
||||
- **Closes:** the `portal-poly-suppression-criterion` divergence (as
|
||||
proven-equivalent); #113's closure moves to BR-2/BR-3/BR-5.
|
||||
- **Shipped:** the pre-check + equivalence pin tests; no production code
|
||||
(none needed).
|
||||
|
||||
### BR-2 — Aperture depth machinery (punch / seal / clear)
|
||||
|
||||
|
|
@ -96,12 +110,20 @@ interior stage, gated on whether any seal was drawn (`portalsDrawnCount`);
|
|||
mesh (retail `DrawBuilding` order) so the shell's depth closes everything
|
||||
outside the punch.
|
||||
|
||||
- **First task (from BR-1's falsification):** the 10-minute probe at the
|
||||
hall bisect spot — when the phantom is visible, log per stair cell
|
||||
(0x100..0x106) whether it drew with a real clip slot or the pass-all
|
||||
`NoClipSlice`, and whether its statics drew — pinning the phantom's true
|
||||
draw site (shells → fixed here/BR-3; statics → BR-5).
|
||||
- **Closes:** #108 (outdoor terrain sweeping across the upstairs door — the
|
||||
missing true-depth seal is the confirmed `missing-portal-depth-fence`
|
||||
divergence); the outdoor-root depth-discipline gap; part of #109.
|
||||
divergence); the outdoor-root depth-discipline gap; part of #109; the
|
||||
#113 phantom residual if the probe pins it on pass-all shell slices.
|
||||
- **Acceptance:** cellar↔main-floor walk shows no grass sweep (user gate);
|
||||
new harness fact: seal depth = portal plane depth inside the clipped
|
||||
aperture polygon (GL readback test or probe assertion); suites green.
|
||||
phantom-spot check at the hall (user gate, replaces the old BR-1
|
||||
acceptance); new harness fact: seal depth = portal plane depth inside the
|
||||
clipped aperture polygon (GL readback test or probe assertion); suites
|
||||
green.
|
||||
- **Size:** ~3 commits (~80 lines of GL + clipper reuse per the area
|
||||
estimate, plus the clear re-shape and order swap).
|
||||
|
||||
|
|
@ -285,11 +307,15 @@ issue, none blocks BR-1…BR-8.
|
|||
## 5. Sequencing summary
|
||||
|
||||
```
|
||||
BR-1 (surface gate) — first; standalone visual win, lowest risk
|
||||
BR-2 (depth punch/seal) — second; enables BR-3
|
||||
BR-1 (surface gate) — ✅ RESOLVED as already-equivalent (pin shipped,
|
||||
no production code; #113 closure moved to
|
||||
BR-2/3/5 — see BR-1 section)
|
||||
BR-2 (depth punch/seal) — FIRST implementation phase; opens with the
|
||||
phantom-site probe; enables BR-3
|
||||
BR-3 (delete shell chop) — closes #114 with BR-2
|
||||
BR-4 (draw-driven floods) — closes #109; flood fidelity
|
||||
BR-5 (viewconeCheck) — particles/objects through the same gate
|
||||
BR-5 (viewconeCheck) — particles/objects through the same gate;
|
||||
closes the phantom if it is statics-side
|
||||
BR-6 (one gate + deletions) — consolidation after the discipline is in
|
||||
BR-7 (collision A6.P4) — independent track; may interleave with BR-2..5
|
||||
BR-8 (camera/lighting/LOD) — feel tier; BR-8a may land early
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue