summaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs170
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(())