148 void OptimizeBroadPhase();
176#ifdef JPH_DEBUG_RENDERER
254#ifdef JPH_TRACK_BROADPHASE_STATS
256 void ReportBroadphaseStats() { mBroadPhase->ReportStats(); }
259#if defined(JPH_TRACK_SIMULATION_STATS) && defined(JPH_PROFILE_ENABLED)
261 void ReportSimulationStats() { mBodyManager.ReportSimulationStats(); }
265 using CCDBody = PhysicsUpdateContext::Step::CCDBody;
268 void JobStepListeners(PhysicsUpdateContext::Step *ioStep);
269 void JobDetermineActiveConstraints(PhysicsUpdateContext::Step *ioStep)
const;
270 void JobApplyGravity(
const PhysicsUpdateContext *ioContext, PhysicsUpdateContext::Step *ioStep);
271 void JobSetupVelocityConstraints(
float inDeltaTime, PhysicsUpdateContext::Step *ioStep)
const;
272 void JobBuildIslandsFromConstraints(PhysicsUpdateContext *ioContext, PhysicsUpdateContext::Step *ioStep);
273 void JobFindCollisions(PhysicsUpdateContext::Step *ioStep,
int inJobIndex);
274 void JobFinalizeIslands(PhysicsUpdateContext *ioContext);
275 void JobBodySetIslandIndex();
276 void JobSolveVelocityConstraints(PhysicsUpdateContext *ioContext, PhysicsUpdateContext::Step *ioStep);
277 void JobPreIntegrateVelocity(PhysicsUpdateContext *ioContext, PhysicsUpdateContext::Step *ioStep);
278 void JobIntegrateVelocity(
const PhysicsUpdateContext *ioContext, PhysicsUpdateContext::Step *ioStep);
279 void JobPostIntegrateVelocity(PhysicsUpdateContext *ioContext, PhysicsUpdateContext::Step *ioStep)
const;
280 void JobFindCCDContacts(
const PhysicsUpdateContext *ioContext, PhysicsUpdateContext::Step *ioStep);
281 void JobResolveCCDContacts(PhysicsUpdateContext *ioContext, PhysicsUpdateContext::Step *ioStep);
282 void JobContactRemovedCallbacks(
const PhysicsUpdateContext::Step *ioStep);
283 void JobSolvePositionConstraints(PhysicsUpdateContext *ioContext, PhysicsUpdateContext::Step *ioStep);
284 void JobSoftBodyPrepare(PhysicsUpdateContext *ioContext, PhysicsUpdateContext::Step *ioStep);
285 void JobSoftBodyCollide(PhysicsUpdateContext *ioContext)
const;
286 void JobSoftBodySimulate(PhysicsUpdateContext *ioContext,
uint inThreadIndex)
const;
287 void JobSoftBodyFinalize(PhysicsUpdateContext *ioContext);
290 void TrySpawnJobFindCollisions(PhysicsUpdateContext::Step *ioStep)
const;
292#ifdef JPH_TRACK_SIMULATION_STATS
294 void GatherIslandStats();
297 using ContactAllocator = ContactConstraintManager::ContactAllocator;
300 void ProcessBodyPair(ContactAllocator &ioContactAllocator,
const BodyPair &inBodyPair);
306 void CheckSleepAndUpdateBounds(
uint32 inIslandIndex,
const PhysicsUpdateContext *ioContext,
const PhysicsUpdateContext::Step *ioStep, BodiesToSleep &ioBodiesToSleep);
309 static constexpr int cDetermineActiveConstraintsBatchSize = 64;
312 static constexpr int cSetupVelocityConstraintsBatchSize = 256;
315 static constexpr int cApplyGravityBatchSize = 64;
318 static constexpr int cActiveBodiesBatchSize = 16;
321 static constexpr int cIntegrateVelocityBatchSize = 64;
324 static constexpr int cNarrowPhaseBatchSize = 16;
327 static constexpr int cNumCCDBodiesPerJob = 4;
330 const ObjectVsBroadPhaseLayerFilter *mObjectVsBroadPhaseLayerFilter =
nullptr;
333 const ObjectLayerPairFilter *mObjectLayerPairFilter =
nullptr;
336 BodyManager mBodyManager;
339 BodyLockInterfaceNoLock mBodyLockInterfaceNoLock { mBodyManager };
340 BodyLockInterfaceLocking mBodyLockInterfaceLocking { mBodyManager };
343 BodyInterface mBodyInterfaceNoLock;
344 BodyInterface mBodyInterfaceLocking;
347 NarrowPhaseQuery mNarrowPhaseQueryNoLock;
348 NarrowPhaseQuery mNarrowPhaseQueryLocking;
351 BroadPhase * mBroadPhase =
nullptr;
354 SoftBodyContactListener * mSoftBodyContactListener =
nullptr;
357 const SimShapeFilter * mSimShapeFilter =
nullptr;
360 SimCollideBodyVsBody mSimCollideBodyVsBody = &sDefaultSimCollideBodyVsBody;
363 PhysicsSettings mPhysicsSettings;
366 ContactConstraintManager mContactManager;
369 ConstraintManager mConstraintManager;
372 IslandBuilder mIslandBuilder;
375 LargeIslandSplitter mLargeIslandSplitter;
378 Mutex mStepListenersMutex;
381 using StepListeners = Array<PhysicsStepListener *>;
382 StepListeners mStepListeners;
385 Vec3 mGravity = Vec3(0, -9.81f, 0);
388 float mPreviousStepDeltaTime = 0.0f;
Array< BodyID > BodyIDVector
Array of body ID's.
Definition BodyManager.h:40
EBodyType
Type of body.
Definition BodyType.h:11
Array< Ref< Constraint > > Constraints
A list of constraints.
Definition ConstraintManager.h:21
#define JPH_EXPORT
Definition Core.h:275
unsigned int uint
Definition Core.h:500
#define JPH_NAMESPACE_END
Definition Core.h:425
std::uint32_t uint32
Definition Core.h:503
#define JPH_NAMESPACE_BEGIN
Definition Core.h:419
EPhysicsUpdateError
Enum used by PhysicsSystem to report error conditions during the PhysicsSystem::Update call....
Definition EPhysicsUpdateError.h:11
#define JPH_IF_ENABLE_ASSERTS(...)
Definition IssueReporting.h:35
const Vec3 Vec3Arg
Definition MathTypes.h:19
const Mat44 & Mat44Arg
Definition MathTypes.h:29
#define JPH_OVERRIDE_NEW_DELETE
Macro to override the new and delete functions.
Definition Memory.h:50
uint16 ObjectLayer
Definition ObjectLayer.h:16
CollisionCollector< CollideShapeResult, CollisionCollectorTraitsCollideShape > CollideShapeCollector
Definition Shape.h:47
EStateRecorderState
A bit field that determines which aspects of the simulation to save.
Definition StateRecorder.h:21
@ All
Save all state.
Definition StateRecorder.h:27
Axis aligned box.
Definition AABox.h:16
Definition BodyActivationListener.h:14
Class function to filter out bodies for debug rendering, returns true if body should be rendered.
Definition BodyFilter.h:117
ID of a body. This is a way of reasoning about bodies in a multithreaded simulation while avoiding ra...
Definition BodyID.h:13
static constexpr uint32 cMaxBodyIndex
Maximum value for body index (also the maximum amount of bodies supported - 1).
Definition BodyID.h:19
Definition BodyInterface.h:36
Implementation that uses the body manager to lock the correct mutex for a body.
Definition BodyLockInterface.h:78
Implementation that performs no locking (assumes the lock has already been taken).
Definition BodyLockInterface.h:58
Interface that the application should implement to allow mapping object layers to broadphase layers.
Definition BroadPhaseLayer.h:61
Definition BroadPhaseQuery.h:29
Settings to be passed with a collision query.
Definition CollideShape.h:94
Base class for all physics constraints. A constraint removes one or more degrees of freedom for a rig...
Definition Constraint.h:108
Definition DebugRenderer.h:47
Default filter class that uses the pair filter in combination with a specified layer to filter layers...
Definition BroadPhaseLayer.h:108
Default filter class that uses the pair filter in combination with a specified layer to filter layers...
Definition ObjectLayer.h:64
Definition JobSystem.h:70
Definition NarrowPhaseQuery.h:23
Filter class to test if two objects can collide based on their object layer. Used while finding colli...
Definition ObjectLayer.h:50
Class to test if an object can collide with a broadphase layer. Used while finding collision pairs.
Definition BroadPhaseLayer.h:80
A listener class that receives a callback before every physics simulation step.
Definition PhysicsStepListener.h:23
Definition PhysicsSystem.h:30
void GetBodies(BodyIDVector &outBodyIDs) const
Definition PhysicsSystem.h:232
void DrawConstraintReferenceFrame(DebugRenderer *inRenderer)
Draw the constraint reference frames only (debugging purposes).
Definition PhysicsSystem.h:190
const SimShapeFilter * GetSimShapeFilter() const
Definition PhysicsSystem.h:90
void SetCombineRestitution(ContactConstraintManager::CombineFunction inCombineRestitution)
Definition PhysicsSystem.h:81
const ObjectVsBroadPhaseLayerFilter & GetObjectVsBroadPhaseLayerFilter() const
Broadphase layer filter that decides if two objects can collide, this was passed to the Init function...
Definition PhysicsSystem.h:204
const NarrowPhaseQuery & GetNarrowPhaseQuery() const
Interface that allows fine collision queries against first the broad phase and then the narrow phase.
Definition PhysicsSystem.h:124
void RemoveConstraints(Constraint **inConstraints, int inNumber)
Batch remove constraints.
Definition PhysicsSystem.h:137
const ObjectLayerPairFilter & GetObjectLayerPairFilter() const
Object layer filter that decides if two objects can collide, this was passed to the Init function.
Definition PhysicsSystem.h:207
uint GetNumBodies() const
Gets the current amount of bodies that are in the body manager.
Definition PhysicsSystem.h:216
uint32 GetNumActiveBodies(EBodyType inType) const
Gets the current amount of active bodies that are in the body manager.
Definition PhysicsSystem.h:219
void SetPhysicsSettings(const PhysicsSettings &inSettings)
Control the main constants of the physics simulation.
Definition PhysicsSystem.h:111
void SetSoftBodyContactListener(SoftBodyContactListener *inListener)
Listener that is notified whenever a contact point between a soft body and another body.
Definition PhysicsSystem.h:71
const BodyInterface & GetBodyInterface() const
Access to the body interface. This interface allows to to create / remove bodies and to change their ...
Definition PhysicsSystem.h:115
const BroadPhaseQuery & GetBroadPhaseQuery() const
Access to the broadphase interface that allows coarse collision queries.
Definition PhysicsSystem.h:121
const BodyLockInterfaceLocking & GetBodyLockInterface() const
Returns a locking interface that locks the body so other threads cannot modify it.
Definition PhysicsSystem.h:201
const NarrowPhaseQuery & GetNarrowPhaseQueryNoLock() const
Version that does not lock the bodies, use with great care!
Definition PhysicsSystem.h:125
static constexpr uint cMaxBodiesLimit
The maximum value that can be passed to Init for inMaxBodies.
Definition PhysicsSystem.h:39
void DrawConstraints(DebugRenderer *inRenderer)
Draw the constraints only (debugging purposes).
Definition PhysicsSystem.h:184
const PhysicsSettings & GetPhysicsSettings() const
Definition PhysicsSystem.h:112
const BodyInterface & GetBodyInterfaceNoLock() const
Version that does not lock the bodies, use with great care!
Definition PhysicsSystem.h:117
BodyInterface & GetBodyInterface()
Definition PhysicsSystem.h:116
void DrawConstraintLimits(DebugRenderer *inRenderer)
Draw the constraint limits only (debugging purposes).
Definition PhysicsSystem.h:187
static constexpr uint cMaxBodyPairsLimit
Definition PhysicsSystem.h:44
Constraints GetConstraints() const
Get a list of all constraints.
Definition PhysicsSystem.h:140
void AddConstraint(Constraint *inConstraint)
Add constraint to the world.
Definition PhysicsSystem.h:128
std::function< void(const Body &inBody1, const Body &inBody2, Mat44Arg inCenterOfMassTransform1, Mat44Arg inCenterOfMassTransform2, CollideShapeSettings &ioCollideShapeSettings, CollideShapeCollector &ioCollector, const ShapeFilter &inShapeFilter)> SimCollideBodyVsBody
Definition PhysicsSystem.h:100
Vec3 GetGravity() const
Definition PhysicsSystem.h:195
uint GetMaxBodies() const
Get the maximum amount of bodies that this physics system supports.
Definition PhysicsSystem.h:222
void RemoveConstraint(Constraint *inConstraint)
Remove constraint from the world.
Definition PhysicsSystem.h:131
AABox GetBounds() const
Definition PhysicsSystem.h:252
BodyManager::BodyStats BodyStats
Helper struct that counts the number of bodies of each type.
Definition PhysicsSystem.h:225
void DrawBodies(const BodyManager::DrawSettings &inSettings, DebugRenderer *inRenderer, const BodyDrawFilter *inBodyFilter=nullptr)
Draw the state of the bodies (debugging purposes).
Definition PhysicsSystem.h:181
BodyActivationListener * GetBodyActivationListener() const
Definition PhysicsSystem.h:63
DefaultBroadPhaseLayerFilter GetDefaultBroadPhaseLayerFilter(ObjectLayer inLayer) const
Get an broadphase layer filter that uses the default pair filter and a specified object layer to dete...
Definition PhysicsSystem.h:210
BodyInterface & GetBodyInterfaceNoLock()
Version that does not lock the bodies, use with great care!
Definition PhysicsSystem.h:118
void SetSimCollideBodyVsBody(const SimCollideBodyVsBody &inBodyVsBody)
Definition PhysicsSystem.h:104
void SetSimShapeFilter(const SimShapeFilter *inShapeFilter)
Definition PhysicsSystem.h:89
void GetActiveBodies(EBodyType inType, BodyIDVector &outBodyIDs) const
Definition PhysicsSystem.h:237
ContactConstraintManager::CombineFunction GetCombineRestitution() const
Definition PhysicsSystem.h:82
JPH_OVERRIDE_NEW_DELETE PhysicsSystem()
Constructor / Destructor.
Definition PhysicsSystem.h:35
static bool sDrawMotionQualityLinearCast
Draw debug info for objects that perform continuous collision detection through the linear cast motio...
Definition PhysicsSystem.h:178
void SetGravity(Vec3Arg inGravity)
Set gravity value.
Definition PhysicsSystem.h:194
const BodyLockInterfaceNoLock & GetBodyLockInterfaceNoLock() const
Returns a locking interface that won't actually lock the body. Use with great care!
Definition PhysicsSystem.h:198
BodyStats GetBodyStats() const
Get stats about the bodies in the body manager (slow, iterates through all bodies).
Definition PhysicsSystem.h:228
void AddConstraints(Constraint **inConstraints, int inNumber)
Batch add constraints.
Definition PhysicsSystem.h:134
bool WereBodiesInContact(const BodyID &inBody1ID, const BodyID &inBody2ID) const
Definition PhysicsSystem.h:248
DefaultObjectLayerFilter GetDefaultLayerFilter(ObjectLayer inLayer) const
Get an object layer filter that uses the default pair filter and a specified layer to determine if la...
Definition PhysicsSystem.h:213
void SetContactListener(ContactListener *inListener)
Definition PhysicsSystem.h:67
SoftBodyContactListener * GetSoftBodyContactListener() const
Definition PhysicsSystem.h:72
ContactConstraintManager::CombineFunction GetCombineFriction() const
Definition PhysicsSystem.h:77
void SetCombineFriction(ContactConstraintManager::CombineFunction inCombineFriction)
Definition PhysicsSystem.h:76
const BodyID * GetActiveBodiesUnsafe(EBodyType inType) const
Definition PhysicsSystem.h:241
void Init(uint inMaxBodies, uint inNumBodyMutexes, uint inMaxBodyPairs, uint inMaxContactConstraints, const BroadPhaseLayerInterface &inBroadPhaseLayerInterface, const ObjectVsBroadPhaseLayerFilter &inObjectVsBroadPhaseLayerFilter, const ObjectLayerPairFilter &inObjectLayerPairFilter)
Definition PhysicsSystem.cpp:78
void SetBodyActivationListener(BodyActivationListener *inListener)
Listener that is notified whenever a body is activated/deactivated.
Definition PhysicsSystem.h:62
ContactListener * GetContactListener() const
Definition PhysicsSystem.h:68
const SimCollideBodyVsBody & GetSimCollideBodyVsBody() const
Definition PhysicsSystem.h:105
static constexpr uint cMaxContactConstraintsLimit
Definition PhysicsSystem.h:49
Filter class.
Definition ShapeFilter.h:17
Filter class used during the simulation (PhysicsSystem::Update) to filter out collisions at shape lev...
Definition SimShapeFilter.h:17
Definition SoftBodyContactListener.h:33
User callbacks that allow determining which parts of the simulation should be saved by a StateRecorde...
Definition StateRecorder.h:79
Definition StateRecorder.h:110
Definition TempAllocator.h:16
Helper struct that counts the number of bodies of each type.
Definition BodyManager.h:65
Definition BodyManager.h:244
Definition PhysicsSettings.h:28