Reduce controls to keyboard-only

Simplicity first!
This commit is contained in:
numzero 2024-09-23 19:16:12 +03:00
parent 24b1a07f28
commit d47b904905

View File

@ -1,6 +1,6 @@
use std::{collections::HashSet, time::Instant}; 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::{ use glium::{
backend::{glutin::SimpleWindowBuilder, Facade}, backend::{glutin::SimpleWindowBuilder, Facade},
glutin::config::ConfigTemplateBuilder, glutin::config::ConfigTemplateBuilder,
@ -29,40 +29,6 @@ struct Vertex {
} }
implement_vertex!(Vertex, position); implement_vertex!(Vertex, position);
struct DragCtl<S> {
state: S,
ctl: Option<(Vec2, S)>,
}
impl<S: Copy> DragCtl<S> {
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 { struct Wireframe {
color: Vec3, color: Vec3,
mode: PrimitiveType, mode: PrimitiveType,
@ -112,6 +78,15 @@ static KEYS_MOVE: &'static [(PhysicalKey, Vec3)] = &[
(PhysicalKey::Code(KeyCode::ShiftLeft), vec3(0., 0., -1.)), (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() { fn main() {
let event_loop = EventLoop::builder().build().unwrap(); let event_loop = EventLoop::builder().build().unwrap();
let cfg = ConfigTemplateBuilder::new().with_multisampling(8); let cfg = ConfigTemplateBuilder::new().with_multisampling(8);
@ -129,9 +104,8 @@ fn main() {
let scene = prepare_scene(&display); let scene = prepare_scene(&display);
let rot = Quat::from_euler(glam::EulerRot::ZYX, std::f32::consts::FRAC_PI_4, 0., 0.); 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_pos = rot * vec3(-200., 0., 50.);
let mut cam_rot = DragCtl::new(rot); let mut cam_rot = rot;
let mut t1 = Instant::now(); let mut t1 = Instant::now();
@ -150,7 +124,13 @@ fn main() {
.iter() .iter()
.filter_map(|(key, dir)| keys_pressed.contains(key).then_some(dir)) .filter_map(|(key, dir)| keys_pressed.contains(key).then_some(dir))
.sum(); .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 = window.inner_size();
let size = vec2(size.width as f32, size.height as f32).normalize() let size = vec2(size.width as f32, size.height as f32).normalize()
@ -165,7 +145,7 @@ fn main() {
); );
let view = my_to_gl let view = my_to_gl
* Mat4::from_quat(cam_rot.state().inverse()) * Mat4::from_quat(cam_rot.inverse())
* Mat4::from_translation(-cam_pos); * Mat4::from_translation(-cam_pos);
let mut target = display.draw(); let mut target = display.draw();
@ -201,28 +181,6 @@ fn main() {
target.finish().unwrap(); 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 { WindowEvent::KeyboardInput {
device_id: _, device_id: _,
event, event,