feat(phys): A6.P3 #98 Step 2 — cell-dump probe + roundtrip test
Step 2 of the apparatus plan at C:\Users\erikn\.claude\plans\i-did-some-work-sharded-acorn.md. Adds a one-shot cell-dump probe so the issue #98 replay harness can load real cellar / cottage geometry as JSON fixtures, eliminating live-client iteration from every fix attempt. Probe gate: ACDREAM_DUMP_CELLS=0xA9B40143,0xA9B40146,0xA9B40147 ACDREAM_DUMP_CELLS_DIR=tests/AcDream.Core.Tests/Fixtures/issue98 (default) When set, the first time PhysicsDataCache.CacheCellStruct sees a matching envCellId, it serializes the resulting CellPhysics to <dir>/0x<cellid>.json and prints one [cell-dump] line. Zero cost when unset (gate is a static-readonly IReadOnlySet<uint>.Count check). DTOs (CellDump.cs): - CellDump: top-level record holding cell id, WorldTransform, InverseWorldTransform, resolved polygons, portal polygons, portal infos, visible cell ids. - PolygonDump / PortalDump / Vector3Dto / PlaneDto / Matrix4x4Dto: System.Text.Json-friendly records with explicit From / To converters. What is intentionally NOT dumped: the DAT-native PhysicsBSPTree and CellBSPTree trees. The replay harness drives the leaf-level walkable predicates (WalkableHitsSphere, FindCrossedEdge, PolygonHitsSpherePrecise) directly on the resolved polygon list, which is enough to expose the issue #98 rejection (poly 0x0004 in 0xA9B40143 reports insideEdges=False / overlapsSphere=False at the failing-frame sphere). If a future replay needs BSP traversal we can extend the DTO + Hydrate together without breaking fixtures. Tests (CellDumpRoundTripTests): - Capture → Hydrate preserves WorldTransform / InverseWorldTransform / every polygon's plane + vertices + NumPoints + SidesType. - Capture → Hydrate preserves portal list + visible cell ids. - Write to disk → Read back → Hydrate preserves content. - Hydrate leaves BSP / CellBSP null by design (replay uses leaf-level predicates). Verification: - dotnet build: green, 0 errors. - dotnet test: 1160 passed + 8 pre-existing failed (was 1156 + 8 before this commit; +4 from CellDumpRoundTripTests). Same 8 pre-existing failures, no new regressions. Next: capture the three cells from the live client (Step 2 acceptance), then build the replay harness against the fixtures (Step 3).
This commit is contained in:
parent
35b37dfb5f
commit
f62a873be3
4 changed files with 484 additions and 1 deletions
|
|
@ -164,7 +164,7 @@ public sealed class PhysicsDataCache
|
|||
visibleCellIds.Add(lbPrefix | lowId);
|
||||
}
|
||||
|
||||
_cellStruct[envCellId] = new CellPhysics
|
||||
var cellPhysics = new CellPhysics
|
||||
{
|
||||
BSP = cellStruct.PhysicsBSP,
|
||||
PhysicsPolygons = cellStruct.PhysicsPolygons,
|
||||
|
|
@ -178,6 +178,27 @@ public sealed class PhysicsDataCache
|
|||
PortalPolygons = portalPolygons,
|
||||
VisibleCellIds = visibleCellIds,
|
||||
};
|
||||
_cellStruct[envCellId] = cellPhysics;
|
||||
|
||||
if (PhysicsDiagnostics.ProbeDumpCellsEnabled
|
||||
&& PhysicsDiagnostics.ProbeDumpCellIds.Contains(envCellId))
|
||||
{
|
||||
try
|
||||
{
|
||||
var dump = CellDumpSerializer.Capture(envCellId, cellPhysics);
|
||||
var path = System.IO.Path.Combine(
|
||||
PhysicsDiagnostics.ProbeDumpCellsPath,
|
||||
System.FormattableString.Invariant($"0x{envCellId:X8}.json"));
|
||||
CellDumpSerializer.Write(dump, path);
|
||||
Console.WriteLine(System.FormattableString.Invariant(
|
||||
$"[cell-dump] wrote 0x{envCellId:X8} polys={dump.ResolvedPolygons.Count} portals={dump.Portals.Count} → {path}"));
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine(System.FormattableString.Invariant(
|
||||
$"[cell-dump] FAILED to dump 0x{envCellId:X8}: {ex.GetType().Name}: {ex.Message}"));
|
||||
}
|
||||
}
|
||||
|
||||
if (PhysicsDiagnostics.ProbeCellCacheEnabled)
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue