ENh:Upgrade data_changed mechanism to avoid unnecessary Gizmo updates and improve efficiency

jira:none
code is form PrusaSlicer,thanks for PrusaSlicer and Filip Sykala
commit 123903f317f28723073cf3e5fbfe2564e987b6ab
Author: Filip Sykala <filip.sykala@prusa3d.cz>
Date:   Fri Dec 10 14:54:33 2021 +0100

    Clean up GLGizmoManagaer
    Clean up GLGizmoBase

Change-Id: Idae429f52499031df66265c92f8ba9fe9fc55eff
(cherry picked from commit 1957ad45cc9e9955228c2f00334047c805f97308)
This commit is contained in:
zhou.xu 2025-04-15 11:44:12 +08:00 committed by lane.wei
parent b609a45079
commit 682e70ca94
20 changed files with 83 additions and 164 deletions

View File

@ -539,6 +539,7 @@ void GLGizmoAdvancedCut::on_save(cereal::BinaryOutputArchive &ar) const
void GLGizmoAdvancedCut::data_changed(bool is_serializing)
{
reset_rotation();
if (m_hover_id < 0) { // BBL
update_bb();
if (auto oc = m_c->object_clipper()) {
@ -1168,7 +1169,7 @@ Vec3d GLGizmoAdvancedCut::get_plane_center() const {
return m_plane_center;
}
void GLGizmoAdvancedCut::finish_rotation()
void GLGizmoAdvancedCut::reset_rotation()
{
for (int i = 0; i < 3; i++) {
m_gizmos[i].set_angle(0.);
@ -2013,7 +2014,6 @@ void GLGizmoAdvancedCut::update_bb()
m_groove.flaps_angle = m_groove.flaps_angle_init = float(PI) / 3.f;
m_groove.angle = m_groove.angle_init = 0.f;
m_plane.reset();
clear_selection();
if (CommonGizmosDataObjects::SelectionInfo *selection = m_c->selection_info(); selection && selection->model_object())
m_selected.resize(selection->model_object()->cut_connectors.size(), false);

View File

@ -214,7 +214,7 @@ public:
bool on_key(const wxKeyEvent &evt) override;
double get_movement() const { return m_movement; }
void finish_rotation();
void reset_rotation();
std::string get_tooltip() const override;
BoundingBoxf3 bounding_box() const;

View File

@ -368,6 +368,14 @@ void GLGizmoBase::set_highlight_color(const std::array<float, 4>& color)
m_highlight_color = color;
}
void GLGizmoBase::enable_grabber(unsigned int id , bool enable) {
if (enable) {
enable_grabber(id);
} else {
disable_grabber(id);
}
}
void GLGizmoBase::enable_grabber(unsigned int id)
{
if (id < m_grabbers.size())

View File

@ -221,6 +221,7 @@ public:
void set_highlight_color(const std::array<float, 4>& color);
void enable_grabber(unsigned int id, bool enable);
void enable_grabber(unsigned int id);
void disable_grabber(unsigned int id);

View File

@ -58,18 +58,6 @@ bool GLGizmoBrimEars::on_init()
return true;
}
void GLGizmoBrimEars::set_brim_data(ModelObject *model_object, const Selection &selection)
{
if (!m_c->selection_info()) return;
ModelObject *mo = m_c->selection_info()->model_object();
if (m_state == On && mo && mo->id() != m_old_mo_id) {
reload_cache();
m_old_mo_id = mo->id();
}
}
void GLGizmoBrimEars::on_render()
{
ModelObject *mo = m_c->selection_info()->model_object();
@ -286,6 +274,19 @@ void GLGizmoBrimEars::data_changed(bool is_serializing)
reset_all_pick();
register_single_mesh_pick();
}
set_brim_data();
}
void GLGizmoBrimEars::set_brim_data()
{
if (!m_c->selection_info()) return;
ModelObject *mo = m_c->selection_info()->model_object();
if (m_state == On && mo && mo->id() != m_old_mo_id) {
reload_cache();
m_old_mo_id = mo->id();
}
}
// Following function is called from GLCanvas3D to inform the gizmo about a mouse/keyboard event.

View File

@ -75,7 +75,6 @@ public:
GLGizmoBrimEars(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id);
virtual ~GLGizmoBrimEars() = default;
void data_changed(bool is_serializing) override;
void set_brim_data(ModelObject* model_object, const Selection& selection);
bool gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_position, bool shift_down, bool alt_down, bool control_down);
void delete_selected_points();
void update_model_object();
@ -88,6 +87,7 @@ public:
std::string get_gizmo_leaving_text() const override { return "Leaving Brim Ears"; }
private:
void set_brim_data();
bool on_init() override;
void on_update(const UpdateData& data) override;
void on_render() override;

View File

@ -29,6 +29,10 @@ GLGizmoFdmSupports::GLGizmoFdmSupports(GLCanvas3D& parent, const std::string& ic
m_cursor_type = TriangleSelector::CursorType::CIRCLE;
}
void GLGizmoFdmSupports::data_changed(bool is_serializing) {
set_painter_gizmo_data(m_parent.get_selection());
}
void GLGizmoFdmSupports::on_shutdown()
{
//BBS

View File

@ -14,7 +14,7 @@ class GLGizmoFdmSupports : public GLGizmoPainterBase
{
public:
GLGizmoFdmSupports(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id);
void data_changed(bool is_serializing) override;
void render_painter_gizmo() const override;
//BBS: add edit state

View File

@ -292,15 +292,6 @@ void GLGizmoFlatten::on_render_for_picking()
glsafe(::glEnable(GL_CULL_FACE));
}
void GLGizmoFlatten::set_flattening_data(const ModelObject* model_object)
{
m_starting_center = Vec3d::Zero();
if (model_object != m_old_model_object) {
m_planes.clear();
m_planes_valid = false;
}
}
void GLGizmoFlatten::update_planes()
{
const ModelObject* mo = m_c->selection_info()->model_object();
@ -532,7 +523,7 @@ void GLGizmoFlatten::update_planes()
m_first_instance_scale = mo->instances.front()->get_scaling_factor();
m_first_instance_mirror = mo->instances.front()->get_mirror();
m_old_model_object = mo;
m_old_instance_id = m_c->selection_info()->get_active_instance();
// And finally create respective VBOs. The polygon is convex with
// the vertices in order, so triangulation is trivial.
for (auto& plane : m_planes) {
@ -583,5 +574,21 @@ Vec3d GLGizmoFlatten::get_flattening_normal() const
return out;
}
void GLGizmoFlatten::data_changed(bool is_serializing)
{
const Selection & selection = m_parent.get_selection();
const ModelObject *model_object = nullptr;
int instance_id = -1;
if (selection.is_single_full_instance() || selection.is_from_single_object()) {
model_object = selection.get_model()->objects[selection.get_object_idx()];
instance_id = selection.get_instance_idx();
}
m_starting_center = Vec3d::Zero();
if (model_object != m_old_model_object || instance_id != m_old_instance_id) {
m_planes.clear();
m_planes_valid = false;
}
}
} // namespace GUI
} // namespace Slic3r

View File

@ -47,8 +47,8 @@ private:
public:
GLGizmoFlatten(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id);
void set_flattening_data(const ModelObject* model_object);
Vec3d get_flattening_normal() const;
void data_changed(bool is_serializing) override;
protected:
virtual bool on_init() override;
@ -68,6 +68,7 @@ private:
mutable int m_last_hit_facet;
mutable GLModel m_one_tri_model;
Vec3f m_hit_object_normal;
int m_old_instance_id{-1};
private:
bool update_raycast_cache(const Vec2d &mouse_position, const Camera &camera, const std::vector<Transform3d> &trafo_matrices, int &facet);

View File

@ -142,6 +142,10 @@ GLGizmoMmuSegmentation::GLGizmoMmuSegmentation(GLCanvas3D& parent, const std::st
{
}
void GLGizmoMmuSegmentation::data_changed(bool is_serializing) {
set_painter_gizmo_data(m_parent.get_selection());
}
void GLGizmoMmuSegmentation::render_painter_gizmo() const
{
const Selection& selection = m_parent.get_selection();

View File

@ -66,11 +66,9 @@ class GLGizmoMmuSegmentation : public GLGizmoPainterBase
public:
GLGizmoMmuSegmentation(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id);
~GLGizmoMmuSegmentation() override = default;
void data_changed(bool is_serializing) override;
void render_painter_gizmo() const override;
void render_non_manifold_edges() const;
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.
@ -87,6 +85,7 @@ public:
protected:
// BBS
void set_painter_gizmo_data(const Selection &selection) override;
std::array<float, 4> get_cursor_hover_color() const override;
void on_set_state() override;

View File

@ -60,6 +60,7 @@ std::string GLGizmoMove3D::get_tooltip() const
void GLGizmoMove3D::data_changed(bool is_serializing)
{
enable_grabber(2, !m_parent.get_selection().is_wipe_tower());
change_cs_by_selection();
}

View File

@ -222,7 +222,6 @@ private:
public:
GLGizmoPainterBase(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id);
~GLGizmoPainterBase() override = default;
virtual void set_painter_gizmo_data(const Selection& selection);
virtual bool gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_position, bool shift_down, bool alt_down, bool control_down);
// Following function renders the triangles and cursor. Having this separated
@ -242,6 +241,7 @@ public:
void update_front_view_radian();
protected:
virtual void set_painter_gizmo_data(const Selection &selection);
virtual void render_triangles(const Selection& selection) const;
void render_cursor() const;
void render_cursor_circle() const;

View File

@ -689,6 +689,14 @@ void GLGizmoRotate3D::on_set_state()
void GLGizmoRotate3D::data_changed(bool is_serializing) {
const Selection &selection = m_parent.get_selection();
enable_grabber(0, !selection.is_wipe_tower());
enable_grabber(1, !selection.is_wipe_tower());
if (selection.is_wipe_tower()) {
DynamicPrintConfig &config = wxGetApp().preset_bundle->prints.get_edited_preset().config;
set_rotation(Vec3d(0., 0., (M_PI / 180.) * dynamic_cast<const ConfigOptionFloat *>(config.option("wipe_tower_rotation_angle"))->value));
} else {
set_rotation(Vec3d::Zero());
}
const GLVolume * volume = selection.get_first_volume();
if (volume == nullptr) {
m_last_volume = nullptr;

View File

@ -84,6 +84,12 @@ std::string GLGizmoScale3D::get_tooltip() const
void GLGizmoScale3D::data_changed(bool is_serializing)
{
const Selection &selection = m_parent.get_selection();
bool enable_scale_xyz = selection.is_single_full_instance() || selection.is_single_volume_or_modifier();
for (unsigned int i = 0; i < 6; ++i)
m_grabbers[i].enabled = enable_scale_xyz;
set_scale(Vec3d::Ones());
change_cs_by_selection();
}

View File

@ -55,6 +55,10 @@ GLGizmoSeam::GLGizmoSeam(GLCanvas3D& parent, const std::string& icon_filename, u
}
void GLGizmoSeam::data_changed(bool is_serializing) {
set_painter_gizmo_data(m_parent.get_selection());
}
std::string GLGizmoSeam::on_get_name() const
{

View File

@ -9,7 +9,7 @@ class GLGizmoSeam : public GLGizmoPainterBase
{
public:
GLGizmoSeam(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id);
void data_changed(bool is_serializing) override;
void render_painter_gizmo() const override;
//BBS

View File

@ -439,17 +439,6 @@ void GLGizmosManager::set_hover_id(int id)
m_gizmos[m_current]->set_hover_id(id);
}
void GLGizmosManager::enable_grabber(EType type, unsigned int id, bool enable)
{
if (!m_enabled || type == Undefined || m_gizmos.empty())
return;
if (enable)
m_gizmos[type]->enable_grabber(id);
else
m_gizmos[type]->disable_grabber(id);
}
void GLGizmosManager::update(const Linef3& mouse_ray, const Point& mouse_pos)
{
if (!m_enabled)
@ -476,19 +465,6 @@ void GLGizmosManager::update_data()
return;
const Selection& selection = m_parent.get_selection();
bool is_wipe_tower = selection.is_wipe_tower();
enable_grabber(Move, 2, !is_wipe_tower);
enable_grabber(Rotate, 0, !is_wipe_tower);
enable_grabber(Rotate, 1, !is_wipe_tower);
// BBS: when select multiple objects, uniform scale can be deselected, display the 0-5 grabbers
//bool enable_scale_xyz = selection.is_single_full_instance() || selection.is_single_volume() || selection.is_single_modifier();
//for (unsigned int i = 0; i < 6; ++i)
//{
// enable_grabber(Scale, i, enable_scale_xyz);
//}
if (m_common_gizmos_data) {
m_common_gizmos_data->update(get_current()
? get_current()->get_requirements()
@ -497,56 +473,12 @@ void GLGizmosManager::update_data()
if (m_current != Undefined)
m_gizmos[m_current]->data_changed(m_serializing);
if (selection.is_single_full_instance())
{
// all volumes in the selection belongs to the same instance, any of them contains the needed data, so we take the first
const GLVolume* volume = selection.get_volume(*selection.get_volume_idxs().begin());
set_scale(volume->get_instance_scaling_factor());
set_rotation(Vec3d::Zero());
// BBS
finish_cut_rotation();
ModelObject* model_object = selection.get_model()->objects[selection.get_object_idx()];
set_flattening_data(model_object);
set_sla_support_data(model_object);
set_brim_data(model_object);
set_painter_gizmo_data();
}
else if (selection.is_single_volume() || selection.is_single_modifier())
{
const GLVolume* volume = selection.get_volume(*selection.get_volume_idxs().begin());
set_scale(volume->get_volume_scaling_factor());
set_rotation(Vec3d::Zero());
// BBS
finish_cut_rotation();
set_flattening_data(nullptr);
set_sla_support_data(nullptr);
set_brim_data(nullptr);
set_painter_gizmo_data();
}
else if (is_wipe_tower)
{
DynamicPrintConfig& proj_cfg = wxGetApp().preset_bundle->project_config;
set_scale(Vec3d::Ones());
set_rotation(Vec3d(0., 0., (M_PI/180.) * dynamic_cast<const ConfigOptionFloat*>(proj_cfg.option("wipe_tower_rotation_angle"))->value));
set_flattening_data(nullptr);
set_sla_support_data(nullptr);
set_brim_data(nullptr);
set_painter_gizmo_data();
}
else
{
set_scale(Vec3d::Ones());
set_rotation(Vec3d::Zero());
set_flattening_data(selection.is_from_single_object() ? selection.get_model()->objects[selection.get_object_idx()] : nullptr);
set_sla_support_data(selection.is_from_single_instance() ? selection.get_model()->objects[selection.get_object_idx()] : nullptr);
set_brim_data(selection.is_from_single_instance() ? selection.get_model()->objects[selection.get_object_idx()] : nullptr);
set_painter_gizmo_data();
}
//BBS: GUI refactor: add object manipulation in gizmo
if (!selection.is_empty()) {
m_object_manipulation.update_ui_from_settings();
m_object_manipulation.UpdateAndShow(true);
if (m_current == EType::Move || m_current == EType::Rotate || m_current == EType::Scale) {
if (!selection.is_empty()) {
m_object_manipulation.update_ui_from_settings();
m_object_manipulation.UpdateAndShow(true);
}
}
}
@ -649,12 +581,6 @@ void GLGizmosManager::set_rotation(const Vec3d& rotation)
dynamic_cast<GLGizmoRotate3D*>(m_gizmos[Rotate].get())->set_rotation(rotation);
}
// BBS
void GLGizmosManager::finish_cut_rotation()
{
dynamic_cast<GLGizmoAdvancedCut*>(m_gizmos[Cut].get())->finish_rotation();
}
void GLGizmosManager::update_paint_base_camera_rotate_rad()
{
if (m_current == MmuSegmentation || m_current == Seam) {
@ -671,45 +597,6 @@ Vec3d GLGizmosManager::get_flattening_normal() const
return dynamic_cast<GLGizmoFlatten*>(m_gizmos[Flatten].get())->get_flattening_normal();
}
void GLGizmosManager::set_flattening_data(const ModelObject* model_object)
{
if (!m_enabled || m_gizmos.empty())
return;
dynamic_cast<GLGizmoFlatten*>(m_gizmos[Flatten].get())->set_flattening_data(model_object);
}
void GLGizmosManager::set_sla_support_data(ModelObject* model_object)
{
if (! m_enabled
|| m_gizmos.empty()
|| wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() != ptSLA)
return;
auto* gizmo_hollow = dynamic_cast<GLGizmoHollow*>(m_gizmos[Hollow].get());
auto* gizmo_supports = dynamic_cast<GLGizmoSlaSupports*>(m_gizmos[SlaSupports].get());
gizmo_hollow->set_sla_support_data(model_object, m_parent.get_selection());
gizmo_supports->set_sla_support_data(model_object, m_parent.get_selection());
}
void GLGizmosManager::set_brim_data(ModelObject* model_object)
{
if (!m_enabled || m_gizmos.empty())
return;
auto* gizmo_brim = dynamic_cast<GLGizmoBrimEars*>(m_gizmos[BrimEars].get());
gizmo_brim->set_brim_data(model_object, m_parent.get_selection());
}
void GLGizmosManager::set_painter_gizmo_data()
{
if (!m_enabled || m_gizmos.empty())
return;
dynamic_cast<GLGizmoFdmSupports*>(m_gizmos[FdmSupports].get())->set_painter_gizmo_data(m_parent.get_selection());
dynamic_cast<GLGizmoSeam*>(m_gizmos[Seam].get())->set_painter_gizmo_data(m_parent.get_selection());
dynamic_cast<GLGizmoMmuSegmentation*>(m_gizmos[MmuSegmentation].get())->set_painter_gizmo_data(m_parent.get_selection());
}
bool GLGizmosManager::is_gizmo_activable_when_single_full_instance() {
if (get_current_type() == GLGizmosManager::EType::Flatten ||
get_current_type() == GLGizmosManager::EType::Cut ||
@ -1157,7 +1044,7 @@ bool GLGizmosManager::on_mouse(wxMouseEvent& evt)
processed = true;
else if (!selection.is_empty() && grabber_contains_mouse()) {
if (!(m_current == Measure || m_current == Assembly)) {
update_data();
selection.start_dragging();
start_dragging();

View File

@ -240,7 +240,6 @@ public:
bool check_gizmos_closed_except(EType) const;
void set_hover_id(int id);
void enable_grabber(EType type, unsigned int id, bool enable);
void update(const Linef3& mouse_ray, const Point& mouse_pos);
void update_data();
@ -268,9 +267,6 @@ public:
Vec3d get_rotation() const;
void set_rotation(const Vec3d& rotation);
// BBS
void finish_cut_rotation();
//BBS
void* get_icon_texture_id(MENU_ICON_NAME icon) {
if (icon_list.find((int)icon) != icon_list.end())
@ -287,14 +283,6 @@ public:
void update_paint_base_camera_rotate_rad();
Vec3d get_flattening_normal() const;
void set_flattening_data(const ModelObject* model_object);
void set_sla_support_data(ModelObject* model_object);
void set_brim_data(ModelObject* model_object);
void set_painter_gizmo_data();
bool is_gizmo_activable_when_single_full_instance();
bool is_gizmo_click_empty_not_exit();
bool is_show_only_active_plate();