44 NodeTriangleCallback& operator=(NodeTriangleCallback& other)
50 NodeTriangleCallback(
NodeArray& triangleNodes)
51 :m_triangleNodes(triangleNodes)
55 virtual void internalProcessTriangleIndex(
btVector3* triangle,
int partId,
int triangleIndex)
61 aabbMin.
setMin(triangle[0]);
62 aabbMax.
setMax(triangle[0]);
63 aabbMin.
setMin(triangle[1]);
64 aabbMax.
setMax(triangle[1]);
65 aabbMin.
setMin(triangle[2]);
66 aabbMax.
setMax(triangle[2]);
77 m_triangleNodes.push_back(node);
85 QuantizedNodeTriangleCallback& operator=(QuantizedNodeTriangleCallback& other)
87 m_triangleNodes.copyFromArray(other.m_triangleNodes);
88 m_optimizedTree = other.m_optimizedTree;
93 :m_triangleNodes(triangleNodes),m_optimizedTree(tree)
97 virtual void internalProcessTriangleIndex(
btVector3* triangle,
int partId,
int triangleIndex)
109 aabbMin.
setMin(triangle[0]);
110 aabbMax.
setMax(triangle[0]);
111 aabbMin.
setMin(triangle[1]);
112 aabbMax.
setMax(triangle[1]);
113 aabbMin.
setMin(triangle[2]);
114 aabbMax.
setMax(triangle[2]);
119 if (aabbMax.
x() - aabbMin.
x() < MIN_AABB_DIMENSION)
121 aabbMax.
setX(aabbMax.
x() + MIN_AABB_HALF_DIMENSION);
122 aabbMin.
setX(aabbMin.
x() - MIN_AABB_HALF_DIMENSION);
124 if (aabbMax.
y() - aabbMin.
y() < MIN_AABB_DIMENSION)
126 aabbMax.
setY(aabbMax.
y() + MIN_AABB_HALF_DIMENSION);
127 aabbMin.
setY(aabbMin.
y() - MIN_AABB_HALF_DIMENSION);
129 if (aabbMax.
z() - aabbMin.
z() < MIN_AABB_DIMENSION)
131 aabbMax.
setZ(aabbMax.
z() + MIN_AABB_HALF_DIMENSION);
132 aabbMin.
setZ(aabbMin.
z() - MIN_AABB_HALF_DIMENSION);
140 m_triangleNodes.push_back(node);
146 int numLeafNodes = 0;
249 unsigned short quantizedQueryAabbMin[3];
250 unsigned short quantizedQueryAabbMax[3];
252 quantize(&quantizedQueryAabbMin[0],aabbMin,0);
253 quantize(&quantizedQueryAabbMax[0],aabbMax,1);
278 int curNodeSubPart=-1;
281 const unsigned char *vertexbase = 0;
285 const unsigned char *indexbase = 0;
295 for (i=endNode-1;i>=firstNode;i--)
305 if (nodeSubPart != curNodeSubPart)
307 if (curNodeSubPart >= 0)
311 curNodeSubPart = nodeSubPart;
316 unsigned int* gfxbase = (
unsigned int*)(indexbase+nodeTriangleIndex*indexstride);
319 for (
int j=2;j>=0;j--)
322 int graphicsindex = indicestype==
PHY_SHORT?((
unsigned short*)gfxbase)[j]:gfxbase[j];
325 float* graphicsbase = (
float*)(vertexbase+graphicsindex*stride);
327 graphicsbase[0]*meshScaling.
getX(),
328 graphicsbase[1]*meshScaling.
getY(),
329 graphicsbase[2]*meshScaling.
getZ());
333 double* graphicsbase = (
double*)(vertexbase+graphicsindex*stride);
342 aabbMin.
setMin(triangleVerts[0]);
343 aabbMax.
setMax(triangleVerts[0]);
344 aabbMin.
setMin(triangleVerts[1]);
345 aabbMax.
setMax(triangleVerts[1]);
346 aabbMin.
setMin(triangleVerts[2]);
347 aabbMax.
setMax(triangleVerts[2]);
363 for (
int i=0;i<3;i++)
378 if (curNodeSubPart >= 0)
int m_escapeIndexOrTriangleIndex
void setQuantizationValues(const btVector3 &bvhAabbMin, const btVector3 &bvhAabbMax, btScalar quantizationMargin=btScalar(1.0))
***************************************** expert/internal use only ************************* ...
void setValue(const btScalar &_x, const btScalar &_y, const btScalar &_z)
void setZ(btScalar _z)
Set the z value.
void build(btStridingMeshInterface *triangles, bool useQuantizedAabbCompression, const btVector3 &bvhAabbMin, const btVector3 &bvhAabbMax)
const btVector3 & getScaling() const
void updateBvhNodes(btStridingMeshInterface *meshInterface, int firstNode, int endNode, int index)
void copyFromArray(const btAlignedObjectArray &otherArray)
void refit(btStridingMeshInterface *triangles, const btVector3 &aabbMin, const btVector3 &aabbMax)
const btScalar & x() const
Return the x value.
const btScalar & getZ() const
Return the z value.
void clear()
clear the array, deallocated memory. Generally it is better to use array.resize(0), to reduce performance overhead of run-time memory (de)allocations.
btBvhSubtreeInfo provides info to gather a subtree of limited size
void setX(btScalar _x)
Set the x value.
#define MAX_NUM_PARTS_IN_BITS
NodeArray m_contiguousNodes
int size() const
return the number of elements in the array
void setAabbFromQuantizeNode(const btQuantizedBvhNode &quantizedNode)
unsigned testQuantizedAabbAgainstQuantizedAabb(const unsigned short int *aabbMin1, const unsigned short int *aabbMax1, const unsigned short int *aabbMin2, const unsigned short int *aabbMax2)
btOptimizedBvhNode contains both internal and leaf node information.
const btScalar & getY() const
Return the y value.
void setY(btScalar _y)
Set the y value.
const btScalar & getX() const
Return the x value.
The btOptimizedBvh extends the btQuantizedBvh to create AABB tree for triangle meshes, through the btStridingMeshInterface.
void quantize(unsigned short *out, const btVector3 &point, int isMax) const
btQuantizedBvhNode is a compressed aabb node, 16 bytes.
const btScalar & y() const
Return the y value.
BvhSubtreeInfoArray m_SubtreeHeaders
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' ...
btVector3 can be used to represent 3D points and vectors.
unsigned short int m_quantizedAabbMax[3]
The btStridingMeshInterface is the interface class for high performance generic access to triangle me...
int getTriangleIndex() const
void resize(int newsize, const T &fillData=T())
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' ...
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
The btQuantizedBvh class stores an AABB tree that can be quickly traversed on CPU and Cell SPU...
unsigned short int m_quantizedAabbMin[3]
T & expand(const T &fillValue=T())
unsigned short int m_quantizedAabbMax[3]
void buildTree(int startIndex, int endIndex)
virtual void unLockReadOnlyVertexBase(int subpart) const =0
void setMax(const btVector3 &other)
Set each element to the max of the current values and the values of another btVector3.
QuantizedNodeArray m_quantizedLeafNodes
unsigned short int m_quantizedAabbMin[3]
virtual ~btOptimizedBvh()
void setMin(const btVector3 &other)
Set each element to the min of the current values and the values of another btVector3.
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
int getEscapeIndex() const
PHY_ScalarType
PHY_ScalarType enumerates possible scalar types.
virtual void InternalProcessAllTriangles(btInternalTriangleIndexCallback *callback, const btVector3 &aabbMin, const btVector3 &aabbMax) const
void refitPartial(btStridingMeshInterface *triangles, const btVector3 &aabbMin, const btVector3 &aabbMax)
QuantizedNodeArray m_quantizedContiguousNodes
const btScalar & z() const
Return the z value.