Add btBvhTriangleMeshShape::buildOptimizedBvh() in preparation of next commit. This patch has been approved already and will be in Bullet 2.76.

This commit is contained in:
Benoit Bolsee
2010-02-03 21:20:06 +00:00
parent b6c643c19f
commit ec5788925c
2 changed files with 19 additions and 25 deletions

View File

@@ -30,22 +30,9 @@ m_ownsBvh(false)
//construct bvh from meshInterface //construct bvh from meshInterface
#ifndef DISABLE_BVH #ifndef DISABLE_BVH
btVector3 bvhAabbMin,bvhAabbMax;
if(meshInterface->hasPremadeAabb())
{
meshInterface->getPremadeAabb(&bvhAabbMin, &bvhAabbMax);
}
else
{
meshInterface->calculateAabbBruteForce(bvhAabbMin,bvhAabbMax);
}
if (buildBvh) if (buildBvh)
{ {
void* mem = btAlignedAlloc(sizeof(btOptimizedBvh),16); buildOptimizedBvh();
m_bvh = new (mem) btOptimizedBvh();
m_bvh->build(meshInterface,m_useQuantizedAabbCompression,bvhAabbMin,bvhAabbMax);
m_ownsBvh = true;
} }
#endif //DISABLE_BVH #endif //DISABLE_BVH
@@ -343,20 +330,25 @@ void btBvhTriangleMeshShape::setLocalScaling(const btVector3& scaling)
if ((getLocalScaling() -scaling).length2() > SIMD_EPSILON) if ((getLocalScaling() -scaling).length2() > SIMD_EPSILON)
{ {
btTriangleMeshShape::setLocalScaling(scaling); btTriangleMeshShape::setLocalScaling(scaling);
if (m_ownsBvh) buildOptimizedBvh();
{
m_bvh->~btOptimizedBvh();
btAlignedFree(m_bvh);
}
///m_localAabbMin/m_localAabbMax is already re-calculated in btTriangleMeshShape. We could just scale aabb, but this needs some more work
void* mem = btAlignedAlloc(sizeof(btOptimizedBvh),16);
m_bvh = new(mem) btOptimizedBvh();
//rebuild the bvh...
m_bvh->build(m_meshInterface,m_useQuantizedAabbCompression,m_localAabbMin,m_localAabbMax);
m_ownsBvh = true;
} }
} }
void btBvhTriangleMeshShape::buildOptimizedBvh()
{
if (m_ownsBvh)
{
m_bvh->~btOptimizedBvh();
btAlignedFree(m_bvh);
}
///m_localAabbMin/m_localAabbMax is already re-calculated in btTriangleMeshShape. We could just scale aabb, but this needs some more work
void* mem = btAlignedAlloc(sizeof(btOptimizedBvh),16);
m_bvh = new(mem) btOptimizedBvh();
//rebuild the bvh...
m_bvh->build(m_meshInterface,m_useQuantizedAabbCompression,m_localAabbMin,m_localAabbMax);
m_ownsBvh = true;
}
void btBvhTriangleMeshShape::setOptimizedBvh(btOptimizedBvh* bvh, const btVector3& scaling) void btBvhTriangleMeshShape::setOptimizedBvh(btOptimizedBvh* bvh, const btVector3& scaling)
{ {
btAssert(!m_bvh); btAssert(!m_bvh);

View File

@@ -76,6 +76,8 @@ public:
void setOptimizedBvh(btOptimizedBvh* bvh, const btVector3& localScaling=btVector3(1,1,1)); void setOptimizedBvh(btOptimizedBvh* bvh, const btVector3& localScaling=btVector3(1,1,1));
void buildOptimizedBvh();
bool usesQuantizedAabbCompression() const bool usesQuantizedAabbCompression() const
{ {
return m_useQuantizedAabbCompression; return m_useQuantizedAabbCompression;