#ifndef slic3r_GLGizmoHollow_hpp_ #define slic3r_GLGizmoHollow_hpp_ #include "GLGizmoBase.hpp" #include "slic3r/GUI/GLSelectionRectangle.hpp" #include "slic3r/GUI/3DScene.hpp" #include #include #include #include namespace Slic3r { class ConfigOption; class ConfigOptionDef; namespace GUI { enum class SLAGizmoEventType : unsigned char; class Selection; class GLGizmoHollow : public GLGizmoBase { private: bool unproject_on_mesh(const Vec2d& mouse_pos, std::pair& pos_and_normal); public: GLGizmoHollow(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); void data_changed() override; bool gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_position, bool shift_down, bool alt_down, bool control_down); void delete_selected_points(); bool is_selection_rectangle_dragging() const override { return m_selection_rectangle.is_dragging(); } /// /// Postpone to Grabber for move /// Detect move of object by dragging /// /// Keep information about mouse click /// Return True when use the information otherwise False. bool on_mouse(const wxMouseEvent &mouse_event) override; protected: bool on_init() override; void on_render() override; #if ENABLE_RAYCAST_PICKING virtual void on_register_raycasters_for_picking() override; virtual void on_unregister_raycasters_for_picking() override; #else void on_render_for_picking() override; #endif // ENABLE_RAYCAST_PICKING private: #if ENABLE_RAYCAST_PICKING void render_points(const Selection& selection); #else void render_points(const Selection& selection, bool picking = false); #endif // ENABLE_RAYCAST_PICKING void render_volumes(); void process_mesh(SLAPrintObjectStep step, bool postpone_error_messages = false); #if ENABLE_RAYCAST_PICKING void register_hole_raycasters_for_picking(); void unregister_hole_raycasters_for_picking(); void register_volume_raycasters_for_picking(); void unregister_volume_raycasters_for_picking(); void update_hole_raycasters_for_picking_transform(); #endif // ENABLE_RAYCAST_PICKING void update_volumes(); ObjectID m_old_mo_id = -1; #if ENABLE_RAYCAST_PICKING PickingModel m_cylinder; std::vector> m_hole_raycasters; std::vector> m_volume_raycasters; #else GLModel m_cylinder; #endif // ENABLE_RAYCAST_PICKING GLVolumeCollection m_volumes; bool m_input_enabled{ false }; float m_new_hole_radius = 2.f; // Size of a new hole. float m_new_hole_height = 6.f; mutable std::vector m_selected; // which holes are currently selected bool m_enable_hollowing = true; // Stashes to keep data for undo redo. Is taken after the editing // is done, the data are updated continuously. float m_offset_stash = 3.0f; float m_quality_stash = 0.5f; float m_closing_d_stash = 2.f; Vec3f m_hole_before_drag = Vec3f::Zero(); sla::DrainHoles m_holes_in_drilled_mesh; sla::DrainHoles m_holes_stash; // This map holds all translated description texts, so they can be easily referenced during layout calculations // etc. When language changes, GUI is recreated and this class constructed again, so the change takes effect. std::map m_desc; GLSelectionRectangle m_selection_rectangle; bool m_wait_for_up_event = false; bool m_selection_empty = true; EState m_old_state = Off; // to be able to see that the gizmo has just been closed (see on_set_state) std::vector> get_config_options(const std::vector& keys) const; bool is_mesh_point_clipped(const Vec3d& point) const; // Methods that do the model_object and editing cache synchronization, // editing mode selection, etc: enum { AllPoints = -2, NoPoints, }; void select_point(int i); void unselect_point(int i); void reload_cache(); protected: void on_set_state() override; void on_set_hover_id() override; void on_start_dragging() override; void on_stop_dragging() override; void on_dragging(const UpdateData &data) override; void on_render_input_window(float x, float y, float bottom_limit) override; virtual CommonGizmosDataID on_get_requirements() const override; std::string on_get_name() const override; bool on_is_activable() const override; bool on_is_selectable() const override; void on_load(cereal::BinaryInputArchive& ar) override; void on_save(cereal::BinaryOutputArchive& ar) const override; #if ENABLE_RAYCAST_PICKING void init_cylinder_model(); #endif // ENABLE_RAYCAST_PICKING }; } // namespace GUI } // namespace Slic3r #endif // slic3r_GLGizmoHollow_hpp_