UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
Chaos::FParticlePairMidPhase Class Referenceabstract

Produce collisions for a particle pair A FParticlePairMidPhase object is created for every particle pair whose bounds overlap. It is responsible for building a set of potentially colliding shape pairs and running collision detection on those pairs each tick. More...

#include <ParticlePairMidPhase.h>

+ Inheritance diagram for Chaos::FParticlePairMidPhase:

Classes

union  FFlags
 

Public Member Functions

 UE_NONCOPYABLE (FParticlePairMidPhase)
 
CHAOS_API FParticlePairMidPhase (const EParticlePairMidPhaseType InMidPhaseType)
 
virtual CHAOS_API ~FParticlePairMidPhase ()
 
EParticlePairMidPhaseType GetMidPhaseType () const
 
CHAOS_API void Init (FGeometryParticleHandle *InParticle0, FGeometryParticleHandle *InParticle1, const Private::FCollisionParticlePairKey &InKey, const FCollisionContext &Context)
 Set up the midphase based on the ShapesArrays of the two particles Only intended to be called once right after constructor. We don't do this work in the constructor so that we can reduce the time that the lock is held when allocating new MidPhases.
 
FGeometryParticleHandleGetParticle0 () const
 
FGeometryParticleHandleGetParticle1 () const
 
const Private::FCollisionParticlePairKeyGetKey () const
 
bool IsValid () const
 
void CachePrefetch ()
 
bool IsUsedSince (const int32 Epoch) const
 Have we run collision detection since this Epoch (inclusive)
 
bool IsSleeping () const
 Whether the particle pair is sleeping and therefore contacts should not be culled (they will be reused on wake)
 
CHAOS_API void SetIsSleeping (const bool bInIsSleeping, const int32 CurrentEpoch)
 Update the sleeping state If this switches the state to Awake, it will reactivate any collisions between the particle pair that were active when they went to sleep.
 
CHAOS_API bool IsInConstraintGraph () const
 
CHAOS_API void DetachParticle (FGeometryParticleHandle *Particle)
 Destroy all collisions and prevent this midphasae from being used any more. Called when one of its particles is destoyed. It will be culled at the next Prune in the CollisionConstraintAllocator. We don't delete it immediately so that we don't have to remove it from either Particle's ParticleCollisions array (which is O(N) and unnecessary when the particles are being destroyed)
 
CHAOS_API void Reset ()
 Delete all cached data and collisions. Should be called when a particle changes its shapes.
 
CHAOS_API void ResetModifications ()
 
CHAOS_API void GenerateCollisions (const FReal CullDistance, const FReal Dt, const FCollisionContext &Context)
 Create collision constraints for all colliding shape pairs.
 
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. If there is already a matching constraint it will be overwritten, otherwise a new constraint will be added.
 
template<typename TLambda >
ECollisionVisitorResult VisitCollisions (const TLambda &Visitor, const ECollisionVisitorFlags VisitFlags=ECollisionVisitorFlags::VisitDefault)
 Call a lambda on each active collision constraint This includes sleeping constraints, but skips constraints that are were not used on the last awake tick but are still kept around as an optimization.
 
template<typename TLambda >
ECollisionVisitorResult VisitConstCollisions (const TLambda &Visitor, const ECollisionVisitorFlags VisitFlags=ECollisionVisitorFlags::VisitDefault) const
 Call a lambda on each active collision constraint.
 
int32 GetParticleCollisionsIndex (FGeometryParticleHandle *InParticle) const
 Cookie for use by FParticleCollisions.
 
void SetParticleCollisionsIndex (FGeometryParticleHandle *InParticle, const int32 InIndex)
 Cookie for use by FParticleCollisions.
 
void SetIsActive (bool bIsActive)
 By default midphases are active. If IsActive is set to false, this midphase will not generate a narrow phase.
 
void SetCCDIsActive (bool bCCDIsActive)
 Override the CCD condition for this mid-phase. Used by the MidPhase modifier and gets reset every frame.
 
void SetConvexOptimizationIsActive (bool bSetConvexOptimizationIsActive)
 
