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:
@@ -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
|
//return index of new/existing vertex
|
||||||
//todo: could use acceleration structure for this
|
//todo: could use acceleration structure for this
|
||||||
if (m_use4componentVertices)
|
if (m_use4componentVertices)
|
||||||
{
|
{
|
||||||
for (int i=0;i< m_4componentVertices.size();i++)
|
if (removeDuplicateVertices)
|
||||||
{
|
|
||||||
if ((m_4componentVertices[i]-vertex).length2() <= m_weldingThreshold)
|
|
||||||
{
|
{
|
||||||
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++;
|
m_indexedMeshes[0].m_numVertices++;
|
||||||
@@ -96,14 +100,17 @@ int btTriangleMesh::findOrAddVertex(const btVector3& vertex)
|
|||||||
} else
|
} 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]);
|
for (int i=0;i< m_3componentVertices.size();i+=3)
|
||||||
if ((vtx-vertex).length2() <= m_weldingThreshold)
|
|
||||||
{
|
{
|
||||||
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.getX());
|
||||||
m_3componentVertices.push_back(vertex.getY());
|
m_3componentVertices.push_back(vertex.getY());
|
||||||
m_3componentVertices.push_back(vertex.getZ());
|
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++;
|
m_indexedMeshes[0].m_numTriangles++;
|
||||||
|
addIndex(findOrAddVertex(vertex0,removeDuplicateVertices));
|
||||||
addIndex(findOrAddVertex(vertex0));
|
addIndex(findOrAddVertex(vertex1,removeDuplicateVertices));
|
||||||
addIndex(findOrAddVertex(vertex1));
|
addIndex(findOrAddVertex(vertex2,removeDuplicateVertices));
|
||||||
addIndex(findOrAddVertex(vertex2));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int btTriangleMesh::getNumTriangles() const
|
int btTriangleMesh::getNumTriangles() const
|
||||||
|
|||||||
@@ -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.
|
///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.
|
///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.
|
///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
|
class btTriangleMesh : public btTriangleIndexVertexArray
|
||||||
{
|
{
|
||||||
btAlignedObjectArray<btVector3> m_4componentVertices;
|
btAlignedObjectArray<btVector3> m_4componentVertices;
|
||||||
@@ -42,7 +41,7 @@ class btTriangleMesh : public btTriangleIndexVertexArray
|
|||||||
|
|
||||||
btTriangleMesh (bool use32bitIndices=true,bool use4componentVertices=true);
|
btTriangleMesh (bool use32bitIndices=true,bool use4componentVertices=true);
|
||||||
|
|
||||||
int findOrAddVertex(const btVector3& vertex);
|
int findOrAddVertex(const btVector3& vertex, bool removeDuplicateVertices);
|
||||||
void addIndex(int index);
|
void addIndex(int index);
|
||||||
|
|
||||||
bool getUse32bitIndices() const
|
bool getUse32bitIndices() const
|
||||||
@@ -54,8 +53,9 @@ class btTriangleMesh : public btTriangleIndexVertexArray
|
|||||||
{
|
{
|
||||||
return m_use4componentVertices;
|
return m_use4componentVertices;
|
||||||
}
|
}
|
||||||
|
///By default addTriangle won't search for duplicate vertices, because the search is very slow for large triangle meshes.
|
||||||
void addTriangle(const btVector3& vertex0,const btVector3& vertex1,const btVector3& vertex2);
|
///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;
|
int getNumTriangles() const;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user