23#ifndef B2_DYNAMIC_TREE_H
24#define B2_DYNAMIC_TREE_H
28#include "b2_growable_stack.h"
30#define b2_nullNode (-1)
37 return child1 == b2_nullNode;
91 void* GetUserData(int32 proxyId)
const;
93 bool WasMoved(int32 proxyId)
const;
94 void ClearMoved(int32 proxyId);
97 const b2AABB& GetFatAABB(int32 proxyId)
const;
101 template <
typename T>
102 void Query(T* callback,
const b2AABB& aabb)
const;
111 template <
typename T>
138 int32 AllocateNode();
139 void FreeNode(int32 node);
141 void InsertLeaf(int32 node);
142 void RemoveLeaf(int32 node);
144 int32 Balance(int32 index);
146 int32 ComputeHeight()
const;
147 int32 ComputeHeight(int32 nodeId)
const;
149 void ValidateStructure(int32 index)
const;
150 void ValidateMetrics(int32 index)
const;
156 int32 m_nodeCapacity;
160 int32 m_insertionCount;
165 b2Assert(0 <= proxyId && proxyId < m_nodeCapacity);
166 return m_nodes[proxyId].userData;
169inline bool b2DynamicTree::WasMoved(int32 proxyId)
const
171 b2Assert(0 <= proxyId && proxyId < m_nodeCapacity);
172 return m_nodes[proxyId].moved;
175inline void b2DynamicTree::ClearMoved(int32 proxyId)
177 b2Assert(0 <= proxyId && proxyId < m_nodeCapacity);
178 m_nodes[proxyId].moved =
false;
183 b2Assert(0 <= proxyId && proxyId < m_nodeCapacity);
184 return m_nodes[proxyId].
aabb;
193 while (stack.GetCount() > 0)
195 int32 nodeId = stack.Pop();
196 if (nodeId == b2_nullNode)
207 bool proceed = callback->QueryCallback(nodeId);
208 if (proceed ==
false)
215 stack.Push(node->child1);
216 stack.Push(node->child2);
232 b2Vec2 v = b2Cross(1.0f, r);
238 float maxFraction = input.maxFraction;
243 b2Vec2 t = p1 + maxFraction * (p2 - p1);
251 while (stack.GetCount() > 0)
253 int32 nodeId = stack.Pop();
254 if (nodeId == b2_nullNode)
270 float separation = b2Abs(b2Dot(v, p1 - c)) - b2Dot(abs_v, h);
271 if (separation > 0.0f)
279 subInput.p1 = input.p1;
280 subInput.p2 = input.p2;
281 subInput.maxFraction = maxFraction;
283 float value = callback->RayCastCallback(subInput, nodeId);
295 b2Vec2 t = p1 + maxFraction * (p2 - p1);
302 stack.Push(node->child1);
303 stack.Push(node->child2);
B2_API bool b2TestOverlap(const b2Shape *shapeA, int32 indexA, const b2Shape *shapeB, int32 indexB, const b2Transform &xfA, const b2Transform &xfB)
Determine if two generic shapes overlap.
Definition: b2_dynamic_tree.h:69
float GetAreaRatio() const
Get the ratio of the sum of the node areas to the root area.
void Query(T *callback, const b2AABB &aabb) const
Definition: b2_dynamic_tree.h:188
int32 GetMaxBalance() const
void DestroyProxy(int32 proxyId)
Destroy a proxy. This asserts if the id is invalid.
const b2AABB & GetFatAABB(int32 proxyId) const
Get the fat AABB for a proxy.
Definition: b2_dynamic_tree.h:181
bool MoveProxy(int32 proxyId, const b2AABB &aabb1, const b2Vec2 &displacement)
b2DynamicTree()
Constructing the tree initializes the node pool.
~b2DynamicTree()
Destroy the tree, freeing the node pool.
void * GetUserData(int32 proxyId) const
Definition: b2_dynamic_tree.h:163
void RebuildBottomUp()
Build an optimal tree. Very expensive. For testing.
int32 CreateProxy(const b2AABB &aabb, void *userData)
Create a proxy. Provide a tight fitting AABB and a userData pointer.
void Validate() const
Validate this tree. For testing.
void RayCast(T *callback, const b2RayCastInput &input) const
Definition: b2_dynamic_tree.h:223
void ShiftOrigin(const b2Vec2 &newOrigin)
Definition: b2_growable_stack.h:35
An axis aligned bounding box.
Definition: b2_collision.h:169
b2Vec2 GetExtents() const
Get the extents of the AABB (half-widths).
Definition: b2_collision.h:180
b2Vec2 GetCenter() const
Get the center of the AABB.
Definition: b2_collision.h:174
b2Vec2 lowerBound
the lower vertex
Definition: b2_collision.h:220
b2Vec2 upperBound
the upper vertex
Definition: b2_collision.h:221
A node in the dynamic tree. The client does not interact with this directly.
Definition: b2_dynamic_tree.h:34
b2AABB aabb
Enlarged AABB.
Definition: b2_dynamic_tree.h:41
A 2D column vector.
Definition: b2_math.h:42
float LengthSquared() const
Definition: b2_math.h:96
float Normalize()
Convert this vector into a unit vector. Returns the length.
Definition: b2_math.h:102