Skip to content

Commit

Permalink
Fix godotengine#82756: Save branch as scene saves children without ow…
Browse files Browse the repository at this point in the history
…ner set
  • Loading branch information
marcinn committed Nov 16, 2023
1 parent fee6df7 commit 561fcf5
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 6 deletions.
20 changes: 15 additions & 5 deletions editor/scene_tree_dock.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2781,12 +2781,17 @@ void SceneTreeDock::_new_scene_from(String p_file) {
Node *base = selection.front()->get();

HashMap<const Node *, Node *> duplimap;
HashMap<const Node *, Node *> inverse_duplimap;
Node *copy = base->duplicate_from_editor(duplimap);

for (const KeyValue<const Node *, Node *> &item : duplimap) {
inverse_duplimap[item.value] = const_cast<Node *>(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);
Expand Down Expand Up @@ -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<const Node *, Node *> &p_inverse_duplimap) {
HashMap<const Node *, Node *>::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);
}
}

Expand Down
2 changes: 1 addition & 1 deletion editor/scene_tree_dock.h
Original file line number Diff line number Diff line change
Expand Up @@ -233,7 +233,7 @@ class SceneTreeDock : public VBoxContainer {
virtual void shortcut_input(const Ref<InputEvent> &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<const Node *, Node *> &p_inverse_duplimap);

bool _validate_no_foreign();
bool _validate_no_instance();
Expand Down

0 comments on commit 561fcf5

Please sign in to comment.