Jolt Physics
A multi core friendly Game Physics Engine
Loading...
Searching...
No Matches
BroadPhaseQuadTree Class Referencefinal

Fast SIMD based quad tree BroadPhase that is multithreading aware and tries to do a minimal amount of locking. More...

#include <BroadPhaseQuadTree.h>

Inheritance diagram for BroadPhaseQuadTree:
BroadPhase BroadPhaseQuery NonCopyable

Public Member Functions

virtual JPH_OVERRIDE_NEW_DELETE ~BroadPhaseQuadTree () override
 Destructor. More...
 
virtual void Init (BodyManager *inBodyManager, const BroadPhaseLayerInterface &inLayerInterface) override
 
virtual void Optimize () override
 Should be called after many objects have been inserted to make the broadphase more efficient, usually done on startup only. More...
 
virtual void FrameSync () override
 Must be called just before updating the broadphase when none of the body mutexes are locked. More...
 
virtual void LockModifications () override
 Must be called before UpdatePrepare to prevent modifications from being made to the tree. More...
 
virtual UpdateState UpdatePrepare () override
 
virtual void UpdateFinalize (const UpdateState &inUpdateState) override
 Finalizing the update will quickly apply the changes. More...
 
virtual void UnlockModifications () override
 Must be called after UpdateFinalize to allow modifications to the broadphase. More...
 
virtual AddState AddBodiesPrepare (BodyID *ioBodies, int inNumber) override
 
virtual void AddBodiesFinalize (BodyID *ioBodies, int inNumber, AddState inAddState) override
 
virtual void AddBodiesAbort (BodyID *ioBodies, int inNumber, AddState inAddState) override
 
virtual void RemoveBodies (BodyID *ioBodies, int inNumber) override
 
virtual void NotifyBodiesAABBChanged (BodyID *ioBodies, int inNumber, bool inTakeLock) override
 
virtual void NotifyBodiesLayerChanged (BodyID *ioBodies, int inNumber) override
 Call whenever the layer (and optionally the aabb as well) of a body changes (can change order of ioBodies array) More...
 
virtual void CastRay (const RayCast &inRay, RayCastBodyCollector &ioCollector, const BroadPhaseLayerFilter &inBroadPhaseLayerFilter, const ObjectLayerFilter &inObjectLayerFilter) const override
 Cast a ray and add any hits to ioCollector. More...
 
virtual void CollideAABox (const AABox &inBox, CollideShapeBodyCollector &ioCollector, const BroadPhaseLayerFilter &inBroadPhaseLayerFilter, const ObjectLayerFilter &inObjectLayerFilter) const override
 Get bodies intersecting with inBox and any hits to ioCollector. More...
 
virtual void CollideSphere (Vec3Arg inCenter, float inRadius, CollideShapeBodyCollector &ioCollector, const BroadPhaseLayerFilter &inBroadPhaseLayerFilter, const ObjectLayerFilter &inObjectLayerFilter) const override
 Get bodies intersecting with a sphere and any hits to ioCollector. More...
 
virtual void CollidePoint (Vec3Arg inPoint, CollideShapeBodyCollector &ioCollector, const BroadPhaseLayerFilter &inBroadPhaseLayerFilter, const ObjectLayerFilter &inObjectLayerFilter) const override
 Get bodies intersecting with a point and any hits to ioCollector. More...
 
virtual void CollideOrientedBox (const OrientedBox &inBox, CollideShapeBodyCollector &ioCollector, const BroadPhaseLayerFilter &inBroadPhaseLayerFilter, const ObjectLayerFilter &inObjectLayerFilter) const override
 Get bodies intersecting with an oriented box and any hits to ioCollector. More...
 
virtual void CastAABoxNoLock (const AABoxCast &inBox, CastShapeBodyCollector &ioCollector, const BroadPhaseLayerFilter &inBroadPhaseLayerFilter, const ObjectLayerFilter &inObjectLayerFilter) const override
 Same as BroadPhaseQuery::CastAABox but can be implemented in a way to take no broad phase locks. More...
 
virtual void CastAABox (const AABoxCast &inBox, CastShapeBodyCollector &ioCollector, const BroadPhaseLayerFilter &inBroadPhaseLayerFilter, const ObjectLayerFilter &inObjectLayerFilter) const override
 Cast a box and add any hits to ioCollector. More...
 
virtual void FindCollidingPairs (BodyID *ioActiveBodies, int inNumActiveBodies, float inSpeculativeContactDistance, const ObjectVsBroadPhaseLayerFilter &inObjectVsBroadPhaseLayerFilter, const ObjectLayerPairFilter &inObjectLayerPairFilter, BodyPairCollector &ioPairCollector) const override
 
