Skip to content

Commit dec0b22

Browse files
committed
Merge pull request #64487 from Rindbee/fix-instantiated-scene-duplicate
Fix resource shared when duplicating an instanced scene
2 parents 554c2ab + e0532a7 commit dec0b22

File tree

6 files changed

+122
-81
lines changed

6 files changed

+122
-81
lines changed

editor/docks/scene_tree_dock.cpp

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -907,6 +907,8 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
907907
}
908908
}
909909

910+
HashMap<Node *, HashMap<Ref<Resource>, Ref<Resource>>> &resources_local_to_scenes = clipboard_resource_remap[edited_scene->get_scene_file_path()];
911+
910912
for (Node *node : selection) {
911913
Node *parent = node->get_parent();
912914

@@ -922,7 +924,7 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
922924
}
923925

924926
HashMap<const Node *, Node *> duplimap;
925-
Node *dup = node->duplicate_from_editor(duplimap);
927+
Node *dup = node->duplicate_from_editor(duplimap, edited_scene, resources_local_to_scenes);
926928

927929
ERR_CONTINUE(!dup);
928930

@@ -956,6 +958,14 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
956958

957959
undo_redo->commit_action();
958960

961+
for (KeyValue<Node *, HashMap<Ref<Resource>, Ref<Resource>>> &KV : resources_local_to_scenes) {
962+
for (KeyValue<Ref<Resource>, Ref<Resource>> &R : KV.value) {
963+
if (R.value->is_local_to_scene()) {
964+
R.value->setup_local_to_scene();
965+
}
966+
}
967+
}
968+
959969
if (dupsingle) {
960970
_push_item(dupsingle);
961971
}
@@ -4334,26 +4344,25 @@ List<Node *> SceneTreeDock::paste_nodes(bool p_paste_as_sibling) {
43344344
}
43354345
ur->add_do_method(editor_selection, "clear");
43364346

