UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
PBDKinematicTriangleMeshCollisions.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
4#include "Chaos/Core.h"
11#include "Chaos/ImplicitFwd.h"
12
13namespace Chaos::Softs
14{
16 {
17 public:
19
34
35 void Reset()
36 {
37 CollidingParticles.Reset();
38 CollidingElements.Reset();
40 }
41
50
59
64
69
70 CHAOS_API void Init(const FSolverParticlesRange& Particles, const FSolverReal Dt);
71
73
74 const TArray<int32>& GetCollidingParticles() const { return CollidingParticles; }
76 const TArray<TMap<int32, FSolverReal>>& GetTimers() const { return Timers; }
77 const FTriangleMesh* GetTriangleMesh() const { return TriangleMesh; }
78 protected:
83
85
86 const FTriangleMesh* TriangleMesh = nullptr;
91
92 private:
93
94 // Parallel arrays (for ISPC SOA)
95 TArray<int32> CollidingParticles;
97
98 TArray<TMap<int32, FSolverReal>> Timers; // Keep constraints for a cvar-defined time after it's moved out of proximity. Helps reduce jitter.
99 };
100
102 {
103 public:
121
122 void SetGeometryAndInit(const FSolverParticlesRange& Particles, const FSolverReal Dt)
123 {
124 if (SkinnedTriangleMesh)
125 {
126 SetGeometry(SkinnedTriangleMesh->GetTriangleMesh(), SkinnedTriangleMesh->GetLocalPositions(), TConstArrayView<FSolverVec3>(Velocities), SkinnedTriangleMesh->GetSpatialHierarchy());
127 Init(Particles, Dt);
128 }
129 }
130
131 private:
132 const FSkinnedTriangleMeshPtr SkinnedTriangleMesh;
133 const TArray<FSolverVec3>& Velocities;
134 };
135
137 {
138 public:
141
161
162 void AddSkinnedTriangleMesh(const FParticleRangeIndex& Index, const FSkinnedTriangleMeshPtr& SkinnedTriangleMesh, const TArray<FSolverVec3>& Velocities)
163 {
164 Collisions.Emplace(Index, FPBDSkinnedTriangleMeshCollisions(NumParticles, SkinnedTriangleMesh, Velocities, ClothCollisionThickness, FrictionCoefficient, CollisionThickness));
165 }
166
167 void Init(const FSolverParticlesRange& Particles, const FSolverReal Dt)
168 {
169 if (!bEnableSkinnedTriangleMeshCollisions)
170 {
171 return;
172 }
173 for (TMap<FParticleRangeIndex, FPBDSkinnedTriangleMeshCollisions>::TIterator Iter = Collisions.CreateIterator(); Iter; ++Iter)
174 {
175 Iter.Value().SetGeometryAndInit(Particles, Dt);
176 }
177 }
178
180 {
181 if (!bEnableSkinnedTriangleMeshCollisions)
182 {
183 return;
184 }
185 for (TMap<FParticleRangeIndex, FPBDSkinnedTriangleMeshCollisions>::TConstIterator Iter = Collisions.CreateConstIterator(); Iter; ++Iter)
186 {
187 Iter.Value().Apply(InParticles, Dt);
188 }
189 }
190
192 const TMap<FString, TConstArrayView<FRealSingle>>& WeightMaps)
193 {
195 {
196 bEnableSkinnedTriangleMeshCollisions = GetEnableSkinnedTriangleMeshCollisions(PropertyCollection);
197 }
199 {
200 bUseSelfCollisionSubstepsForSkinnedTriangleMeshes = GetUseSelfCollisionSubstepsForSkinnedTriangleMeshes(PropertyCollection);
201 }
203 {
206 {
208 ClothCollisionThickness = FPBDFlatWeightMap(WeightedValue, WeightMaps.FindRef(WeightMapName), NumParticles);
209 }
210 else
211 {
212 ClothCollisionThickness.SetWeightedValue(WeightedValue);
213 }
214 }
215
217 {
218 const FSolverVec2 WeightedValue = FSolverVec2(GetWeightedFloatFrictionCoefficient(PropertyCollection)).ClampAxes(0.f, 1.f);
220 {
222 FrictionCoefficient = FPBDFlatWeightMap(WeightedValue, WeightMaps.FindRef(WeightMapName), NumParticles);
223 }
224 else
225 {
226 FrictionCoefficient.SetWeightedValue(WeightedValue);
227 }
228 }
230 {
231 CollisionThickness = FMath::Max(GetCollisionThickness(PropertyCollection), 0.f);
232 for (TMap<FParticleRangeIndex, FPBDSkinnedTriangleMeshCollisions>::TIterator Iter = Collisions.CreateIterator(); Iter; ++Iter)
233 {
234 Iter.Value().SetColliderThickness(CollisionThickness);
235 }
236 }
237 }
238
240 {
241 for (TMap<FParticleRangeIndex, FPBDSkinnedTriangleMeshCollisions>::TIterator Iter = Collisions.CreateIterator(); Iter; ++Iter)
242 {
243 if (Iter.Key().RangeId == CollisionRangeId)
244 {
245 Iter.RemoveCurrent();
246 }
247 }
248 }
249
251 {
252 return bUseSelfCollisionSubstepsForSkinnedTriangleMeshes;
253 }
254
255 bool IsEnabled() const
256 {
257 return bEnableSkinnedTriangleMeshCollisions;
258 }
259
261 {
262 return CollisionThickness;
263 }
264
266 {
267 return FMath::Max(ClothCollisionThickness.GetLow(), ClothCollisionThickness.GetHigh());
268 }
269
270 private:
271 int32 NumParticles;
272 FPBDFlatWeightMap ClothCollisionThickness;
273 FPBDFlatWeightMap FrictionCoefficient;
274 FSolverReal CollisionThickness;
275 bool bEnableSkinnedTriangleMeshCollisions = true;
276 bool bUseSelfCollisionSubstepsForSkinnedTriangleMeshes = true;
277
279
282 UE_CHAOS_DECLARE_PROPERTYCOLLECTION_NAME(ClothCollisionThickness, float);
283 UE_CHAOS_DECLARE_PROPERTYCOLLECTION_NAME(FrictionCoefficient, float);
284 UE_CHAOS_DECLARE_PROPERTYCOLLECTION_NAME(CollisionThickness, float);
285
286 };
287
288} // End namespace Chaos::Softs
289
290#if !defined(CHAOS_KINEMATIC_TRIANGLE_COLLISIONS_ISPC_ENABLED_DEFAULT)
291#define CHAOS_KINEMATIC_TRIANGLE_COLLISIONS_ISPC_ENABLED_DEFAULT 1
292#endif
293
294// Support ISPC enable/disable in non-shipping builds
295#if !INTEL_ISPC || UE_BUILD_SHIPPING
296static constexpr bool bChaos_KinematicTriangleMesh_ISPC_Enabled = INTEL_ISPC && CHAOS_KINEMATIC_TRIANGLE_COLLISIONS_ISPC_ENABLED_DEFAULT;
297#else
298extern CHAOS_API bool bChaos_KinematicTriangleMesh_ISPC_Enabled;
299#endif
#define check(expr)
Definition AssertionMacros.h:314
#define UE_CHAOS_DECLARE_PROPERTYCOLLECTION_NAME(PropertyName, Type)
Definition CollectionPropertyFacade.h:969
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
return true
Definition ExternalRpcRegistry.cpp:601
void Init()
Definition LockFreeList.h:4
#define CHAOS_KINEMATIC_TRIANGLE_COLLISIONS_ISPC_ENABLED_DEFAULT
Definition PBDKinematicTriangleMeshCollisions.h:291
Definition TriangleMesh.h:24
Definition CollectionPropertyFacade.h:49
Definition PBDFlatWeightMap.h:98
FSolverReal GetHigh() const
Definition PBDFlatWeightMap.h:159
FSolverReal GetLow() const
Definition PBDFlatWeightMap.h:156
void SetWeightedValue(const FSolverVec2 &InWeightedValue)
Definition PBDFlatWeightMap.h:142
bool HasWeightMap() const
Definition PBDFlatWeightMap.h:137
int32 Num() const
Definition PBDFlatWeightMap.h:134
Definition PBDKinematicTriangleMeshCollisions.h:16
const FPBDFlatWeightMap & Thickness
Definition PBDKinematicTriangleMeshCollisions.h:80
CHAOS_API void Apply(FSolverParticlesRange &InParticles, const FSolverReal Dt) const
Definition PBDKinematicTriangleMeshCollisions.cpp:143
TConstArrayView< FPAndInvM > PAndInvM
Definition PBDKinematicTriangleMeshCollisions.h:88
void SetGeometry(const FTriangleMesh &InTriangleMesh, const TConstArrayView< FSolverVec3 > &InPositions, const TConstArrayView< FSolverVec3 > &InVelocities, const FTriangleMesh::TSpatialHashType< FSolverReal > &InSpatialHash)
Definition PBDKinematicTriangleMeshCollisions.h:42
const FTriangleMesh * GetTriangleMesh() const
Definition PBDKinematicTriangleMeshCollisions.h:77
const FTriangleMesh::TSpatialHashType< FSolverReal > * SpatialHash
Definition PBDKinematicTriangleMeshCollisions.h:90
static constexpr int32 MaxKinematicConnectionsPerPoint
Definition PBDKinematicTriangleMeshCollisions.h:18
void SetGeometry(const FTriangleMesh &InTriangleMesh, const TConstArrayView< FSolverVec3 > &InPositions, const TConstArrayView< FPAndInvM > &InPAndInvM, const TConstArrayView< FSolverVec3 > &InVelocities, const FTriangleMesh::TSpatialHashType< FSolverReal > &InSpatialHash)
Definition PBDKinematicTriangleMeshCollisions.h:51
FSolverReal Stiffness
Definition PBDKinematicTriangleMeshCollisions.h:82
const TArray< TMap< int32, FSolverReal > > & GetTimers() const
Definition PBDKinematicTriangleMeshCollisions.h:76
const TArray< int32 > & GetCollidingParticles() const
Definition PBDKinematicTriangleMeshCollisions.h:74
TConstArrayView< FSolverVec3 > Velocities
Definition PBDKinematicTriangleMeshCollisions.h:89
void Reset()
Definition PBDKinematicTriangleMeshCollisions.h:35
FSolverReal ColliderThickness
Definition PBDKinematicTriangleMeshCollisions.h:84
const TArray< TVector< int32, MaxKinematicConnectionsPerPoint > > & GetCollidingElements() const
Definition PBDKinematicTriangleMeshCollisions.h:75
const FTriangleMesh * TriangleMesh
Definition PBDKinematicTriangleMeshCollisions.h:86
TConstArrayView< FSolverVec3 > Positions
Definition PBDKinematicTriangleMeshCollisions.h:87
void SetStiffness(const FSolverReal InStiffness)
Definition PBDKinematicTriangleMeshCollisions.h:60
FPBDKinematicTriangleMeshCollisions(int32 InNumParticles, const FPBDFlatWeightMap &InThickness, const FPBDFlatWeightMap &InFrictionCoefficient, const FSolverReal InStiffness, const FSolverReal InColliderThickness)
Definition PBDKinematicTriangleMeshCollisions.h:20
void SetColliderThickness(const FSolverReal InColliderThickness)
Definition PBDKinematicTriangleMeshCollisions.h:65
int32 NumParticles
Definition PBDKinematicTriangleMeshCollisions.h:79
const FPBDFlatWeightMap & FrictionCoefficient
Definition PBDKinematicTriangleMeshCollisions.h:81
Definition PBDKinematicTriangleMeshCollisions.h:137
static constexpr FSolverReal DefaultFrictionCoefficient
Definition PBDKinematicTriangleMeshCollisions.h:140
bool GetUseSelfCollisionSubstepsForSkinnedTriangleMeshes() const
Definition PBDKinematicTriangleMeshCollisions.h:250
FPBDSkinnedTriangleMeshCollisionConstraints(int32 InNumParticles, const TMap< FString, TConstArrayView< FRealSingle > > &WeightMaps, const FCollectionPropertyConstFacade &PropertyCollection)
Definition PBDKinematicTriangleMeshCollisions.h:142
FSolverReal GetMaxClothCollisionThickness() const
Definition PBDKinematicTriangleMeshCollisions.h:265
void AddSkinnedTriangleMesh(const FParticleRangeIndex &Index, const FSkinnedTriangleMeshPtr &SkinnedTriangleMesh, const TArray< FSolverVec3 > &Velocities)
Definition PBDKinematicTriangleMeshCollisions.h:162
void Apply(FSolverParticlesRange &InParticles, const FSolverReal Dt) const
Definition PBDKinematicTriangleMeshCollisions.h:179
void OnCollisionRangeRemoved(int32 CollisionRangeId)
Definition PBDKinematicTriangleMeshCollisions.h:239
FSolverReal GetCollisionThickness() const
Definition PBDKinematicTriangleMeshCollisions.h:260
void Init(const FSolverParticlesRange &Particles, const FSolverReal Dt)
Definition PBDKinematicTriangleMeshCollisions.h:167
static constexpr FSolverReal DefaultClothCollisionThickness
Definition PBDKinematicTriangleMeshCollisions.h:139
void SetProperties(const FCollectionPropertyConstFacade &PropertyCollection, const TMap< FString, TConstArrayView< FRealSingle > > &WeightMaps)
Definition PBDKinematicTriangleMeshCollisions.h:191
bool IsEnabled() const
Definition PBDKinematicTriangleMeshCollisions.h:255
Definition PBDKinematicTriangleMeshCollisions.h:102
void SetGeometryAndInit(const FSolverParticlesRange &Particles, const FSolverReal Dt)
Definition PBDKinematicTriangleMeshCollisions.h:122
FPBDSkinnedTriangleMeshCollisions(int32 InNumParticles, const FSkinnedTriangleMeshPtr &InSkinnedTriangleMesh, const TArray< FSolverVec3 > &InVelocities, const FPBDFlatWeightMap &InThickness, const FPBDFlatWeightMap &InFrictionCoefficient, const FSolverReal InColliderThickness)
Definition PBDKinematicTriangleMeshCollisions.h:104
Definition SoftsSolverParticlesRange.h:12
Definition HierarchicalSpatialHash.h:214
Definition Array.h:670
void Reset(SizeType NewSize=0)
Definition Array.h:2246
void Init(const ElementType &Element, SizeType Number)
Definition Array.h:3043
Definition UnrealString.h.inl:34
Definition RefCounting.h:454
Definition CollectionEmbeddedSpringConstraintFacade.cpp:6
TVector< FSolverReal, 2 > FSolverVec2
Definition PBDSoftsEvolutionFwd.h:32
FRealSingle FSolverReal
Definition PBDSoftsEvolutionFwd.h:31
U16 Index
Definition radfft.cpp:71
Definition ParticlesRange.h:12