virtual void SetConvexOptimizationIsActive (bool bSetConvexOptimizationIsActive, TFunctionRef< void(FPBDCollisionConstraint *)> OnDestroyingCollision)
 Override whether convex optimization if used this mid-phase. Used by the MidPhase modifier and gets reset every frame. NOTE: when this setting is changed, collisions will be destroyed so any external systems referencing them will need to drop their references.
 
bool IsCCD () const
 
bool IsCCDActive () const
 

Static Public Member Functions

static CHAOS_API EParticlePairMidPhaseType CalculateMidPhaseType (FGeometryParticleHandle *InParticle0, FGeometryParticleHandle *InParticle1)
 
static CHAOS_API FParticlePairMidPhaseMake (FGeometryParticleHandle *InParticle0, FGeometryParticleHandle *InParticle1)
 

Protected Member Functions

virtual void ResetImpl ()=0
 
virtual void BuildDetectorsImpl ()=0
 Build the list of potentially colliding shape pairs. This is all the shape pairs in the partilces' shapes arrays that pass the collision filter.
 
virtual int32 GenerateCollisionsImpl (const FRealSingle Dt, const FRealSingle CullDistance, const FVec3f &RelativeMovement, const FCollisionContext &Context)=0
 
virtual void WakeCollisionsImpl (const int32 CurrentEpoch)=0
 
virtual void InjectCollisionImpl (const FPBDCollisionConstraint &Constraint, const FCollisionContext &Context)=0
 
CHAOS_API bool ShouldEnableCCDSweep (const FReal Dt)
 Decide whether we should have CCD enabled on this constraint.
 
CHAOS_API void InitThresholds ()
 

Protected Attributes

EParticlePairMidPhaseType MidPhaseType
 
FFlags Flags
 
FGeometryParticleHandleParticle0
 
FGeometryParticleHandleParticle1
 
FRealSingle CullDistanceScale
 
Private::FCollisionParticlePairKey ParticlePairKey
 
int32 LastUsedEpoch
 
int32 NumActiveConstraints
 
int32 ParticleCollisionsIndex0
 
int32 ParticleCollisionsIndex1
 

Detailed Description

Produce collisions for a particle pair A FParticlePairMidPhase object is created for every particle pair whose bounds overlap. It is responsible for building a set of potentially colliding shape pairs and running collision detection on those pairs each tick.

Note
The lifetime of midphase objects is handled entirely by the CollisionConstraintAllocator. Nothing outside of the CollisionConstraintAllocator should hold a pointer to the detector or any constraints it creates for more than the duration of the tick.
See also
FShapePairParticlePairMidPhase, FGenericParticlePairMidPhase

Constructor & Destructor Documentation

◆ FParticlePairMidPhase()

Chaos::FParticlePairMidPhase::FParticlePairMidPhase ( const EParticlePairMidPhaseType  InMidPhaseType)

◆ ~FParticlePairMidPhase()

Chaos::FParticlePairMidPhase::~FParticlePairMidPhase ( )
virtual

Member Function Documentation

◆ BuildDetectorsImpl()

virtual void Chaos::FParticlePairMidPhase::BuildDetectorsImpl ( )
protectedpure virtual

Build the list of potentially colliding shape pairs. This is all the shape pairs in the partilces' shapes arrays that pass the collision filter.

Implemented in Chaos::FShapePairParticlePairMidPhase, Chaos::FGenericParticlePairMidPhase, and Chaos::FSphereApproximationParticlePairMidPhase.

◆ CachePrefetch()

void Chaos::FParticlePairMidPhase::CachePrefetch ( )
inline

◆ CalculateMidPhaseType()

EParticlePairMidPhaseType Chaos::FParticlePairMidPhase::CalculateMidPhaseType ( FGeometryParticleHandle InParticle0,
FGeometryParticleHandle InParticle1 
)
static

◆ DetachParticle()

void Chaos::FParticlePairMidPhase::DetachParticle ( FGeometryParticleHandle Particle)

Destroy all collisions and prevent this midphasae from being used any more. Called when one of its particles is destoyed. It will be culled at the next Prune in the CollisionConstraintAllocator. We don't delete it immediately so that we don't have to remove it from either Particle's ParticleCollisions array (which is O(N) and unnecessary when the particles are being destroyed)

◆ GenerateCollisions()

void Chaos::FParticlePairMidPhase::GenerateCollisions ( const FReal  CullDistance,
const FReal  Dt,
const FCollisionContext Context 
)

