BVB Source Codes

CRYENGINE Show ObjManShadows.cpp Source code

Return Download CRYENGINE: download ObjManShadows.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:   statobjmanshadows.cpp
  5. //  Version:     v1.00
  6. //  Created:     2/6/2002 by Vladimir Kajalin
  7. //  Compilers:   Visual Studio.NET
  8. //  Description: Shadow casters/receivers relations
  9. // -------------------------------------------------------------------------
  10. //  History:
  11. //
  12. ////////////////////////////////////////////////////////////////////////////
  13.  
  14. #include "StdAfx.h"
  15.  
  16. #include "terrain.h"
  17. #include "ObjMan.h"
  18. #include "VisAreas.h"
  19. #include "3dEngine.h"
  20. #include <CryMath/AABBSV.h>
  21. #include "Vegetation.h"
  22. #include "Brush.h"
  23. #include "LightEntity.h"
  24. #include "ObjectsTree.h"
  25.  
  26. #pragma warning(disable: 4244)
  27.  
  28. bool IsAABBInsideHull(const SPlaneObject* pHullPlanes, int nPlanesNum, const AABB& aabbBox);
  29.  
  30. void CObjManager::MakeShadowCastersList(CVisArea* pArea, const AABB& aabbReceiver, int dwAllowedTypes, int32 nRenderNodeFlags, Vec3 vLightPos, CDLight* pLight, ShadowMapFrustum* pFr, PodArray<SPlaneObject>* pShadowHull, const SRenderingPassInfo& passInfo)
  31. {
  32.         FUNCTION_PROFILER_3DENGINE;
  33.  
  34.         assert(pLight && vLightPos.len() > 1); // world space pos required
  35.  
  36.         pFr->castersList.Clear();
  37.         pFr->jobExecutedCastersList.Clear();
  38.  
  39.         CVisArea* pLightArea = pLight->m_pOwner ? (CVisArea*)pLight->m_pOwner->GetEntityVisArea() : NULL;
  40.  
  41.         if (pArea)
  42.         {
  43.                 if (pArea->m_pObjectsTree)
  44.                         pArea->m_pObjectsTree->FillShadowCastersList(false, pLight, pFr, pShadowHull, nRenderNodeFlags, passInfo);
  45.  
  46.                 if (pLightArea)
  47.                 {
  48.                         // check neighbor sectors and portals if light and object are not in same area
  49.                         if (!(pLight->m_Flags & DLF_THIS_AREA_ONLY))
  50.                         {
  51.                                 for (int pp = 0; pp < pArea->m_lstConnections.Count(); pp++)
  52.                                 {
  53.                                         CVisArea* pN = pArea->m_lstConnections[pp];
  54.                                         if (pN->m_pObjectsTree)
  55.                                                 pN->m_pObjectsTree->FillShadowCastersList(false, pLight, pFr, pShadowHull, nRenderNodeFlags, passInfo);
  56.  
  57.                                         for (int p = 0; p < pN->m_lstConnections.Count(); p++)
  58.                                         {
  59.                                                 CVisArea* pNN = pN->m_lstConnections[p];
  60.                                                 if (pNN != pLightArea && pNN->m_pObjectsTree)
  61.                                                         pNN->m_pObjectsTree->FillShadowCastersList(false, pLight, pFr, pShadowHull, nRenderNodeFlags, passInfo);
  62.                                         }
  63.                                 }
  64.                         }
  65.                         else if (!pLightArea->IsPortal())
  66.                         {
  67.                                 // visit also portals
  68.                                 for (int p = 0; p < pArea->m_lstConnections.Count(); p++)
  69.                                 {
  70.                                         CVisArea* pN = pArea->m_lstConnections[p];
  71.                                         if (pN->m_pObjectsTree)
  72.                                                 pN->m_pObjectsTree->FillShadowCastersList(false, pLight, pFr, pShadowHull, nRenderNodeFlags, passInfo);
  73.                                 }
  74.                         }
  75.                 }
  76.         }
  77.         else
  78.         {
  79.                 PodArray<CTerrainNode*>& lstCastingNodes = m_lstTmpCastingNodes;
  80.                 lstCastingNodes.Clear();
  81.  
  82.                 for (int nSID = 0; nSID < Get3DEngine()->m_pObjectsTree.Count(); nSID++)
  83.                         if (Get3DEngine()->IsSegmentSafeToUse(nSID))
  84.                                 Get3DEngine()->m_pObjectsTree[nSID]->FillShadowCastersList(false, pLight, pFr, pShadowHull, nRenderNodeFlags, passInfo);
  85.  
  86.                 // check also visareas effected by sun
  87.                 CVisAreaManager* pVisAreaManager = GetVisAreaManager();
  88.                 if (pVisAreaManager)
  89.                 {
  90.                         {
  91.                                 PodArray<CVisArea*>& lstAreas = pVisAreaManager->m_lstVisAreas;
  92.                                 for (int i = 0; i < lstAreas.Count(); i++)
  93.                                         if (lstAreas[i]->IsAffectedByOutLights() && lstAreas[i]->m_pObjectsTree)
  94.                                         {
  95.                                                 bool bUnused = false;
  96.                                                 if (pFr->IntersectAABB(*lstAreas[i]->GetAABBox(), &bUnused))
  97.                                                         if (!pShadowHull || IsAABBInsideHull(pShadowHull->GetElements(), pShadowHull->Count(), *lstAreas[i]->GetAABBox()))
  98.                                                                 lstAreas[i]->m_pObjectsTree->FillShadowCastersList(false, pLight, pFr, pShadowHull, nRenderNodeFlags, passInfo);
  99.                                         }
  100.                         }
  101.                         {
  102.                                 PodArray<CVisArea*>& lstAreas = pVisAreaManager->m_lstPortals;
  103.                                 for (int i = 0; i < lstAreas.Count(); i++)
  104.                                         if (lstAreas[i]->IsAffectedByOutLights() && lstAreas[i]->m_pObjectsTree)
  105.                                         {
  106.                                                 bool bUnused = false;
  107.                                                 if (pFr->IntersectAABB(*lstAreas[i]->GetAABBox(), &bUnused))
  108.                                                         if (!pShadowHull || IsAABBInsideHull(pShadowHull->GetElements(), pShadowHull->Count(), *lstAreas[i]->GetAABBox()))
  109.                                                                 lstAreas[i]->m_pObjectsTree->FillShadowCastersList(false, pLight, pFr, pShadowHull, nRenderNodeFlags, passInfo);
  110.                                         }
  111.                         }
  112.                 }
  113.  
  114.                 bool bNeedRenderTerrain = (GetTerrain() && Get3DEngine()->m_bSunShadowsFromTerrain && (pLight->m_Flags & DLF_SUN) != 0);
  115.  
  116.                 if (bNeedRenderTerrain && passInfo.RenderTerrain() && Get3DEngine()->m_bShowTerrainSurface)
  117.                 {
  118.                         // find all caster sectors
  119.                         GetTerrain()->IntersectWithShadowFrustum(&pFr->castersList, pFr, GetDefSID(), passInfo);
  120.                 }
  121.         }
  122.  
  123.         // add casters with per object shadow map for point lights
  124.         if ((pLight->m_Flags & DLF_SUN) == 0)
  125.         {
  126.                 for (uint i = 0; i < Get3DEngine()->m_lstPerObjectShadows.size(); ++i)
  127.                 {
  128.                         IShadowCaster* pCaster = Get3DEngine()->m_lstPerObjectShadows[i].pCaster;
  129.                         assert(pCaster);
  130.  
  131.                         AABB casterBox = pCaster->GetBBoxVirtual();
  132.  
  133.                         if (!IsRenderNodeTypeEnabled(pCaster->GetRenderNodeType()))
  134.                                 continue;
  135.  
  136.                         bool bObjCompletellyInFrustum = false;
  137.                         if (!pFr->IntersectAABB(casterBox, &bObjCompletellyInFrustum))
  138.                                 continue;
  139.  
  140.                         pFr->castersList.Add(pCaster);
  141.                 }
  142.         }
  143. }
  144.  
  145. int CObjManager::MakeStaticShadowCastersList(IRenderNode* pIgnoreNode, ShadowMapFrustum* pFrustum, const PodArray<struct SPlaneObject>* pShadowHull, int renderNodeExcludeFlags, int nMaxNodes, const SRenderingPassInfo& passInfo)
  146. {
  147.         int nRemainingNodes = nMaxNodes;
  148.  
  149.         int nNumTrees = Get3DEngine()->m_pObjectsTree.Count();
  150.         if (CVisAreaManager* pVisAreaManager = GetVisAreaManager())
  151.                 nNumTrees += pVisAreaManager->m_lstVisAreas.size() + pVisAreaManager->m_lstPortals.size();
  152.  
  153.         // objects tree first
  154.         int nStartSID = pFrustum->pShadowCacheData->mOctreePath[0];
  155.         for (int nSID = nStartSID; nSID < Get3DEngine()->m_pObjectsTree.Count(); nSID++)
  156.         {
  157.                 if (Get3DEngine()->IsSegmentSafeToUse(nSID))
  158.                         Get3DEngine()->m_pObjectsTree[nSID]->GetShadowCastersTimeSliced(pIgnoreNode, pFrustum, pShadowHull, renderNodeExcludeFlags, nRemainingNodes, 1, passInfo);
  159.  
  160.                 if (nRemainingNodes <= 0)
  161.                         return nRemainingNodes;
  162.  
  163.                 pFrustum->pShadowCacheData->mOctreePath[0]++;
  164.         }
  165.  
  166.         // Vis Areas
  167.         CVisAreaManager* pVisAreaManager = GetVisAreaManager();
  168.         if (pVisAreaManager)
  169.         {
  170.                 PodArray<CVisArea*>* lstAreaTypes[] =
  171.                 {
  172.                         &pVisAreaManager->m_lstVisAreas,
  173.                         &pVisAreaManager->m_lstPortals
  174.                 };
  175.  
  176.                 nStartSID = max(0, nStartSID - Get3DEngine()->m_pObjectsTree.Count());
  177.  
  178.                 const int nNumAreaTypes = CRY_ARRAY_COUNT(lstAreaTypes);
  179.                 for (int nAreaType = 0; nAreaType < nNumAreaTypes; ++nAreaType)
  180.                 {
  181.                         PodArray<CVisArea*>& lstAreas = *lstAreaTypes[nAreaType];
  182.  
  183.                         for (int i = nStartSID; i < lstAreas.Count(); i++)
  184.                         {
  185.                                 if (lstAreas[i]->IsAffectedByOutLights() && lstAreas[i]->m_pObjectsTree)
  186.                                 {
  187.                                         if (pFrustum->aabbCasters.IsReset() || Overlap::AABB_AABB(pFrustum->aabbCasters, *lstAreas[i]->GetAABBox()))
  188.                                                 lstAreas[i]->m_pObjectsTree->GetShadowCastersTimeSliced(pIgnoreNode, pFrustum, pShadowHull, renderNodeExcludeFlags, nRemainingNodes, 0, passInfo);
  189.                                 }
  190.  
  191.                                 if (nRemainingNodes <= 0)
  192.                                         return nRemainingNodes;
  193.  
  194.                                 pFrustum->pShadowCacheData->mOctreePath[0]++;
  195.                         }
  196.  
  197.                         nStartSID = max(0, nStartSID - lstAreas.Count());
  198.                 }
  199.         }
  200.  
  201.         // if we got here we processed every tree, so reset tree index
  202.         pFrustum->pShadowCacheData->mOctreePath[0] = 0;
  203.         return nRemainingNodes;
  204. }
  205.  
  206. uint64 CObjManager::GetShadowFrustumsList(PodArray<CDLight*>* pAffectingLights, const AABB& aabbReceiver,
  207.                                           float fObjDistance, uint32 nDLightMask, bool bIncludeNearFrustums,
  208.                                           const SRenderingPassInfo& passInfo)
  209. {
  210.         FUNCTION_PROFILER_3DENGINE;
  211.  
  212.         assert(passInfo.RenderShadows());
  213.  
  214.         if (!pAffectingLights || !pAffectingLights->Count())
  215.                 return 0;
  216.  
  217.         const int MAX_MASKED_GSM_LODS_NUM = 4;
  218.  
  219.         // calculate frustums list id
  220.         uint64 nCastersListId = 0;
  221.         int32 nSunID = 0;
  222.         uint32 nFrustums = 0;
  223.         if (bIncludeNearFrustums)
  224.                 for (int i = 0; i < 64 && i < pAffectingLights->Count(); i++)
  225.                 {
  226.                         CDLight* pLight = pAffectingLights->GetAt(i);
  227.  
  228.                         assert(pLight->m_Id < 64);
  229.  
  230.                         bool bSun = (pLight->m_Flags & DLF_SUN) != 0;
  231.  
  232.                         if ((pLight->m_Id >= 0) && (nDLightMask & (1 << pLight->m_Id)) && (pLight->m_Flags & DLF_CASTSHADOW_MAPS))
  233.                         {
  234.                                 if (CLightEntity::ShadowMapInfo* pSMI = ((CLightEntity*)pLight->m_pOwner)->m_pShadowMapInfo)
  235.                                 {
  236.                                         const int nLodCount = Get3DEngine()->GetShadowsCascadeCount(pLight);
  237.                                         for (int nLod = 0; nLod < nLodCount && nLod < MAX_MASKED_GSM_LODS_NUM && pSMI->pGSM[nLod]; nLod++)
  238.                                         {
  239.                                                 ShadowMapFrustum* pFr = pSMI->pGSM[nLod];
  240.                                                 if (pFr->castersList.Count())
  241.                                                 {
  242.                                                         // take GSM Lod's containing receiver bbox inside shadow frustum
  243.                                                         bool bUnused = false;
  244.                                                         if (pFr->IntersectAABB(aabbReceiver, &bUnused))
  245.                                                         {
  246.                                                                 if (bSun)
  247.                                                                 {
  248.                                                                         nSunID = pLight->m_Id;
  249.                                                                         nCastersListId |= (uint64(1) << nLod);
  250.                                                                 }
  251.                                                                 else
  252.                                                                         nCastersListId |= (uint64(1) << pLight->m_Id);
  253.                                                                 nFrustums++;
  254.                                                         }
  255.  
  256.                                                         // todo: if(nCull == CULL_INCLUSION) break;
  257.                                                 }
  258.                                         }
  259.                                 }
  260.                         }
  261.                 }
  262.         assert(nSunID == 0);
  263.  
  264.         if (!nCastersListId)
  265.                 return 0;
  266.  
  267.         assert(nCastersListId);
  268.         return nCastersListId;
  269. }
  270.  
downloadObjManShadows.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