diff options
Diffstat (limited to 'src/main.rs')
-rw-r--r-- | src/main.rs | 170 |
1 files changed, 116 insertions, 54 deletions
diff --git a/src/main.rs b/src/main.rs index f594c7c..9171b35 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,16 +1,27 @@ use std::error::Error; +use std::path::Path; use engine::color::Color; -use engine::object::{Builder as ObjectBuilder, Id as ObjectId}; -use engine::vector::Vec3; -use engine::vertex::Builder as VertexBuilder; +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<f32> = Color { red: 0.0, blue: 1.0, green: 0.0 }; +const RED: Color<f32> = Color { red: 1.0, green: 0.0, blue: 0.0 }; +const GREEN: Color<f32> = Color { red: 0.0, green: 1.0, blue: 0.0 }; +const ORANGE: Color<f32> = Color { red: 1.0, green: 0.5, blue: 0.0 }; +const PURPLE: Color<f32> = Color { red: 0.5, green: 0.0, blue: 1.0 }; +const CYAN: Color<f32> = Color { red: 0.0, green: 1.0, blue: 1.0 }; fn main() -> Result<(), Box<dyn Error>> { @@ -22,60 +33,53 @@ fn main() -> Result<(), Box<dyn Error>> let mut engine = Engine::new(&WINDOW_SIZE, "Yaaay lmao")?; - let mut triangle = ObjectBuilder::new() - .vertices([ - VertexBuilder::new() - .pos(Vec3 { x: -0.5, y: -0.5, z: 0.0 }) - .color(Color { red: 1.0, green: 0.0, blue: 0.0 }) - .build() - .unwrap(), - VertexBuilder::new() - .pos(Vec3 { x: 0.5, y: -0.5, z: 0.0 }) - .color(Color { red: 0.0, green: 1.0, blue: 0.0 }) - .build() - .unwrap(), - VertexBuilder::new() - .pos(Vec3 { x: 0.0, y: 0.5, z: 0.0 }) - .color(Color { red: 0.0, green: 0.0, blue: 1.0 }) - .build() - .unwrap(), - ]) - .build(ObjectId::new(1))?; - - triangle.translate(Vec3 { x: 0.0, y: 0.4, z: 0.0 }); - - engine.add_object(triangle); - - let square = ObjectBuilder::new() - .vertices([ - VertexBuilder::new() - .pos(Vec3 { x: 0.5, y: 0.5, z: 0.0 }) - .color(BLUE) - .build() - .unwrap(), - VertexBuilder::new() - .pos(Vec3 { x: 0.5, y: -0.5, z: 0.0 }) - .color(BLUE) - .build() - .unwrap(), - VertexBuilder::new() - .pos(Vec3 { x: -0.5, y: -0.5, z: 0.0 }) - .color(BLUE) - .build() - .unwrap(), - VertexBuilder::new() - .pos(Vec3 { x: -0.5, y: 0.5, z: 0.0 }) - .color(BLUE) - .build() - .unwrap(), - ]) - .indices([0, 1, 3, 1, 2, 3]) - .build(ObjectId::new(2))?; - - engine.add_object(square); + 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(); @@ -113,6 +117,64 @@ fn main() -> Result<(), Box<dyn Error>> *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(()) |