space_editor_core/
load.rs

1use bevy::{prelude::*, utils::HashMap};
2use space_shared::*;
3
4use crate::EditorLoader;
5
6pub fn load_listener(world: &mut World) {
7    let app_registry = world.resource::<AppTypeRegistry>().clone();
8    let load_server = world.resource::<EditorLoader>().clone();
9    let mut prefab;
10    {
11        let assets = world.resource::<Assets<DynamicScene>>();
12        if let Some(scene) = &load_server.scene {
13            if let Some(scene) = assets.get(scene) {
14                let mut scene = Scene::from_dynamic_scene(scene, &app_registry).unwrap();
15                scene.world.insert_resource(app_registry);
16                prefab = DynamicScene::from_scene(&scene); //kill me, is it clone() analog for DynamicScene
17            } else {
18                return;
19            }
20        } else {
21            return;
22        }
23    }
24    world.resource_mut::<EditorLoader>().scene = None;
25
26    let mut query = world.query_filtered::<Entity, With<PrefabMarker>>();
27    let mark_to_delete: Vec<_> = query.iter(world).collect();
28    for entity in mark_to_delete {
29        if let Some(e) = world.get_entity_mut(entity) {
30            e.despawn_recursive();
31        }
32    }
33
34    for entity in &mut prefab.entities {
35        entity.components.push(Box::new(PrefabMarker));
36    }
37
38    let mut map = HashMap::new();
39    let res = prefab.write_to_world(world, &mut map);
40    match res {
41        Ok(_) => { /*some info planned*/ }
42        Err(err) => {
43            bevy::log::error!("{}", err)
44        }
45    }
46}