From 5724e670b78898ccb576e7f877fd8062591dff91 Mon Sep 17 00:00:00 2001 From: Elijah Voigt Date: Sat, 31 Aug 2024 22:16:18 -0700 Subject: [PATCH] Parsing models implemented --- assets/scenes/00.scene | 1 + assets/scenes/00/camera.entity | 2 +- assets/scenes/00/van.entity | 6 +++--- src/main.rs | 1 + src/parser.rs | 39 ++++++++++++++++++++-------------- 5 files changed, 29 insertions(+), 20 deletions(-) diff --git a/assets/scenes/00.scene b/assets/scenes/00.scene index 3b302a8..0800fca 100644 --- a/assets/scenes/00.scene +++ b/assets/scenes/00.scene @@ -1 +1,2 @@ 00/camera.entity +00/van.entity diff --git a/assets/scenes/00/camera.entity b/assets/scenes/00/camera.entity index 2d67142..b55d9c2 100644 --- a/assets/scenes/00/camera.entity +++ b/assets/scenes/00/camera.entity @@ -1,2 +1,2 @@ camera -; transform translation 2.0 2.0 2.0 ... +transform translation 2.0 2.0 2.0 ... diff --git a/assets/scenes/00/van.entity b/assets/scenes/00/van.entity index 9a55bb2..fb6ace4 100644 --- a/assets/scenes/00/van.entity +++ b/assets/scenes/00/van.entity @@ -1,3 +1,3 @@ -# spatial3d -# transform ... -# model "models/van.glb" +transform ... +visible +model "models/van.glb" "Scene" diff --git a/src/main.rs b/src/main.rs index 3b575d7..3ab2d22 100644 --- a/src/main.rs +++ b/src/main.rs @@ -37,6 +37,7 @@ fn main() { parse_save_camera, parse_save_visibility, parse_save_transform, + parse_save_model, ], }) .run(); diff --git a/src/parser.rs b/src/parser.rs index bb2aa56..83b0794 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -117,7 +117,7 @@ fn test_tokenize() { pub(crate) fn parse_save_transform( tokens: &Vec, ) -> Result>, SaveEntityParseError> { - if tokens[0] == Token::Tag("transform".into()) { + if tokens.get(0) == Some(&Token::Tag("transform".into())) { let mut t = Transform::default(); let mut idx = 1; while idx < tokens.len() { @@ -320,16 +320,24 @@ impl Component for SaveModel { /// pub(crate) fn parse_save_model( tokens: &Vec, -) -> Result, SaveEntityParseError> { - todo!("parse_save_model"); - - /* - Ok(SaveModel { - gltf_file: gltf_path.into(), - scene_name: scene_name.into(), +) -> Result>, SaveEntityParseError> { + if tokens.get(0) == Some(&Token::Tag("model".into())) { + if let Token::Str(gltf_file) = tokens.get(1).expect("model requires gltf file") { + if let Token::Str(scene_name) = tokens.get(2).expect("model requires scene name") { + Ok(vec![SaveModel { + gltf_file: gltf_file.into(), + scene_name: scene_name.clone(), + } + .clone_value()]) + } else { + Err(SaveEntityParseError::Component("Model".into())) + } + } else { + Err(SaveEntityParseError::Component("Model".into())) + } + } else { + Err(SaveEntityParseError::Component("Model".into())) } - .clone_value()) - */ } #[test] @@ -337,15 +345,14 @@ fn test_parse_model() { let line = "model \"models/foo.glb\" \"My Scene\""; let tokens = tokenize(line); let parsed = parse_save_model(&tokens).unwrap(); - let expected = SaveModel { + let expected = vec![SaveModel { gltf_file: "models/foo.glb".into(), scene_name: "My Scene".into(), - }; + }]; - assert!(expected - .clone_value() - .reflect_partial_eq(parsed.as_reflect()) - .unwrap()); + parsed.iter().zip(expected).for_each(|(p, e)| { + assert!(e.clone_value().reflect_partial_eq(p.as_reflect()).unwrap()); + }); } #[derive(Component, Debug, Default, PartialEq, Reflect, Clone)]