UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
SoftsEvolution.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
4#include "Chaos/Core.h"
13#include "Chaos/VelocityField.h"
14#include "Misc/EnumClassFlags.h"
15
17
18namespace Chaos::Softs
19{
20
21enum struct ESolverMode : uint8
22{
23 None = 0,
24 PBD = 1 << 0,
25 ForceBased = 1 << 1
26};
28
65
76{
77public:
78
80 ~FEvolution() = default;
81
83 CHAOS_API void Reset();
84
87
92
93 const FSolverParticles& GetParticles() const { return Particles; }
94 // Giving non-const access so data can be set freely, but do not add or remove particles here. Use AddSoftBody
95 FSolverParticles& GetParticles() { return Particles; }
96
97 UE_DEPRECATED(5.6, "Use GetActiveGroupsArray instead")
98 TSet<uint32> GetActiveGroups() const
99 {
101 }
104
106 {
107 return Groups.SolverContexts[GroupId];
108 }
109
110 // Convenience method to get by SoftBodyId
112 {
113 return Groups.SolverContexts[SoftBodies.GroupId[SoftBodyId]];
114 }
115
121 CHAOS_API int32 AddSoftBody(uint32 GroupId, int32 NumParticles, bool bEnable);
122 // TODO: add garbage collection. Currently soft bodies and their particles are recycled only if another softbody with the exact same number of particles is requested.
123 // This is the common use case with cloth collision ranges, but we will likely need something more sophisticated.
124 // (Or we could have each SoftBody own its own SolverParticles--we don't take advantage of a single Particle list anywhere)
126 int32 GetSoftBodyParticleNum(int32 SoftBodyId) const { return SoftBodies.ParticleRanges[SoftBodyId].GetRangeSize(); }
127 int32 GetSoftBodyGroupId(int32 SoftBodyId) const { return SoftBodies.GroupId[SoftBodyId]; }
129 const TMap<FString, TConstArrayView<FRealSingle>>& WeightMaps,
130 const FSolverVec3& ReferenceSpaceLocation,
133 );
134 UE_DEPRECATED(5.6, "Use version with ReferenceSpace parameters. Otherwise, LocalSpace damping with ReferenceBone space will not work correctly.")
140 // Activating/deactivating Soft Bodies in different groups is threadsafe. Activations within a group is not threadsafe.
141 CHAOS_API void ActivateSoftBody(int32 SoftBodyId, bool bActivate);
142 bool IsSoftBodyActive(int32 SoftBodyId) const { return SoftBodies.Status[SoftBodyId] == FSoftBodies::EStatus::Active; }
144 const FSolverParticlesRange& GetSoftBodyParticles(int32 SoftBodyId) const { return SoftBodies.ParticleRanges[SoftBodyId]; }
145 const TArray<int32>& GetGroupSoftBodies(uint32 GroupId) const { return Groups.SoftBodies[GroupId]; }
146 const TSet<int32>& GetGroupActiveSoftBodies(uint32 GroupId) const { return Groups.ActiveSoftBodies[GroupId]; }
147 int32 GetLastLinearSolveIterations(int32 SoftBodyId) const { return SoftBodies.LinearSystems[SoftBodyId].GetLastSolveIterations(); }
148 FSolverReal GetLastLinearSolveError(int32 SoftBodyId) const { return SoftBodies.LinearSystems[SoftBodyId].GetLastSolveError(); }
149
155 CHAOS_API int32 AddCollisionParticleRange(uint32 GroupId, int32 NumParticles, bool bEnable);
157 // Activating/deactivating Collision Particle ranges in different groups is threadsafe. Activations within a group is not threadsafe.
159 const TSet<int32>& GetGroupActiveCollisionParticleRanges(uint32 GroupId) const { return Groups.ActiveCollisionParticleRanges[GroupId]; }
161
162 bool IsValidCollisionParticleRange(int32 CollisionRangeId) const { return CollisionRanges.ParticleRanges.IsValidIndex(CollisionRangeId); }
165
169 void SetKinematicUpdateFunction(KinematicUpdateFunc Func) { KinematicUpdate = Func; }
170 void SetCollisionKinematicUpdateFunction(CollisionKinematicUpdateFunc Func) { CollisionKinematicUpdate = Func; }
171
179
180 /* Add Ranges to allocate space for your rules. */
181
182 // Presubstep init methods (always run at beginning of substep)
184 {
185 return AllocateRules(SoftBodyId, NumRules, SoftBodies.PreSubstepParallelInits);
186 }
187 // PBD Rules that apply external forces (only run if doing PBD)
189 {
190 return AllocateRules(SoftBodyId, NumRules, SoftBodies.PBDExternalForceRules);
191 }
192 // Post initial guess init methods (always run after kinematic and initial guess update, before any solving.)
194 {
195 return AllocateRules(SoftBodyId, NumRules, SoftBodies.PostInitialGuessParallelInits);
196 }
197 // Rules that run once per substep after all initial guess and initialization is done.
199 {
200 return AllocateRules(SoftBodyId, NumRules, SoftBodies.PreSubstepConstraintRules);
201 }
202 // Normal per-iteration PBD rules (only run if doing PBD)
204 {
205 return AllocateRules(SoftBodyId, NumRules, SoftBodies.PerIterationPBDConstraintRules);
206 }
207 // Collision per-iteration PBD rules (only run if doing PBD)
209 {
210 return AllocateRules(SoftBodyId, NumRules, SoftBodies.PerIterationCollisionPBDConstraintRules);
211 }
212 // Normal per-iteration PBD rules that run after collisions (only run if doing PBD)
214 {
215 return AllocateRules(SoftBodyId, NumRules, SoftBodies.PerIterationPostCollisionsPBDConstraintRules);
216 }
217 // Linear system rules (only run if doing ForceBased)
219 {
220 return AllocateRules(SoftBodyId, NumRules, SoftBodies.UpdateLinearSystemRules);
221 }
222 // Linear system collision rules (only run if doing ForceBased)
224 {
225 return AllocateRules(SoftBodyId, NumRules, SoftBodies.UpdateLinearSystemCollisionsRules);
226 }
227 // Post substep rules (always run at end of substep)
229 {
230 return AllocateRules(SoftBodyId, NumRules, SoftBodies.PostSubstepConstraintRules);
231 }
232
233 // Presubstep init methods (always run at beginning of substep)
235 {
236 return GetRules(SoftBodyId, SoftBodies.PreSubstepParallelInits);
237 }
238 // PBD Rules that apply external forces (only run if doing PBD)
240 {
241 return GetRules(SoftBodyId, SoftBodies.PBDExternalForceRules);
242 }
243 // Post initial guess init methods (always run after kinematic and initial guess update, before any solving.)
245 {
246 return GetRules(SoftBodyId, SoftBodies.PostInitialGuessParallelInits);
247 }
248 // Rules that run once per substep after all initial guess and initialization is done.
250 {
251 return GetRules(SoftBodyId, SoftBodies.PreSubstepConstraintRules);
252 }
253 // Normal per-iteration PBD rules (only run if doing PBD)
255 {
256 return GetRules(SoftBodyId, SoftBodies.PerIterationPBDConstraintRules);
257 }
258 // Collision per-iteration PBD rules (only run if doing PBD)
260 {
261 return GetRules(SoftBodyId, SoftBodies.PerIterationCollisionPBDConstraintRules);
262 }
263 // Normal per-iteration PBD rules that run after collisions (only run if doing PBD)
265 {
266 return GetRules(SoftBodyId, SoftBodies.PerIterationPostCollisionsPBDConstraintRules);
267 }
268 // Linear system rules (only run if doing ForceBased)
270 {
271 return GetRules(SoftBodyId, SoftBodies.UpdateLinearSystemRules);
272 }
273 // Linear system collision rules (only run if doing ForceBased)
275 {
276 return GetRules(SoftBodyId, SoftBodies.UpdateLinearSystemCollisionsRules);
277 }
278 // Post substep rules (always run at end of substep)
280 {
281 return GetRules(SoftBodyId, SoftBodies.PostSubstepConstraintRules);
282 }
283
285 FSolverReal GetTime() const { return Time; }
286 int32 GetIterations() const { return NumIterations; }
287 int32 GetMaxIterations() const { return MaxNumIterations; }
288 int32 GetNumUsedIterations() const { return NumUsedIterations; }
289 bool GetDisableTimeDependentNumIterations() const { return bDisableTimeDependentNumIterations; }
290 bool GetDoQuasistatics() const { return bDoQuasistatics; }
291 void SetDisableTimeDependentNumIterations(bool bDisable) { bDisableTimeDependentNumIterations = bDisable; }
293
294private:
295
296 template<typename ElementType>
297 struct TArrayRange
298 {
300 {
301 TArrayRange Range;
302 Range.Offset = InArray.Num();
303 Range.Array = &InArray;
304 Range.Array->AddDefaulted(InRangeSize);
305 Range.RangeSize = InRangeSize;
306 return Range;
307 }
308
309 bool IsValid() const
310 {
311 return RangeSize == 0 || (Array && Offset >= 0 && Offset + RangeSize <= Array->Num());
312 }
313
314 TConstArrayView<ElementType> GetConstArrayView() const
315 {
316 check(IsValid());
317 return TConstArrayView<ElementType>(Array->GetData() + Offset, RangeSize);
318 }
319
321 {
322 check(IsValid());
323 return TArrayView<ElementType>(Array->GetData() + Offset, RangeSize);
324 }
325
326 bool IsEmpty() const { return RangeSize == 0; }
327 int32 GetRangeSize() const { return RangeSize; }
328 private:
329 TArray<ElementType>* Array = nullptr;
331 int32 RangeSize = 0;
332 };
333
334 // SoftBody SOA
335 struct FSoftBodies : public TArrayCollection
336 {
337 FSoftBodies()
338 {
341 TArrayCollection::AddArray(&ParticleRanges);
342 TArrayCollection::AddArray(&GlobalDampings);
343 TArrayCollection::AddArray(&LocalDamping);
344 TArrayCollection::AddArray(&UsePerParticleDamping);
345 TArrayCollection::AddArray(&LinearSystems);
346
347 TArrayCollection::AddArray(&PreSubstepParallelInits);
348 TArrayCollection::AddArray(&PBDExternalForceRules);
349 TArrayCollection::AddArray(&PostInitialGuessParallelInits);
350 TArrayCollection::AddArray(&PreSubstepConstraintRules);
351 TArrayCollection::AddArray(&PerIterationPBDConstraintRules);
352 TArrayCollection::AddArray(&PerIterationCollisionPBDConstraintRules);
353 TArrayCollection::AddArray(&PerIterationPostCollisionsPBDConstraintRules);
354 TArrayCollection::AddArray(&UpdateLinearSystemRules);
355 TArrayCollection::AddArray(&UpdateLinearSystemCollisionsRules);
356 TArrayCollection::AddArray(&PostSubstepConstraintRules);
357 }
358
359 void Reset()
360 {
361 ResizeHelper(0);
362 }
363
364 int32 AddSoftBody()
365 {
366 const int32 Offset = Size();
368 return Offset;
369 }
370
371 enum struct EStatus : uint8
372 {
373 Invalid = 0,
374 Active = 1,
375 Inactive = 2,
376 Free = 3 // Available for recycling
377 };
378 TArrayCollectionArray<EStatus> Status;
379 TArrayCollectionArray<uint32> GroupId;
381 TArrayCollectionArray<FSolverReal> GlobalDampings;
383 TArrayCollectionArray<bool> UsePerParticleDamping;
385
386 TArrayCollectionArray<TArray<ParallelInitFunc>> PreSubstepParallelInits;
388 TArrayCollectionArray<TArray<ParallelInitFunc>> PostInitialGuessParallelInits;
389 TArrayCollectionArray<TArray<ConstraintRuleFunc>> PreSubstepConstraintRules;
390 TArrayCollectionArray<TArray<PBDConstraintRuleFunc>> PerIterationPBDConstraintRules;
391 TArrayCollectionArray<TArray<PBDCollisionConstraintRuleFunc>> PerIterationCollisionPBDConstraintRules;
392 TArrayCollectionArray<TArray<PBDConstraintRuleFunc>> PerIterationPostCollisionsPBDConstraintRules;
395 TArrayCollectionArray<TArray<ConstraintRuleFunc>> PostSubstepConstraintRules;
396 };
397
398 // CollisionBodyRange SOA
399 struct FCollisionBodyRanges : public TArrayCollection
400 {
401 FCollisionBodyRanges()
402 {
405 TArrayCollection::AddArray(&ParticleRanges);
406 }
407
408 void Reset()
409 {
410 ResizeHelper(0);
411 }
412
413 int32 AddRange()
414 {
415 const int32 Offset = Size();
417 return Offset;
418 }
419
420 enum struct EStatus : uint8
421 {
422 Invalid = 0,
423 Active = 1,
424 Inactive = 2,
425 Free = 3 // Available for recycling
426 };
427 TArrayCollectionArray<EStatus> Status;
428 TArrayCollectionArray<uint32> GroupId;
430 };
431
432 struct FGroups : public TArrayCollection
433 {
434 FGroups()
435 {
436 TArrayCollection::AddArray(&SoftBodies);
437 TArrayCollection::AddArray(&ActiveSoftBodies);
438 TArrayCollection::AddArray(&ActiveCollisionParticleRanges);
439 TArrayCollection::AddArray(&SolverContexts);
440 }
441
442 void Reset()
443 {
444 ResizeHelper(0);
445 }
446
447 void AddGroupsToSize(uint32 DesiredSize)
448 {
449 if (ensure(DesiredSize >= Size()))
450 {
451 ResizeHelper((int32)DesiredSize);
452 }
453 }
454
456 TArrayCollectionArray<TSet<int32>> ActiveSoftBodies;
457 TArrayCollectionArray<TSet<int32>> ActiveCollisionParticleRanges;
459 };
460
461 // Wrapper around FEvolutionLinearSystemSolverParameters that knows how to read a property collection
462 struct FLinearSystemParameters : public FEvolutionLinearSystemSolverParameters
463 {
465
466 FLinearSystemParameters()
467 : Base()
468 {}
469
470 FLinearSystemParameters(const FCollectionPropertyConstFacade& PropertyCollection, bool bInXPBDInitialGuess)
476 {}
477
478 void SetProperties(const FCollectionPropertyConstFacade& PropertyCollection, bool bInXPBDInitialGuess)
479 {
485 }
486
491 };
492
493 template<typename RuleFunc>
494 void AllocateRules(int32 SoftBodyId, int32 NumRules, TArrayCollectionArray<TArray<RuleFunc>>& RuleArray)
495 {
498 }
499
500 template<typename RuleFunc>
501 TArrayView<RuleFunc> GetRules(int32 SoftBodyId, TArrayCollectionArray<TArray<RuleFunc>>& RuleArray)
502 {
504 }
505
506 void AdvanceOneTimeStepInternal(const FSolverReal Dt, const int32 TimeDependentNumIterations, uint32 GroupId);
507
508 // Solver data
509 FSolverReal Time;
510 bool bEnableForceBasedSolver = false;
511 int32 MaxNumIterations; // Used for time-dependent iteration counts
512 int32 NumIterations; // PBD iterations
513 int32 NumUsedIterations = 0; // Last actual time-dependent iteration count
514 int32 NumNewtonIterations; // Implicit force-based solve
515 bool bDisableTimeDependentNumIterations = false;
516 bool bDoQuasistatics;
517 FSolverReal SolverFrequency;
518 FLinearSystemParameters LinearSystemParameters; // Per-solver parameters that need to be passed to the linear system solver
519
520
521 // Per-Particle data
522 FSolverParticles Particles;
523 TArrayCollectionArray<FSolverReal> ParticleDampings;
524
525 // Per-Collision particle data
526 FSolverCollisionParticles CollisionParticles;
527
528 // Per-SoftBody data
529 FSoftBodies SoftBodies;
530
531 // SoftBody free-list
532 TMap<int32, TArray<int32>> SoftBodyFreeList; // Key = NumParticles, Value = SoftBodyId(s)
533
534 // Per-CollisionBodyRange data
535 FCollisionBodyRanges CollisionRanges;
536
537 // Collision Range free-list
538 TMap<int32, TArray<int32>> CollisionRangeFreeList; // Key = NumParticles, Value = CollisionRangeId(s)
539
540 // Per-Group data
541 FGroups Groups;
542
543 KinematicUpdateFunc KinematicUpdate;
544 CollisionKinematicUpdateFunc CollisionKinematicUpdate;
545
554};
555}
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
#define check(expr)
Definition AssertionMacros.h:314
#define ensure( InExpression)
Definition AssertionMacros.h:464
#define UE_CHAOS_DECLARE_INDEXLESS_PROPERTYCOLLECTION_NAME(PropertyName, Type)
Definition CollectionPropertyFacade.h:853
@ INDEX_NONE
Definition CoreMiscDefines.h:150
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
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
#define ENUM_CLASS_FLAGS(Enum)
Definition EnumClassFlags.h:6
UE_FORCEINLINE_HINT bool IsValid(const UObject *Test)
Definition Object.h:1875
EChaosSoftsLocalDampingSpace
Definition SoftsSimulationSpace.h:22
uint32 Offset
Definition VulkanMemory.cpp:4033
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition CollectionPropertyFacade.h:49
Definition SoftsEvolutionLinearSystem.h:45
Definition SoftsEvolution.h:76
FSolverReal GetTime() const
Definition SoftsEvolution.h:285
TArrayView< PBDConstraintRuleFunc > GetPerIterationPBDConstraintRulesRange(int32 SoftBodyId)
Definition SoftsEvolution.h:254
int32 GetMaxIterations() const
Definition SoftsEvolution.h:287
TArrayView< UpdateLinearSystemFunc > GetUpdateLinearSystemRulesRange(int32 SoftBodyId)
Definition SoftsEvolution.h:269
void AllocatePerIterationPostCollisionsPBDConstraintRulesRange(int32 SoftBodyId, int32 NumRules)
Definition SoftsEvolution.h:213
void AllocatePerIterationPBDConstraintRulesRange(int32 SoftBodyId, int32 NumRules)
Definition SoftsEvolution.h:203
TFunction< void(FSolverParticlesRange &, const FSolverReal Dt, const TArray< FSolverCollisionParticlesRange > &)> PBDCollisionConstraintRuleFunc
Definition SoftsEvolution.h:176
TArrayView< ParallelInitFunc > GetPostInitialGuessParallelInitRange(int32 SoftBodyId)
Definition SoftsEvolution.h:244
bool GetDoQuasistatics() const
Definition SoftsEvolution.h:290
TFunction< void(const FSolverParticlesRange &, const FSolverReal Dt, const ESolverMode)> ParallelInitFunc
Definition SoftsEvolution.h:173
FSolverParticles & GetParticles()
Definition SoftsEvolution.h:95
CHAOS_API int32 AddCollisionParticleRange(uint32 GroupId, int32 NumParticles, bool bEnable)
Definition SoftsEvolution.cpp:320
bool IsValidCollisionParticleRange(int32 CollisionRangeId) const
Definition SoftsEvolution.h:162
CHAOS_API void RemoveCollisionParticleRange(int32 CollisionRangeId)
Definition SoftsEvolution.cpp:347
int32 GetLastLinearSolveIterations(int32 SoftBodyId) const
Definition SoftsEvolution.h:147
TArrayView< PBDConstraintRuleFunc > GetPerIterationPostCollisionsPBDConstraintRulesRange(int32 SoftBodyId)
Definition SoftsEvolution.h:264
int32 GetIterations() const
Definition SoftsEvolution.h:286
TArrayView< ConstraintRuleFunc > GetPreSubstepConstraintRulesRange(int32 SoftBodyId)
Definition SoftsEvolution.h:249
CHAOS_API int32 NumActiveParticles() const
Definition SoftsEvolution.cpp:206
void AddGroupArray(TArrayCollectionArrayBase *Array)
Definition SoftsEvolution.h:89
TFunction< void(FSolverParticlesRange &, const FSolverReal Dt)> PBDConstraintRuleFunc
Definition SoftsEvolution.h:175
void AllocatePerIterationCollisionPBDConstraintRulesRange(int32 SoftBodyId, int32 NumRules)
Definition SoftsEvolution.h:208
const FEvolutionGroupContext & GetGroupContextForSoftBody(int32 SoftBodyId) const
Definition SoftsEvolution.h:111
CHAOS_API void SetSolverProperties(const FCollectionPropertyConstFacade &PropertyCollection)
Definition SoftsEvolution.cpp:392
void AllocateUpdateLinearSystemCollisionsRulesRange(int32 SoftBodyId, int32 NumRules)
Definition SoftsEvolution.h:223
FSolverParticlesRange & GetSoftBodyParticles(int32 SoftBodyId)
Definition SoftsEvolution.h:143
FSolverReal GetLastLinearSolveError(int32 SoftBodyId) const
Definition SoftsEvolution.h:148
int32 GetSoftBodyGroupId(int32 SoftBodyId) const
Definition SoftsEvolution.h:127
void SetCollisionKinematicUpdateFunction(CollisionKinematicUpdateFunc Func)
Definition SoftsEvolution.h:170
bool GetDisableTimeDependentNumIterations() const
Definition SoftsEvolution.h:289
CHAOS_API void AdvanceOneTimeStep(const FSolverReal Dt, const FSolverReal TimeDependentIterationMultiplier)
Definition SoftsEvolution.cpp:403
TFunction< void(FSolverParticlesRange &, const FSolverReal Dt, const FSolverReal Time)> KinematicUpdateFunc
Definition SoftsEvolution.h:167
const TSet< int32 > & GetGroupActiveCollisionParticleRanges(uint32 GroupId) const
Definition SoftsEvolution.h:159
TFunction< void(const FSolverParticlesRange &, const FSolverReal Dt, const TArray< FSolverCollisionParticlesRange > &, FEvolutionLinearSystem &)> UpdateLinearSystemCollisionsFunc
Definition SoftsEvolution.h:178
TArrayView< PBDCollisionConstraintRuleFunc > GetPerIterationCollisionPBDConstraintRulesRange(int32 SoftBodyId)
Definition SoftsEvolution.h:259
TFunction< void(const FSolverParticlesRange &, const FSolverReal Dt, FEvolutionLinearSystem &)> UpdateLinearSystemFunc
Definition SoftsEvolution.h:177
const TArray< int32 > & GetGroupSoftBodies(uint32 GroupId) const
Definition SoftsEvolution.h:145
TArrayView< ParallelInitFunc > GetPreSubstepParallelInitRange(int32 SoftBodyId)
Definition SoftsEvolution.h:234
int32 GetSoftBodyParticleNum(int32 SoftBodyId) const
Definition SoftsEvolution.h:126
const TSet< int32 > & GetGroupActiveSoftBodies(uint32 GroupId) const
Definition SoftsEvolution.h:146
bool IsSoftBodyActive(int32 SoftBodyId) const
Definition SoftsEvolution.h:142
const FSolverParticles & GetParticles() const
Definition SoftsEvolution.h:93
TArrayView< UpdateLinearSystemCollisionsFunc > GetUpdateLinearSystemCollisionsRulesRange(int32 SoftBodyId)
Definition SoftsEvolution.h:274
void AllocatePostSubstepConstraintRulesRange(int32 SoftBodyId, int32 NumRules)
Definition SoftsEvolution.h:228
CHAOS_API void RemoveSoftBody(int32 SoftBodyId)
Definition SoftsEvolution.cpp:261
TFunction< void(FSolverCollisionParticlesRange &, const FSolverReal Dt, const FSolverReal Time)> CollisionKinematicUpdateFunc
Definition SoftsEvolution.h:168
const FEvolutionGroupContext & GetGroupContext(uint32 GroupId) const
Definition SoftsEvolution.h:105
void AllocateUpdateLinearSystemRulesRange(int32 SoftBodyId, int32 NumRules)
Definition SoftsEvolution.h:218
CHAOS_API TArray< uint32 > GetActiveGroupsArray() const
Definition SoftsEvolution.cpp:192
CHAOS_API void ActivateCollisionParticleRange(int32 CollisionRangeId, bool bEnable)
Definition SoftsEvolution.cpp:363
TFunction< void(FSolverParticlesRange &, const FSolverReal Dt, const ESolverMode)> ConstraintRuleFunc
Definition SoftsEvolution.h:174
void SetDisableTimeDependentNumIterations(bool bDisable)
Definition SoftsEvolution.h:291
void AllocatePreSubstepConstraintRulesRange(int32 SoftBodyId, int32 NumRules)
Definition SoftsEvolution.h:198
void AllocatePreSubstepParallelInitRange(int32 SoftBodyId, int32 NumRules)
Definition SoftsEvolution.h:183
int32 GetNumUsedIterations() const
Definition SoftsEvolution.h:288
void AddCollisionParticleArray(TArrayCollectionArrayBase *Array)
Definition SoftsEvolution.h:91
const FSolverParticlesRange & GetSoftBodyParticles(int32 SoftBodyId) const
Definition SoftsEvolution.h:144
FSolverCollisionParticlesRange & GetCollisionParticleRange(int32 CollisionRangeId)
Definition SoftsEvolution.h:163
void AllocatePBDExternalForceRulesRange(int32 SoftBodyId, int32 NumRules)
Definition SoftsEvolution.h:188
TArrayView< PBDConstraintRuleFunc > GetPBDExternalForceRulesRange(int32 SoftBodyId)
Definition SoftsEvolution.h:239
void AddParticleArray(TArrayCollectionArrayBase *Array)
Definition SoftsEvolution.h:90
void SetKinematicUpdateFunction(KinematicUpdateFunc Func)
Definition SoftsEvolution.h:169
const FSolverCollisionParticlesRange & GetCollisionParticleRange(int32 CollisionRangeId) const
Definition SoftsEvolution.h:164
CHAOS_API TArray< FSolverCollisionParticlesRange > GetActiveCollisionParticles(uint32 GroupId) const
Definition SoftsEvolution.cpp:379
TArrayView< ConstraintRuleFunc > GetPostSubstepConstraintRulesRange(int32 SoftBodyId)
Definition SoftsEvolution.h:279
CHAOS_API void Reset()
Definition SoftsEvolution.cpp:178
CHAOS_API int32 AddSoftBody(uint32 GroupId, int32 NumParticles, bool bEnable)
Definition SoftsEvolution.cpp:219
CHAOS_API void SetSoftBodyProperties(int32 SoftBodyId, const FCollectionPropertyConstFacade &PropertyCollection, const TMap< FString, TConstArrayView< FRealSingle > > &WeightMaps, const FSolverVec3 &ReferenceSpaceLocation, const FSolverVec3 &ReferenceSpaceVelocity, const FSolverVec3 &ReferenceSpaceAngularVelocity)
Definition SoftsEvolution.cpp:278
CHAOS_API void ActivateSoftBody(int32 SoftBodyId, bool bActivate)
Definition SoftsEvolution.cpp:306
void AllocatePostInitialGuessParallelInitRange(int32 SoftBodyId, int32 NumRules)
Definition SoftsEvolution.h:193
TSet< uint32 > GetActiveGroups() const
Definition SoftsEvolution.h:98
Definition SoftsSolverCollisionParticlesRange.h:11
Definition SoftsSolverParticlesRange.h:12
Definition PBDSoftsSolverParticles.h:20
Definition ArrayCollectionArrayBase.h:9
int32 AddArray(TArrayCollectionArrayBase *Array)
Definition ArrayCollection.h:36
uint32 Size() const
Definition ArrayCollection.h:66
void ResizeHelper(const int32 Num)
Definition ArrayCollection.h:93
void AddElementsHelper(const int32 Num)
Definition ArrayCollection.h:84
Definition ArrayView.h:139
Definition Array.h:670
Definition AndroidPlatformMisc.h:14
Definition UnrealString.h.inl:34
constexpr FSolverReal LocalDamping
Definition SoftsEvolution.cpp:23
TArrayView< T > GetArrayView(TManagedArrayAccessor< T > &DataArray, const TManagedArrayAccessor< int32 > &StartArray, const TManagedArrayAccessor< int32 > &EndArray, int32 ConstraintIndex)
Definition CollectionEmbeddedSpringConstraintFacade.cpp:10
Definition CollectionEmbeddedSpringConstraintFacade.cpp:6
ESolverMode
Definition SoftsEvolution.h:22
FRealSingle FSolverReal
Definition PBDSoftsEvolutionFwd.h:31
TVector< FSolverReal, 3 > FSolverVec3
Definition PBDSoftsEvolutionFwd.h:33
float FRealSingle
Definition Real.h:14
@ Invalid
Definition BTCompositeNode.h:38
@ Active
Definition BehaviorTreeTypes.h:172
@ Inactive
Definition BehaviorTreeTypes.h:174
const FVector Offset(0, 0, 20)
@ Free
Definition MemPro.h:147
@ false
Definition radaudio_common.h:23
Definition SoftsEvolution.h:33
int32 CurrentPBDIteration
Definition SoftsEvolution.h:38
ESolverMode SolverMode
Definition SoftsEvolution.h:34
void Init(ESolverMode InSolverMode, FSolverReal InDt, int32 InNumPBDIterations, int32 InNumNewtonIterations)
Definition SoftsEvolution.h:55
int32 NumNewtonIterations
Definition SoftsEvolution.h:40
int32 NumPBDIterations
Definition SoftsEvolution.h:37
FSolverReal Dt
Definition SoftsEvolution.h:35
void Reset()
Definition SoftsEvolution.h:43
int32 CurrentNewtonIteration
Definition SoftsEvolution.h:41
int32 MaxNumCGIterations
Definition SoftsEvolutionLinearSystem.h:36
bool bCheckCGResidual
Definition SoftsEvolutionLinearSystem.h:38
static constexpr FSolverReal DefaultCGTolerance
Definition SoftsEvolutionLinearSystem.h:12
static constexpr bool bDefaultCheckCGResidual
Definition SoftsEvolutionLinearSystem.h:13
bool bDoQuasistatics
Definition SoftsEvolutionLinearSystem.h:34
FSolverReal CGResidualTolerance
Definition SoftsEvolutionLinearSystem.h:37
static constexpr int32 DefaultMaxNumCGIterations
Definition SoftsEvolutionLinearSystem.h:11
bool bXPBDInitialGuess
Definition SoftsEvolutionLinearSystem.h:35
Definition Sorting.h:48