Create collision constraints for all colliding shape pairs.

◆ GenerateCollisionsImpl()

virtual int32 Chaos::FParticlePairMidPhase::GenerateCollisionsImpl ( const FRealSingle  Dt,
const FRealSingle  CullDistance,
const FVec3f RelativeMovement,
const FCollisionContext Context 
)
protectedpure virtual

◆ GetKey()

const Private::FCollisionParticlePairKey & Chaos::FParticlePairMidPhase::GetKey ( ) const
inline

◆ GetMidPhaseType()

EParticlePairMidPhaseType Chaos::FParticlePairMidPhase::GetMidPhaseType ( ) const
inline

◆ GetParticle0()

FGeometryParticleHandle * Chaos::FParticlePairMidPhase::GetParticle0 ( ) const
inline

◆ GetParticle1()

FGeometryParticleHandle * Chaos::FParticlePairMidPhase::GetParticle1 ( ) const
inline

◆ GetParticleCollisionsIndex()

int32 Chaos::FParticlePairMidPhase::GetParticleCollisionsIndex ( FGeometryParticleHandle InParticle) const
inline

Cookie for use by FParticleCollisions.

◆ Init()

void Chaos::FParticlePairMidPhase::Init ( FGeometryParticleHandle InParticle0,
FGeometryParticleHandle InParticle1,
const Private::FCollisionParticlePairKey InKey,
const FCollisionContext Context 
)

Set up the midphase based on the ShapesArrays of the two particles Only intended to be called once right after constructor. We don't do this work in the constructor so that we can reduce the time that the lock is held when allocating new MidPhases.

◆ InitThresholds()

void Chaos::FParticlePairMidPhase::InitThresholds ( )
protected

◆ InjectCollision()

void Chaos::FParticlePairMidPhase::InjectCollision ( const FPBDCollisionConstraint Constraint,
const FCollisionContext Context 
)

Copy a collision and activate it This is used by the Resim system to restore saved colisions. If there is already a matching constraint it will be overwritten, otherwise a new constraint will be added.

◆ InjectCollisionImpl()

virtual void Chaos::FParticlePairMidPhase::InjectCollisionImpl ( const FPBDCollisionConstraint Constraint,
const FCollisionContext Context 
)
protectedpure virtual

◆ IsCCD()

bool Chaos::FParticlePairMidPhase::IsCCD ( ) const
inline

◆ IsCCDActive()

bool Chaos::FParticlePairMidPhase::IsCCDActive ( ) const
inline

◆ IsInConstraintGraph()

bool Chaos::FParticlePairMidPhase::IsInConstraintGraph ( ) const

◆ IsSleeping()

bool Chaos::FParticlePairMidPhase::IsSleeping ( ) const
inline

Whether the particle pair is sleeping and therefore contacts should not be culled (they will be reused on wake)

◆ IsUsedSince()

bool Chaos::FParticlePairMidPhase::IsUsedSince ( const int32  Epoch) const
inline

Have we run collision detection since this Epoch (inclusive)

◆ IsValid()

bool Chaos::FParticlePairMidPhase::IsValid ( ) const
inline

◆ Make()

FParticlePairMidPhase * Chaos::FParticlePairMidPhase::Make ( FGeometryParticleHandle InParticle0,
FGeometryParticleHandle InParticle1 
)
static

◆ Reset()

void Chaos::FParticlePairMidPhase::Reset ( )

Delete all cached data and collisions. Should be called when a particle changes its shapes.

◆ ResetImpl()

virtual void Chaos::FParticlePairMidPhase::ResetImpl ( )
protectedpure virtual

◆ ResetModifications()

void Chaos::FParticlePairMidPhase::ResetModifications ( )

◆ SetCCDIsActive()

void Chaos::FParticlePairMidPhase::SetCCDIsActive ( bool  bCCDIsActive)
inline

Override the CCD condition for this mid-phase. Used by the MidPhase modifier and gets reset every frame.

◆ SetConvexOptimizationIsActive() [1/2]

void Chaos::FParticlePairMidPhase::SetConvexOptimizationIsActive ( bool  bSetConvexOptimizationIsActive)
inline

◆ SetConvexOptimizationIsActive() [2/2]

