2
0

main.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. #include "isolines_colormap.h"
  2. #include "update.h"
  3. #include <igl/read_triangle_mesh.h>
  4. #include <igl/heat_geodesics.h>
  5. #include <igl/avg_edge_length.h>
  6. #include <igl/opengl/glfw/Viewer.h>
  7. #include <iostream>
  8. int main(int argc, char *argv[])
  9. {
  10. Eigen::MatrixXi F;
  11. Eigen::MatrixXd V;
  12. igl::read_triangle_mesh( argc>1?argv[1]: TUTORIAL_SHARED_PATH "/beetle.off",V,F);
  13. double t = std::pow(igl::avg_edge_length(V,F),2);
  14. // Precomputation
  15. igl::HeatGeodesicsData<double> data;
  16. const auto precompute = [&]()
  17. {
  18. if(!igl::heat_geodesics_precompute(V,F,t,data))
  19. {
  20. std::cerr<<"Error: heat_geodesics_precompute failed."<<std::endl;
  21. exit(EXIT_FAILURE);
  22. };
  23. };
  24. precompute();
  25. igl::opengl::glfw::Viewer viewer;
  26. bool down_on_mesh = false;
  27. const auto update = [&]()->bool
  28. {
  29. const double x = viewer.current_mouse_x;
  30. const double y = viewer.core().viewport(3) - viewer.current_mouse_y;
  31. Eigen::VectorXd D;
  32. if(::update(
  33. V,F,t,x,y,
  34. viewer.core().view,viewer.core().proj,viewer.core().viewport,
  35. data,
  36. D))
  37. {
  38. viewer.data().set_data(D);
  39. return true;
  40. }
  41. return false;
  42. };
  43. viewer.callback_mouse_down =
  44. [&](igl::opengl::glfw::Viewer& viewer, int, int)->bool
  45. {
  46. if(update())
  47. {
  48. down_on_mesh = true;
  49. return true;
  50. }
  51. return false;
  52. };
  53. viewer.callback_mouse_move =
  54. [&](igl::opengl::glfw::Viewer& viewer, int, int)->bool
  55. {
  56. if(down_on_mesh)
  57. {
  58. update();
  59. return true;
  60. }
  61. return false;
  62. };
  63. viewer.callback_mouse_up =
  64. [&down_on_mesh](igl::opengl::glfw::Viewer& viewer, int, int)->bool
  65. {
  66. down_on_mesh = false;
  67. return false;
  68. };
  69. std::cout<<R"(Usage:
  70. [click] Click on shape to pick new geodesic distance source
  71. ,/. Decrease/increase t by factor of 10.0
  72. D,d Toggle using intrinsic Delaunay discrete differential operators
  73. )";
  74. viewer.callback_key_pressed =
  75. [&](igl::opengl::glfw::Viewer& /*viewer*/, unsigned int key, int mod)->bool
  76. {
  77. switch(key)
  78. {
  79. default:
  80. return false;
  81. case 'D':
  82. case 'd':
  83. data.use_intrinsic_delaunay = !data.use_intrinsic_delaunay;
  84. std::cout<<(data.use_intrinsic_delaunay?"":"not ")<<
  85. "using intrinsic delaunay..."<<std::endl;
  86. precompute();
  87. update();
  88. break;
  89. case '.':
  90. case ',':
  91. t *= (key=='.'?10.0:0.1);
  92. precompute();
  93. update();
  94. std::cout<<"t: "<<t<<std::endl;
  95. break;
  96. }
  97. return true;
  98. };
  99. // Show mesh
  100. viewer.data().set_mesh(V, F);
  101. viewer.data().set_data(Eigen::VectorXd::Zero(V.rows()));
  102. viewer.data().set_colormap(isolines_colormap());
  103. viewer.data().show_lines = false;
  104. viewer.launch();
  105. }