Skip to content

Commit

Permalink
Fix #82756: Save branch as scene saves children without owner set
Browse files Browse the repository at this point in the history
  • Loading branch information
marcinn committed Oct 4, 2023
1 parent bfd78bb commit ae3a477
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 6 deletions.
18 changes: 13 additions & 5 deletions editor/scene_tree_dock.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2663,12 +2663,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 (KeyValue item : duplimap) {
inverse_duplimap[item.value] = (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 @@ -2702,13 +2707,16 @@ 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, HashMap<const Node *, Node *> &inverse_duplimap) {
if (inverse_duplimap.has(p_node)) {
Node *original = inverse_duplimap.get(p_node);
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, 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 @@ -231,7 +231,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, HashMap<const Node *, Node *> &inverse_duplimap);

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

0 comments on commit ae3a477

Please sign in to comment.