#ifndef slic3r_GLGizmoMmuSegmentation_hpp_ #define slic3r_GLGizmoMmuSegmentation_hpp_ #include "GLGizmoPainterBase.hpp" namespace Slic3r::GUI { class GLMmSegmentationGizmo3DScene { public: GLMmSegmentationGizmo3DScene() = delete; explicit GLMmSegmentationGizmo3DScene(size_t triangle_indices_buffers_count) { } virtual ~GLMmSegmentationGizmo3DScene() { release_geometry(); } [[nodiscard]] inline bool has_VBOs(size_t triangle_indices_idx) const { assert(triangle_indices_idx < this->triangle_patches.size()); return this->triangle_indices_VBO_ids[triangle_indices_idx] != 0; } // Release the geometry data, release OpenGL VBOs. void release_geometry(); // Finalize the initialization of the geometry, upload the geometry to OpenGL VBO objects // and possibly releasing it if it has been loaded into the VBOs. void finalize_vertices(); // Finalize the initialization of the indices, upload the indices to OpenGL VBO objects // and possibly releasing it if it has been loaded into the VBOs. void finalize_triangle_indices(); void clear() { this->vertices.clear(); // BBS this->triangle_indices_VBO_ids.clear(); this->triangle_indices_sizes.clear(); for (TrianglePatch& patch : this->triangle_patches) patch.triangle_indices.clear(); this->triangle_patches.clear(); } void render(size_t triangle_indices_idx) const; std::vector vertices; //std::vector> triangle_indices; // BBS std::vector triangle_patches; // When the triangle indices are loaded into the graphics card as Vertex Buffer Objects, // the above mentioned std::vectors are cleared and the following variables keep their original length. std::vector triangle_indices_sizes; // IDs of the Vertex Array Objects, into which the geometry has been loaded. // Zero if the VBOs are not sent to GPU yet. unsigned int vertices_VBO_id{0}; std::vector triangle_indices_VBO_ids; }; class GLGizmoMmuSegmentation : public GLGizmoPainterBase { public: GLGizmoMmuSegmentation(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); ~GLGizmoMmuSegmentation() override = default; void render_painter_gizmo() const override; void set_painter_gizmo_data(const Selection& selection) override; void render_triangles(const Selection& selection) const override; // TriangleSelector::serialization/deserialization has a limit to store 19 different states. // EXTRUDER_LIMIT + 1 states are used to storing the painting because also uncolored triangles are stored. // When increasing EXTRUDER_LIMIT, it needs to ensure that TriangleSelector::serialization/deserialization // will be also extended to support additional states, requiring at least one state to remain free out of 19 states. static const constexpr size_t EXTRUDERS_LIMIT = 16; const float get_cursor_radius_min() const override { return CursorRadiusMin; } // BBS bool on_number_key_down(int number); bool on_key_down_select_tool_type(int keyCode); protected: // BBS std::array get_cursor_hover_color() const override; void on_set_state() override; EnforcerBlockerType get_left_button_state_type() const override { return EnforcerBlockerType(m_selected_extruder_idx + 1); } EnforcerBlockerType get_right_button_state_type() const override { return EnforcerBlockerType(-1); } void on_render_input_window(float x, float y, float bottom_limit) override; std::string on_get_name() const override; std::string on_get_name_str() override { return "Color Painting"; } void show_tooltip_information(float caption_max, float x, float y); bool on_is_selectable() const override; bool on_is_activable() const override; wxString handle_snapshot_action_name(bool shift_down, Button button_down) const override; std::string get_gizmo_entering_text() const override { return "Entering color painting"; } std::string get_gizmo_leaving_text() const override { return "Leaving color painting"; } std::string get_action_snapshot_name() override { return "Color painting editing"; } // BBS size_t m_selected_extruder_idx = 0; std::vector> m_extruders_colors; std::vector m_volumes_extruder_idxs; // BBS wchar_t m_current_tool = 0; bool m_detect_geometry_edge = true; static const constexpr float CursorRadiusMin = 0.1f; // cannot be zero private: bool on_init() override; // BBS. remove const. void update_model_object() override; //BBS: add logic to distinguish the first_time_update and later_update void update_from_model_object(bool first_update = false) override; void tool_changed(wchar_t old_tool, wchar_t new_tool); void on_opening() override; void on_shutdown() override; PainterGizmoType get_painter_type() const override; void init_model_triangle_selectors(); // BBS void update_triangle_selectors_colors(); void init_extruders_data(); // 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; }; } // namespace Slic3r #endif // slic3r_GLGizmoMmuSegmentation_hpp_