190 while (
m_nodes[index].IsLeaf() ==
false)
202 float32 cost = 2.0f * combinedArea;
205 float32 inheritanceCost = 2.0f * (combinedArea - area);
213 cost1 = aabb.GetPerimeter() + inheritanceCost;
220 float32 newArea = aabb.GetPerimeter();
221 cost1 = (newArea - oldArea) + inheritanceCost;
230 cost2 = aabb.GetPerimeter() + inheritanceCost;
237 float32 newArea = aabb.GetPerimeter();
238 cost2 = newArea - oldArea + inheritanceCost;
242 if (cost < cost1 && cost < cost2)
258 int32 sibling = index;
271 if (
m_nodes[oldParent].child1 == sibling)
327 if (
m_nodes[parent].child1 == leaf)
339 if (
m_nodes[grandParent].child1 == parent)
351 int32 index = grandParent;
554 return totalArea / rootArea;
570 return 1 +
b2Max(height1, height2);
640 height = 1 +
b2Max(height1, height2);
674 int32 maxBalance = 0;
688 maxBalance =
b2Max(maxBalance, balance);
723 int32 iMin = -1, jMin = -1;
724 for (
int32 i = 0; i < count; ++i)
728 for (
int32 j = i + 1; j < count; ++j)
743 int32 index1 = nodes[iMin];
744 int32 index2 = nodes[jMin];
756 child1->
parent = parentIndex;
757 child2->
parent = parentIndex;
759 nodes[jMin] = nodes[count-1];
760 nodes[iMin] = parentIndex;
#define b2_aabbMultiplier
~b2DynamicTree()
Destroy the tree, freeing the node pool.
void ValidateMetrics(int32 index) const
void Combine(const b2AABB &aabb)
Combine an AABB into this one.
bool MoveProxy(int32 proxyId, const b2AABB &aabb1, const b2Vec2 &displacement)
b2Vec2 lowerBound
the lower vertex
b2AABB aabb
Enlarged AABB.
bool Contains(const b2AABB &aabb) const
Does this aabb contain the provided AABB.
void RemoveLeaf(int32 node)
int32 Balance(int32 index)
void Validate() const
Validate this tree. For testing.
void ValidateStructure(int32 index) const
void DestroyProxy(int32 proxyId)
Destroy a proxy. This asserts if the id is invalid.
void FreeNode(int32 node)
void InsertLeaf(int32 node)
void RebuildBottomUp()
Build an optimal tree. Very expensive. For testing.
uint32 m_path
This is used to incrementally traverse the tree for re-balancing.
int32 ComputeHeight() const
void ShiftOrigin(const b2Vec2 &newOrigin)
int32 CreateProxy(const b2AABB &aabb, void *userData)
Create a proxy. Provide a tight fitting AABB and a userData pointer.
float32 GetAreaRatio() const
Get the ratio of the sum of the node areas to the root area.
b2DynamicTree()
Constructing the tree initializes the node pool.
A node in the dynamic tree. The client does not interact with this directly.
An axis aligned bounding box.
float32 GetPerimeter() const
Get the perimeter length.
void * b2Alloc(int32 size)
Implement this function to use your own memory allocator.
int32 GetMaxBalance() const
void b2Free(void *mem)
If you implement b2Alloc, you should also implement this function.
b2Vec2 upperBound
the upper vertex