main.cpp 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. #include <igl/opengl/glfw/Viewer.h>
  2. #include <igl/read_triangle_mesh.h>
  3. #include <igl/list_to_matrix.h>
  4. #include <igl/matlab_format.h>
  5. #include <igl/AABB.h>
  6. #include <igl/screen_space_selection.h>
  7. #include <igl/opengl/glfw/imgui/SelectionPlugin.h>
  8. int main(int argc, char *argv[])
  9. {
  10. // Inline mesh of a cube
  11. Eigen::MatrixXd V;
  12. Eigen::MatrixXi F;
  13. igl::read_triangle_mesh(
  14. argc>1?argv[1]: TUTORIAL_SHARED_PATH "/armadillo.obj",V,F);
  15. // Plot the mesh
  16. igl::opengl::glfw::Viewer vr;
  17. igl::opengl::glfw::imgui::SelectionPlugin plugin;
  18. Eigen::VectorXd W = Eigen::VectorXd::Zero(V.rows());
  19. Eigen::Array<double,Eigen::Dynamic,1> and_visible =
  20. Eigen::Array<double,Eigen::Dynamic,1>::Zero(V.rows());
  21. const Eigen::MatrixXd CM = (Eigen::MatrixXd(2,3)<<
  22. 0.3,0.3,0.5,
  23. 255.0/255.0,228.0/255.0,58.0/255.0).finished();
  24. bool only_visible = false;
  25. const auto update = [&]()
  26. {
  27. const bool was_face_based = vr.data().face_based;
  28. Eigen::VectorXd S = W;
  29. if(only_visible) { S.array() *= and_visible; }
  30. vr.data().set_data(S,0,1,igl::COLOR_MAP_TYPE_PLASMA,2);
  31. vr.data().face_based = was_face_based;
  32. vr.data().set_colormap(CM);
  33. };
  34. igl::AABB<Eigen::MatrixXd, 3> tree;
  35. tree.init(V,F);
  36. plugin.callback = [&]()
  37. {
  38. screen_space_selection(V,F,tree,vr.core().view,vr.core().proj,vr.core().viewport,plugin.L,W,and_visible);
  39. update();
  40. };
  41. vr.callback_key_pressed = [&](decltype(vr) &,unsigned int key, int mod)
  42. {
  43. switch(key)
  44. {
  45. case ' ': only_visible = !only_visible; update(); return true;
  46. case 'D': case 'd': W.setZero(); update(); return true;
  47. }
  48. return false;
  49. };
  50. std::cout<<R"(
  51. Usage:
  52. [space] Toggle whether to take visibility into account
  53. D,d Clear selection
  54. )";
  55. vr.plugins.push_back(&plugin);
  56. vr.data().set_mesh(V,F);
  57. vr.data().set_face_based(true);
  58. vr.core().background_color.head(3) = CM.row(0).head(3).cast<float>();
  59. vr.data().line_color.head(3) = (CM.row(0).head(3)*0.5).cast<float>();
  60. vr.data().show_lines = F.rows() < 20000;
  61. update();
  62. vr.launch();
  63. }