#ifndef slic3r_GUI_GLGizmosManager_hpp_ #define slic3r_GUI_GLGizmosManager_hpp_ #include "slic3r/GUI/GLTexture.hpp" #include "slic3r/GUI/GLToolbar.hpp" #include "slic3r/GUI/Gizmos/GLGizmos.hpp" #include namespace Slic3r { namespace GUI { class Selection; class GLGizmoBase; class GLCanvas3D; class Rect { float m_left; float m_top; float m_right; float m_bottom; public: Rect() : m_left(0.0f) , m_top(0.0f) , m_right(0.0f) , m_bottom(0.0f) {} Rect(float left, float top, float right, float bottom) : m_left(left) , m_top(top) , m_right(right) , m_bottom(bottom) {} float get_left() const { return m_left; } void set_left(float left) { m_left = left; } float get_top() const { return m_top; } void set_top(float top) { m_top = top; } float get_right() const { return m_right; } void set_right(float right) { m_right = right; } float get_bottom() const { return m_bottom; } void set_bottom(float bottom) { m_bottom = bottom; } float get_width() const { return m_right - m_left; } float get_height() const { return m_top - m_bottom; } }; class GLGizmosManager { public: #if ENABLE_SVG_ICONS static const float Default_Icons_Size; #endif // ENABLE_SVG_ICONS enum EType : unsigned char { Undefined, Move, Scale, Rotate, Flatten, Cut, SlaSupports, Num_Types }; private: bool m_enabled; typedef std::map GizmosMap; GizmosMap m_gizmos; #if ENABLE_SVG_ICONS mutable GLTexture m_icons_texture; mutable bool m_icons_texture_dirty; #else ItemsIconsTexture m_icons_texture; #endif // ENABLE_SVG_ICONS BackgroundTexture m_background_texture; EType m_current; #if ENABLE_SVG_ICONS float m_overlay_icons_size; float m_overlay_scale; #else float m_overlay_icons_scale; #endif // ENABLE_SVG_ICONS float m_overlay_border; float m_overlay_gap_y; struct MouseCapture { bool left; bool middle; bool right; GLCanvas3D* parent; MouseCapture() { reset(); } bool any() const { return left || middle || right; } void reset() { left = middle = right = false; parent = nullptr; } }; MouseCapture m_mouse_capture; std::string m_tooltip; public: GLGizmosManager(); ~GLGizmosManager(); bool init(GLCanvas3D& parent); bool is_enabled() const { return m_enabled; } void set_enabled(bool enable) { m_enabled = enable; } #if ENABLE_SVG_ICONS void set_overlay_icon_size(float size); #endif // ENABLE_SVG_ICONS void set_overlay_scale(float scale); void refresh_on_off_state(const Selection& selection); void reset_all_states(); void set_hover_id(int id); void enable_grabber(EType type, unsigned int id, bool enable); void update(const Linef3& mouse_ray, const Selection& selection, bool shift_down, const Point* mouse_pos = nullptr); Rect get_reset_rect_viewport(const GLCanvas3D& canvas) const; EType get_current_type() const { return m_current; } bool is_running() const; bool handle_shortcut(int key, const Selection& selection); bool is_dragging() const; void start_dragging(const Selection& selection); void stop_dragging(); Vec3d get_displacement() const; Vec3d get_scale() const; void set_scale(const Vec3d& scale); Vec3d get_rotation() const; void set_rotation(const Vec3d& rotation); Vec3d get_flattening_normal() const; void set_flattening_data(const ModelObject* model_object); void set_sla_support_data(ModelObject* model_object, const Selection& selection); bool gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_position = Vec2d::Zero(), bool shift_down = false); void render_current_gizmo(const Selection& selection) const; void render_current_gizmo_for_picking_pass(const Selection& selection) const; void render_overlay(const GLCanvas3D& canvas, const Selection& selection) const; const std::string& get_tooltip() const { return m_tooltip; } bool on_mouse(wxMouseEvent& evt, GLCanvas3D& canvas); private: void reset(); void do_render_overlay(const GLCanvas3D& canvas, const Selection& selection) const; float get_total_overlay_height() const; float get_total_overlay_width() const; GLGizmoBase* get_current() const; #if ENABLE_SVG_ICONS bool generate_icons_texture() const; #endif // ENABLE_SVG_ICONS void update_on_off_state(const GLCanvas3D& canvas, const Vec2d& mouse_pos, const Selection& selection); std::string update_hover_state(const GLCanvas3D& canvas, const Vec2d& mouse_pos); bool overlay_contains_mouse(const GLCanvas3D& canvas, const Vec2d& mouse_pos) const; bool grabber_contains_mouse() const; }; } // namespace GUI } // namespace Slic3r #endif // slic3r_GUI_GLGizmosManager_hpp_