mirror of
https://gitlab.com/veloren/veloren.git
synced 2024-08-30 18:12:32 +00:00
Look in the direction of the camera
This commit is contained in:
parent
39bd888a7c
commit
e90f95bc75
@ -5,6 +5,7 @@ use vek::*;
|
|||||||
#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
|
#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
|
||||||
pub struct Controller {
|
pub struct Controller {
|
||||||
pub move_dir: Vec2<f32>,
|
pub move_dir: Vec2<f32>,
|
||||||
|
pub look_dir: Vec3<f32>,
|
||||||
pub jump: bool,
|
pub jump: bool,
|
||||||
pub attack: bool,
|
pub attack: bool,
|
||||||
pub block: bool,
|
pub block: bool,
|
||||||
|
@ -94,11 +94,18 @@ impl<'a> System<'a> for Sys {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Set direction based on move direction when on the ground
|
// Set direction based on move direction when on the ground
|
||||||
let ori_dir = if character.movement == Glide || character.movement.is_roll() {
|
let ori_dir = if controller
|
||||||
|
.look_dir
|
||||||
|
.map(|n| !n.is_normal() || n.abs() < std::f32::EPSILON)
|
||||||
|
.reduce_or()
|
||||||
|
|| character.movement == Glide
|
||||||
|
|| character.movement.is_roll()
|
||||||
|
{
|
||||||
Vec2::from(vel.0)
|
Vec2::from(vel.0)
|
||||||
} else {
|
} else {
|
||||||
controller.move_dir
|
Vec2::from(controller.look_dir).normalized()
|
||||||
};
|
};
|
||||||
|
|
||||||
if ori_dir.magnitude_squared() > 0.0001
|
if ori_dir.magnitude_squared() > 0.0001
|
||||||
&& (ori.0.normalized() - Vec3::from(ori_dir).normalized()).magnitude_squared()
|
&& (ori.0.normalized() - Vec3::from(ori_dir).normalized()).magnitude_squared()
|
||||||
> 0.001
|
> 0.001
|
||||||
|
@ -105,19 +105,19 @@ impl PlayState for SessionState {
|
|||||||
self.client.borrow_mut().send_chat(cmd.to_string());
|
self.client.borrow_mut().send_chat(cmd.to_string());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Compute camera data
|
|
||||||
let get_cam_data = |camera: &Camera, client: &Client| {
|
|
||||||
let (view_mat, _, cam_pos) = camera.compute_dependents(client);
|
|
||||||
let cam_dir: Vec3<f32> = Vec3::from(view_mat.inverted() * -Vec4::unit_z());
|
|
||||||
|
|
||||||
(cam_dir, cam_pos)
|
|
||||||
};
|
|
||||||
|
|
||||||
// Game loop
|
// Game loop
|
||||||
let mut current_client_state = self.client.borrow().get_client_state();
|
let mut current_client_state = self.client.borrow().get_client_state();
|
||||||
while let ClientState::Pending | ClientState::Character | ClientState::Dead =
|
while let ClientState::Pending | ClientState::Character | ClientState::Dead =
|
||||||
current_client_state
|
current_client_state
|
||||||
{
|
{
|
||||||
|
// Compute camera data
|
||||||
|
let (view_mat, _, cam_pos) = self
|
||||||
|
.scene
|
||||||
|
.camera()
|
||||||
|
.compute_dependents(&self.client.borrow());
|
||||||
|
let cam_dir: Vec3<f32> = Vec3::from(view_mat.inverted() * -Vec4::unit_z());
|
||||||
|
|
||||||
// Handle window events.
|
// Handle window events.
|
||||||
for event in global_state.window.fetch_events() {
|
for event in global_state.window.fetch_events() {
|
||||||
// Pass all events to the ui first.
|
// Pass all events to the ui first.
|
||||||
@ -142,8 +142,6 @@ impl PlayState for SessionState {
|
|||||||
.get(client.entity())
|
.get(client.entity())
|
||||||
.is_some()
|
.is_some()
|
||||||
{
|
{
|
||||||
let (cam_dir, cam_pos) = get_cam_data(&self.scene.camera(), &client);
|
|
||||||
|
|
||||||
let (d, b) = {
|
let (d, b) = {
|
||||||
let terrain = client.state().terrain();
|
let terrain = client.state().terrain();
|
||||||
let ray = terrain.ray(cam_pos, cam_pos + cam_dir * 100.0).cast();
|
let ray = terrain.ray(cam_pos, cam_pos + cam_dir * 100.0).cast();
|
||||||
@ -169,8 +167,6 @@ impl PlayState for SessionState {
|
|||||||
.get(client.entity())
|
.get(client.entity())
|
||||||
.is_some()
|
.is_some()
|
||||||
{
|
{
|
||||||
let (cam_dir, cam_pos) = get_cam_data(&self.scene.camera(), &client);
|
|
||||||
|
|
||||||
let (d, b) = {
|
let (d, b) = {
|
||||||
let terrain = client.state().terrain();
|
let terrain = client.state().terrain();
|
||||||
let ray = terrain.ray(cam_pos, cam_pos + cam_dir * 100.0).cast();
|
let ray = terrain.ray(cam_pos, cam_pos + cam_dir * 100.0).cast();
|
||||||
@ -194,9 +190,6 @@ impl PlayState for SessionState {
|
|||||||
.is_some()
|
.is_some()
|
||||||
{
|
{
|
||||||
if state {
|
if state {
|
||||||
let (cam_dir, cam_pos) =
|
|
||||||
get_cam_data(&self.scene.camera(), &client);
|
|
||||||
|
|
||||||
if let Ok(Some(block)) = client
|
if let Ok(Some(block)) = client
|
||||||
.state()
|
.state()
|
||||||
.terrain()
|
.terrain()
|
||||||
@ -268,6 +261,8 @@ impl PlayState for SessionState {
|
|||||||
let dir_vec = self.key_state.dir_vec();
|
let dir_vec = self.key_state.dir_vec();
|
||||||
self.controller.move_dir = unit_vecs.0 * dir_vec[0] + unit_vecs.1 * dir_vec[1];
|
self.controller.move_dir = unit_vecs.0 * dir_vec[0] + unit_vecs.1 * dir_vec[1];
|
||||||
|
|
||||||
|
self.controller.look_dir = cam_dir;
|
||||||
|
|
||||||
// Perform an in-game tick.
|
// Perform an in-game tick.
|
||||||
if let Err(err) = self.tick(clock.get_avg_delta()) {
|
if let Err(err) = self.tick(clock.get_avg_delta()) {
|
||||||
error!("Failed to tick the scene: {:?}", err);
|
error!("Failed to tick the scene: {:?}", err);
|
||||||
|
Loading…
Reference in New Issue
Block a user