diff --git a/include/igl/opengl/glfw/imgui/SelectionPlugin.cpp b/include/igl/opengl/glfw/imgui/SelectionPlugin.cpp index 4355e3545..942133d97 100644 --- a/include/igl/opengl/glfw/imgui/SelectionPlugin.cpp +++ b/include/igl/opengl/glfw/imgui/SelectionPlugin.cpp @@ -22,7 +22,7 @@ igl::opengl::glfw::imgui::SelectionPlugin usage: } IGL_INLINE bool SelectionPlugin::pre_draw() { - if(!visible){ return false; } + if(mode == OFF){ return false; } ImGuiMenu::pre_draw(); return false; } @@ -84,7 +84,7 @@ IGL_INLINE bool SelectionPlugin::post_draw() IGL_INLINE bool SelectionPlugin::mouse_down(int button, int modifier) { - if(mode == OFF){ return false;} + if(mode == OFF || (modifier & IGL_MOD_ALT) ){ return false;} is_down = true; has_moved_since_down = false; if(!is_drawing) @@ -143,13 +143,11 @@ IGL_INLINE bool SelectionPlugin::mouse_move(int mouse_x, int mouse_y) IGL_INLINE bool SelectionPlugin::key_pressed(unsigned int key, int modifiers) { - const auto clear = [&]() { M.setZero(); L.clear(); is_drawing = false; is_down = false; }; + Mode old = mode; if(OFF_KEY.find(char(key)) != std::string::npos) { - mode = OFF; - return true; - } - if(LASSO_KEY.find(char(key)) != std::string::npos) + mode = OFF; + }else if(LASSO_KEY.find(char(key)) != std::string::npos) { if(mode == LASSO) { @@ -158,10 +156,7 @@ IGL_INLINE bool SelectionPlugin::key_pressed(unsigned int key, int modifiers) { mode = LASSO; } - clear(); - return true; - } - if(MARQUEE_KEY.find(char(key)) != std::string::npos) + }else if(MARQUEE_KEY.find(char(key)) != std::string::npos) { if(mode == RECTANGULAR_MARQUEE) { @@ -170,12 +165,24 @@ IGL_INLINE bool SelectionPlugin::key_pressed(unsigned int key, int modifiers) { mode = RECTANGULAR_MARQUEE; } + } + if(old != mode) + { clear(); + if(callback_post_mode_change){ callback_post_mode_change(old); } return true; } return false; } +IGL_INLINE void SelectionPlugin::clear() +{ + M.setZero(); + L.clear(); + is_drawing = false; + is_down = false; +}; + IGL_INLINE void SelectionPlugin::circle(const Eigen::Matrix & M, std::vector & L) { L.clear(); diff --git a/include/igl/opengl/glfw/imgui/SelectionPlugin.h b/include/igl/opengl/glfw/imgui/SelectionPlugin.h index f7ecd4f7e..e67f1a7cd 100644 --- a/include/igl/opengl/glfw/imgui/SelectionPlugin.h +++ b/include/igl/opengl/glfw/imgui/SelectionPlugin.h @@ -13,25 +13,6 @@ namespace igl{ namespace opengl{ namespace glfw{ namespace imgui{ class SelectionPlugin: public igl::opengl::glfw::imgui::ImGuiMenu { public: - // callback called when slection is completed (usually on mouse_up) - std::function callback; - // whether rotating, translating or scaling - ImGuizmo::OPERATION operation; - // stored transformation - Eigen::Matrix4f T; - // Initilize with rotate operation on an identity transform (at origin) - SelectionPlugin():operation(ImGuizmo::ROTATE),T(Eigen::Matrix4f::Identity()){}; - IGL_INLINE virtual void init(igl::opengl::glfw::Viewer *_viewer) override; - IGL_INLINE virtual bool pre_draw() override; - IGL_INLINE virtual bool post_draw() override; - IGL_INLINE virtual bool mouse_down(int button, int modifier) override; - IGL_INLINE virtual bool mouse_up(int button, int modifier) override; - IGL_INLINE virtual bool mouse_move(int mouse_x, int mouse_y) override; - IGL_INLINE virtual bool key_pressed(unsigned int key, int modifiers) override; - // helpers - IGL_INLINE static void circle(const Eigen::Matrix & M, std::vector & L); - IGL_INLINE static void rect(const Eigen::Matrix & M, std::vector & L); - IGL_INLINE static Eigen::RowVector2f xy(const Viewer * v); // customizable hotkeys std::string MARQUEE_KEY = "Mm"; // leave 'L' for show_lines in viewer @@ -46,7 +27,6 @@ public: LASSO = 4, NUM_MODES = 5 } mode = RECTANGULAR_MARQUEE; - bool visible = true; bool is_down = false; bool has_moved_since_down = false; bool is_drawing = false; @@ -54,6 +34,30 @@ public: Eigen::Matrix M = Eigen::Matrix::Zero(); // list of points of 2D lasso marquee std::vector L; + // callback called when slection is completed (usually on mouse_up) + std::function callback; + // callback called after mode is changed + std::function callback_post_mode_change; + // whether rotating, translating or scaling + ImGuizmo::OPERATION operation; + // stored transformation + Eigen::Matrix4f T; + // Initilize with rotate operation on an identity transform (at origin) + SelectionPlugin():operation(ImGuizmo::ROTATE),T(Eigen::Matrix4f::Identity()){}; + IGL_INLINE virtual void init(igl::opengl::glfw::Viewer *_viewer) override; + IGL_INLINE virtual bool pre_draw() override; + IGL_INLINE virtual bool post_draw() override; + IGL_INLINE virtual bool mouse_down(int button, int modifier) override; + IGL_INLINE virtual bool mouse_up(int button, int modifier) override; + IGL_INLINE virtual bool mouse_move(int mouse_x, int mouse_y) override; + IGL_INLINE virtual bool key_pressed(unsigned int key, int modifiers) override; + IGL_INLINE void clear(); + // helpers + IGL_INLINE static void circle(const Eigen::Matrix & M, std::vector & L); + IGL_INLINE static void rect(const Eigen::Matrix & M, std::vector & L); + IGL_INLINE static Eigen::RowVector2f xy(const Viewer * v); +public: + EIGEN_MAKE_ALIGNED_OPERATOR_NEW }; }}}}