The btDbvt class implements a fast dynamic bounding volume tree based on axis aligned bounding boxes (aabb tree). More...
#include <btDbvt.h>
Classes | |
struct | IClone |
struct | ICollide |
struct | IWriter |
struct | sStkCLN |
struct | sStkNN |
struct | sStkNP |
struct | sStkNPS |
Public Types | |
enum | { SIMPLE_STACKSIZE = 64, DOUBLE_STACKSIZE = SIMPLE_STACKSIZE*2 } |
Public Member Functions | |
btDbvt () | |
~btDbvt () | |
void | clear () |
bool | empty () const |
void | optimizeBottomUp () |
void | optimizeTopDown (int bu_treshold=128) |
void | optimizeIncremental (int passes) |
btDbvtNode * | insert (const btDbvtVolume &box, void *data) |
void | update (btDbvtNode *leaf, int lookahead=-1) |
void | update (btDbvtNode *leaf, btDbvtVolume &volume) |
bool | update (btDbvtNode *leaf, btDbvtVolume &volume, const btVector3 &velocity, btScalar margin) |
bool | update (btDbvtNode *leaf, btDbvtVolume &volume, const btVector3 &velocity) |
bool | update (btDbvtNode *leaf, btDbvtVolume &volume, btScalar margin) |
void | remove (btDbvtNode *leaf) |
void | write (IWriter *iwriter) const |
void | clone (btDbvt &dest, IClone *iclone=0) const |
DBVT_PREFIX void | collideTT (const btDbvtNode *root0, const btDbvtNode *root1, DBVT_IPOLICY) |
DBVT_PREFIX void | collideTTpersistentStack (const btDbvtNode *root0, const btDbvtNode *root1, DBVT_IPOLICY) |
DBVT_PREFIX void | collideTV (const btDbvtNode *root, const btDbvtVolume &volume, DBVT_IPOLICY) const |
DBVT_PREFIX void | rayTestInternal (const btDbvtNode *root, const btVector3 &rayFrom, const btVector3 &rayTo, const btVector3 &rayDirectionInverse, unsigned int signs[3], btScalar lambda_max, const btVector3 &aabbMin, const btVector3 &aabbMax, DBVT_IPOLICY) const |
rayTestInternal is faster than rayTest, because it uses a persistent stack (to reduce dynamic memory allocations to a minimum) and it uses precomputed signs/rayInverseDirections rayTestInternal is used by btDbvtBroadphase to accelerate world ray casts | |
Static Public Member Functions | |
static int | maxdepth (const btDbvtNode *node) |
static int | countLeaves (const btDbvtNode *node) |
static void | extractLeaves (const btDbvtNode *node, btAlignedObjectArray< const btDbvtNode * > &leaves) |
static void | benchmark () |
static DBVT_PREFIX void | enumNodes (const btDbvtNode *root, DBVT_IPOLICY) |
static DBVT_PREFIX void | enumLeaves (const btDbvtNode *root, DBVT_IPOLICY) |
static DBVT_PREFIX void | rayTest (const btDbvtNode *root, const btVector3 &rayFrom, const btVector3 &rayTo, DBVT_IPOLICY) |
rayTest is a re-entrant ray test, and can be called in parallel as long as the btAlignedAlloc is thread-safe (uses locking etc) rayTest is slower than rayTestInternal, because it builds a local stack, using memory allocations, and it recomputes signs/rayDirectionInverses each time | |
static DBVT_PREFIX void | collideKDOP (const btDbvtNode *root, const btVector3 *normals, const btScalar *offsets, int count, DBVT_IPOLICY) |
static DBVT_PREFIX void | collideOCL (const btDbvtNode *root, const btVector3 *normals, const btScalar *offsets, const btVector3 &sortaxis, int count, DBVT_IPOLICY, bool fullsort=true) |
static DBVT_PREFIX void | collideTU (const btDbvtNode *root, DBVT_IPOLICY) |
static DBVT_INLINE int | nearest (const int *i, const btDbvt::sStkNPS *a, btScalar v, int l, int h) |
static DBVT_INLINE int | allocate (btAlignedObjectArray< int > &ifree, btAlignedObjectArray< sStkNPS > &stock, const sStkNPS &value) |
Public Attributes | |
btDbvtNode * | m_root |
btDbvtNode * | m_free |
int | m_lkhd |
int | m_leaves |
unsigned | m_opath |
btAlignedObjectArray< sStkNN > | m_stkStack |
btAlignedObjectArray< const btDbvtNode * > | m_rayTestStack |
Private Member Functions | |
btDbvt (const btDbvt &) |
The btDbvt class implements a fast dynamic bounding volume tree based on axis aligned bounding boxes (aabb tree).
This btDbvt is used for soft body collision detection and for the btDbvtBroadphase. It has a fast insert, remove and update of nodes. Unlike the btQuantizedBvh, nodes can be dynamically moved around, which allows for change in topology of the underlying data structure.
Definition at line 194 of file btDbvt.h.
anonymous enum |
btDbvt::btDbvt | ( | ) |
Definition at line 409 of file btDbvt.cpp.
btDbvt::~btDbvt | ( | ) |
Definition at line 419 of file btDbvt.cpp.
static DBVT_INLINE int btDbvt::allocate | ( | btAlignedObjectArray< int > & | ifree, | |
btAlignedObjectArray< sStkNPS > & | stock, | |||
const sStkNPS & | value | |||
) | [inline, static] |
void btDbvt::clear | ( | ) |
Definition at line 425 of file btDbvt.cpp.
Definition at line 588 of file btDbvt.cpp.
DBVT_PREFIX void btDbvt::collideKDOP | ( | const btDbvtNode * | root, | |
const btVector3 * | normals, | |||
const btScalar * | offsets, | |||
int | count, | |||
DBVT_IPOLICY | ||||
) | [inline, static] |
DBVT_PREFIX void btDbvt::collideOCL | ( | const btDbvtNode * | root, | |
const btVector3 * | normals, | |||
const btScalar * | offsets, | |||
const btVector3 & | sortaxis, | |||
int | count, | |||
DBVT_IPOLICY | , | |||
bool | fullsort = true | |||
) | [inline, static] |
DBVT_PREFIX void btDbvt::collideTT | ( | const btDbvtNode * | root0, | |
const btDbvtNode * | root1, | |||
DBVT_IPOLICY | ||||
) | [inline] |
DBVT_PREFIX void btDbvt::collideTTpersistentStack | ( | const btDbvtNode * | root0, | |
const btDbvtNode * | root1, | |||
DBVT_IPOLICY | ||||
) | [inline] |
DBVT_PREFIX void btDbvt::collideTU | ( | const btDbvtNode * | root, | |
DBVT_IPOLICY | ||||
) | [inline, static] |
DBVT_PREFIX void btDbvt::collideTV | ( | const btDbvtNode * | root, | |
const btDbvtVolume & | volume, | |||
DBVT_IPOLICY | ||||
) | const [inline] |
int btDbvt::countLeaves | ( | const btDbvtNode * | node | ) | [static] |
Definition at line 627 of file btDbvt.cpp.
DBVT_PREFIX void btDbvt::enumLeaves | ( | const btDbvtNode * | root, | |
DBVT_IPOLICY | ||||
) | [inline, static] |
DBVT_PREFIX void btDbvt::enumNodes | ( | const btDbvtNode * | root, | |
DBVT_IPOLICY | ||||
) | [inline, static] |
void btDbvt::extractLeaves | ( | const btDbvtNode * | node, | |
btAlignedObjectArray< const btDbvtNode * > & | leaves | |||
) | [static] |
Definition at line 636 of file btDbvt.cpp.
btDbvtNode * btDbvt::insert | ( | const btDbvtVolume & | box, | |
void * | data | |||
) |
Definition at line 483 of file btDbvt.cpp.
int btDbvt::maxdepth | ( | const btDbvtNode * | node | ) | [static] |
Definition at line 619 of file btDbvt.cpp.
static DBVT_INLINE int btDbvt::nearest | ( | const int * | i, | |
const btDbvt::sStkNPS * | a, | |||
btScalar | v, | |||
int | l, | |||
int | h | |||
) | [inline, static] |
void btDbvt::optimizeBottomUp | ( | ) |
Definition at line 438 of file btDbvt.cpp.
void btDbvt::optimizeIncremental | ( | int | passes | ) |
Definition at line 463 of file btDbvt.cpp.
void btDbvt::optimizeTopDown | ( | int | bu_treshold = 128 |
) |
Definition at line 451 of file btDbvt.cpp.
DBVT_PREFIX void btDbvt::rayTest | ( | const btDbvtNode * | root, | |
const btVector3 & | rayFrom, | |||
const btVector3 & | rayTo, | |||
DBVT_IPOLICY | ||||
) | [inline, static] |
rayTest is a re-entrant ray test, and can be called in parallel as long as the btAlignedAlloc is thread-safe (uses locking etc) rayTest is slower than rayTestInternal, because it builds a local stack, using memory allocations, and it recomputes signs/rayDirectionInverses each time
what about division by zero? --> just set rayDirection[i] to INF/BT_LARGE_FLOAT
DBVT_PREFIX void btDbvt::rayTestInternal | ( | const btDbvtNode * | root, | |
const btVector3 & | rayFrom, | |||
const btVector3 & | rayTo, | |||
const btVector3 & | rayDirectionInverse, | |||
unsigned int | signs[3], | |||
btScalar | lambda_max, | |||
const btVector3 & | aabbMin, | |||
const btVector3 & | aabbMax, | |||
DBVT_IPOLICY | ||||
) | const [inline] |
rayTestInternal is faster than rayTest, because it uses a persistent stack (to reduce dynamic memory allocations to a minimum) and it uses precomputed signs/rayInverseDirections rayTestInternal is used by btDbvtBroadphase to accelerate world ray casts
void btDbvt::remove | ( | btDbvtNode * | leaf | ) |
Definition at line 555 of file btDbvt.cpp.
bool btDbvt::update | ( | btDbvtNode * | leaf, | |
btDbvtVolume & | volume, | |||
const btVector3 & | velocity, | |||
btScalar | margin | |||
) |
Definition at line 527 of file btDbvt.cpp.
void btDbvt::update | ( | btDbvtNode * | leaf, | |
int | lookahead = -1 | |||
) |
Definition at line 492 of file btDbvt.cpp.
bool btDbvt::update | ( | btDbvtNode * | leaf, | |
btDbvtVolume & | volume, | |||
btScalar | margin | |||
) |
Definition at line 546 of file btDbvt.cpp.
bool btDbvt::update | ( | btDbvtNode * | leaf, | |
btDbvtVolume & | volume, | |||
const btVector3 & | velocity | |||
) |
Definition at line 537 of file btDbvt.cpp.
void btDbvt::update | ( | btDbvtNode * | leaf, | |
btDbvtVolume & | volume | |||
) |
Definition at line 509 of file btDbvt.cpp.
void btDbvt::write | ( | IWriter * | iwriter | ) | const |
Definition at line 563 of file btDbvt.cpp.
int btDbvt::m_leaves |
int btDbvt::m_lkhd |
unsigned btDbvt::m_opath |
btAlignedObjectArray<const btDbvtNode*> btDbvt::m_rayTestStack [mutable] |