From 7c4ada995344cd1fc7905a734f95828a1d973f40 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Thu, 26 Mar 2015 06:37:05 -0700 Subject: [PATCH] multiply points from fbs meshes by their transformation matrices --- tools/vhacd/src/VHACDUtil.cpp | 89 +++++++++++++++++++++++++++++++++-- tools/vhacd/src/VHACDUtil.h | 2 + 2 files changed, 87 insertions(+), 4 deletions(-) diff --git a/tools/vhacd/src/VHACDUtil.cpp b/tools/vhacd/src/VHACDUtil.cpp index c98a095f47..4f2cb0e2b8 100644 --- a/tools/vhacd/src/VHACDUtil.cpp +++ b/tools/vhacd/src/VHACDUtil.cpp @@ -44,7 +44,13 @@ bool vhacd::VHACDUtil::loadFBX(const QString filename, vhacd::LoadFBXResults *re int count = 0; foreach(FBXMesh mesh, geometry.meshes) { //get vertices for each mesh - QVector vertices = mesh.vertices; + // QVector vertices = mesh.vertices; + + + QVector vertices; + foreach (glm::vec3 vertex, mesh.vertices) { + vertices.append(glm::vec3(mesh.modelTransform * glm::vec4(vertex, 1.0f))); + } //get the triangle indices for each mesh QVector triangles; @@ -73,9 +79,86 @@ bool vhacd::VHACDUtil::loadFBX(const QString filename, vhacd::LoadFBXResults *re return true; } + +void vhacd::VHACDUtil::combineMeshes(vhacd::LoadFBXResults *meshes, vhacd::LoadFBXResults *results) const { + float largestDimension = 0; + int indexStart = 0; + + QVector emptyVertices; + QVector emptyTriangles; + results->perMeshVertices.append(emptyVertices); + results->perMeshTriangleIndices.append(emptyTriangles); + results->perMeshLargestDimension.append(largestDimension); + + for (int i = 0; i < meshes->meshCount; i++) { + QVector vertices = meshes->perMeshVertices.at(i); + QVector triangles = meshes->perMeshTriangleIndices.at(i); + const float largestDimension = meshes->perMeshLargestDimension.at(i); + + for (int j = 0; j < triangles.size(); j++) { + triangles[ j ] += indexStart; + } + indexStart += vertices.size(); + + results->perMeshVertices[0] << vertices; + results->perMeshTriangleIndices[0] << triangles; + if (results->perMeshLargestDimension[0] < largestDimension) { + results->perMeshLargestDimension[0] = largestDimension; + } + } + + results->meshCount = 1; +} + + +void vhacd::VHACDUtil::fattenMeshes(vhacd::LoadFBXResults *meshes, vhacd::LoadFBXResults *results) const { + + for (int i = 0; i < meshes->meshCount; i++) { + QVector vertices = meshes->perMeshVertices.at(i); + QVector triangles = meshes->perMeshTriangleIndices.at(i); + const float largestDimension = meshes->perMeshLargestDimension.at(i); + + results->perMeshVertices.append(vertices); + results->perMeshTriangleIndices.append(triangles); + results->perMeshLargestDimension.append(largestDimension); + + for (int j = 0; j < triangles.size(); j += 3) { + auto p0 = vertices[triangles[j]]; + auto p1 = vertices[triangles[j+1]]; + auto p2 = vertices[triangles[j+2]]; + + auto d0 = p1 - p0; + auto d1 = p2 - p0; + + auto cp = glm::cross(d0, d1); + cp = 5.0f * glm::normalize(cp); + + auto p3 = p0 + cp; + auto p4 = p1 + cp; + auto p5 = p2 + cp; + + auto n = results->perMeshVertices.size(); + results->perMeshVertices[i] << p3 << p4 << p5; + results->perMeshTriangleIndices[i] << n << n+1 << n+2; + } + + results->meshCount++; + } +} + + + bool vhacd::VHACDUtil::computeVHACD(vhacd::LoadFBXResults *meshes, VHACD::IVHACD::Parameters params, vhacd::ComputeResults *results, int startMeshIndex, int endMeshIndex, float minimumMeshSize) const { + + // vhacd::LoadFBXResults *meshes = new vhacd::LoadFBXResults; + // combineMeshes(inMeshes, meshes); + + // vhacd::LoadFBXResults *meshes = new vhacd::LoadFBXResults; + // fattenMeshes(inMeshes, meshes); + + VHACD::IVHACD * interfaceVHACD = VHACD::CreateVHACD(); int meshCount = meshes->meshCount; int count = 0; @@ -99,7 +182,7 @@ bool vhacd::VHACDUtil::computeVHACD(vhacd::LoadFBXResults *meshes, VHACD::IVHACD qDebug() << "Mesh " << i << " -- " << nPoints << " points, " << nTriangles << " triangles, " << "size =" << largestDimension; - if (largestDimension < minimumMeshSize || largestDimension > 1000) { + if (largestDimension < minimumMeshSize /* || largestDimension > 1000 */) { qDebug() << " Skipping..."; continue; } @@ -135,8 +218,6 @@ bool vhacd::VHACDUtil::computeVHACD(vhacd::LoadFBXResults *meshes, VHACD::IVHACD m_triangles_copy[ i ] = hull.m_triangles[ i ]; } hull.m_triangles = m_triangles_copy; - - convexHulls.append(hull); } results->convexHullList.append(convexHulls); diff --git a/tools/vhacd/src/VHACDUtil.h b/tools/vhacd/src/VHACDUtil.h index 304a7a2c5d..fd5d253334 100644 --- a/tools/vhacd/src/VHACDUtil.h +++ b/tools/vhacd/src/VHACDUtil.h @@ -40,6 +40,8 @@ namespace vhacd { class VHACDUtil { public: bool loadFBX(const QString filename, vhacd::LoadFBXResults *results); + void combineMeshes(vhacd::LoadFBXResults *meshes, vhacd::LoadFBXResults *results) const; + void fattenMeshes(vhacd::LoadFBXResults *meshes, vhacd::LoadFBXResults *results) const; bool computeVHACD(vhacd::LoadFBXResults *meshes, VHACD::IVHACD::Parameters params, vhacd::ComputeResults *results, int startMeshIndex, int endMeshIndex, float minimumMeshSize) const; ~VHACDUtil();