diff --git a/Cargo.toml b/Cargo.toml index 3e7d1be..360b6ce 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,6 +8,7 @@ members = [ "controllable_thread", "engine", "entity_manager", + "examples/free_space", "examples/simple_window", "gltf-loader", "loading-screen", diff --git a/engine/src/scene/general/free_camera_control.rs b/engine/src/scene/general/free_camera_control.rs index ceb80ac..a2c3313 100644 --- a/engine/src/scene/general/free_camera_control.rs +++ b/engine/src/scene/general/free_camera_control.rs @@ -4,7 +4,7 @@ use context::prelude::cgmath::num_traits::clamp; struct HoldInfo { roll: Deg, - pitch: Deg, + _pitch: Deg, yaw: Deg, mouse_position: (u32, u32), @@ -14,7 +14,7 @@ impl<'a> From<&'a FreeCameraControl> for HoldInfo { fn from(value: &'a FreeCameraControl) -> Self { Self { roll: value.roll, - pitch: value.pitch, + _pitch: value.pitch, yaw: value.yaw, mouse_position: value.mouse_position, diff --git a/examples/free_space/Cargo.toml b/examples/free_space/Cargo.toml new file mode 100644 index 0000000..247cce8 --- /dev/null +++ b/examples/free_space/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "free_space" +version = "0.1.0" +edition = "2024" + +[dependencies] +anyhow.workspace = true +ecs.workspace = true + +engine = { path = "../../engine" } +skybox = { path = "../../skybox" } diff --git a/examples/free_space/src/game.rs b/examples/free_space/src/game.rs new file mode 100644 index 0000000..7437d81 --- /dev/null +++ b/examples/free_space/src/game.rs @@ -0,0 +1,44 @@ +use anyhow::Result; + +use ecs::*; +use engine::prelude::*; + +pub struct Game; + +impl Game { + pub fn update(&mut self, _world: &mut World) -> Result<()> { + Ok(()) + } + + pub fn event(&mut self, world: &mut World, event: EngineEvent<'_>) -> Result<()> { + match event { + EngineEvent::MouseButtonDown(MouseButton::Left) => { + let camera_control = world.resources.get_mut::(); + camera_control.mouse_down(); + } + EngineEvent::MouseButtonUp(MouseButton::Left) => { + let camera_control = world.resources.get_mut::(); + camera_control.mouse_release(); + } + EngineEvent::MouseMotion(x, y) => { + let mut resources = world.resources.multi_mut(); + let scene = resources.get::(); + let camera_control = resources.get::(); + + camera_control.mouse_move(x, y, scene.view_mut())?; + } + + _ => (), + } + + Ok(()) + } +} + +impl Game { + pub fn setup_updates(world_builder: &mut WorldBuilder) -> Result<()> { + world_builder.add_update(name, priority, func, filter)?; + + Ok(()) + } +} diff --git a/examples/free_space/src/game_state.rs b/examples/free_space/src/game_state.rs new file mode 100644 index 0000000..32f7de5 --- /dev/null +++ b/examples/free_space/src/game_state.rs @@ -0,0 +1,38 @@ +use anyhow::Result; + +use ecs::*; +use engine::prelude::*; + +use crate::game::Game; + +#[derive(Default)] +pub enum GameState { + #[default] + Startup, + + Game(Game), +} + +impl GameState { + pub fn update(world: &mut World) -> Result { + let me = world.resources.get_mut_unchecked::(); + + match me { + GameState::Startup => *me = GameState::Game(Game), + GameState::Game(game) => game.update(world)?, + } + + Ok(true) + } +} + +impl EventConsumer for GameState { + fn event(&mut self, world: &mut World, event: EngineEvent<'_>) -> Result<()> { + match self { + GameState::Startup => (), + GameState::Game(game) => game.event(world, event)?, + } + + Ok(()) + } +} diff --git a/examples/free_space/src/main.rs b/examples/free_space/src/main.rs new file mode 100644 index 0000000..ed1fe8c --- /dev/null +++ b/examples/free_space/src/main.rs @@ -0,0 +1,44 @@ +mod game; +mod game_state; + +use std::path::Path; + +use anyhow::Result; + +use ecs::*; +use engine::prelude::*; +use game::Game; +use game_state::GameState; +use skybox::SkyBox; + +fn main() -> Result<()> { + let mut world_builder = World::builder(); + + Engine::new::(EngineCreateInfo::default(), &mut world_builder)?; + + world_builder.add_system(GameState::update); + world_builder.resources.insert(GameState::default()); + + // let dir = Path::new("C:/Users/M.Huebner/Downloads/skybox"); + let dir = Path::new("/home/michaelh/Sync/skybox"); + SkyBox::new( + &mut world_builder, + [ + dir.join("left.png"), + dir.join("right.png"), + dir.join("front.png"), + dir.join("back.png"), + dir.join("top.png"), + dir.join("bottom.png"), + ] + .into_iter(), + )?; + + let view = world_builder.resources.get_mut::().view_mut(); + let camera_control = FreeCameraControl::new(view)?; + world_builder.resources.insert(camera_control); + + Game::setup_updates(&mut world_builder)?; + + world_builder.build().run() +} diff --git a/examples/simple_window/Cargo.toml b/examples/simple_window/Cargo.toml index 491e55a..1224e3c 100644 --- a/examples/simple_window/Cargo.toml +++ b/examples/simple_window/Cargo.toml @@ -4,9 +4,7 @@ version = "0.1.0" edition = "2024" [dependencies] -plexus = "0.0.11" anyhow.workspace = true ecs.workspace = true engine = { path = "../../engine" } -skybox = { path = "../../skybox" } diff --git a/examples/simple_window/src/main.rs b/examples/simple_window/src/main.rs index 6865df3..24380c3 100644 --- a/examples/simple_window/src/main.rs +++ b/examples/simple_window/src/main.rs @@ -1,10 +1,7 @@ -use std::path::Path; - use anyhow::Result; use ecs::*; use engine::prelude::*; -use skybox::SkyBox; fn main() -> Result<()> { let mut world_builder = World::builder(); @@ -14,21 +11,6 @@ fn main() -> Result<()> { world_builder.add_system(GameState::update); world_builder.resources.insert(GameState::default()); - // let dir = Path::new("C:/Users/M.Huebner/Downloads/skybox"); - let dir = Path::new("/home/michaelh/Sync/skybox"); - SkyBox::new( - &mut world_builder, - [ - dir.join("left.png"), - dir.join("right.png"), - dir.join("front.png"), - dir.join("back.png"), - dir.join("top.png"), - dir.join("bottom.png"), - ] - .into_iter(), - )?; - let view = world_builder.resources.get_mut::().view_mut(); let camera_control = FreeCameraControl::new(view)?; world_builder.resources.insert(camera_control);