feat(runtime): seal dormant SetPosition evaluations
This commit is contained in:
parent
22651c823d
commit
99f867f053
16 changed files with 2298 additions and 62 deletions
|
|
@ -169,6 +169,7 @@ public static class CellTransit
|
|||
// Retail CEnvCell::find_transit_cells first asks the loaded
|
||||
// neighbour cell whether the sphere intersects its CellBSP.
|
||||
// The portal-plane side test is only the unloaded-cell load hint.
|
||||
RecordUnionOnlyProbe(candidates, otherId);
|
||||
var otherCell = cache.GetCellStruct(otherId);
|
||||
if (otherCell is not null &&
|
||||
CollisionTraversal.HasCellContainment(cache, otherCell))
|
||||
|
|
@ -446,6 +447,7 @@ public static class CellTransit
|
|||
if (portal.OtherPortalId < 0)
|
||||
continue;
|
||||
|
||||
RecordUnionOnlyProbe(candidates, portal.OtherCellId);
|
||||
var otherCell = cache.GetCellStruct(portal.OtherCellId);
|
||||
if (otherCell is null ||
|
||||
!CollisionTraversal.HasCellContainment(cache, otherCell))
|
||||
|
|
@ -679,8 +681,13 @@ public static class CellTransit
|
|||
/// </para>
|
||||
/// </summary>
|
||||
public static uint FindVisibleChildCell(
|
||||
PhysicsDataCache cache, uint startCellId, Vector3 worldPoint, bool useStabList)
|
||||
PhysicsDataCache cache,
|
||||
uint startCellId,
|
||||
Vector3 worldPoint,
|
||||
bool useStabList,
|
||||
ICollection<uint>? probedCells = null)
|
||||
{
|
||||
probedCells?.Add(startCellId);
|
||||
var start = cache.GetCellStruct(startCellId);
|
||||
if (start is null) return 0u;
|
||||
|
||||
|
|
@ -691,12 +698,17 @@ public static class CellTransit
|
|||
{
|
||||
// arg3 != 0 → iterate stab_list, GetVisible + point_in_cell (:311444-311465)
|
||||
foreach (uint id in start.VisibleCellIds)
|
||||
{
|
||||
probedCells?.Add(id);
|
||||
if (PointInCell(cache, cache.GetCellStruct(id), worldPoint)) return id;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// arg3 == 0 → iterate direct portals, GetOtherCell + point_in_cell (:311411-311434)
|
||||
foreach (var portal in start.Portals)
|
||||
{
|
||||
probedCells?.Add(portal.OtherCellId);
|
||||
if (PointInCell(
|
||||
cache,
|
||||
cache.GetCellStruct(portal.OtherCellId),
|
||||
|
|
@ -704,6 +716,7 @@ public static class CellTransit
|
|||
{
|
||||
return portal.OtherCellId;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0u;
|
||||
|
|
@ -1068,7 +1081,11 @@ public static class CellTransit
|
|||
sphereRadius))
|
||||
{
|
||||
uint recovered = FindVisibleChildCell(
|
||||
cache, currentCellId, worldSphereCenter, useStabList: true);
|
||||
cache,
|
||||
currentCellId,
|
||||
worldSphereCenter,
|
||||
useStabList: true,
|
||||
(candidates as CellArray)?.UnionTarget);
|
||||
if (recovered != 0u && recovered != currentCellId)
|
||||
return recovered;
|
||||
}
|
||||
|
|
@ -1078,6 +1095,14 @@ public static class CellTransit
|
|||
return currentCellId;
|
||||
}
|
||||
|
||||
private static void RecordUnionOnlyProbe(
|
||||
ICollection<uint> candidates,
|
||||
uint cellId)
|
||||
{
|
||||
if (candidates is CellArray { UnionTarget: { } queryFootprint })
|
||||
queryFootprint.Add(cellId);
|
||||
}
|
||||
|
||||
private static int EffectiveSphereCount(IReadOnlyList<Sphere> worldSpheres, int numSpheres)
|
||||
{
|
||||
if (numSpheres <= 0 || worldSpheres.Count == 0) return 0;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue