main.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. #include <igl/read_triangle_mesh.h>
  2. #include <igl/copyleft/cgal/CSGTree.h>
  3. #include <igl/opengl/glfw/Viewer.h>
  4. #include <igl/jet.h>
  5. #include <Eigen/Core>
  6. int main(int argc, char * argv[])
  7. {
  8. using namespace Eigen;
  9. using namespace igl::copyleft::cgal;
  10. using namespace std;
  11. using namespace igl;
  12. cout<<R"(
  13. [,] Toggle between boolean sub-tree operations
  14. )";
  15. MatrixXi FA,FB,FC,FD,FE;
  16. MatrixXd VA,VB,VC,VD,VE;
  17. // Read in inputs as double precision floating point meshes
  18. read_triangle_mesh(TUTORIAL_SHARED_PATH "/cube.obj" ,VA,FA);
  19. read_triangle_mesh(TUTORIAL_SHARED_PATH "/sphere.obj" ,VB,FB);
  20. read_triangle_mesh(TUTORIAL_SHARED_PATH "/xcylinder.obj",VC,FC);
  21. read_triangle_mesh(TUTORIAL_SHARED_PATH "/ycylinder.obj",VD,FD);
  22. read_triangle_mesh(TUTORIAL_SHARED_PATH "/zcylinder.obj",VE,FE);
  23. igl::opengl::glfw::Viewer viewer;
  24. int num_views = 5+4;
  25. int view_id = num_views-1;
  26. const auto & update = [&]()
  27. {
  28. viewer.data().clear();
  29. // CSGTree templated on type of F
  30. VectorXd I;
  31. const auto & set_mesh =
  32. [&](const MatrixXd & V, const MatrixXi & F, const int i)
  33. {
  34. viewer.data().set_mesh(V,F);
  35. I = VectorXd::Constant(F.rows(),1,i);
  36. };
  37. switch(view_id)
  38. {
  39. case 0:
  40. set_mesh(VA,FA,5);
  41. break;
  42. case 1:
  43. set_mesh(VB,FB,4);
  44. break;
  45. case 2:
  46. set_mesh(VC,FC,3);
  47. break;
  48. case 3:
  49. set_mesh(VD,FD,2);
  50. break;
  51. case 4:
  52. set_mesh(VE,FE,1);
  53. break;
  54. default:
  55. {
  56. CSGTree M;
  57. Matrix<int,Dynamic,1> J;
  58. switch(view_id)
  59. {
  60. case 5:
  61. // Compute result of (A ∩ B)
  62. M = {{VA,FA},{VB,FB},"i"};
  63. J = M.J().array()+0;
  64. break;
  65. case 6:
  66. // Compute result of (C ∪ D)
  67. M = {{VC,FC},{VD,FD},"u"};
  68. J = M.J().array()+FA.rows()+FB.rows();
  69. break;
  70. case 7:
  71. // Compute result of (C ∪ D) ∪ E
  72. M = {{{VC,FC},{VD,FD},"u"},{VE,FE},"u"};
  73. J = M.J().array()+FA.rows()+FB.rows();
  74. break;
  75. case 8:
  76. // Compute result of (A ∩ B) \ ((C ∪ D) ∪ E)
  77. M = {{{VA,FA},{VB,FB},"i"},{{{VC,FC},{VD,FD},"u"},{VE,FE},"u"},"m"};
  78. J = M.J().array()+0;
  79. break;
  80. default:
  81. assert(false && "unknown view id");
  82. }
  83. viewer.data().set_mesh(M.cast_V<MatrixXd>(),M.F());
  84. I.resize(M.F().rows(),1);
  85. // Compute colors based on original facets
  86. for(int f = 0;f<M.F().rows();f++)
  87. {
  88. const int j = J(f);
  89. I(f) =
  90. (int)(j<FA.rows())+
  91. (int)(j<FA.rows()+FB.rows())+
  92. (int)(j<FA.rows()+FB.rows()+FC.rows())+
  93. (int)(j<FA.rows()+FB.rows()+FC.rows()+FD.rows())+
  94. (int)(j<FA.rows()+FB.rows()+FC.rows()+FD.rows()+FE.rows());
  95. }
  96. }
  97. }
  98. MatrixXd C;
  99. jet(I,1,5,C);
  100. viewer.data().set_colors(C);
  101. };
  102. update();
  103. viewer.callback_key_down =
  104. [&](igl::opengl::glfw::Viewer &viewer, unsigned char key, int mods)->bool
  105. {
  106. switch(key)
  107. {
  108. case ']':
  109. view_id = (view_id+1)%num_views;
  110. break;
  111. case '[':
  112. view_id = (view_id+num_views-1)%num_views;
  113. break;
  114. default:
  115. return false;
  116. }
  117. update();
  118. return true;
  119. };
  120. viewer.launch();
  121. }