diff --git a/Apps/Tuto/show_traversors.cpp b/Apps/Tuto/show_traversors.cpp index 411e36f2af86cb914022800af1524b2bcf79cc4b..3242017a357d784b6a2ce0d3bcf6c6e9f85905ee 100644 --- a/Apps/Tuto/show_traversors.cpp +++ b/Apps/Tuto/show_traversors.cpp @@ -54,8 +54,8 @@ void MyQT::cb_checkTopo(bool b) void MyQT::cb_combo1(int x) { - m_val_combo1 = x+1; - if (m_val_combo1!=m_val_combo3) + m_first3 = x; + if (m_first3!=m_second3) traverse3(); else CGoGNerr <<"undefined traversor" << CGoGNendl; @@ -63,8 +63,8 @@ void MyQT::cb_combo1(int x) void MyQT::cb_combo2(int x) { - m_val_combo2 = x+1; - if (m_val_combo1!=m_val_combo3) + m_ajd_or_inci3 = x; + if (m_first3!=m_second3) traverse3(); else CGoGNerr <<"undefined traversor" << CGoGNendl; @@ -72,8 +72,8 @@ void MyQT::cb_combo2(int x) void MyQT::cb_combo3(int x) { - m_val_combo3 = x+1; - if (m_val_combo1!=m_val_combo3) + m_second3 = x; + if (m_first3!=m_second3) traverse3(); else CGoGNerr <<"undefined traversor" << CGoGNendl; @@ -81,8 +81,8 @@ void MyQT::cb_combo3(int x) void MyQT::cb_combo4(int x) { - m_val_combo4 = x+1; - if (m_val_combo4!=m_val_combo6) + m_first2 = x; + if (m_first2!=m_second2) traverse2(); else CGoGNerr <<"undefined traversor" << CGoGNendl; @@ -90,8 +90,8 @@ void MyQT::cb_combo4(int x) void MyQT::cb_combo5(int x) { - m_val_combo5 = x+1; - if (m_val_combo4!=m_val_combo6) + m_ajd_or_inci2 = x; + if (m_first2!=m_second2) traverse2(); else CGoGNerr <<"undefined traversor" << CGoGNendl; @@ -99,8 +99,8 @@ void MyQT::cb_combo5(int x) void MyQT::cb_combo6(int x) { - m_val_combo6 = x+1; - if (m_val_combo4!=m_val_combo6) + m_second2 = x; + if (m_first2!=m_second2) traverse2(); else CGoGNerr <<"undefined traversor" << CGoGNendl; @@ -167,8 +167,7 @@ void MyQT::traverse2() if (m_selected == NIL) return; - int code = (m_val_combo5)*100+m_val_combo4*10+m_val_combo6; - +// int code = (m_ajd_or_inci2)*100+m_first2*10+m_second2; SelectorDartNoBoundary nb(myMap); m_drawer.newList(GL_COMPILE); @@ -177,136 +176,28 @@ void MyQT::traverse2() m_drawer.color3f(1.0f,1.0f,0.0f); m_affDarts.clear(); - switch(code) - { - // 1YX incient - case 113: - { - Algo::Render::drawerFace(m_drawer,myMap,m_selected,position,0.7f); - m_drawer.color3f(1.0f,0.0f,0.0f); - Traversor2FV tra(myMap,m_selected); - for (Dart d=tra.begin(); d != tra.end(); d= tra.next()) - m_affDarts.push_back(d); - Algo::Render::drawerVertices(m_drawer, myMap,m_affDarts,position); - break; - } - case 123: - { - Algo::Render::drawerFace(m_drawer,myMap,m_selected,position,0.7f); - m_drawer.color3f(1.0f,0.0f,0.0f); - Traversor2FE tra(myMap,m_selected); - for (Dart d=tra.begin(); d != tra.end(); d= tra.next()) - m_affDarts.push_back(d); - Algo::Render::drawerEdges(m_drawer, myMap,m_affDarts,position,0.7f); - break; - } - case 112: - { - Algo::Render::drawerEdge(m_drawer,myMap,m_selected,position,0.7f); - m_drawer.color3f(1.0f,0.0f,0.0f); - Traversor2EV tra(myMap,m_selected); - for (Dart d=tra.begin(); d != tra.end(); d= tra.next()) - m_affDarts.push_back(d); - Algo::Render::drawerVertices(m_drawer, myMap,m_affDarts,position); - break; - } - case 132: - { - Algo::Render::drawerEdge(m_drawer,myMap,m_selected,position,0.7f); - m_drawer.color3f(1.0f,0.0f,0.0f); - Traversor2EF tra(myMap,m_selected); - for (Dart d=tra.begin(); d != tra.end(); d= tra.next()) - m_affDarts.push_back(d); - Algo::Render::drawerFaces(m_drawer, myMap,m_affDarts,position,0.7f); - break; - } - case 121: - { - Algo::Render::drawerVertex(m_drawer,myMap,m_selected,position); - m_drawer.color3f(1.0f,0.0f,0.0f); - Traversor2VE tra(myMap,m_selected); - for (Dart d=tra.begin(); d != tra.end(); d= tra.next()) - m_affDarts.push_back(d); - Algo::Render::drawerEdges(m_drawer, myMap,m_affDarts,position,0.7f); - break; - } - case 131: - { - Algo::Render::drawerVertex(m_drawer,myMap,m_selected,position); - m_drawer.color3f(1.0f,0.0f,0.0f); - Traversor2VF tra(myMap,m_selected); - for (Dart d=tra.begin(); d != tra.end(); d= tra.next()) - m_affDarts.push_back(d); - Algo::Render::drawerFaces(m_drawer, myMap,m_affDarts,position,0.7f); - break; - } - // 2XY adjacent - case 212: - { - Algo::Render::drawerVertex(m_drawer,myMap,m_selected,position); - m_drawer.color3f(1.0f,0.0f,0.0f); - Traversor2VVaE tra(myMap,m_selected); - for (Dart d=tra.begin(); d != tra.end(); d= tra.next()) - m_affDarts.push_back(d); - Algo::Render::drawerVertices(m_drawer, myMap,m_affDarts,position); - break; - } - case 213: - { - Algo::Render::drawerVertex(m_drawer,myMap,m_selected,position); - m_drawer.color3f(1.0f,0.0f,0.0f); - Traversor2VVaF tra(myMap,m_selected); - for (Dart d=tra.begin(); d != tra.end(); d= tra.next()) - m_affDarts.push_back(d); - Algo::Render::drawerVertices(m_drawer, myMap,m_affDarts,position); - break; - } - case 221: - { - Algo::Render::drawerEdge(m_drawer,myMap,m_selected,position,0.7f); - m_drawer.color3f(1.0f,0.0f,0.0f); - Traversor2EEaV tra(myMap,m_selected); - for (Dart d=tra.begin(); d != tra.end(); d= tra.next()) - m_affDarts.push_back(d); - Algo::Render::drawerEdges(m_drawer, myMap,m_affDarts,position,0.7f); - break; - } - case 223: + if (m_ajd_or_inci2 == 0) // incident { - Algo::Render::drawerEdge(m_drawer,myMap,m_selected,position,0.7f); + Algo::Render::drawerCell(VERTEX+m_second2, m_drawer,myMap,m_selected,position,0.7f); m_drawer.color3f(1.0f,0.0f,0.0f); - Traversor2EEaF tra(myMap,m_selected); - for (Dart d=tra.begin(); d != tra.end(); d= tra.next()) - m_affDarts.push_back(d); - Algo::Render::drawerEdges(m_drawer, myMap,m_affDarts,position,0.7f); - break; + Traversor2* tra = Traversor2::createIncident(myMap,m_selected,VERTEX+m_second2,VERTEX+m_first2); + for (Dart d=tra->begin(); d != tra->end(); d= tra->next()) + m_affDarts.push_back(d); + Algo::Render::drawerCells(VERTEX+m_first2, m_drawer, myMap,m_affDarts,position,0.7f); } - case 231: + else // adjacent { - Algo::Render::drawerFace(m_drawer,myMap,m_selected,position,0.7f); + Algo::Render::drawerCell(VERTEX+m_first2, m_drawer,myMap,m_selected,position,0.7f); m_drawer.color3f(1.0f,0.0f,0.0f); - Traversor2FFaV tra(myMap,m_selected); - for (Dart d=tra.begin(); d != tra.end(); d= tra.next()) - m_affDarts.push_back(d); - Algo::Render::drawerFaces(m_drawer, myMap,m_affDarts,position,0.7f); - break; - } - case 232: - { - Algo::Render::drawerFace(m_drawer,myMap,m_selected,position,0.7f); - m_drawer.color3f(1.0f,0.0f,0.0f); - Traversor2FFaE tra(myMap,m_selected); - for (Dart d=tra.begin(); d != tra.end(); d= tra.next()) - m_affDarts.push_back(d); - Algo::Render::drawerFaces(m_drawer, myMap,m_affDarts,position,0.7f); - break; - } + Traversor2* tra = Traversor2::createAdjacent(myMap,m_selected,VERTEX+m_first2,VERTEX+m_second2); + - default: - CGoGNerr <<"Not implemented" << CGoGNendl; - break; + for (Dart d=tra->begin(); d != tra->end(); d= tra->next()) + m_affDarts.push_back(d); + Algo::Render::drawerCells(VERTEX+m_first2, m_drawer, myMap,m_affDarts,position,0.7f); } + m_drawer.endList(); updateGL(); } @@ -315,7 +206,7 @@ void MyQT::traverse2() void MyQT::traverse3() { - int code = (m_val_combo2)*100+m_val_combo1*10+m_val_combo3; +// int code = (m_ajd_or_inci3)*100+m_first3*10+m_second3; // std::cout << "CODE="<< code << std::endl; if (m_selected == NIL) return; @@ -326,259 +217,26 @@ void MyQT::traverse3() m_drawer.lineWidth(3.0f); m_drawer.pointSize(7.0f); m_drawer.color3f(1.0f,1.0f,0.0f); - switch(code) - { - // 1YX incient - case 114: - { - - Algo::Render::drawerVolume(m_drawer,myMap,m_selected,position,0.7f); - m_drawer.color3f(1.0f,0.0f,0.0f); - - Traversor3WV tra(myMap,m_selected); - for (Dart d=tra.begin(); d != tra.end(); d= tra.next()) - m_affDarts.push_back(d); - Algo::Render::drawerVertices(m_drawer, myMap,m_affDarts,position); - break; - } - case 124: - { - Algo::Render::drawerVolume(m_drawer,myMap,m_selected,position,0.7f); - m_drawer.color3f(1.0f,0.0f,0.0f); - Traversor3WE tra(myMap,m_selected); - for (Dart d=tra.begin(); d != tra.end(); d= tra.next()) - m_affDarts.push_back(d); - Algo::Render::drawerEdges(m_drawer, myMap,m_affDarts,position,0.7f); - break; - } - case 134: - { - Algo::Render::drawerVolume(m_drawer,myMap,m_selected,position,0.7f); - m_drawer.color3f(1.0f,0.0f,0.0f); - Traversor3WF tra(myMap,m_selected); - for (Dart d=tra.begin(); d != tra.end(); d= tra.next()) - m_affDarts.push_back(d); - Algo::Render::drawerFaces(m_drawer, myMap,m_affDarts,position,0.7f); - break; - } - case 113: - { - Algo::Render::drawerFace(m_drawer,myMap,m_selected,position,0.7f); - m_drawer.color3f(1.0f,0.0f,0.0f); - Traversor3FV tra(myMap,m_selected); - for (Dart d=tra.begin(); d != tra.end(); d= tra.next()) - m_affDarts.push_back(d); - Algo::Render::drawerVertices(m_drawer, myMap,m_affDarts,position); - break; - } - case 123: - { - Algo::Render::drawerFace(m_drawer,myMap,m_selected,position,0.7f); - m_drawer.color3f(1.0f,0.0f,0.0f); - Traversor3FE tra(myMap,m_selected); - for (Dart d=tra.begin(); d != tra.end(); d= tra.next()) - m_affDarts.push_back(d); - Algo::Render::drawerEdges(m_drawer, myMap,m_affDarts,position,0.7f); - break; - } - case 143: - { - Algo::Render::drawerFace(m_drawer,myMap,m_selected,position,0.7f); - m_drawer.color3f(1.0f,0.0f,0.0f); - Traversor3FW tra(myMap,m_selected); - for (Dart d=tra.begin(); d != tra.end(); d= tra.next()) - m_affDarts.push_back(d); - Algo::Render::drawerVolumes(m_drawer, myMap,m_affDarts,position,0.7f); - break; - } - - case 112: - { - Algo::Render::drawerEdge(m_drawer,myMap,m_selected,position,0.7f); - m_drawer.color3f(1.0f,0.0f,0.0f); - Traversor3EV tra(myMap,m_selected); - for (Dart d=tra.begin(); d != tra.end(); d= tra.next()) - m_affDarts.push_back(d); - Algo::Render::drawerVertices(m_drawer, myMap,m_affDarts,position); - break; - } - case 132: - { - Algo::Render::drawerEdge(m_drawer,myMap,m_selected,position,0.7f); - m_drawer.color3f(1.0f,0.0f,0.0f); - Traversor3EF tra(myMap,m_selected); - for (Dart d=tra.begin(); d != tra.end(); d= tra.next()) - m_affDarts.push_back(d); - Algo::Render::drawerFaces(m_drawer, myMap,m_affDarts,position,0.7f); - break; - } - case 142: - { - Algo::Render::drawerEdge(m_drawer,myMap,m_selected,position,0.7f); - m_drawer.color3f(1.0f,0.0f,0.0f); - Traversor3EW tra(myMap,m_selected); - for (Dart d=tra.begin(); d != tra.end(); d= tra.next()) - m_affDarts.push_back(d); - Algo::Render::drawerVolumes(m_drawer, myMap,m_affDarts,position,0.7f); - break; - } - - case 121: - { - Algo::Render::drawerVertex(m_drawer,myMap,m_selected,position); - m_drawer.color3f(1.0f,0.0f,0.0f); - Traversor3VE tra(myMap,m_selected); - for (Dart d=tra.begin(); d != tra.end(); d= tra.next()) - m_affDarts.push_back(d); - Algo::Render::drawerEdges(m_drawer, myMap,m_affDarts,position,0.7f); - break; - } - case 131: - { - Algo::Render::drawerVertex(m_drawer,myMap,m_selected,position); - Traversor3VF tra(myMap,m_selected); - for (Dart d=tra.begin(); d != tra.end(); d= tra.next()) - m_affDarts.push_back(d); - Algo::Render::drawerFaces(m_drawer, myMap,m_affDarts,position,0.7f); - break; - } - case 141: - { - Algo::Render::drawerVertex(m_drawer,myMap,m_selected,position); - Traversor3VW tra(myMap,m_selected); - for (Dart d=tra.begin(); d != tra.end(); d= tra.next()) - m_affDarts.push_back(d); - Algo::Render::drawerVolumes(m_drawer, myMap,m_affDarts,position,0.7f); - break; - } - - // 2XY adjacent - case 212: - { - Algo::Render::drawerVertex(m_drawer,myMap,m_selected,position); - m_drawer.color3f(1.0f,0.0f,0.0f); - Traversor3VVaE tra(myMap,m_selected); - for (Dart d=tra.begin(); d != tra.end(); d= tra.next()) - m_affDarts.push_back(d); - Algo::Render::drawerVertices(m_drawer, myMap,m_affDarts,position); - break; - } - case 213: - { - Algo::Render::drawerVertex(m_drawer,myMap,m_selected,position); - m_drawer.color3f(1.0f,0.0f,0.0f); - Traversor3VVaF tra(myMap,m_selected); - for (Dart d=tra.begin(); d != tra.end(); d= tra.next()) - m_affDarts.push_back(d); - Algo::Render::drawerVertices(m_drawer, myMap,m_affDarts,position); - break; - } - case 214: - { - Algo::Render::drawerVertex(m_drawer,myMap,m_selected,position); - m_drawer.color3f(1.0f,0.0f,0.0f); - Traversor3VVaW tra(myMap,m_selected); - for (Dart d=tra.begin(); d != tra.end(); d= tra.next()) - m_affDarts.push_back(d); - Algo::Render::drawerVertices(m_drawer, myMap,m_affDarts,position); - break; - } - case 221: - { - Algo::Render::drawerEdge(m_drawer,myMap,m_selected,position,0.7f); - m_drawer.color3f(1.0f,0.0f,0.0f); - Traversor3EEaV tra(myMap,m_selected); - for (Dart d=tra.begin(); d != tra.end(); d= tra.next()) - m_affDarts.push_back(d); - Algo::Render::drawerEdges(m_drawer, myMap,m_affDarts,position,0.7f); - break; - } - case 223: - { - Algo::Render::drawerEdge(m_drawer,myMap,m_selected,position,0.7f); - m_drawer.color3f(1.0f,0.0f,0.0f); - Traversor3EEaF tra(myMap,m_selected); - for (Dart d=tra.begin(); d != tra.end(); d= tra.next()) - m_affDarts.push_back(d); - Algo::Render::drawerEdges(m_drawer, myMap,m_affDarts,position,0.7f); - break; - } - case 224: - { - Algo::Render::drawerEdge(m_drawer,myMap,m_selected,position,0.7f); - m_drawer.color3f(1.0f,0.0f,0.0f); - Traversor3EEaW tra(myMap,m_selected); - for (Dart d=tra.begin(); d != tra.end(); d= tra.next()) - m_affDarts.push_back(d); - Algo::Render::drawerEdges(m_drawer, myMap,m_affDarts,position,0.7f); - break; - } - case 231: + if (m_ajd_or_inci3 == 0) // incident { - Algo::Render::drawerFace(m_drawer,myMap,m_selected,position,0.7f); + Algo::Render::drawerCell(VERTEX+m_second3, m_drawer,myMap,m_selected,position,0.7f); m_drawer.color3f(1.0f,0.0f,0.0f); - Traversor3FFaV tra(myMap,m_selected); + Traversor3XY tra(myMap,m_selected,VERTEX+m_second3,VERTEX+m_first3); for (Dart d=tra.begin(); d != tra.end(); d= tra.next()) - m_affDarts.push_back(d); - Algo::Render::drawerFaces(m_drawer, myMap,m_affDarts,position,0.7f); - break; + m_affDarts.push_back(d); + Algo::Render::drawerCells(VERTEX+m_first3, m_drawer, myMap,m_affDarts,position,0.7f); } - case 232: + else // adjacent { - Algo::Render::drawerFace(m_drawer,myMap,m_selected,position,0.7f); + Algo::Render::drawerCell(VERTEX+m_first3, m_drawer,myMap,m_selected,position,0.7f); m_drawer.color3f(1.0f,0.0f,0.0f); - Traversor3FFaE tra(myMap,m_selected); + Traversor3XXaY tra(myMap,m_selected,VERTEX+m_first3,VERTEX+m_second3); for (Dart d=tra.begin(); d != tra.end(); d= tra.next()) - m_affDarts.push_back(d); - Algo::Render::drawerFaces(m_drawer, myMap,m_affDarts,position,0.7f); - break; - } - case 234: - { - Algo::Render::drawerFace(m_drawer,myMap,m_selected,position,0.7f); - m_drawer.color3f(1.0f,0.0f,0.0f); - Traversor3FFaW tra(myMap,m_selected); - for (Dart d=tra.begin(); d != tra.end(); d= tra.next()) - m_affDarts.push_back(d); - Algo::Render::drawerFaces(m_drawer, myMap,m_affDarts,position,0.7f); - break; - } - case 241: - { - Algo::Render::drawerVolume(m_drawer,myMap,m_selected,position,0.7f); - m_drawer.color3f(1.0f,0.0f,0.0f); - Traversor3WWaV tra(myMap,m_selected); - for (Dart d=tra.begin(); d != tra.end(); d= tra.next()) - m_affDarts.push_back(d); - Algo::Render::drawerVolumes(m_drawer, myMap,m_affDarts,position,0.7f); - break; - } - case 242: - { - Algo::Render::drawerVolume(m_drawer,myMap,m_selected,position,0.7f); - m_drawer.color3f(1.0f,0.0f,0.0f); - Traversor3WWaE tra(myMap,m_selected); - for (Dart d=tra.begin(); d != tra.end(); d= tra.next()) - m_affDarts.push_back(d); - Algo::Render::drawerVolumes(m_drawer, myMap,m_affDarts,position,0.7f); - break; - } - case 243: - { - Algo::Render::drawerVolume(m_drawer,myMap,m_selected,position,0.7f); - m_drawer.color3f(1.0f,0.0f,0.0f); - Traversor3WWaF tra(myMap,m_selected); - for (Dart d=tra.begin(); d != tra.end(); d= tra.next()) - m_affDarts.push_back(d); - Algo::Render::drawerVolumes(m_drawer, myMap,m_affDarts,position,0.7f); - break; + m_affDarts.push_back(d); + Algo::Render::drawerCells(VERTEX+m_first3, m_drawer, myMap,m_affDarts,position,0.7f); } - default: - CGoGNerr <<"Not implemented" << CGoGNendl; - break; - } m_drawer.endList(); updateGL(); } diff --git a/Apps/Tuto/show_traversors.h b/Apps/Tuto/show_traversors.h index 21aa85931129bbc9e6f886c5d094ba3037364e20..326638dcf8133dd368db0ae2f6517686e80f9e77 100644 --- a/Apps/Tuto/show_traversors.h +++ b/Apps/Tuto/show_traversors.h @@ -90,22 +90,22 @@ class MyQT: public Utils::QT::SimpleQT bool m_showTopo; - unsigned int m_val_combo1; - unsigned int m_val_combo2; - unsigned int m_val_combo3; - unsigned int m_val_combo4; - unsigned int m_val_combo5; - unsigned int m_val_combo6; + unsigned int m_first3; + unsigned int m_ajd_or_inci3; + unsigned int m_second3; + unsigned int m_first2; + unsigned int m_ajd_or_inci2; + unsigned int m_second2; public: MyQT(): m_render_topo(NULL), m_showTopo(true), - m_val_combo1(1), - m_val_combo2(1), - m_val_combo3(2), - m_val_combo4(1), - m_val_combo5(1), - m_val_combo6(2), + m_first3(0), + m_ajd_or_inci3(0), + m_second3(1), + m_first2(0), + m_ajd_or_inci2(0), + m_second2(1), m_selected(NIL) {} diff --git a/include/Algo/Render/GL2/drawerCells.h b/include/Algo/Render/GL2/drawerCells.h index 6c6d40a580f5d9a6c5521fb849e350eb03de9a4d..384c68f6bec2c1a6134c92e721bf5d546ab576ba 100644 --- a/include/Algo/Render/GL2/drawerCells.h +++ b/include/Algo/Render/GL2/drawerCells.h @@ -33,6 +33,31 @@ namespace Algo { namespace Render { +/** + * add a cell to a drawer + * @param the cell (VERTEX,EDGE,...) + * * @param dr the drawer to use + * @param map the map + * @param d the dart + * @param positions attribute of positions + * @param k shrinking factor + */ +template +void drawerCells(unsigned int cell, Utils::Drawer& dr, typename PFP::MAP& map, std::vector& vd, const typename PFP::TVEC3& positions); + + +/** + * add a set of volumes to a drawer + * @param the cell (VERTEX,EDGE,...) + * @param dr the drawer to use + * @param map the map + * @param vd the darts + * @param positions attribute of positions + * @param k shrinking factor + */ +template +void drawerCell(unsigned int cell, Utils::Drawer& dr, typename PFP::MAP& map, Dart d, const typename PFP::TVEC3& positions); + /** * add a set of vertices to a drawer @@ -87,7 +112,6 @@ void drawerVolumes(Utils::Drawer& dr, typename PFP::MAP& map, std::vector& * @param map the map * @param d the dart * @param positions attribute of positions - * @param k shrinking factor */ template void drawerVertex(Utils::Drawer& dr, typename PFP::MAP& map, Dart d, const typename PFP::TVEC3& positions); diff --git a/include/Algo/Render/GL2/drawerCells.hpp b/include/Algo/Render/GL2/drawerCells.hpp index b060a3bc254c4b2c809ac95923f750d49e2b0b68..5e69f6e8a1a538d015f5fcef038f9af388731c22 100644 --- a/include/Algo/Render/GL2/drawerCells.hpp +++ b/include/Algo/Render/GL2/drawerCells.hpp @@ -145,6 +145,51 @@ void drawerVolume(Utils::Drawer& dr, typename PFP::MAP& map, Dart d, const typen drawerAddVolume(dr,map,d,positions,k); dr.end(); } +template +void drawerCells(unsigned int cell, Utils::Drawer& dr, typename PFP::MAP& map, std::vector& vd, const typename PFP::TVEC3& positions, float k) +{ + switch(cell) + { + case VERTEX: + drawerVertices(dr, map, vd, positions); + break; + case EDGE: + drawerEdges(dr, map, vd, positions,k); + break; + case FACE: + drawerFaces(dr, map, vd, positions,k); + break; + case VOLUME: + drawerVolumes(dr, map, vd, positions,k); + break; + default: + break; + } +} + + +template +void drawerCell(unsigned int cell, Utils::Drawer& dr, typename PFP::MAP& map, Dart d, const typename PFP::TVEC3& positions, float k) +{ + switch(cell) + { + case VERTEX: + drawerVertex(dr, map, d, positions); + break; + case EDGE: + drawerEdge(dr, map, d, positions,k); + break; + case FACE: + drawerFace(dr, map, d, positions,k); + break; + case VOLUME: + drawerVolume(dr, map, d, positions,k); + break; + default: + break; + } +} + } } diff --git a/include/Topology/generic/genericmap.h b/include/Topology/generic/genericmap.h index 9221e380b69bea233b3437b7c00fa60816a3a3ad..871715fee901ebcce81e078159702cbfc6194e66 100644 --- a/include/Topology/generic/genericmap.h +++ b/include/Topology/generic/genericmap.h @@ -112,13 +112,29 @@ protected: static const bool m_isMultiRes = false ; #endif + /** + * container for mr-darts that store indices in attribs[DART] for each level + */ AttributeContainer m_mrattribs ; + /** + * pointer to indices mvectors (one for each level) + */ std::vector< AttributeMultiVector* > m_mrDarts ; + + /** + * pointers to mvector of levels + */ AttributeMultiVector* m_mrLevels ; + /** + * current level of multiresoltion + */ unsigned int m_mrCurrentLevel ; + /** + * stack for current level temporary storage + */ std::vector m_mrLevelStack ; public: @@ -147,18 +163,39 @@ public: * MULTIRES * ****************************************/ + /** + * get the current level of multi-resolution (use only in MRMaps) + */ unsigned int getCurrentLevel() ; + /** + * set the current level of multi-resolution (use only in MRMaps) + */ void setCurrentLevel(unsigned int l) ; + /** + * store current level of multi-resolution on a stack (use only in MRMaps) + */ void pushLevel() ; + /** + * get back level of multi-resolution of the stack in current (use only in MRMaps) + */ void popLevel() ; + /** + * get the max level of multi-resolution (use only in MRMaps) + */ unsigned int getMaxLevel() ; + /** + * add a level of multi-resolution (use only in MRMaps) + */ void addLevel() ; + /** + * get the insertion level of a dart (use only in MRMaps) + */ unsigned int getDartLevel(Dart d) ; /**************************************** diff --git a/include/Topology/generic/genericmap.hpp b/include/Topology/generic/genericmap.hpp index 3c50db7838f1c5336c045c48850b648dde4d74b3..349f926cb799513f5017d14daaf5a4c37802a64b 100644 --- a/include/Topology/generic/genericmap.hpp +++ b/include/Topology/generic/genericmap.hpp @@ -65,19 +65,6 @@ inline unsigned int GenericMap::getMaxLevel() return m_mrDarts.size() - 1 ; } -inline void GenericMap::addLevel() -{ - unsigned int level = m_mrDarts.size() ; - std::stringstream ss ; - ss << "MRdart_"<< level ; - AttributeMultiVector* amvMR = m_mrattribs.addAttribute(ss.str()) ; - - m_mrDarts.push_back(amvMR) ; - // copy the darts pointers of the previous level - if(m_mrDarts.size() > 1) - m_mrattribs.copyAttribute(amvMR->getIndex(), m_mrDarts[m_mrDarts.size() - 2]->getIndex()) ; -} - inline unsigned int GenericMap::getDartLevel(Dart d) { return m_mrLevels->operator [](d.index) ; @@ -310,4 +297,42 @@ inline AttributeMultiVector* GenericMap::getRelation(const std::string& na return amv ; } + +/****************************************** + * TOPOLOGICAL MULTIRESOLUTION MANAGEMENT* + ******************************************/ + +inline unsigned int GenericMap::getCurrentLevel() +{ + return m_mrCurrentLevel ; +} + + +inline void GenericMap::setCurrentLevel(unsigned int l) +{ + if (l < m_mrDarts.size()) + m_mrCurrentLevel = l ; + else + CGoGNout << "try to access inexisting resolution level" << CGoGNendl ; +} + +inline void GenericMap::pushLevel() +{ + m_mrLevelStack.push_back(m_mrCurrentLevel) ; +} + + +inline void GenericMap::popLevel() +{ + m_mrCurrentLevel = m_mrLevelStack.back() ; + m_mrLevelStack.pop_back() ; +} + + +inline unsigned int GenericMap::getMaxLevel() +{ + return m_mrDarts.size() - 1 ; +} + + } //namespace CGoGN diff --git a/include/Topology/generic/traversor2.h b/include/Topology/generic/traversor2.h index b7053fc21b5a216896d4bac3555496f98e83d182..4eaa8c950a2e713c596561d8f3e294ca43a1d727 100644 --- a/include/Topology/generic/traversor2.h +++ b/include/Topology/generic/traversor2.h @@ -29,14 +29,32 @@ namespace CGoGN { +/******************************************************************************* + GENERIC TRAVERSALS FACTORY +*******************************************************************************/ + +template +class Traversor2 +{ +public: + virtual ~Traversor2() {} + virtual Dart begin() =0; + virtual Dart end() =0; + virtual Dart next() =0; + + static Traversor2* createIncident(MAP& map, Dart dart, unsigned int orbX, unsigned int orbY); + static Traversor2* createAdjacent(MAP& map, Dart dart, unsigned int orbX, unsigned int orbY); +}; + /******************************************************************************* VERTEX CENTERED TRAVERSALS *******************************************************************************/ + // Traverse the edges incident to a given vertex template -class Traversor2VE +class Traversor2VE : public Traversor2 { private: MAP& m ; @@ -53,7 +71,7 @@ public: // Traverse the faces incident to a given vertex template -class Traversor2VF +class Traversor2VF : public Traversor2 { private: MAP& m ; @@ -70,7 +88,7 @@ public: // Traverse the vertices adjacent to a given vertex through sharing a common edge template -class Traversor2VVaE +class Traversor2VVaE : public Traversor2 { private: MAP& m ; @@ -87,7 +105,7 @@ public: // Traverse the vertices adjacent to a given vertex through sharing a common face template -class Traversor2VVaF +class Traversor2VVaF : public Traversor2 { private: MAP& m ; @@ -110,7 +128,7 @@ public: // Traverse the vertices incident to a given edge template -class Traversor2EV +class Traversor2EV : public Traversor2 { private: MAP& m ; @@ -127,7 +145,7 @@ public: // Traverse the faces incident to a given edge template -class Traversor2EF +class Traversor2EF : public Traversor2 { private: MAP& m ; @@ -144,7 +162,7 @@ public: // Traverse the edges adjacent to a given edge through sharing a common vertex template -class Traversor2EEaV +class Traversor2EEaV : public Traversor2 { private: MAP& m ; @@ -163,7 +181,7 @@ public: // Traverse the edges adjacent to a given edge through sharing a common face template -class Traversor2EEaF +class Traversor2EEaF : public Traversor2 { private: MAP& m ; @@ -186,7 +204,7 @@ public: // Traverse the vertices incident to a given face template -class Traversor2FV +class Traversor2FV : public Traversor2 { private: MAP& m ; @@ -204,7 +222,7 @@ public: // Traverse the edges incident to a given face (equivalent to vertices) template -class Traversor2FE : public Traversor2FV +class Traversor2FE: public Traversor2FV { public: Traversor2FE(MAP& map, Dart dart):Traversor2FV(map,dart){} @@ -213,7 +231,7 @@ public: // Traverse the faces adjacent to a given face through sharing a common vertex template -class Traversor2FFaV +class Traversor2FFaV : public Traversor2 { private: MAP& m ; @@ -232,7 +250,7 @@ public: // Traverse the faces adjacent to a given face through sharing a common edge template -class Traversor2FFaE +class Traversor2FFaE : public Traversor2 { private: MAP& m ; diff --git a/include/Topology/generic/traversor2.hpp b/include/Topology/generic/traversor2.hpp index 7bfd2ac986012c77606d43b946f9bccf307d1733..9db6df0b1d69fc035ab15560e96a2b2aea8ec585 100644 --- a/include/Topology/generic/traversor2.hpp +++ b/include/Topology/generic/traversor2.hpp @@ -453,4 +453,75 @@ Dart Traversor2FFaE::next() return current ; } + + +template +Traversor2* Traversor2::createIncident(MAP& map, Dart dart, unsigned int orbX, unsigned int orbY) +{ + int code = 0x100*(orbX-VERTEX) + orbY-VERTEX; + + switch(code) + { + case 0x0001: + return new Traversor2VE(map,dart); + break; + case 0x0002: + return new Traversor2VF(map,dart); + break; + case 0x0100: + return new Traversor2EV(map,dart); + break; + case 0x0102: + break; + case 0x0200: + return new Traversor2FV(map,dart); + break; + case 0x0201: + return new Traversor2FE(map,dart); + break; + default: + return NULL; + break; + } + return NULL; +} + + +template +Traversor2* Traversor2::createAdjacent(MAP& map, Dart dart, unsigned int orbX, unsigned int orbY) +{ + int code = 0x100*(orbX-VERTEX) + orbY-VERTEX; + switch(code) + { + case 0x0001: + return new Traversor2VVaE(map,dart); + break; + case 0x0002: + return new Traversor2VVaF(map,dart); + break; + case 0x0100: + return new Traversor2EEaV(map,dart); + break; + case 0x0102: + return new Traversor2EEaF(map,dart); + break; + case 0x0200: + return new Traversor2FFaV(map,dart); + break; + case 0x0201: + return new Traversor2FFaE(map,dart); + break; + default: + return NULL; + break; + } + return NULL; +} + + + + + + + } // namespace CGoGN diff --git a/include/Topology/generic/traversor3.hpp b/include/Topology/generic/traversor3.hpp index fcbd29f6837306bc0773d4e5167b824a71c22d89..f9ddeab495de9f6c2fde6bf5d56617de67a30b40 100644 --- a/include/Topology/generic/traversor3.hpp +++ b/include/Topology/generic/traversor3.hpp @@ -101,7 +101,6 @@ DartMarkerStore* MarkerForTraversor::dmark() template Traversor3XY::Traversor3XY(MAP& map, Dart dart, unsigned int orbX, unsigned int orbY, bool forceDartMarker, unsigned int thread) : -// Traversor3MarkOnly(map, forceDartMarker, thread, true), m_map(map), m_dmark(NULL), m_cmark(NULL), diff --git a/include/Utils/chrono.h b/include/Utils/chrono.h index b175e5316bb889dd95fdb86fe59e376deba5e10b..418b94d03ebad8714fe20c6b755749f222b994cc 100644 --- a/include/Utils/chrono.h +++ b/include/Utils/chrono.h @@ -73,7 +73,7 @@ public: /// start the chrono inline void start() { gettimeofday(&m_start, NULL) ; } - /// return elapsed time since start (cumulative if several calls) + /// return elapsed time since start in ms (cumulative if several calls) inline int elapsed() { gettimeofday(&m_end, NULL) ; diff --git a/src/Topology/generic/genericmap.cpp b/src/Topology/generic/genericmap.cpp index e5ac87b87b560716e7c7e8ae260488f814cc2571..bd1ef999398b370359873d0399c563772d1c6a72 100644 --- a/src/Topology/generic/genericmap.cpp +++ b/src/Topology/generic/genericmap.cpp @@ -152,6 +152,34 @@ void GenericMap::clear(bool removeAttrib) m_attribs[i].clear(false) ; } } + + if (m_isMultiRes) + { + m_mrattribs.clear(true); + m_mrLevels = NULL; + unsigned int nb = m_mrDarts.size(); + for (unsigned int i = 0; i* amvMR = m_mrattribs.addAttribute(ss.str()) ; + + m_mrDarts.push_back(amvMR) ; + // copy the darts pointers of the previous level + if(m_mrDarts.size() > 1) + m_mrattribs.copyAttribute(amvMR->getIndex(), m_mrDarts[m_mrDarts.size() - 2]->getIndex()) ; } /**************************************** @@ -332,8 +360,16 @@ bool GenericMap::saveMapBin(const std::string& filename) char* buff = new char[256]; for (int i = 0; i < 256; ++i) buff[i] = char(255); - const char* cgogn = "CGoGN_Map"; - memcpy(buff, cgogn, 10); + if (m_isMultiRes) + { + const char* cgogn = "CGoGN_MRMap"; + memcpy(buff, cgogn, 12); + } + else + { + const char* cgogn = "CGoGN_Map"; + memcpy(buff, cgogn, 10); + } std::string mt = mapTypeName(); const char* mtc = mt.c_str(); memcpy(buff+32, mtc, mt.size()+1); @@ -346,6 +382,9 @@ bool GenericMap::saveMapBin(const std::string& filename) for (unsigned int i = 0; i < NB_ORBITS; ++i) m_attribs[i].saveBin(fs, i); + if (m_isMultiRes) + m_mrattribs.saveBin(fs, 00); + return true; } @@ -367,12 +406,34 @@ bool GenericMap::loadMapBin(const std::string& filename) std::string buff_str(buff); // Check file type - if (buff_str != "CGoGN_Map") + if (m_isMultiRes) { - CGoGNerr<< "Wrong binary file format"<< CGoGNendl; - return false; + if (buff_str == "CGoGN_Map") + { + CGoGNerr<< "Wrong binary file format, file is not a MR-Map"<< CGoGNendl; + return false; + } + if (buff_str != "CGoGN_MRMap") + { + CGoGNerr<< "Wrong binary file format"<< CGoGNendl; + return false; + } + } + else + { + if (buff_str == "CGoGN_MRMap") + { + CGoGNerr<< "Wrong binary file format, file is a MR-Map"<< CGoGNendl; + return false; + } + if (buff_str != "CGoGN_Map") + { + CGoGNerr<< "Wrong binary file format"<< CGoGNendl; + return false; + } } + // Check map type buff_str = std::string(buff + 32); @@ -402,11 +463,17 @@ bool GenericMap::loadMapBin(const std::string& filename) m_attribs[id].loadBin(fs); } - // retrieve m_embeddings (from m_attribs[DART] + if (m_isMultiRes) + m_mrattribs.loadBin(fs); + + // retrieve m_embeddings (from m_attribs) update_m_emb_afterLoad(); + // recursive call from real type of map (for topo relation attributes pointers) down to GenericMap (for Marker_cleaning & pointers) update_topo_shortcuts(); + + return true; } @@ -470,6 +537,41 @@ void GenericMap::update_topo_shortcuts() } } } + + if (m_isMultiRes) + { + std::vector names; + m_mrattribs.getAttributesNames(names); + m_mrDarts.resize(names.size()-1); + for (unsigned int i=0; i(i); + + if (sub=="MRdart_") + { + sub = names[i].substr(7); // compute number following MT_Dart_ + unsigned int idx=0; + for (unsigned int j=0; j < sub.length(); j++) + idx = 10*idx+(sub[j]-'0'); + if (idx < names.size()-1) + m_mrDarts[idx] = m_mrattribs.getDataVector(i); + else + CGoGNerr<<"Warning problem updating MR_DARTS" << CGoGNendl; + } + } + // check if all pointers are != NULL + for (unsigned int i=0; i oldnew; + // if MR compact the MR attrib container + std::vector oldnewMR; + if (m_isMultiRes) + m_mrattribs.compact(oldnewMR); // compacting the orbits attributes +// for (unsigned int orbit = 0; orbit < NB_ORBITS; ++orbit) +// { +// if ((orbit != DART) && (isOrbitEmbedded(orbit))) +// { +// m_attribs[orbit].compact(oldnew); +// +// for (unsigned int i = m_attribs[DART].begin(); i != m_attribs[DART].end(); m_attribs[DART].next(i)) +// { +// unsigned int& idx = m_embeddings[orbit]->operator [](i); +// unsigned int jdx = oldnew[idx]; +// if ((jdx != 0xffffffff) && (jdx != idx)) +// idx = jdx; +// } +// } +// } + + // compact embedding attribs + std::vector< std::vector* > oldnews; + oldnews.resize(NB_ORBITS); for (unsigned int orbit = 0; orbit < NB_ORBITS; ++orbit) { if ((orbit != DART) && (isOrbitEmbedded(orbit))) { - m_attribs[orbit].compact(oldnew); + oldnews[orbit] = new std::vector; + m_attribs[orbit].compact(*(oldnews[orbit])); + } + } - for (unsigned int i = m_attribs[DART].begin(); i != m_attribs[DART].end(); m_attribs[DART].next(i)) + // update embedding indices of topo + for (unsigned int i = m_attribs[DART].begin(); i != m_attribs[DART].end(); m_attribs[DART].next(i)) + { + for (unsigned int orbit = 0; orbit < NB_ORBITS; ++orbit) + { + if ((orbit != DART) && (isOrbitEmbedded(orbit))) { - unsigned int& idx = m_embeddings[orbit]->operator [](i); - unsigned int jdx = oldnew[idx]; + unsigned int& idx = m_embeddings[orbit]->operator[](i); + unsigned int jdx = oldnews[orbit]->operator[](idx); if ((jdx != 0xffffffff) && (jdx != idx)) idx = jdx; } } } + // delete allocated vectors + for (unsigned int orbit = 0; orbit < NB_ORBITS; ++orbit) + if ((orbit != DART) && (isOrbitEmbedded(orbit))) + delete[] oldnews[orbit]; + //compacting the topo + std::vector oldnew; m_attribs[DART].compact(oldnew); - // update topo relations: recurvise call from real map down to generic - compactTopoRelations(oldnew); + + // update MR indices to attribs[DART] + if (m_isMultiRes) + { + unsigned int nbl = m_mrDarts.size(); + for (unsigned int i = m_mrattribs.begin(); i != m_mrattribs.end(); m_mrattribs.next(i)) + { + for (unsigned int j=0; joperator[](i); + if (d_index != oldnew[d_index]) + m_mrDarts[j]->operator[](i) = oldnew[d_index]; + } + } + } + + // update topo relations from real map + compactTopoRelations(oldnewMR); // dumpAttributesAndMarkers(); } diff --git a/src/Topology/map/map1.cpp b/src/Topology/map/map1.cpp index 9976b727b5b9f0a98c2d9a6e667245c090724385..a6357193e0ea8fc0fa0787b8f4cd4ca88ea3f1da 100644 --- a/src/Topology/map/map1.cpp +++ b/src/Topology/map/map1.cpp @@ -31,20 +31,27 @@ void Map1::compactTopoRelations(const std::vector& oldnew) { for (unsigned int i = m_attribs[DART].begin(); i != m_attribs[DART].end(); m_attribs[DART].next(i)) { - { - Dart& d = m_phi1->operator [](i); // ??????????????? - unsigned int d_index = dartIndex(d); - Dart e = Dart(oldnew[d_index]); - if (d != e) - d = e; - } - { - Dart& d = m_phi_1->operator [](i); - unsigned int d_index = dartIndex(d); - Dart e = Dart(oldnew[d_index]); - if (d != e) - d = e; - } + unsigned int d_index = dartIndex(m_phi1->operator [](i)); + if (d_index != oldnew[d_index]) + m_phi1->operator [](i) = Dart(oldnew[d_index]); + + d_index = dartIndex(m_phi_1->operator [](i)); + if (d_index != oldnew[d_index]) + m_phi_1->operator [](i) = Dart(oldnew[d_index]); +// { +// Dart d = m_phi1->operator [](i); +// unsigned int d_index = dartIndex(m_phi1->operator [](i)); +// Dart e = Dart(oldnew[d_index]); +// if (d != e) +// d = e; +// } +// { +// Dart& d = m_phi_1->operator [](i); +// unsigned int d_index = dartIndex(d); +// Dart e = Dart(oldnew[d_index]); +// if (d != e) +// d = e; +// } } } diff --git a/src/Topology/map/map2.cpp b/src/Topology/map/map2.cpp index 61fd2c5743618c0f9a3db504b7d7cb77e0b109bd..2b902a25cc0348e23a12dab315adcf601bfb2d9f 100644 --- a/src/Topology/map/map2.cpp +++ b/src/Topology/map/map2.cpp @@ -70,24 +70,36 @@ void Map2::compactTopoRelations(const std::vector& oldnew) { for (unsigned int i = m_attribs[DART].begin(); i != m_attribs[DART].end(); m_attribs[DART].next(i)) { - { - Dart& d = m_phi1->operator [](i); - Dart e = Dart(oldnew[d.index]); - if (d != e) - d = e; - } - { - Dart& d = m_phi_1->operator [](i); - Dart e = Dart(oldnew[d.index]); - if (d != e) - d = e; - } - { - Dart& d = m_phi2->operator [](i); - Dart e = Dart(oldnew[d.index]); - if (d != e) - d = e; - } + unsigned int d_index = dartIndex(m_phi1->operator[](i)); + if (d_index != oldnew[d_index]) + m_phi1->operator[](i) = Dart(oldnew[d_index]); + + d_index = dartIndex(m_phi_1->operator[](i)); + if (d_index != oldnew[d_index]) + m_phi_1->operator[](i) = Dart(oldnew[d_index]); + + d_index = dartIndex(m_phi2->operator[](i)); + if (d_index != oldnew[d_index]) + m_phi2->operator[](i) = Dart(oldnew[d_index]); + +// { +// Dart& d = m_phi1->operator [](i); +// Dart e = Dart(oldnew[d.index]); +// if (d != e) +// d = e; +// } +// { +// Dart& d = m_phi_1->operator [](i); +// Dart e = Dart(oldnew[d.index]); +// if (d != e) +// d = e; +// } +// { +// Dart& d = m_phi2->operator [](i); +// Dart e = Dart(oldnew[d.index]); +// if (d != e) +// d = e; +// } } } diff --git a/src/Topology/map/map3.cpp b/src/Topology/map/map3.cpp index 9a768c00607633b67e686605859f26beb91aa7d8..62c89ae93a264fc877dcaa1fc2959cedb7fd94c9 100644 --- a/src/Topology/map/map3.cpp +++ b/src/Topology/map/map3.cpp @@ -31,30 +31,46 @@ void Map3::compactTopoRelations(const std::vector& oldnew) { for (unsigned int i = m_attribs[DART].begin(); i != m_attribs[DART].end(); m_attribs[DART].next(i)) { - { - Dart& d = m_phi1->operator [](i); - Dart e = Dart(oldnew[d.index]); - if (d != e) - d = e; - } - { - Dart& d = m_phi_1->operator [](i); - Dart e = Dart(oldnew[d.index]); - if (d != e) - d = e; - } - { - Dart& d = m_phi2->operator [](i); - Dart e = Dart(oldnew[d.index]); - if (d != e) - d = e; - } - { - Dart& d = m_phi3->operator [](i); - Dart e = Dart(oldnew[d.index]); - if (d != e) - d = e; - } + unsigned int d_index = dartIndex(m_phi1->operator[](i)); + if (d_index != oldnew[d_index]) + m_phi1->operator[](i) = Dart(oldnew[d_index]); + + d_index = dartIndex(m_phi_1->operator[](i)); + if (d_index != oldnew[d_index]) + m_phi_1->operator[](i) = Dart(oldnew[d_index]); + + d_index = dartIndex(m_phi2->operator[](i)); + if (d_index != oldnew[d_index]) + m_phi2->operator[](i) = Dart(oldnew[d_index]); + + d_index = dartIndex(m_phi3->operator[](i)); + if (d_index != oldnew[d_index]) + m_phi3->operator[](i) = Dart(oldnew[d_index]); +// +// { +// Dart& d = m_phi1->operator [](i); +// Dart e = Dart(oldnew[d.index]); +// if (d != e) +// d = e; +// } +// { +// Dart& d = m_phi_1->operator [](i); +// Dart e = Dart(oldnew[d.index]); +// if (d != e) +// d = e; +// } +// { +// Dart& d = m_phi2->operator [](i); +// Dart e = Dart(oldnew[d.index]); +// if (d != e) +// d = e; +// } +// { +// Dart& d = m_phi3->operator [](i); +// Dart e = Dart(oldnew[d.index]); +// if (d != e) +// d = e; +// } } }