Start space example

This commit is contained in:
Michael Huebner 2025-03-11 13:49:23 +01:00
parent d78574f54a
commit f61e253032
8 changed files with 140 additions and 22 deletions

View file

@ -8,6 +8,7 @@ members = [
"controllable_thread", "controllable_thread",
"engine", "engine",
"entity_manager", "entity_manager",
"examples/free_space",
"examples/simple_window", "examples/simple_window",
"gltf-loader", "gltf-loader",
"loading-screen", "loading-screen",

View file

@ -4,7 +4,7 @@ use context::prelude::cgmath::num_traits::clamp;
struct HoldInfo { struct HoldInfo {
roll: Deg<f32>, roll: Deg<f32>,
pitch: Deg<f32>, _pitch: Deg<f32>,
yaw: Deg<f32>, yaw: Deg<f32>,
mouse_position: (u32, u32), mouse_position: (u32, u32),
@ -14,7 +14,7 @@ impl<'a> From<&'a FreeCameraControl> for HoldInfo {
fn from(value: &'a FreeCameraControl) -> Self { fn from(value: &'a FreeCameraControl) -> Self {
Self { Self {
roll: value.roll, roll: value.roll,
pitch: value.pitch, _pitch: value.pitch,
yaw: value.yaw, yaw: value.yaw,
mouse_position: value.mouse_position, mouse_position: value.mouse_position,

View file

@ -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" }

View file

@ -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::<FreeCameraControl>();
camera_control.mouse_down();
}
EngineEvent::MouseButtonUp(MouseButton::Left) => {
let camera_control = world.resources.get_mut::<FreeCameraControl>();
camera_control.mouse_release();
}
EngineEvent::MouseMotion(x, y) => {
let mut resources = world.resources.multi_mut();
let scene = resources.get::<Scene>();
let camera_control = resources.get::<FreeCameraControl>();
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(())
}
}

View file

@ -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<bool> {
let me = world.resources.get_mut_unchecked::<Self>();
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(())
}
}

View file

@ -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::<GameState>(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::<Scene>().view_mut();
let camera_control = FreeCameraControl::new(view)?;
world_builder.resources.insert(camera_control);
Game::setup_updates(&mut world_builder)?;
world_builder.build().run()
}

View file

@ -4,9 +4,7 @@ version = "0.1.0"
edition = "2024" edition = "2024"
[dependencies] [dependencies]
plexus = "0.0.11"
anyhow.workspace = true anyhow.workspace = true
ecs.workspace = true ecs.workspace = true
engine = { path = "../../engine" } engine = { path = "../../engine" }
skybox = { path = "../../skybox" }

View file

@ -1,10 +1,7 @@
use std::path::Path;
use anyhow::Result; use anyhow::Result;
use ecs::*; use ecs::*;
use engine::prelude::*; use engine::prelude::*;
use skybox::SkyBox;
fn main() -> Result<()> { fn main() -> Result<()> {
let mut world_builder = World::builder(); let mut world_builder = World::builder();
@ -14,21 +11,6 @@ fn main() -> Result<()> {
world_builder.add_system(GameState::update); world_builder.add_system(GameState::update);
world_builder.resources.insert(GameState::default()); 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::<Scene>().view_mut(); let view = world_builder.resources.get_mut::<Scene>().view_mut();
let camera_control = FreeCameraControl::new(view)?; let camera_control = FreeCameraControl::new(view)?;
world_builder.resources.insert(camera_control); world_builder.resources.insert(camera_control);