The dynamic tree is a binary AABB tree to organize and query large numbers of geometric objects. More...
Data Structures | |
struct | b2DynamicTree |
The dynamic tree structure. More... | |
struct | b2TreeStats |
These are performance results returned by dynamic tree queries. More... | |
Typedefs | |
typedef bool | b2TreeQueryCallbackFcn(int proxyId, uint64_t userData, void *context) |
This function receives proxies found in the AABB query. | |
typedef float | b2TreeRayCastCallbackFcn(const b2RayCastInput *input, int proxyId, uint64_t userData, void *context) |
This function receives clipped ray cast input for a proxy. | |
typedef float | b2TreeShapeCastCallbackFcn(const b2ShapeCastInput *input, int proxyId, uint64_t userData, void *context) |
This function receives clipped ray cast input for a proxy. | |
Functions | |
b2DynamicTree | b2DynamicTree_Create (void) |
Constructing the tree initializes the node pool. | |
void | b2DynamicTree_Destroy (b2DynamicTree *tree) |
Destroy the tree, freeing the node pool. | |
int | b2DynamicTree_CreateProxy (b2DynamicTree *tree, b2AABB aabb, uint64_t categoryBits, uint64_t userData) |
Create a proxy. Provide an AABB and a userData value. | |
void | b2DynamicTree_DestroyProxy (b2DynamicTree *tree, int proxyId) |
Destroy a proxy. This asserts if the id is invalid. | |
void | b2DynamicTree_MoveProxy (b2DynamicTree *tree, int proxyId, b2AABB aabb) |
Move a proxy to a new AABB by removing and reinserting into the tree. | |
void | b2DynamicTree_EnlargeProxy (b2DynamicTree *tree, int proxyId, b2AABB aabb) |
Enlarge a proxy and enlarge ancestors as necessary. | |
void | b2DynamicTree_SetCategoryBits (b2DynamicTree *tree, int proxyId, uint64_t categoryBits) |
Modify the category bits on a proxy. This is an expensive operation. | |
uint64_t | b2DynamicTree_GetCategoryBits (b2DynamicTree *tree, int proxyId) |
Get the category bits on a proxy. | |
b2TreeStats | b2DynamicTree_Query (const b2DynamicTree *tree, b2AABB aabb, uint64_t maskBits, b2TreeQueryCallbackFcn *callback, void *context) |
Query an AABB for overlapping proxies. | |
b2TreeStats | b2DynamicTree_RayCast (const b2DynamicTree *tree, const b2RayCastInput *input, uint64_t maskBits, b2TreeRayCastCallbackFcn *callback, void *context) |
Ray cast against the proxies in the tree. | |
b2TreeStats | b2DynamicTree_ShapeCast (const b2DynamicTree *tree, const b2ShapeCastInput *input, uint64_t maskBits, b2TreeShapeCastCallbackFcn *callback, void *context) |
Ray cast against the proxies in the tree. | |
int | b2DynamicTree_GetHeight (const b2DynamicTree *tree) |
Get the height of the binary tree. | |
float | b2DynamicTree_GetAreaRatio (const b2DynamicTree *tree) |
Get the ratio of the sum of the node areas to the root area. | |
b2AABB | b2DynamicTree_GetRootBounds (const b2DynamicTree *tree) |
Get the bounding box that contains the entire tree. | |
int | b2DynamicTree_GetProxyCount (const b2DynamicTree *tree) |
Get the number of proxies created. | |
int | b2DynamicTree_Rebuild (b2DynamicTree *tree, bool fullBuild) |
Rebuild the tree while retaining subtrees that haven't changed. Returns the number of boxes sorted. | |
int | b2DynamicTree_GetByteCount (const b2DynamicTree *tree) |
Get the number of bytes used by this tree. | |
uint64_t | b2DynamicTree_GetUserData (const b2DynamicTree *tree, int proxyId) |
Get proxy user data. | |
b2AABB | b2DynamicTree_GetAABB (const b2DynamicTree *tree, int proxyId) |
Get the AABB of a proxy. | |
void | b2DynamicTree_Validate (const b2DynamicTree *tree) |
Validate this tree. For testing. | |
void | b2DynamicTree_ValidateNoEnlarged (const b2DynamicTree *tree) |
Validate this tree has no enlarged AABBs. For testing. | |
The dynamic tree is a binary AABB tree to organize and query large numbers of geometric objects.
Box2D uses the dynamic tree internally to sort collision shapes into a binary bounding volume hierarchy. This data structure may have uses in games for organizing other geometry data and may be used independently of Box2D rigid body simulation.
A dynamic AABB tree broad-phase, inspired by Nathanael Presson's btDbvt. A dynamic tree arranges data in a binary tree to accelerate queries such as AABB queries and ray casts. Leaf nodes are proxies with an AABB. These are used to hold a user collision object. Nodes are pooled and relocatable, so I use node indices rather than pointers. The dynamic tree is made available for advanced users that would like to use it to organize spatial game data besides rigid bodies.
struct b2DynamicTree |
The dynamic tree structure.
This should be considered private data. It is placed here for performance reasons.
Data Fields | ||
---|---|---|
int * | binIndices | Bins for sorting during rebuild. |
int | freeList | Node free list. |
b2AABB * | leafBoxes | Leaf bounding boxes for rebuild. |
b2Vec2 * | leafCenters | Leaf bounding box centers for rebuild. |
int * | leafIndices | Leaf indices for rebuild. |
int | nodeCapacity | The allocated node space. |
int | nodeCount | The number of nodes. |
struct b2TreeNode * | nodes | The tree nodes. |
int | proxyCount | Number of proxies created. |
int | rebuildCapacity | Allocated space for rebuilding. |
int | root | The root index. |
struct b2TreeStats |
typedef bool b2TreeQueryCallbackFcn(int proxyId, uint64_t userData, void *context) |
This function receives proxies found in the AABB query.
typedef float b2TreeRayCastCallbackFcn(const b2RayCastInput *input, int proxyId, uint64_t userData, void *context) |
This function receives clipped ray cast input for a proxy.
The function returns the new ray fraction.
typedef float b2TreeShapeCastCallbackFcn(const b2ShapeCastInput *input, int proxyId, uint64_t userData, void *context) |
This function receives clipped ray cast input for a proxy.
The function returns the new ray fraction.
b2TreeStats b2DynamicTree_Query | ( | const b2DynamicTree * | tree, |
b2AABB | aabb, | ||
uint64_t | maskBits, | ||
b2TreeQueryCallbackFcn * | callback, | ||
void * | context ) |
Query an AABB for overlapping proxies.
The callback class is called for each proxy that overlaps the supplied AABB.
b2TreeStats b2DynamicTree_RayCast | ( | const b2DynamicTree * | tree, |
const b2RayCastInput * | input, | ||
uint64_t | maskBits, | ||
b2TreeRayCastCallbackFcn * | callback, | ||
void * | context ) |
Ray cast against the proxies in the tree.
This relies on the callback to perform a exact ray cast in the case were the proxy contains a shape. The callback also performs the any collision filtering. This has performance roughly equal to k * log(n), where k is the number of collisions and n is the number of proxies in the tree. Bit-wise filtering using mask bits can greatly improve performance in some scenarios. However, this filtering may be approximate, so the user should still apply filtering to results.
tree | the dynamic tree to ray cast |
input | the ray cast input data. The ray extends from p1 to p1 + maxFraction * (p2 - p1) |
maskBits | mask bit hint: bool accept = (maskBits & node->categoryBits) != 0; |
callback | a callback class that is called for each proxy that is hit by the ray |
context | user context that is passed to the callback |
b2TreeStats b2DynamicTree_ShapeCast | ( | const b2DynamicTree * | tree, |
const b2ShapeCastInput * | input, | ||
uint64_t | maskBits, | ||
b2TreeShapeCastCallbackFcn * | callback, | ||
void * | context ) |
Ray cast against the proxies in the tree.
This relies on the callback to perform a exact ray cast in the case were the proxy contains a shape. The callback also performs the any collision filtering. This has performance roughly equal to k * log(n), where k is the number of collisions and n is the number of proxies in the tree.
tree | the dynamic tree to ray cast |
input | the ray cast input data. The ray extends from p1 to p1 + maxFraction * (p2 - p1). |
maskBits | filter bits: bool accept = (maskBits & node->categoryBits) != 0; |
callback | a callback class that is called for each proxy that is hit by the shape |
context | user context that is passed to the callback |