2024-11-04 22:09:33 +02:00
|
|
|
use winit::{
|
2024-11-05 01:23:56 +02:00
|
|
|
event::{ElementState, KeyEvent, MouseButton, MouseScrollDelta, WindowEvent},
|
2024-11-04 22:09:33 +02:00
|
|
|
keyboard::{KeyCode, PhysicalKey},
|
|
|
|
};
|
|
|
|
|
|
|
|
use crate::camera::Camera;
|
|
|
|
|
|
|
|
pub struct CameraController {
|
|
|
|
speed: f32,
|
|
|
|
forward: f32,
|
2024-11-05 01:23:56 +02:00
|
|
|
cursor_start: (f32, f32),
|
|
|
|
movement: (f32, f32),
|
|
|
|
is_moving: bool,
|
2024-11-04 22:09:33 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
impl CameraController {
|
|
|
|
pub fn new(speed: f32) -> Self {
|
|
|
|
Self {
|
|
|
|
speed,
|
|
|
|
forward: 0.0,
|
2024-11-05 01:23:56 +02:00
|
|
|
cursor_start: (0.0, 0.0),
|
|
|
|
movement: (0.0, 0.0),
|
|
|
|
is_moving: false,
|
2024-11-04 22:09:33 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn process_events(&mut self, event: &WindowEvent) -> bool {
|
|
|
|
match event {
|
2024-11-05 01:23:56 +02:00
|
|
|
WindowEvent::MouseInput { state, button, .. } => {
|
|
|
|
if state.is_pressed() && *button == MouseButton::Left {
|
|
|
|
self.is_moving = true;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
self.is_moving = false;
|
|
|
|
self.movement = (0.0, 0.0);
|
|
|
|
}
|
|
|
|
false
|
|
|
|
}
|
2024-11-04 22:09:33 +02:00
|
|
|
WindowEvent::CursorMoved { position, .. } => {
|
2024-11-05 01:23:56 +02:00
|
|
|
if !self.is_moving {
|
|
|
|
self.cursor_start = (position.x as f32, position.y as f32);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
let x = -self.cursor_start.0 + position.x as f32;
|
|
|
|
let x = x * 0.000001;
|
|
|
|
let y = self.cursor_start.1 - position.y as f32;
|
|
|
|
let y = y * 0.000001;
|
|
|
|
|
|
|
|
self.movement = (x, y);
|
|
|
|
}
|
2024-11-04 22:09:33 +02:00
|
|
|
true
|
|
|
|
}
|
|
|
|
WindowEvent::MouseWheel { delta, .. } => match delta {
|
|
|
|
MouseScrollDelta::LineDelta(_, y) => {
|
|
|
|
self.forward = *y;
|
|
|
|
true
|
|
|
|
}
|
|
|
|
_ => false,
|
|
|
|
},
|
|
|
|
_ => false,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn update_camera(&mut self, camera: &mut Camera) {
|
|
|
|
use cgmath::InnerSpace;
|
|
|
|
|
|
|
|
let forward = camera.target - camera.eye;
|
|
|
|
let forward_norm = forward.normalize();
|
|
|
|
|
|
|
|
if self.forward > 0.0 {
|
|
|
|
camera.eye += forward_norm * self.speed;
|
|
|
|
}
|
|
|
|
else if self.forward < 0.0 {
|
|
|
|
camera.eye -= forward_norm * self.speed;
|
|
|
|
}
|
|
|
|
|
2024-11-05 01:23:56 +02:00
|
|
|
if self.is_moving {
|
|
|
|
camera.eye.x += self.movement.0;
|
|
|
|
camera.eye.y += self.movement.1;
|
2024-11-04 22:09:33 +02:00
|
|
|
|
2024-11-05 01:23:56 +02:00
|
|
|
camera.target.x += self.movement.0;
|
|
|
|
camera.target.y += self.movement.1;
|
|
|
|
}
|
2024-11-04 22:09:33 +02:00
|
|
|
|
|
|
|
self.forward = 0.0;
|
|
|
|
}
|
|
|
|
}
|