BVB Source Codes

CRYENGINE Show RuntimeAreas.cpp Source code

Return Download CRYENGINE: download RuntimeAreas.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 "RuntimeAreas.h"
  5. #include "GameObjects/RuntimeAreaObject.h"
  6. #include <IGameObject.h>
  7.  
  8. CRuntimeAreaManager::CRuntimeAreaManager()
  9. {
  10.         gEnv->pSystem->GetISystemEventDispatcher()->RegisterListener(this);
  11.  
  12.         IEntityClassRegistry::SEntityClassDesc runtimeObjectDesc;
  13.         runtimeObjectDesc.sName = "RuntimeAreaObject";
  14.         runtimeObjectDesc.sScriptFile = "";
  15.  
  16.         static IGameFramework::CGameObjectExtensionCreator<CRuntimeAreaObject> runtimeObjectCreator;
  17.         gEnv->pGameFramework->GetIGameObjectSystem()->RegisterExtension(runtimeObjectDesc.sName, &runtimeObjectCreator, &runtimeObjectDesc);
  18.  
  19.         FillAudioControls();
  20. }
  21.  
  22. ///////////////////////////////////////////////////////////////////////////
  23. CRuntimeAreaManager::~CRuntimeAreaManager()
  24. {
  25.         gEnv->pSystem->GetISystemEventDispatcher()->RemoveListener(this);
  26. }
  27.  
  28. ///////////////////////////////////////////////////////////////////////////
  29. void CRuntimeAreaManager::OnSystemEvent(ESystemEvent event, UINT_PTR wparam, UINT_PTR lparam)
  30. {
  31.         switch (event)
  32.         {
  33.         case ESYSTEM_EVENT_LEVEL_UNLOAD:
  34.                 if (gEnv->IsEditor() == false)
  35.                         DestroyAreas();
  36.                 break;
  37.         case ESYSTEM_EVENT_LEVEL_PRECACHE_END:
  38.                 if (gEnv->IsEditor() == false)
  39.                         CreateAreas();
  40.                 break;
  41.         case ESYSTEM_EVENT_EDITOR_GAME_MODE_CHANGED:
  42.         case ESYSTEM_EVENT_EDITOR_SIMULATION_MODE_CHANGED:
  43.                 if (wparam)
  44.                         CreateAreas();
  45.                 else
  46.                         DestroyAreas();
  47.                 break;
  48.         }
  49. }
  50.  
  51. char const* const CRuntimeAreaManager::SXMLTags::sMergedMeshSurfaceTypesRoot = "MergedMeshSurfaceTypes";
  52. char const* const CRuntimeAreaManager::SXMLTags::sMergedMeshSurfaceTag = "SurfaceType";
  53. char const* const CRuntimeAreaManager::SXMLTags::sAudioTag = "Audio";
  54. char const* const CRuntimeAreaManager::SXMLTags::sNameAttribute = "name";
  55. char const* const CRuntimeAreaManager::SXMLTags::sATLTriggerAttribute = "atl_trigger";
  56. char const* const CRuntimeAreaManager::SXMLTags::sATLRtpcAttribute = "atl_rtpc";
  57.  
  58. ///////////////////////////////////////////////////////////////////////////
  59. void CRuntimeAreaManager::FillAudioControls()
  60. {
  61.         CryFixedStringT<1024> sXMLPath(PathUtil::GetGameFolder().c_str());
  62.         sXMLPath.append("/libs/materialeffects/mergedmeshsurfacetypes.xml");
  63.  
  64.         XmlNodeRef const pXMLRoot(gEnv->pSystem->LoadXmlFromFile(sXMLPath));
  65.  
  66.         if (pXMLRoot && _stricmp(pXMLRoot->getTag(), SXMLTags::sMergedMeshSurfaceTypesRoot) == 0)
  67.         {
  68.                 size_t const nSurfaceCount = static_cast<size_t>(pXMLRoot->getChildCount());
  69.  
  70.                 for (size_t i = 0; i < nSurfaceCount; ++i)
  71.                 {
  72.                         XmlNodeRef const pSurfaceTypeNode(pXMLRoot->getChild(i));
  73.  
  74.                         if (pSurfaceTypeNode && _stricmp(pSurfaceTypeNode->getTag(), SXMLTags::sMergedMeshSurfaceTag) == 0)
  75.                         {
  76.                                 char const* const sSurfaceName = pSurfaceTypeNode->getAttr(SXMLTags::sNameAttribute);
  77.  
  78.                                 if ((sSurfaceName != NULL) && (sSurfaceName[0] != '\0'))
  79.                                 {
  80.                                         AudioControlId nTriggerID = INVALID_AUDIO_CONTROL_ID;
  81.                                         AudioControlId nRtpcID = INVALID_AUDIO_CONTROL_ID;
  82.  
  83.                                         XmlNodeRef const pAudioNode(pSurfaceTypeNode->findChild(SXMLTags::sAudioTag));
  84.                                         if (pAudioNode)
  85.                                         {
  86.                                                 char const* const sATLTriggerName = pAudioNode->getAttr(SXMLTags::sATLTriggerAttribute);
  87.  
  88.                                                 if ((sATLTriggerName != NULL) && (sATLTriggerName[0] != '\0'))
  89.                                                 {
  90.                                                         gEnv->pAudioSystem->GetAudioTriggerId(sATLTriggerName, nTriggerID);
  91.                                                 }
  92.  
  93.                                                 char const* const sATLRtpcName = pAudioNode->getAttr(SXMLTags::sATLRtpcAttribute);
  94.  
  95.                                                 if ((sATLRtpcName != NULL) && (sATLRtpcName[0] != '\0'))
  96.                                                 {
  97.                                                         gEnv->pAudioSystem->GetAudioRtpcId(sATLRtpcName, nRtpcID);
  98.                                                 }
  99.  
  100.                                                 if ((nTriggerID != INVALID_AUDIO_CONTROL_ID) && (nRtpcID != INVALID_AUDIO_CONTROL_ID))
  101.                                                 {
  102.                                                         CRuntimeAreaObject::m_audioControls[CCrc32::ComputeLowercase(sSurfaceName)] =
  103.                                                           CRuntimeAreaObject::SAudioControls(nTriggerID, nRtpcID);
  104.                                                 }
  105.                                         }
  106.                                 }
  107.                         }
  108.                 }
  109.         }
  110. }
  111.  
  112. ///////////////////////////////////////////////////////////////////////////
  113. void CRuntimeAreaManager::DestroyAreas()
  114. {
  115.         IEntitySystem* const entity_system = gEnv->pEntitySystem;
  116.         for (size_t i = 0, end = m_areaObjects.size(); i < end; entity_system->RemoveEntity(m_areaObjects[i++], true))
  117.                 ;
  118.         for (size_t i = 0, end = m_areas.size(); i < end; entity_system->RemoveEntity(m_areas[i++], true))
  119.                 ;
  120.         m_areaObjects.clear();
  121.         m_areas.clear();
  122. }
  123.  
  124. ///////////////////////////////////////////////////////////////////////////
  125. void CRuntimeAreaManager::CreateAreas()
  126. {
  127.         IMergedMeshesManager* mmrm_manager = gEnv->p3DEngine->GetIMergedMeshesManager();
  128.         mmrm_manager->CalculateDensity();
  129.  
  130.         DynArray<IMergedMeshesManager::SMeshAreaCluster> clusters;
  131.         mmrm_manager->CompileAreas(clusters, IMergedMeshesManager::CLUSTER_CONVEXHULL_GRAHAMSCAN);
  132.  
  133.         size_t const nClusterCount = clusters.size();
  134.         m_areas.reserve(nClusterCount);
  135.         m_areaObjects.reserve(nClusterCount);
  136.  
  137.         std::vector<Vec3> points;
  138.         for (size_t i = 0; i < nClusterCount; ++i)
  139.         {
  140.                 char szName[1024];
  141.                 cry_sprintf(szName, "RuntimeArea_%03d", (int)i);
  142.  
  143.                 IMergedMeshesManager::SMeshAreaCluster& cluster = clusters[i];
  144.                 SEntitySpawnParams areaSpawnParams;
  145.                 areaSpawnParams.pClass = gEnv->pEntitySystem->GetClassRegistry()->FindClass("AreaShape");
  146.                 areaSpawnParams.nFlags = ENTITY_FLAG_VOLUME_SOUND | ENTITY_FLAG_CLIENT_ONLY | ENTITY_FLAG_NO_SAVE;
  147.                 areaSpawnParams.sLayerName = "global";
  148.                 areaSpawnParams.sName = szName;
  149.                 areaSpawnParams.vPosition = cluster.extents.GetCenter() - Vec3(0.0f, 0.0f, cluster.extents.GetSize().z * 0.5f);//??
  150.  
  151.                 IEntityAreaComponent* pAreaProxy = NULL;
  152.                 IEntity* pNewAreaEntity = gEnv->pEntitySystem->SpawnEntity(areaSpawnParams);
  153.                 if (pNewAreaEntity)
  154.                 {
  155.                         EntityId const nAreaEntityID = pNewAreaEntity->GetId();
  156.  
  157.                         pAreaProxy = static_cast<IEntityAreaComponent*>(pNewAreaEntity->CreateProxy(ENTITY_PROXY_AREA));
  158.                         if (pAreaProxy)
  159.                         {
  160.                                 int const nPointCount = cluster.boundary_points.size();
  161.                                 DynArray<bool> abObstructSound(nPointCount + 2, false);
  162.                                 points.resize(nPointCount);
  163.                                 for (size_t j = 0; j < points.size(); ++j)
  164.                                         points[j] = Vec3(
  165.                                           cluster.boundary_points[j].x,
  166.                                           cluster.boundary_points[j].y,
  167.                                           areaSpawnParams.vPosition.z) - areaSpawnParams.vPosition;
  168.  
  169.                                 pAreaProxy->SetPoints(&points[0], &abObstructSound[0], points.size(), cluster.extents.GetSize().z);
  170.                                 pAreaProxy->SetID(11001100 + i);
  171.                                 pAreaProxy->SetPriority(100);
  172.                                 pAreaProxy->SetGroup(110011);
  173.  
  174.                                 SEntitySpawnParams areaObjectSpawnParams;
  175.                                 areaObjectSpawnParams.pClass = gEnv->pEntitySystem->GetClassRegistry()->FindClass("RuntimeAreaObject");
  176.                                 areaObjectSpawnParams.nFlags = ENTITY_FLAG_CLIENT_ONLY | ENTITY_FLAG_NO_SAVE;
  177.                                 areaObjectSpawnParams.sLayerName = "global";
  178.  
  179.                                 IEntity* pNewAreaObjectEntity = gEnv->pEntitySystem->SpawnEntity(areaObjectSpawnParams);
  180.  
  181.                                 if (pNewAreaObjectEntity != NULL)
  182.                                 {
  183.                                         EntityId const nAreaObjectEntityID = pNewAreaObjectEntity->GetId();
  184.  
  185.                                         pAreaProxy->AddEntity(nAreaObjectEntityID);
  186.  
  187.                                         m_areaObjects.push_back(nAreaObjectEntityID);
  188.                                         m_areas.push_back(nAreaEntityID);
  189.                                 }
  190.                                 else
  191.                                 {
  192.                                         gEnv->pEntitySystem->RemoveEntity(nAreaEntityID, true);
  193.                                 }
  194.                         }
  195.                 }
  196.         }
  197. }
  198.  
downloadRuntimeAreas.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