diff --git a/include/Algo/ImplicitHierarchicalMesh/ihm3.h b/include/Algo/ImplicitHierarchicalMesh/ihm3.h index 5022a361dc8dc2a5f74a58d3da16da80cfd2dd4a..80566aa6872404e1ab733d1b4f028fec328b0fc2 100644 --- a/include/Algo/ImplicitHierarchicalMesh/ihm3.h +++ b/include/Algo/ImplicitHierarchicalMesh/ihm3.h @@ -137,6 +137,12 @@ public: */ void constructSplittingPath(Dart d, std::vector& v, DartMarker& m); + //! + /*! + * + */ + void swapEdges(Dart d, Dart e); + // //! // /*! // * diff --git a/include/Algo/ImplicitHierarchicalMesh/subdivision3.hpp b/include/Algo/ImplicitHierarchicalMesh/subdivision3.hpp index 8a284adfbe92e22c4d236a3f4a87f62b43db18ff..59322fe3b2debf4647d3df0005c8e5b33cd21c22 100644 --- a/include/Algo/ImplicitHierarchicalMesh/subdivision3.hpp +++ b/include/Algo/ImplicitHierarchicalMesh/subdivision3.hpp @@ -639,7 +639,7 @@ void subdivideLoop(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& position { //volCenter += position[d]; //++degree; - + Dart f1 = map.phi1(dit); Dart e = dit; std::vector v ; @@ -684,17 +684,17 @@ void subdivideLoop(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& position } while(dd != stop); } -// else -// { -// unsigned int idface = map.getNewFaceId(); -// map.setFaceId(map.phi2(f1),idface, FACE); -// } + else + { + unsigned int idface = map.getNewFaceId(); + map.setFaceId(map.phi2(v.front()),idface, FACE); + } } //switch inner faces if(isNotTet) { - unsigned int i = 0; + DartMarker me(map); for(Dart dit = traV.begin(); dit != traV.end(); dit = traV.next()) { @@ -704,58 +704,56 @@ void subdivideLoop(typename PFP::MAP& map, Dart d, typename PFP::TVEC3& position do { Dart f3 = map.phi3(f); - Dart tmp = map.phi_1(map.phi2(map.phi_1(map.phi2(map.phi_1(f3))))); //future voisin par phi2 - map.unsewFaces(f3); - map.unsewFaces(tmp); - map.sewFaces(f3, tmp, false); + if(!me.isMarked(f3)) + { + Dart tmp = map.phi_1(map.phi2(map.phi_1(map.phi2(map.phi_1(f3))))); //future voisin par phi2 - map.copyDartEmbedding(VERTEX, map.phi2(f3), tmp); - map.copyDartEmbedding(VERTEX, map.phi2(tmp), f3); + Dart f32 = map.phi2(f3); + map.swapEdges(f3, tmp); -// map.embedOrbit(VERTEX, f3, map.getEmbedding(VERTEX, f3)) ; -// map.embedOrbit(VERTEX, tmp, map.getEmbedding(VERTEX, tmp)) ; + unsigned int idface = map.getNewFaceId(); + map.setFaceId(map.phi2(f3),idface, FACE); + + me.markOrbit(EDGE, f3); + me.markOrbit(EDGE, f32); + } -// unsigned int idface = map.getNewFaceId(); -// map.setFaceId(map.phi2(f3),idface, FACE); f = map.phi2(map.phi_1(f)); }while(f != x); - } + } - position[centralDart] = volCenter; + //Third step : 3-sew internal faces + for (std::vector >::iterator it = subdividedfaces.begin(); it != subdividedfaces.end(); ++it) + { + Dart f1 = (*it).first; + Dart f2 = (*it).second; + //FAIS a la couture !!!!!!! + //id pour toutes les aretes exterieurs des faces quadrangulees + unsigned int idedge = map.getEdgeId(f1); + map.setEdgeId(map.phi2(f1), idedge, DART); + map.setEdgeId( map.phi2(f2), idedge, DART); -// //Third step : 3-sew internal faces -// for (std::vector >::iterator it = subdividedfaces.begin(); it != subdividedfaces.end(); ++it) -// { -// Dart f1 = (*it).first; -// Dart f2 = (*it).second; -// -// //FAIS a la couture !!!!!!! -// //id pour toutes les aretes exterieurs des faces quadrangulees -// unsigned int idedge = map.getEdgeId(f1); -// map.setEdgeId(map.phi2(f1), idedge, DART); -// map.setEdgeId( map.phi2(f2), idedge, DART); -// -// } -// -// //LA copie de L'id est a gerer avec le sewVolumes normalement !!!!!! -// //id pour les aretes interieurs : (i.e. 16 pour un octa) -// DartMarker mne(map); -// for(std::vector::iterator it = newEdges.begin() ; it != newEdges.end() ; ++it) -// { -// if(!mne.isMarked(*it)) -// { -// unsigned int idedge = map.getNewEdgeId(); -// map.setEdgeId(*it, idedge, EDGE); -// mne.markOrbit(EDGE,*it); -// } -// } -// -// -// map.setCurrentLevel(cur) ; + } + + //LA copie de L'id est a gerer avec le sewVolumes normalement !!!!!! + //id pour les aretes interieurs : (i.e. 16 pour un octa) + DartMarker mne(map); + for(std::vector::iterator it = newEdges.begin() ; it != newEdges.end() ; ++it) + { + if(!mne.isMarked(*it)) + { + unsigned int idedge = map.getNewEdgeId(); + map.setEdgeId(*it, idedge, EDGE); + mne.markOrbit(EDGE,*it); + } + } + + + map.setCurrentLevel(cur) ; } diff --git a/include/Algo/Modelisation/polyhedron.hpp b/include/Algo/Modelisation/polyhedron.hpp index 92a7d77d18d3094e2e067975944ad9bbc6dfaa8c..4c671f8a6290ae8abe5fe5420c965aa796a255f8 100644 --- a/include/Algo/Modelisation/polyhedron.hpp +++ b/include/Algo/Modelisation/polyhedron.hpp @@ -139,7 +139,7 @@ Dart createDiamond(typename PFP::MAP& map, unsigned int nbSides) res = map.phi2(firstP); map.sewVolumes(firstP, secondP); - map.mergeVolumes(firstP); + //map.mergeVolumes(firstP); return res; } diff --git a/include/Algo/Render/GL2/explodeVolumeRender.h b/include/Algo/Render/GL2/explodeVolumeRender.h index 9b897b2a88bd800453d670b7714cd508849fc471..82c32674fe6095970ab59f4a47d96e1a15d8826b 100644 --- a/include/Algo/Render/GL2/explodeVolumeRender.h +++ b/include/Algo/Render/GL2/explodeVolumeRender.h @@ -108,8 +108,8 @@ public: * @param positions attribute of position vertices * @param good selector */ -// template -// void updateData(typename PFP::MAP& map, typename PFP::TVEC3& positions, const FunctorSelect& good = allDarts) ; + template + void updateData(typename PFP::MAP& map, typename PFP::TVEC3& positions, const FunctorSelect& good = allDarts) ; /** * update all drawing buffers diff --git a/include/Algo/Render/GL2/explodeVolumeRender.hpp b/include/Algo/Render/GL2/explodeVolumeRender.hpp index 2518326374c8ce98ebf7569750f3781ad4ad2e12..2be03dfa177d439de1d035a89f60a7b7f9912d23 100644 --- a/include/Algo/Render/GL2/explodeVolumeRender.hpp +++ b/include/Algo/Render/GL2/explodeVolumeRender.hpp @@ -75,103 +75,103 @@ inline ExplodeVolumeRender::~ExplodeVolumeRender() delete m_shaderL; } -//template -//void ExplodeVolumeRender::updateData(typename PFP::MAP& map, typename PFP::TVEC3& positions, const FunctorSelect& good) -//{ -// if (m_cpf) -// { -// CGoGNerr<< "ExplodeVolumeRender: problem wrong update fonction use the other" << CGoGNendl; -// return; -// } -// -// typedef typename PFP::VEC3 VEC3; -// typedef typename PFP::REAL REAL; -// -// CellMarker cmv(map,VOLUME); -// AutoAttributeHandler centerVolumes(map,VOLUME,"centerVolumes"); -// TraversorW traVol(map,good); -// for (Dart d=traVol.begin(); d!=traVol.end(); d=traVol.next()) -// { -// centerVolumes[d] = Algo::Geometry::volumeCentroid(map, d, positions); -// } -// -// std::vector buffer; -// buffer.reserve(16384); -// -// -// TraversorCell traFace(map, PFP::MAP::ORBIT_IN_PARENT(FACE),good); -// -// for (Dart d=traFace.begin(); d!=traFace.end(); d=traFace.next()) -// { -// if (m_ef) -// { -// VEC3 centerFace = Algo::Geometry::faceCentroid(map,d,positions); -// Dart a = d; -// Dart b = map.phi1(a); -// Dart c = map.phi1(b); -// -// // loop to cut a polygon in triangle on the fly (works only with convex faces) -// do -// { -// buffer.push_back(centerVolumes[d]); -// buffer.push_back(positions[d]); -// buffer.push_back(positions[b]); -// buffer.push_back(positions[c]); -// buffer.push_back(centerFace); // not used -// buffer.push_back(centerFace); -// b = c; -// c = map.phi1(b); -// -// } while (c != d); -// } -// else -// { -// Dart a = d; -// Dart b = map.phi1(a); -// Dart c = map.phi1(b); -// -// // loop to cut a polygon in triangle on the fly (works only with convex faces) -// do -// { -// buffer.push_back(centerVolumes[d]); -// buffer.push_back(positions[d]); -// buffer.push_back(positions[b]); -// buffer.push_back(positions[c]); -// b = c; -// c = map.phi1(b); -// -// } while (c != d); -// } -// } -// -// m_nbTris = buffer.size()/4; -// -// m_vboPos->allocate(buffer.size()); -// VEC3* ptrPos = reinterpret_cast(m_vboPos->lockPtr()); -// memcpy(ptrPos,&buffer[0],buffer.size()*sizeof(VEC3)); -// m_vboPos->releasePtr(); -// m_shader->setAttributePosition(m_vboPos); -// -// buffer.clear(); -// -// TraversorCell traEdge(map, PFP::MAP::ORBIT_IN_PARENT(EDGE),good); -// for (Dart d=traEdge.begin(); d!=traEdge.end(); d=traEdge.next()) -// { -// buffer.push_back(centerVolumes[d]); -// buffer.push_back(positions[d]); -// buffer.push_back(positions[ map.phi1(d)]); -// } -// -// m_nbLines = buffer.size()/3; -// -// m_vboPosLine->allocate(buffer.size()); -// -// ptrPos = reinterpret_cast(m_vboPosLine->lockPtr()); -// memcpy(ptrPos,&buffer[0],buffer.size()*sizeof(VEC3)); -// -// m_vboPosLine->releasePtr(); -// m_shaderL->setAttributePosition(m_vboPosLine); -//} +template +void ExplodeVolumeRender::updateData(typename PFP::MAP& map, typename PFP::TVEC3& positions, const FunctorSelect& good) +{ + if (m_cpf) + { + CGoGNerr<< "ExplodeVolumeRender: problem wrong update fonction use the other" << CGoGNendl; + return; + } + + typedef typename PFP::VEC3 VEC3; + typedef typename PFP::REAL REAL; + + CellMarker cmv(map,VOLUME); + AutoAttributeHandler centerVolumes(map,VOLUME,"centerVolumes"); + TraversorW traVol(map,good); + for (Dart d=traVol.begin(); d!=traVol.end(); d=traVol.next()) + { + centerVolumes[d] = Algo::Geometry::volumeCentroid(map, d, positions); + } + + std::vector buffer; + buffer.reserve(16384); + + + TraversorCell traFace(map, PFP::MAP::ORBIT_IN_PARENT(FACE),good); + + for (Dart d=traFace.begin(); d!=traFace.end(); d=traFace.next()) + { + if (m_ef) + { + VEC3 centerFace = Algo::Geometry::faceCentroid(map,d,positions); + Dart a = d; + Dart b = map.phi1(a); + Dart c = map.phi1(b); + + // loop to cut a polygon in triangle on the fly (works only with convex faces) + do + { + buffer.push_back(centerVolumes[d]); + buffer.push_back(positions[d]); + buffer.push_back(positions[b]); + buffer.push_back(positions[c]); + buffer.push_back(centerFace); // not used + buffer.push_back(centerFace); + b = c; + c = map.phi1(b); + + } while (c != d); + } + else + { + Dart a = d; + Dart b = map.phi1(a); + Dart c = map.phi1(b); + + // loop to cut a polygon in triangle on the fly (works only with convex faces) + do + { + buffer.push_back(centerVolumes[d]); + buffer.push_back(positions[d]); + buffer.push_back(positions[b]); + buffer.push_back(positions[c]); + b = c; + c = map.phi1(b); + + } while (c != d); + } + } + + m_nbTris = buffer.size()/4; + + m_vboPos->allocate(buffer.size()); + VEC3* ptrPos = reinterpret_cast(m_vboPos->lockPtr()); + memcpy(ptrPos,&buffer[0],buffer.size()*sizeof(VEC3)); + m_vboPos->releasePtr(); + m_shader->setAttributePosition(m_vboPos); + + buffer.clear(); + + TraversorCell traEdge(map, PFP::MAP::ORBIT_IN_PARENT(EDGE),good); + for (Dart d=traEdge.begin(); d!=traEdge.end(); d=traEdge.next()) + { + buffer.push_back(centerVolumes[d]); + buffer.push_back(positions[d]); + buffer.push_back(positions[ map.phi1(d)]); + } + + m_nbLines = buffer.size()/3; + + m_vboPosLine->allocate(buffer.size()); + + ptrPos = reinterpret_cast(m_vboPosLine->lockPtr()); + memcpy(ptrPos,&buffer[0],buffer.size()*sizeof(VEC3)); + + m_vboPosLine->releasePtr(); + m_shaderL->setAttributePosition(m_vboPosLine); +} template diff --git a/include/Topology/generic/traversorCell.h b/include/Topology/generic/traversorCell.h index 4c3f1dfad35691f3eff0f80847b6e0e6b5b73555..0f1883c5646a4a3def6db3996d013734705bd951 100644 --- a/include/Topology/generic/traversorCell.h +++ b/include/Topology/generic/traversorCell.h @@ -62,7 +62,7 @@ template class TraversorV : public TraversorCell { public: - TraversorV(MAP& m, const FunctorSelect& good = allDarts, unsigned int thread = 0) : TraversorCell(m, VERTEX, good, thread) + TraversorV(MAP& m, const FunctorSelect& good = allDarts, bool forceDartMarker = false, unsigned int thread = 0) : TraversorCell(m, VERTEX, good, forceDartMarker, thread) {} }; @@ -70,7 +70,7 @@ template class TraversorE : public TraversorCell { public: - TraversorE(MAP& m, const FunctorSelect& good = allDarts, unsigned int thread = 0) : TraversorCell(m, EDGE, good, thread) + TraversorE(MAP& m, const FunctorSelect& good = allDarts, bool forceDartMarker = false, unsigned int thread = 0) : TraversorCell(m, EDGE, good, forceDartMarker, thread) {} }; @@ -79,7 +79,7 @@ template class TraversorF : public TraversorCell { public: - TraversorF(MAP& m, const FunctorSelect& good = allDarts, unsigned int thread = 0) : TraversorCell(m, FACE, good, thread) + TraversorF(MAP& m, const FunctorSelect& good = allDarts, bool forceDartMarker = false, unsigned int thread = 0) : TraversorCell(m, FACE, good, forceDartMarker, thread) {} }; @@ -87,7 +87,7 @@ template class TraversorW : public TraversorCell { public: - TraversorW(MAP& m, const FunctorSelect& good = allDarts, unsigned int thread = 0) : TraversorCell(m, VOLUME, good, thread) + TraversorW(MAP& m, const FunctorSelect& good = allDarts, bool forceDartMarker = false, unsigned int thread = 0) : TraversorCell(m, VOLUME, good, forceDartMarker, thread) {} }; diff --git a/include/Topology/map/embeddedMap3.h b/include/Topology/map/embeddedMap3.h index 7864be263cd3aa221a877e1ae7e762e4cd0ccfac..52390ee09a8b7d1aa522e432cc935f491493fe85 100644 --- a/include/Topology/map/embeddedMap3.h +++ b/include/Topology/map/embeddedMap3.h @@ -68,6 +68,11 @@ public: */ virtual Dart collapseEdge(Dart d, bool delDegenerateVolumes=true); + //! + /*! + */ + virtual bool collapseDegeneratedFace(Dart d); + //! /*! */ diff --git a/include/Topology/map/map3.h b/include/Topology/map/map3.h index 2c555b46958e776172b50e5b86579279476adb57..d581958f185a22301903ba414e4d2d8e80ebc455 100644 --- a/include/Topology/map/map3.h +++ b/include/Topology/map/map3.h @@ -170,6 +170,14 @@ public: */ virtual Dart collapseEdge(Dart d, bool delDegenerateVolumes = true); + //! Delete a face if and only if it has one or two edges + /*! If the face is sewed to two distinct adjacent faces, + * then those two faces are sewed + * @param d a dart of the face + * @return true if the collapse has been executed, false otherwise + */ + virtual bool collapseDegeneratedFace(Dart d); + //! Split a face inserting an edge between two vertices /*! \pre Dart d and e should belong to the same face and be distinct * @param d dart of first vertex diff --git a/src/Algo/ImplicitHierarchicalMesh/ihm3.cpp b/src/Algo/ImplicitHierarchicalMesh/ihm3.cpp index 7cf79118c9bca203266f0bb48ed6dc31a0962114..01968cef509c75cbfea0d287e7e19c17b3838811 100644 --- a/src/Algo/ImplicitHierarchicalMesh/ihm3.cpp +++ b/src/Algo/ImplicitHierarchicalMesh/ihm3.cpp @@ -155,6 +155,36 @@ void ImplicitHierarchicalMap3::constructSplittingPath(Dart d, std::vector& } + +void ImplicitHierarchicalMap3::swapEdges(Dart d, Dart e) +{ + Dart d2 = phi2(d); + Dart e2 = phi2(e); + + Map2::unsewFaces(d); + Map2::unsewFaces(e); + + Map2::sewFaces(d, e); + Map2::sewFaces(d2, e2); + + if(isOrbitEmbedded(VERTEX)) + { + copyDartEmbedding(VERTEX, d, phi2(phi_1(d))); + copyDartEmbedding(VERTEX, e, phi2(phi_1(e))); + copyDartEmbedding(VERTEX, d2, phi2(phi_1(d2))); + copyDartEmbedding(VERTEX, e2, phi2(phi_1(d2))); + } + + if(isOrbitEmbedded(EDGE)) + { + + } + + if(isOrbitEmbedded(VOLUME)) + embedNewCell(VOLUME, d); +} + + //Dart ImplicitHierarchicalMap3::cutEdge(Dart d) //{ // Dart resV = EmbeddedMap3::cutEdge(d); diff --git a/src/Topology/map/embeddedMap3.cpp b/src/Topology/map/embeddedMap3.cpp index 5df84bc9305b87df3c38e79fbd9d351b984d0a5e..039875c0de9b64d3945c8f52b2a2e21bd455cf12 100644 --- a/src/Topology/map/embeddedMap3.cpp +++ b/src/Topology/map/embeddedMap3.cpp @@ -154,6 +154,11 @@ Dart EmbeddedMap3::collapseEdge(Dart d, bool delDegenerateVolumes) return resV; } +bool EmbeddedMap3::collapseDegeneratedFace(Dart d) +{ + return Map3::collapseDegeneratedFace(d); +} + void EmbeddedMap3::splitFace(Dart d, Dart e) { Dart dd = phi1(phi3(d)); diff --git a/src/Topology/map/map3.cpp b/src/Topology/map/map3.cpp index 5b50c08dd3daf0a8820689a9899355368f0f9e38..0c6b7b85b2a28e23329df7cee4eb29c282b60cfe 100644 --- a/src/Topology/map/map3.cpp +++ b/src/Topology/map/map3.cpp @@ -355,7 +355,18 @@ Dart Map3::collapseEdge(Dart d, bool delDegenerateVolumes) // } // } +bool Map3::collapseDegeneratedFace(Dart d) +{ + Dart d3 = phi3(d); + + Map3::unsewVolumes(d); + std::cout << Map2::collapseDegeneratedFace(d) << std::endl; + std::cout << Map2::collapseDegeneratedFace(d3) << std::endl; + std::cout << std::endl; + + return true; +} void Map3::splitFace(Dart d, Dart e) {