void UDestructibleComponent::AddRadialForce(FVector Origin, float Radius, float Strength, ERadialImpulseFalloff Falloff, bool bAccelChange /* = false */) { #if WITH_APEX if(bIgnoreRadialForce) { return; } if (ApexDestructibleActor == NULL) { return; } PxRigidDynamic** PActorBuffer = NULL; PxU32 PActorCount = 0; if (ApexDestructibleActor->acquirePhysXActorBuffer(PActorBuffer, PActorCount, NxDestructiblePhysXActorQueryFlags::Dynamic)) { PxScene* LockedScene = NULL; while (PActorCount--) { PxRigidDynamic* PActor = *PActorBuffer++; if (PActor != NULL) { if (!LockedScene) { LockedScene = PActor->getScene(); LockedScene->lockWrite(); LockedScene->lockRead(); } AddRadialForceToPxRigidBody_AssumesLocked(*PActor, Origin, Radius, Strength, Falloff, bAccelChange); } if (LockedScene) { LockedScene->unlockRead(); LockedScene->unlockWrite(); LockedScene = NULL; } } ApexDestructibleActor->releasePhysXActorBuffer(); } #endif // #if WITH_APEX }
void UDestructibleComponent::SetCollisionResponseForAllActors(const FCollisionResponseContainer& ResponseOverride) { #if WITH_APEX if (ApexDestructibleActor == NULL) { return; } PxRigidDynamic** PActorBuffer = NULL; PxU32 PActorCount = 0; if (ApexDestructibleActor->acquirePhysXActorBuffer(PActorBuffer, PActorCount)) { PxScene* LockedScene = NULL; while (PActorCount--) { PxRigidDynamic* PActor = *PActorBuffer++; if (PActor != NULL) { FDestructibleChunkInfo* ChunkInfo = FPhysxUserData::Get<FDestructibleChunkInfo>(PActor->userData); if (ChunkInfo != NULL) { if (!LockedScene) { LockedScene = PActor->getScene(); LockedScene->lockWrite(); LockedScene->lockRead(); } SetCollisionResponseForActor(PActor, ChunkInfo->ChunkIndex, &ResponseOverride); // ChunkIndex is the last chunk made visible. But SetCollisionResponseForActor already doesn't respect per-chunk collision properties. } } } if (LockedScene) { LockedScene->unlockRead(); LockedScene->unlockWrite(); LockedScene = NULL; } ApexDestructibleActor->releasePhysXActorBuffer(); } #endif }