acdream/tools/walk-oracle/oh/oh-capture-blockset.cdb.template
Erik 37e42aafc4 docs(render): resolve #458 — the a9c9 doorway admission is a 0.5 % edge-plane precision boundary (AD-118)
Two live cdb captures on the paired 2013 client at the Holtburg doorway:
the blockset template (every Render::block_check call of one frame — 2,601
resident blocks x 2 exit views) proves retail tests a9c9 at ring slot
25,46 and returns PARTIALLY then OUTSIDE; the blockcheck template dumps
its four corner interval vectors (0 0 0 0 300.4|310.2 and 0 0 0 1001 ...,
slab 75..330). acdream's replay at the same P pose reproduces the sentinel
pattern, the four edge planes and both verdicts, drawing a9c9 once, with
clip heights 298.8/308.5 m — a 0.5 % plane difference (about 0.35 px of
projected door-vertex position). At the fixture pose that margin is what
flips the south-west corner from inside to outside on the fourth edge
plane, so retail's four-corner unanimity test says OUTSIDE where ours
says PartiallyInside. Not fixable bit-exactly short of D3D's x87
transform; the KnownFailure row stays with its comment rewritten, the
register carries AD-118, and the first filtered capture's silent miss
(cdb sign-extends poi() inside .if; use dwo()) is noted in the template.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-03 14:43:14 +02:00

37 lines
2.1 KiB
Text

* OH walk-oracle capture: BLOCK SET (2026-09-03, for docs/ISSUES.md #458).
* The filtered block-check template (oh-capture-blockcheck.cdb.template)
* printed NOTHING for block 0xA9C9FFFF at the doorway pose — either retail
* never calls Render::block_check for that block (it is not resident in
* LScape's block ring at that pose, so draw_check_blocks skips it) or the
* template's register facts are wrong. This template settles which: it prints
* EVERY Render::block_check @0x0054dc50 call for the captured frames — the
* block DID (esi = the caller's CLandBlock*, DBObj::m_DID at +0x28), the grid
* indices (ebx = x, ebp = y) and the returned BoundingType at the call's
* return site 0x005061e9 — plus a per-frame hit count, so the set of blocks
* retail checks can be diffed against acdream's WalkLandscape.Blocks at the
* same P pose. No interval dumps (cheap enough for the whole ring).
*
* LINE FORMATS:
* F <n> -- frame marker (SmartBox::RenderNormalMode)
* P <cell> <ox> <oy> <oz> <qw> <qx> <qy> <qz> -- viewer pose, raw dwords
* N <count> -- block_check calls seen since the last F
* BC did=<hex> gx=<n> gy=<n> esi=<hex>
* BR ret=<n> -- the BoundingType returned for the last BC
*
* AUTO-DETACH: same fall-through + top-level qd recipe as the walk template.
* BEFORE USE: replace <FRAMES> and <LOG>. Use -Frames 2: the marker fires
* BEFORE a frame's checks, so frame 1's checks land between F 1 and F 2.
.logopen <LOG>
.sympath C:\Users\erikn\source\repos\acdream\refs
.symopt+ 0x40
.reload /f acclient.exe
r $t0 = 0
r $t9 = 0
bp 00453aa0 "r $t0 = @$t0 + 1; .printf \"N %d\\n\", @$t9; r $t9 = 0; .printf \"F %d\\n\", @$t0; .printf \"P %08x %08x %08x %08x %08x %08x %08x %08x\\n\", poi(0081ef00+4), poi(0081ef00+0x3c), poi(0081ef00+0x40), poi(0081ef00+0x44), poi(0081ef00+8), poi(0081ef00+0xc), poi(0081ef00+0x10), poi(0081ef00+0x14); .if (@$t0 < 0n<FRAMES>) { gc }"
bp 0054dc50 "r $t9 = @$t9 + 1; .printf \"BC did=%08x gx=%d gy=%d esi=%08x\\n\", poi(@esi+0x28), @ebx, @ebp, @esi; gc"
bp 005061e9 ".printf \"BR ret=%d\\n\", @eax; gc"
g
.echo ===DETACHING===
qd
.logclose