From 0f8ef18123c880ac93b7791cfb27d3661c7406b9 Mon Sep 17 00:00:00 2001 From: hut Date: Fri, 5 Apr 2024 23:38:20 +0200 Subject: [PATCH] implement zooming on right click --- README.md | 2 +- src/camera.rs | 20 +++++++++++++++++--- src/settings.rs | 8 ++++++++ 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index b4f052d..6aa25fe 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,7 @@ Augmented Reality features: (toggle with TAB) - Heads-Up Display of physical and biological statistics - Low Light Amplification - View object information on left click -- Zoom on right click [planned] +- Zoom on right click - Customizable avatar overlay [planned] - Distance and time of arrival to targets [planned] - Hackable by malicious agents [planned] diff --git a/src/camera.rs b/src/camera.rs index 3863027..afe23c5 100644 --- a/src/camera.rs +++ b/src/camera.rs @@ -92,11 +92,24 @@ pub fn sync_camera_to_player( pub fn update_fov( q_player: Query<&actor::LifeForm, With>, + mouse_input: Res>, + mut settings: ResMut, mut q_camera: Query<&mut Projection, With>, ) { if let (Ok(lifeform), Ok(mut projection)) = (q_player.get_single(), q_camera.get_single_mut()) { - let fov = (lifeform.adrenaline.powf(3.0) * 45.0 + 45.0).to_radians(); + let fov: f32; + if mouse_input.pressed(settings.key_zoom) { + fov = settings.zoom_fov_radians; + if !settings.is_zooming { + settings.is_zooming = true; + } + } else { + fov = (lifeform.adrenaline.powf(3.0) * 45.0 + 45.0).to_radians(); + if settings.is_zooming { + settings.is_zooming = false; + } + }; *projection = Projection::Perspective(PerspectiveProjection { fov: fov, ..default() }); } } @@ -251,7 +264,8 @@ pub fn apply_input_to_player( let mut play_reactionwheel_sound = false; let mut mouse_delta = Vec2::ZERO; let mut pitch_yaw_rot = Vec3::ZERO; - let mouseless_sensitivity = 40.0; + let sensitivity_factor = if settings.is_zooming { settings.zoom_sensitivity_factor } else { 1.0 }; + let mouseless_sensitivity = 40.0 * sensitivity_factor; if key_input.pressed(settings.key_mouseup) { pitch_yaw_rot[0] -= mouseless_sensitivity; } @@ -284,7 +298,7 @@ pub fn apply_input_to_player( let angular_slowdown: f64 = (2.0 - engine.reaction_wheels.powf(0.01).clamp(1.001, 1.1)) as f64; if pitch_yaw_rot.length_squared() > 0.0001 { play_reactionwheel_sound = true; - pitch_yaw_rot *= settings.mouse_sensitivity * engine.reaction_wheels; + pitch_yaw_rot *= settings.mouse_sensitivity * sensitivity_factor * engine.reaction_wheels; torque.apply_torque(DVec3::from( player_transform.rotation * Vec3::new( pitch_yaw_rot[0] * 2.0, diff --git a/src/settings.rs b/src/settings.rs index e486684..8131a43 100644 --- a/src/settings.rs +++ b/src/settings.rs @@ -9,11 +9,15 @@ pub struct Settings { pub volume_sfx: u8, pub volume_music: u8, pub mouse_sensitivity: f32, + pub zoom_fov_radians: f32, + pub zoom_sensitivity_factor: f32, pub font_size_hud: f32, pub font_size_conversations: f32, pub hud_active: bool, + pub is_zooming: bool, pub third_person: bool, pub key_selectobject: MouseButton, + pub key_zoom: MouseButton, pub key_togglehud: KeyCode, pub key_exit: KeyCode, pub key_restart: KeyCode, @@ -83,11 +87,15 @@ impl Default for Settings { volume_sfx: 100, volume_music: 100, mouse_sensitivity: 0.5, + zoom_fov_radians: 20.0f32.to_radians(), + zoom_sensitivity_factor: 0.1, font_size_hud: 32.0, font_size_conversations: 32.0, hud_active: false, + is_zooming: false, third_person: false, key_selectobject: MouseButton::Left, + key_zoom: MouseButton::Right, key_togglehud: KeyCode::Tab, key_exit: KeyCode::Escape, key_restart: KeyCode::F12,