Ignore:
Timestamp:
03/21/05 17:30:35 (19 years ago)
Author:
gametools
Message:
 
File:
1 edited

Legend:

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

    r22 r23  
    55#include "OgreCamera.h" 
    66#include "OgreHardwareOcclusionQuery.h" 
     7#include "OgreWireBoundingBox.h" 
    78 
    89#include <windows.h> 
     
    1213        //----------------------------------------------------------------------- 
    1314        OcclusionCullingSceneManager::OcclusionCullingSceneManager():  
    14         mFrameID(1), mDistanceQueue(NULL), mVisibilityThreshold(0), mCurrentTestIdx(0), 
     15        mFrameId(1), mDistanceQueue(NULL), mVisibilityThreshold(0), mCurrentTestIdx(0), 
    1516        mQueryMode(MODE_RENDER), mNumSceneNodes(0) 
    1617        {                
     
    2526        {                
    2627                deleteQueries(); 
    27                 SceneManager::~SceneManager(); 
     28                //SceneManager::~SceneManager(); 
    2829        } 
    2930        //----------------------------------------------------------------------- 
     
    3334                 
    3435                mDistanceQueue->push(mSceneRoot); 
     36 
     37                mCurrentTestIdx = 0; 
    3538                //renderZPass(); 
    3639                //renderCullFrustum(); 
    37                 renderCoherentWithQueue(); 
     40                //renderCoherentWithQueue(); 
     41                renderStopAndWait(); 
    3842                delete mDistanceQueue; 
    3943 
     
    4650                */ 
    4751                 
    48                 mFrameID ++; 
     52                mFrameId ++; 
    4953        } 
    5054        //----------------------------------------------------------------------- 
     
    8892                                { 
    8993                                        // identify previously visible nodes 
    90                                         bool wasVisible = node->isNodeVisible() && (node->lastVisited() == mFrameID - 1); 
     94                                        bool wasVisible = node->isNodeVisible() && (node->lastVisited() == mFrameId - 1); 
    9195                                         
    9296                                        // identify nodes that we cannot skip queries for 
     
    97101 
    98102                                        // update node's visited flag 
    99                                         node->setLastVisited(mFrameID); 
     103                                        node->setLastVisited(mFrameId); 
    100104                                 
    101105                                        // skip testing previously visible interior nodes 
     
    144148                        // interesting for the visualization 
    145149                        //node->SetVisible(false); 
    146                         node->setLastVisited(15); 
     150                        node->setLastVisited(mFrameId); 
    147151 
    148152                        if(mCameraInProgress->isVisible(node->_getWorldAABB())) 
     
    152156                                unsigned int visiblePixels; 
    153157                                // wait if result not available 
    154                                 mOcclusionQueries[mCurrentTestIdx++]->pullOcclusionQuery(&visiblePixels); 
     158                                node->getOcclusionQuery()->pullOcclusionQuery(&visiblePixels); 
    155159                                 
     160                                //char str[100]; sprintf(str, "number: %d, id: %d", (int)visiblePixels, mCurrentTestIdx); 
     161                                //MessageBox( NULL, str, "this is my plugin", MB_OK | MB_ICONERROR | MB_TASKMODAL); 
     162 
    156163                                // node visible 
    157164                                if(visiblePixels > mVisibilityThreshold) 
     
    165172        void OcclusionCullingSceneManager::issueOcclusionQuery(SceneNode *node, bool wasVisible) 
    166173        { 
     174                // change state so the bounding box gets not actually rendered on the screen 
     175                setRenderingMode(MODE_RENDER); 
     176 
    167177                // get next available test id 
    168                 mOcclusionQueries[mCurrentTestIdx]->beginOcclusionQuery(); 
    169          
    170                 // change state so the bounding box gets not actually rendered on the screen 
    171                 setRenderingMode(MODE_QUERY); 
     178                HardwareOcclusionQuery *query = mOcclusionQueries[mCurrentTestIdx++]; 
     179                node->setOcclusionQuery(query); 
     180 
     181                query->beginOcclusionQuery(); 
     182                 
     183                WireBoundingBox box; 
     184                box.setupBoundingBox(node->_getWorldAABB()); 
     185 
    172186                //HACK: too slow 
    173         node->_addBoundingBoxToQueue(getRenderQueue()); 
    174                 SceneManager::_renderVisibleObjects(); 
    175                 getRenderQueue()->clear(); 
    176                 /* static RenderOperation ro; 
    177                    node->getRenderOperation(ro); 
    178                    ro.srcRenderable = node;  
    179                    mDestRenderSystem->_render(ro); */ 
    180                  
    181                 mOcclusionQueries[mCurrentTestIdx++]->endOcclusionQuery(); 
     187                 
     188                /* 
     189                static RenderOperation ro; 
     190 
     191                 
     192                static Matrix4 xform[256]; 
     193                unsigned short numMatrices; 
     194 
     195        //node->_addBoundingBoxToQueue(getRenderQueue()); 
     196                //SceneManager::_renderVisibleObjects(); 
     197                //getRenderQueue()->clear(); 
     198 
     199                // Set world transformation 
     200                /*box.getWorldTransforms(xform); 
     201                numMatrices = box.getNumWorldTransforms(); 
     202                if (numMatrices > 1) 
     203                { 
     204                        mDestRenderSystem->_setWorldMatrices(xform, numMatrices); 
     205                } 
     206                else 
     207                { 
     208                mDestRenderSystem->_setWorldMatrix(*xform); 
     209            } 
     210*/ 
     211                // Issue view / projection changes if any 
     212                /*useRenderableViewProjMode(&box); 
     213 
     214                box.getRenderOperation(ro); 
     215                ro.srcRenderable = &box;  
     216                mDestRenderSystem->_render(ro);*/ 
     217                setPass(box.getTechnique()->getPass(0)); setRenderingMode(MODE_QUERY); 
     218                SceneManager::renderSingleObject(&box, box.getTechnique()->getPass(0), false); 
     219 
     220                query->endOcclusionQuery(); 
    182221        } 
    183222 
     
    189228                { 
    190229                        bool enabled = (mode == MODE_RENDER); 
    191  
     230                         
     231                //      char str[100]; sprintf(str, "number: %d", mode); 
     232                //      MessageBox( NULL, str, "this is my plugin", MB_OK | MB_ICONERROR | MB_TASKMODAL); 
    192233                        mDestRenderSystem->_setColourBufferWriteEnabled(enabled,  
    193234                                enabled, enabled, enabled); 
     
    231272        { 
    232273                int numnodes = countSceneNodes(mSceneRoot); 
    233                 //char str[100]; sprintf(str, "number: %d", mNumSceneNodes); 
    234                 //MessageBox( NULL, str, "this is my plugin", MB_OK | MB_ICONERROR | MB_TASKMODAL); 
    235274                 
    236275                //-- initialise occlusion queries. 
    237276                if(numnodes != mNumSceneNodes) 
    238277                { 
     278                        deleteQueries(); 
    239279                        mNumSceneNodes = numnodes; 
    240280 
    241                         deleteQueries(); 
    242  
    243                         for(int i=0; i < mNumSceneNodes; i++) 
     281                        for(unsigned int i=0; i < mNumSceneNodes; i++) 
    244282                        { 
    245283                                HardwareOcclusionQuery *hw = mDestRenderSystem->createHardwareOcclusionQuery(); 
    246284                                mOcclusionQueries.push_back(hw); 
    247285                        } 
     286                        //char str[100]; sprintf(str, "number: %d", mNumSceneNodes); 
     287                        //MessageBox( NULL, str, "this is my plugin", MB_OK | MB_ICONERROR | MB_TASKMODAL); 
    248288                } 
    249289 
     
    286326        void OcclusionCullingSceneManager::deleteQueries() 
    287327        { 
    288                 for(int i=0; i < mNumSceneNodes; i++) 
     328                for(unsigned int i=0; i < mNumSceneNodes; i++) 
    289329                        delete mOcclusionQueries[i]; 
    290330 
Note: See TracChangeset for help on using the changeset viewer.