diff --git a/docs/research/2026-06-04-p2-cellar-corner-stepup-handoff.md b/docs/research/2026-06-04-p2-cellar-corner-stepup-handoff.md index feacd0d4..bf6195e8 100644 --- a/docs/research/2026-06-04-p2-cellar-corner-stepup-handoff.md +++ b/docs/research/2026-06-04-p2-cellar-corner-stepup-handoff.md @@ -1,5 +1,20 @@ # P2 pickup β€” cellar-top corner wedge = cell-resolver ping-pong (re-diagnosed) reverting a WORKING step-up +> **🟒 SUPERSEDED 2026-06-04 PM β€” the wedge is NOT membership and NOT a reverted landing.** +> Canonical findings + full evidence chain are now in `memory/project_p2_door_stepup_findings.md` +> (the "RE-DIAGNOSIS 2" + "SLIDE LOCALIZED" + "FAILING CONDITION PINNED" entries). One-line summary: +> a live **retail cdb trace** proved retail's carried cell ALSO flips 0174/0175/0171 at the lip yet +> retail is smooth β†’ membership ruled out. The wedge is a **step-up coin-flip**: the step-up's +> internal step-down FAILS to set a contact plane on the FLAT cottage floor (`cpValid=False`, +> `walkInterp=1.0`) while it works on the ramp slope. acdream's `StepSphereDown`/`AdjustSphereToPlane` +> are FAITHFUL to retail (verified vs `find_walkable` pc:326793 + `adjust_sphere_to_plane` pc:322032), +> so the obvious "set the CP anyway" fix DIVERGES from retail β€” do NOT ship it. **NEXT STEP (ready):** +> run `tools/cdb/retail-flatfloor-trace.cdb` on the live retail client at the cellar lip to see whether +> retail's `step_sphere_down` returns 3 (sets CP) or 1 (no CP) on the flat floor β€” that decides where +> retail establishes the flat-floor contact plane, then port it. 4 TEMP probes (gated on +> ACDREAM_PROBE_INDOOR_BSP, marked STRIP) are uncommitted in the worktree. The text below is HISTORY. + + > **Canonical pickup, 2026-06-04.** Branch `claude/thirsty-goldberg-51bb9b` (do NOT > branch/worktree; do NOT push without asking; NEVER `git stash`/`gc`). PowerShell on > Windows; launch logs are UTF-16. diff --git a/docs/research/2026-06-04-p2-cellar-lip-flatfloor-cp-handoff.md b/docs/research/2026-06-04-p2-cellar-lip-flatfloor-cp-handoff.md new file mode 100644 index 00000000..1d430a25 --- /dev/null +++ b/docs/research/2026-06-04-p2-cellar-lip-flatfloor-cp-handoff.md @@ -0,0 +1,445 @@ +# P2 cellar-lip wedge β€” CANONICAL handoff (flat-floor contact-plane coin-flip) + +## β–Ά NEXT-SESSION KICKOFF (START HERE β€” supersedes everything below) + +**State:** M1.5 / P2 cellar-lip "blocked at the last step" wedge. A FAITHFUL deterministic reproduction now +exists. The cause has been peeled through SIX evidence-disproven framings to one bounded question. No fix +landed (intentionally β€” the last layers were each disproven; do NOT guess, the collision code is load- +bearing). Branch `claude/thirsty-goldberg-51bb9b` (do NOT branch/worktree; do NOT push w/o asking; NEVER +`git stash`/`gc`). PowerShell on Windows; launch logs UTF-16. Use `superpowers:systematic-debugging`. + +**READ (in order):** (1) THIS file's `## SESSION-END` + `UPDATE 1` + `UPDATE 2` (the live captures + the +pinned root cause) and `CORRECTION 1`/`CORRECTION 2` (CP + cull are RETAIL-FAITHFUL, proven). (2) +`memory/project_p2_door_stepup_findings.md`. + +**DONE β€” faithful apparatus (uncommitted in worktree; RECOMMEND committing first):** +`tests/AcDream.Core.Tests/Physics/CellarLipWedgeTests.cs` + `Fixtures/cellar-lip/0xA9B4017{1,4,5}.json` + +`Fixtures/cellar-lip/wedge-records.jsonl` (29 real `ACDREAM_CAPTURE_RESOLVE` wedge calls). Replays the EXACT +captured calls (seed body-before, real climb dir βˆ’X,+Y) through the lip-cell engine β€” **all 29 reproduce +the wedge at 0% advance in <200 ms.** Tests (all GREEN as documents-the-bug/diagnostics): +`DocumentsWedge_LiveFloorCp_PlayerStuckAtCottageFloorEdge`, `Diagnostic_ReplayLiveWedgeRecords_Advance`, +`Diagnostic_ReplayFloorCpRecord_StepUpProbes` (β†’ `%TEMP%/lip-wedge-stepup.log`), + 2 synthetic. + +**DISPROVEN β€” do NOT re-investigate:** flat-floor CP (retail also no-CP, smooth β€” Correction 1); the +`PosHitsSphere` cull sign (retail-faithful, `cdb -z`-verified β€” Correction 2); sphere radius (0.48=player +correct, 0.30=camera probe); the A6.P4 neg-poly `Collided`β†’`slide_sphere` shortcut (fix attempted + reverted, +didn't clear it β€” the slide returns offset=0 then degenerates to Collided on re-check). + +**PINNED ROOT-CAUSE LAYER (UPDATE 2):** during the step-up's step-down (`DoStepUp`β†’`DoStepDown`β†’ +`TransitionalInsert(5)`), **`BSPQuery.FindWalkableInternal` is NEVER called for cell 0171** (confirmed after +a CLEAN rebuild β€” `[fw-enter]` TEMP probe fires 0Γ—). So the cottage floor (0171 poly 0x0023, n=(0,0,1), +Z=94) is **never tested as walkable** β†’ no contact plane β†’ step-down rejects (`cpValid=False`) β†’ step-up +fails β†’ `StepUpSlide=Collided` β†’ wedge. `[other-cells] iter=0171 result=OK` is returned WITHOUT reaching +`StepSphereDown`β†’`find_walkable`. + +**THE JOB (bounded, evidence-first β€” NO speculative edits):** +1. Trace `Transition.FindEnvCollisions` (TransitionTypes.cs) β†’ `BSPQuery.FindCollisions` PATH DISPATCH for + cell 0171 when `StepDown=true`. Find WHY `StepSphereDown`/`FindWalkableInternal` is skipped β€” candidates: + entry `NodeIntersects` early-OK; Path 1 (Placement) taken (DoStepDown's placement insert); the primary + 0175 collision returning Collided (the βˆ’X-wall Path-5 `StepSphereUp`, `stepUp=stepDown=False` = the OUTER + non-step pass) short-circuiting before `CheckOtherCells(0171)`; or StepDown not actually set on that call. + Use the `[fw-enter]`/`[find-walkable]` TEMP probes β€” **FORCE A CLEAN REBUILD (`Remove-Item obj,bin`) for + any Core probe edit; `dotnet test`/`dotnet build` incremental did NOT pick up new BSPQuery.cs probes + (cost two probe rounds).** +2. Port retail's behavior (oracle: `CEnvCell::find_collisions` pc:309560 β†’ `BSPTREE::find_collisions` + pc:323725 Path-3 β†’ `BSPTREE::step_sphere_down` pc:323665 β†’ `BSPLEAF::find_walkable` pc:326793). Verify + how retail's step-down reaches `find_walkable` on the cottage floor where acdream's does not. +3. Fix β†’ VALIDATE: flip `CellarLipWedgeTests.DocumentsWedge_LiveFloorCp_*` to `advance>0.25Β·requested` β†’ + GREEN; `Diagnostic_ReplayLiveWedgeRecords` advance% jumps off 0%. 4. REGRESSION: `DoorBugTrajectoryReplayTests` + + full Core suite. **VISUAL GATE: cellar ascent clean (no last-step wedge) + inn door BLOCKS + generic + step-up climbs.** + +**ENABLER:** `cdb -z "C:\Turbine\Asheron's Call\acclient.exe"` = offline static disasm + `uf` w/ PDB symbols +(no live attach); use it to verify any retail branch/offset (the cull-sign error was a BN parity-jump +mis-read β€” never trust BN `if(p)` for `test ah,N; jp`). + +**Apparatus (uncommitted, worktree):** the test + fixtures above; TEMP probes in `BSPQuery.cs` +(`[path5-wall]`,`[fw-enter]`,`[find-walkable]`, STRIP) + `TransitionTypes.cs` (`[neg-poly]`,`[stepsphereup]`, +`[stepdown-decide]`, CheckOtherCells cn/sn/negHit, STRIP) all gated on `ACDREAM_PROBE_INDOOR_BSP`; captures +`lip-wedge-resolve.jsonl`/`lip-cells/`/`launch-*.log`; cdb scripts `tools/cdb/retail-connector-collide-trace.cdb` +(+ flatfloor/lip); analyzers `analyze_wedge_jsonl.py`/`extract_wedge_records.py`/`analyze_v1_corr.py`; +`cdbz-disasm.txt`/`cdbz-poshits.txt`. **Test baseline:** Core prior 1310p/4f/1s + 5 GREEN lip tests; App 177. + +--- + +> **Canonical pickup, 2026-06-04 PM.** Branch `claude/thirsty-goldberg-51bb9b` (do NOT +> branch/worktree; do NOT push without asking; NEVER `git stash`/`gc`). PowerShell on +> Windows; launch logs are UTF-16. This SUPERSEDES the membership re-diagnosis in +> `docs/research/2026-06-04-p2-cellar-corner-stepup-handoff.md` (now history) and folds in +> the full chain from `memory/project_p2_door_stepup_findings.md`. + +--- + +## πŸ§ͺ SESSION-END 2026-06-04 PM β€” deterministic repro BUILT + first fix attempt REVERTED + +**Apparatus shipped (uncommitted in worktree):** `tests/AcDream.Core.Tests/Physics/CellarLipWedgeTests.cs` ++ fixtures `tests/AcDream.Core.Tests/Fixtures/cellar-lip/0xA9B4017{1,4,5}.json` (copied from `lip-cells/`). +Loads the 3 lip cells (synthetic single-leaf BSP, same as `CellarUpTrajectoryReplayTests`), seeds the +player (r=0.48, foot bottom Z=93.456 β†’ foot-sphere center Z=93.936 = the live wedge) carried in slab +0175, drives forward. **Reproduces the wedge deterministically in <90 ms:** the player FREEZES, blocked +by the threshold slab's βˆ’X side wall (poly normal world (1,0,0)). Two tests, both GREEN as documents-the- +bug: `Diagnostic_DriveOffThreshold_DumpTrajectory` (dumps trajectory+probes to `%TEMP%/lip-wedge-diag.log` +via Console redirect) + `DocumentsWedge_PlayerFrozenAtThreshold_BlockedByMinusXWall`. + +**FIX ATTEMPT #1 β€” REVERTED.** Hypothesis: the A6.P4 neg-poly `NegStepUp==false` branch +(`TransitionTypes.cs` ~line 1083) returns `Collided` (a deliberate "simpler response" shortcut; the +comment says the slide was deferred), where retail dispatches `neg_step_up==0 β†’ slide_sphere`. Replaced +it with `SlideSphereInternal(NegCollisionNormal, GlobalCurrCenter[0].Origin)` (mirroring the NegStepUp= +true branch). **Did NOT fix the wedge** β†’ reverted. WHY: the slide returns `Slid` with **offset=0** (the +βˆ’Y displacement is already along the crease `dir=cross((1,0,0),(0,0,1))=(0,βˆ’1,0)`), so the sphere +doesn't move; the loop re-checks with `gDeltaβ‰ˆ0` β†’ `SlideSphere`'s `offset.LengthSquared<Ξ΅ β†’ Collided` +branch (`TransitionTypes.cs:2877`) β†’ revert. So the bug is NOT the shortcut alone β€” it's the +**slide/loop-commit**: the parallel-graze slide produces no advance, and the re-check degenerates to +Collided. + +**TWO GAPS for the next pass:** +1. **Faithful repro:** the synthetic drive direction (world βˆ’Y) is a GUESS and is PARALLEL to the βˆ’X + wall (keeps grazing). The real climb direction is unknown without the exact `targetPos`. **Get a + short `ACDREAM_CAPTURE_RESOLVE=` JSONL of the live wedge** (one acdream run, wedge ~5 s) β†’ wire + a `LiveCompare`-style test (the proven `CellarUpTrajectoryReplayTests` pattern) with the exact + currentPos/targetPos/body-before. That makes the RED test faithful + the fix validatable. +2. **The real fix is in the slide/loop:** why does retail's `slide_sphere` advance the sphere PAST the + parallel graze where acdream's returns offset=0 then degenerates to Collided on re-check? Trace + retail `CSphere::slide_sphere` (pc:321660) vs acdream `SlideSphere` (`TransitionTypes.cs:2826`) for + the parallel-wall + grounded case, AND why the loop re-check sees `gDeltaβ‰ˆ0`. NOTE the live wedge + used the **NegStepUp=TRUE** path (StepSphereUpβ†’StepUpSlide=Collided) while the synthetic repro used + **NegStepUp=FALSE** (neg-poly-dispatchβ†’Collided) β€” BOTH end in `SlideSphere`/`SlideSphereInternal` + returning Collided, so the common fix point is `SlideSphere`'s degenerate-offset handling, not the + dispatch branch. **DOOR REGRESSION RISK:** any `SlideSphere`/neg-poly change touches the A6.P4 door + block β€” regression-test `DoorBugTrajectoryReplayTests` + visual-gate the inn door BLOCKS. + +**Test baseline unchanged:** the 2 new lip tests are GREEN (documents-the-bug). Build green. The reverted +fix leaves `TransitionTypes.cs` functionally identical (only an explanatory comment added at the shortcut). + +### UPDATE (same session, later) β€” FAITHFUL repro BUILT + ROOT CAUSE PINNED + +Got the JSONL (`ACDREAM_CAPTURE_RESOLVE` β†’ `lip-wedge-resolve.jsonl`, 17K player records). The real climb +direction is **βˆ’X,+Y** (my synthetic βˆ’Y guess was backwards). Extracted 29 representative wedge records to +`tests/AcDream.Core.Tests/Fixtures/cellar-lip/wedge-records.jsonl` (`extract_wedge_records.py`). +`CellarLipWedgeTests` now replays the EXACT captured calls (seed body-before, replay `ResolveWithTransition` +through the lip-cell engine): **all 29 reproduce the wedge bit-faithfully (0% advance).** New tests (all +GREEN as documents-the-bug / diagnostics): `Diagnostic_ReplayLiveWedgeRecords_Advance`, +`Diagnostic_ReplayFloorCpRecord_StepUpProbes`, `DocumentsWedge_LiveFloorCp_PlayerStuckAtCottageFloorEdge`. + +**ROOT CAUSE PINNED** (via `Diagnostic_ReplayFloorCpRecord_StepUpProbes` β†’ `%TEMP%/lip-wedge-stepup.log`): +the player is at the doorway EDGE of the cottage floor. The step-up (triggered by the βˆ’X wall, normal +(1,0,0), STEEP) β†’ step-down β†’ multi-cell check reaches **0171 poly 0x0023 = the cottage floor** (n=(0,0,1), +world Z=94). The 0.48 sphere **OVERLAPS** it (`overlapsSphere=True`, `dist=βˆ’0.085`) β€” BUT it's **REJECTED +because the sphere center projects outside the floor poly's edge** (`insideEdges=False`, `gap=βˆ’0.395`). So +`[other-cells] iter=0171 result=OK` (NOT Adjusted), no contact plane is set β†’ `[stepdown-decide] cpValid= +False accept=False` β†’ step-up FAILS β†’ `StepUpSlide=Collided` β†’ wedge. Retail accepts the floor at its edge +and crosses (0175 never blocks). **This is a WALKABLE-EDGE acceptance divergence**, not a CP/cull/slide bug. + +**THE FIX (next, narrow):** compare acdream's walkable-edge math vs retail for the sphere-overlaps-floor- +but-center-outside-edge case. Actual walkable test = `BSPQuery.WalkableHitsSphere` (254) β†’ +`PolygonHitsSpherePrecise` (overlap) + `AdjustSphereToPlane` (351); `[other-cells] result=OK` means one of +them returned false for poly 0x0023. The `[walkable-nearest]` diagnostic uses `CheckWalkable` (287, the +edge/`insideEdges` test). Retail oracle: `CPolygon::walkable_hits_sphere` (pc:323006) + +`CPolygon::check_walkable` (pc:322811) + `CPolygon::adjust_sphere_to_plane` (pc:322032). Read which one +rejects the edge-overlap and why retail accepts it. **Validate with `CellarLipWedgeTests` (flip +`DocumentsWedge_LiveFloorCp_*` to assert advance>0.25Β·requested). DOOR REGRESSION RISK: walkable changes +are global β€” run `DoorBugTrajectoryReplayTests` + visual-gate the inn door BLOCKS + generic step-up climbs.** +Apparatus: `lip-wedge-resolve.jsonl`, `Fixtures/cellar-lip/*`, `analyze_wedge_jsonl.py`, +`extract_wedge_records.py`, `%TEMP%/lip-wedge-stepup.log`. + +### UPDATE 2 β€” deeper: `find_walkable` is NEVER called during the step-down (cottage floor never tested) + +Drilled one layer further with TEMP probes `[fw-enter]`/`[find-walkable]` in `BSPQuery.FindWalkableInternal` +(gated on `ACDREAM_PROBE_INDOOR_BSP`, marked STRIP, uncommitted). **Confirmed after a CLEAN rebuild (deleted +obj/bin) β€” `[fw-enter]` fires ZERO times** while the prior probes fire. So during the step-up's step-down +(`DoStepUp`β†’`DoStepDown`β†’`TransitionalInsert(5)`), `FindWalkableInternal` is **never reached** for 0171 (nor +0175): the cottage floor poly 0x0023 is never tested by the walkable finder. `[other-cells] iter=0171 +result=OK` is returned WITHOUT `StepSphereDown`β†’`FindWalkableInternal`. So the "walkable-edge acceptance" +framing in UPDATE 1 is one level too shallow β€” the floor isn't *rejected* by the edge test, it's never +*tested* at all. Root: `FindEnvCollisions`/`BSPQuery.FindCollisions` for 0171 during the step-down returns OK +on a path BEFORE Path 3 (StepDownβ†’StepSphereDown). **NEXT: trace `FindEnvCollisions` (TransitionTypes) β†’ which +`FindCollisions` path 0171 takes during `StepDown=true` (entry NodeIntersects early-out? Path 1 Placement? +the primary-0175 result short-circuiting CheckOtherCells?) and why StepSphereDown/find_walkable is skipped.** +The `[stepsphereup] stepUpFlag=False stepDownFlag=False` means the βˆ’X-wall StepSphereUp is the OUTER +(non-step) collision; the step-DOWN that should find the floor is a separate inner insert that never runs +find_walkable. NOTE: a clean `dotnet build`/`dotnet test` did NOT pick up new `BSPQuery.cs` probes until +`Remove-Item obj,bin` β€” **force a clean rebuild when adding Core probes** (cost two probe rounds this session). + +**HONEST STATUS: NO FIX. The collision/step path is deeper than a single-line fix** β€” 6+ framings this +session (CPβ†’cullβ†’slideβ†’neg-polyβ†’walkable-edgeβ†’find_walkable-not-called), each disproven by evidence and the +next layer exposed. This is the systematic-debugging "question the architecture" signal. The FAITHFUL repro +(`CellarLipWedgeTests`, 29 records @0% advance) makes the next attempt iterable; the next move is the +`FindEnvCollisions`/`FindCollisions`-path trace above, NOT another speculative edit. The collision code is +load-bearing (every floor/wall/step) β€” do not guess. + +--- + +## ⚠️ CORRECTION 2026-06-04 (next session) β€” THE CP IS RETAIL-FAITHFUL; v2 IS MOOT + +**The "decisive question" below is ANSWERED from the EXISTING v1 log β€” no new retail trace +needed.** The v1 `retail-flatfloor-trace.log` was wrongly dismissed as a `gu` artifact. It is +**real data.** Proof (full-file correlation over all 5,349 records, `analyze_v1_corr.py`): +- sphere **z ≀ 90.0 β†’ pure ret=3** (CP set); **z = 94.01 (the flat cottage floor) β†’ pure ret=1 + (NO-CP), 877 records, zero ret=3**; ret mixes only in the **ramp transition zone (90–93.7)**, + which is physical. A corrupted-`eax` artifact CANNOT produce two large pure populations at + opposite Z extremes with a physical transition between β€” the ret tracks the input Z exactly. +- **`walk_interp = 1.0 β†’ ret=1 (no-CP) 770Γ—`** β€” i.e. retail, with `walk_interp=1.0` on the flat + floor, gets NO contact plane and is **smooth**. That is the *exact* acdream condition + (`walkInterp=1.000 cpValid=False`). +- `cdb -z acclient.exe` (offline static disasm, symbols) confirms `BSPTREE::step_sphere_down` + `+0x218`=`mov eax,3;ret` (reached only after `[eax+18h]=1` contact_plane_valid + `set_walkable`) + and `+0x227`=`mov eax,1;ret` (early `je` when `find_walkable` found nothing). So ret3↔CP-set, + ret1↔no-CP is certain. + +**ANSWER:** retail's `step_sphere_down` returns **NO-CP (ret 1)** on the flat cottage floor β€” +exactly like acdream β€” and retail crosses smoothly. **The contact plane is NOT the divergence.** +Both "if NO-CP β†’ trace set_contact_plane callers" and "if SET-CP β†’ divergence in StepSphereDown" +branches below rest on a FALSE premise (that retail establishes a flat-floor CP somewhere). It +does not. **Do NOT run the v2 trace; do NOT hunt a retail flat-floor CP path.** + +**REDIRECTED diagnosis (back to the connector recovery β€” the `RE-DIAGNOSIS 2` / `SLIDE LOCALIZED` +line in memory, which the flat-floor-CP finding had wrongly sidelined):** the wedge is the +per-cell collide on **connector 0175** returning **Slid** during the recovery, which reverts the +good floor landing. Static comparison this session confirms the recovery structures ALL MATCH +retail: `find_collisions` Contact full-hit β†’ `step_sphere_up`; `step_up` fail β†’ `step_up_slide` +β†’ `slide_sphere` (retail `CSphere::step_sphere_up` pc:321611–321638, `step_up_slide` pc:273930); +`check_other_cells` halts on Slid (4) clearing CP (pc:272717, `cdb -z` jump-table on `(result-1)`); +acdream `TransitionalInsert` *continues* (no revert) on Slid (TransitionTypes.cs:881). The SOLE +open question: **does retail's per-cell `CEnvCell::find_collisions` return Slid (recover & slide) +or OK (never hits) for connector 0175 at the lip?** +- OK in retail β†’ acdream's connector Slid is SPURIOUS (over-detect / over-step-up 0175) β†’ fix there. +- Slid in retail β†’ retail slides+continues; acdream's wedge is the substep **REVERT** upstream + (`FindTransitionalPosition` / `ResolveWithTransition`), not the collide. + +**NEW decisive trace (READY, robust, no `gu`):** `tools/cdb/retail-connector-collide-trace.cdb` +breaks `CEnvCell::find_collisions+0x1e` (the SINGLE exit; `esi`=`this`, `eax`=result; cell id +`poi(esi+0x28)`), logs ret per lip cell 0xA9B4017X. Built + offset-verified entirely offline via +`cdb -z` (no live attach). **ENABLER:** `cdb -z "C:\Turbine\Asheron's Call\acclient.exe"` does +offline static disassembly with full PDB symbols β€” verify any trace offset without a running client. + +Everything below this banner is RETAINED FOR HISTORY (the flat-floor-CP hypothesis, now disproven). + +--- + +## ⚠️ CORRECTION 2 β€” 2026-06-04 PM (live retail + acdream captures; the REAL mechanism) + +Two live captures this session settled it. **Retail-connector trace** (`tools/cdb/retail-connector-collide-trace.cdb` +β†’ `retail-connector-collide-trace.log`, breaking `CEnvCell::find_collisions+0x1e`, single nesting-safe exit): +over ~85K samples the **connector cell 0175 returns 2692 OK + 94 Adjusted + 0 Collided + 0 Slid** β€” it +**never blocks**. (Floor 0171 and 0174 DO block β€” real cottage-room walls β€” so the trace is working.) So +the connector is a pure pass-through / successful-step-up in retail; acdream spuriously blocks it. + +**acdream live capture at the wedge** (`launch-lip-capture.log`, ACDREAM_PROBE_INDOOR_BSP=1 + the 4 TEMP +probes + cell dumps `lip-cells/0xA9B4017{1,4,5}.json`) β€” the stuck state is: +``` +[indoor-bsp] cell=0xA9B40175 lpos=(8.523,-2.251,-0.064) lprev=(8.520,-2.251,-0.064) r=0.480 result=OK +[stepdown-decide] cell=0xA9B40175 insert=OK cpValid=False cpNz=1.000 walkableZ=0.664 accept=False pos=(...,93.456) +[stepsphereup] cell=0xA9B40175 stepUpFlag=False stepDownFlag=False n=(1.00,0,0) stepped=False +[stepsphereup] cell=0xA9B40175 StepUpSlide=Collided +[indoor-bsp] cell=0xA9B40175 r=0.480 result=Collided +``` +**Decoded mechanism (this is NOT the memory's "connector Slid" β€” that was a pre-B1-fix state):** +- **0175 is a 0.364 m-tall threshold SLAB** (dump: 4 solid side walls at local X=7/9, Y=βˆ’2.85/1.15; + open floor/ceiling portals poly4β†’0171, poly5β†’0174; WorldTransform 180Β°-rot at (161.929,7.503,94)). +- The wedge uses the **r=0.48 body sphere** (Ø0.96 β€” *bigger than the slab is tall*), centered at world + Z=93.936 (local Z=βˆ’0.064, i.e. SUNK into the threshold, ~0.5 m below resting-on-floor Zβ‰ˆ94.48). +- That oversized sphere genuinely **full-hits** the βˆ’X wall (poly 3, X=9; sphere at X=8.523 reaches + X=9.003 β€” a **3 mm graze**; `moveDot<0` so retail would keep it too) β†’ `BSPQuery.StepSphereUp` + (Path 5, BSPQuery.cs:1849/1380) β†’ **`DoStepUp` fails** (its internal step-down finds no CP on the flat + floor β€” `[stepdown-decide] cpValid=False`, retail-faithful per Correction 1) β†’ **`StepUpSlide` β†’ + `SlideSphereInternal` returns `Collided`** β†’ `FindEnvCollisions` returns Collided β†’ wedge. The 3 mm + graze is hair-trigger β†’ explains the intermittency. + +**CULL SIGN = RED HERRING (verified faithful).** Mid-session I believed acdream's `PosHitsSphere` cull +(`if moveDot>=0 return false`) was OPPOSITE retail. **WRONG** β€” `cdb -z uf acclient!CPolygon::pos_hits_sphere` +shows `test ah,5; jp +0x46`. `jp` is a **parity** jump; the cull branch is taken on EVEN parity = `{dot>=0}`. +So retail **keeps the hit when `dot<0`, culls when `dot>=0`** β€” IDENTICAL to acdream + ACE (`if dist>=0 +return false`). Movement convention also matches (both `checkβˆ’curr`: acdream BSPQuery.cs:1663, retail +find_collisions). **Do NOT touch the cull.** The Binary Ninja pseudo-C renders `test ah,5; jp` as +`if (p) return 0` which READS like "cull when dot<0" β€” it is not; the parity decode is inverted. LESSON: +verify any cull/branch sign against `cdb -z`, never the BN `if(p)` rendering of a parity jump. + +**ENABLER:** `cdb -z "C:\Turbine\Asheron's Call\acclient.exe"` does offline static disasm + `uf` with full +PDB symbols β€” used to build/verify the connector trace AND to catch the cull-sign error. Ghidra `patchmem` +addresses do NOT match the PDB/BN addresses (0x005394f0 β†’ `CPolygon::UnPack` in Ghidra); use `cdb -z`. + +**THE SHARP REMAINING QUESTION:** at the thin slab, **why does retail's step-up SUCCEED (climb onto the +cottage floor, find_collisions returns OK) where acdream's `DoStepUp` FAILS (no CP β†’ StepUpSlide=Collided)?** +Sub-leads: (a) **RULED OUT β€” r=0.48 vs r=0.30 is two DIFFERENT movers, not a bug.** r=0.48 = the PLAYER +(`PlayerMovementController.cs:1116`, "human player radius from Setup"); r=0.30 = the CAMERA collision +probe (`PhysicsCameraCollisionProbe.cs:18` `ViewerSphereRadius=0.3`, single sphere). The smooth r=0.30 +crossings are the camera spring-arm; the wedge is the player. Player radius 0.48 is correct. So the +question is purely the player step-up, NOT the sphere. Open: why is the player SUNK to Z=93.936 (0.5 m +below resting-on-floor Zβ‰ˆ94.48) at the threshold β€” is that retail-faithful (it's mid-climb from the +cellar) or a position error? (b) does retail even full-hit 0175's wall, or does its sphere clear it +(position)? (c) the +flat-floor step-up success path (Correction 1's open question β€” retail's step_up establishes the floor +CP via some path acdream lacks). NEXT: either build a deterministic harness test from `lip-cells/*.json` +(place the r=0.48 sphere at the captured wedge pos, assert FindCollisions returns OK not Collided β€” REDβ†’ +GREEN), or one targeted retail trace of `CSphere::step_sphere_up`/`CTransition::step_up` at 0175 (does it +return 1/OK or fall to step_up_slide?). Apparatus committed-in-worktree: `tools/cdb/retail-connector-collide-trace.cdb`, +`lip-cells/0xA9B4017{1,4,5}.json`, `launch-lip-capture.log`, `cdbz-disasm.txt`, `cdbz-poshits.txt`, +`analyze_v1_corr.py`. TEMP `[path5-wall]` probe added to BSPQuery.cs Path 5 (STRIP; was NOT in the stale +--no-build binary, so it didn't fire β€” rebuild to use it). + +--- + +## State both altitudes +- **Milestone:** M1.5 β€” Indoor world feels right. +- **Effort:** P2 of the verbatim spatial-pipeline port + (`docs/superpowers/specs/2026-06-03-verbatim-spatial-pipeline-port-master-plan.md`). +- **Symptom (user words):** "run up the cellar stairs, get blocked at the last step; + sometimes through, sometimes not." Retail is always smooth there. +- **This session's outcome:** NO fix landed. The diagnosis was corrected three times with + evidence; the wedge is now precisely localized; the FINAL decisive question is still open + because the retail trace tooling (`gu` in a bp action) produced an artifact. One clean v2 + retail trace pins it. Everything is saved; resume cold. + +## The corrected diagnosis (evidence chain β€” all three prior theories DISPROVEN) +1. **NOT membership / cell-resolver ping-pong** (the prior handoff's claim). A live **retail + cdb trace** (`tools/cdb/retail-lip-trace.cdb` β†’ `retail-lip-trace.log`, breaking + `CTransition::step_up`, logging `sphere_path.check_pos.objcell_id`) proved retail's carried + cell ALSO alternates `0xA9B40174/0175/0171` at the lip (181/40/17 over 238 step_ups), yet + retail crosses smoothly. So the carried-cell flip is retail-faithful β€” a "keep the cell + stable" / `ResolveCellId`-stickiness fix would DIVERGE from retail. Also: the production + `[cell-transit] reason=resolver` is the SWEPT `find_cell_list` pick (`RunCheckOtherCellsAndAdvance` + β†’ `CellTransit.FindCellSet`), NOT `PhysicsEngine.ResolveCellId` (which is only the cache-null + test fallback). `result.cellId` is STABLE in runs of 100s of ticks in + `acdream-corner-capture.jsonl` (154K recs). +2. **NOT a reverted landing (the M1 guess).** In `acdream-corner-capture.jsonl` the player + reaches the floor (Z=94.0, cpz 0.78β†’1.00) and WALKS ON into the cottage (idx 7215β†’7244); + the landing commits fine. +3. **IT IS: a step-up coin-flip on the FLAT cottage floor.** The `[stepdown-decide]` probe + (in `Transition.DoStepDown`) shows the trigger unambiguously: + - `accept=True (1845Γ—): insert=OK cpValid=True` on the RAMP (cpNz=0.781, Zβ‰ˆ93.3, walkInterpβ‰ˆ0) + - `accept=False ( 849Γ—): insert=OK cpValid=False cpNz=1.000 walkInterp=1.000` on the FLAT floor (Z=94.0) + + The step-up's acceptance check (`insert==OK && ContactPlaneValid && cpNz>=walkableZ`, + `TransitionTypes.cs:3147`) rejects ONLY when `cpValid=False`, which happens ONLY on the FLAT + floor: the sphere is already settled β†’ `adjust_sphere_to_plane` is a no-op β†’ `FindWalkableInternal` + records no poly (its gate is `walkable && adjusted`, `BSPQuery.cs:736`) β†’ `StepSphereDown` + (`BSPQuery.cs:1216`) sets no contact plane β†’ reject. On the RAMP the sphere is always sliding + (adjusted=true) so the CP is set β†’ accept. **Ramp = adjusting = works; flat floor = settled = + no CP = fails.** The `[stepsphereup]` probe corroborates: lip-riser step-up (cell 0171, + n=(0,-1,0)) = 443 success / 445 fail; connector +X corner wall (cell 0175, n=(1,0,0)) = 74 fail + β†’ recursive `StepSphereUp` β†’ `StepUpSlide` = 401 Slid / 203 Collided overall. + +## Why the OBVIOUS fix is WRONG (do not ship it) +"Just set the contact plane whenever a walkable poly is found, even without adjustment" β€” this +DIVERGES from retail. Verified against the decomp: +- `BSPLEAF::find_walkable` (`acclient_2013_pseudo_c.txt:326793`) gates BOTH the poly AND the + changed-flag on `walkable_hits_sphere && adjust_sphere_to_plane` β€” IDENTICAL to acdream's + `FindWalkableInternal`. +- `CPolygon::adjust_sphere_to_plane` (`:322032`) updates `walk_interp` and returns 1 only when + `new_interp = (1-t)*walk_interp < walk_interp`, i.e. `t>0` (the sphere must move toward the + plane). For a SETTLED sphere (`tβ‰ˆ0`) retail ALSO returns 0 β†’ records no poly β†’ sets no + step-down CP. +So acdream's `StepSphereDown` + `AdjustSphereToPlane` are FAITHFUL. Retail must establish the +flat-floor contact plane through a DIFFERENT path during the climb β€” that path is what's still +unknown. + +## THE DECISIVE OPEN QUESTION + the v2 trace protocol +**Does retail's `BSPTREE::step_sphere_down` SET the contact plane (ret 3) or NOT (ret 1) on the +flat floor cell (0xA9B40171)?** +- v1 trace FAILED: `gu` inside a cdb bp action ("commands skipped … target execution inside an + event handler") corrupted eax β†’ perfect `1,3,1,3` alternation artifact (run-length=1; the + 4216/1133 histogram is meaningless). **NEVER use `gu` in a cdb bp action.** +- v2 trace READY: `tools/cdb/retail-flatfloor-trace.cdb` β€” stashes the cell in `$t3` at entry + via `@@c++`, counts at the two RETURN addresses (no `gu`). **STEP 0: verify the +0x218 (ret 3) + / +0x227 (ret 1) offsets against the `u acclient!BSPTREE::step_sphere_down` disassembly the + script logs, fix if needed, re-attach, THEN have the user wedge ~10s.** +- Interpretation: if floor cell 0171 is mostly **NO-CP** β†’ retail establishes the floor CP via a + DIFFERENT path β†’ next trace breaks `COLLISIONINFO::set_contact_plane` and logs the CALLER + (`poi(@esp)`) for normalβ‰ˆ(0,0,1) to find that path, then port it. If mostly **SET-CP** β†’ the + divergence is inside acdream's `StepSphereDown`/`AdjustSphereToPlane` after all (re-read the + `walk_interp`/`t` math vs ACE). + +## Leading hypothesis (UNCONFIRMED, pending v2) +Retail's step-up ALSO "fails" on the settled flat floor (step_sphere_down no-CP) but **recovers +via `step_up_slide` smoothly**, where acdream wedges β€” so the divergence may be in the SLIDE +RECOVERY (`SpherePath.StepUpSlide` β†’ `Transition.SlideSphereInternal`, the B1/`slide_sphere` +area, commits `abbd761`/`0935a31`) and/or the connector-cell-0175 `StepSphereUp` interference, +NOT the contact plane itself. The B1/slide fixes are correct FOR THE DOOR; re-investigation is +warranted FOR THE CELLAR recovery only. + +## Retail decomp anchors (verified this session) +`CTransition::step_up` pc:273099 (clears CP @273103, calls step_down) Β· `CTransition::step_down` +pc:272946 (the `if (step_up==0)` lower-gate @272954; `transitional_insert(5)`; accept iff +`!cond:0 && contact_plane_valid` @272968) Β· `BSPTREE::step_sphere_down` pc:323665 (sets +`contact_plane_valid=1` UNCONDITIONALLY when a poly is found @323711; return 3) Β· +`BSPLEAF::find_walkable` pc:326793 Β· `CPolygon::adjust_sphere_to_plane` pc:322032 Β· +`CTransition::transitional_insert` pc:273137 (neg_poly_hit β†’ slide_sphere @273350) Β· +`CTransition::validate_transition` pc:272547 Β· `CTransition::check_other_cells` pc:272717. + +## acdream code map (where the fix will likely go) +`BSPQuery.StepSphereDown` (:1216) Β· `FindWalkableInternal` gate (:736) Β· `AdjustSphereToPlane` +(:351) Β· `FindCollisions` StepDown dispatch (:1753) Β· `StepSphereUp` (:1372) Β· `StepUpSlide` +(TransitionTypes.cs:472) / `SlideSphereInternal` Β· `DoStepUp` (:3269) / `DoStepDown` (:3089) Β· +step-up acceptance (:3147) Β· neg_poly dispatch gated `!StepDown && !StepUp` (:1040) Β· +`CheckOtherCells` (:1632) Β· `RunCheckOtherCellsAndAdvance` (:2158). + +## Apparatus inventory +**TEMP probes (UNCOMMITTED in worktree, gated on `ACDREAM_PROBE_INDOOR_BSP`, marked STRIP):** +`BSPQuery.NegPolyHitDispatch` β†’ `[neg-poly]`; `BSPQuery.StepSphereUp` β†’ `[stepsphereup]`; +`Transition.CheckOtherCells` β†’ `cn`/`sn`/`negHit` added to `[other-cells]`; `Transition.DoStepDown` +β†’ `[stepdown-decide]`. +**Existing env probes:** `ACDREAM_PROBE_INDOOR_BSP=1` (β†’ `[indoor-bsp]`+`[other-cells]`+the 4 TEMP), +`ACDREAM_DUMP_STEPUP=1` (β†’ `stepup:`), `ACDREAM_PROBE_CELL=1` (β†’ `[cell-transit]`), +`ACDREAM_PROBE_STEP_WALK=1` (β†’ `[step-walk]`, very high volume), `ACDREAM_CAPTURE_RESOLVE=`. +**cdb scripts:** `tools/cdb/retail-lip-trace.cdb` (carried cell β€” DONE), `tools/cdb/retail-flatfloor-trace.cdb` +(v2, READY). Binary `C:\Turbine\Asheron's Call\acclient.exe` MATCHES `refs/acclient.pdb`. +**Logs (worktree root, UTF-16/big β€” do NOT commit):** `acdream-corner-capture.jsonl` (321MB), +`launch-corner-{innerflow,slidepoly,negpoly,ssu,decide}.log`, `retail-lip-trace.log`, +`retail-flatfloor-trace.log` (artifact), `corner-cells-audit.txt`. **Analyzers:** `analyze_corner.py`. + +## DO NOT +- Re-diagnose as membership / add `ResolveCellId` stickiness (RULED OUT by retail cdb). +- Ship "set the step-down CP without adjustment" (DIVERGES from retail β€” verified vs decomp). +- Use `gu` inside a cdb bp action (corrupts eax β€” v1 trace artifact). +- Re-investigate B1/`slide_sphere` AS THE DOOR FIX (correct); but the cellar SLIDE RECOVERY is a + legitimate new suspect. +- Flip `Apparatus_Grounded_50cmOffCenter` to `Assert.True` (synthetic-floor artifact). +- Guess the fix β€” the divergence is genuinely subtle (`walk_interp`/slide-recovery), pin it first. + +## Test baseline +Core 1310 pass / 4 fail / 1 skip (the 4: `Apparatus_Grounded_50cmOffCenter` [synthetic-floor], +2Γ— `DoorBugTrajectoryReplay LiveCompare_*` [captured-buggy-live], `BSPStepUpTests.D4` [airborne +Path 6, separate]); App 177 green. Branch HEAD `664101f` + this session's UNCOMMITTED probes/docs. + +## FRESH-SESSION KICKOFF PROMPT (copy-paste) +``` +Continue the P2 cellar-lip wedge fix for acdream. Branch claude/thirsty-goldberg-51bb9b (do NOT +branch/worktree; do NOT push without asking; NEVER git stash/gc). PowerShell on Windows; launch +logs are UTF-16. Use superpowers:systematic-debugging. + +READ FIRST (in order): +1. docs/research/2026-06-04-p2-cellar-lip-flatfloor-cp-handoff.md (THIS handoff β€” canonical). +2. memory/project_p2_door_stepup_findings.md (full chain: RE-DIAGNOSIS 2 + SLIDE LOCALIZED + + FAILING CONDITION PINNED + RETAIL trace ATTEMPT #1 entries). + +STATE: M1.5. The cellar "blocked at the last step, sometimes through" wedge is RE-DIAGNOSED with +live retail cdb evidence: NOT membership (retail's carried cell flips the same way + is smooth), +NOT a reverted landing. It IS a step-up coin-flip on the FLAT cottage floor β€” the step-up's +internal step-down sets NO contact plane on the settled flat floor (cpValid=False, walkInterp=1.0) +so the acceptance check rejects, while it works on the ramp slope. acdream's StepSphereDown + +AdjustSphereToPlane are FAITHFUL to retail (verified vs find_walkable pc:326793 + adjust_sphere_to_plane +pc:322032), so the obvious "set the CP anyway" fix is WRONG β€” retail establishes the flat-floor CP +via a DIFFERENT path that is still unknown. + +THE JOB (evidence-first; do NOT guess): +1. Run the READY v2 retail trace tools/cdb/retail-flatfloor-trace.cdb (user relaunches the retail + client + walks to the cellar lip; STEP 0 = verify the +0x218/+0x227 return offsets against the + `u` disassembly the script logs BEFORE driving; NO `gu` in bp actions). Answer: does retail's + step_sphere_down set the CP (ret 3) or not (ret 1) at floor cell 0xA9B40171? +2. If mostly NO-CP β†’ trace COLLISIONINFO::set_contact_plane callers (poi(@esp)) for normalβ‰ˆ(0,0,1) + to find retail's flat-floor CP path; port it. If mostly SET-CP β†’ the divergence is in acdream's + StepSphereDown/AdjustSphereToPlane walk_interp/t math vs ACE. Leading hypothesis: retail's + step-up also "fails" on the flat floor but RECOVERS via step_up_slide smoothly where acdream + wedges β†’ the divergence may be the SLIDE RECOVERY (StepUpSlide/SlideSphereInternal) + + connector-0175 StepSphereUp interference, NOT the CP. +3. REDβ†’GREEN deterministic test + STRIP the 4 TEMP probes once the fix lands. USER VISUAL GATE: + cellar ascent clean (no last-step wedge); inn door still BLOCKS; generic step-up climbs. + +DO NOT: re-diagnose as membership / add ResolveCellId stickiness; ship "set the step-down CP +without adjust" (diverges from retail); use `gu` in a cdb bp action; guess. + +TEST BASELINE: Core 1310 pass / 4 fail / 1 skip (documented); App 177 green. Branch HEAD 664101f + +UNCOMMITTED TEMP probes (BSPQuery.NegPolyHitDispatch [neg-poly], BSPQuery.StepSphereUp +[stepsphereup], CheckOtherCells cn/sn/negHit, DoStepDown [stepdown-decide]) gated on +ACDREAM_PROBE_INDOOR_BSP. +``` diff --git a/src/AcDream.Core/Physics/BSPQuery.cs b/src/AcDream.Core/Physics/BSPQuery.cs index ef047675..54007754 100644 --- a/src/AcDream.Core/Physics/BSPQuery.cs +++ b/src/AcDream.Core/Physics/BSPQuery.cs @@ -1374,10 +1374,27 @@ public static class BSPQuery Vector3 collisionNormal, PhysicsEngine engine) { - if (transition.DoStepUp(collisionNormal, engine!)) + bool stepped = transition.DoStepUp(collisionNormal, engine!); + + // TEMP diagnostic (cellar-lip wedge, 2026-06-04): this is the suspected + // recursive step-up onto the CONNECTOR cell during the outer check_other_cells + // (StepUp/StepDown both false). Log which cell, the input normal, whether the + // climb succeeded, and the slide fallback's result. STRIP once the wedge fix lands. + if (PhysicsDiagnostics.ProbeIndoorBspEnabled) + { + var p = transition.SpherePath; + Console.WriteLine(System.FormattableString.Invariant( + $"[stepsphereup] cell=0x{p.CheckCellId:X8} stepUpFlag={p.StepUp} stepDownFlag={p.StepDown} n=({collisionNormal.X:F2},{collisionNormal.Y:F2},{collisionNormal.Z:F2}) stepped={stepped} pos=({p.CheckPos.X:F3},{p.CheckPos.Y:F3},{p.CheckPos.Z:F3})")); + } + + if (stepped) return TransitionState.OK; - return transition.SpherePath.StepUpSlide(transition); + var slideRes = transition.SpherePath.StepUpSlide(transition); + if (PhysicsDiagnostics.ProbeIndoorBspEnabled) + Console.WriteLine(System.FormattableString.Invariant( + $"[stepsphereup] cell=0x{transition.SpherePath.CheckCellId:X8} β†’ StepUpSlide={slideRes}")); + return slideRes; } // ------------------------------------------------------------------------- @@ -1494,6 +1511,17 @@ public static class BSPQuery path.NegStepUp = stepUp; // ACE: path.LocalSpacePos.LocalToGlobalVec(hitPoly.Plane.Normal) path.NegCollisionNormal = Vector3.Transform(hitPoly.Plane.Normal, localToWorld); + + // TEMP diagnostic (cellar-lip wedge, 2026-06-04): name the exact near-miss + // polygon (id + local normal + sides) + the foot/head mapping (stepUp) + the + // step-down flag, so we can tell which connector poly the step-up grazes. + // Gated on ACDREAM_PROBE_INDOOR_BSP. STRIP once the wedge fix lands. + if (PhysicsDiagnostics.ProbeIndoorBspEnabled) + { + var nl = hitPoly.Plane.Normal; + Console.WriteLine(System.FormattableString.Invariant( + $"[neg-poly] cell=0x{path.CheckCellId:X8} stepUp={stepUp} stepDownFlag={path.StepDown} poly=0x{hitPoly.Id:X4} nLocal=({nl.X:F3},{nl.Y:F3},{nl.Z:F3}) sides={hitPoly.SidesType} checkPos=({path.CheckPos.X:F3},{path.CheckPos.Y:F3},{path.CheckPos.Z:F3})")); + } return TransitionState.OK; } diff --git a/src/AcDream.Core/Physics/TransitionTypes.cs b/src/AcDream.Core/Physics/TransitionTypes.cs index 9879e624..2a6913ac 100644 --- a/src/AcDream.Core/Physics/TransitionTypes.cs +++ b/src/AcDream.Core/Physics/TransitionTypes.cs @@ -1742,7 +1742,7 @@ public sealed class Transition string bsDesc = System.FormattableString.Invariant( $"bs=({bs.Origin.X:F3},{bs.Origin.Y:F3},{bs.Origin.Z:F3}) br={bs.Radius:F3}"); Console.WriteLine(System.FormattableString.Invariant( - $"[other-cells] primary=0x{sp.CheckCellId:X8} iter=0x{cellId:X8} wpos=({footCenter.X:F3},{footCenter.Y:F3},{footCenter.Z:F3}) lpos=({localCenter.X:F3},{localCenter.Y:F3},{localCenter.Z:F3}) lprev=({localCurrCenter.X:F3},{localCurrCenter.Y:F3},{localCurrCenter.Z:F3}) r={sphereRadius:F3} {bsDesc} result={result} {polyDesc}")); + $"[other-cells] primary=0x{sp.CheckCellId:X8} iter=0x{cellId:X8} wpos=({footCenter.X:F3},{footCenter.Y:F3},{footCenter.Z:F3}) lpos=({localCenter.X:F3},{localCenter.Y:F3},{localCenter.Z:F3}) lprev=({localCurrCenter.X:F3},{localCurrCenter.Y:F3},{localCurrCenter.Z:F3}) r={sphereRadius:F3} {bsDesc} result={result} cn=({CollisionInfo.CollisionNormal.X:F2},{CollisionInfo.CollisionNormal.Y:F2},{CollisionInfo.CollisionNormal.Z:F2}) sn=({CollisionInfo.SlidingNormal.X:F2},{CollisionInfo.SlidingNormal.Y:F2},{CollisionInfo.SlidingNormal.Z:F2}) negHit={sp.NegPolyHit} negN=({sp.NegCollisionNormal.X:F2},{sp.NegCollisionNormal.Y:F2},{sp.NegCollisionNormal.Z:F2}) {polyDesc}")); } if (PhysicsDiagnostics.ProbeStepWalkEnabled @@ -3134,6 +3134,22 @@ public sealed class Transition sp.StepDown = false; + // TEMP diagnostic (cellar-lip wedge, 2026-06-04): why does the lip-riser + // step-up flip ~50/50? Log the step-down DECISION inputs β€” the + // TransitionalInsert(5) result, contact-plane validity + Z-normal, the + // walkable threshold, and WalkInterp. On the FAILING half exactly one of + // these explains the rejection. Gated on ACDREAM_PROBE_INDOOR_BSP. STRIP + // once the wedge fix lands. + if (PhysicsDiagnostics.ProbeIndoorBspEnabled) + { + var cpn = CollisionInfo.ContactPlane.Normal; + bool accept = transitState == TransitionState.OK + && CollisionInfo.ContactPlaneValid + && cpn.Z >= walkableZ; + Console.WriteLine(System.FormattableString.Invariant( + $"[stepdown-decide] cell=0x{sp.CheckCellId:X8} insert={transitState} cpValid={CollisionInfo.ContactPlaneValid} cpNz={cpn.Z:F3} walkableZ={walkableZ:F3} walkInterp={sp.WalkInterp:F3} accept={accept} pos=({sp.CheckPos.X:F3},{sp.CheckPos.Y:F3},{sp.CheckPos.Z:F3})")); + } + // Accept step-down if: // 1. Collision detection returned OK // 2. A valid contact plane was found diff --git a/tests/AcDream.Core.Tests/Fixtures/cellar-lip/0xA9B40171.json b/tests/AcDream.Core.Tests/Fixtures/cellar-lip/0xA9B40171.json new file mode 100644 index 00000000..48ea0445 --- /dev/null +++ b/tests/AcDream.Core.Tests/Fixtures/cellar-lip/0xA9B40171.json @@ -0,0 +1,3773 @@ +{ + "CellId": 2847146353, + "WorldTransform": { + "M11": -1, + "M12": 8.74228E-08, + "M13": 0, + "M14": 0, + "M21": -8.74228E-08, + "M22": -1, + "M23": 0, + "M24": 0, + "M31": 0, + "M32": 0, + "M33": 1, + "M34": 0, + "M41": 161.929, + "M42": 7.50315, + "M43": 94, + "M44": 1 + }, + "InverseWorldTransform": { + "M11": -1, + "M12": -8.74228E-08, + "M13": 0, + "M14": -0, + "M21": 8.74228E-08, + "M22": -1, + "M23": 0, + "M24": 0, + "M31": 0, + "M32": 0, + "M33": 1, + "M34": -0, + "M41": 161.929, + "M42": 7.5031643, + "M43": -94, + "M44": 1 + }, + "ResolvedPolygons": [ + { + "Id": 0, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": -1, + "Z": 0 + }, + "D": 1.15 + }, + "Vertices": [ + { + "X": 5.6728, + "Y": 1.15, + "Z": 6 + }, + { + "X": 5.6728, + "Y": 1.15, + "Z": 7.3 + }, + { + "X": 4.1, + "Y": 1.15, + "Z": 7.3 + }, + { + "X": 4.1, + "Y": 1.15, + "Z": 4.3 + } + ] + }, + { + "Id": 1, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": -1, + "Z": 0 + }, + "D": 1.15 + }, + "Vertices": [ + { + "X": 7.4113, + "Y": 1.15, + "Z": 7.3 + }, + { + "X": 5.6728, + "Y": 1.15, + "Z": 7.3 + }, + { + "X": 5.6728, + "Y": 1.15, + "Z": 6 + }, + { + "X": 7.4113, + "Y": 1.15, + "Z": 6 + } + ] + }, + { + "Id": 2, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": -1, + "Z": 0 + }, + "D": 1.15 + }, + "Vertices": [ + { + "X": 7.4113, + "Y": 1.15, + "Z": 8.52 + }, + { + "X": 5.6728, + "Y": 1.15, + "Z": 8.52 + }, + { + "X": 5.6728, + "Y": 1.15, + "Z": 7.3 + }, + { + "X": 7.4113, + "Y": 1.15, + "Z": 7.3 + } + ] + }, + { + "Id": 3, + "NumPoints": 3, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": -1, + "Z": 0 + }, + "D": 1.15 + }, + "Vertices": [ + { + "X": 5.6728, + "Y": 1.15, + "Z": 8.52 + }, + { + "X": 7.4113, + "Y": 1.15, + "Z": 8.52 + }, + { + "X": 9, + "Y": 1.15, + "Z": 9.2 + } + ] + }, + { + "Id": 4, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": -1, + "Z": 0 + }, + "D": 1.15 + }, + "Vertices": [ + { + "X": 7.4113, + "Y": 1.15, + "Z": 8.52 + }, + { + "X": 7.4113, + "Y": 1.15, + "Z": 7.3 + }, + { + "X": 9, + "Y": 1.15, + "Z": 7.3 + }, + { + "X": 9, + "Y": 1.15, + "Z": 9.2 + } + ] + }, + { + "Id": 5, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": -1, + "Z": 0 + }, + "D": 1.15 + }, + "Vertices": [ + { + "X": 9, + "Y": 1.15, + "Z": 4.3 + }, + { + "X": 9, + "Y": 1.15, + "Z": 7.3 + }, + { + "X": 7.4113, + "Y": 1.15, + "Z": 7.3 + }, + { + "X": 7.4113, + "Y": 1.15, + "Z": 6 + } + ] + }, + { + "Id": 6, + "NumPoints": 3, + "SidesType": 0, + "Plane": { + "Normal": { + "X": -1, + "Y": 0, + "Z": 0 + }, + "D": 9 + }, + "Vertices": [ + { + "X": 9, + "Y": -1.336, + "Z": 6 + }, + { + "X": 9, + "Y": 1.15, + "Z": 7.3 + }, + { + "X": 9, + "Y": 1.15, + "Z": 0 + } + ] + }, + { + "Id": 7, + "NumPoints": 3, + "SidesType": 0, + "Plane": { + "Normal": { + "X": -1, + "Y": 0, + "Z": 0 + }, + "D": 9 + }, + "Vertices": [ + { + "X": 9, + "Y": -1.336, + "Z": 6 + }, + { + "X": 9, + "Y": -1.336, + "Z": 7.3 + }, + { + "X": 9, + "Y": 1.15, + "Z": 7.3 + } + ] + }, + { + "Id": 8, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": -1, + "Y": 0, + "Z": 0 + }, + "D": 9 + }, + "Vertices": [ + { + "X": 9, + "Y": -1.336, + "Z": 6 + }, + { + "X": 9, + "Y": -4.57, + "Z": 6 + }, + { + "X": 9, + "Y": -4.57, + "Z": 9 + }, + { + "X": 9, + "Y": -1.336, + "Z": 9 + } + ] + }, + { + "Id": 9, + "NumPoints": 3, + "SidesType": 0, + "Plane": { + "Normal": { + "X": -1, + "Y": 0, + "Z": 0 + }, + "D": 9 + }, + "Vertices": [ + { + "X": 9, + "Y": -4.57, + "Z": 6 + }, + { + "X": 9, + "Y": -1.336, + "Z": 6 + }, + { + "X": 9, + "Y": 1.15, + "Z": 0 + } + ] + }, + { + "Id": 10, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": -1, + "Y": 0, + "Z": 0 + }, + "D": 9 + }, + "Vertices": [ + { + "X": 9, + "Y": -7.65, + "Z": 7.3 + }, + { + "X": 9, + "Y": -4.57, + "Z": 6 + }, + { + "X": 9, + "Y": 1.15, + "Z": 0 + }, + { + "X": 9, + "Y": -7.65, + "Z": -1.19209E-08 + } + ] + }, + { + "Id": 11, + "NumPoints": 3, + "SidesType": 0, + "Plane": { + "Normal": { + "X": -1, + "Y": 0, + "Z": 0 + }, + "D": 9 + }, + "Vertices": [ + { + "X": 9, + "Y": -7.65, + "Z": 7.3 + }, + { + "X": 9, + "Y": -4.57, + "Z": 7.3 + }, + { + "X": 9, + "Y": -4.57, + "Z": 6 + } + ] + }, + { + "Id": 12, + "NumPoints": 3, + "SidesType": 0, + "Plane": { + "Normal": { + "X": -1, + "Y": 0, + "Z": 0 + }, + "D": 9 + }, + "Vertices": [ + { + "X": 9, + "Y": -4.57, + "Z": 7.3 + }, + { + "X": 9, + "Y": -7.65, + "Z": 7.3 + }, + { + "X": 9, + "Y": -7.65, + "Z": 9.2 + } + ] + }, + { + "Id": 13, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": 1, + "Z": 0 + }, + "D": 7.65 + }, + "Vertices": [ + { + "X": 9, + "Y": -7.65, + "Z": 7.3 + }, + { + "X": 7.4113, + "Y": -7.65, + "Z": 7.3 + }, + { + "X": 7.4113, + "Y": -7.65, + "Z": 8.52 + }, + { + "X": 9, + "Y": -7.65, + "Z": 9.2 + } + ] + }, + { + "Id": 14, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": 1, + "Z": 0 + }, + "D": 7.65 + }, + "Vertices": [ + { + "X": 7.4113, + "Y": -7.65, + "Z": 6 + }, + { + "X": 7.4113, + "Y": -7.65, + "Z": 7.3 + }, + { + "X": 9, + "Y": -7.65, + "Z": 7.3 + }, + { + "X": 9, + "Y": -7.65, + "Z": 4.3 + } + ] + }, + { + "Id": 15, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": 1, + "Z": 0 + }, + "D": 7.65 + }, + "Vertices": [ + { + "X": 5.6728, + "Y": -7.65, + "Z": 7.3 + }, + { + "X": 7.4113, + "Y": -7.65, + "Z": 7.3 + }, + { + "X": 7.4113, + "Y": -7.65, + "Z": 6 + }, + { + "X": 5.6728, + "Y": -7.65, + "Z": 6 + } + ] + }, + { + "Id": 16, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": 1, + "Z": 0 + }, + "D": 7.65 + }, + "Vertices": [ + { + "X": 5.6728, + "Y": -7.65, + "Z": 7.3 + }, + { + "X": 5.6728, + "Y": -7.65, + "Z": 8.52 + }, + { + "X": 7.4113, + "Y": -7.65, + "Z": 8.52 + }, + { + "X": 7.4113, + "Y": -7.65, + "Z": 7.3 + } + ] + }, + { + "Id": 17, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": 1, + "Z": 0 + }, + "D": 7.65 + }, + "Vertices": [ + { + "X": 5.6728, + "Y": -7.65, + "Z": 8.52 + }, + { + "X": 5.6728, + "Y": -7.65, + "Z": 7.3 + }, + { + "X": 4.1, + "Y": -7.65, + "Z": 7.3 + }, + { + "X": 4.1, + "Y": -7.65, + "Z": 9.2 + } + ] + }, + { + "Id": 18, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": 1, + "Z": 0 + }, + "D": 7.65 + }, + "Vertices": [ + { + "X": 4.1, + "Y": -7.65, + "Z": 4.3 + }, + { + "X": 4.1, + "Y": -7.65, + "Z": 7.3 + }, + { + "X": 5.6728, + "Y": -7.65, + "Z": 7.3 + }, + { + "X": 5.6728, + "Y": -7.65, + "Z": 6 + } + ] + }, + { + "Id": 19, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 1, + "Y": 0, + "Z": 0 + }, + "D": -4.1 + }, + "Vertices": [ + { + "X": 4.1, + "Y": 1.15, + "Z": 4.3 + }, + { + "X": 4.1, + "Y": 1.15, + "Z": 7.3 + }, + { + "X": 4.1, + "Y": -7.65, + "Z": 7.3 + }, + { + "X": 4.1, + "Y": -7.65, + "Z": 4.3 + } + ] + }, + { + "Id": 20, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 1, + "Y": 0, + "Z": 0 + }, + "D": -4.1 + }, + "Vertices": [ + { + "X": 4.1, + "Y": -7.65, + "Z": 9.2 + }, + { + "X": 4.1, + "Y": -7.65, + "Z": 7.3 + }, + { + "X": 4.1, + "Y": 1.15, + "Z": 7.3 + }, + { + "X": 4.1, + "Y": 1.15, + "Z": 9.2 + } + ] + }, + { + "Id": 21, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": -1, + "Z": 0 + }, + "D": 1.15 + }, + "Vertices": [ + { + "X": 4.1, + "Y": 1.15, + "Z": 7.3 + }, + { + "X": 5.6728, + "Y": 1.15, + "Z": 7.3 + }, + { + "X": 5.6728, + "Y": 1.15, + "Z": 8.52 + }, + { + "X": 4.1, + "Y": 1.15, + "Z": 9.2 + } + ] + }, + { + "Id": 22, + "NumPoints": 3, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": -1, + "Z": 0 + }, + "D": 1.15 + }, + "Vertices": [ + { + "X": 5.6728, + "Y": 1.15, + "Z": 8.52 + }, + { + "X": 9, + "Y": 1.15, + "Z": 9.2 + }, + { + "X": 4.1, + "Y": 1.15, + "Z": 9.2 + } + ] + }, + { + "Id": 23, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": 0, + "Z": -1 + }, + "D": 9.2 + }, + "Vertices": [ + { + "X": 9, + "Y": -7.65, + "Z": 9.2 + }, + { + "X": 4.1, + "Y": -7.65, + "Z": 9.2 + }, + { + "X": 4.1, + "Y": 1.15, + "Z": 9.2 + }, + { + "X": 9, + "Y": 1.15, + "Z": 9.2 + } + ] + }, + { + "Id": 24, + "NumPoints": 3, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": 1, + "Z": 0 + }, + "D": 7.65 + }, + "Vertices": [ + { + "X": 7.4113, + "Y": -7.65, + "Z": 8.52 + }, + { + "X": 4.1, + "Y": -7.65, + "Z": 9.2 + }, + { + "X": 9, + "Y": -7.65, + "Z": 9.2 + } + ] + }, + { + "Id": 25, + "NumPoints": 3, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": 1, + "Z": 0 + }, + "D": 7.65 + }, + "Vertices": [ + { + "X": 7.4113, + "Y": -7.65, + "Z": 8.52 + }, + { + "X": 5.6728, + "Y": -7.65, + "Z": 8.52 + }, + { + "X": 4.1, + "Y": -7.65, + "Z": 9.2 + } + ] + }, + { + "Id": 26, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": -1, + "Y": 0, + "Z": 0 + }, + "D": 9 + }, + "Vertices": [ + { + "X": 9, + "Y": 1.15, + "Z": 9.2 + }, + { + "X": 9, + "Y": -1.336, + "Z": 9 + }, + { + "X": 9, + "Y": -4.57, + "Z": 9 + }, + { + "X": 9, + "Y": -7.65, + "Z": 9.2 + } + ] + }, + { + "Id": 27, + "NumPoints": 3, + "SidesType": 0, + "Plane": { + "Normal": { + "X": -1, + "Y": 0, + "Z": 0 + }, + "D": 9 + }, + "Vertices": [ + { + "X": 9, + "Y": 1.15, + "Z": 9.2 + }, + { + "X": 9, + "Y": -1.336, + "Z": 7.3 + }, + { + "X": 9, + "Y": -1.336, + "Z": 9 + } + ] + }, + { + "Id": 28, + "NumPoints": 3, + "SidesType": 0, + "Plane": { + "Normal": { + "X": -1, + "Y": 0, + "Z": 0 + }, + "D": 9 + }, + "Vertices": [ + { + "X": 9, + "Y": 1.15, + "Z": 9.2 + }, + { + "X": 9, + "Y": 1.15, + "Z": 7.3 + }, + { + "X": 9, + "Y": -1.336, + "Z": 7.3 + } + ] + }, + { + "Id": 29, + "NumPoints": 3, + "SidesType": 0, + "Plane": { + "Normal": { + "X": -1, + "Y": 0, + "Z": 0 + }, + "D": 9 + }, + "Vertices": [ + { + "X": 9, + "Y": -4.57, + "Z": 9 + }, + { + "X": 9, + "Y": -4.57, + "Z": 7.3 + }, + { + "X": 9, + "Y": -7.65, + "Z": 9.2 + } + ] + }, + { + "Id": 30, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 1, + "Y": 0, + "Z": 0 + }, + "D": -4.1 + }, + "Vertices": [ + { + "X": 4.1, + "Y": 1.15, + "Z": 4.3 + }, + { + "X": 4.1, + "Y": -7.65, + "Z": 4.3 + }, + { + "X": 4.1, + "Y": -7.65, + "Z": 2.85 + }, + { + "X": 4.1, + "Y": 1.15, + "Z": 2.85 + } + ] + }, + { + "Id": 31, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": 1, + "Z": 0 + }, + "D": 7.65 + }, + "Vertices": [ + { + "X": 4.1, + "Y": -7.65, + "Z": 4.3 + }, + { + "X": 9, + "Y": -7.65, + "Z": 4.3 + }, + { + "X": 9, + "Y": -7.65, + "Z": 2.85 + }, + { + "X": 4.1, + "Y": -7.65, + "Z": 2.85 + } + ] + }, + { + "Id": 32, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": 1, + "Z": 0 + }, + "D": 7.65 + }, + "Vertices": [ + { + "X": 4.1, + "Y": -7.65, + "Z": 4.3 + }, + { + "X": 5.6728, + "Y": -7.65, + "Z": 6 + }, + { + "X": 7.4113, + "Y": -7.65, + "Z": 6 + }, + { + "X": 9, + "Y": -7.65, + "Z": 4.3 + } + ] + }, + { + "Id": 33, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": 1, + "Z": 0 + }, + "D": 7.65 + }, + "Vertices": [ + { + "X": 7.8, + "Y": -7.65, + "Z": -1.19209E-08 + }, + { + "X": 7.8, + "Y": -7.65, + "Z": 2.85 + }, + { + "X": 9, + "Y": -7.65, + "Z": 2.85 + }, + { + "X": 9, + "Y": -7.65, + "Z": -1.19209E-08 + } + ] + }, + { + "Id": 34, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": 1, + "Z": 0 + }, + "D": 7.65 + }, + "Vertices": [ + { + "X": 7.8, + "Y": -7.65, + "Z": -1.19209E-08 + }, + { + "X": 7.45189, + "Y": -7.65, + "Z": -1.19209E-08 + }, + { + "X": 7.45189, + "Y": -7.65, + "Z": 2.5 + }, + { + "X": 7.8, + "Y": -7.65, + "Z": 2.85 + } + ] + }, + { + "Id": 35, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": 0, + "Z": 1 + }, + "D": 1.19209E-08 + }, + "Vertices": [ + { + "X": 4.1, + "Y": -7.65, + "Z": -1.19209E-08 + }, + { + "X": 9, + "Y": -7.65, + "Z": -1.19209E-08 + }, + { + "X": 7, + "Y": -2.85, + "Z": -1.19209E-08 + }, + { + "X": 4.1, + "Y": 1.15, + "Z": -1.19209E-08 + } + ] + }, + { + "Id": 36, + "NumPoints": 3, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": 1, + "Z": 0 + }, + "D": 7.65 + }, + "Vertices": [ + { + "X": 7.45189, + "Y": -7.65, + "Z": 2.5 + }, + { + "X": 5.2, + "Y": -7.65, + "Z": 2.85 + }, + { + "X": 7.8, + "Y": -7.65, + "Z": 2.85 + } + ] + }, + { + "Id": 37, + "NumPoints": 3, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": 1, + "Z": 0 + }, + "D": 7.65 + }, + "Vertices": [ + { + "X": 7.45189, + "Y": -7.65, + "Z": 2.5 + }, + { + "X": 5.54731, + "Y": -7.65, + "Z": 2.5 + }, + { + "X": 5.2, + "Y": -7.65, + "Z": 2.85 + } + ] + }, + { + "Id": 38, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": 1, + "Z": 0 + }, + "D": 7.65 + }, + "Vertices": [ + { + "X": 5.54731, + "Y": -7.65, + "Z": 2.5 + }, + { + "X": 5.54731, + "Y": -7.65, + "Z": -1.19209E-08 + }, + { + "X": 5.2, + "Y": -7.65, + "Z": -1.19209E-08 + }, + { + "X": 5.2, + "Y": -7.65, + "Z": 2.85 + } + ] + }, + { + "Id": 39, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": 1, + "Z": 0 + }, + "D": 7.65 + }, + "Vertices": [ + { + "X": 4.1, + "Y": -7.65, + "Z": -1.19209E-08 + }, + { + "X": 4.1, + "Y": -7.65, + "Z": 2.85 + }, + { + "X": 5.2, + "Y": -7.65, + "Z": 2.85 + }, + { + "X": 5.2, + "Y": -7.65, + "Z": -1.19209E-08 + } + ] + }, + { + "Id": 40, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 1, + "Y": 0, + "Z": 0 + }, + "D": -4.1 + }, + "Vertices": [ + { + "X": 4.1, + "Y": -2.2, + "Z": -1.19209E-08 + }, + { + "X": 4.1, + "Y": -2.2, + "Z": 2.85 + }, + { + "X": 4.1, + "Y": -7.65, + "Z": 2.85 + }, + { + "X": 4.1, + "Y": -7.65, + "Z": -1.19209E-08 + } + ] + }, + { + "Id": 41, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 1, + "Y": 0, + "Z": 0 + }, + "D": -4.1 + }, + "Vertices": [ + { + "X": 4.1, + "Y": -2.2, + "Z": -1.19209E-08 + }, + { + "X": 4.1, + "Y": -1.85189, + "Z": -1.19209E-08 + }, + { + "X": 4.1, + "Y": -1.85189, + "Z": 2.5 + }, + { + "X": 4.1, + "Y": -2.2, + "Z": 2.85 + } + ] + }, + { + "Id": 42, + "NumPoints": 3, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 1, + "Y": 0, + "Z": 0 + }, + "D": -4.1 + }, + "Vertices": [ + { + "X": 4.1, + "Y": -1.85189, + "Z": 2.5 + }, + { + "X": 4.1, + "Y": 0.4, + "Z": 2.85 + }, + { + "X": 4.1, + "Y": -2.2, + "Z": 2.85 + } + ] + }, + { + "Id": 43, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 1, + "Y": 0, + "Z": 0 + }, + "D": -4.1 + }, + "Vertices": [ + { + "X": 4.1, + "Y": 0.052686, + "Z": 2.5 + }, + { + "X": 4.1, + "Y": 0.0526863, + "Z": -1.19209E-08 + }, + { + "X": 4.1, + "Y": 0.4, + "Z": -1.19209E-08 + }, + { + "X": 4.1, + "Y": 0.4, + "Z": 2.85 + } + ] + }, + { + "Id": 44, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 1, + "Y": 0, + "Z": 0 + }, + "D": -4.1 + }, + "Vertices": [ + { + "X": 4.1, + "Y": 0.4, + "Z": -1.19209E-08 + }, + { + "X": 4.1, + "Y": 1.15, + "Z": -1.19209E-08 + }, + { + "X": 4.1, + "Y": 1.15, + "Z": 2.85 + }, + { + "X": 4.1, + "Y": 0.4, + "Z": 2.85 + } + ] + }, + { + "Id": 45, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": -1, + "Z": 0 + }, + "D": 1.15 + }, + "Vertices": [ + { + "X": 4.1, + "Y": 1.15, + "Z": -1.19209E-08 + }, + { + "X": 5.35, + "Y": 1.15, + "Z": -1.19209E-08 + }, + { + "X": 5.35, + "Y": 1.15, + "Z": 4.3 + }, + { + "X": 4.1, + "Y": 1.15, + "Z": 4.3 + } + ] + }, + { + "Id": 46, + "NumPoints": 3, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": 0, + "Z": 1 + }, + "D": 1.19209E-08 + }, + "Vertices": [ + { + "X": 7, + "Y": -2.85, + "Z": -1.19209E-08 + }, + { + "X": 7, + "Y": 1.15, + "Z": -1.19209E-08 + }, + { + "X": 4.1, + "Y": 1.15, + "Z": -1.19209E-08 + } + ] + }, + { + "Id": 47, + "NumPoints": 3, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 1, + "Y": 0, + "Z": 0 + }, + "D": -4.1 + }, + "Vertices": [ + { + "X": 4.1, + "Y": -1.85189, + "Z": 2.5 + }, + { + "X": 4.1, + "Y": 0.052686, + "Z": 2.5 + }, + { + "X": 4.1, + "Y": 0.4, + "Z": 2.85 + } + ] + }, + { + "Id": 48, + "NumPoints": 3, + "SidesType": 0, + "Plane": { + "Normal": { + "X": -5.96045E-09, + "Y": -2.4835207E-09, + "Z": 1 + }, + "D": 4.6566015E-08 + }, + "Vertices": [ + { + "X": 9, + "Y": -7.65, + "Z": -1.19209E-08 + }, + { + "X": 9, + "Y": -2.85, + "Z": 1.11022E-16 + }, + { + "X": 7, + "Y": -2.85, + "Z": -1.19209E-08 + } + ] + }, + { + "Id": 49, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": -1, + "Z": 0 + }, + "D": 1.15 + }, + "Vertices": [ + { + "X": 7.7, + "Y": 1.15, + "Z": 4.3 + }, + { + "X": 7.7, + "Y": 1.15, + "Z": -1.19209E-08 + }, + { + "X": 9, + "Y": 1.15, + "Z": 0 + }, + { + "X": 9, + "Y": 1.15, + "Z": 4.3 + } + ] + }, + { + "Id": 50, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": -1, + "Z": 0 + }, + "D": 1.15 + }, + "Vertices": [ + { + "X": 7.7, + "Y": 1.15, + "Z": -1.19209E-08 + }, + { + "X": 7.7, + "Y": 1.15, + "Z": 1.35 + }, + { + "X": 5.35, + "Y": 1.15, + "Z": 1.35 + }, + { + "X": 5.35, + "Y": 1.15, + "Z": -1.19209E-08 + } + ] + }, + { + "Id": 51, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": -1, + "Z": 0 + }, + "D": 1.15 + }, + "Vertices": [ + { + "X": 7.7, + "Y": 1.15, + "Z": 3.9 + }, + { + "X": 5.35, + "Y": 1.15, + "Z": 3.9 + }, + { + "X": 5.35, + "Y": 1.15, + "Z": 1.35 + }, + { + "X": 7.7, + "Y": 1.15, + "Z": 1.35 + } + ] + }, + { + "Id": 52, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": -1, + "Z": 0 + }, + "D": 1.15 + }, + "Vertices": [ + { + "X": 5.35, + "Y": 1.15, + "Z": 4.3 + }, + { + "X": 5.35, + "Y": 1.15, + "Z": 3.9 + }, + { + "X": 7.7, + "Y": 1.15, + "Z": 3.9 + }, + { + "X": 7.7, + "Y": 1.15, + "Z": 4.3 + } + ] + }, + { + "Id": 53, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": -1, + "Z": 0 + }, + "D": 1.15 + }, + "Vertices": [ + { + "X": 9, + "Y": 1.15, + "Z": 4.3 + }, + { + "X": 7.4113, + "Y": 1.15, + "Z": 6 + }, + { + "X": 5.6728, + "Y": 1.15, + "Z": 6 + }, + { + "X": 4.1, + "Y": 1.15, + "Z": 4.3 + } + ] + } + ], + "PortalPolygons": [ + { + "Id": 0, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": -1, + "Z": 0 + }, + "D": 1.15 + }, + "Vertices": [ + { + "X": 5.6728, + "Y": 1.15, + "Z": 6 + }, + { + "X": 5.6728, + "Y": 1.15, + "Z": 7.3 + }, + { + "X": 4.1, + "Y": 1.15, + "Z": 7.3 + }, + { + "X": 4.1, + "Y": 1.15, + "Z": 4.3 + } + ] + }, + { + "Id": 1, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": 1, + "Z": 0 + }, + "D": 7.65 + }, + "Vertices": [ + { + "X": 4.1, + "Y": -7.65, + "Z": 4.3 + }, + { + "X": 4.1, + "Y": -7.65, + "Z": 7.3 + }, + { + "X": 5.6728, + "Y": -7.65, + "Z": 7.3 + }, + { + "X": 5.6728, + "Y": -7.65, + "Z": 6 + } + ] + }, + { + "Id": 2, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": 1, + "Z": 0 + }, + "D": 7.65 + }, + "Vertices": [ + { + "X": 4.1, + "Y": -7.65, + "Z": 4.3 + }, + { + "X": 5.6728, + "Y": -7.65, + "Z": 6 + }, + { + "X": 7.4113, + "Y": -7.65, + "Z": 6 + }, + { + "X": 9, + "Y": -7.65, + "Z": 4.3 + } + ] + }, + { + "Id": 3, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": 0, + "Z": -1 + }, + "D": 9.2 + }, + "Vertices": [ + { + "X": 9, + "Y": -7.65, + "Z": 9.2 + }, + { + "X": 4.1, + "Y": -7.65, + "Z": 9.2 + }, + { + "X": 4.1, + "Y": 1.15, + "Z": 9.2 + }, + { + "X": 9, + "Y": 1.15, + "Z": 9.2 + } + ] + }, + { + "Id": 4, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": 1, + "Z": 0 + }, + "D": 7.65 + }, + "Vertices": [ + { + "X": 7.4113, + "Y": -7.65, + "Z": 6 + }, + { + "X": 7.4113, + "Y": -7.65, + "Z": 7.3 + }, + { + "X": 9, + "Y": -7.65, + "Z": 7.3 + }, + { + "X": 9, + "Y": -7.65, + "Z": 4.3 + } + ] + }, + { + "Id": 5, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": 1, + "Z": 0 + }, + "D": 7.65 + }, + "Vertices": [ + { + "X": 4.1, + "Y": -7.65, + "Z": -1.19209E-08 + }, + { + "X": 4.1, + "Y": -7.65, + "Z": 2.85 + }, + { + "X": 5.2, + "Y": -7.65, + "Z": 2.85 + }, + { + "X": 5.2, + "Y": -7.65, + "Z": -1.19209E-08 + } + ] + }, + { + "Id": 6, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": -1, + "Z": 0 + }, + "D": 1.15 + }, + "Vertices": [ + { + "X": 4.1, + "Y": 1.15, + "Z": -1.19209E-08 + }, + { + "X": 5.35, + "Y": 1.15, + "Z": -1.19209E-08 + }, + { + "X": 5.35, + "Y": 1.15, + "Z": 4.3 + }, + { + "X": 4.1, + "Y": 1.15, + "Z": 4.3 + } + ] + }, + { + "Id": 7, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": -1, + "Z": 0 + }, + "D": 1.15 + }, + "Vertices": [ + { + "X": 7.7, + "Y": 1.15, + "Z": 4.3 + }, + { + "X": 7.7, + "Y": 1.15, + "Z": -1.19209E-08 + }, + { + "X": 9, + "Y": 1.15, + "Z": 0 + }, + { + "X": 9, + "Y": 1.15, + "Z": 4.3 + } + ] + }, + { + "Id": 8, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": -1, + "Z": 0 + }, + "D": 1.15 + }, + "Vertices": [ + { + "X": 7.7, + "Y": 1.15, + "Z": -1.19209E-08 + }, + { + "X": 7.7, + "Y": 1.15, + "Z": 1.35 + }, + { + "X": 5.35, + "Y": 1.15, + "Z": 1.35 + }, + { + "X": 5.35, + "Y": 1.15, + "Z": -1.19209E-08 + } + ] + }, + { + "Id": 9, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": -1, + "Z": 0 + }, + "D": 1.15 + }, + "Vertices": [ + { + "X": 7.7, + "Y": 1.15, + "Z": 3.9 + }, + { + "X": 5.35, + "Y": 1.15, + "Z": 3.9 + }, + { + "X": 5.35, + "Y": 1.15, + "Z": 1.35 + }, + { + "X": 7.7, + "Y": 1.15, + "Z": 1.35 + } + ] + }, + { + "Id": 10, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": -1, + "Z": 0 + }, + "D": 1.15 + }, + "Vertices": [ + { + "X": 5.35, + "Y": 1.15, + "Z": 4.3 + }, + { + "X": 5.35, + "Y": 1.15, + "Z": 3.9 + }, + { + "X": 7.7, + "Y": 1.15, + "Z": 3.9 + }, + { + "X": 7.7, + "Y": 1.15, + "Z": 4.3 + } + ] + }, + { + "Id": 11, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 1, + "Y": 0, + "Z": 0 + }, + "D": -4.1 + }, + "Vertices": [ + { + "X": 4.1, + "Y": 1.15, + "Z": 4.3 + }, + { + "X": 4.1, + "Y": 1.15, + "Z": 7.3 + }, + { + "X": 4.1, + "Y": -7.65, + "Z": 7.3 + }, + { + "X": 4.1, + "Y": -7.65, + "Z": 4.3 + } + ] + }, + { + "Id": 12, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 1, + "Y": 0, + "Z": 0 + }, + "D": -4.1 + }, + "Vertices": [ + { + "X": 4.1, + "Y": -7.65, + "Z": 9.2 + }, + { + "X": 4.1, + "Y": -7.65, + "Z": 7.3 + }, + { + "X": 4.1, + "Y": 1.15, + "Z": 7.3 + }, + { + "X": 4.1, + "Y": 1.15, + "Z": 9.2 + } + ] + }, + { + "Id": 13, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": -1, + "Z": 0 + }, + "D": 1.15 + }, + "Vertices": [ + { + "X": 9, + "Y": 1.15, + "Z": 4.3 + }, + { + "X": 9, + "Y": 1.15, + "Z": 7.3 + }, + { + "X": 7.4113, + "Y": 1.15, + "Z": 7.3 + }, + { + "X": 7.4113, + "Y": 1.15, + "Z": 6 + } + ] + }, + { + "Id": 14, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": -1, + "Z": 0 + }, + "D": 1.15 + }, + "Vertices": [ + { + "X": 9, + "Y": 1.15, + "Z": 4.3 + }, + { + "X": 7.4113, + "Y": 1.15, + "Z": 6 + }, + { + "X": 5.6728, + "Y": 1.15, + "Z": 6 + }, + { + "X": 4.1, + "Y": 1.15, + "Z": 4.3 + } + ] + }, + { + "Id": 15, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": -1, + "Y": 0, + "Z": 0 + }, + "D": 9 + }, + "Vertices": [ + { + "X": 9, + "Y": -1.336, + "Z": 6 + }, + { + "X": 9, + "Y": -4.57, + "Z": 6 + }, + { + "X": 9, + "Y": -4.57, + "Z": 9 + }, + { + "X": 9, + "Y": -1.336, + "Z": 9 + } + ] + }, + { + "Id": 16, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": -1, + "Z": 0 + }, + "D": 1.15 + }, + "Vertices": [ + { + "X": 7.4113, + "Y": 1.15, + "Z": 7.3 + }, + { + "X": 5.6728, + "Y": 1.15, + "Z": 7.3 + }, + { + "X": 5.6728, + "Y": 1.15, + "Z": 6 + }, + { + "X": 7.4113, + "Y": 1.15, + "Z": 6 + } + ] + }, + { + "Id": 17, + "NumPoints": 3, + "SidesType": 0, + "Plane": { + "Normal": { + "X": -1, + "Y": 0, + "Z": 0 + }, + "D": 9 + }, + "Vertices": [ + { + "X": 9, + "Y": -4.57, + "Z": 9 + }, + { + "X": 9, + "Y": -4.57, + "Z": 7.3 + }, + { + "X": 9, + "Y": -7.65, + "Z": 9.2 + } + ] + }, + { + "Id": 18, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": -1, + "Z": 0 + }, + "D": 1.15 + }, + "Vertices": [ + { + "X": 7.4113, + "Y": 1.15, + "Z": 8.52 + }, + { + "X": 5.6728, + "Y": 1.15, + "Z": 8.52 + }, + { + "X": 5.6728, + "Y": 1.15, + "Z": 7.3 + }, + { + "X": 7.4113, + "Y": 1.15, + "Z": 7.3 + } + ] + }, + { + "Id": 19, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": 1, + "Z": 0 + }, + "D": 7.65 + }, + "Vertices": [ + { + "X": 5.6728, + "Y": -7.65, + "Z": 7.3 + }, + { + "X": 7.4113, + "Y": -7.65, + "Z": 7.3 + }, + { + "X": 7.4113, + "Y": -7.65, + "Z": 6 + }, + { + "X": 5.6728, + "Y": -7.65, + "Z": 6 + } + ] + }, + { + "Id": 20, + "NumPoints": 3, + "SidesType": 0, + "Plane": { + "Normal": { + "X": -1, + "Y": 0, + "Z": 0 + }, + "D": 9 + }, + "Vertices": [ + { + "X": 9, + "Y": -4.57, + "Z": 7.3 + }, + { + "X": 9, + "Y": -7.65, + "Z": 7.3 + }, + { + "X": 9, + "Y": -7.65, + "Z": 9.2 + } + ] + }, + { + "Id": 21, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": 1, + "Z": 0 + }, + "D": 7.65 + }, + "Vertices": [ + { + "X": 5.6728, + "Y": -7.65, + "Z": 7.3 + }, + { + "X": 5.6728, + "Y": -7.65, + "Z": 8.52 + }, + { + "X": 7.4113, + "Y": -7.65, + "Z": 8.52 + }, + { + "X": 7.4113, + "Y": -7.65, + "Z": 7.3 + } + ] + }, + { + "Id": 22, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": 1, + "Z": 0 + }, + "D": 7.65 + }, + "Vertices": [ + { + "X": 4.1, + "Y": -7.65, + "Z": 4.3 + }, + { + "X": 9, + "Y": -7.65, + "Z": 4.3 + }, + { + "X": 9, + "Y": -7.65, + "Z": 2.85 + }, + { + "X": 4.1, + "Y": -7.65, + "Z": 2.85 + } + ] + }, + { + "Id": 23, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": 1, + "Z": 0 + }, + "D": 7.65 + }, + "Vertices": [ + { + "X": 7.8, + "Y": -7.65, + "Z": -1.19209E-08 + }, + { + "X": 7.8, + "Y": -7.65, + "Z": 2.85 + }, + { + "X": 9, + "Y": -7.65, + "Z": 2.85 + }, + { + "X": 9, + "Y": -7.65, + "Z": -1.19209E-08 + } + ] + }, + { + "Id": 24, + "NumPoints": 3, + "SidesType": 0, + "Plane": { + "Normal": { + "X": -1, + "Y": 0, + "Z": 0 + }, + "D": 9 + }, + "Vertices": [ + { + "X": 9, + "Y": 1.15, + "Z": 9.2 + }, + { + "X": 9, + "Y": -1.336, + "Z": 7.3 + }, + { + "X": 9, + "Y": -1.336, + "Z": 9 + } + ] + }, + { + "Id": 25, + "NumPoints": 3, + "SidesType": 0, + "Plane": { + "Normal": { + "X": -1, + "Y": 0, + "Z": 0 + }, + "D": 9 + }, + "Vertices": [ + { + "X": 9, + "Y": 1.15, + "Z": 9.2 + }, + { + "X": 9, + "Y": 1.15, + "Z": 7.3 + }, + { + "X": 9, + "Y": -1.336, + "Z": 7.3 + } + ] + }, + { + "Id": 26, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 1, + "Y": 0, + "Z": 0 + }, + "D": -4.1 + }, + "Vertices": [ + { + "X": 4.1, + "Y": 1.15, + "Z": 4.3 + }, + { + "X": 4.1, + "Y": -7.65, + "Z": 4.3 + }, + { + "X": 4.1, + "Y": -7.65, + "Z": 2.85 + }, + { + "X": 4.1, + "Y": 1.15, + "Z": 2.85 + } + ] + }, + { + "Id": 27, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 1, + "Y": 0, + "Z": 0 + }, + "D": -4.1 + }, + "Vertices": [ + { + "X": 4.1, + "Y": -2.2, + "Z": -1.19209E-08 + }, + { + "X": 4.1, + "Y": -2.2, + "Z": 2.85 + }, + { + "X": 4.1, + "Y": -7.65, + "Z": 2.85 + }, + { + "X": 4.1, + "Y": -7.65, + "Z": -1.19209E-08 + } + ] + }, + { + "Id": 28, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 1, + "Y": 0, + "Z": 0 + }, + "D": -4.1 + }, + "Vertices": [ + { + "X": 4.1, + "Y": 0.4, + "Z": -1.19209E-08 + }, + { + "X": 4.1, + "Y": 1.15, + "Z": -1.19209E-08 + }, + { + "X": 4.1, + "Y": 1.15, + "Z": 2.85 + }, + { + "X": 4.1, + "Y": 0.4, + "Z": 2.85 + } + ] + }, + { + "Id": 29, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": -1, + "Y": 0, + "Z": 0 + }, + "D": 9 + }, + "Vertices": [ + { + "X": 9, + "Y": 1.15, + "Z": 9.2 + }, + { + "X": 9, + "Y": -1.336, + "Z": 9 + }, + { + "X": 9, + "Y": -4.57, + "Z": 9 + }, + { + "X": 9, + "Y": -7.65, + "Z": 9.2 + } + ] + }, + { + "Id": 30, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": 0, + "Z": 1 + }, + "D": 1.19209E-08 + }, + "Vertices": [ + { + "X": 4.1, + "Y": -7.65, + "Z": -1.19209E-08 + }, + { + "X": 9, + "Y": -7.65, + "Z": -1.19209E-08 + }, + { + "X": 7, + "Y": -2.85, + "Z": -1.19209E-08 + }, + { + "X": 4.1, + "Y": 1.15, + "Z": -1.19209E-08 + } + ] + }, + { + "Id": 31, + "NumPoints": 3, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": 0, + "Z": 1 + }, + "D": 1.19209E-08 + }, + "Vertices": [ + { + "X": 7, + "Y": -2.85, + "Z": -1.19209E-08 + }, + { + "X": 7, + "Y": 1.15, + "Z": -1.19209E-08 + }, + { + "X": 4.1, + "Y": 1.15, + "Z": -1.19209E-08 + } + ] + }, + { + "Id": 32, + "NumPoints": 3, + "SidesType": 0, + "Plane": { + "Normal": { + "X": -5.96045E-09, + "Y": -2.4835207E-09, + "Z": 1 + }, + "D": 4.6566015E-08 + }, + "Vertices": [ + { + "X": 9, + "Y": -7.65, + "Z": -1.19209E-08 + }, + { + "X": 9, + "Y": -2.85, + "Z": 1.11022E-16 + }, + { + "X": 7, + "Y": -2.85, + "Z": -1.19209E-08 + } + ] + }, + { + "Id": 33, + "NumPoints": 3, + "SidesType": 0, + "Plane": { + "Normal": { + "X": -1, + "Y": 0, + "Z": 0 + }, + "D": 9 + }, + "Vertices": [ + { + "X": 9, + "Y": -7.65, + "Z": 7.3 + }, + { + "X": 9, + "Y": -4.57, + "Z": 7.3 + }, + { + "X": 9, + "Y": -4.57, + "Z": 6 + } + ] + }, + { + "Id": 34, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": -1, + "Y": 0, + "Z": 0 + }, + "D": 9 + }, + "Vertices": [ + { + "X": 9, + "Y": -7.65, + "Z": 7.3 + }, + { + "X": 9, + "Y": -4.57, + "Z": 6 + }, + { + "X": 9, + "Y": 1.15, + "Z": 0 + }, + { + "X": 9, + "Y": -7.65, + "Z": -1.19209E-08 + } + ] + }, + { + "Id": 35, + "NumPoints": 3, + "SidesType": 0, + "Plane": { + "Normal": { + "X": -1, + "Y": 0, + "Z": 0 + }, + "D": 9 + }, + "Vertices": [ + { + "X": 9, + "Y": -4.57, + "Z": 6 + }, + { + "X": 9, + "Y": -1.336, + "Z": 6 + }, + { + "X": 9, + "Y": 1.15, + "Z": 0 + } + ] + }, + { + "Id": 36, + "NumPoints": 3, + "SidesType": 0, + "Plane": { + "Normal": { + "X": -1, + "Y": 0, + "Z": 0 + }, + "D": 9 + }, + "Vertices": [ + { + "X": 9, + "Y": -1.336, + "Z": 6 + }, + { + "X": 9, + "Y": 1.15, + "Z": 7.3 + }, + { + "X": 9, + "Y": 1.15, + "Z": 0 + } + ] + }, + { + "Id": 37, + "NumPoints": 3, + "SidesType": 0, + "Plane": { + "Normal": { + "X": -1, + "Y": 0, + "Z": 0 + }, + "D": 9 + }, + "Vertices": [ + { + "X": 9, + "Y": -1.336, + "Z": 6 + }, + { + "X": 9, + "Y": -1.336, + "Z": 7.3 + }, + { + "X": 9, + "Y": 1.15, + "Z": 7.3 + } + ] + }, + { + "Id": 38, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": -1, + "Z": 0 + }, + "D": 1.15 + }, + "Vertices": [ + { + "X": 4.1, + "Y": 1.15, + "Z": 7.3 + }, + { + "X": 5.6728, + "Y": 1.15, + "Z": 7.3 + }, + { + "X": 5.6728, + "Y": 1.15, + "Z": 8.52 + }, + { + "X": 4.1, + "Y": 1.15, + "Z": 9.2 + } + ] + }, + { + "Id": 39, + "NumPoints": 3, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": -1, + "Z": 0 + }, + "D": 1.15 + }, + "Vertices": [ + { + "X": 5.6728, + "Y": 1.15, + "Z": 8.52 + }, + { + "X": 7.4113, + "Y": 1.15, + "Z": 8.52 + }, + { + "X": 9, + "Y": 1.15, + "Z": 9.2 + } + ] + }, + { + "Id": 40, + "NumPoints": 3, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": -1, + "Z": 0 + }, + "D": 1.15 + }, + "Vertices": [ + { + "X": 5.6728, + "Y": 1.15, + "Z": 8.52 + }, + { + "X": 9, + "Y": 1.15, + "Z": 9.2 + }, + { + "X": 4.1, + "Y": 1.15, + "Z": 9.2 + } + ] + }, + { + "Id": 41, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": -1, + "Z": 0 + }, + "D": 1.15 + }, + "Vertices": [ + { + "X": 7.4113, + "Y": 1.15, + "Z": 8.52 + }, + { + "X": 7.4113, + "Y": 1.15, + "Z": 7.3 + }, + { + "X": 9, + "Y": 1.15, + "Z": 7.3 + }, + { + "X": 9, + "Y": 1.15, + "Z": 9.2 + } + ] + }, + { + "Id": 42, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": 1, + "Z": 0 + }, + "D": 7.65 + }, + "Vertices": [ + { + "X": 9, + "Y": -7.65, + "Z": 7.3 + }, + { + "X": 7.4113, + "Y": -7.65, + "Z": 7.3 + }, + { + "X": 7.4113, + "Y": -7.65, + "Z": 8.52 + }, + { + "X": 9, + "Y": -7.65, + "Z": 9.2 + } + ] + }, + { + "Id": 43, + "NumPoints": 3, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": 1, + "Z": 0 + }, + "D": 7.65 + }, + "Vertices": [ + { + "X": 7.4113, + "Y": -7.65, + "Z": 8.52 + }, + { + "X": 5.6728, + "Y": -7.65, + "Z": 8.52 + }, + { + "X": 4.1, + "Y": -7.65, + "Z": 9.2 + } + ] + }, + { + "Id": 44, + "NumPoints": 3, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": 1, + "Z": 0 + }, + "D": 7.65 + }, + "Vertices": [ + { + "X": 7.4113, + "Y": -7.65, + "Z": 8.52 + }, + { + "X": 4.1, + "Y": -7.65, + "Z": 9.2 + }, + { + "X": 9, + "Y": -7.65, + "Z": 9.2 + } + ] + }, + { + "Id": 45, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": 1, + "Z": 0 + }, + "D": 7.65 + }, + "Vertices": [ + { + "X": 5.6728, + "Y": -7.65, + "Z": 8.52 + }, + { + "X": 5.6728, + "Y": -7.65, + "Z": 7.3 + }, + { + "X": 4.1, + "Y": -7.65, + "Z": 7.3 + }, + { + "X": 4.1, + "Y": -7.65, + "Z": 9.2 + } + ] + }, + { + "Id": 46, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": 1, + "Z": 0 + }, + "D": 7.65 + }, + "Vertices": [ + { + "X": 7.8, + "Y": -7.65, + "Z": -1.19209E-08 + }, + { + "X": 7.45189, + "Y": -7.65, + "Z": -1.19209E-08 + }, + { + "X": 7.45189, + "Y": -7.65, + "Z": 2.5 + }, + { + "X": 7.8, + "Y": -7.65, + "Z": 2.85 + } + ] + }, + { + "Id": 47, + "NumPoints": 3, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": 1, + "Z": 0 + }, + "D": 7.65 + }, + "Vertices": [ + { + "X": 7.45189, + "Y": -7.65, + "Z": 2.5 + }, + { + "X": 5.54731, + "Y": -7.65, + "Z": 2.5 + }, + { + "X": 5.2, + "Y": -7.65, + "Z": 2.85 + } + ] + }, + { + "Id": 48, + "NumPoints": 3, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": 1, + "Z": 0 + }, + "D": 7.65 + }, + "Vertices": [ + { + "X": 7.45189, + "Y": -7.65, + "Z": 2.5 + }, + { + "X": 5.2, + "Y": -7.65, + "Z": 2.85 + }, + { + "X": 7.8, + "Y": -7.65, + "Z": 2.85 + } + ] + }, + { + "Id": 49, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": 1, + "Z": 0 + }, + "D": 7.65 + }, + "Vertices": [ + { + "X": 5.54731, + "Y": -7.65, + "Z": 2.5 + }, + { + "X": 5.54731, + "Y": -7.65, + "Z": -1.19209E-08 + }, + { + "X": 5.2, + "Y": -7.65, + "Z": -1.19209E-08 + }, + { + "X": 5.2, + "Y": -7.65, + "Z": 2.85 + } + ] + }, + { + "Id": 50, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 1, + "Y": 0, + "Z": 0 + }, + "D": -4.1 + }, + "Vertices": [ + { + "X": 4.1, + "Y": -2.2, + "Z": -1.19209E-08 + }, + { + "X": 4.1, + "Y": -1.85189, + "Z": -1.19209E-08 + }, + { + "X": 4.1, + "Y": -1.85189, + "Z": 2.5 + }, + { + "X": 4.1, + "Y": -2.2, + "Z": 2.85 + } + ] + }, + { + "Id": 51, + "NumPoints": 3, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 1, + "Y": 0, + "Z": 0 + }, + "D": -4.1 + }, + "Vertices": [ + { + "X": 4.1, + "Y": -1.85189, + "Z": 2.5 + }, + { + "X": 4.1, + "Y": 0.052686, + "Z": 2.5 + }, + { + "X": 4.1, + "Y": 0.4, + "Z": 2.85 + } + ] + }, + { + "Id": 52, + "NumPoints": 3, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 1, + "Y": 0, + "Z": 0 + }, + "D": -4.1 + }, + "Vertices": [ + { + "X": 4.1, + "Y": -1.85189, + "Z": 2.5 + }, + { + "X": 4.1, + "Y": 0.4, + "Z": 2.85 + }, + { + "X": 4.1, + "Y": -2.2, + "Z": 2.85 + } + ] + }, + { + "Id": 53, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 1, + "Y": 0, + "Z": 0 + }, + "D": -4.1 + }, + "Vertices": [ + { + "X": 4.1, + "Y": 0.052686, + "Z": 2.5 + }, + { + "X": 4.1, + "Y": 0.0526863, + "Z": -1.19209E-08 + }, + { + "X": 4.1, + "Y": 0.4, + "Z": -1.19209E-08 + }, + { + "X": 4.1, + "Y": 0.4, + "Z": 2.85 + } + ] + }, + { + "Id": 54, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": -1, + "Z": 0 + }, + "D": -7.65 + }, + "Vertices": [ + { + "X": 7.45189, + "Y": -7.65, + "Z": -1.19209E-08 + }, + { + "X": 7.45189, + "Y": -7.65, + "Z": 2.5 + }, + { + "X": 5.54731, + "Y": -7.65, + "Z": 2.5 + }, + { + "X": 5.54731, + "Y": -7.65, + "Z": -1.19209E-08 + } + ] + }, + { + "Id": 55, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": -1, + "Y": 0, + "Z": 0 + }, + "D": 4.1 + }, + "Vertices": [ + { + "X": 4.1, + "Y": 0.052686, + "Z": 2.5 + }, + { + "X": 4.1, + "Y": 0.0526863, + "Z": -1.19209E-08 + }, + { + "X": 4.1, + "Y": -1.85189, + "Z": -1.19209E-08 + }, + { + "X": 4.1, + "Y": -1.85189, + "Z": 2.5 + } + ] + }, + { + "Id": 56, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 5.96045E-09, + "Y": -1.387775E-17, + "Z": -1 + }, + "D": -5.364405E-08 + }, + "Vertices": [ + { + "X": 9, + "Y": -2.85, + "Z": 1.11022E-16 + }, + { + "X": 7, + "Y": -2.85, + "Z": -1.19209E-08 + }, + { + "X": 7, + "Y": 1.15, + "Z": -1.19209E-08 + }, + { + "X": 9, + "Y": 1.15, + "Z": 0 + } + ] + } + ], + "Portals": [ + { + "OtherCellId": 368, + "PolygonId": 54, + "Flags": 1 + }, + { + "OtherCellId": 371, + "PolygonId": 55, + "Flags": 1 + }, + { + "OtherCellId": 373, + "PolygonId": 56, + "Flags": 1 + } + ], + "VisibleCellIds": [ + 2847146351, + 2847146352, + 2847146354, + 2847146355, + 2847146356, + 2847146357 + ] +} \ No newline at end of file diff --git a/tests/AcDream.Core.Tests/Fixtures/cellar-lip/0xA9B40174.json b/tests/AcDream.Core.Tests/Fixtures/cellar-lip/0xA9B40174.json new file mode 100644 index 00000000..a47a8941 --- /dev/null +++ b/tests/AcDream.Core.Tests/Fixtures/cellar-lip/0xA9B40174.json @@ -0,0 +1,583 @@ +{ + "CellId": 2847146356, + "WorldTransform": { + "M11": -1, + "M12": 8.74228E-08, + "M13": 0, + "M14": 0, + "M21": -8.74228E-08, + "M22": -1, + "M23": 0, + "M24": 0, + "M31": 0, + "M32": 0, + "M33": 1, + "M34": 0, + "M41": 161.929, + "M42": 7.50315, + "M43": 94, + "M44": 1 + }, + "InverseWorldTransform": { + "M11": -1, + "M12": -8.74228E-08, + "M13": 0, + "M14": -0, + "M21": 8.74228E-08, + "M22": -1, + "M23": 0, + "M24": 0, + "M31": 0, + "M32": 0, + "M33": 1, + "M34": -0, + "M41": 161.929, + "M42": 7.5031643, + "M43": -94, + "M44": 1 + }, + "ResolvedPolygons": [ + { + "Id": 0, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": 0, + "Z": 1 + }, + "D": 3.999 + }, + "Vertices": [ + { + "X": 9, + "Y": -2.85, + "Z": -3.999 + }, + { + "X": 9, + "Y": 2.98, + "Z": -3.999 + }, + { + "X": -2.664, + "Y": 2.98, + "Z": -3.999 + }, + { + "X": -2.664, + "Y": -2.85, + "Z": -3.999 + } + ] + }, + { + "Id": 1, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": -1, + "Y": 0, + "Z": 0 + }, + "D": 9 + }, + "Vertices": [ + { + "X": 9, + "Y": -2.85, + "Z": -0.364 + }, + { + "X": 9, + "Y": 2.98, + "Z": -0.364 + }, + { + "X": 9, + "Y": 2.98, + "Z": -3.999 + }, + { + "X": 9, + "Y": -2.85, + "Z": -3.999 + } + ] + }, + { + "Id": 2, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": 0, + "Z": -1 + }, + "D": -0.364 + }, + "Vertices": [ + { + "X": 9, + "Y": 2.98, + "Z": -0.364 + }, + { + "X": 9, + "Y": 1.15, + "Z": -0.364 + }, + { + "X": 7, + "Y": 1.15, + "Z": -0.364 + }, + { + "X": -2.664, + "Y": 2.98, + "Z": -0.364 + } + ] + }, + { + "Id": 3, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": -1, + "Z": 0 + }, + "D": 2.98 + }, + "Vertices": [ + { + "X": 9, + "Y": 2.98, + "Z": -3.999 + }, + { + "X": 9, + "Y": 2.98, + "Z": -0.364 + }, + { + "X": -2.664, + "Y": 2.98, + "Z": -0.364 + }, + { + "X": -2.664, + "Y": 2.98, + "Z": -3.999 + } + ] + }, + { + "Id": 4, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": 0, + "Z": -1 + }, + "D": -0.364 + }, + "Vertices": [ + { + "X": 7, + "Y": 1.15, + "Z": -0.364 + }, + { + "X": 7, + "Y": -2.85, + "Z": -0.364 + }, + { + "X": -2.664, + "Y": -2.85, + "Z": -0.364 + }, + { + "X": -2.664, + "Y": 2.98, + "Z": -0.364 + } + ] + }, + { + "Id": 5, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": 1, + "Z": 0 + }, + "D": 2.85 + }, + "Vertices": [ + { + "X": -2.664, + "Y": -2.85, + "Z": -0.364 + }, + { + "X": 9, + "Y": -2.85, + "Z": -0.364 + }, + { + "X": 9, + "Y": -2.85, + "Z": -3.999 + }, + { + "X": -2.664, + "Y": -2.85, + "Z": -3.999 + } + ] + }, + { + "Id": 6, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 1, + "Y": 0, + "Z": 0 + }, + "D": 2.664 + }, + "Vertices": [ + { + "X": -2.664, + "Y": 2.98, + "Z": -3.999 + }, + { + "X": -2.664, + "Y": 2.98, + "Z": -0.364 + }, + { + "X": -2.664, + "Y": -2.85, + "Z": -0.364 + }, + { + "X": -2.664, + "Y": -2.85, + "Z": -3.999 + } + ] + } + ], + "PortalPolygons": [ + { + "Id": 0, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": 0, + "Z": 1 + }, + "D": 3.999 + }, + "Vertices": [ + { + "X": 9, + "Y": -2.85, + "Z": -3.999 + }, + { + "X": 9, + "Y": 2.98, + "Z": -3.999 + }, + { + "X": -2.664, + "Y": 2.98, + "Z": -3.999 + }, + { + "X": -2.664, + "Y": -2.85, + "Z": -3.999 + } + ] + }, + { + "Id": 1, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": 1, + "Z": 0 + }, + "D": 2.85 + }, + "Vertices": [ + { + "X": -2.664, + "Y": -2.85, + "Z": -0.364 + }, + { + "X": 9, + "Y": -2.85, + "Z": -0.364 + }, + { + "X": 9, + "Y": -2.85, + "Z": -3.999 + }, + { + "X": -2.664, + "Y": -2.85, + "Z": -3.999 + } + ] + }, + { + "Id": 2, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": -1, + "Y": 0, + "Z": 0 + }, + "D": 9 + }, + "Vertices": [ + { + "X": 9, + "Y": -2.85, + "Z": -0.364 + }, + { + "X": 9, + "Y": 2.98, + "Z": -0.364 + }, + { + "X": 9, + "Y": 2.98, + "Z": -3.999 + }, + { + "X": 9, + "Y": -2.85, + "Z": -3.999 + } + ] + }, + { + "Id": 3, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": -1, + "Z": 0 + }, + "D": 2.98 + }, + "Vertices": [ + { + "X": 9, + "Y": 2.98, + "Z": -3.999 + }, + { + "X": 9, + "Y": 2.98, + "Z": -0.364 + }, + { + "X": -2.664, + "Y": 2.98, + "Z": -0.364 + }, + { + "X": -2.664, + "Y": 2.98, + "Z": -3.999 + } + ] + }, + { + "Id": 4, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 1, + "Y": 0, + "Z": 0 + }, + "D": 2.664 + }, + "Vertices": [ + { + "X": -2.664, + "Y": 2.98, + "Z": -3.999 + }, + { + "X": -2.664, + "Y": 2.98, + "Z": -0.364 + }, + { + "X": -2.664, + "Y": -2.85, + "Z": -0.364 + }, + { + "X": -2.664, + "Y": -2.85, + "Z": -3.999 + } + ] + }, + { + "Id": 5, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": 0, + "Z": -1 + }, + "D": -0.364 + }, + "Vertices": [ + { + "X": 9, + "Y": 2.98, + "Z": -0.364 + }, + { + "X": 9, + "Y": 1.15, + "Z": -0.364 + }, + { + "X": 7, + "Y": 1.15, + "Z": -0.364 + }, + { + "X": -2.664, + "Y": 2.98, + "Z": -0.364 + } + ] + }, + { + "Id": 6, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": 0, + "Z": -1 + }, + "D": -0.364 + }, + "Vertices": [ + { + "X": 7, + "Y": 1.15, + "Z": -0.364 + }, + { + "X": 7, + "Y": -2.85, + "Z": -0.364 + }, + { + "X": -2.664, + "Y": -2.85, + "Z": -0.364 + }, + { + "X": -2.664, + "Y": 2.98, + "Z": -0.364 + } + ] + }, + { + "Id": 7, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": 0, + "Z": 1 + }, + "D": 0.364 + }, + "Vertices": [ + { + "X": 7, + "Y": 1.15, + "Z": -0.364 + }, + { + "X": 7, + "Y": -2.85, + "Z": -0.364 + }, + { + "X": 9, + "Y": -2.85, + "Z": -0.364 + }, + { + "X": 9, + "Y": 1.15, + "Z": -0.364 + } + ] + } + ], + "Portals": [ + { + "OtherCellId": 373, + "PolygonId": 7, + "Flags": 1 + } + ], + "VisibleCellIds": [ + 2847146351, + 2847146352, + 2847146353, + 2847146354, + 2847146355, + 2847146357 + ] +} \ No newline at end of file diff --git a/tests/AcDream.Core.Tests/Fixtures/cellar-lip/0xA9B40175.json b/tests/AcDream.Core.Tests/Fixtures/cellar-lip/0xA9B40175.json new file mode 100644 index 00000000..49a53370 --- /dev/null +++ b/tests/AcDream.Core.Tests/Fixtures/cellar-lip/0xA9B40175.json @@ -0,0 +1,413 @@ +{ + "CellId": 2847146357, + "WorldTransform": { + "M11": -1, + "M12": 8.74228E-08, + "M13": 0, + "M14": 0, + "M21": -8.74228E-08, + "M22": -1, + "M23": 0, + "M24": 0, + "M31": 0, + "M32": 0, + "M33": 1, + "M34": 0, + "M41": 161.929, + "M42": 7.50315, + "M43": 94, + "M44": 1 + }, + "InverseWorldTransform": { + "M11": -1, + "M12": -8.74228E-08, + "M13": 0, + "M14": -0, + "M21": 8.74228E-08, + "M22": -1, + "M23": 0, + "M24": 0, + "M31": 0, + "M32": 0, + "M33": 1, + "M34": -0, + "M41": 161.929, + "M42": 7.5031643, + "M43": -94, + "M44": 1 + }, + "ResolvedPolygons": [ + { + "Id": 0, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": -1, + "Z": 0 + }, + "D": 1.15 + }, + "Vertices": [ + { + "X": 9, + "Y": 1.15, + "Z": 0 + }, + { + "X": 7, + "Y": 1.15, + "Z": -1.19209E-08 + }, + { + "X": 7, + "Y": 1.15, + "Z": -0.364 + }, + { + "X": 9, + "Y": 1.15, + "Z": -0.364 + } + ] + }, + { + "Id": 1, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": 1, + "Z": 0 + }, + "D": 2.85 + }, + "Vertices": [ + { + "X": 7, + "Y": -2.85, + "Z": -0.364 + }, + { + "X": 7, + "Y": -2.85, + "Z": -1.19209E-08 + }, + { + "X": 9, + "Y": -2.85, + "Z": 1.11022E-16 + }, + { + "X": 9, + "Y": -2.85, + "Z": -0.364 + } + ] + }, + { + "Id": 2, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 1, + "Y": 0, + "Z": 0 + }, + "D": -7 + }, + "Vertices": [ + { + "X": 7, + "Y": 1.15, + "Z": -1.19209E-08 + }, + { + "X": 7, + "Y": -2.85, + "Z": -1.19209E-08 + }, + { + "X": 7, + "Y": -2.85, + "Z": -0.364 + }, + { + "X": 7, + "Y": 1.15, + "Z": -0.364 + } + ] + }, + { + "Id": 3, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": -1, + "Y": 0, + "Z": 0 + }, + "D": 9 + }, + "Vertices": [ + { + "X": 9, + "Y": -2.85, + "Z": 1.11022E-16 + }, + { + "X": 9, + "Y": 1.15, + "Z": 0 + }, + { + "X": 9, + "Y": 1.15, + "Z": -0.364 + }, + { + "X": 9, + "Y": -2.85, + "Z": -0.364 + } + ] + } + ], + "PortalPolygons": [ + { + "Id": 0, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": -1, + "Z": 0 + }, + "D": 1.15 + }, + "Vertices": [ + { + "X": 9, + "Y": 1.15, + "Z": 0 + }, + { + "X": 7, + "Y": 1.15, + "Z": -1.19209E-08 + }, + { + "X": 7, + "Y": 1.15, + "Z": -0.364 + }, + { + "X": 9, + "Y": 1.15, + "Z": -0.364 + } + ] + }, + { + "Id": 1, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 1, + "Y": 0, + "Z": 0 + }, + "D": -7 + }, + "Vertices": [ + { + "X": 7, + "Y": 1.15, + "Z": -1.19209E-08 + }, + { + "X": 7, + "Y": -2.85, + "Z": -1.19209E-08 + }, + { + "X": 7, + "Y": -2.85, + "Z": -0.364 + }, + { + "X": 7, + "Y": 1.15, + "Z": -0.364 + } + ] + }, + { + "Id": 2, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": 1, + "Z": 0 + }, + "D": 2.85 + }, + "Vertices": [ + { + "X": 7, + "Y": -2.85, + "Z": -0.364 + }, + { + "X": 7, + "Y": -2.85, + "Z": -1.19209E-08 + }, + { + "X": 9, + "Y": -2.85, + "Z": 1.11022E-16 + }, + { + "X": 9, + "Y": -2.85, + "Z": -0.364 + } + ] + }, + { + "Id": 3, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": -1, + "Y": 0, + "Z": 0 + }, + "D": 9 + }, + "Vertices": [ + { + "X": 9, + "Y": -2.85, + "Z": 1.11022E-16 + }, + { + "X": 9, + "Y": 1.15, + "Z": 0 + }, + { + "X": 9, + "Y": 1.15, + "Z": -0.364 + }, + { + "X": 9, + "Y": -2.85, + "Z": -0.364 + } + ] + }, + { + "Id": 4, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 5.96045E-09, + "Y": -1.387775E-17, + "Z": -1 + }, + "D": -5.364405E-08 + }, + "Vertices": [ + { + "X": 9, + "Y": -2.85, + "Z": 1.11022E-16 + }, + { + "X": 7, + "Y": -2.85, + "Z": -1.19209E-08 + }, + { + "X": 7, + "Y": 1.15, + "Z": -1.19209E-08 + }, + { + "X": 9, + "Y": 1.15, + "Z": 0 + } + ] + }, + { + "Id": 5, + "NumPoints": 4, + "SidesType": 0, + "Plane": { + "Normal": { + "X": 0, + "Y": 0, + "Z": 1 + }, + "D": 0.364 + }, + "Vertices": [ + { + "X": 7, + "Y": 1.15, + "Z": -0.364 + }, + { + "X": 7, + "Y": -2.85, + "Z": -0.364 + }, + { + "X": 9, + "Y": -2.85, + "Z": -0.364 + }, + { + "X": 9, + "Y": 1.15, + "Z": -0.364 + } + ] + } + ], + "Portals": [ + { + "OtherCellId": 369, + "PolygonId": 4, + "Flags": 3 + }, + { + "OtherCellId": 372, + "PolygonId": 5, + "Flags": 3 + } + ], + "VisibleCellIds": [ + 2847146351, + 2847146352, + 2847146353, + 2847146354, + 2847146355, + 2847146356 + ] +} \ No newline at end of file diff --git a/tests/AcDream.Core.Tests/Fixtures/cellar-lip/wedge-records.jsonl b/tests/AcDream.Core.Tests/Fixtures/cellar-lip/wedge-records.jsonl new file mode 100644 index 00000000..c5735e20 --- /dev/null +++ b/tests/AcDream.Core.Tests/Fixtures/cellar-lip/wedge-records.jsonl @@ -0,0 +1,29 @@ +{"tick":3135,"timestampMs":262876276,"input":{"currentPos":{"x":153.73085,"y":9.728503,"z":93.43498},"targetPos":{"x":153.74791,"y":10.200278,"z":93.43498},"cellId":2847146357,"sphereRadius":0.48,"sphereHeight":1.2,"stepUpHeight":0.6,"stepDownHeight":1.5,"isOnGround":true,"moverFlags":768,"movingEntityId":1000000},"bodyBefore":{"position":{"x":153.74791,"y":10.200278,"z":93.43498},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.018063338,"w":0.99983686},"velocity":{"x":0.42796403,"y":11.840406,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0},"result":{"position":{"x":153.74791,"y":9.728503,"z":93.43498},"cellId":2847146357,"isOnGround":true,"collisionNormalValid":false,"collisionNormal":{"x":0,"y":0,"z":0}},"bodyAfter":{"position":{"x":153.74791,"y":10.200278,"z":93.43498},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.018063338,"w":0.99983686},"velocity":{"x":0.42796403,"y":11.840406,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":0,"y":0,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":131,"lastUpdateTime":0}} +{"tick":3143,"timestampMs":262876359,"input":{"currentPos":{"x":153.76514,"y":9.728503,"z":93.43498},"targetPos":{"x":153.78326,"y":10.229973,"z":93.43498},"cellId":2847146357,"sphereRadius":0.48,"sphereHeight":1.2,"stepUpHeight":0.6,"stepDownHeight":1.5,"isOnGround":true,"moverFlags":768,"movingEntityId":1000000},"bodyBefore":{"position":{"x":153.78326,"y":10.229973,"z":93.43498},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.018063338,"w":0.99983686},"velocity":{"x":0.42796403,"y":11.840406,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0},"result":{"position":{"x":153.78326,"y":9.728503,"z":93.43498},"cellId":2847146357,"isOnGround":true,"collisionNormalValid":true,"collisionNormal":{"x":-8.74228E-08,"y":-1,"z":0}},"bodyAfter":{"position":{"x":153.78326,"y":10.229973,"z":93.43498},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.018063338,"w":0.99983686},"velocity":{"x":0.42796403,"y":11.840406,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0}} +{"tick":3163,"timestampMs":262876563,"input":{"currentPos":{"x":153.85286,"y":9.728503,"z":93.43498},"targetPos":{"x":153.8703,"y":10.211022,"z":93.43498},"cellId":2847146357,"sphereRadius":0.48,"sphereHeight":1.2,"stepUpHeight":0.6,"stepDownHeight":1.5,"isOnGround":true,"moverFlags":768,"movingEntityId":1000000},"bodyBefore":{"position":{"x":153.8703,"y":10.211022,"z":93.43498},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.018063338,"w":0.99983686},"velocity":{"x":0.42796403,"y":11.840406,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0},"result":{"position":{"x":153.8703,"y":9.728503,"z":93.43498},"cellId":2847146357,"isOnGround":true,"collisionNormalValid":true,"collisionNormal":{"x":-8.74228E-08,"y":-1,"z":0}},"bodyAfter":{"position":{"x":153.8703,"y":10.211022,"z":93.43498},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.018063338,"w":0.99983686},"velocity":{"x":0.42796403,"y":11.840406,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0}} +{"tick":3186,"timestampMs":262876807,"input":{"currentPos":{"x":153.9604,"y":9.728503,"z":93.43498},"targetPos":{"x":153.97502,"y":10.133064,"z":93.43498},"cellId":2847146357,"sphereRadius":0.48,"sphereHeight":1.2,"stepUpHeight":0.6,"stepDownHeight":1.5,"isOnGround":true,"moverFlags":768,"movingEntityId":1000000},"bodyBefore":{"position":{"x":153.97502,"y":10.133064,"z":93.43498},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.018063338,"w":0.99983686},"velocity":{"x":0.42796403,"y":11.840406,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0},"result":{"position":{"x":153.97502,"y":9.728503,"z":93.43498},"cellId":2847146357,"isOnGround":true,"collisionNormalValid":false,"collisionNormal":{"x":0,"y":0,"z":0}},"bodyAfter":{"position":{"x":153.97502,"y":10.133064,"z":93.43498},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.018063338,"w":0.99983686},"velocity":{"x":0.42796403,"y":11.840406,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":0,"y":0,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":131,"lastUpdateTime":0}} +{"tick":3210,"timestampMs":262877045,"input":{"currentPos":{"x":154.0595,"y":9.728503,"z":93.43498},"targetPos":{"x":154.07689,"y":10.209565,"z":93.43498},"cellId":2847146357,"sphereRadius":0.48,"sphereHeight":1.2,"stepUpHeight":0.6,"stepDownHeight":1.5,"isOnGround":true,"moverFlags":768,"movingEntityId":1000000},"bodyBefore":{"position":{"x":154.07689,"y":10.209565,"z":93.43498},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.018063338,"w":0.99983686},"velocity":{"x":0.42796403,"y":11.840406,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0},"result":{"position":{"x":154.07689,"y":9.728503,"z":93.43498},"cellId":2847146357,"isOnGround":true,"collisionNormalValid":true,"collisionNormal":{"x":-8.74228E-08,"y":-1,"z":0}},"bodyAfter":{"position":{"x":154.07689,"y":10.209565,"z":93.43498},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.018063338,"w":0.99983686},"velocity":{"x":0.42796403,"y":11.840406,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0}} +{"tick":3233,"timestampMs":262877276,"input":{"currentPos":{"x":154.15952,"y":9.728503,"z":93.43498},"targetPos":{"x":154.1759,"y":10.181853,"z":93.43498},"cellId":2847146357,"sphereRadius":0.48,"sphereHeight":1.2,"stepUpHeight":0.6,"stepDownHeight":1.5,"isOnGround":true,"moverFlags":768,"movingEntityId":1000000},"bodyBefore":{"position":{"x":154.1759,"y":10.181853,"z":93.43498},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.018063338,"w":0.99983686},"velocity":{"x":0.42796403,"y":11.840406,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":0,"y":0,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":131,"lastUpdateTime":0},"result":{"position":{"x":154.1759,"y":9.728503,"z":93.43498},"cellId":2847146357,"isOnGround":true,"collisionNormalValid":true,"collisionNormal":{"x":-8.74228E-08,"y":-1,"z":0}},"bodyAfter":{"position":{"x":154.1759,"y":10.181853,"z":93.43498},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.018063338,"w":0.99983686},"velocity":{"x":0.42796403,"y":11.840406,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0}} +{"tick":3351,"timestampMs":262878460,"input":{"currentPos":{"x":153.4518,"y":9.728503,"z":93.43498},"targetPos":{"x":153.33388,"y":10.169506,"z":93.43498},"cellId":2847146357,"sphereRadius":0.48,"sphereHeight":1.2,"stepUpHeight":0.6,"stepDownHeight":1.5,"isOnGround":true,"moverFlags":768,"movingEntityId":1000000},"bodyBefore":{"position":{"x":153.33388,"y":10.169506,"z":93.43498},"orientation":{"isIdentity":false,"x":0,"y":0,"z":0.13027212,"w":0.99147826},"velocity":{"x":-3.0606577,"y":11.445992,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":5.9604504E-09,"y":2.4835205E-09,"z":1},"d":-94},"contactPlaneCellId":2847146357,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":5.9604504E-09,"y":2.4835205E-09,"z":1},"d":-94},"walkableVertices":[{"x":152.929,"y":15.153151,"z":94},{"x":152.929,"y":10.353151,"z":94},{"x":154.929,"y":10.35315,"z":94}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0},"result":{"position":{"x":153.4518,"y":9.728503,"z":93.43498},"cellId":2847146357,"isOnGround":true,"collisionNormalValid":true,"collisionNormal":{"x":1,"y":-8.74228E-08,"z":0}},"bodyAfter":{"position":{"x":153.33388,"y":10.169506,"z":93.43498},"orientation":{"isIdentity":false,"x":0,"y":0,"z":0.13027212,"w":0.99147826},"velocity":{"x":-3.0606577,"y":11.445992,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":1,"y":-8.74228E-08,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":5.9604504E-09,"y":2.4835205E-09,"z":1},"d":-94},"contactPlaneCellId":2847146357,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":5.9604504E-09,"y":2.4835205E-09,"z":1},"d":-94},"walkableVertices":[{"x":152.929,"y":15.153151,"z":94},{"x":152.929,"y":10.353151,"z":94},{"x":154.929,"y":10.35315,"z":94}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0}} +{"tick":3371,"timestampMs":262878655,"input":{"currentPos":{"x":153.44606,"y":9.728503,"z":93.43498},"targetPos":{"x":153.43967,"y":10.24506,"z":93.43498},"cellId":2847146357,"sphereRadius":0.48,"sphereHeight":1.2,"stepUpHeight":0.6,"stepDownHeight":1.5,"isOnGround":true,"moverFlags":768,"movingEntityId":1000000},"bodyBefore":{"position":{"x":153.43967,"y":10.24506,"z":93.43498},"orientation":{"isIdentity":false,"x":0,"y":0,"z":0.006181737,"w":0.99998087},"velocity":{"x":-0.14648134,"y":11.847231,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":0,"y":0,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":131,"lastUpdateTime":0},"result":{"position":{"x":153.43967,"y":9.728503,"z":93.43498},"cellId":2847146357,"isOnGround":true,"collisionNormalValid":true,"collisionNormal":{"x":-8.74228E-08,"y":-1,"z":0}},"bodyAfter":{"position":{"x":153.43967,"y":10.24506,"z":93.43498},"orientation":{"isIdentity":false,"x":0,"y":0,"z":0.006181737,"w":0.99998087},"velocity":{"x":-0.14648134,"y":11.847231,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0}} +{"tick":3402,"timestampMs":262878973,"input":{"currentPos":{"x":153.41031,"y":9.728503,"z":93.43498},"targetPos":{"x":153.40495,"y":10.161768,"z":93.43498},"cellId":2847146357,"sphereRadius":0.48,"sphereHeight":1.2,"stepUpHeight":0.6,"stepDownHeight":1.5,"isOnGround":true,"moverFlags":768,"movingEntityId":1000000},"bodyBefore":{"position":{"x":153.40495,"y":10.161768,"z":93.43498},"orientation":{"isIdentity":false,"x":0,"y":0,"z":0.006181737,"w":0.99998087},"velocity":{"x":-0.14648134,"y":11.847231,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":1,"y":-8.74228E-08,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":5.9604504E-09,"y":2.4835205E-09,"z":1},"d":-94},"contactPlaneCellId":2847146357,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":5.9604504E-09,"y":2.4835205E-09,"z":1},"d":-94},"walkableVertices":[{"x":152.929,"y":15.153151,"z":94},{"x":152.929,"y":10.353151,"z":94},{"x":154.929,"y":10.35315,"z":94}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0},"result":{"position":{"x":153.41031,"y":9.728503,"z":93.43498},"cellId":2847146357,"isOnGround":true,"collisionNormalValid":true,"collisionNormal":{"x":-8.74228E-08,"y":-1,"z":0}},"bodyAfter":{"position":{"x":153.40495,"y":10.161768,"z":93.43498},"orientation":{"isIdentity":false,"x":0,"y":0,"z":0.006181737,"w":0.99998087},"velocity":{"x":-0.14648134,"y":11.847231,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":5.9604504E-09,"y":2.4835205E-09,"z":1},"d":-94},"contactPlaneCellId":2847146357,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":5.9604504E-09,"y":2.4835205E-09,"z":1},"d":-94},"walkableVertices":[{"x":152.929,"y":15.153151,"z":94},{"x":152.929,"y":10.353151,"z":94},{"x":154.929,"y":10.35315,"z":94}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0}} +{"tick":3885,"timestampMs":262883615,"input":{"currentPos":{"x":153.57297,"y":9.823084,"z":93.51064},"targetPos":{"x":153.58644,"y":10.3026905,"z":93.51064},"cellId":2847146357,"sphereRadius":0.48,"sphereHeight":1.2,"stepUpHeight":0.6,"stepDownHeight":1.5,"isOnGround":true,"moverFlags":768,"movingEntityId":1000000},"bodyBefore":{"position":{"x":153.58644,"y":10.3026905,"z":93.51064},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.014045194,"w":0.99990135},"velocity":{"x":0.33278593,"y":11.843463,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":0,"y":0,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":131,"lastUpdateTime":0},"result":{"position":{"x":153.58644,"y":9.823084,"z":93.51064},"cellId":2847146357,"isOnGround":true,"collisionNormalValid":true,"collisionNormal":{"x":-8.74228E-08,"y":-1,"z":0}},"bodyAfter":{"position":{"x":153.58644,"y":10.3026905,"z":93.51064},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.014045194,"w":0.99990135},"velocity":{"x":0.33278593,"y":11.843463,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0}} +{"tick":3909,"timestampMs":262883872,"input":{"currentPos":{"x":153.6587,"y":9.823084,"z":93.51064},"targetPos":{"x":153.67194,"y":10.29413,"z":93.51064},"cellId":2847146357,"sphereRadius":0.48,"sphereHeight":1.2,"stepUpHeight":0.6,"stepDownHeight":1.5,"isOnGround":true,"moverFlags":768,"movingEntityId":1000000},"bodyBefore":{"position":{"x":153.67194,"y":10.29413,"z":93.51064},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.014045194,"w":0.99990135},"velocity":{"x":0.33278593,"y":11.843463,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0},"result":{"position":{"x":153.67194,"y":9.823084,"z":93.51064},"cellId":2847146357,"isOnGround":true,"collisionNormalValid":false,"collisionNormal":{"x":0,"y":0,"z":0}},"bodyAfter":{"position":{"x":153.67194,"y":10.29413,"z":93.51064},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.014045194,"w":0.99990135},"velocity":{"x":0.33278593,"y":11.843463,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":0,"y":0,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":131,"lastUpdateTime":0}} +{"tick":3940,"timestampMs":262884181,"input":{"currentPos":{"x":153.76233,"y":9.823084,"z":93.51064},"targetPos":{"x":153.7749,"y":10.270569,"z":93.51064},"cellId":2847146357,"sphereRadius":0.48,"sphereHeight":1.2,"stepUpHeight":0.6,"stepDownHeight":1.5,"isOnGround":true,"moverFlags":768,"movingEntityId":1000000},"bodyBefore":{"position":{"x":153.7749,"y":10.270569,"z":93.51064},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.014045194,"w":0.99990135},"velocity":{"x":0.33278593,"y":11.843463,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":0,"y":0,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":131,"lastUpdateTime":0},"result":{"position":{"x":153.7749,"y":9.823084,"z":93.51064},"cellId":2847146357,"isOnGround":true,"collisionNormalValid":true,"collisionNormal":{"x":-8.74228E-08,"y":-1,"z":0}},"bodyAfter":{"position":{"x":153.7749,"y":10.270569,"z":93.51064},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.014045194,"w":0.99990135},"velocity":{"x":0.33278593,"y":11.843463,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0}} +{"tick":3967,"timestampMs":262884453,"input":{"currentPos":{"x":153.85223,"y":9.823084,"z":93.51064},"targetPos":{"x":153.86536,"y":10.289894,"z":93.51064},"cellId":2847146357,"sphereRadius":0.48,"sphereHeight":1.2,"stepUpHeight":0.6,"stepDownHeight":1.5,"isOnGround":true,"moverFlags":768,"movingEntityId":1000000},"bodyBefore":{"position":{"x":153.86536,"y":10.289894,"z":93.51064},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.014045194,"w":0.99990135},"velocity":{"x":0.33278593,"y":11.843463,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":0,"y":0,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":131,"lastUpdateTime":0},"result":{"position":{"x":153.86536,"y":9.823084,"z":93.51064},"cellId":2847146357,"isOnGround":true,"collisionNormalValid":true,"collisionNormal":{"x":-8.74228E-08,"y":-1,"z":0}},"bodyAfter":{"position":{"x":153.86536,"y":10.289894,"z":93.51064},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.014045194,"w":0.99990135},"velocity":{"x":0.33278593,"y":11.843463,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0}} +{"tick":4018,"timestampMs":262884952,"input":{"currentPos":{"x":153.41425,"y":9.823084,"z":93.51064},"targetPos":{"x":153.34381,"y":10.280462,"z":93.51064},"cellId":2847146357,"sphereRadius":0.48,"sphereHeight":1.2,"stepUpHeight":0.6,"stepDownHeight":1.5,"isOnGround":true,"moverFlags":768,"movingEntityId":1000000},"bodyBefore":{"position":{"x":153.34381,"y":10.280462,"z":93.51064},"orientation":{"isIdentity":false,"x":0,"y":0,"z":0.076320924,"w":0.9970833},"velocity":{"x":-1.8032467,"y":11.710111,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":0,"y":0,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":131,"lastUpdateTime":0},"result":{"position":{"x":153.41425,"y":9.823084,"z":93.51064},"cellId":2847146357,"isOnGround":true,"collisionNormalValid":true,"collisionNormal":{"x":-8.74228E-08,"y":-1,"z":0}},"bodyAfter":{"position":{"x":153.34381,"y":10.280462,"z":93.51064},"orientation":{"isIdentity":false,"x":0,"y":0,"z":0.076320924,"w":0.9970833},"velocity":{"x":-1.8032467,"y":11.710111,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":5.9604504E-09,"y":2.4835205E-09,"z":1},"d":-94},"contactPlaneCellId":2847146357,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":5.9604504E-09,"y":2.4835205E-09,"z":1},"d":-94},"walkableVertices":[{"x":152.929,"y":15.153151,"z":94},{"x":152.929,"y":10.353151,"z":94},{"x":154.929,"y":10.35315,"z":94}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0}} +{"tick":4022,"timestampMs":262884991,"input":{"currentPos":{"x":153.41425,"y":9.823084,"z":93.51064},"targetPos":{"x":153.3429,"y":10.28642,"z":93.51064},"cellId":2847146357,"sphereRadius":0.48,"sphereHeight":1.2,"stepUpHeight":0.6,"stepDownHeight":1.5,"isOnGround":true,"moverFlags":768,"movingEntityId":1000000},"bodyBefore":{"position":{"x":153.3429,"y":10.28642,"z":93.51064},"orientation":{"isIdentity":false,"x":0,"y":0,"z":0.076320924,"w":0.9970833},"velocity":{"x":-1.8032467,"y":11.710111,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":5.9604504E-09,"y":2.4835205E-09,"z":1},"d":-94},"contactPlaneCellId":2847146357,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":5.9604504E-09,"y":2.4835205E-09,"z":1},"d":-94},"walkableVertices":[{"x":152.929,"y":15.153151,"z":94},{"x":152.929,"y":10.353151,"z":94},{"x":154.929,"y":10.35315,"z":94}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0},"result":{"position":{"x":153.41425,"y":9.823084,"z":93.51064},"cellId":2847146357,"isOnGround":true,"collisionNormalValid":true,"collisionNormal":{"x":1,"y":-8.74228E-08,"z":0}},"bodyAfter":{"position":{"x":153.3429,"y":10.28642,"z":93.51064},"orientation":{"isIdentity":false,"x":0,"y":0,"z":0.076320924,"w":0.9970833},"velocity":{"x":-1.8032467,"y":11.710111,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":1,"y":-8.74228E-08,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":5.9604504E-09,"y":2.4835205E-09,"z":1},"d":-94},"contactPlaneCellId":2847146357,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":5.9604504E-09,"y":2.4835205E-09,"z":1},"d":-94},"walkableVertices":[{"x":152.929,"y":15.153151,"z":94},{"x":152.929,"y":10.353151,"z":94},{"x":154.929,"y":10.35315,"z":94}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0}} +{"tick":4049,"timestampMs":262885262,"input":{"currentPos":{"x":153.49516,"y":9.823084,"z":93.51064},"targetPos":{"x":153.54453,"y":10.317957,"z":93.51064},"cellId":2847146357,"sphereRadius":0.48,"sphereHeight":1.2,"stepUpHeight":0.6,"stepDownHeight":1.5,"isOnGround":true,"moverFlags":768,"movingEntityId":1000000},"bodyBefore":{"position":{"x":153.54453,"y":10.317957,"z":93.51064},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.049692065,"w":0.9987646},"velocity":{"x":1.1760621,"y":11.789623,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":0,"y":0,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":131,"lastUpdateTime":0},"result":{"position":{"x":153.54453,"y":9.823084,"z":93.51064},"cellId":2847146357,"isOnGround":true,"collisionNormalValid":true,"collisionNormal":{"x":-8.74228E-08,"y":-1,"z":0}},"bodyAfter":{"position":{"x":153.54453,"y":10.317957,"z":93.51064},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.049692065,"w":0.9987646},"velocity":{"x":1.1760621,"y":11.789623,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0}} +{"tick":4091,"timestampMs":262885677,"input":{"currentPos":{"x":153.9869,"y":9.823084,"z":93.51064},"targetPos":{"x":154.03308,"y":10.286115,"z":93.51064},"cellId":2847146357,"sphereRadius":0.48,"sphereHeight":1.2,"stepUpHeight":0.6,"stepDownHeight":1.5,"isOnGround":true,"moverFlags":768,"movingEntityId":1000000},"bodyBefore":{"position":{"x":154.03308,"y":10.286115,"z":93.51064},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.049692065,"w":0.9987646},"velocity":{"x":1.1760621,"y":11.789623,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0},"result":{"position":{"x":154.03308,"y":9.823084,"z":93.51064},"cellId":2847146357,"isOnGround":true,"collisionNormalValid":false,"collisionNormal":{"x":0,"y":0,"z":0}},"bodyAfter":{"position":{"x":154.03308,"y":10.286115,"z":93.51064},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.049692065,"w":0.9987646},"velocity":{"x":1.1760621,"y":11.789623,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":0,"y":0,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":131,"lastUpdateTime":0}} +{"tick":4193,"timestampMs":262886713,"input":{"currentPos":{"x":154.05077,"y":9.823084,"z":93.51064},"targetPos":{"x":154.09308,"y":10.273949,"z":93.51064},"cellId":2847146357,"sphereRadius":0.48,"sphereHeight":1.2,"stepUpHeight":0.6,"stepDownHeight":1.5,"isOnGround":true,"moverFlags":768,"movingEntityId":1000000},"bodyBefore":{"position":{"x":154.09308,"y":10.273949,"z":93.51064},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.04677716,"w":0.99890536},"velocity":{"x":1.1072311,"y":11.7962885,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0},"result":{"position":{"x":154.09308,"y":9.823084,"z":93.51064},"cellId":2847146357,"isOnGround":true,"collisionNormalValid":false,"collisionNormal":{"x":0,"y":0,"z":0}},"bodyAfter":{"position":{"x":154.09308,"y":10.273949,"z":93.51064},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.04677716,"w":0.99890536},"velocity":{"x":1.1072311,"y":11.7962885,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":0,"y":0,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":131,"lastUpdateTime":0}} +{"tick":4205,"timestampMs":262886828,"input":{"currentPos":{"x":154.17876,"y":9.823084,"z":93.51064},"targetPos":{"x":154.22104,"y":10.273495,"z":93.51064},"cellId":2847146357,"sphereRadius":0.48,"sphereHeight":1.2,"stepUpHeight":0.6,"stepDownHeight":1.5,"isOnGround":true,"moverFlags":768,"movingEntityId":1000000},"bodyBefore":{"position":{"x":154.22104,"y":10.273495,"z":93.51064},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.04677716,"w":0.99890536},"velocity":{"x":1.1072311,"y":11.7962885,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":0,"y":0,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":131,"lastUpdateTime":0},"result":{"position":{"x":154.22104,"y":9.823084,"z":93.51064},"cellId":2847146357,"isOnGround":true,"collisionNormalValid":true,"collisionNormal":{"x":-8.74228E-08,"y":-1,"z":0}},"bodyAfter":{"position":{"x":154.22104,"y":10.273495,"z":93.51064},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.04677716,"w":0.99890536},"velocity":{"x":1.1072311,"y":11.7962885,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0}} +{"tick":4213,"timestampMs":262886906,"input":{"currentPos":{"x":154.26338,"y":9.823084,"z":93.51064},"targetPos":{"x":154.3069,"y":10.286709,"z":93.51064},"cellId":2847146357,"sphereRadius":0.48,"sphereHeight":1.2,"stepUpHeight":0.6,"stepDownHeight":1.5,"isOnGround":true,"moverFlags":768,"movingEntityId":1000000},"bodyBefore":{"position":{"x":154.3069,"y":10.286709,"z":93.51064},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.04677716,"w":0.99890536},"velocity":{"x":1.1072311,"y":11.7962885,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":0,"y":0,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":131,"lastUpdateTime":0},"result":{"position":{"x":154.3069,"y":9.823084,"z":93.51064},"cellId":2847146357,"isOnGround":true,"collisionNormalValid":true,"collisionNormal":{"x":-8.74228E-08,"y":-1,"z":0}},"bodyAfter":{"position":{"x":154.3069,"y":10.286709,"z":93.51064},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.04677716,"w":0.99890536},"velocity":{"x":1.1072311,"y":11.7962885,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0}} +{"tick":4221,"timestampMs":262886985,"input":{"currentPos":{"x":154.35124,"y":9.823084,"z":93.51064},"targetPos":{"x":154.37279,"y":10.279013,"z":93.51064},"cellId":2847146357,"sphereRadius":0.48,"sphereHeight":1.2,"stepUpHeight":0.6,"stepDownHeight":1.5,"isOnGround":true,"moverFlags":768,"movingEntityId":1000000},"bodyBefore":{"position":{"x":154.37279,"y":10.279013,"z":93.51064},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.023612391,"w":0.99972117},"velocity":{"x":0.55936974,"y":11.834926,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":0,"y":0,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":131,"lastUpdateTime":0},"result":{"position":{"x":154.37279,"y":9.823084,"z":93.51064},"cellId":2847146357,"isOnGround":true,"collisionNormalValid":true,"collisionNormal":{"x":-8.74228E-08,"y":-1,"z":0}},"bodyAfter":{"position":{"x":154.37279,"y":10.279013,"z":93.51064},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.023612391,"w":0.99972117},"velocity":{"x":0.55936974,"y":11.834926,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0}} +{"tick":4398,"timestampMs":262888732,"input":{"currentPos":{"x":153.56111,"y":9.389898,"z":93.16409},"targetPos":{"x":153.40527,"y":9.150686,"z":93.16409},"cellId":2847146357,"sphereRadius":0.48,"sphereHeight":1.2,"stepUpHeight":0.6,"stepDownHeight":1.5,"isOnGround":true,"moverFlags":768,"movingEntityId":1000000},"bodyBefore":{"position":{"x":153.40527,"y":9.150686,"z":93.16409},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.012522013,"w":0.9999216},"velocity":{"x":-3.85181,"y":-5.9124026,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":0,"y":0,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":131,"lastUpdateTime":0},"result":{"position":{"x":153.56111,"y":9.389898,"z":93.16409},"cellId":2847146357,"isOnGround":true,"collisionNormalValid":true,"collisionNormal":{"x":1,"y":-8.74228E-08,"z":0}},"bodyAfter":{"position":{"x":153.40527,"y":9.150686,"z":93.16409},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.012522013,"w":0.9999216},"velocity":{"x":-3.85181,"y":-5.9124026,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":1,"y":-8.74228E-08,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0}} +{"tick":4531,"timestampMs":262889815,"input":{"currentPos":{"x":153.50339,"y":9.73499,"z":93.44017},"targetPos":{"x":153.51482,"y":10.191414,"z":93.44017},"cellId":2847146357,"sphereRadius":0.48,"sphereHeight":1.2,"stepUpHeight":0.6,"stepDownHeight":1.5,"isOnGround":true,"moverFlags":768,"movingEntityId":1000000},"bodyBefore":{"position":{"x":153.51482,"y":10.191414,"z":93.44017},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.012522013,"w":0.9999216},"velocity":{"x":0.29670182,"y":11.844422,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":0,"y":0,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":131,"lastUpdateTime":0},"result":{"position":{"x":153.51482,"y":9.73499,"z":93.44017},"cellId":2847146357,"isOnGround":true,"collisionNormalValid":true,"collisionNormal":{"x":-8.74228E-08,"y":-1,"z":0}},"bodyAfter":{"position":{"x":153.51482,"y":10.191414,"z":93.44017},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.012522013,"w":0.9999216},"velocity":{"x":0.29670182,"y":11.844422,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0}} +{"tick":4547,"timestampMs":262889974,"input":{"currentPos":{"x":153.55008,"y":9.73499,"z":93.44017},"targetPos":{"x":153.56207,"y":10.213897,"z":93.44017},"cellId":2847146357,"sphereRadius":0.48,"sphereHeight":1.2,"stepUpHeight":0.6,"stepDownHeight":1.5,"isOnGround":true,"moverFlags":768,"movingEntityId":1000000},"bodyBefore":{"position":{"x":153.56207,"y":10.213897,"z":93.44017},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.012522013,"w":0.9999216},"velocity":{"x":0.29670182,"y":11.844422,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":0,"y":0,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":131,"lastUpdateTime":0},"result":{"position":{"x":153.56207,"y":9.73499,"z":93.44017},"cellId":2847146357,"isOnGround":true,"collisionNormalValid":true,"collisionNormal":{"x":-8.74228E-08,"y":-1,"z":0}},"bodyAfter":{"position":{"x":153.56207,"y":10.213897,"z":93.44017},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.012522013,"w":0.9999216},"velocity":{"x":0.29670182,"y":11.844422,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0}} +{"tick":4780,"timestampMs":262892348,"input":{"currentPos":{"x":154.2535,"y":9.73499,"z":93.44017},"targetPos":{"x":154.2664,"y":10.250063,"z":93.44017},"cellId":2847146357,"sphereRadius":0.48,"sphereHeight":1.2,"stepUpHeight":0.6,"stepDownHeight":1.5,"isOnGround":true,"moverFlags":768,"movingEntityId":1000000},"bodyBefore":{"position":{"x":154.2664,"y":10.250063,"z":93.44017},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.012522013,"w":0.9999216},"velocity":{"x":0.29670182,"y":11.844422,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0},"result":{"position":{"x":154.2664,"y":9.73499,"z":93.44017},"cellId":2847146357,"isOnGround":true,"collisionNormalValid":true,"collisionNormal":{"x":-8.74228E-08,"y":-1,"z":0}},"bodyAfter":{"position":{"x":154.2664,"y":10.250063,"z":93.44017},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.012522013,"w":0.9999216},"velocity":{"x":0.29670182,"y":11.844422,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0}} +{"tick":4809,"timestampMs":262892702,"input":{"currentPos":{"x":154.36081,"y":9.73499,"z":93.44017},"targetPos":{"x":154.37146,"y":10.160073,"z":93.44017},"cellId":2847146357,"sphereRadius":0.48,"sphereHeight":1.2,"stepUpHeight":0.6,"stepDownHeight":1.5,"isOnGround":true,"moverFlags":768,"movingEntityId":1000000},"bodyBefore":{"position":{"x":154.37146,"y":10.160073,"z":93.44017},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.012522013,"w":0.9999216},"velocity":{"x":0.29670182,"y":11.844422,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":0,"y":0,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":131,"lastUpdateTime":0},"result":{"position":{"x":154.37146,"y":9.73499,"z":93.44017},"cellId":2847146357,"isOnGround":true,"collisionNormalValid":true,"collisionNormal":{"x":-8.74228E-08,"y":-1,"z":0}},"bodyAfter":{"position":{"x":154.37146,"y":10.160073,"z":93.44017},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.012522013,"w":0.9999216},"velocity":{"x":0.29670182,"y":11.844422,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"contactPlaneCellId":2847146356,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":3.9713743E-08,"y":-0.62469506,"z":0.7808688},"d":-66.77794},"walkableVertices":[{"x":154.76901,"y":6.3531494,"z":90.6},{"x":154.76901,"y":9.853149,"z":93.4},{"x":153.069,"y":9.853149,"z":93.4},{"x":153.069,"y":6.3531494,"z":90.6}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0}} +{"tick":4844,"timestampMs":262893063,"input":{"currentPos":{"x":154.44443,"y":9.73499,"z":93.44017},"targetPos":{"x":154.45627,"y":10.207521,"z":93.44017},"cellId":2847146357,"sphereRadius":0.48,"sphereHeight":1.2,"stepUpHeight":0.6,"stepDownHeight":1.5,"isOnGround":true,"moverFlags":768,"movingEntityId":1000000},"bodyBefore":{"position":{"x":154.45627,"y":10.207521,"z":93.44017},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.012522013,"w":0.9999216},"velocity":{"x":0.29670182,"y":11.844422,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-1,"y":8.74228E-08,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":5.9604504E-09,"y":2.4835205E-09,"z":1},"d":-94},"contactPlaneCellId":2847146357,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":5.9604504E-09,"y":2.4835205E-09,"z":1},"d":-94},"walkableVertices":[{"x":152.929,"y":15.153151,"z":94},{"x":152.929,"y":10.353151,"z":94},{"x":154.929,"y":10.35315,"z":94}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0},"result":{"position":{"x":154.44443,"y":9.73499,"z":93.44017},"cellId":2847146357,"isOnGround":true,"collisionNormalValid":true,"collisionNormal":{"x":-8.74228E-08,"y":-1,"z":0}},"bodyAfter":{"position":{"x":154.45627,"y":10.207521,"z":93.44017},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.012522013,"w":0.9999216},"velocity":{"x":0.29670182,"y":11.844422,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":5.9604504E-09,"y":2.4835205E-09,"z":1},"d":-94},"contactPlaneCellId":2847146357,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":5.9604504E-09,"y":2.4835205E-09,"z":1},"d":-94},"walkableVertices":[{"x":152.929,"y":15.153151,"z":94},{"x":152.929,"y":10.353151,"z":94},{"x":154.929,"y":10.35315,"z":94}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0}} +{"tick":7519,"timestampMs":262918465,"input":{"currentPos":{"x":154.42896,"y":9.811654,"z":93.5015},"targetPos":{"x":154.4983,"y":10.303496,"z":93.5015},"cellId":2847146357,"sphereRadius":0.48,"sphereHeight":1.2,"stepUpHeight":0.6,"stepDownHeight":1.5,"isOnGround":true,"moverFlags":768,"movingEntityId":1000000},"bodyBefore":{"position":{"x":154.4983,"y":10.303496,"z":93.5015},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.0699809,"w":0.99754834},"velocity":{"x":1.654221,"y":11.732089,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-1,"y":8.74228E-08,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":0,"y":0,"z":1},"d":-94},"contactPlaneCellId":2847146357,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":0,"y":0,"z":1},"d":-94},"walkableVertices":[{"x":154.929,"y":10.35315,"z":94},{"x":154.929,"y":6.353151,"z":94},{"x":157.829,"y":6.3531504,"z":94}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0},"result":{"position":{"x":154.42896,"y":9.811654,"z":93.5015},"cellId":2847146357,"isOnGround":true,"collisionNormalValid":true,"collisionNormal":{"x":-1,"y":8.74228E-08,"z":0}},"bodyAfter":{"position":{"x":154.4983,"y":10.303496,"z":93.5015},"orientation":{"isIdentity":false,"x":-0,"y":-0,"z":-0.0699809,"w":0.99754834},"velocity":{"x":1.654221,"y":11.732089,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-1,"y":8.74228E-08,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":0,"y":0,"z":1},"d":-94},"contactPlaneCellId":2847146357,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":0,"y":0,"z":1},"d":-94},"walkableVertices":[{"x":154.929,"y":10.35315,"z":94},{"x":154.929,"y":6.353151,"z":94},{"x":157.829,"y":6.3531504,"z":94}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0}} +{"tick":9466,"timestampMs":262936723,"input":{"currentPos":{"x":153.4952,"y":9.751367,"z":93.45327},"targetPos":{"x":153.44092,"y":10.214444,"z":93.45327},"cellId":2847146357,"sphereRadius":0.48,"sphereHeight":1.2,"stepUpHeight":0.6,"stepDownHeight":1.5,"isOnGround":true,"moverFlags":768,"movingEntityId":1000000},"bodyBefore":{"position":{"x":153.44092,"y":10.214444,"z":93.45327},"orientation":{"isIdentity":false,"x":0,"y":0,"z":0.05830996,"w":0.9982985},"velocity":{"x":-1.3793778,"y":11.767569,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":1,"y":-8.74228E-08,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":5.9604504E-09,"y":2.4835205E-09,"z":1},"d":-94},"contactPlaneCellId":2847146357,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":5.9604504E-09,"y":2.4835205E-09,"z":1},"d":-94},"walkableVertices":[{"x":152.929,"y":15.153151,"z":94},{"x":152.929,"y":10.353151,"z":94},{"x":154.929,"y":10.35315,"z":94}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0},"result":{"position":{"x":153.4952,"y":9.751367,"z":93.45327},"cellId":2847146357,"isOnGround":true,"collisionNormalValid":true,"collisionNormal":{"x":-8.74228E-08,"y":-1,"z":0}},"bodyAfter":{"position":{"x":153.44092,"y":10.214444,"z":93.45327},"orientation":{"isIdentity":false,"x":0,"y":0,"z":0.05830996,"w":0.9982985},"velocity":{"x":-1.3793778,"y":11.767569,"z":0},"acceleration":{"x":0,"y":0,"z":0},"omega":{"x":0,"y":0,"z":0},"groundNormal":{"x":0,"y":0,"z":1},"slidingNormal":{"x":-8.74228E-08,"y":-1,"z":0},"contactPlaneValid":true,"contactPlane":{"normal":{"x":5.9604504E-09,"y":2.4835205E-09,"z":1},"d":-94},"contactPlaneCellId":2847146357,"contactPlaneIsWater":false,"walkablePolygonValid":true,"walkablePlane":{"normal":{"x":5.9604504E-09,"y":2.4835205E-09,"z":1},"d":-94},"walkableVertices":[{"x":152.929,"y":15.153151,"z":94},{"x":152.929,"y":10.353151,"z":94},{"x":154.929,"y":10.35315,"z":94}],"walkableUp":{"x":0,"y":0,"z":1},"elasticity":0.05,"friction":0.95,"state":1040,"transientState":135,"lastUpdateTime":0}} diff --git a/tests/AcDream.Core.Tests/Physics/CellarLipWedgeTests.cs b/tests/AcDream.Core.Tests/Physics/CellarLipWedgeTests.cs new file mode 100644 index 00000000..fc6423b3 --- /dev/null +++ b/tests/AcDream.Core.Tests/Physics/CellarLipWedgeTests.cs @@ -0,0 +1,446 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Numerics; +using AcDream.Core.Physics; +using DatReaderWriter.Enums; +using DatReaderWriter.Types; +using Xunit; + +namespace AcDream.Core.Tests.Physics; + +/// +/// P2 cellar-LIP wedge (2026-06-04) β€” deterministic reproduction of the +/// "blocked at the last step" wedge at the Holtburg cottage cellar lip, +/// distinct from the earlier issue-#98 cellar (cells 0xA9B4014X). +/// +/// +/// Built from live captures this session: +/// +/// Retail-connector trace (CEnvCell::find_collisions) proved +/// retail's connector cell 0xA9B40175 NEVER blocks (2692 OK + +/// 94 Adjusted + 0 Collided + 0 Slid over ~85K samples). +/// acdream live capture at the wedge: the player (r=0.48 body +/// sphere) is mid-climb at world Z=93.936, carried in the 0.364 m-tall +/// threshold slab 0xA9B40175. Its 0.48 sphere grazes the slab's +/// βˆ’X wall (local X=9; sphere at X=8.523 reaches 9.003 β€” a 3 mm graze) +/// β†’ StepSphereUp β†’ DoStepUp fails (no CP on the flat +/// cottage floor) β†’ StepUpSlide returns Collided β†’ the +/// per-cell collide returns Collided β†’ wedge. +/// +/// +/// +/// +/// Fixtures are real cell dumps (ACDREAM_DUMP_CELLS) of the three lip +/// cells: 0xA9B40171 (cottage floor), 0xA9B40174, 0xA9B40175 +/// (threshold connector). The BSP=null hydration gap is bridged with a +/// synthetic single-leaf BSP, same as . +/// +/// +/// +/// RED status: the climb-advance assertion is expected to FAIL while the +/// wedge exists (the player freezes at the threshold ~Z=93.94 instead of +/// reaching the cottage floor ~Z=94.48). When the fix lands it flips to GREEN. +/// +/// +public class CellarLipWedgeTests +{ + private const uint CottageFloorId = 0xA9B40171u; // cottage room floor + private const uint Connector74Id = 0xA9B40174u; + private const uint ThresholdId = 0xA9B40175u; // 0.364 m threshold slab + + // Player physics from PlayerMovementController.cs (human, from Setup). + private const float SphereRadius = 0.48f; + private const float SphereHeight = 1.20f; + private const float StepUpHeight = 0.40f; + private const float StepDownHeight = 0.04f; + + // The live-captured wedge state. The probe's [indoor-bsp] wpos is the + // FOOT-SPHERE CENTER (153.406, 9.754, 93.936); the engine body Position is + // the foot BOTTOM = center βˆ’ radius = Z 93.456. Player carried in the + // 0.364 m threshold slab 0xA9B40175, climbing the cellar stairs; observed + // motion at the lip is world βˆ’Y (into the cottage). + private static readonly Vector3 WedgeSphereCenter = new(153.406f, 9.754f, 93.936f); + private static readonly Vector3 WedgeBodyPos = + new(153.406f, 9.754f, 93.936f - SphereRadius); // foot bottom Z=93.456 + private static readonly Vector3 PerTickOffset = new(0f, -0.10f, 0f); + + private const float CottageFloorZ = 94.00f; + private const float RestOnCottageZ = CottageFloorZ + SphereRadius; // β‰ˆ94.48 + + /// + /// Diagnostic: drive the player off the threshold toward the cottage and + /// dump the trajectory + indoor-BSP/step probes. Always passes; the + /// captured stdout shows exactly what the engine does each tick. + /// + [Fact] + public void Diagnostic_DriveOffThreshold_DumpTrajectory() + { + PhysicsDiagnostics.ProbeResolveEnabled = true; + PhysicsDiagnostics.ProbeIndoorBspEnabled = true; + var saved = Console.Out; + var sw = new StringWriter(); + Console.SetOut(sw); + try + { + var engine = BuildEngineWithLipFixtures(); + var body = BuildWedgeBody(); + var traj = SimulateTicks(engine, body, ThresholdId, 4); + + Console.SetOut(saved); + var probeLines = sw.ToString(); + File.WriteAllText( + Path.Combine(Path.GetTempPath(), "lip-wedge-diag.log"), + "TRAJECTORY:\n" + string.Join("\n", traj.Select(p => + $"tick={p.Tick} pos=({p.Position.X:F4},{p.Position.Y:F4},{p.Position.Z:F4}) " + + $"cell=0x{p.CellId:X8} onGround={p.IsOnGround} cpValid={p.CpValid}")) + + "\n\nPROBES:\n" + probeLines); + Assert.True(true); + } + finally + { + Console.SetOut(saved); + PhysicsDiagnostics.ProbeResolveEnabled = false; + PhysicsDiagnostics.ProbeIndoorBspEnabled = false; + } + } + + /// + /// DOCUMENTS-THE-BUG (passes while the wedge exists; FAILS when the fix + /// lands). Seeded at the live wedge position (foot-sphere center Z=93.936, + /// carried in the 0.364 m threshold slab 0xA9B40175) and driven forward, + /// the player FREEZES β€” blocked by the slab's βˆ’X side wall (poly normal + /// world (1,0,0)) β€” instead of advancing onto the cottage floor. Retail's + /// 0175 never blocks (live CEnvCell::find_collisions trace: 0 Collided/Slid). + /// + /// + /// Faithfulness caveat: the per-tick drive direction (world βˆ’Y) is an + /// approximation β€” the exact targetPos would come from an + /// ACDREAM_CAPTURE_RESOLVE JSONL of the live wedge. The βˆ’Y drive is + /// PARALLEL to the βˆ’X wall, so it reproduces the block but may not be the + /// real climb path. A candidate fix (replacing the A6.P4 neg-poly + /// "return Collided" shortcut with retail's slide_sphere) did NOT clear this: + /// the slide returns Slid with offset=0 (displacement already along the + /// crease), the loop re-checks with gDeltaβ‰ˆ0 β†’ SlideSphere's + /// offset.LengthSquared<Ξ΅ β†’ Collided branch β†’ revert. The real fix needs a + /// faithful repro + the slide/loop-commit investigation (see the handoff + /// doc 2026-06-04-p2-cellar-lip-flatfloor-cp-handoff.md, Correction 2). + /// + /// + /// When the wedge is fixed the player advances and this assertion FAILS β€” + /// that is the signal to flip it to assert the climb. + /// + [Fact] + public void DocumentsWedge_PlayerFrozenAtThreshold_BlockedByMinusXWall() + { + var engine = BuildEngineWithLipFixtures(); + var body = BuildWedgeBody(); + var traj = SimulateTicks(engine, body, ThresholdId, 30); + + var final = traj[^1]; + float yAdvance = WedgeBodyPos.Y - final.Position.Y; // +ve = moved into cottage + float zRise = final.Position.Z - WedgeBodyPos.Z; // +ve = climbed + + Assert.True( + yAdvance < 0.1f && zRise < 0.1f, + $"DOCUMENTS-THE-BUG: expected the player to be FROZEN at the threshold " + + $"(the βˆ’X-wall wedge). Instead it advanced to " + + $"({final.Position.X:F3},{final.Position.Y:F3},{final.Position.Z:F3}) " + + $"after 30 ticks (yAdvance={yAdvance:F3}, zRise={zRise:F3}). If the wedge " + + $"fix landed, FLIP this assertion to require the climb " + + $"(Zβ‰₯{CottageFloorZ - 0.05f:F2}, yAdvance>0.5)."); + } + + // ───────────────────────────── helpers ───────────────────────────── + + private static PhysicsBody BuildWedgeBody() => new() + { + Position = WedgeBodyPos, // foot bottom Z=93.456 + Orientation = Quaternion.Identity, + + // Best-effort grounded seed: a flat floor at foot level so the player + // starts "on the ground" mid-climb (the exact body-before state would + // come from an ACDREAM_CAPTURE_RESOLVE JSONL; this approximation puts + // the foot-sphere center at Z=93.936 β€” the live wedge β€” so the + // geometric βˆ’X-wall full-hit fires). + ContactPlaneValid = true, + ContactPlane = new System.Numerics.Plane(0f, 0f, 1f, -WedgeBodyPos.Z), + ContactPlaneCellId = ThresholdId, + WalkablePolygonValid = true, + WalkablePlane = new System.Numerics.Plane(0f, 0f, 1f, -WedgeBodyPos.Z), + WalkableVertices = new[] + { + new Vector3(WedgeBodyPos.X - 1f, WedgeBodyPos.Y - 1f, WedgeBodyPos.Z), + new Vector3(WedgeBodyPos.X - 1f, WedgeBodyPos.Y + 1f, WedgeBodyPos.Z), + new Vector3(WedgeBodyPos.X + 1f, WedgeBodyPos.Y + 1f, WedgeBodyPos.Z), + new Vector3(WedgeBodyPos.X + 1f, WedgeBodyPos.Y - 1f, WedgeBodyPos.Z), + }, + WalkableUp = Vector3.UnitZ, + TransientState = TransientStateFlags.Contact | TransientStateFlags.OnWalkable, + }; + + private static List SimulateTicks( + PhysicsEngine engine, PhysicsBody body, uint initialCellId, int tickCount) + { + uint cellId = initialCellId; + bool isOnGround = true; + var traj = new List { new(0, body.Position, cellId, isOnGround, body.ContactPlaneValid) }; + + for (int tick = 1; tick <= tickCount; tick++) + { + Vector3 target = body.Position + PerTickOffset; + var result = engine.ResolveWithTransition( + currentPos: body.Position, + targetPos: target, + cellId: cellId, + sphereRadius: SphereRadius, + sphereHeight: SphereHeight, + stepUpHeight: StepUpHeight, + stepDownHeight: StepDownHeight, + isOnGround: isOnGround, + body: body, + moverFlags: ObjectInfoState.IsPlayer | ObjectInfoState.EdgeSlide, + movingEntityId: 0); + + body.Position = result.Position; + cellId = result.CellId; + isOnGround = result.IsOnGround; + traj.Add(new(tick, body.Position, cellId, isOnGround, body.ContactPlaneValid)); + } + return traj; + } + + private sealed record TrajPoint(int Tick, Vector3 Position, uint CellId, bool IsOnGround, bool CpValid); + + // ─────────────────────── faithful live-wedge replay ─────────────────────── + // Replays a captured wedge ResolveWithTransition call (exact currentPos / + // targetPos / body-before from ACDREAM_CAPTURE_RESOLVE at the live cellar + // lip) through the lip-cell engine. The live climb direction is βˆ’X,+Y (the + // synthetic βˆ’Y guess was backwards). 29 representative wedge records are in + // Fixtures/cellar-lip/wedge-records.jsonl. + + private static readonly System.Text.Json.JsonSerializerOptions WedgeJsonOptions = + new() { IncludeFields = true, PropertyNamingPolicy = System.Text.Json.JsonNamingPolicy.CamelCase }; + + private static List LoadWedgeRecords() + { + var path = Path.Combine(FixtureDir, "wedge-records.jsonl"); + Assert.True(File.Exists(path), $"Wedge fixture missing: {path}"); + var list = new List(); + foreach (var line in File.ReadLines(path)) + { + if (string.IsNullOrWhiteSpace(line)) continue; + list.Add(System.Text.Json.JsonSerializer.Deserialize(line, WedgeJsonOptions)!); + } + return list; + } + + private static PhysicsBody SeedBody(PhysicsBodySnapshot s) => new() + { + Position = s.Position, + Orientation = s.Orientation, + Velocity = s.Velocity, + Acceleration = s.Acceleration, + Omega = s.Omega, + GroundNormal = s.GroundNormal, + SlidingNormal = s.SlidingNormal, + ContactPlaneValid = s.ContactPlaneValid, + ContactPlane = s.ContactPlane, + ContactPlaneCellId = s.ContactPlaneCellId, + ContactPlaneIsWater = s.ContactPlaneIsWater, + WalkablePolygonValid = s.WalkablePolygonValid, + WalkablePlane = s.WalkablePlane, + WalkableVertices = s.WalkableVertices, + WalkableUp = s.WalkableUp, + Elasticity = s.Elasticity, + Friction = s.Friction, + State = (PhysicsStateFlags)s.State, + TransientState = (TransientStateFlags)s.TransientState, + LastUpdateTime = s.LastUpdateTime, + }; + + private static (Vector3 res, float requested, float advance) ReplayRecord(ResolveCaptureRecord rec) + { + var engine = BuildEngineWithLipFixtures(); + var body = SeedBody(rec.BodyBefore!); + var result = engine.ResolveWithTransition( + currentPos: rec.Input.CurrentPos, + targetPos: rec.Input.TargetPos, + cellId: rec.Input.CellId, + sphereRadius: rec.Input.SphereRadius, + sphereHeight: rec.Input.SphereHeight, + stepUpHeight: rec.Input.StepUpHeight, + stepDownHeight: rec.Input.StepDownHeight, + isOnGround: rec.Input.IsOnGround, + body: body, + moverFlags: (ObjectInfoState)rec.Input.MoverFlags, + movingEntityId: rec.Input.MovingEntityId); + float requested = Vector3.Distance(rec.Input.CurrentPos, rec.Input.TargetPos); + float advance = Vector3.Distance(rec.Input.CurrentPos, result.Position); + return (result.Position, requested, advance); + } + + /// + /// Diagnostic: replay every captured wedge record and report advance% β€” to + /// confirm the lip-cell engine reproduces the live stuck (0% advance) before + /// asserting a fix. Always passes; results in the message + %TEMP% file. + /// + [Fact] + public void Diagnostic_ReplayLiveWedgeRecords_Advance() + { + var recs = LoadWedgeRecords(); + var lines = new List(); + foreach (var (rec, i) in recs.Select((r, i) => (r, i))) + { + if (rec.BodyBefore is null) continue; + var (res, req, adv) = ReplayRecord(rec); + var cpN = rec.BodyBefore.ContactPlane.Normal; + lines.Add($"#{i} cp=({cpN.X:F2},{cpN.Y:F2},{cpN.Z:F2}) req={req:F3} adv={adv:F3} ({(req>0?100*adv/req:0):F0}%) " + + $"cur=({rec.Input.CurrentPos.X:F2},{rec.Input.CurrentPos.Y:F2},{rec.Input.CurrentPos.Z:F2}) " + + $"tgt=({rec.Input.TargetPos.X:F2},{rec.Input.TargetPos.Y:F2},{rec.Input.TargetPos.Z:F2}) " + + $"res=({res.X:F2},{res.Y:F2},{res.Z:F2})"); + } + File.WriteAllText(Path.Combine(Path.GetTempPath(), "lip-wedge-replay.log"), string.Join("\n", lines)); + Assert.True(true, string.Join("\n", lines.Take(10))); + } + + /// + /// Diagnostic: replay ONE floor-CP wedge record with the step-up + indoor + /// probes on, capturing why the step-up fails. Output to %TEMP%/lip-wedge-stepup.log. + /// + [Fact] + public void Diagnostic_ReplayFloorCpRecord_StepUpProbes() + { + var rec = LoadWedgeRecords().First(r => r.BodyBefore is not null + && r.BodyBefore.ContactPlane.Normal.Z > 0.99f); + var saved = Console.Out; + var sw = new StringWriter(); + PhysicsDiagnostics.ProbeIndoorBspEnabled = true; + PhysicsDiagnostics.ProbeStepWalkEnabled = true; + Environment.SetEnvironmentVariable("ACDREAM_DUMP_STEPUP", "1"); + Console.SetOut(sw); + try + { + var (res, req, adv) = ReplayRecord(rec); + Console.SetOut(saved); + File.WriteAllText(Path.Combine(Path.GetTempPath(), "lip-wedge-stepup.log"), + $"record cur=({rec.Input.CurrentPos.X:F4},{rec.Input.CurrentPos.Y:F4},{rec.Input.CurrentPos.Z:F4}) " + + $"tgt=({rec.Input.TargetPos.X:F4},{rec.Input.TargetPos.Y:F4},{rec.Input.TargetPos.Z:F4}) " + + $"req={req:F3} adv={adv:F3} res=({res.X:F4},{res.Y:F4},{res.Z:F4})\n\n" + sw.ToString()); + Assert.True(true); + } + finally + { + Console.SetOut(saved); + Environment.SetEnvironmentVariable("ACDREAM_DUMP_STEPUP", null); + PhysicsDiagnostics.ProbeIndoorBspEnabled = false; + PhysicsDiagnostics.ProbeStepWalkEnabled = false; + } + } + + /// + /// FAITHFUL documents-the-bug (passes while the wedge exists; FAILS when the + /// fix lands β†’ flip to assert the climb). Replays a captured FLOOR-contact- + /// plane wedge through the lip-cell engine; the player is STUCK (0% advance). + /// + /// + /// Root cause (traced via Diagnostic_ReplayFloorCpRecord_StepUpProbes): + /// the player is at the doorway EDGE of the cottage floor (0171, poly 0x0023, + /// Z=94). The step-up's step-down finds that floor and the 0.48 sphere + /// OVERLAPS it (0.085 m below), but acdream's walkable check REJECTS it + /// because the sphere center projects outside the floor poly's edge + /// (insideEdges=False, gap=βˆ’0.395) β†’ no contact plane β†’ step-up + /// fails β†’ StepUpSlide=Collided. Retail accepts the floor at its edge and + /// crosses (0175 never blocks). Fix is in the walkable-edge acceptance + /// (WalkableHitsSphere / PolygonHitsSpherePrecise / CheckWalkable edge math) + /// β€” compare retail CPolygon::walkable_hits_sphere + check_walkable. DOOR + /// REGRESSION RISK: walkable changes are global; visual-gate + door tests. + /// + /// + [Fact] + public void DocumentsWedge_LiveFloorCp_PlayerStuckAtCottageFloorEdge() + { + var recs = LoadWedgeRecords(); + var rec = recs.First(r => r.BodyBefore is not null + && r.BodyBefore.ContactPlane.Normal.Z > 0.99f); + var (res, requested, advance) = ReplayRecord(rec); + var c = rec.Input.CurrentPos; var t = rec.Input.TargetPos; + Assert.True(advance < 0.1f * requested, + $"DOCUMENTS-THE-BUG: expected the player STUCK at the cottage-floor edge. " + + $"Instead it advanced: cur=({c.X:F3},{c.Y:F3},{c.Z:F3}) tgt=({t.X:F3},{t.Y:F3},{t.Z:F3}) " + + $"res=({res.X:F3},{res.Y:F3},{res.Z:F3}) requested={requested:F3} advance={advance:F3}. " + + $"If the walkable-edge fix landed, FLIP this to require advance>0.25Β·requested."); + } + + private static PhysicsEngine BuildEngineWithLipFixtures() + { + var cache = new PhysicsDataCache(); + var engine = new PhysicsEngine { DataCache = cache }; + + foreach (var cellId in new[] { CottageFloorId, Connector74Id, ThresholdId }) + { + var path = Path.Combine(FixtureDir, $"0x{cellId:X8}.json"); + Assert.True(File.Exists(path), $"Lip fixture missing: {path}"); + var dump = CellDumpSerializer.Read(path); + var cell = CellDumpSerializer.Hydrate(dump); + cache.RegisterCellStructForTest(cellId, AttachSyntheticBsp(cell)); + } + + // Empty-terrain landblock so FindObjCollisions' TryGetLandblockContext + // succeeds at the lip XY (Xβ‰ˆ153, Yβ‰ˆ9). Flat far-below surface; the + // indoor BSP path fires first so terrain is never consulted. + var heights = new byte[81]; + var heightTable = new float[256]; + for (int i = 0; i < 256; i++) heightTable[i] = -1000f; + engine.AddLandblock( + landblockId: 0xA9B40000u, + terrain: new TerrainSurface(heights, heightTable), + cells: Array.Empty(), + portals: Array.Empty(), + worldOffsetX: 0f, + worldOffsetY: 0f); + + return engine; + } + + private static CellPhysics AttachSyntheticBsp(CellPhysics cell) + { + var leaf = new PhysicsBSPNode + { + Type = BSPNodeType.Leaf, + BoundingSphere = new Sphere { Origin = new Vector3(0f, 0f, 0f), Radius = 15f }, + }; + foreach (var kv in cell.Resolved) + leaf.Polygons.Add(kv.Key); + + return new CellPhysics + { + BSP = new PhysicsBSPTree { Root = leaf }, + PhysicsPolygons = cell.PhysicsPolygons, + Vertices = cell.Vertices, + WorldTransform = cell.WorldTransform, + InverseWorldTransform = cell.InverseWorldTransform, + Resolved = cell.Resolved, + CellBSP = cell.CellBSP, + Portals = cell.Portals, + PortalPolygons = cell.PortalPolygons, + VisibleCellIds = cell.VisibleCellIds, + }; + } + + private static string FixtureDir => + Path.Combine(SolutionRoot(), "tests", "AcDream.Core.Tests", "Fixtures", "cellar-lip"); + + private static string SolutionRoot() + { + var dir = AppContext.BaseDirectory; + while (!string.IsNullOrEmpty(dir)) + { + if (File.Exists(Path.Combine(dir, "AcDream.slnx"))) + return dir; + dir = Path.GetDirectoryName(dir); + } + throw new InvalidOperationException("Could not locate solution root (AcDream.slnx)."); + } +} diff --git a/tools/cdb/retail-connector-collide-trace.cdb b/tools/cdb/retail-connector-collide-trace.cdb new file mode 100644 index 00000000..a4684191 --- /dev/null +++ b/tools/cdb/retail-connector-collide-trace.cdb @@ -0,0 +1,34 @@ +$$ Retail per-cell collide trace (2026-06-04 β€” the DECISIVE discriminator). +$$ +$$ Question: when retail crosses the cellar lip, what does the per-cell collide +$$ CEnvCell::find_collisions RETURN for the connector cell 0xA9B40175 and the floor +$$ cell 0xA9B40171 (and 0174)? This is the thing check_other_cells calls per cell +$$ (vtable[0x88]). enum: 1=OK 2=COLLIDED 3=ADJUSTED 4=SLID. +$$ +$$ - If 0175 returns mostly 1 (OK) -> acdream's connector Slid is SPURIOUS +$$ (acdream over-detects / over-steps-up 0175). Fix = stop acdream blocking 0175. +$$ - If 0175 returns 4 (SLID) too -> retail slides+continues (no revert); +$$ acdream's wedge is the substep REVERT, not the collide. Look upstream. +$$ +$$ ROBUST BY CONSTRUCTION (verified offline via `cdb -z acclient.exe`): +$$ CEnvCell::find_collisions @0x52c100 has a SINGLE exit at +0x1e (0x52c11e): +$$ 0052c11e pop edi <-- esi still = this (CEnvCell*), eax = result +$$ 0052c11f pop esi +$$ 0052c120 ret 4 +$$ cell id = poi(esi+0x28) (CEnvCell.m_DID). No `gu`, no `qd` in the action. +$$ Reading this+result directly at the single exit is nesting-safe. +$$ +$$ STEP 0 (optional re-verify): the `uf` below re-dumps the function; confirm the +$$ single exit is still at +0x1e and esi=this there, before driving. +$$ +$$ Close retail when done to detach cdb (debuggee exit detaches; no qd needed). +.logopen C:\Users\erikn\source\repos\acdream\.claude\worktrees\thirsty-goldberg-51bb9b\retail-connector-collide-trace.log +.sympath C:\Users\erikn\source\repos\acdream\refs +.symopt+ 0x40 +.reload /f acclient.exe +uf acclient!CEnvCell::find_collisions +$$ Log EVERY return for the lip cluster 0xA9B4017X (0171 floor / 0174 / 0175 connector). +$$ Also log any NON-OK (ret!=1) return for ANY Holtburg cell 0xA9B4xxxx (catch blocks +$$ outside the 017X cluster). Low volume; cheap action + gc. +bp acclient!CEnvCell::find_collisions+0x1e ".if ((poi(@esi+0x28) & 0xFFFFFFF0) == 0xA9B40170) { .printf \"lip cell=0x%x ret=%d\\n\", poi(@esi+0x28), @eax } .elsif (((poi(@esi+0x28) & 0xFFFF0000) == 0xA9B40000) & (@eax != 1)) { .printf \"blk cell=0x%x ret=%d\\n\", poi(@esi+0x28), @eax }; gc" +g diff --git a/tools/cdb/retail-flatfloor-trace.cdb b/tools/cdb/retail-flatfloor-trace.cdb new file mode 100644 index 00000000..30bee286 --- /dev/null +++ b/tools/cdb/retail-flatfloor-trace.cdb @@ -0,0 +1,26 @@ +$$ Retail flat-floor contact-plane trace (2026-06-04, v2 β€” CORRECTED). +$$ Decisive question: when retail lands on the FLAT cottage floor during the climb, does +$$ BSPTREE::step_sphere_down SET the contact plane (return 3) or NOT (return 1)? +$$ +$$ v1 (gu-in-bp-action) FAILED: "commands skipped ... target execution inside an event +$$ handler" corrupted eax -> a perfect 1,3,1,3 alternation artifact. DO NOT use `gu` in a +$$ bp action. v2: stash the carried cell in $t3 at ENTRY (arg2 = sphere_path at [esp+4], +$$ before the prologue), then break at the TWO RETURN addresses and print SET/NO + $t3. +$$ +$$ STEP 0 (do this FIRST, before driving): the +0x218 (return 3) / +0x227 (return 1) offsets +$$ below are from the decomp (step_sphere_down @0x53a210; return 3 @0x53a428; return 1 @0x53a437) +$$ and MUST be verified against the live binary. After attaching, read the log: the `u` output +$$ (below) disassembles the function β€” confirm which addresses load eax=3 vs eax=1 (or jmp to the +$$ shared epilogue) and FIX the two `bp ...+0xNNN` offsets if they differ, then re-attach. +$$ +$$ No qd / no Stop-Process needed if the user closes retail (debuggee exit detaches cdb). +.logopen C:\Users\erikn\source\repos\acdream\.claude\worktrees\thirsty-goldberg-51bb9b\retail-flatfloor-trace.log +.sympath C:\Users\erikn\source\repos\acdream\refs +.symopt+ 0x40 +.reload /f acclient.exe +u acclient!BSPTREE::step_sphere_down L90 +r @$t3 = 0 +bp acclient!BSPTREE::step_sphere_down "r @$t3 = @@c++(((acclient!SPHEREPATH *)poi(@esp+4))->check_pos.objcell_id); gc" +bp acclient!BSPTREE::step_sphere_down+0x218 ".printf \"SET-CP cell=0x%x\\n\", @$t3; gc" +bp acclient!BSPTREE::step_sphere_down+0x227 ".printf \"NO-CP cell=0x%x\\n\", @$t3; gc" +g diff --git a/tools/cdb/retail-lip-trace.cdb b/tools/cdb/retail-lip-trace.cdb new file mode 100644 index 00000000..92280151 --- /dev/null +++ b/tools/cdb/retail-lip-trace.cdb @@ -0,0 +1,13 @@ +$$ Retail cellar-lip trace (2026-06-04). Captures, per CTransition::step_up, +$$ the CARRIED cell (sphere_path.check_pos.objcell_id) + world position +$$ (check_pos.frame.m_fOrigin). Discriminates whether retail's carried cell +$$ STAYS STABLE at the cellar lip (-> acdream's mid-step-up cell-flip is the bug) +$$ or ALTERNATES like acdream (-> the connector-cell slide is the bug). +$$ Auto-detaches (qd) after 150 step_ups so retail keeps running. +.logopen C:\Users\erikn\source\repos\acdream\.claude\worktrees\thirsty-goldberg-51bb9b\retail-lip-trace.log +.sympath C:\Users\erikn\source\repos\acdream\refs +.symopt+ 0x40 +.reload /f acclient.exe +r @$t0 = 0 +bp acclient!CTransition::step_up "r @$t0 = @$t0 + 1; .printf \"--- stepup #%d ---\\n\", @$t0; dt acclient!CTransition @ecx sphere_path.check_pos.objcell_id sphere_path.check_pos.frame.m_fOrigin.x sphere_path.check_pos.frame.m_fOrigin.y sphere_path.check_pos.frame.m_fOrigin.z; .if (@$t0 >= 150) { .printf \"=== DETACH after %d step_ups ===\\n\", @$t0; qd } .else { gc }" +g