UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
CollisionConstraintAllocator.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
4#include "CoreMinimal.h"
5
6#include "Chaos/Core.h"
11#include "Chaos/ObjectPool.h"
13#include "ChaosStats.h"
14
15
16namespace Chaos
17{
18 class FPBDCollisionConstraints;
19 class FSpatialAccelerationBroadPhase;
20
21 namespace Private
22 {
28 {
29 public:
41
46 {
47 return CurrentEpoch;
48 }
49
54 FGeometryParticleHandle* Particle0,
56 const FPerShapeData* Shape0,
59 FGeometryParticleHandle* Particle1,
61 const FPerShapeData* Shape1,
64 const FReal CullDistance,
65 const bool bUseManifold,
66 const EContactShapesType ShapePairType);
67
72 {
73#if CHAOS_COLLISION_OBJECTPOOL_ENABLED
74 FPBDCollisionConstraint* Constraint = ConstraintPool.Alloc();
75 return FPBDCollisionConstraintPtr(Constraint, FPBDCollisionConstraintDeleter(ConstraintPool));
76#else
78#endif
79 }
80
87 {
89 // Use the LastUsedEpoch to catch duplicate add attempts. This is still possible
90 // via rewind/resim and InjectCollision. Ideally we wouldn't need do update
91 // the cookie data until FCollisionConstraintAllocator::ProcessNewCollisions...
92 if (Cookie.LastUsedEpoch != CurrentEpoch)
93 {
94 Cookie.LastUsedEpoch = CurrentEpoch;
97
98 NewActiveConstraints.Push(Constraint);
99
100 Constraint->Activate();
101
102 return true;
103 }
104 return false;
105 }
106
115 {
116 FParticlePairMidPhase* MidPhase = FindMidPhaseImpl(Particle0, Particle1, SearchParticlePerformanceHint);
117 if (MidPhase == nullptr)
118 {
119 MidPhase = CreateMidPhase(Particle0, Particle1, Context);
120 }
121
122 return MidPhase;
123 }
124
132
133 private:
138
139
140 void Reset()
141 {
142#if CHAOS_COLLISION_OBJECTPOOL_ENABLED
143 ConstraintPool.Reset();
144#endif
145#if CHAOS_MIDPHASE_OBJECTPOOL_ENABLED
146 MidPhasePool.Reset();
147#endif
148 }
149
150 void BeginDetectCollisions(const int32 InEpoch)
151 {
152 check(NewActiveConstraints.IsEmpty());
153 check(NewMidPhases.IsEmpty());
154
155 CurrentEpoch = InEpoch;
156 }
157
158 // Find the midphase for the particle pair if it exists. Every particle holds a list of its midphases. We search "SearchParticle" which should be
159 // ideally be the one with fewer midphases on it.
161 {
162 check((SearchParticle == Particle0) || (SearchParticle == Particle1));
163
165 return SearchParticle->ParticleCollisions().FindMidPhase(Key.GetKey());
166 }
167
168 // Create and initialize a midphase for the particle pair. Adds it to the particles' lists of midphases.
169 FParticlePairMidPhase* CreateMidPhase(FGeometryParticleHandle* Particle0, FGeometryParticleHandle* Particle1, const FCollisionContext& Context)
170 {
171 const Private::FCollisionParticlePairKey Key = Private::FCollisionParticlePairKey(Particle0, Particle1);
172
173 // We temporarily hold new midphases as raw pointers and wrap them in a unique ptr later in ProcessNewMidPhases
174#if CHAOS_MIDPHASE_OBJECTPOOL_ENABLED
175 FParticlePairMidPhase* MidPhase = MidPhasePool.Alloc();
176#else
177 FParticlePairMidPhase* MidPhase = FParticlePairMidPhase::Make(Particle0, Particle1);
178#endif
179
180 NewMidPhases.Add(MidPhase);
181
182 MidPhase->Init(Particle0, Particle1, Key, Context);
183 return MidPhase;
184 }
185
186 FPBDCollisionConstraints* CollisionContainer;
187 int32 CurrentEpoch;
188
189 TArray<FPBDCollisionConstraint*> NewActiveConstraints;
191
192#if CHAOS_COLLISION_OBJECTPOOL_ENABLED
193 FPBDCollisionConstraintPool ConstraintPool;
194#endif
195#if CHAOS_MIDPHASE_OBJECTPOOL_ENABLED
198#endif
199 };
200
201
234 {
235 public:
237
239 : CollisionContainer(nullptr)
240 , ContextAllocators()
241 , NumCollisionsPerBlock(InNumCollisionsPerBlock)
242 , ParticlePairMidPhases()
243 , ActiveConstraints()
244 , ActiveCCDConstraints()
245 , CurrentEpoch(0)
246 , bIsDeteministic(false)
247 , bInCollisionDetectionPhase(false)
248 {
249 }
250
252 {
253 // Explicit clear so we don't have to worry about destruction order of pool and midphases
254 Reset();
255 }
256
261
263 {
264 // Forgot to call SetCollisionContainer after construction
265 // @todo(chaos): this check makes the allocator difficult to unit test - fix this
266 //check(CollisionContainer != nullptr);
267
268 const int32 NumNewContexts = MaxContexts - ContextAllocators.Num();
269 if (NumNewContexts > 0)
270 {
271 ContextAllocators.Reserve(MaxContexts);
272 for (int32 NewIndex = 0; NewIndex < NumNewContexts; ++NewIndex)
273 {
274 TUniquePtr<FCollisionContextAllocator> ContextAllocator = MakeUnique<FCollisionContextAllocator>(CollisionContainer, NumCollisionsPerBlock, CurrentEpoch);
275 ContextAllocators.Emplace(MoveTemp(ContextAllocator));
276 }
277 }
278 }
279
281 {
282 return ContextAllocators[Index].Get();
283 }
284
292 {
293 return MakeArrayView(ActiveConstraints);
294 }
295
303 {
304 return MakeArrayView(ActiveCCDConstraints);
305 }
306
317
319 {
320 return CurrentEpoch;
321 }
322
331 {
332 const bool bIsExpired = Constraint.GetContainerCookie().LastUsedEpoch < CurrentEpoch;
333 return bIsExpired;
334 }
335
339 void Reset()
340 {
341 ActiveConstraints.Reset();
342 ActiveCCDConstraints.Reset();
343 ParticlePairMidPhases.Reset();
344
345 // NOTE: this deletes all the storage for constraints and midphases - must be last
346 ContextAllocators.Reset();
347 }
348
354 {
355 ResetActiveConstraints();
356
357 ActiveConstraints.Reset();
358 ActiveCCDConstraints.Reset();
359 }
360
366 {
367 check(!bInCollisionDetectionPhase);
368 bInCollisionDetectionPhase = true;
369
370 // Update the tick counter
371 // NOTE: We do this here rather than in EndDetectionCollisions so that any contacts injected
372 // before collision detection count as the previous frame's collisions, e.g., from Islands
373 // that are manually awoken by modifying a particle on the game thread. This also needs to be
374 // done where we reset the Constraints array so that we can tell we have a valid index from
375 // the Epoch.
376 ++CurrentEpoch;
377
378 for (const TUniquePtr<FCollisionContextAllocator>& ContextAllocator : ContextAllocators)
379 {
380 ContextAllocator->BeginDetectCollisions(CurrentEpoch);
381 }
382
383 ResetActiveConstraints();
384
385 // Clear the collision list for this tick - we are about to rebuild them
386 ActiveConstraints.Reset();
387 ActiveCCDConstraints.Reset();
388 }
389
395
400 {
401 PruneExpiredMidPhases();
402 }
403
408
413 {
414 ProcessNewItems();
415 }
416
424
430 {
432 {
433 // We must keep the particles in the same order that the broadphase would generate when
434 // finding or creating the midphase. This is because Collision Constraints may have the
435 // particles in the opposite order to the midphase tha owns them.
436 FGeometryParticleHandle* Particle0 = SourceConstraint.Particle[0];
437 FGeometryParticleHandle* Particle1 = SourceConstraint.Particle[1];
438 if (ShouldSwapParticleOrder(Particle0, Particle1))
439 {
440 Swap(Particle0, Particle1);
441 }
442
443 FParticlePairMidPhase* MidPhase = Context.GetAllocator()->GetMidPhase(Particle0, Particle1, SourceConstraint.Particle[0], Context);
444
445 // We may be adding multiple constraints for the same particle pair, so we need
446 // to make sure the map is up to date in the case where we just created a new MidPhase
448
449 if (MidPhase != nullptr)
450 {
452 }
453 }
454
455 ProcessNewConstraints();
456 }
457
462 {
463 SortActiveConstraints();
464 }
465
471
476 template<typename TLambda>
478 {
479 for (const FParticlePairMidPhasePtr& MidPhase : ParticlePairMidPhases)
480 {
481 if (MidPhase->VisitConstCollisions(Visitor, VisitFlags) == ECollisionVisitorResult::Stop)
482 {
483 return;
484 }
485 }
486 }
487
492 template<typename TLambda>
493 void VisitCollisions(const TLambda& Visitor) const
494 {
495 for (const FParticlePairMidPhasePtr& MidPhase : ParticlePairMidPhases)
496 {
497 if (MidPhase->VisitCollisions(Visitor) == ECollisionVisitorResult::Stop)
498 {
499 return;
500 }
501 }
502 }
503
508 template<typename TLambda>
509 void VisitMidPhases(const TLambda& Visitor)
510 {
511 for (FParticlePairMidPhasePtr& MidPhase : ParticlePairMidPhases)
512 {
513 if (Visitor(*MidPhase) == ECollisionVisitorResult::Stop)
514 {
515 return;
516 }
517 }
518 }
519
524 {
525 bIsDeteministic = bInIsDeterministic;
526 }
527
528 private:
530
531 // Gather all the newly created items and finalize their setup
532 void ProcessNewItems();
533
534 void AddMidPhase(FParticlePairMidPhasePtr&& MidPhase)
535 {
536 ParticlePairMidPhases.Emplace(MoveTemp(MidPhase));
537 }
538
539 // Remove ParticlePairMidPhase from each Particles list of collisions
540 // NOTE: One or both particles may have been destroyed in which case it will
541 // have been set to null on the midphase.
542 void DetachParticlePairMidPhase(FParticlePairMidPhase* MidPhase)
543 {
544 if (FGeometryParticleHandle* Particle0 = MidPhase->GetParticle0())
545 {
546 Particle0->ParticleCollisions().RemoveMidPhase(Particle0, MidPhase);
547 }
548
549 if (FGeometryParticleHandle* Particle1 = MidPhase->GetParticle1())
550 {
551 Particle1->ParticleCollisions().RemoveMidPhase(Particle1, MidPhase);
552 }
553 }
554
555 // Find all midphases that have not been updated this tick (i.e., bounds no longer overlap) and destroy them
556 CHAOS_API void PruneExpiredMidPhases();
557
558 // Collect all the constraints activated in the collision tasks and register them (calls ActivateConstraintImp on each)
559 CHAOS_API void ProcessNewConstraints();
560 CHAOS_API void ProcessNewNonCcdConstraints(const TArray<FPBDCollisionConstraint*>& NewConstraints, TArray<FPBDCollisionConstraint*>& AllCCDConstraints);
561 CHAOS_API void ProcessNewCcdConstraints();
562
563 CHAOS_API void AddActiveConstraintImpl(FPBDCollisionConstraint* Constraint);
564 CHAOS_API void SetConstraintCookie(FPBDCollisionConstraint* Constraint, int32 Index);
565 CHAOS_API void RemoveActiveConstraint(FPBDCollisionConstraint& Constraint);
566
567 CHAOS_API void SortActiveConstraints();
568
569 CHAOS_API void ResetActiveConstraints();
570
571 // The container that owns the allocator (only needed because new constraints need to know)
572 FPBDCollisionConstraints* CollisionContainer;
573
574 // Storage for collisins and midphases, one for each thread on which we detect collisions
576 int32 NumCollisionsPerBlock;
577
578 // All of the overlapping particle pairs in the scene
579 TArray<FParticlePairMidPhasePtr> ParticlePairMidPhases;
580
581 // The active constraints (added or recovered this tick)
582 TArray<FPBDCollisionConstraint*> ActiveConstraints;
583
584 // The active sweep constraints (added or recovered this tick)
585 TArray<FPBDCollisionConstraint*> ActiveCCDConstraints;
586
587 // The current epoch used to track out-of-date contacts. A constraint whose Epoch is
588 // older than the current Epoch at the end of the tick was not refreshed this tick.
589 int32 CurrentEpoch;
590
591 // Whether we running a deterministic sim
592 bool bIsDeteministic;
593
594 // For assertions
595 bool bInCollisionDetectionPhase;
596 };
597
598 } // namespace Private
599
602 //
603 // Below here is for code that is moved to avoid circular header dependencies
604 // See ParticlePairMidPhase.h and ParticleCollisions.h
605 //
608
609 // Check the visitor flags and return true if we want to visit the constraint
611 {
612 if (Constraint == nullptr)
613 {
614 return false;
615 }
616
618 {
619 // Awkward. Sleeping constraints are considered "disabled" so if we want to
620 // visit sleeping constraints we must ignore the disabled state when asleep
622 {
623 // We do NOT want to visit sleeping, so we can just check the enabled flag
624 if (!Constraint->IsEnabled())
625 {
626 return false;
627 }
628 }
629 else
630 {
631 // We do want to visit sleeping, so we only skip disabled-awake constraints
632 if (!Constraint->IsEnabled() && !Constraint->IsSleeping())
633 {
634 return false;
635 }
636 }
637 }
638
640 {
641 if (Constraint->IsSleeping())
642 {
643 return false;
644 }
645 }
646
648 {
649 if (!Constraint->IsCurrent())
650 {
651 return false;
652 }
653 }
654
655 return true;
656 }
657
658 template<typename TLambda>
660 {
662 {
664
665 for (FSingleShapePairCollisionDetector& ShapePair : This->ShapePairDetectors)
666 {
668 {
669 if (Visitor(*ShapePair.GetConstraint()) == ECollisionVisitorResult::Stop)
670 {
672 }
673 }
674 }
675 }
676
678 {
680 for (auto& KVP : This->Constraints)
681 {
682 FPBDCollisionConstraintPtr& Constraint = KVP.Value;
683
684 if (CollisionVisitorShouldVisit(Constraint.Get(), VisitFlags))
685 {
686 if (Visitor(*Constraint) == ECollisionVisitorResult::Stop)
687 {
689 }
690 }
691 }
692 }
693
695 {
697 FPBDCollisionConstraint* Constraint = This->Constraint.Get();
698 if (Constraint != nullptr)
699 {
701 {
702 if (Visitor(*Constraint) == ECollisionVisitorResult::Stop)
703 {
705 }
706 }
707 }
708 }
709
711 }
712
713
714 template<typename TLambda>
716 {
718 {
719 const FShapePairParticlePairMidPhase* This = static_cast<const FShapePairParticlePairMidPhase*>(this);
720 for (const FSingleShapePairCollisionDetector& ShapePair : This->ShapePairDetectors)
721 {
723 {
724 if (Visitor(*ShapePair.GetConstraint()) == ECollisionVisitorResult::Stop)
725 {
727 }
728 }
729 }
730 }
731
733 {
734 const FGenericParticlePairMidPhase* This = static_cast<const FGenericParticlePairMidPhase*>(this);
735 for (const auto& KVP : This->Constraints)
736 {
737 const FPBDCollisionConstraintPtr& Constraint = KVP.Value;
738
739 if (CollisionVisitorShouldVisit(Constraint.Get(), VisitFlags))
740 {
741 if (Visitor(*Constraint) == ECollisionVisitorResult::Stop)
742 {
744 }
745 }
746 }
747 }
748
750 {
752 const FPBDCollisionConstraint* Constraint = This->Constraint.Get();
753 if (Constraint != nullptr)
754 {
756 {
757 if (Visitor(*Constraint) == ECollisionVisitorResult::Stop)
758 {
760 }
761 }
762 }
763 }
764
766 }
767
768
769 template<typename TLambda>
771 {
772 for (int32 Index = 0; Index < MidPhases.Num(); ++Index)
773 {
774 if (Lambda(*MidPhases[Index].Value) == ECollisionVisitorResult::Stop)
775 {
777 }
778 }
780 }
781
782 template<typename TLambda>
784 {
785 for (int32 Index = 0; Index < MidPhases.Num(); ++Index)
786 {
787 if (Lambda(*MidPhases[Index].Value) == ECollisionVisitorResult::Stop)
788 {
790 }
791 }
793 }
794
795 template<typename TLambda>
797 {
798 return VisitMidPhases([&Visitor, VisitFlags](FParticlePairMidPhase& MidPhase)
799 {
801 {
802 return ECollisionVisitorResult::Stop;
803 }
805 });
806 }
807
808 template<typename TLambda>
810 {
811 return VisitConstMidPhases([&Visitor, VisitFlags](const FParticlePairMidPhase& MidPhase)
812 {
814 {
815 return ECollisionVisitorResult::Stop;
816 }
818 });
819 }
820
821
822}
constexpr auto MakeArrayView(OtherRangeType &&Other)
Definition ArrayView.h:873
#define check(expr)
Definition AssertionMacros.h:314
#define CHAOS_MIDPHASE_OBJECTPOOL_ENABLED
Definition CollisionResolutionTypes.h:10
#define CHAOS_COLLISION_OBJECTPOOL_ENABLED
Definition CollisionResolutionTypes.h:9
@ INDEX_NONE
Definition CoreMiscDefines.h:150
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
if(Failed) console_printf("Failed.\n")
Definition BVHParticles.h:24
Definition CollisionContext.h:83
Definition ParticlePairMidPhase.h:507
Definition ImplicitObject.h:111
Information used by the constraint allocator This includes any information used for optimizations lik...
Definition PBDCollisionConstraint.h:164
int32 ConstraintIndex
Definition PBDCollisionConstraint.h:198
int32 LastUsedEpoch
Definition PBDCollisionConstraint.h:195
int32 CCDConstraintIndex
Definition PBDCollisionConstraint.h:206
virtual bool IsEnabled() const override final
Definition PBDCollisionConstraints.h:426
A contact constraint.
Definition PBDCollisionConstraint.h:225
virtual CHAOS_API bool IsSleeping() const override final
Definition PBDCollisionConstraint.cpp:529
bool IsCurrent() const
Definition PBDCollisionConstraint.h:407
CHAOS_API void Activate()
Definition PBDCollisionConstraint.cpp:471
const FPBDCollisionConstraintContainerCookie & GetContainerCookie() const
Definition PBDCollisionConstraint.h:892
Definition PBDCollisionConstraints.h:49
ECollisionVisitorResult VisitConstCollisions(const TLambda &Visitor, const ECollisionVisitorFlags VisitFlags=ECollisionVisitorFlags::VisitDefault) const
Visit all the collisions on this particle.
Definition CollisionConstraintAllocator.h:809
ECollisionVisitorResult VisitMidPhases(const TLambda &Lambda)
Visit all of the midphases on the particle and call the specified function.
Definition CollisionConstraintAllocator.h:770
ECollisionVisitorResult VisitCollisions(const TLambda &Visitor, const ECollisionVisitorFlags VisitFlags=ECollisionVisitorFlags::VisitDefault)
Visit all the collisions on this particle.
Definition CollisionConstraintAllocator.h:796
ECollisionVisitorResult VisitConstMidPhases(const TLambda &Lambda) const
Visit all of the midphases on the particle and call the specified function.
Definition CollisionConstraintAllocator.h:783
Produce collisions for a particle pair A FParticlePairMidPhase object is created for every particle p...
Definition ParticlePairMidPhase.h:192
FGeometryParticleHandle * GetParticle0() const
Definition ParticlePairMidPhase.h:219
static CHAOS_API FParticlePairMidPhase * Make(FGeometryParticleHandle *InParticle0, FGeometryParticleHandle *InParticle1)
Definition ParticlePairMidPhase.cpp:846
CHAOS_API void InjectCollision(const FPBDCollisionConstraint &Constraint, const FCollisionContext &Context)
Copy a collision and activate it This is used by the Resim system to restore saved colisions....
Definition ParticlePairMidPhase.cpp:1064
ECollisionVisitorResult VisitConstCollisions(const TLambda &Visitor, const ECollisionVisitorFlags VisitFlags=ECollisionVisitorFlags::VisitDefault) const
Call a lambda on each active collision constraint.
Definition CollisionConstraintAllocator.h:715
EParticlePairMidPhaseType GetMidPhaseType() const
Definition ParticlePairMidPhase.h:202
FGeometryParticleHandle * GetParticle1() const
Definition ParticlePairMidPhase.h:221
ECollisionVisitorResult VisitCollisions(const TLambda &Visitor, const ECollisionVisitorFlags VisitFlags=ECollisionVisitorFlags::VisitDefault)
Call a lambda on each active collision constraint This includes sleeping constraints,...
Definition CollisionConstraintAllocator.h:659
Definition ShapeInstance.h:36
Definition ParticlePairMidPhase.h:463
Handles collision detection for a pair of simple shapes (i.e., not compound shapes)
Definition ParticlePairMidPhase.h:50
Definition SpatialAccelerationBroadPhase.h:335
Definition ParticlePairMidPhase.h:596
An allocator and container of collision constraints that supports reuse of constraints from the previ...
Definition CollisionConstraintAllocator.h:234
TArrayView< const FPBDCollisionConstraint *const > GetConstConstraints() const
The set of collision constraints for the current tick (created or reinstated)
Definition CollisionConstraintAllocator.h:313
void PruneExpiredItems()
Called each tick after the graph is updated to remove unused collisions.
Definition CollisionConstraintAllocator.h:399
void VisitConstCollisions(const TLambda &Visitor, const ECollisionVisitorFlags &VisitFlags=ECollisionVisitorFlags::VisitDefault) const
Iterate over all collisions (read-only), including sleeping ones Visitor signature: ECollisionVisitor...
Definition CollisionConstraintAllocator.h:477
UE_NONCOPYABLE(FCollisionConstraintAllocator)
void SetCollisionContainer(FPBDCollisionConstraints *InCollisionContainer)
Definition CollisionConstraintAllocator.h:257
int32 GetCurrentEpoch() const
Definition CollisionConstraintAllocator.h:318
~FCollisionConstraintAllocator()
Definition CollisionConstraintAllocator.h:251
void ProcessInjectedConstraints()
If we add new constraints after collision detection, do what needs to be done to add them to the syst...
Definition CollisionConstraintAllocator.h:412
void AddResimConstraints(const TArray< FPBDCollisionConstraint > &InConstraints, const FCollisionContext Context)
Add a set of pre-built constraints and build required internal mapping data This is used by the resim...
Definition CollisionConstraintAllocator.h:429
void Reset()
Destroy all constraints.
Definition CollisionConstraintAllocator.h:339
TArrayView< FPBDCollisionConstraint *const > GetCCDConstraints() const
The set of sweep collision constraints for the current tick (created or reinstated)
Definition CollisionConstraintAllocator.h:302
TArrayView< FPBDCollisionConstraint *const > GetConstraints() const
The set of collision constraints for the current tick (created or reinstated)
Definition CollisionConstraintAllocator.h:291
bool IsConstraintExpired(const FPBDCollisionConstraint &Constraint)
Definition CollisionConstraintAllocator.h:330
void SetMaxContexts(const int32 MaxContexts)
Definition CollisionConstraintAllocator.h:262
void BeginDetectCollisions()
Called at the start of the tick to prepare for collision detection. Resets the list of active contact...
Definition CollisionConstraintAllocator.h:365
CHAOS_API void RemoveParticle(FGeometryParticleHandle *Particle)
Destroy all collision and caches involving the particle Called when a particle is destroyed or disabl...
Definition CollisionConstraintAllocator.cpp:365
CHAOS_API void EndDetectCollisions()
Called after collision detection to clean up Prunes unused contacts.
Definition CollisionConstraintAllocator.cpp:241
FCollisionConstraintAllocator(const int32 InNumCollisionsPerBlock=1000)
Definition CollisionConstraintAllocator.h:238
CHAOS_API void ProcessNewMidPhases()
Definition CollisionConstraintAllocator.cpp:36
void BeginFrame()
Called at the start of the frame to clear the frame's active collision list.
Definition CollisionConstraintAllocator.h:353
FCollisionContextAllocator * GetContextAllocator(const int32 Index)
Definition CollisionConstraintAllocator.h:280
void VisitCollisions(const TLambda &Visitor) const
Iterate over all collisions (write-enabled), including sleeping ones Visitor signature: ECollisionVis...
Definition CollisionConstraintAllocator.h:493
void SetIsDeterministic(const bool bInIsDeterministic)
Definition CollisionConstraintAllocator.h:523
void SortConstraintsHandles()
Sort all the constraints for better solver stability.
Definition CollisionConstraintAllocator.h:461
void AddActiveConstraint(FPBDCollisionConstraint *Constraint)
Definition CollisionConstraintAllocator.cpp:296
void VisitMidPhases(const TLambda &Visitor)
Iterate over all midphases Visitor signature: ECollisionVisitorResult(FParticlePairMidPhase&)
Definition CollisionConstraintAllocator.h:509
Definition CollisionConstraintAllocator.h:28
FParticlePairMidPhase * FindMidPhase(FGeometryParticleHandle *Particle0, FGeometryParticleHandle *Particle1, FGeometryParticleHandle *SearchParticlePerformanceHint)
Definition CollisionConstraintAllocator.h:128
int32 GetCurrentEpoch() const
Definition CollisionConstraintAllocator.h:45
FParticlePairMidPhase * GetMidPhase(FGeometryParticleHandle *Particle0, FGeometryParticleHandle *Particle1, FGeometryParticleHandle *SearchParticlePerformanceHint, const FCollisionContext &Context)
Definition CollisionConstraintAllocator.h:114
friend class FMergeConstraintsTask
Definition CollisionConstraintAllocator.h:136
friend class FSortConstraintTask
Definition CollisionConstraintAllocator.h:135
bool ActivateConstraint(FPBDCollisionConstraint *Constraint)
Definition CollisionConstraintAllocator.h:86
FPBDCollisionConstraintPtr CreateConstraint()
Definition CollisionConstraintAllocator.h:71
FCollisionContextAllocator(FPBDCollisionConstraints *InCollisionContainer, const int32 InNumCollisionsPerBlock, const int32 InCurrentEpoch)
Definition CollisionConstraintAllocator.h:30
Definition CollisionKeys.h:59
Definition ParticleHandle.h:436
Definition ArrayView.h:139
Definition Array.h:670
UE_REWRITE SizeType Num() const
Definition Array.h:1144
UE_FORCEINLINE_HINT T * Get() const
Definition UniquePtr.h:324
Definition SkeletalMeshComponent.h:307
TObjectPool< FPBDCollisionConstraint > FPBDCollisionConstraintPool
Definition CollisionResolutionTypes.h:112
TUniquePtr< FPBDCollisionConstraint, FPBDCollisionConstraintDeleter > FPBDCollisionConstraintPtr
Definition CollisionResolutionTypes.h:114
FRealDouble FReal
Definition Real.h:22
TObjectPoolDeleter< FPBDCollisionConstraintPool > FPBDCollisionConstraintDeleter
Definition CollisionResolutionTypes.h:113
bool CollisionVisitorShouldVisit(const FPBDCollisionConstraint *Constraint, const ECollisionVisitorFlags VisitFlags)
Definition CollisionConstraintAllocator.h:610
EContactShapesType
Definition CollisionResolutionTypes.h:55
TGeometryParticleHandle< FReal, 3 > FGeometryParticleHandle
Definition ParticleHandleFwd.h:24
@ Generic
Definition ParticlePairMidPhase.h:33
@ ShapePair
Definition ParticlePairMidPhase.h:38
@ SphereApproximation
Definition ParticlePairMidPhase.h:41
ECollisionVisitorResult
Return value in collision visitors to indicate whether we should continue visiting for stop.
Definition CollisionVisitor.h:14
ECollisionVisitorFlags
Definition CollisionVisitor.h:23
bool ShouldSwapParticleOrder(const bool bIsDynamicOrSleeping0, const bool bIsDynamicOrSleeping1, const bool bIsParticle0Preferred)
Definition CollisionKeys.h:37
Definition OverriddenPropertySet.cpp:45
@ false
Definition radaudio_common.h:23
U16 Index
Definition radfft.cpp:71