main.cpp 2.6 KB

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