///|/ Copyright (c) Prusa Research 2019 - 2023 Oleksandra Iushchenko @YuSanka, Lukáš Matěna @lukasmatena, Enrico Turri @enricoturri1966, Filip Sykala @Jony01 ///|/ ///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher ///|/ #ifndef slic3r_GLGizmoFlatten_hpp_ #define slic3r_GLGizmoFlatten_hpp_ #include "GLGizmoBase.hpp" #include "slic3r/GUI/GLModel.hpp" #include "slic3r/GUI/MeshUtils.hpp" namespace Slic3r { enum class ModelVolumeType : int; namespace GUI { class GLGizmoFlatten : public GLGizmoBase { // This gizmo does not use grabbers. The m_hover_id relates to polygon managed by the class itself. private: struct PlaneData { std::vector vertices; // should be in fact local in update_planes() PickingModel vbo; Vec3d normal; float area; int picking_id{ -1 }; }; // This holds information to decide whether recalculation is necessary: std::vector m_volumes_matrices; std::vector m_volumes_types; Vec3d m_first_instance_scale; Vec3d m_first_instance_mirror; std::vector m_planes; std::vector> m_planes_casters; const ModelObject* m_old_model_object = nullptr; int m_old_instance_id{ -1 }; void update_planes(); bool is_plane_update_necessary() const; public: GLGizmoFlatten(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); void set_flattening_data(const ModelObject* model_object, int instance_id); /// /// Apply rotation on select plane /// /// Keep information about mouse click /// Return True when use the information otherwise False. bool on_mouse(const wxMouseEvent &mouse_event) override; void data_changed(bool is_serializing) override; protected: bool on_init() override; std::string on_get_name() const override; bool on_is_activable() const override; void on_render() override; void on_register_raycasters_for_picking() override; void on_unregister_raycasters_for_picking() override; void on_set_state() override; CommonGizmosDataID on_get_requirements() const override; }; } // namespace GUI } // namespace Slic3r #endif // slic3r_GLGizmoFlatten_hpp_