Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErwin Coumans <blender@erwincoumans.com>2008-09-26 10:25:35 +0400
committerErwin Coumans <blender@erwincoumans.com>2008-09-26 10:25:35 +0400
commit9d3c77ec6277b28993f76804cd975b3684a304e9 (patch)
tree319f17a31f758acf43df472fde7c35a4a715345b /extern/bullet2
parenta1bef84ea859cf85487d4cac8664402dd86f4465 (diff)
support concave soft bodies, preliminary. could be used for cloth too. need vertex pinning/constraint attach to other objects.
Diffstat (limited to 'extern/bullet2')
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleMesh.cpp86
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleMesh.h8
2 files changed, 59 insertions, 35 deletions
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleMesh.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleMesh.cpp
index bcea97052d6..29d26316316 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleMesh.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleMesh.cpp
@@ -19,7 +19,8 @@ subject to the following restrictions:
btTriangleMesh::btTriangleMesh (bool use32bitIndices,bool use4componentVertices)
:m_use32bitIndices(use32bitIndices),
-m_use4componentVertices(use4componentVertices)
+m_use4componentVertices(use4componentVertices),
+m_weldingThreshold(0.0)
{
btIndexedMesh meshIndex;
meshIndex.m_numTriangles = 0;
@@ -60,49 +61,66 @@ m_use4componentVertices(use4componentVertices)
}
-
-void btTriangleMesh::addTriangle(const btVector3& vertex0,const btVector3& vertex1,const btVector3& vertex2)
+void btTriangleMesh::addIndex(int index)
{
- m_indexedMeshes[0].m_numTriangles++;
- m_indexedMeshes[0].m_numVertices+=3;
-
- if (m_use4componentVertices)
+ if (m_use32bitIndices)
{
- 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];
+ m_32bitIndices.push_back(index);
+ m_indexedMeshes[0].m_triangleIndexBase = (unsigned char*) &m_32bitIndices[0];
} 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());
- m_indexedMeshes[0].m_vertexBase = (unsigned char*)&m_3componentVertices[0];
+ m_16bitIndices.push_back(index);
+ m_indexedMeshes[0].m_triangleIndexBase = (unsigned char*) &m_16bitIndices[0];
}
+}
- if (m_use32bitIndices)
+int btTriangleMesh::findOrAddVertex(const btVector3& vertex)
+{
+ //return index of new/existing vertex
+ //todo: could use acceleration structure for this
+ if (m_use4componentVertices)
{
- 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];
+ 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_4componentVertices.push_back(vertex);
+ m_indexedMeshes[0].m_vertexBase = (unsigned char*)&m_4componentVertices[0];
+
+ return m_4componentVertices.size()-1;
+
} else
{
- short curIndex = static_cast<short>(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];
+
+ for (int i=0;i< m_3componentVertices.size();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());
+ m_indexedMeshes[0].m_numVertices++;
+ m_indexedMeshes[0].m_vertexBase = (unsigned char*)&m_3componentVertices[0];
+ return (m_3componentVertices.size()/3)-1;
}
+
+}
+
+void btTriangleMesh::addTriangle(const btVector3& vertex0,const btVector3& vertex1,const btVector3& vertex2)
+{
+ m_indexedMeshes[0].m_numTriangles++;
+
+ addIndex(findOrAddVertex(vertex0));
+ addIndex(findOrAddVertex(vertex1));
+ addIndex(findOrAddVertex(vertex2));
}
int btTriangleMesh::getNumTriangles() const
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleMesh.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleMesh.h
index e4d41d5ede0..1f51b2f2c87 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleMesh.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleMesh.h
@@ -25,6 +25,7 @@ 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;
@@ -34,11 +35,16 @@ class btTriangleMesh : public btTriangleIndexVertexArray
btAlignedObjectArray<unsigned short int> m_16bitIndices;
bool m_use32bitIndices;
bool m_use4componentVertices;
-
+
public:
+ btScalar m_weldingThreshold;
+
btTriangleMesh (bool use32bitIndices=true,bool use4componentVertices=true);
+ int findOrAddVertex(const btVector3& vertex);
+ void addIndex(int index);
+
bool getUse32bitIndices() const
{
return m_use32bitIndices;