add support for 16bit indices and 3-float vertices (instead of btVector3 which is 4float) in
in btTriangleMesh container and ColladaConverter. btTriangleMesh now derives from btTriangleIndexVertexArray, so it can be used for meshes on SPU
This commit is contained in:
@@ -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;tg<meshRef->getTriangles_array().getCount();tg++)
|
||||
{
|
||||
|
||||
@@ -50,6 +50,7 @@ typedef btAlignedObjectArray<btIndexedMesh> 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];
|
||||
|
||||
|
||||
@@ -17,83 +17,99 @@ subject to the following restrictions:
|
||||
#include <assert.h>
|
||||
|
||||
|
||||
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;
|
||||
}
|
||||
@@ -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<btVector3> m_4componentVertices;
|
||||
btAlignedObjectArray<float> m_3componentVertices;
|
||||
@@ -34,89 +37,21 @@ 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());
|
||||
void addTriangle(const btVector3& vertex0,const btVector3& vertex1,const btVector3& vertex2);
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//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;
|
||||
int getNumTriangles() const;
|
||||
|
||||
virtual void preallocateVertices(int numverts){(void) numverts;}
|
||||
virtual void preallocateIndices(int numindices){(void) numindices;}
|
||||
|
||||
Reference in New Issue
Block a user