diff --git a/include/Algo/ImplicitHierarchicalMesh/ihm.hpp b/include/Algo/ImplicitHierarchicalMesh/ihm.hpp index 4f8e26ef557116a197fc6661cbfa62329dd64d56..12b4a85557c2d963defb166d42e90b1490ed31cb 100644 --- a/include/Algo/ImplicitHierarchicalMesh/ihm.hpp +++ b/include/Algo/ImplicitHierarchicalMesh/ihm.hpp @@ -347,11 +347,10 @@ T& AttributeHandler_IHM::operator[](Dart d) unsigned int nbSteps = m->m_curLevel - m->vertexInsertionLevel(d) ; unsigned int index = m->getEmbedding(d, orbit) ; - if(index == EMBNULL && nbSteps == 0) + if(index == EMBNULL) { index = m->embedNewCell(orbit, d) ; m->m_nextLevelCell[orbit]->operator[](index) = EMBNULL ; - return this->m_attrib->operator[](index); } AttributeContainer& cont = m->getAttributeContainer(orbit) ; diff --git a/include/Algo/ImplicitHierarchicalMesh/subdivision.hpp b/include/Algo/ImplicitHierarchicalMesh/subdivision.hpp index 9cbe9ccc53f7aaac741649911e353fdea48b1940..0d3df5930d0c3a79da73561dc62c49d320d1fa6a 100644 --- a/include/Algo/ImplicitHierarchicalMesh/subdivision.hpp +++ b/include/Algo/ImplicitHierarchicalMesh/subdivision.hpp @@ -162,13 +162,39 @@ void coarsenFace(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& position) assert(map.faceIsSubdividedOnce(d) || !"Trying to coarsen a non-subdivided face or a more than once subdivided face") ; unsigned int cur = map.getCurrentLevel() ; - map.setCurrentLevel(cur + 1) ; - Dart cv = map.phi1(map.phi1(d)) ; - map.setCurrentLevel(map.getMaxLevel()) ; - map.deleteVertex(cv) ; - map.setCurrentLevel(cur) ; + + unsigned int degree = 0 ; Dart fit = d ; do + { + ++degree ; + fit = map.phi1(fit) ; + } while(fit != d) ; + + if(degree == 3) + { + fit = d ; + do + { + map.setCurrentLevel(cur + 1) ; + Dart innerEdge = map.phi1(fit) ; + map.setCurrentLevel(map.getMaxLevel()) ; + map.mergeFaces(innerEdge) ; + map.setCurrentLevel(cur) ; + fit = map.phi1(fit) ; + } while(fit != d) ; + } + else + { + map.setCurrentLevel(cur + 1) ; + Dart centralV = map.phi1(map.phi1(d)) ; + map.setCurrentLevel(map.getMaxLevel()) ; + map.deleteVertex(centralV) ; + map.setCurrentLevel(cur) ; + } + + fit = d ; + do { if(map.edgeCanBeCoarsened(fit)) coarsenEdge(map, fit, position) ; diff --git a/include/Topology/generic/embeddedMap2.hpp b/include/Topology/generic/embeddedMap2.hpp index 722a7d4465dae8ec6b19cdd040772f75f5119f34..4fbfa68dd0d53489f0b837c477913ee8f3dd3286 100644 --- a/include/Topology/generic/embeddedMap2.hpp +++ b/include/Topology/generic/embeddedMap2.hpp @@ -397,17 +397,31 @@ template bool EmbeddedMap2::mergeFaces(Dart d) { Dart dNext = MAP2::phi1(d) ; + Dart e = MAP2::phi2(d) ; + Dart eNext = MAP2::phi1(e) ; + unsigned int vEmb1 = EMBNULL ; + unsigned int vEmb2 = EMBNULL ; + if(MAP2::isOrbitEmbedded(VERTEX_ORBIT)) + { + vEmb1 = MAP2::getDartEmbedding(VERTEX_ORBIT, d) ; + vEmb2 = MAP2::getDartEmbedding(VERTEX_ORBIT, e) ; + } unsigned int fEmb = EMBNULL ; if (MAP2::isOrbitEmbedded(FACE_ORBIT)) { fEmb = MAP2::getEmbedding(d, FACE_ORBIT) ; - if(fEmb != EMBNULL) - MAP2::setDartEmbedding(FACE_ORBIT, dNext, fEmb) ; } if(MAP2::mergeFaces(d)) { + if (MAP2::isOrbitEmbedded(VERTEX_ORBIT)) + { + if(vEmb1 != EMBNULL) + MAP2::setDartEmbedding(VERTEX_ORBIT, eNext, vEmb1) ; + if(vEmb2 != EMBNULL) + MAP2::setDartEmbedding(VERTEX_ORBIT, dNext, vEmb2) ; + } if (MAP2::isOrbitEmbedded(FACE_ORBIT)) { MAP2::embedOrbit(FACE_ORBIT, dNext, fEmb) ; diff --git a/src/Algo/ImplicitHierarchicalMesh/ihm.cpp b/src/Algo/ImplicitHierarchicalMesh/ihm.cpp index 95434c7374230bdef5812399c47b31856f19fef3..520a2ec81f0c2ee6e3b8f6b0715f39a7c1298318 100644 --- a/src/Algo/ImplicitHierarchicalMesh/ihm.cpp +++ b/src/Algo/ImplicitHierarchicalMesh/ihm.cpp @@ -284,7 +284,7 @@ bool ImplicitHierarchicalMap::faceIsSubdividedOnce(Dart d) ++m_curLevel ; Dart cf = phi2(phi1(d)) ; ++m_curLevel ; - if(m_dartLevel[phi1(d)] == m_curLevel && m_edgeId[phi1(d)] != m_edgeId[d]) + if(m_dartLevel[phi1(cf)] == m_curLevel && m_edgeId[phi1(cf)] != m_edgeId[cf]) subdOnce = false ; --m_curLevel ; --m_curLevel ;