virtual void Chaos::FParticlePairMidPhase::SetConvexOptimizationIsActive ( bool  bSetConvexOptimizationIsActive,
TFunctionRef< void(FPBDCollisionConstraint *)>  OnDestroyingCollision 
)
inlinevirtual

Override whether convex optimization if used this mid-phase. Used by the MidPhase modifier and gets reset every frame. NOTE: when this setting is changed, collisions will be destroyed so any external systems referencing them will need to drop their references.

◆ SetIsActive()

void Chaos::FParticlePairMidPhase::SetIsActive ( bool  bIsActive)
inline

By default midphases are active. If IsActive is set to false, this midphase will not generate a narrow phase.

◆ SetIsSleeping()

void Chaos::FParticlePairMidPhase::SetIsSleeping ( const bool  bInIsSleeping,
const int32  CurrentEpoch 
)

Update the sleeping state If this switches the state to Awake, it will reactivate any collisions between the particle pair that were active when they went to sleep.

◆ SetParticleCollisionsIndex()

void Chaos::FParticlePairMidPhase::SetParticleCollisionsIndex ( FGeometryParticleHandle InParticle,
const int32  InIndex 
)
inline

Cookie for use by FParticleCollisions.

◆ ShouldEnableCCDSweep()

bool Chaos::FParticlePairMidPhase::ShouldEnableCCDSweep ( const FReal  Dt)
protected

Decide whether we should have CCD enabled on this constraint.

Returns
true if CCD is enabled this tick, false otherwise This may return false, even for collisions on CCD-enabled bodies when the bodies are moving slowly

◆ UE_NONCOPYABLE()

Chaos::FParticlePairMidPhase::UE_NONCOPYABLE ( FParticlePairMidPhase  )

◆ VisitCollisions()

template<typename TLambda >
ECollisionVisitorResult Chaos::FParticlePairMidPhase::VisitCollisions ( const TLambda Visitor,
const ECollisionVisitorFlags  VisitFlags = ECollisionVisitorFlags::VisitDefault 
)
inline

Call a lambda on each active collision constraint This includes sleeping constraints, but skips constraints that are were not used on the last awake tick but are still kept around as an optimization.

Parameters
Visitorfunctor with signature ECollisionVisitorResult(FPBDCollisionConstraint& Constraint)

◆ VisitConstCollisions()

template<typename TLambda >
ECollisionVisitorResult Chaos::FParticlePairMidPhase::VisitConstCollisions ( const TLambda Visitor,
const ECollisionVisitorFlags  VisitFlags = ECollisionVisitorFlags::VisitDefault 
) const
inline

Call a lambda on each active collision constraint.

Parameters
Visitorfunctor with signature ECollisionVisitorResult(const FPBDCollisionConstraint& Constraint)

◆ WakeCollisionsImpl()

virtual void Chaos::FParticlePairMidPhase::WakeCollisionsImpl ( const int32  CurrentEpoch)
protectedpure virtual

Member Data Documentation

◆ CullDistanceScale

FRealSingle Chaos::FParticlePairMidPhase::CullDistanceScale
protected

◆ Flags

FFlags Chaos::FParticlePairMidPhase::Flags
protected

◆ LastUsedEpoch

int32 Chaos::FParticlePairMidPhase::LastUsedEpoch
protected

◆ MidPhaseType

EParticlePairMidPhaseType Chaos::FParticlePairMidPhase::MidPhaseType
protected

◆ NumActiveConstraints

int32 Chaos::FParticlePairMidPhase::NumActiveConstraints
protected

◆ Particle0

FGeometryParticleHandle* Chaos::FParticlePairMidPhase::Particle0
protected

◆ Particle1

FGeometryParticleHandle* Chaos::FParticlePairMidPhase::Particle1
protected

◆ ParticleCollisionsIndex0

int32 Chaos::FParticlePairMidPhase::ParticleCollisionsIndex0
protected

◆ ParticleCollisionsIndex1

int32 Chaos::FParticlePairMidPhase::ParticleCollisionsIndex1
protected

◆ ParticlePairKey

Private::FCollisionParticlePairKey Chaos::FParticlePairMidPhase::ParticlePairKey
protected

The documentation for this class was generated from the following files: