Merge branch 'zesterer/better-anims' into 'master'

Improving some animations

See merge request veloren/veloren!4127
This commit is contained in:
Joshua Barretto 2023-10-12 20:18:11 +00:00
commit 0f2d4c261a
18 changed files with 235 additions and 185 deletions

View File

@ -150,7 +150,7 @@
"voxygen.audio.sfx.footsteps.stepdirt_4", "voxygen.audio.sfx.footsteps.stepdirt_4",
"voxygen.audio.sfx.footsteps.stepdirt_5", "voxygen.audio.sfx.footsteps.stepdirt_5",
], ],
threshold: 1.8, threshold: 0.5,
subtitle: "subtitle-footsteps_earth", subtitle: "subtitle-footsteps_earth",
), ),
QuadRun(Earth): ( QuadRun(Earth): (
@ -161,7 +161,7 @@
"voxygen.audio.sfx.footsteps.stepdirt_4", "voxygen.audio.sfx.footsteps.stepdirt_4",
"voxygen.audio.sfx.footsteps.stepdirt_5", "voxygen.audio.sfx.footsteps.stepdirt_5",
], ],
threshold: 0.9, threshold: 0.25,
subtitle: "subtitle-footsteps_earth", subtitle: "subtitle-footsteps_earth",
), ),
Run(Grass): ( Run(Grass): (
@ -173,7 +173,7 @@
"voxygen.audio.sfx.footsteps.stepgrass_5", "voxygen.audio.sfx.footsteps.stepgrass_5",
"voxygen.audio.sfx.footsteps.stepgrass_6", "voxygen.audio.sfx.footsteps.stepgrass_6",
], ],
threshold: 1.8, threshold: 1.0,
subtitle: "subtitle-footsteps_grass", subtitle: "subtitle-footsteps_grass",
), ),
QuadRun(Grass): ( QuadRun(Grass): (
@ -185,7 +185,7 @@
"voxygen.audio.sfx.footsteps.stepgrass_5", "voxygen.audio.sfx.footsteps.stepgrass_5",
"voxygen.audio.sfx.footsteps.stepgrass_6", "voxygen.audio.sfx.footsteps.stepgrass_6",
], ],
threshold: 0.9, threshold: 0.5,
subtitle: "subtitle-footsteps_grass", subtitle: "subtitle-footsteps_grass",
), ),
// For when sand 1) exists and 2) has unique sounds // For when sand 1) exists and 2) has unique sounds
@ -215,7 +215,7 @@
"voxygen.audio.sfx.footsteps.snow_step_2", "voxygen.audio.sfx.footsteps.snow_step_2",
"voxygen.audio.sfx.footsteps.snow_step_3", "voxygen.audio.sfx.footsteps.snow_step_3",
], ],
threshold: 1.8, threshold: 1.0,
subtitle: "subtitle-footsteps_snow", subtitle: "subtitle-footsteps_snow",
), ),
QuadRun(Snow): ( QuadRun(Snow): (
@ -224,7 +224,7 @@
"voxygen.audio.sfx.footsteps.snow_step_2", "voxygen.audio.sfx.footsteps.snow_step_2",
"voxygen.audio.sfx.footsteps.snow_step_3", "voxygen.audio.sfx.footsteps.snow_step_3",
], ],
threshold: 0.9, threshold: 0.5,
subtitle: "subtitle-footsteps_snow", subtitle: "subtitle-footsteps_snow",
), ),
Run(Rock): ( Run(Rock): (
@ -242,7 +242,7 @@
"voxygen.audio.sfx.footsteps.stone_step_11", "voxygen.audio.sfx.footsteps.stone_step_11",
"voxygen.audio.sfx.footsteps.stone_step_12", "voxygen.audio.sfx.footsteps.stone_step_12",
], ],
threshold: 1.8, threshold: 1.0,
subtitle: "subtitle-footsteps_rock", subtitle: "subtitle-footsteps_rock",
), ),
QuadRun(Rock): ( QuadRun(Rock): (
@ -260,7 +260,7 @@
"voxygen.audio.sfx.footsteps.stone_step_11", "voxygen.audio.sfx.footsteps.stone_step_11",
"voxygen.audio.sfx.footsteps.stone_step_12", "voxygen.audio.sfx.footsteps.stone_step_12",
], ],
threshold: 0.9, threshold: 0.5,
subtitle: "subtitle-footsteps_rock", subtitle: "subtitle-footsteps_rock",
), ),
Roll: ( Roll: (

View File

@ -2404,6 +2404,7 @@ impl From<(&CharacterAbility, AbilityInfo, &JoinData<'_>)> for CharacterState {
timer: Duration::default(), timer: Duration::default(),
stage_section: StageSection::Buildup, stage_section: StageSection::Buildup,
was_wielded: false, // false by default. utils might set it to true was_wielded: false, // false by default. utils might set it to true
prev_aimed_dir: None,
is_sneaking: false, is_sneaking: false,
was_combo: None, was_combo: None,
}), }),

View File

