|
|
@@ -1,18 +1,58 @@
|
|
|
use glam::{Vec3};
|
|
|
-use winit::event::WindowEvent;
|
|
|
+use winit::event::{ElementState, KeyEvent, WindowEvent};
|
|
|
use winit::event::WindowEvent::KeyboardInput;
|
|
|
+use winit::keyboard::{KeyCode, PhysicalKey};
|
|
|
+
|
|
|
+
|
|
|
+use super::camera_struct::Camera;
|
|
|
struct CameraController {
|
|
|
speed: f32,
|
|
|
+ is_up_pressed: bool,
|
|
|
+ is_down_pressed: bool,
|
|
|
is_forward_pressed: bool,
|
|
|
is_backward_pressed: bool,
|
|
|
is_left_pressed: bool,
|
|
|
is_right_pressed: bool,
|
|
|
}
|
|
|
|
|
|
+impl CameraController {
|
|
|
+ fn update_camera(&self, camera: &mut Camera) {
|
|
|
+ // Calculate direction vector
|
|
|
+ let forward = camera.target - camera.eye;
|
|
|
+ let forward_norm = forward.normalize();
|
|
|
+
|
|
|
+ // Forward/backward movement
|
|
|
+ if self.is_forward_pressed && forward.length() > self.speed {
|
|
|
+ camera.eye += forward_norm * self.speed;
|
|
|
+ }
|
|
|
+ if self.is_backward_pressed {
|
|
|
+ camera.eye -= forward_norm * self.speed;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Right vector using cross product
|
|
|
+ let right = forward_norm.cross(camera.up);
|
|
|
+
|
|
|
+ // Recalculate forward vector (optional)
|
|
|
+ let forward = camera.target - camera.eye;
|
|
|
+
|
|
|
+ // Left/right movement - maintain distance to target
|
|
|
+ if self.is_right_pressed {
|
|
|
+ let new_forward = (forward + right * self.speed).normalize();
|
|
|
+ camera.eye = camera.target - new_forward * forward.length();
|
|
|
+ }
|
|
|
+ if self.is_left_pressed {
|
|
|
+ let new_forward = (forward - right * self.speed).normalize();
|
|
|
+ camera.eye = camera.target - new_forward * forward.length();
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
impl CameraController {
|
|
|
fn new(speed: f32) -> Self {
|
|
|
Self {
|
|
|
speed,
|
|
|
+ is_up_pressed: false,
|
|
|
+ is_down_pressed: false,
|
|
|
is_forward_pressed: false,
|
|
|
is_backward_pressed: false,
|
|
|
is_left_pressed: false,
|
|
|
@@ -23,15 +63,24 @@ impl CameraController {
|
|
|
fn process_events(&mut self, event: &WindowEvent) -> bool {
|
|
|
match event {
|
|
|
WindowEvent::KeyboardInput {
|
|
|
- input: KeyboardInput {
|
|
|
- state,
|
|
|
- virtual_keycode: Some(keycode),
|
|
|
- ..
|
|
|
- },
|
|
|
+ event:
|
|
|
+ KeyEvent {
|
|
|
+ state,
|
|
|
+ physical_key: PhysicalKey::Code(keycode),
|
|
|
+ ..
|
|
|
+ },
|
|
|
..
|
|
|
} => {
|
|
|
let is_pressed = *state == ElementState::Pressed;
|
|
|
match keycode {
|
|
|
+ KeyCode::Space => {
|
|
|
+ self.is_up_pressed = is_pressed;
|
|
|
+ true
|
|
|
+ }
|
|
|
+ KeyCode::ShiftLeft => {
|
|
|
+ self.is_down_pressed = is_pressed;
|
|
|
+ true
|
|
|
+ }
|
|
|
KeyCode::KeyW | KeyCode::ArrowUp => {
|
|
|
self.is_forward_pressed = is_pressed;
|
|
|
true
|
|
|
@@ -54,34 +103,4 @@ impl CameraController {
|
|
|
_ => false,
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- fn update_camera(&self, camera: &mut Camera) {
|
|
|
- // Calculate direction vector
|
|
|
- let forward = camera.target - camera.eye;
|
|
|
- let forward_norm = forward.normalize();
|
|
|
-
|
|
|
- // Forward/backward movement
|
|
|
- if self.is_forward_pressed && forward.length() > self.speed {
|
|
|
- camera.eye += forward_norm * self.speed;
|
|
|
- }
|
|
|
- if self.is_backward_pressed {
|
|
|
- camera.eye -= forward_norm * self.speed;
|
|
|
- }
|
|
|
-
|
|
|
- // Right vector using cross product
|
|
|
- let right = forward_norm.cross(camera.up);
|
|
|
-
|
|
|
- // Recalculate forward vector (optional)
|
|
|
- let forward = camera.target - camera.eye;
|
|
|
-
|
|
|
- // Left/right movement - maintain distance to target
|
|
|
- if self.is_right_pressed {
|
|
|
- let new_forward = (forward + right * self.speed).normalize();
|
|
|
- camera.eye = camera.target - new_forward * forward.length();
|
|
|
- }
|
|
|
- if self.is_left_pressed {
|
|
|
- let new_forward = (forward - right * self.speed).normalize();
|
|
|
- camera.eye = camera.target - new_forward * forward.length();
|
|
|
- }
|
|
|
- }
|
|
|
}
|