UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
XPBDAnisotropicSpringConstraints.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
9
10namespace Chaos
11{
12class FTriangleMesh;
13}
14
15namespace Chaos::Softs
16{
17
18// Edge and axial springs. Spatially varying stiffnesses and restlengths controlled by Warp/Weft/Bias.
19// Both types of springs controlled by the same input parameters.
21{
23
24public:
25 // Stiffness is in kg /s^2
26 static constexpr FSolverReal MinStiffness = (FSolverReal)0; // We're not checking against MinStiffness (except when it's constant and == 0)
27 static constexpr FSolverReal MaxStiffness = (FSolverReal)1e9;
28 static constexpr FSolverReal MinDampingRatio = (FSolverReal)0.;
29 static constexpr FSolverReal MaxDampingRatio = (FSolverReal)1000.;
31 static constexpr FSolverReal MaxWarpWeftScale = (FSolverReal)1e7; // No particular reason for this number. Just can't imagine wanting something bigger?
32
34 const FSolverParticlesRange& Particles,
35 const FTriangleMesh& TriangleMesh,
40 FSolverReal MeshScale,
53
58 const FTriangleMesh& TriangleMesh,
63 FSolverReal MeshScale,
76
77 UE_DEPRECATED(5.6, "No longer supported, use new constructors instead")
79 const FSolverParticlesRange& Particles,
80 const FTriangleMesh& TriangleMesh,
95
96 UE_DEPRECATED(5.6, "No longer supported, use new constructors instead")
101 const FTriangleMesh& TriangleMesh,
115 const FSolverVec2& InWeftScale);
116
118
119 void Init()
120 {
121 Lambdas.Reset();
122 Lambdas.AddZeroed(Constraints.Num());
123 LambdasDamping.Reset();
124 LambdasDamping.AddZeroed(Constraints.Num());
125 }
126
127 // Update rest lengths from warp/weft scale
128 void ApplyProperties(const FSolverReal /*Dt*/, const int32 /*NumIterations*/)
129 {
130 bool bWarpScaleChanged = false;
131 WarpScale.ApplyValues(&bWarpScaleChanged);
132 bool bWeftScaleChanged = false;
133 WeftScale.ApplyValues(&bWeftScaleChanged);
135 {
136 // Need to update distances
137 UpdateDists();
138 }
139 }
140
141 template<typename SolverParticlesOrRange>
142 CHAOS_API void Apply(SolverParticlesOrRange& Particles, const FSolverReal Dt) const;
143
145
146 const TArray<int32>& GetConstraintsPerColorStartIndex() const { return ConstraintsPerColorStartIndex; }
147 const TArray<FSolverVec3>& GetWarpWeftBiasBaseMultipliers() const { return WarpWeftBiasBaseMultipliers; }
148
154
155private:
156 template<typename SolverParticlesOrRange>
157 void InitColor(const SolverParticlesOrRange& InParticles);
158
160
161 CHAOS_API void UpdateDists();
162
163 template<bool bDampingBefore, bool bSingleLambda, bool bSeparateStretch, bool bDampingAfter, typename SolverParticlesOrRange>
164 void ApplyHelper(SolverParticlesOrRange& Particles, const FSolverReal Dt, const int32 ConstraintIndex, const FSolverVec3& StiffnessValue, const FSolverReal DampingRatioValue) const;
165
166 using Base::Constraints;
169 using Base::Dists; // These will be updated when Warp/Weft Scales change.
170
171 FPBDFlatWeightMap StiffnessWarp;
172 FPBDFlatWeightMap StiffnessWeft;
173 FPBDFlatWeightMap StiffnessBias;
174 FPBDFlatWeightMap DampingRatio;
175 FPBDWeightMap WarpScale;
176 FPBDWeightMap WeftScale;
177
178 mutable TArray<FSolverReal> Lambdas;
179 mutable TArray<FSolverReal> LambdasDamping;
180 TArray<FSolverReal> BaseDists; // Without Warp/Weft Scale applied
181 TArray<FSolverVec3> WarpWeftBiasBaseMultipliers;
182 TArray<FSolverVec2> WarpWeftScaleBaseMultipliers;
183 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.
184
186};
187
189{
191
192public:
193 // Stiffness is in kg /s^2
194 static constexpr FSolverReal MinStiffness = (FSolverReal)0; // We're not checking against MinStiffness (except when it's constant and == 0)
197 static constexpr FSolverReal MaxDampingRatio = (FSolverReal)1000.;
199 static constexpr FSolverReal MaxWarpWeftScale = (FSolverReal)1e7; // No particular reason for this number. Just can't imagine wanting something bigger?
200
202 const FSolverParticlesRange& Particles,
203 const FTriangleMesh& TriangleMesh,
208 FSolverReal MeshScale,
220 const FSolverVec2& InWeftScale);
221
226 const FTriangleMesh& TriangleMesh,
231 FSolverReal MeshScale,
243 const FSolverVec2& InWeftScale);
244
245 UE_DEPRECATED(5.6, "No longer supported, use new constructors instead")
247 const FSolverParticlesRange& Particles,
248 const FTriangleMesh& TriangleMesh,
262 const FSolverVec2& InWeftScale);
263
264 UE_DEPRECATED(5.6, "No longer supported, use new constructors instead")
269 const FTriangleMesh& TriangleMesh,
283 const FSolverVec2& InWeftScale);
284
286
287 void Init()
288 {
289 Lambdas.Reset();
290 Lambdas.AddZeroed(Constraints.Num());
291 LambdasDamping.Reset();
292 LambdasDamping.AddZeroed(Constraints.Num());
293 }
294
295 // Update rest lengths from warp/weft scale
296 void ApplyProperties(const FSolverReal /*Dt*/, const int32 /*NumIterations*/)
297 {
298 bool bWarpScaleChanged = false;
299 WarpScale.ApplyValues(&bWarpScaleChanged);
300 bool bWeftScaleChanged = false;
301 WeftScale.ApplyValues(&bWeftScaleChanged);
303 {
304 // Need to update distances
305 UpdateDists();
306 }
307 }
308
309 template<typename SolverParticlesOrRange>
310 CHAOS_API void Apply(SolverParticlesOrRange& Particles, const FSolverReal Dt) const;
311
313
314 const TArray<int32>& GetConstraintsPerColorStartIndex() const { return ConstraintsPerColorStartIndex; }
315 const TArray<FSolverVec3>& GetWarpWeftBiasBaseMultipliers() const { return WarpWeftBiasBaseMultipliers; }
316
322
323private:
324 template<typename SolverParticlesOrRange>
325 void InitColor(const SolverParticlesOrRange& InParticles);
326
328
329 CHAOS_API void UpdateDists();
330
331 template<bool bDampingBefore, bool bSingleLambda, bool bSeparateStretch, bool bDampingAfter, typename SolverParticlesOrRange>
332 void ApplyHelper(SolverParticlesOrRange& Particles, const FSolverReal Dt, const int32 ConstraintIndex, const FSolverVec3& StiffnessValue, const FSolverReal DampingRatioValue) const;
333
334 using Base::Constraints;
337 using Base::Barys;
338 using Base::Dists; // These will be updated when Warp/Weft Scales change.
339
340 FPBDFlatWeightMap StiffnessWarp;
341 FPBDFlatWeightMap StiffnessWeft;
342 FPBDFlatWeightMap StiffnessBias;
343 FPBDFlatWeightMap DampingRatio;
344 FPBDWeightMap WarpScale;
345 FPBDWeightMap WeftScale;
346
347 mutable TArray<FSolverReal> Lambdas;
348 mutable TArray<FSolverReal> LambdasDamping;
349 TArray<FSolverReal> BaseDists; // Without Warp/Weft Scale applied
350 TArray<FSolverVec3> WarpWeftBiasBaseMultipliers;
351 TArray<FSolverVec2> WarpWeftScaleBaseMultipliers;
352 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.
353
355
356};
357
359{
360public:
361 static constexpr FSolverReal DefaultStiffness = (FSolverReal)100.;
362 static constexpr FSolverReal DefaultDamping = (FSolverReal)1.;
363 static constexpr bool bDefaultUse3dRestLengths = true;
365 static constexpr bool bDefaultSavePreResizedSimPosition3D = false;
366
371
373 const FSolverParticlesRange& Particles,
374 const FTriangleMesh& TriangleMesh,
376 const TMap<FString, TConstArrayView<FRealSingle>>& WeightMaps,
379 Softs::FSolverReal MeshScale)
380 : EdgeConstraints(
381 Particles,
382 TriangleMesh,
387 MeshScale,
400 , AxialConstraints(
401 Particles,
402 TriangleMesh,
407 MeshScale,
428 {}
429
434 const FTriangleMesh& TriangleMesh,
436 const TMap<FString, TConstArrayView<FRealSingle>>& WeightMaps,
439 Softs::FSolverReal MeshScale)
440 : EdgeConstraints(
444 TriangleMesh,
449 MeshScale,
462 , AxialConstraints(
466 TriangleMesh,
471 MeshScale,
492 {}
493
496 const TMap<FString, TConstArrayView<FRealSingle>>& WeightMaps);
497
498 // Update rest lengths from warp/weft scale
499 void ApplyProperties(const FSolverReal Dt, const int32 NumIterations)
500 {
501 EdgeConstraints.ApplyProperties(Dt, NumIterations);
502 AxialConstraints.ApplyProperties(Dt, NumIterations);
503 }
504
505 void Init()
506 {
507 EdgeConstraints.Init();
508 AxialConstraints.Init();
509 }
510
511 const FXPBDAnisotropicEdgeSpringConstraints& GetEdgeConstraints() const { return EdgeConstraints; }
512 const FXPBDAnisotropicAxialSpringConstraints& GetAxialConstraints() const { return AxialConstraints; }
513
515 {
516 EdgeConstraints.ResetRestLengths(Positions);
517 AxialConstraints.ResetRestLengths(Positions);
518 }
519
520private:
523
532};
533
534} // End namespace Chaos::Softs
535
#define UE_CHAOS_DECLARE_PROPERTYCOLLECTION_NAME(PropertyName, Type)
Definition CollectionPropertyFacade.h:969
#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
Definition TriangleMesh.h:24
Definition CollisionKeys.h:59
Definition CollectionPropertyFacade.h:49
Definition SoftsEvolutionLinearSystem.h:45
Definition PBDAxialSpringConstraintsBase.h:16
TArray< FSolverReal > Dists
Definition PBDAxialSpringConstraintsBase.h:246
TArray< FSolverReal > Barys
Definition PBDAxialSpringConstraintsBase.h:245
const int32 ParticleCount
Definition PBDAxialSpringConstraintsBase.h:244
TArray< TVec3< int32 > > Constraints
Definition PBDAxialSpringConstraintsBase.h:242
void CalculateRestLengths(const TConstArrayView< FSolverVec3 > &Positions, const TArrayView< FSolverReal > &DistsToCompute) const
Definition PBDAxialSpringConstraintsBase.h:91
const int32 ParticleOffset
Definition PBDAxialSpringConstraintsBase.h:243
Definition PBDFlatWeightMap.h:98
Definition PBDSpringConstraintsBase.h:17
void CalculateRestLengths(const TConstArrayView< FSolverVec3 > &Positions, const TArrayView< FSolverReal > &DistsToCompute) const
Definition PBDSpringConstraintsBase.h:120
const int32 ParticleCount
Definition PBDSpringConstraintsBase.h:159
const int32 ParticleOffset
Definition PBDSpringConstraintsBase.h:158
TArray< FSolverReal > Dists
Definition PBDSpringConstraintsBase.h:157
TArray< TVec2< int32 > > Constraints
Definition PBDSpringConstraintsBase.h:156
Definition PBDWeightMap.h:19
void ApplyValues(bool *bOutUpdated=nullptr)
Definition PBDWeightMap.h:71
Definition SoftsSolverParticlesRange.h:12
Definition PBDSoftsSolverParticles.h:20
Definition XPBDAnisotropicSpringConstraints.h:189
CHAOS_API void UpdateLinearSystem(const FSolverParticlesRange &Particles, const FSolverReal Dt, FEvolutionLinearSystem &LinearSystem) const
Definition XPBDAnisotropicSpringConstraints.cpp:2025
const TArray< FSolverVec3 > & GetWarpWeftBiasBaseMultipliers() const
Definition XPBDAnisotropicSpringConstraints.h:315
static constexpr FSolverReal MaxWarpWeftScale
Definition XPBDAnisotropicSpringConstraints.h:199
void ApplyProperties(const FSolverReal, const int32)
Definition XPBDAnisotropicSpringConstraints.h:296
void ResetRestLengths(const TConstArrayView< FSolverVec3 > &Positions)
Definition XPBDAnisotropicSpringConstraints.h:317
void Init()
Definition XPBDAnisotropicSpringConstraints.h:287
CHAOS_API void Apply(SolverParticlesOrRange &Particles, const FSolverReal Dt) const
static constexpr FSolverReal MinDampingRatio
Definition XPBDAnisotropicSpringConstraints.h:196
static constexpr FSolverReal MinWarpWeftScale
Definition XPBDAnisotropicSpringConstraints.h:198
const TArray< int32 > & GetConstraintsPerColorStartIndex() const
Definition XPBDAnisotropicSpringConstraints.h:314
static constexpr FSolverReal MaxStiffness
Definition XPBDAnisotropicSpringConstraints.h:195
static constexpr FSolverReal MaxDampingRatio
Definition XPBDAnisotropicSpringConstraints.h:197
static constexpr FSolverReal MinStiffness
Definition XPBDAnisotropicSpringConstraints.h:194
Definition XPBDAnisotropicSpringConstraints.h:21
void ApplyProperties(const FSolverReal, const int32)
Definition XPBDAnisotropicSpringConstraints.h:128
static constexpr FSolverReal MinWarpWeftScale
Definition XPBDAnisotropicSpringConstraints.h:30
const TArray< FSolverVec3 > & GetWarpWeftBiasBaseMultipliers() const
Definition XPBDAnisotropicSpringConstraints.h:147
static constexpr FSolverReal MaxWarpWeftScale
Definition XPBDAnisotropicSpringConstraints.h:31
const TArray< int32 > & GetConstraintsPerColorStartIndex() const
Definition XPBDAnisotropicSpringConstraints.h:146
static constexpr FSolverReal MaxStiffness
Definition XPBDAnisotropicSpringConstraints.h:27
static constexpr FSolverReal MaxDampingRatio
Definition XPBDAnisotropicSpringConstraints.h:29
void Init()
Definition XPBDAnisotropicSpringConstraints.h:119
static constexpr FSolverReal MinDampingRatio
Definition XPBDAnisotropicSpringConstraints.h:28
static constexpr FSolverReal MinStiffness
Definition XPBDAnisotropicSpringConstraints.h:26
CHAOS_API void UpdateLinearSystem(const FSolverParticlesRange &Particles, const FSolverReal Dt, FEvolutionLinearSystem &LinearSystem) const
Definition XPBDAnisotropicSpringConstraints.cpp:983
void ResetRestLengths(const TConstArrayView< FSolverVec3 > &Positions)
Definition XPBDAnisotropicSpringConstraints.h:149
CHAOS_API void Apply(SolverParticlesOrRange &Particles, const FSolverReal Dt) const
Definition XPBDAnisotropicSpringConstraints.h:359
static constexpr FSolverReal DefaultWarpWeftScale
Definition XPBDAnisotropicSpringConstraints.h:364
const FXPBDAnisotropicAxialSpringConstraints & GetAxialConstraints() const
Definition XPBDAnisotropicSpringConstraints.h:512
CHAOS_API void SetProperties(const FCollectionPropertyConstFacade &PropertyCollection, const TMap< FString, TConstArrayView< FRealSingle > > &WeightMaps)
Definition XPBDAnisotropicSpringConstraints.cpp:2120
void ResetRestLengths(const TConstArrayView< FSolverVec3 > &Positions)
Definition XPBDAnisotropicSpringConstraints.h:514
void ApplyProperties(const FSolverReal Dt, const int32 NumIterations)
Definition XPBDAnisotropicSpringConstraints.h:499
FXPBDAnisotropicSpringConstraints(const FSolverParticlesRange &Particles, const FTriangleMesh &TriangleMesh, const TArray< TVec3< FVec2f > > &FaceVertexPatternPositions, const TMap< FString, TConstArrayView< FRealSingle > > &WeightMaps, const FCollectionPropertyConstFacade &PropertyCollection, const TArray< FVector3f > &PreResizedSimPosition3D, Softs::FSolverReal MeshScale)
Definition XPBDAnisotropicSpringConstraints.h:372
static constexpr bool bDefaultSavePreResizedSimPosition3D
Definition XPBDAnisotropicSpringConstraints.h:365
void Init()
Definition XPBDAnisotropicSpringConstraints.h:505
static bool IsEnabled(const FCollectionPropertyConstFacade &PropertyCollection)
Definition XPBDAnisotropicSpringConstraints.h:367
static constexpr FSolverReal DefaultDamping
Definition XPBDAnisotropicSpringConstraints.h:362
static constexpr bool bDefaultUse3dRestLengths
Definition XPBDAnisotropicSpringConstraints.h:363
const FXPBDAnisotropicEdgeSpringConstraints & GetEdgeConstraints() const
Definition XPBDAnisotropicSpringConstraints.h:511
FXPBDAnisotropicSpringConstraints(const FSolverParticles &InParticles, int32 InParticleOffset, int32 InParticleCount, const FTriangleMesh &TriangleMesh, const TArray< TVec3< FVec2f > > &FaceVertexPatternPositions, const TMap< FString, TConstArrayView< FRealSingle > > &WeightMaps, const FCollectionPropertyConstFacade &PropertyCollection, const TArray< FVector3f > &PreResizedSimPosition3D, Softs::FSolverReal MeshScale)
Definition XPBDAnisotropicSpringConstraints.h:430
static constexpr FSolverReal DefaultStiffness
Definition XPBDAnisotropicSpringConstraints.h:361
Definition Vector.h:823
Definition Vector.h:1000
Definition Constraints.Build.cs:6
Definition ArrayView.h:139
Definition Array.h:670
void Reset(SizeType NewSize=0)
Definition Array.h:2246
SizeType AddZeroed()
Definition Array.h:2755
Definition UnrealString.h.inl:34
Definition CollectionEmbeddedSpringConstraintFacade.cpp:6
FRealSingle FSolverReal
Definition PBDSoftsEvolutionFwd.h:31
Definition SkeletalMeshComponent.h:307
float FRealSingle
Definition Real.h:14