From 56d7c0930652713a41a8dd67f8dedc84f50b31e5 Mon Sep 17 00:00:00 2001 From: epernod Date: Fri, 3 Jan 2025 19:11:25 +0100 Subject: [PATCH 1/7] [Mesh] Add example for cutting --- .../Benchmark_01_TriangleCut_plane.scn | 58 +++++++++++++++++++ ...rk_01_TriangleCut_plane.scn.qglviewer.view | 2 + .../Controllers/TriangleCuttingController.inl | 53 +++++++++++------ 3 files changed, 95 insertions(+), 18 deletions(-) create mode 100644 scenes/TopologyBenchmarks/Benchmark_01_TriangleCut_plane.scn create mode 100644 scenes/TopologyBenchmarks/Benchmark_01_TriangleCut_plane.scn.qglviewer.view diff --git a/scenes/TopologyBenchmarks/Benchmark_01_TriangleCut_plane.scn b/scenes/TopologyBenchmarks/Benchmark_01_TriangleCut_plane.scn new file mode 100644 index 0000000..1bd586b --- /dev/null +++ b/scenes/TopologyBenchmarks/Benchmark_01_TriangleCut_plane.scn @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/scenes/TopologyBenchmarks/Benchmark_01_TriangleCut_plane.scn.qglviewer.view b/scenes/TopologyBenchmarks/Benchmark_01_TriangleCut_plane.scn.qglviewer.view new file mode 100644 index 0000000..77a09d8 --- /dev/null +++ b/scenes/TopologyBenchmarks/Benchmark_01_TriangleCut_plane.scn.qglviewer.view @@ -0,0 +1,2 @@ +-4.56984 18.0925 3.09767 +-0.707107 -2.08167e-17 4.93754e-18 0.707107 diff --git a/src/Tearing/Controllers/TriangleCuttingController.inl b/src/Tearing/Controllers/TriangleCuttingController.inl index bf26d7c..f54976c 100644 --- a/src/Tearing/Controllers/TriangleCuttingController.inl +++ b/src/Tearing/Controllers/TriangleCuttingController.inl @@ -455,7 +455,14 @@ void TriangleCuttingController::processCut() sofa::type::vector< TriangleID > triangles_list; sofa::type::vector< EdgeID > edges_list; sofa::type::vector< Real > coords_list; - //m_geometryAlgorithms->computeIntersectedPointsList2(ptA, ptB, triIds[0], triIds[1], triangles_list, edges_list, coords_list); + + std::cout << "ptA: " << ptA << std::endl; + std::cout << "ptB: " << ptB << std::endl; + m_geometryAlgorithms->computeIntersectedPointsList2(ptA, ptB, triIds[0], triIds[1], triangles_list, edges_list, coords_list); + + std::cout << "triangles_list: " << triangles_list << std::endl; + std::cout << "edges_list: " << edges_list << std::endl; + std::cout << "coords_list: " << coords_list << std::endl; std::map < TriangleID, std::vector> > PTA_map; // create map to store point to be added @@ -539,8 +546,14 @@ void TriangleCuttingController::processCut() } - // split path here + std::cout << "m_pointsToAdd: " << m_pointsToAdd.size() << std::endl; + for (auto ptA : m_pointsToAdd) + { + std::cout << ptA->m_uniqueID << " | ancestors: " << ptA->m_ancestors << " | " << ptA->m_coefs << std::endl; + } + + // create the list of new triangles around the inside path std::map < Topology::PointID, type::vector > TTA_map; std::map < Topology::PointID, Topology::PointID> cloneMap; @@ -604,9 +617,9 @@ void TriangleCuttingController::processCut() } } - std::cout << "triangles_list: " << triangles_list << std::endl; - std::cout << "edges_list: " << edges_list << std::endl; - std::cout << "coords_list: " << coords_list << std::endl; + // split path here + if (!d_performCut.getValue()) + return; processSubdividers(); } @@ -639,47 +652,51 @@ void TriangleCuttingController::draw(const core::visual::VisualParams if (!d_drawDebugCut.getValue()) return; + const auto stateLifeCycle = vparams->drawTool()->makeStateLifeCycle(); + sofa::type::RGBAColor colorL = sofa::type::RGBAColor::red(); vparams->drawTool()->drawLine(d_cutPointA.getValue(), d_cutPointB.getValue(), colorL); - std::vector spheresUp, spheresDown;// , float radius, const type::RGBAColor& color + sofa::helper::ReadAccessor x = m_state->read(sofa::core::ConstVecCoordId::position())->getValue(); + + std::vector points; + for (auto ptA : m_pointsToAdd) + { + sofa::type::Vec3 vecG = sofa::type::Vec3(0.0, 0.0, 0.0); + sofa::Size nbr = ptA->m_ancestors.size(); + for (int i = 0; i < nbr; ++i) + { + vecG += x[ptA->m_ancestors[i]] * ptA->m_coefs[i]; + } + points.push_back(vecG); + } + vparams->drawTool()->drawSpheres(points, 0.1, sofa::type::RGBAColor::red()); + std::vector pointsUp, pointsDown; - int cpt = 0; for (auto triSub : m_subviders) { - if (cpt == 20000) - break; - const type::vector& TTAS = triSub->getTrianglesToAdd(); - const type::vector>& PTAS = triSub->getPointsToAdd(); for (unsigned int i = 0; i < TTAS.size(); ++i) { TriangleToAdd* TTA = TTAS[i]; sofa::type::fixed_array triCoords = TTA->m_triCoords; - sofa::type::Vec3 vecG = (triCoords[0] + triCoords[1] + triCoords[2]) / 3;; if (TTA->isUp) { pointsUp.push_back(triCoords[0]); pointsUp.push_back(triCoords[1]); pointsUp.push_back(triCoords[2]); - spheresUp.push_back(vecG); } else { pointsDown.push_back(triCoords[0]); pointsDown.push_back(triCoords[1]); pointsDown.push_back(triCoords[2]); - spheresDown.push_back(vecG); } } - - cpt++; } vparams->drawTool()->drawTriangles(pointsUp, sofa::type::RGBAColor::red()); vparams->drawTool()->drawTriangles(pointsDown, sofa::type::RGBAColor::green()); - vparams->drawTool()->drawSpheres(spheresUp, 0.01, sofa::type::RGBAColor::red()); - vparams->drawTool()->drawSpheres(spheresDown, 0.01, sofa::type::RGBAColor::green()); } From cebe835caecde855b38c78355ae9303146a5f26c Mon Sep 17 00:00:00 2001 From: epernod Date: Mon, 6 Jan 2025 00:49:36 +0100 Subject: [PATCH 2/7] [Topology] Backup dirty but working version of cutting with snapping --- .../Benchmark_01_TriangleCut_plane.scn | 4 +- .../Controllers/TriangleCuttingController.h | 3 + .../Controllers/TriangleCuttingController.inl | 294 ++++++++++++------ 3 files changed, 205 insertions(+), 96 deletions(-) diff --git a/scenes/TopologyBenchmarks/Benchmark_01_TriangleCut_plane.scn b/scenes/TopologyBenchmarks/Benchmark_01_TriangleCut_plane.scn index 1bd586b..cd071c7 100644 --- a/scenes/TopologyBenchmarks/Benchmark_01_TriangleCut_plane.scn +++ b/scenes/TopologyBenchmarks/Benchmark_01_TriangleCut_plane.scn @@ -1,5 +1,5 @@ - + @@ -48,7 +48,7 @@ - + diff --git a/src/Tearing/Controllers/TriangleCuttingController.h b/src/Tearing/Controllers/TriangleCuttingController.h index 1927dcd..9deef8c 100644 --- a/src/Tearing/Controllers/TriangleCuttingController.h +++ b/src/Tearing/Controllers/TriangleCuttingController.h @@ -107,6 +107,9 @@ class TEARING_API TriangleCuttingController : public core::behavior::BaseControl type::vector< TriangleSubdivider*> m_subviders; type::vector< std::shared_ptr > m_pointsToAdd; + + type::vector m_addTriangles; + type::vector m_removedTriangles; }; diff --git a/src/Tearing/Controllers/TriangleCuttingController.inl b/src/Tearing/Controllers/TriangleCuttingController.inl index f54976c..4c45ffe 100644 --- a/src/Tearing/Controllers/TriangleCuttingController.inl +++ b/src/Tearing/Controllers/TriangleCuttingController.inl @@ -417,6 +417,17 @@ void TriangleCuttingController::processSubdividers() } trianglesToRemove.push_back(triSub->getTriangleIdToSplit()); } + + for (auto tri : m_addTriangles) + { + trianglesToAdd.push_back(tri); + } + + for (auto triId : m_removedTriangles) + { + trianglesToRemove.push_back(triId); + } + std::cout << "Nbr trianglesToAdd: " << trianglesToAdd.size() << std::endl; m_topoModifier->addTriangles(trianglesToAdd, _ancestors, _baryCoefs); std::cout << "Nbr trianglesToRemove: " << trianglesToRemove.size() << std::endl; @@ -464,76 +475,98 @@ void TriangleCuttingController::processCut() std::cout << "edges_list: " << edges_list << std::endl; std::cout << "coords_list: " << coords_list << std::endl; - std::map < TriangleID, std::vector> > PTA_map; // create map to store point to be added - //for (auto triId : triangles_list) - //{ - // auto tSplit = new TriangleToSplit(triId, triangles[triId]); - // TTS_map[triId] = tSplit; - //} - - // create points To add + std::map < TriangleID, std::vector > > PTA_map; + std::map < Topology::PointID, Topology::PointID> cloneMap; + SReal snapThreshold = 0.8; + + // create points To add from start/end triangles -> TODO see snap possibility later for (unsigned int i = 0; i < 2; ++i) { - type::vector _coefs; - type::vector _ancestors; + type::vector _coefs = { 0.3333, 0.3333, 0.3333 }; + type::vector _ancestors = { theTris[i][0] , theTris[i][1], theTris[i][2] }; + Topology::PointID uniqID = getUniqueId(theTris[i][0], theTris[i][1], theTris[i][2]); - for (unsigned int j = 0; j < 3; ++j) - { - _ancestors.push_back(theTris[i][j]); - _coefs.push_back(0.3333); - } - std::cout << "triIds[i]: " << triIds[i] << std::endl; - std::cout << "theTris[i]: " << theTris[i] << std::endl; - Topology::PointID uniqID = getUniqueId(theTris[i][0], theTris[i][1]) + theTris[i][2]; std::shared_ptr PTA = std::make_shared(uniqID, nbrPoints, _ancestors, _coefs); PTA->m_ancestorType = sofa::geometry::ElementType::TRIANGLE; m_pointsToAdd.push_back(PTA); nbrPoints++; + // add to the map for later retrieving std::vector >& PTAs = PTA_map[triIds[i]]; - //if (tSplit == nullptr) { - // std::cout << "TTS_map not found" << std::endl; - // return; - //} PTAs.push_back(PTA); - //tSplit->m_points.push_back(PTA); } + // create PointToAdd from edges for (unsigned int i = 0; i < edges_list.size(); ++i) { - type::vector _coefs; - type::vector _ancestors; - const Topology::Edge& edge = edges[edges_list[i]]; - _ancestors.push_back(edge[0]); - _ancestors.push_back(edge[1]); - _coefs.push_back(coords_list[i]); // use them as weights if W == 1 -> point is on vertex. - _coefs.push_back(1.0 - coords_list[i]); - Topology::PointID uniqID = getUniqueId(_ancestors[0], _ancestors[1]); + // check snapping + if (coords_list[i] > snapThreshold) + { + auto itM = cloneMap.find(edge[0]); + if (itM == cloneMap.end()) + { + cloneMap[edge[0]] = nbrPoints; + std::cout << "snap1: " << edge[0] << " -> " << nbrPoints << std::endl; + nbrPoints++; + } + continue; + } + else if (1.0 - coords_list[i] > snapThreshold) + { + auto itM = cloneMap.find(edge[1]); + if (itM == cloneMap.end()) + { + std::cout << "snap2: " << edge[1] << " -> " << nbrPoints << std::endl; + cloneMap[edge[1]] = nbrPoints; + + type::vector _coefs = { 0.0, 1.0}; + type::vector _ancestors = { edge[0], edge[1] }; + + Topology::PointID uniqID = getUniqueId(edge[0], edge[1]); + std::shared_ptr PTA = std::make_shared(uniqID, nbrPoints, _ancestors, _coefs); + + PTA->m_ancestorType = sofa::geometry::ElementType::EDGE; + m_pointsToAdd.push_back(PTA); + nbrPoints++; + } + continue; + } + + type::vector _coefs = { coords_list[i], 1.0 - coords_list[i] }; + type::vector _ancestors = { edge[0], edge[1] }; + + Topology::PointID uniqID = getUniqueId(edge[0], edge[1]); std::shared_ptr PTA = std::make_shared(uniqID, nbrPoints, _ancestors, _coefs); + PTA->m_ancestorType = sofa::geometry::ElementType::EDGE; PTA->m_idClone = nbrPoints + 1; - m_pointsToAdd.push_back(PTA); nbrPoints = nbrPoints + 2; + m_pointsToAdd.push_back(PTA); const auto& triAEdge = triAEdges[edges_list[i]]; for (auto triId : triAEdge) - { - //TriangleToSplit* tSplit = TTS_map[triId]; - //tSplit->m_points.push_back(PTA); + { std::vector >& PTAs = PTA_map[triId]; PTAs.push_back(PTA); } } - + // Create subdividers and add PTA for (unsigned int i = 0; i < triangles_list.size(); ++i) { TriangleID triId = triangles_list[i]; - std::vector >& PTAs = PTA_map[triId]; - //TriangleToSplit* tSplit = TTS_map[triId]; + auto itM = PTA_map.find(triId); + if (itM == PTA_map.end()) + { + std::cout << "tri has been removed: " << triId << std::endl; + continue; + } + + std::vector >& PTAs = itM->second; + const Topology::Triangle& theTri = triangles[triId]; TriangleSubdivider* subdivider = new TriangleSubdivider(triId, theTri); sofa::type::fixed_array points = { x[theTri[0]], x[theTri[1]], x[theTri[2]] }; @@ -552,71 +585,144 @@ void TriangleCuttingController::processCut() std::cout << ptA->m_uniqueID << " | ancestors: " << ptA->m_ancestors << " | " << ptA->m_coefs << std::endl; } - + + // Move that directly inside the subdividers + const sofa::type::Vec3 AB = x[theTris[0][1]] - x[theTris[0][0]]; + const sofa::type::Vec3 AC = x[theTris[0][2]] - x[theTris[0][0]]; + const sofa::type::Vec3 triNorm = AB.cross(AC); + const sofa::type::Vec3 cutPath = ptB - ptA; + // create the list of new triangles around the inside path + // id clone and snapping should be done also in subdividers as point from triangle (if snapped) are not PTA std::map < Topology::PointID, type::vector > TTA_map; - std::map < Topology::PointID, Topology::PointID> cloneMap; for (auto triSub : m_subviders) { const type::vector& TTAS = triSub->getTrianglesToAdd(); const type::vector>& PTAS = triSub->getPointsToAdd(); + for (unsigned int i = 0; i < TTAS.size(); ++i) { - Topology::Triangle newTri = TTAS[i]->m_triangle; - for (unsigned int j = 0; j < PTAS.size(); ++j) + TriangleToAdd* TTA = TTAS[i]; + + const sofa::type::fixed_array& triCoords = TTA->m_triCoords; + sofa::type::Vec3 m_gravityCenter = (triCoords[0] + triCoords[1] + triCoords[2]) / 3; + sofa::type::Vec3 triCutNorm = cutPath.cross(m_gravityCenter - ptA); + SReal dotValue = triCutNorm * triNorm; + + if (dotValue < 0) { - if (PTAS[j]->m_ancestorType == sofa::geometry::ElementType::TRIANGLE) - continue; + TTA->isUp = false; // need to update points + + for (unsigned int j = 0; j < PTAS.size(); ++j) + { + if (PTAS[j]->m_ancestorType == sofa::geometry::ElementType::TRIANGLE) + continue; + + Topology::PointID idNewPoint = PTAS[j]->m_idPoint; + + for (unsigned int k = 0; k < 3; ++k) + { + if (TTA->m_triangle[k] == idNewPoint) + { + TTA->m_triangle[k] = PTAS[j]->m_idClone; + break; + } + } + } - Topology::PointID idNewPoint = PTAS[j]->m_idPoint; - cloneMap[idNewPoint] = PTAS[j]->m_idClone; for (unsigned int k = 0; k < 3; ++k) { - if (newTri[k] == idNewPoint) + auto itM = cloneMap.find(TTA->m_triangle[k]); + if (itM != cloneMap.end()) { - type::vector tris = TTA_map[idNewPoint]; - tris.push_back(TTAS[i]); - TTA_map[idNewPoint] = tris; + TTA->m_triangle[k] = itM->second; break; } } } + else + TTA->isUp = true; + + std::cout << "triangle to Add: " << TTA->m_triangle << std::endl; } } - const sofa::type::Vec3 AB = x[theTris[0][1]] - x[theTris[0][0]]; - const sofa::type::Vec3 AC = x[theTris[0][2]] - x[theTris[0][0]]; - const sofa::type::Vec3 triNorm = AB.cross(AC); - const sofa::type::Vec3 cutPath = ptB - ptA; - - for (auto it = TTA_map.begin(); it != TTA_map.end(); ++it) + // need to split snapped point in existing triangles + m_addTriangles.clear(); + m_removedTriangles.clear(); + for (auto itM : cloneMap) { - const type::vector& TTAS = it->second; - Topology::PointID idClone = cloneMap[it->first]; - for (unsigned int i = 0; i < TTAS.size(); ++i) + std::cout << "need to update triangles arount v: " << itM.first << " -> " << itM.second << std::endl; + const auto& triAV = m_topoContainer->getTrianglesAroundVertex(itM.first); + for (TriangleID triId : triAV) { - TriangleToAdd* TTA = TTAS[i]; + bool found = false; + for (auto triSub : m_subviders) + { + if (triSub->getTriangleIdToSplit() == triId) // already in subdivider + { + found = true; + break; + } + } - const sofa::type::fixed_array& triCoords = TTA->m_triCoords; - sofa::type::Vec3 m_gravityCenter = (triCoords[0] + triCoords[1] + triCoords[2]) / 3; - sofa::type::Vec3 triCutNorm = cutPath.cross(m_gravityCenter - ptA); + if (found) + continue; + + Triangle tri = triangles[triId]; + sofa::type::Vec3 _gravityCenter = (x[tri[0]] + x[tri[1]] + x[tri[2]]) / 3; + + sofa::type::Vec3 triCutNorm = cutPath.cross(_gravityCenter - ptA); SReal dotValue = triCutNorm * triNorm; if (dotValue < 0) { - TTA->isUp = false; - for (unsigned int j = 0; j < 3; ++j) + for (unsigned int k = 0; k < 3; ++k) { - if (TTA->m_triangle[j] == it->first) - TTA->m_triangle[j] = idClone; - } + if (tri[k] == itM.first) + { + tri[k] = itM.second; + break; + } + } + + std::cout << "add Tri: " << tri << " to replace triId: " << triId << std::endl; + m_addTriangles.push_back(tri); + m_removedTriangles.push_back(triId); } - else - TTA->isUp = true; } + } + + //for (auto it = TTA_map.begin(); it != TTA_map.end(); ++it) + //{ + // const type::vector& TTAS = it->second; + // Topology::PointID idClone = cloneMap[it->first]; + // for (unsigned int i = 0; i < TTAS.size(); ++i) + // { + // TriangleToAdd* TTA = TTAS[i]; + + // const sofa::type::fixed_array& triCoords = TTA->m_triCoords; + // sofa::type::Vec3 m_gravityCenter = (triCoords[0] + triCoords[1] + triCoords[2]) / 3; + // sofa::type::Vec3 triCutNorm = cutPath.cross(m_gravityCenter - ptA); + // SReal dotValue = triCutNorm * triNorm; + + // if (dotValue < 0) + // { + // TTA->isUp = false; + // for (unsigned int j = 0; j < 3; ++j) + // { + // if (TTA->m_triangle[j] == it->first) + // TTA->m_triangle[j] = idClone; + // } + // } + // else + // TTA->isUp = true; + // } + //} + // split path here if (!d_performCut.getValue()) return; @@ -672,31 +778,31 @@ void TriangleCuttingController::draw(const core::visual::VisualParams } vparams->drawTool()->drawSpheres(points, 0.1, sofa::type::RGBAColor::red()); - std::vector pointsUp, pointsDown; - for (auto triSub : m_subviders) - { - const type::vector& TTAS = triSub->getTrianglesToAdd(); - for (unsigned int i = 0; i < TTAS.size(); ++i) - { - TriangleToAdd* TTA = TTAS[i]; - sofa::type::fixed_array triCoords = TTA->m_triCoords; - if (TTA->isUp) - { - pointsUp.push_back(triCoords[0]); - pointsUp.push_back(triCoords[1]); - pointsUp.push_back(triCoords[2]); - } - else - { - pointsDown.push_back(triCoords[0]); - pointsDown.push_back(triCoords[1]); - pointsDown.push_back(triCoords[2]); - } - } - } + //std::vector pointsUp, pointsDown; + //for (auto triSub : m_subviders) + //{ + // const type::vector& TTAS = triSub->getTrianglesToAdd(); + // for (unsigned int i = 0; i < TTAS.size(); ++i) + // { + // TriangleToAdd* TTA = TTAS[i]; + // sofa::type::fixed_array triCoords = TTA->m_triCoords; + // if (TTA->isUp) + // { + // pointsUp.push_back(triCoords[0]); + // pointsUp.push_back(triCoords[1]); + // pointsUp.push_back(triCoords[2]); + // } + // else + // { + // pointsDown.push_back(triCoords[0]); + // pointsDown.push_back(triCoords[1]); + // pointsDown.push_back(triCoords[2]); + // } + // } + //} - vparams->drawTool()->drawTriangles(pointsUp, sofa::type::RGBAColor::red()); - vparams->drawTool()->drawTriangles(pointsDown, sofa::type::RGBAColor::green()); + //vparams->drawTool()->drawTriangles(pointsUp, sofa::type::RGBAColor::red()); + //vparams->drawTool()->drawTriangles(pointsDown, sofa::type::RGBAColor::green()); } From 02122640e5f9b94b8e1316640286fadfe1c9af2c Mon Sep 17 00:00:00 2001 From: epernod Date: Mon, 6 Jan 2025 14:55:56 +0100 Subject: [PATCH 3/7] [Scenes] Rename triangle cut scenes --- ...=> TriangleCut_benchmark-01_simpleCut.scn} | 2 +- ..._benchmark-01_simpleCut.scn.qglviewer.view | 2 + .../TriangleCut_benchmark-02_snapping.scn | 58 +++++++++++++++++++ ...t_benchmark-02_snapping.scn.qglviewer.view | 2 + 4 files changed, 63 insertions(+), 1 deletion(-) rename scenes/TopologyBenchmarks/{Benchmark_01_TriangleCut_plane.scn => TriangleCut_benchmark-01_simpleCut.scn} (99%) create mode 100644 scenes/TopologyBenchmarks/TriangleCut_benchmark-01_simpleCut.scn.qglviewer.view create mode 100644 scenes/TopologyBenchmarks/TriangleCut_benchmark-02_snapping.scn create mode 100644 scenes/TopologyBenchmarks/TriangleCut_benchmark-02_snapping.scn.qglviewer.view diff --git a/scenes/TopologyBenchmarks/Benchmark_01_TriangleCut_plane.scn b/scenes/TopologyBenchmarks/TriangleCut_benchmark-01_simpleCut.scn similarity index 99% rename from scenes/TopologyBenchmarks/Benchmark_01_TriangleCut_plane.scn rename to scenes/TopologyBenchmarks/TriangleCut_benchmark-01_simpleCut.scn index cd071c7..995dd79 100644 --- a/scenes/TopologyBenchmarks/Benchmark_01_TriangleCut_plane.scn +++ b/scenes/TopologyBenchmarks/TriangleCut_benchmark-01_simpleCut.scn @@ -48,7 +48,7 @@ - + diff --git a/scenes/TopologyBenchmarks/TriangleCut_benchmark-01_simpleCut.scn.qglviewer.view b/scenes/TopologyBenchmarks/TriangleCut_benchmark-01_simpleCut.scn.qglviewer.view new file mode 100644 index 0000000..182337c --- /dev/null +++ b/scenes/TopologyBenchmarks/TriangleCut_benchmark-01_simpleCut.scn.qglviewer.view @@ -0,0 +1,2 @@ +-0.849029 46.9556 1.51729 +-0.707107 2.01511e-19 -2.01511e-19 0.707107 diff --git a/scenes/TopologyBenchmarks/TriangleCut_benchmark-02_snapping.scn b/scenes/TopologyBenchmarks/TriangleCut_benchmark-02_snapping.scn new file mode 100644 index 0000000..91ae79c --- /dev/null +++ b/scenes/TopologyBenchmarks/TriangleCut_benchmark-02_snapping.scn @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/scenes/TopologyBenchmarks/TriangleCut_benchmark-02_snapping.scn.qglviewer.view b/scenes/TopologyBenchmarks/TriangleCut_benchmark-02_snapping.scn.qglviewer.view new file mode 100644 index 0000000..e048f83 --- /dev/null +++ b/scenes/TopologyBenchmarks/TriangleCut_benchmark-02_snapping.scn.qglviewer.view @@ -0,0 +1,2 @@ +2.82916e-17 49.6379 8.72903e-15 +-0.707107 2.01511e-19 -2.01511e-19 0.707107 From ce08517dab8745000ec20eedd2035c1db094f613 Mon Sep 17 00:00:00 2001 From: epernod Date: Mon, 6 Jan 2025 16:02:47 +0100 Subject: [PATCH 4/7] [backup] new snapping version not working --- .../TriangleCut_benchmark-01_simpleCut.scn | 2 +- .../TriangleCut_benchmark-02_snapping.scn | 4 +- .../TriangleCut_benchmark-03_snapping.scn | 58 +++++++++ .../Controllers/TriangleCuttingController.inl | 122 +++++++----------- 4 files changed, 105 insertions(+), 81 deletions(-) create mode 100644 scenes/TopologyBenchmarks/TriangleCut_benchmark-03_snapping.scn diff --git a/scenes/TopologyBenchmarks/TriangleCut_benchmark-01_simpleCut.scn b/scenes/TopologyBenchmarks/TriangleCut_benchmark-01_simpleCut.scn index 995dd79..2bb7859 100644 --- a/scenes/TopologyBenchmarks/TriangleCut_benchmark-01_simpleCut.scn +++ b/scenes/TopologyBenchmarks/TriangleCut_benchmark-01_simpleCut.scn @@ -25,7 +25,7 @@ - + diff --git a/scenes/TopologyBenchmarks/TriangleCut_benchmark-02_snapping.scn b/scenes/TopologyBenchmarks/TriangleCut_benchmark-02_snapping.scn index 91ae79c..5cb5e93 100644 --- a/scenes/TopologyBenchmarks/TriangleCut_benchmark-02_snapping.scn +++ b/scenes/TopologyBenchmarks/TriangleCut_benchmark-02_snapping.scn @@ -25,7 +25,7 @@ - + @@ -48,7 +48,7 @@ - + diff --git a/scenes/TopologyBenchmarks/TriangleCut_benchmark-03_snapping.scn b/scenes/TopologyBenchmarks/TriangleCut_benchmark-03_snapping.scn new file mode 100644 index 0000000..7dbf34d --- /dev/null +++ b/scenes/TopologyBenchmarks/TriangleCut_benchmark-03_snapping.scn @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Tearing/Controllers/TriangleCuttingController.inl b/src/Tearing/Controllers/TriangleCuttingController.inl index 4c45ffe..4ff0f73 100644 --- a/src/Tearing/Controllers/TriangleCuttingController.inl +++ b/src/Tearing/Controllers/TriangleCuttingController.inl @@ -412,10 +412,12 @@ void TriangleCuttingController::processSubdividers() for (auto TTA : TTAS) { trianglesToAdd.push_back(TTA->m_triangle); + std::cout << "trianglesToAdd: " << TTA->m_triangle << std::endl; _ancestors.push_back(TTA->m_ancestors); _baryCoefs.push_back(TTA->m_coefs); } trianglesToRemove.push_back(triSub->getTriangleIdToSplit()); + std::cout << "-- trianglesToRemove: " << triSub->getTriangleIdToSplit() << std::endl; } for (auto tri : m_addTriangles) @@ -502,48 +504,12 @@ void TriangleCuttingController::processCut() { const Topology::Edge& edge = edges[edges_list[i]]; - // check snapping - if (coords_list[i] > snapThreshold) - { - auto itM = cloneMap.find(edge[0]); - if (itM == cloneMap.end()) - { - cloneMap[edge[0]] = nbrPoints; - std::cout << "snap1: " << edge[0] << " -> " << nbrPoints << std::endl; - nbrPoints++; - } - continue; - } - else if (1.0 - coords_list[i] > snapThreshold) - { - auto itM = cloneMap.find(edge[1]); - if (itM == cloneMap.end()) - { - std::cout << "snap2: " << edge[1] << " -> " << nbrPoints << std::endl; - cloneMap[edge[1]] = nbrPoints; - - type::vector _coefs = { 0.0, 1.0}; - type::vector _ancestors = { edge[0], edge[1] }; - - Topology::PointID uniqID = getUniqueId(edge[0], edge[1]); - std::shared_ptr PTA = std::make_shared(uniqID, nbrPoints, _ancestors, _coefs); - - PTA->m_ancestorType = sofa::geometry::ElementType::EDGE; - m_pointsToAdd.push_back(PTA); - nbrPoints++; - } - continue; - } - type::vector _coefs = { coords_list[i], 1.0 - coords_list[i] }; type::vector _ancestors = { edge[0], edge[1] }; Topology::PointID uniqID = getUniqueId(edge[0], edge[1]); - std::shared_ptr PTA = std::make_shared(uniqID, nbrPoints, _ancestors, _coefs); - - PTA->m_ancestorType = sofa::geometry::ElementType::EDGE; - PTA->m_idClone = nbrPoints + 1; - nbrPoints = nbrPoints + 2; + std::shared_ptr PTA = std::make_shared(uniqID, nbrPoints, _ancestors, _coefs, snapThreshold); + nbrPoints = PTA->getNextPointIDFromDuplication(); m_pointsToAdd.push_back(PTA); const auto& triAEdge = triAEdges[edges_list[i]]; @@ -644,56 +610,56 @@ void TriangleCuttingController::processCut() else TTA->isUp = true; - std::cout << "triangle to Add: " << TTA->m_triangle << std::endl; + //std::cout << "triangle to Add: " << TTA->m_triangle << std::endl; } } // need to split snapped point in existing triangles m_addTriangles.clear(); m_removedTriangles.clear(); - for (auto itM : cloneMap) - { - std::cout << "need to update triangles arount v: " << itM.first << " -> " << itM.second << std::endl; - const auto& triAV = m_topoContainer->getTrianglesAroundVertex(itM.first); - for (TriangleID triId : triAV) - { - bool found = false; - for (auto triSub : m_subviders) - { - if (triSub->getTriangleIdToSplit() == triId) // already in subdivider - { - found = true; - break; - } - } - - if (found) - continue; + //for (auto itM : cloneMap) + //{ + // std::cout << "need to update triangles arount v: " << itM.first << " -> " << itM.second << std::endl; + // const auto& triAV = m_topoContainer->getTrianglesAroundVertex(itM.first); + // for (TriangleID triId : triAV) + // { + // bool found = false; + // for (auto triSub : m_subviders) + // { + // if (triSub->getTriangleIdToSplit() == triId) // already in subdivider + // { + // found = true; + // break; + // } + // } - Triangle tri = triangles[triId]; - sofa::type::Vec3 _gravityCenter = (x[tri[0]] + x[tri[1]] + x[tri[2]]) / 3; + // if (found) + // continue; - sofa::type::Vec3 triCutNorm = cutPath.cross(_gravityCenter - ptA); - SReal dotValue = triCutNorm * triNorm; + // Triangle tri = triangles[triId]; + // sofa::type::Vec3 _gravityCenter = (x[tri[0]] + x[tri[1]] + x[tri[2]]) / 3; - if (dotValue < 0) - { - for (unsigned int k = 0; k < 3; ++k) - { - if (tri[k] == itM.first) - { - tri[k] = itM.second; - break; - } - } + // sofa::type::Vec3 triCutNorm = cutPath.cross(_gravityCenter - ptA); + // SReal dotValue = triCutNorm * triNorm; - std::cout << "add Tri: " << tri << " to replace triId: " << triId << std::endl; - m_addTriangles.push_back(tri); - m_removedTriangles.push_back(triId); - } - } - - } + // if (dotValue < 0) + // { + // for (unsigned int k = 0; k < 3; ++k) + // { + // if (tri[k] == itM.first) + // { + // tri[k] = itM.second; + // break; + // } + // } + + // std::cout << "add Tri: " << tri << " to replace triId: " << triId << std::endl; + // m_addTriangles.push_back(tri); + // m_removedTriangles.push_back(triId); + // } + // } + // + //} //for (auto it = TTA_map.begin(); it != TTA_map.end(); ++it) From 8b124f7bad1f4fa12d5e0a73c2e6d8d8e15260c9 Mon Sep 17 00:00:00 2001 From: epernod Date: Mon, 6 Jan 2025 17:49:01 +0100 Subject: [PATCH 5/7] BAckup new version of cutting with snapping using method directly inside TriangleSubdividers --- .../Controllers/TriangleCuttingController.inl | 187 ++++++++++-------- 1 file changed, 104 insertions(+), 83 deletions(-) diff --git a/src/Tearing/Controllers/TriangleCuttingController.inl b/src/Tearing/Controllers/TriangleCuttingController.inl index 4ff0f73..1046fb8 100644 --- a/src/Tearing/Controllers/TriangleCuttingController.inl +++ b/src/Tearing/Controllers/TriangleCuttingController.inl @@ -388,7 +388,7 @@ void TriangleCuttingController::processSubdividers() _ancestors.push_back(ptA->m_ancestors); _baryCoefs.push_back(ptA->m_coefs); - if (ptA->m_idClone != sofa::InvalidID) + if (ptA->m_idClone != sofa::InvalidID && ptA->m_idLocalSnap == sofa::InvalidID) { _ancestors.push_back(ptA->m_ancestors); _baryCoefs.push_back(ptA->m_coefs); @@ -396,6 +396,7 @@ void TriangleCuttingController::processSubdividers() } size_t nbrP = _ancestors.size(); + std::cout << "processSubdividers: nbrP: " << nbrP << std::endl; // 2. resize the point buffer in the topology // warn for the creation of all the points registered to be created @@ -509,8 +510,27 @@ void TriangleCuttingController::processCut() Topology::PointID uniqID = getUniqueId(edge[0], edge[1]); std::shared_ptr PTA = std::make_shared(uniqID, nbrPoints, _ancestors, _coefs, snapThreshold); - nbrPoints = PTA->getNextPointIDFromDuplication(); - m_pointsToAdd.push_back(PTA); + bool snapped = PTA->updatePointIDForDuplication(); + if (snapped) + { + auto itM = cloneMap.find(PTA->m_idPoint); + if (itM == cloneMap.end()) + { + std::cout << "snap2: " << PTA->m_idPoint << " -> " << PTA->m_idClone << std::endl; + cloneMap[PTA->m_idPoint] = PTA->m_idClone; + m_pointsToAdd.push_back(PTA); + nbrPoints++; + } + else { + std::cout << " pass snap: " << nbrPoints << std::endl; + PTA = m_pointsToAdd.back(); + } + } + else + { + m_pointsToAdd.push_back(PTA); + nbrPoints = nbrPoints +2; + } const auto& triAEdge = triAEdges[edges_list[i]]; for (auto triId : triAEdge) @@ -564,103 +584,104 @@ void TriangleCuttingController::processCut() std::map < Topology::PointID, type::vector > TTA_map; for (auto triSub : m_subviders) { - const type::vector& TTAS = triSub->getTrianglesToAdd(); - const type::vector>& PTAS = triSub->getPointsToAdd(); + triSub->cutTriangles(ptA, ptB, triNorm); + //const type::vector& TTAS = triSub->getTrianglesToAdd(); + //const type::vector>& PTAS = triSub->getPointsToAdd(); + + //for (unsigned int i = 0; i < TTAS.size(); ++i) + //{ + // TriangleToAdd* TTA = TTAS[i]; + + // const sofa::type::fixed_array& triCoords = TTA->m_triCoords; + // sofa::type::Vec3 m_gravityCenter = (triCoords[0] + triCoords[1] + triCoords[2]) / 3; + // sofa::type::Vec3 triCutNorm = cutPath.cross(m_gravityCenter - ptA); + // SReal dotValue = triCutNorm * triNorm; + + // if (dotValue < 0) + // { + // TTA->isUp = false; // need to update points + + // for (unsigned int j = 0; j < PTAS.size(); ++j) + // { + // if (PTAS[j]->m_ancestorType == sofa::geometry::ElementType::TRIANGLE) + // continue; + + // Topology::PointID idNewPoint = PTAS[j]->m_idPoint; + + // for (unsigned int k = 0; k < 3; ++k) + // { + // if (TTA->m_triangle[k] == idNewPoint) + // { + // TTA->m_triangle[k] = PTAS[j]->m_idClone; + // break; + // } + // } + // } + + // for (unsigned int k = 0; k < 3; ++k) + // { + // auto itM = cloneMap.find(TTA->m_triangle[k]); + // if (itM != cloneMap.end()) + // { + // TTA->m_triangle[k] = itM->second; + // break; + // } + // } + // } + // else + // TTA->isUp = true; + + // //std::cout << "triangle to Add: " << TTA->m_triangle << std::endl; + //} + } - for (unsigned int i = 0; i < TTAS.size(); ++i) + // need to split snapped point in existing triangles + m_addTriangles.clear(); + m_removedTriangles.clear(); + for (auto itM : cloneMap) + { + std::cout << "need to update triangles arount v: " << itM.first << " -> " << itM.second << std::endl; + const auto& triAV = m_topoContainer->getTrianglesAroundVertex(itM.first); + for (TriangleID triId : triAV) { - TriangleToAdd* TTA = TTAS[i]; - - const sofa::type::fixed_array& triCoords = TTA->m_triCoords; - sofa::type::Vec3 m_gravityCenter = (triCoords[0] + triCoords[1] + triCoords[2]) / 3; - sofa::type::Vec3 triCutNorm = cutPath.cross(m_gravityCenter - ptA); - SReal dotValue = triCutNorm * triNorm; - - if (dotValue < 0) + bool found = false; + for (auto triSub : m_subviders) { - TTA->isUp = false; // need to update points - - for (unsigned int j = 0; j < PTAS.size(); ++j) + if (triSub->getTriangleIdToSplit() == triId) // already in subdivider { - if (PTAS[j]->m_ancestorType == sofa::geometry::ElementType::TRIANGLE) - continue; + found = true; + break; + } + } - Topology::PointID idNewPoint = PTAS[j]->m_idPoint; + if (found) + continue; - for (unsigned int k = 0; k < 3; ++k) - { - if (TTA->m_triangle[k] == idNewPoint) - { - TTA->m_triangle[k] = PTAS[j]->m_idClone; - break; - } - } - } + Triangle tri = triangles[triId]; + sofa::type::Vec3 _gravityCenter = (x[tri[0]] + x[tri[1]] + x[tri[2]]) / 3; + sofa::type::Vec3 triCutNorm = cutPath.cross(_gravityCenter - ptA); + SReal dotValue = triCutNorm * triNorm; + + if (dotValue < 0) + { for (unsigned int k = 0; k < 3; ++k) { - auto itM = cloneMap.find(TTA->m_triangle[k]); - if (itM != cloneMap.end()) + if (tri[k] == itM.first) { - TTA->m_triangle[k] = itM->second; + tri[k] = itM.second; break; } } - } - else - TTA->isUp = true; - //std::cout << "triangle to Add: " << TTA->m_triangle << std::endl; + std::cout << "add Tri: " << tri << " to replace triId: " << triId << std::endl; + m_addTriangles.push_back(tri); + m_removedTriangles.push_back(triId); + } } + } - // need to split snapped point in existing triangles - m_addTriangles.clear(); - m_removedTriangles.clear(); - //for (auto itM : cloneMap) - //{ - // std::cout << "need to update triangles arount v: " << itM.first << " -> " << itM.second << std::endl; - // const auto& triAV = m_topoContainer->getTrianglesAroundVertex(itM.first); - // for (TriangleID triId : triAV) - // { - // bool found = false; - // for (auto triSub : m_subviders) - // { - // if (triSub->getTriangleIdToSplit() == triId) // already in subdivider - // { - // found = true; - // break; - // } - // } - - // if (found) - // continue; - - // Triangle tri = triangles[triId]; - // sofa::type::Vec3 _gravityCenter = (x[tri[0]] + x[tri[1]] + x[tri[2]]) / 3; - - // sofa::type::Vec3 triCutNorm = cutPath.cross(_gravityCenter - ptA); - // SReal dotValue = triCutNorm * triNorm; - - // if (dotValue < 0) - // { - // for (unsigned int k = 0; k < 3; ++k) - // { - // if (tri[k] == itM.first) - // { - // tri[k] = itM.second; - // break; - // } - // } - - // std::cout << "add Tri: " << tri << " to replace triId: " << triId << std::endl; - // m_addTriangles.push_back(tri); - // m_removedTriangles.push_back(triId); - // } - // } - // - //} - //for (auto it = TTA_map.begin(); it != TTA_map.end(); ++it) //{ From 6da1a1d52fffb629bd8a42bcfcfb50540a16f858 Mon Sep 17 00:00:00 2001 From: epernod Date: Tue, 7 Jan 2025 00:59:08 +0100 Subject: [PATCH 6/7] Backup work on snapping with successive point snap/not snap --- .../TriangleCut_benchmark-03_snapping.scn | 2 +- ...t_benchmark-03_snapping.scn.qglviewer.view | 2 ++ .../Controllers/TriangleCuttingController.inl | 26 +++++++++++++++++-- 3 files changed, 27 insertions(+), 3 deletions(-) create mode 100644 scenes/TopologyBenchmarks/TriangleCut_benchmark-03_snapping.scn.qglviewer.view diff --git a/scenes/TopologyBenchmarks/TriangleCut_benchmark-03_snapping.scn b/scenes/TopologyBenchmarks/TriangleCut_benchmark-03_snapping.scn index 7dbf34d..731a0cb 100644 --- a/scenes/TopologyBenchmarks/TriangleCut_benchmark-03_snapping.scn +++ b/scenes/TopologyBenchmarks/TriangleCut_benchmark-03_snapping.scn @@ -48,7 +48,7 @@ - + diff --git a/scenes/TopologyBenchmarks/TriangleCut_benchmark-03_snapping.scn.qglviewer.view b/scenes/TopologyBenchmarks/TriangleCut_benchmark-03_snapping.scn.qglviewer.view new file mode 100644 index 0000000..088c644 --- /dev/null +++ b/scenes/TopologyBenchmarks/TriangleCut_benchmark-03_snapping.scn.qglviewer.view @@ -0,0 +1,2 @@ +-0.740008 44.5146 -4.62505 +-0.707107 6.93889e-18 1.14281e-17 0.707107 diff --git a/src/Tearing/Controllers/TriangleCuttingController.inl b/src/Tearing/Controllers/TriangleCuttingController.inl index 1046fb8..70d800e 100644 --- a/src/Tearing/Controllers/TriangleCuttingController.inl +++ b/src/Tearing/Controllers/TriangleCuttingController.inl @@ -499,12 +499,32 @@ void TriangleCuttingController::processCut() std::vector >& PTAs = PTA_map[triIds[i]]; PTAs.push_back(PTA); } + + std::set psnap; + for (unsigned int i = 0; i < edges_list.size(); ++i) + { + const Topology::Edge& edge = edges[edges_list[i]]; + if (coords_list[i] > snapThreshold) + psnap.insert(edge[0]); + else if (1.0 - coords_list[i] > snapThreshold) + psnap.insert(edge[1]); + } + std::cout << "psnap: " << psnap << std::endl; - // create PointToAdd from edges for (unsigned int i = 0; i < edges_list.size(); ++i) { const Topology::Edge& edge = edges[edges_list[i]]; + if (psnap.find(edge[0]) != psnap.end()) + coords_list[i] = 1.0; + else if (psnap.find(edge[1]) != psnap.end()) + coords_list[i] = 0.0; + } + // create PointToAdd from edges + for (unsigned int i = 0; i < edges_list.size(); ++i) + { + const Topology::Edge& edge = edges[edges_list[i]]; + std::cout << "Edge: " << edges_list[i] << " | " << edge << " | " << coords_list[i] << std::endl; type::vector _coefs = { coords_list[i], 1.0 - coords_list[i] }; type::vector _ancestors = { edge[0], edge[1] }; @@ -516,18 +536,20 @@ void TriangleCuttingController::processCut() auto itM = cloneMap.find(PTA->m_idPoint); if (itM == cloneMap.end()) { + std::cout << "Edge: " << edges_list[i] << " snap PTA: " << nbrPoints << std::endl; std::cout << "snap2: " << PTA->m_idPoint << " -> " << PTA->m_idClone << std::endl; cloneMap[PTA->m_idPoint] = PTA->m_idClone; m_pointsToAdd.push_back(PTA); nbrPoints++; } else { - std::cout << " pass snap: " << nbrPoints << std::endl; + std::cout << "Edge: " << edges_list[i] << " pass snap: " << PTA->m_idPoint << " -> " << PTA->m_idClone << std::endl; PTA = m_pointsToAdd.back(); } } else { + std::cout << "Edge: " << edges_list[i] << " Add PTA: " << nbrPoints << std::endl; m_pointsToAdd.push_back(PTA); nbrPoints = nbrPoints +2; } From cd64f0d9f3afbce30da2347409b4e8f63b9f888f Mon Sep 17 00:00:00 2001 From: epernod Date: Wed, 8 Jan 2025 00:47:22 +0100 Subject: [PATCH 7/7] some cleaning --- .../TriangleCut_benchmark-02_snapping.scn | 2 +- .../TriangleCut_benchmark-03_snapping.scn | 2 +- .../Controllers/TriangleCuttingController.inl | 99 ++----------------- 3 files changed, 9 insertions(+), 94 deletions(-) diff --git a/scenes/TopologyBenchmarks/TriangleCut_benchmark-02_snapping.scn b/scenes/TopologyBenchmarks/TriangleCut_benchmark-02_snapping.scn index 5cb5e93..25caf58 100644 --- a/scenes/TopologyBenchmarks/TriangleCut_benchmark-02_snapping.scn +++ b/scenes/TopologyBenchmarks/TriangleCut_benchmark-02_snapping.scn @@ -48,7 +48,7 @@ - + diff --git a/scenes/TopologyBenchmarks/TriangleCut_benchmark-03_snapping.scn b/scenes/TopologyBenchmarks/TriangleCut_benchmark-03_snapping.scn index 731a0cb..eaf1d07 100644 --- a/scenes/TopologyBenchmarks/TriangleCut_benchmark-03_snapping.scn +++ b/scenes/TopologyBenchmarks/TriangleCut_benchmark-03_snapping.scn @@ -48,7 +48,7 @@ - + diff --git a/src/Tearing/Controllers/TriangleCuttingController.inl b/src/Tearing/Controllers/TriangleCuttingController.inl index 70d800e..afeb5b8 100644 --- a/src/Tearing/Controllers/TriangleCuttingController.inl +++ b/src/Tearing/Controllers/TriangleCuttingController.inl @@ -413,12 +413,10 @@ void TriangleCuttingController::processSubdividers() for (auto TTA : TTAS) { trianglesToAdd.push_back(TTA->m_triangle); - std::cout << "trianglesToAdd: " << TTA->m_triangle << std::endl; _ancestors.push_back(TTA->m_ancestors); _baryCoefs.push_back(TTA->m_coefs); } trianglesToRemove.push_back(triSub->getTriangleIdToSplit()); - std::cout << "-- trianglesToRemove: " << triSub->getTriangleIdToSplit() << std::endl; } for (auto tri : m_addTriangles) @@ -500,6 +498,7 @@ void TriangleCuttingController::processCut() PTAs.push_back(PTA); } + // ProcessUpdate all coef due to the snapping std::set psnap; for (unsigned int i = 0; i < edges_list.size(); ++i) { @@ -509,7 +508,6 @@ void TriangleCuttingController::processCut() else if (1.0 - coords_list[i] > snapThreshold) psnap.insert(edge[1]); } - std::cout << "psnap: " << psnap << std::endl; for (unsigned int i = 0; i < edges_list.size(); ++i) { @@ -524,7 +522,6 @@ void TriangleCuttingController::processCut() for (unsigned int i = 0; i < edges_list.size(); ++i) { const Topology::Edge& edge = edges[edges_list[i]]; - std::cout << "Edge: " << edges_list[i] << " | " << edge << " | " << coords_list[i] << std::endl; type::vector _coefs = { coords_list[i], 1.0 - coords_list[i] }; type::vector _ancestors = { edge[0], edge[1] }; @@ -536,20 +533,16 @@ void TriangleCuttingController::processCut() auto itM = cloneMap.find(PTA->m_idPoint); if (itM == cloneMap.end()) { - std::cout << "Edge: " << edges_list[i] << " snap PTA: " << nbrPoints << std::endl; - std::cout << "snap2: " << PTA->m_idPoint << " -> " << PTA->m_idClone << std::endl; cloneMap[PTA->m_idPoint] = PTA->m_idClone; m_pointsToAdd.push_back(PTA); nbrPoints++; } else { - std::cout << "Edge: " << edges_list[i] << " pass snap: " << PTA->m_idPoint << " -> " << PTA->m_idClone << std::endl; PTA = m_pointsToAdd.back(); } } else { - std::cout << "Edge: " << edges_list[i] << " Add PTA: " << nbrPoints << std::endl; m_pointsToAdd.push_back(PTA); nbrPoints = nbrPoints +2; } @@ -569,7 +562,7 @@ void TriangleCuttingController::processCut() auto itM = PTA_map.find(triId); if (itM == PTA_map.end()) { - std::cout << "tri has been removed: " << triId << std::endl; + // TriangleSubdivider has been removed due to snapping continue; } @@ -587,11 +580,11 @@ void TriangleCuttingController::processCut() } - std::cout << "m_pointsToAdd: " << m_pointsToAdd.size() << std::endl; - for (auto ptA : m_pointsToAdd) - { - std::cout << ptA->m_uniqueID << " | ancestors: " << ptA->m_ancestors << " | " << ptA->m_coefs << std::endl; - } + //std::cout << "m_pointsToAdd: " << m_pointsToAdd.size() << std::endl; + //for (auto ptA : m_pointsToAdd) + //{ + // std::cout << ptA->m_uniqueID << " | ancestors: " << ptA->m_ancestors << " | " << ptA->m_coefs << std::endl; + //} // Move that directly inside the subdividers @@ -602,59 +595,9 @@ void TriangleCuttingController::processCut() // create the list of new triangles around the inside path - // id clone and snapping should be done also in subdividers as point from triangle (if snapped) are not PTA - std::map < Topology::PointID, type::vector > TTA_map; for (auto triSub : m_subviders) { triSub->cutTriangles(ptA, ptB, triNorm); - //const type::vector& TTAS = triSub->getTrianglesToAdd(); - //const type::vector>& PTAS = triSub->getPointsToAdd(); - - //for (unsigned int i = 0; i < TTAS.size(); ++i) - //{ - // TriangleToAdd* TTA = TTAS[i]; - - // const sofa::type::fixed_array& triCoords = TTA->m_triCoords; - // sofa::type::Vec3 m_gravityCenter = (triCoords[0] + triCoords[1] + triCoords[2]) / 3; - // sofa::type::Vec3 triCutNorm = cutPath.cross(m_gravityCenter - ptA); - // SReal dotValue = triCutNorm * triNorm; - - // if (dotValue < 0) - // { - // TTA->isUp = false; // need to update points - - // for (unsigned int j = 0; j < PTAS.size(); ++j) - // { - // if (PTAS[j]->m_ancestorType == sofa::geometry::ElementType::TRIANGLE) - // continue; - - // Topology::PointID idNewPoint = PTAS[j]->m_idPoint; - - // for (unsigned int k = 0; k < 3; ++k) - // { - // if (TTA->m_triangle[k] == idNewPoint) - // { - // TTA->m_triangle[k] = PTAS[j]->m_idClone; - // break; - // } - // } - // } - - // for (unsigned int k = 0; k < 3; ++k) - // { - // auto itM = cloneMap.find(TTA->m_triangle[k]); - // if (itM != cloneMap.end()) - // { - // TTA->m_triangle[k] = itM->second; - // break; - // } - // } - // } - // else - // TTA->isUp = true; - - // //std::cout << "triangle to Add: " << TTA->m_triangle << std::endl; - //} } // need to split snapped point in existing triangles @@ -704,34 +647,6 @@ void TriangleCuttingController::processCut() } - - //for (auto it = TTA_map.begin(); it != TTA_map.end(); ++it) - //{ - // const type::vector& TTAS = it->second; - // Topology::PointID idClone = cloneMap[it->first]; - // for (unsigned int i = 0; i < TTAS.size(); ++i) - // { - // TriangleToAdd* TTA = TTAS[i]; - - // const sofa::type::fixed_array& triCoords = TTA->m_triCoords; - // sofa::type::Vec3 m_gravityCenter = (triCoords[0] + triCoords[1] + triCoords[2]) / 3; - // sofa::type::Vec3 triCutNorm = cutPath.cross(m_gravityCenter - ptA); - // SReal dotValue = triCutNorm * triNorm; - - // if (dotValue < 0) - // { - // TTA->isUp = false; - // for (unsigned int j = 0; j < 3; ++j) - // { - // if (TTA->m_triangle[j] == it->first) - // TTA->m_triangle[j] = idClone; - // } - // } - // else - // TTA->isUp = true; - // } - //} - // split path here if (!d_performCut.getValue()) return;