main.cpp 2.2 KB

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