cdb attached to retail at a Holtburg cottage door while user walked the inside-out off-center scenario. Three trace iterations identified that retail's collision-recording happens via SPHEREPATH::set_neg_poly_hit (fires hundreds of times during inside-out walk), NOT via the more obvious-named COLLISIONINFO setters (which fire 0 times). Apparatus scripts at tools/cdb/door-inside-out-v[1-3].cdb + symbol-probe.cdb. Our codebase has NegPolyHitDispatch defined but never called. The downstream TransitionalInsert NegPolyHit handler was a stub. Two-part fix landed: 1. BSPQuery.FindCollisions Path 5 (Contact branch) restructured — distinguishes full hit (hit0 == true → StepSphereUp) from near-miss (hit0 == false but hitPoly0 != null → NegPolyHitDispatch). Mirrors retail BSPTREE::find_collisions at acclient_2013_pseudo_c.txt:0053a630-0053a6fb. 2. Transition.TransitionalInsert NegPolyHit handler — dispatches to step_up + step_up_slide (NegStepUp=true) or records collision normal + returns Collided (NegStepUp=false). Mirrors retail CTransition::transitional_insert at acclient_2013_pseudo_c.txt:0050b7af-0050b7e6. Tests: all 11 fix-relevant + regression tests pass including issue #98. VISUAL VERIFICATION (user-driven inside-out off-center): still squeezes through. Diagnostic [neg-poly-dispatch] probe shows ZERO hits in production. The Path 5 restructuring doesn't surface NegPolyHit because our SphereIntersectsPolyInternal only sets hitPoly on FULL hits — retail's sphere_intersects_poly sets var_5c (closest polygon) even on near-misses via BSP-traversal side effect. Remaining fix (next session): add near-miss polygon recording to SphereIntersectsPolyInternal. Once it sets hitPoly on near-miss BSP traversal, the Path 5 NegPolyHit dispatch (this commit) will fire and the TransitionalInsert handler (this commit) will block. Full handoff with cdb trace table + next-step plan: docs/research/2026-05-25-door-bug-cdb-retail-trace-findings.md Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
19 lines
610 B
Text
19 lines
610 B
Text
$$ Quick symbol probe: list what COLLISIONINFO / SPHEREPATH functions exist.
|
|
.logopen C:\Users\erikn\source\repos\acdream\.claude\worktrees\strange-albattani-3fc83c\retail-sym-probe.log
|
|
|
|
.sympath C:\Users\erikn\source\repos\acdream\.claude\worktrees\strange-albattani-3fc83c\refs
|
|
.symopt+ 0x40
|
|
.reload /f acclient.exe
|
|
|
|
.printf "=== COLLISIONINFO symbols ===\n"
|
|
x acclient!COLLISIONINFO::*
|
|
|
|
.printf "\n=== SPHEREPATH symbols ===\n"
|
|
x acclient!SPHEREPATH::*
|
|
|
|
.printf "\n=== CTransition symbols (subset) ===\n"
|
|
x acclient!CTransition::*collide*
|
|
x acclient!CTransition::insert*
|
|
x acclient!CTransition::makeTr*
|
|
|
|
qd
|