p.Chaos.ImmPhys.Collision.UseManifolds

p.Chaos.ImmPhys.Collision.UseManifolds

#Overview

name: p.Chaos.ImmPhys.Collision.UseManifolds

This variable is created as a Console Variable (cvar).

It is referenced in 4 C++ source files.

#Summary

#Usage in the C++ source code

The purpose of p.Chaos.ImmPhys.Collision.UseManifolds is to enable or disable the use of manifolds in collision detection for the Chaos physics engine’s immediate physics simulation system in Unreal Engine 5.

This setting variable is primarily used in the Chaos physics engine, specifically in the immediate physics simulation module. It is part of the collision detection system within the physics engine.

The value of this variable is set through a console variable (CVar) system, which allows developers to change it at runtime. It is initialized to 0 (disabled) by default.

This variable interacts closely with other collision-related variables, such as ChaosImmediate_Collision_DeferNarrowPhase, which determines whether to defer the narrow phase of collision detection.

Developers must be aware that this variable is specifically marked for use with the “Legacy Solver” in the comments. This suggests that it might not be applicable or may behave differently in newer solver implementations.

Best practices when using this variable include:

  1. Only enable it if you’re using the legacy solver and understand the implications of using manifolds in collision detection.
  2. Test thoroughly when changing this setting, as it can significantly affect collision behavior and performance.
  3. Consider the interaction with other collision-related settings, especially ChaosImmediate_Collision_DeferNarrowPhase.

Regarding the associated variable ChaosImmediate_Collision_UseManifolds:

This is the actual boolean variable that stores the state of whether manifolds should be used in collision detection. It is directly controlled by the p.Chaos.ImmPhys.Collision.UseManifolds console variable.

The purpose of ChaosImmediate_Collision_UseManifolds is to provide a runtime-accessible flag for the physics simulation to determine whether to use manifolds in collision detection.

This variable is used in the ImmediatePhysics_Chaos namespace, specifically in the FSimulation class constructor and Simulate function. It directly affects the DetectorSettings of the collision system.

The value of this variable is set by the console variable system and is typically accessed in the physics simulation code to configure the collision detector.

Developers should be aware that this variable is used to configure the collision detector at runtime, and changes to it will immediately affect the physics simulation behavior.

Best practices for using this variable include:

  1. Avoid directly modifying this variable in code; instead, use the console variable to change its value.
  2. Monitor performance and simulation accuracy when enabling or disabling this feature, as it can have significant effects on both.
  3. Consider this setting in conjunction with other collision detection settings for optimal performance and accuracy in your specific use case.

#References in C++ code

#Callsites

This variable is referenced in the following C++ source code:

#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/PhysicsEngine/ImmediatePhysics/ImmediatePhysicsChaos/ImmediatePhysicsSimulation_Chaos.cpp:86

Scope: file

Source code excerpt:

FAutoConsoleVariableRef CVarChaosImmPhysCollisionRestitutionEnabled(TEXT("p.Chaos.ImmPhys.Collision.RestitutionEnabled"), ChaosImmediate_Collision_RestitutionEnabled, TEXT("Collision Restitution Enable/Disable"));
FAutoConsoleVariableRef CVarChaosImmPhysCollisionDeferNarrowPhase(TEXT("p.Chaos.ImmPhys.Collision.DeferNarrowPhase"), ChaosImmediate_Collision_DeferNarrowPhase, TEXT("[Legacy Solver] Create contacts for all broadphase pairs, perform NarrowPhase later."));
FAutoConsoleVariableRef CVarChaosImmPhysCollisionUseManifolds(TEXT("p.Chaos.ImmPhys.Collision.UseManifolds"), ChaosImmediate_Collision_UseManifolds, TEXT("[Legacy Solver] Enable/Disable use of manifoldes in collision."));

Chaos::FRealSingle ChaosImmediate_Joint_SwingTwistAngleTolerance = 1.0e-6f;
Chaos::FRealSingle ChaosImmediate_Joint_PositionTolerance = 0.025f;
Chaos::FRealSingle ChaosImmediate_Joint_AngleTolerance = 0.001f;
int32 ChaosImmediate_Joint_NumShockPropagationIterations = -1;
int32 ChaosImmediate_Joint_SolvePositionLast = 1;

#Associated Variable and Callsites

This variable is associated with another variable named ChaosImmediate_Collision_UseManifolds. They share the same value. See the following C++ source code.

#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/PhysicsEngine/ImmediatePhysics/ImmediatePhysicsChaos/ImmediatePhysicsSimulation_Chaos.cpp:78

Scope: file

Source code excerpt:

int32 ChaosImmediate_Collision_RestitutionEnabled = true;
int32 ChaosImmediate_Collision_DeferNarrowPhase = 1;
int32 ChaosImmediate_Collision_UseManifolds = 0;
FAutoConsoleVariableRef CVarChaosImmPhysCollisionDisable(TEXT("p.Chaos.ImmPhys.Collision.Enabled"), ChaosImmediate_Collision_Enabled, TEXT("Enable/Disable collisions in Immediate Physics."));
FAutoConsoleVariableRef CVarChaosImmPhysCollisionPriority(TEXT("p.Chaos.ImmPhys.Collision.Priority"), ChaosImmediate_Collision_Priority, TEXT("Set the Collision constraint sort order (Joints have priority 0)"));
FAutoConsoleVariableRef CVarChaosImmPhysCollisionCullDistance(TEXT("p.Chaos.ImmPhys.Collision.CullDistance"), ChaosImmediate_Collision_CullDistance, TEXT("Set the collision CullDistance (if >= 0)"));
FAutoConsoleVariableRef CVarChaosImmPhysCollisionMaxDepenetrationVelocity(TEXT("p.Chaos.ImmPhys.Collision.MaxDepenetrationVelocity"), ChaosImmediate_Collision_MaxDepenetrationVelocity, TEXT("Set the collision Max Depenetration Velocity (if >= 0)"));
FAutoConsoleVariableRef CVarChaosImmPhysCollisionRestitutionThresholdMultiplier(TEXT("p.Chaos.ImmPhys.Collision.RestitutionThresholdMultiplier"), ChaosImmediate_Collision_RestitutionThresholdMultiplier, TEXT("Collision Restitution Threshold (Acceleration) = Multiplier * Gravity"));
FAutoConsoleVariableRef CVarChaosImmPhysCollisionRestitutionEnabled(TEXT("p.Chaos.ImmPhys.Collision.RestitutionEnabled"), ChaosImmediate_Collision_RestitutionEnabled, TEXT("Collision Restitution Enable/Disable"));
FAutoConsoleVariableRef CVarChaosImmPhysCollisionDeferNarrowPhase(TEXT("p.Chaos.ImmPhys.Collision.DeferNarrowPhase"), ChaosImmediate_Collision_DeferNarrowPhase, TEXT("[Legacy Solver] Create contacts for all broadphase pairs, perform NarrowPhase later."));
FAutoConsoleVariableRef CVarChaosImmPhysCollisionUseManifolds(TEXT("p.Chaos.ImmPhys.Collision.UseManifolds"), ChaosImmediate_Collision_UseManifolds, TEXT("[Legacy Solver] Enable/Disable use of manifoldes in collision."));

Chaos::FRealSingle ChaosImmediate_Joint_SwingTwistAngleTolerance = 1.0e-6f;
Chaos::FRealSingle ChaosImmediate_Joint_PositionTolerance = 0.025f;
Chaos::FRealSingle ChaosImmediate_Joint_AngleTolerance = 0.001f;
int32 ChaosImmediate_Joint_NumShockPropagationIterations = -1;
int32 ChaosImmediate_Joint_SolvePositionLast = 1;

#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/PhysicsEngine/ImmediatePhysics/ImmediatePhysicsChaos/ImmediatePhysicsSimulation_Chaos.cpp:367

Scope (from outer to inner):

file
namespace    ImmediatePhysics_Chaos
function     FSimulation::FSimulation

Source code excerpt:

		DetectorSettings.bAllowManifoldReuse = false;
		DetectorSettings.bDeferNarrowPhase = (ChaosImmediate_Collision_DeferNarrowPhase != 0);
		DetectorSettings.bAllowManifolds = (ChaosImmediate_Collision_UseManifolds != 0);
		DetectorSettings.bAllowCCD = false;
		DetectorSettings.bAllowMACD = false;
		Implementation->Collisions.SetDetectorSettings(DetectorSettings);
	}

	FSimulation::~FSimulation()

#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/PhysicsEngine/ImmediatePhysics/ImmediatePhysicsChaos/ImmediatePhysicsSimulation_Chaos.cpp:913

Scope (from outer to inner):

file
namespace    ImmediatePhysics_Chaos
function     void FSimulation::Simulate

Source code excerpt:

			DetectorSettings.bAllowManifoldReuse = false;
			DetectorSettings.bDeferNarrowPhase = (ChaosImmediate_Collision_DeferNarrowPhase != 0);;
			DetectorSettings.bAllowManifolds = (ChaosImmediate_Collision_UseManifolds != 0);;
			Implementation->Collisions.SetDetectorSettings(DetectorSettings);

			if (ChaosImmediate_Evolution_StepTime > 0)
			{
				StepTime = ChaosImmediate_Evolution_StepTime;
			}