UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
PBDPositionConstraints.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 FPBDPositionConstraints;
11
35
37 class FPBDPositionConstraints : public TPBDIndexedConstraintContainer<FPBDPositionConstraints>
38 {
39 public:
44
49
52 , Targets(MoveTemp(Locations)), ConstrainedParticles(MoveTemp(InConstrainedParticles)), Stiffness(InStiffness)
53 {
54 if (ConstrainedParticles.Num() > 0)
55 {
56 Handles.Reserve(ConstrainedParticles.Num());
57 for (int32 ConstraintIndex = 0; ConstraintIndex < ConstrainedParticles.Num(); ++ConstraintIndex)
58 {
59 Handles.Add(HandleAllocator.AllocHandle(this, ConstraintIndex));
60 }
61 ConstraintSolverBodies.SetNumZeroed(ConstrainedParticles.Num());
62 }
63 }
64
66
67
68 //
69 // Constraint Container API
70 //
71
76 {
77 return ConstrainedParticles.Num();
78 }
79
84 {
85 int32 NewIndex = Targets.Num();
86 Targets.Add(Position);
87 ConstrainedParticles.Add(Particle);
88 ConstraintSolverBodies.Add(nullptr);
89 Handles.Add(HandleAllocator.AllocHandle(this, NewIndex));
90 return Handles[NewIndex];
91 }
92
96 void RemoveConstraint(int ConstraintIndex)
97 {
98 FConstraintContainerHandle* ConstraintHandle = Handles[ConstraintIndex];
99 if (ConstraintHandle != nullptr)
100 {
101 // Release the handle for the freed constraint
102 HandleAllocator.FreeHandle(ConstraintHandle);
103 Handles[ConstraintIndex] = nullptr;
104 }
105
106 // Swap the last constraint into the gap to keep the array packed
107 Targets.RemoveAtSwap(ConstraintIndex);
108 ConstrainedParticles.RemoveAtSwap(ConstraintIndex);
109 ConstraintSolverBodies.RemoveAtSwap(ConstraintIndex);
110 Handles.RemoveAtSwap(ConstraintIndex);
111
112 // Update the handle for the constraint that was moved
113 if (ConstraintIndex < Handles.Num())
114 {
115 SetConstraintIndex(Handles[ConstraintIndex], ConstraintIndex);
116 }
117 }
118
119
124 {
125 // @todo(chaos)
126 }
127
128
129 //
130 // Constraint API
131 //
133 {
134 return Handles;
135 }
137 {
138 return Handles;
139 }
140
142 {
143 return Handles[ConstraintIndex];
144 }
145
147 {
148 return Handles[ConstraintIndex];
149 }
150
155 {
156 return { ConstrainedParticles[ConstraintIndex], nullptr };
157 }
158
162 const FVec3& GetConstraintPosition(int ConstraintIndex) const
163 {
164 return Targets[ConstraintIndex];
165 }
166
167 // @todo(ccaulfield): remove/rename
168 void Replace(const int32 ConstraintIndex, const FVec3& Position)
169 {
170 Targets[ConstraintIndex] = Position;
171 }
172
174
175 //
176 // FConstraintContainer Implementation
177 //
178 virtual int32 GetNumConstraints() const override final { return NumConstraints(); }
179 virtual void ResetConstraints() override final {}
180 virtual void AddConstraintsToGraph(Private::FPBDIslandManager& IslandManager) override final;
181 virtual void PrepareTick() override final {}
182 virtual void UnprepareTick() override final {}
183
184 //
185 // TSimpleConstraintContainerSolver API - used by RBAN solvers
186 //
187 void AddBodies(FSolverBodyContainer& SolverBodyContainer);
188 void GatherInput(const FReal Dt) {}
189 void ScatterOutput(const FReal Dt);
190 void ApplyPositionConstraints(const FReal Dt, const int32 It, const int32 NumIts);
191 void ApplyVelocityConstraints(const FReal Dt, const int32 It, const int32 NumIts) {}
192 void ApplyProjectionConstraints(const FReal Dt, const int32 It, const int32 NumIts) {}
193
194 //
195 // TIndexedConstraintContainerSolver API - used by World solvers
196 //
197 void AddBodies(const TArrayView<int32>& ConstraintIndices, FSolverBodyContainer& SolverBodyContainer);
198 void GatherInput(const TArrayView<int32>& ConstraintIndices, const FReal Dt) {}
199 void ScatterOutput(const TArrayView<int32>& ConstraintIndices, const FReal Dt);
200 void ApplyPositionConstraints(const TArrayView<int32>& ConstraintIndices, const FReal Dt, const int32 It, const int32 NumIts);
201 void ApplyVelocityConstraints(const TArrayView<int32>& ConstraintIndices, const FReal Dt, const int32 It, const int32 NumIts) {}
202 void ApplyProjectionConstraints(const TArrayView<int32>& ConstraintIndices, const FReal Dt, const int32 It, const int32 NumIts) {}
203
204 protected:
207
208 private:
209 void AddBodies(const int32 ConstraintIndex, FSolverBodyContainer& SolverBodyContainer);
210
211 void ApplySingle(const FReal Dt, int32 ConstraintIndex) const
212 {
213 FSolverBody* Body = ConstraintSolverBodies[ConstraintIndex];
214 if (Body != nullptr)
215 {
216 const FVec3& P1 = Body->CorrectedP();
217 const FVec3& P2 = Targets[ConstraintIndex];
218 const FVec3 Difference = P1 - P2;
219 Body->ApplyPositionDelta(-Stiffness * Difference);
220 }
221 }
222
223 TArray<FVec3> Targets;
224 TArray<FPBDRigidParticleHandle*> ConstrainedParticles;
225 FReal Stiffness;
226
227 TArray<FSolverBody*> ConstraintSolverBodies;
228
229 FHandles Handles;
230 FConstraintHandleAllocator HandleAllocator;
231 };
232
233 template <typename T, int d>
234 using TPBDPositionConstraintHandle UE_DEPRECATED(4.27, "Deprecated. this class is to be deleted, use FPBDPositionConstraintHandle instead") = FPBDPositionConstraintHandle;
235
236 template <typename T, int d>
237 using TPBDPositionConstraints UE_DEPRECATED(4.27, "Deprecated. this class is to be deleted, use FPBDPositionConstraints instead") = FPBDPositionConstraints;
238
239}
#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 PBDPositionConstraints.h:13
FPBDPositionConstraintHandle(FConstraintContainer *InConstraintContainer, int32 InConstraintIndex)
Definition PBDPositionConstraints.h:20
FGeometryParticleHandle FGeometryParticleHandle
Definition PBDPositionConstraints.h:17
static const FConstraintHandleTypeID & StaticType()
Definition PBDPositionConstraints.h:25
FPBDPositionConstraintHandle()
Definition PBDPositionConstraints.h:19
virtual FParticlePair GetConstrainedParticles() const override
Definition PBDPositionConstraints.cpp:8
Constraint a single particle to a world-space position.
Definition PBDPositionConstraints.h:38
virtual ~FPBDPositionConstraints()
Definition PBDPositionConstraints.h:65
const FConstraintContainerHandle * GetConstraintHandle(int32 ConstraintIndex) const
Definition PBDPositionConstraints.h:141
void ScatterOutput(const FReal Dt)
Definition PBDPositionConstraints.cpp:26
void ApplyVelocityConstraints(const TArrayView< int32 > &ConstraintIndices, const FReal Dt, const int32 It, const int32 NumIts)
Definition PBDPositionConstraints.h:201
virtual int32 GetNumConstraints() const override final
Definition PBDPositionConstraints.h:178
void Replace(const int32 ConstraintIndex, const FVec3 &Position)
Definition PBDPositionConstraints.h:168
void ApplyPositionConstraints(const FReal Dt, const int32 It, const int32 NumIts)
Definition PBDPositionConstraints.cpp:34
FHandles & GetConstraintHandles()
Definition PBDPositionConstraints.h:132
void ApplyVelocityConstraints(const FReal Dt, const int32 It, const int32 NumIts)
Definition PBDPositionConstraints.h:191
void UpdatePositionBasedState(const FReal Dt)
Definition PBDPositionConstraints.h:173
void DisableConstraints(const TSet< FGeometryParticleHandle * > &RemovedParticles)
Definition PBDPositionConstraints.h:123
virtual void UnprepareTick() override final
Definition PBDPositionConstraints.h:182
void ApplyProjectionConstraints(const FReal Dt, const int32 It, const int32 NumIts)
Definition PBDPositionConstraints.h:192
TConstraintHandleAllocator< FPBDPositionConstraints > FConstraintHandleAllocator
Definition PBDPositionConstraints.h:42
const FVec3 & GetConstraintPosition(int ConstraintIndex) const
Definition PBDPositionConstraints.h:162
FPBDPositionConstraints(const FReal InStiffness=(FReal) 1.)
Definition PBDPositionConstraints.h:45
virtual void PrepareTick() override final
Definition PBDPositionConstraints.h:181
FConstraintContainerHandle * GetConstraintHandle(int32 ConstraintIndex)
Definition PBDPositionConstraints.h:146
const FHandles & GetConstConstraintHandles() const
Definition PBDPositionConstraints.h:136
FPBDPositionConstraints(TArray< FVec3 > &&Locations, TArray< FPBDRigidParticleHandle * > &&InConstrainedParticles, const FReal InStiffness=(FReal) 1.)
Definition PBDPositionConstraints.h:50
void ApplyProjectionConstraints(const TArrayView< int32 > &ConstraintIndices, const FReal Dt, const int32 It, const int32 NumIts)
Definition PBDPositionConstraints.h:202
TArray< FConstraintContainerHandle * > FHandles
Definition PBDPositionConstraints.h:43
FConstraintContainerHandle * AddConstraint(FPBDRigidParticleHandle *Particle, const FVec3 &Position)
Definition PBDPositionConstraints.h:83
void RemoveConstraint(int ConstraintIndex)
Definition PBDPositionConstraints.h:96
TVec2< FGeometryParticleHandle * > GetConstrainedParticles(int32 ConstraintIndex) const
Definition PBDPositionConstraints.h:154
void AddBodies(FSolverBodyContainer &SolverBodyContainer)
Definition PBDPositionConstraints.cpp:18
virtual void AddConstraintsToGraph(Private::FPBDIslandManager &IslandManager) override final
Definition PBDPositionConstraints.cpp:13
void GatherInput(const TArrayView< int32 > &ConstraintIndices, const FReal Dt)
Definition PBDPositionConstraints.h:198
int32 NumConstraints() const
Definition PBDPositionConstraints.h:75
virtual void ResetConstraints() override final
Definition PBDPositionConstraints.h:179
void GatherInput(const FReal Dt)
Definition PBDPositionConstraints.h:188
Definition SolverBodyContainer.h:37
Definition SolverBody.h:99
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 ParticleHandle.h:987
Definition Vector.h:41
Definition ArrayView.h:139
UE_REWRITE SizeType Num() const
Definition Array.h:1144
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