Browse Source

Fix gizmo update if select changes outside 3D view

Kilian Hu 3 months ago
parent
commit
7c5bb585a5
2 changed files with 32 additions and 1 deletions
  1. 29 1
      editor/scene/3d/node_3d_editor_plugin.cpp
  2. 3 0
      editor/scene/3d/node_3d_editor_plugin.h

+ 29 - 1
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<Node *> &top_selected = editor_selection->get_top_selected_node_list();
+		if (top_selected.size() == 1) {
+			Node3D *new_selected = Object::cast_to<Node3D>(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<Node *> &top_selected = editor_selection->get_top_selected_node_list();
+	if (top_selected.size() == 1) {
+		Node3D *new_selected = Object::cast_to<Node3D>(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);

+ 3 - 0
editor/scene/3d/node_3d_editor_plugin.h

@@ -833,6 +833,8 @@ private:
 	void _set_subgizmo_selection(Object *p_obj, Ref<Node3DGizmo> 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<int> get_subgizmo_selection();
 	void clear_subgizmo_selection(Object *p_obj = nullptr);
+	void refresh_dirty_gizmos();
 
 	Ref<EditorNode3DGizmo> get_current_hover_gizmo() const { return current_hover_gizmo; }
 	void set_current_hover_gizmo(Ref<EditorNode3DGizmo> p_gizmo) { current_hover_gizmo = p_gizmo; }