UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
IslandManager.cpp File Reference

Namespaces

namespace  Chaos
 
namespace  Chaos::CVars
 
namespace  Chaos::Private
 

Macros

#define CHAOS_CONSTRAINTGRAPH_CHECK_ENABLED   (UE_BUILD_DEBUG)
 
#define CHAOS_CONSTRAINTGRAPH_CHECK(X)
 
#define CHAOS_CONSTRAINTGRAPH_VALIDATE_TEST(X)
 

Functions

 DECLARE_CYCLE_STAT (TEXT("IslandManager::UpdateParticles"), STAT_IslandManager_UpdateParticles, STATGROUP_ChaosIslands)
 
 DECLARE_CYCLE_STAT (TEXT("IslandManager::Merge"), STAT_IslandManager_MergeIslands, STATGROUP_ChaosIslands)
 
 DECLARE_CYCLE_STAT (TEXT("IslandManager::Split"), STAT_IslandManager_SplitIslands, STATGROUP_ChaosIslands)
 
 DECLARE_CYCLE_STAT (TEXT("IslandManager::Levels"), STAT_IslandManager_AssignLevels, STATGROUP_ChaosIslands)
 
 DECLARE_CYCLE_STAT (TEXT("IslandManager::Finalize"), STAT_IslandManager_Finalize, STATGROUP_ChaosIslands)
 
 DECLARE_CYCLE_STAT (TEXT("IslandManager::ComputeIterationSettings"), STAT_IslandManager_ComputeIterationSettings, STATGROUP_ChaosIslands)
 
 DECLARE_CYCLE_STAT (TEXT("IslandManager::Validate"), STAT_IslandManager_Validate, STATGROUP_ChaosIslands)
 
bool Chaos::Private::IsParticleDynamic (const FGeometryParticleHandle *Particle)
 
bool Chaos::Private::IsParticleSleeping (const FGeometryParticleHandle *Particle)
 
bool Chaos::Private::WasParticleAsleep (const FGeometryParticleHandle *Particle)
 
bool Chaos::Private::IsParticleMoving (const FGeometryParticleHandle *Particle)
 
bool Chaos::Private::ParticlesIslandNeedsResim (const FGeometryParticleHandle *Particle)
 
bool Chaos::Private::GetIslandParticleSleepThresholds (const FGeometryParticleHandle *Particle, const TArrayCollectionArray< TSerializablePtr< FChaosPhysicsMaterial > > *PhysicsMaterials, const TArrayCollectionArray< TUniquePtr< FChaosPhysicsMaterial > > *PerParticlePhysicsMaterials, const THandleArray< FChaosPhysicsMaterial > *SimMaterials, FRealSingle &OutSleepLinearThreshold, FRealSingle &OutSleepAngularThreshold, int &OutSleepCounterThreshold, FRealSingle &OutWakeLinearThreshold, FRealSingle &OutWakeAngularThreshold)
 
bool Chaos::Private::GetIsolatedParticleSleepThresholds (const FGeometryParticleHandle *Particle, const TArrayCollectionArray< TSerializablePtr< FChaosPhysicsMaterial > > *PhysicsMaterials, const TArrayCollectionArray< TUniquePtr< FChaosPhysicsMaterial > > *PerParticlePhysicsMaterials, const THandleArray< FChaosPhysicsMaterial > *SimMaterials, FRealSingle &OutSleepLinearThreshold, FRealSingle &OutSleepAngularThreshold, int &OutSleepCounterThreshold)
 
bool Chaos::Private::GetParticleDisableThresholds (const FGeometryParticleHandle *Particle, const TArrayCollectionArray< TSerializablePtr< FChaosPhysicsMaterial > > *PhysicsMaterials, const TArrayCollectionArray< TUniquePtr< FChaosPhysicsMaterial > > *PerParticlePhysicsMaterials, const THandleArray< FChaosPhysicsMaterial > *SimMaterials, FRealSingle &OutDisableLinearThreshold, FRealSingle &OutDisableAngularThreshold)
 