virtual AABox GetBounds () const override
 Get the bounding box of all objects in the broadphase. More...
 
virtual void Init (BodyManager *inBodyManager, const BroadPhaseLayerInterface &inLayerInterface)
 
virtual void Optimize ()
 Should be called after many objects have been inserted to make the broadphase more efficient, usually done on startup only. More...
 
virtual void FrameSync ()
 Must be called just before updating the broadphase when none of the body mutexes are locked. More...
 
virtual void LockModifications ()
 Must be called before UpdatePrepare to prevent modifications from being made to the tree. More...
 
virtual UpdateState UpdatePrepare ()
 
virtual void UpdateFinalize (const UpdateState &inUpdateState)
 Finalizing the update will quickly apply the changes. More...
 
virtual void UnlockModifications ()
 Must be called after UpdateFinalize to allow modifications to the broadphase. More...
 
virtual AddState AddBodiesPrepare (BodyID *ioBodies, int inNumber)
 
virtual void AddBodiesFinalize (BodyID *ioBodies, int inNumber, AddState inAddState)=0
 
virtual void AddBodiesAbort (BodyID *ioBodies, int inNumber, AddState inAddState)
 
virtual void RemoveBodies (BodyID *ioBodies, int inNumber)=0
 
virtual void NotifyBodiesAABBChanged (BodyID *ioBodies, int inNumber, bool inTakeLock=true)=0
 
virtual void NotifyBodiesLayerChanged (BodyID *ioBodies, int inNumber)=0
 Call whenever the layer (and optionally the aabb as well) of a body changes (can change order of ioBodies array) More...
 
virtual void FindCollidingPairs (BodyID *ioActiveBodies, int inNumActiveBodies, float inSpeculativeContactDistance, const ObjectVsBroadPhaseLayerFilter &inObjectVsBroadPhaseLayerFilter, const ObjectLayerPairFilter &inObjectLayerPairFilter, BodyPairCollector &ioPairCollector) const =0
 
virtual void CastAABoxNoLock (const AABoxCast &inBox, CastShapeBodyCollector &ioCollector, const BroadPhaseLayerFilter &inBroadPhaseLayerFilter, const ObjectLayerFilter &inObjectLayerFilter) const =0
 Same as BroadPhaseQuery::CastAABox but can be implemented in a way to take no broad phase locks. More...
 
virtual AABox GetBounds () const =0
 Get the bounding box of all objects in the broadphase. More...
 
- Public Member Functions inherited from BroadPhaseQuery
virtual ~BroadPhaseQuery ()=default
 Virtual destructor. More...
 
virtual void CastRay (const RayCast &inRay, RayCastBodyCollector &ioCollector, const BroadPhaseLayerFilter &inBroadPhaseLayerFilter={ }, const ObjectLayerFilter &inObjectLayerFilter={ }) const =0
 Cast a ray and add any hits to ioCollector. More...
 
virtual void CollideAABox (const AABox &inBox, CollideShapeBodyCollector &ioCollector, const BroadPhaseLayerFilter &inBroadPhaseLayerFilter={ }, const ObjectLayerFilter &inObjectLayerFilter={ }) const =0
 Get bodies intersecting with inBox and any hits to ioCollector. More...
 
virtual void CollideSphere (Vec3Arg inCenter, float inRadius, CollideShapeBodyCollector &ioCollector, const BroadPhaseLayerFilter &inBroadPhaseLayerFilter={ }, const ObjectLayerFilter &inObjectLayerFilter={ }) const =0
 Get bodies intersecting with a sphere and any hits to ioCollector. More...
 
virtual void CollidePoint (Vec3Arg inPoint, CollideShapeBodyCollector &ioCollector, const BroadPhaseLayerFilter &inBroadPhaseLayerFilter={ }, const ObjectLayerFilter &inObjectLayerFilter={ }) const =0
 Get bodies intersecting with a point and any hits to ioCollector. More...
 
virtual void CollideOrientedBox (const OrientedBox &inBox, CollideShapeBodyCollector &ioCollector, const BroadPhaseLayerFilter &inBroadPhaseLayerFilter={ }, const ObjectLayerFilter &inObjectLayerFilter={ }) const =0
 Get bodies intersecting with an oriented box and any hits to ioCollector. More...
 
virtual void CastAABox (const AABoxCast &inBox, CastShapeBodyCollector &ioCollector, const BroadPhaseLayerFilter &inBroadPhaseLayerFilter={ }, const ObjectLayerFilter &inObjectLayerFilter={ }) const =0
 Cast a box and add any hits to ioCollector. More...
 
- Public Member Functions inherited from NonCopyable
 NonCopyable ()=default
 
 NonCopyable (const NonCopyable &)=delete
 
void operator= (const NonCopyable &)=delete
 

