27 #include <OpenGL/gl.h>
37 #include<vcg/complex/complex.h>
40 #include<wrap/io_trimesh/import.h>
41 #include<wrap/io_trimesh/export.h>
44 #include <vcg/complex/algorithms/update/position.h>
45 #include <vcg/complex/algorithms/update/quality.h>
46 #include <vcg/complex/algorithms/stat.h>
48 #include <vcg/complex/algorithms/intersection.h>
49 #include <vcg/complex/algorithms/refine.h>
50 #include <wrap/gl/glu_tessellator_cap.h>
58 struct MyUsedTypes :
public UsedTypes< Use<MyVertex> ::AsVertexType,
59 Use<MyEdge> ::AsEdgeType,
60 Use<MyFace> ::AsFaceType>{};
62 class MyVertex :
public Vertex<MyUsedTypes, vertex::Coord3f, vertex::Normal3f, vertex::Qualityf,vertex::BitFlags >{};
63 class MyFace :
public Face< MyUsedTypes, face::FFAdj, face::VertexRef, face::BitFlags >{};
64 class MyEdge :
public Edge<MyUsedTypes, edge::VertexRef,edge::BitFlags,edge::EEAdj>{};
65 class MyMesh :
public tri::TriMesh< vector<MyVertex>, vector<MyFace> , vector<MyEdge> > {};
69 void CapHole(MyMesh &m, MyMesh &capMesh,
bool reverseFlag)
72 std::vector< std::vector<Point3f> > outlines;
73 std::vector<Point3f> outline;
82 for(
size_t i=0;i<m.face.size();i++)
87 MyFace* startB=&(m.face[i]);
88 vcg::face::Pos<MyFace> p(startB,j);
92 assert(p.IsManifold());
94 outline.push_back(p.V()->P());
100 std::reverse(outline.begin(),outline.end());
102 outlines.push_back(outline);
108 for (
size_t i=0;i<outlines.size();i++)
110 for(
size_t j=0;j<outlines[i].size();++j,++vi)
111 (&*vi)->P()=outlines[i][j];
114 std::vector<int> indices;
115 glu_tesselator::tesselate(outlines, indices);
117 std::vector<Point3f> points;
118 glu_tesselator::unroll(outlines, points);
120 for (
size_t i=0; i<indices.size(); i+=3,++fi)
122 (*&fi)->V(0)=&capMesh.vert[ indices[i+0] ];
123 (*&fi)->V(1)=&capMesh.vert[ indices[i+1] ];
124 (*&fi)->V(2)=&capMesh.vert[ indices[i+2] ];
133 bool SplitMesh(MyMesh &m,
134 MyMesh &A, MyMesh &B,
139 tri::QualityMidPointFunctor<MyMesh> slicingfunc(0.0f);
140 tri::QualityEdgePredicate<MyMesh> slicingpred(0.0f);
143 tri::RefineE<MyMesh, tri::QualityMidPointFunctor<MyMesh>, tri::QualityEdgePredicate<MyMesh> > (A, slicingfunc, slicingpred,
false);
149 for(MyMesh::FaceIterator fi=A.face.begin();fi!=A.face.end();++fi)
155 for(MyMesh::FaceIterator fi=B.face.begin();fi!=B.face.end();++fi)
173 void GetRandPlane(Box3f &bb, Plane3f &plane)
175 Point3f planeCenter = bb.Center();
176 Point3f planeDir = Point3f(-0.5f+
float(rand())/RAND_MAX,-0.5f+
float(rand())/RAND_MAX,-0.5f+
float(rand())/RAND_MAX);
177 planeDir.Normalize();
179 plane.Init(planeCenter+planeDir*0.3f*bb.Diag()*float(rand())/RAND_MAX,planeDir);
182 int main(
int argc,
char **argv )
186 printf(
"Usage trimesh_base <meshfilename.ply>\n");
195 if(tri::io::ImporterPLY<MyMesh>::Open(m,argv[1])!=0)
197 printf(
"Error reading file %s\n",argv[1]);
201 printf(
"Input mesh vn:%i fn:%i\n",m.VN(),m.FN());
204 Plane3f slicingPlane;
205 GetRandPlane(m.bbox,slicingPlane);
206 printf(
"slicing dir %5.2f %5.2f %5.2f\n",slicingPlane.Direction()[0],slicingPlane.Direction()[1],slicingPlane.Direction()[2]);
207 vcg::IntersectionPlaneMesh<MyMesh, MyMesh, float>(m, slicingPlane, em );
209 vcg::tri::CapEdgeMesh(em,slice);
210 printf(
"Slice mesh has %i vert and %i faces\n", slice.VN(), slice.FN() );
213 SplitMesh(m,A,B,slicingPlane);
218 printf(
"Sliced mesh has %i vert and %i faces\n", sliced.VN(), sliced.FN() );
220 tri::io::ExporterPLY<MyMesh>::Save(slice,
"slice.ply",
false);
221 tri::io::ExporterPLY<MyMesh>::Save(sliced,
"sliced.ply",
false);