diff --git a/src/meshlabplugins/filter_slice/filter_slice.cpp b/src/meshlabplugins/filter_slice/filter_slice.cpp index f90bfd0a6..0f41b74d0 100644 --- a/src/meshlabplugins/filter_slice/filter_slice.cpp +++ b/src/meshlabplugins/filter_slice/filter_slice.cpp @@ -24,13 +24,6 @@ #include "filter_slice.h" //#include #include -#include -#include -#include -#include -#include -#include -#include #include @@ -50,7 +43,7 @@ using namespace vcg; ExtraFilter_SlicePlugin::ExtraFilter_SlicePlugin () { typeList << FP_PARALLEL_PLANES - <::Mesh(dest->cm, orig->cm); - tri::UpdateTopology::FaceFace(dest->cm); - //create the clone, move it eps/2 on the left and invert its normals - for (int i=0;icm.vert.size();i++) - dest->cm.vert[i].P()-=planeAxis*eps/2; - tri::Clean::FlipMesh(dest->cm); - vcg::tri::UpdateTopology::FaceFace(dest->cm); - vcg::tri::UpdateNormals::PerVertexPerFace(dest->cm); - //find the border outlines - std::vector< std::vector > outlines; - std::vector outline; - vcg::tri::UpdateFlags::VertexClearV(dest->cm); - vcg::tri::UpdateFlags::FaceBorderFromNone(dest->cm); - int nv=0; - for(int i=0;icm.face.size();i++) - { - for (int j=0;j<3;j++) - if (!dest->cm.face[i].IsV() && dest->cm.face[i].IsB(j)) - { - CFaceO* startB=&(dest->cm.face[i]); - vcg::face::Pos p(startB,j); - do - { - p.V()->SetV(); - outline.push_back(p.V()->P()); - p.NextB(); - nv++; - } - while(!p.V()->IsV()); - outlines.push_back(outline); - outline.clear(); - } - } - if (nv<2) return; - //I have at least 3 vertexes - MeshModel* tempMesh= doc->addNewMesh("temp mesh"); - tri::Append::Mesh(tempMesh->cm, orig->cm); - for (int i=0;icm.vert.size();i++) - tempMesh->cm.vert[i].P()+=planeAxis*eps/2; - //create the clone and move it eps/2 on the right - tri::Append::Mesh(dest->cm, tempMesh->cm); - //delete tempMesh; - doc->delMesh(tempMesh); - //create the new mesh and the triangulation between the clones - tempMesh=doc->addNewMesh("temp mesh 2"); - CMeshO::VertexIterator vi=vcg::tri::Allocator::AddVertices(tempMesh->cm,2*nv); - - //I have at least 6 vertexes - for (int i=0;iP()=outlines[i][0]; - CVertexO* v0=(&*vi); ++vi; - (&*vi)->P()=outlines[i][0]+planeAxis*eps; - CVertexO* v1=(&*vi); ++vi; - CVertexO* vs0=v0; //we need the start point - CVertexO* vs1=v1; //to close the loop -// Log(0,"%d",outlines[i].size()); - for(int j=1;jP()=outlines[i][j]; - CVertexO* v2=(&*vi); ++vi; - (&*vi)->P()=outlines[i][j]+planeAxis*eps; - CVertexO* v3=(&*vi); ++vi; - CMeshO::FaceIterator fi=vcg::tri::Allocator::AddFaces(tempMesh->cm,2); - - (&*fi)->V(2)=v0; - (&*fi)->V(1)=v1; - (&*fi)->V(0)=v2; - ++fi; - (&*fi)->V(0)=v1; - (&*fi)->V(1)=v2; - (&*fi)->V(2)=v3; - - v0=v2; - v1=v3; - if (j==outlines[i].size()-1) - { - CMeshO::FaceIterator fi=vcg::tri::Allocator::AddFaces(tempMesh->cm,2); - (&*fi)->V(2)=v0; - (&*fi)->V(1)=v1; - (&*fi)->V(0)=vs0; - ++fi; - (&*fi)->V(0)=v1; - (&*fi)->V(1)=vs0; - (&*fi)->V(2)=vs1; - } - } - } - - tri::Append::Mesh(dest->cm, tempMesh->cm); - tri::Clean::RemoveDuplicateVertex(dest->cm); - dest->updateDataMask(MeshModel::MM_FACEFACETOPO | MeshModel::MM_FACEFLAGBORDER); - vcg::tri::UpdateTopology::FaceFace(dest->cm); - vcg::tri::UpdateNormals::PerVertexPerFace(dest->cm); - vcg::tri::UpdateBounding::Box(dest->cm); - doc->delMesh(tempMesh); - //delete tempMesh; + tri::ExtrudeBoundary(orig->cm,dest->cm,eps,planeAxis); } MeshFilterInterface::FilterClass ExtraFilter_SlicePlugin::getClass(QAction *filter) { diff --git a/src/meshlabplugins/filter_slice/filter_slice.h b/src/meshlabplugins/filter_slice/filter_slice.h index f76fdc766..9f098ca7a 100644 --- a/src/meshlabplugins/filter_slice/filter_slice.h +++ b/src/meshlabplugins/filter_slice/filter_slice.h @@ -27,29 +27,29 @@ #include #include -#include - -#include -#include #include -#include - +#include +#include +#include +#include +#include +#include +#include #include #include -//#include "svgpro.h" -class MyVertex; -class MyEdge; -class MyFace; - -class MyUsedTypes: public vcg::UsedTypes < vcg::Use::AsVertexType,vcg::Use::AsFaceType,vcg::Use::AsEdgeType>{}; - -class MyVertex: public vcg::Vertex < MyUsedTypes,vcg::vertex::Coord3f,vcg::vertex::BitFlags,vcg::vertex::VEAdj>{}; -class MyFace: public vcg::Face < MyUsedTypes, vcg::face::VertexRef>{}; +class MyVertex; +class MyEdge; +class MyFace; + +class MyUsedTypes: public vcg::UsedTypes < vcg::Use::AsVertexType,vcg::Use::AsFaceType,vcg::Use::AsEdgeType>{}; + +class MyVertex: public vcg::Vertex < MyUsedTypes,vcg::vertex::Coord3f,vcg::vertex::BitFlags,vcg::vertex::VEAdj>{}; +class MyFace: public vcg::Face < MyUsedTypes, vcg::face::VertexRef>{}; class MyEdge : public vcg::Edge {}; class MyEdgeMesh: public vcg::edg::EdgeMesh< std::vector, std::vector > {}; @@ -85,4 +85,109 @@ private: }; +namespace vcg { + namespace tri { + +template + bool ExtrudeBoundary(MeshType &orig, MeshType &dest, float eps, Point3f planeAxis) +{ + tri::Append::Mesh(dest, orig); + tri::UpdateTopology::FaceFace(dest); + //create the clone, move it eps/2 on the left and invert its normals + for (int i=0;i::FlipMesh(dest); + vcg::tri::UpdateTopology::FaceFace(dest); + vcg::tri::UpdateNormals::PerVertexPerFace(dest); + //find the border outlines + std::vector< std::vector > outlines; + std::vector outline; + vcg::tri::UpdateFlags::VertexClearV(dest); + vcg::tri::UpdateFlags::FaceBorderFromFF(dest); + int nv=0; + for(int i=0;i p(startB,j); + do + { + p.V()->SetV(); + outline.push_back(p.V()->P()); + p.NextB(); + nv++; + } + while(!p.V()->IsV()); + outlines.push_back(outline); + outline.clear(); + } + } + if (nv<2) return false; + //I have at least 3 vertexes + MeshType tempMesh; + tri::Append::Mesh(tempMesh, orig); + for (int i=0;i::Mesh(dest, tempMesh); + //delete tempMesh; + tempMesh.Clear(); + typename MeshType::VertexIterator vi=vcg::tri::Allocator::AddVertices(tempMesh,2*nv); + + //I have at least 6 vertexes + for (int i=0;iP()=outlines[i][0]; + CVertexO* v0=(&*vi); ++vi; + (&*vi)->P()=outlines[i][0]+planeAxis*eps; + CVertexO* v1=(&*vi); ++vi; + CVertexO* vs0=v0; //we need the start point + CVertexO* vs1=v1; //to close the loop +// Log(0,"%d",outlines[i].size()); + for(int j=1;jP()=outlines[i][j]; + CVertexO* v2=(&*vi); ++vi; + (&*vi)->P()=outlines[i][j]+planeAxis*eps; + CVertexO* v3=(&*vi); ++vi; + typename MeshType::FaceIterator fi=vcg::tri::Allocator::AddFaces(tempMesh,2); + + (&*fi)->V(2)=v0; + (&*fi)->V(1)=v1; + (&*fi)->V(0)=v2; + ++fi; + (&*fi)->V(0)=v1; + (&*fi)->V(1)=v2; + (&*fi)->V(2)=v3; + + v0=v2; + v1=v3; + if (j==outlines[i].size()-1) + { + typename MeshType::FaceIterator fi=vcg::tri::Allocator::AddFaces(tempMesh,2); + (&*fi)->V(2)=v0; + (&*fi)->V(1)=v1; + (&*fi)->V(0)=vs0; + ++fi; + (&*fi)->V(0)=v1; + (&*fi)->V(1)=vs0; + (&*fi)->V(2)=vs1; + } + } + } + + tri::Append::Mesh(dest, tempMesh); + tri::Clean::RemoveDuplicateVertex(dest); + vcg::tri::UpdateTopology::FaceFace(dest); + vcg::tri::UpdateNormals::PerVertexPerFace(dest); + vcg::tri::UpdateBounding::Box(dest); + return true; + } + + +} // end namespace tri +} // end namespace vcg + #endif