Don't search for duplicate vertices by default in btTriangleMesh, it is just too slow.

See http://code.google.com/p/bullet/issues/detail?id=122
This commit is contained in:
erwin.coumans
2008-10-30 22:09:04 +00:00
parent badd638901
commit f49e44b13c
2 changed files with 25 additions and 19 deletions

View File

@@ -74,17 +74,21 @@ void btTriangleMesh::addIndex(int index)
}
}
int btTriangleMesh::findOrAddVertex(const btVector3& vertex)
int btTriangleMesh::findOrAddVertex(const btVector3& vertex, bool removeDuplicateVertices)
{
//return index of new/existing vertex
//todo: could use acceleration structure for this
if (m_use4componentVertices)
{
for (int i=0;i< m_4componentVertices.size();i++)
{
if ((m_4componentVertices[i]-vertex).length2() <= m_weldingThreshold)
if (removeDuplicateVertices)
{
return i;
for (int i=0;i< m_4componentVertices.size();i++)
{
if ((m_4componentVertices[i]-vertex).length2() <= m_weldingThreshold)
{
return i;
}
}
}
m_indexedMeshes[0].m_numVertices++;
@@ -96,14 +100,17 @@ int btTriangleMesh::findOrAddVertex(const btVector3& vertex)
} else
{
for (int i=0;i< m_3componentVertices.size();i+=3)
if (removeDuplicateVertices)
{
btVector3 vtx(m_3componentVertices[i],m_3componentVertices[i+1],m_3componentVertices[i+2]);
if ((vtx-vertex).length2() <= m_weldingThreshold)
for (int i=0;i< m_3componentVertices.size();i+=3)
{
return i/3;
btVector3 vtx(m_3componentVertices[i],m_3componentVertices[i+1],m_3componentVertices[i+2]);
if ((vtx-vertex).length2() <= m_weldingThreshold)
{
return i/3;
}
}
}
}
m_3componentVertices.push_back(vertex.getX());
m_3componentVertices.push_back(vertex.getY());
m_3componentVertices.push_back(vertex.getZ());
@@ -114,13 +121,12 @@ int btTriangleMesh::findOrAddVertex(const btVector3& vertex)
}
void btTriangleMesh::addTriangle(const btVector3& vertex0,const btVector3& vertex1,const btVector3& vertex2)
void btTriangleMesh::addTriangle(const btVector3& vertex0,const btVector3& vertex1,const btVector3& vertex2,bool removeDuplicateVertices)
{
m_indexedMeshes[0].m_numTriangles++;
addIndex(findOrAddVertex(vertex0));
addIndex(findOrAddVertex(vertex1));
addIndex(findOrAddVertex(vertex2));
addIndex(findOrAddVertex(vertex0,removeDuplicateVertices));
addIndex(findOrAddVertex(vertex1,removeDuplicateVertices));
addIndex(findOrAddVertex(vertex2,removeDuplicateVertices));
}
int btTriangleMesh::getNumTriangles() const

View File

@@ -25,7 +25,6 @@ subject to the following restrictions:
///It allows either 32bit or 16bit indices, and 4 (x-y-z-w) or 3 (x-y-z) component vertices.
///If you want to share triangle/index data between graphics mesh and collision mesh (btBvhTriangleMeshShape), you can directly use btTriangleIndexVertexArray or derive your own class from btStridingMeshInterface.
///Performance of btTriangleMesh and btTriangleIndexVertexArray used in a btBvhTriangleMeshShape is the same.
///It has a brute-force option to weld together closeby vertices.
class btTriangleMesh : public btTriangleIndexVertexArray
{
btAlignedObjectArray<btVector3> m_4componentVertices;
@@ -42,7 +41,7 @@ class btTriangleMesh : public btTriangleIndexVertexArray
btTriangleMesh (bool use32bitIndices=true,bool use4componentVertices=true);
int findOrAddVertex(const btVector3& vertex);
int findOrAddVertex(const btVector3& vertex, bool removeDuplicateVertices);
void addIndex(int index);
bool getUse32bitIndices() const
@@ -54,8 +53,9 @@ class btTriangleMesh : public btTriangleIndexVertexArray
{
return m_use4componentVertices;
}
void addTriangle(const btVector3& vertex0,const btVector3& vertex1,const btVector3& vertex2);
///By default addTriangle won't search for duplicate vertices, because the search is very slow for large triangle meshes.
///In general it is better to directly use btTriangleIndexVertexArray instead.
void addTriangle(const btVector3& vertex0,const btVector3& vertex1,const btVector3& vertex2, bool removeDuplicateVertices=false);
int getNumTriangles() const;