2025-03-08 15:01:20 +00:00
|
|
|
use std::{path::Path, time::Duration};
|
2025-03-01 05:43:44 +00:00
|
|
|
|
2025-02-26 11:22:32 +00:00
|
|
|
use anyhow::Result;
|
2025-02-26 13:51:44 +00:00
|
|
|
|
2025-02-26 11:22:32 +00:00
|
|
|
use ecs::*;
|
2025-03-08 15:01:20 +00:00
|
|
|
use engine::prelude::{
|
|
|
|
cgmath::{Deg, Matrix3, Vector3, vec3},
|
|
|
|
*,
|
|
|
|
};
|
2025-03-01 05:43:44 +00:00
|
|
|
use skybox::SkyBox;
|
2025-02-26 11:22:32 +00:00
|
|
|
|
|
|
|
fn main() -> Result<()> {
|
|
|
|
let mut world_builder = World::builder();
|
2025-02-26 13:51:44 +00:00
|
|
|
|
2025-02-28 14:13:19 +00:00
|
|
|
Engine::new::<GameState>(EngineCreateInfo::default(), &mut world_builder)?;
|
|
|
|
|
|
|
|
world_builder.add_system(GameState::update);
|
2025-03-08 15:01:20 +00:00
|
|
|
world_builder.resources.insert(GameState::default());
|
2025-02-26 11:22:32 +00:00
|
|
|
|
2025-03-10 11:34:38 +00:00
|
|
|
let dir = Path::new("C:/Users/M.Huebner/Downloads/skybox");
|
|
|
|
// let dir = Path::new("/home/michaelh/Sync/skybox_labeled");
|
2025-03-01 05:43:44 +00:00
|
|
|
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(),
|
|
|
|
)?;
|
|
|
|
|
2025-03-03 14:00:58 +00:00
|
|
|
let view = world_builder.resources.get_mut::<Scene>().view_mut();
|
|
|
|
let camera = view.camera_mut();
|
|
|
|
|
2025-03-08 15:01:20 +00:00
|
|
|
camera.look_at(false);
|
|
|
|
camera.set_center(vec3(0.0, 0.0, 0.0));
|
|
|
|
camera.set_eye_dir(Vector3::unit_y());
|
2025-03-03 14:00:58 +00:00
|
|
|
view.update_buffer()?;
|
|
|
|
|
2025-02-26 11:22:32 +00:00
|
|
|
world_builder.build().run()
|
|
|
|
}
|
2025-02-28 14:13:19 +00:00
|
|
|
|
2025-03-08 15:01:20 +00:00
|
|
|
#[derive(Default)]
|
2025-02-28 14:13:19 +00:00
|
|
|
enum GameState {
|
2025-03-08 15:01:20 +00:00
|
|
|
#[default]
|
2025-02-28 14:13:19 +00:00
|
|
|
Startup,
|
2025-03-09 07:32:34 +00:00
|
|
|
|
2025-02-28 14:13:19 +00:00
|
|
|
Game(Game),
|
|
|
|
}
|
|
|
|
|
|
|
|
impl GameState {
|
|
|
|
fn update(world: &mut World) -> Result<bool> {
|
2025-03-08 15:01:20 +00:00
|
|
|
let me = world.resources.get_mut_unchecked::<Self>();
|
|
|
|
|
|
|
|
match me {
|
|
|
|
GameState::Startup => *me = GameState::Game(Game { start: world.now() }),
|
2025-02-28 14:13:19 +00:00
|
|
|
GameState::Game(game) => game.update(world)?,
|
|
|
|
}
|
|
|
|
|
|
|
|
Ok(true)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl EventConsumer for GameState {
|
2025-03-03 08:47:37 +00:00
|
|
|
fn event(&mut self, world: &mut World, event: EngineEvent<'_>) -> Result<()> {
|
2025-02-28 14:13:19 +00:00
|
|
|
match self {
|
|
|
|
GameState::Startup => (),
|
|
|
|
GameState::Game(game) => game.event(world, event)?,
|
|
|
|
}
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2025-03-08 15:01:20 +00:00
|
|
|
struct Game {
|
|
|
|
start: Duration,
|
|
|
|
}
|
2025-02-28 14:13:19 +00:00
|
|
|
|
|
|
|
impl Game {
|
|
|
|
fn update(&mut self, world: &mut World) -> Result<()> {
|
2025-03-08 15:01:20 +00:00
|
|
|
let now = world.now();
|
|
|
|
let view = world.resources.get_mut::<Scene>().view_mut();
|
|
|
|
let camera = view.camera_mut();
|
|
|
|
|
2025-03-09 07:32:34 +00:00
|
|
|
let diff = now.as_secs_f32() - self.start.as_secs_f32();
|
2025-03-08 15:01:20 +00:00
|
|
|
camera.set_eye_dir(
|
2025-03-09 07:32:34 +00:00
|
|
|
Matrix3::from_angle_z(Deg(diff * 36.0))
|
2025-03-10 11:34:38 +00:00
|
|
|
* Matrix3::from_angle_x(Deg(diff.sin() * 30.0))
|
2025-03-08 15:01:20 +00:00
|
|
|
* Vector3::unit_y(),
|
|
|
|
);
|
|
|
|
view.update_buffer()?;
|
|
|
|
|
2025-02-28 14:13:19 +00:00
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
2025-03-09 07:32:34 +00:00
|
|
|
fn event(&mut self, _world: &mut World, _event: EngineEvent<'_>) -> Result<()> {
|
2025-02-28 14:13:19 +00:00
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
}
|