Start space example
This commit is contained in:
parent
d78574f54a
commit
f61e253032
8 changed files with 140 additions and 22 deletions
|
@ -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",
|
||||||
|
|
|
@ -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,
|
||||||
|
|
11
examples/free_space/Cargo.toml
Normal file
11
examples/free_space/Cargo.toml
Normal 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" }
|
44
examples/free_space/src/game.rs
Normal file
44
examples/free_space/src/game.rs
Normal 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(())
|
||||||
|
}
|
||||||
|
}
|
38
examples/free_space/src/game_state.rs
Normal file
38
examples/free_space/src/game_state.rs
Normal 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(())
|
||||||
|
}
|
||||||
|
}
|
44
examples/free_space/src/main.rs
Normal file
44
examples/free_space/src/main.rs
Normal 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()
|
||||||
|
}
|
|
@ -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" }
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue