|
@@ -1005,6 +1005,37 @@ void SceneState::clear() {
|
|
|
base_scene_idx = -1;
|
|
|
}
|
|
|
|
|
|
+Error SceneState::copy_from(const Ref<SceneState> &p_scene_state) {
|
|
|
+ ERR_FAIL_COND_V(p_scene_state.is_null(), ERR_INVALID_PARAMETER);
|
|
|
+
|
|
|
+ clear();
|
|
|
+
|
|
|
+ for (const StringName &E : p_scene_state->names) {
|
|
|
+ names.append(E);
|
|
|
+ }
|
|
|
+ for (const Variant &E : p_scene_state->variants) {
|
|
|
+ variants.append(E);
|
|
|
+ }
|
|
|
+ for (const SceneState::NodeData &E : p_scene_state->nodes) {
|
|
|
+ nodes.append(E);
|
|
|
+ }
|
|
|
+ for (const SceneState::ConnectionData &E : p_scene_state->connections) {
|
|
|
+ connections.append(E);
|
|
|
+ }
|
|
|
+ for (KeyValue<NodePath, int> &E : p_scene_state->node_path_cache) {
|
|
|
+ node_path_cache.insert(E.key, E.value);
|
|
|
+ }
|
|
|
+ for (const NodePath &E : p_scene_state->node_paths) {
|
|
|
+ node_paths.append(E);
|
|
|
+ }
|
|
|
+ for (const NodePath &E : p_scene_state->editable_instances) {
|
|
|
+ editable_instances.append(E);
|
|
|
+ }
|
|
|
+ base_scene_idx = p_scene_state->base_scene_idx;
|
|
|
+
|
|
|
+ return OK;
|
|
|
+}
|
|
|
+
|
|
|
Ref<SceneState> SceneState::get_base_scene_state() const {
|
|
|
if (base_scene_idx >= 0) {
|
|
|
Ref<PackedScene> ps = variants[base_scene_idx];
|
|
@@ -1737,6 +1768,28 @@ void PackedScene::clear() {
|
|
|
state->clear();
|
|
|
}
|
|
|
|
|
|
+void PackedScene::reload_from_file() {
|
|
|
+ String path = get_path();
|
|
|
+ if (!path.is_resource_file()) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ Ref<PackedScene> s = ResourceLoader::load(ResourceLoader::path_remap(path), get_class(), ResourceFormatLoader::CACHE_MODE_IGNORE);
|
|
|
+ if (!s.is_valid()) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Backup the loaded_state
|
|
|
+ Ref<SceneState> loaded_state = s->get_state();
|
|
|
+ // This assigns a new state to s->state
|
|
|
+ // We do this because of the next step
|
|
|
+ s->recreate_state();
|
|
|
+ // This has a side-effect to clear s->state
|
|
|
+ copy_from(s);
|
|
|
+ // Then, we copy the backed-up loaded_state to state
|
|
|
+ state->copy_from(loaded_state);
|
|
|
+}
|
|
|
+
|
|
|
bool PackedScene::can_instantiate() const {
|
|
|
return state->can_instantiate();
|
|
|
}
|