diff --git a/voxygen/anim/src/character/roll.rs b/voxygen/anim/src/character/roll.rs index fd176ff319..026a70da3b 100644 --- a/voxygen/anim/src/character/roll.rs +++ b/voxygen/anim/src/character/roll.rs @@ -2,7 +2,10 @@ use super::{ super::{vek::*, Animation}, CharacterSkeleton, SkeletonAttr, }; -use common::{comp::item::ToolKind, states::utils::StageSection}; +use common::{ + comp::item::{Hands, ToolKind}, + states::utils::StageSection, +}; use std::f32::consts::PI; pub struct RollAnimation; @@ -10,6 +13,8 @@ pub struct RollAnimation; type RollAnimationDependency = ( Option, Option, + (Option, Option), + bool, Vec3, Vec3, f32, @@ -27,7 +32,16 @@ impl Animation for RollAnimation { fn update_skeleton_inner<'a>( skeleton: &Self::Skeleton, - (_active_tool_kind, _second_tool_kind, orientation, last_ori, _global_time, stage_section): Self::Dependency<'a>, + ( + active_tool_kind, + _second_tool_kind, + hands, + wield_status, + orientation, + last_ori, + _global_time, + stage_section, + ): Self::Dependency<'a>, anim_time: f32, rate: &mut f32, s_a: &SkeletonAttr, @@ -57,6 +71,151 @@ impl Animation for RollAnimation { }; let pullback = 1.0 - movement3; let movement1 = movement1base * pullback; + + if wield_status { + next.main.position = Vec3::new(0.0, 0.0, 0.0); + next.main.orientation = Quaternion::rotation_x(0.0); + next.second.position = Vec3::new(0.0, 0.0, 0.0); + next.second.orientation = Quaternion::rotation_z(0.0); + match hands { + (Some(Hands::Two), _) | (None, Some(Hands::Two)) => match active_tool_kind { + Some(ToolKind::Sword) => { + 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.shr.0, s_a.shr.1, s_a.shr.2); + next.hand_r.orientation = + Quaternion::rotation_x(s_a.shr.3) * Quaternion::rotation_y(s_a.shr.4); + + 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) => { + next.hand_l.position = Vec3::new(s_a.ahl.0, s_a.ahl.1, s_a.ahl.2); + next.hand_l.orientation = + 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.orientation = + Quaternion::rotation_x(s_a.ahr.3) * Quaternion::rotation_z(s_a.ahr.5); + + next.control.position = Vec3::new(s_a.ac.0, s_a.ac.1, s_a.ac.2); + next.control.orientation = Quaternion::rotation_x(s_a.ac.3) + * Quaternion::rotation_y(s_a.ac.4) + * Quaternion::rotation_z(s_a.ac.5); + }, + 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.orientation = Quaternion::rotation_x(s_a.hhl.3) + * Quaternion::rotation_y(s_a.hhl.4) + * 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.orientation = Quaternion::rotation_x(s_a.hhr.3) + * Quaternion::rotation_y(s_a.hhr.4) + * Quaternion::rotation_z(s_a.hhr.5); + + next.control.position = Vec3::new(s_a.hc.0, s_a.hc.1, s_a.hc.2); + next.control.orientation = Quaternion::rotation_x(s_a.hc.3) + * Quaternion::rotation_y(s_a.hc.4) + * Quaternion::rotation_z(s_a.hc.5); + }, + Some(ToolKind::Staff) | Some(ToolKind::Sceptre) => { + next.hand_r.position = Vec3::new(s_a.sthr.0, s_a.sthr.1, s_a.sthr.2); + next.hand_r.orientation = + Quaternion::rotation_x(s_a.sthr.3) * Quaternion::rotation_y(s_a.sthr.4); + + next.control.position = Vec3::new(s_a.stc.0, s_a.stc.1, s_a.stc.2); + + 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) + * Quaternion::rotation_y(s_a.stc.4) + * Quaternion::rotation_z(s_a.stc.5); + }, + Some(ToolKind::Bow) => { + next.hand_l.position = Vec3::new(s_a.bhl.0, s_a.bhl.1, s_a.bhl.2); + next.hand_l.orientation = Quaternion::rotation_x(s_a.bhl.3); + next.hand_r.position = Vec3::new(s_a.bhr.0, s_a.bhr.1, s_a.bhr.2); + next.hand_r.orientation = Quaternion::rotation_x(s_a.bhr.3); + + next.hold.position = Vec3::new(0.0, -1.0, -5.2); + next.hold.orientation = Quaternion::rotation_x(-PI / 2.0); + next.hold.scale = Vec3::one() * 1.0; + + next.control.position = Vec3::new(s_a.bc.0, s_a.bc.1, s_a.bc.2); + next.control.orientation = + Quaternion::rotation_y(s_a.bc.4) * Quaternion::rotation_z(s_a.bc.5); + }, + Some(ToolKind::Debug) => { + next.hand_l.position = Vec3::new(-7.0, 4.0, 3.0); + next.hand_l.orientation = Quaternion::rotation_x(1.27); + next.main.position = Vec3::new(-5.0, 5.0, 23.0); + next.main.orientation = Quaternion::rotation_x(PI); + }, + Some(ToolKind::Farming) => { + next.hand_l.position = Vec3::new(9.0, 1.0, 1.0); + next.hand_l.orientation = Quaternion::rotation_x(PI / 2.0); + next.hand_r.position = Vec3::new(9.0, 1.0, 11.0); + next.hand_r.orientation = Quaternion::rotation_x(PI / 2.0); + next.main.position = Vec3::new(7.5, 7.5, 13.2); + next.main.orientation = Quaternion::rotation_y(PI); + + next.control.position = Vec3::new(-11.0, 1.8, 4.0); + }, + _ => {}, + }, + (_, _) => {}, + }; + match hands { + (Some(Hands::One), _) => { + next.control_l.position = Vec3::new(-7.0, 8.0, 2.0); + next.control_l.orientation = Quaternion::rotation_x(-0.3); + next.hand_l.position = Vec3::new(0.0, -0.5, 0.0); + next.hand_l.orientation = Quaternion::rotation_x(PI / 2.0) + }, + (_, _) => {}, + }; + match hands { + (None | Some(Hands::One), Some(Hands::One)) => { + next.control_r.position = Vec3::new(7.0, 8.0, 2.0); + next.control_r.orientation = Quaternion::rotation_x(-0.3); + next.hand_r.position = Vec3::new(0.0, -0.5, 0.0); + next.hand_r.orientation = Quaternion::rotation_x(PI / 2.0) + }, + (_, _) => {}, + }; + match hands { + (None, None) | (None, Some(Hands::One)) => { + next.hand_l.position = Vec3::new(-4.5, 8.0, 5.0); + next.hand_l.orientation = + Quaternion::rotation_x(1.9) * Quaternion::rotation_y(-0.5) + }, + (_, _) => {}, + }; + match hands { + (None, None) | (Some(Hands::One), None) => { + next.hand_r.position = Vec3::new(4.5, 8.0, 5.0); + next.hand_r.orientation = + Quaternion::rotation_x(1.9) * Quaternion::rotation_y(0.5) + }, + (_, _) => {}, + } + } else { + next.hand_l.position = Vec3::new( + -s_a.hand.0, + s_a.hand.1 + 1.0 * movement1, + s_a.hand.2 + 2.0 * movement1, + ); + + next.hand_l.orientation = Quaternion::rotation_x(0.6 * movement1); + + next.hand_r.position = Vec3::new( + -1.0 * movement1 + s_a.hand.0, + s_a.hand.1 + 1.0 * movement1, + s_a.hand.2 + 2.0 * movement1, + ); + next.hand_r.orientation = Quaternion::rotation_x(0.6 * movement1); + }; next.head.position = Vec3::new( 0.0, s_a.head.0 + 1.5 * movement1, @@ -81,21 +240,6 @@ impl Animation for RollAnimation { ); next.shorts.orientation = Quaternion::rotation_x(0.8 * movement1); - next.hand_l.position = Vec3::new( - -s_a.hand.0, - s_a.hand.1 + 1.0 * movement1, - s_a.hand.2 + 2.0 * movement1, - ); - - next.hand_l.orientation = Quaternion::rotation_x(0.6 * movement1); - - next.hand_r.position = Vec3::new( - -1.0 * movement1 + s_a.hand.0, - s_a.hand.1 + 1.0 * movement1, - s_a.hand.2 + 2.0 * movement1, - ); - next.hand_r.orientation = Quaternion::rotation_x(0.6 * movement1); - next.foot_l.position = Vec3::new( 1.0 * movement1 - s_a.foot.0, s_a.foot.1 + 5.5 * movement1, @@ -110,9 +254,10 @@ impl Animation for RollAnimation { ); next.foot_r.orientation = Quaternion::rotation_x(0.9 * movement1); - next.torso.position = Vec3::new(0.0, 0.0, 8.0 * movement1); - next.torso.orientation = Quaternion::rotation_x(movement1 * -0.4 + movement2 * -2.0 * PI) - * Quaternion::rotation_z(tilt * -10.0); + next.torso.position = Vec3::new(0.0, 0.0, 7.0 * movement1); + next.torso.orientation = + Quaternion::rotation_x(-0.3 + movement1 * -0.4 + movement2 * -2.0 * PI) + * Quaternion::rotation_z(tilt * -10.0); next } diff --git a/voxygen/src/scene/figure/mod.rs b/voxygen/src/scene/figure/mod.rs index 6277149f8c..c749ea2aa2 100644 --- a/voxygen/src/scene/figure/mod.rs +++ b/voxygen/src/scene/figure/mod.rs @@ -1004,7 +1004,7 @@ impl FigureMgr { let target_bones = match &character { CharacterState::Roll(s) => { let stage_time = s.timer.as_secs_f32(); - + let wield_status = s.was_wielded; let stage_progress = match s.stage_section { StageSection::Buildup => { stage_time / s.static_data.buildup_duration.as_secs_f32() @@ -1022,6 +1022,8 @@ impl FigureMgr { ( active_tool_kind, second_tool_kind, + hands, + wield_status, // TODO: Update to use the quaternion. ori * anim::vek::Vec3::::unit_y(), state.last_ori * anim::vek::Vec3::::unit_y(),