Ignore:
Timestamp:
03/24/05 18:00:59 (19 years ago)
Author:
gametools
Message:
 
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/VUT/OcclusionCullingSceneManager/src/OgreOcclusionCullingSceneManager.cpp

    r29 r30  
    1515        OcclusionCullingSceneManager::OcclusionCullingSceneManager():  
    1616        mFrameId(1), mDistanceQueue(NULL), mVisibilityThreshold(0), mCurrentTestIdx(0), 
    17         mQueryMode(MODE_RENDER), mNumSceneNodes(0), mCurrentAlgorithm(RENDER_COHERENT) 
     17        mQueryMode(MODE_RENDER), mNumSceneNodes(0), mCurrentAlgorithm(RENDER_COHERENT), 
     18        mNumTraversedNodes(0), mNumQueryCulledNodes(0), mNumFrustumCulledNodes(0), mNumRenderedGeometry(0) 
    1819        {                
    1920                mHalfBoundingBox[0] = mHalfBoundingBox[1] = 0; 
     
    3637        void OcclusionCullingSceneManager::_renderVisibleObjects(void) 
    3738        { 
     39                mNumTraversedNodes = 0; 
     40                mNumQueryCulledNodes = 0; 
     41                mNumFrustumCulledNodes = 0; 
     42                mNumRenderedGeometry = 0; 
     43                 
    3844                mDistanceQueue = new PriorityQueue(myless<SceneNode *>(mCameraInProgress)); 
    39                  
    4045                mDistanceQueue->push(mSceneRoot); 
    41  
    4246                mCurrentTestIdx = 0; 
    43  
    4447                //renderZPass(); 
    4548 
     
    6265                delete mDistanceQueue; 
    6366 
    64                 /*mDestRenderSystem->_setDepthBufferParams(true, false, CMPF_LESS); 
    65                   SceneManager::_renderVisibleObjects(); 
    66                   mDestRenderSystem->_setDepthBufferParams(); 
    67           mDistanceQueue.push(mSceneRoot); 
    68                   Preprocess(); 
    69                   //ResetQueries(); 
    70                 */ 
    71                  
    7267                mFrameId ++; 
    7368        } 
     
    10297                                        traverseNode(node); 
    10398                                } 
     99                                else 
     100                                { 
     101                                        mNumQueryCulledNodes ++; 
     102                                } 
    104103                        }        
    105104 
     
    108107                        { 
    109108                                SceneNode *node = mDistanceQueue->top(); 
    110  
    111109                                mDistanceQueue->pop(); 
    112110         
     
    134132                                        // always traverse a node if it was visible 
    135133                                        if(wasVisible) 
     134                                        { 
    136135                                                traverseNode(node); 
     136                                        } 
     137                                } 
     138                                else 
     139                                { 
     140                                        mNumFrustumCulledNodes ++; 
    137141                                } 
    138142                        } 
     
    157161                                traverseNode(node); 
    158162                        } 
     163                        else 
     164                        {                        
     165                                mNumFrustumCulledNodes ++; 
     166                        } 
    159167                } 
    160168        }        
     
    179187                                query->pullOcclusionQuery(&visiblePixels); 
    180188                                 
    181                                 //char str[100]; sprintf(str, "number: %d, id: %d", (int)visiblePixels, mCurrentTestIdx); 
    182                                 //MessageBox( NULL, str, "this is my plugin", MB_OK | MB_ICONERROR | MB_TASKMODAL); 
    183  
    184189                                // node visible 
    185190                                if(visiblePixels > mVisibilityThreshold) 
     
    187192                                        traverseNode(node); 
    188193                                } 
    189                         }                                        
     194                                else 
     195                                { 
     196                                        mNumQueryCulledNodes ++; 
     197                                } 
     198                        } 
     199                        else 
     200                        { 
     201                                mNumFrustumCulledNodes ++; 
     202                        } 
    190203                } 
    191204        } 
     
    203216                /* 
    204217                static RenderOperation ro; 
    205  
    206                 // Issue view / projection changes if any 
    207218                useRenderableViewProjMode(&box); 
    208  
    209219                box.getRenderOperation(ro); 
    210220                ro.srcRenderable = &box;  
     
    237247        void OcclusionCullingSceneManager::traverseNode(SceneNode *node) 
    238248        { 
    239                 if(isLeaf(node)) 
     249                mNumTraversedNodes ++; 
     250 
     251                if(node->numAttachedObjects() > 0) 
    240252                { 
    241253                        render(node); 
    242254                } 
    243                 else // internal node: add children to priority queue for further processing 
    244                 { 
    245                         Node::ChildNodeIterator it = node->getChildIterator(); 
     255 
     256                // internal node: add children to priority queue for further processing 
     257                Node::ChildNodeIterator it = node->getChildIterator(); 
    246258                                         
    247                         while (it.hasMoreElements()) 
    248                         {  
    249                                 SceneNode* sceneChild = static_cast<SceneNode*>(it.getNext()); 
    250                                 mDistanceQueue->push(sceneChild); 
    251                         } 
    252                  } 
     259                while (it.hasMoreElements())                     
     260                {  
     261                        SceneNode* sceneChild = static_cast<SceneNode*>(it.getNext()); 
     262                        mDistanceQueue->push(sceneChild); 
     263                } 
    253264        } 
    254265        //----------------------------------------------------------------------- 
    255266        void OcclusionCullingSceneManager::render(SceneNode *node) 
    256267        { 
    257                 //setRenderingMode(MODE_RENDER); 
    258                 //MessageBox( NULL, "harhar", "this is my plugin", MB_OK | MB_ICONERROR | MB_TASKMODAL); 
     268                setRenderingMode(MODE_RENDER); 
     269                 
    259270                //HACK (too slow) 
    260271                node->_findVisibleObjects(mCameraInProgress, getRenderQueue(), false,  
     
    266277        void OcclusionCullingSceneManager::_updateSceneGraph(Camera* cam) 
    267278        { 
    268                 int numnodes = countSceneNodes(mSceneRoot); 
    269                  
     279                unsigned int numnodes = countSceneNodes(mSceneRoot); 
     280         
    270281                //-- initialise occlusion queries. 
    271282                if(numnodes != mNumSceneNodes) 
    272283                { 
    273284                        deleteQueries(); 
     285                         
    274286                        mNumSceneNodes = numnodes; 
    275287 
    276288                        for(unsigned int i=0; i < mNumSceneNodes; i++) 
    277289                        { 
    278                                 HardwareOcclusionQuery *hw = mDestRenderSystem->createHardwareOcclusionQuery(); 
    279                                 mOcclusionQueries.push_back(hw); 
    280                         } 
     290                                mOcclusionQueries.push_back(mDestRenderSystem->createHardwareOcclusionQuery()); 
     291                        }        
    281292                } 
    282293 
     
    284295        } 
    285296        //----------------------------------------------------------------------- 
    286         int OcclusionCullingSceneManager::countSceneNodes(SceneNode *node) 
    287         { 
    288                 int num = 1; 
    289                 if(isLeaf(node)) 
    290                 { 
    291                         return num; 
    292                 } 
    293  
     297        unsigned int OcclusionCullingSceneManager::countSceneNodes(SceneNode *node) 
     298        { 
     299                unsigned int result = 1; 
     300                 
    294301                Node::ChildNodeIterator it = node->getChildIterator(); 
    295302                 
     
    297304                {  
    298305                        SceneNode* sceneChild = static_cast<SceneNode*>(it.getNext()); 
    299                         num += countSceneNodes(sceneChild); 
     306                        result += countSceneNodes(sceneChild); 
    300307        } 
    301308 
    302                 return num; 
    303         } 
    304         //----------------------------------------------------------------------- 
    305         int OcclusionCullingSceneManager::isLeaf(SceneNode *node) 
     309                return result; 
     310        } 
     311        //----------------------------------------------------------------------- 
     312        bool OcclusionCullingSceneManager::isLeaf(SceneNode *node) 
    306313        { 
    307314                return (node->numChildren() == 0); 
     
    353360                        return true; 
    354361                } 
    355          
     362                if ( key == "Threshold" ) 
     363                { 
     364                        mCurrentAlgorithm = * static_cast < const int * > ( val ); 
     365                        return true; 
     366                } 
     367                 
    356368                return SceneManager::setOption( key, val ); 
    357369        } 
     
    362374                { 
    363375                        * static_cast < int * > ( val ) = mCurrentAlgorithm; 
     376                        return true; 
     377                } 
     378                if ( key == "Threshold" ) 
     379                { 
     380                        * static_cast < int * > ( val ) = mVisibilityThreshold; 
     381                        return true; 
     382                } 
     383                if ( key == "NumSceneNodes" ) 
     384                { 
     385                        * static_cast < unsigned int * > ( val ) = mNumSceneNodes; 
     386                        return true; 
     387                } 
     388                if ( key == "NumTraversedNodes" ) 
     389                { 
     390                        * static_cast < unsigned int * > ( val ) = mNumTraversedNodes; 
     391                        return true; 
     392                } 
     393                if ( key == "NumQueryCulledNodes" ) 
     394                { 
     395                        * static_cast < unsigned int * > ( val ) = mNumQueryCulledNodes; 
     396                        return true; 
     397                } 
     398                if ( key == "NumFrustumCulledNodes" ) 
     399                { 
     400                        * static_cast < unsigned int * > ( val ) = mNumFrustumCulledNodes; 
    364401                        return true; 
    365402                } 
     
    377414                SceneManager::getOptionKeys( refKeys ); 
    378415                refKeys.push_back( "Algorithm" ); 
    379          
     416                refKeys.push_back( "Threshold" ); 
     417                refKeys.push_back( "NumSceneNodes" ); 
     418                refKeys.push_back( "NumTraversedNodes" ); 
     419                refKeys.push_back( "NumQueryCulledNodes" ); 
     420                refKeys.push_back( "NumFrustumCulledNodes" ); 
     421                //refKeys.push_back( "mNumRenderedGeometry" ); 
    380422                return true; 
    381423        } 
Note: See TracChangeset for help on using the changeset viewer.