aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--scene/resources/packed_scene.cpp26
-rw-r--r--scene/resources/packed_scene.h2
-rw-r--r--tools/editor/editor_node.cpp6
3 files changed, 27 insertions, 7 deletions
diff --git a/scene/resources/packed_scene.cpp b/scene/resources/packed_scene.cpp
index 83b61af8f..f320570c2 100644
--- a/scene/resources/packed_scene.cpp
+++ b/scene/resources/packed_scene.cpp
@@ -1001,12 +1001,12 @@ int SceneState::find_node_by_path(const NodePath& p_node) const {
if (_get_base_scene_state().is_valid()) {
int idx = _get_base_scene_state()->find_node_by_path(p_node);
if (idx>=0) {
- if (!base_scene_node_remap.has(idx)) {
- int ridx = nodes.size() + base_scene_node_remap.size();
- base_scene_node_remap[ridx]=idx;
+ int rkey=_find_base_scene_node_remap_key(idx);
+ if (rkey==-1) {
+ rkey=nodes.size() + base_scene_node_remap.size();
+ base_scene_node_remap[rkey]=idx;
}
-
- return base_scene_node_remap[idx];
+ return rkey;
}
}
return -1;
@@ -1019,12 +1019,24 @@ int SceneState::find_node_by_path(const NodePath& p_node) const {
//the node in the instanced scene, as a property may be missing
//from the local one
int idx = _get_base_scene_state()->find_node_by_path(p_node);
- base_scene_node_remap[nid]=idx;
-
+ if (idx!=-1) {
+ base_scene_node_remap[nid]=idx;
+ }
}
return nid;
}
+
+int SceneState::_find_base_scene_node_remap_key(int p_idx) const {
+
+ for (Map<int, int>::Element* E=base_scene_node_remap.front();E;E=E->next()) {
+ if (E->value()==p_idx) {
+ return E->key();
+ }
+ }
+ return -1;
+}
+
Variant SceneState::get_property_value(int p_node, const StringName& p_property, bool &found) const {
found=false;
diff --git a/scene/resources/packed_scene.h b/scene/resources/packed_scene.h
index 186324edb..aedc4d70d 100644
--- a/scene/resources/packed_scene.h
+++ b/scene/resources/packed_scene.h
@@ -104,6 +104,8 @@ class SceneState : public Reference {
DVector<String> _get_node_groups(int p_idx) const;
+ int _find_base_scene_node_remap_key(int p_idx) const;
+
protected:
static void _bind_methods();
diff --git a/tools/editor/editor_node.cpp b/tools/editor/editor_node.cpp
index 79455688b..87b6383ac 100644
--- a/tools/editor/editor_node.cpp
+++ b/tools/editor/editor_node.cpp
@@ -1013,6 +1013,11 @@ void EditorNode::_save_scene(String p_file, int idx) {
return;
}
+ // force creation of node path cache
+ // (hacky but needed for the tree to update properly)
+ Node* dummy_scene=sdata->instance(true);
+ memdelete(dummy_scene);
+
sdata->set_import_metadata(editor_data.get_edited_scene_import_metadata(idx));
int flg=0;
if (EditorSettings::get_singleton()->get("on_save/compress_binary_resources"))
@@ -1023,6 +1028,7 @@ void EditorNode::_save_scene(String p_file, int idx) {
err = ResourceSaver::save(p_file,sdata,flg);
+
Map<RES,bool> processed;
_save_edited_subresources(scene,processed,flg);
editor_data.save_editor_external_data();