|
|
@@ -33,47 +33,23 @@
|
|
|
#include "RigidBody.h"
|
|
|
#include "Scene.h"
|
|
|
|
|
|
-#include <BulletCollision/CollisionShapes/btCollisionShape.h>
|
|
|
+#include <BulletCollision/CollisionShapes/btBvhTriangleMeshShape.h>
|
|
|
+#include <BulletCollision/CollisionShapes/btTriangleMesh.h>
|
|
|
#include <hull.h>
|
|
|
|
|
|
-#include "DebugNew.h"
|
|
|
-
|
|
|
-void GetVertexAndIndexData(const Model* model, unsigned lodLevel, SharedArrayPtr<Vector3>& destVertexData, unsigned& destVertexCount,
|
|
|
- SharedArrayPtr<unsigned>& destIndexData, unsigned& destIndexCount, const Vector3& scale)
|
|
|
+TriangleMeshData::TriangleMeshData(Model* model, unsigned lodLevel, const Vector3& scale) :
|
|
|
+ meshData_(0),
|
|
|
+ shape_(0)
|
|
|
{
|
|
|
+ modelName_ = model->GetName();
|
|
|
+ meshData_ = new btTriangleMesh();
|
|
|
const Vector<Vector<SharedPtr<Geometry> > >& geometries = model->GetGeometries();
|
|
|
|
|
|
- destVertexCount = 0;
|
|
|
- destIndexCount = 0;
|
|
|
-
|
|
|
- for (unsigned i = 0; i < geometries.Size(); ++i)
|
|
|
- {
|
|
|
- unsigned subGeometryLodLevel = lodLevel;
|
|
|
- if (subGeometryLodLevel >= geometries[i].Size())
|
|
|
- subGeometryLodLevel = geometries[i].Size() / 2;
|
|
|
-
|
|
|
- Geometry* geom = geometries[i][subGeometryLodLevel];
|
|
|
- if (!geom)
|
|
|
- continue;
|
|
|
-
|
|
|
- destVertexCount += geom->GetVertexCount();
|
|
|
- destIndexCount += geom->GetIndexCount();
|
|
|
- }
|
|
|
-
|
|
|
- if (!destVertexCount || !destIndexCount)
|
|
|
- return;
|
|
|
-
|
|
|
- destVertexData = new Vector3[destVertexCount];
|
|
|
- destIndexData = new unsigned[destIndexCount];
|
|
|
-
|
|
|
- unsigned firstVertex = 0;
|
|
|
- unsigned firstIndex = 0;
|
|
|
-
|
|
|
for (unsigned i = 0; i < geometries.Size(); ++i)
|
|
|
{
|
|
|
unsigned subGeometryLodLevel = lodLevel;
|
|
|
if (subGeometryLodLevel >= geometries[i].Size())
|
|
|
- subGeometryLodLevel = geometries[i].Size() / 2;
|
|
|
+ subGeometryLodLevel = geometries[i].Size() - 1;
|
|
|
|
|
|
Geometry* geom = geometries[i][subGeometryLodLevel];
|
|
|
if (!geom)
|
|
|
@@ -88,16 +64,6 @@ void GetVertexAndIndexData(const Model* model, unsigned lodLevel, SharedArrayPtr
|
|
|
if (!vertexData || !indexData)
|
|
|
continue;
|
|
|
|
|
|
- unsigned vertexStart = geom->GetVertexStart();
|
|
|
- unsigned vertexCount = geom->GetVertexCount();
|
|
|
-
|
|
|
- // Copy vertex data
|
|
|
- for (unsigned j = 0; j < vertexCount; ++j)
|
|
|
- {
|
|
|
- const Vector3& v = *((const Vector3*)(&vertexData[(vertexStart + j) * vertexSize]));
|
|
|
- destVertexData[firstVertex + j] = scale * v;
|
|
|
- }
|
|
|
-
|
|
|
unsigned indexStart = geom->GetIndexStart();
|
|
|
unsigned indexCount = geom->GetIndexCount();
|
|
|
|
|
|
@@ -106,12 +72,12 @@ void GetVertexAndIndexData(const Model* model, unsigned lodLevel, SharedArrayPtr
|
|
|
{
|
|
|
const unsigned short* indices = (const unsigned short*)indexData;
|
|
|
|
|
|
- for (unsigned j = 0; j < indexCount; j += 3)
|
|
|
+ for (unsigned j = indexStart; j < indexStart + indexCount; j += 3)
|
|
|
{
|
|
|
- // Rebase the indices according to our vertex numbering
|
|
|
- destIndexData[firstIndex + j] = indices[indexStart + j] - vertexStart + firstVertex;
|
|
|
- destIndexData[firstIndex + j + 1] = indices[indexStart + j + 1] - vertexStart + firstVertex;
|
|
|
- destIndexData[firstIndex + j + 2] = indices[indexStart + j + 2] - vertexStart + firstVertex;
|
|
|
+ const Vector3& v0 = *((const Vector3*)(&vertexData[indices[j] * vertexSize]));
|
|
|
+ const Vector3& v1 = *((const Vector3*)(&vertexData[indices[j + 1] * vertexSize]));
|
|
|
+ const Vector3& v2 = *((const Vector3*)(&vertexData[indices[j + 2] * vertexSize]));
|
|
|
+ meshData_->addTriangle(ToBtVector3(scale * v0), ToBtVector3(scale * v1), ToBtVector3(scale * v2), true);
|
|
|
}
|
|
|
}
|
|
|
// 32-bit indices
|
|
|
@@ -119,69 +85,91 @@ void GetVertexAndIndexData(const Model* model, unsigned lodLevel, SharedArrayPtr
|
|
|
{
|
|
|
const unsigned* indices = (const unsigned*)indexData;
|
|
|
|
|
|
- for (unsigned j = 0; j < indexCount; j += 3)
|
|
|
+ for (unsigned j = indexStart; j < indexStart + indexCount; j += 3)
|
|
|
{
|
|
|
- // Rebase the indices according to our vertex numbering
|
|
|
- destIndexData[firstIndex + j] = indices[indexStart + j] - vertexStart + firstVertex;
|
|
|
- destIndexData[firstIndex + j + 1] = indices[indexStart + j + 1] - vertexStart + firstVertex;
|
|
|
- destIndexData[firstIndex + j + 2] = indices[indexStart + j + 2] - vertexStart + firstVertex;
|
|
|
+ const Vector3& v0 = *((const Vector3*)(&vertexData[indices[j] * vertexSize]));
|
|
|
+ const Vector3& v1 = *((const Vector3*)(&vertexData[indices[j + 1] * vertexSize]));
|
|
|
+ const Vector3& v2 = *((const Vector3*)(&vertexData[indices[j + 2] * vertexSize]));
|
|
|
+ meshData_->addTriangle(ToBtVector3(scale * v0), ToBtVector3(scale * v1), ToBtVector3(scale * v2), true);
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- firstVertex += vertexCount;
|
|
|
- firstIndex += indexCount;
|
|
|
}
|
|
|
+
|
|
|
+ shape_ = new btBvhTriangleMeshShape(meshData_, true, true);
|
|
|
}
|
|
|
|
|
|
-TriangleMeshData::TriangleMeshData(Model* model, bool makeConvexHull, float thickness, unsigned lodLevel, const Vector3& scale) :
|
|
|
- indexCount_(0)
|
|
|
+TriangleMeshData::~TriangleMeshData()
|
|
|
+{
|
|
|
+ delete shape_;
|
|
|
+ shape_ = 0;
|
|
|
+
|
|
|
+ delete meshData_;
|
|
|
+ meshData_ = 0;
|
|
|
+}
|
|
|
+
|
|
|
+ConvexHullData::ConvexHullData(Model* model, unsigned lodLevel, float thickness, const Vector3& scale)
|
|
|
{
|
|
|
modelName_ = model->GetName();
|
|
|
+ const Vector<Vector<SharedPtr<Geometry> > >& geometries = model->GetGeometries();
|
|
|
|
|
|
- unsigned vertexCount;
|
|
|
- unsigned indexCount;
|
|
|
+ PODVector<Vector3> originalVertices;
|
|
|
|
|
|
- if (!makeConvexHull)
|
|
|
- GetVertexAndIndexData(model, lodLevel, vertexData_, vertexCount, indexData_, indexCount, scale);
|
|
|
- else
|
|
|
+ for (unsigned i = 0; i < geometries.Size(); ++i)
|
|
|
{
|
|
|
- SharedArrayPtr<Vector3> originalVertices;
|
|
|
- SharedArrayPtr<unsigned> originalIndices;
|
|
|
- unsigned originalVertexCount;
|
|
|
- unsigned originalIndexCount;
|
|
|
+ unsigned subGeometryLodLevel = lodLevel;
|
|
|
+ if (subGeometryLodLevel >= geometries[i].Size())
|
|
|
+ subGeometryLodLevel = geometries[i].Size() - 1;
|
|
|
+
|
|
|
+ Geometry* geom = geometries[i][subGeometryLodLevel];
|
|
|
+ if (!geom)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ const unsigned char* vertexData;
|
|
|
+ const unsigned char* indexData;
|
|
|
+ unsigned vertexSize;
|
|
|
+ unsigned indexSize;
|
|
|
+
|
|
|
+ geom->GetRawData(vertexData, vertexSize, indexData, indexSize);
|
|
|
+ if (!vertexData || !indexData)
|
|
|
+ continue;
|
|
|
|
|
|
- GetVertexAndIndexData(model, lodLevel, originalVertices, originalVertexCount, originalIndices, originalIndexCount, scale);
|
|
|
+ unsigned vertexStart = geom->GetVertexStart();
|
|
|
+ unsigned vertexCount = geom->GetVertexCount();
|
|
|
|
|
|
+ // Copy vertex data
|
|
|
+ for (unsigned j = 0; j < vertexCount; ++j)
|
|
|
+ {
|
|
|
+ const Vector3& v = *((const Vector3*)(&vertexData[(vertexStart + j) * vertexSize]));
|
|
|
+ originalVertices.Push(scale * v);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (originalVertices.Size())
|
|
|
+ {
|
|
|
// Build the convex hull from the raw geometry
|
|
|
StanHull::HullDesc desc;
|
|
|
desc.SetHullFlag(StanHull::QF_TRIANGLES);
|
|
|
- desc.mVcount = originalVertexCount;
|
|
|
- desc.mVertices = (float*)originalVertices.Get();
|
|
|
+ desc.mVcount = originalVertices.Size();
|
|
|
+ desc.mVertices = originalVertices[0].Data();
|
|
|
desc.mVertexStride = 3 * sizeof(float);
|
|
|
desc.mSkinWidth = thickness;
|
|
|
|
|
|
StanHull::HullLibrary lib;
|
|
|
StanHull::HullResult result;
|
|
|
lib.CreateConvexHull(desc, result);
|
|
|
-
|
|
|
- vertexCount = result.mNumOutputVertices;
|
|
|
- indexCount = result.mNumIndices;
|
|
|
|
|
|
+ vertexCount_ = result.mNumOutputVertices;
|
|
|
+ vertexData_ = new Vector3[vertexCount_];
|
|
|
// Copy vertex data
|
|
|
- vertexData_ = new Vector3[vertexCount];
|
|
|
- memcpy(vertexData_.Get(), result.mOutputVertices, vertexCount * sizeof(Vector3));
|
|
|
-
|
|
|
- // Copy index data
|
|
|
- indexData_ = new unsigned[indexCount];
|
|
|
- memcpy(indexData_.Get(), result.mIndices, indexCount * sizeof(unsigned));
|
|
|
+ memcpy(vertexData_.Get(), result.mOutputVertices, vertexCount_ * sizeof(Vector3));
|
|
|
|
|
|
lib.ReleaseResult(result);
|
|
|
}
|
|
|
-
|
|
|
- indexCount_ = indexCount;
|
|
|
+ else
|
|
|
+ vertexCount_ = 0;
|
|
|
}
|
|
|
|
|
|
-TriangleMeshData::~TriangleMeshData()
|
|
|
+ConvexHullData::~ConvexHullData()
|
|
|
{
|
|
|
}
|
|
|
|