fix(physics): activate collision generations atomically
This commit is contained in:
parent
3e0f3b6206
commit
be94bc9b06
18 changed files with 1402 additions and 80 deletions
|
|
@ -174,7 +174,14 @@ internal sealed class HeadlessCollisionNeighborhood
|
|||
|
||||
RuntimePhysicsState physics =
|
||||
_runtime.EntityObjects.Physics;
|
||||
PhysicsDataCache cache = physics.DataCache;
|
||||
RuntimeCollisionAdmission admission =
|
||||
physics.BeginCollisionAdmission(landblockId);
|
||||
using PreparedLandblockCollisionGeneration prepared =
|
||||
physics.PrepareCollisionGeneration(admission);
|
||||
prepared.SetAssetClosure(
|
||||
[.. collisions.GfxObjIds],
|
||||
[.. collisions.SetupIds]);
|
||||
PhysicsDataCache cache = prepared.DataCache;
|
||||
TerrainSurface terrain =
|
||||
LandblockPhysicsContentBuilder.BuildTerrainSurface(
|
||||
landblock,
|
||||
|
|
@ -197,12 +204,11 @@ internal sealed class HeadlessCollisionNeighborhood
|
|||
cache,
|
||||
collisions);
|
||||
|
||||
RuntimeCollisionAdmission admission =
|
||||
physics.BeginCollisionAdmission(landblockId);
|
||||
try
|
||||
{
|
||||
physics.AdmitCollisionAssets(
|
||||
physics.StageCollisionAssets(
|
||||
admission,
|
||||
prepared,
|
||||
new RuntimeLandblockCollisionAssets(
|
||||
landblockId,
|
||||
terrain,
|
||||
|
|
@ -213,12 +219,27 @@ internal sealed class HeadlessCollisionNeighborhood
|
|||
currentCellId));
|
||||
_ = LandblockPhysicsContentBuilder
|
||||
.PublishStaticCollision(
|
||||
physics.Engine,
|
||||
prepared.Engine,
|
||||
cache,
|
||||
landblock,
|
||||
collisions,
|
||||
origin);
|
||||
_ = physics.CompleteCollisionAdmission(admission);
|
||||
foreach (uint ownerId in physics.CaptureCollisionDynamicOwners(
|
||||
admission,
|
||||
prepared))
|
||||
{
|
||||
physics.RefreshCollisionDynamicOwner(
|
||||
admission,
|
||||
prepared,
|
||||
ownerId);
|
||||
}
|
||||
RuntimeCollisionGenerationCommit commit =
|
||||
physics.CommitCollisionGeneration(admission, prepared);
|
||||
if (!commit.Committed)
|
||||
{
|
||||
throw new InvalidOperationException(
|
||||
"Headless collision generation changed during synchronous publication.");
|
||||
}
|
||||
_resident.Add(CanonicalLandblock(landblockId));
|
||||
}
|
||||
catch
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue