diff --git a/Source/GeometryMappers/imstkTriangleToTetMap.cpp b/Source/GeometryMappers/imstkTriangleToTetMap.cpp index 9631603862de676c7f952ce222c36688787af4f3..262559be0ff80b354feabeb2dccda48972c7ff7a 100644 --- a/Source/GeometryMappers/imstkTriangleToTetMap.cpp +++ b/Source/GeometryMappers/imstkTriangleToTetMap.cpp @@ -58,17 +58,14 @@ TriangleToTetMap::computeTriToTetMap(std::unordered_map<int, int>& triToTetMap) auto tetMesh = std::dynamic_pointer_cast<TetrahedralMesh>(getParentGeometry()); auto surfMesh = std::dynamic_pointer_cast<SurfaceMesh>(getChildGeometry()); - //std::shared_ptr<VecDataArray<double, 3>> tetVerticesPtr = tetMesh->getVertexPositions(); - //const VecDataArray<double, 3>& tetVertices = *tetVerticesPtr; std::shared_ptr<VecDataArray<int, 4>> tetIndicesPtr = tetMesh->getTetrahedraIndices(); const VecDataArray<int, 4>& tetIndices = *tetIndicesPtr; - //std::shared_ptr<VecDataArray<double, 3>> surfVerticesPtr = surfMesh->getVertexPositions(); - //const VecDataArray<double, 3>& surfVertices = *surfVerticesPtr; std::shared_ptr<VecDataArray<int, 3>> surfIndicesPtr = surfMesh->getTriangleIndices(); const VecDataArray<int, 3>& surfIndices = *surfIndicesPtr; - // Brute force + // Hash all the triangles from the surface + std::unordered_map<TriCell, int> triToFaceId; for (int i = 0; i < surfIndices.size(); i++) { const Vec3i& tri = surfIndices[i]; @@ -82,22 +79,30 @@ TriangleToTetMap::computeTriToTetMap(std::unordered_map<int, int>& triToTetMap) // Hash the triangle with the tet mesh ids TriCell cell_a(id0, id1, id2); - // Find the corresponding tet - for (int j = 0; j < tetIndices.size(); j++) - { - const Vec4i& tet = tetIndices[j]; + triToFaceId[cell_a] = i; + } - // For every face of the tet - for (int k = 0; k < 4; k++) + // Hash all the triangles from the tetrahedron faces. Take note of + // collisions + // Find the corresponding tet + for (int i = 0; i < tetIndices.size(); i++) + { + const Vec4i& tet = tetIndices[i]; + + // For every face of the tet + for (int k = 0; k < 4; k++) + { + TriCell cell_b( + tet[facePattern[k][0]], + tet[facePattern[k][1]], + tet[facePattern[k][2]]); + + // If this tet face exists in the map of hashed triangles + auto iter = triToFaceId.find(cell_b); + if (iter != triToFaceId.end()) { - TriCell cell_b( - tet[facePattern[k][0]], - tet[facePattern[k][1]], - tet[facePattern[k][2]]); - if (cell_a == cell_b) - { - triToTetMap[i] = j; - } + const int triId = iter->second; + triToTetMap[triId] = i; // Map tri to tet id } } }