BVB Source Codes

CRYENGINE Show ObjManDraw.cpp Source code

Return Download CRYENGINE: download ObjManDraw.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:   statobjmandraw.cpp
  5. //  Version:     v1.00
  6. //  Created:     28/5/2001 by Vladimir Kajalin
  7. //  Compilers:   Visual Studio.NET
  8. //  Description: Draw static objects (vegetations)
  9. // -------------------------------------------------------------------------
  10. //  History:
  11. //
  12. ////////////////////////////////////////////////////////////////////////////
  13.  
  14. #include "StdAfx.h"
  15.  
  16. #include "terrain.h"
  17. #include "StatObj.h"
  18. #include "ObjMan.h"
  19. #include "VisAreas.h"
  20. #include "terrain_sector.h"
  21. #include "3dEngine.h"
  22. #include "CCullThread.h"
  23.  
  24. bool CObjManager::IsBoxOccluded_HeightMap
  25. (
  26.   const AABB& objBox,
  27.   float fDistance,
  28.   EOcclusionObjectType eOcclusionObjectType,
  29.   OcclusionTestClient* pOcclTestVars,
  30.   const SRenderingPassInfo& passInfo
  31. )
  32. {
  33. #ifdef SUPP_HMAP_OCCL
  34.         // test occlusion by heightmap
  35.         FUNCTION_PROFILER_3DENGINE;
  36.  
  37.         assert(pOcclTestVars);
  38.  
  39.         const Vec3 vTopMax(objBox.max);
  40.         const Vec3 vTopMin(objBox.min.x, objBox.min.y, vTopMax.z);
  41.  
  42.         const int cMainID = passInfo.GetMainFrameID();
  43.  
  44.         //unlikely
  45.         const bool cBoxTooLarge = ((vTopMax.x - vTopMin.x) > 10000) | ((vTopMax.y - vTopMin.y) > 10000);
  46.         IF (cBoxTooLarge, false)
  47.         {
  48.                 pOcclTestVars->nLastOccludedMainFrameID = cMainID;
  49.                 pOcclTestVars->nTerrainOccLastFrame = 1;
  50.                 return true;
  51.         }
  52.  
  53.         const Vec3& vCamPos = passInfo.GetCamera().GetPosition();
  54.  
  55.         const bool cCamInsideBox = (vCamPos.x <= vTopMax.x) & (vCamPos.x >= vTopMin.x) & (vCamPos.y <= vTopMax.y) & (vCamPos.y >= vTopMin.y);
  56.         IF (cCamInsideBox, false)
  57.         {
  58.                 if ((eOcclusionObjectType != eoot_OCCLUDER && eOcclusionObjectType != eoot_OCCELL_OCCLUDER))
  59.                         pOcclTestVars->nLastVisibleMainFrameID = cMainID;
  60.                 pOcclTestVars->nTerrainOccLastFrame = 0;
  61.                 return false; // camera inside of box
  62.         }
  63.  
  64.         CVisAreaManager* pVisAreaManager = GetVisAreaManager();
  65.         int nMaxTestsToScip = (pVisAreaManager && pVisAreaManager->m_pCurPortal) ? 3 : 10000;
  66.  
  67.         // precision in meters for this object
  68.         float fMaxStep = fDistance * GetFloatCVar(e_TerrainOcclusionCullingPrecision);
  69.  
  70.         CTerrain* const pTerrain = GetTerrain();
  71.  
  72.         const float cTerrainOccPrecRatio = GetFloatCVar(e_TerrainOcclusionCullingPrecisionDistRatio);
  73.         if ((fMaxStep < (vTopMax.x - vTopMin.x) * cTerrainOccPrecRatio ||
  74.              fMaxStep < (vTopMax.y - vTopMin.y) * cTerrainOccPrecRatio) &&
  75.             objBox.min.x != objBox.max.x && objBox.min.y != objBox.max.y)
  76.         {
  77.                 float dx = (vTopMax.x - vTopMin.x);
  78.                 while (dx > fMaxStep)
  79.                         dx *= 0.5f;
  80.  
  81.                 float dy = (vTopMax.y - vTopMin.y);
  82.                 while (dy > fMaxStep)
  83.                         dy *= 0.5f;
  84.  
  85.                 dy = max(dy, 0.001f);
  86.                 dx = max(dx, 0.001f);
  87.  
  88.                 bool bCameraAbove = vCamPos.z > vTopMax.z;
  89.  
  90.                 if (bCameraAbove && eOcclusionObjectType != eoot_TERRAIN_NODE)
  91.                 {
  92.                         for (float y = vTopMin.y; y <= vTopMax.y; y += dy)
  93.                                 for (float x = vTopMin.x; x <= vTopMax.x; x += dx)
  94.                                         if (!pTerrain->IntersectWithHeightMap(vCamPos, Vec3(x, y, vTopMax.z), fDistance, nMaxTestsToScip, GetDefSID()))
  95.                                         {
  96.                                                 //handle post setup of call to IsBoxOccluded_HeightMap:
  97.                                                 if ((eOcclusionObjectType != eoot_OCCLUDER && eOcclusionObjectType != eoot_OCCELL_OCCLUDER))
  98.                                                         pOcclTestVars->nLastVisibleMainFrameID = cMainID;
  99.                                                 pOcclTestVars->nTerrainOccLastFrame = 0;
  100.                                                 return false;
  101.                                         }
  102.                 }
  103.                 else
  104.                 {
  105.                         // test only needed edges, note: there are duplicated checks on the corners
  106.  
  107.                         if ((vCamPos.x > vTopMin.x) == bCameraAbove) // test min x side
  108.                                 for (float y = vTopMin.y; y <= vTopMax.y; y += dy)
  109.                                         if (!pTerrain->IntersectWithHeightMap(vCamPos, Vec3(vTopMin.x, y, vTopMax.z), fDistance, nMaxTestsToScip, GetDefSID()))
  110.                                         {
  111.                                                 //handle post setup of call to IsBoxOccluded_HeightMap:
  112.                                                 if ((eOcclusionObjectType != eoot_OCCLUDER && eOcclusionObjectType != eoot_OCCELL_OCCLUDER))
  113.                                                         pOcclTestVars->nLastVisibleMainFrameID = cMainID;
  114.                                                 pOcclTestVars->nTerrainOccLastFrame = 0;
  115.                                                 return false;
  116.                                         }
  117.  
  118.                         if ((vCamPos.x < vTopMax.x) == bCameraAbove) // test max x side
  119.                                 for (float y = vTopMax.y; y >= vTopMin.y; y -= dy)
  120.                                         if (!pTerrain->IntersectWithHeightMap(vCamPos, Vec3(vTopMax.x, y, vTopMax.z), fDistance, nMaxTestsToScip, GetDefSID()))
  121.                                         {
  122.                                                 //handle post setup of call to IsBoxOccluded_HeightMap:
  123.                                                 if ((eOcclusionObjectType != eoot_OCCLUDER && eOcclusionObjectType != eoot_OCCELL_OCCLUDER))
  124.                                                         pOcclTestVars->nLastVisibleMainFrameID = cMainID;
  125.                                                 pOcclTestVars->nTerrainOccLastFrame = 0;
  126.                                                 return false;
  127.                                         }
  128.  
  129.                         if ((vCamPos.y > vTopMin.y) == bCameraAbove) // test min y side
  130.                                 for (float x = vTopMax.x; x >= vTopMin.x; x -= dx)
  131.                                         if (!pTerrain->IntersectWithHeightMap(vCamPos, Vec3(x, vTopMin.y, vTopMax.z), fDistance, nMaxTestsToScip, GetDefSID()))
  132.                                         {
  133.                                                 //handle post setup of call to IsBoxOccluded_HeightMap:
  134.                                                 if ((eOcclusionObjectType != eoot_OCCLUDER && eOcclusionObjectType != eoot_OCCELL_OCCLUDER))
  135.                                                         pOcclTestVars->nLastVisibleMainFrameID = cMainID;
  136.                                                 pOcclTestVars->nTerrainOccLastFrame = 0;
  137.                                                 return false;
  138.                                         }
  139.  
  140.                         if ((vCamPos.y < vTopMax.y) == bCameraAbove) // test max y side
  141.                                 for (float x = vTopMin.x; x <= vTopMax.x; x += dx)
  142.                                         if (!pTerrain->IntersectWithHeightMap(vCamPos, Vec3(x, vTopMax.y, vTopMax.z), fDistance, nMaxTestsToScip, GetDefSID()))
  143.                                         {
  144.                                                 //handle post setup of call to IsBoxOccluded_HeightMap:
  145.                                                 if ((eOcclusionObjectType != eoot_OCCLUDER && eOcclusionObjectType != eoot_OCCELL_OCCLUDER))
  146.                                                         pOcclTestVars->nLastVisibleMainFrameID = cMainID;
  147.                                                 pOcclTestVars->nTerrainOccLastFrame = 0;
  148.                                                 return false;
  149.                                         }
  150.                 }
  151.                 pOcclTestVars->nLastOccludedMainFrameID = cMainID;
  152.                 pOcclTestVars->nTerrainOccLastFrame = 1;
  153.                 return true;
  154.         }
  155.         else
  156.         {
  157.                 Vec3 vTopMid = (vTopMin + vTopMax) * 0.5f;
  158.                 if (pTerrain && pTerrain->IntersectWithHeightMap(vCamPos, vTopMid, fDistance, nMaxTestsToScip, GetDefSID()))
  159.                 {
  160.                         pOcclTestVars->nLastOccludedMainFrameID = cMainID;
  161.                         pOcclTestVars->nTerrainOccLastFrame = 1;
  162.                         return true;
  163.                 }
  164.         }
  165.         //handle post setup of call to IsBoxOccluded_HeightMap:
  166.         if ((eOcclusionObjectType != eoot_OCCLUDER && eOcclusionObjectType != eoot_OCCELL_OCCLUDER))
  167.                 pOcclTestVars->nLastVisibleMainFrameID = cMainID;
  168.         pOcclTestVars->nTerrainOccLastFrame = 0;
  169. #endif
  170.         return false;
  171. }
  172.  
downloadObjManDraw.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