BVB Source Codes

CRYENGINE Show VisAreaManCompile.cpp Source code

Return Download CRYENGINE: download VisAreaManCompile.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:   visareamancompile.cpp
  5. //  Version:     v1.00
  6. //  Created:     15/04/2005 by Vladimir Kajalin
  7. //  Compilers:   Visual Studio.NET
  8. //  Description: check vis
  9. // -------------------------------------------------------------------------
  10. //  History:
  11. //
  12. ////////////////////////////////////////////////////////////////////////////
  13.  
  14. #include "StdAfx.h"
  15.  
  16. #include "ObjMan.h"
  17. #include "VisAreas.h"
  18.  
  19. bool CVisAreaManager::GetCompiledData(byte* pData, int nDataSize, std::vector<struct IStatObj*>** ppStatObjTable, std::vector<IMaterial*>** ppMatTable, std::vector<struct IStatInstGroup*>** ppStatInstGroupTable, EEndian eEndian, SHotUpdateInfo* pExportInfo, const Vec3& segmentOffset)
  20. {
  21. #if !ENGINE_ENABLE_COMPILATION
  22.         CryFatalError("serialization code removed, please enable 3DENGINE_ENABLE_COMPILATION in Cry3DEngine/StdAfx.h");
  23.         return false;
  24. #else
  25.         float fStartTime = GetCurAsyncTimeSec();
  26.  
  27.         bool bHMap(!pExportInfo || pExportInfo->nHeigtmap);
  28.         bool bObjs(!pExportInfo || pExportInfo->nObjTypeMask);
  29.  
  30.         //  PrintMessage("Exporting indoor data (%s, %.2f MB) ...",
  31.         //  (bHMap && bObjs) ? "Objects and heightmap" : (bHMap ? "Heightmap" : (bObjs ? "Objects" : "Nothing")), ((float)nDataSize)/1024.f/1024.f);
  32.  
  33.         // write header
  34.         SVisAreaManChunkHeader* pVisAreaManagerChunkHeader = (SVisAreaManChunkHeader*)pData;
  35.         pVisAreaManagerChunkHeader->nVersion = VISAREAMANAGER_CHUNK_VERSION;
  36.         pVisAreaManagerChunkHeader->nDummy = 0;
  37.         pVisAreaManagerChunkHeader->nFlags = (eEndian == eBigEndian) ? SERIALIZATION_FLAG_BIG_ENDIAN : 0;
  38.         pVisAreaManagerChunkHeader->nFlags2 = 0;
  39.         pVisAreaManagerChunkHeader->nChunkSize = nDataSize;
  40.  
  41.         SwapEndian(*pVisAreaManagerChunkHeader, eEndian);
  42.  
  43.         UPDATE_PTR_AND_SIZE(pData, nDataSize, sizeof(SVisAreaManChunkHeader));
  44.  
  45.         if (!Get3DEngine()->m_pSegmentsManager)
  46.         {
  47.                 pVisAreaManagerChunkHeader->nVisAreasNum = m_lstVisAreas.Count();
  48.                 pVisAreaManagerChunkHeader->nPortalsNum = m_lstPortals.Count();
  49.                 pVisAreaManagerChunkHeader->nOcclAreasNum = m_lstOcclAreas.Count();
  50.  
  51.                 for (int i = 0; i < m_lstVisAreas.Count(); i++)
  52.                         m_lstVisAreas[i]->GetData(pData, nDataSize, *ppStatObjTable, *ppMatTable, *ppStatInstGroupTable, eEndian, pExportInfo);
  53.  
  54.                 for (int i = 0; i < m_lstPortals.Count(); i++)
  55.                         m_lstPortals[i]->GetData(pData, nDataSize, *ppStatObjTable, *ppMatTable, *ppStatInstGroupTable, eEndian, pExportInfo);
  56.  
  57.                 for (int i = 0; i < m_lstOcclAreas.Count(); i++)
  58.                         m_lstOcclAreas[i]->GetData(pData, nDataSize, *ppStatObjTable, *ppMatTable, *ppStatInstGroupTable, eEndian, pExportInfo);
  59.  
  60.                 SAFE_DELETE(*ppStatObjTable);
  61.                 SAFE_DELETE(*ppMatTable);
  62.                 SAFE_DELETE(*ppStatInstGroupTable);
  63.         }
  64.         else
  65.         {
  66.                 pVisAreaManagerChunkHeader->nVisAreasNum = m_segVisAreas.Count();
  67.                 pVisAreaManagerChunkHeader->nPortalsNum = m_segPortals.Count();
  68.                 pVisAreaManagerChunkHeader->nOcclAreasNum = m_segOcclAreas.Count();
  69.  
  70.                 for (int i = 0; i < m_segVisAreas.Count(); i++)
  71.                         m_segVisAreas[i]->GetSegmentData(pData, nDataSize, *ppStatObjTable, *ppMatTable, *ppStatInstGroupTable, eEndian, pExportInfo, segmentOffset);
  72.  
  73.                 for (int i = 0; i < m_segPortals.Count(); i++)
  74.                         m_segPortals[i]->GetSegmentData(pData, nDataSize, *ppStatObjTable, *ppMatTable, *ppStatInstGroupTable, eEndian, pExportInfo, segmentOffset);
  75.  
  76.                 for (int i = 0; i < m_segOcclAreas.Count(); i++)
  77.                         m_segOcclAreas[i]->GetSegmentData(pData, nDataSize, *ppStatObjTable, *ppMatTable, *ppStatInstGroupTable, eEndian, pExportInfo, segmentOffset);
  78.         }
  79.  
  80.         if (!pExportInfo)
  81.                 PrintMessagePlus(" done in %.2f sec", GetCurAsyncTimeSec() - fStartTime);
  82.  
  83.         assert(nDataSize == 0);
  84.         return nDataSize == 0;
  85. #endif
  86. }
  87.  
  88. int CVisAreaManager::GetCompiledDataSize(SHotUpdateInfo* pExportInfo)
  89. {
  90. #if !ENGINE_ENABLE_COMPILATION
  91.         CryFatalError("serialization code removed, please enable 3DENGINE_ENABLE_COMPILATION in Cry3DEngine/StdAfx.h");
  92.         return 0;
  93. #else
  94.  
  95.         int nDataSize = 0;
  96.         byte* pData = NULL;
  97.         Vec3 segmentOffset(0, 0, 0);
  98.  
  99.         // get header size
  100.         nDataSize += sizeof(SVisAreaManChunkHeader);
  101.  
  102.         if (!Get3DEngine()->m_pSegmentsManager)
  103.         {
  104.                 for (int i = 0; i < m_lstVisAreas.Count(); i++)
  105.                         m_lstVisAreas[i]->GetData(pData, nDataSize, NULL, NULL, NULL, eLittleEndian, pExportInfo);
  106.  
  107.                 for (int i = 0; i < m_lstPortals.Count(); i++)
  108.                         m_lstPortals[i]->GetData(pData, nDataSize, NULL, NULL, NULL, eLittleEndian, pExportInfo);
  109.  
  110.                 for (int i = 0; i < m_lstOcclAreas.Count(); i++)
  111.                         m_lstOcclAreas[i]->GetData(pData, nDataSize, NULL, NULL, NULL, eLittleEndian, pExportInfo);
  112.         }
  113.         else
  114.         {
  115.                 for (int i = 0; i < m_segVisAreas.Count(); i++)
  116.                         m_segVisAreas[i]->GetSegmentData(pData, nDataSize, NULL, NULL, NULL, eLittleEndian, pExportInfo, segmentOffset);
  117.  
  118.                 for (int i = 0; i < m_segPortals.Count(); i++)
  119.                         m_segPortals[i]->GetSegmentData(pData, nDataSize, NULL, NULL, NULL, eLittleEndian, pExportInfo, segmentOffset);
  120.  
  121.                 for (int i = 0; i < m_segOcclAreas.Count(); i++)
  122.                         m_segOcclAreas[i]->GetSegmentData(pData, nDataSize, NULL, NULL, NULL, eLittleEndian, pExportInfo, segmentOffset);
  123.         }
  124.  
  125.         return nDataSize;
  126. #endif
  127. }
  128.  
  129. bool CVisAreaManager::Load(FILE*& f, int& nDataSize, struct SVisAreaManChunkHeader* pVisAreaManagerChunkHeader, std::vector<struct IStatObj*>* pStatObjTable, std::vector<IMaterial*>* pMatTable)
  130. {
  131.         bool bRes;
  132.  
  133.         // in case of small data amount (console game) load entire file into memory in single operation
  134.         if (nDataSize < 4 * 1024 * 1024)
  135.         {
  136.                 _smart_ptr<IMemoryBlock> pMemBlock = gEnv->pCryPak->PoolAllocMemoryBlock(nDataSize + 8, "LoadIndoors");
  137.                 byte* pPtr = (byte*)pMemBlock->GetData();
  138.                 while (UINT_PTR(pPtr) & 3)
  139.                         pPtr++;
  140.  
  141.                 if (GetPak()->FReadRaw(pPtr, 1, nDataSize - sizeof(SVisAreaManChunkHeader), f) != nDataSize - sizeof(SVisAreaManChunkHeader))
  142.                         return false;
  143.  
  144.                 bRes = Load_T(pPtr, nDataSize, pVisAreaManagerChunkHeader, pStatObjTable, pMatTable, false, NULL);
  145.         }
  146.         else
  147.         {
  148.                 bRes = Load_T(f, nDataSize, pVisAreaManagerChunkHeader, pStatObjTable, pMatTable, false, NULL);
  149.         }
  150.  
  151.         return bRes;
  152.  
  153. }
  154.  
  155. bool CVisAreaManager::SetCompiledData(byte* pData, int nDataSize, std::vector<struct IStatObj*>** ppStatObjTable, std::vector<IMaterial*>** ppMatTable, bool bHotUpdate, SHotUpdateInfo* pExportInfo, const Vec3& vSegmentOrigin)
  156. {
  157.         SVisAreaManChunkHeader* pChunkHeader = (SVisAreaManChunkHeader*)pData;
  158.         pData += sizeof(SVisAreaManChunkHeader);
  159.  
  160.         SwapEndian(*pChunkHeader, eLittleEndian);
  161.  
  162.         bool bRes = Load_T(pData, nDataSize, pChunkHeader, *ppStatObjTable, *ppMatTable, bHotUpdate, pExportInfo);
  163.  
  164.         SAFE_DELETE(*ppStatObjTable);
  165.         SAFE_DELETE(*ppMatTable);
  166.  
  167.         return bRes;
  168. }
  169.  
  170. void CVisAreaManager::UnregisterEngineObjectsInArea(const SHotUpdateInfo* pExportInfo, PodArray<IRenderNode*>& arrUnregisteredObjects, bool bOnlyEngineObjects)
  171. {
  172.         for (int i = 0; i < m_lstVisAreas.Count(); i++)
  173.                 if (m_lstVisAreas[i]->m_pObjectsTree)
  174.                         m_lstVisAreas[i]->m_pObjectsTree->UnregisterEngineObjectsInArea(pExportInfo, arrUnregisteredObjects, bOnlyEngineObjects);
  175.  
  176.         for (int i = 0; i < m_lstPortals.Count(); i++)
  177.                 if (m_lstPortals[i]->m_pObjectsTree)
  178.                         m_lstPortals[i]->m_pObjectsTree->UnregisterEngineObjectsInArea(pExportInfo, arrUnregisteredObjects, bOnlyEngineObjects);
  179.  
  180.         for (int i = 0; i < m_lstOcclAreas.Count(); i++)
  181.                 if (m_lstOcclAreas[i]->m_pObjectsTree)
  182.                         m_lstOcclAreas[i]->m_pObjectsTree->UnregisterEngineObjectsInArea(pExportInfo, arrUnregisteredObjects, bOnlyEngineObjects);
  183. }
  184.  
  185. void CVisAreaManager::OnVisAreaDeleted(IVisArea* pArea)
  186. {
  187.         for (int i = 0, num = m_lstCallbacks.size(); i < num; i++)
  188.                 m_lstCallbacks[i]->OnVisAreaDeleted(pArea);
  189.  
  190.         m_lstActiveOcclVolumes.Delete((CVisArea*)pArea);
  191.         m_lstIndoorActiveOcclVolumes.Delete((CVisArea*)pArea);
  192.         m_lstActiveEntransePortals.Delete((CVisArea*)pArea);
  193. }
  194.  
  195. template<class T>
  196. bool CVisAreaManager::Load_T(T*& f, int& nDataSize, SVisAreaManChunkHeader* pVisAreaManagerChunkHeader, std::vector<IStatObj*>* pStatObjTable, std::vector<IMaterial*>* pMatTable, bool bHotUpdate, SHotUpdateInfo* pExportInfo)
  197. {
  198.         if (pVisAreaManagerChunkHeader->nVersion != VISAREAMANAGER_CHUNK_VERSION)
  199.         { Error("CVisAreaManager::SetCompiledData: version of file is %d, expected version is %d", pVisAreaManagerChunkHeader->nVersion, (int)VISAREAMANAGER_CHUNK_VERSION); return 0; }
  200.  
  201.         if (pVisAreaManagerChunkHeader->nChunkSize != nDataSize)
  202.         { Error("CVisAreaManager::SetCompiledData: data size mismatch (%d != %d)", pVisAreaManagerChunkHeader->nChunkSize, nDataSize); return 0; }
  203.  
  204.         bool bHMap(!pExportInfo || pExportInfo->nHeigtmap);
  205.         bool bObjs(!pExportInfo || pExportInfo->nObjTypeMask);
  206.         AABB* pBox = (pExportInfo && !pExportInfo->areaBox.IsReset()) ? &pExportInfo->areaBox : NULL;
  207.  
  208.         EEndian eEndian = (pVisAreaManagerChunkHeader->nFlags & SERIALIZATION_FLAG_BIG_ENDIAN) ? eBigEndian : eLittleEndian;
  209.  
  210.         PodArray<IRenderNode*> arrUnregisteredObjects;
  211.         UnregisterEngineObjectsInArea(pExportInfo, arrUnregisteredObjects, true);
  212.  
  213.         PodArray<IRenderNode*> arrUnregisteredEntities;
  214.         UnregisterEngineObjectsInArea(NULL, arrUnregisteredEntities, false);
  215.  
  216.         DeleteAllVisAreas();
  217.  
  218.         SAFE_DELETE(m_pAABBTree);
  219.         m_pCurArea = m_pCurPortal = 0;
  220.  
  221.         {
  222.                 // construct areas
  223.                 m_lstVisAreas.PreAllocate(pVisAreaManagerChunkHeader->nVisAreasNum, pVisAreaManagerChunkHeader->nVisAreasNum);
  224.                 m_lstPortals.PreAllocate(pVisAreaManagerChunkHeader->nPortalsNum, pVisAreaManagerChunkHeader->nPortalsNum);
  225.                 m_lstOcclAreas.PreAllocate(pVisAreaManagerChunkHeader->nOcclAreasNum, pVisAreaManagerChunkHeader->nOcclAreasNum);
  226.  
  227.                 nDataSize -= sizeof(SVisAreaManChunkHeader);
  228.  
  229.                 //    if(bHotUpdate)
  230.                 //    PrintMessage("Importing indoor data (%s, %.2f MB) ...",
  231.                 //  (bHMap && bObjs) ? "Objects and heightmap" : (bHMap ? "Heightmap" : (bObjs ? "Objects" : "Nothing")), ((float)nDataSize)/1024.f/1024.f);
  232.                 m_visAreas.PreAllocate(pVisAreaManagerChunkHeader->nVisAreasNum);
  233.                 m_visAreaColdData.PreAllocate(pVisAreaManagerChunkHeader->nVisAreasNum);
  234.  
  235.                 m_portals.PreAllocate(pVisAreaManagerChunkHeader->nPortalsNum);
  236.                 m_portalColdData.PreAllocate(pVisAreaManagerChunkHeader->nPortalsNum);
  237.  
  238.                 m_occlAreas.PreAllocate(pVisAreaManagerChunkHeader->nOcclAreasNum);
  239.                 m_occlAreaColdData.PreAllocate(pVisAreaManagerChunkHeader->nOcclAreasNum);
  240.  
  241.                 for (int i = 0; i < m_lstVisAreas.Count(); i++)
  242.                         m_lstVisAreas[i] = CreateTypeVisArea();
  243.                 for (int i = 0; i < m_lstPortals.Count(); i++)
  244.                         m_lstPortals[i] = CreateTypePortal();
  245.                 for (int i = 0; i < m_lstOcclAreas.Count(); i++)
  246.                         m_lstOcclAreas[i] = CreateTypeOcclArea();
  247.         }
  248.  
  249.         {
  250.                 // load areas content
  251.                 for (int i = 0; i < m_lstVisAreas.Count(); i++)
  252.                         m_lstVisAreas[i]->Load(f, nDataSize, pStatObjTable, pMatTable, eEndian, pExportInfo);
  253.  
  254.                 for (int i = 0; i < m_lstPortals.Count(); i++)
  255.                         m_lstPortals[i]->Load(f, nDataSize, pStatObjTable, pMatTable, eEndian, pExportInfo);
  256.  
  257.                 for (int i = 0; i < m_lstOcclAreas.Count(); i++)
  258.                         m_lstOcclAreas[i]->Load(f, nDataSize, pStatObjTable, pMatTable, eEndian, pExportInfo);
  259.         }
  260.  
  261.         for (int i = 0; i < arrUnregisteredObjects.Count(); i++)
  262.                 arrUnregisteredObjects[i]->ReleaseNode();
  263.         arrUnregisteredObjects.Reset();
  264.  
  265.         for (int i = 0; i < arrUnregisteredEntities.Count(); i++)
  266.                 Get3DEngine()->RegisterEntity(arrUnregisteredEntities[i]);
  267.         arrUnregisteredEntities.Reset();
  268.  
  269.         SAFE_DELETE(m_pAABBTree);
  270.         m_pCurArea = m_pCurPortal = 0;
  271.         UpdateConnections();
  272.  
  273.         return nDataSize == 0;
  274. }
  275.  
  276. //////////////////////////////////////////////////////////////////////
  277. // Segmented World
  278. inline bool IsContainBox2D(const AABB& base, const AABB& test)
  279. {
  280.         if (base.min.x < test.max.x && base.max.x > test.min.x &&
  281.             base.min.y < test.max.y && base.max.y > test.min.y)
  282.                 return true;
  283.  
  284.         return false;
  285. }
  286.  
  287. void CVisAreaManager::PrepareSegmentData(const AABB& box)
  288. {
  289.         m_segVisAreas.Clear();
  290.         for (int v = 0; v < m_lstVisAreas.Count(); v++)
  291.         {
  292.                 if (IsContainBox2D(m_lstVisAreas[v]->m_boxArea, box))
  293.                 {
  294.                         m_segVisAreas.Add(m_lstVisAreas[v]);
  295.                 }
  296.         }
  297.  
  298.         m_segPortals.Clear();
  299.         for (int p = 0; p < m_lstPortals.Count(); p++)
  300.         {
  301.                 if (IsContainBox2D(m_lstPortals[p]->m_boxArea, box))
  302.                 {
  303.                         m_segPortals.Add(m_lstPortals[p]);
  304.                 }
  305.         }
  306.  
  307.         m_segOcclAreas.Clear();
  308.         for (int o = 0; o < m_lstOcclAreas.Count(); o++)
  309.         {
  310.                 if (IsContainBox2D(m_lstOcclAreas[o]->m_boxArea, box))
  311.                 {
  312.                         m_segOcclAreas.Add(m_lstOcclAreas[o]);
  313.                 }
  314.         }
  315. }
  316.  
  317. bool CVisAreaManager::StreamCompiledData(uint8* pData, int nDataSize, int nSID, std::vector<struct IStatObj*>* pStatObjTable, std::vector<IMaterial*>* pMatTable, std::vector<struct IStatInstGroup*>* pStatInstGroupTable, const Vec3& vSegmentOrigin, const Vec2& vIndexOffset)
  318. {
  319.         SVisAreaManChunkHeader* pVisAreaManagerChunkHeader = (SVisAreaManChunkHeader*)pData;
  320.  
  321.         pData += sizeof(SVisAreaManChunkHeader);
  322.         nDataSize -= sizeof(SVisAreaManChunkHeader);
  323.  
  324.         assert(pVisAreaManagerChunkHeader->nVersion == VISAREAMANAGER_CHUNK_VERSION);
  325.  
  326.         EEndian eEndian = (pVisAreaManagerChunkHeader->nFlags & SERIALIZATION_FLAG_BIG_ENDIAN) ? eBigEndian : eLittleEndian;
  327.  
  328.         SAFE_DELETE(m_pAABBTree);
  329.         m_pCurArea = m_pCurPortal = 0;
  330.  
  331.         for (int i = 0; i < pVisAreaManagerChunkHeader->nVisAreasNum; i++)
  332.         {
  333.                 VisAreaGUID guid = CVisArea::GetGUIDFromFile(pData, eEndian);
  334.                 CSWVisArea* pVisArea = (CSWVisArea*)FindVisAreaByGuid(guid, m_lstVisAreas);
  335.                 if (!pVisArea)
  336.                 {
  337.                         pVisArea = CreateVisAreaFromPool(m_lstVisAreas, m_visAreas, m_visAreaColdData, false);
  338.                         m_lstVisAreas.Add(pVisArea);
  339.                 }
  340.                 pVisArea->AddRef();
  341.                 m_visAreaSegmentData[nSID].m_visAreaIndices.push_back(pVisArea->m_nSlotID);
  342.                 pVisArea->Load(pData, nDataSize, nSID, pStatObjTable, pMatTable, eEndian, 0, vSegmentOrigin, vIndexOffset);
  343.         }
  344.  
  345.         for (int i = 0; i < pVisAreaManagerChunkHeader->nPortalsNum; i++)
  346.         {
  347.                 VisAreaGUID guid = CVisArea::GetGUIDFromFile(pData, eEndian);
  348.                 CSWVisArea* pVisArea = (CSWVisArea*)FindVisAreaByGuid(guid, m_lstPortals);
  349.                 if (!pVisArea)
  350.                 {
  351.                         pVisArea = CreateVisAreaFromPool(m_lstPortals, m_portals, m_portalColdData, true);
  352.                         m_lstPortals.Add(pVisArea);
  353.                 }
  354.                 pVisArea->AddRef();
  355.                 m_portalSegmentData[nSID].m_visAreaIndices.push_back(pVisArea->m_nSlotID);
  356.                 pVisArea->Load(pData, nDataSize, nSID, pStatObjTable, pMatTable, eEndian, 0, vSegmentOrigin, vIndexOffset);
  357.         }
  358.  
  359.         for (int i = 0; i < pVisAreaManagerChunkHeader->nOcclAreasNum; i++)
  360.         {
  361.                 VisAreaGUID guid = CVisArea::GetGUIDFromFile(pData, eEndian);
  362.                 CSWVisArea* pVisArea = (CSWVisArea*)FindVisAreaByGuid(guid, m_lstOcclAreas);
  363.                 if (!pVisArea)
  364.                 {
  365.                         pVisArea = CreateVisAreaFromPool(m_lstOcclAreas, m_occlAreas, m_occlAreaColdData, false);
  366.                         m_lstOcclAreas.Add(pVisArea);
  367.                 }
  368.                 pVisArea->AddRef();
  369.                 m_occlAreaSegmentData[nSID].m_visAreaIndices.push_back(pVisArea->m_nSlotID);
  370.                 pVisArea->Load(pData, nDataSize, nSID, pStatObjTable, pMatTable, eEndian, 0, vSegmentOrigin, vIndexOffset);
  371.         }
  372.  
  373.         SAFE_DELETE(m_pAABBTree);
  374.         m_pCurArea = m_pCurPortal = 0;
  375.  
  376.         SAFE_DELETE(pStatObjTable);
  377.         SAFE_DELETE(pMatTable);
  378.         SAFE_DELETE(pStatInstGroupTable);
  379.  
  380.         return !(nDataSize == 0);
  381. }
  382.  
  383. CSWVisArea* CVisAreaManager::FindFreeVisAreaFromPool(PodArray<CVisArea*, ReservedVisAreaBytes>& visAreas)
  384. {
  385.         for (int i = 0; i < visAreas.Count(); i++)
  386.         {
  387.                 CSWVisArea* pVisArea = (CSWVisArea*)visAreas[i];
  388.  
  389.                 if (!pVisArea->UseCount())
  390.                 {
  391.                         pVisArea->m_nSlotID = i;
  392.                         return pVisArea;
  393.                 }
  394.         }
  395.  
  396.         return NULL;
  397. }
  398.  
  399. template<class T>
  400. CSWVisArea* CVisAreaManager::CreateVisAreaFromPool(PodArray<CVisArea*>& lstVisAreas, PodArray<CVisArea*, ReservedVisAreaBytes>& visAreas, PodArray<T>& visAreaColdData, bool bIsPortal)
  401. {
  402.         CSWVisArea* pVisArea = FindFreeVisAreaFromPool(visAreas);
  403.         if (!pVisArea)
  404.         {
  405.                 int nVisArea = visAreas.Count();
  406.                 visAreas.PreAllocate(nVisArea * 2);
  407.                 visAreaColdData.PreAllocate(nVisArea * 2);
  408.  
  409.                 ResetVisAreaList(lstVisAreas, visAreas, visAreaColdData);
  410.  
  411.                 pVisArea = CreateTypeArea(visAreas, visAreaColdData, bIsPortal);
  412.  
  413.                 // assign the slot id once the pool is enlarged
  414.                 pVisArea->m_nSlotID = nVisArea;
  415.         }
  416.  
  417.         return pVisArea;
  418. }
  419.  
  420. template<class T>
  421. void CVisAreaManager::ResetVisAreaList(PodArray<CVisArea*>& lstVisAreas, PodArray<CVisArea*, ReservedVisAreaBytes>& visAreas, PodArray<T>& visAreaColdData)
  422. {
  423.         for (int i = 0; i < visAreas.Count(); i++)
  424.         {
  425.                 CVisArea* pVisArea = visAreas[i];
  426.                 if (pVisArea->m_pObjectsTree)
  427.                         pVisArea->m_pObjectsTree->SetVisArea(pVisArea);
  428.                 pVisArea->SetColdDataPtr(&visAreaColdData[i]);
  429.                 lstVisAreas[i] = pVisArea;
  430.         }
  431. }
  432.  
  433. template<class T>
  434. CSWVisArea* CVisAreaManager::CreateTypeArea(PodArray<CVisArea*, ReservedVisAreaBytes>& visAreas, PodArray<T>& visAreaColdData, bool bIsPortal)
  435. {
  436.         CSWVisArea* pNewVisArea = new CSWVisArea();
  437.         SGenericColdData* pColdData = &visAreaColdData.AddNew();
  438.  
  439.         visAreas.Add(pNewVisArea);
  440.         pColdData->m_dataType = bIsPortal ? eCDT_Portal : eCDT_Generic;
  441.         pNewVisArea->SetColdDataPtr(pColdData);
  442.  
  443.         return pNewVisArea;
  444. }
  445.  
downloadVisAreaManCompile.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