From 2eee43865fb4cdfba28a4c4cdb6d77381394ca0f Mon Sep 17 00:00:00 2001 From: jshipsey Date: Fri, 11 Feb 2022 02:07:15 -0500 Subject: [PATCH] chieftain anims --- .../weapon/biped_small/staff/chieftain.vox | 2 +- common/src/comp/body.rs | 4 +- server/src/sys/agent/attack.rs | 3 +- voxygen/anim/src/biped_small/alpha.rs | 25 ++++ voxygen/anim/src/biped_small/mod.rs | 7 +- voxygen/anim/src/biped_small/shockwave.rs | 116 +++++++++++++++++ voxygen/anim/src/biped_small/summon.rs | 121 ++++++++++++++++++ voxygen/src/scene/figure/mod.rs | 64 +++++++++ world/src/site2/plot/gnarling.rs | 38 +++++- 9 files changed, 369 insertions(+), 11 deletions(-) create mode 100644 voxygen/anim/src/biped_small/shockwave.rs create mode 100644 voxygen/anim/src/biped_small/summon.rs diff --git a/assets/voxygen/voxel/weapon/biped_small/staff/chieftain.vox b/assets/voxygen/voxel/weapon/biped_small/staff/chieftain.vox index 030aa25f8d..1a7c203778 100644 --- a/assets/voxygen/voxel/weapon/biped_small/staff/chieftain.vox +++ b/assets/voxygen/voxel/weapon/biped_small/staff/chieftain.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:674acd0d0c5909382fbccea88c9ab788ea4b5c715e31aca529e3fbae361c7854 +oid sha256:541e9cba853a1531e908888d61ba468ed68187f744c47fb076636a588060dbfc size 1928 diff --git a/common/src/comp/body.rs b/common/src/comp/body.rs index 18911513d6..97f9e5462c 100644 --- a/common/src/comp/body.rs +++ b/common/src/comp/body.rs @@ -777,7 +777,9 @@ impl Body { Body::Arthropod(_) => true, _ => false, }, - BuffKind::Regeneration => matches!(self, Body::Object(object::Body::GnarlingTotemGreen)), + BuffKind::Regeneration => { + matches!(self, Body::Object(object::Body::GnarlingTotemGreen)) + }, _ => false, } } diff --git a/server/src/sys/agent/attack.rs b/server/src/sys/agent/attack.rs index 92e8c74688..e0fe4e8b5b 100644 --- a/server/src/sys/agent/attack.rs +++ b/server/src/sys/agent/attack.rs @@ -2265,7 +2265,8 @@ impl<'a> AgentData<'a> { if !agent.action_state.initialized { // If not initialized yet, start out by summoning green totem controller.push_basic_input(InputKind::Ability(2)); - if matches!(self.char_state, CharacterState::BasicSummon(s) if s.stage_section == StageSection::Recover) { + if matches!(self.char_state, CharacterState::BasicSummon(s) if s.stage_section == StageSection::Recover) + { agent.action_state.initialized = true; } } else if agent.action_state.timer > TOTEM_TIMER { diff --git a/voxygen/anim/src/biped_small/alpha.rs b/voxygen/anim/src/biped_small/alpha.rs index 90ec92eea6..8e4d118e53 100644 --- a/voxygen/anim/src/biped_small/alpha.rs +++ b/voxygen/anim/src/biped_small/alpha.rs @@ -168,6 +168,31 @@ impl Animation for AlphaAnimation { * Quaternion::rotation_y(move1abs * -0.4 + move2abs * 1.0) * Quaternion::rotation_z(-0.3 + move2abs * -2.2); }, + Some(ToolKind::Staff) => { + next.control_l.position = Vec3::new(2.0 - s_a.grip.0 * 2.0, 1.0, 3.0); + next.control_r.position = Vec3::new(7.0 + s_a.grip.0 * 2.0, -4.0, 3.0); + + next.control.position = Vec3::new( + -5.0 + move1 * 5.0 + move2 * -5.0, + -1.0 + s_a.grip.2, + -2.0 + -s_a.grip.2 / 2.5 + s_a.grip.0 * -2.0 + move1abs * 6.0 + move2abs * -3.0, + ); + + next.control_l.orientation = Quaternion::rotation_x(PI / 2.0) + * Quaternion::rotation_y(-0.3) + * Quaternion::rotation_z(-0.3); + next.control_r.orientation = Quaternion::rotation_x(PI / 2.0 + s_a.grip.0 * 0.2) + * Quaternion::rotation_y(-0.4 + s_a.grip.0 * 0.2) + * Quaternion::rotation_z(-0.0); + + next.control.orientation = + Quaternion::rotation_x(-0.3 + move1abs * 1.0 + move2abs * -2.0) + * Quaternion::rotation_y(0.0) + * Quaternion::rotation_z(0.5); + next.chest.orientation = Quaternion::rotation_x(move1abs * 0.5 + move2abs * -1.0) + * Quaternion::rotation_z(move1 * 1.2 + move2 * -1.8); + next.head.orientation = Quaternion::rotation_z(move1 * -0.8 + move2 * 0.8); + }, _ => { next.chest.orientation = Quaternion::rotation_x(move2abs * -1.0) * Quaternion::rotation_z(move1 * 1.2 + move2 * -1.8); diff --git a/voxygen/anim/src/biped_small/mod.rs b/voxygen/anim/src/biped_small/mod.rs index 28e2313fdd..d1704bbf77 100644 --- a/voxygen/anim/src/biped_small/mod.rs +++ b/voxygen/anim/src/biped_small/mod.rs @@ -3,16 +3,19 @@ pub mod beam; pub mod dash; pub mod idle; pub mod run; +pub mod shockwave; pub mod shoot; pub mod spinmelee; pub mod stunned; +pub mod summon; pub mod wield; // Reexports pub use self::{ alpha::AlphaAnimation, beam::BeamAnimation, dash::DashAnimation, idle::IdleAnimation, - run::RunAnimation, shoot::ShootAnimation, spinmelee::SpinMeleeAnimation, - stunned::StunnedAnimation, wield::WieldAnimation, + run::RunAnimation, shockwave::ShockwaveAnimation, shoot::ShootAnimation, + spinmelee::SpinMeleeAnimation, stunned::StunnedAnimation, summon::SummonAnimation, + wield::WieldAnimation, }; use super::{make_bone, vek::*, FigureBoneData, Offsets, Skeleton}; diff --git a/voxygen/anim/src/biped_small/shockwave.rs b/voxygen/anim/src/biped_small/shockwave.rs new file mode 100644 index 0000000000..5fd3d2a802 --- /dev/null +++ b/voxygen/anim/src/biped_small/shockwave.rs @@ -0,0 +1,116 @@ +use super::{ + super::{vek::*, Animation}, + BipedSmallSkeleton, SkeletonAttr, +}; +use common::{comp::item::ToolKind, states::utils::StageSection}; +use std::f32::consts::PI; + +pub struct ShockwaveAnimation; + +type ShockwaveAnimationDependency = ( + Option, + Vec3, + Vec3, + Vec3, + f32, + Vec3, + f32, + Option, + f32, +); + +impl Animation for ShockwaveAnimation { + type Dependency<'a> = ShockwaveAnimationDependency; + type Skeleton = BipedSmallSkeleton; + + #[cfg(feature = "use-dyn-lib")] + const UPDATE_FN: &'static [u8] = b"biped_small_shockwave\0"; + + #[cfg_attr(feature = "be-dyn-lib", export_name = "biped_small_shockwave")] + + fn update_skeleton_inner<'a>( + skeleton: &Self::Skeleton, + ( + active_tool_kind, + _velocity, + _orientation, + _last_ori, + global_time, + _avg_vel, + _acc_vel, + stage_section, + timer, + ): Self::Dependency<'a>, + anim_time: f32, + _rate: &mut f32, + s_a: &SkeletonAttr, + ) -> Self::Skeleton { + let mut next = (*skeleton).clone(); + + let anim_time = anim_time.min(1.0); + let (move1base, twitch, move2base, move3) = match stage_section { + Some(StageSection::Buildup) => (anim_time.sqrt(), (anim_time * 13.0).sin(), 0.0, 0.0), + Some(StageSection::Action) => (1.0, 1.0, anim_time.powi(4), 0.0), + Some(StageSection::Recover) => (1.0, 1.0, 1.0, anim_time), + _ => (0.0, 0.0, 0.0, 0.0), + }; + let pullback = 1.0 - move3; + let twitch = twitch * pullback; + let subtract = global_time - timer; + let check = subtract - subtract.trunc(); + let mirror = (check - 0.5).signum(); + let move1 = move1base * pullback * mirror; + let move2 = move2base * pullback * mirror; + let move1abs = move1base * pullback; + let move2abs = move2base * pullback; + next.hand_l.position = Vec3::new(s_a.grip.0 * 4.0, 0.0, s_a.grip.2); + next.hand_r.position = Vec3::new(-s_a.grip.0 * 4.0, 0.0, s_a.grip.2); + next.main.position = Vec3::new(0.0, 0.0, 0.0); + next.main.orientation = Quaternion::rotation_x(0.0); + next.hand_l.orientation = Quaternion::rotation_x(0.0); + next.hand_r.orientation = Quaternion::rotation_x(0.0); + match active_tool_kind { + Some(ToolKind::Staff) => { + next.control_l.position = Vec3::new(2.0 - s_a.grip.0 * 2.0, 1.0, 3.0); + next.control_r.position = Vec3::new( + 7.0 + s_a.grip.0 * 2.0 + move1abs * -8.0, + -4.0 + move1abs * 5.0, + 3.0, + ); + + next.control.position = Vec3::new( + -5.0 + move1abs * 5.0, + -1.0 + s_a.grip.2 + move1abs * 3.0 + move2abs * 5.0, + -2.0 + -s_a.grip.2 / 2.5 + + s_a.grip.0 * -2.0 + + move1abs * 12.0 + + move2abs * -13.0, + ); + + next.control_l.orientation = Quaternion::rotation_x(PI / 2.0) + * Quaternion::rotation_y(-0.3) + * Quaternion::rotation_z(-0.3); + next.control_r.orientation = Quaternion::rotation_x(PI / 2.0 + s_a.grip.0 * 0.2) + * Quaternion::rotation_y(-0.4 + s_a.grip.0 * 0.2) + * Quaternion::rotation_z(-0.0); + + next.control.orientation = Quaternion::rotation_x(-0.3 + move1abs * 0.2) + * Quaternion::rotation_y(0.0) + * Quaternion::rotation_z(0.5); + next.chest.orientation = Quaternion::rotation_x(move1abs * 0.5 + move2abs * -1.0); + next.head.orientation = + Quaternion::rotation_x(move1abs * 0.5) * Quaternion::rotation_y(twitch * 0.5); + next.main.orientation = Quaternion::rotation_z(move1abs * 0.5 + move2abs * 0.9); + }, + _ => { + next.chest.orientation = Quaternion::rotation_x(move2abs * -1.0) + * Quaternion::rotation_z(move1 * 1.2 + move2 * -1.8); + next.hand_l.position = Vec3::new(-s_a.hand.0, s_a.hand.1, s_a.hand.2); + next.hand_l.orientation = Quaternion::rotation_x(1.2); + next.hand_r.position = Vec3::new(s_a.hand.0, s_a.hand.1, s_a.hand.2); + next.hand_r.orientation = Quaternion::rotation_x(1.2); + }, + } + next + } +} diff --git a/voxygen/anim/src/biped_small/summon.rs b/voxygen/anim/src/biped_small/summon.rs new file mode 100644 index 0000000000..3d0a44a786 --- /dev/null +++ b/voxygen/anim/src/biped_small/summon.rs @@ -0,0 +1,121 @@ +use super::{ + super::{vek::*, Animation}, + BipedSmallSkeleton, SkeletonAttr, +}; +use common::{comp::item::ToolKind, states::utils::StageSection}; +use std::f32::consts::PI; + +pub struct SummonAnimation; + +type SummonAnimationDependency = ( + Option, + Vec3, + Vec3, + Vec3, + f32, + Vec3, + f32, + Option, + f32, +); + +impl Animation for SummonAnimation { + type Dependency<'a> = SummonAnimationDependency; + type Skeleton = BipedSmallSkeleton; + + #[cfg(feature = "use-dyn-lib")] + const UPDATE_FN: &'static [u8] = b"biped_small_summon\0"; + + #[cfg_attr(feature = "be-dyn-lib", export_name = "biped_small_summon")] + + fn update_skeleton_inner<'a>( + skeleton: &Self::Skeleton, + ( + active_tool_kind, + _velocity, + _orientation, + _last_ori, + global_time, + _avg_vel, + _acc_vel, + stage_section, + timer, + ): Self::Dependency<'a>, + anim_time: f32, + _rate: &mut f32, + s_a: &SkeletonAttr, + ) -> Self::Skeleton { + let mut next = (*skeleton).clone(); + + let anim_time = anim_time.min(1.0); + let (move1base, twitch, twitch2, move2base, move3) = match stage_section { + Some(StageSection::Buildup) => { + (anim_time.sqrt(), (anim_time * 5.0).sin(), 0.0, 0.0, 0.0) + }, + Some(StageSection::Action) => { + (1.0, 1.0, (anim_time * 10.0).sin(), anim_time.powi(4), 0.0) + }, + Some(StageSection::Recover) => (1.0, 1.0, 1.0, 1.0, anim_time), + _ => (0.0, 0.0, 0.0, 0.0, 0.0), + }; + let pullback = 1.0 - move3; + let twitch = twitch * pullback; + let twitch2 = twitch2 * pullback; + let subtract = global_time - timer; + let check = subtract - subtract.trunc(); + let mirror = (check - 0.5).signum(); + let move1 = move1base * pullback * mirror; + let move2 = move2base * pullback * mirror; + let move1abs = move1base * pullback; + let move2abs = move2base * pullback; + next.hand_l.position = Vec3::new(s_a.grip.0 * 4.0, 0.0, s_a.grip.2); + next.hand_r.position = Vec3::new(-s_a.grip.0 * 4.0, 0.0, s_a.grip.2); + next.main.position = Vec3::new(0.0, 0.0, 0.0); + next.main.orientation = Quaternion::rotation_x(0.0); + next.hand_l.orientation = Quaternion::rotation_x(0.0); + next.hand_r.orientation = Quaternion::rotation_x(0.0); + match active_tool_kind { + Some(ToolKind::Staff) => { + next.control_l.position = Vec3::new(2.0 - s_a.grip.0 * 2.0, 1.0, 3.0); + next.control_r.position = Vec3::new( + 7.0 + s_a.grip.0 * 2.0, + -4.0 + move1abs * -14.0, + 3.0 + twitch * 2.0 + twitch2 * 2.0, + ); + + next.control.position = Vec3::new( + -5.0 + move1abs * -5.0, + -1.0 + s_a.grip.2 + move1abs * -8.0, + -2.0 + -s_a.grip.2 / 2.5 + s_a.grip.0 * -2.0 + twitch2 * -2.0, + ); + next.chest.position = + Vec3::new(0.0, s_a.chest.0, s_a.chest.1 + twitch2 + move2abs * 3.0); + next.control_l.orientation = Quaternion::rotation_x(PI / 2.0) + * Quaternion::rotation_y(-0.3) + * Quaternion::rotation_z(-0.3); + next.control_r.orientation = Quaternion::rotation_x( + PI / 2.0 + s_a.grip.0 * 0.2 + twitch * 0.2 + twitch2 * 0.2, + ) * Quaternion::rotation_y( + -0.4 + s_a.grip.0 * 0.2 + move1abs * -2.0, + ) * Quaternion::rotation_z(move1abs * 0.5); + + next.control.orientation = Quaternion::rotation_x(-0.3) + * Quaternion::rotation_y(0.0) + * Quaternion::rotation_z(0.5 + move1abs * 1.0); + next.chest.orientation = Quaternion::rotation_x(0.0) * Quaternion::rotation_z(0.0); + next.head.orientation = + Quaternion::rotation_z(twitch * 0.2 + twitch2 * 0.4 + move2abs * -0.5) + * Quaternion::rotation_x(move2abs * 0.7); + }, + _ => { + next.chest.orientation = Quaternion::rotation_x(move2abs * -1.0) + * Quaternion::rotation_z(move1 * 1.2 + move2 * -1.8); + next.hand_l.position = Vec3::new(-s_a.hand.0, s_a.hand.1, s_a.hand.2); + next.hand_l.orientation = Quaternion::rotation_x(1.2); + next.hand_r.position = Vec3::new(s_a.hand.0, s_a.hand.1, s_a.hand.2); + next.hand_r.orientation = Quaternion::rotation_x(1.2); + }, + } + next + } +} diff --git a/voxygen/src/scene/figure/mod.rs b/voxygen/src/scene/figure/mod.rs index 6298e2a3f0..fa59b65150 100644 --- a/voxygen/src/scene/figure/mod.rs +++ b/voxygen/src/scene/figure/mod.rs @@ -3246,6 +3246,70 @@ impl FigureMgr { skeleton_attr, ) }, + CharacterState::Shockwave(s) => { + let stage_time = s.timer.as_secs_f32(); + let stage_progress = match s.stage_section { + StageSection::Buildup => { + stage_time / s.static_data.buildup_duration.as_secs_f32() + }, + StageSection::Action => { + stage_time / s.static_data.swing_duration.as_secs_f32() + }, + StageSection::Recover => { + stage_time / s.static_data.recover_duration.as_secs_f32() + }, + _ => 0.0, + }; + anim::biped_small::ShockwaveAnimation::update_skeleton( + &target_base, + ( + active_tool_kind, + rel_vel, + ori * anim::vek::Vec3::::unit_y(), + state.last_ori * anim::vek::Vec3::::unit_y(), + time, + rel_avg_vel, + state.acc_vel, + Some(s.stage_section), + state.state_time, + ), + stage_progress, + &mut state_animation_rate, + skeleton_attr, + ) + }, + CharacterState::BasicSummon(s) => { + let stage_time = s.timer.as_secs_f32(); + let stage_progress = match s.stage_section { + StageSection::Buildup => { + stage_time / s.static_data.buildup_duration.as_secs_f32() + }, + StageSection::Action => { + stage_time / s.static_data.cast_duration.as_secs_f32() + }, + StageSection::Recover => { + stage_time / s.static_data.recover_duration.as_secs_f32() + }, + _ => 0.0, + }; + anim::biped_small::SummonAnimation::update_skeleton( + &target_base, + ( + active_tool_kind, + rel_vel, + ori * anim::vek::Vec3::::unit_y(), + state.last_ori * anim::vek::Vec3::::unit_y(), + time, + rel_avg_vel, + state.acc_vel, + Some(s.stage_section), + state.state_time, + ), + stage_progress, + &mut state_animation_rate, + skeleton_attr, + ) + }, // TODO! _ => target_base, }; diff --git a/world/src/site2/plot/gnarling.rs b/world/src/site2/plot/gnarling.rs index ed7aa91a36..c35217655e 100644 --- a/world/src/site2/plot/gnarling.rs +++ b/world/src/site2/plot/gnarling.rs @@ -503,7 +503,7 @@ impl Structure for GnarlingFortification { let mosstop1 = root1.translate(Vec3::new(0, 0, 1)); - root1.fill(darkwood); + root1.fill(darkwood.clone()); let start = (start_wpos + 3) .as_() @@ -525,9 +525,39 @@ impl Structure for GnarlingFortification { painter.cubic_bezier(start, mid + startshift, mid + endshift, end, 2.0); let mosstop2 = root2.translate(Vec3::new(0, 0, 1)); + let start = start_wpos.as_().with_z(land.get_alt_approx(start_wpos)); + let end = end_wpos.as_().with_z(land.get_alt_approx(end_wpos)); + + let wall_base_height = 3.0; + let wall_mid_thickness = 1.0; + let wall_mid_height = 7.0 + wall_base_height; + + painter + .segment_prism(start, end, wall_mid_thickness, wall_mid_height) + .fill(darkwood.clone()); + + let start = start_wpos + .as_() + .with_z(land.get_alt_approx(start_wpos) + wall_mid_height); + let end = end_wpos + .as_() + .with_z(land.get_alt_approx(end_wpos) + wall_mid_height); + + let wall_top_thickness = 2.0; + let wall_top_height = 1.0; + + let topwall = + painter.segment_prism(start, end, wall_top_thickness, wall_top_height); + let mosstopwall = topwall.translate(Vec3::new(0, 0, 1)); + + topwall.fill(lightwood.clone()); root2.fill(lightwood); + mosstopwall + .intersect(mossroot.translate(Vec3::new(0, 0, 8))) + .fill(moss.clone()); + mosstop1.intersect(mossroot).fill(moss.clone()); mosstop2.intersect(mossroot).fill(moss); }) @@ -857,10 +887,6 @@ impl Structure for GnarlingFortification { // Floor let raise = 5; - let base = wpos.with_z(alt); - painter - .cylinder_with_radius(base, hut_radius + 1.0, 2.0) - .fill(lightwood.clone()); let platform = painter.aabb(Aabb { min: (wpos - 20).with_z(alt + raise), @@ -875,7 +901,7 @@ impl Structure for GnarlingFortification { 2.0, ); let support_inner_1 = painter.aabb(Aabb { - min: (wpos - 19).with_z(alt - 3), + min: (wpos - 19).with_z(alt - 10), max: (wpos - 15).with_z(alt + raise), }); let support_2 = support_1.translate(Vec3::new(0, 37, 0));