fix(physics): validate retail cell containment roots
This commit is contained in:
parent
7716c2ee89
commit
3e0f3b6206
23 changed files with 429 additions and 197 deletions
|
|
@ -25,14 +25,9 @@ internal static class CollisionTraversal
|
|||
{
|
||||
if (UseFlat(cache))
|
||||
{
|
||||
// Availability is the authored CellStruct payload, not the
|
||||
// containment root. Retail's loaded BSPTREE may have a null
|
||||
// root; BSPNODE::point_inside_cell_bsp treats that base case as
|
||||
// universally inside. A missing flat payload is still a broken
|
||||
// production publication and must fail loudly.
|
||||
_ = cell.FlatContainmentBsp ??
|
||||
FlatCellContainmentBsp flat = cell.FlatContainmentBsp ??
|
||||
throw MissingFlat("cell containment");
|
||||
const bool flatAuthorityResult = true;
|
||||
bool flatAuthorityResult = flat.RootIndex >= 0;
|
||||
CollisionShadowVerifier? flatShadow = cache.CollisionShadow;
|
||||
if (flatShadow is null ||
|
||||
!flatShadow.TrySample(out long flatAuthoritySample))
|
||||
|
|
@ -43,7 +38,7 @@ internal static class CollisionTraversal
|
|||
flatShadow.BeginGraphPass();
|
||||
try
|
||||
{
|
||||
graphRefereeResult = true;
|
||||
graphRefereeResult = cell.CellBSP?.Root is not null;
|
||||
}
|
||||
catch (Exception fault)
|
||||
{
|
||||
|
|
@ -79,16 +74,15 @@ internal static class CollisionTraversal
|
|||
|
||||
CollisionShadowVerifier? shadow = cache.CollisionShadow;
|
||||
if (shadow is null || !shadow.TrySample(out long sample))
|
||||
return true;
|
||||
return cell.CellBSP?.Root is not null;
|
||||
|
||||
bool flatResult = false;
|
||||
Exception? flatFault = null;
|
||||
shadow.BeginFlatPass();
|
||||
try
|
||||
{
|
||||
_ = cell.FlatContainmentBsp ??
|
||||
throw MissingFlat("cell containment");
|
||||
flatResult = true;
|
||||
flatResult = (cell.FlatContainmentBsp ??
|
||||
throw MissingFlat("cell containment")).RootIndex >= 0;
|
||||
}
|
||||
catch (Exception fault)
|
||||
{
|
||||
|
|
@ -99,7 +93,7 @@ internal static class CollisionTraversal
|
|||
shadow.EndFlatPass();
|
||||
}
|
||||
|
||||
const bool graphResult = true;
|
||||
bool graphResult = cell.CellBSP?.Root is not null;
|
||||
if (flatFault is null)
|
||||
{
|
||||
shadow.RecordBoolean(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue