diff --git a/include/Engine/Rendering/AnimationSystem.h b/include/Engine/Rendering/AnimationSystem.h index a04aa3c5..ec8db2dd 100644 --- a/include/Engine/Rendering/AnimationSystem.h +++ b/include/Engine/Rendering/AnimationSystem.h @@ -12,7 +12,7 @@ #include "Rendering/EAutoAnimationBlend.h" #include "../Core/EntityWrapper.h" #include "Rendering/AutoBlendQueue.h" - +#include "../Input/EInputCommand.h" #include "imgui/imgui.h" class AnimationSystem : public ImpureSystem @@ -28,7 +28,8 @@ private: EventRelay m_EAutoAnimationBlend; bool OnAutoAnimationBlend(Events::AutoAnimationBlend& e); - + EventRelay m_EInputCommand; + bool OnInputCommand(const Events::InputCommand& e); std::unordered_map m_AutoBlendQueues; }; diff --git a/src/Engine/Rendering/AnimationSystem.cpp b/src/Engine/Rendering/AnimationSystem.cpp index 99643997..9d785a5c 100644 --- a/src/Engine/Rendering/AnimationSystem.cpp +++ b/src/Engine/Rendering/AnimationSystem.cpp @@ -4,6 +4,7 @@ AnimationSystem::AnimationSystem(SystemParams params) : System(params) { EVENT_SUBSCRIBE_MEMBER(m_EAutoAnimationBlend, &AnimationSystem::OnAutoAnimationBlend); + EVENT_SUBSCRIBE_MEMBER(m_EInputCommand, &AnimationSystem::OnInputCommand); } void AnimationSystem::Update(double dt) @@ -133,7 +134,12 @@ void AnimationSystem::UpdateWeights(double dt) std::shared_ptr blendTree = autoBlendQueue.second.GetBlendTree(); if (blendTree != nullptr) { - blendJob.BlendInfo.progress = glm::clamp(blendJob.CurrentTime / blendJob.Duration, 0.0, 1.0); + if (blendJob.Duration != 0.0) { + blendJob.BlendInfo.progress = glm::clamp(blendJob.CurrentTime / blendJob.Duration, 0.0, 1.0); + } else { + blendJob.BlendInfo.progress = 1.0; + } + blendJob.BlendInfo = blendTree->AutoBlendStep(blendJob.BlendInfo); } @@ -215,3 +221,42 @@ bool AnimationSystem::OnAutoAnimationBlend(Events::AutoAnimationBlend& e) m_AutoBlendQueues[subTreeRoot].Insert(abj); return true; } + +bool AnimationSystem::OnInputCommand(const Events::InputCommand& e) +{ + if (e.Value == 1.0f) { + if (e.Command == "Shoot") { + auto blendComponents = m_World->GetComponents("Model"); + + if (blendComponents == nullptr) { + return false; + } + for (auto& bc : *blendComponents) { + EntityWrapper entity = EntityWrapper(m_World, bc.EntityID); + + if (entity.Name() == "Hands") { + { + Events::AutoAnimationBlend aeb; + aeb.Duration = 0.0; + aeb.NodeName = "Fire"; + aeb.RootNode = entity; + aeb.Start = true; + aeb.Restart = true; + m_EventBroker->Publish(aeb); + } + { + Events::AutoAnimationBlend aeb; + aeb.Duration = 0.1; + aeb.NodeName = "Idle"; + aeb.RootNode = entity; + aeb.Delay = 0.0; + aeb.Start = true; + aeb.Restart = false; + aeb.AnimationEntity = entity.FirstChildByName("PrimaryBlendTree").FirstChildByName("Fire"); + m_EventBroker->Publish(aeb); + } + } + } + } + } +}