main.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. #include <igl/opengl/glfw/Viewer.h>
  2. #include <igl/opengl/glfw/imgui/ImGuiMenu.h>
  3. #include <igl/opengl/glfw/imgui/ImGuizmo.h>
  4. #include <imgui_impl_glfw.h>
  5. #include <imgui_impl_opengl3.h>
  6. #include <GLFW/glfw3.h>
  7. #include <imgui/imgui.h>
  8. #include "tutorial_shared_path.h"
  9. class SlicingPlugin : public igl::opengl::glfw::imgui::ImGuiMenu
  10. {
  11. igl::opengl::ViewerData data;
  12. const Eigen::MatrixXd OV = (Eigen::MatrixXd(4, 3) <<
  13. -0.5, -0.5, 0.0,
  14. -0.5, 0.5, 0.0,
  15. 0.5, 0.5, 0.0,
  16. 0.5, -0.5, 0.0).finished();
  17. const Eigen::MatrixXi OF = (Eigen::MatrixXi(2, 3) <<
  18. 0, 2, 1,
  19. 0, 3, 2).finished();
  20. virtual void init(igl::opengl::glfw::Viewer *_viewer) override {
  21. ImGuiMenu::init(_viewer);
  22. // Load slicing plane into viewer (a square mesh)
  23. data.set_mesh(SlicingPlugin::OV, SlicingPlugin::OF);
  24. data.set_face_based(true);
  25. data.set_colors(Eigen::RowVector4d(224, 86, 253, 128)/255.0);
  26. data.show_lines = false;
  27. }
  28. virtual bool pre_draw() override {
  29. ImGuiMenu::pre_draw();
  30. ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0);
  31. ImGuizmo::BeginFrame();
  32. ImGui::PopStyleVar();
  33. return false;
  34. }
  35. virtual bool post_draw() override {
  36. viewer->core().draw(data);
  37. ImGuiMenu::post_draw();
  38. return false;
  39. }
  40. virtual void draw_custom_window() override {
  41. float menu_width = 180.f * menu_scaling();
  42. ImGui::SetNextWindowPos(ImVec2(menu_width, 0.0f), ImGuiCond_FirstUseEver);
  43. ImGui::SetNextWindowSize(ImVec2(0.0f, 0.0f), ImGuiCond_FirstUseEver);
  44. ImGui::SetNextWindowSizeConstraints(ImVec2(1.5f * menu_width, -1.0f), ImVec2(1.5f * menu_width, -1.0f));
  45. bool _guizmo_menu_visible = true;
  46. ImGui::Begin(
  47. "ImGuizmo Tools", &_guizmo_menu_visible,
  48. ImGuiWindowFlags_NoSavedSettings
  49. | ImGuiWindowFlags_AlwaysAutoResize
  50. );
  51. draw_imguizmo_menu();
  52. ImGui::End();
  53. }
  54. virtual void draw_imguizmo_menu() {
  55. static Eigen::Matrix4f matrix = Eigen::Matrix4f::Identity();
  56. Eigen::Affine3f rescale = Eigen::Scaling(0.5f * viewer->core().camera_base_zoom)
  57. * Eigen::Translation3f(viewer->core().camera_base_translation);
  58. Eigen::Affine3f view = Eigen::Affine3f( viewer->core().view * 1./viewer->core().camera_zoom ) * rescale.inverse();
  59. Eigen::Matrix4f proj = viewer->core().proj;
  60. if(viewer->core().orthographic)
  61. {
  62. view(2,3) -= 50; // Adjust depth for view transform
  63. }
  64. igl::opengl::glfw::imgui::EditTransform(view.matrix().data(), proj.data(), matrix.data(), viewer->core().orthographic);
  65. // Transform the slicing plane according to
  66. // ImGuizmo tool manipulations in the viewer
  67. Eigen::Affine3f model = Eigen::Affine3f(matrix) * rescale.inverse();
  68. Eigen::MatrixXd V = (SlicingPlugin::OV.rowwise().homogeneous()
  69. * model.matrix().cast<double>().transpose()).rowwise().hnormalized();
  70. if (data.V.rows() == V.rows())
  71. data.set_vertices(V);
  72. }
  73. };
  74. int main(int argc, char *argv[])
  75. {
  76. // Plot the mesh
  77. igl::opengl::glfw::Viewer viewer;
  78. std::string filename(TUTORIAL_SHARED_PATH "/cow.off");
  79. viewer.load_mesh_from_file(filename);
  80. // Custom menu
  81. SlicingPlugin menu;
  82. viewer.plugins.push_back(&menu);
  83. viewer.launch();
  84. }