diff --git a/src/controller.rs b/src/controller.rs index b736d13..9bc1ef5 100644 --- a/src/controller.rs +++ b/src/controller.rs @@ -5,25 +5,31 @@ use crate::camera::Camera; const MAX_ZOOM_LEVEL: f32 = 15.0; pub struct CameraController { - speed: f32, - forward: f32, + zoom_speed: f32, + movement_speed: f32, + + zoom: f32, cursor_start: (f32, f32), movement: (f32, f32), is_moving: bool, - movement_level: (f32, f32), - zoom_level: f32, + + movement_total: (f32, f32), + zoom_total: f32, } impl CameraController { - pub fn new(speed: f32) -> Self { + pub fn new(zoom_speed: f32, movement_speed: f32) -> Self { Self { - speed, - forward: 0.0, + zoom_speed, + movement_speed, + + zoom: 0.0, cursor_start: (0.0, 0.0), movement: (0.0, 0.0), is_moving: false, - movement_level: (0.0, 0.0), - zoom_level: 1.0, + + movement_total: (0.0, 0.0), + zoom_total: 1.0, } } @@ -45,12 +51,12 @@ impl CameraController { self.cursor_start = (position.x as f32, position.y as f32); } - let (x, y) = match self.is_moving { + self.movement = match self.is_moving { true => { - 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; + let x = (-self.cursor_start.0 + position.x as f32) / 1000.0; + let x = x * self.movement_speed; + let y = (self.cursor_start.1 - position.y as f32) / 1000.0; + let y = y * self.movement_speed; (x, y) } false => { @@ -70,17 +76,15 @@ impl CameraController { } }; - self.movement = (x, y); - true } WindowEvent::MouseWheel { delta, .. } => match delta { MouseScrollDelta::LineDelta(_, y) => { - self.zoom_level += y; - if self.zoom_level >= 0.0 && self.zoom_level <= MAX_ZOOM_LEVEL { - self.forward = *y; + self.zoom_total += y; + if self.zoom_total >= 0.0 && self.zoom_total <= MAX_ZOOM_LEVEL { + self.zoom = *y; } - self.zoom_level = self.zoom_level.clamp(0.0, MAX_ZOOM_LEVEL); + self.zoom_total = self.zoom_total.clamp(0.0, MAX_ZOOM_LEVEL); true } _ => false, @@ -95,34 +99,34 @@ impl CameraController { let forward = camera.target - camera.eye; let forward_norm = forward.normalize(); - if self.forward > 0.0 { - camera.eye += forward_norm * self.speed; + if self.zoom > 0.0 { + camera.eye += forward_norm * self.zoom_speed; } - else if self.forward < 0.0 { - camera.eye -= forward_norm * self.speed; + else if self.zoom < 0.0 { + camera.eye -= forward_norm * self.zoom_speed; } - self.movement_level.0 += self.movement.0; - self.movement_level.1 += self.movement.1; + self.movement_total.0 += self.movement.0; + self.movement_total.1 += self.movement.1; - if self.movement_level.0 > -1.0 && self.movement_level.0 < 1.0 { + if self.movement_total.0 > -1.0 && self.movement_total.0 < 1.0 { camera.eye.x += self.movement.0; camera.target.x += self.movement.0; } - if self.movement_level.1 > -1.0 && self.movement_level.1 < 1.0 { + if self.movement_total.1 > -1.0 && self.movement_total.1 < 1.0 { camera.eye.y += self.movement.1; camera.target.y += self.movement.1; } - self.movement_level.0 = self.movement_level.0.clamp(-1.0, 1.0); - self.movement_level.1 = self.movement_level.1.clamp(-1.0, 1.0); + self.movement_total.0 = self.movement_total.0.clamp(-1.0, 1.0); + self.movement_total.1 = self.movement_total.1.clamp(-1.0, 1.0); - self.forward = 0.0; + self.zoom = 0.0; } pub fn reset_camera(&mut self, camera: &mut Camera) { camera.reset_camera(); - self.zoom_level = 1.0; + self.zoom_total = 1.0; } } diff --git a/src/state.rs b/src/state.rs index d020d81..8ee112c 100644 --- a/src/state.rs +++ b/src/state.rs @@ -15,6 +15,9 @@ use crate::{ vertex::Vertex, }; +const ZOOM_SPEED: f32 = 0.1; +const MOVE_SPEED: f32 = 0.0005; + const VERTICES: &[Vertex] = &[ Vertex { position: [-1.0, 1.0], @@ -112,7 +115,7 @@ impl<'a> State<'a> { }; let (camera, camera_info) = Camera::new(&config, &device); - let camera_controller = CameraController::new(0.1); + let camera_controller = CameraController::new(ZOOM_SPEED, MOVE_SPEED); let shader = device.create_shader_module(wgpu::include_wgsl!("shader.wgsl"));