BVB Source Codes

CRYENGINE Show FlowFlashInvokeNode.cpp Source code

Return Download CRYENGINE: download FlowFlashInvokeNode.cpp Source code - Download CRYENGINE Source code - Type:.cpp
  1. // Copyright 2001-2016 Crytek GmbH / Crytek Group. All rights reserved.
  2.  
  3. // -------------------------------------------------------------------------
  4. //  File name:   FlowFlashNode.h
  5. //  Version:     v1.00
  6. //  Created:     23/5/2005 by Timur.
  7. //  Compilers:   Visual Studio.NET 2003
  8. //  Description:
  9. // -------------------------------------------------------------------------
  10. //  History:
  11. //
  12. ////////////////////////////////////////////////////////////////////////////
  13.  
  14. #include "StdAfx.h"
  15.  
  16. #include <CrySystem/Scaleform/IFlashPlayer.h>
  17. #include <CrySystem/ILocalizationManager.h>
  18. #include <CryFlowGraph/IFlowBaseNode.h>
  19.  
  20. ////////////////////////////////////////////////////////////////////////////////////////
  21. // Flow node for invoking a flash method of a DTS_I_FLASHPLAYER dyntexture stored in an entity's material
  22. ////////////////////////////////////////////////////////////////////////////////////////
  23.  
  24. // this maps languages to audio channels
  25. static const char* g_languageMapping[] =
  26. {
  27.         "main",     // channel 0, music and sound effects
  28.         "english",  // channel 1
  29.         "french",   // channel 2
  30.         "german",   // channel 3
  31.         "italian",  // channel 4
  32.         "russian",  // channel 5
  33.         "polish",   // channel 6
  34.         "spanish",  // channel 7
  35.         "turkish",  // channel 8
  36.         "japanese"  // channel 9
  37. };
  38.  
  39. static const size_t g_languageMappingCount = (CRY_ARRAY_COUNT(g_languageMapping));
  40.  
  41. class CFlowFlashInvokeNode : public CFlowBaseNode<eNCT_Singleton>
  42. {
  43. public:
  44.         CFlowFlashInvokeNode(SActivationInfo* pActInfo)
  45.         {
  46.         }
  47.  
  48.         enum EInputPorts
  49.         {
  50.                 EIP_Slot = 0,
  51.                 EIP_SubMtlId,
  52.                 EIP_TexSlot,
  53.                 EIP_Invoke,
  54.                 EIP_Method,
  55.                 EIP_Param1,
  56.                 EIP_Param2,
  57.                 EIP_Param3,
  58.                 EIP_Param4,
  59.         };
  60.  
  61.         enum EOutputPorts
  62.         {
  63.                 EOP_Result = 0,
  64.         };
  65.  
  66.         static const int MAX_PARAMS = 4;
  67.         virtual void GetConfiguration(SFlowNodeConfig& config)
  68.         {
  69.                 static const SInputPortConfig in_config[] = {
  70.                         InputPortConfig<int>("Slot",      0,                                     _HELP("Material Slot")),
  71.                         InputPortConfig<int>("SubMtlId",  0,                                     _HELP("Sub Material Id, starting at 0"),_HELP("SubMaterialId")),
  72.                         InputPortConfig<int>("TexSlot",   0,                                     _HELP("Texture Slot")),
  73.                         InputPortConfig_Void("Invoke",    _HELP("Trigger to invoked [Method]")),
  74.                         InputPortConfig<string>("Method", _HELP("Method to be invoked")),
  75.                         InputPortConfig<string>("Param1", _HELP("Param 1")),
  76.                         InputPortConfig<string>("Param2", _HELP("Param 2")),
  77.                         InputPortConfig<string>("Param3", _HELP("Param 3")),
  78.                         InputPortConfig<string>("Param4", _HELP("Param 4")),
  79.                         { 0 }
  80.                 };
  81.  
  82.                 static const SOutputPortConfig out_config[] = {
  83.                         OutputPortConfig_AnyType("Result", _HELP("Result when successfully called")),
  84.                         { 0 }
  85.                 };
  86.  
  87.                 config.sDescription = _HELP("Invoke Flash Function");
  88.                 config.nFlags |= EFLN_TARGET_ENTITY;
  89.                 config.pInputPorts = in_config;
  90.                 config.pOutputPorts = out_config;
  91.                 config.SetCategory(EFLN_ADVANCED);
  92.         }
  93.  
  94.         virtual void ProcessEvent(EFlowEvent event, SActivationInfo* pActInfo)
  95.         {
  96.                 if (event != eFE_Activate || !IsPortActive(pActInfo, EIP_Invoke))
  97.                         return;
  98.  
  99.                 IEntity* pEntity = pActInfo->pEntity;
  100.                 if (pEntity == 0)
  101.                         return;
  102.  
  103.                 IEntityRender* pIEntityRender = pEntity->GetRenderInterface();
  104.                 if (pIEntityRender == 0)
  105.                         return;
  106.  
  107.                 const int slot = GetPortInt(pActInfo, EIP_Slot);
  108.                 IMaterial* pMtl = pIEntityRender->GetRenderMaterial(slot);
  109.                 if (pMtl == 0)
  110.                 {
  111.                         GameWarning("[flow] CFlowFlashInvokeNode: Entity '%s' [%d] has no material at slot %d", pEntity->GetName(), pEntity->GetId(), slot);
  112.                         return;
  113.                 }
  114.  
  115.                 const int& subMtlId = GetPortInt(pActInfo, EIP_SubMtlId);
  116.                 pMtl = pMtl->GetSafeSubMtl(subMtlId);
  117.                 if (pMtl == 0)
  118.                 {
  119.                         GameWarning("[flow] CFlowFlashInvokeNode: Entity '%s' [%d] has no sub-material %d at slot %d", pEntity->GetName(), pEntity->GetId(), subMtlId, slot);
  120.                         return;
  121.                 }
  122.  
  123.                 const string& methodName = GetPortString(pActInfo, EIP_Method);
  124.                 if (methodName.empty())
  125.                 {
  126.                         GameWarning("[flow] CFlowFlashInvokeNode: Invalid method name on calling Entity '%s'", pEntity->GetName());
  127.                         return;
  128.                 }
  129.  
  130.                 const int texSlot = GetPortInt(pActInfo, EIP_TexSlot);
  131.                 const SShaderItem& shaderItem(pMtl->GetShaderItem());
  132.                 if (shaderItem.m_pShaderResources)
  133.                 {
  134.                         SEfResTexture* pTex = shaderItem.m_pShaderResources->GetTexture(texSlot);
  135.                         if (pTex)
  136.                         {
  137.                                 IDynTextureSource* pDynTexSrc = pTex->m_Sampler.m_pDynTexSource;
  138.                                 if (pDynTexSrc)
  139.                                 {
  140.                                         IFlashPlayer* pFlashPlayer = (IFlashPlayer*) pDynTexSrc->GetSourceTemp(IDynTextureSource::DTS_I_FLASHPLAYER);
  141.                                         if (pFlashPlayer)
  142.                                         {
  143.                                                 SFlashVarValue args[MAX_PARAMS] = { false, false, false, false }; // yes, not very good, but faster then alloca
  144.                                                 int numArgs = 0;
  145.                                                 for (int i = EIP_Param1; i < EIP_Param1 + MAX_PARAMS; ++i)
  146.                                                 {
  147.                                                         const string& v = GetPortString(pActInfo, i);
  148.                                                         if (v.empty())
  149.                                                                 break;
  150.                                                         PREFAST_ASSUME(numArgs > 0 && numArgs < MAX_PARAMS);
  151.                                                         args[numArgs++] = v.c_str();
  152.                                                 }
  153.                                                 {
  154.                                                         const char* method = methodName.c_str();
  155.                                                         if (method)
  156.                                                         {
  157.                                                                 if (!stricmp(method, "vPlay"))
  158.                                                                 {
  159.                                                                         pDynTexSrc->EnablePerFrameRendering(true);
  160.                                                                         SetAudioChannel(pFlashPlayer);
  161.                                                                 }
  162.                                                                 else if (!stricmp(method, "vStop"))
  163.                                                                 {
  164.                                                                         pDynTexSrc->EnablePerFrameRendering(false);
  165.                                                                 }
  166.                                                         }
  167.                                                 }
  168.                                                 SFlashVarValue invokeRes(SFlashVarValue::CreateUndefined());
  169.                                                 if (pFlashPlayer->Invoke(methodName.c_str(), args, numArgs, &invokeRes))
  170.                                                 {
  171.                                                         switch (invokeRes.GetType())
  172.                                                         {
  173.                                                         case SFlashVarValue::eBool:
  174.                                                                 ActivateOutput(pActInfo, EOP_Result, invokeRes.GetBool());
  175.                                                                 break;
  176.                                                         case SFlashVarValue::eInt:
  177.                                                                 ActivateOutput(pActInfo, EOP_Result, invokeRes.GetInt());
  178.                                                                 break;
  179.                                                         case SFlashVarValue::eUInt:
  180.                                                                 ActivateOutput(pActInfo, EOP_Result, (int) invokeRes.GetUInt());
  181.                                                                 break;
  182.                                                         case SFlashVarValue::eDouble:
  183.                                                                 ActivateOutput(pActInfo, EOP_Result, (float) invokeRes.GetDouble());
  184.                                                                 break;
  185.                                                         case SFlashVarValue::eFloat:
  186.                                                                 ActivateOutput(pActInfo, EOP_Result, invokeRes.GetFloat());
  187.                                                                 break;
  188.                                                         case SFlashVarValue::eConstStrPtr:
  189.                                                                 {
  190.                                                                         string t(invokeRes.GetConstStrPtr());
  191.                                                                         ActivateOutput(pActInfo, EOP_Result, t);
  192.                                                                 }
  193.                                                         case SFlashVarValue::eConstWstrPtr:
  194.                                                         case SFlashVarValue::eObject:
  195.                                                         case SFlashVarValue::eNull:
  196.                                                         case SFlashVarValue::eUndefined:
  197.                                                         default:
  198.                                                                 ActivateOutput(pActInfo, EOP_Result, true); // at least sth
  199.                                                                 break;
  200.                                                         }
  201.                                                 }
  202.                                                 else
  203.                                                 {
  204.                                                         GameWarning("[flow] CFlowFlashInvokeNode: Error while calling '%s' on Entity '%s' [%d]", methodName.c_str(), pEntity->GetName(), pEntity->GetId());
  205.                                                 }
  206.  
  207.                                                 pFlashPlayer->Release();
  208.                                         }
  209.                                         else
  210.                                         {
  211.                                                 GameWarning("[flow] CFlowFlashInvokeNode: Entity '%s' [%d] has no FlashDynTexture at sub-material %d at slot %d at texslot %d", pEntity->GetName(), pEntity->GetId(), subMtlId, slot, texSlot);
  212.                                         }
  213.                                 }
  214.                                 else
  215.                                 {
  216.                                         GameWarning("[flow] CFlowFlashInvokeNode: Entity '%s' [%d] has no dyn-texture at sub-material %d at slot %d at texslot %d", pEntity->GetName(), pEntity->GetId(), subMtlId, slot, texSlot);
  217.                                 }
  218.                         }
  219.                         else
  220.                         {
  221.                                 GameWarning("[flow] CFlowFlashInvokeNode: Entity '%s' [%d] has no texture at sub-material %d at slot %d at texslot %d", pEntity->GetName(), pEntity->GetId(), subMtlId, slot, texSlot);
  222.                         }
  223.                 }
  224.         }
  225.  
  226.         void SetAudioChannel(IFlashPlayer* pFlashPlayer)
  227.         {
  228.                 int languageId = 1;
  229.                 const char* language = gEnv->pSystem->GetLocalizationManager()->GetLanguage();
  230.                 if (language != NULL && language[0] != 0)
  231.                 {
  232.                         for (int i = 0; i < g_languageMappingCount; ++i)
  233.                         {
  234.                                 if (stricmp(g_languageMapping[i], language) == 0)
  235.                                 {
  236.                                         languageId = i;
  237.                                         break;
  238.                                 }
  239.                         }
  240.                 }
  241.  
  242.                 pFlashPlayer->Invoke1("setSubAudioChannel", languageId);
  243.         }
  244.  
  245.         virtual void GetMemoryUsage(ICrySizer* s) const
  246.         {
  247.                 s->Add(*this);
  248.         }
  249. };
  250.  
  251. REGISTER_FLOW_NODE("Entity:FlashInvoke", CFlowFlashInvokeNode)
  252.  
downloadFlowFlashInvokeNode.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