Don't update cloth colliders every frame

This commit is contained in:
2023-07-16 12:53:59 +02:00
parent 9179586f14
commit adfaf8c961
3 changed files with 20 additions and 4 deletions
+2
View File
@@ -723,6 +723,7 @@ void Cloth::OnPreUpdate()
int32 verticesCount;
if (mesh.Actor->GetMeshData(mesh, MeshBufferType::Vertex0, verticesData, verticesCount))
return;
PROFILE_CPU_NAMED("Skinned Pose");
auto vbStride = (uint32)verticesData.Length() / verticesCount;
ASSERT(vbStride == sizeof(VB0SkinnedElementType));
PhysicsBackend::LockClothParticles(_cloth);
@@ -835,6 +836,7 @@ void Cloth::RunClothDeformer(const MeshBase* mesh, MeshDeformationData& deformat
if ((_simulationSettings.ComputeNormals || deformation.Type == MeshBufferType::Vertex1) &&
meshRef.Actor && !meshRef.Actor->GetMeshData(meshRef, MeshBufferType::Index, indicesData, indicesCount))
{
PROFILE_CPU_NAMED("Normals");
// TODO: optimize memory allocs (eg. use shared allocator)
normals.Resize(vbCount);
Platform::MemoryClear(normals.Get(), vbCount * sizeof(Float3));
+1 -1
View File
@@ -6,7 +6,7 @@
#include "Engine/Level/Actors/ModelInstanceActor.h"
// Used internally to validate cloth data against invalid nan/inf values
#define USE_CLOTH_SANITY_CHECKS (BUILD_DEBUG)
#define USE_CLOTH_SANITY_CHECKS 0
/// <summary>
/// Physical simulation actor for cloth objects made of vertices that are simulated as cloth particles with physical properties, forces, and constraints to affect cloth behavior.
@@ -48,6 +48,7 @@
#include <ThirdParty/NvCloth/NvClothExt/ClothFabricCooker.h>
#define MAX_CLOTH_SPHERE_COUNT 32
#define MAX_CLOTH_PLANE_COUNT 32
#define CLOTH_COLLISIONS_UPDATE_RATE 10 // Frames between cloth collisions updates
#endif
#if WITH_PVD
#include <ThirdParty/PhysX/pvd/PxPvd.h>
@@ -151,6 +152,8 @@ struct FabricSettings
struct ClothSettings
{
bool SceneCollisions = false;
byte CollisionsUpdateFramesLeft = 0;
bool CollisionsUpdateFramesRandomize = true;
float GravityScale = 1.0f;
float CollisionThickness = 0.0f;
Cloth* Actor;
@@ -1425,7 +1428,7 @@ void PhysicsBackend::EndSimulateScene(void* scene)
// TODO: jobify to run in async (eg. with vehicles update and events setup)
{
PROFILE_CPU_NAMED("Collisions");
PROFILE_CPU_NAMED("Pre");
const bool hitTriggers = false;
const bool blockSingle = false;
PxQueryFilterData filterData;
@@ -1435,12 +1438,20 @@ void PhysicsBackend::EndSimulateScene(void* scene)
for (int32 i = 0; i < clothsCount; i++)
{
auto clothPhysX = (nv::cloth::Cloth*)cloths[i];
const auto& clothSettings = Cloths[clothPhysX];
auto& clothSettings = Cloths[clothPhysX];
clothSettings.Actor->OnPreUpdate();
// Setup automatic scene collisions with colliders around the cloth
if (clothSettings.SceneCollisions)
if (clothSettings.SceneCollisions && clothSettings.CollisionsUpdateFramesLeft == 0)
{
PROFILE_CPU_NAMED("Collisions");
clothSettings.CollisionsUpdateFramesLeft = CLOTH_COLLISIONS_UPDATE_RATE;
if (clothSettings.CollisionsUpdateFramesRandomize)
{
clothSettings.CollisionsUpdateFramesRandomize = false;
clothSettings.CollisionsUpdateFramesLeft = i % CLOTH_COLLISIONS_UPDATE_RATE;
}
// Reset existing colliders
clothPhysX->setSpheres(nv::cloth::Range<const PxVec4>(), 0, clothPhysX->getNumSpheres());
clothPhysX->setPlanes(nv::cloth::Range<const PxVec4>(), 0, clothPhysX->getNumPlanes());
@@ -1587,6 +1598,7 @@ void PhysicsBackend::EndSimulateScene(void* scene)
}
}
}
clothSettings.CollisionsUpdateFramesLeft--;
}
}
@@ -3475,6 +3487,7 @@ void PhysicsBackend::SetClothCollisionSettings(void* cloth, const void* settings
clothPhysX->setPlanes(nv::cloth::Range<const PxVec4>(), 0, clothPhysX->getNumPlanes());
clothPhysX->setTriangles(nv::cloth::Range<const PxVec3>(), 0, clothPhysX->getNumTriangles());
}
clothSettings.CollisionsUpdateFramesLeft = 0;
clothSettings.SceneCollisions = settings.SceneCollisions;
clothSettings.CollisionThickness = settings.CollisionThickness;
}
@@ -3536,6 +3549,7 @@ void PhysicsBackend::SetClothTransform(void* cloth, const Transform& transform,
clothPhysX->setRotation(C2P(transform.Orientation));
}
const auto& clothSettings = Cloths[clothPhysX];
clothSettings.CollisionsUpdateFramesLeft = 0;
clothSettings.UpdateBounds(clothPhysX);
}