UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
XPBDStretchBiasElementConstraints.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
9#include "ChaosStats.h"
10
11namespace Chaos
12{
13class FTriangleMesh;
14}
15
16namespace Chaos::Softs
17{
18
20{
21public:
22 // Stiffness is in kg cm / s^2 for stretch, kg cm^2 / s^2 for Bias
23 static constexpr FSolverReal MinStiffness = (FSolverReal)1e-4; // Stiffness below this will be considered 0 since all of our calculations are actually based on 1 / stiffness.
24 static constexpr FSolverReal MaxStiffness = (FSolverReal)1e7;
25 static constexpr FSolverReal MinDamping = (FSolverReal)0.;
26 static constexpr FSolverReal MaxDamping = (FSolverReal)1000.;
27 static constexpr bool bDefaultUse3dRestLengths = true;
28 static constexpr FSolverReal MinWarpWeftScale = (FSolverReal)0.;
29 static constexpr FSolverReal MaxWarpWeftScale = (FSolverReal)1e7; // No particular reason for this number. Just can't imagine wanting something bigger?
31
36
38 const FTriangleMesh& TriangleMesh,
40 const TMap<FString, TConstArrayView<FRealSingle>>& WeightMaps,
42 bool bTrimKinematicConstraints = false);
43
45 int32 ParticleOffset,
46 int32 ParticleCount,
47 const FTriangleMesh& TriangleMesh,
49 const TMap<FString, TConstArrayView<FRealSingle>>& WeightMaps,
51 bool bTrimKinematicConstraints = false);
52
54 int32 ParticleOffset,
55 int32 ParticleCount,
56 const FTriangleMesh& TriangleMesh,
71 bool bTrimKinematicConstraints = false);
72
74
75 void Init()
76 {
77 Lambdas.Reset();
78 Lambdas.AddZeroed(Constraints.Num());
79 }
80
83 const TMap<FString, TConstArrayView<FRealSingle>>& WeightMaps);
84
94
95 // Update stiffness table, as well as the simulation stiffness exponent
96 void ApplyProperties(const FSolverReal /*Dt*/, const int32 /*NumIterations*/)
97 {
98 StiffnessWarp.ApplyXPBDValues(MaxStiffness);
99 StiffnessWeft.ApplyXPBDValues(MaxStiffness);
100 StiffnessBias.ApplyXPBDValues(MaxStiffness);
101 DampingRatio.ApplyValues();
102 WarpScale.ApplyValues();
103 WeftScale.ApplyValues();
104 }
105
106 template<typename SolverParticlesOrRange>
107 CHAOS_API void Apply(SolverParticlesOrRange& Particles, const FSolverReal Dt) const;
108 CHAOS_API void CalculateUVStretch(const int32 ConstraintIndex, const FSolverVec3& P0, const FSolverVec3& P1, const FSolverVec3& P2, FSolverVec3& DXDu, FSolverVec3& DXDv) const;
109
111
113 {
116 for (int32 i = 0; i < Constraints.Num(); i++)
117 {
118 ConstraintsArray[i].SetNum(3);
119 for (int32 j = 0; j < 3; j++)
120 {
121 ConstraintsArray[i][j] = Constraints[i][j];
122 }
123 }
124 return ConstraintsArray;
125 }
126 const TArray<FSolverVec3> GetRestStretchLengths() const { return RestStretchLengths; }
127 FSolverVec2 GetWarpWeftScale(const int32 ConstraintIndex) const
128 {
129 return FSolverVec2(WarpScale.HasWeightMap() ? WarpScale[ConstraintIndex] : (FSolverReal)WarpScale,
130 WeftScale.HasWeightMap() ? WeftScale[ConstraintIndex] : (FSolverReal)WeftScale);
131 }
132 const TArray<int32>& GetConstraintsPerColorStartIndex() const { return ConstraintsPerColorStartIndex; }
133
135
137
139
140private:
141 template<typename SolverParticlesOrRange>
142 void InitConstraintsAndRestData(const SolverParticlesOrRange& InParticles, const FTriangleMesh& TriangleMesh,
144 template<typename SolverParticlesOrRange>
145 void InitColor(const SolverParticlesOrRange& InParticles);
146 template<typename SolverParticlesOrRange>
147 void ApplyHelper(SolverParticlesOrRange& Particles, const FSolverReal Dt, const int32 ConstraintIndex, const FSolverVec3& ExpStiffnessValue, const FSolverReal DampingRatioValue, const FSolverReal WarpScaleValue, const FSolverReal WeftScaleValue) const;
148
150 const int32 ParticleOffset;
151 const int32 ParticleCount;
152 FPBDStiffness StiffnessWarp;
153 FPBDStiffness StiffnessWeft;
154 FPBDStiffness StiffnessBias;
155 FPBDWeightMap DampingRatio;
156 FPBDWeightMap WarpScale;
157 FPBDWeightMap WeftScale;
158 mutable TArray<FSolverVec3> Lambdas; // separate for stretchU, stretchV, Bias
159 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.
160
161 TArray<FSolverMatrix22> DeltaUVInverse; // Used to convert from DeltaX to dX/dU and dX/dV
162 TArray<FSolverVec3> RestStretchLengths;
163 TArray<FSolverVec3> StiffnessScales; // Used to make everything resolution independent.
164
165 TArray<FSolverReal> Measure;
166 TArray<FSolverMatrix22> DmInverse;
168 bool bDmInitialized = false;
169
171
179};
180
181} // End namespace Chaos::Softs
182
183#if !defined(CHAOS_XPBD_STRETCH_BIAS_ELEMENT_ISPC_ENABLED_DEFAULT)
184#define CHAOS_XPBD_STRETCH_BIAS_ELEMENT_ISPC_ENABLED_DEFAULT 1
185#endif
186
187// Support ISPC enable/disable in non-shipping builds
188#if !INTEL_ISPC || UE_BUILD_SHIPPING
189static constexpr bool bChaos_XPBDStretchBiasElement_ISPC_Enabled = INTEL_ISPC && CHAOS_XPBD_STRETCH_BIAS_ELEMENT_ISPC_ENABLED_DEFAULT;
190#else
191extern CHAOS_API bool bChaos_XPBDStretchBiasElement_ISPC_Enabled;
192#endif
#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
#define CHAOS_XPBD_STRETCH_BIAS_ELEMENT_ISPC_ENABLED_DEFAULT
Definition XPBDStretchBiasElementConstraints.h:184
Definition TriangleMesh.h:24
Definition Matrix.h:21
Definition CollectionPropertyFacade.h:49
Definition PBDStiffness.h:21
void SetWeightedValue(const FSolverVec2 &InWeightedValue, FSolverReal MaxStiffness=DefaultPBDMaxStiffness)
Definition PBDStiffness.h:65
void ApplyXPBDValues(const FSolverReal MaxStiffnesss)
Definition PBDStiffness.h:164
Definition PBDWeightMap.h:19
void ApplyValues(bool *bOutUpdated=nullptr)
Definition PBDWeightMap.h:71
void SetWeightedValue(const FSolverVec2 &InWeightedValue)
Definition PBDWeightMap.h:62
bool HasWeightMap() const
Definition PBDWeightMap.h:55
Definition SoftsSolverParticlesRange.h:12
Definition PBDSoftsSolverParticles.h:20
Definition XPBDStretchBiasElementConstraints.h:20
void SetProperties(const FSolverVec2 &InStiffnessWarp, const FSolverVec2 &InStiffnessWeft, const FSolverVec2 &InStiffnessBias, const FSolverVec2 &InDampingRatio, const FSolverVec2 &InWarpScale, const FSolverVec2 &InWeftScale)
Definition XPBDStretchBiasElementConstraints.h:85
static constexpr FSolverReal MaxWarpWeftScale
Definition XPBDStretchBiasElementConstraints.h:29
static constexpr FSolverReal MinDamping
Definition XPBDStretchBiasElementConstraints.h:25
CHAOS_API void Apply(SolverParticlesOrRange &Particles, const FSolverReal Dt) const
static constexpr FSolverReal MaxStiffness
Definition XPBDStretchBiasElementConstraints.h:24
CHAOS_API void AddStretchBiasElementResidualAndHessian(const FSolverParticles &Particles, const int32 ConstraintIndex, const int32 ConstraintIndexLocal, const FSolverReal Dt, TVec3< FSolverReal > &ParticleResidual, Chaos::PMatrix< FSolverReal, 3, 3 > &ParticleHessian)
Definition XPBDStretchBiasElementConstraints.cpp:886
static bool IsEnabled(const FCollectionPropertyConstFacade &PropertyCollection)
Definition XPBDStretchBiasElementConstraints.h:32
CHAOS_API void CalculateUVStretch(const int32 ConstraintIndex, const FSolverVec3 &P0, const FSolverVec3 &P1, const FSolverVec3 &P2, FSolverVec3 &DXDu, FSolverVec3 &DXDv) const
Definition XPBDStretchBiasElementConstraints.cpp:756
FSolverVec2 GetWarpWeftScale(const int32 ConstraintIndex) const
Definition XPBDStretchBiasElementConstraints.h:127
const TArray< FSolverVec3 > GetRestStretchLengths() const
Definition XPBDStretchBiasElementConstraints.h:126
static constexpr FSolverReal DefaultWarpWeftScale
Definition XPBDStretchBiasElementConstraints.h:30
static constexpr FSolverReal MinWarpWeftScale
Definition XPBDStretchBiasElementConstraints.h:28
CHAOS_API void SetProperties(const FCollectionPropertyConstFacade &PropertyCollection, const TMap< FString, TConstArrayView< FRealSingle > > &WeightMaps)
Definition XPBDStretchBiasElementConstraints.cpp:405
static constexpr bool bDefaultUse3dRestLengths
Definition XPBDStretchBiasElementConstraints.h:27
static constexpr FSolverReal MaxDamping
Definition XPBDStretchBiasElementConstraints.h:26
void ApplyProperties(const FSolverReal, const int32)
Definition XPBDStretchBiasElementConstraints.h:96
CHAOS_API void InitializeDmInvAndMeasures(const FSolverParticles &Particles)
Definition XPBDStretchBiasElementConstraints.cpp:859
CHAOS_API void AddInternalForceDifferential(const FSolverParticles &InParticles, const TArray< TVector< FSolverReal, 3 > > &DeltaParticles, TArray< TVector< FSolverReal, 3 > > &ndf)
Definition XPBDStretchBiasElementConstraints.cpp:1112
const TArray< TVec3< int32 > > & GetConstraints() const
Definition XPBDStretchBiasElementConstraints.h:110
void Init()
Definition XPBDStretchBiasElementConstraints.h:75
static constexpr FSolverReal MinStiffness
Definition XPBDStretchBiasElementConstraints.h:23
TArray< TArray< int32 > > GetConstraintsArray() const
Definition XPBDStretchBiasElementConstraints.h:112
const TArray< int32 > & GetConstraintsPerColorStartIndex() const
Definition XPBDStretchBiasElementConstraints.h:132
virtual ~FXPBDStretchBiasElementConstraints()
Definition XPBDStretchBiasElementConstraints.h:73
Definition Vector.h:1000
Definition Constraints.Build.cs:6
Definition Array.h:670
void SetNum(SizeType NewNum, EAllowShrinking AllowShrinking=UE::Core::Private::AllowShrinkingByDefault< AllocatorType >())
Definition Array.h:2308
Definition UnrealString.h.inl:34
Definition CollectionEmbeddedSpringConstraintFacade.cpp:6
TVector< FSolverReal, 2 > FSolverVec2
Definition PBDSoftsEvolutionFwd.h:32
FRealSingle FSolverReal
Definition PBDSoftsEvolutionFwd.h:31
Definition SkeletalMeshComponent.h:307