From 082d9095991d445ad839e5ac3eb94bc3bc772951 Mon Sep 17 00:00:00 2001 From: Bernie Innocenti Date: Sat, 8 Apr 2017 21:31:35 -0400 Subject: [PATCH] Implement mouse panning and streamline keyboard movement. --- main.rs | 24 +++++++++-------- support/camera.rs | 68 ++++++++++++++++++++++++++--------------------- support/vec3.rs | 7 +++++ 3 files changed, 57 insertions(+), 42 deletions(-) diff --git a/main.rs b/main.rs index d7e8c00..5507f4a 100644 --- a/main.rs +++ b/main.rs @@ -110,17 +110,6 @@ fn main() { KeyboardInput(Pressed, _, Some(VirtualKeyCode::B)) => { bounding_box_enabled ^= true; }, - KeyboardInput(Pressed, _, Some(VirtualKeyCode::F)) => { - fullscreen ^= true; - if fullscreen { - glutin::WindowBuilder::new() - .with_fullscreen(glutin::get_primary_monitor()) - .rebuild_glium(&display).unwrap(); - } else { - glutin::WindowBuilder::new() - .rebuild_glium(&display).unwrap(); - } - }, KeyboardInput(Pressed, _, Some(VirtualKeyCode::P)) => { pause ^= true; }, @@ -133,6 +122,19 @@ fn main() { KeyboardInput(Pressed, _, Some(VirtualKeyCode::F10)) => { screenshot(&display); }, + KeyboardInput(Pressed, _, Some(VirtualKeyCode::F11)) => { + fullscreen ^= true; + if fullscreen { + // Not implemented on Linux + glutin::WindowBuilder::new() + .with_fullscreen(glutin::get_primary_monitor()) + .with_depth_buffer(24) + .rebuild_glium(&display).unwrap(); + } else { + //glutin::WindowBuilder::new() + // .rebuild_glium(&display).unwrap(); + } + }, ev => camera.process_input(&ev), } } diff --git a/support/camera.rs b/support/camera.rs index 67beeac..fe1398d 100644 --- a/support/camera.rs +++ b/support/camera.rs @@ -1,7 +1,7 @@ extern crate glutin; use glutin::ElementState::{Pressed, Released}; -use glutin::Event::KeyboardInput; +use glutin::Event::{KeyboardInput, MouseMoved}; use glutin::VirtualKeyCode; use support::vec3::Vec3; use support::vec3::norm; @@ -27,6 +27,11 @@ pub struct CameraState { turning_left: bool, turning_down: bool, turning_right: bool, + + mouse_x: i32, + mouse_y: i32, + rel_x: i32, + rel_y: i32, } impl CameraState { @@ -109,52 +114,53 @@ impl CameraState { s.2 * f.0 - s.0 * f.2, s.0 * f.1 - s.1 * f.0); + let walk_speed = 0.01; + let strife_speed = 0.02; + let pan_speed = 0.01; + if self.moving_up { - self.pos += u * 0.01; - } - if self.moving_left { - self.pos.0 -= s.0 * 0.01; - self.pos.1 -= s.1 * 0.01; - self.pos.2 -= s.2 * 0.01; + self.pos += u * strife_speed; } if self.moving_down { - self.pos.0 -= u.0 * 0.01; - self.pos.1 -= u.1 * 0.01; - self.pos.2 -= u.2 * 0.01; + self.pos -= u * strife_speed; + } + if self.moving_left { + self.pos -= s * strife_speed; } if self.moving_right { - self.pos += s * 0.01; + self.pos += s * strife_speed; } if self.moving_forward { - self.pos += f * 0.01; + self.pos += f * walk_speed; } if self.moving_backward { - self.pos.0 -= f.0 * 0.01; - self.pos.1 -= f.1 * 0.01; - self.pos.2 -= f.2 * 0.01; - } - if self.turning_left { - let a: f32 = 0.05; - self.dir = Vec3(f.0 * a.cos() + f.2 * a.sin(), f.1, - f.0 * a.sin() + f.2 * a.cos()); - } - if self.turning_right { - let a: f32 = -0.05; - self.dir = Vec3(f.0 * a.cos() + f.2 * a.sin(), f.1, - f.0 * a.sin() + f.2 * a.cos()); - } - if self.turning_up { - let a: f32 = -0.05; - self.dir = Vec3(f.0, f.1 * a.cos() - f.2 * a.sin(), f.1 * a.sin() + f.2 * a.cos()); - } - if self.turning_down { - let a: f32 = 0.05; - self.dir = Vec3(f.0, f.1 * a.cos() - f.2 * a.sin(), f.1 * a.sin() + f.2 * a.cos()); + self.pos -= f * walk_speed; } + + if self.turning_left { self.rel_x -= 2; } + if self.turning_right { self.rel_x += 2; } + if self.turning_up { self.rel_y -= 2; } + if self.turning_down { self.rel_y += 2; } + let vx = -pan_speed * self.rel_x as f32; + let vy = -pan_speed * self.rel_y as f32; + self.dir = Vec3(f.0 * vx.cos() + f.2 * vx.sin(), + f.1 * vy.cos() - f.2 * vy.sin(), + f.1 * vy.sin() - f.0 * vx.sin() + f.2 * vx.cos() * vy.cos()); + self.rel_x = 0; + self.rel_y = 0; + //println!("camera_pos = {:?}", self.pos); //println!("camera_dir = {:?}", self.dir); } pub fn process_input(&mut self, event: &glutin::Event) { match event { + &MouseMoved(x, y) => { + self.rel_x += x - self.mouse_x; + self.rel_y += y - self.mouse_y; + self.mouse_x = x; + self.mouse_y = y; + } &KeyboardInput(Pressed, _, Some(VirtualKeyCode::Up)) => { self.moving_up = true; }, diff --git a/support/vec3.rs b/support/vec3.rs index 10820fb..a515bde 100644 --- a/support/vec3.rs +++ b/support/vec3.rs @@ -4,6 +4,7 @@ use std::f32; use std::ops::Add; use std::ops::AddAssign; use std::ops::Sub; +use std::ops::SubAssign; use std::ops::Mul; #[derive(Default, PartialEq, Debug, Clone, Copy)] @@ -29,6 +30,12 @@ impl Sub for Vec3 { } } +impl SubAssign for Vec3 { + fn sub_assign(&mut self, other: Vec3) { + *self = Vec3(self.0 - other.0, self.1 - other.1, self.2 - other.2) + } +} + impl Mul for Vec3 { type Output = Vec3; fn mul(self, f: f32) -> Vec3 { -- 2.25.1