mirror of
https://gitlab.com/veloren/veloren.git
synced 2024-08-30 18:12:32 +00:00
Moved normalization of direction vectors from physics to character state system
This commit is contained in:
parent
7c5917e9a9
commit
8383a72818
@ -2,6 +2,7 @@ use crate::{
|
|||||||
comp::{Ori, Pos, Vel},
|
comp::{Ori, Pos, Vel},
|
||||||
consts::GRAVITY,
|
consts::GRAVITY,
|
||||||
resources::DeltaTime,
|
resources::DeltaTime,
|
||||||
|
util::Dir,
|
||||||
};
|
};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use specs::{Component, DerefFlaggedStorage};
|
use specs::{Component, DerefFlaggedStorage};
|
||||||
@ -22,32 +23,32 @@ pub enum MovementKind {
|
|||||||
},
|
},
|
||||||
Flight {
|
Flight {
|
||||||
lift: f32,
|
lift: f32,
|
||||||
dir: Vec2<f32>,
|
dir: Option<Dir>,
|
||||||
accel: f32,
|
accel: f32,
|
||||||
},
|
},
|
||||||
Swim {
|
Swim {
|
||||||
dir: Vec3<f32>,
|
dir: Option<Dir>,
|
||||||
accel: f32,
|
accel: f32,
|
||||||
},
|
},
|
||||||
Leap {
|
Leap {
|
||||||
dir: Vec2<f32>,
|
dir: Option<Dir>,
|
||||||
vertical: f32,
|
vertical: f32,
|
||||||
forward: f32,
|
forward: f32,
|
||||||
progress: f32,
|
progress: f32,
|
||||||
},
|
},
|
||||||
Ground {
|
Ground {
|
||||||
dir: Vec2<f32>,
|
dir: Option<Dir>,
|
||||||
accel: f32,
|
accel: f32,
|
||||||
},
|
},
|
||||||
Climb {
|
Climb {
|
||||||
dir: Vec3<f32>,
|
dir: Option<Dir>,
|
||||||
accel: f32,
|
accel: f32,
|
||||||
},
|
},
|
||||||
Teleport {
|
Teleport {
|
||||||
pos: Vec3<f32>,
|
pos: Vec3<f32>,
|
||||||
},
|
},
|
||||||
Boost {
|
Boost {
|
||||||
dir: Vec3<f32>,
|
dir: Option<Dir>,
|
||||||
accel: f32,
|
accel: f32,
|
||||||
},
|
},
|
||||||
ChangeSpeed {
|
ChangeSpeed {
|
||||||
@ -79,12 +80,12 @@ impl MovementState {
|
|||||||
vel.0.z += dt.0 * lift;
|
vel.0.z += dt.0 * lift;
|
||||||
},
|
},
|
||||||
MovementKind::Flight { lift, dir, accel } => {
|
MovementKind::Flight { lift, dir, accel } => {
|
||||||
let dir = dir.try_normalized().unwrap_or_default();
|
let dir = dir.map(|d| d.xy()).unwrap_or_default();
|
||||||
vel.0.z += dt.0 * lift;
|
vel.0.z += dt.0 * lift;
|
||||||
vel.0 += dir * accel * dt.0;
|
vel.0 += dir * accel * dt.0;
|
||||||
},
|
},
|
||||||
MovementKind::Swim { dir, accel } => {
|
MovementKind::Swim { dir, accel } => {
|
||||||
let dir = dir.try_normalized().unwrap_or_default();
|
let dir = dir.map(|d| *d).unwrap_or_default();
|
||||||
vel.0 += dir * accel * dt.0;
|
vel.0 += dir * accel * dt.0;
|
||||||
},
|
},
|
||||||
MovementKind::Leap {
|
MovementKind::Leap {
|
||||||
@ -93,7 +94,7 @@ impl MovementState {
|
|||||||
forward,
|
forward,
|
||||||
progress,
|
progress,
|
||||||
} => {
|
} => {
|
||||||
let dir = dir.try_normalized().unwrap_or_default();
|
let dir = dir.map(|d| d.xy()).unwrap_or_default();
|
||||||
let progress = progress.clamp(0.0, 1.0);
|
let progress = progress.clamp(0.0, 1.0);
|
||||||
// TODO: Make this += instead of =, will require changing magnitude of strengths
|
// TODO: Make this += instead of =, will require changing magnitude of strengths
|
||||||
// probably, and potentially other behavior too Multiplication
|
// probably, and potentially other behavior too Multiplication
|
||||||
@ -101,17 +102,17 @@ impl MovementState {
|
|||||||
vel.0 = dir.mul(forward).with_z(vertical * progress * 2.0);
|
vel.0 = dir.mul(forward).with_z(vertical * progress * 2.0);
|
||||||
},
|
},
|
||||||
MovementKind::Ground { dir, accel } => {
|
MovementKind::Ground { dir, accel } => {
|
||||||
let dir = dir.try_normalized().unwrap_or_default();
|
let dir = dir.map(|d| d.xy()).unwrap_or_default();
|
||||||
vel.0 += dir * accel * dt.0;
|
vel.0 += dir * accel * dt.0;
|
||||||
},
|
},
|
||||||
MovementKind::Climb { dir, accel } => {
|
MovementKind::Climb { dir, accel } => {
|
||||||
let dir = dir.try_normalized().unwrap_or_default();
|
let dir = dir.map(|d| *d).unwrap_or_default();
|
||||||
vel.0.z += GRAVITY * dt.0;
|
vel.0.z += GRAVITY * dt.0;
|
||||||
vel.0 += dir * accel * dt.0;
|
vel.0 += dir * accel * dt.0;
|
||||||
},
|
},
|
||||||
MovementKind::Teleport { pos: new_pos } => pos.0 = new_pos,
|
MovementKind::Teleport { pos: new_pos } => pos.0 = new_pos,
|
||||||
MovementKind::Boost { dir, accel } => {
|
MovementKind::Boost { dir, accel } => {
|
||||||
let dir = dir.try_normalized().unwrap_or_default();
|
let dir = dir.map(|d| *d).unwrap_or_default();
|
||||||
vel.0 += dir * accel * dt.0;
|
vel.0 += dir * accel * dt.0;
|
||||||
},
|
},
|
||||||
MovementKind::ChangeSpeed { speed } => {
|
MovementKind::ChangeSpeed { speed } => {
|
||||||
|
@ -5,6 +5,7 @@ use crate::{
|
|||||||
utils::*,
|
utils::*,
|
||||||
wielding,
|
wielding,
|
||||||
},
|
},
|
||||||
|
util::Dir,
|
||||||
};
|
};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
@ -37,11 +38,11 @@ impl CharacterBehavior for Data {
|
|||||||
|
|
||||||
if self.timer < self.static_data.movement_duration {
|
if self.timer < self.static_data.movement_duration {
|
||||||
// Movement
|
// Movement
|
||||||
let dir = if self.static_data.only_up {
|
let dir = Dir::from_unnormalized(if self.static_data.only_up {
|
||||||
Vec3::unit_z()
|
Vec3::unit_z()
|
||||||
} else {
|
} else {
|
||||||
*data.inputs.look_dir
|
*data.inputs.look_dir
|
||||||
};
|
});
|
||||||
update.movement = update.movement.with_movement(MovementKind::Boost { dir, accel: self.static_data.speed });
|
update.movement = update.movement.with_movement(MovementKind::Boost { dir, accel: self.static_data.speed });
|
||||||
update.character = CharacterState::Boost(Data {
|
update.character = CharacterState::Boost(Data {
|
||||||
timer: tick_attack_or_default(data, self.timer, None),
|
timer: tick_attack_or_default(data, self.timer, None),
|
||||||
|
@ -113,11 +113,11 @@ impl CharacterBehavior for Data {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Apply Vertical Climbing Movement
|
// Apply Vertical Climbing Movement
|
||||||
let dir = data.inputs.move_dir.with_z(match climb {
|
let dir = Dir::from_unnormalized(data.inputs.move_dir.with_z(match climb {
|
||||||
Climb::Down => -1.0,
|
Climb::Down => -1.0,
|
||||||
Climb::Up => 1.0,
|
Climb::Up => 1.0,
|
||||||
Climb::Hold => 0.0,
|
Climb::Hold => 0.0,
|
||||||
});
|
}));
|
||||||
let accel = if data.vel.0.magnitude_squared() < self.static_data.movement_speed.powi(2) {
|
let accel = if data.vel.0.magnitude_squared() < self.static_data.movement_speed.powi(2) {
|
||||||
self.static_data.movement_speed.powi(2)
|
self.static_data.movement_speed.powi(2)
|
||||||
} else {
|
} else {
|
||||||
|
@ -8,6 +8,7 @@ use crate::{
|
|||||||
behavior::{CharacterBehavior, JoinData},
|
behavior::{CharacterBehavior, JoinData},
|
||||||
idle,
|
idle,
|
||||||
},
|
},
|
||||||
|
util::Dir,
|
||||||
};
|
};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
@ -79,7 +80,8 @@ impl CharacterBehavior for Data {
|
|||||||
if let CharacterState::Skate(skate_data) = &mut update.character {
|
if let CharacterState::Skate(skate_data) = &mut update.character {
|
||||||
skate_data.turn = orthogonal.dot(data.vel.0.xy());
|
skate_data.turn = orthogonal.dot(data.vel.0.xy());
|
||||||
}
|
}
|
||||||
update.movement = update.movement.with_movement(MovementKind::Ground { dir: data.inputs.move_dir, accel: acceleration }).with_ori_update(OriUpdate::New(new_ori));
|
let dir = Dir::from_unnormalized(data.inputs.move_dir.with_z(0.0));
|
||||||
|
update.movement = update.movement.with_movement(MovementKind::Ground { dir, accel: acceleration }).with_ori_update(OriUpdate::New(new_ori));
|
||||||
}
|
}
|
||||||
|
|
||||||
update
|
update
|
||||||
|
@ -6,6 +6,7 @@ use crate::{
|
|||||||
utils::*,
|
utils::*,
|
||||||
wielding,
|
wielding,
|
||||||
},
|
},
|
||||||
|
util::Dir,
|
||||||
};
|
};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
@ -64,7 +65,8 @@ impl CharacterBehavior for Data {
|
|||||||
update.movement = update.movement.with_movement(if data.physics.on_ground.is_some() {
|
update.movement = update.movement.with_movement(if data.physics.on_ground.is_some() {
|
||||||
// TODO: Just remove axehover entirely with axe rework, it's really janky
|
// TODO: Just remove axehover entirely with axe rework, it's really janky
|
||||||
// TODO: Should 5 even be used here, or should body accel be used? Maybe just call handle_move?
|
// TODO: Should 5 even be used here, or should body accel be used? Maybe just call handle_move?
|
||||||
MovementKind::Ground { dir: data.inputs.move_dir, accel: 5.0 }
|
let dir = Dir::from_unnormalized(data.inputs.move_dir.with_z(0.0));
|
||||||
|
MovementKind::Ground { dir, accel: 5.0 }
|
||||||
} else {
|
} else {
|
||||||
MovementKind::SlowFall { lift: GRAVITY * 0.5 }
|
MovementKind::SlowFall { lift: GRAVITY * 0.5 }
|
||||||
});
|
});
|
||||||
|
@ -370,11 +370,11 @@ fn basic_move(data: &JoinData<'_>, update: &mut StateUpdate, efficiency: f32) {
|
|||||||
} * efficiency;
|
} * efficiency;
|
||||||
|
|
||||||
// Should ability to backpedal be separate from ability to strafe?
|
// Should ability to backpedal be separate from ability to strafe?
|
||||||
let dir = if data.body.can_strafe() {
|
let dir = Dir::from_unnormalized(if data.body.can_strafe() {
|
||||||
data.inputs.move_dir
|
data.inputs.move_dir
|
||||||
} else {
|
} else {
|
||||||
Vec2::from(*data.ori)
|
Vec2::from(*data.ori)
|
||||||
};
|
}.with_z(0.0));
|
||||||
let accel_mod = if is_strafing(data, update) {
|
let accel_mod = if is_strafing(data, update) {
|
||||||
Lerp::lerp(
|
Lerp::lerp(
|
||||||
Vec2::from(*data.ori)
|
Vec2::from(*data.ori)
|
||||||
@ -393,7 +393,7 @@ fn basic_move(data: &JoinData<'_>, update: &mut StateUpdate, efficiency: f32) {
|
|||||||
data.body.reverse_move_factor(),
|
data.body.reverse_move_factor(),
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
data.inputs.move_dir.dot(dir).max(0.0)
|
data.inputs.move_dir.dot(dir.unwrap_or_default().xy()).max(0.0)
|
||||||
};
|
};
|
||||||
let accel = accel * accel_mod;
|
let accel = accel * accel_mod;
|
||||||
|
|
||||||
@ -416,7 +416,7 @@ pub fn handle_forced_movement(
|
|||||||
// TODO: Remove * 2.0 with changes made in sword branch, added as hack for now to keep same behavior
|
// TODO: Remove * 2.0 with changes made in sword branch, added as hack for now to keep same behavior
|
||||||
let accel = accel * strength * 2.0;
|
let accel = accel * strength * 2.0;
|
||||||
// TODO: Remove move_dir portion with changes made in sword branch, added as hack for now to keep same behavior
|
// TODO: Remove move_dir portion with changes made in sword branch, added as hack for now to keep same behavior
|
||||||
let dir = data.inputs.move_dir * 0.5 + Vec2::from(*data.ori) * 1.5;
|
let dir = Dir::from_unnormalized((data.inputs.move_dir * 0.5 + Vec2::from(*data.ori) * 1.5).with_z(0.0));
|
||||||
update.movement = update.movement.with_movement(MovementKind::Ground { dir, accel });
|
update.movement = update.movement.with_movement(MovementKind::Ground { dir, accel });
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -426,7 +426,7 @@ pub fn handle_forced_movement(
|
|||||||
progress,
|
progress,
|
||||||
direction,
|
direction,
|
||||||
} => {
|
} => {
|
||||||
let dir = direction.get_2d_dir(data);
|
let dir = Dir::from_unnormalized(direction.get_2d_dir(data).with_z(0.0));
|
||||||
// Control forward movement based on look direction.
|
// Control forward movement based on look direction.
|
||||||
// This allows players to stop moving forward when they
|
// This allows players to stop moving forward when they
|
||||||
// look downward at target
|
// look downward at target
|
||||||
@ -532,7 +532,7 @@ fn swim_move(
|
|||||||
data.inputs.move_z
|
data.inputs.move_z
|
||||||
};
|
};
|
||||||
|
|
||||||
let dir = Vec3::new(dir.x, dir.y, move_z);
|
let dir = Dir::from_unnormalized(Vec3::new(dir.x, dir.y, move_z));
|
||||||
let accel = water_accel * (submersion - 0.2).clamp(0.0, 1.0).powi(2);
|
let accel = water_accel * (submersion - 0.2).clamp(0.0, 1.0).powi(2);
|
||||||
update.movement = update.movement.with_movement(MovementKind::Swim { dir, accel });
|
update.movement = update.movement.with_movement(MovementKind::Swim { dir, accel });
|
||||||
|
|
||||||
@ -595,12 +595,12 @@ pub fn fly_move(data: &JoinData<'_>, update: &mut StateUpdate, efficiency: f32)
|
|||||||
_ => 0.0,
|
_ => 0.0,
|
||||||
};
|
};
|
||||||
|
|
||||||
let dir = if data.body.can_strafe() {
|
let dir = Dir::from_unnormalized(if data.body.can_strafe() {
|
||||||
data.inputs.move_dir
|
data.inputs.move_dir
|
||||||
} else {
|
} else {
|
||||||
let fw = Vec2::from(*data.ori);
|
let fw = Vec2::from(*data.ori);
|
||||||
fw * data.inputs.move_dir.dot(fw).max(0.0)
|
fw * data.inputs.move_dir.dot(fw).max(0.0)
|
||||||
};
|
}.with_z(0.0));
|
||||||
|
|
||||||
update.movement = update.movement.with_movement(MovementKind::Flight { lift, dir, accel });
|
update.movement = update.movement.with_movement(MovementKind::Flight { lift, dir, accel });
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user