Ignore:
Timestamp:
03/22/05 14:51:26 (19 years ago)
Author:
gametools
Message:
 
Location:
trunk/VUT/OcclusionCullingSceneManager/src
Files:
1 added
1 deleted
1 edited

Legend:

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

    r24 r26  
    66#include "OgreHardwareOcclusionQuery.h" 
    77//#include "OgreWireBoundingBox.h" 
    8 #include "OgreSolidBoundingBox.h" 
     8#include "OgreSolidHalfBoundingBox.h" 
    99 
    1010#include <windows.h> 
     
    1515        OcclusionCullingSceneManager::OcclusionCullingSceneManager():  
    1616        mFrameId(1), mDistanceQueue(NULL), mVisibilityThreshold(0), mCurrentTestIdx(0), 
    17         mQueryMode(MODE_RENDER), mNumSceneNodes(0) 
     17        mQueryMode(MODE_RENDER), mNumSceneNodes(0), mAlgorithmType(RENDER_COHERENT) 
    1818        {                
     19                mHalfBoundingBox[0] = mHalfBoundingBox[1] = 0; 
    1920        } 
    2021        //----------------------------------------------------------------------- 
     
    2627        OcclusionCullingSceneManager::~OcclusionCullingSceneManager() 
    2728        {                
     29                delete mHalfBoundingBox[0]; 
     30                delete mHalfBoundingBox[1]; 
     31 
    2832                deleteQueries(); 
    2933                //SceneManager::~SceneManager(); 
     
    3741 
    3842                mCurrentTestIdx = 0; 
     43 
    3944                //renderZPass(); 
    40                 //renderCullFrustum(); 
    41                 //renderCoherentWithQueue(); 
    42                 renderStopAndWait(); 
     45 
     46                switch(mAlgorithmType) 
     47                { 
     48                        case RENDER_CULL_FRUSTUM: 
     49                                renderCullFrustum(); 
     50                        break; 
     51                        case RENDER_STOP_AND_WAIT: 
     52                                renderStopAndWait(); 
     53                                break; 
     54                        case RENDER_COHERENT: 
     55                                renderCoherentWithQueue(); 
     56                                break; 
     57                        default: 
     58                                renderCullFrustum(); 
     59                                break; 
     60                }        
     61                 
    4362                delete mDistanceQueue; 
    4463 
     
    6786                { 
    6887                        while(!queryQueue.empty() &&  
    69                                   (queryQueue.front()->getOcclusionQuery()->resultAvailable() || mDistanceQueue->empty())) 
    70                         { 
    71                                 SceneNode *node = queryQueue.front(); 
     88                                  ((queryQueue.front().second)->resultAvailable() || mDistanceQueue->empty())) 
     89                        { 
     90                                SceneNode *node = queryQueue.front().first; 
     91                                HardwareOcclusionQuery *query = queryQueue.front().second; 
     92 
    7293                                queryQueue.pop(); 
    7394                         
    7495                                // wait until result available 
    7596                                unsigned int visiblePixels; 
    76                                 node->getOcclusionQuery()->pullOcclusionQuery(&visiblePixels); 
     97                                query->pullOcclusionQuery(&visiblePixels); 
    7798 
    7899                                if(visiblePixels > mVisibilityThreshold) 
     
    99120 
    100121                                        // reset node's visibility classification  
    101                                         node->setVisible(false); 
     122                                        node->setNodeVisible(false); 
    102123 
    103124                                        // update node's visited flag 
     
    107128                                        if(leafOrWasInvisible) 
    108129                                        { 
    109                                                 issueOcclusionQuery(node, wasVisible); 
    110                                                 queryQueue.push(node); 
     130                                                HardwareOcclusionQuery *query = issueOcclusionQuery(node, wasVisible); 
     131                                                queryQueue.push(query_pair(node, query)); 
    111132                                        } 
    112133                                         
     
    126147                        mDistanceQueue->pop(); 
    127148         
    128                         // interesting for the visualization, so rest and set 
    129                         //node->SetVisible(false); 
     149                        // interesting for visualization purpose 
     150                        node->setNodeVisible(false); 
    130151                                 
    131152                        if(mCameraInProgress->isVisible(node->_getWorldAABB())) 
    132153                        { 
    133                                 // update node's visited flag => needed for rendering 
    134                                 // so set it also here 
    135                                 //node->SetLastVisited(mFrameID); 
    136                                 //node->SetVisible(true); 
     154                                // update node's visited flag  
     155                                node->setLastVisited(mFrameId); 
     156                                node->setNodeVisible(true); 
    137157                                traverseNode(node); 
    138158                        } 
     
    148168                 
    149169                        // interesting for the visualization 
    150                         //node->SetVisible(false); 
     170                        node->setNodeVisible(false); 
    151171                        node->setLastVisited(mFrameId); 
    152172 
    153173                        if(mCameraInProgress->isVisible(node->_getWorldAABB())) 
    154174                        { 
    155                                 issueOcclusionQuery(node, false); 
     175                                HardwareOcclusionQuery *query = issueOcclusionQuery(node, false); 
    156176                                 
    157177                                unsigned int visiblePixels; 
    158178                                // wait if result not available 
    159                                 node->getOcclusionQuery()->pullOcclusionQuery(&visiblePixels); 
     179                                query->pullOcclusionQuery(&visiblePixels); 
    160180                                 
    161181                                //char str[100]; sprintf(str, "number: %d, id: %d", (int)visiblePixels, mCurrentTestIdx); 
     
    171191        } 
    172192        //----------------------------------------------------------------------- 
    173         void OcclusionCullingSceneManager::issueOcclusionQuery(SceneNode *node, bool wasVisible) 
     193        HardwareOcclusionQuery *OcclusionCullingSceneManager::issueOcclusionQuery(SceneNode *node, bool wasVisible) 
    174194        { 
    175195                // change state so the bounding box gets not actually rendered on the screen 
     
    178198                // get next available test id 
    179199                HardwareOcclusionQuery *query = mOcclusionQueries[mCurrentTestIdx++]; 
    180                 node->setOcclusionQuery(query); 
    181  
     200                 
    182201                query->beginOcclusionQuery(); 
    183202                 
    184                 SolidBoundingBox boxHalf[2]; 
    185                 boxHalf[1].mIsFirstHalf = false; 
    186  
    187203                /* 
    188204                static RenderOperation ro; 
     
    193209                box.getRenderOperation(ro); 
    194210                ro.srcRenderable = &box;  
    195                 mDestRenderSystem->_render(ro);*/ 
    196                 for(int i = 0; i < 2; i++) 
    197                 { 
    198                         boxHalf[i].setupBoundingBox(node->_getWorldAABB()); 
    199                         //setPass(boxHalf[i].getTechnique()->getPass(0)); //setRenderingMode(MODE_QUERY); 
    200                         SceneManager::renderSingleObject(&boxHalf[i], boxHalf[i].getTechnique()->getPass(0), false); 
    201                 } 
     211                mDestRenderSystem->_render(ro); 
     212                */ 
     213                                 
     214                renderBoundingBox(node); 
    202215 
    203216                query->endOcclusionQuery(); 
     217 
     218                return query; 
    204219        } 
    205220 
     
    212227                        bool enabled = (mode == MODE_RENDER); 
    213228                         
    214                 //      char str[100]; sprintf(str, "number: %d", mode); 
    215                 //      MessageBox( NULL, str, "this is my plugin", MB_OK | MB_ICONERROR | MB_TASKMODAL); 
    216229                        mDestRenderSystem->_setColourBufferWriteEnabled(enabled,  
    217230                                enabled, enabled, enabled); 
     
    224237        void OcclusionCullingSceneManager::traverseNode(SceneNode *node) 
    225238        { 
    226                 if(isLeaf(node)) // reached leaf 
     239                if(isLeaf(node)) 
    227240                { 
    228241                        render(node); 
     
    235248                        {  
    236249                                SceneNode* sceneChild = static_cast<SceneNode*>(it.getNext()); 
    237                                 //mDistanceQueue->addRenderable(sceneChild); 
    238                 mDistanceQueue->push(sceneChild); 
     250                                mDistanceQueue->push(sceneChild); 
    239251                        } 
    240252                 } 
     
    243255        void OcclusionCullingSceneManager::render(SceneNode *node) 
    244256        { 
    245                 setRenderingMode(MODE_RENDER); 
    246  
     257                //setRenderingMode(MODE_RENDER); 
     258                //MessageBox( NULL, "harhar", "this is my plugin", MB_OK | MB_ICONERROR | MB_TASKMODAL); 
    247259                //HACK (too slow) 
    248260                node->_findVisibleObjects(mCameraInProgress, getRenderQueue(), false,  
     
    267279                                mOcclusionQueries.push_back(hw); 
    268280                        } 
    269                         //char str[100]; sprintf(str, "number: %d", mNumSceneNodes); 
    270                         //MessageBox( NULL, str, "this is my plugin", MB_OK | MB_ICONERROR | MB_TASKMODAL); 
    271281                } 
    272282 
     
    300310        void OcclusionCullingSceneManager::pullUpVisibility(SceneNode *node) 
    301311        { 
    302                 while(node && !node->isNodeVisible()) 
     312                while(!node->isNodeVisible()) 
    303313                { 
    304314                        node->setNodeVisible(true); 
    305                         node = static_cast<SceneNode *>(node->getParent()); 
     315                         
     316                        if(node != mSceneRoot) 
     317                                node = static_cast<SceneNode *>(node->getParent()); 
    306318                } 
    307319        } 
     
    314326                mOcclusionQueries.clear(); 
    315327        } 
     328        //----------------------------------------------------------------------- 
     329        void OcclusionCullingSceneManager::renderBoundingBox(SceneNode *node) 
     330        { 
     331                // Render two halfes of the bounding box (using triangle fans) 
     332                for(int half=0; half < 2; half ++) 
     333                { 
     334                        getSolidHalfBoundingBox(half)->setupBoundingBox(node->_getWorldAABB()); 
     335                        SceneManager::renderSingleObject(getSolidHalfBoundingBox(half),  
     336                                getSolidHalfBoundingBox(half)->getTechnique()->getPass(0), false); 
     337                } 
     338        } 
     339        //----------------------------------------------------------------------- 
     340        SolidHalfBoundingBox *OcclusionCullingSceneManager::getSolidHalfBoundingBox(int half) 
     341        { 
     342                if(!mHalfBoundingBox[half]) 
     343                        mHalfBoundingBox[half] = new SolidHalfBoundingBox(half == 1); 
     344 
     345                return mHalfBoundingBox[half];   
     346        } 
     347        //----------------------------------------------------------------------- 
     348        void OcclusionCullingSceneManager::setAlgorithmType(int type) 
     349        { 
     350                mAlgorithmType = type; 
     351        } 
     352        //----------------------------------------------------------------------- 
     353        int OcclusionCullingSceneManager::getAlgorithmType() 
     354        { 
     355                return mAlgorithmType; 
     356        } 
    316357}        
Note: See TracChangeset for help on using the changeset viewer.