use std::error::Error; use std::path::Path; use engine::color::Color; use engine::lighting::{LightSettings, LightSourceBuilder}; use engine::object::Id as ObjectId; use engine::texture::Texture; use engine::vector::{Vec2, Vec3}; use engine::{Engine, Key, WindowSize}; use tracing::Level; use tracing_subscriber::FmtSubscriber; use crate::cube::{create_cube, Corner as CubeCorner, Side as CubeSide}; mod cube; const WINDOW_SIZE: WindowSize = WindowSize { width: 500, height: 600 }; const BLUE: Color = Color { red: 0.0, blue: 1.0, green: 0.0 }; const RED: Color = Color { red: 1.0, green: 0.0, blue: 0.0 }; const GREEN: Color = Color { red: 0.0, green: 1.0, blue: 0.0 }; const ORANGE: Color = Color { red: 1.0, green: 0.5, blue: 0.0 }; const PURPLE: Color = Color { red: 0.5, green: 0.0, blue: 1.0 }; const CYAN: Color = Color { red: 0.0, green: 1.0, blue: 1.0 }; fn main() -> Result<(), Box> { let subscriber = FmtSubscriber::builder() .with_max_level(Level::TRACE) .finish(); tracing::subscriber::set_global_default(subscriber)?; let mut engine = Engine::new(&WINDOW_SIZE, "Yaaay lmao")?; engine.set_light_settings(LightSettings { ambient_light_strength: 0.1, specular_light_strength: 0.5, specular_shininess: 32, }); let cube = create_cube(|vertex_builder, side, _| { vertex_builder.color(match side { CubeSide::Top => BLUE, CubeSide::Back => RED, CubeSide::Left => PURPLE, CubeSide::Front => ORANGE, CubeSide::Right => GREEN, CubeSide::Bottom => CYAN, }) }) .build(ObjectId::new(3))?; engine.add_object(cube); let texture = Texture::open(Path::new("vent.png"))?; let mut textured_cube = create_cube(|vertex_builder, _, corner| { vertex_builder.texture_coords(match corner { CubeCorner::TopRight => Vec2 { x: 1.0, y: 1.0 }, CubeCorner::TopLeft => Vec2 { x: 0.0, y: 1.0 }, CubeCorner::BottomRight => Vec2 { x: 1.0, y: 0.0 }, CubeCorner::BottomLeft => Vec2 { x: 0.0, y: 0.0 }, }) }) .texture(texture) .build(ObjectId::new(4))?; textured_cube.translate(Vec3 { x: 1.6, y: 0.0, z: 0.0 }); engine.add_object(textured_cube); let light_source = LightSourceBuilder::new() .position(Vec3 { x: 1.2, y: 1.0, z: 1.5 }) .build(); engine.set_light_source(light_source); let cam_speed = 3.0; let light_source_speed = 1.2; engine.start(|engine| { let delta_time = *engine.delta_time(); if engine.is_key_pressed(Key::W).unwrap() { let cam_target_direction = engine.camera().target_direction().clone(); *engine.camera_mut().position_mut() += cam_target_direction * cam_speed * delta_time.as_secs_f32(); } if engine.is_key_pressed(Key::S).unwrap() { let rev_cam_target_direction = -engine.camera().target_direction().clone(); *engine.camera_mut().position_mut() += rev_cam_target_direction * cam_speed * delta_time.as_secs_f32(); } if engine.is_key_pressed(Key::A).unwrap() { let cam_left = engine.camera().left().clone(); // Camera speed adjusted to be same no matter how far the distance is to the // camera target let cam_speed_dist_adj = cam_speed * (engine.camera().position() - engine.camera().target()).length(); *engine.camera_mut().position_mut() += cam_left * cam_speed_dist_adj * delta_time.as_secs_f32(); } if engine.is_key_pressed(Key::D).unwrap() { let cam_right = engine.camera().right().clone(); // Camera speed adjusted to be same no matter how far the distance is to the // camera target let cam_speed_dist_adj = cam_speed * (engine.camera().position() - engine.camera().target()).length(); *engine.camera_mut().position_mut() += cam_right * cam_speed_dist_adj * delta_time.as_secs_f32(); } if engine.is_key_pressed(Key::K).unwrap() { let cam_up = engine.camera().up().clone(); // Camera speed adjusted to be same no matter how far the distance is to the // camera target let cam_speed_dist_adj = cam_speed * (engine.camera().position() - engine.camera().target()).length(); *engine.camera_mut().position_mut() += cam_up * cam_speed_dist_adj * delta_time.as_secs_f32(); } if engine.is_key_pressed(Key::J).unwrap() { let cam_up = engine.camera().down().clone(); // Camera speed adjusted to be same no matter how far the distance is to the // camera target let cam_speed_dist_adj = cam_speed * (engine.camera().position() - engine.camera().target()).length(); *engine.camera_mut().position_mut() += cam_up * cam_speed_dist_adj * delta_time.as_secs_f32(); } if engine.is_key_pressed(Key::O).unwrap() { let light_source = engine.light_source_mut().unwrap(); let front_right = Vec3 { x: 1.0, y: 0.0, z: 1.0 }; light_source .translate(front_right * light_source_speed * delta_time.as_secs_f32()); } if engine.is_key_pressed(Key::L).unwrap() { let light_source = engine.light_source_mut().unwrap(); let back_left = Vec3 { x: -1.0, y: 0.0, z: -1.0 }; light_source .translate(back_left * light_source_speed * delta_time.as_secs_f32()); } if engine.is_key_pressed(Key::KpAdd).unwrap() { let light_settings = engine.light_settings().unwrap().clone(); engine.set_light_settings(LightSettings { ambient_light_strength: light_settings.ambient_light_strength + 0.2, ..light_settings }) } if engine.is_key_pressed(Key::KpSubtract).unwrap() { let light_settings = engine.light_settings().unwrap().clone(); engine.set_light_settings(LightSettings { ambient_light_strength: light_settings.ambient_light_strength - 0.2, ..light_settings }) } })?; Ok(()) }