diff --git a/apps/sample/trimesh_optional/trimesh_optional.cpp b/apps/sample/trimesh_optional/trimesh_optional.cpp index 8b22e95a..de5f240d 100644 --- a/apps/sample/trimesh_optional/trimesh_optional.cpp +++ b/apps/sample/trimesh_optional/trimesh_optional.cpp @@ -8,6 +8,9 @@ #include #include +#include +#include + #include #include #include @@ -28,6 +31,7 @@ class CVertexOcf; // Opt stuff +// OCF Optional Component Fast class CVertex : public VertexSimp2< CVertex, CEdge, CFace, vert::Coord3f, vert::Normal3f >{}; class CVertexOcf : public VertexSimp2< CVertexOcf, CEdge, CFaceOcf, vert::Coord3f, vert::Normal3f >{}; @@ -37,46 +41,62 @@ class CFaceOcf : public FaceSimp2< CVertexOcf, CEdge, CFaceOcf, face::InfoOcf class CMeshOcf : public vcg::tri::TriMesh< vector, face::vector_ocf > {}; class CMesh : public vcg::tri::TriMesh< vector, vector > {}; +// OCC Optional Component Compact +class CVertexOcc : public VertexSimp1< CVertexOcc,CEdge,vert::Coord3f,vert::Normal3f >{}; +class CFaceOcc : public FaceSimp2 {}; +class CMeshOcc : public vcg::tri::TriMesh< vector_occ, vector_occ > {}; + int main(int , char **) { CMesh cm; CMeshOcf cmo; + CMeshOcc cmoc; + + tri::Tetrahedron(cm); tri::Tetrahedron(cmo); - + cmoc.face.EnableAttribute(); + tri::Tetrahedron(cmoc); + printf("Generated mesh has %i vertices and %i triangular faces\n",cm.vn,cm.fn); /// Calculates both vertex and face normals. /// The normal of a vertex v is the weigthed average of the normals of the faces incident on v. /// normals are not normalized - + cmo.face.EnableFFAdjacency(); - cmo.face.EnableFFAdjacency(); - - vcg::tri::UpdateTopology::FaceFace(cm); - vcg::tri::UpdateTopology::FaceFace(cmo); - - vcg::tri::UpdateFlags::FaceBorderFromFF(cm); - vcg::tri::UpdateFlags::FaceBorderFromFF(cmo); - - vcg::tri::UpdateNormals::PerVertexNormalized(cm); - vcg::tri::UpdateNormals::PerVertexNormalized(cmo); printf("Size of CFace %3i\n",sizeof(CFace)); printf("Size of CFaceOcf %3i\n",sizeof(CFaceOcf)); + printf("Size of CFaceOcc %3i\n",sizeof(CFaceOcc)); + + vcg::tri::UpdateTopology::FaceFace(cm); + vcg::tri::UpdateTopology::FaceFace(cmo); + vcg::tri::UpdateTopology::FaceFace(cmoc); + + vcg::tri::UpdateFlags::FaceBorderFromFF(cm); + vcg::tri::UpdateFlags::FaceBorderFromFF(cmo); + vcg::tri::UpdateFlags::FaceBorderFromFF(cmoc); + + vcg::tri::UpdateNormals::PerVertexNormalized(cm); + vcg::tri::UpdateNormals::PerVertexNormalized(cmo); + vcg::tri::UpdateNormals::PerVertexNormalized(cmoc); + printf("Normal of face 0 is %f %f %f\n\n",cm.face[0].N()[0],cm.face[0].N()[1],cm.face[0].N()[2]); - int t0=0,t1=0,t2=0; - while(t2-t0<3000) + int t0=0,t1=0,t2=0,t3=0; + while(t3-t0<3000) { t0=clock(); Refine(cm,MidPointButterfly(),0); t1=clock(); Refine(cmo,MidPointButterfly(),0); t2=clock(); - printf("Mesh is %i %i in Std:%i Ocf:%i\n",cm.vn,cm.fn,t1-t0,t2-t1); + Refine(cmoc,MidPointButterfly(),0); + t3=clock(); + printf("Mesh is %i %i in Std:%i Ocf:%i Occ:%i\n",cm.vn,cm.fn,t1-t0,t2-t1,t3-t2); } return 0; }