feat(render): S2 chunk 2 - render statics borrow the registry's retail cell array
WalkProductionWorldData no longer floods; its indoor and outdoor static sweeps read ShadowObjectRegistry.TryGetRetailCellArray (retail's calc_cross_cells_static @0x00515160 -> AddPartsShadow @0x00517e40 CELLARRAY, computed once at registration). The App-owned render flood (ResolveStaticRenderCells, its fingerprint cache, the primitive-Setup special case) and Core's ComputeStaticRenderCells are deleted. The one remaining fallback, an entity the physics publisher has not registered yet while the projection journal already published it, buckets to the authored parent cell and is counted per frame (UnregisteredStaticRenderFallbackCount) for chunk 5 to judge on the connected route. The Facility stair pin now registers at the projection's own entity id (the old pure-function test never carried identity) and reads the retail array; the installed-DAT comparator compares retail against collision. Gates (run in the implementer's isolated worktree at identical content): Release build 0/0; Core Physics 2,202/2,202; App hermetic 6,760/6,760 (the two added WalkProductionWorldData tests); installed-DAT walk/flood/stair family 24/24; Runtime 1,884/1,884. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
parent
2b40c0bb38
commit
707d2803a4
10 changed files with 392 additions and 227 deletions
|
|
@ -92,12 +92,14 @@ public class ShadowObjectRegistryRetailCellArrayTests
|
|||
}
|
||||
|
||||
// -------------------------------------------------------------------
|
||||
// The bbox route is ComputeStaticRenderCells's own primitive, and
|
||||
// supplying a part array never touches the existing collision product.
|
||||
// The bbox route (find_bbox_cell_list 0x00510fc0) is the SAME primitive
|
||||
// the collision flood uses for a single BSP-shape part array fed as both
|
||||
// `shapes` and `partArray`, and supplying a part array never touches the
|
||||
// existing collision product.
|
||||
// -------------------------------------------------------------------
|
||||
|
||||
[Fact]
|
||||
public void RegisterMultiPart_WithPartArray_BoundingBoxRouteMatchesComputeStaticRenderCells()
|
||||
public void RegisterMultiPart_WithPartArray_BoundingBoxRouteMatchesCollisionFloodForTheSamePartArray()
|
||||
{
|
||||
var withPartArray = new ShadowObjectRegistry();
|
||||
var withoutPartArray = new ShadowObjectRegistry();
|
||||
|
|
@ -113,11 +115,16 @@ public class ShadowObjectRegistryRetailCellArrayTests
|
|||
|
||||
Assert.Equal(RetailCellArrayRoute.BoundingBox, withPartArray.GetRetailCellArrayRoute(entityId));
|
||||
Assert.True(withPartArray.TryGetRetailCellArray(entityId, out var retailCells));
|
||||
Assert.NotEmpty(retailCells); // the fixture must actually exercise a flood
|
||||
|
||||
IReadOnlyList<uint> expected =
|
||||
withPartArray.ComputeStaticRenderCells(CellA, Pos, Quaternion.Identity, parts);
|
||||
Assert.Equal(expected, retailCells);
|
||||
Assert.NotEmpty(expected); // the fixture must actually exercise a flood
|
||||
// Retail's bbox route and RegisterMultiPart's own BSP collision
|
||||
// dispatch share one primitive (CPhysicsObj::find_bbox_cell_list
|
||||
// 0x00510fc0) when fed the identical single-part array as both
|
||||
// `shapes` and `partArray`, so the two products agree exactly. This
|
||||
// is the independent ground truth now that ComputeStaticRenderCells
|
||||
// (Campaign OVERHAUL S2 chunk 2) is deleted along with its only
|
||||
// production consumer.
|
||||
Assert.Equal(withPartArray.GetOwnerCells(entityId), retailCells);
|
||||
|
||||
// Supplying a part array must not perturb the pre-existing collision
|
||||
// product — same registration, same result either way.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue