WIP crisper camera controls (apply rotation)
This commit is contained in:
parent
8ea2d1fb21
commit
e8e81e8e52
11
src/actor.rs
11
src/actor.rs
|
@ -38,6 +38,7 @@ impl Plugin for ActorPlugin {
|
||||||
update_physics_lifeforms.run_if(game_running),
|
update_physics_lifeforms.run_if(game_running),
|
||||||
update_power.run_if(game_running),
|
update_power.run_if(game_running),
|
||||||
handle_gravity.run_if(game_running),
|
handle_gravity.run_if(game_running),
|
||||||
|
handle_wants_rotation.run_if(game_running),
|
||||||
handle_wants_maxrotation.run_if(game_running),
|
handle_wants_maxrotation.run_if(game_running),
|
||||||
handle_wants_maxvelocity
|
handle_wants_maxvelocity
|
||||||
.run_if(game_running)
|
.run_if(game_running)
|
||||||
|
@ -176,6 +177,8 @@ pub struct WantsMaxVelocity(pub f64);
|
||||||
#[derive(Component)]
|
#[derive(Component)]
|
||||||
pub struct WantsToLookAt(pub String);
|
pub struct WantsToLookAt(pub String);
|
||||||
#[derive(Component)]
|
#[derive(Component)]
|
||||||
|
pub struct WantsRotation(pub DQuat);
|
||||||
|
#[derive(Component)]
|
||||||
pub struct WantsMatchVelocityWith(pub String);
|
pub struct WantsMatchVelocityWith(pub String);
|
||||||
#[derive(Component)]
|
#[derive(Component)]
|
||||||
pub struct Identifier(pub String);
|
pub struct Identifier(pub String);
|
||||||
|
@ -703,6 +706,14 @@ fn handle_wants_maxvelocity(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn handle_wants_rotation(
|
||||||
|
mut q_actor: Query<(&mut Rotation, &WantsRotation)>,
|
||||||
|
) {
|
||||||
|
for (mut rot, setrot) in &mut q_actor {
|
||||||
|
**rot = setrot.0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn handle_wants_lookat(
|
fn handle_wants_lookat(
|
||||||
mut query: Query<
|
mut query: Query<
|
||||||
(
|
(
|
||||||
|
|
|
@ -443,8 +443,73 @@ fn manage_player_actor(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(clippy::too_many_arguments)]
|
|
||||||
pub fn apply_input_to_player(
|
pub fn apply_input_to_player(
|
||||||
|
settings: Res<var::Settings>,
|
||||||
|
mut commands: Commands,
|
||||||
|
mut q_player: Query<
|
||||||
|
(Entity, &Rotation, Option<&mut actor::WantsRotation>),
|
||||||
|
With<actor::PlayerCamera>,
|
||||||
|
>,
|
||||||
|
mut mouse_events: EventReader<MouseMotion>,
|
||||||
|
key_input: Res<ButtonInput<KeyCode>>,
|
||||||
|
q_windows: Query<&Window, With<PrimaryWindow>>,
|
||||||
|
) {
|
||||||
|
let player = q_player.get_single_mut();
|
||||||
|
if player.is_err() {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let (entity, rot, setrot) = player.unwrap();
|
||||||
|
|
||||||
|
let (win_res_x, win_res_y): (f32, f32);
|
||||||
|
if let Ok(window) = &q_windows.get_single() {
|
||||||
|
win_res_x = window.resolution.width();
|
||||||
|
win_res_y = window.resolution.height();
|
||||||
|
} else {
|
||||||
|
win_res_x = 1920.0;
|
||||||
|
win_res_y = 1050.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Determine rotation delta
|
||||||
|
let mut pitch_yaw_rot = Vec3::ZERO;
|
||||||
|
let mut mouse_delta = Vec2::ZERO;
|
||||||
|
for mouse_event in mouse_events.read() {
|
||||||
|
mouse_delta += mouse_event.delta;
|
||||||
|
}
|
||||||
|
if mouse_delta != Vec2::ZERO {
|
||||||
|
if key_input.pressed(settings.key_rotate) {
|
||||||
|
pitch_yaw_rot[2] += 2.0 * mouse_delta.x / win_res_x;
|
||||||
|
} else {
|
||||||
|
pitch_yaw_rot[0] += 2.0 * mouse_delta.y / win_res_y;
|
||||||
|
pitch_yaw_rot[1] -= 2.0 * mouse_delta.x / win_res_x;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Apply rotation to player
|
||||||
|
if pitch_yaw_rot != Vec3::ZERO {
|
||||||
|
let rot_offset = DQuat::from_euler(
|
||||||
|
EulerRot::XYZ,
|
||||||
|
pitch_yaw_rot[0] as f64,
|
||||||
|
pitch_yaw_rot[1] as f64,
|
||||||
|
pitch_yaw_rot[2] as f64,
|
||||||
|
);
|
||||||
|
let rot_current = if let Some(setrot) = &setrot {
|
||||||
|
setrot.0
|
||||||
|
} else {
|
||||||
|
**rot
|
||||||
|
};
|
||||||
|
let rot_target = rot_current * rot_offset;
|
||||||
|
if let Some(mut setrot) = setrot {
|
||||||
|
setrot.0 = rot_target;
|
||||||
|
} else {
|
||||||
|
commands
|
||||||
|
.entity(entity)
|
||||||
|
.try_insert(actor::WantsRotation(rot_target));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[allow(clippy::too_many_arguments)]
|
||||||
|
pub fn apply_input_to_player_old(
|
||||||
time: Res<Time>,
|
time: Res<Time>,
|
||||||
mut commands: Commands,
|
mut commands: Commands,
|
||||||
settings: Res<var::Settings>,
|
settings: Res<var::Settings>,
|
||||||
|
|
|
@ -1135,6 +1135,7 @@ fn spawn_entities(
|
||||||
actor.insert(actor::Player);
|
actor.insert(actor::Player);
|
||||||
actor.insert(actor::PlayerCamera);
|
actor.insert(actor::PlayerCamera);
|
||||||
actor.insert(hud::AugmentedRealityOverlayBroadcaster);
|
actor.insert(hud::AugmentedRealityOverlayBroadcaster);
|
||||||
|
//actor.insert(actor::WantsRotation(Quat::IDENTITY));
|
||||||
ew_updateavatar.send(hud::UpdateAvatarEvent);
|
ew_updateavatar.send(hud::UpdateAvatarEvent);
|
||||||
}
|
}
|
||||||
if state.is_sun {
|
if state.is_sun {
|
||||||
|
|
Loading…
Reference in a new issue