|
|
|
@ -10,24 +10,27 @@ impl Plugin for SavePlugin {
|
|
|
|
.register_type::<SaveModel>()
|
|
|
|
.register_type::<SaveModel>()
|
|
|
|
.init_asset::<SaveEntity>()
|
|
|
|
.init_asset::<SaveEntity>()
|
|
|
|
.init_asset_loader::<SaveEntityLoader>()
|
|
|
|
.init_asset_loader::<SaveEntityLoader>()
|
|
|
|
|
|
|
|
.init_asset::<SaveScene>()
|
|
|
|
.init_asset_loader::<SaveSceneLoader>()
|
|
|
|
.init_asset_loader::<SaveSceneLoader>()
|
|
|
|
.add_systems(Startup, test_load_entity)
|
|
|
|
.add_systems(Startup, load_scenes)
|
|
|
|
.add_systems(
|
|
|
|
.add_systems(Update, spawn_scenes.run_if(on_event::<AssetEvent<SaveEntity>>()))
|
|
|
|
Update,
|
|
|
|
.add_systems(Update, spawn_entities.run_if(any_component_added::<Handle<SaveEntity>>));
|
|
|
|
spawn_loaded_entities.run_if(on_event::<AssetEvent<SaveEntity>>()),
|
|
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#[derive(Asset, TypePath, Default)]
|
|
|
|
#[derive(Asset, TypePath, Default)]
|
|
|
|
pub(crate) struct SaveEntity {
|
|
|
|
pub(crate) struct SaveScene {
|
|
|
|
components: Vec<Box<dyn Reflect>>,
|
|
|
|
entities: Vec<Handle<SaveEntity>>,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// TODO: SCALABILITY: SaveEntity should maybe be a HashSet or Vec of Box<into Bundle>
|
|
|
|
// TODO: SCALABILITY: SaveEntity should maybe be a HashSet or Vec of Box<into Bundle>
|
|
|
|
// Then we tell the parse "For each line, run through each of these concrete parsers"
|
|
|
|
// Then we tell the parse "For each line, run through each of these concrete parsers"
|
|
|
|
// If it matches, add it to the set of Box<Bundle>
|
|
|
|
// If it matches, add it to the set of Box<Bundle>
|
|
|
|
// Ironically we basically want DynamicEntity: https://docs.rs/bevy/latest/bevy/scene/struct.DynamicEntity.html
|
|
|
|
// Ironically we basically want DynamicEntity: https://docs.rs/bevy/latest/bevy/scene/struct.DynamicEntity.html
|
|
|
|
|
|
|
|
#[derive(Asset, TypePath, Default)]
|
|
|
|
|
|
|
|
pub(crate) struct SaveEntity {
|
|
|
|
|
|
|
|
components: Vec<Box<dyn Reflect>>,
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
impl SaveEntity {
|
|
|
|
impl SaveEntity {
|
|
|
|
fn parse(
|
|
|
|
fn parse(
|
|
|
|
@ -38,13 +41,13 @@ impl SaveEntity {
|
|
|
|
let mut entity = SaveEntity { ..default() };
|
|
|
|
let mut entity = SaveEntity { ..default() };
|
|
|
|
let fns = [
|
|
|
|
let fns = [
|
|
|
|
parse_save_name,
|
|
|
|
parse_save_name,
|
|
|
|
parse_save_transform,
|
|
|
|
// parse_save_transform,
|
|
|
|
parse_save_model,
|
|
|
|
// parse_save_model,
|
|
|
|
parse_save_camera,
|
|
|
|
// parse_save_camera,
|
|
|
|
parse_save_parent,
|
|
|
|
// parse_save_parent,
|
|
|
|
parse_save_window,
|
|
|
|
// parse_save_window,
|
|
|
|
parse_save_target_camera,
|
|
|
|
// parse_save_target_camera,
|
|
|
|
parse_save_ui_text,
|
|
|
|
// parse_save_ui_text,
|
|
|
|
// parse_save_tag::<EditorTag>("editor_tag"),
|
|
|
|
// parse_save_tag::<EditorTag>("editor_tag"),
|
|
|
|
];
|
|
|
|
];
|
|
|
|
lines
|
|
|
|
lines
|
|
|
|
@ -55,7 +58,7 @@ impl SaveEntity {
|
|
|
|
let mut good = false;
|
|
|
|
let mut good = false;
|
|
|
|
|
|
|
|
|
|
|
|
// Tokenize the line
|
|
|
|
// Tokenize the line
|
|
|
|
let tokens = parser::tokenize(line);
|
|
|
|
let tokens = tokenize(line);
|
|
|
|
|
|
|
|
|
|
|
|
// Run line against all parsers
|
|
|
|
// Run line against all parsers
|
|
|
|
for f in fns {
|
|
|
|
for f in fns {
|
|
|
|
@ -123,7 +126,7 @@ impl AssetLoader for SaveEntityLoader {
|
|
|
|
struct SaveSceneLoader;
|
|
|
|
struct SaveSceneLoader;
|
|
|
|
|
|
|
|
|
|
|
|
impl AssetLoader for SaveSceneLoader {
|
|
|
|
impl AssetLoader for SaveSceneLoader {
|
|
|
|
type Asset = DynamicScene;
|
|
|
|
type Asset = SaveScene;
|
|
|
|
type Settings = ();
|
|
|
|
type Settings = ();
|
|
|
|
type Error = SaveEntityLoaderError;
|
|
|
|
type Error = SaveEntityLoaderError;
|
|
|
|
|
|
|
|
|
|
|
|
@ -140,13 +143,14 @@ impl AssetLoader for SaveSceneLoader {
|
|
|
|
|
|
|
|
|
|
|
|
let asset_path = load_context.path().to_path_buf();
|
|
|
|
let asset_path = load_context.path().to_path_buf();
|
|
|
|
let parent_dir = asset_path.parent().unwrap();
|
|
|
|
let parent_dir = asset_path.parent().unwrap();
|
|
|
|
let _sub_assets: Vec<Handle<SaveEntity>> = s
|
|
|
|
let entities: Vec<Handle<SaveEntity>> = s
|
|
|
|
.lines()
|
|
|
|
.lines()
|
|
|
|
.map(|line| parent_dir.join(line))
|
|
|
|
.map(|line| parent_dir.join(line))
|
|
|
|
.map(|path| load_context.load(path))
|
|
|
|
.map(|path| load_context.load(path))
|
|
|
|
.collect();
|
|
|
|
.collect();
|
|
|
|
|
|
|
|
info!("Entities: {:?}", entities);
|
|
|
|
|
|
|
|
|
|
|
|
Ok(DynamicScene::default())
|
|
|
|
Ok(SaveScene { entities })
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
fn extensions(&self) -> &[&str] {
|
|
|
|
fn extensions(&self) -> &[&str] {
|
|
|
|
@ -154,16 +158,18 @@ impl AssetLoader for SaveSceneLoader {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
fn test_load_entity(loader: Res<AssetServer>, mut commands: Commands) {
|
|
|
|
/// Testing system for loading a specific scene
|
|
|
|
let _: Handle<DynamicScene> = loader.load("editor/_.scene");
|
|
|
|
fn load_scenes(loader: Res<AssetServer>, mut commands: Commands) {
|
|
|
|
let handle: Handle<SaveEntity> = loader.load("levels/00/entities/van.entity");
|
|
|
|
let handle: Handle<SaveScene> = loader.load("scenes/00.scene");
|
|
|
|
commands.spawn((SpatialBundle { ..default() }, handle));
|
|
|
|
info!("Loading scene {:?}", handle);
|
|
|
|
|
|
|
|
commands.spawn(handle);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
fn spawn_loaded_entities(
|
|
|
|
/// Spawns scenes with the Handle<Scene> marker
|
|
|
|
query: Query<(Entity, &Handle<SaveEntity>)>,
|
|
|
|
fn spawn_scenes(
|
|
|
|
mut events: EventReader<AssetEvent<SaveEntity>>,
|
|
|
|
query: Query<(Entity, &Handle<SaveScene>)>,
|
|
|
|
save_entities: Res<Assets<SaveEntity>>,
|
|
|
|
mut events: EventReader<AssetEvent<SaveScene>>,
|
|
|
|
|
|
|
|
save_scenes: Res<Assets<SaveScene>>,
|
|
|
|
mut commands: Commands,
|
|
|
|
mut commands: Commands,
|
|
|
|
) {
|
|
|
|
) {
|
|
|
|
events.read().for_each(|event| {
|
|
|
|
events.read().for_each(|event| {
|
|
|
|
@ -171,18 +177,44 @@ fn spawn_loaded_entities(
|
|
|
|
query
|
|
|
|
query
|
|
|
|
.iter()
|
|
|
|
.iter()
|
|
|
|
.filter(|(_, handle)| handle.id() == *id)
|
|
|
|
.filter(|(_, handle)| handle.id() == *id)
|
|
|
|
.for_each(|(entity, _handle)| {
|
|
|
|
.for_each(|(entity, handle)| {
|
|
|
|
let saved = save_entities.get(*id).unwrap();
|
|
|
|
debug!("Spawning scene {:?} on {:?}", handle, entity);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let scene = save_scenes.get(handle).unwrap();
|
|
|
|
|
|
|
|
|
|
|
|
// Get entity with SaveEntity handle
|
|
|
|
// Get entity with SaveEntity handle
|
|
|
|
let mut e = commands.entity(entity);
|
|
|
|
let mut e = commands.entity(entity);
|
|
|
|
// Clear the entity
|
|
|
|
// Clear the entity of descendants
|
|
|
|
e.despawn_descendants();
|
|
|
|
e.despawn_descendants();
|
|
|
|
// Populate with reflected components
|
|
|
|
// Populate with entities
|
|
|
|
saved.components.iter().for_each(|dc| {
|
|
|
|
e.with_children(|parent| {
|
|
|
|
e.insert_reflect(dc.clone_value());
|
|
|
|
scene.entities.iter().for_each(|this| {
|
|
|
|
|
|
|
|
parent.spawn(this.clone());
|
|
|
|
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
})
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// Spawns entities with the Handle<SaveEntity> component
|
|
|
|
|
|
|
|
fn spawn_entities(
|
|
|
|
|
|
|
|
events: Query<(Entity, &Handle<SaveEntity>), Added<Handle<SaveEntity>>>,
|
|
|
|
|
|
|
|
save_entities: Res<Assets<SaveEntity>>,
|
|
|
|
|
|
|
|
mut commands: Commands,
|
|
|
|
|
|
|
|
) {
|
|
|
|
|
|
|
|
events.iter().for_each(|(entity, handle)| {
|
|
|
|
|
|
|
|
debug!("Spawning entity {:?} {:?}", entity, handle);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Get a handle on the
|
|
|
|
|
|
|
|
let mut e = commands.entity(entity);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Get the entity asset containing reflected component
|
|
|
|
|
|
|
|
let save_entity = save_entities.get(handle).unwrap();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Add each component to the entity
|
|
|
|
|
|
|
|
save_entity.components.iter().for_each(|component| {
|
|
|
|
|
|
|
|
e.insert_reflect(component.clone_value());
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
}
|
|
|
|
|