From 838d1efe5aa8c676430c604fbc15ef13f56f6d6c Mon Sep 17 00:00:00 2001 From: Louis Pearson Date: Wed, 29 Jul 2020 04:51:41 -0600 Subject: [PATCH] Begin sending audio events from animation events --- voxygen/src/anim/src/character/run.rs | 15 ++++++++++++--- voxygen/src/anim/src/lib.rs | 2 +- .../src/audio/sfx/event_mapper/movement/mod.rs | 2 +- voxygen/src/scene/figure/mod.rs | 15 ++++++++++++++- 4 files changed, 28 insertions(+), 6 deletions(-) diff --git a/voxygen/src/anim/src/character/run.rs b/voxygen/src/anim/src/character/run.rs index 7fac4685e6..a5a061b1a4 100644 --- a/voxygen/src/anim/src/character/run.rs +++ b/voxygen/src/anim/src/character/run.rs @@ -1,4 +1,4 @@ -use super::{super::{Animation, AnimationEventItem}, CharacterSkeleton, SkeletonAttr}; +use super::{super::{Animation, AnimationEvent, AnimationEventItem}, CharacterSkeleton, SkeletonAttr}; use common::comp::item::{Hands, ToolKind}; use std::{f32::consts::PI, ops::Mul}; use vek::*; @@ -34,7 +34,7 @@ impl Animation for RunAnimation { ) -> (Self::Skeleton, VecDeque) { let mut next = (*skeleton).clone(); - let speed = Vec2::::from(velocity).magnitude(); + let speed = Vec2::::from(velocity).magnitude() / 3.0; *rate = 1.0; let impact = (avg_vel.z).max(-8.0); @@ -266,6 +266,15 @@ impl Animation for RunAnimation { (_, _) => Vec3::zero(), }; - (next, VecDeque::new()) + let mut animation_events = VecDeque::new(); + + // if anim_time.rem_euclid(0.5) < 0.01 { + // if (footrotl).abs() < (0.05) { + if (footvertl).abs() < 0.05 { + let pos = next.l_foot.offset; + animation_events.push_back(AnimationEventItem::new(AnimationEvent::Step, pos)); + } + + (next, animation_events) } } diff --git a/voxygen/src/anim/src/lib.rs b/voxygen/src/anim/src/lib.rs index c8db3daa85..9596a7f55b 100644 --- a/voxygen/src/anim/src/lib.rs +++ b/voxygen/src/anim/src/lib.rs @@ -164,7 +164,7 @@ pub trait Animation { f64, &mut f32, &::Attr, - ) -> Self::Skeleton, + ) -> (Self::Skeleton, VecDeque), > = unsafe { //let start = std::time::Instant::now(); // Overhead of 0.5-5 us (could use hashmap to mitigate if this is an issue) diff --git a/voxygen/src/audio/sfx/event_mapper/movement/mod.rs b/voxygen/src/audio/sfx/event_mapper/movement/mod.rs index a884066274..444c3780ed 100644 --- a/voxygen/src/audio/sfx/event_mapper/movement/mod.rs +++ b/voxygen/src/audio/sfx/event_mapper/movement/mod.rs @@ -156,7 +156,7 @@ impl MovementEventMapper { return if character_state.is_dodge() { SfxEvent::Roll } else { - SfxEvent::Run + SfxEvent::Idle }; } diff --git a/voxygen/src/scene/figure/mod.rs b/voxygen/src/scene/figure/mod.rs index 422d170e25..3c4eff44e0 100644 --- a/voxygen/src/scene/figure/mod.rs +++ b/voxygen/src/scene/figure/mod.rs @@ -5,6 +5,7 @@ pub use cache::FigureModelCache; pub use load::load_mesh; // TODO: Don't make this public. use crate::{ + audio::sfx::{SfxEvent, SfxEventItem}, ecs::comp::Interpolated, render::{Consts, FigureBoneData, FigureLocals, Globals, Light, Renderer, Shadow}, scene::{ @@ -13,6 +14,7 @@ use crate::{ }, }; use anim::{ + AnimationEvent, biped_large::BipedLargeSkeleton, bird_medium::BirdMediumSkeleton, bird_small::BirdSmallSkeleton, character::CharacterSkeleton, critter::CritterSkeleton, dragon::DragonSkeleton, fish_medium::FishMediumSkeleton, fish_small::FishSmallSkeleton, @@ -25,6 +27,7 @@ use common::{ item::ItemKind, Body, CharacterState, Last, LightAnimation, LightEmitter, Loadout, Ori, PhysicsState, Pos, Scale, Stats, Vel, }, + event::EventBus, state::{DeltaTime, State}, states::triple_strike, terrain::TerrainChunk, @@ -32,10 +35,10 @@ use common::{ }; use hashbrown::HashMap; use specs::{Entity as EcsEntity, Join, WorldExt}; +use std::collections::VecDeque; use tracing::trace; use treeculler::{BVol, BoundingSphere}; use vek::*; -use std::collections::VecDeque; const DAMAGE_FADE_COEFFICIENT: f64 = 5.0; const MOVING_THRESHOLD: f32 = 0.7; @@ -185,6 +188,7 @@ impl FigureMgr { let time = state.get_time(); let tick = scene_data.tick; let ecs = state.ecs(); + let audio_events = ecs.read_resource::>(); let view_distance = scene_data.view_distance; let dt = state.get_delta_time(); let frustum = camera.frustum(); @@ -885,6 +889,15 @@ impl FigureMgr { true, is_player, ); + + for event in animation_events { + match &event.event { + AnimationEvent::Step => { + let ev_pos = pos.0 + event.pos; + audio_events.emit_now(SfxEventItem::new(SfxEvent::Run, Some(ev_pos), Some(0.9))); + } + } + } }, Body::QuadrupedSmall(_) => { let skeleton_attr = &self