UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
PBDAnimDriveConstraint.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
4// HEADER_UNIT_SKIP - Internal
5
10#include "Chaos/PBDStiffness.h"
12#include "ChaosStats.h"
13
15
16namespace Chaos::Softs
17{
18
20 {
21 public:
26
30 const TArray<FSolverVec3>& InAnimationPositions, // Use global indexation (will need adding ParticleOffset)
31 const TArray<FSolverVec3>& InAnimationVelocities, // Use global indexation (will need adding ParticleOffset)
32 const TMap<FString, TConstArrayView<FRealSingle>>& WeightMaps,
34 )
35 : AnimationPositions(InAnimationPositions)
36 , AnimationVelocities(InAnimationVelocities)
37 , ParticleOffset(InParticleOffset)
38 , ParticleCount(InParticleCount)
39 , Stiffness(
43 , Damping(
49 {
50 }
51
55 const TArray<FSolverVec3>& InAnimationPositions, // Use global indexation (will need adding ParticleOffset)
56 const TArray<FSolverVec3>& /*InOldAnimationPositions*/, // deprecated
57 const TArray<FSolverVec3>& InAnimationVelocities, // Use global indexation (will need adding ParticleOffset)
58 const TConstArrayView<FRealSingle>& StiffnessMultipliers, // Use local indexation
59 const TConstArrayView<FRealSingle>& DampingMultipliers // Use local indexation
60 )
61 : AnimationPositions(InAnimationPositions)
62 , AnimationVelocities(InAnimationVelocities)
63 , ParticleOffset(InParticleOffset)
64 , ParticleCount(InParticleCount)
65 , Stiffness(FSolverVec2::UnitVector, StiffnessMultipliers, InParticleCount)
66 , Damping(FSolverVec2::UnitVector, DampingMultipliers, InParticleCount)
69 {
70 }
71
73
74 // Return the stiffness input values used by the constraint
75 FSolverVec2 GetStiffness() const { return Stiffness.GetWeightedValue(); }
76
77 // Return the damping input values used by the constraint
78 FSolverVec2 GetDamping() const { return Damping.GetWeightedValue(); }
79
82 const TMap<FString, TConstArrayView<FRealSingle>>& WeightMaps)
83 {
85 {
88 {
90 Stiffness = FPBDStiffness(WeightedValue, WeightMaps.FindRef(WeightMapName), ParticleCount);
91 }
92 else
93 {
94 Stiffness.SetWeightedValue(WeightedValue);
95 }
96 }
98 {
101 {
103 Damping = FPBDStiffness(WeightedValue, WeightMaps.FindRef(WeightMapName), ParticleCount);
104 }
105 else
106 {
107 Damping.SetWeightedValue(WeightedValue);
108 }
109 }
110 }
111
113 {
114 Stiffness.SetWeightedValue(InStiffness);
116 }
117
118 // Set stiffness offset and range, as well as the simulation stiffness exponent
119 inline void ApplyProperties(const FSolverReal Dt, const int32 NumIterations)
120 {
121 Stiffness.ApplyPBDValues(Dt, NumIterations);
122 Damping.ApplyPBDValues(Dt, NumIterations);
123 }
124
126 {
127 return TConstArrayView<FSolverVec3>(Data.GetData() + ParticleOffset, ParticleCount);
128 }
129
134
135 template<typename SolverParticlesOrRange>
137 {
139
140 if (Stiffness.HasWeightMap())
141 {
142 if (Damping.HasWeightMap())
143 {
146 PhysicsParallelFor(ParticleCount, [this, &InParticles, &Dt, &AnimationPositionsView, &AnimationVelocitiesView](int32 Index) // TODO: profile needed for these parallel loop based on particle count
147 {
148 const FSolverReal ParticleStiffness = Stiffness[Index];
149 const FSolverReal ParticleDamping = Damping[Index];
151 });
152 }
153 else
154 {
155 const FSolverReal ParticleDamping = (FSolverReal)Damping;
159 {
160 const FSolverReal ParticleStiffness = Stiffness[Index];
162 });
163 }
164 }
165 else
166 {
167 const FSolverReal ParticleStiffness = (FSolverReal)Stiffness;
168 if (Damping.HasWeightMap())
169 {
173 {
174 const FSolverReal ParticleDamping = Damping[Index];
176 });
177 }
178 else
179 {
180 const FSolverReal ParticleDamping = (FSolverReal)Damping;
184 {
186 });
187 }
188 }
189 }
190
193
194 private:
195
196
197 template<typename SolverParticlesOrRange>
198 inline void ApplyHelper(SolverParticlesOrRange& Particles, const FSolverReal InStiffness, const FSolverReal InDamping, const FSolverReal Dt, const int32 Index, const FSolverVec3& AnimPosition, const FSolverVec3& AnimVelocity) const
199 {
200 const int32 ParticleIndex = ParticleOffset + Index;
201 if (Particles.InvM(ParticleIndex) == (FSolverReal)0.)
202 {
203 return;
204 }
205
206 FSolverVec3& ParticlePosition = Particles.P(ParticleIndex);
207
208 ParticlePosition -= InStiffness * (ParticlePosition - AnimPosition);
209
210 const FSolverVec3 ParticleDisplacement = ParticlePosition - Particles.GetX(ParticleIndex);
213
214 ParticlePosition -= InDamping * RelativeDisplacement;
215 }
216
217 private:
218 const TArray<FSolverVec3>& AnimationPositions; // Use global index (needs adding ParticleOffset)
219 const TArray<FSolverVec3>& AnimationVelocities; // Use global index (needs adding ParticleOffset).
220 const int32 ParticleOffset;
221 const int32 ParticleCount;
222
223 FPBDStiffness Stiffness;
224 FPBDStiffness Damping;
225
228 };
229
230} // End namespace Chaos::Softs
#define UE_CHAOS_DECLARE_INDEXED_PROPERTYCOLLECTION_NAME(PropertyName, Type)
Definition CollectionPropertyFacade.h:893
@ ForceInit
Definition CoreMiscDefines.h:155
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
#define DECLARE_CYCLE_STAT(CounterName, StatId, GroupId)
Definition Stats.h:669
#define SCOPE_CYCLE_COUNTER(Stat)
Definition Stats.h:650
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
Definition CollectionPropertyFacade.h:49
Definition PBDAnimDriveConstraint.h:20
void ApplyProperties(const FSolverReal Dt, const int32 NumIterations)
Definition PBDAnimDriveConstraint.h:119
FSolverVec2 GetStiffness() const
Definition PBDAnimDriveConstraint.h:75
TConstArrayView< FSolverVec3 > GetConstArrayView(const FSolverParticles &Particles, const TArray< FSolverVec3 > &Data) const
Definition PBDAnimDriveConstraint.h:125
FSolverVec2 GetDamping() const
Definition PBDAnimDriveConstraint.h:78
void SetProperties(const FCollectionPropertyConstFacade &PropertyCollection, const TMap< FString, TConstArrayView< FRealSingle > > &WeightMaps)
Definition PBDAnimDriveConstraint.h:80
void Apply(SolverParticlesOrRange &InParticles, const FSolverReal Dt) const
Definition PBDAnimDriveConstraint.h:136
~FPBDAnimDriveConstraint()
Definition PBDAnimDriveConstraint.h:72
FPBDAnimDriveConstraint(const int32 InParticleOffset, const int32 InParticleCount, const TArray< FSolverVec3 > &InAnimationPositions, const TArray< FSolverVec3 > &, const TArray< FSolverVec3 > &InAnimationVelocities, const TConstArrayView< FRealSingle > &StiffnessMultipliers, const TConstArrayView< FRealSingle > &DampingMultipliers)
Definition PBDAnimDriveConstraint.h:52
TConstArrayView< FSolverVec3 > GetConstArrayView(const FSolverParticlesRange &Particles, const TArray< FSolverVec3 > &Data) const
Definition PBDAnimDriveConstraint.h:130
void SetProperties(const FSolverVec2 &InStiffness, const FSolverVec2 &InDamping)
Definition PBDAnimDriveConstraint.h:112
static bool IsEnabled(const FCollectionPropertyConstFacade &PropertyCollection)
Definition PBDAnimDriveConstraint.h:22
UE_CHAOS_DECLARE_INDEXLESS_PROPERTYCOLLECTION_NAME(AnimDriveStiffness, float)
FPBDAnimDriveConstraint(const int32 InParticleOffset, const int32 InParticleCount, const TArray< FSolverVec3 > &InAnimationPositions, const TArray< FSolverVec3 > &InAnimationVelocities, const TMap< FString, TConstArrayView< FRealSingle > > &WeightMaps, const FCollectionPropertyConstFacade &PropertyCollection)
Definition PBDAnimDriveConstraint.h:27
UE_CHAOS_DECLARE_INDEXLESS_PROPERTYCOLLECTION_NAME(AnimDriveDamping, float)
Definition PBDStiffness.h:21
void SetWeightedValue(const FSolverVec2 &InWeightedValue, FSolverReal MaxStiffness=DefaultPBDMaxStiffness)
Definition PBDStiffness.h:65
void ApplyPBDValues(const FSolverReal Dt, const int32 NumIterations)
Definition PBDStiffness.h:124
const FSolverVec2 & GetWeightedValue() const
Definition PBDWeightMap.h:68
bool HasWeightMap() const
Definition PBDWeightMap.h:55
Definition SoftsSolverParticlesRange.h:12
Definition PBDSoftsSolverParticles.h:20
TConstArrayView< T > GetConstArrayView(const TArray< T > &Array) const
Definition ParticlesRange.h:73
Definition Array.h:670
Definition UnrealString.h.inl:34
Definition CollectionEmbeddedSpringConstraintFacade.cpp:6
FRealSingle FSolverReal
Definition PBDSoftsEvolutionFwd.h:31
void CHAOS_API PhysicsParallelFor(int32 InNum, TFunctionRef< void(int32)> InCallable, bool bForceSingleThreaded=false)
Definition Parallel.cpp:55
U16 Index
Definition radfft.cpp:71
Definition CollectionMuscleActivationFacade.h:20