36 inline NodeID() =
default;
39 static inline NodeID sInvalid() {
return NodeID(cInvalidNodeIndex); }
44 inline bool IsValid()
const {
return mID != cInvalidNodeIndex; }
45 inline bool IsBody()
const {
return (mID & cIsNode) == 0; }
46 inline bool IsNode()
const {
return (mID & cIsNode) != 0; }
53 inline bool operator == (
const BodyID &
inRHS)
const {
return mID ==
inRHS.GetIndexAndSequenceNumber(); }
54 inline bool operator == (
const NodeID &
inRHS)
const {
return mID ==
inRHS.mID; }
57 friend class AtomicNodeID;
66 static_assert(
sizeof(NodeID) ==
sizeof(
BodyID),
"Body id's should have the same size as NodeIDs");
73 AtomicNodeID() =
default;
74 explicit AtomicNodeID(
const NodeID &
inRHS) : mID(
inRHS.mID) { }
77 inline void operator = (
const NodeID &
inRHS) { mID =
inRHS.mID; }
80 inline operator NodeID ()
const {
return NodeID(mID); }
83 inline bool IsValid()
const {
return mID != cInvalidNodeIndex; }
86 inline bool operator == (
const BodyID &
inRHS)
const {
return mID ==
inRHS.GetIndexAndSequenceNumber(); }
87 inline bool operator == (
const NodeID &
inRHS)
const {
return mID ==
inRHS.mID; }
90 inline bool CompareExchange(NodeID
inOld, NodeID
inNew) {
return mID.compare_exchange_strong(
inOld.mID,
inNew.mID); }
119 atomic<float> mBoundsMinX[4];
120 atomic<float> mBoundsMinY[4];
121 atomic<float> mBoundsMinZ[4];
122 atomic<float> mBoundsMaxX[4];
123 atomic<float> mBoundsMaxY[4];
124 atomic<float> mBoundsMaxZ[4];
127 AtomicNodeID mChildNodeID[4];
131 atomic<uint32> mParentNodeIndex = cInvalidNodeIndex;
135 atomic<uint32> mIsChanged;
142 static constexpr int cStackSize = 128;
144 static_assert(
sizeof(atomic<float>) == 4,
"Assuming that an atomic doesn't add any additional storage");
145 static_assert(
sizeof(atomic<uint32>) == 4,
"Assuming that an atomic doesn't add any additional storage");
152 static_assert(Allocator::ObjectStorageSize == 128,
"Node should be 128 bytes");
162 static const uint32 cInvalidBodyLocation = 0xffffffff;
165 atomic<ObjectLayer> mObjectLayer = cObjectLayerInvalid;
166 atomic<uint32> mBodyLocation { cInvalidBodyLocation };
174#if defined(JPH_EXTERNAL_PROFILE) || defined(JPH_PROFILE_ENABLED)
177 inline const char *
GetName()
const {
return mName; }
181 inline bool HasBodies()
const {
return mNumBodies != 0; }
184 inline bool IsDirty()
const {
return mIsDirty; }
187 inline bool CanBeUpdated()
const {
return mFreeNodeBatch.mNumObjects == 0; }
198 void DiscardOldTree();
201 AABox GetBounds()
const;
211 NodeID mLeafID = NodeID::sInvalid();
254#ifdef JPH_TRACK_BROADPHASE_STATS
264 static const uint32 cInvalidNodeIndex = 0xffffffff;
265 static const float cLargeFloat;
266 static const AABox cInvalidBounds;
272 inline NodeID GetNodeID()
const {
return NodeID::sFromNodeIndex(mIndex); }
275 atomic<uint32> mIndex { cInvalidNodeIndex };
284 JPH_INLINE const RootNode & GetCurrentRoot()
const {
return mRootNode[mRootNodeIndex]; }
285 JPH_INLINE RootNode & GetCurrentRoot() {
return mRootNode[mRootNodeIndex]; }
323#ifdef JPH_DUMP_BROADPHASE_TREE
328#ifdef JPH_TRACK_BROADPHASE_STATS
362 template <
class Visitor>
365#if defined(JPH_EXTERNAL_PROFILE) || defined(JPH_PROFILE_ENABLED)
367 const char * mName =
"Layer";
371 atomic<uint32> mNumBodies { 0 };
375 RootNode mRootNode[2];
376 atomic<uint32> mRootNodeIndex { 0 };
379 Allocator * mAllocator =
nullptr;
382 Allocator::Batch mFreeNodeBatch;
385 atomic<bool> mIsDirty =
false;
Array< Body * > BodyVector
Array of bodies.
Definition BodyManager.h:25
#define JPH_IF_TRACK_BROADPHASE_STATS(...)
Definition BroadPhase.h:16
#define JPH_EXPORT
Definition Core.h:227
std::uint64_t uint64
Definition Core.h:443
unsigned int uint
Definition Core.h:439
#define JPH_NAMESPACE_END
Definition Core.h:367
std::uint32_t uint32
Definition Core.h:442
#define JPH_NAMESPACE_BEGIN
Definition Core.h:361
#define JPH_ASSERT(...)
Definition IssueReporting.h:33
AllocateFunction Allocate
Definition Memory.cpp:59
#define JPH_OVERRIDE_NEW_DELETE
Macro to override the new and delete functions.
Definition Memory.h:29
std::vector< T, STLAllocator< T > > Array
Definition STLAllocator.h:81
std::unordered_map< Key, T, Hash, KeyEqual, STLAllocator< pair< const Key, T > > > UnorderedMap
Definition UnorderedMap.h:13
Axis aligned box.
Definition AABox.h:16
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 cBroadPhaseBit
This bit is used by the broadphase.
Definition BodyID.h:18
uint8 Type
Definition BroadPhaseLayer.h:20
Virtual interface that allows collecting multiple collision results.
Definition CollisionCollector.h:45
Class that makes another class non-copyable. Usage: Inherit from NonCopyable.
Definition NonCopyable.h:11
Filter class for object layers.
Definition ObjectLayer.h:28
Filter class to test if two objects can collide based on their object layer. Used while finding colli...
Definition ObjectLayer.h:50
Oriented box.
Definition OrientedBox.h:18
const char * GetName() const
Definition QuadTree.h:177
bool HasBodies() const
Check if there is anything in the tree.
Definition QuadTree.h:181
bool IsDirty() const
Check if the tree needs an UpdatePrepare/Finalize()
Definition QuadTree.h:184
bool CanBeUpdated() const
Check if this tree can get an UpdatePrepare/Finalize() or if it needs a DiscardOldTree() first.
Definition QuadTree.h:187
Array< Tracking > TrackingVector
Definition QuadTree.h:169
void SetName(const char *inName)
Name of the tree for debugging purposes.
Definition QuadTree.h:176
Structure that holds AABox moving linearly through 3d space.
Definition AABoxCast.h:13
Temporary data structure to pass information between AddBodiesPrepare and AddBodiesFinalize/Abort.
Definition QuadTree.h:210
AABox mLeafBounds
Definition QuadTree.h:212
Data to track location of a Body in the tree.
Definition QuadTree.h:156
Tracking(const Tracking &inRHS)
Definition QuadTree.h:159
Tracking()=default
Constructor to satisfy the vector class.
Definition QuadTree.h:193
NodeID mRootNodeID
This will be the new root node id.
Definition QuadTree.h:194