template<typename TRigidParticleHandle >
void Chaos::Private::InitParticleSleepMetrics (TRigidParticleHandle &Rigid, FReal Dt)
 
template<typename TRigidParticleHandle >
void Chaos::Private::UpdateParticleSleepMetrics (TRigidParticleHandle &Rigid, FReal Dt)
 
void Chaos::Private::ValidateWakeQueues (TArray< FPBDIslandParticle * > &NodeQueue, TArray< FPBDParticleMomentumSq > &MomentumQueue)
 

Variables

int32 Chaos::CVars::ChaosSolverCollisionPositionShockPropagationIterations = -1
 
int32 Chaos::CVars::ChaosSolverCollisionVelocityShockPropagationIterations = -1
 
bool Chaos::CVars::bChaosSolverPersistentGraph = true
 
FRealSingle Chaos::CVars::SmoothedPositionLerpRate = 0.3f
 
bool Chaos::CVars::bChaosConstraintGraphValidate = (CHAOS_CONSTRAINTGRAPH_CHECK_ENABLED != 0)
 
FAutoConsoleVariableRef Chaos::CVars::CVarChaosConstraintGraphValidate (TEXT("p.Chaos.ConstraintGraph.Validate"), bChaosConstraintGraphValidate, TEXT("Enable per-tick ConstraintGraph validation checks/assertions"))
 
bool Chaos::CVars::bChaosSolverSleepEnabled = true
 
FAutoConsoleVariableRef Chaos::CVars::CVarChaosSolverSleepEnabled (TEXT("p.Chaos.Solver.Sleep.Enabled"), bChaosSolverSleepEnabled, TEXT("Islands of non - moving particles will be deactivated."))
 
bool Chaos::CVars::bChaosSolverPartialIslandSleep = false
 
FAutoConsoleVariableRef Chaos::CVars::CVarChaosSolverPartialIslandSleep (TEXT("p.Chaos.Solver.Sleep.PartialIslandSleep"), bChaosSolverPartialIslandSleep, TEXT("[EXPERIMENTAL] Single non-moving particles in islands will be deactivated even if they are connected to moving particles."))
 
bool Chaos::CVars::bChaosSolverPartialIslandWake = true
 
FAutoConsoleVariableRef Chaos::CVars::CVarChaosSolverPartialIslandWake (TEXT("p.Chaos.Solver.Sleep.PartialIslandSleep.PartialIslandWake"), bChaosSolverPartialIslandWake, TEXT("[EXPERIMENTAL] Safeguard only: New constraints and particle state changes will trigger partial wake events instead of waking up the entire island.[def:true]"))
 
bool Chaos::CVars::bChaosSolverForcePartialIslandWake = false
 
FAutoConsoleVariableRef Chaos::CVars::CVarChaosSolverForcePartialIslandWake (TEXT("p.Chaos.Solver.Sleep.PartialIslandSleep.ForcePartialIslandWake"), bChaosSolverForcePartialIslandWake, TEXT("[EXPERIMENTAL] Safeguard only: We force partial wake events even if all particles in the island are already awake to guarantee resetting the particle sleep counter.[def:false]"))
 
bool Chaos::CVars::bChaosSolverWakeOnParticleStateChanged = false
 
FAutoConsoleVariableRef Chaos::CVars::CVarChaosSolverWakeOnParticleStateChanged (TEXT("p.Chaos.Solver.Sleep.PartialIslandSleep.WakeOnParticleStateChanged"), bChaosSolverWakeOnParticleStateChanged, TEXT("[EXPERIMENTAL] Safeguard only: State changes of a particle will trigger the island to wake up entirely.[def:false]"))
 
bool Chaos::CVars::bChaosSolverWakeOnMovingOnly = true
 
