From 168703742a8ba26072c2a3eab11159715cceef38 Mon Sep 17 00:00:00 2001 From: fredrikr79 Date: Thu, 18 Sep 2025 19:17:40 +0200 Subject: [PATCH] this isnt great --- gloom-rs/src/main.rs | 99 ++++++++++++++++++++++++-------------------- 1 file changed, 55 insertions(+), 44 deletions(-) diff --git a/gloom-rs/src/main.rs b/gloom-rs/src/main.rs index ea6dc13..6ed65fb 100644 --- a/gloom-rs/src/main.rs +++ b/gloom-rs/src/main.rs @@ -15,9 +15,10 @@ use std::sync::{Mutex, Arc, RwLock}; mod shader; mod util; -use glm::{mat4, pi}; +use glm::{mat4, pi, transpose}; use glutin::event::{Event, WindowEvent, DeviceEvent, KeyboardInput, ElementState::{Pressed, Released}, VirtualKeyCode::{self, *}}; use glutin::event_loop::ControlFlow; +use libc::CTRL_ATTR_MCAST_GRP_NAME; // initial window size const INITIAL_SCREEN_W: u32 = 800; @@ -226,15 +227,13 @@ fn main() { 100.0f32 ); - let mut camera_motion: glm::Vec3 = glm::vec3(0.0, 0.0, 0.0); - let mut cam_direction: glm::Vec3 = glm::vec3(0.0, 0.0, 1.0); - - let mut yaw_transform: glm::Mat4 = glm::identity(); - let mut tilt_transform: glm::Mat4 = glm::identity(); - let mut motion_transform; - - let rotation_speed = 1.0f32; + let mut camera_position: glm::Vec3 = glm::vec3(0.0, 0.0, 0.0); let translation_speed = 3.0f32; + let rotation_speed = 3.0f32; + + let mut yaw = 0.0f32; + let mut pitch = 0.0f32; + // == // Set up your shaders here // Basic usage of shader helper: @@ -280,36 +279,54 @@ fn main() { if let Ok(keys) = pressed_keys.lock() { for key in keys.iter() { match key { - // The `VirtualKeyCode` enum is defined here: - // https://docs.rs/winit/0.25.0/winit/event/enum.VirtualKeyCode.html - - VirtualKeyCode::A => { camera_motion.x += trans_speed; } - VirtualKeyCode::D => { camera_motion.x += -trans_speed; } - VirtualKeyCode::W => { camera_motion.z += trans_speed; } - VirtualKeyCode::S => { camera_motion.z += -trans_speed; } - VirtualKeyCode::Space => { camera_motion.y += -trans_speed; } - VirtualKeyCode::LShift => { camera_motion.y += trans_speed; } - - VirtualKeyCode::Up => { - tilt_transform = glm::rotation(-angle_speed, - &glm::vec3(0.0, 1.0, 0.0).cross(&cam_direction)); + VirtualKeyCode::W => { + // Move left relative to camera + let right = glm::vec3(-yaw.sin(), 0.0, yaw.cos()); + camera_position -= right * translation_speed * delta_time; } + VirtualKeyCode::S => { + // Move right relative to camera + let right = glm::vec3(-yaw.sin(), 0.0, yaw.cos()); + camera_position += right * translation_speed * delta_time; + } + VirtualKeyCode::A => { + // Move left relative to camera + let right = glm::vec3(yaw.sin(), 0.0, yaw.cos()); + camera_position -= right * translation_speed * delta_time; + } + VirtualKeyCode::D => { + // Move right relative to camera + let right = glm::vec3(yaw.sin(), 0.0, yaw.cos()); + camera_position += right * translation_speed * delta_time; + } + VirtualKeyCode::Space => { + camera_position.y += translation_speed * delta_time; + } + VirtualKeyCode::LShift => { + camera_position.y -= translation_speed * delta_time; + } + VirtualKeyCode::Down => { - tilt_transform = glm::rotation(angle_speed, - &glm::vec3(0.0, 1.0, 0.0).cross(&cam_direction)); + pitch += rotation_speed * delta_time; + pitch = pitch.clamp( + -std::f32::consts::FRAC_PI_2 + 0.01, + std::f32::consts::FRAC_PI_2 - 0.01 + ); } - VirtualKeyCode::Left => { - yaw_transform = glm::rotation(-angle_speed, &glm::vec3(0.0, 1.0, 0.0)); - cam_direction = glm::rotate_vec3( - &cam_direction, -angle_speed, &glm::vec3(0.0, 1.0, 0.0)); + VirtualKeyCode::Up => { + pitch -= rotation_speed * delta_time; + pitch = pitch.clamp( + -std::f32::consts::FRAC_PI_2 + 0.01, + std::f32::consts::FRAC_PI_2 - 0.01 + ); } VirtualKeyCode::Right => { - yaw_transform = glm::rotation(angle_speed, &glm::vec3(0.0, 1.0, 0.0)); - cam_direction = glm::rotate_vec3( - &cam_direction, angle_speed, &glm::vec3(0.0, 1.0, 0.0)); + yaw += rotation_speed * delta_time; + } + VirtualKeyCode::Left => { + yaw -= rotation_speed * delta_time; } - // default handler: _ => { } } } @@ -323,18 +340,12 @@ fn main() { *delta = (0.0, 0.0); // reset when done } - // == // Please compute camera transforms here (exercise 2 & 3) - motion_transform = glm::identity(); - motion_transform *= glm::translate(&motion_transform, &camera_motion); - motion_transform *= yaw_transform; - motion_transform *= tilt_transform; - transformation = motion_transform * transformation; - - // Reset frame transforms - camera_motion = glm::vec3(0.0, 0.0, 0.0); - yaw_transform = glm::identity(); - tilt_transform = glm::identity(); - + // Build view matrix - keep your original approach + let yaw_matrix = glm::rotation(yaw, &glm::vec3(0.0, 1.0, 0.0)); + let pitch_matrix = glm::rotation(pitch, &glm::vec3(1.0, 0.0, 0.0)); + let rotation_matrix = pitch_matrix * yaw_matrix; + let translation_matrix = glm::translation(&(-camera_position)); + transformation = rotation_matrix * translation_matrix; unsafe { simple_shader.activate();