1
0
mirror of https://github.com/godotengine/godot.git synced 2025-12-31 18:41:20 +00:00

Fix resource shared when duplicating an instanced scene

For resources with `resource_local_to_scene` enabled in the sub-scene,
the resource is already set when the sub-scene is instantiated, so does
not need to be set again. Just needs to update the property of the
resource according to the value in the main scene.
This commit is contained in:
Rindbee
2022-08-29 07:50:36 +08:00
committed by 风青山
parent 1b4f116db1
commit e0532a711a
5 changed files with 72 additions and 29 deletions

View File

@@ -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;
}

View File

@@ -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;