Skip to content

Commit 86586e8

Browse files
committed
Merge pull request #107458 from kilian-hu/fix-issue-106713
Fix missing gizmo update when selection changes outside of 3D view
2 parents 8b2739e + 7c5bb58 commit 86586e8

File tree

2 files changed

+32
-1
lines changed

2 files changed

+32
-1
lines changed

editor/scene/3d/node_3d_editor_plugin.cpp

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8043,9 +8043,37 @@ void Node3DEditor::_selection_changed() {
80438043
selected->update_gizmos();
80448044
selected = nullptr;
80458045
}
8046+
8047+
// Ensure gizmo updates are performed when the selection changes
8048+
// outside of the 3D view (see GH-106713).
8049+
if (!is_visible()) {
8050+
const List<Node *> &top_selected = editor_selection->get_top_selected_node_list();
8051+
if (top_selected.size() == 1) {
8052+
Node3D *new_selected = Object::cast_to<Node3D>(top_selected.back()->get());
8053+
if (new_selected != selected) {
8054+
gizmos_dirty = true;
8055+
}
8056+
}
8057+
}
8058+
80468059
update_transform_gizmo();
80478060
}
80488061

8062+
void Node3DEditor::refresh_dirty_gizmos() {
8063+
if (!gizmos_dirty) {
8064+
return;
8065+
}
8066+
8067+
const List<Node *> &top_selected = editor_selection->get_top_selected_node_list();
8068+
if (top_selected.size() == 1) {
8069+
Node3D *new_selected = Object::cast_to<Node3D>(top_selected.back()->get());
8070+
if (new_selected != selected) {
8071+
edit(new_selected);
8072+
}
8073+
}
8074+
gizmos_dirty = false;
8075+
}
8076+
80498077
void Node3DEditor::_refresh_menu_icons() {
80508078
bool all_locked = true;
80518079
bool all_grouped = true;
@@ -9843,7 +9871,7 @@ void Node3DEditorPlugin::make_visible(bool p_visible) {
98439871
spatial_editor->show();
98449872
spatial_editor->set_process(true);
98459873
spatial_editor->set_physics_process(true);
9846-
9874+
spatial_editor->refresh_dirty_gizmos();
98479875
} else {
98489876
spatial_editor->hide();
98499877
spatial_editor->set_process(false);

editor/scene/3d/node_3d_editor_plugin.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -833,6 +833,8 @@ class Node3DEditor : public VBoxContainer {
833833
void _set_subgizmo_selection(Object *p_obj, Ref<Node3DGizmo> p_gizmo, int p_id, Transform3D p_transform = Transform3D());
834834
void _clear_subgizmo_selection(Object *p_obj = nullptr);
835835

836+
bool gizmos_dirty = false;
837+
836838
static Node3DEditor *singleton;
837839

838840
void _node_added(Node *p_node);
@@ -997,6 +999,7 @@ class Node3DEditor : public VBoxContainer {
997999
bool is_subgizmo_selected(int p_id);
9981000
Vector<int> get_subgizmo_selection();
9991001
void clear_subgizmo_selection(Object *p_obj = nullptr);
1002+
void refresh_dirty_gizmos();
10001003

10011004
Ref<EditorNode3DGizmo> get_current_hover_gizmo() const { return current_hover_gizmo; }
10021005
void set_current_hover_gizmo(Ref<EditorNode3DGizmo> p_gizmo) { current_hover_gizmo = p_gizmo; }

0 commit comments

Comments
 (0)