@ -275,6 +275,18 @@ impl Body {
) )
} }
/// The length of the stride of the body, in metres (not accounting for
/// different legs)
pub fn stride_length(&self) -> f32 {
if let Body::Humanoid(body) = self {
body.scaler() * 3.75
} else {
// Rough heuristic
let dims = self.dimensions();
0.65 + (dims.y + dims.z) * 0.6
}
}
pub fn scale(&self) -> Scale { pub fn scale(&self) -> Scale {
let s = match self { let s = match self {
Body::BirdMedium(bird_medium) => match bird_medium.species { Body::BirdMedium(bird_medium) => match bird_medium.species {

View File

@ -9,6 +9,7 @@ use crate::{
behavior::{CharacterBehavior, JoinData}, behavior::{CharacterBehavior, JoinData},
utils::*, utils::*,
}, },
util::Dir,
}; };
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use std::time::Duration; use std::time::Duration;
@ -41,6 +42,8 @@ pub struct Data {
pub stage_section: StageSection, pub stage_section: StageSection,
/// Had weapon /// Had weapon
pub was_wielded: bool, pub was_wielded: bool,
/// What direction were we previously aiming in?
pub prev_aimed_dir: Option<Dir>,
/// Is sneaking, true if previous state was also considered sneaking /// Is sneaking, true if previous state was also considered sneaking
pub is_sneaking: bool, pub is_sneaking: bool,
/// Was in state with combo /// Was in state with combo

View File

@ -58,6 +58,7 @@ impl Body {
quadruped_small::Species::Rabbit => 110.0, quadruped_small::Species::Rabbit => 110.0,
quadruped_small::Species::Cat => 150.0, quadruped_small::Species::Cat => 150.0,
quadruped_small::Species::Quokka => 100.0, quadruped_small::Species::Quokka => 100.0,
quadruped_small::Species::MossySnail => 20.0,
_ => 125.0, _ => 125.0,
}, },
Body::QuadrupedMedium(quadruped_medium) => match quadruped_medium.species { Body::QuadrupedMedium(quadruped_medium) => match quadruped_medium.species {
@ -1246,6 +1247,9 @@ fn handle_ability(
roll.is_sneaking = true; roll.is_sneaking = true;
} }
} }
if data.character.is_aimed() {
roll.prev_aimed_dir = Some(data.controller.inputs.look_dir);
}
} }
return true; return true;
} }
@ -1553,6 +1557,11 @@ pub fn end_ability(data: &JoinData<'_>, update: &mut StateUpdate) {
time_entered: *data.time, time_entered: *data.time,
}); });
} }
if let CharacterState::Roll(roll) = data.character {
if let Some(dir) = roll.prev_aimed_dir {
update.ori = dir.into();
}
}
} }
pub fn end_melee_ability(data: &JoinData<'_>, update: &mut StateUpdate) { pub fn end_melee_ability(data: &JoinData<'_>, update: &mut StateUpdate) {

View File

@ -69,6 +69,7 @@ impl Animation for ChargeswingAnimation {
Quaternion::rotation_x(s_a.shl.3) * Quaternion::rotation_y(s_a.shl.4); Quaternion::rotation_x(s_a.shl.3) * Quaternion::rotation_y(s_a.shl.4);
next.hand_r.position = next.hand_r.position =
Vec3::new(-s_a.sc.0 + 6.0 + move1 * -12.0, -4.0 + move1 * 3.0, -2.0); Vec3::new(-s_a.sc.0 + 6.0 + move1 * -12.0, -4.0 + move1 * 3.0, -2.0);
next.hand_r.orientation = Quaternion::rotation_x(PI * 0.5);
next.control.position = Vec3::new(s_a.sc.0, s_a.sc.1, s_a.sc.2 + move2 * 5.0); next.control.position = Vec3::new(s_a.sc.0, s_a.sc.1, s_a.sc.2 + move2 * 5.0);
next.control.orientation = Quaternion::rotation_x(s_a.sc.3 + move1 * -0.9) next.control.orientation = Quaternion::rotation_x(s_a.sc.3 + move1 * -0.9)
* Quaternion::rotation_y(move1 * 1.0 + move2 * -1.0) * Quaternion::rotation_y(move1 * 1.0 + move2 * -1.0)

View File

@ -230,7 +230,7 @@ impl Animation for FinisherMeleeAnimation {
let move2_reset = ((move2 - 0.5).abs() - 0.5).abs() * 2.0; let move2_reset = ((move2 - 0.5).abs() - 0.5).abs() * 2.0;
let move2 = move2 * pullback; let move2 = move2 * pullback;
next.hand_l.position = Vec3::new(s_a.ahl.0, s_a.ahl.1, s_a.ahl.2); next.hand_l.position = Vec3::new(s_a.ahl.0, s_a.ahl.1, s_a.ahl.2 + 10.0);
next.hand_l.orientation = next.hand_l.orientation =
Quaternion::rotation_x(s_a.ahl.3) * Quaternion::rotation_y(s_a.ahl.4); Quaternion::rotation_x(s_a.ahl.3) * Quaternion::rotation_y(s_a.ahl.4);
next.hand_r.position = Vec3::new(s_a.ahr.0, s_a.ahr.1, s_a.ahr.2); next.hand_r.position = Vec3::new(s_a.ahr.0, s_a.ahr.1, s_a.ahr.2);

View File

@ -29,7 +29,7 @@ impl Animation for GlidingAnimation {
next.glider_trails = true; next.glider_trails = true;
let speednorm = velocity.magnitude().min(50.0) / 50.0; let speednorm = velocity.magnitude().min(50.0) / 50.0;
let slow = (acc_vel * 0.5).sin(); let slow = (acc_vel * 0.25).sin();
let head_look = Vec2::new( let head_look = Vec2::new(
((global_time + anim_time) / 4.0).floor().mul(7331.0).sin() * 0.5, ((global_time + anim_time) / 4.0).floor().mul(7331.0).sin() * 0.5,
@ -56,6 +56,7 @@ impl Animation for GlidingAnimation {
next.shorts.orientation = Quaternion::rotation_z(0.0); next.shorts.orientation = Quaternion::rotation_z(0.0);
next.belt.position = Vec3::new(0.0, s_a.belt.0, s_a.belt.1); next.belt.position = Vec3::new(0.0, s_a.belt.0, s_a.belt.1);
next.shorts.position = Vec3::new(0.0, s_a.shorts.0, s_a.shorts.1); next.shorts.position = Vec3::new(0.0, s_a.shorts.0, s_a.shorts.1);
next.shorts.orientation = Quaternion::rotation_z(-speedlog + slow * 0.15);
next.hand_l.position = next.hand_l.position =
glider_pos + glider_ori * Vec3::new(-s_a.hand.0 + -2.0, s_a.hand.1 + 8.0, s_a.hand.2); glider_pos + glider_ori * Vec3::new(-s_a.hand.0 + -2.0, s_a.hand.1 + 8.0, s_a.hand.2);
@ -65,11 +66,19 @@ impl Animation for GlidingAnimation {
glider_pos + glider_ori * Vec3::new(s_a.hand.0 + 2.0, s_a.hand.1 + 8.0, s_a.hand.2); glider_pos + glider_ori * Vec3::new(s_a.hand.0 + 2.0, s_a.hand.1 + 8.0, s_a.hand.2);
next.hand_r.orientation = Quaternion::rotation_x(3.35) * Quaternion::rotation_y(-0.2); next.hand_r.orientation = Quaternion::rotation_x(3.35) * Quaternion::rotation_y(-0.2);
next.foot_l.position = Vec3::new(-s_a.foot.0, s_a.foot.1 + speedlog * -1.0, s_a.foot.2); next.foot_l.position = Vec3::new(
next.foot_l.orientation = Quaternion::rotation_x(-speedlog + slow * -0.3 * speedlog); -s_a.foot.0,
s_a.foot.1 + speedlog * -1.0 - slow * 2.3,
s_a.foot.2,
);
next.foot_l.orientation = Quaternion::rotation_x(-speedlog + slow * -1.3 * speedlog);
next.foot_r.position = Vec3::new(s_a.foot.0, s_a.foot.1 + speedlog * -1.0, s_a.foot.2); next.foot_r.position = Vec3::new(
next.foot_r.orientation = Quaternion::rotation_x(-speedlog + slow * 0.3 * speedlog); s_a.foot.0,
s_a.foot.1 + speedlog * -1.0 + slow * 2.3,
s_a.foot.2,
);
next.foot_r.orientation = Quaternion::rotation_x(-speedlog + slow * 1.3 * speedlog);
next next
} }

View File

@ -37,6 +37,7 @@ impl Animation for JumpAnimation {
let check = subtract - subtract.trunc(); let check = subtract - subtract.trunc();
let switch = (check - 0.5).signum(); let switch = (check - 0.5).signum();
let falling = (velocity.z * 0.1).clamped(-1.0, 1.0);
let speed = Vec2::<f32>::from(velocity).magnitude(); let speed = Vec2::<f32>::from(velocity).magnitude();
let speednorm = (speed / 10.0).min(1.0); let speednorm = (speed / 10.0).min(1.0);
@ -115,14 +116,14 @@ impl Animation for JumpAnimation {
next.foot_l.position = Vec3::new( next.foot_l.position = Vec3::new(
-s_a.foot.0, -s_a.foot.0,
s_a.foot.1 - 5.0 * switch, s_a.foot.1 - 5.0 * switch,
2.0 + s_a.foot.2 + slow * 1.5, 2.0 + s_a.foot.2 + slow * 1.5 + falling * -2.0,
); );
next.foot_l.orientation = Quaternion::rotation_x(-0.8 * switch + slow * -0.2 * switch); next.foot_l.orientation = Quaternion::rotation_x(-0.8 * switch + slow * -0.2 * switch);
next.foot_r.position = Vec3::new( next.foot_r.position = Vec3::new(
s_a.foot.0, s_a.foot.0,
s_a.foot.1 + 5.0 * switch, s_a.foot.1 + 5.0 * switch,
2.0 + s_a.foot.2 + slow * 1.5, 2.0 + s_a.foot.2 + slow * 1.5 + falling * -2.0,
); );
next.foot_r.orientation = Quaternion::rotation_x(0.8 * switch + slow * 0.2 * switch); next.foot_r.orientation = Quaternion::rotation_x(0.8 * switch + slow * 0.2 * switch);

View File

@ -72,6 +72,8 @@ impl Animation for MountAnimation {
0.0 0.0
} * 1.3; } * 1.3;
let bob = (anim_time * 12.0).sin();
next.head.scale = Vec3::one() * s_a.head_scale; next.head.scale = Vec3::one() * s_a.head_scale;
next.chest.scale = Vec3::one() * 1.01; next.chest.scale = Vec3::one() * 1.01;
next.hand_l.scale = Vec3::one() * 1.04; next.hand_l.scale = Vec3::one() * 1.04;
@ -89,7 +91,8 @@ impl Animation for MountAnimation {
next.chest.position = Vec3::new(0.0, s_a.chest.0, s_a.chest.1); next.chest.position = Vec3::new(0.0, s_a.chest.0, s_a.chest.1);
next.chest.orientation = next.chest.orientation =
Quaternion::rotation_x(-0.4 + tilt.abs() * -1.5) * Quaternion::rotation_y(tilt * 2.0); Quaternion::rotation_x(-0.4 + tilt.abs() * -1.5 - bob * speed * 0.0)
* Quaternion::rotation_y(tilt * 2.0);
next.belt.position = Vec3::new(0.0, s_a.belt.0 + 0.5, s_a.belt.1 + 0.5); next.belt.position = Vec3::new(0.0, s_a.belt.0 + 0.5, s_a.belt.1 + 0.5);
next.belt.orientation = Quaternion::rotation_x(0.2) * Quaternion::rotation_y(tilt * -0.5); next.belt.orientation = Quaternion::rotation_x(0.2) * Quaternion::rotation_y(tilt * -0.5);
@ -99,13 +102,21 @@ impl Animation for MountAnimation {
next.shorts.position = Vec3::new(0.0, s_a.shorts.0 + 1.0, s_a.shorts.1 + 1.0); next.shorts.position = Vec3::new(0.0, s_a.shorts.0 + 1.0, s_a.shorts.1 + 1.0);
next.shorts.orientation = Quaternion::rotation_x(0.3) * Quaternion::rotation_y(tilt * -1.0); next.shorts.orientation = Quaternion::rotation_x(0.3) * Quaternion::rotation_y(tilt * -1.0);
next.hand_l.position = Vec3::new(-s_a.hand.0 + 3.0, s_a.hand.1 + 9.0, s_a.hand.2 + 4.0); next.hand_l.position = Vec3::new(
-s_a.hand.0 + 3.0,
s_a.hand.1 + 6.0,
s_a.hand.2 + 2.0 + (bob + 1.0) * speed * 0.1,
);
next.hand_l.orientation = next.hand_l.orientation =
Quaternion::rotation_x(PI / 2.0) * Quaternion::rotation_z(-PI / 2.0 + 0.5); Quaternion::rotation_x(PI * 0.4) * Quaternion::rotation_z(-PI / 2.0 + 1.0);
next.hand_r.position = Vec3::new(s_a.hand.0 - 3.0, s_a.hand.1 + 9.0, s_a.hand.2 + 4.0); next.hand_r.position = Vec3::new(
s_a.hand.0 - 3.0,
s_a.hand.1 + 6.0,
s_a.hand.2 + 2.0 + (bob + 1.0) * speed * 0.1,
);
next.hand_r.orientation = next.hand_r.orientation =
Quaternion::rotation_x(PI / 2.0) * Quaternion::rotation_z(PI / 2.0 - 0.5); Quaternion::rotation_x(PI * 0.4) * Quaternion::rotation_z(PI / 2.0 - 1.0);
next.foot_l.position = Vec3::new(-s_a.foot.0 - 2.0, 4.0 + s_a.foot.1, s_a.foot.2); next.foot_l.position = Vec3::new(-s_a.foot.0 - 2.0, 4.0 + s_a.foot.1, s_a.foot.2);
next.foot_l.orientation = Quaternion::rotation_x(0.5) * Quaternion::rotation_y(0.5); next.foot_l.orientation = Quaternion::rotation_x(0.5) * Quaternion::rotation_y(0.5);

View File

@ -5,6 +5,7 @@ use super::{
use common::{ use common::{
comp::item::{Hands, ToolKind}, comp::item::{Hands, ToolKind},
states::utils::StageSection, states::utils::StageSection,
util::Dir,
}; };
use std::f32::consts::PI; use std::f32::consts::PI;
@ -19,6 +20,7 @@ type RollAnimationDependency = (
Vec3<f32>, Vec3<f32>,
f32, f32,
Option<StageSection>, Option<StageSection>,
Option<Dir>,
); );
impl Animation for RollAnimation { impl Animation for RollAnimation {
@ -41,6 +43,7 @@ impl Animation for RollAnimation {
last_ori, last_ori,
_global_time, _global_time,
stage_section, stage_section,
prev_aimed_dir,
): Self::Dependency<'_>, ): Self::Dependency<'_>,
anim_time: f32, anim_time: f32,
rate: &mut f32, rate: &mut f32,
@ -257,9 +260,26 @@ impl Animation for RollAnimation {
next.foot_r.orientation = Quaternion::rotation_x(0.9 * movement1); next.foot_r.orientation = Quaternion::rotation_x(0.9 * movement1);
next.torso.position = Vec3::new(0.0, 0.0, 7.0 * movement1); next.torso.position = Vec3::new(0.0, 0.0, 7.0 * movement1);
next.torso.orientation = let roll_spin = Quaternion::rotation_x(-0.3 + movement1 * -0.4 + movement2 * -2.0 * PI);
Quaternion::rotation_x(-0.3 + movement1 * -0.4 + movement2 * -2.0 * PI) next.torso.orientation = if let Some(prev_aimed_dir) = prev_aimed_dir {
* Quaternion::rotation_z(tilt * -10.0); // This is *slightly* hacky. Because rolling is not strafed movement, we
// actually correct for the entity orientation to make sure that our
// rolling motion is correct with respect to our original orientation
roll_spin
* Dir::from_unnormalized(orientation.into_array().into())
.zip(prev_aimed_dir.to_horizontal())
.map(|(ori, prev_aimed_dir)| {
Quaternion::<f32>::from_vec4(
ori.rotation_between(prev_aimed_dir)
.into_vec4()
.into_array()
.into(),
)
})
.unwrap_or_default()
} else {
roll_spin * Quaternion::rotation_z(tilt * -10.0)
};
next next
} }

View File

@ -54,7 +54,7 @@ impl Animation for RunAnimation {
let impact = (avg_vel.z).max(-8.0); let impact = (avg_vel.z).max(-8.0);
let speednorm = (speed / 9.4).powf(0.6); let speednorm = (speed / 9.4).powf(0.6);
let lab: f32 = 0.8; let lab: f32 = 0.5 / s_a.scaler;
let footrotl = ((1.0 / (0.5 + (0.5) * ((acc_vel * 1.6 * lab + PI * 1.4).sin()).powi(2))) let footrotl = ((1.0 / (0.5 + (0.5) * ((acc_vel * 1.6 * lab + PI * 1.4).sin()).powi(2)))
.sqrt()) .sqrt())
@ -83,8 +83,8 @@ impl Animation for RunAnimation {
let shortalt = (acc_vel * lab * 3.2 + PI / 1.0).sin(); let shortalt = (acc_vel * lab * 3.2 + PI / 1.0).sin();
let shortalt2 = (acc_vel * lab * 3.2).sin(); let shortalt2 = (acc_vel * lab * 3.2).sin();
let short = ((5.0 / (1.5 + 3.5 * ((acc_vel * lab * 1.6).sin()).powi(2))).sqrt()) let short = ((5.0 / (1.5 + 3.5 * ((acc_vel * lab * 1.6 + PI * 0.5).sin()).powi(2))).sqrt())
* ((acc_vel * lab * 1.6).sin()); * ((acc_vel * lab * 1.6 + PI * 0.5).sin());
let direction = velocity.y * -0.098 * orientation.y + velocity.x * -0.098 * orientation.x; let direction = velocity.y * -0.098 * orientation.y + velocity.x * -0.098 * orientation.x;
let side = let side =
@ -111,91 +111,97 @@ impl Animation for RunAnimation {
next.head.position = Vec3::new(0.0, s_a.head.0, s_a.head.1 + short * 0.1); next.head.position = Vec3::new(0.0, s_a.head.0, s_a.head.1 + short * 0.1);
next.head.orientation = next.head.orientation =
Quaternion::rotation_z(tilt * -2.5 + head_look.x * 0.2 + short * -0.06) Quaternion::rotation_z(tilt * -2.5 + head_look.x * 0.2 + short * -0.3)
* Quaternion::rotation_x(head_look.y + 0.45 * speednorm + shortalt2 * -0.05); * Quaternion::rotation_x(head_look.y + 0.45 * speednorm + shortalt2 * -0.05);
next.head.scale = Vec3::one() * s_a.head_scale; next.head.scale = Vec3::one() * s_a.head_scale;
next.chest.position = Vec3::new( next.chest.position = Vec3::new(
0.0, 0.0,
s_a.chest.0, s_a.chest.0,
s_a.chest.1 + 1.0 * speednorm + shortalt * -0.2, s_a.chest.1 + 1.0 * speednorm + shortalt * 1.1,
);
next.chest.orientation = Quaternion::rotation_z(short * 0.16 + tilt * -0.6)
* Quaternion::rotation_y(tilt * 1.6)
* Quaternion::rotation_x(
impact * 0.06 + shortalt2 * 0.03 + speednorm * -0.5 + (tilt.abs()),
); );
next.chest.orientation = Quaternion::rotation_x(impact * 0.07)
* Quaternion::rotation_z(short * 0.4 + tilt * -0.6)
* Quaternion::rotation_y(tilt * 2.0 + short * 0.2)
* Quaternion::rotation_x(shortalt2 * 0.03 + speednorm * -0.5 + tilt.abs());
next.belt.position = Vec3::new(0.0, 0.25 + s_a.belt.0, 0.25 + s_a.belt.1); next.belt.position = Vec3::new(0.0, 0.25 + s_a.belt.0, 0.25 + s_a.belt.1);
next.belt.orientation = Quaternion::rotation_x(0.1 * speednorm) next.belt.orientation = Quaternion::rotation_x(0.1 * speednorm)
* Quaternion::rotation_z(short * 0.1 + tilt * -1.1) * Quaternion::rotation_z(short * -0.2 + tilt * -1.1)
* Quaternion::rotation_y(tilt * 0.5); * Quaternion::rotation_y(tilt * 0.5);
next.back.position = Vec3::new(0.0, s_a.back.0, s_a.back.1); next.back.position = Vec3::new(0.0, s_a.back.0, s_a.back.1);
next.back.orientation = next.back.orientation =
Quaternion::rotation_x(-0.05 + short * 0.02 + noisea * 0.02 + noiseb * 0.02); Quaternion::rotation_x(-0.05 + short * 0.02 + noisea * 0.02 + noiseb * 0.02)
* Quaternion::rotation_y(foothorir * 0.2);
next.shorts.position = Vec3::new(0.0, 0.65 + s_a.shorts.0, 0.65 * speednorm + s_a.shorts.1); next.shorts.position = Vec3::new(0.0, 0.65 + s_a.shorts.0, 0.65 * speednorm + s_a.shorts.1);
next.shorts.orientation = Quaternion::rotation_x(0.2 * speednorm) next.shorts.orientation = Quaternion::rotation_x(0.2 * speednorm)
* Quaternion::rotation_z(short * 0.25 + tilt * -1.5) * Quaternion::rotation_z(short * -0.9 + tilt * -1.5)
* Quaternion::rotation_y(tilt * 0.7); * Quaternion::rotation_y(tilt * 0.7 + short * 0.08);
next.hand_l.position = Vec3::new( next.hand_l.position = Vec3::new(
-s_a.hand.0 + foothorir * -1.3 * speednorm, -s_a.hand.0 * 1.2 - foothorir * 1.3 * speednorm
3.0 * speednorm + s_a.hand.1 + foothorir * -7.0 * speednorm, + (foothoril.abs().powf(2.0) - 0.5) * speednorm * 4.0,
1.5 * speednorm + s_a.hand.2 - foothorir * 5.5 * speednorm, s_a.hand.1 * 1.3 + foothorir * -7.0 * speednorm,
s_a.hand.2 - foothorir * 2.75 * speednorm + foothoril.abs().powf(3.0) * speednorm * 8.0,
); );
next.hand_l.orientation = next.hand_l.orientation =
Quaternion::rotation_x(0.6 * speednorm + (footrotr * -1.2) * speednorm) Quaternion::rotation_x(0.6 * speednorm + (footrotr * -1.5 + 0.5) * speednorm)
* Quaternion::rotation_y(footrotr * 0.4 * speednorm); * Quaternion::rotation_y(footrotr * 0.4 * speednorm + PI * 0.07);
next.hand_r.position = Vec3::new( next.hand_r.position = Vec3::new(
s_a.hand.0 + foothoril * 1.3 * speednorm, s_a.hand.0 * 1.2 + foothoril * 1.3 * speednorm
3.0 * speednorm + s_a.hand.1 + foothoril * -7.0 * speednorm, - (foothorir.abs().powf(2.0) - 0.5) * speednorm * 4.0,
1.5 * speednorm + s_a.hand.2 - foothoril * 5.5 * speednorm, s_a.hand.1 * 1.3 + foothoril * -7.0 * speednorm,
s_a.hand.2 - foothoril * 2.75 * speednorm + foothorir.abs().powf(3.0) * speednorm * 8.0,
); );
next.hand_r.orientation = next.hand_r.orientation =
Quaternion::rotation_x(0.6 * speednorm + (footrotl * -1.2) * speednorm) Quaternion::rotation_x(0.6 * speednorm + (footrotl * -1.5 + 0.5) * speednorm)
* Quaternion::rotation_y(footrotl * -0.4 * speednorm); * Quaternion::rotation_y(footrotl * -0.4 * speednorm - PI * 0.07);
// //
next.foot_l.position = Vec3::new( next.foot_l.position = Vec3::new(
-s_a.foot.0 + footstrafel * sideabs * 3.0 + tilt * -2.0, -s_a.foot.0 + footstrafel * sideabs * 3.0 + tilt * -10.0,
s_a.foot.1 s_a.foot.1
+ (1.0 - sideabs) * (-0.5 * speednorm + foothoril * -10.5 * speednorm) + (1.0 - sideabs) * (-0.5 * speednorm + foothoril * -10.5 * speednorm)
+ (direction * 5.0).max(0.0), + (direction * 5.0).max(0.0),
s_a.foot.2 s_a.foot.2
+ (1.0 - sideabs) * (2.0 * speednorm + ((footvertl * -2.5 * speednorm).max(-1.0))) + (1.0 - sideabs) * (1.25 * speednorm + ((footvertl * -5.0 * speednorm).max(-1.0)))
+ side * ((footvertsl * 1.5).max(-1.0)), + side * ((footvertsl * 1.5).max(-1.0))
+ foothoril.abs().powf(6.0) * speednorm * 5.0,
); );
next.foot_l.orientation = Quaternion::rotation_x( next.foot_l.orientation = Quaternion::rotation_x(
(1.0 - sideabs) * (-0.2 + foothoril * -0.9 * speednorm) + sideabs * -0.5, (1.0 - sideabs) * (-0.3 + foothoril * -1.5 * speednorm) + sideabs * -0.5,
) * Quaternion::rotation_y( ) * Quaternion::rotation_y(
tilt * 2.0 + side * 0.3 + side * (foothoril * 0.3), tilt * -0.5 + side * 0.3 + side * (foothoril * 0.3),
) * Quaternion::rotation_z(side * 0.2); ) * Quaternion::rotation_z(side * 0.2);
next.foot_r.position = Vec3::new( next.foot_r.position = Vec3::new(
s_a.foot.0 + footstrafer * sideabs * 3.0 + tilt * -2.0, s_a.foot.0 + footstrafer * sideabs * 3.0 + tilt * -10.0,
s_a.foot.1 s_a.foot.1
+ (1.0 - sideabs) * (-0.5 * speednorm + foothorir * -10.5 * speednorm) + (1.0 - sideabs) * (-0.5 * speednorm + foothorir * -10.5 * speednorm)
+ (direction * 5.0).max(0.0), + (direction * 5.0).max(0.0),
s_a.foot.2 s_a.foot.2
+ (1.0 - sideabs) * (2.0 * speednorm + ((footvertr * -2.5 * speednorm).max(-1.0))) + (1.0 - sideabs) * (1.25 * speednorm + ((footvertr * -5.0 * speednorm).max(-1.0)))
+ side * ((footvertsr * -1.5).max(-1.0)), + side * ((footvertsr * -1.5).max(-1.0))
+ foothorir.abs().powf(6.0) * speednorm * 5.0,
); );
next.foot_r.orientation = Quaternion::rotation_x( next.foot_r.orientation = Quaternion::rotation_x(
(1.0 - sideabs) * (-0.2 + foothorir * -0.9 * speednorm) + sideabs * -0.5, (1.0 - sideabs) * (-0.3 + foothorir * -1.5 * speednorm) + sideabs * -0.5,
) * Quaternion::rotation_y( ) * Quaternion::rotation_y(
tilt * 2.0 + side * 0.3 + side * (foothorir * 0.3), tilt * -0.5 + side * 0.3 + side * (foothorir * 0.3),
) * Quaternion::rotation_z(side * 0.2); ) * Quaternion::rotation_z(side * 0.2);
// //
next.shoulder_l.position = Vec3::new(-s_a.shoulder.0, s_a.shoulder.1, s_a.shoulder.2); next.shoulder_l.position = Vec3::new(-s_a.shoulder.0, s_a.shoulder.1, s_a.shoulder.2);
next.shoulder_l.orientation = Quaternion::rotation_x(short * 0.15); next.shoulder_l.orientation =
Quaternion::rotation_x(short * 0.15 + (footrotl * 1.2 + 0.5) * speednorm);
next.shoulder_l.scale = Vec3::one() * 1.1; next.shoulder_l.scale = Vec3::one() * 1.1;
next.shoulder_r.position = Vec3::new(s_a.shoulder.0, s_a.shoulder.1, s_a.shoulder.2); next.shoulder_r.position = Vec3::new(s_a.shoulder.0, s_a.shoulder.1, s_a.shoulder.2);
next.shoulder_r.orientation = Quaternion::rotation_x(short * -0.15); next.shoulder_r.orientation =
Quaternion::rotation_x(short * -0.15 + (footrotr * 1.2 + 0.5) * speednorm);
next.shoulder_r.scale = Vec3::one() * 1.1; next.shoulder_r.scale = Vec3::one() * 1.1;
next.glider.position = Vec3::new(0.0, 0.0, 10.0); next.glider.position = Vec3::new(0.0, 0.0, 10.0);
@ -266,6 +272,7 @@ impl Animation for RunAnimation {
s_a.hand.2 + 12.0 + impact * -0.1, s_a.hand.2 + 12.0 + impact * -0.1,
); );
next.hand_r.orientation = Quaternion::rotation_x(2.25) * Quaternion::rotation_z(0.9); next.hand_r.orientation = Quaternion::rotation_x(2.25) * Quaternion::rotation_z(0.9);
next.shoulder_r.orientation = Quaternion::rotation_x(short * -0.15 + 2.0);
let fast = (anim_time * 8.0).sin(); let fast = (anim_time * 8.0).sin();
let fast2 = (anim_time * 6.0 + 8.0).sin(); let fast2 = (anim_time * 6.0 + 8.0).sin();

View File

@ -60,18 +60,20 @@ impl Animation for SitAnimation {
next.shorts.orientation = Quaternion::rotation_x(stop * 0.6); next.shorts.orientation = Quaternion::rotation_x(stop * 0.6);
next.hand_l.position = Vec3::new( next.hand_l.position = Vec3::new(
-s_a.hand.0, -s_a.hand.0 - 1.0,
s_a.hand.1 + slowa * 0.15, s_a.hand.1 + slowa * 0.15,
s_a.hand.2 + slow * 0.7 + stop * -2.0, s_a.hand.2 + slow * 0.7 + stop * -2.0 - 1.0,
); );
next.hand_l.orientation = Quaternion::rotation_x(slowa * -0.1 + slow * 0.1); next.hand_l.orientation =
Quaternion::rotation_x(slowa * -0.1 + slow * 0.1) * Quaternion::rotation_y(PI * 0.15);
next.hand_r.position = Vec3::new( next.hand_r.position = Vec3::new(
s_a.hand.0, s_a.hand.0 + 1.0,
s_a.hand.1 + slowa * 0.15, s_a.hand.1 + slowa * 0.15,
s_a.hand.2 + slow * 0.7 + stop * -2.0, s_a.hand.2 + slow * 0.7 + stop * -2.0 - 1.0,
); );
next.hand_r.orientation = Quaternion::rotation_x(slow * -0.1 + slowa * 0.1); next.hand_r.orientation =
Quaternion::rotation_x(slow * -0.1 + slowa * 0.1) * Quaternion::rotation_y(PI * -0.15);
next.foot_l.position = Vec3::new(-s_a.foot.0, 4.0 + s_a.foot.1, 3.0 + s_a.foot.2); next.foot_l.position = Vec3::new(-s_a.foot.0, 4.0 + s_a.foot.1, 3.0 + s_a.foot.2);
next.foot_l.orientation = Quaternion::rotation_x(slow * 0.1 + stop * 1.2 + slow * 0.1); next.foot_l.orientation = Quaternion::rotation_x(slow * 0.1 + stop * 1.2 + slow * 0.1);

View File

@ -185,6 +185,7 @@ impl Animation for StandAnimation {
* Quaternion::rotation_z(0.9) * Quaternion::rotation_z(0.9)
* Quaternion::rotation_y(head_look.x * 1.5) * Quaternion::rotation_y(head_look.x * 1.5)
* Quaternion::rotation_x(head_look.y * 1.5); * Quaternion::rotation_x(head_look.y * 1.5);
next.shoulder_r.orientation = Quaternion::rotation_x(slow * 0.15 + 2.0);
let fast = (anim_time * 5.0).sin(); let fast = (anim_time * 5.0).sin();
let fast2 = (anim_time * 4.5 + 8.0).sin(); let fast2 = (anim_time * 4.5 + 8.0).sin();

View File

@ -54,27 +54,16 @@ impl Animation for WieldAnimation {
(global_time + anim_time / 3.0).floor().mul(1337.0).sin() * 0.1, (global_time + anim_time / 3.0).floor().mul(1337.0).sin() * 0.1,
); );
let foothoril = (anim_time * 16.0 * lab + PI * 1.45).sin();
let beltstatic = (anim_time * 10.0 * lab + PI / 2.0).sin(); let beltstatic = (anim_time * 10.0 * lab + PI / 2.0).sin();
let footvertlstatic = (anim_time * 10.0 * lab).sin(); let footvertlstatic = (anim_time * 10.0 * lab).sin();
let footvertrstatic = (anim_time * 10.0 * lab + PI).sin(); let footvertrstatic = (anim_time * 10.0 * lab + PI).sin();
let footrotl =
((1.0 / (0.5 + (0.5) * ((anim_time * 16.0 * lab + PI * 1.4).sin()).powi(2))).sqrt())
* ((anim_time * 16.0 * lab + PI * 1.4).sin());
let shortalt = (anim_time * lab * 16.0 + PI / 2.0).sin();
let slowalt = (anim_time * 9.0 + PI).cos(); let slowalt = (anim_time * 9.0 + PI).cos();
let u_slow = (anim_time * 4.5 + PI).sin(); let u_slow = (anim_time * 4.5 + PI).sin();
let slow = (anim_time * 7.0 + PI).sin(); let slow = (anim_time * 7.0 + PI).sin();
let u_slowalt = (anim_time * 5.0 + PI).cos(); let u_slowalt = (anim_time * 5.0 + PI).cos();
let short = ((5.0 / (1.5 + 3.5 * ((anim_time * lab * 16.0).sin()).powi(2))).sqrt())
* ((anim_time * lab * 16.0).sin());
let direction = velocity.y * -0.098 * orientation.y + velocity.x * -0.098 * orientation.x; let direction = velocity.y * -0.098 * orientation.y + velocity.x * -0.098 * orientation.x;
let side = velocity.x * -0.098 * orientation.y + velocity.y * 0.098 * orientation.x;
let strafe = -((1.0 / (direction).abs() - 1.0).min(1.0)).copysign(side);
let ori: Vec2<f32> = Vec2::from(orientation); let ori: Vec2<f32> = Vec2::from(orientation);
let last_ori = Vec2::from(last_ori); let last_ori = Vec2::from(last_ori);
@ -100,24 +89,16 @@ impl Animation for WieldAnimation {
next.main.orientation = Quaternion::rotation_z(0.0); next.main.orientation = Quaternion::rotation_z(0.0);
next.second.position = Vec3::new(0.0, 0.0, 0.0); next.second.position = Vec3::new(0.0, 0.0, 0.0);
next.second.orientation = Quaternion::rotation_z(0.0); next.second.orientation = Quaternion::rotation_z(0.0);
if speed > 0.2 && velocity.z == 0.0 {
next.chest.orientation = Quaternion::rotation_z(short * 0.1 + strafe * 0.7 * speednorm)
* Quaternion::rotation_y(strafe * 0.2)
* Quaternion::rotation_x(((direction * 0.4).min(0.3)) * (1.0 - tilt.abs()));
next.head.orientation =
Quaternion::rotation_z(tilt * -0.5 + strafe * 0.4 * direction + strafe * -0.7)
* Quaternion::rotation_x(
(0.3 - direction * 0.1) * (1.0 - tilt.abs()) + look_dir.z * 0.7,
);
next.chest.position = let is_moving = speed > 0.2 && velocity.z == 0.0;
Vec3::new(short * strafe, s_a.chest.0, s_a.chest.1 + shortalt * -1.5);
} else { if !is_moving {
next.head.position = Vec3::new(0.0, s_a.head.0, s_a.head.1 + u_slow * 0.1); next.head.position = Vec3::new(0.0, s_a.head.0, s_a.head.1 + u_slow * 0.1);
next.head.orientation = Quaternion::rotation_z(head_look.x + tilt * -0.75) next.head.orientation = Quaternion::rotation_z(head_look.x + tilt * -0.75)
* Quaternion::rotation_x(head_look.y.abs() + look_dir.z * 0.7); * Quaternion::rotation_x(head_look.y.abs() + look_dir.z * 0.7);
next.chest.position = Vec3::new(slowalt * 0.5, s_a.chest.0, s_a.chest.1 + u_slow * 0.5); next.chest.position =
Vec3::new(slowalt * 0.2, s_a.chest.0, s_a.chest.1 + u_slow * 0.35);
next.belt.orientation = Quaternion::rotation_z(0.15 + beltstatic * tilt * 0.1); next.belt.orientation = Quaternion::rotation_z(0.15 + beltstatic * tilt * 0.1);
next.shorts.orientation = Quaternion::rotation_z(0.3 + beltstatic * tilt * 0.2); next.shorts.orientation = Quaternion::rotation_z(0.3 + beltstatic * tilt * 0.2);
@ -147,47 +128,30 @@ impl Animation for WieldAnimation {
next.belt.position = Vec3::new(0.0, s_a.belt.0, s_a.belt.1); next.belt.position = Vec3::new(0.0, s_a.belt.0, s_a.belt.1);
next.back.orientation = Quaternion::rotation_x(-0.2); // next.back.orientation = Quaternion::rotation_x(-0.2);
next.shorts.position = Vec3::new(0.0, s_a.shorts.0, s_a.shorts.1); next.shorts.position = Vec3::new(0.0, s_a.shorts.0, s_a.shorts.1);
} }
match (hands, active_tool_kind, second_tool_kind) { match (hands, active_tool_kind, second_tool_kind) {
((Some(Hands::Two), _), tool, _) | ((None, Some(Hands::Two)), _, tool) => match tool { ((Some(Hands::Two), _), tool, _) | ((None, Some(Hands::Two)), _, tool) => match tool {
Some(ToolKind::Sword) => { Some(ToolKind::Sword) => {
next.hand_l.position = Vec3::new(s_a.shl.0, s_a.shl.1, s_a.shl.2); next.control_l.position = next.hand_l.position * 0.2
+ Vec3::new(
s_a.sc.0,
s_a.sc.1 - slow * 2.0 * speednorm,
s_a.sc.2 + direction * -5.0 - slow * 2.0 * speednorm,
);
next.control_r.position = next.control_l.position;
next.hand_l.position = Vec3::new(s_a.shl.0 - 0.5, s_a.shl.1, s_a.shl.2);
next.hand_l.orientation = next.hand_l.orientation =
Quaternion::rotation_x(s_a.shl.3) * Quaternion::rotation_y(s_a.shl.4); Quaternion::rotation_x(s_a.shl.3) * Quaternion::rotation_y(s_a.shl.4);
next.control_l.orientation = Quaternion::rotation_x(s_a.sc.3 + u_slow * 0.05)
next.hand_r.position = Vec3::new( * Quaternion::rotation_z(u_slowalt * 0.04);
foothoril * 1.3 * speednorm - s_a.sc.0 + 6.0, next.control_r.orientation = Quaternion::rotation_x(s_a.sc.3 + u_slow * 0.15)
speednorm + foothoril * -3.0 * speednorm - 4.0,
-1.0 * speednorm - foothoril * 5.5 * speednorm - 2.0,
);
next.hand_r.orientation =
Quaternion::rotation_x(
0.6 * speednorm + (footrotl * -1.2) * speednorm + 0.9,
) * Quaternion::rotation_y(footrotl * -0.4 * speednorm);
next.control.position =
Vec3::new(s_a.sc.0, s_a.sc.1, s_a.sc.2 + direction * -5.0);
next.control.orientation = Quaternion::rotation_x(s_a.sc.3 + u_slow * 0.15)
* Quaternion::rotation_z(u_slowalt * 0.08); * Quaternion::rotation_z(u_slowalt * 0.08);
//carried position next.hand_r.position = Vec3::zero();
/*
next.hand_l.position = Vec3::new(s_a.shl.0, s_a.shl.1, s_a.shl.2);
next.hand_l.orientation =
Quaternion::rotation_x(s_a.shl.3) * Quaternion::rotation_y(s_a.shl.4);
next.hand_r.position = Vec3::new(
-s_a.sc.0+6.0,
-4.0,
-2.0,
);
next.hand_r.orientation = next.hand_r.orientation =
Quaternion::rotation_x(0.9); next.hand_l.orientation * Quaternion::rotation_y(PI * 0.3);
next.control.position =
Vec3::new(s_a.sc.0, s_a.sc.1, s_a.sc.2);
next.control.orientation = Quaternion::rotation_x(s_a.sc.3 )
;
*/
}, },
Some(ToolKind::Axe) => { Some(ToolKind::Axe) => {
next.main.position = Vec3::new(0.0, 0.0, 0.0); next.main.position = Vec3::new(0.0, 0.0, 0.0);
@ -212,56 +176,52 @@ impl Animation for WieldAnimation {
next.hand_l.position = Vec3::new(s_a.ahl.0, s_a.ahl.1, s_a.ahl.2); next.hand_l.position = Vec3::new(s_a.ahl.0, s_a.ahl.1, s_a.ahl.2);
next.hand_l.orientation = next.hand_l.orientation =
Quaternion::rotation_x(s_a.ahl.3) * Quaternion::rotation_y(s_a.ahl.4); Quaternion::rotation_x(s_a.ahl.3) * Quaternion::rotation_y(s_a.ahl.4);
next.hand_r.position = Vec3::new(s_a.ahr.0, s_a.ahr.1, s_a.ahr.2); next.hand_r.position = Vec3::new(s_a.ahr.0, s_a.ahr.1 + 2.0, s_a.ahr.2);
next.hand_r.orientation = next.hand_r.orientation = Quaternion::rotation_x(s_a.ahr.3)
Quaternion::rotation_x(s_a.ahr.3) * Quaternion::rotation_z(s_a.ahr.5); * Quaternion::rotation_z(s_a.ahr.5)
* Quaternion::rotation_y(PI * -0.25);
next.control.position = next.control.position =
Vec3::new(s_a.ac.0, s_a.ac.1, s_a.ac.2 + direction * -5.0); Vec3::new(s_a.ac.0, s_a.ac.1 - 4.0, s_a.ac.2 + direction * -5.0);
next.control.orientation = Quaternion::rotation_x(s_a.ac.3) next.control.orientation = Quaternion::rotation_x(s_a.ac.3)
* Quaternion::rotation_y(s_a.ac.4) * Quaternion::rotation_y(s_a.ac.4)
* Quaternion::rotation_z(s_a.ac.5); * Quaternion::rotation_z(s_a.ac.5);
}, },
Some(ToolKind::Hammer | ToolKind::Pick) => { Some(ToolKind::Hammer | ToolKind::Pick) => {
next.hand_l.position = Vec3::new(s_a.hhl.0, s_a.hhl.1, s_a.hhl.2); next.hand_l.position = Vec3::new(s_a.hhl.0, s_a.hhl.1 + 3.0, s_a.hhl.2 - 1.0);
next.hand_l.orientation = Quaternion::rotation_x(s_a.hhl.3) next.hand_l.orientation = Quaternion::rotation_x(s_a.hhl.3)
* Quaternion::rotation_y(s_a.hhl.4) * Quaternion::rotation_y(s_a.hhl.4)
* Quaternion::rotation_z(s_a.hhl.5); * Quaternion::rotation_z(s_a.hhl.5);
next.hand_r.position = Vec3::new(s_a.hhr.0, s_a.hhr.1, s_a.hhr.2); next.hand_r.position = Vec3::new(s_a.hhr.0, s_a.hhr.1 + 3.0, s_a.hhr.2 + 1.0);
next.hand_r.orientation = Quaternion::rotation_x(s_a.hhr.3) next.hand_r.orientation = Quaternion::rotation_x(s_a.hhr.3)
* Quaternion::rotation_y(s_a.hhr.4) * Quaternion::rotation_y(s_a.hhr.4)
* Quaternion::rotation_z(s_a.hhr.5); * Quaternion::rotation_z(s_a.hhr.5);
next.control.position = next.control.position =
Vec3::new(s_a.hc.0, s_a.hc.1, s_a.hc.2 + direction * -5.0); Vec3::new(s_a.hc.0 - 1.0, s_a.hc.1, s_a.hc.2 + direction * -5.0 - 3.0);
next.control.orientation = Quaternion::rotation_x(s_a.hc.3 + u_slow * 0.15) next.control.orientation = Quaternion::rotation_x(s_a.hc.3 + u_slow * 0.15)
* Quaternion::rotation_y(s_a.hc.4) * Quaternion::rotation_y(s_a.hc.4)
* Quaternion::rotation_z(s_a.hc.5 + u_slowalt * 0.07); * Quaternion::rotation_z(s_a.hc.5 + u_slowalt * 0.07);
}, },
Some(ToolKind::Staff) | Some(ToolKind::Sceptre) => { Some(ToolKind::Staff) | Some(ToolKind::Sceptre) => {
if speed > 0.5 && velocity.z == 0.0 { next.control_l.position = next.hand_l.position * 0.2
next.hand_r.position = Vec3::new( + Vec3::new(
7.0 + s_a.hand.0 + foothoril * 1.3, s_a.sc.0 + 1.0,
-4.0 + s_a.hand.1 + foothoril * -7.0, s_a.sc.1 - slow * 2.0 * speednorm - 3.0,
1.0 + s_a.hand.2 - foothoril * 5.5, s_a.sc.2 + direction * -5.0 - slow * 2.0 * speednorm - 3.0,
); );
next.hand_r.orientation = Quaternion::rotation_x(0.6 + footrotl * -1.2) next.control_r.position = next.control_l.position;
* Quaternion::rotation_y(footrotl * -0.4);
} else { next.hand_l.position = Vec3::new(s_a.shl.0 - 0.5, s_a.shl.1, s_a.shl.2 + 0.0);
next.hand_r.position = Vec3::new(s_a.sthr.0, s_a.sthr.1, s_a.sthr.2); next.hand_l.orientation =
Quaternion::rotation_x(s_a.shl.3) * Quaternion::rotation_y(s_a.shl.4);
next.control_l.orientation = Quaternion::rotation_x(s_a.sc.3 + u_slow * 0.05)
* Quaternion::rotation_z(u_slowalt * 0.04);
next.control_r.orientation = Quaternion::rotation_x(s_a.sc.3 + u_slow * 0.15)
* Quaternion::rotation_z(u_slowalt * 0.08);
next.hand_r.position = Vec3::new(0.0, 0.0, 8.0);
next.hand_r.orientation = next.hand_r.orientation =
Quaternion::rotation_x(s_a.sthr.3) * Quaternion::rotation_y(s_a.sthr.4); next.hand_l.orientation * Quaternion::rotation_y(PI * 0.3);
};
next.control.position =
Vec3::new(s_a.stc.0, s_a.stc.1, s_a.stc.2 + direction * -5.0);
next.hand_l.position = Vec3::new(s_a.sthl.0, s_a.sthl.1, s_a.sthl.2);
next.hand_l.orientation = Quaternion::rotation_x(s_a.sthl.3);
next.control.orientation = Quaternion::rotation_x(s_a.stc.3 + u_slow * 0.1)
* Quaternion::rotation_y(s_a.stc.4)
* Quaternion::rotation_z(s_a.stc.5 + u_slowalt * 0.1);
}, },
Some(ToolKind::Bow) => { Some(ToolKind::Bow) => {
next.main.position = Vec3::new(0.0, 0.0, 0.0); next.main.position = Vec3::new(0.0, 0.0, 0.0);
@ -542,21 +502,29 @@ impl Animation for WieldAnimation {
}; };
match hands { match hands {
(Some(Hands::One), _) => { (Some(Hands::One), _) => {
next.control_l.position = Vec3::new(-7.0, 8.0, 2.0); next.control_l.position =
next.control_l.orientation = next.hand_l.position * Vec3::new(0.5, 0.5, 0.3) + Vec3::new(-4.0, 0.0, 0.0);
Quaternion::rotation_x(-0.3) * Quaternion::rotation_y(0.2); next.control_l.orientation = Quaternion::lerp(
next.hand_l.position = Vec3::new(0.0, -0.5, 0.0); next.hand_l.orientation,
next.hand_l.orientation = Quaternion::rotation_x(PI / 2.0) Quaternion::rotation_x(PI * -0.5),
0.65,
);
next.hand_l.position = Vec3::new(0.0, -2.0, 0.0);
next.hand_l.orientation = Quaternion::rotation_x(PI * 0.5);
}, },
(_, _) => {}, (_, _) => {},
}; };
match hands { match hands {
(None | Some(Hands::One), Some(Hands::One)) => { (None | Some(Hands::One), Some(Hands::One)) => {
next.control_r.position = Vec3::new(7.0, 8.0, 2.0); next.control_r.position =
next.control_r.orientation = next.hand_r.position * Vec3::new(0.5, 0.5, 0.3) + Vec3::new(4.0, 0.0, 0.0);
Quaternion::rotation_x(-0.3) * Quaternion::rotation_y(-0.2); next.control_r.orientation = Quaternion::lerp(
next.hand_r.position = Vec3::new(0.0, -0.5, 0.0); next.hand_r.orientation,
next.hand_r.orientation = Quaternion::rotation_x(PI / 2.0) Quaternion::rotation_x(PI * -0.5),
0.65,
);
next.hand_r.position = Vec3::new(0.0, -2.0, 0.0);
next.hand_r.orientation = Quaternion::rotation_x(PI * 0.5);
}, },
(_, _) => {}, (_, _) => {},
}; };
@ -570,9 +538,10 @@ impl Animation for WieldAnimation {
}; };
match hands { match hands {
(None, None) | (Some(Hands::One), None) => { (None, None) | (Some(Hands::One), None) => {
next.hand_r.position = Vec3::new(8.0, 2.0, 1.0); // next.hand_r.position = Vec3::new(8.0, 2.0, 1.0);
next.hand_r.orientation = // next.hand_r.orientation =
Quaternion::rotation_x(0.5) * Quaternion::rotation_y(-0.25); // Quaternion::rotation_x(0.5) *
// Quaternion::rotation_y(-0.25);
}, },
(_, _) => {}, (_, _) => {},
}; };

View File

@ -9,7 +9,7 @@ use crate::{
}; };
use client::Client; use client::Client;
use common::{ use common::{
comp::{Body, CharacterState, PhysicsState, Pos, Vel}, comp::{Body, CharacterState, PhysicsState, Pos, Scale, Vel},
resources::DeltaTime, resources::DeltaTime,
terrain::{BlockKind, TerrainChunk}, terrain::{BlockKind, TerrainChunk},
vol::ReadVol, vol::ReadVol,
@ -26,7 +26,7 @@ struct PreviousEntityState {
time: Instant, time: Instant,
on_ground: bool, on_ground: bool,
in_water: bool, in_water: bool,
distance_travelled: f32, steps_taken: f32,
} }
impl Default for PreviousEntityState { impl Default for PreviousEntityState {
@ -36,7 +36,7 @@ impl Default for PreviousEntityState {
time: Instant::now(), time: Instant::now(),
on_ground: true, on_ground: true,
in_water: false, in_water: false,
distance_travelled: 0.0, steps_taken: 0.0,
} }
} }
} }
@ -61,11 +61,12 @@ impl EventMapper for MovementEventMapper {
let focus_off = camera.get_focus_pos().map(f32::trunc); let focus_off = camera.get_focus_pos().map(f32::trunc);
let cam_pos = camera.dependents().cam_pos + focus_off; let cam_pos = camera.dependents().cam_pos + focus_off;
for (entity, pos, vel, body, physics, character) in ( for (entity, pos, vel, body, scale, physics, character) in (
&ecs.entities(), &ecs.entities(),
&ecs.read_storage::<Pos>(), &ecs.read_storage::<Pos>(),
&ecs.read_storage::<Vel>(), &ecs.read_storage::<Vel>(),
&ecs.read_storage::<Body>(), &ecs.read_storage::<Body>(),
ecs.read_storage::<Scale>().maybe(),
&ecs.read_storage::<PhysicsState>(), &ecs.read_storage::<PhysicsState>(),
ecs.read_storage::<CharacterState>().maybe(), ecs.read_storage::<CharacterState>().maybe(),
) )
@ -115,7 +116,7 @@ impl EventMapper for MovementEventMapper {
underwater, underwater,
); );
internal_state.time = Instant::now(); internal_state.time = Instant::now();
internal_state.distance_travelled = 0.0; internal_state.steps_taken = 0.0;
} }
// update state to determine the next event. We only record the time (above) if // update state to determine the next event. We only record the time (above) if
@ -124,7 +125,8 @@ impl EventMapper for MovementEventMapper {
internal_state.on_ground = physics.on_ground.is_some(); internal_state.on_ground = physics.on_ground.is_some();
internal_state.in_water = physics.in_liquid().is_some(); internal_state.in_water = physics.in_liquid().is_some();
let dt = ecs.fetch::<DeltaTime>().0; let dt = ecs.fetch::<DeltaTime>().0;
internal_state.distance_travelled += vel.0.magnitude() * dt; internal_state.steps_taken +=
vel.0.magnitude() * dt / (body.stride_length() * scale.map_or(1.0, |s| s.0));
} }
} }
@ -167,9 +169,9 @@ impl MovementEventMapper {
if let Some((event, item)) = sfx_trigger_item { if let Some((event, item)) = sfx_trigger_item {
if &previous_state.event == event { if &previous_state.event == event {
match event { match event {
SfxEvent::Run(_) => previous_state.distance_travelled >= item.threshold, SfxEvent::Run(_) => previous_state.steps_taken >= item.threshold,
SfxEvent::Climb => previous_state.distance_travelled >= item.threshold, SfxEvent::Climb => previous_state.steps_taken >= item.threshold,
SfxEvent::QuadRun(_) => previous_state.distance_travelled >= item.threshold, SfxEvent::QuadRun(_) => previous_state.steps_taken >= item.threshold,
_ => previous_state.time.elapsed().as_secs_f32() >= item.threshold, _ => previous_state.time.elapsed().as_secs_f32() >= item.threshold,
} }
} else { } else {

View File

@ -32,7 +32,7 @@ fn config_but_played_since_threshold_no_emit() {
time: Instant::now(), time: Instant::now(),
on_ground: true, on_ground: true,
in_water: false, in_water: false,
distance_travelled: 0.0, steps_taken: 0.0,
}; };
let result = MovementEventMapper::should_emit( let result = MovementEventMapper::should_emit(
@ -56,7 +56,7 @@ fn config_and_not_played_since_threshold_emits() {
time: Instant::now().checked_add(Duration::from_secs(1)).unwrap(), time: Instant::now().checked_add(Duration::from_secs(1)).unwrap(),
on_ground: true, on_ground: true,
in_water: false, in_water: false,
distance_travelled: 0.0, steps_taken: 0.0,
}; };
let result = MovementEventMapper::should_emit( let result = MovementEventMapper::should_emit(
@ -82,7 +82,7 @@ fn same_previous_event_elapsed_emits() {
.unwrap(), .unwrap(),
on_ground: true, on_ground: true,
in_water: false, in_water: false,
distance_travelled: 2.0, steps_taken: 2.0,
}; };
let result = MovementEventMapper::should_emit( let result = MovementEventMapper::should_emit(
@ -106,7 +106,7 @@ fn maps_idle() {
time: Instant::now(), time: Instant::now(),
on_ground: true, on_ground: true,
in_water: false, in_water: false,
distance_travelled: 0.0, steps_taken: 0.0,
}, },
Vec3::zero(), Vec3::zero(),
BlockKind::Grass, BlockKind::Grass,
@ -128,7 +128,7 @@ fn maps_run_with_sufficient_velocity() {
time: Instant::now(), time: Instant::now(),
on_ground: true, on_ground: true,
in_water: false, in_water: false,
distance_travelled: 0.0, steps_taken: 0.0,
}, },
Vec3::new(0.5, 0.8, 0.0), Vec3::new(0.5, 0.8, 0.0),
BlockKind::Grass, BlockKind::Grass,
@ -150,7 +150,7 @@ fn does_not_map_run_with_insufficient_velocity() {
time: Instant::now(), time: Instant::now(),
on_ground: true, on_ground: true,
in_water: false, in_water: false,
distance_travelled: 0.0, steps_taken: 0.0,
}, },
Vec3::new(0.02, 0.0001, 0.0), Vec3::new(0.02, 0.0001, 0.0),
BlockKind::Grass, BlockKind::Grass,
@ -169,7 +169,7 @@ fn does_not_map_run_with_sufficient_velocity_but_not_on_ground() {
time: Instant::now(), time: Instant::now(),
on_ground: false, on_ground: false,
in_water: false, in_water: false,
distance_travelled: 0.0, steps_taken: 0.0,
}, },
Vec3::new(0.5, 0.8, 0.0), Vec3::new(0.5, 0.8, 0.0),
BlockKind::Grass, BlockKind::Grass,
@ -200,6 +200,7 @@ fn maps_roll() {
timer: Duration::default(), timer: Duration::default(),
stage_section: states::utils::StageSection::Buildup, stage_section: states::utils::StageSection::Buildup,
was_wielded: true, was_wielded: true,
prev_aimed_dir: None,
is_sneaking: false, is_sneaking: false,
was_combo: None, was_combo: None,
}), }),
@ -212,7 +213,7 @@ fn maps_roll() {
time: Instant::now(), time: Instant::now(),
on_ground: true, on_ground: true,
in_water: false, in_water: false,
distance_travelled: 0.0, steps_taken: 0.0,
}, },
Vec3::new(0.5, 0.5, 0.0), Vec3::new(0.5, 0.5, 0.0),
BlockKind::Grass, BlockKind::Grass,
@ -234,7 +235,7 @@ fn maps_land_on_ground_to_run() {
time: Instant::now(), time: Instant::now(),
on_ground: false, on_ground: false,
in_water: false, in_water: false,
distance_travelled: 0.0, steps_taken: 0.0,
}, },
Vec3::zero(), Vec3::zero(),
BlockKind::Grass, BlockKind::Grass,
@ -253,7 +254,7 @@ fn maps_glide() {
time: Instant::now(), time: Instant::now(),
on_ground: false, on_ground: false,
in_water: false, in_water: false,
distance_travelled: 0.0, steps_taken: 0.0,
}, },
Vec3::zero(), Vec3::zero(),
BlockKind::Grass, BlockKind::Grass,

View File

@ -1101,9 +1101,9 @@ impl FigureMgr {
let holding_lantern = inventory let holding_lantern = inventory
.map_or(false, |i| i.equipped(EquipSlot::Lantern).is_some()) .map_or(false, |i| i.equipped(EquipSlot::Lantern).is_some())
&& light_emitter.is_some() && light_emitter.is_some()
&& !(second_tool_hand.is_some() && ((second_tool_hand.is_none()
|| matches!(active_tool_hand, Some(Hands::Two)) && matches!(active_tool_hand, Some(Hands::One)))
&& character.map_or(false, |c| c.is_wield())) || !character.map_or(false, |c| c.is_wield()))
&& !character.map_or(false, |c| c.is_using_hands()) && !character.map_or(false, |c| c.is_using_hands())
&& physics.in_liquid().is_none(); && physics.in_liquid().is_none();
@ -1263,6 +1263,7 @@ impl FigureMgr {
state.last_ori * anim::vek::Vec3::<f32>::unit_y(), state.last_ori * anim::vek::Vec3::<f32>::unit_y(),
time, time,
Some(s.stage_section), Some(s.stage_section),
s.prev_aimed_dir,
), ),
stage_progress, stage_progress,
&mut state_animation_rate, &mut state_animation_rate,