diff options
author | RĂ©mi Verschelde <remi@verschelde.fr> | 2021-03-11 21:39:43 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-03-11 21:39:43 +0100 |
commit | 27dea9366f0ab0229bc52a39ce701a46d107020b (patch) | |
tree | 835efc7bcc5df9ab4092004aa70623d39db4c5ce | |
parent | 5024b7236e8cd36087b34bd3a3c9f8481bafb1e0 (diff) | |
parent | 72134a7f2a4af1781208d6c46909d29caa5dbe19 (diff) |
Merge pull request #46510 from hilfazer/nested_scene_duplication_4_0
Support for duplication of nested instanced scenes
-rw-r--r-- | editor/scene_tree_dock.cpp | 10 | ||||
-rw-r--r-- | scene/main/node.cpp | 11 |
2 files changed, 9 insertions, 12 deletions
diff --git a/editor/scene_tree_dock.cpp b/editor/scene_tree_dock.cpp index 16a0576af4..2cdab83d90 100644 --- a/editor/scene_tree_dock.cpp +++ b/editor/scene_tree_dock.cpp @@ -685,7 +685,6 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { editor_data->get_undo_redo().add_do_method(editor_selection, "clear"); Node *dupsingle = nullptr; - List<Node *> editable_children; selection.sort_custom<Node::Comparator>(); @@ -701,10 +700,6 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { Map<const Node *, Node *> duplimap; Node *dup = node->duplicate_from_editor(duplimap); - if (EditorNode::get_singleton()->get_edited_scene()->is_editable_instance(node)) { - editable_children.push_back(dup); - } - ERR_CONTINUE(!dup); if (selection.size() == 1) { @@ -739,11 +734,6 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { if (dupsingle) { editor->push_item(dupsingle); } - - for (List<Node *>::Element *E = editable_children.back(); E; E = E->prev()) { - _toggle_editable_children(E->get()); - } - } break; case TOOL_REPARENT: { if (!profile_allow_editing) { diff --git a/scene/main/node.cpp b/scene/main/node.cpp index 137e1726f9..4c6bcb10b2 100644 --- a/scene/main/node.cpp +++ b/scene/main/node.cpp @@ -2051,19 +2051,26 @@ Node *Node::_duplicate(int p_flags, Map<const Node *, Node *> *r_duplimap) const // Since nodes in the instanced hierarchy won't be duplicated explicitly, we need to make an inventory // of all the nodes in the tree of the instanced scene in order to transfer the values of the properties + Vector<const Node *> instance_roots; + instance_roots.push_back(this); + for (List<const Node *>::Element *N = node_tree.front(); N; N = N->next()) { for (int i = 0; i < N->get()->get_child_count(); ++i) { Node *descendant = N->get()->get_child(i); // Skip nodes not really belonging to the instanced hierarchy; they'll be processed normally later // but remember non-instanced nodes that are hidden below instanced ones - if (descendant->data.owner != this) { - if (descendant->get_parent() && descendant->get_parent() != this && descendant->get_parent()->data.owner == this && descendant->data.owner != descendant->get_parent()) { + if (!instance_roots.has(descendant->get_owner())) { + if (descendant->get_parent() && descendant->get_parent() != this && descendant->data.owner != descendant->get_parent()) { hidden_roots.push_back(descendant); } continue; } node_tree.push_back(descendant); + + if (descendant->get_filename() != "" && instance_roots.has(descendant->get_owner())) { + instance_roots.push_back(descendant); + } } } } |