UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
PBDRigidDynamicSpringConstraints.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
4#include "Chaos/Array.h"
7
8namespace Chaos
9{
10 class FPBDRigidDynamicSpringConstraints;
11
39
40 class FPBDRigidDynamicSpringConstraints : public TPBDIndexedConstraintContainer<FPBDRigidDynamicSpringConstraints>
41 {
42 public:
48
51 , CreationThreshold(1)
52 , MaxSprings(1)
53 , Stiffness(InStiffness)
54 {}
55
59 , CreationThreshold(InCreationThreshold)
60 , MaxSprings(InMaxSprings)
61 , Stiffness(InStiffness)
62 {
63 if (Constraints.Num() > 0)
64 {
65 Handles.Reserve(Constraints.Num());
66 Distances.Reserve(Constraints.Num());
67 SpringDistances.Reserve(Constraints.Num());
68 ConstraintSolverBodies.Reserve(Constraints.Num());
69 for (int32 ConstraintIndex = 0; ConstraintIndex < Constraints.Num(); ++ConstraintIndex)
70 {
71 Handles.Add(HandleAllocator.AllocHandle(this, ConstraintIndex));
72 Distances.Add({});
73 SpringDistances.Add({});
74 ConstraintSolverBodies.Add({ nullptr, nullptr });
75 }
76 }
77 }
78
80
81 //
82 // Constraint Container API
83 //
84
89 {
90 return Constraints.Num();
91 }
92
98 {
99 Handles.Add(HandleAllocator.AllocHandle(this, Handles.Num()));
101 Distances.Add({});
102 SpringDistances.Add({});
103 ConstraintSolverBodies.Add({ nullptr, nullptr });
104 return Handles.Last();
105 }
106
110 void RemoveConstraint(int ConstraintIndex)
111 {
112 FConstraintContainerHandle* ConstraintHandle = Handles[ConstraintIndex];
113 if (ConstraintHandle != nullptr)
114 {
115 // Release the handle for the freed constraint
116 HandleAllocator.FreeHandle(ConstraintHandle);
117 Handles[ConstraintIndex] = nullptr;
118 }
119
120 // Swap the last constraint into the gap to keep the array packed
121 Constraints.RemoveAtSwap(ConstraintIndex);
122 Distances.RemoveAtSwap(ConstraintIndex);
123 SpringDistances.RemoveAtSwap(ConstraintIndex);
124 ConstraintSolverBodies.RemoveAtSwap(ConstraintIndex);
125 Handles.RemoveAtSwap(ConstraintIndex);
126
127 // Update the handle for the constraint that was moved
128 if (ConstraintIndex < Handles.Num())
129 {
130 SetConstraintIndex(Handles[ConstraintIndex], ConstraintIndex);
131 }
132 }
133
138 {
139 // @todo(chaos)
140 }
141
142
147 {
148 CreationThreshold = InCreationThreshold;
149 }
150
155 {
156 MaxSprings = InMaxSprings;
157 }
158
159
160 //
161 // Constraint API
162 //
164 {
165 return Handles;
166 }
168 {
169 return Handles;
170 }
171
172
174 {
175 return Handles[ConstraintIndex];
176 }
177
179 {
180 return Handles[ConstraintIndex];
181 }
182
183
188 {
189 return Constraints[ConstraintIndex];
190 }
191
193
194 //
195 // FConstraintContainer Implementation
196 //
197 virtual int32 GetNumConstraints() const override final { return NumConstraints(); }
198 virtual void ResetConstraints() override final {}
199 CHAOS_API virtual void AddConstraintsToGraph(Private::FPBDIslandManager& IslandManager) override final;
200 virtual void PrepareTick() override final {}
201 virtual void UnprepareTick() override final {}
202
203 //
204 // TSimpleConstraintContainerSolver API - used by RBAN solvers
205 //
206 CHAOS_API void AddBodies(FSolverBodyContainer& SolverBodyContainer);
207 void GatherInput(const FReal Dt) {}
208 CHAOS_API void ScatterOutput(const FReal Dt);
209 CHAOS_API void ApplyPositionConstraints(const FReal Dt, const int32 It, const int32 NumIts);
210 void ApplyVelocityConstraints(const FReal Dt, const int32 It, const int32 NumIts) {}
211 void ApplyProjectionConstraints(const FReal Dt, const int32 It, const int32 NumIts) {}
212
213 //
214 // TIndexedConstraintContainerSolver API - used by World solvers
215 //
216 CHAOS_API void AddBodies(const TArrayView<int32>& ConstraintIndices, FSolverBodyContainer& SolverBodyContainer);
217 void GatherInput(const TArrayView<int32>& ConstraintIndices, const FReal Dt) {}
218 CHAOS_API void ScatterOutput(const TArrayView<int32>& ConstraintIndices, const FReal Dt);
219 CHAOS_API void ApplyPositionConstraints(const TArrayView<int32>& ConstraintIndices, const FReal Dt, const int32 It, const int32 NumIts);
220 void ApplyVelocityConstraints(const TArrayView<int32>& ConstraintIndices, const FReal Dt, const int32 It, const int32 NumIts) {}
221 void ApplyProjectionConstraints(const TArrayView<int32>& ConstraintIndices, const FReal Dt, const int32 It, const int32 NumIts) {}
222
223 protected:
226
227 private:
228 CHAOS_API void AddBodies(const int32 ConstraintIndex, FSolverBodyContainer& SolverBodyContainer);
229 CHAOS_API void ApplySingle(const FReal Dt, int32 ConstraintIndex) const;
230
231 CHAOS_API FVec3 GetDelta(const FVec3& WorldSpaceX1, const FVec3& WorldSpaceX2, const int32 ConstraintIndex, const int32 SpringIndex) const;
232
234 TArray<TArray<TVec2<FVec3>>> Distances;
235 TArray<TArray<FReal>> SpringDistances;
236 FReal CreationThreshold;
237 int32 MaxSprings;
238 FReal Stiffness;
239
240 TArray<FSolverBodyPtrPair> ConstraintSolverBodies;
241
242 FHandles Handles;
243 FConstraintHandleAllocator HandleAllocator;
244 };
245
246 template<class T, int d>
247 using TPBDRigidDynamicSpringConstraintHandle UE_DEPRECATED(4.27, "Deprecated. this class is to be deleted, use FPBDRigidDynamicSpringConstraintHandle instead") = FPBDRigidDynamicSpringConstraintHandle;
248
249 template<class T, int d>
250 using TPBDRigidDynamicSpringConstraints UE_DEPRECATED(4.27, "Deprecated. this class is to be deleted, use FPBDRigidDynamicSpringConstraints instead") = FPBDRigidDynamicSpringConstraints;
251}
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
#define TEXT(x)
Definition Platform.h:1272
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
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
A type id for constraint handles to support safe up/down casting (including intermediate classes in t...
Definition ConstraintHandle.h:49
static const FConstraintHandleTypeID & StaticType()
Definition IndexedConstraintContainer.h:50
int32 GetConstraintIndex(const FIndexedConstraintHandle *ConstraintHandle) const
Definition IndexedConstraintContainer.h:255
void SetConstraintIndex(FIndexedConstraintHandle *ConstraintHandle, int32 ConstraintIndex) const
Definition IndexedConstraintContainer.h:260
Definition PBDRigidDynamicSpringConstraints.h:13
FPBDRigidDynamicSpringConstraintHandle()
Definition PBDRigidDynamicSpringConstraints.h:18
static const FConstraintHandleTypeID & StaticType()
Definition PBDRigidDynamicSpringConstraints.h:29
virtual CHAOS_API FParticlePair GetConstrainedParticles() const override final
Definition PBDRigidDynamicSpringConstraints.cpp:10
FPBDRigidDynamicSpringConstraintHandle(FConstraintContainer *InConstraintContainer, int32 InConstraintIndex)
Definition PBDRigidDynamicSpringConstraints.h:22
Definition PBDRigidDynamicSpringConstraints.h:41
void ApplyProjectionConstraints(const FReal Dt, const int32 It, const int32 NumIts)
Definition PBDRigidDynamicSpringConstraints.h:211
void GatherInput(const FReal Dt)
Definition PBDRigidDynamicSpringConstraints.h:207
CHAOS_API void ApplyPositionConstraints(const FReal Dt, const int32 It, const int32 NumIts)
Definition PBDRigidDynamicSpringConstraints.cpp:125
virtual void ResetConstraints() override final
Definition PBDRigidDynamicSpringConstraints.h:198
const FHandles & GetConstConstraintHandles() const
Definition PBDRigidDynamicSpringConstraints.h:167
FConstraintContainerHandle * AddConstraint(const FConstrainedParticlePair &InConstrainedParticles)
Definition PBDRigidDynamicSpringConstraints.h:97
virtual void UnprepareTick() override final
Definition PBDRigidDynamicSpringConstraints.h:201
FPBDRigidDynamicSpringConstraints(TArray< FConstrainedParticlePair > &&InConstraints, const FReal InCreationThreshold=(FReal) 1., const int32 InMaxSprings=1, const FReal InStiffness=(FReal) 1.)
Definition PBDRigidDynamicSpringConstraints.h:56
const FConstraintContainerHandle * GetConstraintHandle(int32 ConstraintIndex) const
Definition PBDRigidDynamicSpringConstraints.h:173
virtual void PrepareTick() override final
Definition PBDRigidDynamicSpringConstraints.h:200
virtual CHAOS_API void AddConstraintsToGraph(Private::FPBDIslandManager &IslandManager) override final
Definition PBDRigidDynamicSpringConstraints.cpp:100
virtual int32 GetNumConstraints() const override final
Definition PBDRigidDynamicSpringConstraints.h:197
int32 NumConstraints() const
Definition PBDRigidDynamicSpringConstraints.h:88
FHandles & GetConstraintHandles()
Definition PBDRigidDynamicSpringConstraints.h:163
void SetCreationThreshold(const FReal InCreationThreshold)
Definition PBDRigidDynamicSpringConstraints.h:146
void ApplyVelocityConstraints(const FReal Dt, const int32 It, const int32 NumIts)
Definition PBDRigidDynamicSpringConstraints.h:210
void ApplyProjectionConstraints(const TArrayView< int32 > &ConstraintIndices, const FReal Dt, const int32 It, const int32 NumIts)
Definition PBDRigidDynamicSpringConstraints.h:221
void SetMaxSprings(const int32 InMaxSprings)
Definition PBDRigidDynamicSpringConstraints.h:154
void ApplyVelocityConstraints(const TArrayView< int32 > &ConstraintIndices, const FReal Dt, const int32 It, const int32 NumIts)
Definition PBDRigidDynamicSpringConstraints.h:220
void RemoveConstraint(int ConstraintIndex)
Definition PBDRigidDynamicSpringConstraints.h:110
TArray< FConstraintContainerHandle * > FHandles
Definition PBDRigidDynamicSpringConstraints.h:47
FPBDRigidDynamicSpringConstraints(const FReal InStiffness=(FReal) 1.)
Definition PBDRigidDynamicSpringConstraints.h:49
CHAOS_API void UpdatePositionBasedState(const FReal Dt)
Definition PBDRigidDynamicSpringConstraints.cpp:18
TConstraintHandleAllocator< FPBDRigidDynamicSpringConstraints > FConstraintHandleAllocator
Definition PBDRigidDynamicSpringConstraints.h:46
void GatherInput(const TArrayView< int32 > &ConstraintIndices, const FReal Dt)
Definition PBDRigidDynamicSpringConstraints.h:217
virtual ~FPBDRigidDynamicSpringConstraints()
Definition PBDRigidDynamicSpringConstraints.h:79
const FConstrainedParticlePair & GetConstrainedParticles(int32 ConstraintIndex) const
Definition PBDRigidDynamicSpringConstraints.h:187
CHAOS_API void AddBodies(FSolverBodyContainer &SolverBodyContainer)
Definition PBDRigidDynamicSpringConstraints.cpp:105
CHAOS_API void ScatterOutput(const FReal Dt)
Definition PBDRigidDynamicSpringConstraints.cpp:113
FConstraintContainerHandle * GetConstraintHandle(int32 ConstraintIndex)
Definition PBDRigidDynamicSpringConstraints.h:178
void DisableConstraints(const TSet< FGeometryParticleHandle * > &RemovedParticles)
Definition PBDRigidDynamicSpringConstraints.h:137
Definition SolverBodyContainer.h:37
Definition IslandManager.h:453
FConstraintContainerHandle * AllocHandle(FConstraintContainer *ConstraintContainer, int32 ConstraintIndex)
Definition ConstraintHandle.h:295
void FreeHandle(FConstraintContainerHandle *Handle)
Definition ConstraintHandle.h:297
Definition IndexedConstraintContainer.h:68
int32 ConstraintIndex
Definition IndexedConstraintContainer.h:59
FConstraintContainer * ConcreteContainer()
Definition IndexedConstraintContainer.h:108
Definition IndexedConstraintContainer.h:268
Definition Vector.h:41
Definition Constraints.Build.cs:6
Definition ArrayView.h:139
UE_REWRITE SizeType Num() const
Definition Array.h:1144
UE_NODEBUG UE_FORCEINLINE_HINT ElementType & Last(SizeType IndexFromTheEnd=0) UE_LIFETIMEBOUND
Definition Array.h:1263
UE_FORCEINLINE_HINT void RemoveAtSwap(SizeType Index, EAllowShrinking AllowShrinking=UE::Core::Private::AllowShrinkingByDefault< AllocatorType >())
Definition Array.h:2185
UE_NODEBUG UE_FORCEINLINE_HINT SizeType Add(ElementType &&Item)
Definition Array.h:2696
UE_FORCEINLINE_HINT void Reserve(SizeType Number)
Definition Array.h:3016
Definition SkeletalMeshComponent.h:307
FRealDouble FReal
Definition Real.h:22