39 NodeTriangleCallback& operator=(NodeTriangleCallback& other)
45 NodeTriangleCallback(
NodeArray& triangleNodes)
46 : m_triangleNodes(triangleNodes)
50 virtual void internalProcessTriangleIndex(
btVector3* triangle,
int partId,
int triangleIndex)
56 aabbMin.
setMin(triangle[0]);
57 aabbMax.
setMax(triangle[0]);
58 aabbMin.
setMin(triangle[1]);
59 aabbMax.
setMax(triangle[1]);
60 aabbMin.
setMin(triangle[2]);
61 aabbMax.
setMax(triangle[2]);
80 QuantizedNodeTriangleCallback& operator=(QuantizedNodeTriangleCallback& other)
83 m_optimizedTree = other.m_optimizedTree;
88 : m_triangleNodes(triangleNodes), m_optimizedTree(tree)
92 virtual void internalProcessTriangleIndex(
btVector3* triangle,
int partId,
int triangleIndex)
104 aabbMin.
setMin(triangle[0]);
105 aabbMax.
setMax(triangle[0]);
106 aabbMin.
setMin(triangle[1]);
107 aabbMax.
setMax(triangle[1]);
108 aabbMin.
setMin(triangle[2]);
109 aabbMax.
setMax(triangle[2]);
114 if (aabbMax.
x() - aabbMin.
x() < MIN_AABB_DIMENSION)
116 aabbMax.
setX(aabbMax.
x() + MIN_AABB_HALF_DIMENSION);
117 aabbMin.
setX(aabbMin.
x() - MIN_AABB_HALF_DIMENSION);
119 if (aabbMax.
y() - aabbMin.
y() < MIN_AABB_DIMENSION)
121 aabbMax.
setY(aabbMax.
y() + MIN_AABB_HALF_DIMENSION);
122 aabbMin.
setY(aabbMin.
y() - MIN_AABB_HALF_DIMENSION);
124 if (aabbMax.
z() - aabbMin.
z() < MIN_AABB_DIMENSION)
126 aabbMax.
setZ(aabbMax.
z() + MIN_AABB_HALF_DIMENSION);
127 aabbMin.
setZ(aabbMin.
z() - MIN_AABB_HALF_DIMENSION);
139 int numLeafNodes = 0;
229 unsigned short quantizedQueryAabbMin[3];
230 unsigned short quantizedQueryAabbMax[3];
232 quantize(&quantizedQueryAabbMin[0], aabbMin, 0);
233 quantize(&quantizedQueryAabbMax[0], aabbMax, 1);
257 int curNodeSubPart = -1;
260 const unsigned char* vertexbase = 0;
264 const unsigned char* indexbase = 0;
274 for (i = endNode - 1; i >= firstNode; i--)
282 if (nodeSubPart != curNodeSubPart)
284 if (curNodeSubPart >= 0)
288 curNodeSubPart = nodeSubPart;
292 unsigned int* gfxbase = (
unsigned int*)(indexbase + nodeTriangleIndex * indexstride);
294 for (
int j = 2; j >= 0; j--)
297 switch (indicestype) {
298 case PHY_INTEGER: graphicsindex = gfxbase[j];
break;
299 case PHY_SHORT: graphicsindex = ((
unsigned short*)gfxbase)[j];
break;
300 case PHY_UCHAR: graphicsindex = ((
unsigned char*)gfxbase)[j];
break;
305 float* graphicsbase = (
float*)(vertexbase + graphicsindex * stride);
307 graphicsbase[0] * meshScaling.
getX(),
308 graphicsbase[1] * meshScaling.
getY(),
309 graphicsbase[2] * meshScaling.
getZ());
313 double* graphicsbase = (
double*)(vertexbase + graphicsindex * stride);
320 aabbMin.
setMin(triangleVerts[0]);
321 aabbMax.
setMax(triangleVerts[0]);
322 aabbMin.
setMin(triangleVerts[1]);
323 aabbMax.
setMax(triangleVerts[1]);
324 aabbMin.
setMin(triangleVerts[2]);
325 aabbMax.
setMax(triangleVerts[2]);
339 for (
int i = 0; i < 3; i++)
353 if (curNodeSubPart >= 0)
SIMD_FORCE_INLINE unsigned testQuantizedAabbAgainstQuantizedAabb(const unsigned short int *aabbMin1, const unsigned short int *aabbMax1, const unsigned short int *aabbMin2, const unsigned short int *aabbMax2)
PHY_ScalarType
PHY_ScalarType enumerates possible scalar types.
btAlignedObjectArray< btOptimizedBvhNode > NodeArray
for code readability:
#define MAX_NUM_PARTS_IN_BITS
btAlignedObjectArray< btQuantizedBvhNode > QuantizedNodeArray
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
void copyFromArray(const btAlignedObjectArray &otherArray)
void push_back(const T &_Val)
btBvhSubtreeInfo provides info to gather a subtree of limited size
unsigned short int m_quantizedAabbMax[3]
unsigned short int m_quantizedAabbMin[3]
void setAabbFromQuantizeNode(const btQuantizedBvhNode &quantizedNode)
static btOptimizedBvh * deSerializeInPlace(void *i_alignedDataBuffer, unsigned int i_dataBufferSize, bool i_swapEndian)
deSerializeInPlace loads and initializes a BVH from a buffer in memory 'in place'
void updateBvhNodes(btStridingMeshInterface *meshInterface, int firstNode, int endNode, int index)
virtual ~btOptimizedBvh()
void refitPartial(btStridingMeshInterface *triangles, const btVector3 &aabbMin, const btVector3 &aabbMax)
void refit(btStridingMeshInterface *triangles, const btVector3 &aabbMin, const btVector3 &aabbMax)
void build(btStridingMeshInterface *triangles, bool useQuantizedAabbCompression, const btVector3 &bvhAabbMin, const btVector3 &bvhAabbMax)
void setQuantizationValues(const btVector3 &bvhAabbMin, const btVector3 &bvhAabbMax, btScalar quantizationMargin=btScalar(1.0))
***************************************** expert/internal use only *************************
void buildTree(int startIndex, int endIndex)
QuantizedNodeArray m_quantizedLeafNodes
void quantize(unsigned short *out, const btVector3 &point, int isMax) const
static btQuantizedBvh * deSerializeInPlace(void *i_alignedDataBuffer, unsigned int i_dataBufferSize, bool i_swapEndian)
deSerializeInPlace loads and initializes a BVH from a buffer in memory 'in place'
BvhSubtreeInfoArray m_SubtreeHeaders
NodeArray m_contiguousNodes
QuantizedNodeArray m_quantizedContiguousNodes
The btStridingMeshInterface is the interface class for high performance generic access to triangle me...
const btVector3 & getScaling() const
virtual void getLockedReadOnlyVertexIndexBase(const unsigned char **vertexbase, int &numverts, PHY_ScalarType &type, int &stride, const unsigned char **indexbase, int &indexstride, int &numfaces, PHY_ScalarType &indicestype, int subpart=0) const =0
virtual void unLockReadOnlyVertexBase(int subpart) const =0
virtual void InternalProcessAllTriangles(btInternalTriangleIndexCallback *callback, const btVector3 &aabbMin, const btVector3 &aabbMax) const
btVector3 can be used to represent 3D points and vectors.
const btScalar & getZ() const
Return the z value.
void setMax(const btVector3 &other)
Set each element to the max of the current values and the values of another btVector3.
void setZ(btScalar _z)
Set the z value.
const btScalar & z() const
Return the z value.
void setValue(const btScalar &_x, const btScalar &_y, const btScalar &_z)
void setY(btScalar _y)
Set the y value.
void setX(btScalar _x)
Set the x value.
const btScalar & getY() const
Return the y value.
const btScalar & x() const
Return the x value.
void setMin(const btVector3 &other)
Set each element to the min of the current values and the values of another btVector3.
const btScalar & getX() const
Return the x value.
const btScalar & y() const
Return the y value.
btOptimizedBvhNode contains both internal and leaf node information.
btQuantizedBvhNode is a compressed aabb node, 16 bytes.
unsigned short int m_quantizedAabbMin[3]
unsigned short int m_quantizedAabbMax[3]
int getEscapeIndex() const
int m_escapeIndexOrTriangleIndex
int getTriangleIndex() const