UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
PBDSoftBodyCollisionConstraint.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"
13
14#if !defined(CHAOS_PER_PARTICLE_COLLISION_ISPC_ENABLED_DEFAULT)
15#define CHAOS_PER_PARTICLE_COLLISION_ISPC_ENABLED_DEFAULT 1
16#endif
17
18// Support run-time toggling on supported platforms in non-shipping configurations
19#if !INTEL_ISPC || UE_BUILD_SHIPPING
21#else
23#endif
24
25namespace Chaos::Softs
26{
37
39{
40public:
41 static constexpr bool bDefaultUsePlanarConstraintForSimpleColliders = false;
43
48 bool bInUseCCD,
53 TArray<FSolverReal>* InPhis = nullptr,
55 bool bInEnableSimpleColliders = true,
56 bool bInEnableComplexColliders = true,
60 )
75 , Phis(InPhis)
77 {}
78
80
81 // Follow planar constraint settings and either generate or apply planar constraints if requested.
83
84 // Ignore planar constraint settings and do a full collision detection and apply impulses
85 CHAOS_API void Apply(FSolverParticlesRange& Particles, const FSolverReal Dt, const TArray<FSolverCollisionParticlesRange>& CollisionParticles);
86
88
90 {
92 {
93 if (Iter.Key().RangeId == CollisionRangeId)
94 {
95 Iter.RemoveCurrent();
96 }
97 }
98 }
99
100private:
101
102 template<bool bLockAndWriteContacts, bool bWithFriction, bool bGeneratePlanarConstraints>
103 void ApplySimpleInternal(FSolverParticlesRange& Particles, const FSolverReal Dt, const TArray<FSolverCollisionParticlesRange>& CollisionParticles);
104 template<bool bLockAndWriteContacts, bool bWithFriction, bool bGeneratePlanarConstraints>
105 void ApplyComplexInternal(FSolverParticlesRange& Particles, const FSolverReal Dt, const TArray<FSolverCollisionParticlesRange>& CollisionParticles);
106 template<bool bLockAndWriteContacts, bool bWithFriction>
107 void ApplyInternalCCD(FSolverParticlesRange& Particles, const FSolverReal Dt, const TArray<FSolverCollisionParticlesRange>& CollisionParticles) const;
108#if INTEL_ISPC
111#endif
112 void InitPlanarConstraints(const FSolverParticlesRange& Particles, bool bWithFriction);
113 void FinalizePlanarConstraints(const FSolverParticlesRange& Particles);
114 void ApplyPlanarConstraints(FSolverParticlesRange& Particles, const FSolverReal Dt);
115
116protected:
122 FSolverReal ProximityStiffness; // Used by force-based solver
127
128 TMap<FParticleRangeIndex, FPBDComplexColliderBoneData> ComplexBoneData; // Used to determine Velocity Bones for Skinned LevelSets.
129
132 TArray<bool>* const CollisionParticleCollided; // Per collision particle
133 // List of contact data
138
152
153private:
154
155 // These arrays are used to do batch PhiAndNormal queries. They live here so they don't need to be reallocated each frame.
156 TArray<bool> HasPlanarData;
157 TArray<FSolverVec3> PlanarDataPositions;
158 TArray<FSolverVec3> PlanarDataNormals;
159 TArray<FSolverVec3> PlanarDataVelocities;
160
161 TArray<FSolverReal> BatchPhis;
162 TArray<FSolverVec3> BatchNormals;
163 TArray<int32> BatchVelocityBones;
164};
165
166
168{
170
171public:
176
184 TArray<FSolverReal>* InPhis = nullptr,
189 GetUseCCD(PropertyCollection, false),
198 )
199 , MeshScale(InMeshScale)
209 {}
210
212
213private:
214 const FSolverReal MeshScale;
215
225};
226
227} // End namespace Chaos::Softs
#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
UE::FPlatformRecursiveMutex FCriticalSection
Definition CriticalSection.h:53
return true
Definition ExternalRpcRegistry.cpp:601
#define CHAOS_PER_PARTICLE_COLLISION_ISPC_ENABLED_DEFAULT
Definition PBDSoftBodyCollisionConstraint.h:15
const bool bChaos_SoftBodyCollision_ISPC_Enabled
Definition PBDSoftBodyCollisionConstraint.h:20
Definition CollectionPropertyFacade.h:49
Definition SoftsEvolutionLinearSystem.h:45
Definition PBDPlanarConstraints.h:12
TArray< FSolverVec3 > TargetNormals
Definition PBDPlanarConstraints.h:50
TArray< int32 > UniqueConstraintIndices
Definition PBDPlanarConstraints.h:48
TArray< FSolverVec3 > TargetPositions
Definition PBDPlanarConstraints.h:49
TArray< FSolverVec3 > TargetVelocities
Definition PBDPlanarConstraints.h:51
Definition PBDSoftBodyCollisionConstraint.h:39
FPBDSoftBodyCollisionConstraintBase(const TArray< FSolverRigidTransform3 > &InLastCollisionTransforms, FSolverReal InCollisionThickness, FSolverReal InFrictionCoefficient, bool bInUseCCD, FSolverReal InProximityStiffness, TArray< bool > *InCollisionParticleCollided=nullptr, TArray< FSolverVec3 > *InContacts=nullptr, TArray< FSolverVec3 > *InNormals=nullptr, TArray< FSolverReal > *InPhis=nullptr, const FSolverReal InSoftBodyCollisionThickness=0.f, bool bInEnableSimpleColliders=true, bool bInEnableComplexColliders=true, bool bInUsePlanarConstraintForSimpleColliders=bDefaultUsePlanarConstraintForSimpleColliders, bool bInUsePlanarConstraintForComplexColliders=bDefaultUsePlanarConstraintForComplexColliders, const TMap< FParticleRangeIndex, FPBDComplexColliderBoneData > &InComplexBoneData=TMap< FParticleRangeIndex, FPBDComplexColliderBoneData >())
Definition PBDSoftBodyCollisionConstraint.h:44
void OnCollisionRangeRemoved(int32 CollisionRangeId)
Definition PBDSoftBodyCollisionConstraint.h:89
FSolverReal ProximityStiffness
Definition PBDSoftBodyCollisionConstraint.h:122
TArray< FSolverVec3 > *const Normals
Definition PBDSoftBodyCollisionConstraint.h:135
TArray< FSolverVec3 > *const Contacts
Definition PBDSoftBodyCollisionConstraint.h:134
TArray< bool > *const CollisionParticleCollided
Definition PBDSoftBodyCollisionConstraint.h:132
CHAOS_API void Apply(FSolverParticlesRange &Particles, const FSolverReal Dt, const TArray< FSolverCollisionParticlesRange > &CollisionParticles)
Definition PBDSoftBodyCollisionConstraint.cpp:316
TMap< FParticleRangeIndex, FPBDComplexColliderBoneData > ComplexBoneData
Definition PBDSoftBodyCollisionConstraint.h:128
bool bUsePlanarConstraintForSimpleColliders
Definition PBDSoftBodyCollisionConstraint.h:125
FSolverReal FrictionCoefficient
Definition PBDSoftBodyCollisionConstraint.h:120
bool bWriteDebugContacts
Definition PBDSoftBodyCollisionConstraint.h:131
bool bUsePlanarConstraintForComplexColliders
Definition PBDSoftBodyCollisionConstraint.h:126
void SetWriteDebugContacts(bool bWrite)
Definition PBDSoftBodyCollisionConstraint.h:79
CHAOS_API void UpdateLinearSystem(const FSolverParticlesRange &Particles, const FSolverReal Dt, const TArray< FSolverCollisionParticlesRange > &CollisionParticles, FEvolutionLinearSystem &LinearSystem) const
Definition PBDSoftBodyCollisionConstraint.cpp:1216
FSolverReal SoftBodyCollisionThickness
Definition PBDSoftBodyCollisionConstraint.h:119
TArray< FSolverReal > *const Phis
Definition PBDSoftBodyCollisionConstraint.h:136
Chaos::Softs::FPBDSoftBodyCollisionConstraintBase::FPBDSoftBodyCollisionPlanarConstraint PlanarConstraint
static constexpr bool bDefaultUsePlanarConstraintForComplexColliders
Definition PBDSoftBodyCollisionConstraint.h:42
static constexpr bool bDefaultUsePlanarConstraintForSimpleColliders
Definition PBDSoftBodyCollisionConstraint.h:41
bool bEnableComplexColliders
Definition PBDSoftBodyCollisionConstraint.h:124
bool bUseCCD
Definition PBDSoftBodyCollisionConstraint.h:121
bool bEnableSimpleColliders
Definition PBDSoftBodyCollisionConstraint.h:123
FSolverReal CollisionThickness
Definition PBDSoftBodyCollisionConstraint.h:118
const TArray< FSolverRigidTransform3 > & LastCollisionTransforms
Definition PBDSoftBodyCollisionConstraint.h:117
FCriticalSection DebugMutex
Definition PBDSoftBodyCollisionConstraint.h:137
CHAOS_API void ApplyWithPlanarConstraints(FSolverParticlesRange &Particles, const FSolverReal Dt, const TArray< FSolverCollisionParticlesRange > &CollisionParticles, bool bGeneratePlanarConstraints)
Definition PBDSoftBodyCollisionConstraint.cpp:107
Definition PBDSoftBodyCollisionConstraint.h:168
CHAOS_API void SetProperties(const FCollectionPropertyConstFacade &PropertyCollection)
Definition PBDSoftBodyCollisionConstraint.cpp:1278
static constexpr FSolverReal DefaultSoftBodyCollisionThickness
Definition PBDSoftBodyCollisionConstraint.h:173
static constexpr FSolverReal DefaultCollisionThickness
Definition PBDSoftBodyCollisionConstraint.h:172
FPBDSoftBodyCollisionConstraint(const TArray< FSolverRigidTransform3 > &InLastCollisionTransforms, const FCollectionPropertyConstFacade &PropertyCollection, FSolverReal InMeshScale, TArray< bool > *InCollisionParticleCollided=nullptr, TArray< FSolverVec3 > *InContacts=nullptr, TArray< FSolverVec3 > *InNormals=nullptr, TArray< FSolverReal > *InPhis=nullptr, const TMap< FParticleRangeIndex, FPBDComplexColliderBoneData > &InComplexBoneData=TMap< FParticleRangeIndex, FPBDComplexColliderBoneData >())
Definition PBDSoftBodyCollisionConstraint.h:177
static constexpr FSolverReal DefaultProximityStiffness
Definition PBDSoftBodyCollisionConstraint.h:175
static constexpr FSolverReal DefaultFrictionCoefficient
Definition PBDSoftBodyCollisionConstraint.h:174
Definition SoftsSolverParticlesRange.h:12
Definition Array.h:670
Definition UnrealString.h.inl:34
Definition CollectionEmbeddedSpringConstraintFacade.cpp:6
FRealSingle FSolverReal
Definition PBDSoftsEvolutionFwd.h:31
@ false
Definition radaudio_common.h:23
Definition PBDSoftBodyCollisionConstraint.h:28
TConstArrayView< FSolverRotation3 > R
Definition PBDSoftBodyCollisionConstraint.h:34
TConstArrayView< FSolverVec3 > V
Definition PBDSoftBodyCollisionConstraint.h:33
TConstArrayView< int32 > MappedBoneIndices
Definition PBDSoftBodyCollisionConstraint.h:30
TConstArrayView< FSolverVec3 > X
Definition PBDSoftBodyCollisionConstraint.h:32
TConstArrayView< FSolverVec3 > W
Definition PBDSoftBodyCollisionConstraint.h:35
TArray< int32 > & GetUniqueConstraintIndices()
Definition PBDSoftBodyCollisionConstraint.h:147
TArray< FSolverVec3 > & GetTargetNormals()
Definition PBDSoftBodyCollisionConstraint.h:149
TArray< FSolverVec3 > & GetTargetVelocities()
Definition PBDSoftBodyCollisionConstraint.h:150
FPBDSoftBodyCollisionPlanarConstraint(const FSolverReal InFriction)
Definition PBDSoftBodyCollisionConstraint.h:143
TArray< FSolverVec3 > & GetTargetPositions()
Definition PBDSoftBodyCollisionConstraint.h:148