Aleks11

simplification

Feb 16th, 2014
402
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.58 KB | None | 0 0
  1. #define NOMINMAX
  2.  
  3. #include <stdio.h>
  4. #include <conio.h>
  5. #include <Windows.h>
  6.  
  7. //#undef max
  8. //#undef min
  9.  
  10. #include <set>
  11. #include <vector>
  12. #include <algorithm>
  13.  
  14. #include <vcg/complex/algorithms/local_optimization/tri_edge_collapse_quadric_tex.h>
  15. #include <vcg/complex/algorithms/hole.h>
  16. #include <vcg/connectors/hedge.h>
  17. #include <vcg/complex/complex.h>
  18. #include <vcg/complex/algorithms/update/topology.h>
  19. #include <vcg/complex/algorithms/update/bounding.h>
  20. #include <vcg/complex/algorithms/update/normal.h>
  21. #include <vcg/complex/algorithms/clean.h>
  22. #include <vcg/complex/algorithms/update/halfedge_indexed.h>
  23. #include <vcg/complex/algorithms/local_optimization/quad_diag_collapse.h>
  24. #include <vcg/complex/algorithms/update/fitmaps.h>
  25.  
  26. class CVertex;
  27. class CFace;
  28. class CEdge;
  29.  
  30. struct CUsedTypes :
  31.     public vcg::UsedTypes<  vcg::Use<CVertex>   ::AsVertexType,
  32.                             vcg::Use<CFace>     ::AsFaceType,
  33.                             vcg::Use<CEdge>     ::AsEdgeType>
  34. {
  35. };
  36.  
  37. class CVertex :
  38.     public vcg::Vertex<CUsedTypes,
  39.         vcg::vertex::InfoOcf,
  40.         vcg::vertex::BitFlags,
  41.         vcg::vertex::Coord3f,
  42.         vcg::vertex::Normal3f,
  43.         vcg::vertex::TexCoord2f,
  44.         vcg::vertex::VFAdj,
  45.         vcg::vertex::MarkOcf>
  46. {
  47. };
  48.  
  49. class CFace :
  50.     public vcg::Face<CUsedTypes,
  51.         vcg::face::InfoOcf,
  52.         vcg::face::BitFlags,
  53.         vcg::face::WedgeTexCoordfOcf,
  54.         vcg::face::VFAdj,
  55.         vcg::face::FFAdj,
  56.         vcg::face::VertexRef,
  57.         vcg::face::MarkOcf>
  58. {
  59. };
  60.  
  61. class CEdge :
  62.     public vcg::Edge<CUsedTypes,
  63.         vcg::edge::BitFlags,
  64.         vcg::edge::EEAdj,
  65.         vcg::edge::EVAdj>
  66. {
  67. };
  68.  
  69. class CMesh :
  70.     public vcg::tri::TriMesh<vcg::vertex::vector_ocf<CVertex>, vcg::face::vector_ocf<CFace>>
  71. {
  72. };
  73.  
  74. typedef vcg::tri::BasicVertexPair<CVertex> VertexPair;
  75.  
  76. class MyTriEdgeCollapse:
  77.     public vcg::tri::TriEdgeCollapseQuadricTex<CMesh, VertexPair, MyTriEdgeCollapse, vcg::tri::QuadricTexHelper<CMesh>>
  78. {
  79. public:
  80.     typedef TriEdgeCollapseQuadricTex<CMesh,  VertexPair, MyTriEdgeCollapse, vcg::tri::QuadricTexHelper<CMesh>> TECQ;
  81.     inline MyTriEdgeCollapse(const VertexPair &p, int i, vcg::BaseParameterClass *pp)
  82.         : TECQ(p, i, pp)
  83.     {
  84.     }
  85. };
  86.  
  87. typedef vcg::SimpleTempData<CMesh::VertContainer, vcg::math::Quadric<double> > QuadricTemp;
  88.  
  89.  
  90. class QHelper
  91. {
  92. public:
  93.     QHelper(){}
  94.     static void Init(){}
  95.     static vcg::math::Quadric<double> &Qd(CVertex &v) {return TD()[v];}
  96.     static vcg::math::Quadric<double> &Qd(CVertex *v) {return TD()[*v];}
  97.     static CVertex::ScalarType W(CVertex * /*v*/) {return 1.0;}
  98.     static CVertex::ScalarType W(CVertex & /*v*/) {return 1.0;}
  99.     static void Merge(CVertex & /*v_dest*/, CVertex const & /*v_del*/){}
  100.     static QuadricTemp* &TDp() {static QuadricTemp *td; return td;}
  101.     static QuadricTemp &TD() {return *TDp();}
  102. };
  103.  
  104. void QuadricTexSimplification(CMesh &m, int  TargetFaceNum, vcg::tri::TriEdgeCollapseQuadricParameter &pp)
  105. {
  106.     vcg::math::Quadric<double> QZero;
  107.     QZero.SetZero();
  108.     QuadricTemp TD(m.vert,QZero);
  109.     QHelper::TDp()=&TD;
  110.  
  111.     if(pp.NormalCheck)
  112.         pp.NormalThrRad = M_PI/4.0;
  113.    
  114.    
  115.     vcg::LocalOptimization<CMesh> DeciSession(m,&pp);
  116.     DeciSession.Init<MyTriEdgeCollapse >();
  117.  
  118.     DeciSession.SetTargetSimplices(TargetFaceNum);
  119.     DeciSession.SetTimeBudget(0.1f); // this allow to update the progress bar 10 time for sec...
  120.  
  121.     int faceToDel=m.fn-TargetFaceNum;
  122.     while( DeciSession.DoOptimization() && m.fn>TargetFaceNum )
  123.     {
  124.     };
  125.  
  126.     DeciSession.Finalize<MyTriEdgeCollapse >();
  127.  
  128.     /*
  129.     vcg::math::Quadric<double> QZero;
  130.     QZero.SetZero();
  131.  
  132.     vcg::tri::QuadricTexHelper<CMesh>::QuadricTemp TD3(m.vert, QZero);
  133.     vcg::tri::QuadricTexHelper<CMesh>::TDp3() = &TD3;
  134.  
  135.     std::vector<std::pair<vcg::TexCoord2<float>, vcg::Quadric5<double>>> qv;
  136.  
  137.     vcg::tri::QuadricTexHelper<CMesh>::Quadric5Temp TD(m.vert, qv);
  138.     vcg::tri::QuadricTexHelper<CMesh>::TDp() = &TD;
  139.  
  140.     vcg::LocalOptimization<CMesh> DeciSession(m, &pp);
  141.     DeciSession.Init<MyTriEdgeCollapseQTex>();
  142.  
  143.     DeciSession.SetTargetSimplices(TargetFaceNum);
  144.     DeciSession.SetTimeBudget(0.1f);
  145.    
  146.     int nFaceToDel = m.fn - TargetFaceNum;
  147.  
  148.     while( DeciSession.DoOptimization() && m.fn > TargetFaceNum )
  149.     {
  150.         printf("Simplifing heap size %i ops %i; faces: %d\n", (int)DeciSession.h.size(), DeciSession.nPerfmormedOps, (int)(100.0f - 100 * (m.fn - TargetFaceNum) / (nFaceToDel)));
  151.     };
  152.  
  153.     DeciSession.Finalize<MyTriEdgeCollapseQTex>();
  154.     */
  155. }
  156.  
  157. int main()
  158. {
  159.     CMesh m;
  160.  
  161.     m.face.EnableWedgeTexCoord();
  162.     m.face.EnableMark();
  163.  
  164.     m.vert.EnableMark();
  165.  
  166.     CMesh::VertexIterator iV = vcg::tri::Allocator<CMesh>::AddVertices(m, 3);
  167.  
  168.     iV->N() = vcg::Point3f(0.1f, 0.2f, 0.3f);
  169.     iV->P() = vcg::Point3f(0.4f, 0.5f, 0.6f);
  170.     iV->T() = vcg::TexCoord2f(0.7f, 0.8f);
  171.     iV++;
  172.  
  173.     iV->N() = vcg::Point3f(0.9f, 1.0f, 1.1f);
  174.     iV->P() = vcg::Point3f(1.2f, 1.3f, 1.4f);
  175.     iV->T() = vcg::TexCoord2f(1.5f, 1.6f);
  176.     iV++;
  177.  
  178.     iV->N() = vcg::Point3f(1.7f, 1.8f, 1.9f);
  179.     iV->P() = vcg::Point3f(2.0f, 2.1f, 2.2f);
  180.     iV->T() = vcg::TexCoord2f(2.3f, 2.4f);
  181.  
  182.  
  183.     CMesh::FaceIterator iF = vcg::tri::Allocator<CMesh>::AddFaces(m, 1);
  184.  
  185.     iF->V(0) = &m.vert[2];
  186.     iF->V(1) = &m.vert[0];
  187.     iF->V(2) = &m.vert[1];
  188.  
  189.     iF->WT(0) = vcg::TexCoord2f(0.7f, 0.8f);
  190.     iF->WT(1) = vcg::TexCoord2f(1.5f, 1.6f);
  191.     iF->WT(2) = vcg::TexCoord2f(2.3f, 2.4f);
  192.  
  193.     /*
  194.     vcg::tri::Clean<CMesh>::RemoveDegenerateFace(m);
  195.     vcg::tri::Clean<CMesh>::RemoveDuplicateFace(m);
  196.     vcg::tri::Clean<CMesh>::RemoveDuplicateVertex(m);
  197.     vcg::tri::Clean<CMesh>::RemoveUnreferencedVertex(m);
  198.     */
  199.     /*
  200.     vcg::tri::UpdateTopology<CMesh>::VertexFace(m);
  201.     vcg::tri::UpdateTopology<CMesh>::EdgeEdge(m);
  202.     vcg::tri::UpdateTopology<CMesh>::FaceFace(m);
  203.     vcg::tri::UpdateTopology<CMesh>::FaceFaceFromTexCoord(m);
  204.     vcg::tri::UpdateTopology<CMesh>::VertexEdge(m);
  205.     vcg::tri::UpdateFlags<CMesh>::Clear(m);
  206.     vcg::tri::UpdateFlags<CMesh>::FaceBorderFromFF(m);
  207.     vcg::tri::UpdateFlags<CMesh>::FaceBorderFromVF(m);
  208.     */
  209.  
  210.     vcg::tri::TriEdgeCollapseQuadricParameter SimplifParameters;
  211.     SimplifParameters.SetDefaultParams();
  212.  
  213.     QuadricTexSimplification(m, 1, SimplifParameters);
  214.  
  215.     int nNumVert = 0;
  216.  
  217.     std::vector<int> VertexID(m.vert.size());
  218.     for (CMesh::VertexIterator iV = m.vert.begin(); iV != m.vert.end(); iV++)
  219.     {
  220.         VertexID[iV - m.vert.begin()] = nNumVert;
  221.  
  222.         printf("Vertex %d: n - %0.1f; t - %0.1f; p - %0.1f\n", nNumVert, iV->N().X(), iV->T().U(), iV->P().X());
  223.  
  224.         nNumVert++;
  225.     }
  226.  
  227.     int nNumFaces = 0;
  228.     for (CMesh::FaceIterator iFace = m.face.begin(); iFace != m.face.end(); iFace++)
  229.     {
  230.         int nIndex0 = VertexID[vcg::tri::Index(m, iFace->V(0))];
  231.         int nIndex1 = VertexID[vcg::tri::Index(m, iFace->V(1))];
  232.         int nIndex2 = VertexID[vcg::tri::Index(m, iFace->V(2))];
  233.  
  234.         printf("face %d: %d %d %d\n", nNumFaces, nIndex0, nIndex1, nIndex2);
  235.  
  236.         nNumFaces++;
  237.     }
  238.  
  239.     _getch();
  240.     return 0;
  241. }
Advertisement
Add Comment
Please, Sign In to add comment