You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					61 lines
				
				2.0 KiB
			
		
		
			
		
	
	
					61 lines
				
				2.0 KiB
			| 
											1 year ago
										 | #ifndef IGL_OPENGL_GFLW_IMGUI_SELECTIONWIDGET_H
 | ||
|  | #define IGL_OPENGL_GFLW_IMGUI_SELECTIONWIDGET_H
 | ||
|  | #include "../../../igl_inline.h"
 | ||
|  | #include "ImGuiWidget.h"
 | ||
|  | #include <Eigen/Dense>
 | ||
|  | #include <vector>
 | ||
|  | #include <string>
 | ||
|  | #include <functional>
 | ||
|  | 
 | ||
|  | namespace igl{ namespace opengl{ namespace glfw{ namespace imgui{ | ||
|  | 
 | ||
|  | class SelectionWidget: public ImGuiWidget | ||
|  | { | ||
|  | public: | ||
|  |   // customizable hotkeys
 | ||
|  |   std::string MARQUEE_KEY = "Mm"; | ||
|  |   // leave 'L' for show_lines in viewer
 | ||
|  |   std::string LASSO_KEY = "l"; | ||
|  |   std::string OFF_KEY = "Vv"; | ||
|  |   enum Mode | ||
|  |   { | ||
|  |     OFF                 = 0, | ||
|  |     RECTANGULAR_MARQUEE = 1, | ||
|  |     ELLIPTICAL_MARQUEE  = 2, | ||
|  |     POLYGONAL_LASSO     = 3, | ||
|  |     LASSO               = 4, | ||
|  |     NUM_MODES           = 5 | ||
|  |   } mode = RECTANGULAR_MARQUEE; | ||
|  |   bool is_down = false; | ||
|  |   bool has_moved_since_down = false; | ||
|  |   bool is_drawing = false; | ||
|  |   // min and max corners of 2D rectangular marquee
 | ||
|  |   Eigen::Matrix<float,2,2> M = Eigen::Matrix<float,2,2>::Zero(); | ||
|  |   // list of points of 2D lasso marquee
 | ||
|  |   std::vector<Eigen::RowVector2f> L; | ||
|  |   // callback called when slection is completed (usually on mouse_up)
 | ||
|  |   std::function<void(void)> callback; | ||
|  |   // callback called after mode is changed
 | ||
|  |   std::function<void(Mode)> callback_post_mode_change; | ||
|  |   IGL_INLINE virtual void init(Viewer *_viewer, ImGuiPlugin *_plugin) override; | ||
|  |   IGL_INLINE virtual void 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<float,2,2> & M,  std::vector<Eigen::RowVector2f> & L); | ||
|  |   IGL_INLINE static void rect(const Eigen::Matrix<float,2,2> & M,  std::vector<Eigen::RowVector2f> & L); | ||
|  |   IGL_INLINE static Eigen::RowVector2f xy(const Viewer * v); | ||
|  | public: | ||
|  |   EIGEN_MAKE_ALIGNED_OPERATOR_NEW | ||
|  | }; | ||
|  | 
 | ||
|  | }}}} | ||
|  | 
 | ||
|  | #ifndef IGL_STATIC_LIBRARY
 | ||
|  | #include "SelectionWidget.cpp"
 | ||
|  | #endif
 | ||
|  | #endif
 |