use bevy::prelude::*; use bevy::input::mouse::MouseMotion; use bevy::window::PrimaryWindow; use std::f32::consts::*; use crate::{settings, audio, actor}; pub struct CameraControllerPlugin; impl Plugin for CameraControllerPlugin { fn build(&self, app: &mut App) { app.add_systems(Update, run_camera_controller); } } // Based on Valorant's default sensitivity, not entirely sure why it is exactly 1.0 / 180.0, // but I'm guessing it is a misunderstanding between degrees/radians and then sticking with // it because it felt nice. pub const RADIANS_PER_DOT: f32 = 1.0 / 180.0; #[derive(Component)] pub struct CameraController { pub enabled: bool, pub initialized: bool, pub sensitivity: f32, pub move_speed: f32, pub friction: f32, pub pitch: f32, pub yaw: f32, pub velocity: Vec3, } impl Default for CameraController { fn default() -> Self { Self { enabled: true, initialized: false, sensitivity: 0.5, move_speed: 30.0, friction: 0.05, pitch: 1.0, // pitch=0/yaw=0 -> face sun yaw: 0.3, velocity: Vec3::ZERO, } } } #[allow(clippy::too_many_arguments)] fn run_camera_controller( time: Res