Additional Inherited Members

- Public Types inherited from BroadPhase
using AddState = void *
 Handle used during adding bodies to the broadphase. More...
 
- Protected Attributes inherited from BroadPhase
BodyManagermBodyManager = nullptr
 Link to the body manager that manages the bodies in this broadphase. More...
 

Detailed Description

Fast SIMD based quad tree BroadPhase that is multithreading aware and tries to do a minimal amount of locking.

Constructor & Destructor Documentation

◆ ~BroadPhaseQuadTree()

JPH_NAMESPACE_BEGIN BroadPhaseQuadTree::~BroadPhaseQuadTree ( )
overridevirtual

Destructor.

Member Function Documentation

◆ AddBodiesAbort()

void BroadPhaseQuadTree::AddBodiesAbort ( BodyID ioBodies,
int  inNumber,
AddState  inAddState 
)
overridevirtual

Abort adding bodies to the broadphase, supply the return value of AddBodiesPrepare in inAddState. This can be done on a background thread without influencing the broadphase. Please ensure that the ioBodies array passed to AddBodiesPrepare is unmodified and passed again to this function.

Reimplemented from BroadPhase.

◆ AddBodiesFinalize()

void BroadPhaseQuadTree::AddBodiesFinalize ( BodyID ioBodies,
int  inNumber,
AddState  inAddState 
)
overridevirtual

Finalize adding bodies to the broadphase, supply the return value of AddBodiesPrepare in inAddState. Please ensure that the ioBodies array passed to AddBodiesPrepare is unmodified and passed again to this function.

Implements BroadPhase.

◆ AddBodiesPrepare()

BroadPhase::AddState BroadPhaseQuadTree::AddBodiesPrepare ( BodyID ioBodies,
int  inNumber 
)
overridevirtual

Prepare adding inNumber bodies at ioBodies to the broadphase, returns a handle that should be used in AddBodiesFinalize/Abort. This can be done on a background thread without influencing the broadphase. ioBodies may be shuffled around by this function and should be kept that way until AddBodiesFinalize/Abort is called.

Reimplemented from BroadPhase.

◆ CastAABox()

void BroadPhaseQuadTree::CastAABox ( const AABoxCast inBox,
CastShapeBodyCollector ioCollector,
const BroadPhaseLayerFilter inBroadPhaseLayerFilter,
const ObjectLayerFilter inObjectLayerFilter 
) const
overridevirtual

Cast a box and add any hits to ioCollector.

Implements BroadPhaseQuery.

◆ CastAABoxNoLock()

void BroadPhaseQuadTree::CastAABoxNoLock ( const AABoxCast inBox,
CastShapeBodyCollector ioCollector,
const BroadPhaseLayerFilter inBroadPhaseLayerFilter,
const ObjectLayerFilter inObjectLayerFilter 
) const
overridevirtual

Same as BroadPhaseQuery::CastAABox but can be implemented in a way to take no broad phase locks.

Implements BroadPhase.

◆ CastRay()

void BroadPhaseQuadTree::CastRay ( const RayCast inRay,
RayCastBodyCollector ioCollector,
const BroadPhaseLayerFilter inBroadPhaseLayerFilter,
const ObjectLayerFilter inObjectLayerFilter 
) const
overridevirtual

Cast a ray and add any hits to ioCollector.

Implements BroadPhaseQuery.

◆ CollideAABox()

void BroadPhaseQuadTree::CollideAABox ( const AABox inBox,
CollideShapeBodyCollector ioCollector,
const BroadPhaseLayerFilter inBroadPhaseLayerFilter,
const ObjectLayerFilter inObjectLayerFilter 
) const
overridevirtual

Get bodies intersecting with inBox and any hits to ioCollector.

Implements BroadPhaseQuery.

◆ CollideOrientedBox()

void BroadPhaseQuadTree::CollideOrientedBox ( const OrientedBox inBox,
CollideShapeBodyCollector ioCollector,
const BroadPhaseLayerFilter inBroadPhaseLayerFilter,
const ObjectLayerFilter inObjectLayerFilter 
) const
overridevirtual

Get bodies intersecting with an oriented box and any hits to ioCollector.

Implements BroadPhaseQuery.

◆ CollidePoint()

void BroadPhaseQuadTree::CollidePoint ( Vec3Arg  inPoint,
CollideShapeBodyCollector ioCollector,
const BroadPhaseLayerFilter inBroadPhaseLayerFilter,
const ObjectLayerFilter inObjectLayerFilter 
) const
overridevirtual

Get bodies intersecting with a point and any hits to ioCollector.

Implements BroadPhaseQuery.

◆ CollideSphere()

