BVB Source Codes

CRYENGINE Show ObjManCullQueue.cpp Source code

Return Download CRYENGINE: download ObjManCullQueue.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:   objmancullqueue.cpp
  5. //  Version:     v1.00
  6. //  Created:     2/12/2009 by Michael Glueck
  7. //  Compilers:   Visual Studio.NET
  8. //  Description: Implementation for asynchronous obj-culling queue
  9. // -------------------------------------------------------------------------
  10. //  History:
  11. //
  12. ////////////////////////////////////////////////////////////////////////////
  13.  
  14. #include "StdAfx.h"
  15. #include "PolygonClipContext.h"
  16. #include "ObjManCullQueue.h"
  17. #include "CCullThread.h"
  18. #include <CryThreading/IJobManager_JobDelegator.h>
  19.  
  20. #if defined(USE_CULL_QUEUE)
  21.         #define CULL_QUEUE_USE_JOB 1
  22. #else
  23.         #define CULL_QUEUE_USE_JOB 0
  24. #endif
  25.  
  26. #if CULL_QUEUE_USE_JOB
  27. DECLARE_JOB("IsBoxOccluded", TBoxOccludedJob, NCullQueue::SCullQueue::ProcessInternal);
  28. JobManager::SJobState g_OcclJobState;
  29. #endif
  30.  
  31. NCullQueue::SCullQueue::SCullQueue()
  32.         : cullBufWriteHeadIndex(0)
  33.         , cullBufReadHeadIndex(0)
  34.         , m_TestItemQueueReady(false)
  35.         , m_BufferAndCameraReady(false)
  36.         , m_MainFrameID(0)
  37.         , m_pCam(NULL)
  38. {
  39.         memset(cullItemBuf, 0, sizeof(cullItemBuf));
  40. }
  41.  
  42. void NCullQueue::SCullQueue::FinishedFillingTestItemQueue()
  43. {
  44. #ifdef USE_CULL_QUEUE
  45.         assert(gEnv->IsEditor() || m_TestItemQueueReady == false);
  46.         m_TestItemQueueReady = true;
  47.         if (m_BufferAndCameraReady == true)
  48.         {
  49.                 //If both sets of data are ready, begin the test.
  50.                 Process();
  51.         }
  52. #endif
  53. }
  54.  
  55. void NCullQueue::SCullQueue::SetTestParams(uint32 mainFrameID, const CCamera* pCam)
  56. {
  57.         m_MainFrameID = mainFrameID;
  58.         m_pCam = pCam;
  59.         assert(gEnv->IsEditor() || m_BufferAndCameraReady == false);
  60.         m_BufferAndCameraReady = true;
  61.         if (m_TestItemQueueReady == true)
  62.         {
  63.                 //If both sets of data are ready, begin the test.
  64.                 Process();
  65.         }
  66. }
  67.  
  68. void NCullQueue::SCullQueue::Process()
  69. {
  70. #ifdef USE_CULL_QUEUE
  71.         FUNCTION_PROFILER_3DENGINE;
  72.  
  73.         TBoxOccludedJob job(m_MainFrameID, (CZBufferCuller*)m_pCullBuffer, m_pCam);
  74.         job.SetClassInstance(this);
  75.         job.RegisterJobState(&g_OcclJobState);
  76.         job.Run();
  77. #endif //USE_CULL_QUEUE
  78. }
  79.  
  80. NCullQueue::SCullQueue::~SCullQueue()
  81. {
  82. }
  83.  
  84. void NCullQueue::SCullQueue::Wait()
  85. {
  86.         FUNCTION_PROFILER_3DENGINE;
  87.  
  88. #ifdef USE_CULL_QUEUE
  89.         gEnv->GetJobManager()->WaitForJob(g_OcclJobState, 300);
  90.  
  91.         cullBufWriteHeadIndex = 0;
  92.         cullBufReadHeadIndex = 0;
  93. #endif
  94. }
  95.  
  96. void NCullQueue::SCullQueue::ProcessInternal(uint32 mainFrameID, CZBufferCuller* const pCullBuffer, const CCamera* const pCam)
  97. {
  98. #ifdef USE_CULL_QUEUE
  99.         CZBufferCuller& cullBuffer = *(CZBufferCuller*)pCullBuffer;
  100.         #define localQueue (*this)
  101.         #define localCam   (*pCam)
  102.  
  103.         cullBuffer.BeginFrame(localCam);
  104.  
  105.         //FeedbackLoop:
  106.  
  107.         {
  108.                 const SCullItem* const cEnd = &localQueue.cullItemBuf[localQueue.cullBufWriteHeadIndex];
  109.                 for (uint16 a = 1, b = 0; b < 4; a <<= 1, b++)//traverse through all 4 occlusion buffers
  110.                 {
  111.                         cullBuffer.ReloadBuffer(b);
  112.                         for (SCullItem* it = &localQueue.cullItemBuf[localQueue.cullBufReadHeadIndex]; it != cEnd; ++it)
  113.                         {
  114.                                 SCullItem& rItem = *it;
  115.                                 IF (!(rItem.BufferID & a), 1)
  116.                                         continue;
  117.  
  118.                                 IF ((rItem.BufferID & 1), 0)  //zbuffer
  119.                                 {
  120.                                         if (!cullBuffer.IsObjectVisible(rItem.objBox, eoot_OBJECT, 0.f, &rItem.pOcclTestVars->nLastOccludedMainFrameID))
  121.                                                 rItem.pOcclTestVars->nLastOccludedMainFrameID = mainFrameID;
  122.                                         else
  123.                                                 rItem.pOcclTestVars->nLastVisibleMainFrameID = mainFrameID;
  124.                                 }
  125.                                 else  //shadow buffer
  126.                                 if (rItem.pOcclTestVars->nLastNoShadowCastMainFrameID != mainFrameID)
  127.                                 {
  128.                                         if (cullBuffer.IsObjectVisible(rItem.objBox, eoot_OBJECT, 0.f, &rItem.pOcclTestVars->nLastOccludedMainFrameID))
  129.                                                 rItem.pOcclTestVars->nLastShadowCastMainFrameID = mainFrameID;
  130.                                 }
  131.                         }
  132.                 }
  133.  
  134.                 localQueue.cullBufReadHeadIndex = (cEnd - localQueue.cullItemBuf);
  135.  
  136.                 //if not visible, set occluded
  137.                 for (SCullItem* it = localQueue.cullItemBuf; it != cEnd; ++it)
  138.                 {
  139.                         SCullItem& rItem = *it;
  140.                         IF ((rItem.BufferID & 6) & (rItem.pOcclTestVars->nLastNoShadowCastMainFrameID != mainFrameID), 1)
  141.                                 rItem.pOcclTestVars->nLastShadowCastMainFrameID = mainFrameID;
  142.                 }
  143.  
  144.         }
  145.  
  146. #endif
  147. #undef localQueue
  148. #undef localCam
  149. }
  150.  
downloadObjManCullQueue.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