UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
IslandManager.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3#include "Chaos/Core.h"
11#include "Chaos/Serializable.h"
12
13namespace Chaos
14{
15 class FPerParticleGravity;
16}
17
18namespace Chaos::DebugDraw
19{
21}
22
23namespace Chaos::Private
24{
25 class FPBDIslandMergeSet;
26
36
41 {
42 public:
46
48 {
49 return Particle;
50 }
51
53 {
54 return Particle;
55 }
56
57 // TPoolBackedItemAdapter for FPBDIslandManager::Nodes
58 const int32 GetArrayIndex() const { return ArrayIndex; }
59 void SetArrayIndex(const int32 InIndex) { ArrayIndex = InIndex; }
61 CHAOS_API void Trash();
62
63 // An integer ID for an island (for debug only). @see FPBDIsland::GetIslandId()
65
70 {
71 return Particle->CastToRigidParticle()->IterationSettings();
72 }
73
78 {
79 Particle->CastToRigidParticle()->SetIterationSettings(InIterations);
80 }
81
82 private:
83 friend class FPBDIslandManager;
84 friend class FPBDIsland;
85
86 union FFlags
87 {
88 public:
89 FFlags() : Bits(0) {}
90 void Reset() { Bits = 0; }
91
92 struct
93 {
94 uint32 bIsDynamic : 1;
95 uint32 bIsSleeping : 1;
96 uint32 bIsMoving : 1;
97 uint32 bNeedsResim : 1;
98 uint32 bWasUpdated : 1;
99 uint32 bWasProcessed : 1;
100 uint32 bWasTransformSetExplicitly : 1;
101 };
102
103 private:
104 uint32 Bits;
105 };
106
107 // The particle we represent
108 FGeometryParticleHandle* Particle = nullptr;
109
110 // The island we are in (only if dynamic, always null for kinematics which may be in many islands)
111 FPBDIsland* Island = nullptr;
112
113 // All the edges connected to this node
115
116 // Used in a few places to track which nodes have been visited
117 int32 VisitEpoch = INDEX_NONE;
118
119 // Index into FPBDIslandManager::Nodes
120 int32 ArrayIndex = INDEX_NONE;
121
122 // Index into FPBDIsland::Nodes
123 int32 IslandArrayIndex = INDEX_NONE;
124
125 // All the flags
126 FFlags Flags;
127
128 // Distance to a kinematic through the graph
129 int32 Level = 0;
130
131 // Sleep thresholds
132 FRealSingle SleepLinearThresholdSq = 0;
133 FRealSingle SleepAngularThresholdSq = 0;
134 int32 SleepCounterThreshold = 0;
135
136 // Partial wake thresholds
137 FRealSingle WakeLinearThresholdSq = 0;
138 FRealSingle WakeAngularThresholdSq = 0;
139
140 // Disable thresholds
141 FRealSingle DisableLinearThresholdSq = 0;
142 FRealSingle DisableAngularThresholdSq = 0;
143
144 int32 ResimFrame = INDEX_NONE;
145 };
146
151 {
152 public:
156
158 {
159 return Constraint;
160 }
161
163 {
164 // NOTE: Level 0 means unasigned (used to be INDEX_NONE) so that this sort key still makes sense
165 return (uint64(Level) << 32) | uint64(LevelSortKey);
166 }
167
168 // TPoolBackedItemAdapter for FPBDIslandManager::Edges
169 const int32 GetArrayIndex() const { return ArrayIndex; }
170 void SetArrayIndex(const int32 InIndex) { ArrayIndex = InIndex; }
172 CHAOS_API void Trash();
173
174 // An integer ID for an island (for debug only). @see FPBDIsland::GetIslandId()
176
177 private:
178 friend class FPBDIslandManager;
179 friend class FPBDIsland;
180
181 union FFlags
182 {
183 public:
184 FFlags() : Bits(0) {}
185 void Reset() { Bits = 0; }
186
187 struct
188 {
189 uint32 bIsSleeping : 1;
190 uint32 bIsNew : 1;
191 uint32 bWasProcessed : 1;
192 };
193 private:
194 uint32 Bits;
195 };
196
197 FConstraintHandle* Constraint = nullptr;
198 FPBDIsland* Island = nullptr;
199 FPBDIslandParticle* Nodes[2] = { nullptr, nullptr };
200
201 // Used in a few places to track which nodes have been visited
202 int32 VisitEpoch = INDEX_NONE;
203
204 // Index into FPBDIslandManager::Edges
205 int32 ArrayIndex = INDEX_NONE;
206
207 // Index into FPBDIslandParticle::Edges for Node0 and Node1
208 int32 NodeArrayIndices[2] = { INDEX_NONE, INDEX_NONE };
209
210 // Indices into FPBDIsland::ContainerEdges
211 int32 ContainerIndex = INDEX_NONE;
212 int32 IslandArrayIndex = INDEX_NONE;
213
214 // Distance to a kinematic through the graph
215 int32 Level = 0;
216
217 // Used for consistent ordering within a level
218 uint32 LevelSortKey = 0;
219
220 FFlags Flags;
221 };
222
231 {
232 public:
235
237 {
238 return Nodes.Num();
239 }
240
242 {
243 return NumEdges;
244 }
245
246 int32 GetNumContainerConstraints(const int32 ContainerId) const
247 {
248 return ContainerEdges[ContainerId].Num();
249 }
250
251 const FPBDIslandParticle* GetNode(const int32 NodeIndex) const
252 {
253 return Nodes[NodeIndex];
254 }
255
256 bool IsSleeping() const
257 {
258 return Flags.bIsSleeping;
259 }
260
262 {
263 return SleepCounter;
264 }
265
267 {
268 SleepCounter = InSleepCounter;
269 }
270
271 bool IsSleepAllowed() const
272 {
273 return Flags.bIsSleepAllowed;
274 }
275
276 bool NeedsResim() const
277 {
278 return Flags.bNeedsResim;
279 }
280
282 {
283 Flags.bNeedsResim = bInNeedsResim;
284 }
285
287 {
288 return ResimFrame;
289 }
290
292 {
293 ResimFrame = InResimFrame;
294 }
295
296 bool IsUsingCache() const
297 {
298 return Flags.bIsUsingCache;
299 }
300
302 {
303 Flags.bIsUsingCache = bInIsUsingCache;
304 }
305
310
312 {
313 return MakeArrayView(ContainerEdges[ContainerId]);
314 }
315
316 // An integer ID for an island. For debug only (e.g., to assign a color in debug draw) - has no internal use.
317 // Not necessarily persistent between ticks.
319 {
320 return ArrayIndex;
321 }
322
323 // TPoolBackedItemAdapter for FPBDIslandManager::Islands
324 const int32 GetArrayIndex() const { return ArrayIndex; }
325 void SetArrayIndex(const int32 InIndex) { ArrayIndex = InIndex; }
326 CHAOS_API void Reuse();
327 CHAOS_API void Trash();
328
333 {
334 return Iterations;
335 }
336
341 {
342 Iterations = InIterations;
343 }
344
345 bool IsPartialSleepEnabled() const;
346
347 private:
348 friend class FPBDIslandManager;
349
350 CHAOS_API void UpdateSyncState();
351
352 union FFlags
353 {
354 public:
355 FFlags() : Bits(0) {}
356 void Reset() { Bits = 0; }
357
358 struct
359 {
360 uint32 bItemsAdded : 1;
361 uint32 bItemsRemoved : 1;
362 uint32 bIsSleepAllowed : 1;
363 uint32 bIsPartialSleepAllowedInAllNodes : 1;
364 uint32 bHasSleepingNode : 1;
365 uint32 bEnoughMotionlessNodesForPartialSleep : 1;
366 uint32 bIsSleeping : 1;
367 uint32 bWasSleeping : 1;
368 uint32 bCheckSleep : 1;
369 uint32 bNeedsResim : 1;
370 uint32 bIsUsingCache : 1;
371 };
372
373 private:
374 uint32 Bits;
375 };
376
377 // Nodes for dynamic particles in the Island (does not include kinematics)
378 // @todo(chaos): we only need to track allocated nodes for sleep logic when particles have no constraints - fix this
380
381 // All edges in the island for each constraint type
383
384 // When edges are added, islands merge. The MergeSet tracks which islands are merging together
385 FPBDIslandMergeSet* MergeSet = nullptr;
386
387 // Index into FPBDIslandMergeSet::Islands
388 int32 MergeSetIslandIndex = INDEX_NONE;
389
390 // Index into FPBDIslandManager::Islands
391 int32 ArrayIndex = INDEX_NONE;
392
393 // Total number of edges in ContainerEdges[0..N]
394 int32 NumEdges = 0;
395
396 // When SleepCounter hits a threshold the island will sleep
397 int32 SleepCounter = 0;
398
399 // When DisableCounter hits a threshold the island particle will be disabled
400 int32 DisableCounter = 0;
401
402 // When SleepTypeSwitchCounter hits a threshold, the island sleep type (partial or full)
403 // will change if CVars::bChaosSolverPartialIslandSleep == true.
404 int32 SleepTypeSwitchCounter = 0;
405
406 int32 ResimFrame = INDEX_NONE;
407
408 FFlags Flags;
409
410 FIterationSettings Iterations;
411 };
412
417 {
418 public:
421
422 // TPoolBackedItemAdapter for FPBDIslandManager::MergeSets
423 const int32 GetArrayIndex() const { return ArrayIndex; }
424 void SetArrayIndex(const int32 InIndex) { ArrayIndex = InIndex; }
425 CHAOS_API void Reuse();
426 CHAOS_API void Trash();
427
428 private:
429 friend class FPBDIslandManager;
430
431 TArray<FPBDIsland*> Islands;
432 int32 NumEdges = 0;
433
434 // Index into FPBDIslandManager::MergeSets
435 int32 ArrayIndex = INDEX_NONE;
436 };
437
453 {
454 public:
457
458 // The number of registered constraint containers
460
461 // Particles management
462 int32 GetNumParticles() const { return Nodes.Num(); }
473
474 // Constraint management
475 int32 GetNumConstraints() const { return Edges.Num(); }
476 CHAOS_API void AddConstraint(const int32 ContainerId, FConstraintHandle* Constraint, const TVec2<FGeometryParticleHandle*>& ConstrainedParticles);
477 template<typename ConstraintContainerType> void AddContainerConstraints(ConstraintContainerType& ConstraintContainer);
478 CHAOS_API void RemoveConstraint(FConstraintHandle* ConstraintHandle);
481 CHAOS_API void RemoveContainerConstraints(const int32 ContainerId);
483
484 // Access to Islands
485 int32 GetNumIslands() const { return Islands.Num(); }
486 const FPBDIsland* GetIsland(const int32 IslandIndex) const { return Islands[IslandIndex]; }
489
490 // Setup and update
491 CHAOS_API void Reset();
503 CHAOS_API void UpdateSleep(const FReal Dt = 0);
505 CHAOS_API void EndTick();
506
507 // Levels and Colors for sorting an parallelization
512
517 template<typename VisitorType> void VisitAwakeConstraints(const int32 ContainerId, const VisitorType& Visitor);
518 template<typename VisitorType> void VisitAwakeConstConstraints(const int32 ContainerId, const VisitorType& Visitor) const;
519
524 template<typename VisitorType> void VisitConstraints(const int32 ContainerId, const VisitorType& Visitor);
525 template<typename VisitorType> void VisitConstConstraints(const int32 ContainerId, const VisitorType& Visitor) const;
526
527 // Resim functionality
529 CHAOS_API void SetParticleResimFrame(FGeometryParticleHandle* Particle, const int32 ResimFrame);
531
532 // The following is intended for testing, debugging and visualization only and is not considered part of the API
533 FPBDIsland* GetIsland(const int32 IslandIndex) { return Islands[IslandIndex]; }
534 CHAOS_API int32 GetIslandIndex(const FPBDIsland* Island) const;
541
542 // Debug draw
543#if CHAOS_DEBUG_DRAW
544 CHAOS_API void DebugDrawSleepState(const DebugDraw::FChaosDebugDrawSettings* DebugDrawSettings) const;
545#endif
546
547 // Deprecated API
548 UE_DEPRECATED(5.3, "Use Reset") void RemoveConstraints() { Reset(); }
550 UE_DEPRECATED(5.3, "Use GetNumIslands") int32 NumIslands() const { return GetNumIslands(); }
551 UE_DEPRECATED(5.3, "Use GetParticleIsland") const FPBDIsland* GetIsland(const FGeometryParticleHandle* Particle) const { return GetParticleIsland(Particle); }
552 UE_DEPRECATED(5.3, "Use RemoveConstraint without ContainerId") void RemoveConstraint(const int32 ContainerId, FConstraintHandle* Constraint) { RemoveConstraint(Constraint); }
553
554 private:
555 // @todo(chaos): for access to non-const GetIsland(). Try to remove these...
558
559 // Node management
560 CHAOS_API FPBDIslandParticle* GetGraphNode(const FGeometryParticleHandle* Particle) const;
561 CHAOS_API FPBDIslandParticle* GetGraphNode(const FTransientGeometryParticleHandle& Particle) const;
562 CHAOS_API FPBDIslandParticle* CreateGraphNode(FGeometryParticleHandle* Particle);
563 CHAOS_API FPBDIslandParticle* GetOrCreateGraphNode(FGeometryParticleHandle* Particle);
564 CHAOS_API void DestroyGraphNode(FPBDIslandParticle* Node);
565
566 // Edge management
568 CHAOS_API const FPBDIslandConstraint* GetGraphEdge(const FConstraintHandle* Constraint) const;
569 CHAOS_API FPBDIslandConstraint* CreateGraphEdge(const int32 ContainerId, FConstraintHandle* Constraint, const TVec2<FGeometryParticleHandle*>& ConstrainedParticles);
570 CHAOS_API void DestroyGraphEdge(FPBDIslandConstraint* Edge);
572 CHAOS_API void UnbindEdgeFromNodes(FPBDIslandConstraint* Edge);
573 CHAOS_API void UpdateGraphNodeSleepSettings(FPBDIslandParticle* Node);
574
575 // Per-tick state transfer to nodes/edges
576 CHAOS_API void UpdateGraphNode(FPBDIslandParticle* Node);
577 CHAOS_API void UpdateGraphEdge(FPBDIslandConstraint* Edge);
578
579 // Island management
580 CHAOS_API FPBDIsland* CreateIsland();
581 CHAOS_API void DestroyIsland(FPBDIsland* Island);
582 CHAOS_API void AssignNodeIsland(FPBDIslandParticle* Node);
583 CHAOS_API void AssignEdgeIsland(FPBDIslandConstraint* Edge);
584 CHAOS_API void AddNodeToIsland(FPBDIslandParticle* Node, FPBDIsland* Island);
585 CHAOS_API void RemoveNodeFromIsland(FPBDIslandParticle* Node);
586 CHAOS_API void DestroyIslandNodes(FPBDIsland* Island);
587 CHAOS_API void AddEdgeToIsland(FPBDIslandConstraint* Edge, FPBDIsland* Island);
588 CHAOS_API void RemoveEdgeFromIsland(FPBDIslandConstraint* Edge);
589 CHAOS_API void WakeNodeIslands(const FPBDIslandParticle* Node);
590 CHAOS_API void EnqueueIslandCheckSleep(FPBDIsland* Island, const bool bIsSleepAllowed);
591 CHAOS_API void UpdateIslandPartialSleepAllowed(FPBDIsland* Island, const FGeometryParticleHandle* Particle);
592 CHAOS_API void ResetIslandPartialSleepAllowed();
593 CHAOS_API void UpdateIslandHasSleepingNode(FPBDIsland* Island, const FGeometryParticleHandle* Particle);
594
595 // Island merge set management
599 CHAOS_API void DestroyMergeSet(FPBDIslandMergeSet* IslandMergeSet);
600 CHAOS_API void AddIslandToMergeSet(FPBDIsland* Island, FPBDIslandMergeSet* IslandMergeSet);
601 CHAOS_API void RemoveIslandFromMergeSet(FPBDIsland* Island);
604
605 // Merge/split processing
606 CHAOS_API void ProcessIslands();
607 CHAOS_API void ProcessWakes();
608 CHAOS_API void ProcessMerges();
609 CHAOS_API void ProcessSplits();
610 CHAOS_API void AssignLevels();
611 CHAOS_API void ProcessIslandMerge(FPBDIsland* ParentIsland, FPBDIsland* ChildIsland);
612 CHAOS_API void ProcessIslandSplits(FPBDIsland* Island);
613
614 // Sorting
615 CHAOS_API void AssignIslandLevels(FPBDIsland* Island);
616 CHAOS_API void SortIslandEdges(FPBDIsland* Island);
617 CHAOS_API void RandomizeIslandEdges(FPBDIsland* Island);
618
619 // Island Sleeping
620 CHAOS_API void ProcessSleep(const FRealSingle Dt);
621 CHAOS_API void ProcessParticlesSleep(const FRealSingle Dt);
622 CHAOS_API void ProcessIslandSleep(FPBDIsland* Island, const FRealSingle Dt);
623 CHAOS_API void PropagateIslandSleep(FPBDIsland* Island);
624 CHAOS_API void PropagateIslandSleepToParticles(FPBDIsland* Island);
625 CHAOS_API void PropagateIslandSleepToConstraints(FPBDIsland* Island);
626
627 // Partial Island Sleeping
628 CHAOS_API void ProcessPartialIslandSleep(FPBDIsland* Island, const FRealSingle Dt);
629 CHAOS_API void SleepNonMovingParticles(FPBDIsland* Island, const FRealSingle Dt);
630 CHAOS_API bool RewakeConstraintsNotSupportingPartialSleep(FPBDIsland* Island);
631 CHAOS_API void SleepConstraintsBetweenNonAwakeParticles(FPBDIsland* Island);
632 CHAOS_API void PostStepPartialWake(FPBDIsland* Island);
633 CHAOS_API void SwitchIslandSleepType(FPBDIsland* Island, const int32 MotionlessCount);
634 CHAOS_API void ValidateConstraintSleepState(const FPBDIsland* Island);
635
636 // Partial Island Waking
637 CHAOS_API void ProcessPartialIslandWake(FPBDIsland* Island, const bool bProcessEdgeBasedWake);
641 CHAOS_API bool ProcessParticleWake(FPBDIslandParticle* Node, const FPBDIslandParticle* OtherNode, const FPBDParticleMomentumSq* OtherMomentum,
644 CHAOS_API void SyncConstraintSleepStateToParticles(FPBDIsland* Island);
645 CHAOS_API void WakeUpParticles(TArray<FGeometryParticleHandle*>& ParticlesToWake, const bool bResetSleepCounter = true);
646 CHAOS_API void ResetParticleSleepCounter(FPBDIsland* Island);
647 CHAOS_API void ResetEdgeFlags(FPBDIsland* Island);
648 CHAOS_API void ResetNodeFlags(FPBDIsland* Island);
649 CHAOS_API void ResetEdgeFlags();
650 CHAOS_API void ResetNodeFlags();
651
652 // Disabling
656
657 CHAOS_API void FinalizeIslands();
658 CHAOS_API void ApplyDeterminism();
659 CHAOS_API bool Validate() const;
660 CHAOS_API void UpdateAllParticleSleepMetrics(const FRealSingle Dt);
661
662 CHAOS_API int32 GetNextVisitEpoch();
663 CHAOS_API bool ShouldAssignLevels() const;
664
665 // Ideally the island manager would not know about the particles, materials etc, but
666 // it is currently required for particle sleep management
667 FPBDRigidsSOAs& Particles;
669 const TArrayCollectionArray<TUniquePtr<FChaosPhysicsMaterial>>* PerParticlePhysicsMaterials;
670 const THandleArray<FChaosPhysicsMaterial>* SimMaterials;
672 int32 DisableCounterThreshold = TNumericLimits<int32>::Max();
673
674 // The nodes, edges and islands in the graph
678
679 // For tracking what islands need to be merged each tick
681
682 // All the constraint types registered with the graph
683 TArray<const FPBDConstraintContainer*> ConstraintContainers;
684
685 // A monotonically increasing key used to sort edges at the same level
686 int32 NextLevelSortKey = 0;
687
688 // A counter used to check if a node or edge has been visited in a loop
689 int32 NextVisitEpoch = 0;
690
691 // Whether we require determinism
692 bool bIsDeterministic = false;
693
694 // Whether we should assign levels (for shock propagation)
695 bool bAssignLevels = true;
696 };
697
698
699 template<typename ConstraintContainerType>
701 {
702 const int32 ContainerId = ConstraintContainer.GetContainerId();
703 for (FConstraintHandle* ConstraintHandle : ConstraintContainer.GetConstraintHandles())
704 {
705 if (ConstraintHandle != nullptr)
706 {
707 const bool bIsInGraph = ConstraintHandle->IsInConstraintGraph();
708 const bool bShouldBeInGraph = ConstraintHandle->IsEnabled();
710 {
711 AddConstraint(ContainerId, ConstraintHandle, ConstraintHandle->GetConstrainedParticles());
712 }
713 else if (!bShouldBeInGraph && bIsInGraph)
714 {
715 RemoveConstraint(ConstraintHandle);
716 }
717 }
718 }
719 }
720
721 template<typename VisitorType>
722 void FPBDIslandManager::VisitAwakeConstConstraints(const int32 ContainerId, const VisitorType& Visitor) const
723 {
724 for (FPBDIsland* Island : Islands)
725 {
726 if (!Island->Flags.bIsSleeping)
727 {
728 for (FPBDIslandConstraint* Edge : Island->ContainerEdges[ContainerId])
729 {
730 if (!Edge->Flags.bIsSleeping)
731 {
732 Visitor(Edge);
733 }
734 }
735 }
736 }
737 }
738
739 template<typename VisitorType>
740 void FPBDIslandManager::VisitAwakeConstraints(const int32 ContainerId, const VisitorType& Visitor)
741 {
742 const_cast<FPBDIslandManager*>(this)->VisitAwakeConstConstraints(ContainerId,
743 [&Visitor](const FPBDIslandConstraint* Edge)
744 {
745 Visitor(const_cast<FPBDIslandConstraint*>(Edge));
746 });
747 }
748
749 template<typename VisitorType>
750 void FPBDIslandManager::VisitConstConstraints(const int32 ContainerId, const VisitorType& Visitor) const
751 {
752 for (const FPBDIslandConstraint* Edge : Edges)
753 {
754 if (Edge->ContainerIndex == ContainerId)
755 {
756 Visitor(Edge);
757 }
758 }
759 }
760
761 template<typename VisitorType>
762 void FPBDIslandManager::VisitConstraints(const int32 ContainerId, const VisitorType& Visitor)
763 {
764 const_cast<FPBDIslandManager*>(this)->VisitConstConstraints(ContainerId,
765 [&Visitor](const FPBDIslandConstraint* Edge)
766 {
767 Visitor(const_cast<FPBDIslandConstraint*>(Edge));
768 });
769 }
770
771} // namespace Chaos::Private
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
constexpr auto MakeArrayView(OtherRangeType &&Other)
Definition ArrayView.h:873
@ INDEX_NONE
Definition CoreMiscDefines.h:150
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
FPlatformTypes::uint64 uint64
A 64-bit unsigned integer.
Definition Platform.h:1117
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
uint32_t uint32
Definition binka_ue_file_header.h:6
Base class for constraint handles.
Definition ConstraintHandle.h:102
Definition PBDConstraintContainer.h:19
Definition PBDRigidsEvolutionGBF.h:51
Definition PBDRigidsSOAs.h:269
Definition PerParticleGravity.h:11
Definition IslandManager.h:151
FConstraintHandle * GetConstraint() const
Definition IslandManager.h:157
uint64 GetSortKey() const
Definition IslandManager.h:162
CHAOS_API int32 GetIslandId() const
Definition IslandManager.cpp:445
friend class FPBDIsland
Definition IslandManager.h:179
void SetArrayIndex(const int32 InIndex)
Definition IslandManager.h:170
CHAOS_API ~FPBDIslandConstraint()
Definition IslandManager.cpp:440
CHAOS_API void Trash()
Definition IslandManager.cpp:468
CHAOS_API void Reuse(const int32 InContainerId, FConstraintHandle *InConstraint)
Definition IslandManager.cpp:454
CHAOS_API FPBDIslandConstraint()
Definition IslandManager.cpp:431
const int32 GetArrayIndex() const
Definition IslandManager.h:169
Definition IslandGroupManager.h:77
Definition IslandManager.h:453
CHAOS_API void RemoveConstraintContainer(const FPBDConstraintContainer &Container)
Definition IslandManager.cpp:654
CHAOS_API void RemoveContainerConstraints(const int32 ContainerId)
Definition IslandManager.cpp:1101
CHAOS_API int32 GetConstraintLevel(const FPBDIslandConstraint *Edge) const
Definition IslandManager.cpp:1167
UE_DEPRECATED(5.3, "Use Reset") void RemoveConstraints()
Definition IslandManager.h:548
CHAOS_API void ResetParticleResimFrame(const int32 ResetFrame=INDEX_NONE)
Definition IslandManager.cpp:1198
UE_DEPRECATED(5.3, "Use GetParticleIsland") const FPBDIsland *GetIsland(const FGeometryParticleHandle *Particle) const
Definition IslandManager.h:551
void VisitConstConstraints(const int32 ContainerId, const VisitorType &Visitor) const
Definition IslandManager.h:750
CHAOS_API void UpdateExplicitSleep()
Definition IslandManager.cpp:2400
CHAOS_API int32 GetConstraintColor(const FPBDIslandConstraint *Edge) const
Definition IslandManager.cpp:1176
CHAOS_API const FPBDIsland * GetParticleIsland(const FGeometryParticleHandle *Particle) const
Definition IslandManager.cpp:736
CHAOS_API int32 GetIslandIndex(const FPBDIsland *Island) const
Definition IslandManager.cpp:754
CHAOS_API void WakeParticleIslands(FGeometryParticleHandle *Particle)
Definition IslandManager.cpp:848
CHAOS_API bool WasParticleTransformSetExplicitly(const FGeometryParticleHandle *Particle)
Definition IslandManager.cpp:926
CHAOS_API void UpdateSleep(const FReal Dt=0)
Definition IslandManager.cpp:1138
void VisitAwakeConstraints(const int32 ContainerId, const VisitorType &Visitor)
Definition IslandManager.h:740
CHAOS_API void AddConstraintContainer(const FPBDConstraintContainer &Container)
Definition IslandManager.cpp:645
CHAOS_API void AddParticle(FGeometryParticleHandle *Particle)
Definition IslandManager.cpp:957
CHAOS_API void SetParticleResimFrame(FGeometryParticleHandle *Particle, const int32 ResimFrame)
Definition IslandManager.cpp:1190
CHAOS_API int32 GetParticleColor(const FPBDIslandParticle *Node) const
Definition IslandManager.cpp:1162
CHAOS_API void EndTick()
Definition IslandManager.cpp:1148
CHAOS_API TArray< const FConstraintHandle * > FindConstraintsInIslands(const TArray< const FPBDIsland * > Islands, int32 ContainerId) const
Definition IslandManager.cpp:833
int32 GetNumParticles() const
Definition IslandManager.h:462
void AddContainerConstraints(ConstraintContainerType &ConstraintContainer)
Definition IslandManager.h:700
CHAOS_API int32 GetParticleLevel(FGeometryParticleHandle *Particle) const
Definition IslandManager.cpp:716
CHAOS_API void UpdateParticles()
Definition IslandManager.cpp:984
CHAOS_API void RemoveParticleContainerConstraints(FGeometryParticleHandle *Particle, const int32 ContainerId)
Definition IslandManager.cpp:1084
CHAOS_API void FlagParticleTransformSetExplicitly(const FGeometryParticleHandle *Particle)
Definition IslandManager.cpp:942
CHAOS_API void SetGravityForces(const FPerParticleGravity *InGravity)
Definition IslandManager.cpp:674
CHAOS_API void SetIsDeterministic(const bool bInIsDeterministic)
Definition IslandManager.cpp:634
UE_DEPRECATED(5.3, "Use GetNumIslands") int32 NumIslands() const
Definition IslandManager.h:550
CHAOS_API void RemoveAllConstraints()
Definition IslandManager.cpp:1114
const FPBDIsland * GetIsland(const int32 IslandIndex) const
Definition IslandManager.h:486
FConstraintHandle * Constraint
Definition IslandManager.h:552
CHAOS_API void UpdateIslands()
Definition IslandManager.cpp:1133
CHAOS_API int32 GetIslandArrayIndex(const FPBDIslandConstraint *Edge) const
Definition IslandManager.cpp:763
void VisitConstraints(const int32 ContainerId, const VisitorType &Visitor)
Definition IslandManager.h:762
CHAOS_API void RemoveParticle(FGeometryParticleHandle *Particle)
Definition IslandManager.cpp:963
CHAOS_API void SetMaterialContainers(const TArrayCollectionArray< TSerializablePtr< FChaosPhysicsMaterial > > *InPhysicsMaterials, const TArrayCollectionArray< TUniquePtr< FChaosPhysicsMaterial > > *InPerParticlePhysicsMaterials, const THandleArray< FChaosPhysicsMaterial > *InSimMaterials)
Definition IslandManager.cpp:667
CHAOS_API int32 GetParticleResimFrame(const FGeometryParticleHandle *Particle) const
Definition IslandManager.cpp:1181
int32 GetNumIslands() const
Definition IslandManager.h:485
CHAOS_API int32 GetNumConstraintContainers() const
Definition IslandManager.cpp:684
FPBDIsland * GetIsland(const int32 IslandIndex)
Definition IslandManager.h:533
CHAOS_API void UpdateDisable(TFunctionRef< void(FPBDRigidParticleHandle *)> ParticleDisableFunctor)
Definition IslandManager.cpp:1143
CHAOS_API void RemoveParticleConstraints(FGeometryParticleHandle *Particle)
Definition IslandManager.cpp:1069
CHAOS_API TArray< const FPBDIsland * > FindParticleIslands(const FGeometryParticleHandle *Particle) const
Definition IslandManager.cpp:772
CHAOS_API const FPBDIsland * GetConstraintIsland(const FConstraintHandle *Constraint) const
Definition IslandManager.cpp:745
CHAOS_API int32 ReserveParticles(const int32 InNumParticles)
Definition IslandManager.cpp:709
CHAOS_API ~FPBDIslandManager()
Definition IslandManager.cpp:614
CHAOS_API TArray< const FGeometryParticleHandle * > FindParticlesInIslands(const TArray< const FPBDIsland * > Islands) const
Definition IslandManager.cpp:805
CHAOS_API void AddConstraint(const int32 ContainerId, FConstraintHandle *Constraint, const TVec2< FGeometryParticleHandle * > &ConstrainedParticles)
Definition IslandManager.cpp:1024
void VisitAwakeConstConstraints(const int32 ContainerId, const VisitorType &Visitor) const
Definition IslandManager.h:722
CHAOS_API void FlagParticleUpdated(const FGeometryParticleHandle *Particle)
Definition IslandManager.cpp:911
UE_DEPRECATED(5.3, "Use UpdateParticles") void InitializeGraph(const TParticleView< FPBDRigidParticles > &InParticles)
Definition IslandManager.h:549
CHAOS_API void SetAssignLevels(const bool bInAssignLevels)
Definition IslandManager.cpp:640
CHAOS_API void SleepParticle(FGeometryParticleHandle *Particle)
Definition IslandManager.cpp:894
CHAOS_API void UpdateParticleMaterial(FGeometryParticleHandle *Particle)
Definition IslandManager.cpp:725
CHAOS_API void RemoveConstraint(FConstraintHandle *ConstraintHandle)
Definition IslandManager.cpp:1050
CHAOS_API void WakeConstraintIsland(FConstraintHandle *Constraint)
Definition IslandManager.cpp:1124
CHAOS_API void Reset()
Definition IslandManager.cpp:689
CHAOS_API void SetDisableCounterThreshold(const int32 InDisableCounterThreshold)
Definition IslandManager.cpp:679
int32 GetNumConstraints() const
Definition IslandManager.h:475
Definition IslandManager.h:417
CHAOS_API void Trash()
Definition IslandManager.cpp:584
CHAOS_API FPBDIslandMergeSet()
Definition IslandManager.cpp:570
const int32 GetArrayIndex() const
Definition IslandManager.h:423
void SetArrayIndex(const int32 InIndex)
Definition IslandManager.h:424
CHAOS_API ~FPBDIslandMergeSet()
Definition IslandManager.cpp:575
CHAOS_API void Reuse()
Definition IslandManager.cpp:580
Definition IslandManager.h:41
const int32 GetArrayIndex() const
Definition IslandManager.h:58
CHAOS_API int32 GetIslandId() const
Definition IslandManager.cpp:381
void SetIterationSettings(const FIterationSettings &InIterations)
Definition IslandManager.h:77
FIterationSettings GetIterationSettings() const
Definition IslandManager.h:69
CHAOS_API ~FPBDIslandParticle()
Definition IslandManager.cpp:376
CHAOS_API void Reuse(FGeometryParticleHandle *InParticle)
Definition IslandManager.cpp:390
const FGeometryParticleHandle * GetParticle() const
Definition IslandManager.h:52
friend class FPBDIsland
Definition IslandManager.h:84
CHAOS_API void Trash()
Definition IslandManager.cpp:400
CHAOS_API FPBDIslandParticle()
Definition IslandManager.cpp:367
FGeometryParticleHandle * GetParticle()
Definition IslandManager.h:47
void SetArrayIndex(const int32 InIndex)
Definition IslandManager.h:59
Definition IslandManager.h:231
CHAOS_API ~FPBDIsland()
Definition IslandManager.cpp:506
int32 GetSleepCounter() const
Definition IslandManager.h:261
bool NeedsResim() const
Definition IslandManager.h:276
void SetIterationSettings(const FIterationSettings &InIterations)
Definition IslandManager.h:340
const FPBDIslandParticle * GetNode(const int32 NodeIndex) const
Definition IslandManager.h:251
bool IsPartialSleepEnabled() const
Definition IslandManager.cpp:556
void SetIsUsingCache(const bool bInIsUsingCache)
Definition IslandManager.h:301
bool IsSleeping() const
Definition IslandManager.h:256
bool IsUsingCache() const
Definition IslandManager.h:296
void SetSleepCounter(const int32 InSleepCounter)
Definition IslandManager.h:266
int32 GetNumParticles() const
Definition IslandManager.h:236
CHAOS_API void Trash()
Definition IslandManager.cpp:520
FIterationSettings GetIterationSettings() const
Definition IslandManager.h:332
int32 GetIslandId() const
Definition IslandManager.h:318
bool IsSleepAllowed() const
Definition IslandManager.h:271
TArrayView< FPBDIslandConstraint * > GetConstraints(const int32 ContainerId)
Definition IslandManager.h:311
void SetResimFrame(const int32 InResimFrame)
Definition IslandManager.h:291
void SetNeedsResim(const bool bInNeedsResim)
Definition IslandManager.h:281
int32 GetNumConstraints() const
Definition IslandManager.h:241
const int32 GetArrayIndex() const
Definition IslandManager.h:324
void SetArrayIndex(const int32 InIndex)
Definition IslandManager.h:325
int32 GetResimFrame() const
Definition IslandManager.h:286
CHAOS_API void Reuse()
Definition IslandManager.cpp:511
int32 GetNumContainerConstraints(const int32 ContainerId) const
Definition IslandManager.h:246
TArrayView< FPBDIslandParticle * > GetParticles()
Definition IslandManager.h:306
CHAOS_API FPBDIsland()
Definition IslandManager.cpp:501
Definition IterationSettings.h:19
Definition PoolBackedArray.h:37
Definition ArrayCollectionArray.h:15
Definition ParticleHandle.h:436
const TPBDRigidParticleHandleImp< T, d, bPersistent > * CastToRigidParticle() const
Definition ParticleHandle.h:1697
Definition Handles.h:152
Definition ParticleHandle.h:987
Definition PBDRigidParticles.h:22
Definition ParticleIterator.h:639
Definition Serializable.h:10
Definition Vector.h:41
Definition ArrayView.h:139
Definition Array.h:670
Definition AssetRegistryState.h:50
Definition UniquePtr.h:107
Definition ChaosDebugDraw.h:25
Definition BodyInstance.h:90
FIterationSettings8 FIterationSettings
Definition IterationSettings.h:83
Definition SkeletalMeshComponent.h:307
FRealDouble FReal
Definition Real.h:22
float FRealSingle
Definition Real.h:14
TGeometryParticleHandle< FReal, 3 > FGeometryParticleHandle
Definition ParticleHandleFwd.h:24
Definition IslandManager.h:28
FRealSingle Angular
Definition IslandManager.h:34
FRealSingle Linear
Definition IslandManager.h:33
FPBDParticleMomentumSq(const FRealSingle Linear=0.0f, const FRealSingle Angular=0.0f)
Definition IslandManager.h:29
Definition NumericLimits.h:41