void BroadPhaseQuadTree::CollideSphere ( Vec3Arg  inCenter,
float  inRadius,
CollideShapeBodyCollector ioCollector,
const BroadPhaseLayerFilter inBroadPhaseLayerFilter,
const ObjectLayerFilter inObjectLayerFilter 
) const
overridevirtual

Get bodies intersecting with a sphere and any hits to ioCollector.

Implements BroadPhaseQuery.

◆ FindCollidingPairs()

void BroadPhaseQuadTree::FindCollidingPairs ( BodyID ioActiveBodies,
int  inNumActiveBodies,
float  inSpeculativeContactDistance,
const ObjectVsBroadPhaseLayerFilter inObjectVsBroadPhaseLayerFilter,
const ObjectLayerPairFilter inObjectLayerPairFilter,
BodyPairCollector ioPairCollector 
) const
overridevirtual

Find all colliding pairs between dynamic bodies Note that this function is very specifically tailored for the PhysicsSystem::Update function, hence it is not part of the BroadPhaseQuery interface. One of the assumptions it can make is that no locking is needed during the query as it will only be called during a very particular part of the update.

Parameters
ioActiveBodiesis a list of bodies for which we need to find colliding pairs (this function can change the order of the ioActiveBodies array). This can be a subset of the set of active bodies in the system.
inNumActiveBodiesis the size of the ioActiveBodies array.
inSpeculativeContactDistanceDistance at which speculative contact points will be created.
inObjectVsBroadPhaseLayerFilteris the filter that determines if an object can collide with a broadphase layer.
inObjectLayerPairFilteris the filter that determines if two objects can collide.
ioPairCollectorreceives callbacks for every body pair found.

Implements BroadPhase.

◆ FrameSync()

void BroadPhaseQuadTree::FrameSync ( )
overridevirtual

Must be called just before updating the broadphase when none of the body mutexes are locked.

Reimplemented from BroadPhase.

◆ GetBounds()

AABox BroadPhaseQuadTree::GetBounds ( ) const
overridevirtual

Get the bounding box of all objects in the broadphase.

Implements BroadPhase.

◆ Init()

void BroadPhaseQuadTree::Init ( BodyManager inBodyManager,
const BroadPhaseLayerInterface inLayerInterface 
)
overridevirtual

Initialize the broadphase.

Parameters
inBodyManagerThe body manager singleton
inLayerInterfaceInterface that maps object layers to broadphase layers. Note that the broadphase takes a pointer to the data inside inObjectToBroadPhaseLayer so this object should remain static.

Reimplemented from BroadPhase.

◆ LockModifications()

void BroadPhaseQuadTree::LockModifications ( )
overridevirtual

Must be called before UpdatePrepare to prevent modifications from being made to the tree.

Reimplemented from BroadPhase.

◆ NotifyBodiesAABBChanged()

void BroadPhaseQuadTree::NotifyBodiesAABBChanged ( BodyID ioBodies,
int  inNumber,
bool  inTakeLock 
)
overridevirtual

Call whenever the aabb of a body changes (can change order of ioBodies array) inTakeLock should be false if we're between LockModifications/UnlockModificiations in which case care needs to be taken to not call this between UpdatePrepare/UpdateFinalize

Implements BroadPhase.

◆ NotifyBodiesLayerChanged()

void BroadPhaseQuadTree::NotifyBodiesLayerChanged ( BodyID ioBodies,
int  inNumber 
)
overridevirtual

Call whenever the layer (and optionally the aabb as well) of a body changes (can change order of ioBodies array)

Implements BroadPhase.

◆ Optimize()

void BroadPhaseQuadTree::Optimize ( )
overridevirtual

Should be called after many objects have been inserted to make the broadphase more efficient, usually done on startup only.

Reimplemented from BroadPhase.

◆ RemoveBodies()

void BroadPhaseQuadTree::RemoveBodies ( BodyID ioBodies,
int  inNumber 
)
overridevirtual

Remove inNumber bodies in ioBodies from the broadphase. ioBodies may be shuffled around by this function.

Implements BroadPhase.

◆ UnlockModifications()

void BroadPhaseQuadTree::UnlockModifications ( )
overridevirtual

Must be called after UpdateFinalize to allow modifications to the broadphase.

Reimplemented from BroadPhase.

◆ UpdateFinalize()

void BroadPhaseQuadTree::UpdateFinalize ( const UpdateState inUpdateState)
overridevirtual

Finalizing the update will quickly apply the changes.

Reimplemented from BroadPhase.

◆ UpdatePrepare()

BroadPhase::UpdateState BroadPhaseQuadTree::UpdatePrepare ( )
overridevirtual

Update the broadphase, needs to be called frequently to update the internal state when bodies have been modified. The UpdatePrepare() function can run in a background thread without influencing the broadphase

Reimplemented from BroadPhase.


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