FAutoConsoleVariableRef Chaos::CVars::CVarChaosSolverWakeOnMovingOnly (TEXT("p.Chaos.Solver.Sleep.PartialIslandSleep.WakeOnMovingOnly"), bChaosSolverWakeOnMovingOnly, TEXT("[EXPERIMENTAL] Safeguard only: Only newly detected constraints connected to a moving particle will trigger wake-up event.[def:true]"))
 
FRealSingle Chaos::CVars::ChaosSolverPostStepWakeThreshold = 20.0f
 
FAutoConsoleVariableRef Chaos::CVars::CVarChaosSolverPostStepWakeThreshold (TEXT("p.Chaos.Solver.Sleep.PartialIslandSleep.PostStepWakeThreshold"), ChaosSolverPostStepWakeThreshold, TEXT("[EXPERIMENTAL] Post-solver waking of sleeping particles: Minimum squared change of velocity induced by the velocity-based collision solver (VBD, 0 to disable).[def:20]"))
 
FRealSingle Chaos::CVars::ChaosSolverMomentumPropagation = 0.3f
 
FAutoConsoleVariableRef Chaos::CVars::CVarChaosSolverMomentumPropagation (TEXT("p.Chaos.Solver.Sleep.PartialIslandSleep.MomentumPropagation"), ChaosSolverMomentumPropagation, TEXT("[EXPERIMENTAL] Ratio of the impact momentum transferred from one sleeping particle to another through a constraint during partial wake event (0 to disable, 1 to propagate without dissipation).[def:0.3]"))
 
bool Chaos::CVars::bChaosSolverPartialSleepCollisionConstraintsOnly = true
 
FAutoConsoleVariableRef Chaos::CVars::CVarChaosSolverPartialSleepCollisionConstraintsOnly (TEXT("p.Chaos.Solver.Sleep.PartialIslandSleep.CollisionConstraintsOnly"), bChaosSolverPartialSleepCollisionConstraintsOnly, TEXT("[EXPERIMENTAL] Safeguard only: Only collision constraints permit partial sleep, i.e. the sleep state of particles connect by other constraint types must match.[def:true]"))
 
bool Chaos::CVars::bChaosSolverPartialWakePreIntegration = true
 
FAutoConsoleVariableRef Chaos::CVars::CVarChaosSolverPartialWakePreIntegration (TEXT("p.Chaos.Solver.Sleep.PartialIslandSleep.PartialWakePreIntegration"), bChaosSolverPartialWakePreIntegration, TEXT("[EXPERIMENTAL] Safeguard only: Partial wake events also happen pre-integration when the user explicilty sets a particle transform or applies external impulses or forces.[def:true]"))
 
FRealSingle Chaos::CVars::ChaosSolverMinMotionlessRatio = 0.1f
 
FAutoConsoleVariableRef Chaos::CVars::CVarChaosSolverMinMotionlessRatio (TEXT("p.Chaos.Solver.Sleep.PartialIslandSleep.MinimumMotionlessRatio"), ChaosSolverMinMotionlessRatio, TEXT("[EXPERIMENTAL] Ratio of the particles which need to be motionless in an island for partial island sleep to become active (0 to always activate partial island sleep).[def:0.1]"))
 
int32 Chaos::CVars::ChaosSolverSleepModeSwitchThreshold = 10
 
FAutoConsoleVariableRef Chaos::CVars::CVarChaosSolverSleepModeSwitchThreshold (TEXT("p.Chaos.Solver.Sleep.PartialIslandSleep.SleepModeSwitchCounterThreshold"), ChaosSolverSleepModeSwitchThreshold, TEXT("[EXPERIMENTAL] Safeguard only: Number of steps MinimumMotionlessRatio needs to be satisfied before switching the between full and partial island sleep.[def:10]"))
 
FRealSingle Chaos::CVars::LinearPartialWakeThresholdMultiplier = 10.0f
 
FAutoConsoleVariableRef Chaos::CVars::CVarChaosSolverLinearWakeThresholdMultiplier (TEXT("p.Chaos.Solver.Sleep.PartialIslandSleep.LinearWakeThresholdMultiplier"), LinearPartialWakeThresholdMultiplier, TEXT("[EXPERIMENTAL] A multiplier applied to LinearSleepThreshold for particle waking.[def:10]"))
 
