diff --git a/include/Algo/Multiresolution/map2MR/map2MR_PM.h b/include/Algo/Multiresolution/map2MR/map2MR_PM.h index 8c4f8551b10abe7d595e72117b0d56227109361b..08c4dcb2f0555fd2084de4e284dd5ea2178603e4 100644 --- a/include/Algo/Multiresolution/map2MR/map2MR_PM.h +++ b/include/Algo/Multiresolution/map2MR/map2MR_PM.h @@ -29,6 +29,7 @@ #include "Topology/generic/traversorCell.h" #include "Topology/generic/traversor2.h" +#include "Container/attributeContainer.h" #include "Algo/Decimation/selector.h" #include "Algo/Decimation/edgeSelector.h" diff --git a/include/Algo/Multiresolution/map2MR/map2MR_PM.hpp b/include/Algo/Multiresolution/map2MR/map2MR_PM.hpp index 92a57929e39193a4d11da9a66f71dc294f0937c8..8b80d7f2220428b0081e1c90e0a6abb0675937ee 100644 --- a/include/Algo/Multiresolution/map2MR/map2MR_PM.hpp +++ b/include/Algo/Multiresolution/map2MR/map2MR_PM.hpp @@ -136,15 +136,20 @@ void Map2MR_PM::createPM(Algo::Decimation::SelectorType s, Algo::Decimation template void Map2MR_PM::addNewLevel(unsigned int percentWantedVertices) { - // level handling - m_map.pushLevel() ; - m_map.addLevelBack(); - m_map.duplicateDarts(m_map.getMaxLevel()); - m_map.setCurrentLevel(m_map.getMaxLevel()); - unsigned int nbVertices = m_map.template getNbOrbits() ; unsigned int nbWantedVertices = nbVertices * percentWantedVertices / 100 ; - CGoGNout << " creating PM (" << nbVertices << " vertices).." << /* flush */ CGoGNendl ; + + unsigned int nbDeletedVertex=0; + unsigned int percentWantedPerLevel = 20; + unsigned int nbWantedPerLevel = nbWantedVertices * percentWantedPerLevel / 100 ; + + //create the new level + m_map.addLevelFront(); + m_map.setCurrentLevel(0); + + m_map.printMR(); + + DartMarkerStore me(m_map); //mark edges not to collapse bool finished = false ; Dart d ; @@ -153,39 +158,194 @@ void Map2MR_PM::addNewLevel(unsigned int percentWantedVertices) if(!m_selector->nextEdge(d)) break ; - --nbVertices ; - Dart d2 = m_map.phi2(m_map.phi_1(d)) ; - Dart dd2 = m_map.phi2(m_map.phi_1(m_map.phi2(d))) ; - - for(typename std::vector*>::iterator it = m_approximators.begin(); it != m_approximators.end(); ++it) + if(!me.isMarked(d)) { - (*it)->approximate(d) ; // compute approximated attributes with its associated detail - (*it)->saveApprox(d) ; - } - m_selector->updateBeforeCollapse(d) ; // update selector + //me.mark le 1 voisinage + + Dart dt = d; + do + { + Dart dit = dt; + do + { + me.mark(m_map.phi1(dit)); + me.mark(m_map.phi1(m_map.phi1(dit))); + dit = m_map.phi2(m_map.phi_1(dit)); + } + while(dit != dt); + + dt = m_map.phi1(dt); + }while(dt != d); + + dt = m_map.phi2(d); + do + { + Dart dit = dt; + do + { + me.mark(m_map.phi1(dit)); + me.mark(m_map.phi1(m_map.phi1(dit))); + dit = m_map.phi2(m_map.phi_1(dit)); + } + while(dit != dt); + + dt = m_map.phi1(dt); + }while(dt != m_map.phi2(d)); + - collapseEdge(d); + //incremente le dartLevel des brins des faces supprime + m_map.incDartLevel(d); + m_map.incDartLevel(m_map.phi1(d)); + m_map.incDartLevel(m_map.phi_1(d)); + m_map.incDartLevel(m_map.phi2(d)); + m_map.incDartLevel(m_map.phi_1(m_map.phi2(d))); + m_map.incDartLevel(m_map.phi1(m_map.phi2(d))); - unsigned int newV = m_map.template embedNewCell(d2) ; - unsigned int newE1 = m_map.template embedNewCell(d2) ; - unsigned int newE2 = m_map.template embedNewCell(dd2) ; -// vs->setApproxV(newV) ; -// vs->setApproxE1(newE1) ; -// vs->setApproxE2(newE2) ; + ++nbDeletedVertex ; - for(typename std::vector*>::iterator it = m_approximators.begin(); it != m_approximators.end(); ++it) - (*it)->affectApprox(d2); // affect data to the resulting vertex + Dart d2 = m_map.phi2(m_map.phi_1(d)) ; + Dart dd2 = m_map.phi2(m_map.phi_1(m_map.phi2(d))) ; - m_selector->updateAfterCollapse(d2, dd2) ; // update selector + m_selector->updateBeforeCollapse(d) ; // update selector - if(nbVertices <= nbWantedVertices) - finished = true ; + collapseEdge(d); + + m_selector->updateAfterCollapse(d2, dd2) ; // update selector + + if(nbDeletedVertex <= nbWantedPerLevel) + finished = true ; + } } - m_map.popLevel(); - CGoGNout << "..done (" << nbVertices << " vertices)" << CGoGNendl ; + CGoGNout << "..done (" << nbDeletedVertex << " vertices)" << CGoGNendl ; + + m_map.printMR(); + + +// DartMarkerStore me(m_map); //mark edges not to collapse +// DartMarkerStore mc(m_map); //mark darts to collapse +// std::vector ec; //save a dart from edge to collapse +// +// for(Dart d = m_map.begin() ; d != m_map.end() ; m_map.next(d)) +// { +// if(!me.isMarked(d)) +// { +// Dart dt = d; +// do +// { +// Dart dit = dt; +// do +// { +// me.mark(m_map.phi1(dit)); +// me.mark(m_map.phi1(m_map.phi1(dit))); +// dit = m_map.phi2(m_map.phi_1(dit)); +// } +// while(dit != dt); +// +// dt = m_map.phi1(dt); +// }while(dt != d); +// +// dt = m_map.phi2(d); +// do +// { +// Dart dit = dt; +// do +// { +// me.mark(m_map.phi1(dit)); +// me.mark(m_map.phi1(m_map.phi1(dit))); +// dit = m_map.phi2(m_map.phi_1(dit)); +// } +// while(dit != dt); +// +// dt = m_map.phi1(dt); +// }while(dt != m_map.phi2(d)); +// +// +// ec.push_back(d); +// +// mc.mark(d); +// mc.mark(m_map.phi1(d)); +// mc.mark(m_map.phi_1(d)); +// mc.mark(m_map.phi2(d)); +// mc.mark(m_map.phi_1(m_map.phi2(d))); +// mc.mark(m_map.phi1(m_map.phi2(d))); +// } +// } + +// //create the new level +// m_map.addLevelFront(); +// +// AttributeContainer& cont = m_map.getMRAttributeContainer(); +// AttributeMultiVector* amv = m_map.getMRDartAttributeVector(m_map.getCurrentLevel()); +// for(unsigned int i = cont.begin() ; i < cont.end() ; cont.next(i)) +// { +// if(mc.isMarked((*amv)[i]) || (*amv)[i] == NULL) +// { +// //mrlevel++ +// } +// +// +// //(*amv)[i] = MRNULL ; +// } +// +// +// for(std::vector::iterator it = ec.begin() ; it != ec.end() ; ++it) +// { +// +// } + +// // level handling +// m_map.pushLevel() ; +// m_map.addLevelBack(); +// m_map.duplicateDarts(m_map.getMaxLevel()); +// m_map.setCurrentLevel(m_map.getMaxLevel()); +// +// unsigned int nbVertices = m_map.template getNbOrbits() ; +// unsigned int nbWantedVertices = nbVertices * percentWantedVertices / 100 ; +// CGoGNout << " creating PM (" << nbVertices << " vertices).." << /* flush */ CGoGNendl ; +// +// bool finished = false ; +// Dart d ; +// while(!finished) +// { +// if(!m_selector->nextEdge(d)) +// break ; +// +// --nbVertices ; +// Dart d2 = m_map.phi2(m_map.phi_1(d)) ; +// Dart dd2 = m_map.phi2(m_map.phi_1(m_map.phi2(d))) ; +// +// for(typename std::vector*>::iterator it = m_approximators.begin(); it != m_approximators.end(); ++it) +// { +// (*it)->approximate(d) ; // compute approximated attributes with its associated detail +// (*it)->saveApprox(d) ; +// } +// +// m_selector->updateBeforeCollapse(d) ; // update selector +// +// collapseEdge(d); +// +// unsigned int newV = m_map.template embedNewCell(d2) ; +// unsigned int newE1 = m_map.template embedNewCell(d2) ; +// unsigned int newE2 = m_map.template embedNewCell(dd2) ; +//// vs->setApproxV(newV) ; +//// vs->setApproxE1(newE1) ; +//// vs->setApproxE2(newE2) ; +// +// for(typename std::vector*>::iterator it = m_approximators.begin(); it != m_approximators.end(); ++it) +// (*it)->affectApprox(d2); // affect data to the resulting vertex +// +// m_selector->updateAfterCollapse(d2, dd2) ; // update selector +// +// if(nbVertices <= nbWantedVertices) +// finished = true ; +// } +// +// m_map.popLevel(); +// +// CGoGNout << "..done (" << nbVertices << " vertices)" << CGoGNendl ; } @@ -193,21 +353,14 @@ template void Map2MR_PM::collapseEdge(Dart d) { //duplication : - m_map.duplicateMRDart(m_map.phi2(m_map.phi1(d))); - m_map.duplicateMRDart(m_map.phi2(m_map.phi_1(d))); - m_map.duplicateMRDart(m_map.phi2(m_map.phi1(m_map.phi2(d)))); - m_map.duplicateMRDart(m_map.phi2(m_map.phi_1(m_map.phi2(d)))); + m_map.duplicateDart(m_map.phi2(m_map.phi1(d))); + m_map.duplicateDart(m_map.phi2(m_map.phi_1(d))); + m_map.duplicateDart(m_map.phi2(m_map.phi1(m_map.phi2(d)))); + m_map.duplicateDart(m_map.phi2(m_map.phi_1(m_map.phi2(d)))); - //effacer : -// m_map.unrefMRDart(m_map.phi1(m_map.phi2(d))); -// m_map.unrefMRDart(m_map.phi_1(m_map.phi2(d))); -// m_map.unrefMRDart(m_map.phi2(d)); -// -// m_map.unrefMRDart(m_map.phi1(d)); -// m_map.unrefMRDart(m_map.phi_1(d)); -// m_map.unrefMRDart(d); + //m_map.collapseEdge(d); - m_map.collapseEdge(d); + m_map.extractTrianglePair(d); } diff --git a/include/Algo/Multiresolution/map2MR/map2MR_PrimalAdapt.h b/include/Algo/Multiresolution/map2MR/map2MR_PrimalAdapt.h index 67ae5060c276e7a33b6de9c20663a91ea85e81d5..22abbe493954236fea11d462adb6284468c76d61 100644 --- a/include/Algo/Multiresolution/map2MR/map2MR_PrimalAdapt.h +++ b/include/Algo/Multiresolution/map2MR/map2MR_PrimalAdapt.h @@ -34,7 +34,6 @@ namespace CGoGN { -} namespace Algo { @@ -124,19 +123,6 @@ public: * SUBDIVISION * ***************************************************/ - /** - * add a new resolution level - */ - void addNewLevel(bool embedNewVertices = true) ; - - void propagateDartRelation(Dart d, AttributeMultiVector* rel) ; - - template - void propagateDartEmbedding(Dart d) ; - - template - void propagateOrbitEmbedding(Dart d) ; - Dart cutEdge(Dart d) ; void splitFace(Dart d, Dart e) ; @@ -155,7 +141,9 @@ public: /** * subdivide the face of d to the next level */ - unsigned int subdivideFace(Dart d) ; + unsigned int subdivideFace(Dart d, bool triQuad = true) ; + + unsigned int subdivideFace2(Dart d) ; /** * coarsen the face of d from the next level diff --git a/include/Algo/Multiresolution/map2MR/map2MR_PrimalAdapt.hpp b/include/Algo/Multiresolution/map2MR/map2MR_PrimalAdapt.hpp index e8a3470d95aee6cbf40e605cc463976aae21d429..d5a10f2c856f738575c0c3d6133bd467d13f4fe4 100644 --- a/include/Algo/Multiresolution/map2MR/map2MR_PrimalAdapt.hpp +++ b/include/Algo/Multiresolution/map2MR/map2MR_PrimalAdapt.hpp @@ -56,25 +56,25 @@ Map2MR::Map2MR(typename PFP::MAP& map) : template unsigned int Map2MR::edgeLevel(Dart d) { - assert(getDartLevel(d) <= getCurrentLevel() || !"edgeLevel : called with a dart inserted after current level") ; + assert(m_map.getDartLevel(d) <= m_map.getCurrentLevel() || !"edgeLevel : called with a dart inserted after current level") ; - unsigned int ld = getDartLevel(d) ; - unsigned int ldd = getDartLevel(phi2(d)) ; // the level of an edge is the maximum of the + unsigned int ld = m_map.getDartLevel(d) ; + unsigned int ldd = m_map.getDartLevel(m_map.phi2(d)) ; // the level of an edge is the maximum of the return ld > ldd ? ld : ldd ; // insertion levels of its two darts } template unsigned int Map2MR::faceLevel(Dart d) { - assert(getDartLevel(d) <= getCurrentLevel() || !"faceLevel : called with a dart inserted after current level") ; + assert(m_map.getDartLevel(d) <= m_map.getCurrentLevel() || !"faceLevel : called with a dart inserted after current level") ; - if(getCurrentLevel() == 0) + if(m_map.getCurrentLevel() == 0) return 0 ; Dart it = d ; - unsigned int min1 = getDartLevel(it) ; // the level of a face is the second minimum of the - it = phi1(it) ; - unsigned int min2 = getDartLevel(it) ; // insertion levels of its darts + unsigned int min1 = m_map.getDartLevel(it) ; // the level of a face is the second minimum of the + it = m_map.phi1(it) ; + unsigned int min2 = m_map.getDartLevel(it) ; // insertion levels of its darts if(min2 < min1) { @@ -83,10 +83,10 @@ unsigned int Map2MR::faceLevel(Dart d) min2 = tmp ; } - it = phi1(it) ; + it = m_map.phi1(it) ; while(it != d) { - unsigned int dl = getDartLevel(it) ; + unsigned int dl = m_map.getDartLevel(it) ; if(dl < min2) { if(dl < min1) @@ -97,7 +97,7 @@ unsigned int Map2MR::faceLevel(Dart d) else min2 = dl ; } - it = phi1(it) ; + it = m_map.phi1(it) ; } return min2 ; @@ -106,32 +106,32 @@ unsigned int Map2MR::faceLevel(Dart d) template Dart Map2MR::faceOrigin(Dart d) { - assert(getDartLevel(d) <= getCurrentLevel() || !"faceOrigin : called with a dart inserted after current level") ; + assert(m_map.getDartLevel(d) <= m_map.getCurrentLevel() || !"faceOrigin : called with a dart inserted after current level") ; - pushLevel() ; + m_map.pushLevel() ; Dart p = d ; - unsigned int pLevel = getDartLevel(p) ; + unsigned int pLevel = m_map.getDartLevel(p) ; while(pLevel > 0) { - p = faceOldestDart(p) ; - pLevel = getDartLevel(p) ; - setCurrentLevel(pLevel) ; + p = m_map.faceOldestDart(p) ; + pLevel = m_map.getDartLevel(p) ; + m_map.setCurrentLevel(pLevel) ; } - popLevel() ; + m_map.popLevel() ; return p ; } template Dart Map2MR::faceOldestDart(Dart d) { - assert(getDartLevel(d) <= getCurrentLevel() || !"faceOldestDart : called with a dart inserted after current level") ; + assert(m_map.getDartLevel(d) <= m_map.getCurrentLevel() || !"faceOldestDart : called with a dart inserted after current level") ; Dart it = d ; Dart oldest = it ; - unsigned int l_old = getDartLevel(oldest) ; + unsigned int l_old = m_map.getDartLevel(oldest) ; do { - unsigned int l = getDartLevel(it) ; + unsigned int l = m_map.getDartLevel(it) ; if(l == 0) return it ; if(l < l_old) @@ -139,7 +139,7 @@ Dart Map2MR::faceOldestDart(Dart d) oldest = it ; l_old = l ; } - it = phi1(it) ; + it = m_map.phi1(it) ; } while(it != d) ; return oldest ; } @@ -147,15 +147,15 @@ Dart Map2MR::faceOldestDart(Dart d) template bool Map2MR::edgeIsSubdivided(Dart d) { - assert(getDartLevel(d) <= getCurrentLevel() || !"edgeIsSubdivided : called with a dart inserted after current level") ; + assert(m_map.getDartLevel(d) <= m_map.getCurrentLevel() || !"edgeIsSubdivided : called with a dart inserted after current level") ; - if(getCurrentLevel() == getMaxLevel()) + if(m_map.getCurrentLevel() == m_map.getMaxLevel()) return false ; - Dart d2 = phi2(d) ; - incCurrentLevel() ; - Dart d2_l = phi2(d) ; - decCurrentLevel() ; + Dart d2 = m_map.phi2(d) ; + m_map.incCurrentLevel() ; + Dart d2_l = m_map.phi2(d) ; + m_map.decCurrentLevel() ; if(d2 != d2_l) return true ; else @@ -165,22 +165,22 @@ bool Map2MR::edgeIsSubdivided(Dart d) template bool Map2MR::edgeCanBeCoarsened(Dart d) { - assert(getDartLevel(d) <= getCurrentLevel() || !"edgeCanBeCoarsened : called with a dart inserted after current level") ; + assert(m_map.getDartLevel(d) <= m_map.getCurrentLevel() || !"edgeCanBeCoarsened : called with a dart inserted after current level") ; if(edgeIsSubdivided(d)) { bool subdOnce = true ; bool degree2 = false ; - Dart d2 = phi2(d) ; - incCurrentLevel() ; - if(vertexDegree(phi1(d)) == 2) + Dart d2 = m_map.phi2(d) ; + m_map.incCurrentLevel() ; + if(m_map.vertexDegree(m_map.phi1(d)) == 2) { degree2 = true ; if(edgeIsSubdivided(d) || edgeIsSubdivided(d2)) subdOnce = false ; } - decCurrentLevel() ; + m_map.decCurrentLevel() ; return degree2 && subdOnce ; } @@ -191,75 +191,75 @@ bool Map2MR::edgeCanBeCoarsened(Dart d) template bool Map2MR::faceIsSubdivided(Dart d) { - assert(getDartLevel(d) <= getCurrentLevel() || !"faceIsSubdivided : called with a dart inserted after current level") ; + assert(m_map.getDartLevel(d) <= m_map.getCurrentLevel() || !"faceIsSubdivided : called with a dart inserted after current level") ; - if(getCurrentLevel() == getMaxLevel()) + if(m_map.getCurrentLevel() == m_map.getMaxLevel()) return false ; unsigned int fLevel = faceLevel(d) ; - if(fLevel < getCurrentLevel()) // a face whose level in the current level map is lower than + if(fLevel < m_map.getCurrentLevel()) // a face whose level in the current level map is lower than return false ; // the current level can not be subdivided to higher levels bool subd = false ; - incCurrentLevel() ; - if(getDartLevel(phi1(phi1(d))) == getCurrentLevel()) + m_map.incCurrentLevel() ; + if(m_map.getDartLevel(m_map.phi1(m_map.phi1(d))) == m_map.getCurrentLevel()) subd = true ; - decCurrentLevel() ; + m_map.decCurrentLevel() ; return subd ; } template bool Map2MR::faceIsSubdividedOnce(Dart d) { - assert(getDartLevel(d) <= getCurrentLevel() || !"faceIsSubdividedOnce : called with a dart inserted after current level") ; + assert(m_map.getDartLevel(d) <= m_map.getCurrentLevel() || !"faceIsSubdividedOnce : called with a dart inserted after current level") ; - if(getCurrentLevel() == getMaxLevel()) + if(m_map.getCurrentLevel() == m_map.getMaxLevel()) return false ; unsigned int fLevel = faceLevel(d) ; - if(fLevel < getCurrentLevel()) // a face whose level in the current level map is lower than + if(fLevel < m_map.getCurrentLevel()) // a face whose level in the current level map is lower than return false ; // the current level can not be subdivided to higher levels unsigned int degree = 0 ; bool subd = false ; bool subdOnce = true ; - incCurrentLevel() ; - if(getDartLevel(phi1(phi1(d))) == getCurrentLevel()) + m_map.incCurrentLevel() ; + if(m_map.getDartLevel(m_map.phi1(m_map.phi1(d))) == m_map.getCurrentLevel()) subd = true ; - decCurrentLevel() ; + m_map.decCurrentLevel() ; if(subd) { - incCurrentLevel() ; + m_map.incCurrentLevel() ; - if(getCurrentLevel() == getMaxLevel()) + if(m_map.getCurrentLevel() == m_map.getMaxLevel()) { - decCurrentLevel() ; + m_map.decCurrentLevel() ; return true ; } Dart fit = d ; do { - incCurrentLevel() ; - if(getDartLevel(phi1(phi1(fit))) == getCurrentLevel()) + m_map.incCurrentLevel() ; + if(m_map.getDartLevel(m_map.phi1(m_map.phi1(fit))) == m_map.getCurrentLevel()) subdOnce = false ; - decCurrentLevel() ; + m_map.decCurrentLevel() ; ++degree ; - fit = phi1(fit) ; + fit = m_map.phi1(fit) ; } while(subdOnce && fit != d) ; if(degree == 3 && subdOnce) { - Dart cf = phi2(phi1(d)) ; - incCurrentLevel() ; - if(getDartLevel(phi1(phi1(cf))) == getCurrentLevel()) + Dart cf = m_map.phi2(m_map.phi1(d)) ; + m_map.incCurrentLevel() ; + if(m_map.getDartLevel(m_map.phi1(m_map.phi1(cf))) == m_map.getCurrentLevel()) subdOnce = false ; - decCurrentLevel() ; + m_map.decCurrentLevel() ; } - decCurrentLevel() ; + m_map.decCurrentLevel() ; return subdOnce ; } @@ -272,280 +272,196 @@ bool Map2MR::faceIsSubdividedOnce(Dart d) ***************************************************/ template -void Map2MR::addNewLevel(bool embedNewVertices) +Dart Map2MR::cutEdge(Dart d) { - addLevelBack() ; -} + Dart dd = m_map.phi2(d) ; + Dart d1 = m_map.phi1(d); + Dart dd1 = m_map.phi1(dd); -template -void Map2MR::propagateDartRelation(Dart d, AttributeMultiVector* rel) -{ - Dart dd = (*rel)[dartIndex(d)] ; - pushLevel() ; - for(unsigned int i = getCurrentLevel() + 1; i <= getMaxLevel(); ++i) - { - setCurrentLevel(i) ; - (*rel)[dartIndex(d)] = dd ; - } - popLevel() ; -} + m_map.duplicateDart(d); + m_map.duplicateDart(dd); + m_map.duplicateDart(d1); + m_map.duplicateDart(dd1); -template -template -void Map2MR::propagateDartEmbedding(Dart d) -{ - unsigned int emb = getEmbedding(d) ; - pushLevel() ; - for(unsigned int i = getCurrentLevel() + 1; i <= getMaxLevel(); ++i) - { - setCurrentLevel(i) ; - setDartEmbedding( d, emb) ; - } - popLevel() ; -} + Dart nd = m_map.cutEdge(d) ; -template -template -void Map2MR::propagateOrbitEmbedding(Dart d) -{ - unsigned int emb = getEmbedding(d) ; - pushLevel() ; - for(unsigned int i = getCurrentLevel() + 1; i <= getMaxLevel(); ++i) - { - setCurrentLevel(i) ; - embedOrbit(d, emb) ; - } - popLevel() ; + return nd ; } -//Dart Map2MR::cutEdge(Dart d) -//{ -// Dart dd = phi2(d) ; -// -// Dart d1 = newDart() ; -// Dart dd1 = newDart() ; -// -// pushLevel() ; -// for(unsigned int i = getCurrentLevel(); i <= getMaxLevel(); ++i) -// { -// setCurrentLevel(i) ; -// -// phi2unsew(d) ; -// -// phi1sew(d, d1) ; -// if (isBoundaryMarked(d)) -// boundaryMark(d1) ; -// -// phi1sew(dd, dd1) ; -// if (isBoundaryMarked(dd)) -// boundaryMark(dd1) ; -// -// phi2sew(d, dd1) ; -// phi2sew(dd, d1) ; -// } -// popLevel() ; -// -// return d1 ; -//} - template -Dart Map2MR::cutEdge(Dart d) +void Map2MR::splitFace(Dart d, Dart e) { - Dart dd = phi2(d) ; - Dart d1 = EmbeddedMap2::cutEdge(d) ; - Dart dd1 = phi1(dd) ; - Dart d11 = phi1(d1) ; - Dart dd11 = phi1(dd1) ; - - propagateDartRelation(d, m_phi1) ; - propagateDartRelation(d, m_phi2) ; - propagateDartRelation(dd, m_phi1) ; - propagateDartRelation(dd, m_phi2) ; - propagateDartRelation(d1, m_phi1) ; - propagateDartRelation(d1, m_phi_1) ; - propagateDartRelation(d1, m_phi2) ; - propagateDartRelation(dd1, m_phi1) ; - propagateDartRelation(dd1, m_phi_1) ; - propagateDartRelation(dd1, m_phi2) ; - propagateDartRelation(d11, m_phi_1) ; - propagateDartRelation(dd11, m_phi_1) ; - - return d1 ; -} + Dart dprev = m_map.phi_1(d) ; + Dart eprev = m_map.phi_1(e) ; -//void Map2MR::splitFace(Dart d, Dart e) -//{ -// Dart dprev = phi_1(d) ; -// Dart eprev = phi_1(e) ; -// -// Dart dd = newDart() ; -// Dart ee = newDart() ; -// -// pushLevel() ; -// for(unsigned int i = getCurrentLevel(); i <= getMaxLevel(); ++i) -// { -// setCurrentLevel(i) ; -// -// phi1sew(dprev, dd) ; -// if (isBoundaryMarked(dprev)) -// boundaryMark(dd); -// -// phi1sew(eprev, ee) ; -// if (isBoundaryMarked(eprev)) -// boundaryMark(ee); -// -// phi1sew(dprev, eprev) ; -// -// phi2sew(dd, ee) ; -// -// copyDartEmbedding(ee, d) ; -// copyDartEmbedding(dd, e) ; -// } -// popLevel() ; -//} + m_map.duplicateDart(d); + m_map.duplicateDart(e); + m_map.duplicateDart(dprev); + m_map.duplicateDart(eprev); -template -void Map2MR::splitFace(Dart d, Dart e) -{ - Dart dprev = phi_1(d) ; - Dart eprev = phi_1(e) ; - EmbeddedMap2::splitFace(d, e) ; - Dart dd = phi1(dprev) ; - Dart ee = phi1(eprev) ; - - propagateDartRelation(d, m_phi_1) ; - propagateDartRelation(e, m_phi_1) ; - propagateDartRelation(dd, m_phi1) ; - propagateDartRelation(dd, m_phi_1) ; - propagateDartRelation(dd, m_phi2) ; - propagateDartRelation(ee, m_phi1) ; - propagateDartRelation(ee, m_phi_1) ; - propagateDartRelation(ee, m_phi2) ; - propagateDartRelation(dprev, m_phi1) ; - propagateDartRelation(eprev, m_phi1) ; - - propagateDartEmbedding(dd) ; - propagateDartEmbedding(ee) ; + m_map.splitFace(d, e) ; } template void Map2MR::subdivideEdge(Dart d) { - assert(getDartLevel(d) <= getCurrentLevel() || !"subdivideEdge : called with a dart inserted after current level") ; + assert(m_map.getDartLevel(d) <= m_map.getCurrentLevel() || !"subdivideEdge : called with a dart inserted after current level") ; assert(!edgeIsSubdivided(d) || !"Trying to subdivide an already subdivided edge") ; - assert(getCurrentLevel() == edgeLevel(d) || !"Trying to subdivide an edge on a bad current level") ; + assert(m_map.getCurrentLevel() == edgeLevel(d) || !"Trying to subdivide an edge on a bad current level") ; - incCurrentLevel() ; + m_map.incCurrentLevel() ; - Dart d1 = cutEdge(d) ; - Dart dd1 = phi2(d) ; + Dart nd = cutEdge(d) ; - (*edgeVertexFunctor)(d1) ; - propagateDartEmbedding(d1) ; - propagateDartEmbedding(dd1) ; + (*edgeVertexFunctor)(nd) ; - decCurrentLevel() ; + m_map.decCurrentLevel() ; } template void Map2MR::coarsenEdge(Dart d) { - assert(getDartLevel(d) <= getCurrentLevel() || !"coarsenEdge : called with a dart inserted after current level") ; + assert(m_map.getDartLevel(d) <= m_map.getCurrentLevel() || !"coarsenEdge : called with a dart inserted after current level") ; assert(edgeCanBeCoarsened(d) || !"Trying to coarsen an edge that can not be coarsened") ; - incCurrentLevel() ; - uncutEdge(d) ; - decCurrentLevel() ; + m_map.incCurrentLevel() ; + m_map.uncutEdge(d) ; + m_map.decCurrentLevel() ; - unsigned int maxL = getMaxLevel() ; - if(getCurrentLevel() == maxL - 1 && getNbInsertedDarts(maxL) == 0) - removeLevelBack() ; + unsigned int maxL = m_map.getMaxLevel() ; + if(m_map.getCurrentLevel() == maxL - 1 && m_map.getNbInsertedDarts(maxL) == 0) + m_map.removeLevelBack() ; } template -unsigned int Map2MR::subdivideFace(Dart d) +unsigned int Map2MR::subdivideFace(Dart d, bool triQuad) { - assert(getDartLevel(d) <= getCurrentLevel() || !"subdivideFace : called with a dart inserted after current level") ; + assert(m_map.getDartLevel(d) <= m_map.getCurrentLevel() || !"subdivideFace : called with a dart inserted after current level") ; assert(!faceIsSubdivided(d) || !"Trying to subdivide an already subdivided face") ; unsigned int fLevel = faceLevel(d) ; Dart old = faceOldestDart(d) ; - pushLevel() ; - setCurrentLevel(fLevel) ; // go to the level of the face to subdivide its edges + m_map.pushLevel() ; + m_map.setCurrentLevel(fLevel) ; // go to the level of the face to subdivide its edges - if(getCurrentLevel() == getMaxLevel()) - addNewLevel() ; + if(m_map.getCurrentLevel() == m_map.getMaxLevel()) + m_map.addLevelBack(); unsigned int degree = 0 ; Dart it = old ; do { ++degree ; // compute the degree of the face -// Dart nf = phi2(it) ; +// Dart nf = m_map.phi2(it) ; // if(faceLevel(nf) == fLevel - 1) // check if neighboring faces have to be subdivided first // subdivideFace(nf) ; if(!edgeIsSubdivided(it)) subdivideEdge(it) ; // and cut the edges (if they are not already) - it = phi1(it) ; + it = m_map.phi1(it) ; } while(it != old) ; - setCurrentLevel(fLevel + 1) ; // go to the next level to perform face subdivision + m_map.setCurrentLevel(fLevel + 1) ; // go to the next level to perform face subdivision - if(degree == 3) // if subdividing a triangle + if(degree == 3 && triQuad) // if subdividing a triangle { - Dart dd = phi1(old) ; - Dart e = phi1(dd) ; + Dart dd = m_map.phi1(old) ; + Dart e = m_map.phi1(dd) ; (*vertexVertexFunctor)(e) ; - propagateOrbitEmbedding(e) ; - e = phi1(e) ; + e = m_map.phi1(e) ; splitFace(dd, e) ; dd = e ; - e = phi1(dd) ; + e = m_map.phi1(dd) ; (*vertexVertexFunctor)(e) ; - propagateOrbitEmbedding(e) ; - e = phi1(e) ; + e = m_map.phi1(e) ; splitFace(dd, e) ; dd = e ; - e = phi1(dd) ; + e = m_map.phi1(dd) ; (*vertexVertexFunctor)(e) ; - propagateOrbitEmbedding(e) ; - e = phi1(e) ; + e = m_map.phi1(e) ; splitFace(dd, e) ; } else // if subdividing a polygonal face { - Dart dd = phi1(old) ; - Dart next = phi1(dd) ; + Dart dd = m_map.phi1(old) ; + Dart next = m_map.phi1(dd) ; (*vertexVertexFunctor)(next) ; - propagateOrbitEmbedding(next) ; - next = phi1(next) ; + next = m_map.phi1(next) ; splitFace(dd, next) ; // insert a first edge - Dart ne = alpha1(dd) ; + Dart ne = m_map.alpha1(dd) ; cutEdge(ne) ; // cut the new edge to insert the central vertex - dd = phi1(next) ; + dd = m_map.phi1(next) ; (*vertexVertexFunctor)(dd) ; - propagateOrbitEmbedding(dd) ; - dd = phi1(dd) ; + dd = m_map.phi1(dd) ; while(dd != ne) // turn around the face and insert new edges { // linked to the central vertex - splitFace(phi1(ne), dd) ; - dd = phi1(dd) ; + splitFace(m_map.phi1(ne), dd) ; + dd = m_map.phi1(dd) ; (*vertexVertexFunctor)(dd) ; - propagateOrbitEmbedding(dd) ; - dd = phi1(dd) ; + dd = m_map.phi1(dd) ; } - (*faceVertexFunctor)(phi2(ne)) ; - propagateOrbitEmbedding(phi2(ne)) ; + (*faceVertexFunctor)(m_map.phi1(ne)) ; } - popLevel() ; + m_map.popLevel() ; + + return fLevel ; +} + +template +unsigned int Map2MR::subdivideFace2(Dart d) +{ + assert(m_map.getDartLevel(d) <= m_map.getCurrentLevel() || !"subdivideFace : called with a dart inserted after current level") ; + assert(!faceIsSubdivided(d) || !"Trying to subdivide an already subdivided face") ; + + unsigned int fLevel = faceLevel(d) ; + Dart old = faceOldestDart(d) ; + + std::cout << "face level " << fLevel << std::endl; + std::cout << "oldestDart " << old << std::endl; + + m_map.pushLevel() ; + m_map.setCurrentLevel(fLevel) ; // go to the level of the face to subdivide its edges + + if(m_map.getCurrentLevel() == m_map.getMaxLevel()) + { + std::cout << "addLevelBack" << std::endl; + m_map.addLevelBack(); + } + + unsigned int degree = 3 ; + Dart it = old ; + + if(!edgeIsSubdivided(it)) + { + std::cout << "1" << std::endl; + subdivideEdge(it) ; + } + it = m_map.phi1(it) ; + + if(!edgeIsSubdivided(it)) + { + std::cout << "2" << std::endl; + subdivideEdge(it) ; + } + it = m_map.phi1(it) ; + + if(!edgeIsSubdivided(it)) + { + std::cout << "3" << std::endl; + subdivideEdge(it) ; + } + it = m_map.phi1(it) ; + + std::cout << "degree = " << degree << std::endl; + + m_map.popLevel() ; return fLevel ; } @@ -553,7 +469,7 @@ unsigned int Map2MR::subdivideFace(Dart d) template void Map2MR::coarsenFace(Dart d) { - assert(getDartLevel(d) <= getCurrentLevel() || !"coarsenFace : called with a dart inserted after current level") ; + assert(m_map.getDartLevel(d) <= m_map.getCurrentLevel() || !"coarsenFace : called with a dart inserted after current level") ; assert(faceIsSubdividedOnce(d) || !"Trying to coarsen a non-subdivided face or a more than once subdivided face") ; unsigned int degree = 0 ; @@ -561,7 +477,7 @@ void Map2MR::coarsenFace(Dart d) do { ++degree ; - fit = phi1(fit) ; + fit = m_map.phi1(fit) ; } while(fit != d) ; if(degree == 3) @@ -569,21 +485,21 @@ void Map2MR::coarsenFace(Dart d) fit = d ; do { - incCurrentLevel() ; - Dart innerEdge = phi1(fit) ; - setCurrentLevel(getMaxLevel()) ; - mergeFaces(innerEdge) ; - decCurrentLevel() ; - fit = phi1(fit) ; + m_map.incCurrentLevel() ; + Dart innerEdge = m_map.phi1(fit) ; + m_map.setCurrentLevel(m_map.getMaxLevel()) ; + m_map.mergeFaces(innerEdge) ; + m_map.decCurrentLevel() ; + fit = m_map.phi1(fit) ; } while(fit != d) ; } else { - incCurrentLevel() ; - Dart centralV = phi1(phi1(d)) ; - setCurrentLevel(getMaxLevel()) ; - deleteVertex(centralV) ; - decCurrentLevel() ; + m_map.incCurrentLevel() ; + Dart centralV = m_map.phi1(m_map.phi1(d)) ; + m_map.setCurrentLevel(m_map.getMaxLevel()) ; + m_map.deleteVertex(centralV) ; + m_map.decCurrentLevel() ; } fit = d ; @@ -591,12 +507,12 @@ void Map2MR::coarsenFace(Dart d) { if(edgeCanBeCoarsened(fit)) coarsenEdge(fit) ; - fit = phi1(fit) ; + fit = m_map.phi1(fit) ; } while(fit != d) ; - unsigned int maxL = getMaxLevel() ; - if(getCurrentLevel() == maxL - 1 && getNbInsertedDarts(maxL) == 0) - removeLevelBack() ; + unsigned int maxL = m_map.getMaxLevel() ; + if(m_map.getCurrentLevel() == maxL - 1 && m_map.getNbInsertedDarts(maxL) == 0) + m_map.removeLevelBack() ; } } // namespace Adaptive diff --git a/include/Algo/Render/GL2/topoRender.hpp b/include/Algo/Render/GL2/topoRender.hpp index e48ade93dec7969017e39e48efd2a639be8adc24..fb100dbca06bc690b37b70eef8331d00e94c6c4d 100644 --- a/include/Algo/Render/GL2/topoRender.hpp +++ b/include/Algo/Render/GL2/topoRender.hpp @@ -120,7 +120,8 @@ void TopoRender::updateDataMap(typename PFP::MAP& mapx, const VertexAttribute* addLevel(); +//private: +// /* +// * add a resolution level +// */ +// AttributeMultiVector* addLevel(); public: /** @@ -268,14 +268,9 @@ public: void duplicateDarts(unsigned int level); /** - * - */ - void duplicateMRDart(Dart d); - - /** - * + * duplicate a dart starting from current level */ - void unrefMRDart(Dart d); + void duplicateDart(Dart d) ; /**************************************** * DARTS MANAGEMENT * @@ -296,11 +291,6 @@ protected: */ unsigned int copyDartLine(unsigned int index) ; - /** - * duplicate a dart starting from current level - */ - void duplicateDart(Dart d) ; - /** * Properly deletes a dart in m_attribs[DART] */ @@ -317,6 +307,12 @@ public: */ unsigned int getDartLevel(Dart d) const ; + /** + * + */ + void incDartLevel(Dart d) const ; + + /** * get the number of darts inserted in the given leveldart (use only in MRMaps) */ @@ -463,6 +459,16 @@ public: template AttributeMultiVector* getEmbeddingAttributeVector() ; + /** + * get the MR attribute container + */ + AttributeContainer& getMRAttributeContainer() ; + + /** + * get the MR attribute container + */ + AttributeMultiVector* getMRDartAttributeVector(unsigned int level) ; + // /** // * swap two attribute containers // */ @@ -486,6 +492,8 @@ public: */ void viewAttributesTables() ; + void printDartsTable(); + protected: /**************************************** * EMBEDDING ATTRIBUTES MANAGEMENT * diff --git a/include/Topology/generic/genericmap.hpp b/include/Topology/generic/genericmap.hpp index bbd7a82878348b4249bafd3d1cdc321335f4fbbe..64f12aec36174533fb71d5689cacf167452589a2 100644 --- a/include/Topology/generic/genericmap.hpp +++ b/include/Topology/generic/genericmap.hpp @@ -77,13 +77,14 @@ inline unsigned int GenericMap::getMaxLevel() return m_mrDarts.size() - 1 ; } + /**************************************** * DARTS MANAGEMENT * ****************************************/ inline Dart GenericMap::newDart() { - unsigned int di = m_attribs[DART].insertLine(); // insert a new dart line + unsigned int di = m_attribs[DART].insertLine(); // insert a new dart line for(unsigned int i = 0; i < NB_ORBITS; ++i) { if (m_embeddings[i]) // set all its embeddings @@ -97,16 +98,11 @@ inline Dart GenericMap::newDart() m_mrNbDarts[m_mrCurrentLevel]++ ; for(unsigned int i = 0; i < m_mrCurrentLevel; ++i) // for all previous levels - (*m_mrDarts[i])[mrdi] = MRNULL ; // this MRdart does not exist + (*m_mrDarts[i])[mrdi] = MRNULL ; // this MRdart does not exist for(unsigned int i = m_mrCurrentLevel; i < m_mrDarts.size(); ++i) // for all levels from current to max (*m_mrDarts[i])[mrdi] = di ; // make this MRdart point to the new dart line - (*m_mrDarts[m_mrCurrentLevel])[mrdi] = di ; // for the current level, this MRdart points to the new dart line - -// for(unsigned int i = m_mrCurrentLevel + 1; i < m_mrDarts.size(); ++i) // for all levels from current + 1 to max -// (*m_mrDarts[i])[mrdi] = copyDartLine(di) ; // make this MRdart point to a copy of the new dart line - return Dart::create(mrdi) ; } @@ -119,10 +115,17 @@ inline void GenericMap::deleteDart(Dart d) { unsigned int index = (*m_mrDarts[m_mrCurrentLevel])[d.index] ; - //a Dart can only be deleted if all mrDarts have been deleted - if(getDartLevel(d) == m_mrCurrentLevel) + if(getDartLevel(d) > m_mrCurrentLevel) { + //for(unsigned int i = getDartLevel(d) - 1; i >= m_mrCurrentLevel; --i) + //{ + (*m_mrDarts[m_mrCurrentLevel])[d.index] = MRNULL ; + //} + } + // a MRdart can only be deleted on its insertion level + if(getDartLevel(d) == m_mrCurrentLevel) + { if(isDartValid(index)) deleteDartLine(index) ; @@ -131,27 +134,19 @@ inline void GenericMap::deleteDart(Dart d) } else { - unsigned int di = m_mrDarts[m_mrCurrentLevel - 1]->operator[](d.index) ; - //si le brin de niveau i pointe sur le meme brin que le niveau i-1 + unsigned int di = (*m_mrDarts[m_mrCurrentLevel - 1])[d.index]; //m_mrDarts[m_mrCurrentLevel - 1]->operator[](d.index) ; + // si le brin de niveau i pointe sur le meme brin que le niveau i-1 if(di != index) { if(isDartValid(index)) deleteDartLine(index) ; } - m_mrDarts[m_mrCurrentLevel]->operator[](index) = MRNULL ; - } - // a MRdart can only be deleted on its insertion level -// assert(getDartLevel(d) == m_mrCurrentLevel || !"deleteDart : try to delete a dart on a level greater than its insertion level") ; - -// for(unsigned int i = m_mrCurrentLevel; i < m_mrDarts.size(); ++i) -// { -// unsigned int index = (*m_mrDarts[i])[d.index] ; -// if(isDartValid(index)) -// deleteDartLine(index) ; -// } -// m_mrattribs.removeLine(d.index) ; -// m_mrNbDarts[m_mrCurrentLevel]-- ; + for(unsigned int i = m_mrCurrentLevel; i <= getMaxLevel(); ++i) // for all levels from current to max + { + (*m_mrDarts[i])[d.index] = di ; //copy the index from previous level + } + } } else deleteDartLine(dartIndex(d)) ; @@ -199,9 +194,9 @@ inline unsigned int GenericMap::copyDartLine(unsigned int index) inline void GenericMap::duplicateDart(Dart d) { - assert(getDartLevel(d) <= getCurrentLevel() || !"duplicateDart : called with a dart inserted after current level") ; + assert(getDartLevel(d) <= m_mrCurrentLevel || !"duplicateDart : called with a dart inserted after current level") ; - if(getDartLevel(d) == getCurrentLevel()) // no need to duplicate + if(getDartLevel(d) == m_mrCurrentLevel) // no need to duplicate return ; // a dart from its insertion level unsigned int oldindex = dartIndex(d) ; @@ -211,7 +206,7 @@ inline void GenericMap::duplicateDart(Dart d) unsigned int newindex = copyDartLine(oldindex) ; - for(unsigned int i = getCurrentLevel(); i <= getMaxLevel(); ++i) // for all levels from current to max + for(unsigned int i = m_mrCurrentLevel; i <= getMaxLevel(); ++i) // for all levels from current to max { assert((*m_mrDarts[i])[d.index] == oldindex || !"duplicateDart : dart was already duplicated on a greater level") ; (*m_mrDarts[i])[d.index] = newindex ; // make this MRdart points to the new dart line @@ -230,6 +225,12 @@ inline unsigned int GenericMap::getDartLevel(Dart d) const return (*m_mrLevels)[d.index] ; } +inline void GenericMap::incDartLevel(Dart d) const +{ + ++(*m_mrLevels)[d.index] ; +} + + inline unsigned int GenericMap::getNbInsertedDarts(unsigned int level) { if(level < m_mrDarts.size()) @@ -447,6 +448,17 @@ inline AttributeMultiVector* GenericMap::getEmbeddingAttributeVect return m_embeddings[ORBIT] ; } +inline AttributeContainer& GenericMap::getMRAttributeContainer() +{ + return m_mrattribs ; +} + +inline AttributeMultiVector* GenericMap::getMRDartAttributeVector(unsigned int level) +{ + assert(level <= getMaxLevel() || !"Invalid parameter: level does not exist"); + return m_mrDarts[level] ; +} + template bool GenericMap::registerAttribute(const std::string &nameType) { @@ -637,5 +649,4 @@ inline bool GenericMap::isBoundaryMarked(Dart d) const return m_markTables[DART][0]->operator[](dartIndex(d)).testMark(m_boundaryMarker); } - } //namespace CGoGN diff --git a/src/Topology/generic/genericmap.cpp b/src/Topology/generic/genericmap.cpp index 955c0d872234d42fe51dc0a0be44c21c55667c55..2f9332085fb9b3be7b764f9f9a0ef508b83fbd1e 100644 --- a/src/Topology/generic/genericmap.cpp +++ b/src/Topology/generic/genericmap.cpp @@ -174,7 +174,7 @@ void GenericMap::printMR() for(unsigned int i = m_mrattribs.begin(); i != m_mrattribs.end(); m_mrattribs.next(i)) { - std::cout << (*m_mrLevels)[i] << " / " ; + std::cout << i << " : " << (*m_mrLevels)[i] << " / " ; for(unsigned int j = 0; j < m_mrDarts.size(); ++j) std::cout << (*m_mrDarts[j])[i] << " ; " ; std::cout << std::endl ; @@ -202,8 +202,24 @@ void GenericMap::initMR() setCurrentLevel(0) ; } -AttributeMultiVector* GenericMap::addLevel() +//AttributeMultiVector* GenericMap::addLevel() +//{ +// unsigned int newLevel = m_mrDarts.size() ; +// std::stringstream ss ; +// ss << "MRdart_"<< newLevel ; +// AttributeMultiVector* newAttrib = m_mrattribs.addAttribute(ss.str()) ; +// AttributeMultiVector* prevAttrib = m_mrDarts[newLevel - 1]; +// +// // copy the indices of previous level into new level +// m_mrattribs.copyAttribute(newAttrib->getIndex(), prevAttrib->getIndex()) ; +// +// return newAttrib; +//} + +void GenericMap::addLevelBack() { + //AttributeMultiVector* newAttrib = addLevel(); + unsigned int newLevel = m_mrDarts.size() ; std::stringstream ss ; ss << "MRdart_"<< newLevel ; @@ -213,19 +229,23 @@ AttributeMultiVector* GenericMap::addLevel() // copy the indices of previous level into new level m_mrattribs.copyAttribute(newAttrib->getIndex(), prevAttrib->getIndex()) ; - return newAttrib; -} - -void GenericMap::addLevelBack() -{ - AttributeMultiVector* newAttrib = addLevel(); m_mrDarts.push_back(newAttrib) ; m_mrNbDarts.push_back(0) ; } void GenericMap::addLevelFront() { - AttributeMultiVector* newAttrib = addLevel(); + //AttributeMultiVector* newAttrib = addLevel(); + + unsigned int newLevel = m_mrDarts.size() ; + std::stringstream ss ; + ss << "MRdart_"<< newLevel ; + AttributeMultiVector* newAttrib = m_mrattribs.addAttribute(ss.str()) ; + AttributeMultiVector* prevAttrib = m_mrDarts[0]; + + // copy the indices of previous level into new level + m_mrattribs.copyAttribute(newAttrib->getIndex(), prevAttrib->getIndex()) ; + m_mrDarts.insert(m_mrDarts.begin(), newAttrib) ; m_mrNbDarts.insert(m_mrNbDarts.begin(), 0) ; } @@ -277,39 +297,15 @@ void GenericMap::copyLevel(unsigned int level) void GenericMap::duplicateDarts(unsigned int level) { - AttributeMultiVector* newAttrib = m_mrDarts[level] ; - AttributeMultiVector* prevAttrib = m_mrDarts[level - 1]; + AttributeMultiVector* attrib = m_mrDarts[level] ; for(unsigned int i = m_mrattribs.begin(); i != m_mrattribs.end(); m_mrattribs.next(i)) { - unsigned int oldi = (*prevAttrib)[i] ; // get the index of the dart in previous level - (*newAttrib)[i] = copyDartLine(oldi) ; // copy the dart and affect it to the new level + unsigned int oldi = (*attrib)[i] ; // get the index of the dart in previous level + (*attrib)[i] = copyDartLine(oldi) ; // copy the dart and affect it to the new level } } -void GenericMap::duplicateMRDart(Dart d) -{ - assert(getDartLevel(d) <= getCurrentLevel() || !"duplicateDart : called with a dart inserted after current level") ; - -// if(getDartLevel(d) == getCurrentLevel()) // no need to duplicate -// return ; // a dart from its insertion level - - unsigned int oldindex = dartIndex(d) ; - -// if((*m_mrDarts[m_mrCurrentLevel - 1])[d.index] != oldindex) // no need to duplicate if the dart is already -// return ; // duplicated with respect to previous level - - unsigned int newindex = copyDartLine(oldindex) ; - - assert((*m_mrDarts[getCurrentLevel()])[d.index] == oldindex || !"duplicateDart : dart was already duplicated on a greater level") ; - (*m_mrDarts[getCurrentLevel()])[d.index] = newindex ; -} - -void GenericMap::unrefMRDart(Dart d) -{ - m_mrDarts[m_mrCurrentLevel]->operator[](d.index) = MRNULL ; -} - /**************************************** * ATTRIBUTES MANAGEMENT * ****************************************/ @@ -375,6 +371,13 @@ void GenericMap::viewAttributesTables() std::cout << std::endl << "-------------------------" << std::endl << std::dec ; } +void GenericMap::printDartsTable() +{ + std::cout << "======================="<< std::endl ; + + //m_attribs[DART] +} + /**************************************** * THREAD MANAGEMENT * ****************************************/