From f8d18e4913061eb71687e35ebac94f567c384e6d Mon Sep 17 00:00:00 2001 From: Justin Shipsey Date: Thu, 5 Mar 2020 14:02:11 +0000 Subject: [PATCH] weapon control bone --- CHANGELOG.md | 2 + assets/voxygen/element/frames/banner_top.png | Bin 728 -> 4881 bytes .../voxygen/element/misc_bg/textbox_bot.png | Bin 1017 -> 6377 bytes .../voxygen/element/misc_bg/textbox_mid.png | Bin 839 -> 6103 bytes .../voxygen/element/misc_bg/textbox_top.png | Bin 1020 -> 6358 bytes voxygen/src/anim/biped_large/mod.rs | 4 +- voxygen/src/anim/bird_medium/mod.rs | 4 +- voxygen/src/anim/bird_small/mod.rs | 4 +- voxygen/src/anim/character/attack.rs | 86 +++++++++------- voxygen/src/anim/character/block.rs | 24 +++-- voxygen/src/anim/character/blockidle.rs | 24 +++-- voxygen/src/anim/character/charge.rs | 5 + voxygen/src/anim/character/cidle.rs | 36 +++---- voxygen/src/anim/character/climb.rs | 41 ++++++-- voxygen/src/anim/character/crun.rs | 36 ++++--- voxygen/src/anim/character/gliding.rs | 35 +++++-- voxygen/src/anim/character/idle.rs | 39 +++++-- voxygen/src/anim/character/jump.rs | 35 +++++-- voxygen/src/anim/character/mod.rs | 31 ++++-- voxygen/src/anim/character/roll.rs | 40 ++++++-- voxygen/src/anim/character/run.rs | 95 ++++++++++++------ voxygen/src/anim/character/sit.rs | 36 +++++-- voxygen/src/anim/character/stand.rs | 48 ++++++--- voxygen/src/anim/character/swim.rs | 37 +++++-- voxygen/src/anim/character/wield.rs | 28 ++++-- voxygen/src/anim/critter/mod.rs | 4 +- voxygen/src/anim/dragon/mod.rs | 4 +- voxygen/src/anim/fish_medium/mod.rs | 4 +- voxygen/src/anim/fish_small/mod.rs | 4 +- voxygen/src/anim/fixture/mod.rs | 4 +- voxygen/src/anim/mod.rs | 2 +- voxygen/src/anim/object/mod.rs | 4 +- voxygen/src/anim/quadruped_medium/mod.rs | 4 +- voxygen/src/anim/quadruped_small/mod.rs | 4 +- voxygen/src/scene/figure/cache.rs | 26 ++--- 35 files changed, 505 insertions(+), 245 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0e3ca83fa6..227c50b450 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added sfx for wielding/unwielding weapons - Fixed NPCs attacking the player forever after killing them - Added sfx for collecting, dropping and using inventory items +- New attack animation +- weapon control system ### Changed diff --git a/assets/voxygen/element/frames/banner_top.png b/assets/voxygen/element/frames/banner_top.png index d3561d3a9cda48d61449495b3d8d998a51a2f28e..e75a275660511ca78201e543a94edcba06e9586c 100644 GIT binary patch delta 4875 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 x06<2WG#Q*>R07*qoM6N<$0fNgoSMC4+ delta 687 zcmV;g0#N;tCfEg#Ba?v-7JndPNK#Dz0D2_=0Dyx40Qvs_0D$QL0Cg|`0P0`>06Lfe z02gnPU&TfM00Le~L_t(|+U%W6a)U4sL?Pu%!1cV$Dkt&E%UsXCMpjg%C{)sDdL)qF zTjgWMAPt&UOUCmwJ}>9-t0)fm+J6e_hqY5a4apbz3IHnR?T7p0Ie)|j{r-F(R*?JS zxftWTEphg*FMYq-<5b7@j&E&$)p;CT*J{ZtVLq*c+;=Dx0MK$9^}@CalB;yq{_whFcvR4dVWunf@vx7nbfH;Mc@*plar+Zh9p=1COAn;hgRv?J@9TRj&!{|U6?Yp)P$&SP_fVoo zRrquw{Uc1588fL@`ruKZW6oPSXsK-3(#_s-o~&&zw= ztk%W$XR5tWC;$+rP*g7P*;je23Ze8o)T8JpLO3B`%nO&y@wM08IN9-$h&G4{XCK0bKtYh!FxY1CZ{~Sc{GZ$ zOpO;P6adhBD5K%60JXuU3p-^2AXK4j->dOLsQ^HYGMRYlJpibg5B~O|StJ0U5WYDO0Alz9009600{~#_ V(7>zx6@mZ&002ovPDHLkV1g@fMCAYg diff --git a/assets/voxygen/element/misc_bg/textbox_bot.png b/assets/voxygen/element/misc_bg/textbox_bot.png index c28435b70353ea15fae94590b4c79672d1d5c893..330ab52d801bfa21f6f209c45ce6a9506600601e 100644 GIT binary patch literal 6377 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 delta 996 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 diff --git a/assets/voxygen/element/misc_bg/textbox_top.png b/assets/voxygen/element/misc_bg/textbox_top.png index 8431fc58ced781bd990d79fc560e7a8b56e7172b..8666ed9d1fbfee2f06a3fb31c290cded1ba0c5a5 100644 GIT binary patch literal 6358 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 Y0E89YwfjLv^#A|>07*qoM6N<$f+d+20{{R3 delta 981 zcmV;`11kL1G5iORBa>qk7JndPNK#Dz0D2_=0Dyx40Qvs_0D$QL0Cg|`0P0`>06Lfe z02gnPU&TfM00V+aL_t(|+U%V%Z`wc@hQCx9sty%HhfbB1DH)LZ12W{l&(w=ex7-h_Rn%F*$Qz>^pz=et)k)_+mUB3&dx! zSUl;MzZ-gpul4puM5L?N!F)cC8t)aCK0rJ!k1zID*NjF4*3;2ezx*L0GMFuIb^C+) zzQJsH=NT_bzkL7obhOb;TRs2%F3#7d&-YQ{tR_Pg3Lu$66|8Vg_W(`fkKXQb%A_m` zp~`{{X3NZ>K(79GMSn_l>}MR`MsL5kt_k?(JqNSp4IT>M)Cy(u00})uC6CaQcs8$M zD2TEslXAq%9EVoge?1-9luDWV4Q2i1bAIPGKMAhajhQEd*|Lv90i;$aLz!G2AoHo= zeaWw&b>pUrXY(#4D|)Fig?b{Fmn!gF%15axoL}sDZ)&{EGJhVoMM|}r4Erb)Kx8gN z39VzSLuEaFXc6Up&lV0*EKE$E4p&5_$re3QB90zn-|+S z8lUIAL!kf?DAZS-aUUJEeqoI+?z>SoT=AP0FCW*n-*sHR;}?2f%5j`oqVsIa{Hu_8 zG?eNQg#w7orGG6$J!*C3Sixc`LQ~@T#tq%C5}lVy)c;)Ot5&=M51#pWY!nJ0u|nCD z$dx5+*F6Ok3gDCq73(`u0B!VAC=|d;C{#(Uh{0j=t%pJqiU7TcO6|v51H)7K^QJ zduvguOt)u6?G;eDOt0(N+7hqyeZJ!#`?+2nif0>tWl^S|A|i*wp^riVq*AE;)%CGf zEL5r!+)YuDYU#6%XR8Qe^{?SgIuXy~|NW;-gG$-5FCwy<3 [FigureBoneData; 16] { + fn compute_matrices(&self) -> [FigureBoneData; 18] { let upper_torso_mat = self.upper_torso.compute_base_matrix(); let shoulder_l_mat = self.shoulder_l.compute_base_matrix(); let shoulder_r_mat = self.shoulder_r.compute_base_matrix(); @@ -78,6 +78,8 @@ impl Skeleton for BipedLargeSkeleton { FigureBoneData::default(), FigureBoneData::default(), FigureBoneData::default(), + FigureBoneData::default(), + FigureBoneData::default(), ] } diff --git a/voxygen/src/anim/bird_medium/mod.rs b/voxygen/src/anim/bird_medium/mod.rs index 0ff89377ae..d5e7832e74 100644 --- a/voxygen/src/anim/bird_medium/mod.rs +++ b/voxygen/src/anim/bird_medium/mod.rs @@ -27,7 +27,7 @@ impl BirdMediumSkeleton { impl Skeleton for BirdMediumSkeleton { type Attr = SkeletonAttr; - fn compute_matrices(&self) -> [FigureBoneData; 16] { + fn compute_matrices(&self) -> [FigureBoneData; 18] { let torso_mat = self.torso.compute_base_matrix(); [ @@ -47,6 +47,8 @@ impl Skeleton for BirdMediumSkeleton { FigureBoneData::default(), FigureBoneData::default(), FigureBoneData::default(), + FigureBoneData::default(), + FigureBoneData::default(), ] } diff --git a/voxygen/src/anim/bird_small/mod.rs b/voxygen/src/anim/bird_small/mod.rs index 610b63122a..763bb2fac8 100644 --- a/voxygen/src/anim/bird_small/mod.rs +++ b/voxygen/src/anim/bird_small/mod.rs @@ -31,7 +31,7 @@ impl BirdSmallSkeleton { impl Skeleton for BirdSmallSkeleton { type Attr = SkeletonAttr; - fn compute_matrices(&self) -> [FigureBoneData; 16] { + fn compute_matrices(&self) -> [FigureBoneData; 18] { let torso_mat = self.torso.compute_base_matrix(); [ @@ -51,6 +51,8 @@ impl Skeleton for BirdSmallSkeleton { FigureBoneData::default(), FigureBoneData::default(), FigureBoneData::default(), + FigureBoneData::default(), + FigureBoneData::default(), ] } diff --git a/voxygen/src/anim/character/attack.rs b/voxygen/src/anim/character/attack.rs index 9ceb9343e8..3cc674e799 100644 --- a/voxygen/src/anim/character/attack.rs +++ b/voxygen/src/anim/character/attack.rs @@ -21,60 +21,65 @@ impl Animation for AttackAnimation { ) -> Self::Skeleton { let mut next = (*skeleton).clone(); - let slow = (anim_time as f32 * 9.0).sin(); - let accel_med = 1.0 - (anim_time as f32 * 16.0).cos(); - let accel_slow = 1.0 - (anim_time as f32 * 12.0).cos(); - let accel_fast = 1.0 - (anim_time as f32 * 24.0).cos(); - let decel = (anim_time as f32 * 16.0).min(PI / 2.0).sin(); + let lab = 1.0; + let accel_med = 1.0 - (anim_time as f32 * 16.0 * lab as f32).cos(); + let accel_slow = 1.0 - (anim_time as f32 * 12.0 * lab as f32).cos(); + let accel_fast = 1.0 - (anim_time as f32 * 24.0 * lab as f32).cos(); + let decel = (anim_time as f32 * 16.0 * lab as f32).min(PI / 2.0).sin(); + + let slow = (((5.0) + / (1.1 + 3.9 * ((anim_time as f32 * lab as f32 * 12.4).sin()).powf(2.0 as f32))) + .sqrt()) + * ((anim_time as f32 * lab as f32 * 12.4).sin()); next.head.offset = Vec3::new( 0.0 + skeleton_attr.neck_right, - -2.0 + skeleton_attr.neck_forward, + -2.0 + skeleton_attr.neck_forward + decel * 0.8, skeleton_attr.neck_height + 21.0, ); - next.head.ori = Quaternion::rotation_z(decel * -0.25) - * Quaternion::rotation_x(0.0 + decel * -0.1) - * Quaternion::rotation_y(decel * 0.1); + next.head.ori = Quaternion::rotation_z(decel * 0.25) + * Quaternion::rotation_x(0.0 + decel * 0.1) + * Quaternion::rotation_y(decel * -0.1); next.head.scale = Vec3::one() * skeleton_attr.head_scale; next.chest.offset = Vec3::new(0.0, 0.0, 7.0); - next.chest.ori = Quaternion::rotation_x(0.0); + next.chest.ori = Quaternion::rotation_z(decel * -0.2) + * Quaternion::rotation_x(0.0 + decel * -0.2) + * Quaternion::rotation_y(decel * 0.2); next.chest.scale = Vec3::one(); next.belt.offset = Vec3::new(0.0, 0.0, 5.0); - next.belt.ori = Quaternion::rotation_x(0.0); + next.belt.ori = Quaternion::rotation_z(decel * -0.1) + * Quaternion::rotation_x(0.0 + decel * -0.1) + * Quaternion::rotation_y(decel * 0.1); next.belt.scale = Vec3::one(); next.shorts.offset = Vec3::new(0.0, 0.0, 2.0); - next.shorts.ori = Quaternion::rotation_x(0.0); + next.belt.ori = Quaternion::rotation_z(decel * -0.08) + * Quaternion::rotation_x(0.0 + decel * -0.08) + * Quaternion::rotation_y(decel * 0.08); next.shorts.scale = Vec3::one(); match active_tool_kind { //TODO: Inventory Some(Tool::Sword) => { - next.l_hand.offset = - Vec3::new(-8.0 + accel_slow * 10.0, 8.0 + accel_fast * 3.0, 0.0); - next.l_hand.ori = Quaternion::rotation_z(-0.8) - * Quaternion::rotation_x(0.0 + accel_med * -0.8) - * Quaternion::rotation_y(0.0 + accel_med * -0.4); - next.l_hand.scale = Vec3::one() * 1.01; - - next.r_hand.offset = - Vec3::new(-8.0 + accel_slow * 10.0, 8.0 + accel_fast * 3.0, -2.0); - next.r_hand.ori = Quaternion::rotation_z(-0.8) - * Quaternion::rotation_x(0.0 + accel_med * -0.8) - * Quaternion::rotation_y(0.0 + accel_med * -0.4); - next.r_hand.scale = Vec3::one() * 1.01; - - next.main.offset = Vec3::new( - -8.0 + accel_slow * 10.0 + skeleton_attr.weapon_x, - 8.0 + accel_fast * 3.0, - 0.0, - ); - next.main.ori = Quaternion::rotation_z(-0.8) - * Quaternion::rotation_x(0.0 + accel_med * -0.8) - * Quaternion::rotation_y(0.0 + accel_med * -0.4); + next.l_hand.offset = Vec3::new(0.0, 1.0, 0.0); + next.l_hand.ori = Quaternion::rotation_x(1.27); + next.l_hand.scale = Vec3::one() * 1.04; + next.r_hand.offset = Vec3::new(0.0, 0.0, -3.0); + next.r_hand.ori = Quaternion::rotation_x(1.27); + next.r_hand.scale = Vec3::one() * 1.05; + next.main.offset = Vec3::new(0.0, 6.0, -1.0); + next.main.ori = Quaternion::rotation_x(-0.3) + * Quaternion::rotation_y(0.0) + * Quaternion::rotation_z(0.0); next.main.scale = Vec3::one(); + + next.control.offset = Vec3::new(-8.0 - slow * 1.0, 3.0 - slow * 5.0, 0.0); + next.control.ori = Quaternion::rotation_x(-1.2) + * Quaternion::rotation_y(slow * 1.5) + * Quaternion::rotation_z(1.4 + slow * 0.5); + next.control.scale = Vec3::one(); }, Some(Tool::Axe) => { next.l_hand.offset = @@ -266,10 +271,17 @@ impl Animation for AttackAnimation { next.lantern.scale = Vec3::one() * 0.0; next.torso.offset = Vec3::new(0.0, -0.2, 0.1) * skeleton_attr.scaler; - next.torso.ori = Quaternion::rotation_z(decel * -0.2) - * Quaternion::rotation_x(0.0 + decel * -0.2) - * Quaternion::rotation_y(decel * 0.2); + next.torso.ori = + Quaternion::rotation_z(0.0) * Quaternion::rotation_x(0.0) * Quaternion::rotation_y(0.0); next.torso.scale = Vec3::one() / 11.0 * skeleton_attr.scaler; + + next.l_control.offset = Vec3::new(0.0, 0.0, 0.0); + next.l_control.ori = Quaternion::rotation_x(0.0); + next.l_control.scale = Vec3::one(); + + next.r_control.offset = Vec3::new(0.0, 0.0, 0.0); + next.r_control.ori = Quaternion::rotation_x(0.0); + next.r_control.scale = Vec3::one(); next } } diff --git a/voxygen/src/anim/character/block.rs b/voxygen/src/anim/character/block.rs index 17c1415641..53cff1dda0 100644 --- a/voxygen/src/anim/character/block.rs +++ b/voxygen/src/anim/character/block.rs @@ -63,21 +63,23 @@ impl Animation for BlockAnimation { match active_tool_kind { //TODO: Inventory Some(Tool::Sword) => { - next.l_hand.offset = Vec3::new(-6.0, 3.5, 0.0 + wave_ultra_slow * 1.0); - next.l_hand.ori = Quaternion::rotation_x(-0.3); - next.l_hand.scale = Vec3::one() * 1.01; - next.r_hand.offset = Vec3::new(-6.0, 3.0, -2.0); - next.r_hand.ori = Quaternion::rotation_x(-0.3); - next.r_hand.scale = Vec3::one() * 1.01; - next.main.offset = Vec3::new( - -6.0 + skeleton_attr.weapon_x, - 4.5 + skeleton_attr.weapon_y, - 0.0, - ); + next.l_hand.offset = Vec3::new(0.0, -5.0, -5.0); + next.l_hand.ori = Quaternion::rotation_x(1.27); + next.l_hand.scale = Vec3::one() * 1.04; + next.r_hand.offset = Vec3::new(0.0, -6.0, -8.0); + next.r_hand.ori = Quaternion::rotation_x(1.27); + next.r_hand.scale = Vec3::one() * 1.05; + next.main.offset = Vec3::new(0.0, 0.0, -6.0); next.main.ori = Quaternion::rotation_x(-0.3) * Quaternion::rotation_y(0.0) * Quaternion::rotation_z(0.0); next.main.scale = Vec3::one(); + + next.control.offset = Vec3::new(-8.0, 13.0, 8.0); + next.control.ori = Quaternion::rotation_x(0.2) + * Quaternion::rotation_y(0.4) + * Quaternion::rotation_z(-1.57); + next.control.scale = Vec3::one(); }, Some(Tool::Axe) => { next.l_hand.offset = Vec3::new( diff --git a/voxygen/src/anim/character/blockidle.rs b/voxygen/src/anim/character/blockidle.rs index 67af96d2a2..09ac00407d 100644 --- a/voxygen/src/anim/character/blockidle.rs +++ b/voxygen/src/anim/character/blockidle.rs @@ -62,21 +62,23 @@ impl Animation for BlockIdleAnimation { match active_tool_kind { //TODO: Inventory Some(Tool::Sword) => { - next.l_hand.offset = Vec3::new(-6.0, 3.5, 0.0 + wave_ultra_slow * 1.0); - next.l_hand.ori = Quaternion::rotation_x(-0.3); - next.l_hand.scale = Vec3::one() * 1.01; - next.r_hand.offset = Vec3::new(-6.0, 3.0, -2.0); - next.r_hand.ori = Quaternion::rotation_x(-0.3); - next.r_hand.scale = Vec3::one() * 1.01; - next.main.offset = Vec3::new( - -6.0 + skeleton_attr.weapon_x, - 4.5 + skeleton_attr.weapon_y, - 0.0, - ); + next.l_hand.offset = Vec3::new(0.0, -5.0, -5.0); + next.l_hand.ori = Quaternion::rotation_x(1.27); + next.l_hand.scale = Vec3::one() * 1.04; + next.r_hand.offset = Vec3::new(0.0, -6.0, -8.0); + next.r_hand.ori = Quaternion::rotation_x(1.27); + next.r_hand.scale = Vec3::one() * 1.05; + next.main.offset = Vec3::new(0.0, 0.0, -6.0); next.main.ori = Quaternion::rotation_x(-0.3) * Quaternion::rotation_y(0.0) * Quaternion::rotation_z(0.0); next.main.scale = Vec3::one(); + + next.control.offset = Vec3::new(-8.0, 13.0, 8.0); + next.control.ori = Quaternion::rotation_x(0.2) + * Quaternion::rotation_y(0.4) + * Quaternion::rotation_z(-1.57); + next.control.scale = Vec3::one(); }, Some(Tool::Axe) => { next.l_hand.offset = Vec3::new( diff --git a/voxygen/src/anim/character/charge.rs b/voxygen/src/anim/character/charge.rs index a0cbe277d5..18203270c9 100644 --- a/voxygen/src/anim/character/charge.rs +++ b/voxygen/src/anim/character/charge.rs @@ -103,6 +103,11 @@ impl Animation for ChargeAnimation { next.torso.ori = Quaternion::rotation_z(0.0) * Quaternion::rotation_x(0.0) * Quaternion::rotation_y(0.0); next.torso.scale = Vec3::one() / 11.0 * skeleton_attr.scaler; + + next.control.offset = Vec3::new(0.0, 0.0, 0.0); + next.control.ori = Quaternion::rotation_x(0.0); + next.control.scale = Vec3::one(); + next } } diff --git a/voxygen/src/anim/character/cidle.rs b/voxygen/src/anim/character/cidle.rs index c4093cf2c3..a33d6d0ed9 100644 --- a/voxygen/src/anim/character/cidle.rs +++ b/voxygen/src/anim/character/cidle.rs @@ -22,7 +22,7 @@ impl Animation for CidleAnimation { ) -> Self::Skeleton { let mut next = (*skeleton).clone(); - let wave_ultra_slow = (anim_time as f32 * 3.0 + PI).sin(); + let wave_ultra_slow = (anim_time as f32 * 0.5 + PI).sin(); let wave_ultra_slow_cos = (anim_time as f32 * 3.0 + PI).cos(); let wave_slow_cos = (anim_time as f32 * 6.0 + PI).cos(); let wave_slow = (anim_time as f32 * 6.0 + PI).sin(); @@ -63,29 +63,23 @@ impl Animation for CidleAnimation { match active_tool_kind { //TODO: Inventory Some(Tool::Sword) => { - next.l_hand.offset = Vec3::new( - -6.0 + wave_ultra_slow_cos * 1.0, - -2.0 + wave_ultra_slow_cos * 0.5, - 1.0 + wave_ultra_slow * 1.0, - ); - next.l_hand.ori = Quaternion::rotation_x(1.27); - next.l_hand.scale = Vec3::one() * 1.0; - next.r_hand.offset = Vec3::new( - -6.0 + wave_ultra_slow_cos * 1.0, - -2.5 + wave_ultra_slow_cos * 0.5, - -1.0 + wave_ultra_slow * 1.0, - ); - next.r_hand.ori = Quaternion::rotation_x(1.27); - next.r_hand.scale = Vec3::one() * 1.01; - next.main.offset = Vec3::new( - -6.0 + skeleton_attr.weapon_x + wave_ultra_slow_cos * 1.0, - 5.5 + skeleton_attr.weapon_y + wave_ultra_slow_cos * 0.5, - 1.0 + wave_ultra_slow * 1.0, - ); - next.main.ori = Quaternion::rotation_x(-0.3) + next.l_hand.offset = Vec3::new(-0.25, -5.0, -5.0); + next.l_hand.ori = Quaternion::rotation_x(1.47) * Quaternion::rotation_y(-0.2); + next.l_hand.scale = Vec3::one() * 1.04; + next.r_hand.offset = Vec3::new(1.25, -5.5, -8.0); + next.r_hand.ori = Quaternion::rotation_x(1.47) * Quaternion::rotation_y(0.3); + next.r_hand.scale = Vec3::one() * 1.05; + next.main.offset = Vec3::new(0.0, 0.0, -6.0); + next.main.ori = Quaternion::rotation_x(-0.1) * Quaternion::rotation_y(0.0) * Quaternion::rotation_z(0.0); next.main.scale = Vec3::one(); + + next.control.offset = Vec3::new(-7.0, 6.0, 6.0); + next.control.ori = Quaternion::rotation_x(0.0) + * Quaternion::rotation_y(0.0) + * Quaternion::rotation_z(0.0); + next.control.scale = Vec3::one(); }, Some(Tool::Axe) => { next.l_hand.offset = Vec3::new( diff --git a/voxygen/src/anim/character/climb.rs b/voxygen/src/anim/character/climb.rs index 769abeecf6..b95ec99a84 100644 --- a/voxygen/src/anim/character/climb.rs +++ b/voxygen/src/anim/character/climb.rs @@ -59,11 +59,11 @@ impl Animation for ClimbAnimation { * Quaternion::rotation_y(wave_test * 0.10); next.shorts.scale = Vec3::one(); - next.l_hand.offset = Vec3::new(-6.0, -0.25 + wave_testc * 1.5, 5.0 - wave_test * 4.0); + next.l_hand.offset = Vec3::new(-6.0, -0.25 + wave_testc * 1.5, 6.0 - wave_test * 4.0); next.l_hand.ori = Quaternion::rotation_x(2.2 + wave_testc * 0.5); next.l_hand.scale = Vec3::one(); - next.r_hand.offset = Vec3::new(6.0, -0.25 - wave_testc * 1.5, 5.0 + wave_test * 4.0); + next.r_hand.offset = Vec3::new(6.0, -0.25 - wave_testc * 1.5, 6.0 + wave_test * 4.0); next.r_hand.ori = Quaternion::rotation_x(2.2 - wave_testc * 0.5); next.r_hand.scale = Vec3::one(); @@ -75,15 +75,6 @@ impl Animation for ClimbAnimation { next.r_foot.ori = Quaternion::rotation_x(0.2 + wave_testc * 0.5); next.r_foot.scale = Vec3::one(); - next.main.offset = Vec3::new( - -7.0 + skeleton_attr.weapon_x, - -5.0 + skeleton_attr.weapon_y, - 15.0, - ); - next.main.ori = - Quaternion::rotation_y(2.5) * Quaternion::rotation_z(1.57 + wave_cos * 0.25); - next.main.scale = Vec3::one(); - next.l_shoulder.offset = Vec3::new(-5.0, 0.0, 4.7); next.l_shoulder.ori = Quaternion::rotation_x(wave_cos * 0.15); next.l_shoulder.scale = Vec3::one() * 1.1; @@ -96,6 +87,23 @@ impl Animation for ClimbAnimation { next.glider.ori = Quaternion::rotation_y(0.0); next.glider.scale = Vec3::one() * 0.0; + next.main.offset = Vec3::new( + -7.0 + skeleton_attr.weapon_x, + -5.0 + skeleton_attr.weapon_y, + 18.0, + ); + next.main.ori = + Quaternion::rotation_y(2.5) * Quaternion::rotation_z(1.57 + wave_cos * 0.25); + next.main.scale = Vec3::one(); + + next.second.offset = Vec3::new( + 0.0 + skeleton_attr.weapon_x, + 0.0 + skeleton_attr.weapon_y, + 0.0, + ); + next.second.ori = Quaternion::rotation_y(0.0); + next.second.scale = Vec3::one() * 0.0; + next.lantern.offset = Vec3::new(0.0, 0.0, 0.0); next.lantern.ori = Quaternion::rotation_x(0.0); next.lantern.scale = Vec3::one() * 0.0; @@ -104,6 +112,17 @@ impl Animation for ClimbAnimation { next.torso.ori = Quaternion::rotation_x(0.0) * Quaternion::rotation_y(0.0); next.torso.scale = Vec3::one() / 11.0 * skeleton_attr.scaler; + next.control.offset = Vec3::new(0.0, 0.0, 0.0); + next.control.ori = Quaternion::rotation_x(0.0); + next.control.scale = Vec3::one(); + + next.l_control.offset = Vec3::new(0.0, 0.0, 0.0); + next.l_control.ori = Quaternion::rotation_x(0.0); + next.l_control.scale = Vec3::one(); + + next.r_control.offset = Vec3::new(0.0, 0.0, 0.0); + next.r_control.ori = Quaternion::rotation_x(0.0); + next.r_control.scale = Vec3::one(); next } } diff --git a/voxygen/src/anim/character/crun.rs b/voxygen/src/anim/character/crun.rs index 59d1807a69..cf12ef8c56 100644 --- a/voxygen/src/anim/character/crun.rs +++ b/voxygen/src/anim/character/crun.rs @@ -43,23 +43,33 @@ impl Animation for WieldAnimation { match Tool::Bow { //TODO: Inventory - Tool::Sword => { - next.l_hand.offset = Vec3::new(-6.0, 3.75, 0.25); - next.l_hand.ori = Quaternion::rotation_x(-0.3); - next.l_hand.scale = Vec3::one() * 1.01; - next.r_hand.offset = Vec3::new(-6.0, 3.0, -2.0); - next.r_hand.ori = Quaternion::rotation_x(-0.3); - next.r_hand.scale = Vec3::one() * 1.01; - next.weapon.offset = Vec3::new( - -6.0 + skeleton_attr.weapon_x, - 4.0 + skeleton_attr.weapon_y, + Some(Tool::Sword) => { + next.l_hand.offset = Vec3::new(0.0, -5.0, -5.0); + next.l_hand.ori = Quaternion::rotation_x(1.27); + next.l_hand.scale = Vec3::one() * 1.04; + next.r_hand.offset = Vec3::new(0.0, -6.0, -8.0); + next.r_hand.ori = Quaternion::rotation_x(1.27); + next.r_hand.scale = Vec3::one() * 1.05; + next.main.offset = Vec3::new( 0.0, + 0.0, + -6.0, ); - next.weapon.ori = Quaternion::rotation_x(-0.3) + next.main.ori = Quaternion::rotation_x(-0.3) * Quaternion::rotation_y(0.0) * Quaternion::rotation_z(0.0); - next.weapon.scale = Vec3::one(); - } + next.main.scale = Vec3::one(); + + next.control.offset = Vec3::new( + -8.0, + 4.0, + 6.0, + ); + next.control.ori = Quaternion::rotation_x(0.0) + * Quaternion::rotation_y(0.0) + * Quaternion::rotation_z(0.0); + next.control.scale = Vec3::one(); + }, Tool::Axe => { next.l_hand.offset = Vec3::new(-6.0, 3.5, 0.0); next.l_hand.ori = Quaternion::rotation_x(-0.3); diff --git a/voxygen/src/anim/character/gliding.rs b/voxygen/src/anim/character/gliding.rs index 955208a3d2..5eacea3e85 100644 --- a/voxygen/src/anim/character/gliding.rs +++ b/voxygen/src/anim/character/gliding.rs @@ -105,14 +105,6 @@ impl Animation for GlidingAnimation { ); next.r_foot.scale = Vec3::one(); - next.main.offset = Vec3::new( - -7.0 + skeleton_attr.weapon_x, - -5.0 + skeleton_attr.weapon_y, - 15.0, - ); - next.main.ori = Quaternion::rotation_y(2.5) * Quaternion::rotation_z(1.57); - next.main.scale = Vec3::one(); - next.l_shoulder.offset = Vec3::new(-5.0, 0.0, 4.7); next.l_shoulder.ori = Quaternion::rotation_x(0.0); next.l_shoulder.scale = Vec3::one() * 1.1; @@ -126,6 +118,22 @@ impl Animation for GlidingAnimation { Quaternion::rotation_x(1.0) * Quaternion::rotation_y(wave_very_slow_cos * 0.04); next.glider.scale = Vec3::one(); + next.main.offset = Vec3::new( + -7.0 + skeleton_attr.weapon_x, + -5.0 + skeleton_attr.weapon_y, + 15.0, + ); + next.main.ori = Quaternion::rotation_y(2.5) * Quaternion::rotation_z(1.57); + next.main.scale = Vec3::one(); + + next.second.offset = Vec3::new( + 0.0 + skeleton_attr.weapon_x, + 0.0 + skeleton_attr.weapon_y, + 0.0, + ); + next.second.ori = Quaternion::rotation_y(0.0); + next.second.scale = Vec3::one() * 0.0; + next.lantern.offset = Vec3::new(0.0, 0.0, 0.0); next.lantern.ori = Quaternion::rotation_x(0.0); next.lantern.scale = Vec3::one() * 0.0; @@ -135,6 +143,17 @@ impl Animation for GlidingAnimation { * Quaternion::rotation_y(tilt * 16.0); next.torso.scale = Vec3::one() / 11.0 * skeleton_attr.scaler; + next.control.offset = Vec3::new(0.0, 0.0, 0.0); + next.control.ori = Quaternion::rotation_x(0.0); + next.control.scale = Vec3::one(); + + next.l_control.offset = Vec3::new(0.0, 0.0, 0.0); + next.l_control.ori = Quaternion::rotation_x(0.0); + next.l_control.scale = Vec3::one(); + + next.r_control.offset = Vec3::new(0.0, 0.0, 0.0); + next.r_control.ori = Quaternion::rotation_x(0.0); + next.r_control.scale = Vec3::one(); next } } diff --git a/voxygen/src/anim/character/idle.rs b/voxygen/src/anim/character/idle.rs index 87a709ab50..57949cb125 100644 --- a/voxygen/src/anim/character/idle.rs +++ b/voxygen/src/anim/character/idle.rs @@ -56,7 +56,7 @@ impl Animation for IdleAnimation { next.shorts.scale = Vec3::one(); next.l_hand.offset = Vec3::new( - -6.0, + -7.0, -0.25 + wave_ultra_slow_cos * 0.15, 5.0 + wave_ultra_slow * 0.5, ); @@ -65,7 +65,7 @@ impl Animation for IdleAnimation { next.l_hand.scale = Vec3::one(); next.r_hand.offset = Vec3::new( - 6.0, + 7.0, -0.25 + wave_ultra_slow_cos * 0.15, 5.0 + wave_ultra_slow * 0.5 + wave_ultra_slow_abs * -0.05, ); @@ -80,14 +80,6 @@ impl Animation for IdleAnimation { next.r_foot.ori = Quaternion::identity(); next.r_foot.scale = Vec3::one(); - next.main.offset = Vec3::new( - -7.0 + skeleton_attr.weapon_x, - -5.0 + skeleton_attr.weapon_y, - 15.0, - ); - next.main.ori = Quaternion::rotation_y(2.5) * Quaternion::rotation_z(1.57); - next.main.scale = Vec3::one() + wave_ultra_slow_abs * -0.05; - next.l_shoulder.offset = Vec3::new(-5.0, 0.0, 5.0); next.l_shoulder.ori = Quaternion::rotation_x(0.0); next.l_shoulder.scale = (Vec3::one() + wave_ultra_slow_abs * -0.05) * 1.15; @@ -100,6 +92,22 @@ impl Animation for IdleAnimation { next.glider.ori = Quaternion::rotation_y(0.0); next.glider.scale = Vec3::one() * 0.0; + next.main.offset = Vec3::new( + -7.0 + skeleton_attr.weapon_x, + -5.0 + skeleton_attr.weapon_y, + 18.0, + ); + next.main.ori = Quaternion::rotation_y(2.5) * Quaternion::rotation_z(1.57); + next.main.scale = Vec3::one() + wave_ultra_slow_abs * -0.05; + + next.second.offset = Vec3::new( + 0.0 + skeleton_attr.weapon_x, + 0.0 + skeleton_attr.weapon_y, + 0.0, + ); + next.second.ori = Quaternion::rotation_y(0.0); + next.second.scale = Vec3::one() * 0.0; + next.lantern.offset = Vec3::new(0.0, 0.0, 0.0); next.lantern.ori = Quaternion::rotation_x(0.0); next.lantern.scale = Vec3::one() * 0.0; @@ -108,6 +116,17 @@ impl Animation for IdleAnimation { next.torso.ori = Quaternion::rotation_x(0.0); next.torso.scale = Vec3::one() / 11.0 * skeleton_attr.scaler; + next.control.offset = Vec3::new(0.0, 0.0, 0.0); + next.control.ori = Quaternion::rotation_x(0.0); + next.control.scale = Vec3::one(); + + next.l_control.offset = Vec3::new(0.0, 0.0, 0.0); + next.l_control.ori = Quaternion::rotation_x(0.0); + next.l_control.scale = Vec3::one(); + + next.r_control.offset = Vec3::new(0.0, 0.0, 0.0); + next.r_control.ori = Quaternion::rotation_x(0.0); + next.r_control.scale = Vec3::one(); next } } diff --git a/voxygen/src/anim/character/jump.rs b/voxygen/src/anim/character/jump.rs index 7a93aa4f82..b19f3f5ba4 100644 --- a/voxygen/src/anim/character/jump.rs +++ b/voxygen/src/anim/character/jump.rs @@ -68,14 +68,6 @@ impl Animation for JumpAnimation { next.r_foot.ori = Quaternion::rotation_x(wave_stop * 1.2 + wave_slow * 0.2); next.r_foot.scale = Vec3::one(); - next.main.offset = Vec3::new( - -7.0 + skeleton_attr.weapon_x, - -5.0 + skeleton_attr.weapon_y, - 15.0, - ); - next.main.ori = Quaternion::rotation_y(2.5) * Quaternion::rotation_z(1.57); - next.main.scale = Vec3::one(); - next.l_shoulder.offset = Vec3::new(-5.0, 0.0, 4.7); next.l_shoulder.ori = Quaternion::rotation_x(wave_stop_alt * 0.3); next.l_shoulder.scale = Vec3::one() * 1.1; @@ -88,6 +80,22 @@ impl Animation for JumpAnimation { next.glider.ori = Quaternion::rotation_y(0.0); next.glider.scale = Vec3::one() * 0.0; + next.main.offset = Vec3::new( + -7.0 + skeleton_attr.weapon_x, + -5.0 + skeleton_attr.weapon_y, + 15.0, + ); + next.main.ori = Quaternion::rotation_y(2.5) * Quaternion::rotation_z(1.57); + next.main.scale = Vec3::one(); + + next.second.offset = Vec3::new( + 0.0 + skeleton_attr.weapon_x, + 0.0 + skeleton_attr.weapon_y, + 0.0, + ); + next.second.ori = Quaternion::rotation_y(0.0); + next.second.scale = Vec3::one() * 0.0; + next.lantern.offset = Vec3::new(0.0, 0.0, 0.0); next.lantern.ori = Quaternion::rotation_x(0.0); next.lantern.scale = Vec3::one() * 0.0; @@ -96,6 +104,17 @@ impl Animation for JumpAnimation { next.torso.ori = Quaternion::rotation_x(-0.2); next.torso.scale = Vec3::one() / 11.0 * skeleton_attr.scaler; + next.control.offset = Vec3::new(0.0, 0.0, 0.0); + next.control.ori = Quaternion::rotation_x(0.0); + next.control.scale = Vec3::one(); + + next.l_control.offset = Vec3::new(0.0, 0.0, 0.0); + next.l_control.ori = Quaternion::rotation_x(0.0); + next.l_control.scale = Vec3::one(); + + next.r_control.offset = Vec3::new(0.0, 0.0, 0.0); + next.r_control.ori = Quaternion::rotation_x(0.0); + next.r_control.scale = Vec3::one(); next } } diff --git a/voxygen/src/anim/character/mod.rs b/voxygen/src/anim/character/mod.rs index 6ed75e27e2..727d0f0918 100644 --- a/voxygen/src/anim/character/mod.rs +++ b/voxygen/src/anim/character/mod.rs @@ -37,12 +37,16 @@ pub struct CharacterSkeleton { r_hand: Bone, l_foot: Bone, r_foot: Bone, - main: Bone, l_shoulder: Bone, r_shoulder: Bone, glider: Bone, + main: Bone, + second: Bone, lantern: Bone, torso: Bone, + control: Bone, + l_control: Bone, + r_control: Bone, } impl CharacterSkeleton { @@ -52,11 +56,16 @@ impl CharacterSkeleton { impl Skeleton for CharacterSkeleton { type Attr = SkeletonAttr; - fn compute_matrices(&self) -> [FigureBoneData; 16] { + fn compute_matrices(&self) -> [FigureBoneData; 18] { let chest_mat = self.chest.compute_base_matrix(); let torso_mat = self.torso.compute_base_matrix(); let l_hand_mat = self.l_hand.compute_base_matrix(); + let r_hand_mat = self.r_hand.compute_base_matrix(); + let control_mat = self.control.compute_base_matrix(); + let l_control_mat = self.l_control.compute_base_matrix(); + let r_control_mat = self.r_control.compute_base_matrix(); let main_mat = self.main.compute_base_matrix(); + let second_mat = self.second.compute_base_matrix(); let head_mat = self.head.compute_base_matrix(); [ @@ -64,18 +73,20 @@ impl Skeleton for CharacterSkeleton { FigureBoneData::new(torso_mat * chest_mat), FigureBoneData::new(torso_mat * self.belt.compute_base_matrix()), FigureBoneData::new(torso_mat * self.shorts.compute_base_matrix()), - FigureBoneData::new(torso_mat * chest_mat * l_hand_mat), - FigureBoneData::new(torso_mat * chest_mat * self.r_hand.compute_base_matrix()), + FigureBoneData::new(torso_mat * chest_mat * control_mat * l_control_mat * l_hand_mat), + FigureBoneData::new(torso_mat * chest_mat * control_mat * r_control_mat * r_hand_mat), FigureBoneData::new(torso_mat * self.l_foot.compute_base_matrix()), FigureBoneData::new(torso_mat * self.r_foot.compute_base_matrix()), - FigureBoneData::new(torso_mat * chest_mat * main_mat), FigureBoneData::new(torso_mat * chest_mat * self.l_shoulder.compute_base_matrix()), FigureBoneData::new(torso_mat * chest_mat * self.r_shoulder.compute_base_matrix()), FigureBoneData::new(torso_mat * self.glider.compute_base_matrix()), + FigureBoneData::new(torso_mat * chest_mat * control_mat * l_control_mat * main_mat), + FigureBoneData::new(torso_mat * chest_mat * control_mat * r_control_mat * second_mat), FigureBoneData::new(torso_mat * chest_mat * self.lantern.compute_base_matrix()), FigureBoneData::new(torso_mat), - FigureBoneData::default(), - FigureBoneData::default(), + FigureBoneData::new(control_mat), + FigureBoneData::new(l_control_mat), + FigureBoneData::new(r_control_mat), ] } @@ -88,12 +99,16 @@ impl Skeleton for CharacterSkeleton { self.r_hand.interpolate(&target.r_hand, dt); self.l_foot.interpolate(&target.l_foot, dt); self.r_foot.interpolate(&target.r_foot, dt); - self.main.interpolate(&target.main, dt); self.l_shoulder.interpolate(&target.l_shoulder, dt); self.r_shoulder.interpolate(&target.r_shoulder, dt); self.glider.interpolate(&target.glider, dt); + self.main.interpolate(&target.main, dt); + self.second.interpolate(&target.second, dt); self.lantern.interpolate(&target.lantern, dt); self.torso.interpolate(&target.torso, dt); + self.control.interpolate(&target.control, dt); + self.l_control.interpolate(&target.l_control, dt); + self.r_control.interpolate(&target.r_control, dt); } } diff --git a/voxygen/src/anim/character/roll.rs b/voxygen/src/anim/character/roll.rs index b9fd7fbfa1..5dc42b8eed 100644 --- a/voxygen/src/anim/character/roll.rs +++ b/voxygen/src/anim/character/roll.rs @@ -85,16 +85,6 @@ impl Animation for RollAnimation { next.r_foot.ori = Quaternion::rotation_x(wave * -0.4); next.r_foot.scale = Vec3::one(); - next.main.offset = Vec3::new( - -7.0 + skeleton_attr.weapon_x, - -5.0 + skeleton_attr.weapon_y, - 15.0, - ); - next.main.ori = Quaternion::rotation_y(2.5) - * Quaternion::rotation_z(1.57) - * Quaternion::rotation_x(0.0); - next.main.scale = Vec3::one(); - next.l_shoulder.offset = Vec3::new(-5.0, 0.0, 4.7); next.l_shoulder.ori = Quaternion::rotation_x(0.0); next.l_shoulder.scale = Vec3::one() * 1.1; @@ -107,6 +97,24 @@ impl Animation for RollAnimation { next.glider.ori = Quaternion::rotation_y(0.0); next.glider.scale = Vec3::one() * 0.0; + next.main.offset = Vec3::new( + -7.0 + skeleton_attr.weapon_x, + -5.0 + skeleton_attr.weapon_y, + 15.0, + ); + next.main.ori = Quaternion::rotation_y(2.5) + * Quaternion::rotation_z(1.57) + * Quaternion::rotation_x(0.0); + next.main.scale = Vec3::one(); + + next.second.offset = Vec3::new( + 0.0 + skeleton_attr.weapon_x, + 0.0 + skeleton_attr.weapon_y, + 0.0, + ); + next.second.ori = Quaternion::rotation_y(0.0); + next.second.scale = Vec3::one() * 0.0; + next.lantern.offset = Vec3::new(0.0, 0.0, 0.0); next.lantern.ori = Quaternion::rotation_x(0.0); next.lantern.scale = Vec3::one() * 0.0; @@ -115,6 +123,18 @@ impl Animation for RollAnimation { Vec3::new(0.0, 0.0, 0.1 + wave_dub * 16.0) / 11.0 * skeleton_attr.scaler; next.torso.ori = Quaternion::rotation_x(wave_slow * 6.5) * Quaternion::rotation_y(tilt); next.torso.scale = Vec3::one() / 11.0 * skeleton_attr.scaler; + + next.control.offset = Vec3::new(0.0, 0.0, 0.0); + next.control.ori = Quaternion::rotation_x(0.0); + next.control.scale = Vec3::one(); + + next.l_control.offset = Vec3::new(0.0, 0.0, 0.0); + next.l_control.ori = Quaternion::rotation_x(0.0); + next.l_control.scale = Vec3::one(); + + next.r_control.offset = Vec3::new(0.0, 0.0, 0.0); + next.r_control.ori = Quaternion::rotation_x(0.0); + next.r_control.scale = Vec3::one(); next } } diff --git a/voxygen/src/anim/character/run.rs b/voxygen/src/anim/character/run.rs index c4e2479248..a4c92e3bce 100644 --- a/voxygen/src/anim/character/run.rs +++ b/voxygen/src/anim/character/run.rs @@ -23,23 +23,36 @@ impl Animation for RunAnimation { let lab = 1.0; let long = (((5.0) - / (1.1 + 3.9 * ((anim_time as f32 * lab as f32 * 1.2).sin()).powf(2.0 as f32))) + / (1.5 + 3.5 * ((anim_time as f32 * lab as f32 * 0.66).sin()).powf(2.0 as f32))) .sqrt()) - * ((anim_time as f32 * lab as f32 * 1.2).sin()); - let short = (((5.0) - / (1.1 + 3.9 * ((anim_time as f32 * lab as f32 * 2.4).sin()).powf(2.0 as f32))) - .sqrt()) - * ((anim_time as f32 * lab as f32 * 1.5).sin()); + * ((anim_time as f32 * lab as f32 * 0.66).sin()); - let wave_stop = (anim_time as f32 * 2.6).min(PI / 2.0).sin(); + let short = (((5.0) + / (1.5 + 3.5 * ((anim_time as f32 * lab as f32 * 1.32).sin()).powf(2.0 as f32))) + .sqrt()) + * ((anim_time as f32 * lab as f32 * 1.32).sin()); + + let shortalt = (((5.0) + / (1.5 + + 3.5 + * ((anim_time as f32 * lab as f32 * 1.32 + PI / 2.0).sin()).powf(2.0 as f32))) + .sqrt()) + * ((anim_time as f32 * lab as f32 * 1.32 + PI / 2.0).sin()); + + let foot = (((5.0) + / (1.1 + 3.9 * ((anim_time as f32 * lab as f32 * 1.32).sin()).powf(2.0 as f32))) + .sqrt()) + * ((anim_time as f32 * lab as f32 * 1.32).sin()); + + let wave_stop = (anim_time as f32 * 2.6).min(PI / 2.0 / 2.0).sin(); let head_look = Vec2::new( - ((global_time + anim_time) as f32 / 4.0) + ((global_time + anim_time) as f32 / 18.0) .floor() .mul(7331.0) .sin() * 0.2, - ((global_time + anim_time) as f32 / 4.0) + ((global_time + anim_time) as f32 / 18.0) .floor() .mul(1337.0) .sin() @@ -70,21 +83,21 @@ impl Animation for RunAnimation { next.head.scale = Vec3::one() * skeleton_attr.head_scale; next.chest.offset = Vec3::new(0.0, 0.0, 7.0 + short * 1.1); - next.chest.ori = Quaternion::rotation_z(long * 0.2); + next.chest.ori = Quaternion::rotation_z(short * 0.2); next.chest.scale = Vec3::one(); next.belt.offset = Vec3::new(0.0, 0.0, 5.0 + short * 1.1); - next.belt.ori = Quaternion::rotation_z(long * 0.35); + next.belt.ori = Quaternion::rotation_z(short * 0.35); next.belt.scale = Vec3::one(); next.shorts.offset = Vec3::new(0.0, 0.0, 2.0 + short * 1.1); - next.shorts.ori = Quaternion::rotation_z(long * 0.6); + next.shorts.ori = Quaternion::rotation_z(short * 0.6); next.shorts.scale = Vec3::one(); next.l_hand.offset = Vec3::new( -6.0 + wave_stop * -1.0, -0.25 + short * 2.0, - 5.0 - long * 1.5, + 5.0 + short * -1.5, ); next.l_hand.ori = Quaternion::rotation_x(0.8 + short * 1.2) * Quaternion::rotation_y(wave_stop * 0.1); @@ -93,20 +106,32 @@ impl Animation for RunAnimation { next.r_hand.offset = Vec3::new( 6.0 + wave_stop * 1.0, -0.25 + short * -2.0, - 5.0 + long * 1.5, + 5.0 + short * 1.5, ); next.r_hand.ori = Quaternion::rotation_x(0.8 + short * -1.2) * Quaternion::rotation_y(wave_stop * -0.1); next.r_hand.scale = Vec3::one(); - next.l_foot.offset = Vec3::new(-3.4, 0.0 + short * 1.0, 6.0); - next.l_foot.ori = Quaternion::rotation_x(-0.0 - short * 1.2); + next.l_foot.offset = Vec3::new(-3.4, foot * 1.0, 6.0); + next.l_foot.ori = Quaternion::rotation_x(foot * -1.2); next.l_foot.scale = Vec3::one(); - next.r_foot.offset = Vec3::new(3.4, short * -1.0, 6.0); - next.r_foot.ori = Quaternion::rotation_x(short * 1.2); + next.r_foot.offset = Vec3::new(3.4, foot * -1.0, 6.0); + next.r_foot.ori = Quaternion::rotation_x(foot * 1.2); next.r_foot.scale = Vec3::one(); + next.l_shoulder.offset = Vec3::new(-5.0, -1.0, 4.7); + next.l_shoulder.ori = Quaternion::rotation_x(short * 0.15); + next.l_shoulder.scale = Vec3::one() * 1.1; + + next.r_shoulder.offset = Vec3::new(5.0, -1.0, 4.7); + next.r_shoulder.ori = Quaternion::rotation_x(short * -0.15); + next.r_shoulder.scale = Vec3::one() * 1.1; + + next.glider.offset = Vec3::new(0.0, 5.0, 0.0); + next.glider.ori = Quaternion::rotation_y(0.0); + next.glider.scale = Vec3::one() * 0.0; + next.main.offset = Vec3::new( -7.0 + skeleton_attr.weapon_x, -5.0 + skeleton_attr.weapon_y, @@ -115,28 +140,36 @@ impl Animation for RunAnimation { next.main.ori = Quaternion::rotation_y(2.5) * Quaternion::rotation_z(1.57 + short * 0.25); next.main.scale = Vec3::one(); - next.l_shoulder.offset = Vec3::new(-5.0, -0.5, 4.7); - next.l_shoulder.ori = Quaternion::rotation_x(short * 0.15); - next.l_shoulder.scale = Vec3::one() * 1.1; - - next.r_shoulder.offset = Vec3::new(5.0, -0.5, 4.7); - next.r_shoulder.ori = Quaternion::rotation_x(long * 0.15); - next.r_shoulder.scale = Vec3::one() * 1.1; - - next.glider.offset = Vec3::new(0.0, 5.0, 0.0); - next.glider.ori = Quaternion::rotation_y(0.0); - next.glider.scale = Vec3::one() * 0.0; + next.second.offset = Vec3::new( + 0.0 + skeleton_attr.weapon_x, + 0.0 + skeleton_attr.weapon_y, + 0.0, + ); + next.second.ori = Quaternion::rotation_y(0.0); + next.second.scale = Vec3::one() * 0.0; next.lantern.offset = Vec3::new(0.0, 5.0, 0.0); next.lantern.ori = Quaternion::rotation_y(0.0); next.lantern.scale = Vec3::one() * 0.0; - next.torso.offset = Vec3::new(0.0, -0.3 + long * -0.08, 0.4) * skeleton_attr.scaler; + next.torso.offset = Vec3::new(0.0, -0.3 + shortalt * -0.065, 0.4) * skeleton_attr.scaler; next.torso.ori = - Quaternion::rotation_x(wave_stop * speed * -0.06 + wave_stop * speed * -0.005) + Quaternion::rotation_x(wave_stop * speed * -0.05 + wave_stop * speed * -0.005) * Quaternion::rotation_y(tilt); next.torso.scale = Vec3::one() / 11.0 * skeleton_attr.scaler; + next.control.offset = Vec3::new(0.0, 0.0, 0.0); + next.control.ori = Quaternion::rotation_x(0.0); + next.control.scale = Vec3::one(); + + next.l_control.offset = Vec3::new(0.0, 0.0, 0.0); + next.l_control.ori = Quaternion::rotation_x(0.0); + next.l_control.scale = Vec3::one(); + + next.r_control.offset = Vec3::new(0.0, 0.0, 0.0); + next.r_control.ori = Quaternion::rotation_x(0.0); + next.r_control.scale = Vec3::one(); + next } } diff --git a/voxygen/src/anim/character/sit.rs b/voxygen/src/anim/character/sit.rs index 2a1d4858bd..a4a8f4a210 100644 --- a/voxygen/src/anim/character/sit.rs +++ b/voxygen/src/anim/character/sit.rs @@ -95,14 +95,6 @@ impl Animation for SitAnimation { ); next.r_foot.scale = Vec3::one(); - next.main.offset = Vec3::new( - -7.0 + skeleton_attr.weapon_x, - -5.0 + skeleton_attr.weapon_y, - 15.0, - ); - next.main.ori = Quaternion::rotation_y(2.5) * Quaternion::rotation_z(1.57); - next.main.scale = Vec3::one() + wave_slow_abs * -0.05; - next.l_shoulder.offset = Vec3::new(-5.0, 0.0, 4.7); next.l_shoulder.ori = Quaternion::rotation_x(0.0); next.l_shoulder.scale = (Vec3::one() + wave_slow_abs * -0.05) * 1.15; @@ -115,6 +107,22 @@ impl Animation for SitAnimation { next.glider.ori = Quaternion::rotation_y(0.0); next.glider.scale = Vec3::one() * 0.0; + next.main.offset = Vec3::new( + -7.0 + skeleton_attr.weapon_x, + -5.0 + skeleton_attr.weapon_y, + 15.0, + ); + next.main.ori = Quaternion::rotation_y(2.5) * Quaternion::rotation_z(1.57); + next.main.scale = Vec3::one() + wave_slow_abs * -0.05; + + next.second.offset = Vec3::new( + 0.0 + skeleton_attr.weapon_x, + 0.0 + skeleton_attr.weapon_y, + 0.0, + ); + next.second.ori = Quaternion::rotation_y(0.0); + next.second.scale = Vec3::one() * 0.0; + next.lantern.offset = Vec3::new(0.0, 0.0, 0.0); next.lantern.ori = Quaternion::rotation_x(0.0); next.lantern.scale = Vec3::one() * 0.0; @@ -122,6 +130,18 @@ impl Animation for SitAnimation { next.torso.offset = Vec3::new(0.0, -0.2, wave_stop * -0.16) * skeleton_attr.scaler; next.torso.ori = Quaternion::rotation_x(0.0); next.torso.scale = Vec3::one() / 11.0 * skeleton_attr.scaler; + + next.control.offset = Vec3::new(0.0, 0.0, 0.0); + next.control.ori = Quaternion::rotation_x(0.0); + next.control.scale = Vec3::one(); + + next.l_control.offset = Vec3::new(0.0, 0.0, 0.0); + next.l_control.ori = Quaternion::rotation_x(0.0); + next.l_control.scale = Vec3::one(); + + next.r_control.offset = Vec3::new(0.0, 0.0, 0.0); + next.r_control.ori = Quaternion::rotation_x(0.0); + next.r_control.scale = Vec3::one(); next } } diff --git a/voxygen/src/anim/character/stand.rs b/voxygen/src/anim/character/stand.rs index 2116115be7..116cf5db09 100644 --- a/voxygen/src/anim/character/stand.rs +++ b/voxygen/src/anim/character/stand.rs @@ -43,26 +43,25 @@ impl Animation for StandAnimation { next.head.scale = Vec3::one() * skeleton_attr.head_scale; next.chest.offset = Vec3::new(0.0, 0.0, 7.0 + slow * 0.3); - next.chest.ori = Quaternion::rotation_x(0.0); - next.chest.scale = Vec3::one() * 1.01 + breathe * 0.05; + next.chest.ori = Quaternion::rotation_z(head_look.x * 0.6); + next.chest.scale = Vec3::one() * 1.01; next.belt.offset = Vec3::new(0.0, 0.0, 5.0 + slow * 0.3); - next.belt.ori = Quaternion::rotation_x(0.0); + next.belt.ori = Quaternion::rotation_z(head_look.x * 0.4); next.belt.scale = Vec3::one() + breathe * 0.05; next.shorts.offset = Vec3::new(0.0, 0.0, 2.0 + slow * 0.3); next.shorts.ori = Quaternion::rotation_x(0.0); next.shorts.scale = Vec3::one(); - next.l_hand.offset = Vec3::new(-6.0, -0.25 + slow * 0.15, 5.0 + slow * 0.5); + next.l_hand.offset = Vec3::new(-7.0, -0.25 + slow * 0.15, 5.0 + slow * 0.5); next.l_hand.ori = Quaternion::rotation_x(0.0 + slow * -0.06); next.l_hand.scale = Vec3::one(); - next.r_hand.offset = - Vec3::new(6.0, -0.25 + slow * 0.15, 5.0 + slow * 0.5 + breathe * -0.05); + next.r_hand.offset = Vec3::new(7.0, -0.25 + slow * 0.15, 5.0 + slow * 0.5); next.r_hand.ori = Quaternion::rotation_x(0.0 + slow * -0.06); - next.r_hand.scale = Vec3::one() + breathe * -0.05; + next.r_hand.scale = Vec3::one(); next.l_foot.offset = Vec3::new(-3.4, -0.1, 8.0); next.l_foot.ori = Quaternion::identity(); @@ -72,14 +71,6 @@ impl Animation for StandAnimation { next.r_foot.ori = Quaternion::identity(); next.r_foot.scale = Vec3::one(); - next.main.offset = Vec3::new( - -7.0 + skeleton_attr.weapon_x, - -5.0 + skeleton_attr.weapon_y, - 15.0, - ); - next.main.ori = Quaternion::rotation_y(2.5) * Quaternion::rotation_z(1.57); - next.main.scale = Vec3::one() + breathe * -0.05; - next.l_shoulder.offset = Vec3::new(-5.0, 0.0, 5.0); next.l_shoulder.ori = Quaternion::rotation_x(0.0); next.l_shoulder.scale = (Vec3::one() + breathe * -0.05) * 1.15; @@ -92,6 +83,22 @@ impl Animation for StandAnimation { next.glider.ori = Quaternion::rotation_y(0.0); next.glider.scale = Vec3::one() * 0.0; + next.main.offset = Vec3::new( + -7.0 + skeleton_attr.weapon_x, + -5.0 + skeleton_attr.weapon_y, + 18.0, + ); + next.main.ori = Quaternion::rotation_y(2.5) * Quaternion::rotation_z(1.57); + next.main.scale = Vec3::one(); + + next.second.offset = Vec3::new( + 0.0 + skeleton_attr.weapon_x, + 0.0 + skeleton_attr.weapon_y, + 0.0, + ); + next.second.ori = Quaternion::rotation_y(0.0); + next.second.scale = Vec3::one() * 0.0; + next.lantern.offset = Vec3::new(0.0, 0.0, 0.0); next.lantern.ori = Quaternion::rotation_x(0.0); next.lantern.scale = Vec3::one() * 0.0; @@ -100,6 +107,17 @@ impl Animation for StandAnimation { next.torso.ori = Quaternion::rotation_x(0.0); next.torso.scale = Vec3::one() / 11.0 * skeleton_attr.scaler; + next.control.offset = Vec3::new(0.0, 0.0, 0.0); + next.control.ori = Quaternion::rotation_x(0.0); + next.control.scale = Vec3::one(); + + next.l_control.offset = Vec3::new(0.0, 0.0, 0.0); + next.l_control.ori = Quaternion::rotation_x(0.0); + next.l_control.scale = Vec3::one(); + + next.r_control.offset = Vec3::new(0.0, 0.0, 0.0); + next.r_control.ori = Quaternion::rotation_x(0.0); + next.r_control.scale = Vec3::one(); next } } diff --git a/voxygen/src/anim/character/swim.rs b/voxygen/src/anim/character/swim.rs index 4531e0ae8a..8b8220277d 100644 --- a/voxygen/src/anim/character/swim.rs +++ b/voxygen/src/anim/character/swim.rs @@ -95,15 +95,6 @@ impl Animation for SwimAnimation { next.r_foot.ori = Quaternion::rotation_x(-0.0 + wave_cos * 1.5); next.r_foot.scale = Vec3::one(); - next.main.offset = Vec3::new( - -7.0 + skeleton_attr.weapon_x, - -5.0 + skeleton_attr.weapon_y, - 15.0, - ); - next.main.ori = - Quaternion::rotation_y(2.5) * Quaternion::rotation_z(1.57 + wave_cos * 0.25); - next.main.scale = Vec3::one(); - next.l_shoulder.offset = Vec3::new(-5.0, 0.0, 4.7); next.l_shoulder.ori = Quaternion::rotation_x(wave_cos * 0.15); next.l_shoulder.scale = Vec3::one() * 1.1; @@ -116,6 +107,23 @@ impl Animation for SwimAnimation { next.glider.ori = Quaternion::rotation_y(0.0); next.glider.scale = Vec3::one() * 0.0; + next.main.offset = Vec3::new( + -7.0 + skeleton_attr.weapon_x, + -5.0 + skeleton_attr.weapon_y, + 18.0, + ); + next.main.ori = + Quaternion::rotation_y(2.5) * Quaternion::rotation_z(1.57 + wave_cos * 0.25); + next.main.scale = Vec3::one(); + + next.second.offset = Vec3::new( + 0.0 + skeleton_attr.weapon_x, + 0.0 + skeleton_attr.weapon_y, + 0.0, + ); + next.second.ori = Quaternion::rotation_y(0.0); + next.second.scale = Vec3::one() * 0.0; + next.lantern.offset = Vec3::new(0.0, 5.0, 0.0); next.lantern.ori = Quaternion::rotation_y(0.0); next.lantern.scale = Vec3::one() * 0.0; @@ -126,6 +134,17 @@ impl Animation for SwimAnimation { * Quaternion::rotation_y(0.0); next.torso.scale = Vec3::one() / 11.0 * skeleton_attr.scaler; + next.control.offset = Vec3::new(0.0, 0.0, 0.0); + next.control.ori = Quaternion::rotation_x(0.0); + next.control.scale = Vec3::one(); + + next.l_control.offset = Vec3::new(0.0, 0.0, 0.0); + next.l_control.ori = Quaternion::rotation_x(0.0); + next.l_control.scale = Vec3::one(); + + next.r_control.offset = Vec3::new(0.0, 0.0, 0.0); + next.r_control.ori = Quaternion::rotation_x(0.0); + next.r_control.scale = Vec3::one(); next } } diff --git a/voxygen/src/anim/character/wield.rs b/voxygen/src/anim/character/wield.rs index 68d18d2c9d..9e882fed3c 100644 --- a/voxygen/src/anim/character/wield.rs +++ b/voxygen/src/anim/character/wield.rs @@ -30,21 +30,23 @@ impl Animation for WieldAnimation { match active_tool_kind { //TODO: Inventory Some(Tool::Sword) => { - next.l_hand.offset = Vec3::new(-6.0, -2.0, 1.0); + next.l_hand.offset = Vec3::new(0.0, -5.0, -5.0); next.l_hand.ori = Quaternion::rotation_x(1.27); - next.l_hand.scale = Vec3::one() * 1.00; - next.r_hand.offset = Vec3::new(-6.0, -2.5, -1.0); + next.l_hand.scale = Vec3::one() * 1.04; + next.r_hand.offset = Vec3::new(0.0, -6.0, -8.0); next.r_hand.ori = Quaternion::rotation_x(1.27); - next.r_hand.scale = Vec3::one() * 1.01; - next.main.offset = Vec3::new( - -6.0 + skeleton_attr.weapon_x, - 5.5 + skeleton_attr.weapon_y, - 1.0, - ); + next.r_hand.scale = Vec3::one() * 1.05; + next.main.offset = Vec3::new(0.0, 0.0, -6.0); next.main.ori = Quaternion::rotation_x(-0.3) * Quaternion::rotation_y(0.0) * Quaternion::rotation_z(0.0); next.main.scale = Vec3::one(); + + next.control.offset = Vec3::new(-8.0, 4.0, 6.0); + next.control.ori = Quaternion::rotation_x(0.0) + * Quaternion::rotation_y(0.0) + * Quaternion::rotation_z(0.0); + next.control.scale = Vec3::one(); }, Some(Tool::Axe) => { next.l_hand.offset = Vec3::new(-6.5, -0.5, 6.0); @@ -200,6 +202,14 @@ impl Animation for WieldAnimation { next.torso.offset = Vec3::new(0.0, 0.3 + wave * -0.08, 0.4) * skeleton_attr.scaler; next.torso.ori = Quaternion::rotation_x(wave_stop * -0.2); next.torso.scale = Vec3::one() / 11.0 * skeleton_attr.scaler; + + next.l_control.offset = Vec3::new(0.0, 0.0, 0.0); + next.l_control.ori = Quaternion::rotation_x(0.0); + next.l_control.scale = Vec3::one(); + + next.r_control.offset = Vec3::new(0.0, 0.0, 0.0); + next.r_control.ori = Quaternion::rotation_x(0.0); + next.r_control.scale = Vec3::one(); next } } diff --git a/voxygen/src/anim/critter/mod.rs b/voxygen/src/anim/critter/mod.rs index 9677461239..4a2c05ef6d 100644 --- a/voxygen/src/anim/critter/mod.rs +++ b/voxygen/src/anim/critter/mod.rs @@ -32,7 +32,7 @@ impl CritterSkeleton { impl Skeleton for CritterSkeleton { type Attr = CritterAttr; - fn compute_matrices(&self) -> [FigureBoneData; 16] { + fn compute_matrices(&self) -> [FigureBoneData; 18] { [ FigureBoneData::new(self.head.compute_base_matrix()), FigureBoneData::new(self.chest.compute_base_matrix()), @@ -50,6 +50,8 @@ impl Skeleton for CritterSkeleton { FigureBoneData::default(), FigureBoneData::default(), FigureBoneData::default(), + FigureBoneData::default(), + FigureBoneData::default(), ] } diff --git a/voxygen/src/anim/dragon/mod.rs b/voxygen/src/anim/dragon/mod.rs index c3bfec7e61..131d78dc24 100644 --- a/voxygen/src/anim/dragon/mod.rs +++ b/voxygen/src/anim/dragon/mod.rs @@ -49,7 +49,7 @@ impl DragonSkeleton { impl Skeleton for DragonSkeleton { type Attr = SkeletonAttr; - fn compute_matrices(&self) -> [FigureBoneData; 16] { + fn compute_matrices(&self) -> [FigureBoneData; 18] { let chest_front_mat = self.chest_front.compute_base_matrix(); let wing_in_l_mat = self.wing_in_l.compute_base_matrix(); let wing_in_r_mat = self.wing_in_r.compute_base_matrix(); @@ -72,6 +72,8 @@ impl Skeleton for DragonSkeleton { FigureBoneData::default(), FigureBoneData::default(), FigureBoneData::default(), + FigureBoneData::default(), + FigureBoneData::default(), ] } diff --git a/voxygen/src/anim/fish_medium/mod.rs b/voxygen/src/anim/fish_medium/mod.rs index b085ed7220..5912719299 100644 --- a/voxygen/src/anim/fish_medium/mod.rs +++ b/voxygen/src/anim/fish_medium/mod.rs @@ -35,7 +35,7 @@ impl FishMediumSkeleton { impl Skeleton for FishMediumSkeleton { type Attr = SkeletonAttr; - fn compute_matrices(&self) -> [FigureBoneData; 16] { + fn compute_matrices(&self) -> [FigureBoneData; 18] { let torso_mat = self.torso.compute_base_matrix(); let rear_mat = self.rear.compute_base_matrix(); @@ -56,6 +56,8 @@ impl Skeleton for FishMediumSkeleton { FigureBoneData::default(), FigureBoneData::default(), FigureBoneData::default(), + FigureBoneData::default(), + FigureBoneData::default(), ] } diff --git a/voxygen/src/anim/fish_small/mod.rs b/voxygen/src/anim/fish_small/mod.rs index ed26ef0247..e1b47513f7 100644 --- a/voxygen/src/anim/fish_small/mod.rs +++ b/voxygen/src/anim/fish_small/mod.rs @@ -27,7 +27,7 @@ impl FishSmallSkeleton { impl Skeleton for FishSmallSkeleton { type Attr = SkeletonAttr; - fn compute_matrices(&self) -> [FigureBoneData; 16] { + fn compute_matrices(&self) -> [FigureBoneData; 18] { let torso_mat = self.torso.compute_base_matrix(); [ @@ -47,6 +47,8 @@ impl Skeleton for FishSmallSkeleton { FigureBoneData::default(), FigureBoneData::default(), FigureBoneData::default(), + FigureBoneData::default(), + FigureBoneData::default(), ] } diff --git a/voxygen/src/anim/fixture/mod.rs b/voxygen/src/anim/fixture/mod.rs index 92a68d0125..a243b923a4 100644 --- a/voxygen/src/anim/fixture/mod.rs +++ b/voxygen/src/anim/fixture/mod.rs @@ -13,7 +13,7 @@ impl FixtureSkeleton { impl Skeleton for FixtureSkeleton { type Attr = SkeletonAttr; - fn compute_matrices(&self) -> [FigureBoneData; 16] { + fn compute_matrices(&self) -> [FigureBoneData; 18] { [ FigureBoneData::new(vek::Mat4::identity()), FigureBoneData::new(vek::Mat4::identity()), @@ -31,6 +31,8 @@ impl Skeleton for FixtureSkeleton { FigureBoneData::new(vek::Mat4::identity()), FigureBoneData::new(vek::Mat4::identity()), FigureBoneData::new(vek::Mat4::identity()), + FigureBoneData::new(vek::Mat4::identity()), + FigureBoneData::new(vek::Mat4::identity()), ] } diff --git a/voxygen/src/anim/mod.rs b/voxygen/src/anim/mod.rs index 1a309e95c9..347df6f7e6 100644 --- a/voxygen/src/anim/mod.rs +++ b/voxygen/src/anim/mod.rs @@ -51,7 +51,7 @@ impl Bone { pub trait Skeleton: Send + Sync + 'static { type Attr; - fn compute_matrices(&self) -> [FigureBoneData; 16]; + fn compute_matrices(&self) -> [FigureBoneData; 18]; /// Change the current skeleton to be more like `target`. fn interpolate(&mut self, target: &Self, dt: f32); diff --git a/voxygen/src/anim/object/mod.rs b/voxygen/src/anim/object/mod.rs index d6f3ac510e..b9befc2522 100644 --- a/voxygen/src/anim/object/mod.rs +++ b/voxygen/src/anim/object/mod.rs @@ -15,7 +15,7 @@ const SCALE: f32 = 1.0 / 11.0; impl Skeleton for ObjectSkeleton { type Attr = SkeletonAttr; - fn compute_matrices(&self) -> [FigureBoneData; 16] { + fn compute_matrices(&self) -> [FigureBoneData; 18] { [ FigureBoneData::new(Mat4::scaling_3d(Vec3::broadcast(SCALE))), FigureBoneData::new(Mat4::scaling_3d(Vec3::broadcast(SCALE))), @@ -33,6 +33,8 @@ impl Skeleton for ObjectSkeleton { FigureBoneData::new(Mat4::scaling_3d(Vec3::broadcast(SCALE))), FigureBoneData::new(Mat4::scaling_3d(Vec3::broadcast(SCALE))), FigureBoneData::new(Mat4::scaling_3d(Vec3::broadcast(SCALE))), + FigureBoneData::new(Mat4::scaling_3d(Vec3::broadcast(SCALE))), + FigureBoneData::new(Mat4::scaling_3d(Vec3::broadcast(SCALE))), ] } diff --git a/voxygen/src/anim/quadruped_medium/mod.rs b/voxygen/src/anim/quadruped_medium/mod.rs index 57f36c9c1f..a30eaa0203 100644 --- a/voxygen/src/anim/quadruped_medium/mod.rs +++ b/voxygen/src/anim/quadruped_medium/mod.rs @@ -31,7 +31,7 @@ impl QuadrupedMediumSkeleton { impl Skeleton for QuadrupedMediumSkeleton { type Attr = SkeletonAttr; - fn compute_matrices(&self) -> [FigureBoneData; 16] { + fn compute_matrices(&self) -> [FigureBoneData; 18] { let ears_mat = self.ears.compute_base_matrix(); let head_upper_mat = self.head_upper.compute_base_matrix(); let head_lower_mat = self.head_lower.compute_base_matrix(); @@ -53,6 +53,8 @@ impl Skeleton for QuadrupedMediumSkeleton { FigureBoneData::default(), FigureBoneData::default(), FigureBoneData::default(), + FigureBoneData::default(), + FigureBoneData::default(), ] } diff --git a/voxygen/src/anim/quadruped_small/mod.rs b/voxygen/src/anim/quadruped_small/mod.rs index fb4c559fbf..a277b5aff8 100644 --- a/voxygen/src/anim/quadruped_small/mod.rs +++ b/voxygen/src/anim/quadruped_small/mod.rs @@ -26,7 +26,7 @@ impl QuadrupedSmallSkeleton { impl Skeleton for QuadrupedSmallSkeleton { type Attr = SkeletonAttr; - fn compute_matrices(&self) -> [FigureBoneData; 16] { + fn compute_matrices(&self) -> [FigureBoneData; 18] { [ FigureBoneData::new(self.head.compute_base_matrix()), FigureBoneData::new(self.chest.compute_base_matrix()), @@ -44,6 +44,8 @@ impl Skeleton for QuadrupedSmallSkeleton { FigureBoneData::default(), FigureBoneData::default(), FigureBoneData::default(), + FigureBoneData::default(), + FigureBoneData::default(), ] } diff --git a/voxygen/src/scene/figure/cache.rs b/voxygen/src/scene/figure/cache.rs index fdf0aef8cd..dcace2126d 100644 --- a/voxygen/src/scene/figure/cache.rs +++ b/voxygen/src/scene/figure/cache.rs @@ -172,19 +172,6 @@ impl FigureModelCache { }, CameraMode::FirstPerson => None, }, - if camera_mode != CameraMode::FirstPerson - || character_state - .map(|cs| { - cs.action.is_attack() - || cs.action.is_block() - || cs.action.is_wield() - }) - .unwrap_or_default() - { - Some(mesh_main(equipment.and_then(|e| e.main.as_ref()))) - } else { - None - }, match camera_mode { CameraMode::ThirdPerson => Some( humanoid_armor_shoulder_spec.mesh_left_shoulder(&body), @@ -198,6 +185,19 @@ impl FigureModelCache { CameraMode::FirstPerson => None, }, Some(mesh_glider()), + if camera_mode != CameraMode::FirstPerson + || character_state + .map(|cs| { + cs.action.is_attack() + || cs.action.is_block() + || cs.action.is_wield() + }) + .unwrap_or_default() + { + Some(mesh_main(equipment.and_then(|e| e.main.as_ref()))) + } else { + None + }, Some(mesh_lantern()), None, None,