use cgmath::*;
use winit::keyboard::KeyCode;
use crate::primitives::cameras::Camera;
#[derive(Debug)]
pub struct CameraController {
pub speed: f32,
is_forward_pressed: bool, is_backward_pressed: bool,
is_left_pressed: bool, is_right_pressed: bool,
is_up_pressed: bool, is_down_pressed: bool
}
impl CameraController {
pub fn new(speed: f32) -> Self {
Self {
speed,
is_forward_pressed: false, is_backward_pressed: false,
is_left_pressed: false, is_right_pressed: false,
is_up_pressed: false, is_down_pressed: false
}
}
pub fn key_input(&mut self, key_code: KeyCode, pressed: bool) {
match key_code {
KeyCode::KeyW => self.set_forward(pressed),
KeyCode::KeyS => self.set_backward(pressed),
KeyCode::KeyA => self.set_left(pressed),
KeyCode::KeyD => self.set_right(pressed),
KeyCode::ShiftLeft => self.set_up(pressed),
KeyCode::ControlLeft => self.set_down(pressed),
_ => {}
}
}
pub fn set_forward(&mut self, pressed: bool) { self.is_forward_pressed = pressed; }
pub fn set_backward(&mut self, pressed: bool) { self.is_backward_pressed = pressed; }
pub fn set_left(&mut self, pressed: bool) { self.is_left_pressed = pressed; }
pub fn set_right(&mut self, pressed: bool) { self.is_right_pressed = pressed; }
pub fn set_up(&mut self, pressed: bool) { self.is_up_pressed = pressed; }
pub fn set_down(&mut self, pressed: bool) { self.is_down_pressed = pressed; }
pub fn update_camera(&self, camera: &mut Camera) {
let mut forward = camera.rotation * Vector3::unit_z();
forward.x *= -1.0;
forward.y *= -1.0;
if self.is_forward_pressed { camera.position += forward * -self.speed; }
else if self.is_backward_pressed { camera.position += forward * self.speed; }
if self.is_up_pressed { camera.rotation = Quaternion::from_angle_x(cgmath::Deg(-5.0 * self.speed)) * camera.rotation; }
else if self.is_down_pressed { camera.rotation = Quaternion::from_angle_x(cgmath::Deg(5.0 * self.speed)) * camera.rotation; }
if self.is_left_pressed { camera.rotation = Quaternion::from_angle_y(cgmath::Deg(-5.0 * self.speed)) * camera.rotation; }
else if self.is_right_pressed { camera.rotation = Quaternion::from_angle_y(cgmath::Deg(5.0 * self.speed)) * camera.rotation; }
}
}