From 561fcf54a4dbb4cc51ff429edb2badc6c2bf87d3 Mon Sep 17 00:00:00 2001 From: Marcin Nowak Date: Wed, 4 Oct 2023 19:18:22 +0200 Subject: [PATCH] Fix #82756: Save branch as scene saves children without owner set --- editor/scene_tree_dock.cpp | 20 +++++++++++++++----- editor/scene_tree_dock.h | 2 +- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/editor/scene_tree_dock.cpp b/editor/scene_tree_dock.cpp index a94c978a1ae8..aca777ce3346 100644 --- a/editor/scene_tree_dock.cpp +++ b/editor/scene_tree_dock.cpp @@ -2781,12 +2781,17 @@ void SceneTreeDock::_new_scene_from(String p_file) { Node *base = selection.front()->get(); HashMap duplimap; + HashMap inverse_duplimap; Node *copy = base->duplicate_from_editor(duplimap); + for (const KeyValue &item : duplimap) { + inverse_duplimap[item.value] = const_cast(item.key); + } + if (copy) { // Handle Unique Nodes. for (int i = 0; i < copy->get_child_count(false); i++) { - _set_node_owner_recursive(copy->get_child(i, false), copy); + _set_node_owner_recursive(copy->get_child(i, false), copy, inverse_duplimap); } // Root node cannot ever be unique name in its own Scene! copy->set_unique_name_in_owner(false); @@ -2820,13 +2825,18 @@ void SceneTreeDock::_new_scene_from(String p_file) { } } -void SceneTreeDock::_set_node_owner_recursive(Node *p_node, Node *p_owner) { - if (!p_node->get_owner()) { - p_node->set_owner(p_owner); +void SceneTreeDock::_set_node_owner_recursive(Node *p_node, Node *p_owner, const HashMap &p_inverse_duplimap) { + HashMap::ConstIterator E = p_inverse_duplimap.find(p_node); + + if (E) { + const Node *original = E->value; + if (original->get_owner()) { + p_node->set_owner(p_owner); + } } for (int i = 0; i < p_node->get_child_count(false); i++) { - _set_node_owner_recursive(p_node->get_child(i, false), p_owner); + _set_node_owner_recursive(p_node->get_child(i, false), p_owner, p_inverse_duplimap); } } diff --git a/editor/scene_tree_dock.h b/editor/scene_tree_dock.h index 93c0e16db7ad..c68a74c44c3c 100644 --- a/editor/scene_tree_dock.h +++ b/editor/scene_tree_dock.h @@ -233,7 +233,7 @@ class SceneTreeDock : public VBoxContainer { virtual void shortcut_input(const Ref &p_event) override; void _new_scene_from(String p_file); - void _set_node_owner_recursive(Node *p_node, Node *p_owner); + void _set_node_owner_recursive(Node *p_node, Node *p_owner, const HashMap &p_inverse_duplimap); bool _validate_no_foreign(); bool _validate_no_instance();