#include "OgreOcclusionCullingTerrainSceneManager.h" #include "OgreMath.h" #include "OgreIteratorWrappers.h" #include "OgreRenderSystem.h" #include "OgreCamera.h" #include "OgreHardwareOcclusionQuery.h" //#include "OgreWireBoundingBox.h" #include "OgreSolidHalfBoundingBox.h" #include namespace Ogre { //----------------------------------------------------------------------- OcclusionCullingTerrainSceneManager::OcclusionCullingTerrainSceneManager() { mOcclusionCullingTerrainSceneTraverser = new OcclusionCullingTerrainSceneTraverser(this, mDestRenderSystem); //mDisplayNodes = true; //mShowBoundingBoxes = true; mShowBoxes = true; //mMaxDepth = 20; } //----------------------------------------------------------------------- OcclusionCullingTerrainSceneManager::~OcclusionCullingTerrainSceneManager() { delete mOcclusionCullingTerrainSceneTraverser; } //----------------------------------------------------------------------- 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); mOcclusionCullingTerrainSceneTraverser->setSceneRoot(mOctree); mOcclusionCullingTerrainSceneTraverser->renderScene(mCameraInProgress); _deleteRenderedQueueGroups(); //-- render overlay clearSpecialCaseRenderQueues(); SceneManager::_renderVisibleObjects( ); clearSpecialCaseRenderQueues(); } //----------------------------------------------------------------------- void OcclusionCullingTerrainSceneManager::_findVisibleObjects(Camera* cam, bool onlyShadowCasters) { // must be empty because objects are found and rendered in an interleaved fashion // in _renderVisibibleObjects //char *msg = "now finding visible objects\n"; OutputDebugString(msg); } //----------------------------------------------------------------------- void OcclusionCullingTerrainSceneManager::_updateSceneGraph(Camera* cam) { //char *msg = "now updating scenegraph\n"; OutputDebugString(msg); mOcclusionCullingTerrainSceneTraverser->setNumSceneNodes((int)mSceneNodes.size()); mOcclusionCullingTerrainSceneTraverser->setRenderSystem(mDestRenderSystem); //mOcclusionCullingTerrainSceneTraverser->preprocess(); mOcclusionCullingTerrainSceneTraverser->setNumOctreeNodes(mNumOctreeNodes); TerrainSceneManager::_updateSceneGraph(cam); } //----------------------------------------------------------------------- bool OcclusionCullingTerrainSceneManager::setOption( const String & key, const void * val ) { return mOcclusionCullingTerrainSceneTraverser->setOption( key, val) || TerrainSceneManager::setOption( key, val ); } //----------------------------------------------------------------------- bool OcclusionCullingTerrainSceneManager::getOption( const String & key, void *val ) { return mOcclusionCullingTerrainSceneTraverser->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 mOcclusionCullingTerrainSceneTraverser->getOptionKeys ( refKeys ) || TerrainSceneManager::getOptionKeys( refKeys ); } //----------------------------------------------------------------------- void OcclusionCullingTerrainSceneManager::_renderOctant(Camera *cam, Octree *octant) { //Add stuff to be rendered; NodeList::iterator it = octant->mNodes.begin(); while ( it != octant->mNodes.end() ) { OctreeNode *sn = *it; mNumObjects++; // check bounding box visibility of scene nodes if( cam->isVisible( sn->_getWorldAABB() ) ) { sn->_addToRenderQueue(cam, getRenderQueue(), false ); //node->_findVisibleObjects(cam, getRenderQueue(), false, mDisplayNodes, false); mVisible.push_back( sn ); if ( mDisplayNodes ) getRenderQueue()->addRenderable( sn ); // check if the scene manager or this node wants the bounding box shown. if (sn->getShowBoundingBox() || mShowBoundingBoxes) sn->_addBoundingBoxToQueue(getRenderQueue()); if ( mShowBoxes ) getRenderQueue()->addRenderable(octant->getWireBoundingBox()); } ++it; } SceneManager::_renderVisibleObjects(); // delete all rendered objects from renderqueue _deleteRenderedQueueGroups(); } //----------------------------------------------------------------------- /*unsigned int OcclusionCullingTerrainSceneManager::countNumOctrees(Octree *root) { unsigned int result = 1; for(int i=0; i<8; ++i) { Octree *nextChild = root->mChildren[(i & 4) >> 2][(i & 2) >> 1][i & 1]; if(nextChild != 0) result += countNumOctrees(nextChild); } return result; }*/ }