fix handle_wants_lookat() with ID_SPECIAL_PLAYERCAM
This commit is contained in:
parent
904f7927eb
commit
dcb6e6e5a9
16
src/actor.rs
16
src/actor.rs
|
@ -599,8 +599,9 @@ fn handle_wants_maxvelocity(
|
|||
}
|
||||
|
||||
fn handle_wants_lookat(
|
||||
mut query: Query<(&Position, &mut Rotation, &Transform, &WantsToLookAt)>,
|
||||
mut query: Query<(&Position, &mut Rotation, &Transform, &WantsToLookAt), Without<Camera>>,
|
||||
q_playercam: Query<&Position, With<PlayerCamera>>,
|
||||
q_cam: Query<&Transform, With<Camera>>,
|
||||
id2pos: Res<game::Id2Pos>,
|
||||
) {
|
||||
let player_pos = if let Ok(player_pos) = q_playercam.get_single() {
|
||||
|
@ -608,17 +609,22 @@ fn handle_wants_lookat(
|
|||
} else {
|
||||
return;
|
||||
};
|
||||
let cam_pos = if let Ok(cam_trans) = q_cam.get_single() {
|
||||
cam_trans.translation.as_dvec3() + player_pos.0
|
||||
} else {
|
||||
return;
|
||||
};
|
||||
|
||||
// TODO: use ExternalTorque rather than hard-resetting the rotation
|
||||
for (pos, mut rot, trans, target_id) in &mut query {
|
||||
let target_pos = if target_id.0 == cmd::ID_SPECIAL_PLAYERCAM {
|
||||
player_pos
|
||||
let target_pos: DVec3 = if target_id.0 == cmd::ID_SPECIAL_PLAYERCAM {
|
||||
cam_pos
|
||||
} else if let Some(target_pos) = id2pos.0.get(&target_id.0) {
|
||||
target_pos
|
||||
*target_pos
|
||||
} else {
|
||||
continue;
|
||||
};
|
||||
rot.0 = look_at_quat(**pos, *target_pos, trans.up().as_dvec3());
|
||||
rot.0 = look_at_quat(**pos, target_pos, trans.up().as_dvec3());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -110,6 +110,10 @@ pub fn in_shadow(
|
|||
|
||||
pub fn look_at_quat(from: DVec3, to: DVec3, up: DVec3) -> DQuat {
|
||||
let direction = (to - from).normalize();
|
||||
let direction_len = direction.length_squared();
|
||||
if direction_len < 1e-4 || direction_len.is_nan() {
|
||||
return DQuat::IDENTITY;
|
||||
}
|
||||
let right = up.cross(direction).normalize();
|
||||
let corrected_up = direction.cross(right);
|
||||
|
||||
|
|
Loading…
Reference in a new issue