Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
godotengine
GitHub Repository: godotengine/godot
Path: blob/master/thirdparty/jolt_physics/Jolt/Physics/Collision/BroadPhase/BroadPhaseQuadTree.h
9918 views
1
// Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
2
// SPDX-FileCopyrightText: 2021 Jorrit Rouwe
3
// SPDX-License-Identifier: MIT
4
5
#pragma once
6
7
#include <Jolt/Physics/Collision/BroadPhase/QuadTree.h>
8
#include <Jolt/Physics/Collision/BroadPhase/BroadPhase.h>
9
#include <Jolt/Physics/PhysicsLock.h>
10
11
JPH_NAMESPACE_BEGIN
12
13
/// Fast SIMD based quad tree BroadPhase that is multithreading aware and tries to do a minimal amount of locking.
14
class JPH_EXPORT BroadPhaseQuadTree final : public BroadPhase
15
{
16
public:
17
JPH_OVERRIDE_NEW_DELETE
18
19
/// Destructor
20
virtual ~BroadPhaseQuadTree() override;
21
22
// Implementing interface of BroadPhase (see BroadPhase for documentation)
23
virtual void Init(BodyManager *inBodyManager, const BroadPhaseLayerInterface &inLayerInterface) override;
24
virtual void Optimize() override;
25
virtual void FrameSync() override;
26
virtual void LockModifications() override;
27
virtual UpdateState UpdatePrepare() override;
28
virtual void UpdateFinalize(const UpdateState &inUpdateState) override;
29
virtual void UnlockModifications() override;
30
virtual AddState AddBodiesPrepare(BodyID *ioBodies, int inNumber) override;
31
virtual void AddBodiesFinalize(BodyID *ioBodies, int inNumber, AddState inAddState) override;
32
virtual void AddBodiesAbort(BodyID *ioBodies, int inNumber, AddState inAddState) override;
33
virtual void RemoveBodies(BodyID *ioBodies, int inNumber) override;
34
virtual void NotifyBodiesAABBChanged(BodyID *ioBodies, int inNumber, bool inTakeLock) override;
35
virtual void NotifyBodiesLayerChanged(BodyID *ioBodies, int inNumber) override;
36
virtual void CastRay(const RayCast &inRay, RayCastBodyCollector &ioCollector, const BroadPhaseLayerFilter &inBroadPhaseLayerFilter, const ObjectLayerFilter &inObjectLayerFilter) const override;
37
virtual void CollideAABox(const AABox &inBox, CollideShapeBodyCollector &ioCollector, const BroadPhaseLayerFilter &inBroadPhaseLayerFilter, const ObjectLayerFilter &inObjectLayerFilter) const override;
38
virtual void CollideSphere(Vec3Arg inCenter, float inRadius, CollideShapeBodyCollector &ioCollector, const BroadPhaseLayerFilter &inBroadPhaseLayerFilter, const ObjectLayerFilter &inObjectLayerFilter) const override;
39
virtual void CollidePoint(Vec3Arg inPoint, CollideShapeBodyCollector &ioCollector, const BroadPhaseLayerFilter &inBroadPhaseLayerFilter, const ObjectLayerFilter &inObjectLayerFilter) const override;
40
virtual void CollideOrientedBox(const OrientedBox &inBox, CollideShapeBodyCollector &ioCollector, const BroadPhaseLayerFilter &inBroadPhaseLayerFilter, const ObjectLayerFilter &inObjectLayerFilter) const override;
41
virtual void CastAABoxNoLock(const AABoxCast &inBox, CastShapeBodyCollector &ioCollector, const BroadPhaseLayerFilter &inBroadPhaseLayerFilter, const ObjectLayerFilter &inObjectLayerFilter) const override;
42
virtual void CastAABox(const AABoxCast &inBox, CastShapeBodyCollector &ioCollector, const BroadPhaseLayerFilter &inBroadPhaseLayerFilter, const ObjectLayerFilter &inObjectLayerFilter) const override;
43
virtual void FindCollidingPairs(BodyID *ioActiveBodies, int inNumActiveBodies, float inSpeculativeContactDistance, const ObjectVsBroadPhaseLayerFilter &inObjectVsBroadPhaseLayerFilter, const ObjectLayerPairFilter &inObjectLayerPairFilter, BodyPairCollector &ioPairCollector) const override;
44
virtual AABox GetBounds() const override;
45
#ifdef JPH_TRACK_BROADPHASE_STATS
46
virtual void ReportStats() override;
47
#endif // JPH_TRACK_BROADPHASE_STATS
48
49
private:
50
/// Helper struct for AddBodies handle
51
struct LayerState
52
{
53
JPH_OVERRIDE_NEW_DELETE
54
55
BodyID * mBodyStart = nullptr;
56
BodyID * mBodyEnd;
57
QuadTree::AddState mAddState;
58
};
59
60
using Tracking = QuadTree::Tracking;
61
using TrackingVector = QuadTree::TrackingVector;
62
63
#ifdef JPH_ENABLE_ASSERTS
64
/// Context used to lock a physics lock
65
PhysicsLockContext mLockContext = nullptr;
66
#endif // JPH_ENABLE_ASSERTS
67
68
/// Max amount of bodies we support
69
size_t mMaxBodies = 0;
70
71
/// Array that for each BodyID keeps track of where it is located in which tree
72
TrackingVector mTracking;
73
74
/// Node allocator for all trees
75
QuadTree::Allocator mAllocator;
76
77
/// Information about broad phase layers
78
const BroadPhaseLayerInterface *mBroadPhaseLayerInterface = nullptr;
79
80
/// One tree per object layer
81
QuadTree * mLayers;
82
uint mNumLayers;
83
84
/// UpdateState implementation for this tree used during UpdatePrepare/Finalize()
85
struct UpdateStateImpl
86
{
87
QuadTree * mTree;
88
QuadTree::UpdateState mUpdateState;
89
};
90
91
static_assert(sizeof(UpdateStateImpl) <= sizeof(UpdateState));
92
static_assert(alignof(UpdateStateImpl) <= alignof(UpdateState));
93
94
/// Mutex that prevents object modification during UpdatePrepare/Finalize()
95
SharedMutex mUpdateMutex;
96
97
/// 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.
98
/// This structure ensures that we wait for queries that are still using the old tree.
99
mutable SharedMutex mQueryLocks[2];
100
101
/// This index indicates which lock is currently active, it alternates between 0 and 1
102
atomic<uint32> mQueryLockIdx { 0 };
103
104
/// This is the next tree to update in UpdatePrepare()
105
uint32 mNextLayerToUpdate = 0;
106
};
107
108
JPH_NAMESPACE_END
109
110