From 7c5bb585a5e27fc29485d909e2ffca4bdeed2081 Mon Sep 17 00:00:00 2001 From: Kilian Hu Date: Thu, 12 Jun 2025 17:50:24 +0200 Subject: [PATCH] Fix gizmo update if select changes outside 3D view --- editor/scene/3d/node_3d_editor_plugin.cpp | 30 ++++++++++++++++++++++- editor/scene/3d/node_3d_editor_plugin.h | 3 +++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/editor/scene/3d/node_3d_editor_plugin.cpp b/editor/scene/3d/node_3d_editor_plugin.cpp index 1fedcd1ab93..2833c2da66d 100644 --- a/editor/scene/3d/node_3d_editor_plugin.cpp +++ b/editor/scene/3d/node_3d_editor_plugin.cpp @@ -8043,9 +8043,37 @@ void Node3DEditor::_selection_changed() { selected->update_gizmos(); selected = nullptr; } + + // Ensure gizmo updates are performed when the selection changes + // outside of the 3D view (see GH-106713). + if (!is_visible()) { + const List &top_selected = editor_selection->get_top_selected_node_list(); + if (top_selected.size() == 1) { + Node3D *new_selected = Object::cast_to(top_selected.back()->get()); + if (new_selected != selected) { + gizmos_dirty = true; + } + } + } + update_transform_gizmo(); } +void Node3DEditor::refresh_dirty_gizmos() { + if (!gizmos_dirty) { + return; + } + + const List &top_selected = editor_selection->get_top_selected_node_list(); + if (top_selected.size() == 1) { + Node3D *new_selected = Object::cast_to(top_selected.back()->get()); + if (new_selected != selected) { + edit(new_selected); + } + } + gizmos_dirty = false; +} + void Node3DEditor::_refresh_menu_icons() { bool all_locked = true; bool all_grouped = true; @@ -9843,7 +9871,7 @@ void Node3DEditorPlugin::make_visible(bool p_visible) { spatial_editor->show(); spatial_editor->set_process(true); spatial_editor->set_physics_process(true); - + spatial_editor->refresh_dirty_gizmos(); } else { spatial_editor->hide(); spatial_editor->set_process(false); diff --git a/editor/scene/3d/node_3d_editor_plugin.h b/editor/scene/3d/node_3d_editor_plugin.h index 28e7c750ca4..d71a4c11d21 100644 --- a/editor/scene/3d/node_3d_editor_plugin.h +++ b/editor/scene/3d/node_3d_editor_plugin.h @@ -833,6 +833,8 @@ private: void _set_subgizmo_selection(Object *p_obj, Ref p_gizmo, int p_id, Transform3D p_transform = Transform3D()); void _clear_subgizmo_selection(Object *p_obj = nullptr); + bool gizmos_dirty = false; + static Node3DEditor *singleton; void _node_added(Node *p_node); @@ -997,6 +999,7 @@ public: bool is_subgizmo_selected(int p_id); Vector get_subgizmo_selection(); void clear_subgizmo_selection(Object *p_obj = nullptr); + void refresh_dirty_gizmos(); Ref get_current_hover_gizmo() const { return current_hover_gizmo; } void set_current_hover_gizmo(Ref p_gizmo) { current_hover_gizmo = p_gizmo; }