/** * Perform any cleanup of physics engine resources. * This is deferred because when closing down the game, you want to make sure you are not destroying a mesh after the physics SDK has been shut down. */ void DeferredPhysResourceCleanup() { #if WITH_PHYSX // Release all tri meshes and reset array for(int32 MeshIdx=0; MeshIdx<GPhysXPendingKillTriMesh.Num(); MeshIdx++) { PxTriangleMesh* PTriMesh = GPhysXPendingKillTriMesh[MeshIdx]; check(PTriMesh); PTriMesh->release(); GPhysXPendingKillTriMesh[MeshIdx] = NULL; } GPhysXPendingKillTriMesh.Reset(); // Release all convex meshes and reset array for(int32 MeshIdx=0; MeshIdx<GPhysXPendingKillConvex.Num(); MeshIdx++) { PxConvexMesh* PConvexMesh = GPhysXPendingKillConvex[MeshIdx]; check(PConvexMesh); PConvexMesh->release(); GPhysXPendingKillConvex[MeshIdx] = NULL; } GPhysXPendingKillConvex.Reset(); // Release all heightfields and reset array for(int32 HfIdx=0; HfIdx<GPhysXPendingKillHeightfield.Num(); HfIdx++) { PxHeightField* PHeightfield = GPhysXPendingKillHeightfield[HfIdx]; check(PHeightfield); PHeightfield->release(); GPhysXPendingKillHeightfield[HfIdx] = NULL; } GPhysXPendingKillHeightfield.Reset(); // Release all materials and reset array for(int32 MeshIdx=0; MeshIdx<GPhysXPendingKillMaterial.Num(); MeshIdx++) { PxMaterial* PMaterial = GPhysXPendingKillMaterial[MeshIdx]; check(PMaterial); PMaterial->release(); GPhysXPendingKillMaterial[MeshIdx] = NULL; } GPhysXPendingKillMaterial.Reset(); #endif }
/** * Perform any cleanup of physics engine resources. * This is deferred because when closing down the game, you want to make sure you are not destroying a mesh after the physics SDK has been shut down. */ void DeferredPhysResourceCleanup() { #if WITH_PHYSX // Release all tri meshes and reset array for(int32 MeshIdx=0; MeshIdx<GPhysXPendingKillTriMesh.Num(); MeshIdx++) { PxTriangleMesh* PTriMesh = GPhysXPendingKillTriMesh[MeshIdx]; // Check this as it shouldn't be null, but then gate on it so we can // avoid a crash if we end up in this state in shipping check(PTriMesh); if(PTriMesh) { PTriMesh->release(); if(GPhysXPendingKillTriMesh.IsValidIndex(MeshIdx)) { GPhysXPendingKillTriMesh[MeshIdx] = NULL; } else { UE_LOG(LogPhysics, Warning, TEXT("DeferredPhysResourceCleanup found invalid index into GPhysXPendingKillTriMesh, another thread may have modified the array."), MeshIdx); } } else { UE_LOG(LogPhysics, Warning, TEXT("DeferredPhysResourceCleanup found null PxTriangleMesh in pending kill array, another thread may have modified the array."), MeshIdx); } } GPhysXPendingKillTriMesh.Reset(); // Release all convex meshes and reset array for(int32 MeshIdx=0; MeshIdx<GPhysXPendingKillConvex.Num(); MeshIdx++) { PxConvexMesh* PConvexMesh = GPhysXPendingKillConvex[MeshIdx]; // Check this as it shouldn't be null, but then gate on it so we can // avoid a crash if we end up in this state in shipping check(PConvexMesh); if(PConvexMesh) { PConvexMesh->release(); if(GPhysXPendingKillConvex.IsValidIndex(MeshIdx)) { GPhysXPendingKillConvex[MeshIdx] = NULL; } else { UE_LOG(LogPhysics, Warning, TEXT("DeferredPhysResourceCleanup found invalid index into GPhysXPendingKillConvex (%d), another thread may have modified the array."), MeshIdx); } } else { UE_LOG(LogPhysics, Warning, TEXT("DeferredPhysResourceCleanup found null PxConvexMesh in pending kill array (at %d), another thread may have modified the array."), MeshIdx); } } GPhysXPendingKillConvex.Reset(); // Release all heightfields and reset array for(int32 HfIdx=0; HfIdx<GPhysXPendingKillHeightfield.Num(); HfIdx++) { PxHeightField* PHeightfield = GPhysXPendingKillHeightfield[HfIdx]; // Check this as it shouldn't be null, but then gate on it so we can // avoid a crash if we end up in this state in shipping check(PHeightfield); if(PHeightfield) { PHeightfield->release(); if(GPhysXPendingKillHeightfield.IsValidIndex(HfIdx)) { GPhysXPendingKillHeightfield[HfIdx] = NULL; } else { UE_LOG(LogPhysics, Warning, TEXT("DeferredPhysResourceCleanup found invalid index into GPhysXPendingKillHeightfield (%d), another thread may have modified the array."), HfIdx); } } else { UE_LOG(LogPhysics, Warning, TEXT("DeferredPhysResourceCleanup found null PxHeightField in pending kill array (at %d), another thread may have modified the array."), HfIdx); } } GPhysXPendingKillHeightfield.Reset(); // Release all materials and reset array for(int32 MeshIdx=0; MeshIdx<GPhysXPendingKillMaterial.Num(); MeshIdx++) { PxMaterial* PMaterial = GPhysXPendingKillMaterial[MeshIdx]; // Check this as it shouldn't be null, but then gate on it so we can // avoid a crash if we end up in this state in shipping check(PMaterial); if(PMaterial) { PMaterial->release(); if(GPhysXPendingKillMaterial.IsValidIndex(MeshIdx)) { GPhysXPendingKillMaterial[MeshIdx] = NULL; } else { UE_LOG(LogPhysics, Warning, TEXT("DeferredPhysResourceCleanup found invalid index into GPhysXPendingKillMaterial(%d), another thread may have modified the array."), MeshIdx); } } else { UE_LOG(LogPhysics, Warning, TEXT("DeferredPhysResourceCleanup found null PxMaterial in pending kill array (at %d), another thread may have modified the array."), MeshIdx); } } GPhysXPendingKillMaterial.Reset(); #endif }