You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-12-31 18:41:20 +00:00
Merge pull request #64487 from Rindbee/fix-instantiated-scene-duplicate
Fix resource shared when duplicating an instanced scene
This commit is contained in:
@@ -907,6 +907,8 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
|
||||
}
|
||||
}
|
||||
|
||||
HashMap<Node *, HashMap<Ref<Resource>, Ref<Resource>>> &resources_local_to_scenes = clipboard_resource_remap[edited_scene->get_scene_file_path()];
|
||||
|
||||
for (Node *node : selection) {
|
||||
Node *parent = node->get_parent();
|
||||
|
||||
@@ -922,7 +924,7 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
|
||||
}
|
||||
|
||||
HashMap<const Node *, Node *> duplimap;
|
||||
Node *dup = node->duplicate_from_editor(duplimap);
|
||||
Node *dup = node->duplicate_from_editor(duplimap, edited_scene, resources_local_to_scenes);
|
||||
|
||||
ERR_CONTINUE(!dup);
|
||||
|
||||
@@ -956,6 +958,14 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
|
||||
|
||||
undo_redo->commit_action();
|
||||
|
||||
for (KeyValue<Node *, HashMap<Ref<Resource>, Ref<Resource>>> &KV : resources_local_to_scenes) {
|
||||
for (KeyValue<Ref<Resource>, Ref<Resource>> &R : KV.value) {
|
||||
if (R.value->is_local_to_scene()) {
|
||||
R.value->setup_local_to_scene();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (dupsingle) {
|
||||
_push_item(dupsingle);
|
||||
}
|
||||
@@ -4334,26 +4344,25 @@ List<Node *> SceneTreeDock::paste_nodes(bool p_paste_as_sibling) {
|
||||
}
|
||||
ur->add_do_method(editor_selection, "clear");
|
||||
|
||||
HashMap<Ref<Resource>, Ref<Resource>> resource_remap;
|
||||
String target_scene;
|
||||
if (edited_scene) {
|
||||
target_scene = edited_scene->get_scene_file_path();
|
||||
}
|
||||
HashMap<Node *, HashMap<Ref<Resource>, Ref<Resource>>> &resources_local_to_scenes = clipboard_resource_remap[target_scene]; // Record the mappings in the sub-scene.
|
||||
if (target_scene != clipboard_source_scene) {
|
||||
if (!clipboard_resource_remap.has(target_scene)) {
|
||||
if (!resources_local_to_scenes.has(nullptr)) {
|
||||
HashMap<Ref<Resource>, Ref<Resource>> remap;
|
||||
for (Node *E : node_clipboard) {
|
||||
_create_remap_for_node(E, remap);
|
||||
}
|
||||
clipboard_resource_remap[target_scene] = remap;
|
||||
resources_local_to_scenes[nullptr] = remap;
|
||||
}
|
||||
resource_remap = clipboard_resource_remap[target_scene];
|
||||
}
|
||||
|
||||
for (Node *node : node_clipboard) {
|
||||
HashMap<const Node *, Node *> duplimap;
|
||||
|
||||
Node *dup = node->duplicate_from_editor(duplimap, resource_remap);
|
||||
Node *dup = node->duplicate_from_editor(duplimap, edited_scene, resources_local_to_scenes);
|
||||
ERR_CONTINUE(!dup);
|
||||
|
||||
pasted_nodes.push_back(dup);
|
||||
@@ -4396,6 +4405,15 @@ List<Node *> SceneTreeDock::paste_nodes(bool p_paste_as_sibling) {
|
||||
}
|
||||
|
||||
ur->commit_action();
|
||||
|
||||
for (KeyValue<Node *, HashMap<Ref<Resource>, Ref<Resource>>> &KV : resources_local_to_scenes) {
|
||||
for (KeyValue<Ref<Resource>, Ref<Resource>> &R : KV.value) {
|
||||
if (R.value->is_local_to_scene()) {
|
||||
R.value->setup_local_to_scene();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return pasted_nodes;
|
||||
}
|
||||
|
||||
|
||||
@@ -146,7 +146,7 @@ class SceneTreeDock : public EditorDock {
|
||||
List<Node *> node_clipboard;
|
||||
HashSet<Node *> node_clipboard_edited_scene_owned;
|
||||
String clipboard_source_scene;
|
||||
HashMap<String, HashMap<Ref<Resource>, Ref<Resource>>> clipboard_resource_remap;
|
||||
HashMap<String, HashMap<Node *, HashMap<Ref<Resource>, Ref<Resource>>>> clipboard_resource_remap;
|
||||
|
||||
ScriptCreateDialog *script_create_dialog = nullptr;
|
||||
ShaderCreateDialog *shader_create_dialog = nullptr;
|
||||
|
||||
Reference in New Issue
Block a user