summaryrefslogtreecommitdiff
path: root/scene/resources/packed_scene.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'scene/resources/packed_scene.cpp')
-rw-r--r--scene/resources/packed_scene.cpp32
1 files changed, 29 insertions, 3 deletions
diff --git a/scene/resources/packed_scene.cpp b/scene/resources/packed_scene.cpp
index 43196a43d4..a9010e79a2 100644
--- a/scene/resources/packed_scene.cpp
+++ b/scene/resources/packed_scene.cpp
@@ -226,7 +226,7 @@ Node *SceneState::instance(bool p_gen_edit_state) const {
node->add_to_group( snames[ n.groups[j] ], true );
}
- if (n.instance>=0 || n.type!=TYPE_INSTANCED) {
+ if (n.instance>=0 || n.type!=TYPE_INSTANCED || i==0) {
//if node was not part of instance, must set it's name, parenthood and ownership
if (i>0) {
if (parent) {
@@ -239,7 +239,6 @@ Node *SceneState::instance(bool p_gen_edit_state) const {
} else {
node->_set_name_nocheck( snames[ n.name ] );
}
-
}
if (n.owner>=0) {
@@ -1317,11 +1316,23 @@ StringName SceneState::get_node_name(int p_idx) const {
return names[nodes[p_idx].name];
}
+
+bool SceneState::is_node_instance_placeholder(int p_idx) const {
+
+ ERR_FAIL_INDEX_V(p_idx,nodes.size(),false);
+
+ return nodes[p_idx].instance>=0 && nodes[p_idx].instance&FLAG_INSTANCE_IS_PLACEHOLDER;
+
+}
+
Ref<PackedScene> SceneState::get_node_instance(int p_idx) const {
ERR_FAIL_INDEX_V(p_idx,nodes.size(),Ref<PackedScene>());
if (nodes[p_idx].instance>=0) {
- return variants[nodes[p_idx].instance];
+ if (nodes[p_idx].instance&FLAG_INSTANCE_IS_PLACEHOLDER)
+ return Ref<PackedScene>();
+ else
+ return variants[nodes[p_idx].instance&FLAG_MASK];
} else if (nodes[p_idx].parent<0 || nodes[p_idx].parent==NO_PARENT_SAVED) {
if (base_scene_idx>=0) {
@@ -1335,6 +1346,19 @@ Ref<PackedScene> SceneState::get_node_instance(int p_idx) const {
}
+
+String SceneState::get_node_instance_placeholder(int p_idx) const {
+
+ ERR_FAIL_INDEX_V(p_idx,nodes.size(),String());
+
+ if (nodes[p_idx].instance>=0 && nodes[p_idx].instance&FLAG_INSTANCE_IS_PLACEHOLDER) {
+ return variants[nodes[p_idx].instance&FLAG_MASK];
+ }
+
+ return String();
+
+}
+
Vector<StringName> SceneState::get_node_groups(int p_idx) const{
ERR_FAIL_INDEX_V(p_idx,nodes.size(),Vector<StringName>());
Vector<StringName> groups;
@@ -1578,6 +1602,8 @@ void SceneState::_bind_methods() {
ObjectTypeDB::bind_method(_MD("get_node_name","idx"),&SceneState::get_node_name);
ObjectTypeDB::bind_method(_MD("get_node_path","idx","for_parent"),&SceneState::get_node_path,DEFVAL(false));
ObjectTypeDB::bind_method(_MD("get_node_owner_path","idx"),&SceneState::get_node_owner_path);
+ ObjectTypeDB::bind_method(_MD("is_node_instance_placeholder","idx"),&SceneState::is_node_instance_placeholder);
+ ObjectTypeDB::bind_method(_MD("get_node_instance_placeholder","idx"),&SceneState::get_node_instance_placeholder);
ObjectTypeDB::bind_method(_MD("get_node_instance:PackedScene","idx"),&SceneState::get_node_instance);
ObjectTypeDB::bind_method(_MD("get_node_groups","idx"),&SceneState::_get_node_groups);
ObjectTypeDB::bind_method(_MD("get_node_property_count","idx"),&SceneState::get_node_property_count);