summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main.rs79
1 files changed, 71 insertions, 8 deletions
diff --git a/src/main.rs b/src/main.rs
index e7486b2..321009e 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,12 +1,13 @@
use std::error::Error;
use std::path::Path;
+use engine::camera::Camera;
use engine::lighting::LightSourceBuilder;
use engine::material::Builder as MaterialBuilder;
use engine::object::Id as ObjectId;
use engine::texture::{Id as TextureId, Texture};
use engine::vector::{Vec2, Vec3};
-use engine::{Engine, Key, WindowSize};
+use engine::{Engine, Key, WindowSettingsBuilder, WindowSize};
use tracing::Level;
use tracing_subscriber::FmtSubscriber;
@@ -24,7 +25,10 @@ fn main() -> Result<(), Box<dyn Error>>
tracing::subscriber::set_global_default(subscriber)?;
- let mut engine = Engine::new(&WINDOW_SIZE, "Yaaay lmao")?;
+ let mut engine = Engine::<LookAtCamera>::new(
+ &WindowSettingsBuilder::new().build(WINDOW_SIZE, "Yaaay lmao"),
+ LookAtCamera::new(),
+ )?;
let texture = Texture::open(Path::new("vent.png"))?;
@@ -66,13 +70,13 @@ fn main() -> Result<(), Box<dyn Error>>
if engine.is_key_pressed(Key::W).unwrap() {
let cam_target_direction = engine.camera().target_direction().clone();
- *engine.camera_mut().position_mut() +=
+ engine.camera_mut().position +=
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() +=
+ engine.camera_mut().position +=
rev_cam_target_direction * cam_speed * delta_time.as_secs_f32();
}
if engine.is_key_pressed(Key::A).unwrap() {
@@ -83,7 +87,7 @@ fn main() -> Result<(), Box<dyn Error>>
let cam_speed_dist_adj = cam_speed
* (engine.camera().position() - engine.camera().target()).length();
- *engine.camera_mut().position_mut() +=
+ engine.camera_mut().position +=
cam_left * cam_speed_dist_adj * delta_time.as_secs_f32();
}
if engine.is_key_pressed(Key::D).unwrap() {
@@ -94,7 +98,7 @@ fn main() -> Result<(), Box<dyn Error>>
let cam_speed_dist_adj = cam_speed
* (engine.camera().position() - engine.camera().target()).length();
- *engine.camera_mut().position_mut() +=
+ engine.camera_mut().position +=
cam_right * cam_speed_dist_adj * delta_time.as_secs_f32();
}
if engine.is_key_pressed(Key::K).unwrap() {
@@ -105,7 +109,7 @@ fn main() -> Result<(), Box<dyn Error>>
let cam_speed_dist_adj = cam_speed
* (engine.camera().position() - engine.camera().target()).length();
- *engine.camera_mut().position_mut() +=
+ engine.camera_mut().position +=
cam_up * cam_speed_dist_adj * delta_time.as_secs_f32();
}
if engine.is_key_pressed(Key::J).unwrap() {
@@ -116,7 +120,7 @@ fn main() -> Result<(), Box<dyn Error>>
let cam_speed_dist_adj = cam_speed
* (engine.camera().position() - engine.camera().target()).length();
- *engine.camera_mut().position_mut() +=
+ engine.camera_mut().position +=
cam_up * cam_speed_dist_adj * delta_time.as_secs_f32();
}
@@ -141,3 +145,62 @@ fn main() -> Result<(), Box<dyn Error>>
Ok(())
}
+
+#[derive(Debug)]
+pub struct LookAtCamera
+{
+ position: Vec3<f32>,
+ target: Vec3<f32>,
+}
+
+impl LookAtCamera
+{
+ fn new() -> Self
+ {
+ let position = Vec3 { x: 0.0, y: 0.0, z: 3.0 };
+
+ Self { position, target: Vec3::default() }
+ }
+
+ fn target_direction(&self) -> Vec3<f32>
+ {
+ -(&self.position - &self.target).normalize()
+ }
+
+ fn right(&self) -> Vec3<f32>
+ {
+ let rev_target_direction = (&self.position - &self.target).normalize();
+
+ Vec3::UP.cross(&rev_target_direction).normalize()
+ }
+
+ fn left(&self) -> Vec3<f32>
+ {
+ -self.right()
+ }
+
+ fn up(&self) -> Vec3<f32>
+ {
+ let rev_target_direction = (&self.position - &self.target).normalize();
+
+ rev_target_direction.cross(&self.right())
+ }
+
+ fn down(&self) -> Vec3<f32>
+ {
+ -self.up()
+ }
+}
+
+impl Camera for LookAtCamera
+{
+ fn position(&self) -> Vec3<f32>
+ {
+ self.position.clone()
+ }
+
+ fn target(&self) -> Vec3<f32>
+ {
+ self.target.clone()
+ }
+}