main.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. #include <igl/read_triangle_mesh.h>
  2. #include <igl/randperm.h>
  3. #include <igl/orientable_patches.h>
  4. #include <igl/slice.h>
  5. #include <igl/hsv_to_rgb.h>
  6. #include <igl/embree/reorient_facets_raycast.h>
  7. #include <igl/viewer/Viewer.h>
  8. #include <fstream>
  9. #include <iostream>
  10. #include <string>
  11. #include <vector>
  12. igl::viewer::Viewer viewer;
  13. Eigen::MatrixXd V;
  14. std::vector<Eigen::VectorXi> C(2);
  15. std::vector<Eigen::MatrixXd> RGBcolors(2);
  16. Eigen::MatrixXi F;
  17. std::vector<Eigen::MatrixXi> FF(2);
  18. bool is_showing_reoriented = false;
  19. bool facetwise = false;
  20. int main(int argc, char * argv[])
  21. {
  22. using namespace std;
  23. cout<<R"(
  24. Usage:
  25. [space] Toggle between original and reoriented faces
  26. F,f Toggle between patchwise and facetwise reorientation
  27. S,s Scramble colors
  28. )";
  29. igl::read_triangle_mesh(TUTORIAL_SHARED_PATH "/truck.obj",V,F);
  30. const auto & scramble_colors = []()
  31. {
  32. for(int pass = 0;pass<2;pass++)
  33. {
  34. Eigen::MatrixXi R;
  35. igl::randperm(C[pass].maxCoeff()+1,R);
  36. C[pass] = igl::slice(R,Eigen::MatrixXi(C[pass]));
  37. Eigen::MatrixXd HSV(C[pass].rows(),3);
  38. HSV.col(0) =
  39. 360.*C[pass].array().cast<double>()/(double)C[pass].maxCoeff();
  40. HSV.rightCols(2).setConstant(1.0);
  41. igl::hsv_to_rgb(HSV,RGBcolors[pass]);
  42. }
  43. viewer.data.set_colors(RGBcolors[facetwise]);
  44. };
  45. viewer.callback_key_pressed =
  46. [&scramble_colors]
  47. (igl::viewer::Viewer& /*viewer*/, unsigned int key, int mod)->bool
  48. {
  49. switch(key)
  50. {
  51. default:
  52. return false;
  53. case 'F':
  54. case 'f':
  55. {
  56. facetwise = !facetwise;
  57. break;
  58. }
  59. case 'S':
  60. case 's':
  61. {
  62. scramble_colors();
  63. return true;
  64. }
  65. case ' ':
  66. {
  67. is_showing_reoriented = !is_showing_reoriented;
  68. break;
  69. }
  70. }
  71. viewer.data.clear();
  72. viewer.data.set_mesh(V,is_showing_reoriented?FF[facetwise]:F);
  73. viewer.data.set_colors(RGBcolors[facetwise]);
  74. return true;
  75. };
  76. // Compute patches
  77. for(int pass = 0;pass<2;pass++)
  78. {
  79. Eigen::VectorXi I;
  80. igl::embree::reorient_facets_raycast(
  81. V,F,F.rows()*100,10,pass==1,false,false,I,C[pass]);
  82. // apply reorientation
  83. FF[pass].conservativeResize(F.rows(),F.cols());
  84. for(int i = 0;i<I.rows();i++)
  85. {
  86. if(I(i))
  87. {
  88. FF[pass].row(i) = (F.row(i).reverse()).eval();
  89. }else
  90. {
  91. FF[pass].row(i) = F.row(i);
  92. }
  93. }
  94. }
  95. viewer.data.set_mesh(V,is_showing_reoriented?FF[facetwise]:F);
  96. viewer.data.set_face_based(true);
  97. scramble_colors();
  98. viewer.launch();
  99. }