From a54255c363f38c471fccf15fe1c0593650ccffe0 Mon Sep 17 00:00:00 2001 From: "Elijah C. Voigt" Date: Wed, 3 Jul 2024 14:34:41 -0700 Subject: [PATCH] Adding camera component for saved entity --- assets/README.md | 9 ++++--- assets/levels/00/entities/camera.entity | 4 +++ src/menu.rs | 2 +- src/save.rs | 34 ++++++++++++++++++++++++- 4 files changed, 43 insertions(+), 6 deletions(-) create mode 100644 assets/levels/00/entities/camera.entity diff --git a/assets/README.md b/assets/README.md index c7465d3..3091a50 100644 --- a/assets/README.md +++ b/assets/README.md @@ -11,7 +11,8 @@ This custom reading/writing can be found in `src/save.rs`. All `.entity` files list one component per line. Components include: -* `name ` -* `uuid ` -* `transform translation rotation scale ` -* `model "" ""` \ No newline at end of file +* `name ` Human readable name for entity +* `uuid ` Globally unique ID for entity +* `transform translation rotation scale ` 3D Location, Rotation, and Scale for entity +* `model "" ""` Declares the entity's 3d model +* `camera` Marks the entity as a camera \ No newline at end of file diff --git a/assets/levels/00/entities/camera.entity b/assets/levels/00/entities/camera.entity new file mode 100644 index 0000000..cd17ac8 --- /dev/null +++ b/assets/levels/00/entities/camera.entity @@ -0,0 +1,4 @@ +name camera +uuid 2e45b7e9-6722-4d50-8ea5-67f25b8b0f62 +transform translation -5.0 5.0 5.0 rotation 0.0 0.0 0.0 1.0 scale 1.0 1.0 1.0 +camera \ No newline at end of file diff --git a/src/menu.rs b/src/menu.rs index 2a3ede8..8c3b11d 100644 --- a/src/menu.rs +++ b/src/menu.rs @@ -9,7 +9,7 @@ impl Plugin for MenuPlugin { } fn init_menu(mut commands: Commands) { - commands.spawn(Camera3dBundle { ..default() }); + // commands.spawn(Camera3dBundle { ..default() }); commands .spawn(NodeBundle { style: Style { diff --git a/src/save.rs b/src/save.rs index aa5c2de..5b24706 100644 --- a/src/save.rs +++ b/src/save.rs @@ -24,6 +24,7 @@ struct SaveEntity { name: Option, uuid: Option, model: Option<(Handle, String)>, + camera: Option, } impl SaveEntity { @@ -43,6 +44,8 @@ impl SaveEntity { } else if let Ok((gltf_path, scene_name)) = parse::parse_save_model(line) { let handle = load_context.load(gltf_path); entity.model = Some((handle, scene_name)); + } else if let Ok(is_camera) = parse::parse_save_camera(line) { + entity.camera = Some(is_camera); } }); Ok(entity) @@ -214,7 +217,6 @@ mod parse { } pub(crate) fn parse_save_model(line: &str) -> Result<(String, String), SaveEntityParseError> { - println!("{}", line); let (rem, (_, _, gltf_name, _, scene_name)) = tuple(( tag("model"), take(1usize), @@ -236,6 +238,27 @@ mod parse { assert_eq!(parsed, expected); } + + pub(crate) fn parse_save_camera(line: &str) -> Result { + let (_rem, cam) = tag("camera")(line)?; + Ok(cam.len() > 0) + } + + #[test] + fn test_parse_camera() { + { + let line = "camera"; + let parsed = parse_save_camera(line).unwrap(); + let expected = true; + assert_eq!(parsed, expected); + } + { + let line = "notcamera"; + let parsed = parse_save_camera(line).unwrap(); + let expected = false; + assert_eq!(parsed, expected); + } + } } #[derive(Default)] @@ -308,6 +331,15 @@ fn check_loaded_entity_assets( ); let mut e = commands.entity(entity); + // Apply camera + // Should be applied early to avoid clobbering transform + if let Some(is_camera) = &saved.camera { + if *is_camera { + e.insert(Camera3dBundle { ..default() }); + } + } else { + e.remove::<(Camera, Camera3d)>(); + } // Apply transform if let Some(transform) = &saved.transform { // TODO: Only update if different