mouse movement now changes player orientation relatively, not absolutely

This commit is contained in:
yuni 2024-03-30 16:32:42 +01:00
parent 0456b8506c
commit 6e3d958638

View file

@ -24,25 +24,6 @@ impl Plugin for CameraControllerPlugin {
// it because it felt nice. // it because it felt nice.
pub const RADIANS_PER_DOT: f32 = 1.0 / 180.0; pub const RADIANS_PER_DOT: f32 = 1.0 / 180.0;
#[derive(Component)]
pub struct CameraController {
pub enabled: bool,
pub initialized: bool,
pub pitch: f32,
pub yaw: f32,
}
impl Default for CameraController {
fn default() -> Self {
Self {
enabled: true,
initialized: false,
pitch: 1.0, // pitch=0/yaw=0 -> face sun
yaw: 0.3,
}
}
}
fn setup_camera( fn setup_camera(
mut commands: Commands, mut commands: Commands,
) { ) {
@ -57,7 +38,6 @@ fn setup_camera(
transform: Transform::from_xyz(0.0, 0.0, 8.0).looking_at(Vec3::ZERO, Vec3::Y), transform: Transform::from_xyz(0.0, 0.0, 8.0).looking_at(Vec3::ZERO, Vec3::Y),
..default() ..default()
}, },
CameraController::default(),
BloomSettings { BloomSettings {
composite_mode: BloomCompositeMode::EnergyConserving, composite_mode: BloomCompositeMode::EnergyConserving,
..default() ..default()
@ -67,8 +47,8 @@ fn setup_camera(
pub fn sync_camera_to_player( pub fn sync_camera_to_player(
settings: Res<settings::Settings>, settings: Res<settings::Settings>,
mut q_camera: Query<&mut Transform, With<CameraController>>, mut q_camera: Query<&mut Transform, With<Camera>>,
q_playercam: Query<(&actor::Actor, &Transform), (With<actor::PlayerCamera>, Without<actor::PlayerDrivesThis>, Without<CameraController>)>, q_playercam: Query<(&actor::Actor, &Transform), (With<actor::PlayerCamera>, Without<actor::PlayerDrivesThis>, Without<Camera>)>,
) { ) {
if q_camera.is_empty() || q_playercam.is_empty() { if q_camera.is_empty() || q_playercam.is_empty() {
return; return;
@ -126,14 +106,14 @@ fn run_camera_controller(
rocket_sound_controller: Query<&AudioSink, With<audio::ComponentRocketSound>>, rocket_sound_controller: Query<&AudioSink, With<audio::ComponentRocketSound>>,
ion_sound_controller: Query<&AudioSink, With<audio::ComponentIonSound>>, ion_sound_controller: Query<&AudioSink, With<audio::ComponentIonSound>>,
mut q_engine: Query<&mut actor::Engine, With<actor::PlayerDrivesThis>>, mut q_engine: Query<&mut actor::Engine, With<actor::PlayerDrivesThis>>,
mut q_camera: Query<(&mut CameraController, &mut Projection)>, mut q_camera: Query<&mut Projection, With<Camera>>,
q_player: Query<&actor::LifeForm, With<actor::Player>>, q_player: Query<&actor::LifeForm, With<actor::Player>>,
mut q_playercam: Query<( mut q_playercam: Query<(
&mut Transform, &mut Transform,
&mut actor::Engine, &mut actor::Engine,
&mut AngularVelocity, &mut AngularVelocity,
&mut LinearVelocity, &mut LinearVelocity,
), (With<actor::PlayerCamera>, Without<actor::PlayerDrivesThis>, Without<CameraController>)>, ), (With<actor::PlayerCamera>, Without<actor::PlayerDrivesThis>, Without<Camera>)>,
) { ) {
let dt = time.delta_seconds(); let dt = time.delta_seconds();
let mut play_thruster_sound = false; let mut play_thruster_sound = false;
@ -145,14 +125,10 @@ fn run_camera_controller(
} }
if let ( if let (
Ok((mut controller, mut projection)), Ok(mut projection),
Ok(lifeform), Ok(lifeform),
Ok((mut player_transform, player_engine, mut angularvelocity, mut v)), Ok((mut player_transform, player_engine, mut angularvelocity, mut v)),
) = (q_camera.get_single_mut(), q_player.get_single(), q_playercam.get_single_mut()) { ) = (q_camera.get_single_mut(), q_player.get_single(), q_playercam.get_single_mut()) {
if !controller.enabled {
mouse_events.clear();
return;
}
if angularvelocity.length_squared() > 0.0001 { if angularvelocity.length_squared() > 0.0001 {
angularvelocity.x *= 0.98; angularvelocity.x *= 0.98;
@ -242,11 +218,9 @@ fn run_camera_controller(
if mouse_delta != Vec2::ZERO { if mouse_delta != Vec2::ZERO {
// Apply look update // Apply look update
controller.pitch = (controller.pitch let pitch = (mouse_delta.y * RADIANS_PER_DOT * settings.mouse_sensitivity).clamp(-PI / 2., PI / 2.);
+ mouse_delta.y * RADIANS_PER_DOT * settings.mouse_sensitivity) let yaw = mouse_delta.x * RADIANS_PER_DOT * settings.mouse_sensitivity;
.clamp(-PI / 2., PI / 2.); player_transform.rotation *= Quat::from_euler(EulerRot::ZYX, 0.0, -yaw, pitch).normalize();
controller.yaw += mouse_delta.x * RADIANS_PER_DOT * settings.mouse_sensitivity;
player_transform.rotation = Quat::from_euler(EulerRot::ZYX, 0.0, -controller.yaw, controller.pitch).normalize();
} }
let fov = (lifeform.adrenaline * lifeform.adrenaline * lifeform.adrenaline * 45.0 + 45.0).to_radians(); let fov = (lifeform.adrenaline * lifeform.adrenaline * lifeform.adrenaline * 45.0 + 45.0).to_radians();