BVB Source Codes

CRYENGINE Show MannequinAGState.h Source code

Return Download CRYENGINE: download MannequinAGState.h Source code - Download CRYENGINE Source code - Type:.h
  1. // Copyright 2001-2016 Crytek GmbH / Crytek Group. All rights reserved.
  2.  
  3. //
  4. //-------------------------------------------------------------------------
  5. //
  6. // Description:
  7. //  Adapter class that looks like an IAnimationGraphState but uses CryMannequin.
  8. //
  9. //  Only implements a small subset of IAnimationGraphState:
  10. //  - Action & Signal inputs get treated as fragment IDs
  11. //  - All other inputs are ignored (SetInput returns false)
  12. //  - No Hurry() support
  13. //  - No ExactPositioning support (this is now a separate component
  14. //    ExactPositioning.cpp/.h, only dependent on IAnimatedCharacter)
  15. //
  16. ////////////////////////////////////////////////////////////////////////////
  17. #ifndef __MANNEQUINAGSTATE_H__
  18. #define __MANNEQUINAGSTATE_H__
  19. #pragma once
  20.  
  21. #include "IAnimationGraph.h"
  22. #include "IAnimatedCharacter.h"
  23. #include "ICryMannequin.h"
  24. #include "Mannequin/MannequinAGDefs.h"
  25. #include "Mannequin/AnimActionTriState.h"
  26.  
  27. namespace MannequinAG
  28. {
  29.  
  30. // ============================================================================
  31. // ============================================================================
  32.  
  33. #ifndef _RELEASE
  34.         #define ASSERT_NEVERCALLED(x) \
  35.           CRY_ASSERT(false);          \
  36.           AssertFunctionNeverCalled( # x);
  37. #else
  38.         #define ASSERT_NEVERCALLED(x)
  39. #endif
  40.  
  41. // ============================================================================
  42. // ============================================================================
  43.  
  44. //------------------------------------------------------------------------------
  45. class CMannequinAGState;
  46. class CAnimActionAGAction : public CAnimActionTriState
  47. {
  48. public:
  49.         typedef CAnimActionTriState TBase;
  50.  
  51.         DEFINE_ACTION("AGAction");
  52.  
  53. public:
  54.         CAnimActionAGAction(int priority, FragmentID fragmentID, CMannequinAGState& mannequinAGState, EAIActionType type, const string& value, uint32 valueCRC, TAnimationGraphQueryID queryID, bool skipIntro = false);
  55.  
  56. public:
  57.         void                         AddLeaveQueryID(TAnimationGraphQueryID leaveQueryID);
  58.         ILINE void                   SetQueryID(TAnimationGraphQueryID queryID) { CRY_ASSERT(m_queryID == 0); m_queryID = queryID; }
  59.         ILINE EAIActionType          GetType() const                            { return m_type; }
  60.         ILINE const string&          GetValue() const                           { return m_value; }
  61.         ILINE uint32                 GetValueCRC() const                        { return m_valueCRC; }
  62.         ILINE TAnimationGraphQueryID GetQueryID()                               { return m_queryID; }
  63.         ILINE bool                   IsPendingOrInstalled() const               { return ((m_eStatus == IAction::Pending) || (m_eStatus == IAction::Installed)); }
  64.  
  65. private:
  66.         // CAnimActionTriState implementation ---------------------------------------
  67.         virtual void OnEnter() override;
  68.         virtual void OnExit() override;
  69.         // ~CAnimActionTriState implementation --------------------------------------
  70.  
  71. private:
  72.         EAIActionType                            m_type;
  73.         string                                   m_value;
  74.         uint32                                   m_valueCRC;
  75.         TAnimationGraphQueryID                   m_queryID;
  76.         CryFixedArray<TAnimationGraphQueryID, 4> m_leaveQueryIDs;
  77.         CMannequinAGState&                       m_mannequinAGState;
  78. };
  79.  
  80. // ============================================================================
  81. // ============================================================================
  82.  
  83. // ----------------------------------------------------------------------------
  84. class CMannequinAGState : public IAnimationGraphState
  85. {
  86. public:
  87.         friend class CAnimActionAGAction;
  88.  
  89.         typedef IAnimationGraphState::InputID InputID;
  90.  
  91. public:
  92.         CMannequinAGState();
  93.         ~CMannequinAGState();
  94.  
  95.         // --------------------------------- IAnimationGraphState implementation ----
  96.  
  97.         virtual bool SetInput(InputID, float, TAnimationGraphQueryID* pQueryID = 0) { ASSERT_NEVERCALLED(SetInput_Float); return false; }
  98.         virtual bool SetInput(InputID, int, TAnimationGraphQueryID* pQueryID = 0)   { ASSERT_NEVERCALLED(SetInput_Int); return false; }
  99.         virtual bool SetInput(InputID, const char*, TAnimationGraphQueryID * pQueryID = 0);
  100.         // SetInputOptional is same as SetInput except that it will not set the default input value in case a non-existing value is passed
  101.         virtual bool SetInputOptional(InputID, const char*, TAnimationGraphQueryID * pQueryID = 0);
  102.         virtual void        ClearInput(InputID)                                    { ASSERT_NEVERCALLED(ClearInput); };
  103.         virtual void        LockInput(InputID, bool locked)                        { ASSERT_NEVERCALLED(LockInput); }
  104.  
  105.         virtual bool        SetVariationInput(const char* name, const char* value) { return true; }
  106.         virtual bool        SetVariationInput(InputID inputID, const char* value)  { return true; }
  107.         virtual const char* GetVariationInput(InputID inputID) const               { ASSERT_NEVERCALLED(GetVariationInput); return ""; }
  108.  
  109.         // assert all equal, use any (except if signalled, then return the one not equal to default, or return default of all default)
  110.         virtual void GetInput(InputID, char*) const;
  111.  
  112.         virtual void GetInput(InputID, char*, int layerIndex) const;
  113.  
  114.         virtual bool IsDefaultInputValue(InputID) const;
  115.  
  116.         // returns NULL if InputID is out of range
  117.         virtual const char* GetInputName(InputID) const;
  118.         virtual const char* GetVariationInputName(InputID) const;
  119.  
  120.         virtual void QueryLeaveState(TAnimationGraphQueryID* pQueryID);
  121.  
  122.         virtual void QueryChangeInput(InputID, TAnimationGraphQueryID*);
  123.  
  124.         virtual void AddListener(const char* name, IAnimationGraphStateListener* pListener);
  125.         virtual void RemoveListener(IAnimationGraphStateListener* pListener);
  126.  
  127.         virtual bool DoesInputMatchState(InputID) const { ASSERT_NEVERCALLED(DoesInputMatchState); return false; }
  128.  
  129.         // Only set for fullbody, null for upperbody.
  130.         virtual void SetAnimatedCharacter(class CAnimatedCharacter* animatedCharacter, int layerIndex, IAnimationGraphState* parentLayerState);
  131.  
  132.         virtual bool        Update() { return true; }
  133.         virtual void        Release();
  134.         virtual void        ForceTeleportToQueriedState();
  135.  
  136.         virtual void        PushForcedState(const char* state, TAnimationGraphQueryID* pQueryID = 0) { ASSERT_NEVERCALLED(PushForcedState); }
  137.         virtual void        ClearForcedStates()                                                      { ASSERT_NEVERCALLED(ClearForcedStates); }
  138.  
  139.         virtual float       GetInputAsFloat(InputID inputId)                                         { ASSERT_NEVERCALLED(GetInputAsFloat); return 0.0f; }
  140.  
  141.         virtual InputID     GetInputId(const char* input);
  142.         virtual InputID     GetVariationInputId(const char* variationInputName) const;
  143.  
  144.         virtual void        Serialize(TSerialize ser);
  145.  
  146.         virtual void        SetAnimationActivation(bool activated) { ASSERT_NEVERCALLED(SetAnimationActivation); };
  147.         virtual bool        GetAnimationActivation()               { ASSERT_NEVERCALLED(GetAnimationActivation); return false; };
  148.  
  149.         virtual const char* GetCurrentStateName();
  150.  
  151.         virtual void        Pause(bool pause, EAnimationGraphPauser pauser, float fOverrideTransTime = -1.0f);
  152.  
  153.         virtual bool        IsInDebugBreak()              { ASSERT_NEVERCALLED(IsInDebugBreak); return false; };
  154.  
  155.         virtual const char* QueryOutput(const char* name) { ASSERT_NEVERCALLED(QueryOutput); return NULL; };
  156.  
  157.         // Exact positioning
  158.         virtual IAnimationSpacialTrigger* SetTrigger(const SAnimationTargetRequest& req, EAnimationGraphTriggerUser user, TAnimationGraphQueryID* pQueryStart, TAnimationGraphQueryID* pQueryEnd) { ASSERT_NEVERCALLED(SetTrigger); return NULL; }
  159.         virtual void                      ClearTrigger(EAnimationGraphTriggerUser user)                                                                                                           { ASSERT_NEVERCALLED(ClearTrigger); }
  160.         virtual const SAnimationTarget*   GetAnimationTarget()                                                                                                                                    { return NULL; }
  161.         virtual bool                      HasAnimationTarget() const                                                                                                                              { ASSERT_NEVERCALLED(HasAnimationTarget); return false; }
  162.         virtual bool                      IsUpdateReallyNecessary()                                                                                                                               { ASSERT_NEVERCALLED(IsUpdateReallyNecessary); return false; }
  163.  
  164.         // Creates an object you can use to test whether a specific combination of inputs will select a state
  165.         // (and to get a bit more information about that state)
  166.         virtual IAnimationGraphExistanceQuery* CreateExistanceQuery();
  167.         virtual IAnimationGraphExistanceQuery* CreateExistanceQuery(int layer);
  168.  
  169.         virtual void                           Reset(); // note: Reset will properly send ChangedInput values while resetting inputs
  170.         virtual void                           Hurry();
  171.         virtual void                           SetFirstPersonMode(bool on) {};
  172.  
  173.         // simply recurse (will add all layer's containers to the sizer)
  174.         virtual void GetMemoryUsage(ICrySizer* pSizer) const;
  175.  
  176.         virtual bool IsMixingAllowedForCurrentState() const { return true; }
  177.  
  178.         virtual bool IsSignalledInput(InputID inputId) const;
  179.  
  180.         // --------------------------------- ~IAnimationGraphState implementation ---
  181.  
  182.         void OnReload();
  183.  
  184. private:
  185.         bool               SetInputInternal(InputID iid, const char* value, TAnimationGraphQueryID* pQueryID, bool optional);
  186.         ILINE bool         IsPaused() const { return (m_pauseState != 0); }
  187.         bool               SetActionOrSignalInput(_smart_ptr<CAnimActionAGAction>& pAction, TKeyValue& currentValue, InputID inputID, EAIActionType actionType, const char* defaultValue, uint32 defaultValueCRC, const char* value, TAnimationGraphQueryID* pQueryID, bool optional);
  188.         void               SendEvent_ChangedInput(InputID iid, bool success);
  189.         void               SendEvent_Entered(_smart_ptr<CAnimActionAGAction> pCaller, TAnimationGraphQueryID queryID, bool success); // should ONLY be called by the CAnimActionAGAction
  190.         void               SendEvent_Left(TAnimationGraphQueryID queryID, bool success);
  191.         void               ResetInputValues(); // note: ResetInputs will properly send ChangedInput events
  192.         IActionController* GetActionController();
  193.         void               StopAnyLoopingExactPositioningAction();
  194.  
  195. private:
  196.         static TAnimationGraphQueryID GenerateQueryID() { ++s_lastQueryID; CRY_ASSERT(s_lastQueryID); return s_lastQueryID; }
  197.         static void                   AssertFunctionNeverCalled(const char* func)
  198.         {
  199.                 CryWarning(VALIDATOR_MODULE_GAME, VALIDATOR_WARNING, "CMannequinAGState: Function IAnimationGraphState::%s called while we assume it was never called", func);
  200.         }
  201.  
  202. private:
  203.         // Input values
  204.         TKeyValue m_actionValue;
  205.         TKeyValue m_signalValue;
  206.  
  207.         // Pausing
  208.         uint32 m_pauseState;
  209.  
  210.         // Listeners
  211.         struct SListener
  212.         {
  213.                 IAnimationGraphStateListener* pListener;
  214.                 char                          name[16 - sizeof(IAnimationGraphStateListener*)];
  215.  
  216.                 bool operator==(const SListener& other) const
  217.                 {
  218.                         return pListener == other.pListener;
  219.                 }
  220.                 void GetMemoryUsage(ICrySizer* pSizer) const {}
  221.         };
  222.  
  223.         std::vector<SListener> m_listeners;
  224.         std::vector<SListener> m_callingListeners;
  225.         TAnimationGraphQueryID m_queryChangedInputIDs[eSIID_COUNT];
  226.  
  227.         // Anim Actions
  228.         _smart_ptr<CAnimActionAGAction> m_pLoopingAction;
  229.         _smart_ptr<CAnimActionAGAction> m_pOneShotAction;
  230.         _smart_ptr<CAnimActionAGAction> m_pCallerOfSendEvent; // only used to figure out within QueryLeaveState which action we are inside
  231.  
  232.         // AC
  233.         CAnimatedCharacter* m_pAnimatedCharacter;
  234.  
  235. private:
  236.         static TAnimationGraphQueryID s_lastQueryID;
  237. };
  238.  
  239. // ============================================================================
  240. // ============================================================================
  241.  
  242. } // namespace MannequinAG
  243.  
  244. #endif // __MANNEQUINAGSTATE_H__
  245.  
downloadMannequinAGState.h 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