UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
XPBDEmbeddedSpringConstraints.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
8#include "Chaos/SoftsSpring.h"
9#include "Containers/Array.h"
10
11namespace Chaos::Softs
12{
13 template<int32 Source, int32 Target>
15 {
16 static constexpr bool Value = false;
17 };
18 template<>
20 {
21 static constexpr bool Value = true;
22 };
23 template<>
25 {
26 static constexpr bool Value = true;
27 };
28 template<>
30 {
31 static constexpr bool Value = true;
32 };
33
34 template <int32 Source, int32 Target>
36 {
37 public:
38 static constexpr FSolverReal MinStiffness = (FSolverReal)0;
40 static constexpr FSolverReal SoftMaxStiffness = (FSolverReal)1e14; // Stiffnesses greater than this will be treated as "hard" PBD constraints
41 static constexpr FSolverReal MinDampingRatio = (FSolverReal)0.;
42 static constexpr FSolverReal MaxDampingRatio = (FSolverReal)1000.;
43 static constexpr int32 N = Source + Target;
45
47 const FSolverParticlesRange& Particles,
59
61
62 void Init()
63 {
64 Lambdas.Reset();
65 Lambdas.SetNumZeroed(Constraints.Num());
66 LambdasDamping.Reset();
67 LambdasDamping.SetNumZeroed(Constraints.Num());
68 }
69
70 void ApplyProperties(const FSolverReal /*Dt*/, const int32 /*NumIterations*/)
71 {
72 }
73
74 void Apply(FSolverParticlesRange& Particles, const FSolverReal Dt) const;
75
77 {
78 return Constraints;
79 }
81 {
82 return Weights;
83 }
85 {
86 return SpringLengths;
87 }
88 FSolverReal GetExtensionStiffness(const int32 ConstraintIndex) const
89 {
90 return ExtensionStiffness.GetValue(ConstraintIndex);
91 }
92 FSolverReal GetCompressionStiffness(const int32 ConstraintIndex) const
93 {
94 return CompressionStiffness.GetValue(ConstraintIndex);
95 }
96
97 private:
98
99 void InitColorAndRemap(const FSolverParticlesRange& Particles);
100
101#if INTEL_ISPC
102 void InitColor(const FSolverParticlesRange& Particles);
103 CHAOS_API void ApplyISPC(FSolverParticlesRange& Particles, const FSolverReal Dt) const;
104#endif
105 void ApplyInternal(FSolverParticlesRange& Particles, const FSolverReal Dt) const;
106
108 TArray<TVector<FSolverReal, N>> Weights; // Weights for Targets are -TargetWeight
109 TArray<FSolverReal> SpringLengths;
110
111 TArray<int32> OrigMapToReordered; // Constraints can be trimmed and reordered for coloring.
112
113 mutable TArray<FSolverReal> Lambdas;
114 mutable TArray<FSolverReal> LambdasDamping;
115 TArray<int32> ConstraintsPerColorStartIndex; // Constraints are ordered so each batch is contiguous. This is ColorNum + 1 length so it can be used as start and end.
116
117 protected:
121 };
122
123 template<int32 Source, int32 Target>
125 const FSolverParticlesRange& Particles,
137 : ExtensionStiffness(InExtensionStiffness.ClampAxes(MinStiffness, MaxStiffness), InExtensionStiffnessMultipliers, InSourceIndices.Num(), FSolverVec2(MinStiffness, MaxStiffness))
138 , CompressionStiffness(InCompressionStiffness.ClampAxes(MinStiffness, MaxStiffness), InCompressionStiffnessMultipliers, InSourceIndices.Num(), FSolverVec2(MinStiffness, MaxStiffness))
139 , DampingRatio(InDampingRatio.ClampAxes(MinDampingRatio, MaxDampingRatio), InDampingMultipliers, InSourceIndices.Num(), FSolverVec2(MinDampingRatio, MaxDampingRatio))
140 {
141 // Validate data
142 const int32 NumConstraints = InSourceIndices.Num();
143 check(InSourceWeights.Num() == NumConstraints);
144 check(InTargetIndices.Num() == NumConstraints);
145 check(InTargetWeights.Num() == NumConstraints);
146 check(InSpringLengths.Num() == NumConstraints);
147 check(InExtensionStiffnessMultipliers.IsEmpty() || InExtensionStiffnessMultipliers.Num() == NumConstraints);
149 check(InDampingMultipliers.IsEmpty() || InDampingMultipliers.Num() == NumConstraints);
150
151 Constraints.Reserve(NumConstraints);
152 Weights.Reserve(NumConstraints);
153 SpringLengths.Reserve(NumConstraints);
154
155 OrigMapToReordered.SetNumUninitialized(NumConstraints);
156
157 auto IsKinematic = [&Particles](const TArray<int32>& Indices, const TArray<FRealSingle>& InWeights, int32 ExpectedNum)
158 {
159 for (int32 Idx = 0; Idx < ExpectedNum; ++Idx)
160 {
161 if (InWeights[Idx] != 0.f && Particles.InvM(Indices[Idx]) != 0.f)
162 {
163 return false;
164 }
165 }
166 return true;
167 };
168
169 for (int32 ConstraintIdx = 0; ConstraintIdx < NumConstraints; ++ConstraintIdx)
170 {
171 if (IsKinematic(InSourceIndices[ConstraintIdx], InSourceWeights[ConstraintIdx], Source)
172 && IsKinematic(InTargetIndices[ConstraintIdx], InTargetWeights[ConstraintIdx], Target))
173 {
174 // Strip this constraint
175 OrigMapToReordered[ConstraintIdx] = INDEX_NONE;
176 continue;
177 }
178
179 TVector<int32, N> Constraint;
181 for (int32 Idx = 0; Idx < Source; ++Idx)
182 {
183 Constraint[Idx] = InSourceIndices[ConstraintIdx][Idx];
184 Weight[Idx] = InSourceWeights[ConstraintIdx][Idx];
185 }
186
187 for (int32 Idx = 0; Idx < Target; ++Idx)
188 {
189 Weight[Source + Idx] = -InTargetWeights[ConstraintIdx][Idx];
190 Constraint[Source + Idx] = InTargetIndices[ConstraintIdx][Idx];
191 }
192
193 const int32 NewConstraintIndex = Constraints.Emplace(Constraint);
194 Weights.Emplace(Weight);
195 SpringLengths.Emplace(InSpringLengths[ConstraintIdx]);
196
197 OrigMapToReordered[ConstraintIdx] = NewConstraintIndex;
198 }
199
200 // You must call InitColorAndRemap and at least update the Stiffness maps with the OrigMapToReordered data.
201 InitColorAndRemap(Particles);
202 }
203
204 template<int32 Source, int32 Target>
206 {
207#if INTEL_ISPC
208 if constexpr (bCanUseISPC)
209 {
210 InitColor(Particles);
211 }
212#endif
213 // Need to reorder and shrink even if not using ISPC since this also handles trimmed constraints.
214 const int32 NumConstraints = Constraints.Num();
215 ExtensionStiffness.ReorderIndicesAndShrink(OrigMapToReordered, NumConstraints);
216 CompressionStiffness.ReorderIndicesAndShrink(OrigMapToReordered, NumConstraints);
217 DampingRatio.ReorderIndicesAndShrink(OrigMapToReordered, NumConstraints);
218 }
219
220 template<int32 Source, int32 Target>
222 {
224#if INTEL_ISPC
225 if (bChaos_XPBDSpring_ISPC_Enabled && bCanUseISPC)
226 {
227 ApplyISPC(Particles, Dt);
228 }
229 else
230#endif
231 {
232 ApplyInternal(Particles, Dt);
233 }
234 }
235
236 template<int32 Source, int32 Target>
238 {
239 const bool bDampingHasWeightMap = DampingRatio.HasWeightMap();
240 const FSolverReal DampingNoMap = (FSolverReal)DampingRatio;
242 {
243 // Damping
244 for (int32 ConstraintIndex = 0; ConstraintIndex < Constraints.Num(); ++ConstraintIndex)
245 {
246 const FSolverVec3 Delta = Spring::GetXPBDEmbeddedSpringDampingDelta(Particles, Dt, Constraints[ConstraintIndex], Weights[ConstraintIndex], SpringLengths[ConstraintIndex], LambdasDamping[ConstraintIndex], ExtensionStiffness.GetValue(ConstraintIndex), CompressionStiffness.GetValue(ConstraintIndex), DampingRatio.GetValue(ConstraintIndex));
247
248 for (int32 NIndex = 0; NIndex < N; ++NIndex)
249 {
250 const int32 NodeIndex = Constraints[ConstraintIndex][NIndex];
251 Particles.P(NodeIndex) += Particles.InvM(NodeIndex) * Weights[ConstraintIndex][NIndex] * Delta;
252 }
253 }
254 }
255
256 // Stretch
257 for (int32 ConstraintIndex = 0; ConstraintIndex < Constraints.Num(); ++ConstraintIndex)
258 {
259 const FSolverVec3 Delta = Spring::GetXPBDEmbeddedSpringDelta(Particles, Dt, Constraints[ConstraintIndex], Weights[ConstraintIndex], SpringLengths[ConstraintIndex], Lambdas[ConstraintIndex], ExtensionStiffness.GetValue(ConstraintIndex), CompressionStiffness.GetValue(ConstraintIndex));
260
261 for (int32 NIndex = 0; NIndex < N; ++NIndex)
262 {
263 const int32 NodeIndex = Constraints[ConstraintIndex][NIndex];
264 Particles.P(NodeIndex) += Particles.InvM(NodeIndex) * Weights[ConstraintIndex][NIndex] * Delta;
265 }
266 }
267 }
268
293
318
343} // End namespace Chaos::Softs
344
#define check(expr)
Definition AssertionMacros.h:314
#define UE_CHAOS_DECLARE_PROPERTYCOLLECTION_NAME(PropertyName, Type)
Definition CollectionPropertyFacade.h:969
@ INDEX_NONE
Definition CoreMiscDefines.h:150
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 TRACE_CPUPROFILER_EVENT_SCOPE(Name)
Definition CpuProfilerTrace.h:528
@ Num
Definition MetalRHIPrivate.h:234
#define UE_BIG_NUMBER
Definition UnrealMathUtility.h:132
Definition CollectionPropertyFacade.h:49
Definition CollectionEmbeddedSpringConstraintFacade.h:44
Definition PBDFlatWeightMap.h:98
FSolverReal GetValue(int32 Index) const
Definition PBDFlatWeightMap.h:167
Definition SoftsSolverParticlesRange.h:12
const FSolverVec3 & P(const int32 Index) const
Definition SoftsSolverParticlesRange.h:30
FSolverReal InvM(const int32 Index) const
Definition SoftsSolverParticlesRange.h:56
Definition XPBDEmbeddedSpringConstraints.h:320
static constexpr FSolverReal DefaultDamping
Definition XPBDEmbeddedSpringConstraints.h:323
static bool IsEnabled(const FCollectionPropertyConstFacade &PropertyCollection)
Definition XPBDEmbeddedSpringConstraints.h:325
CHAOS_API void SetProperties(const FCollectionPropertyConstFacade &PropertyCollection)
Definition XPBDEmbeddedSpringConstraints.cpp:372
static constexpr FSolverReal DefaultStiffness
Definition XPBDEmbeddedSpringConstraints.h:322
Definition XPBDEmbeddedSpringConstraints.h:270
static constexpr FSolverReal DefaultDamping
Definition XPBDEmbeddedSpringConstraints.h:273
static bool IsEnabled(const FCollectionPropertyConstFacade &PropertyCollection)
Definition XPBDEmbeddedSpringConstraints.h:275
CHAOS_API void SetProperties(const FCollectionPropertyConstFacade &PropertyCollection)
Definition XPBDEmbeddedSpringConstraints.cpp:286
static constexpr FSolverReal DefaultStiffness
Definition XPBDEmbeddedSpringConstraints.h:272
Definition XPBDEmbeddedSpringConstraints.h:295
static bool IsEnabled(const FCollectionPropertyConstFacade &PropertyCollection)
Definition XPBDEmbeddedSpringConstraints.h:300
static constexpr FSolverReal DefaultDamping
Definition XPBDEmbeddedSpringConstraints.h:298
static constexpr FSolverReal DefaultStiffness
Definition XPBDEmbeddedSpringConstraints.h:297
CHAOS_API void SetProperties(const FCollectionPropertyConstFacade &PropertyCollection)
Definition XPBDEmbeddedSpringConstraints.cpp:329
Definition XPBDEmbeddedSpringConstraints.h:36
static constexpr FSolverReal SoftMaxStiffness
Definition XPBDEmbeddedSpringConstraints.h:40
static constexpr FSolverReal MaxStiffness
Definition XPBDEmbeddedSpringConstraints.h:39
void Apply(FSolverParticlesRange &Particles, const FSolverReal Dt) const
Definition XPBDEmbeddedSpringConstraints.h:221
const TArray< TVector< int32, N > > & GetConstraints() const
Definition XPBDEmbeddedSpringConstraints.h:76
FPBDFlatWeightMap DampingRatio
Definition XPBDEmbeddedSpringConstraints.h:120
static constexpr FSolverReal MaxDampingRatio
Definition XPBDEmbeddedSpringConstraints.h:42
static constexpr bool bCanUseISPC
Definition XPBDEmbeddedSpringConstraints.h:44
TXPBDEmbeddedSpringConstraints(const FSolverParticlesRange &Particles, const TConstArrayView< TArray< int32 > > &InSourceIndices, const TConstArrayView< TArray< FRealSingle > > &InSourceWeights, const TConstArrayView< TArray< int32 > > &InTargetIndices, const TConstArrayView< TArray< FRealSingle > > &InTargetWeights, const TConstArrayView< FRealSingle > &InSpringLengths, const TConstArrayView< FRealSingle > &InExtensionStiffnessMultipliers, const TConstArrayView< FRealSingle > &InCompressionStiffnessMultipliers, const TConstArrayView< FRealSingle > &InDampingMultipliers, const FSolverVec2 &InExtensionStiffness, const FSolverVec2 &InCompressionStiffness, const FSolverVec2 &InDampingRatio)
Definition XPBDEmbeddedSpringConstraints.h:124
const TArray< TVector< FSolverReal, N > > & GetWeights() const
Definition XPBDEmbeddedSpringConstraints.h:80
static constexpr int32 N
Definition XPBDEmbeddedSpringConstraints.h:43
static constexpr FSolverReal MinStiffness
Definition XPBDEmbeddedSpringConstraints.h:38
FSolverReal GetCompressionStiffness(const int32 ConstraintIndex) const
Definition XPBDEmbeddedSpringConstraints.h:92
FPBDFlatWeightMap CompressionStiffness
Definition XPBDEmbeddedSpringConstraints.h:119
void Init()
Definition XPBDEmbeddedSpringConstraints.h:62
FSolverReal GetExtensionStiffness(const int32 ConstraintIndex) const
Definition XPBDEmbeddedSpringConstraints.h:88
void ApplyProperties(const FSolverReal, const int32)
Definition XPBDEmbeddedSpringConstraints.h:70
FPBDFlatWeightMap ExtensionStiffness
Definition XPBDEmbeddedSpringConstraints.h:118
const TArray< FSolverReal > & GetSpringLengths() const
Definition XPBDEmbeddedSpringConstraints.h:84
static constexpr FSolverReal MinDampingRatio
Definition XPBDEmbeddedSpringConstraints.h:41
Definition Constraints.Build.cs:6
Definition Array.h:670
void SetNumZeroed(SizeType NewNum, EAllowShrinking AllowShrinking=UE::Core::Private::AllowShrinkingByDefault< AllocatorType >())
Definition Array.h:2340
void Reset(SizeType NewSize=0)
Definition Array.h:2246
UE_FORCEINLINE_HINT SizeType Emplace(ArgsType &&... Args)
Definition Array.h:2561
void SetNumUninitialized(SizeType NewNum, EAllowShrinking AllowShrinking=UE::Core::Private::AllowShrinkingByDefault< AllocatorType >())
Definition Array.h:2369
UE_FORCEINLINE_HINT void Reserve(SizeType Number)
Definition Array.h:3016
FSolverVec3 GetXPBDEmbeddedSpringDampingDelta(const SolverParticlesOrRange &Particles, const FSolverReal Dt, const TVector< int32, N > &Constraint, const TVector< FSolverReal, N > &Weights, const FSolverReal RestLength, FSolverReal &Lambda, const FSolverReal ExtensionStiffnessValue, const FSolverReal CompressionStiffnessValue, const FSolverReal DampingRatioValue)
Definition SoftsSpring.h:242
FSolverVec3 GetXPBDEmbeddedSpringDelta(const SolverParticlesOrRange &Particles, const FSolverReal Dt, const TVector< int32, N > &Constraint, const TVector< FSolverReal, N > &Weights, const FSolverReal RestLength, FSolverReal &Lambda, const FSolverReal ExtensionStiffnessValue, const FSolverReal CompressionStiffnessValue)
Definition SoftsSpring.h:213
Definition CollectionEmbeddedSpringConstraintFacade.cpp:6
FRealSingle FSolverReal
Definition PBDSoftsEvolutionFwd.h:31
TVector< FSolverReal, 3 > FSolverVec3
Definition PBDSoftsEvolutionFwd.h:33
Definition XPBDEmbeddedSpringConstraints.h:15
static constexpr bool Value
Definition XPBDEmbeddedSpringConstraints.h:16