diff --git a/Extras/BulletColladaConverter/ColladaConverter.cpp b/Extras/BulletColladaConverter/ColladaConverter.cpp index 6780d18f0..f5dc0c974 100644 --- a/Extras/BulletColladaConverter/ColladaConverter.cpp +++ b/Extras/BulletColladaConverter/ColladaConverter.cpp @@ -2693,9 +2693,8 @@ void ColladaConverter::ConvertRigidBodyRef( btRigidBodyInput& rbInput,btRigidBod if (meshRef->getTriangles_array().getCount()) { - btTriangleMesh* trimesh = new btTriangleMesh(); - trimesh->setUse32bitIndices(m_use32bitIndices); - trimesh->setUse4componentVertices(m_use4componentVertices); + btTriangleMesh* trimesh = new btTriangleMesh(m_use32bitIndices,m_use4componentVertices); + for (unsigned int tg = 0;tggetTriangles_array().getCount();tg++) { diff --git a/src/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.h b/src/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.h index 9d8ec50de..0ca7234c2 100644 --- a/src/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.h +++ b/src/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.h @@ -50,6 +50,7 @@ typedef btAlignedObjectArray IndexedMeshArray; ///So keep those arrays around during the lifetime of this btTriangleIndexVertexArray. ATTRIBUTE_ALIGNED16( class) btTriangleIndexVertexArray : public btStridingMeshInterface { +protected: IndexedMeshArray m_indexedMeshes; int m_pad[3]; diff --git a/src/BulletCollision/CollisionShapes/btTriangleMesh.cpp b/src/BulletCollision/CollisionShapes/btTriangleMesh.cpp index 1f2e20344..3a16a684f 100644 --- a/src/BulletCollision/CollisionShapes/btTriangleMesh.cpp +++ b/src/BulletCollision/CollisionShapes/btTriangleMesh.cpp @@ -17,83 +17,99 @@ subject to the following restrictions: #include -btTriangleMesh::btTriangleMesh () -:m_use32bitIndices(true), -m_use4componentVertices(true) +btTriangleMesh::btTriangleMesh (bool use32bitIndices,bool use4componentVertices) +:m_use32bitIndices(use32bitIndices), +m_use4componentVertices(use4componentVertices) { + btIndexedMesh meshIndex; + meshIndex.m_numTriangles = 0; + meshIndex.m_numVertices = 0; + meshIndex.m_indexType = PHY_INTEGER; + meshIndex.m_triangleIndexBase = 0; + meshIndex.m_triangleIndexStride = 3*sizeof(int); + meshIndex.m_vertexBase = 0; + meshIndex.m_vertexStride = sizeof(btVector3); + m_indexedMeshes.push_back(meshIndex); + + if (m_use32bitIndices) + { + m_indexedMeshes[0].m_numTriangles = m_32bitIndices.size()/3; + m_indexedMeshes[0].m_triangleIndexBase = (unsigned char*) &m_32bitIndices[0]; + m_indexedMeshes[0].m_indexType = PHY_INTEGER; + m_indexedMeshes[0].m_triangleIndexStride = 3*sizeof(int); + } else + { + m_indexedMeshes[0].m_numTriangles = m_16bitIndices.size()/3; + m_indexedMeshes[0].m_triangleIndexBase = (unsigned char*) &m_16bitIndices[0]; + m_indexedMeshes[0].m_indexType = PHY_SHORT; + m_indexedMeshes[0].m_triangleIndexStride = 3*sizeof(short int); + } + + if (m_use4componentVertices) + { + m_indexedMeshes[0].m_numVertices = m_4componentVertices.size(); + m_indexedMeshes[0].m_vertexBase = (unsigned char*)&m_4componentVertices[0]; + m_indexedMeshes[0].m_vertexStride = sizeof(btVector3); + } else + { + m_indexedMeshes[0].m_numVertices = m_3componentVertices.size()/3; + m_indexedMeshes[0].m_vertexBase = (unsigned char*)&m_3componentVertices[0]; + m_indexedMeshes[0].m_vertexStride = 3*sizeof(btScalar); + } + } -void btTriangleMesh::getLockedVertexIndexBase(unsigned char **vertexbase, int& numverts,PHY_ScalarType& type, int& stride,unsigned char **indexbase,int & indexstride,int& numfaces,PHY_ScalarType& indicestype,int subpart) + +void btTriangleMesh::addTriangle(const btVector3& vertex0,const btVector3& vertex1,const btVector3& vertex2) { - (void)subpart; + m_indexedMeshes[0].m_numTriangles++; + m_indexedMeshes[0].m_numVertices+=3; + if (m_use4componentVertices) { - numverts = m_4componentVertices.size(); - *vertexbase = (unsigned char*)&m_4componentVertices[0]; - type = PHY_FLOAT; - stride = sizeof(btVector3); + m_4componentVertices.push_back(vertex0); + m_4componentVertices.push_back(vertex1); + m_4componentVertices.push_back(vertex2); + m_indexedMeshes[0].m_vertexBase = (unsigned char*)&m_4componentVertices[0]; } else { - numverts = m_3componentVertices.size(); - *vertexbase = (unsigned char*)&m_3componentVertices[0]; - type = PHY_FLOAT; - stride = 3*sizeof(btScalar); + m_3componentVertices.push_back(vertex0.getX()); + m_3componentVertices.push_back(vertex0.getY()); + m_3componentVertices.push_back(vertex0.getZ()); + + m_3componentVertices.push_back(vertex1.getX()); + m_3componentVertices.push_back(vertex1.getY()); + m_3componentVertices.push_back(vertex1.getZ()); + + m_3componentVertices.push_back(vertex2.getX()); + m_3componentVertices.push_back(vertex2.getY()); + m_3componentVertices.push_back(vertex2.getZ()); + m_indexedMeshes[0].m_vertexBase = (unsigned char*)&m_3componentVertices[0]; } if (m_use32bitIndices) { - numfaces = m_32bitIndices.size()/3; - *indexbase = (unsigned char*) &m_32bitIndices[0]; - indicestype = PHY_INTEGER; - indexstride = 3*sizeof(int); + int curIndex = m_32bitIndices.size(); + m_32bitIndices.push_back(curIndex++); + m_32bitIndices.push_back(curIndex++); + m_32bitIndices.push_back(curIndex++); + m_indexedMeshes[0].m_triangleIndexBase = (unsigned char*) &m_32bitIndices[0]; } else { - numfaces = m_16bitIndices.size()/3; - *indexbase = (unsigned char*) &m_16bitIndices[0]; - indicestype = PHY_SHORT; - indexstride = 3*sizeof(short int); + int curIndex = m_16bitIndices.size(); + m_16bitIndices.push_back(curIndex++); + m_16bitIndices.push_back(curIndex++); + m_16bitIndices.push_back(curIndex++); + m_indexedMeshes[0].m_triangleIndexBase = (unsigned char*) &m_16bitIndices[0]; } - } -void btTriangleMesh::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) const +int btTriangleMesh::getNumTriangles() const { - (void)subpart; - - if (m_use4componentVertices) - { - numverts = m_4componentVertices.size(); - *vertexbase = (unsigned char*)&m_4componentVertices[0]; - type = PHY_FLOAT; - stride = sizeof(btVector3); - } else - { - numverts = m_3componentVertices.size(); - *vertexbase = (unsigned char*)&m_3componentVertices[0]; - type = PHY_FLOAT; - stride = 3*sizeof(btScalar); - } - - if (m_use32bitIndices) { - numfaces = m_32bitIndices.size()/3; - *indexbase = (unsigned char*) &m_32bitIndices[0]; - indicestype = PHY_INTEGER; - indexstride = 3*sizeof(int); - } else - { - numfaces = m_16bitIndices.size()/3; - *indexbase = (unsigned char*) &m_16bitIndices[0]; - indicestype = PHY_SHORT; - indexstride = 3*sizeof(short int); + return m_32bitIndices.size() / 3; } -} - - - -int btTriangleMesh::getNumSubParts() const -{ - return 1; -} + return m_16bitIndices.size() / 3; +} \ No newline at end of file diff --git a/src/BulletCollision/CollisionShapes/btTriangleMesh.h b/src/BulletCollision/CollisionShapes/btTriangleMesh.h index f7ee2cf91..f4d2eb3a1 100644 --- a/src/BulletCollision/CollisionShapes/btTriangleMesh.h +++ b/src/BulletCollision/CollisionShapes/btTriangleMesh.h @@ -17,12 +17,15 @@ subject to the following restrictions: #ifndef TRIANGLE_MESH_H #define TRIANGLE_MESH_H -#include "btStridingMeshInterface.h" +#include "btTriangleIndexVertexArray.h" #include "LinearMath/btVector3.h" #include "LinearMath/btAlignedObjectArray.h" -///TriangleMesh provides storage for a concave triangle mesh. It can be used as data for the btTriangleMeshShape. -class btTriangleMesh : public btStridingMeshInterface +///btTriangleMesh provides storage for a concave triangle mesh. It can be used as data for the btTriangleMeshShape. +///It allows either 32bit or 16bit indices, and 4 (x-y-z-w) or 3 (x-y-z) component vertices. +///btTriangleMesh will duplicate/keep all mesh data. +///If you prefer, you can avoid using btTriangleMesh and directly use btTriangleIndexVertexArray or derive your own class from btStridingMeshInterface. This allows to share render and collision meshes. +class btTriangleMesh : public btTriangleIndexVertexArray { btAlignedObjectArray m_4componentVertices; btAlignedObjectArray m_3componentVertices; @@ -34,90 +37,22 @@ class btTriangleMesh : public btStridingMeshInterface public: - btTriangleMesh (); + btTriangleMesh (bool use32bitIndices=true,bool use4componentVertices=true); - void setUse32bitIndices(bool use32bitIndices) - { - m_use32bitIndices = use32bitIndices; - } bool getUse32bitIndices() const { return m_use32bitIndices; } - void setUse4componentVertices(bool use4componentVertices) - { - m_use4componentVertices = use4componentVertices; - } bool getUse4componentVertices() const { return m_use4componentVertices; } - void addTriangle(const btVector3& vertex0,const btVector3& vertex1,const btVector3& vertex2) - { - if (m_use4componentVertices) - { - m_4componentVertices.push_back(vertex0); - m_4componentVertices.push_back(vertex1); - m_4componentVertices.push_back(vertex2); - } else - { - m_3componentVertices.push_back(vertex0.getX()); - m_3componentVertices.push_back(vertex0.getY()); - m_3componentVertices.push_back(vertex0.getZ()); - - m_3componentVertices.push_back(vertex1.getX()); - m_3componentVertices.push_back(vertex1.getY()); - m_3componentVertices.push_back(vertex1.getZ()); - - m_3componentVertices.push_back(vertex2.getX()); - m_3componentVertices.push_back(vertex2.getY()); - m_3componentVertices.push_back(vertex2.getZ()); - } - - if (m_use32bitIndices) - { - int curIndex = m_32bitIndices.size(); - m_32bitIndices.push_back(curIndex++); - m_32bitIndices.push_back(curIndex++); - m_32bitIndices.push_back(curIndex++); - } else - { - int curIndex = m_16bitIndices.size(); - m_16bitIndices.push_back(curIndex++); - m_16bitIndices.push_back(curIndex++); - m_16bitIndices.push_back(curIndex++); - } - } - - int getNumTriangles() const - { - if (m_use32bitIndices) - { - return m_32bitIndices.size() / 3; - } - return m_16bitIndices.size() / 3; - } - + void addTriangle(const btVector3& vertex0,const btVector3& vertex1,const btVector3& vertex2); + int getNumTriangles() const; -//StridingMeshInterface interface implementation - - virtual void getLockedVertexIndexBase(unsigned char **vertexbase, int& numverts,PHY_ScalarType& type, int& stride,unsigned char **indexbase,int & indexstride,int& numfaces,PHY_ScalarType& indicestype,int subpart=0); - - 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; - - /// unLockVertexBase finishes the access to a subpart of the triangle mesh - /// make a call to unLockVertexBase when the read and write access (using getLockedVertexIndexBase) is finished - virtual void unLockVertexBase(int subpart) {(void) subpart;} - - virtual void unLockReadOnlyVertexBase(int subpart) const { (void) subpart;} - - /// getNumSubParts returns the number of seperate subparts - /// each subpart has a continuous array of vertices and indices - virtual int getNumSubParts() const; - virtual void preallocateVertices(int numverts){(void) numverts;} virtual void preallocateIndices(int numindices){(void) numindices;}