BVB Source Codes

CRYENGINE Show FlowAttachmentNodes.cpp Source code

Return Download CRYENGINE: download FlowAttachmentNodes.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. #include "FlowEntityNode.h"
  5.  
  6. class CFlowNode_Attachment : public CFlowEntityNodeBase
  7. {
  8. private:
  9.         enum ECharacterSlot { eCharacterSlot_Invalid = -1 };
  10.  
  11. protected:
  12.         int    m_characterSlot;
  13.         string m_boneName;
  14.  
  15. public:
  16.         CFlowNode_Attachment(SActivationInfo* pActInfo)
  17.                 : m_characterSlot(eCharacterSlot_Invalid)
  18.         {
  19.                 m_event = ENTITY_EVENT_RESET;
  20.         }
  21.  
  22.         enum EInPorts
  23.         {
  24.                 eIP_EntityId,
  25.                 eIP_BoneName,
  26.                 eIP_CharacterSlot,
  27.                 eIP_Attach,
  28.                 eIP_Detach,
  29.                 eIP_Hide,
  30.                 eIP_UnHide,
  31.                 eIP_RotationOffset,
  32.                 eIP_TranslationOffset
  33.         };
  34.  
  35.         enum EOutPorts
  36.         {
  37.                 eOP_Attached,
  38.                 eOP_Detached
  39.         };
  40.  
  41.         virtual void GetConfiguration(SFlowNodeConfig& config)
  42.         {
  43.                 static const SInputPortConfig in_config[] = {
  44.                         InputPortConfig<EntityId>("Item",          _HELP("Entity to be linked")),
  45.                         InputPortConfig<string>("BoneName",        _HELP("Attachment bone")),
  46.                         InputPortConfig<int>("CharacterSlot",      0,                                                               _HELP("Host character slot")),
  47.                         InputPortConfig<SFlowSystemVoid>("Attach", _HELP("Attach")),
  48.                         InputPortConfig<SFlowSystemVoid>("Detach", _HELP("Detach any entity currently attached to the given bone")),
  49.                         InputPortConfig_Void("Hide",               _HELP("Hides attachment")),
  50.                         InputPortConfig_Void("UnHide",             _HELP("Unhides attachment")),
  51.                         InputPortConfig<Vec3>("RotationOffset",    _HELP("Rotation offset")),
  52.                         InputPortConfig<Vec3>("TranslationOffset", _HELP("Translation offset")),
  53.                         { 0 }
  54.                 };
  55.                 static const SOutputPortConfig out_config[] = {
  56.                         OutputPortConfig<SFlowSystemVoid>("Attached"),
  57.                         OutputPortConfig<SFlowSystemVoid>("Detached"),
  58.                         { 0 }
  59.                 };
  60.                 config.sDescription = _HELP("Attach/Detach an entity to another one.");
  61.                 config.pInputPorts = in_config;
  62.                 config.pOutputPorts = out_config;
  63.                 config.SetCategory(EFLN_APPROVED | EFLN_TARGET_ENTITY);
  64.         }
  65.  
  66.         virtual IFlowNodePtr Clone(SActivationInfo* pActInfo) { return new CFlowNode_Attachment(pActInfo); }
  67.  
  68.         virtual void         Serialize(SActivationInfo* pActInfo, TSerialize ser)
  69.         {
  70.         }
  71.  
  72.         virtual void ProcessEvent(EFlowEvent event, SActivationInfo* pActInfo)
  73.         {
  74.                 CFlowEntityNodeBase::ProcessEvent(event, pActInfo);
  75.                 switch (event)
  76.                 {
  77.                 case eFE_Activate:
  78.                         {
  79.                                 if (IsPortActive(pActInfo, eIP_Attach))
  80.                                 {
  81.                                         AttachObject(pActInfo);
  82.                                 }
  83.                                 if (IsPortActive(pActInfo, eIP_Detach))
  84.                                 {
  85.                                         DetachObject(pActInfo);
  86.                                 }
  87.  
  88.                                 if (IsPortActive(pActInfo, eIP_Hide))
  89.                                 {
  90.                                         HideAttachment(pActInfo);
  91.                                 }
  92.                                 else if (IsPortActive(pActInfo, eIP_UnHide))
  93.                                 {
  94.                                         UnHideAttachment(pActInfo);
  95.                                 }
  96.  
  97.                                 if (IsPortActive(pActInfo, eIP_RotationOffset) || IsPortActive(pActInfo, eIP_TranslationOffset))
  98.                                 {
  99.                                         UpdateOffset(pActInfo);
  100.                                 }
  101.                                 break;
  102.                         }
  103.                 case eFE_Initialize:
  104.                         {
  105.                                 m_characterSlot = GetPortInt(pActInfo, eIP_CharacterSlot);
  106.                                 m_boneName = GetPortString(pActInfo, eIP_BoneName);
  107.  
  108.                                 if (gEnv->IsEditor() && m_entityId)
  109.                                 {
  110.                                         UnregisterEvent(m_event);
  111.                                         RegisterEvent(m_event);
  112.                                 }
  113.                                 break;
  114.                         }
  115.                 }
  116.         }
  117.  
  118.         virtual void GetMemoryUsage(ICrySizer* s) const
  119.         {
  120.                 s->Add(*this);
  121.         }
  122.  
  123.         IAttachment* GetAttachment(IEntity* pEntity)
  124.         {
  125.                 IAttachment* pAttachment = nullptr;
  126.                 if (pEntity && !m_boneName.empty() && m_characterSlot > eCharacterSlot_Invalid)
  127.                 {
  128.                         if (ICharacterInstance* pCharacterInstance = pEntity->GetCharacter(m_characterSlot))
  129.                         {
  130.                                 if (IAttachmentManager* pAttachmentManager = pCharacterInstance->GetIAttachmentManager())
  131.                                 {
  132.                                         pAttachment = pAttachmentManager->GetInterfaceByName(m_boneName);
  133.                                 }
  134.                         }
  135.                 }
  136.                 return pAttachment;
  137.         }
  138.  
  139.         void AttachObject(SActivationInfo* pActInfo)
  140.         {
  141.                 if (pActInfo->pEntity)
  142.                 {
  143.                         EntityId entityId = GetPortEntityId(pActInfo, eIP_EntityId);
  144.                         IEntity* pEntity = gEnv->pEntitySystem->GetEntity(entityId);
  145.                         if (pEntity)
  146.                         {
  147.                                 IAttachment* pAttachment = GetAttachment(pActInfo->pEntity);
  148.                                 if (pAttachment)
  149.                                 {
  150.                                         CEntityAttachment* pEntityAttachment = new CEntityAttachment;
  151.                                         pEntityAttachment->SetEntityId(entityId);
  152.                                         pAttachment->AddBinding(pEntityAttachment);
  153.  
  154.                                         UpdateOffset(pActInfo);
  155.                                         ActivateOutput(pActInfo, eOP_Attached, 0);
  156.                                 }
  157.                         }
  158.                 }
  159.         }
  160.  
  161.         void DetachObject(SActivationInfo* pActInfo)
  162.         {
  163.                 IAttachment* pAttachment = GetAttachment(pActInfo->pEntity);
  164.                 if (pAttachment)
  165.                 {
  166.                         pAttachment->ClearBinding();
  167.                         ActivateOutput(pActInfo, eOP_Detached, 0);
  168.                 }
  169.         }
  170.  
  171.         void HideAttachment(SActivationInfo* pActInfo)
  172.         {
  173.                 IAttachment* pAttachment = GetAttachment(pActInfo->pEntity);
  174.                 if (pAttachment)
  175.                 {
  176.                         pAttachment->HideAttachment(1);
  177.  
  178.                         IAttachmentObject* pAttachmentObject = pAttachment->GetIAttachmentObject();
  179.                         if ((pAttachmentObject != NULL) && (pAttachmentObject->GetAttachmentType() == IAttachmentObject::eAttachment_Entity))
  180.                         {
  181.                                 IEntity* pAttachedEntity = gEnv->pEntitySystem->GetEntity(static_cast<CEntityAttachment*>(pAttachmentObject)->GetEntityId());
  182.                                 if (pAttachedEntity)
  183.                                 {
  184.                                         pAttachedEntity->Hide(true);
  185.                                 }
  186.                         }
  187.                 }
  188.         }
  189.  
  190.         void UnHideAttachment(SActivationInfo* pActInfo)
  191.         {
  192.                 IAttachment* pAttachment = GetAttachment(pActInfo->pEntity);
  193.                 if (pAttachment)
  194.                 {
  195.                         pAttachment->HideAttachment(0);
  196.  
  197.                         IAttachmentObject* pAttachmentObject = pAttachment->GetIAttachmentObject();
  198.                         if ((pAttachmentObject != NULL) && (pAttachmentObject->GetAttachmentType() == IAttachmentObject::eAttachment_Entity))
  199.                         {
  200.                                 IEntity* pAttachedEntity = gEnv->pEntitySystem->GetEntity(static_cast<CEntityAttachment*>(pAttachmentObject)->GetEntityId());
  201.                                 if (pAttachedEntity)
  202.                                 {
  203.                                         pAttachedEntity->Hide(false);
  204.                                 }
  205.                         }
  206.                 }
  207.         }
  208.  
  209.         void UpdateOffset(SActivationInfo* pActInfo)
  210.         {
  211.                 IAttachment* pAttachment = GetAttachment(pActInfo->pEntity);
  212.                 if (pAttachment)
  213.                 {
  214.                         const Vec3& rotationOffsetEuler = GetPortVec3(pActInfo, eIP_RotationOffset);
  215.                         QuatT offset = QuatT::CreateRotationXYZ(Ang3(DEG2RAD(rotationOffsetEuler)));
  216.                         offset.t = GetPortVec3(pActInfo, eIP_TranslationOffset);
  217.                         pAttachment->SetAttRelativeDefault(offset);
  218.                 }
  219.         }
  220.  
  221.         void OnEntityEvent(IEntity* pEntity, SEntityEvent& event)
  222.         {
  223.                 if (event.event == m_event)
  224.                 {
  225.                         if (IAttachment* pAttachment = GetAttachment(pEntity))
  226.                         {
  227.                                 pAttachment->ClearBinding();
  228.                         }
  229.                 }
  230.         }
  231. };
  232.  
  233. REGISTER_FLOW_NODE("Entity:Attachment", CFlowNode_Attachment);
  234.  
downloadFlowAttachmentNodes.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