BVB Source Codes

CRYENGINE Show AnimationEventListenerNode.cpp Source code

Return Download CRYENGINE: download AnimationEventListenerNode.cpp Source code - Download CRYENGINE Source code - Type:.cpp
  1. // Copyright 2001-2016 Crytek GmbH / Crytek Group. All rights reserved.
  2.  
  3. #include "StdAfx.h"
  4.  
  5. #include <CryFlowGraph/IFlowBaseNode.h>
  6.  
  7. // Listens for a specific animation event and triggers the output.
  8. class AnimationEventListenerNode : public CFlowBaseNode<eNCT_Instanced>, public IEntityEventListener
  9. {
  10.         enum INPUTS
  11.         {
  12.                 EIP_Enable = 0,
  13.                 EIP_Disable,
  14.                 EIP_EventName,
  15.                 EIP_Once,
  16.         };
  17.  
  18.         enum OUTPUTS
  19.         {
  20.                 EOP_Enabled = 0,
  21.                 EOP_Disabled,
  22.                 EOP_EventTriggered,
  23.         };
  24.  
  25. public:
  26.         AnimationEventListenerNode(SActivationInfo* pActInfo)
  27.         {
  28.                 Reset(*pActInfo);
  29.         };
  30.  
  31.         ~AnimationEventListenerNode()
  32.         {
  33.                 StopListeningForAnimationEvents();
  34.         };
  35.  
  36.         IFlowNodePtr Clone(SActivationInfo* pActInfo)
  37.         {
  38.                 return new AnimationEventListenerNode(pActInfo);
  39.         }
  40.  
  41.         virtual void GetMemoryUsage(ICrySizer* s) const
  42.         {
  43.                 s->Add(*this);
  44.         }
  45.  
  46.         virtual void Serialize(SActivationInfo* pActInfo, TSerialize ser)
  47.         {
  48.                 if (ser.IsReading())
  49.                 {
  50.                         bool enabled = false;
  51.                         ser.Value("enabled", enabled);
  52.                         enabled ? Enable() : Disable();
  53.                 }
  54.                 else if (ser.IsWriting())
  55.                 {
  56.                         ser.Value("enabled", m_enabled);
  57.                 }
  58.         }
  59.  
  60.         virtual void GetConfiguration(SFlowNodeConfig& config)
  61.         {
  62.                 static const SInputPortConfig in_config[] = {
  63.                         InputPortConfig_Void("Enable",       _HELP("Start listening for animation events.")),
  64.                         InputPortConfig_Void("Disable",      _HELP("Stop listening for animation events.")),
  65.                         InputPortConfig<string>("EventName", _HELP("Name of the animation event to listen for. When received it will trigger the corresponding output.")),
  66.                         InputPortConfig<bool>("Once",        true,                                                                                                        _HELP("If this is set to true the node will automatically be disabled after the animation event has been received.")),
  67.                         { 0 }
  68.                 };
  69.  
  70.                 static const SOutputPortConfig out_config[] = {
  71.                         OutputPortConfig_Void("Enabled",        _HELP("Triggered when animation event received.")),
  72.                         OutputPortConfig_Void("Disabled",       _HELP("Triggered when animation event received.")),
  73.                         OutputPortConfig_Void("EventTriggered", _HELP("Triggered when animation event received.")),
  74.                         { 0 }
  75.                 };
  76.  
  77.                 config.sDescription = _HELP("Listens for a specific animation event and triggers the output.");
  78.                 config.pInputPorts = in_config;
  79.                 config.pOutputPorts = out_config;
  80.                 config.nFlags |= EFLN_TARGET_ENTITY;
  81.                 config.SetCategory(EFLN_APPROVED);
  82.         }
  83.  
  84.         virtual void ProcessEvent(EFlowEvent event, SActivationInfo* pActInfo)
  85.         {
  86.                 m_actInfo = *pActInfo;
  87.  
  88.                 switch (event)
  89.                 {
  90.                 case eFE_Initialize:
  91.                         {
  92.                                 Reset(*pActInfo);
  93.                                 break;
  94.                         }
  95.  
  96.                 case eFE_Activate:
  97.                         {
  98.                                 if (IsPortActive(pActInfo, EIP_Enable))
  99.                                         Enable();
  100.  
  101.                                 if (IsPortActive(pActInfo, EIP_Disable))
  102.                                         Disable();
  103.  
  104.                                 break;
  105.                         }
  106.                 }
  107.                 ;
  108.         };
  109.  
  110.         // Overriding IEntityEventListener::OnEntityEvent
  111.         virtual void OnEntityEvent(IEntity* pEntity, SEntityEvent& entityEvent)
  112.         {
  113.                 if (!m_enabled)
  114.                         return;
  115.  
  116.                 assert(entityEvent.event == ENTITY_EVENT_ANIM_EVENT);
  117.  
  118.                 if (entityEvent.event == ENTITY_EVENT_ANIM_EVENT)
  119.                 {
  120.                         const AnimEventInstance* pAnimEvent = reinterpret_cast<const AnimEventInstance*>(entityEvent.nParam[0]);
  121.                         ICharacterInstance* pCharacter = reinterpret_cast<ICharacterInstance*>(entityEvent.nParam[1]);
  122.  
  123.                         if (pAnimEvent && pCharacter)
  124.                         {
  125.                                 const bool matchingEvent = stricmp(pAnimEvent->m_EventName, GetEventName().c_str()) == 0;
  126.                                 if (matchingEvent)
  127.                                 {
  128.                                         ActivateOutput(&m_actInfo, EOP_EventTriggered, true);
  129.  
  130.                                         const bool autoDisableOnceTriggered = GetPortBool(&m_actInfo, EIP_Once);
  131.                                         if (autoDisableOnceTriggered)
  132.                                         {
  133.                                                 Disable();
  134.                                         }
  135.                                 }
  136.                         }
  137.                 }
  138.         }
  139.  
  140. private:
  141.         void Reset(SActivationInfo& actInfo)
  142.         {
  143.                 m_actInfo = actInfo;
  144.                 m_entityIdUsedForEventListener = 0;
  145.                 m_enabled = false;
  146.         }
  147.  
  148.         void Enable()
  149.         {
  150.                 m_enabled = true;
  151.  
  152.                 ActivateOutput(&m_actInfo, EOP_Enabled, true);
  153.  
  154.                 if (IEntity* pEntity = m_actInfo.pEntity)
  155.                         StartListeningForAnimationEvents(pEntity->GetId());
  156.                 else
  157.                         CryWarning(VALIDATOR_MODULE_GAME, VALIDATOR_ERROR, "Trigger input port 'Enable' on AnimationEventListener flow node without an entity.");
  158.         }
  159.  
  160.         void Disable()
  161.         {
  162.                 m_enabled = false;
  163.                 ActivateOutput(&m_actInfo, EOP_Disabled, true);
  164.                 StopListeningForAnimationEvents();
  165.         }
  166.  
  167.         void StartListeningForAnimationEvents(const EntityId entityId)
  168.         {
  169.                 m_entityIdUsedForEventListener = entityId;
  170.                 gEnv->pEntitySystem->AddEntityEventListener(entityId, ENTITY_EVENT_ANIM_EVENT, this);
  171.         }
  172.  
  173.         void StopListeningForAnimationEvents()
  174.         {
  175.                 if (m_entityIdUsedForEventListener != 0)
  176.                 {
  177.                         gEnv->pEntitySystem->RemoveEntityEventListener(m_entityIdUsedForEventListener, ENTITY_EVENT_ANIM_EVENT, this);
  178.                         m_entityIdUsedForEventListener = 0;
  179.                 }
  180.         }
  181.  
  182.         string GetEventName()
  183.         {
  184.                 return GetPortString(&m_actInfo, EIP_EventName);
  185.         }
  186.  
  187. private:
  188.         SActivationInfo m_actInfo;
  189.         EntityId        m_entityIdUsedForEventListener;
  190.         bool            m_enabled;
  191. };
  192.  
  193. REGISTER_FLOW_NODE("Animations:AnimationEventListener", AnimationEventListenerNode);
  194.  
downloadAnimationEventListenerNode.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