FRealSingle Chaos::CVars::AngularPartialWakeThresholdMultiplier = 10.0f
 
FAutoConsoleVariableRef Chaos::CVars::CVarChaosSolverAngularWakeThresholdMultiplier (TEXT("p.Chaos.Solver.Sleep.PartialIslandSleep.AngularWakeThresholdMultiplier"), AngularPartialWakeThresholdMultiplier, TEXT("[EXPERIMENTAL] A multiplier applied to AngularSleepThreshold for particle waking.[def:10]"))
 
bool Chaos::CVars::bChaosSolverValidateConstraintSleepState = false
 
FAutoConsoleVariableRef Chaos::CVars::ChaosSolverValidateConstraintSleepState (TEXT("p.Chaos.Solver.Sleep.PartialIslandSleep.ValidateConstraintSleepState"), bChaosSolverValidateConstraintSleepState, TEXT("[EXPERIMENTAL] Debugging only: Enable constraint sleep state validation checks/assertions at the end of the tick.[def:false]"))
 
int32 Chaos::CVars::ChaosSolverCollisionDefaultSleepCounterThreshold = 20
 
FAutoConsoleVariableRef Chaos::CVars::CVarChaosSolverCollisionDefaultSleepCounterThreshold (TEXT("p.Chaos.Solver.Sleep.Defaults.SleepCounterThreshold"), ChaosSolverCollisionDefaultSleepCounterThreshold, TEXT("Default counter threshold for sleeping.[def:20]"))
 
FRealSingle Chaos::CVars::ChaosSolverCollisionDefaultLinearSleepThreshold = 0.001f
 
FAutoConsoleVariableRef Chaos::CVars::CVarChaosSolverCollisionDefaultLinearSleepThreshold (TEXT("p.Chaos.Solver.Sleep.Defaults.LinearSleepThreshold"), ChaosSolverCollisionDefaultLinearSleepThreshold, TEXT("Default linear threshold for sleeping.[def:0.001]"))
 
FRealSingle Chaos::CVars::ChaosSolverCollisionDefaultAngularSleepThreshold = 0.0087f
 
FAutoConsoleVariableRef Chaos::CVars::CVarChaosSolverCollisionDefaultAngularSleepThreshold (TEXT("p.Chaos.Solver.Sleep.Defaults.AngularSleepThreshold"), ChaosSolverCollisionDefaultAngularSleepThreshold, TEXT("Default angular threshold for sleeping.[def:0.0087]"))
 
FRealSingle Chaos::CVars::ChaosSolverCollisionAngularSleepThresholdSize = 0
 
FAutoConsoleVariableRef Chaos::CVars::CVarChaosSolverCollisionAngularSleepThresholdSize (TEXT("p.Chaos.Solver.Sleep.AngularSleepThresholdSize"), ChaosSolverCollisionAngularSleepThresholdSize, TEXT("Scales the angular threshold based on size (0 to disable size based scaling)"))
 
int32 Chaos::CVars::IsolatedParticleSleepCounterThresholdMultiplier = 1
 
FAutoConsoleVariableRef Chaos::CVars::CVarChaosSolverIsolatedParticleSleepCounterThresholdMultiplier (TEXT("p.Chaos.Solver.Sleep.IsolatedParticle.CounterMultiplier"), IsolatedParticleSleepCounterThresholdMultiplier, TEXT("A multiplier applied to SleepCounterThreshold for floating particles"))
 
FRealSingle Chaos::CVars::IsolatedParticleSleepLinearThresholdMultiplier = 1.0f
 
FAutoConsoleVariableRef Chaos::CVars::CVarChaosSolverIsolatedParticleSleepLinearThresholdMultiplier (TEXT("p.Chaos.Solver.Sleep.IsolatedParticle.LinearMultiplier"), IsolatedParticleSleepLinearThresholdMultiplier, TEXT("A multiplier applied to SleepLinearThreshold for floating particles"))
 
