BVB Source Codes

CRYENGINE Show ProceduralClipAimPose.cpp Source code

Return Download CRYENGINE: download ProceduralClipAimPose.cpp Source code - Download CRYENGINE Source code - Type:.cpp
  1. // Copyright 2001-2016 Crytek GmbH / Crytek Group. All rights reserved.
  2.  
  3. //
  4. ////////////////////////////////////////////////////////////////////////////
  5.  
  6. #include "StdAfx.h"
  7.  
  8. #include "ICryMannequin.h"
  9.  
  10. #include <Mannequin/Serialization.h>
  11.  
  12. #define PROC_CLIP_AIM_POSE_TOKEN_BASE 140000
  13.  
  14. struct SAimIKParams : public IProceduralParams
  15. {
  16.         SAimIKParams()
  17.                 : blendTime(1.0f)
  18.                 , layer(4)
  19.         {
  20.         }
  21.  
  22.         virtual void Serialize(Serialization::IArchive& ar) override
  23.         {
  24.                 ar(Serialization::Decorators::AnimationName<SAnimRef>(animRef), "Animation", "Animation");
  25.                 ar(blendTime, "BlendTime", "Blend Time");
  26.                 ar(Serialization::Decorators::Range<uint32>(layer, 0, 15), "AnimationLayer", "Animation Layer");
  27.         }
  28.  
  29.         virtual void GetExtraDebugInfo(StringWrapper& extraInfoOut) const override
  30.         {
  31.                 extraInfoOut = animRef.c_str();
  32.         }
  33.  
  34.         SAnimRef animRef;
  35.         float    blendTime;
  36.         uint32   layer;
  37. };
  38.  
  39. class CProceduralClipAimPose : public TProceduralClip<SAimIKParams>
  40. {
  41. public:
  42.         CProceduralClipAimPose()
  43.                 : m_IKLayer(0)
  44.                 , m_token(0)
  45.         {
  46.         }
  47.  
  48.         virtual void OnEnter(float blendTime, float duration, const SAimIKParams& params)
  49.         {
  50.                 if (!m_charInstance)
  51.                         return;
  52.  
  53.                 Vec3 lookPos;
  54.                 if (!GetParam("AimTarget", lookPos))
  55.                 {
  56.                         lookPos = m_entity->GetWorldPos();
  57.                         lookPos += m_entity->GetForwardDir() * 10.0f;
  58.                 }
  59.  
  60.                 const float smoothTime = params.blendTime;
  61.                 m_IKLayer = (uint32)params.layer;
  62.                 if (IAnimationPoseBlenderDir* poseBlenderAim = m_charInstance->GetISkeletonPose()->GetIPoseBlenderAim())
  63.                 {
  64.                         poseBlenderAim->SetState(true);
  65.                         const bool wasPoseBlenderActive = (0.01f < poseBlenderAim->GetBlend());
  66.                         if (!wasPoseBlenderActive)
  67.                         {
  68.                                 poseBlenderAim->SetTarget(lookPos);
  69.                         }
  70.                         poseBlenderAim->SetPolarCoordinatesSmoothTimeSeconds(smoothTime);
  71.                         poseBlenderAim->SetLayer(m_IKLayer);
  72.                         poseBlenderAim->SetFadeInSpeed(blendTime);
  73.  
  74.                         StartAimAnimation(blendTime);
  75.                 }
  76.         }
  77.  
  78.         virtual void OnExit(float blendTime)
  79.         {
  80.                 if (!m_charInstance)
  81.                         return;
  82.  
  83.                 IAnimationPoseBlenderDir* poseBlenderAim = m_charInstance->GetISkeletonPose()->GetIPoseBlenderAim();
  84.  
  85.                 StopAimAnimation(blendTime);
  86.  
  87.                 if (poseBlenderAim)
  88.                 {
  89.                         poseBlenderAim->SetState(false);
  90.                         poseBlenderAim->SetFadeOutSpeed(blendTime);
  91.                 }
  92.         }
  93.  
  94.         virtual void Update(float timePassed)
  95.         {
  96.                 if (!m_charInstance)
  97.                         return;
  98.  
  99.                 QuatT target;
  100.                 if (GetParam("AimTarget", target))
  101.                 {
  102.                         IAnimationPoseBlenderDir* pPoseBlenderAim = m_charInstance->GetISkeletonPose()->GetIPoseBlenderAim();
  103.                         if (pPoseBlenderAim)
  104.                         {
  105.                                 pPoseBlenderAim->SetTarget(target.t);
  106.                         }
  107.                 }
  108.         }
  109.  
  110. private:
  111.         void StartAimAnimation(const float blendTime)
  112.         {
  113.                 const SAimIKParams& params = GetParams();
  114.                 if (params.animRef.IsEmpty())
  115.                 {
  116.                         return;
  117.                 }
  118.  
  119.                 m_token = GetNextToken();
  120.  
  121.                 CryCharAnimationParams animParams;
  122.                 animParams.m_fTransTime = blendTime;
  123.                 animParams.m_nLayerID = m_IKLayer;
  124.                 animParams.m_nUserToken = m_token;
  125.                 animParams.m_nFlags = CA_LOOP_ANIMATION | CA_ALLOW_ANIM_RESTART;
  126.                 int animID = m_charInstance->GetIAnimationSet()->GetAnimIDByCRC(params.animRef.crc);
  127.                 m_charInstance->GetISkeletonAnim()->StartAnimationById(animID, animParams);
  128.         }
  129.  
  130.         void StopAimAnimation(const float blendTime)
  131.         {
  132.                 const SAimIKParams& params = GetParams();
  133.                 if (params.animRef.IsEmpty())
  134.                 {
  135.                         return;
  136.                 }
  137.  
  138.                 CRY_ASSERT(m_token != 0);
  139.  
  140.                 ISkeletonAnim& skeletonAnimation = *m_charInstance->GetISkeletonAnim();
  141.  
  142.                 const int animationCount = skeletonAnimation.GetNumAnimsInFIFO(m_IKLayer);
  143.                 for (int i = 0; i < animationCount; ++i)
  144.                 {
  145.                         const CAnimation& animation = skeletonAnimation.GetAnimFromFIFO(m_IKLayer, i);
  146.                         const uint32 animationToken = animation.GetUserToken();
  147.                         if (animationToken == m_token)
  148.                         {
  149.                                 const bool isTopAnimation = (i == (animationCount - 1));
  150.                                 if (isTopAnimation)
  151.                                 {
  152.                                         skeletonAnimation.StopAnimationInLayer(m_IKLayer, blendTime);
  153.                                 }
  154.                                 // If we found an proc clip aim animation not in the top it might be indicative that we're reusing this layer for non aim animations,
  155.                                 // but we can assume that in 99% of cases we're already blending out, since there's a top animation that should be blending in.
  156.                                 return;
  157.                         }
  158.                 }
  159.         }
  160.  
  161. private:
  162.         static uint32 GetNextToken()
  163.         {
  164.                 static uint8 s_currentToken = 0;
  165.                 s_currentToken++;
  166.                 return PROC_CLIP_AIM_POSE_TOKEN_BASE + s_currentToken;
  167.         }
  168.  
  169. protected:
  170.         uint32 m_IKLayer;
  171.         uint32 m_token;
  172. };
  173.  
  174. REGISTER_PROCEDURAL_CLIP(CProceduralClipAimPose, "AimPose");
  175.  
downloadProceduralClipAimPose.cpp Source code - Download CRYENGINE Source code
Related Source Codes/Software:
postal - 2017-06-11
reactide - Reactide is the first dedicated IDE for React web ... 2017-06-11
rkt - rkt is a pod-native container engine for Linux. It... 2017-06-11
uWebSockets - Tiny WebSockets https://for... 2017-06-11
realworld - TodoMVC for the RealWorld - Exemplary fullstack Me... 2017-06-11
CRYENGINE - CRYENGINE is a powerful real-time game development... 2017-06-11
goreplay - GoReplay is an open-source tool for capturing and ... 2017-06-10
pyenv - Simple Python version management 2017-06-10
redux-saga - An alternative side effect model for Redux apps ... 2017-06-10
angular-starter - 2017-06-10

 Back to top