|
|
|
|
@ -1,3 +1,4 @@
|
|
|
|
|
use bevy::{math::Vec3A, render::primitives::Aabb};
|
|
|
|
|
use nom::IResult;
|
|
|
|
|
|
|
|
|
|
use crate::prelude::*;
|
|
|
|
|
@ -9,7 +10,8 @@ impl Plugin for SavePlugin {
|
|
|
|
|
fn build(&self, app: &mut App) {
|
|
|
|
|
app.init_asset::<SaveEntity>()
|
|
|
|
|
.init_asset_loader::<SaveEntityLoader>()
|
|
|
|
|
.add_systems(Startup, test_save_entity);
|
|
|
|
|
.add_systems(Startup, test_save_entity)
|
|
|
|
|
.add_systems(Update, check_loaded_entity_assets.run_if(on_event::<AssetEvent<SaveEntity>>()));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -17,7 +19,7 @@ impl Plugin for SavePlugin {
|
|
|
|
|
struct SaveEntity {
|
|
|
|
|
transform: Option<Transform>,
|
|
|
|
|
name: Option<Name>,
|
|
|
|
|
uuid: Option<Uuid>,
|
|
|
|
|
uuid: Option<EntityUuid>,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl SaveEntity {
|
|
|
|
|
@ -30,13 +32,16 @@ impl SaveEntity {
|
|
|
|
|
} else if let Ok(transform) = parse::parse_save_transform(line) {
|
|
|
|
|
entity.transform = Some(transform);
|
|
|
|
|
} else if let Ok(uuid) = parse::parse_save_uuid(line) {
|
|
|
|
|
entity.uuid = Some(uuid);
|
|
|
|
|
entity.uuid = Some(EntityUuid(uuid));
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
Ok(entity)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[derive(Component, Clone, Debug)]
|
|
|
|
|
struct EntityUuid(Uuid);
|
|
|
|
|
|
|
|
|
|
mod parse {
|
|
|
|
|
use super::*;
|
|
|
|
|
|
|
|
|
|
@ -232,6 +237,52 @@ impl AssetLoader for SaveEntityLoader {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn test_save_entity(loader: Res<AssetServer>, mut handle: Local<Handle<SaveEntity>>) {
|
|
|
|
|
*handle = loader.load("levels/00/entities/van.entity");
|
|
|
|
|
fn test_save_entity(loader: Res<AssetServer>, mut commands: Commands) {
|
|
|
|
|
let handle: Handle<SaveEntity> = loader.load("levels/00/entities/van.entity");
|
|
|
|
|
commands.spawn((SpatialBundle { ..default() }, handle, ShowAabbGizmo { ..default() }, Aabb { center: Vec3A::ZERO, half_extents: Vec3A::ONE }));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn check_loaded_entity_assets(
|
|
|
|
|
query: Query<(Entity, &Handle<SaveEntity>)>,
|
|
|
|
|
mut events: EventReader<AssetEvent<SaveEntity>>,
|
|
|
|
|
save_entities: Res<Assets<SaveEntity>>,
|
|
|
|
|
mut commands: Commands,
|
|
|
|
|
) {
|
|
|
|
|
events.read().for_each(|event| {
|
|
|
|
|
match event {
|
|
|
|
|
AssetEvent::LoadedWithDependencies { id } => {
|
|
|
|
|
query
|
|
|
|
|
.iter()
|
|
|
|
|
.filter(|(_, handle)| handle.id() == *id)
|
|
|
|
|
.for_each(|(entity, _handle)|{
|
|
|
|
|
let saved = save_entities.get(*id).unwrap();
|
|
|
|
|
debug!("Updating entity {:?} ({:?}) because asset changed", saved.name, saved.uuid);
|
|
|
|
|
|
|
|
|
|
let mut e = commands.entity(entity);
|
|
|
|
|
// Apply transform
|
|
|
|
|
if let Some(transform) = &saved.transform {
|
|
|
|
|
// TODO: Only update if different
|
|
|
|
|
e.insert(transform.clone());
|
|
|
|
|
} else {
|
|
|
|
|
e.remove::<Transform>();
|
|
|
|
|
}
|
|
|
|
|
// Apply Name
|
|
|
|
|
if let Some(name) = &saved.name {
|
|
|
|
|
// TODO: Only update if different
|
|
|
|
|
e.insert(name.clone());
|
|
|
|
|
} else {
|
|
|
|
|
e.remove::<Name>();
|
|
|
|
|
}
|
|
|
|
|
// Apply Uuid
|
|
|
|
|
if let Some(uuid) = &saved.uuid {
|
|
|
|
|
// TODO: Only update if different
|
|
|
|
|
e.insert(uuid.clone());
|
|
|
|
|
} else {
|
|
|
|
|
e.remove::<EntityUuid>();
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
_ => ()
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
}
|