From f655eff89f5116f33ec8e93ecf8b11d81a3148b4 Mon Sep 17 00:00:00 2001 From: "erwin.coumans" Date: Fri, 29 Aug 2008 05:39:17 +0000 Subject: [PATCH] add support for premade aabb in btStridingMeshInterface/btBvhTriangleMeshShape, Thanks Roy Eltham, http://code.google.com/p/bullet/issues/detail?id=70 --- .../CollisionShapes/btBvhTriangleMeshShape.cpp | 9 ++++++++- .../CollisionShapes/btStridingMeshInterface.h | 4 ++++ .../btTriangleIndexVertexArray.cpp | 18 ++++++++++++++++++ .../btTriangleIndexVertexArray.h | 12 +++++++++--- .../CollisionShapes/btTriangleMeshShape.cpp | 9 ++++++++- 5 files changed, 47 insertions(+), 5 deletions(-) diff --git a/src/BulletCollision/CollisionShapes/btBvhTriangleMeshShape.cpp b/src/BulletCollision/CollisionShapes/btBvhTriangleMeshShape.cpp index 5cf50931c..819f6f7f9 100644 --- a/src/BulletCollision/CollisionShapes/btBvhTriangleMeshShape.cpp +++ b/src/BulletCollision/CollisionShapes/btBvhTriangleMeshShape.cpp @@ -30,7 +30,14 @@ m_ownsBvh(false) #ifndef DISABLE_BVH btVector3 bvhAabbMin,bvhAabbMax; - meshInterface->calculateAabbBruteForce(bvhAabbMin,bvhAabbMax); + if(meshInterface->hasPremadeAabb()) + { + meshInterface->getPremadeAabb(&bvhAabbMin, &bvhAabbMax); + } + else + { + meshInterface->calculateAabbBruteForce(bvhAabbMin,bvhAabbMax); + } if (buildBvh) { diff --git a/src/BulletCollision/CollisionShapes/btStridingMeshInterface.h b/src/BulletCollision/CollisionShapes/btStridingMeshInterface.h index 345e774fb..85020dd3f 100644 --- a/src/BulletCollision/CollisionShapes/btStridingMeshInterface.h +++ b/src/BulletCollision/CollisionShapes/btStridingMeshInterface.h @@ -76,6 +76,10 @@ class btStridingMeshInterface virtual void preallocateVertices(int numverts)=0; virtual void preallocateIndices(int numindices)=0; + virtual bool hasPremadeAabb() const { return false; } + virtual void setPremadeAabb(const btVector3& aabbMin, const btVector3& aabbMax ) const {} + virtual void getPremadeAabb(btVector3* aabbMin, btVector3* aabbMax ) const {} + const btVector3& getScaling() const { return m_scaling; } diff --git a/src/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.cpp b/src/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.cpp index f4f938161..8d634a671 100644 --- a/src/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.cpp +++ b/src/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.cpp @@ -76,3 +76,21 @@ void btTriangleIndexVertexArray::getLockedReadOnlyVertexIndexBase(const unsigned indicestype = mesh.m_indexType; } +bool btTriangleIndexVertexArray::hasPremadeAabb() const +{ + return (m_hasAabb == 1); +} + +void btTriangleIndexVertexArray::setPremadeAabb(const btVector3& aabbMin, const btVector3& aabbMax ) +{ + m_aabbMin = aabbMin; + m_aabbMax = aabbMax; + m_hasAabb = 1; // this is intentionally an int see notes in header +} + +void btTriangleIndexVertexArray::getPremadeAabb(btVector3* aabbMin, btVector3* aabbMax ) const +{ + *aabbMin = m_aabbMin; + *aabbMax = m_aabbMax; +} + diff --git a/src/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.h b/src/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.h index a1551460c..e546675f8 100644 --- a/src/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.h +++ b/src/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.h @@ -51,14 +51,16 @@ ATTRIBUTE_ALIGNED16( class) btTriangleIndexVertexArray : public btStridingMeshIn { protected: IndexedMeshArray m_indexedMeshes; - int m_pad[3]; + int m_pad[2]; + int m_hasAabb; // using int instead of bool to maintain alignment + btVector3 m_aabbMin; + btVector3 m_aabbMax; - public: BT_DECLARE_ALIGNED_ALLOCATOR(); - btTriangleIndexVertexArray() + btTriangleIndexVertexArray() : m_hasAabb(0) { } @@ -103,6 +105,10 @@ public: virtual void preallocateVertices(int numverts){(void) numverts;} virtual void preallocateIndices(int numindices){(void) numindices;} + virtual bool hasPremadeAabb() const; + virtual void setPremadeAabb(const btVector3& aabbMin, const btVector3& aabbMax ); + virtual void getPremadeAabb(btVector3* aabbMin, btVector3* aabbMax ) const; + } ; diff --git a/src/BulletCollision/CollisionShapes/btTriangleMeshShape.cpp b/src/BulletCollision/CollisionShapes/btTriangleMeshShape.cpp index 0d390c88b..cd0a00bbd 100644 --- a/src/BulletCollision/CollisionShapes/btTriangleMeshShape.cpp +++ b/src/BulletCollision/CollisionShapes/btTriangleMeshShape.cpp @@ -24,7 +24,14 @@ subject to the following restrictions: btTriangleMeshShape::btTriangleMeshShape(btStridingMeshInterface* meshInterface) : m_meshInterface(meshInterface) { - recalcLocalAabb(); + if(meshInterface->hasPremadeAabb()) + { + meshInterface->getPremadeAabb(&m_localAabbMin, &m_localAabbMax); + } + else + { + recalcLocalAabb(); + } }