BVB Source Codes

CRYENGINE Show ProceduralClipLookPose.cpp Source code

Return Download CRYENGINE: download ProceduralClipLookPose.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. struct SLookPoseParams : public IProceduralParams
  13. {
  14.         SLookPoseParams()
  15.                 : blendTime(1.f)
  16.                 , scopeLayer(0)
  17.         {
  18.         }
  19.  
  20.         virtual void Serialize(Serialization::IArchive& ar) override
  21.         {
  22.                 ar(Serialization::Decorators::AnimationName<SAnimRef>(animRef), "Animation", "Animation");
  23.                 ar(blendTime, "BlendTime", "Blend Time");
  24.                 ar(scopeLayer, "ScopeLayer", "Scope Layer");
  25.         }
  26.  
  27.         virtual void GetExtraDebugInfo(StringWrapper& extraInfoOut) const override
  28.         {
  29.                 extraInfoOut = animRef.c_str();
  30.         }
  31.  
  32.         SAnimRef animRef;
  33.         float    blendTime;
  34.         uint32   scopeLayer;
  35. };
  36.  
  37. class CProceduralClipLookPose : public TProceduralClip<SLookPoseParams>
  38. {
  39. public:
  40.         CProceduralClipLookPose()
  41.                 : m_IKLayer(0)
  42.                 , m_token(kInvalidToken)
  43.                 , m_paramTargetCrc(0)
  44.         {
  45.         }
  46.  
  47.         virtual void OnEnter(float blendTime, float duration, const SLookPoseParams& params)
  48.         {
  49.                 IF (m_charInstance == NULL, false)
  50.                         return;
  51.  
  52.                 m_paramTargetCrc = CCrc32::ComputeLowercase("LookTarget");
  53.                 m_token = kInvalidToken;
  54.  
  55.                 Vec3 lookAtTarget;
  56.                 if (!GetParam(m_paramTargetCrc, lookAtTarget))
  57.                 {
  58.                         lookAtTarget = m_entity->GetWorldPos();
  59.                         lookAtTarget += m_entity->GetForwardDir() * 10.0f;
  60.                 }
  61.  
  62.                 const float smoothTime = params.blendTime;
  63.                 const uint32 ikLayer = m_scope->GetBaseLayer() + params.scopeLayer;
  64.                 IAnimationPoseBlenderDir* poseBlenderLook = m_charInstance->GetISkeletonPose()->GetIPoseBlenderLook();
  65.                 if (poseBlenderLook)
  66.                 {
  67.                         poseBlenderLook->SetState(true);
  68.                         const bool wasPoseBlenderActive = (0.01f < poseBlenderLook->GetBlend());
  69.                         if (!wasPoseBlenderActive)
  70.                         {
  71.                                 poseBlenderLook->SetTarget(lookAtTarget);
  72.                         }
  73.                         poseBlenderLook->SetPolarCoordinatesSmoothTimeSeconds(smoothTime);
  74.                         poseBlenderLook->SetLayer(ikLayer);
  75.                         poseBlenderLook->SetFadeInSpeed(blendTime);
  76.                 }
  77.  
  78.                 m_IKLayer = ikLayer;
  79.  
  80.                 StartLookAnimation(blendTime);
  81.         }
  82.  
  83.         virtual void OnExit(float blendTime)
  84.         {
  85.                 IF (m_charInstance == NULL, false)
  86.                         return;
  87.  
  88.                 IAnimationPoseBlenderDir* poseBlenderLook = m_charInstance->GetISkeletonPose()->GetIPoseBlenderLook();
  89.  
  90.                 m_charInstance->GetISkeletonAnim()->StopAnimationInLayer(m_IKLayer, blendTime);
  91.  
  92.                 StopLookAnimation(blendTime);
  93.  
  94.                 if (poseBlenderLook)
  95.                 {
  96.                         poseBlenderLook->SetState(false);
  97.                         poseBlenderLook->SetFadeOutSpeed(blendTime);
  98.                 }
  99.  
  100.         }
  101.  
  102.         virtual void Update(float timePassed)
  103.         {
  104.                 IF (m_charInstance == NULL, false)
  105.                         return;
  106.  
  107.                 Vec3 lookAtTarget;
  108.                 if (GetParam(m_paramTargetCrc, lookAtTarget))
  109.                 {
  110.                         IAnimationPoseBlenderDir* poseBlenderLook = m_charInstance->GetISkeletonPose()->GetIPoseBlenderLook();
  111.                         if (poseBlenderLook)
  112.                         {
  113.                                 poseBlenderLook->SetTarget(lookAtTarget);
  114.                         }
  115.                 }
  116.         }
  117.  
  118. private:
  119.  
  120.         void StartLookAnimation(const float blendTime)
  121.         {
  122.                 const SLookPoseParams& params = GetParams();
  123.                 if (params.animRef.IsEmpty())
  124.                 {
  125.                         return;
  126.                 }
  127.  
  128.                 const int animID = m_charInstance->GetIAnimationSet()->GetAnimIDByCRC(params.animRef.crc);
  129.                 if (animID >= 0)
  130.                 {
  131.                         assert(animID <= 65535);
  132.  
  133.                         m_token = GetNextToken((uint16)animID);
  134.  
  135.                         CryCharAnimationParams animParams;
  136.                         animParams.m_fTransTime = blendTime;
  137.                         animParams.m_nLayerID = m_IKLayer;
  138.                         animParams.m_nUserToken = m_token;
  139.                         animParams.m_nFlags = CA_LOOP_ANIMATION | CA_ALLOW_ANIM_RESTART;
  140.                         m_charInstance->GetISkeletonAnim()->StartAnimationById(animID, animParams);
  141.                 }
  142.                 else
  143.                 {
  144.                         CryWarning(VALIDATOR_MODULE_GAME, VALIDATOR_WARNING, "Couldn't find look animation '%s' for character '%s'", params.animRef.c_str(), m_charInstance->GetFilePath());
  145.                 }
  146.         }
  147.  
  148.         void StopLookAnimation(const float blendTime)
  149.         {
  150.                 const SLookPoseParams& params = GetParams();
  151.                 if (params.animRef.IsEmpty())
  152.                 {
  153.                         return;
  154.                 }
  155.  
  156.                 CRY_ASSERT(m_token != kInvalidToken);
  157.  
  158.                 ISkeletonAnim& skeletonAnimation = *m_charInstance->GetISkeletonAnim();
  159.  
  160.                 const int animationCount = skeletonAnimation.GetNumAnimsInFIFO(m_IKLayer);
  161.                 for (int i = 0; i < animationCount; ++i)
  162.                 {
  163.                         const CAnimation& animation = skeletonAnimation.GetAnimFromFIFO(m_IKLayer, i);
  164.                         const uint32 animationToken = animation.GetUserToken();
  165.                         if (animationToken == m_token)
  166.                         {
  167.                                 const bool isTopAnimation = (i == (animationCount - 1));
  168.                                 if (isTopAnimation)
  169.                                 {
  170.                                         skeletonAnimation.StopAnimationInLayer(m_IKLayer, blendTime);
  171.                                 }
  172.                                 // If we found an proc clip look animation not in the top it might be indicative that we're reusing this layer for non look animations,
  173.                                 // 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.
  174.                                 return;
  175.                         }
  176.                 }
  177.         }
  178.  
  179.         static uint32 GetNextToken(const uint16 animId)
  180.         {
  181.                 static uint16 s_currentToken = 0;
  182.                 s_currentToken++;
  183.  
  184.                 return ((animId << 16) | s_currentToken);
  185.         }
  186.  
  187.         const static uint32 kInvalidToken = 0xFFFFFFFF;
  188.  
  189.         uint32              m_IKLayer;
  190.         uint32              m_token;
  191.  
  192.         uint32              m_paramTargetCrc;
  193. };
  194.  
  195. REGISTER_PROCEDURAL_CLIP(CProceduralClipLookPose, "LookPose");
  196.  
downloadProceduralClipLookPose.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