From d243dc55e659d36a35214efb8dccbf0ddb6fa934 Mon Sep 17 00:00:00 2001 From: epernod Date: Tue, 26 May 2026 08:47:59 +0200 Subject: [PATCH 1/3] backup work on advanced carving --- .../CarvingTools/RefineCarvingPerformer.cpp | 99 +++++++++---------- .../CarvingTools/RefineCarvingPerformer.h | 4 +- 2 files changed, 51 insertions(+), 52 deletions(-) diff --git a/src/InfinyToolkit/CarvingTools/RefineCarvingPerformer.cpp b/src/InfinyToolkit/CarvingTools/RefineCarvingPerformer.cpp index a650125..5f0dde8 100644 --- a/src/InfinyToolkit/CarvingTools/RefineCarvingPerformer.cpp +++ b/src/InfinyToolkit/CarvingTools/RefineCarvingPerformer.cpp @@ -30,6 +30,7 @@ RefineCarvingPerformer::RefineCarvingPerformer(TetrahedronSetTopologyContainer:: , m_tetraAlgo(nullptr) { m_performerType = "RefineCarvingPerformer"; + m_doRefine = true; } @@ -60,9 +61,11 @@ void RefineCarvingPerformer::filterContacts() const SReal& refineDistance = m_carvingMgr->d_refineDistance.getValue(); const SReal& carvingDistance = m_carvingMgr->d_carvingDistance.getValue(); m_tetra2Filter.clear(); - //m_tetra2Filter2.clear(); m_triIdsToFilter.clear(); + m_carvingPositions.clear(); + m_tetra2Carv.clear(); + // If triangle collision involved (only surface) take tetra behind the triangle, if close enough, for refinement for (contactInfo * cInfo : m_triangleContacts) { if (cInfo->dist > refineDistance) @@ -77,14 +80,10 @@ void RefineCarvingPerformer::filterContacts() } m_tetra2Filter.insert(tetraAT[0]); - - //if (cInfo->dist <= carvingDistance) - // m_tetra2Filter2.push_back(tetraAT[0]); - - - carvingPosition = cInfo->pointA; + m_carvingPositions.push_back(cInfo->pointA); } + // If point collision involved (can be surface or inside) take all tetra around the point, if close enough, for refinement for (contactInfo * cInfo : m_pointContacts) { if (cInfo->dist > refineDistance) @@ -96,45 +95,37 @@ void RefineCarvingPerformer::filterContacts() m_tetra2Filter.insert(tetraId); if (cInfo->dist <= carvingDistance) { - const core::topology::BaseMeshTopology::TrianglesAroundVertex& triAV = m_topologyCon->getTrianglesAroundVertex(cInfo->elemId); + //const core::topology::BaseMeshTopology::TrianglesAroundVertex& triAV = m_topologyCon->getTrianglesAroundVertex(cInfo->elemId); - for (auto triId : triAV) - m_triIdsToFilter.insert(triId); + //for (auto triId : triAV) + // m_triIdsToFilter.insert(triId); + for (auto tetraId : tetraAV) + m_tetra2Carv.insert(tetraId); } - carvingPosition = cInfo->pointA; + m_carvingPositions.push_back(cInfo->pointA); } } bool RefineCarvingPerformer::runPerformer() { - if (!m_tetra2Filter.empty()) + // nothin to do if no tetra to refine + if (m_tetra2Filter.empty()) + return false; + + // will try to refine or carve but not the two at the same time for now, to avoid some conflict. + if (m_doRefine) { sofa::Size nbrTetra = m_topologyCon->getNbTetrahedra(); - bool res = m_tetraAlgo->refineTetrahedra(m_tetra2Filter, m_carvingMgr->d_refineCriteria.getValue()); - - if (res) - { -#if 0 - return res; -#else - sofa::Size nbrTetraNew = m_topologyCon->getNbTetrahedra(); - for (sofa::Index tetraId = nbrTetra; tetraId < nbrTetraNew; ++tetraId) - m_tetra2Filter.insert(tetraId); -#endif - } -#if 0 - else - { - surfaceCarving2(); - } -#else - simpleCarving(); -#endif - - - return res; + m_tetraAlgo->refineTetrahedra(m_tetra2Filter, m_carvingMgr->d_refineCriteria.getValue()); + m_doRefine = false; + } + else + { + //simpleCarving(); + m_tetraAlgo->removeTetrahedra(m_tetra2Carv); + m_doRefine = true; } return false; @@ -158,10 +149,16 @@ void RefineCarvingPerformer::simpleCarving() bary += vertices[tetra[j]]; } bary *= 0.25; - SReal dist = (carvingPosition - bary).norm(); - if (dist < carvingDistance) - tetraToremove.insert(tetraId); + for (const auto& carvingPos : m_carvingPositions) + { + SReal dist = (carvingPos - bary).norm(); + if (dist < carvingDistance) + { + tetraToremove.insert(tetraId); + break; + } + } } if (!tetraToremove.empty()) @@ -188,20 +185,20 @@ void RefineCarvingPerformer::surfaceCarving() } // check all point dist from carving element - const SReal invCarv = 1 / carvingDistance * 0.5; - for (auto pointId : pointsToCheck) - { - Vec3& vertex = vertices[pointId]; - Vec3 dir = vertex - carvingPosition; - const SReal dist = dir.norm(); + //const SReal invCarv = 1 / carvingDistance * 0.5; + //for (auto pointId : pointsToCheck) + //{ + // Vec3& vertex = vertices[pointId]; + // Vec3 dir = vertex - carvingPosition; + // const SReal dist = dir.norm(); - if (dist > carvingDistance) - continue; + // if (dist > carvingDistance) + // continue; - SReal factor = (carvingDistance - dist)* invCarv; // ]0, carvingDistance] - msg_info("RefineCarvingPerformer") << "pointId: " << pointId << " | factor: " << factor << " | carvingDistance: " << carvingDistance << " | dist: " << dist; - vertex = vertex + dir * factor; - } + // SReal factor = (carvingDistance - dist)* invCarv; // ]0, carvingDistance] + // msg_info("RefineCarvingPerformer") << "pointId: " << pointId << " | factor: " << factor << " | carvingDistance: " << carvingDistance << " | dist: " << dist; + // vertex = vertex + dir * factor; + //} } @@ -271,7 +268,7 @@ void RefineCarvingPerformer::surfaceCarving2() { Vec3 vertex = vertices[pId]; Vec3 dir = oppoPCoord - vertex; // normalise?? - const SReal dist = (vertex - carvingPosition).norm(); + const SReal dist = 0.0;// TODO check that (vertex - carvingPosition).norm(); if (dist > carvingDistance) continue; diff --git a/src/InfinyToolkit/CarvingTools/RefineCarvingPerformer.h b/src/InfinyToolkit/CarvingTools/RefineCarvingPerformer.h index 5eb744c..3fd50e0 100644 --- a/src/InfinyToolkit/CarvingTools/RefineCarvingPerformer.h +++ b/src/InfinyToolkit/CarvingTools/RefineCarvingPerformer.h @@ -58,8 +58,10 @@ class SOFA_INFINYTOOLKIT_API RefineCarvingPerformer : public BaseCarvingPerforme sofa::type::vector m_tetra2Filter2; std::set m_triIdsToFilter; std::set m_triIds; + std::set m_tetra2Carv; - Vec3 carvingPosition; + std::vector m_carvingPositions; + bool m_doRefine = true; }; } // namespace sofa::infinytoolkit From 6c2276f59a7efd778c5c362cb065199d22dc371b Mon Sep 17 00:00:00 2001 From: epernod Date: Wed, 27 May 2026 23:16:57 +0200 Subject: [PATCH 2/3] simplify the refine vs carving process --- .../CarvingTools/BaseCarvingPerformer.h | 2 +- .../CarvingTools/RefineCarvingPerformer.cpp | 22 ++++++++++++++----- .../CarvingTools/RefineCarvingPerformer.h | 2 ++ 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/InfinyToolkit/CarvingTools/BaseCarvingPerformer.h b/src/InfinyToolkit/CarvingTools/BaseCarvingPerformer.h index 8d8ed96..d015faf 100644 --- a/src/InfinyToolkit/CarvingTools/BaseCarvingPerformer.h +++ b/src/InfinyToolkit/CarvingTools/BaseCarvingPerformer.h @@ -55,7 +55,7 @@ class SOFA_INFINYTOOLKIT_API BaseCarvingPerformer virtual ~BaseCarvingPerformer(); - void clearContacts(); + virtual void clearContacts(); const std::string& getType() { return m_performerType; } diff --git a/src/InfinyToolkit/CarvingTools/RefineCarvingPerformer.cpp b/src/InfinyToolkit/CarvingTools/RefineCarvingPerformer.cpp index 5f0dde8..246b3a4 100644 --- a/src/InfinyToolkit/CarvingTools/RefineCarvingPerformer.cpp +++ b/src/InfinyToolkit/CarvingTools/RefineCarvingPerformer.cpp @@ -52,6 +52,14 @@ bool RefineCarvingPerformer::initPerformer() return resInit; } +void RefineCarvingPerformer::clearContacts() +{ + BaseCarvingPerformer::clearContacts(); + m_tetra2Filter.clear(); + m_carvingPositions.clear(); + m_triIdsToFilter.clear(); +} + void RefineCarvingPerformer::filterContacts() { @@ -79,8 +87,14 @@ void RefineCarvingPerformer::filterContacts() continue; } + // Add the tetra behind the triangle to the list of tetra to refine m_tetra2Filter.insert(tetraAT[0]); m_carvingPositions.push_back(cInfo->pointA); + + // Add the tetra behind the triangle to the list of tetra to carve if close enough + if (cInfo->dist <= carvingDistance) { + m_tetra2Carv.insert(tetraAT[0]); + } } // If point collision involved (can be surface or inside) take all tetra around the point, if close enough, for refinement @@ -94,11 +108,8 @@ void RefineCarvingPerformer::filterContacts() for (auto tetraId : tetraAV) m_tetra2Filter.insert(tetraId); - if (cInfo->dist <= carvingDistance) { - //const core::topology::BaseMeshTopology::TrianglesAroundVertex& triAV = m_topologyCon->getTrianglesAroundVertex(cInfo->elemId); - - //for (auto triId : triAV) - // m_triIdsToFilter.insert(triId); + if (cInfo->dist <= carvingDistance) + { for (auto tetraId : tetraAV) m_tetra2Carv.insert(tetraId); } @@ -123,7 +134,6 @@ bool RefineCarvingPerformer::runPerformer() } else { - //simpleCarving(); m_tetraAlgo->removeTetrahedra(m_tetra2Carv); m_doRefine = true; } diff --git a/src/InfinyToolkit/CarvingTools/RefineCarvingPerformer.h b/src/InfinyToolkit/CarvingTools/RefineCarvingPerformer.h index 3fd50e0..2846582 100644 --- a/src/InfinyToolkit/CarvingTools/RefineCarvingPerformer.h +++ b/src/InfinyToolkit/CarvingTools/RefineCarvingPerformer.h @@ -37,6 +37,8 @@ class SOFA_INFINYTOOLKIT_API RefineCarvingPerformer : public BaseCarvingPerforme bool initPerformer() override; + void clearContacts() override; + void filterContacts(); bool runPerformer() override; From fa3a5b3181ca46b66cad3f992b0ae914c0edd1bf Mon Sep 17 00:00:00 2001 From: epernod Date: Wed, 27 May 2026 23:45:40 +0200 Subject: [PATCH 3/3] fix commented code --- .../CarvingTools/RefineCarvingPerformer.cpp | 28 +++++++++++-------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/src/InfinyToolkit/CarvingTools/RefineCarvingPerformer.cpp b/src/InfinyToolkit/CarvingTools/RefineCarvingPerformer.cpp index 246b3a4..288951f 100644 --- a/src/InfinyToolkit/CarvingTools/RefineCarvingPerformer.cpp +++ b/src/InfinyToolkit/CarvingTools/RefineCarvingPerformer.cpp @@ -195,20 +195,24 @@ void RefineCarvingPerformer::surfaceCarving() } // check all point dist from carving element - //const SReal invCarv = 1 / carvingDistance * 0.5; - //for (auto pointId : pointsToCheck) - //{ - // Vec3& vertex = vertices[pointId]; - // Vec3 dir = vertex - carvingPosition; - // const SReal dist = dir.norm(); + const SReal invCarv = 1 / carvingDistance * 0.5; + for (auto pointId : pointsToCheck) + { + Vec3& vertex = vertices[pointId]; - // if (dist > carvingDistance) - // continue; + for (const auto& carvingPos : m_carvingPositions) + { + Vec3 dir = vertex - carvingPos; + const SReal dist = dir.norm(); - // SReal factor = (carvingDistance - dist)* invCarv; // ]0, carvingDistance] - // msg_info("RefineCarvingPerformer") << "pointId: " << pointId << " | factor: " << factor << " | carvingDistance: " << carvingDistance << " | dist: " << dist; - // vertex = vertex + dir * factor; - //} + if (dist > carvingDistance) + continue; + + SReal factor = (carvingDistance - dist) * invCarv; // ]0, carvingDistance] + msg_info("RefineCarvingPerformer") << "pointId: " << pointId << " | factor: " << factor << " | carvingDistance: " << carvingDistance << " | dist: " << dist; + vertex = vertex + dir * factor; + } + } }