UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
PBDSuspensionConstraints.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"
11#include "Chaos/Utilities.h"
12
13//PRAGMA_DISABLE_OPTIMIZATION
14
15namespace Chaos
16{
17 class FSolverBody;
18 class FPBDSuspensionConstraints;
19
20 namespace Private
21 {
22 class FPBDCollisionSolver;
23 class FPBDCollisionSolverManifoldPoint;
24 }
25
51
52 class FPBDSuspensionConstraints : public TPBDIndexedConstraintContainer<FPBDSuspensionConstraints>
53 {
54 public:
59
64
68 {
69 if (ConstrainedParticles.Num() > 0)
70 {
71 Handles.Reserve(ConstrainedParticles.Num());
72 for (int32 ConstraintIndex = 0; ConstraintIndex < ConstrainedParticles.Num(); ++ConstraintIndex)
73 {
74 Handles.Add(HandleAllocator.AllocHandle(this, ConstraintIndex));
75 }
76 }
77 }
78
80
81 //
82 // Constraint Container API
83 //
84
89 {
90 return ConstrainedParticles.Num();
91 }
92
97
101 CHAOS_API void RemoveConstraint(int ConstraintIndex);
102
103
104 /*
105 * Disconnect the constraints from the attached input particles.
106 * This will set the constrained Particle elements to nullptr and
107 * set the Enable flag to false.
108 *
109 * The constraint is unuseable at this point and pending deletion.
110 */
111
113 {
115 {
116 for (FConstraintHandle* ConstraintHandle : RemovedParticle->ParticleConstraints())
117 {
119 {
120 SuspensionHandle->SetEnabled(false); // constraint lifespan is managed by the proxy
121
122 int ConstraintIndex = SuspensionHandle->GetConstraintIndex();
123 if (ConstraintIndex != INDEX_NONE)
124 {
125 if (ConstrainedParticles[ConstraintIndex] == RemovedParticle)
126 {
127 ConstrainedParticles[ConstraintIndex] = nullptr;
128 }
129 }
130 }
131 }
132 }
133 }
134
135 bool IsConstraintEnabled(int32 ConstraintIndex) const
136 {
137 return ConstraintEnabledStates[ConstraintIndex];
138 }
139
140 void SetConstraintEnabled(int32 ConstraintIndex, bool bEnabled)
141 {
142 const FGenericParticleHandle Particle = FGenericParticleHandle(ConstrainedParticles[ConstraintIndex]);
143
144 if (bEnabled)
145 {
146 // only enable constraint if the particle is valid and not disabled
147 if (Particle->Handle() != nullptr && !Particle->Disabled())
148 {
149 ConstraintEnabledStates[ConstraintIndex] = true;
150 }
151 }
152 else
153 {
154 // desirable to allow disabling no matter what state the endpoint
155 ConstraintEnabledStates[ConstraintIndex] = false;
156 }
157
158 }
159
160 //
161 // Constraint API
162 //
163 const FPBDSuspensionSettings& GetSettings(int32 ConstraintIndex) const
164 {
165 return ConstraintSettings[ConstraintIndex];
166 }
167
169 {
170 return ConstraintSettings[ConstraintIndex];
171 }
172
173 void SetSettings(int32 ConstraintIndex, const FPBDSuspensionSettings& Settings)
174 {
175 ConstraintSettings[ConstraintIndex] = Settings;
176 }
177
178 void SetTarget(int32 ConstraintIndex, const FVector& TargetPos)
179 {
180 ConstraintSettings[ConstraintIndex].Target = TargetPos;
181 }
182
183 const FPBDSuspensionResults& GetResults(int32 ConstraintIndex) const
184 {
185 return ConstraintResults[ConstraintIndex];
186 }
187
189 {
190 return Handles;
191 }
193 {
194 return Handles;
195 }
196
198 {
199 return Handles[ConstraintIndex];
200 }
201
203 {
204 return Handles[ConstraintIndex];
205 }
206
211 {
212 return { ConstrainedParticles[ConstraintIndex], nullptr };
213 }
214
218 const FVec3& GetConstraintPosition(int ConstraintIndex) const
219 {
220 return SuspensionLocalOffset[ConstraintIndex];
221 }
222
223 void SetConstraintPosition(const int32 ConstraintIndex, const FVec3& Position)
224 {
225 SuspensionLocalOffset[ConstraintIndex] = Position;
226 }
227
228 //
229 // FConstraintContainer Implementation
230 //
231 virtual int32 GetNumConstraints() const override final { return NumConstraints(); }
232 virtual void ResetConstraints() override final {}
233 CHAOS_API virtual void AddConstraintsToGraph(Private::FPBDIslandManager& IslandManager) override final;
234 virtual void PrepareTick() override final {}
235 virtual void UnprepareTick() override final {}
236
237 //
238 // TSimpleConstraintContainerSolver API - used by RBAN
239 //
240 CHAOS_API void AddBodies(FSolverBodyContainer& SolverBodyContainer);
241 CHAOS_API void GatherInput(const FReal Dt);
242 CHAOS_API void ScatterOutput(const FReal Dt);
243 CHAOS_API void ApplyPositionConstraints(const FReal Dt, const int32 It, const int32 NumIts);
244 CHAOS_API void ApplyVelocityConstraints(const FReal Dt, const int32 It, const int32 NumIts);
245 void ApplyProjectionConstraints(const FReal Dt, const int32 It, const int32 NumIts) {}
246
247 //
248 // TIndexedConstraintContainerSolver API - used by World solvers
249 //
250 CHAOS_API void AddBodies(const TArrayView<int32>& ConstraintIndices, FSolverBodyContainer& SolverBodyContainer);
251 CHAOS_API void GatherInput(const TArrayView<int32>& ConstraintIndices, const FReal Dt);
252 CHAOS_API void ScatterOutput(const TArrayView<int32>& ConstraintIndices, const FReal Dt);
253 CHAOS_API void ApplyPositionConstraints(const TArrayView<int32>& ConstraintIndices, const FReal Dt, const int32 It, const int32 NumIts);
254 CHAOS_API void ApplyVelocityConstraints(const TArrayView<int32>& ConstraintIndices, const FReal Dt, const int32 It, const int32 NumIts);
255 void ApplyProjectionConstraints(const TArrayView<int32>& ConstraintIndices, const FReal Dt, const int32 It, const int32 NumIts) {}
256
257
258 protected:
261
262 private:
263 CHAOS_API void AddBodies(const int32 ConstraintIndex, FSolverBodyContainer& SolverBodyContainer);
264 CHAOS_API void GatherInput(const int32 ConstraintIndex, FReal Dt);
265 CHAOS_API void ScatterOutput(const int32 ConstraintIndex, FReal Dt);
266 CHAOS_API void ApplyPositionConstraint(const int32 ConstraintIndex, const FReal Dt, const int32 It, const int32 NumIts);
267 CHAOS_API void ApplyVelocityConstraint(const int32 ConstraintIndex, const FReal Dt, const int32 It, const int32 NumIts);
268 CHAOS_API void ApplySingle(int32 ConstraintIndex, const FReal Dt);
269
270 FPBDSuspensionSolverSettings SolverSettings;
271
272 TArray<FGeometryParticleHandle*> ConstrainedParticles;
273 TArray<FVec3> SuspensionLocalOffset;
275 TArray<FPBDSuspensionResults> ConstraintResults;
276 TArray<bool> ConstraintEnabledStates;
277
278 TArray<FSolverBody*> ConstraintSolverBodies;
279
280 FHandles Handles;
281 FConstraintHandleAllocator HandleAllocator;
282
284 TArray<Private::FPBDCollisionSolverManifoldPoint> CollisionSolverManifoldPoints;
285 TArray<FSolverBody> StaticCollisionBodies;
286 };
287}
288
289//PRAGMA_ENABLE_OPTIMIZATION
@ INDEX_NONE
Definition CoreMiscDefines.h:150
#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
Definition ChaosConstraintSettings.h:16
A type id for constraint handles to support safe up/down casting (including intermediate classes in t...
Definition ConstraintHandle.h:49
Base class for constraint handles.
Definition ConstraintHandle.h:102
T * As()
Definition PBDConstraintContainer.h:136
bool Disabled() const
Definition ParticleHandle.h:1953
const FGeometryParticleHandle * Handle() const
Definition ParticleHandle.h:1800
Definition ParticleHandle.h:2590
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 PBDSuspensionConstraints.h:27
FPBDSuspensionConstraints FConstraintContainer
Definition PBDSuspensionConstraints.h:30
static const FConstraintHandleTypeID & StaticType()
Definition PBDSuspensionConstraints.h:42
CHAOS_API void SetSettings(const FPBDSuspensionSettings &Settings)
Definition PBDSuspensionConstraints.cpp:54
CHAOS_API FPBDSuspensionSettings & GetSettings()
Definition PBDSuspensionConstraints.cpp:49
FPBDSuspensionConstraintHandle()
Definition PBDSuspensionConstraints.h:32
virtual CHAOS_API FParticlePair GetConstrainedParticles() const override final
Definition PBDSuspensionConstraints.cpp:59
Definition PBDSuspensionConstraints.h:53
const FPBDSuspensionSettings & GetSettings(int32 ConstraintIndex) const
Definition PBDSuspensionConstraints.h:163
const FVec3 & GetConstraintPosition(int ConstraintIndex) const
Definition PBDSuspensionConstraints.h:218
TArray< FConstraintContainerHandle * > FHandles
Definition PBDSuspensionConstraints.h:58
FHandles & GetConstraintHandles()
Definition PBDSuspensionConstraints.h:188
FPBDSuspensionConstraintHandle FConstraintContainerHandle
Definition PBDSuspensionConstraints.h:56
FPBDSuspensionConstraints(TArray< FVec3 > &&Locations, TArray< TGeometryParticleHandle< FReal, 3 > * > &&InConstrainedParticles, TArray< FVec3 > &&InLocalOffset, TArray< FPBDSuspensionSettings > &&InConstraintSettings)
Definition PBDSuspensionConstraints.h:65
virtual void UnprepareTick() override final
Definition PBDSuspensionConstraints.h:235
virtual ~FPBDSuspensionConstraints()
Definition PBDSuspensionConstraints.h:79
CHAOS_API void GatherInput(const FReal Dt)
Definition PBDSuspensionConstraints.cpp:130
bool IsConstraintEnabled(int32 ConstraintIndex) const
Definition PBDSuspensionConstraints.h:135
void ApplyProjectionConstraints(const TArrayView< int32 > &ConstraintIndices, const FReal Dt, const int32 It, const int32 NumIts)
Definition PBDSuspensionConstraints.h:255
virtual void ResetConstraints() override final
Definition PBDSuspensionConstraints.h:232
int32 NumConstraints() const
Definition PBDSuspensionConstraints.h:88
void SetConstraintPosition(const int32 ConstraintIndex, const FVec3 &Position)
Definition PBDSuspensionConstraints.h:223
CHAOS_API FConstraintContainerHandle * AddConstraint(TGeometryParticleHandle< FReal, 3 > *Particle, const FVec3 &InConstraintFrame, const FPBDSuspensionSettings &InConstraintSettings)
Definition PBDSuspensionConstraints.cpp:64
void ApplyProjectionConstraints(const FReal Dt, const int32 It, const int32 NumIts)
Definition PBDSuspensionConstraints.h:245
FConstraintContainerHandle * GetConstraintHandle(int32 ConstraintIndex)
Definition PBDSuspensionConstraints.h:202
void SetConstraintEnabled(int32 ConstraintIndex, bool bEnabled)
Definition PBDSuspensionConstraints.h:140
TVec2< TGeometryParticleHandle< FReal, 3 > * > GetConstrainedParticles(int32 ConstraintIndex) const
Definition PBDSuspensionConstraints.h:210
void SetTarget(int32 ConstraintIndex, const FVector &TargetPos)
Definition PBDSuspensionConstraints.h:178
void SetSettings(int32 ConstraintIndex, const FPBDSuspensionSettings &Settings)
Definition PBDSuspensionConstraints.h:173
TConstraintHandleAllocator< FPBDSuspensionConstraints > FConstraintHandleAllocator
Definition PBDSuspensionConstraints.h:57
virtual CHAOS_API void AddConstraintsToGraph(Private::FPBDIslandManager &IslandManager) override final
Definition PBDSuspensionConstraints.cpp:117
void DisconnectConstraints(const TSet< TGeometryParticleHandle< FReal, 3 > * > &RemovedParticles)
Definition PBDSuspensionConstraints.h:112
CHAOS_API void ApplyVelocityConstraints(const FReal Dt, const int32 It, const int32 NumIts)
Definition PBDSuspensionConstraints.cpp:154
FPBDSuspensionConstraints(const FPBDSuspensionSolverSettings &InSolverSettings=FPBDSuspensionSolverSettings())
Definition PBDSuspensionConstraints.h:60
const FHandles & GetConstConstraintHandles() const
Definition PBDSuspensionConstraints.h:192
virtual int32 GetNumConstraints() const override final
Definition PBDSuspensionConstraints.h:231
CHAOS_API void AddBodies(FSolverBodyContainer &SolverBodyContainer)
Definition PBDSuspensionConstraints.cpp:122
virtual void PrepareTick() override final
Definition PBDSuspensionConstraints.h:234
CHAOS_API void ScatterOutput(const FReal Dt)
Definition PBDSuspensionConstraints.cpp:138
CHAOS_API void ApplyPositionConstraints(const FReal Dt, const int32 It, const int32 NumIts)
Definition PBDSuspensionConstraints.cpp:146
CHAOS_API void RemoveConstraint(int ConstraintIndex)
Definition PBDSuspensionConstraints.cpp:82
const FPBDSuspensionResults & GetResults(int32 ConstraintIndex) const
Definition PBDSuspensionConstraints.h:183
FPBDSuspensionSettings & GetSettings(int32 ConstraintIndex)
Definition PBDSuspensionConstraints.h:168
const FConstraintContainerHandle * GetConstraintHandle(int32 ConstraintIndex) const
Definition PBDSuspensionConstraints.h:197
Definition PBDSuspensionConstraintTypes.h:75
Definition PBDSuspensionConstraintTypes.h:28
Definition PBDSuspensionConstraintTypes.h:95
Definition SolverBodyContainer.h:37
Definition IslandManager.h:453
FConstraintContainerHandle * AllocHandle(FConstraintContainer *ConstraintContainer, int32 ConstraintIndex)
Definition ConstraintHandle.h:295
Definition ParticleHandle.h:436
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 ArrayView.h:139
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
Definition OverriddenPropertySet.cpp:45