UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
IndexedConstraintContainer.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
8
9namespace Chaos
10{
61
62
66 template<typename T_CONTAINER>
68 {
69 public:
73
78
83
84 inline virtual void SetEnabled(bool bInEnabled) override
85 {
86 if (ConcreteContainer() != nullptr)
87 {
88 ConcreteContainer()->SetConstraintEnabled(ConstraintIndex, bInEnabled);
89 }
90 }
91
92 inline virtual bool IsEnabled() const override
93 {
94 if (ConcreteContainer() != nullptr)
95 {
96 return ConcreteContainer()->IsConstraintEnabled(ConstraintIndex);
97 }
98 return false;
99 }
100
101 // @todo(chaos): Make this a virtual on FConstraintContainer and move to base class
103 {
104 ConcreteContainer()->RemoveConstraint(ConstraintIndex);
105 }
106
107 protected:
112
114 {
115 return static_cast<const FConstraintContainer*>(ConstraintContainer);
116 }
117
119 };
120
127 template<typename ConstraintContainerType>
129 {
130 public:
132 using FConstraintHandleType = typename FConstraintContainerType::FConstraintContainerHandle;
133
139
140 virtual void Reset(const int32 MaxConstraints) override final
141 {
142 ConstraintIndices.Reset(MaxConstraints);
143 }
144
145 virtual int32 GetNumConstraints() const override final
146 {
147 return ConstraintIndices.Num();
148 }
149
150 virtual void AddConstraints() override final
151 {
152 // This solver container is for use with the constraint graph. It will not call this function.
153 ensure(false);
154 }
155
157 {
159 {
160 FConstraintHandle* Constraint = IslandConstraint->GetConstraint();
161
162 // Filter out sleeping constraints in any partially sleeping island
163 // @todo(chaos): This is not working correctly since IsSleeping() always returns false for this constraint type.
164 // As a result, the constraint is added to the solver, data is gathered and scattered, and the constraint correction is computed.
165 // Nevertheless, the two connected particles are considered kinematic and, thus, do not "feel" the effect of the constraint.
166 // Hence, the solve remains correct, but we do more work than needed.
167 // In the future, we should store sleep state of for this constraint type as well.
168 if (!Constraint->IsSleeping())
169 {
170 // We will only ever be given constraints from our container (asserts in non-shipping)
172
174
175 ConstraintIndices.Add(ConstraintIndex);
176 }
177 }
178 }
179
180 virtual void AddBodies(FSolverBodyContainer& SolverBodyContainer) override final
181 {
182 ConstraintContainer.AddBodies(ConstraintIndices, SolverBodyContainer);
183 }
184
185 virtual void GatherInput(const FReal Dt) override final
186 {
187 ConstraintContainer.GatherInput(ConstraintIndices, Dt);
188 }
189
190 virtual void GatherInput(const FReal Dt, const int32 BeginIndex, const int32 EndIndex) override final
191 {
192 check(BeginIndex >= 0);
193 check(EndIndex <= GetNumConstraints());
194
195 const int32 RangeSize = EndIndex - BeginIndex;
196 if (RangeSize > 0)
197 {
198 TArrayView<int32> RangeIndices = MakeArrayView(&ConstraintIndices[BeginIndex], RangeSize);
199 ConstraintContainer.GatherInput(RangeIndices, Dt);
200 }
201 }
202
203 virtual void ScatterOutput(const FReal Dt) override final
204 {
205 ConstraintContainer.ScatterOutput(ConstraintIndices, Dt);
206 }
207
208 virtual void ScatterOutput(const FReal Dt, const int32 BeginIndex, const int32 EndIndex) override final
209 {
210 const int32 RangeSize = EndIndex - BeginIndex;
211 if (RangeSize > 0)
212 {
213 TArrayView<int32> RangeIndices = MakeArrayView(&ConstraintIndices[BeginIndex], RangeSize);
214 ConstraintContainer.ScatterOutput(RangeIndices, Dt);
215 }
216 }
217
218 virtual void ApplyPositionConstraints(const FReal Dt, const int32 It, const int32 NumIts) override final
219 {
220 ConstraintContainer.ApplyPositionConstraints(ConstraintIndices, Dt, It, NumIts);
221 }
222
223 virtual void ApplyVelocityConstraints(const FReal Dt, const int32 It, const int32 NumIts) override final
224 {
225 ConstraintContainer.ApplyVelocityConstraints(ConstraintIndices, Dt, It, NumIts);
226 }
227
228 virtual void ApplyProjectionConstraints(const FReal Dt, const int32 It, const int32 NumIts) override final
229 {
230 ConstraintContainer.ApplyProjectionConstraints(ConstraintIndices, Dt, It, NumIts);
231 }
232
233 private:
234 FConstraintContainerType& ConstraintContainer;
235 TArray<int32> ConstraintIndices;
236 };
237
238
243 {
244 public:
249
250 virtual void SetConstraintEnabled(int32 ConstraintIndex, bool bEnabled) { }
251 virtual bool IsConstraintEnabled(int32 ConstraintIndex) const { return true; }
252
253 protected:
254 // @todo(chaos): remove these
255 inline int32 GetConstraintIndex(const FIndexedConstraintHandle* ConstraintHandle) const
256 {
257 return ConstraintHandle->GetConstraintIndex();
258 }
259
260 inline void SetConstraintIndex(FIndexedConstraintHandle* ConstraintHandle, int32 ConstraintIndex) const
261 {
262 ConstraintHandle->ConstraintIndex = ConstraintIndex;
263 }
264 };
265
266 template<typename ConstaintContainerType>
268 {
269 public:
271
276
277 // Create RBAN solver: just solves all constraints in the container in the container's order
282
283 // Create Main Scene solver: solves constraints in groups determined by the island manager
288 };
289
290}
constexpr auto MakeArrayView(OtherRangeType &&Other)
Definition ArrayView.h:873
#define check(expr)
Definition AssertionMacros.h:314
#define ensure( InExpression)
Definition AssertionMacros.h:464
@ 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
Definition SolverConstraintContainer.h:29
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 * AsUnsafe()
Definition ConstraintHandle.h:189
virtual bool IsValid() const
Definition ConstraintHandle.h:124
FPBDConstraintContainer * ConstraintContainer
Definition ConstraintHandle.h:213
static const FConstraintHandleTypeID & StaticType()
Definition ConstraintHandle.h:194
virtual bool IsSleeping() const
Definition ConstraintHandle.h:172
Definition IndexedConstraintContainer.h:15
int32 ConstraintIndex
Definition IndexedConstraintContainer.h:59
FIndexedConstraintHandle()
Definition IndexedConstraintContainer.h:19
TGeometryParticleHandle< FReal, 3 > FGeometryParticleHandle
Definition IndexedConstraintContainer.h:17
FIndexedConstraintHandle(FPBDConstraintContainer *InContainer, int32 InConstraintIndex)
Definition IndexedConstraintContainer.h:25
static const FConstraintHandleTypeID & StaticType()
Definition IndexedConstraintContainer.h:50
int32 GetConstraintIndex() const
Definition IndexedConstraintContainer.h:40
virtual ~FIndexedConstraintHandle()
Definition IndexedConstraintContainer.h:31
void SetConstraintIndex(const int32 InConstraintIndex)
Definition IndexedConstraintContainer.h:45
virtual bool IsValid() const override
Definition IndexedConstraintContainer.h:35
Definition PBDConstraintContainer.h:19
Definition IndexedConstraintContainer.h:243
virtual bool IsConstraintEnabled(int32 ConstraintIndex) const
Definition IndexedConstraintContainer.h:251
virtual void SetConstraintEnabled(int32 ConstraintIndex, bool bEnabled)
Definition IndexedConstraintContainer.h:250
int32 GetConstraintIndex(const FIndexedConstraintHandle *ConstraintHandle) const
Definition IndexedConstraintContainer.h:255
void SetConstraintIndex(FIndexedConstraintHandle *ConstraintHandle, int32 ConstraintIndex) const
Definition IndexedConstraintContainer.h:260
FPBDIndexedConstraintContainer(FConstraintHandleTypeID InType)
Definition IndexedConstraintContainer.h:245
Definition SolverBodyContainer.h:37
Definition IslandManager.h:151
Definition ParticleHandle.h:436
Definition IndexedConstraintContainer.h:129
ConstraintContainerType FConstraintContainerType
Definition IndexedConstraintContainer.h:131
virtual void AddConstraints(const TArrayView< Private::FPBDIslandConstraint * > &IslandConstraints) override final
Definition IndexedConstraintContainer.h:156
virtual void ApplyProjectionConstraints(const FReal Dt, const int32 It, const int32 NumIts) override final
Definition IndexedConstraintContainer.h:228
virtual void GatherInput(const FReal Dt, const int32 BeginIndex, const int32 EndIndex) override final
Definition IndexedConstraintContainer.h:190
virtual void GatherInput(const FReal Dt) override final
Definition IndexedConstraintContainer.h:185
virtual void AddConstraints() override final
Definition IndexedConstraintContainer.h:150
virtual void ScatterOutput(const FReal Dt, const int32 BeginIndex, const int32 EndIndex) override final
Definition IndexedConstraintContainer.h:208
TIndexedConstraintContainerSolver(FConstraintContainerType &InConstraintContainer, const int32 InPriority)
Definition IndexedConstraintContainer.h:134
virtual int32 GetNumConstraints() const override final
Definition IndexedConstraintContainer.h:145
virtual void AddBodies(FSolverBodyContainer &SolverBodyContainer) override final
Definition IndexedConstraintContainer.h:180
virtual void ApplyVelocityConstraints(const FReal Dt, const int32 It, const int32 NumIts) override final
Definition IndexedConstraintContainer.h:223
virtual void ScatterOutput(const FReal Dt) override final
Definition IndexedConstraintContainer.h:203
virtual void ApplyPositionConstraints(const FReal Dt, const int32 It, const int32 NumIts) override final
Definition IndexedConstraintContainer.h:218
typename FConstraintContainerType::FConstraintContainerHandle FConstraintHandleType
Definition IndexedConstraintContainer.h:132
virtual void Reset(const int32 MaxConstraints) override final
Definition IndexedConstraintContainer.h:140
Definition IndexedConstraintContainer.h:68
int32 ConstraintIndex
Definition IndexedConstraintContainer.h:59
TIndexedContainerConstraintHandle()
Definition IndexedConstraintContainer.h:74
FConstraintContainer * ConcreteContainer()
Definition IndexedConstraintContainer.h:108
typename Base::FGeometryParticleHandle FGeometryParticleHandle
Definition IndexedConstraintContainer.h:71
virtual bool IsEnabled() const override
Definition IndexedConstraintContainer.h:92
const FConstraintContainer * ConcreteContainer() const
Definition IndexedConstraintContainer.h:113
virtual void SetEnabled(bool bInEnabled) override
Definition IndexedConstraintContainer.h:84
TIndexedContainerConstraintHandle(FConstraintContainer *InConstraintContainer, int32 InConstraintIndex)
Definition IndexedConstraintContainer.h:79
T_CONTAINER FConstraintContainer
Definition IndexedConstraintContainer.h:72
void RemoveConstraint()
Definition IndexedConstraintContainer.h:102
Definition IndexedConstraintContainer.h:268
virtual TUniquePtr< FConstraintContainerSolver > CreateSceneSolver(const int32 Priority) override final
Definition IndexedConstraintContainer.h:278
virtual TUniquePtr< FConstraintContainerSolver > CreateGroupSolver(const int32 Priority) override final
Definition IndexedConstraintContainer.h:284
TPBDIndexedConstraintContainer(FConstraintHandleTypeID InType)
Definition IndexedConstraintContainer.h:272
ConstaintContainerType FConstaintContainerType
Definition IndexedConstraintContainer.h:270
Definition ArrayView.h:139
Definition Array.h:670
UE_REWRITE SizeType Num() const
Definition Array.h:1144
void Reset(SizeType NewSize=0)
Definition Array.h:2246
UE_NODEBUG UE_FORCEINLINE_HINT SizeType Add(ElementType &&Item)
Definition Array.h:2696
Definition UniquePtr.h:107
Definition SkeletalMeshComponent.h:307
FRealDouble FReal
Definition Real.h:22