main.cpp 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #include <igl/opengl/glfw/Viewer.h>
  2. #include <igl/read_triangle_mesh.h>
  3. #include <igl/get_seconds.h>
  4. #include <igl/sort_triangles.h>
  5. #include <igl/material_colors.h>
  6. #include <igl/copyleft/cgal/trim_with_solid.h>
  7. int main(int argc, char *argv[])
  8. {
  9. using namespace igl;
  10. IGL_TICTOC_LAMBDA;
  11. Eigen::MatrixXd VA, VB;
  12. Eigen::MatrixXi FA, FB;
  13. // Load a hot mess of a mesh
  14. igl::read_triangle_mesh(argc>1?argv[1]:TUTORIAL_SHARED_PATH "/truck.obj", VA, FA);
  15. // Load a solid mesh
  16. igl::read_triangle_mesh(argc>2?argv[2]:TUTORIAL_SHARED_PATH "/bunny.off", VB, FB);
  17. if(argc<2)
  18. {
  19. // resize bunny
  20. VB.rowwise() -= VB.colwise().mean();
  21. VB /= (VB.colwise().maxCoeff()-VB.colwise().minCoeff()).maxCoeff();
  22. VB *= 1.15;
  23. VB.rowwise() += VA.colwise().mean();
  24. }
  25. Eigen::VectorXi J;
  26. Eigen::MatrixXd VC;
  27. Eigen::MatrixXi FC;
  28. Eigen::Array<bool, Eigen::Dynamic, 1> D;
  29. using namespace igl::copyleft::cgal;
  30. tictoc();
  31. // More patches, less intersection handling
  32. igl::copyleft::cgal::trim_with_solid(VA, FA, VB, FB, CHECK_EACH_PATCH, VC, FC, D, J);
  33. printf("CHECK_EACH_PATCH: %g secs, |FC| = %td, |D| = %td\n", tictoc(),FC.rows(),D.count());
  34. // More intersection handling, fewer patches
  35. igl::copyleft::cgal::trim_with_solid(VA, FA, VB, FB, RESOLVE_BOTH_AND_RESTORE_THEN_CHECK_EACH_PATCH, VC, FC, D, J);
  36. printf("RESOLVE_BOTH_...: %g secs, |FC| = %td, |D| = %td\n", tictoc(),FC.rows(),D.count());
  37. igl::opengl::glfw::Viewer vr;
  38. vr.data().set_mesh(VC, FC);
  39. // Turn on double sided lighting
  40. vr.data().double_sided = true;
  41. vr.data().set_face_based(true);
  42. vr.data().set_data(D.cast<double>());
  43. Eigen::MatrixXd CM = (Eigen::MatrixXd(2,3)<<
  44. 1,1,1,
  45. GOLD_DIFFUSE[0],GOLD_DIFFUSE[1],GOLD_DIFFUSE[2]
  46. ).finished();
  47. vr.data().set_colormap(CM);
  48. vr.append_mesh();
  49. vr.data().set_mesh(VB, FB);
  50. vr.data().show_lines = false;
  51. // Make a semi-transparent orange matcap
  52. {
  53. Eigen::Matrix<unsigned char,Eigen::Dynamic,Eigen::Dynamic>
  54. R(256,256), G(256,256), B(256,256), A(256,256);
  55. for(int i = 0;i<R.rows();i++)
  56. {
  57. for(int j = 0;j<R.cols();j++)
  58. {
  59. R(i,j) = 255;
  60. G(i,j) = 110;
  61. B(i,j) = 20;
  62. // distance to middle of image
  63. const double x = (i+0.5-R.rows()/2.0)/(R.rows()/2.0);
  64. const double y = (j+0.5-R.cols()/2.0)/(R.cols()/2.0);
  65. const double r = std::min(1.0,sqrt(x*x+y*y));
  66. A(i,j) = 255*(1-sqrt(1-r*r));
  67. }
  68. }
  69. vr.data().set_texture(R,G,B,A);
  70. }
  71. vr.data().use_matcap = true;
  72. // On mouse up resort for better transparency
  73. vr.callback_mouse_up =
  74. [&](igl::opengl::glfw::Viewer &, int button, int mod)
  75. {
  76. Eigen::VectorXi _;
  77. igl::sort_triangles(
  78. VB,Eigen::MatrixXi(FB), vr.core().view, vr.core().proj,FB,_);
  79. vr.data_list[1].set_mesh(VB, FB);
  80. return false;
  81. };
  82. // set first mesh as selected
  83. vr.selected_data_index = 0;
  84. vr.launch_init();
  85. vr.core().draw(vr.data(),true);
  86. vr.callback_mouse_up(vr,0,0);
  87. vr.launch_rendering(true);
  88. vr.launch_shut();
  89. }