Path: blob/master/thirdparty/jolt_physics/Jolt/Physics/Collision/BroadPhase/BroadPhaseQuadTree.h
9918 views
// Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)1// SPDX-FileCopyrightText: 2021 Jorrit Rouwe2// SPDX-License-Identifier: MIT34#pragma once56#include <Jolt/Physics/Collision/BroadPhase/QuadTree.h>7#include <Jolt/Physics/Collision/BroadPhase/BroadPhase.h>8#include <Jolt/Physics/PhysicsLock.h>910JPH_NAMESPACE_BEGIN1112/// Fast SIMD based quad tree BroadPhase that is multithreading aware and tries to do a minimal amount of locking.13class JPH_EXPORT BroadPhaseQuadTree final : public BroadPhase14{15public:16JPH_OVERRIDE_NEW_DELETE1718/// Destructor19virtual ~BroadPhaseQuadTree() override;2021// Implementing interface of BroadPhase (see BroadPhase for documentation)22virtual void Init(BodyManager *inBodyManager, const BroadPhaseLayerInterface &inLayerInterface) override;23virtual void Optimize() override;24virtual void FrameSync() override;25virtual void LockModifications() override;26virtual UpdateState UpdatePrepare() override;27virtual void UpdateFinalize(const UpdateState &inUpdateState) override;28virtual void UnlockModifications() override;29virtual AddState AddBodiesPrepare(BodyID *ioBodies, int inNumber) override;30virtual void AddBodiesFinalize(BodyID *ioBodies, int inNumber, AddState inAddState) override;31virtual void AddBodiesAbort(BodyID *ioBodies, int inNumber, AddState inAddState) override;32virtual void RemoveBodies(BodyID *ioBodies, int inNumber) override;33virtual void NotifyBodiesAABBChanged(BodyID *ioBodies, int inNumber, bool inTakeLock) override;34virtual void NotifyBodiesLayerChanged(BodyID *ioBodies, int inNumber) override;35virtual void CastRay(const RayCast &inRay, RayCastBodyCollector &ioCollector, const BroadPhaseLayerFilter &inBroadPhaseLayerFilter, const ObjectLayerFilter &inObjectLayerFilter) const override;36virtual void CollideAABox(const AABox &inBox, CollideShapeBodyCollector &ioCollector, const BroadPhaseLayerFilter &inBroadPhaseLayerFilter, const ObjectLayerFilter &inObjectLayerFilter) const override;37virtual void CollideSphere(Vec3Arg inCenter, float inRadius, CollideShapeBodyCollector &ioCollector, const BroadPhaseLayerFilter &inBroadPhaseLayerFilter, const ObjectLayerFilter &inObjectLayerFilter) const override;38virtual void CollidePoint(Vec3Arg inPoint, CollideShapeBodyCollector &ioCollector, const BroadPhaseLayerFilter &inBroadPhaseLayerFilter, const ObjectLayerFilter &inObjectLayerFilter) const override;39virtual void CollideOrientedBox(const OrientedBox &inBox, CollideShapeBodyCollector &ioCollector, const BroadPhaseLayerFilter &inBroadPhaseLayerFilter, const ObjectLayerFilter &inObjectLayerFilter) const override;40virtual void CastAABoxNoLock(const AABoxCast &inBox, CastShapeBodyCollector &ioCollector, const BroadPhaseLayerFilter &inBroadPhaseLayerFilter, const ObjectLayerFilter &inObjectLayerFilter) const override;41virtual void CastAABox(const AABoxCast &inBox, CastShapeBodyCollector &ioCollector, const BroadPhaseLayerFilter &inBroadPhaseLayerFilter, const ObjectLayerFilter &inObjectLayerFilter) const override;42virtual void FindCollidingPairs(BodyID *ioActiveBodies, int inNumActiveBodies, float inSpeculativeContactDistance, const ObjectVsBroadPhaseLayerFilter &inObjectVsBroadPhaseLayerFilter, const ObjectLayerPairFilter &inObjectLayerPairFilter, BodyPairCollector &ioPairCollector) const override;43virtual AABox GetBounds() const override;44#ifdef JPH_TRACK_BROADPHASE_STATS45virtual void ReportStats() override;46#endif // JPH_TRACK_BROADPHASE_STATS4748private:49/// Helper struct for AddBodies handle50struct LayerState51{52JPH_OVERRIDE_NEW_DELETE5354BodyID * mBodyStart = nullptr;55BodyID * mBodyEnd;56QuadTree::AddState mAddState;57};5859using Tracking = QuadTree::Tracking;60using TrackingVector = QuadTree::TrackingVector;6162#ifdef JPH_ENABLE_ASSERTS63/// Context used to lock a physics lock64PhysicsLockContext mLockContext = nullptr;65#endif // JPH_ENABLE_ASSERTS6667/// Max amount of bodies we support68size_t mMaxBodies = 0;6970/// Array that for each BodyID keeps track of where it is located in which tree71TrackingVector mTracking;7273/// Node allocator for all trees74QuadTree::Allocator mAllocator;7576/// Information about broad phase layers77const BroadPhaseLayerInterface *mBroadPhaseLayerInterface = nullptr;7879/// One tree per object layer80QuadTree * mLayers;81uint mNumLayers;8283/// UpdateState implementation for this tree used during UpdatePrepare/Finalize()84struct UpdateStateImpl85{86QuadTree * mTree;87QuadTree::UpdateState mUpdateState;88};8990static_assert(sizeof(UpdateStateImpl) <= sizeof(UpdateState));91static_assert(alignof(UpdateStateImpl) <= alignof(UpdateState));9293/// Mutex that prevents object modification during UpdatePrepare/Finalize()94SharedMutex mUpdateMutex;9596/// We double buffer all trees so that we can query while building the next one and we destroy the old tree the next physics update.97/// This structure ensures that we wait for queries that are still using the old tree.98mutable SharedMutex mQueryLocks[2];99100/// This index indicates which lock is currently active, it alternates between 0 and 1101atomic<uint32> mQueryLockIdx { 0 };102103/// This is the next tree to update in UpdatePrepare()104uint32 mNextLayerToUpdate = 0;105};106107JPH_NAMESPACE_END108109110