From 69e711811b4a4020554579bb82b97aec6ce49629 Mon Sep 17 00:00:00 2001 From: numzero Date: Mon, 23 Sep 2024 19:20:13 +0300 Subject: [PATCH] Encapsulate camera location --- src/bin/wireframe/main.rs | 50 +++++++++++++++++++++++++++++---------- 1 file changed, 38 insertions(+), 12 deletions(-) diff --git a/src/bin/wireframe/main.rs b/src/bin/wireframe/main.rs index 4aa9c27..cc4591c 100644 --- a/src/bin/wireframe/main.rs +++ b/src/bin/wireframe/main.rs @@ -1,6 +1,6 @@ use std::{collections::HashSet, time::Instant}; -use glam::{mat4, vec2, vec3, vec4, Mat4, Quat, Vec3}; +use glam::{mat4, vec2, vec3, vec4, Mat4, Vec3}; use glium::{ backend::{glutin::SimpleWindowBuilder, Facade}, glutin::config::ConfigTemplateBuilder, @@ -69,6 +69,39 @@ fn prepare_scene(display: &impl Facade) -> Vec { .collect() } +mod camctl { + use glam::{vec3, Mat4, Quat, Vec3}; + + pub struct CameraLocation { + pos: Vec3, + rot: Quat, + } + + impl CameraLocation { + pub fn new() -> CameraLocation { + let rot = Quat::from_euler(glam::EulerRot::ZYX, std::f32::consts::FRAC_PI_4, 0., 0.); + let pos = rot * vec3(-200., 0., 50.); + CameraLocation { pos, rot } + } + + pub fn view_mtx(&self) -> Mat4 { + Mat4::from_quat(self.rot.inverse()) * Mat4::from_translation(-self.pos) + } + + pub fn move_rel(&mut self, offset: Vec3) { + self.pos += self.rot * offset; + } + + pub fn rotate_rel_ypr(&mut self, ypr: Vec3) { + self.rotate_rel_quat(Quat::from_euler(glam::EulerRot::XYZ, ypr.x, ypr.y, ypr.z)); + } + + pub fn rotate_rel_quat(&mut self, rot: Quat) { + self.rot *= rot; + } + } +} + static KEYS_MOVE: &'static [(PhysicalKey, Vec3)] = &[ (PhysicalKey::Code(KeyCode::KeyW), vec3(1., 0., 0.)), (PhysicalKey::Code(KeyCode::KeyS), vec3(-1., 0., 0.)), @@ -103,10 +136,7 @@ fn main() { let scene = prepare_scene(&display); - let rot = Quat::from_euler(glam::EulerRot::ZYX, std::f32::consts::FRAC_PI_4, 0., 0.); - let mut cam_pos = rot * vec3(-200., 0., 50.); - let mut cam_rot = rot; - + let mut cam = camctl::CameraLocation::new(); let mut t1 = Instant::now(); #[allow(deprecated)] @@ -124,13 +154,12 @@ fn main() { .iter() .filter_map(|(key, dir)| keys_pressed.contains(key).then_some(dir)) .sum(); - cam_pos += 100. * dt * (cam_rot * v); let vroll: Vec3 = KEYS_ROTATE .iter() .filter_map(|(key, dir)| keys_pressed.contains(key).then_some(dir)) .sum(); - let vroll = 2. * dt * vroll; - cam_rot *= Quat::from_euler(glam::EulerRot::XYZ, vroll.x, vroll.y, vroll.z); + cam.move_rel(100. * dt * v); + cam.rotate_rel_ypr(2. * dt * vroll); let size = window.inner_size(); let size = vec2(size.width as f32, size.height as f32).normalize() @@ -143,10 +172,7 @@ fn main() { vec4(0., 1., 0., 0.), vec4(0., 0., 0., 1.), ); - - let view = my_to_gl - * Mat4::from_quat(cam_rot.inverse()) - * Mat4::from_translation(-cam_pos); + let view = my_to_gl * cam.view_mtx(); let mut target = display.draw(); target.clear_color(0.0, 0.0, 0.0, 0.0);