#include "OgreOcclusionCullingTerrainSceneManager.h" #include "OgreMath.h" #include "OgreIteratorWrappers.h" #include "OgreRenderSystem.h" #include "OgreCamera.h" #include "OgreHardwareOcclusionQuery.h" #include "OgreSolidHalfBoundingBox.h" #include namespace Ogre { //----------------------------------------------------------------------- OcclusionCullingTerrainSceneManager::OcclusionCullingTerrainSceneManager() { mOcclusionCullingOctreeSceneTraverser = new OcclusionCullingOctreeSceneTraverser(this, mDestRenderSystem); //mShowBoxes = true; //mDisplayNodes = true; //mShowBoundingBoxes = true; mMaxDepth = 20; } //----------------------------------------------------------------------- OcclusionCullingTerrainSceneManager::~OcclusionCullingTerrainSceneManager() { delete mOcclusionCullingOctreeSceneTraverser; } //----------------------------------------------------------------------- void OcclusionCullingTerrainSceneManager::_renderVisibleObjects(void) { //-- render background clearSpecialCaseRenderQueues(); addSpecialCaseRenderQueue(RENDER_QUEUE_BACKGROUND); addSpecialCaseRenderQueue(RENDER_QUEUE_SKIES_EARLY); setSpecialCaseRenderQueueMode(SceneManager::SCRQM_INCLUDE); SceneManager::_renderVisibleObjects(); _deleteRenderedQueueGroups(); //-- render visible objects (i.e., all but overlay) clearSpecialCaseRenderQueues(); addSpecialCaseRenderQueue(RENDER_QUEUE_OVERLAY); setSpecialCaseRenderQueueMode(SceneManager::SCRQM_EXCLUDE); mOcclusionCullingOctreeSceneTraverser->setSceneRoot(mOctree); mOcclusionCullingOctreeSceneTraverser->renderScene(mCameraInProgress); _deleteRenderedQueueGroups(); //-- render overlay clearSpecialCaseRenderQueues(); SceneManager::_renderVisibleObjects( ); } //----------------------------------------------------------------------- void OcclusionCullingTerrainSceneManager::_findVisibleObjects(Camera* cam, bool onlyShadowCasters) { // must be empty because objects are found and rendered in an interleaved fashion // in _renderVisibibleObjects } //----------------------------------------------------------------------- void OcclusionCullingTerrainSceneManager::_updateSceneGraph(Camera* cam) { mOcclusionCullingOctreeSceneTraverser->setNumSceneNodes((int)mSceneNodes.size()); mOcclusionCullingOctreeSceneTraverser->setRenderSystem(mDestRenderSystem); mOcclusionCullingOctreeSceneTraverser->setNumOctreeNodes(mNumOctreeNodes); TerrainSceneManager::_updateSceneGraph(cam); } //----------------------------------------------------------------------- bool OcclusionCullingTerrainSceneManager::setOption( const String & key, const void * val ) { return mOcclusionCullingOctreeSceneTraverser->setOption( key, val) || TerrainSceneManager::setOption( key, val ); } //----------------------------------------------------------------------- bool OcclusionCullingTerrainSceneManager::getOption( const String & key, void *val ) { return mOcclusionCullingOctreeSceneTraverser->getOption( key, val) || TerrainSceneManager::getOption( key, val ) ; } //----------------------------------------------------------------------- bool OcclusionCullingTerrainSceneManager::getOptionValues( const String & key, StringVector &refValueList ) { return TerrainSceneManager::getOptionValues( key, refValueList ); } //----------------------------------------------------------------------- bool OcclusionCullingTerrainSceneManager::getOptionKeys( StringVector & refKeys ) { return mOcclusionCullingOctreeSceneTraverser->getOptionKeys ( refKeys ) || TerrainSceneManager::getOptionKeys( refKeys ); } //----------------------------------------------------------------------- }