FRealSingle Chaos::CVars::IsolatedParticleSleepAngularThresholdMultiplier = 1.0f
 
FAutoConsoleVariableRef Chaos::CVars::CVarChaosSolverIsolatedParticleSleepAngularThresholdMultiplier (TEXT("p.Chaos.Solver.Sleep.IsolatedParticle.AngularMultiplier"), IsolatedParticleSleepAngularThresholdMultiplier, TEXT("A multiplier applied to SleepAngularThreshold for floating particles"))
 
bool Chaos::CVars::bChaosSolverComputeIterationSettings = true
 
FAutoConsoleVariableRef Chaos::CVars::CVarChaosSolverComputeIterationSettingsEnabled (TEXT("p.Chaos.Solver.ComputeIterationSettings.Enabled"), bChaosSolverComputeIterationSettings, TEXT("Recompute iteration settings every time an island is changed"))
 
bool Chaos::CVars::bChaosRandomizeConstraintOrder = false
 
FAutoConsoleVariableRef Chaos::CVars::CVarChaosRandomizeConstraintOrder (TEXT("p.Chaos.Solver.RandomizeConstraintOrder"), bChaosRandomizeConstraintOrder, TEXT("Randomize constraint order for testing"))
 

Macro Definition Documentation

◆ CHAOS_CONSTRAINTGRAPH_CHECK

#define CHAOS_CONSTRAINTGRAPH_CHECK (   X)

◆ CHAOS_CONSTRAINTGRAPH_CHECK_ENABLED

#define CHAOS_CONSTRAINTGRAPH_CHECK_ENABLED   (UE_BUILD_DEBUG)

◆ CHAOS_CONSTRAINTGRAPH_VALIDATE_TEST

#define CHAOS_CONSTRAINTGRAPH_VALIDATE_TEST (   X)
Value:
bIsValid = bIsValid && ensure(X); \
if (!bIsValid) { return false; }
#define ensure( InExpression)
Definition AssertionMacros.h:464
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define X(Name, Desc)
Definition FormatStringSan.h:47

Function Documentation

◆ DECLARE_CYCLE_STAT() [1/7]

DECLARE_CYCLE_STAT ( TEXT("IslandManager::ComputeIterationSettings")  ,
STAT_IslandManager_ComputeIterationSettings  ,
STATGROUP_ChaosIslands   
)

◆ DECLARE_CYCLE_STAT() [2/7]

DECLARE_CYCLE_STAT ( TEXT("IslandManager::Finalize")  ,
STAT_IslandManager_Finalize  ,
STATGROUP_ChaosIslands   
)

◆ DECLARE_CYCLE_STAT() [3/7]

DECLARE_CYCLE_STAT ( TEXT("IslandManager::Levels")  ,
STAT_IslandManager_AssignLevels  ,
STATGROUP_ChaosIslands   
)

◆ DECLARE_CYCLE_STAT() [4/7]

DECLARE_CYCLE_STAT ( TEXT("IslandManager::Merge")  ,
STAT_IslandManager_MergeIslands  ,
STATGROUP_ChaosIslands   
)

◆ DECLARE_CYCLE_STAT() [5/7]

DECLARE_CYCLE_STAT ( TEXT("IslandManager::Split")  ,
STAT_IslandManager_SplitIslands  ,
STATGROUP_ChaosIslands   
)

◆ DECLARE_CYCLE_STAT() [6/7]

DECLARE_CYCLE_STAT ( TEXT("IslandManager::UpdateParticles")  ,
STAT_IslandManager_UpdateParticles  ,
STATGROUP_ChaosIslands   
)

◆ DECLARE_CYCLE_STAT() [7/7]

DECLARE_CYCLE_STAT ( TEXT("IslandManager::Validate")  ,
STAT_IslandManager_Validate  ,
STATGROUP_ChaosIslands   
)