|
|
|
@ -1,6 +1,3 @@
|
|
|
|
use bevy::{gltf::Gltf, math::Vec3A, render::primitives::Aabb};
|
|
|
|
|
|
|
|
use nom::IResult;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
use crate::prelude::*;
|
|
|
|
use crate::prelude::*;
|
|
|
|
|
|
|
|
|
|
|
|
/// Menu Plugin; empty struct for Plugin impl
|
|
|
|
/// Menu Plugin; empty struct for Plugin impl
|
|
|
|
@ -19,11 +16,13 @@ impl Plugin for SavePlugin {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#[derive(Asset, TypePath, Debug, Default)]
|
|
|
|
#[derive(Asset, TypePath, Debug, Default)]
|
|
|
|
struct SaveEntity {
|
|
|
|
pub(crate) struct SaveEntity {
|
|
|
|
transform: Option<Transform>,
|
|
|
|
transform: Option<Transform>,
|
|
|
|
name: Option<Name>,
|
|
|
|
name: Option<Name>,
|
|
|
|
uuid: Option<EntityUuid>,
|
|
|
|
uuid: Option<EntityUuid>,
|
|
|
|
model: Option<(Handle<Gltf>, String)>,
|
|
|
|
model: Option<(Handle<Gltf>, String)>,
|
|
|
|
|
|
|
|
// TODO: Option<bool> feels like an antipattern as this is either Some(true) or None and never Some(false).
|
|
|
|
|
|
|
|
// Either encode more Camera data in this or replace it with Option<()> or just bool.
|
|
|
|
camera: Option<bool>,
|
|
|
|
camera: Option<bool>,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@ -44,8 +43,8 @@ impl SaveEntity {
|
|
|
|
} else if let Ok((gltf_path, scene_name)) = parse::parse_save_model(line) {
|
|
|
|
} else if let Ok((gltf_path, scene_name)) = parse::parse_save_model(line) {
|
|
|
|
let handle = load_context.load(gltf_path);
|
|
|
|
let handle = load_context.load(gltf_path);
|
|
|
|
entity.model = Some((handle, scene_name));
|
|
|
|
entity.model = Some((handle, scene_name));
|
|
|
|
} else if let Ok(is_camera) = parse::parse_save_camera(line) {
|
|
|
|
} else if let Ok(true) = parse::parse_save_camera(line) {
|
|
|
|
entity.camera = Some(is_camera);
|
|
|
|
entity.camera = Some(true);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
Ok(entity)
|
|
|
|
Ok(entity)
|
|
|
|
@ -78,23 +77,25 @@ mod parse {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
fn parse_thing<'a>(s: &'a str, l: &'a str) -> IResult<&'a str, &'a str> {
|
|
|
|
fn parse_word<'a>(w: &'a str) -> impl Fn(&'a str) -> IResult<&'a str, &'a str> {
|
|
|
|
tag(l)(s)
|
|
|
|
move |i: &'a str| {
|
|
|
|
|
|
|
|
tag(w)(i)
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
fn parse_xyz(i: &str) -> IResult<&str, (f32, f32, f32)> {
|
|
|
|
fn parse_xyz(i: &str) -> IResult<&str, (f32, f32, f32)> {
|
|
|
|
tuple((float, take(1usize), float, take(1usize), float))(i)
|
|
|
|
tuple((float, space1, float, space1, float))(i)
|
|
|
|
.map(|(s, (x, _, y, _, z))| (s, (x, y, z)))
|
|
|
|
.map(|(s, (x, _, y, _, z))| (s, (x, y, z)))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
fn parse_wxyz(i: &str) -> IResult<&str, (f32, f32, f32, f32)> {
|
|
|
|
fn parse_wxyz(i: &str) -> IResult<&str, (f32, f32, f32, f32)> {
|
|
|
|
tuple((
|
|
|
|
tuple((
|
|
|
|
float,
|
|
|
|
float,
|
|
|
|
take(1usize),
|
|
|
|
space1,
|
|
|
|
float,
|
|
|
|
float,
|
|
|
|
take(1usize),
|
|
|
|
space1,
|
|
|
|
float,
|
|
|
|
float,
|
|
|
|
take(1usize),
|
|
|
|
space1,
|
|
|
|
float,
|
|
|
|
float,
|
|
|
|
))(i)
|
|
|
|
))(i)
|
|
|
|
.map(|(s, (w, _, x, _, y, _, z))| (s, (w, x, y, z)))
|
|
|
|
.map(|(s, (w, _, x, _, y, _, z))| (s, (w, x, y, z)))
|
|
|
|
@ -120,16 +121,14 @@ mod parse {
|
|
|
|
|
|
|
|
|
|
|
|
let mut curr = rem.trim_start();
|
|
|
|
let mut curr = rem.trim_start();
|
|
|
|
for _ in 0..3 {
|
|
|
|
for _ in 0..3 {
|
|
|
|
if let Ok((input, _)) = parse_thing(curr, "translation") {
|
|
|
|
println!("Curr: {:?}", curr);
|
|
|
|
let (rem, (x, y, z)) = parse_xyz(input.trim_start())?;
|
|
|
|
if let Ok((rem, (_, _, (x, y, z)))) = tuple((parse_word("translation"), space1, parse_xyz))(curr.trim_start()) {
|
|
|
|
transform.translation = Vec3::new(x, y, z);
|
|
|
|
transform.translation = Vec3::new(x, y, z);
|
|
|
|
curr = rem.trim_start();
|
|
|
|
curr = rem.trim_start();
|
|
|
|
} else if let Ok((input, _)) = parse_thing(curr.trim_start(), "rotation") {
|
|
|
|
} else if let Ok((rem, (_, _, (x, y, z, w)))) = tuple((parse_word("rotation"), space1, parse_wxyz))(curr.trim_start()) {
|
|
|
|
let (rem, (x, y, z, w)) = parse_wxyz(input.trim_start())?;
|
|
|
|
|
|
|
|
transform.rotation = Quat::from_xyzw(x, y, z, w);
|
|
|
|
transform.rotation = Quat::from_xyzw(x, y, z, w);
|
|
|
|
curr = rem.trim_start();
|
|
|
|
curr = rem.trim_start();
|
|
|
|
} else if let Ok((input, _)) = parse_thing(curr.trim_start(), "scale") {
|
|
|
|
} else if let Ok((rem, (_, _, (x, y, z)))) = tuple((parse_word("scale"), space1, parse_xyz))(curr.trim_start()) {
|
|
|
|
let (rem, (x, y, z)) = parse_xyz(input.trim_start())?;
|
|
|
|
|
|
|
|
transform.scale = Vec3::new(x, y, z);
|
|
|
|
transform.scale = Vec3::new(x, y, z);
|
|
|
|
curr = rem.trim_start();
|
|
|
|
curr = rem.trim_start();
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
@ -219,9 +218,9 @@ mod parse {
|
|
|
|
pub(crate) fn parse_save_model(line: &str) -> Result<(String, String), SaveEntityParseError> {
|
|
|
|
pub(crate) fn parse_save_model(line: &str) -> Result<(String, String), SaveEntityParseError> {
|
|
|
|
let (rem, (_, _, gltf_name, _, scene_name)) = tuple((
|
|
|
|
let (rem, (_, _, gltf_name, _, scene_name)) = tuple((
|
|
|
|
tag("model"),
|
|
|
|
tag("model"),
|
|
|
|
take(1usize),
|
|
|
|
space1,
|
|
|
|
parse_string,
|
|
|
|
parse_string,
|
|
|
|
take(1usize),
|
|
|
|
space1,
|
|
|
|
parse_string,
|
|
|
|
parse_string,
|
|
|
|
))(line)?;
|
|
|
|
))(line)?;
|
|
|
|
|
|
|
|
|
|
|
|
@ -254,9 +253,8 @@ mod parse {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
{
|
|
|
|
{
|
|
|
|
let line = "notcamera";
|
|
|
|
let line = "notcamera";
|
|
|
|
let parsed = parse_save_camera(line).unwrap();
|
|
|
|
let parsed = parse_save_camera(line);
|
|
|
|
let expected = false;
|
|
|
|
assert!(parsed.is_err());
|
|
|
|
assert_eq!(parsed, expected);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -302,11 +300,6 @@ fn test_save_entity(loader: Res<AssetServer>, mut commands: Commands) {
|
|
|
|
commands.spawn((
|
|
|
|
commands.spawn((
|
|
|
|
SpatialBundle { ..default() },
|
|
|
|
SpatialBundle { ..default() },
|
|
|
|
handle,
|
|
|
|
handle,
|
|
|
|
ShowAabbGizmo { ..default() },
|
|
|
|
|
|
|
|
Aabb {
|
|
|
|
|
|
|
|
center: Vec3A::ZERO,
|
|
|
|
|
|
|
|
half_extents: Vec3A::ONE,
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
));
|
|
|
|
));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|