소스 검색

Merge pull request #46510 from hilfazer/nested_scene_duplication_4_0

Support for duplication of nested instanced scenes
Rémi Verschelde 4 년 전
부모
커밋
27dea9366f
2개의 변경된 파일9개의 추가작업 그리고 12개의 파일을 삭제
  1. 0 10
      editor/scene_tree_dock.cpp
  2. 9 2
      scene/main/node.cpp

+ 0 - 10
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) {

+ 9 - 2
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);
+				}
 			}
 		}
 	}