From ddccfd3a804159dff6f497cad7e495ac5018a1f6 Mon Sep 17 00:00:00 2001 From: numzero Date: Sun, 22 Sep 2024 19:44:44 +0300 Subject: [PATCH] Simplify camera control --- src/bin/wireframe/main.rs | 40 +++++++++++++-------------------------- 1 file changed, 13 insertions(+), 27 deletions(-) diff --git a/src/bin/wireframe/main.rs b/src/bin/wireframe/main.rs index f14f7af..fcd2abd 100644 --- a/src/bin/wireframe/main.rs +++ b/src/bin/wireframe/main.rs @@ -91,15 +91,9 @@ fn main() { ]; let vertex_buffer = VertexBuffer::new(&display, &shape).unwrap(); - let rot = Quat::from_euler( - glam::EulerRot::YXZ, - std::f32::consts::FRAC_PI_4, - std::f32::consts::FRAC_PI_6, - 0., - ); + let rot = Quat::from_euler(glam::EulerRot::YXZ, std::f32::consts::FRAC_PI_4, 0., 0.); let mut cur_pos = vec2(0., 0.); - let mut cam_pos = DragCtl::new(rot * vec3(0., 0., -4.)); - let mut cam_pos_2 = Vec3::ZERO; + let mut cam_pos = rot * vec3(0., 1., -4.); let mut cam_rot = DragCtl::new(rot); let mut t1 = Instant::now(); @@ -116,24 +110,21 @@ fn main() { dt.as_secs_f32() }; let v: Vec3 = { - let ctl_left = - keys_pressed.contains(&PhysicalKey::Code(KeyCode::KeyA)) as i32 as f32; - let ctl_right = - keys_pressed.contains(&PhysicalKey::Code(KeyCode::KeyD)) as i32 as f32; - let ctl_fwd = - keys_pressed.contains(&PhysicalKey::Code(KeyCode::KeyW)) as i32 as f32; - let ctl_bwd = - keys_pressed.contains(&PhysicalKey::Code(KeyCode::KeyS)) as i32 as f32; + let ctl_left = keys_pressed.contains(&PhysicalKey::Code(KeyCode::KeyA)); + let ctl_right = keys_pressed.contains(&PhysicalKey::Code(KeyCode::KeyD)); + let ctl_fwd = keys_pressed.contains(&PhysicalKey::Code(KeyCode::KeyW)); + let ctl_bwd = keys_pressed.contains(&PhysicalKey::Code(KeyCode::KeyS)); [ - ctl_left * vec3(-1., 0., 0.), - ctl_right * vec3(1., 0., 0.), - ctl_fwd * vec3(0., 0., 1.), - ctl_bwd * vec3(0., 0., -1.), + (ctl_left, vec3(-1., 0., 0.)), + (ctl_right, vec3(1., 0., 0.)), + (ctl_fwd, vec3(0., 0., 1.)), + (ctl_bwd, vec3(0., 0., -1.)), ] .into_iter() + .filter_map(|(ctl, dir)| ctl.then_some(dir)) .sum() }; - cam_pos_2 += 5. * dt * (cam_rot.state() * v); + cam_pos += 5. * dt * (cam_rot.state() * v); let size = window.inner_size(); let size = vec2(size.width as f32, size.height as f32).normalize() @@ -141,7 +132,7 @@ fn main() { let proj = make_proj_matrix(vec3(size.x, size.y, 2.), (0.125, 1024.125)); let view = Mat4::from_quat(cam_rot.state().inverse()) - * Mat4::from_translation(-(cam_pos.state() + cam_pos_2)); + * Mat4::from_translation(-cam_pos); let mut target = display.draw(); target.clear_color(0.0, 0.0, 0.2, 1.0); @@ -168,7 +159,6 @@ fn main() { state, button, } => match button { - winit::event::MouseButton::Left => cam_pos.on_button(cur_pos, state), winit::event::MouseButton::Right => cam_rot.on_button(cur_pos, state), _ => {} }, @@ -180,10 +170,6 @@ fn main() { 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_pos.on_move(cur_pos, |init, off| { - window.request_redraw(); - init - 4. * (cam_rot.state() * vec3(off.x, -off.y, 0.)) - }); cam_rot.on_move(cur_pos, |init, off| { window.request_redraw(); init * Quat::from_euler(glam::EulerRot::YXZ, -2. * off.x, -2. * off.y, 0.)