UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
PBDCollisionSpringConstraintsBase.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
4#if !COMPILE_WITHOUT_UNREAL_SUPPORT
5#include "Chaos/Core.h"
11#include "Containers/Set.h"
12
13
14namespace Chaos
15{
16 class FTriangleMesh;
17}
18
19namespace Chaos::Softs
20{
21
22// This is an invertible spring class, typical springs are not invertible aware
24{
25public:
33
35 const int32 InOffset,
46 const bool bInOnlyCollideKinematics = false,
51
53
58
59 template<typename SpatialAccelerator, typename SolverParticlesOrRange>
60 UE_DEPRECATED(5.4, "Use Init with CollidableSubMesh. This method is much less efficient as it recreates the CollidableSubMesh each call.")
61 CHAOS_API void Init(const SolverParticlesOrRange& Particles, const SpatialAccelerator& Spatial, const TConstArrayView<FPBDTriangleMeshCollisions::FGIAColor>& VertexGIAColors, const TArray<FPBDTriangleMeshCollisions::FGIAColor>& TriangleGIAColors);
62
64 CHAOS_API void Init(const SolverParticlesOrRange& Particles, const FSolverReal Dt, const FPBDTriangleMeshCollisions::FTriangleSubMesh& CollidableSubMesh,
65 const SpatialAccelerator& DynamicSpatial, const SpatialAccelerator& KinematicColliderSpatial, const TConstArrayView<FPBDTriangleMeshCollisions::FGIAColor>& VertexGIAColors, const TArray<FPBDTriangleMeshCollisions::FGIAColor>& TriangleGIAColors);
66
69
70 const TArray<TVec4<int32>>& GetConstraints() const
71 {
72 return Constraints;
73 }
75 {
76 return Barys;
77 }
78
79 UE_DEPRECATED(5.4, "Thickness is now weighted.")
81
83 FSolverReal GetParticleThickness(int32 ParticleIndex) const { return ThicknessWeighted.GetValue(ParticleIndex - Offset); }
85
86 bool GetGlobalIntersectionAnalysis() const { return bGlobalIntersectionAnalysis; }
88 {
89 return FlipNormal;
90 }
91
95 const FTriangleMesh& GetTriangleMesh() const { return TriangleMesh; }
96
99
100 template<typename SolverParticlesOrRange>
101 void Apply(SolverParticlesOrRange& Particles, const FSolverReal Dt, const int32 ConstraintIndex) const
102 {
103 const TVector<int32, 4>& Constraint = Constraints[ConstraintIndex];
104 const int32 Index1 = Constraint[0];
105 const int32 Index2 = Constraint[1];
106 const int32 Index3 = Constraint[2];
107 const int32 Index4 = Constraint[3];
108 const FSolverVec3 Delta = GetDelta(Particles, ConstraintIndex);
109 if (Particles.InvM(Index1) > 0)
110 {
111 Particles.P(Index1) += Particles.InvM(Index1) * Delta;
112 }
113 if (Particles.InvM(Index2) > (FSolverReal)0.)
114 {
115 Particles.P(Index2) -= Particles.InvM(Index2) * Barys[ConstraintIndex][0] * Delta;
116 }
117 if (Particles.InvM(Index3) > (FSolverReal)0.)
118 {
119 Particles.P(Index3) -= Particles.InvM(Index3) * Barys[ConstraintIndex][1] * Delta;
120 }
121 if (Particles.InvM(Index4) > (FSolverReal)0.)
122 {
123 Particles.P(Index4) -= Particles.InvM(Index4) * Barys[ConstraintIndex][2] * Delta;
124 }
125 }
126
127 template<typename SolverParticlesOrRange>
129
131 {
132 for (int32 ConstraintIndex : InConstraintIndices)
133 {
134 Apply(InParticles, Dt, ConstraintIndex);
135 }
136 }
137
139
140 TConstArrayView<int32> GetFaceCollisionLayers() const { return FaceCollisionLayers; }
141 const TArray<TVector<int32, 2>>& GetVertexCollisionLayers() const { return VertexCollisionLayers; }
142
143 FSolverReal GetConstraintThickness(const int32 ConstraintIndex) const
144 {
146 {
147 return 2.f * (FSolverReal)ThicknessWeighted;
148 }
150 const TVec4<int32>& Constraint = Constraints[ConstraintIndex];
151 const FSolverVec3& Bary = Barys[ConstraintIndex];
153 const int32 Index1 = Constraint[0] - Offset;
154 const int32 Index2 = Constraint[1] - Offset;
155 const int32 Index3 = Constraint[2] - Offset;
156 const int32 Index4 = Constraint[3] - Offset;
157
158 return ThicknessWeighted.GetValue(Index1) + Bary[0] * ThicknessWeighted.GetValue(Index2) + Bary[1] * ThicknessWeighted.GetValue(Index3) + Bary[2] * ThicknessWeighted.GetValue(Index4);
159 }
160
162 {
163 switch (ConstraintTypes[ConstraintIndex])
164 {
165 default:
166 case EConstraintType::Default:
167 return FrictionCoefficient;
168 case EConstraintType::GIAFlipped:
169 return (FSolverReal)0.f;
170 }
171 }
172
173protected:
175 FSolverReal Stiffness; // (0-1 compliance for PBD)
178
181
182 UE_DEPRECATED(5.6, "Use KinematicCollisions.Thickness instead")
184 UE_DEPRECATED(5.6, "Use KinematicCollisions.Stiffness instead")
186
187 FSolverReal ProximityStiffness; // (actual spring stiffness for force-based solver)
188
190
191 int32 GetNumParticles() const { return NumParticles; }
192
193private:
194
197 TArray<bool> FlipNormal;
198
199 template<typename SolverParticlesOrRange>
200 void ApplyDynamicConstraints(SolverParticlesOrRange& InParticles, const FSolverReal Dt) const;
201
202 const FTriangleMesh& TriangleMesh;
203 const TArray<FSolverVec3>* ReferencePositions;
204 const TSet<TVec2<int32>> DisabledCollisionElements; // TODO: Make this a bitarray
205 TConstArrayView<int32> FaceCollisionLayers;
206 TArray<TVector<int32, 2>> VertexCollisionLayers; // Only non-empty if FaceCollisionLayers is non-empty. Values are Min and Max layers for that vertex
207
208 enum struct EConstraintType : uint8
209 {
210 Default,
211 GIAFlipped,
212 };
213 TArray<EConstraintType> ConstraintTypes;
214
215
216 int32 Offset;
217 int32 NumParticles;
218 bool bGlobalIntersectionAnalysis; // This is set based on which Init is called.
219};
220} // End namespace Chaos::Softs
221
222#if UE_ENABLE_INCLUDE_ORDER_DEPRECATED_IN_5_6
223#if !defined(CHAOS_COLLISION_SPRING_ISPC_ENABLED_DEFAULT)
224#define CHAOS_COLLISION_SPRING_ISPC_ENABLED_DEFAULT 1
225#endif
226#endif
227
228UE_DEPRECATED(5.6, "This variable has been renamed bChaos_KinematicTriangleMesh_ISPC_Enabled")
229static constexpr bool bChaos_CollisionSpring_ISPC_Enabled = false;
230
231#endif
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
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
#define PRAGMA_ENABLE_DEPRECATION_WARNINGS
Definition GenericPlatformCompilerPreSetup.h:12
#define PRAGMA_DISABLE_DEPRECATION_WARNINGS
Definition GenericPlatformCompilerPreSetup.h:8
void Init()
Definition LockFreeList.h:4
uint8_t uint8
Definition binka_ue_file_header.h:8
Definition TriangleMesh.h:24
Definition SoftsEvolutionLinearSystem.h:45
Definition PBDCollisionSpringConstraintsBase.h:24
void Apply(SolverParticlesOrRange &Particles, const FSolverReal Dt, const int32 ConstraintIndex) const
Definition PBDCollisionSpringConstraintsBase.h:101
FSolverReal KinematicColliderStiffness
Definition PBDCollisionSpringConstraintsBase.h:185
static constexpr FSolverReal DefaultProximityStiffness
Definition PBDCollisionSpringConstraintsBase.h:32
CHAOS_API void UpdateLinearSystem(const FSolverParticlesRange &Particles, const FSolverReal Dt, FEvolutionLinearSystem &LinearSystem) const
Definition PBDCollisionSpringConstraintsBase.cpp:423
TConstArrayView< int32 > GetFaceCollisionLayers() const
Definition PBDCollisionSpringConstraintsBase.h:140
void SetThicknessWeighted(const FSolverVec2 InThickness)
Definition PBDCollisionSpringConstraintsBase.h:97
const FPBDFlatWeightMap & GetThicknessWeighted() const
Definition PBDCollisionSpringConstraintsBase.h:84
static constexpr FSolverReal DefaultKinematicColliderStiffness
Definition PBDCollisionSpringConstraintsBase.h:30
FSolverReal GetMaxThickness() const
Definition PBDCollisionSpringConstraintsBase.h:82
FPBDFlatWeightMap ThicknessWeighted
Definition PBDCollisionSpringConstraintsBase.h:174
FSolverReal KinematicColliderThickness
Definition PBDCollisionSpringConstraintsBase.h:183
FPBDFlatWeightMap KinematicColliderFrictionCoefficient
Definition PBDCollisionSpringConstraintsBase.h:179
FSolverReal GetConstraintFrictionCoefficient(const int32 ConstraintIndex) const
Definition PBDCollisionSpringConstraintsBase.h:161
CHAOS_API FSolverVec3 GetDelta(const SolverParticlesOrRange &InParticles, const int32 i) const
FSolverReal Stiffness
Definition PBDCollisionSpringConstraintsBase.h:175
FSolverReal GetParticleThickness(int32 ParticleIndex) const
Definition PBDCollisionSpringConstraintsBase.h:83
bool GetGlobalIntersectionAnalysis() const
Definition PBDCollisionSpringConstraintsBase.h:86
static constexpr FSolverReal DefaultKinematicColliderFrictionCoefficient
Definition PBDCollisionSpringConstraintsBase.h:31
FPBDKinematicTriangleMeshCollisions KinematicCollisions
Definition PBDCollisionSpringConstraintsBase.h:180
void SetFrictionCoefficient(FSolverReal InFrictionCoefficient)
Definition PBDCollisionSpringConstraintsBase.h:98
CHAOS_API void Apply(SolverParticlesOrRange &InParticles, const FSolverReal Dt) const
const TArray< bool > & GetFlipNormals() const
Definition PBDCollisionSpringConstraintsBase.h:87
FSolverReal ProximityStiffness
Definition PBDCollisionSpringConstraintsBase.h:187
static constexpr FSolverReal DefaultKinematicColliderThickness
Definition PBDCollisionSpringConstraintsBase.h:29
int32 GetNumParticles() const
Definition PBDCollisionSpringConstraintsBase.h:191
const TArray< TVector< int32, 2 > > & GetVertexCollisionLayers() const
Definition PBDCollisionSpringConstraintsBase.h:141
static constexpr FSolverReal BackCompatThickness
Definition PBDCollisionSpringConstraintsBase.h:26
FSolverReal GetConstraintThickness(const int32 ConstraintIndex) const
Definition PBDCollisionSpringConstraintsBase.h:143
bool bOnlyCollideKinematics
Definition PBDCollisionSpringConstraintsBase.h:177
const TArray< TVec4< int32 > > & GetConstraints() const
Definition PBDCollisionSpringConstraintsBase.h:70
static constexpr FSolverReal BackCompatFrictionCoefficient
Definition PBDCollisionSpringConstraintsBase.h:28
const FTriangleMesh * GetKinematicColliderTriangleMesh() const
Definition PBDCollisionSpringConstraintsBase.h:94
static constexpr FSolverReal BackCompatStiffness
Definition PBDCollisionSpringConstraintsBase.h:27
void Apply(FSolverParticles &InParticles, const FSolverReal Dt, const TArray< int32 > &InConstraintIndices) const
Definition PBDCollisionSpringConstraintsBase.h:130
CHAOS_API void UpdateCollisionLayers(const TConstArrayView< int32 > &InFaceCollisionLayers)
Definition PBDCollisionSpringConstraintsBase.cpp:69
FSolverReal FrictionCoefficient
Definition PBDCollisionSpringConstraintsBase.h:176
const TArray< TMap< int32, FSolverReal > > & GetKinematicColliderTimers() const
Definition PBDCollisionSpringConstraintsBase.h:93
const TArray< FSolverVec3 > & GetBarys() const
Definition PBDCollisionSpringConstraintsBase.h:74
const FTriangleMesh & GetTriangleMesh() const
Definition PBDCollisionSpringConstraintsBase.h:95
FSolverReal GetThickness() const
Definition PBDCollisionSpringConstraintsBase.h:80
const TArray< int32 > & GetKinematicCollidingParticles() const
Definition PBDCollisionSpringConstraintsBase.h:92
virtual ~FPBDCollisionSpringConstraintsBase()
Definition PBDCollisionSpringConstraintsBase.h:52
void ResetKinematicCollider()
Definition PBDCollisionSpringConstraintsBase.h:54
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
FSolverReal GetValue(int32 Index) const
Definition PBDFlatWeightMap.h:167
Definition PBDKinematicTriangleMeshCollisions.h:16
const FTriangleMesh * GetTriangleMesh() const
Definition PBDKinematicTriangleMeshCollisions.h:77
const TArray< TMap< int32, FSolverReal > > & GetTimers() const
Definition PBDKinematicTriangleMeshCollisions.h:76
const TArray< int32 > & GetCollidingParticles() const
Definition PBDKinematicTriangleMeshCollisions.h:74
void Reset()
Definition PBDKinematicTriangleMeshCollisions.h:35
Definition PBDTriangleMeshCollisions.h:18
Definition SoftsSolverParticlesRange.h:12
Definition PBDSoftsSolverParticles.h:20
Definition Vector.h:41
Definition Constraints.Build.cs:6
Definition Array.h:670
Definition CollectionEmbeddedSpringConstraintFacade.cpp:6
TVector< FSolverReal, 2 > FSolverVec2
Definition PBDSoftsEvolutionFwd.h:32
FRealSingle FSolverReal
Definition PBDSoftsEvolutionFwd.h:31
Definition SkeletalMeshComponent.h:307
EConstraintType
Definition PBDConstraintBaseData.h:19
@ false
Definition radaudio_common.h:23