per-particle collision profiles need to load correctly on the PT even when there are nullptr particles

#rb cedric.caillaud

[CL 27204769 by michael bao in ue5-main branch]
This commit is contained in:
michael bao
2023-08-18 11:54:04 -04:00
parent c46fadc2d3
commit 21ad9ba0cc
3 changed files with 16 additions and 15 deletions

View File

@@ -3696,18 +3696,17 @@ void FGeometryCollectionPhysicsProxy::UpdatePerParticleFilterData_External(const
{
Chaos::FWritePhysicsObjectInterface_Internal Interface= Chaos::FPhysicsObjectInternalInterface::GetWrite();
int32 ParticleIndex = 0;
for (const FParticleCollisionFilterData& Data : PerParticleData)
{
Chaos::FPhysicsObjectHandle Object = PhysicsObjects[ParticleIndex].Get();
if (Data.bIsValid && Object)
if (Data.bIsValid && Data.ParticleIndex != INDEX_NONE)
{
TArrayView<Chaos::FPhysicsObjectHandle> ParticleView{ &Object, 1 };
Interface.UpdateShapeCollisionFlags(ParticleView, Data.bSimEnabled, Data.bQueryEnabled);
Interface.UpdateShapeFilterData(ParticleView, Data.QueryFilter, Data.SimFilter);
if (Chaos::FPhysicsObjectHandle Object = PhysicsObjects[Data.ParticleIndex].Get())
{
TArrayView<Chaos::FPhysicsObjectHandle> ParticleView{ &Object, 1 };
Interface.UpdateShapeCollisionFlags(ParticleView, Data.bSimEnabled, Data.bQueryEnabled);
Interface.UpdateShapeFilterData(ParticleView, Data.QueryFilter, Data.SimFilter);
}
}
++ParticleIndex;
}
});
}

View File

@@ -447,6 +447,7 @@ public:
struct FParticleCollisionFilterData
{
int32 ParticleIndex = INDEX_NONE;
bool bIsValid = false;
bool bQueryEnabled = false;
bool bSimEnabled = false;

View File

@@ -3514,13 +3514,14 @@ void UGeometryCollectionComponent::LoadCollisionProfiles()
if (Data)
{
PerParticleData.Add(*Data);
Interface->UpdateShapeCollisionFlags(ParticleView, Data->bSimEnabled, Data->bQueryEnabled);
Interface->UpdateShapeFilterData(ParticleView, Data->QueryFilter, Data->SimFilter);
}
else
{
PerParticleData.Add({});
FCollisionProfileDataCache ParticleData = *Data;
ParticleData.ParticleIndex = ParticleIndex;
PerParticleData.Emplace(MoveTemp(ParticleData));
// Need to update on the GT too (physics proxy will just enqueue to do it on the PT) or else the changes won't take effect for GT SQ queries.
Interface->UpdateShapeCollisionFlags(ParticleView, ParticleData.bSimEnabled, ParticleData.bQueryEnabled);
Interface->UpdateShapeFilterData(ParticleView, ParticleData.QueryFilter, ParticleData.SimFilter);
}
}
}