18 class FPBDCollisionConstraints;
19 class FSpatialAccelerationBroadPhase;
64 const FReal CullDistance,
65 const bool bUseManifold,
73#if CHAOS_COLLISION_OBJECTPOOL_ENABLED
98 NewActiveConstraints.Push(Constraint);
117 if (MidPhase ==
nullptr)
119 MidPhase = CreateMidPhase(Particle0, Particle1,
Context);
142#if CHAOS_COLLISION_OBJECTPOOL_ENABLED
143 ConstraintPool.Reset();
145#if CHAOS_MIDPHASE_OBJECTPOOL_ENABLED
152 check(NewActiveConstraints.IsEmpty());
153 check(NewMidPhases.IsEmpty());
165 return SearchParticle->ParticleCollisions().FindMidPhase(Key.GetKey());
171 const Private::FCollisionParticlePairKey Key = Private::FCollisionParticlePairKey(Particle0, Particle1);
174#if CHAOS_MIDPHASE_OBJECTPOOL_ENABLED
180 NewMidPhases.Add(MidPhase);
182 MidPhase->Init(Particle0, Particle1, Key,
Context);
186 FPBDCollisionConstraints* CollisionContainer;
192#if CHAOS_COLLISION_OBJECTPOOL_ENABLED
195#if CHAOS_MIDPHASE_OBJECTPOOL_ENABLED
239 : CollisionContainer(nullptr)
240 , ContextAllocators()
242 , ParticlePairMidPhases()
243 , ActiveConstraints()
244 , ActiveCCDConstraints()
246 , bIsDeteministic(
false)
247 , bInCollisionDetectionPhase(
false)
282 return ContextAllocators[
Index].Get();
341 ActiveConstraints.Reset();
342 ActiveCCDConstraints.Reset();
343 ParticlePairMidPhases.Reset();
346 ContextAllocators.Reset();
355 ResetActiveConstraints();
357 ActiveConstraints.Reset();
358 ActiveCCDConstraints.Reset();
367 check(!bInCollisionDetectionPhase);
368 bInCollisionDetectionPhase =
true;
383 ResetActiveConstraints();
386 ActiveConstraints.Reset();
387 ActiveCCDConstraints.Reset();
401 PruneExpiredMidPhases();
440 Swap(Particle0, Particle1);
449 if (MidPhase !=
nullptr)
455 ProcessNewConstraints();
463 SortActiveConstraints();
476 template<
typename TLambda>
492 template<
typename TLambda>
508 template<
typename TLambda>
532 void ProcessNewItems();
536 ParticlePairMidPhases.Emplace(
MoveTemp(MidPhase));
546 Particle0->ParticleCollisions().RemoveMidPhase(Particle0, MidPhase);
551 Particle1->ParticleCollisions().RemoveMidPhase(Particle1, MidPhase);
561 CHAOS_API void ProcessNewCcdConstraints();
563 CHAOS_API void AddActiveConstraintImpl(FPBDCollisionConstraint* Constraint);
565 CHAOS_API void RemoveActiveConstraint(FPBDCollisionConstraint& Constraint);
572 FPBDCollisionConstraints* CollisionContainer;
576 int32 NumCollisionsPerBlock;
592 bool bIsDeteministic;
595 bool bInCollisionDetectionPhase;
612 if (Constraint ==
nullptr)
658 template<
typename TLambda>
680 for (
auto&
KVP : This->Constraints)
698 if (Constraint !=
nullptr)
714 template<
typename TLambda>
735 for (
const auto&
KVP : This->Constraints)
753 if (Constraint !=
nullptr)
769 template<
typename TLambda>
782 template<
typename TLambda>
795 template<
typename TLambda>
802 return ECollisionVisitorResult::Stop;
808 template<
typename TLambda>
815 return ECollisionVisitorResult::Stop;
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
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
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