From 24b33f8146c245a7e7aa28ffcd812a8cb536e6c3 Mon Sep 17 00:00:00 2001 From: numzero Date: Sun, 22 Sep 2024 15:41:05 +0300 Subject: [PATCH] Basic camera control --- src/bin/wireframe/main.rs | 46 +++++++++++++++++++++++++++++---------- 1 file changed, 35 insertions(+), 11 deletions(-) diff --git a/src/bin/wireframe/main.rs b/src/bin/wireframe/main.rs index e68cced..b6cdd8f 100644 --- a/src/bin/wireframe/main.rs +++ b/src/bin/wireframe/main.rs @@ -1,4 +1,4 @@ -use glam::{mat4, vec2, vec3, vec4, Mat4, Vec3}; +use glam::{mat4, vec2, vec3, vec4, Mat4, Quat, Vec3}; use glium::{ backend::glutin::SimpleWindowBuilder, implement_vertex, uniform, @@ -40,7 +40,9 @@ fn main() { ]; let vertex_buffer = VertexBuffer::new(&display, &shape).unwrap(); - let mut t: f32 = -0.5; + let mut cur_pos = vec2(0., 0.); + let mut drag_start = None; + let mut cam_rot = Quat::IDENTITY; #[allow(deprecated)] event_loop @@ -52,19 +54,12 @@ fn main() { * std::f32::consts::SQRT_2; let proj = make_proj_matrix(vec3(size.x, size.y, 2.), (0.125, 1024.125)); - t += 0.02; - let x = t.sin() * 0.5; - let mdl = mat4( - vec4(1., 0., 0., 0.), - vec4(0., 1., 0., 0.), - vec4(0., 0., 1., 0.), - vec4(x, 0., 0., 1.), - ); + let view = Mat4::from_quat(cam_rot); let mut target = display.draw(); target.clear_color(0.0, 0.0, 0.2, 1.0); - let mvp = proj * mdl; + let mvp = proj * view; let uniforms = uniform! { mvp: mvp.to_cols_array_2d(), }; @@ -81,6 +76,35 @@ fn main() { target.finish().unwrap(); } + WindowEvent::MouseInput { + device_id: _, + state, + button, + } => match button { + winit::event::MouseButton::Left => match state { + winit::event::ElementState::Pressed => { + drag_start = Some((cur_pos, cam_rot)) + } + winit::event::ElementState::Released => drag_start = None, + }, + _ => {} + }, + + WindowEvent::CursorMoved { + device_id: _, + position, + } => { + let size = window.inner_size(); + let size = vec2(size.width as f32, size.height as f32); + cur_pos = vec2(position.x as f32, position.y as f32) / size; + if let Some((drag_start, drag_init_rot)) = drag_start { + let offset = cur_pos - drag_start; + cam_rot = Quat::from_euler(glam::EulerRot::YXZ, offset.x, offset.y, 0.) + * drag_init_rot; + window.request_redraw(); + } + } + WindowEvent::Resized(window_size) => { display.resize(window_size.into()); }