#ifndef GLU_TESSELLATOR_CAP_H #define GLU_TESSELLATOR_CAP_H #include "glu_tesselator.h" #include #include #include namespace vcg { namespace tri { // This function take a mesh with one or more boundary stored as edges, and fill another mesh with a triangulation of that boundaries. // it assumes that boundary are planar and exploits glutessellator for the triangulaiton template void CapEdgeMesh(MeshType &em, MeshType &cm, bool revertFlag=false) { typedef typename MeshType::EdgeType EdgeType; typedef typename MeshType::CoordType CoordType; std::vector< std::vector > outlines; std::vector outline; UpdateFlags::EdgeClearV(em); UpdateTopology::EdgeEdge(em); int nv=0; for(size_t i=0;i startE(&em.edge[i],0); edge::Pos curE=startE; do { curE.E()->SetV(); outline.push_back(curE.V()->P()); curE.NextE(); nv++; } while(curE != startE); if(revertFlag) std::reverse(outline.begin(),outline.end()); outlines.push_back(outline); outline.clear(); } } if (nv<2) return; // printf("Found %i outlines for a total of %i vertices",outlines.size(),nv); typename MeshType::VertexIterator vi=vcg::tri::Allocator::AddVertices(cm,nv); for (size_t i=0;iP()=outlines[i][j]; } std::vector indices; glu_tesselator::tesselate(outlines, indices); std::vector points; glu_tesselator::unroll(outlines, points); //typename MeshType::FaceIterator fi=tri::Allocator::AddFaces(cm,nv-2); typename MeshType::FaceIterator fi=tri::Allocator::AddFaces(cm,indices.size()/3); for (size_t i=0; iV(0)=&cm.vert[ indices[i+0] ]; (*&fi)->V(1)=&cm.vert[ indices[i+1] ]; (*&fi)->V(2)=&cm.vert[ indices[i+2] ]; } Clean::RemoveDuplicateVertex(cm); UpdateBounding::Box(cm); } } // end namespace tri } // end namespace vcg #endif // GLU_TESSELLATOR_CAP_H