4337-
HashMap<Ref<Resource>, Ref<Resource>> resource_remap;
43384347
String target_scene;
43394348
if (edited_scene) {
43404349
target_scene = edited_scene->get_scene_file_path();
43414350
}
4351+
HashMap<Node *, HashMap<Ref<Resource>, Ref<Resource>>> &resources_local_to_scenes = clipboard_resource_remap[target_scene]; // Record the mappings in the sub-scene.
43424352
if (target_scene != clipboard_source_scene) {
4343-
if (!clipboard_resource_remap.has(target_scene)) {
4353+
if (!resources_local_to_scenes.has(nullptr)) {
43444354
HashMap<Ref<Resource>, Ref<Resource>> remap;
43454355
for (Node *E : node_clipboard) {
43464356
_create_remap_for_node(E, remap);
43474357
}
4348-
clipboard_resource_remap[target_scene] = remap;
4358+
resources_local_to_scenes[nullptr] = remap;
43494359
}
4350-
resource_remap = clipboard_resource_remap[target_scene];
43514360
}
43524361

43534362
for (Node *node : node_clipboard) {
43544363
HashMap<const Node *, Node *> duplimap;
43554364

4356-
Node *dup = node->duplicate_from_editor(duplimap, resource_remap);
4365+
Node *dup = node->duplicate_from_editor(duplimap, edited_scene, resources_local_to_scenes);
43574366
ERR_CONTINUE(!dup);
43584367

43594368
pasted_nodes.push_back(dup);
@@ -4396,6 +4405,15 @@ List<Node *> SceneTreeDock::paste_nodes(bool p_paste_as_sibling) {
43964405
}
43974406

43984407
ur->commit_action();
4408+
4409+
for (KeyValue<Node *, HashMap<Ref<Resource>, Ref<Resource>>> &KV : resources_local_to_scenes) {
4410+
for (KeyValue<Ref<Resource>, Ref<Resource>> &R : KV.value) {
4411+
if (R.value->is_local_to_scene()) {
4412+
R.value->setup_local_to_scene();
4413+
}
4414+
}
4415+
}
4416+
43994417
return pasted_nodes;
44004418
}
44014419

editor/docks/scene_tree_dock.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ class SceneTreeDock : public EditorDock {
146146
List<Node *> node_clipboard;
147147
HashSet<Node *> node_clipboard_edited_scene_owned;
148148
String clipboard_source_scene;
149-
HashMap<String, HashMap<Ref<Resource>, Ref<Resource>>> clipboard_resource_remap;
149+
HashMap<String, HashMap<Node *, HashMap<Ref<Resource>, Ref<Resource>>>> clipboard_resource_remap;
150150

151151
ScriptCreateDialog *script_create_dialog = nullptr;
152152
ShaderCreateDialog *shader_create_dialog = nullptr;

scene/main/node.cpp

Lines changed: 33 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2953,10 +2953,11 @@ Node *Node::duplicate(int p_flags) const {
29532953

29542954
#ifdef TOOLS_ENABLED
29552955
Node *Node::duplicate_from_editor(HashMap<const Node *, Node *> &r_duplimap) const {
2956-
return duplicate_from_editor(r_duplimap, HashMap<Ref<Resource>, Ref<Resource>>());
2956+
HashMap<Node *, HashMap<Ref<Resource>, Ref<Resource>>> tmp;
2957+
return duplicate_from_editor(r_duplimap, nullptr, tmp);
29572958
}
29582959

2959-
Node *Node::duplicate_from_editor(HashMap<const Node *, Node *> &r_duplimap, const HashMap<Ref<Resource>, Ref<Resource>> &p_resource_remap) const {
2960+
Node *Node::duplicate_from_editor(HashMap<const Node *, Node *> &r_duplimap, Node *p_scene_root, HashMap<Node *, HashMap<Ref<Resource>, Ref<Resource>>> &p_resource_remap) const {
29602961
int flags = DUPLICATE_SIGNALS | DUPLICATE_GROUPS | DUPLICATE_SCRIPTS | DUPLICATE_USE_INSTANTIATION | DUPLICATE_FROM_EDITOR;
29612962
Node *dupe = _duplicate(flags, &r_duplimap);
29622963

@@ -2969,8 +2970,8 @@ Node *Node::duplicate_from_editor(HashMap<const Node *, Node *> &r_duplimap, con
29692970
_duplicate_properties(this, this, dupe, flags);
29702971

29712972
// This is used by SceneTreeDock's paste functionality. When pasting to foreign scene, resources are duplicated.
2972-
if (!p_resource_remap.is_empty()) {
2973-
remap_node_resources(dupe, p_resource_remap);
2973+
if (p_scene_root) {
2974+
remap_node_resources(dupe, p_scene_root, p_resource_remap);
29742975
}
29752976

29762977
// Duplication of signals must happen after all the node descendants have been copied,
@@ -2981,7 +2982,9 @@ Node *Node::duplicate_from_editor(HashMap<const Node *, Node *> &r_duplimap, con
29812982
return dupe;
29822983
}
29832984

2984-
void Node::remap_node_resources(Node *p_node, const HashMap<Ref<Resource>, Ref<Resource>> &p_resource_remap) const {
2985+
void Node::remap_node_resources(Node *p_node, Node *p_scene_root, HashMap<Node *, HashMap<Ref<Resource>, Ref<Resource>>> &p_resource_remap) const {
2986+
Node *local_scene = p_node->is_instance() ? p_node : (p_node->get_owner() ? p_node->get_owner() : p_scene_root);
2987+
29852988
List<PropertyInfo> props;
29862989
p_node->get_property_list(&props);
29872990

@@ -2991,23 +2994,39 @@ void Node::remap_node_resources(Node *p_node, const HashMap<Ref<Resource>, Ref<R
29912994
}
29922995

29932996
Variant v = p_node->get(E.name);
2994-
if (v.is_ref_counted()) {
2995-
Ref<Resource> res = v;
2996-
if (res.is_valid()) {
2997-
if (p_resource_remap.has(res)) {
2998-
p_node->set(E.name, p_resource_remap[res]);
2999-
remap_nested_resources(res, p_resource_remap);
3000-
}
2997+
if (!v.is_ref_counted()) {
2998+
continue;
2999+
}
3000+
Ref<Resource> res = v;
3001+
if (res.is_null()) {
3002+
continue;
3003+
}
3004+
3005+
if (res->is_local_to_scene()) {
3006+
if (local_scene == res->get_local_scene()) {
3007+
continue;
3008+
}
3009+
Ref<Resource> dup = SceneState::get_remap_resource(res, p_resource_remap, nullptr, local_scene);
3010+
p_node->set(E.name, dup);
3011+
continue;
3012+
}
3013+
3014+
if (res->is_built_in()) {
3015+
// Use nullptr instead of a specific node (current scene root node) to represent the scene,
3016+
// as the Make Scene Root operation may be executed.
3017+
if (p_resource_remap[nullptr].has(res)) {
3018+
p_node->set(E.name, p_resource_remap[nullptr][res]);
3019+
remap_nested_resources(res, p_resource_remap[nullptr]);
30013020
}
30023021
}
30033022
}
30043023

30053024
for (int i = 0; i < p_node->get_child_count(); i++) {
3006-
remap_node_resources(p_node->get_child(i), p_resource_remap);
3025+
remap_node_resources(p_node->get_child(i), p_scene_root, p_resource_remap);
30073026
}
30083027
}
30093028

3010-
void Node::remap_nested_resources(Ref<Resource> p_resource, const HashMap<Ref<Resource>, Ref<Resource>> &p_resource_remap) const {
3029+
void Node::remap_nested_resources(Ref<Resource> p_resource, HashMap<Ref<Resource>, Ref<Resource>> &p_resource_remap) const {
30113030
List<PropertyInfo> props;
30123031
p_resource->get_property_list(&props);
30133032

scene/main/node.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -721,9 +721,9 @@ class Node : public Object {
721721
Node *duplicate(int p_flags = DUPLICATE_GROUPS | DUPLICATE_SIGNALS | DUPLICATE_SCRIPTS) const;
722722
#ifdef TOOLS_ENABLED
723723
Node *duplicate_from_editor(HashMap<const Node *, Node *> &r_duplimap) const;
724-
Node *duplicate_from_editor(HashMap<const Node *, Node *> &r_duplimap, const HashMap<Ref<Resource>, Ref<Resource>> &p_resource_remap) const;
725-
void remap_node_resources(Node *p_node, const HashMap<Ref<Resource>, Ref<Resource>> &p_resource_remap) const;
726-
void remap_nested_resources(Ref<Resource> p_resource, const HashMap<Ref<Resource>, Ref<Resource>> &p_resource_remap) const;
724+
Node *duplicate_from_editor(HashMap<const Node *, Node *> &r_duplimap, Node *p_scene_root, HashMap<Node *, HashMap<Ref<Resource>, Ref<Resource>>> &p_resource_remap) const;
725+
void remap_node_resources(Node *p_node, Node *p_scene_root, HashMap<Node *, HashMap<Ref<Resource>, Ref<Resource>>> &p_resource_remap) const;
726+
void remap_nested_resources(Ref<Resource> p_resource, HashMap<Ref<Resource>, Ref<Resource>> &p_resource_remap) const;
727727
#endif
728728

729729
// used by editors, to save what has changed only

scene/resources/packed_scene.cpp

Lines changed: 57 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -78,18 +78,28 @@ static Array _sanitize_node_pinned_properties(Node *p_node) {
7878
return pinned;
7979
}
8080

81-
Ref<Resource> SceneState::get_remap_resource(const Ref<Resource> &p_resource, HashMap<Ref<Resource>, Ref<Resource>> &remap_cache, const Ref<Resource> &p_fallback, Node *p_for_scene) {
81+
Ref<Resource> SceneState::get_remap_resource(const Ref<Resource> &p_resource, HashMap<Node *, HashMap<Ref<Resource>, Ref<Resource>>> &remap_cache, const Ref<Resource> &p_fallback, Node *p_for_scene) {
8282
ERR_FAIL_COND_V(p_resource.is_null(), Ref<Resource>());
8383

84-
Ref<Resource> remap_resource;
85-
8684
// Find the shared copy of the source resource.
87-
HashMap<Ref<Resource>, Ref<Resource>>::Iterator R = remap_cache.find(p_resource);
85+
HashMap<Ref<Resource>, Ref<Resource>>::Iterator R = remap_cache[p_for_scene].find(p_resource);
8886
if (R) {
89-
remap_resource = R->value;
90-
} else if (p_fallback.is_valid() && p_fallback->is_local_to_scene() && p_fallback->get_class() == p_resource->get_class()) {
91-
// Simply copy the data from the source resource to update the fallback resource that was previously set.
87+
return R->value;
88+
}
89+
90+
bool reuse_fallback = p_fallback.is_valid() && p_fallback->is_local_to_scene() && p_fallback->get_class_name() == p_resource->get_class_name();
91+
92+
if (reuse_fallback) {
93+
// The fallback resource can only be mapped at most once when it is valid.
94+
for (const KeyValue<Ref<Resource>, Ref<Resource>> &E : remap_cache[p_for_scene]) {
95+
if (E.value == p_fallback) {
96+
reuse_fallback = false;
97+
break;
98+
}
99+
}
100+
}
92101

102+
if (reuse_fallback) { // Simply copy the data from the source resource to update the fallback resource that was previously set.
93103
p_fallback->reset_state(); // May want to reset state.
94104

95105
List<PropertyInfo> pi;
@@ -113,18 +123,14 @@ Ref<Resource> SceneState::get_remap_resource(const Ref<Resource> &p_resource, Ha
113123

114124
p_fallback->set(E.name, value);
115125
}
116-
117-
p_fallback->set_scene_unique_id(p_resource->get_scene_unique_id()); // Get the id from the main scene, in case the id changes again when saving the scene.
118-
119-
remap_cache[p_resource] = p_fallback;
120-
remap_resource = p_fallback;
121-
} else { // A copy of the source resource is required to overwrite the previous one.
122-
Ref<Resource> local_dupe = p_resource->duplicate_for_local_scene(p_for_scene, remap_cache);
123-
remap_cache[p_resource] = local_dupe;
124-
remap_resource = local_dupe;
126+
remap_cache[p_for_scene][p_resource] = p_fallback;
127+
return p_fallback;
125128
}
126129

127-
return remap_resource;
130+
// A copy of the source resource is required to overwrite the previous one.
131+
Ref<Resource> local_dupe = p_resource->duplicate_for_local_scene(p_for_scene, remap_cache[p_for_scene]);
132+
remap_cache[p_for_scene][p_resource] = local_dupe;
133+
return local_dupe;
128134
}
129135

130136
static Node *_find_node_by_id(Node *p_owner, Node *p_node, int32_t p_id) {
@@ -185,7 +191,7 @@ Node *SceneState::instantiate(GenEditState p_edit_state) const {
185191

186192
bool gen_node_path_cache = p_edit_state != GEN_EDIT_STATE_DISABLED && node_path_cache.is_empty();
187193

188-
HashMap<Ref<Resource>, Ref<Resource>> resources_local_to_scene;
194+
HashMap<Node *, HashMap<Ref<Resource>, Ref<Resource>>> resources_local_to_scenes; // Record the mappings in sub-scenes.
189195

190196
LocalVector<DeferredNodePathProperties> deferred_node_paths;
191197

@@ -359,7 +365,6 @@ Node *SceneState::instantiate(GenEditState p_edit_state) const {
359365
const NodeData::Property *nprops = &n.properties[0];
360366

361367
Dictionary missing_resource_properties;
362-
HashMap<Ref<Resource>, Ref<Resource>> resources_local_to_sub_scene; // Record the mappings in the sub-scene.
363368

364369
for (int j = 0; j < nprop_count; j++) {
365370
bool valid;
@@ -430,7 +435,7 @@ Node *SceneState::instantiate(GenEditState p_edit_state) const {
430435
//handle resources that are local to scene by duplicating them if needed
431436
Ref<Resource> res = value;
432437
if (res.is_valid()) {
433-
value = make_local_resource(value, n, resources_local_to_sub_scene, node, snames[nprops[j].name], resources_local_to_scene, i, ret_nodes, p_edit_state);
438+
value = make_local_resource(value, n, resources_local_to_scenes, node, snames[nprops[j].name], i, ret_nodes, p_edit_state);
434439
}
435440
} else {
436441
// Making sure that instances of inherited scenes don't share the same
@@ -454,7 +459,7 @@ Node *SceneState::instantiate(GenEditState p_edit_state) const {
454459
}
455460
}
456461

457-
value = setup_resources_in_array(set_array, n, resources_local_to_sub_scene, node, snames[nprops[j].name], resources_local_to_scene, i, ret_nodes, p_edit_state);
462+
value = setup_resources_in_array(set_array, n, resources_local_to_scenes, node, snames[nprops[j].name], i, ret_nodes, p_edit_state);
458463
}
459464

460465
if (value.get_type() == Variant::DICTIONARY) {
@@ -471,7 +476,7 @@ Node *SceneState::instantiate(GenEditState p_edit_state) const {
471476
}
472477
}
473478

474-
value = setup_resources_in_dictionary(set_dict, n, resources_local_to_sub_scene, node, snames[nprops[j].name], resources_local_to_scene, i, ret_nodes, p_edit_state);
479+
value = setup_resources_in_dictionary(set_dict, n, resources_local_to_scenes, node, snames[nprops[j].name], i, ret_nodes, p_edit_state);
475480
}
476481

477482
bool set_valid = true;
@@ -494,12 +499,6 @@ Node *SceneState::instantiate(GenEditState p_edit_state) const {
494499
if (!missing_resource_properties.is_empty()) {
495500
node->set_meta(META_MISSING_RESOURCES, missing_resource_properties);
496501
}
497-
498-
for (KeyValue<Ref<Resource>, Ref<Resource>> &E : resources_local_to_sub_scene) {
499-
if (E.value->get_local_scene() == node) {
500-
E.value->setup_local_to_scene(); // Setup may be required for the resource to work properly.
501-
}
502-
}
503502
}
504503

505504
//name
@@ -639,9 +638,9 @@ Node *SceneState::instantiate(GenEditState p_edit_state) const {
639638
}
640639
}
641640

642-
for (KeyValue<Ref<Resource>, Ref<Resource>> &E : resources_local_to_scene) {
643-
if (E.value->get_local_scene() == ret_nodes[0]) {
644-
E.value->setup_local_to_scene();
641+
for (KeyValue<Node *, HashMap<Ref<Resource>, Ref<Resource>>> &E : resources_local_to_scenes) {
642+
for (KeyValue<Ref<Resource>, Ref<Resource>> &R : E.value) {
643+
R.value->setup_local_to_scene(); // Setup may be required for the resource to work properly.
645644
}
646645
}
647646

@@ -702,50 +701,55 @@ Node *SceneState::instantiate(GenEditState p_edit_state) const {
702701
return ret_nodes[0];
703702
}
704703

705-
Variant SceneState::make_local_resource(Variant &p_value, const SceneState::NodeData &p_node_data, HashMap<Ref<Resource>, Ref<Resource>> &p_resources_local_to_sub_scene, Node *p_node, const StringName p_sname, HashMap<Ref<Resource>, Ref<Resource>> &p_resources_local_to_scene, int p_i, Node **p_ret_nodes, SceneState::GenEditState p_edit_state) const {
704+
Variant SceneState::make_local_resource(Variant &p_value, const SceneState::NodeData &p_node_data, HashMap<Node *, HashMap<Ref<Resource>, Ref<Resource>>> &p_resources_local_to_scenes, Node *p_node, const StringName p_sname, int p_i, Node **p_ret_nodes, SceneState::GenEditState p_edit_state) const {
706705
Ref<Resource> res = p_value;
707706
if (res.is_null() || !res->is_local_to_scene()) {
708707
return p_value;
709708
}
710709

711-
if (p_node_data.instance >= 0) { // For the root node of a sub-scene, treat it as part of the sub-scene.
712-
return get_remap_resource(res, p_resources_local_to_sub_scene, p_node->get(p_sname), p_node);
713-
} else {
714-
HashMap<Ref<Resource>, Ref<Resource>>::Iterator E = p_resources_local_to_scene.find(res);
715-
Node *base = p_i == 0 ? p_node : p_ret_nodes[0];
716-
if (E) {
717-
return E->value;
718-
} else if (p_edit_state == GEN_EDIT_STATE_MAIN) { // For the main scene, use the resource as is
719-
res->configure_for_local_scene(base, p_resources_local_to_scene);
720-
p_resources_local_to_scene[res] = res;
721-
return res;
722-
} else { // For instances, a copy must be made.
723-
Ref<Resource> local_dupe = res->duplicate_for_local_scene(base, p_resources_local_to_scene);
724-
p_resources_local_to_scene[res] = local_dupe;
725-
return local_dupe;
726-
}
710+
Node *base = (p_i == 0 || p_node->is_instance()) ? p_node : (p_node->get_owner() ? p_node->get_owner() : p_ret_nodes[0]);
711+
712+
if (p_node_data.type == TYPE_INSTANTIATED) { // For the (root) nodes of sub-scenes, treat them as parts of the sub-scenes.
713+
return get_remap_resource(res, p_resources_local_to_scenes, p_node->get(p_sname), base);
714+
}
715+
716+
// Find the shared copy of the source resource.
717+
HashMap<Ref<Resource>, Ref<Resource>>::Iterator R = p_resources_local_to_scenes[base].find(res);
718+
if (R) {
719+
return R->value;
727720
}
721+
722+
if (p_edit_state == GEN_EDIT_STATE_MAIN) { // For the main scene, use the resource as is
723+
res->configure_for_local_scene(base, p_resources_local_to_scenes[base]);
724+
p_resources_local_to_scenes[base][res] = res;
725+
return res;
726+
}
727+
728+
// For instances, a copy must be made.
729+
Ref<Resource> local_dupe = res->duplicate_for_local_scene(base, p_resources_local_to_scenes[base]);
730+
p_resources_local_to_scenes[base][res] = local_dupe;
731+
return local_dupe;
728732
}
729733

730-
Array SceneState::setup_resources_in_array(Array &p_array_to_scan, const SceneState::NodeData &p_n, HashMap<Ref<Resource>, Ref<Resource>> &p_resources_local_to_sub_scene, Node *p_node, const StringName p_sname, HashMap<Ref<Resource>, Ref<Resource>> &p_resources_local_to_scene, int p_i, Node **p_ret_nodes, SceneState::GenEditState p_edit_state) const {
734+
Array SceneState::setup_resources_in_array(Array &p_array_to_scan, const SceneState::NodeData &p_n, HashMap<Node *, HashMap<Ref<Resource>, Ref<Resource>>> &p_resources_local_to_scenes, Node *p_node, const StringName p_sname, int p_i, Node **p_ret_nodes, SceneState::GenEditState p_edit_state) const {
731735
for (int i = 0; i < p_array_to_scan.size(); i++) {
732736
if (p_array_to_scan[i].get_type() == Variant::OBJECT) {
733-
p_array_to_scan[i] = make_local_resource(p_array_to_scan[i], p_n, p_resources_local_to_sub_scene, p_node, p_sname, p_resources_local_to_scene, p_i, p_ret_nodes, p_edit_state);
737+
p_array_to_scan[i] = make_local_resource(p_array_to_scan[i], p_n, p_resources_local_to_scenes, p_node, p_sname, p_i, p_ret_nodes, p_edit_state);
734738
}
735739
}
736740
return p_array_to_scan;
737741
}
738742

739-
Dictionary SceneState::setup_resources_in_dictionary(Dictionary &p_dictionary_to_scan, const SceneState::NodeData &p_n, HashMap<Ref<Resource>, Ref<Resource>> &p_resources_local_to_sub_scene, Node *p_node, const StringName p_sname, HashMap<Ref<Resource>, Ref<Resource>> &p_resources_local_to_scene, int p_i, Node **p_ret_nodes, SceneState::GenEditState p_edit_state) const {
743+
Dictionary SceneState::setup_resources_in_dictionary(Dictionary &p_dictionary_to_scan, const SceneState::NodeData &p_n, HashMap<Node *, HashMap<Ref<Resource>, Ref<Resource>>> &p_resources_local_to_scenes, Node *p_node, const StringName p_sname, int p_i, Node **p_ret_nodes, SceneState::GenEditState p_edit_state) const {
740744
const Array keys = p_dictionary_to_scan.keys();
741745
const Array values = p_dictionary_to_scan.values();
742746

743747
if (has_local_resource(values) || has_local_resource(keys)) {
744748
Array duplicated_keys = keys.duplicate(true);
745749
Array duplicated_values = values.duplicate(true);
746750

747-
duplicated_keys = setup_resources_in_array(duplicated_keys, p_n, p_resources_local_to_sub_scene, p_node, p_sname, p_resources_local_to_scene, p_i, p_ret_nodes, p_edit_state);
748-
duplicated_values = setup_resources_in_array(duplicated_values, p_n, p_resources_local_to_sub_scene, p_node, p_sname, p_resources_local_to_scene, p_i, p_ret_nodes, p_edit_state);
751+
duplicated_keys = setup_resources_in_array(duplicated_keys, p_n, p_resources_local_to_scenes, p_node, p_sname, p_i, p_ret_nodes, p_edit_state);
752+
duplicated_values = setup_resources_in_array(duplicated_values, p_n, p_resources_local_to_scenes, p_node, p_sname, p_i, p_ret_nodes, p_edit_state);
749753
p_dictionary_to_scan.clear();
750754

751755
for (int i = 0; i < keys.size(); i++) {

0 commit comments

Comments
 (0)