diff --git a/src/bin/wireframe/main.rs b/src/bin/wireframe/main.rs index 5de36f2..4aa9c27 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, Vec2, Vec3}; +use glam::{mat4, vec2, vec3, vec4, Mat4, Quat, Vec3}; use glium::{ backend::{glutin::SimpleWindowBuilder, Facade}, glutin::config::ConfigTemplateBuilder, @@ -29,40 +29,6 @@ struct Vertex { } implement_vertex!(Vertex, position); -struct DragCtl { - state: S, - ctl: Option<(Vec2, S)>, -} - -impl DragCtl { - pub fn new(state: S) -> Self { - Self { state, ctl: None } - } - - pub fn state(&self) -> S { - self.state - } - - pub fn on_button(&mut self, pos: Vec2, state: ElementState) { - match state { - ElementState::Pressed => { - if self.ctl.is_none() { - self.ctl = Some((pos, self.state)); - } - } - ElementState::Released => { - self.ctl = None; - } - } - } - - pub fn on_move(&mut self, pos: Vec2, f: impl FnOnce(S, Vec2) -> S) { - if let Some((old_pos, old_state)) = self.ctl { - self.state = f(old_state, pos - old_pos); - } - } -} - struct Wireframe { color: Vec3, mode: PrimitiveType, @@ -112,6 +78,15 @@ static KEYS_MOVE: &'static [(PhysicalKey, Vec3)] = &[ (PhysicalKey::Code(KeyCode::ShiftLeft), vec3(0., 0., -1.)), ]; +static KEYS_ROTATE: &'static [(PhysicalKey, Vec3)] = &[ + (PhysicalKey::Code(KeyCode::Numpad9), vec3(1., 0., 0.)), + (PhysicalKey::Code(KeyCode::Numpad7), vec3(-1., 0., 0.)), + (PhysicalKey::Code(KeyCode::Numpad5), vec3(0., 1., 0.)), + (PhysicalKey::Code(KeyCode::Numpad8), vec3(0., -1., 0.)), + (PhysicalKey::Code(KeyCode::Numpad4), vec3(0., 0., 1.)), + (PhysicalKey::Code(KeyCode::Numpad6), vec3(0., 0., -1.)), +]; + fn main() { let event_loop = EventLoop::builder().build().unwrap(); let cfg = ConfigTemplateBuilder::new().with_multisampling(8); @@ -129,9 +104,8 @@ 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 cur_pos = vec2(0., 0.); let mut cam_pos = rot * vec3(-200., 0., 50.); - let mut cam_rot = DragCtl::new(rot); + let mut cam_rot = rot; let mut t1 = Instant::now(); @@ -150,7 +124,13 @@ fn main() { .iter() .filter_map(|(key, dir)| keys_pressed.contains(key).then_some(dir)) .sum(); - cam_pos += 100. * dt * (cam_rot.state() * v); + 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); let size = window.inner_size(); let size = vec2(size.width as f32, size.height as f32).normalize() @@ -165,7 +145,7 @@ fn main() { ); let view = my_to_gl - * Mat4::from_quat(cam_rot.state().inverse()) + * Mat4::from_quat(cam_rot.inverse()) * Mat4::from_translation(-cam_pos); let mut target = display.draw(); @@ -201,28 +181,6 @@ fn main() { target.finish().unwrap(); } - WindowEvent::MouseInput { - device_id: _, - state, - button, - } => match button { - winit::event::MouseButton::Right => cam_rot.on_button(cur_pos, state), - _ => {} - }, - - 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.length(); - cam_rot.on_move(cur_pos, |init, off| { - window.request_redraw(); - init * Quat::from_euler(glam::EulerRot::ZYX, 2. * off.x, -2. * off.y, 0.) - }); - } - WindowEvent::KeyboardInput { device_id: _, event,