Changeset 41


Ignore:
Timestamp:
04/07/05 18:51:36 (19 years ago)
Author:
mattausch
Message:
 
Location:
trunk/VUT/OcclusionCullingSceneManager
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/VUT/OcclusionCullingSceneManager/TestCulling/TestCullingApplication.cpp

    r34 r41  
    6262        ColourValue fadeColour(0.93, 0.86, 0.76); 
    6363        mSceneMgr->setFog( FOG_LINEAR, fadeColour, .001, 500, 1000); 
     64 //mSceneMgr->setFog( FOG_EXP, fadeColour, 0.005 ); 
    6465        mWindow->getViewport(0)->setBackgroundColour(fadeColour); 
     66 
     67         // Create a skybox 
     68     //mSceneMgr->setSkyBox(true, "Examples/SpaceSkyBox", 500, false); 
     69         //mSceneMgr->setSkyDome( true, "Examples/CloudySky", 5, 8, 500, false ); 
    6570 
    6671        std::string terrain_cfg("terrain.cfg"); 
     
    7075        mSceneMgr -> setWorldGeometry( terrain_cfg ); 
    7176        // Infinite far plane? 
    72         if (mRoot->getRenderSystem()->getCapabilities()->hasCapability(RSC_INFINITE_FAR_PLANE)) 
     77/*      if (mRoot->getRenderSystem()->getCapabilities()->hasCapability(RSC_INFINITE_FAR_PLANE)) 
    7378        { 
    7479                mCamera->setFarClipDistance(0); 
    75         } 
    76  
    77         // Define the required skyplane 
     80        }*/ 
     81 
     82/*      // Define the required skyplane 
    7883        Plane plane; 
    7984        // 5000 world units from the camera 
     
    8186        // Above the camera, facing down 
    8287        plane.normal = -Vector3::UNIT_Y; 
     88        // Create the plane 10000 units wide, tile the texture 3 times 
     89    mSceneMgr->setSkyPlane(true, plane, "Examples/SpaceSkyPlane",10000,3);*/ 
    8390 
    8491        // Set a nice viewpoint 
     
    8996        Ray(mCamera->getPosition(), Vector3::NEGATIVE_UNIT_Y)); 
    9097 
    91      // Create a skybox 
    92   //   mSceneMgr->setSkyBox(true, "Examples/SpaceSkyBox"); 
    93  
    94          // CEGUI setup 
    95          setupGui(); 
     98        Entity *robotEnt = mSceneMgr->createEntity( "Robot", "robot.mesh" ); 
     99        SceneNode *robotNode = mSceneMgr->getRootSceneNode()->createChildSceneNode( "RobotNode", Vector3( 750, 25, 600 )); 
     100        robotNode->attachObject( robotEnt ); 
     101        robotNode->scale( .3, .3, .3 ); 
     102        robotNode->yaw( Degree( 160 ) ); 
     103 
     104        Entity *ogreEnt = mSceneMgr->createEntity( "Ogre", "ogrehead.mesh" ); 
     105    SceneNode *ogreNode = mSceneMgr->getRootSceneNode()->createChildSceneNode( "Ogre", Vector3( 800, 50, 830 ) ); 
     106    ogreNode->attachObject( ogreEnt ); 
     107        ogreNode->scale(.2,.2,.2); 
     108        ogreNode->yaw( Degree( 20 ) ); 
     109 
     110        Entity *ogreEnt2 = mSceneMgr->createEntity( "Ogre2", "ogrehead.mesh" ); 
     111    SceneNode *ogreNode2 = mSceneMgr->getRootSceneNode()->createChildSceneNode( "Ogre2", Vector3( 700, 50, 730 ) ); 
     112    ogreNode2->attachObject( ogreEnt2 ); 
     113        ogreNode2->scale(.05,.05,.05); 
     114        ogreNode->yaw( Degree( 40 ) ); 
     115 
     116        // CEGUI setup 
     117        setupGui(); 
    96118} 
    97119//----------------------------------------------------------------------- 
  • trunk/VUT/OcclusionCullingSceneManager/include/OgreOcclusionCullingSceneTraverser.h

    r39 r41  
    9393                void setNumSceneNodes(int num ); 
    9494 
     95                /** Sets the required number of occlusion queries. 
     96                @param num number occlusion queries 
     97                */ 
     98                void setNumQueries( int num ); 
     99 
    95100        protected: 
    96101                /** query mode (= without color) or RENDER_MODE */ 
     
    114119                /** Renders the scene with the coherent hierarchical algorithm and the query queye. */ 
    115120                void renderCoherentWithQueue( Camera *cam ); 
    116                 /** Issue a occlusion query for this node. */ 
    117                 HardwareOcclusionQuery *issueOcclusionQuery( SceneNode *node, bool wasVisible ); 
     121                /** Issue a occlusion query for this node.  
     122                @param box the axis aligned bounding box of the node 
     123                @wasVisible if the node was visible in previous frame 
     124                */ 
     125                HardwareOcclusionQuery *issueOcclusionQuery( AxisAlignedBox *box, bool wasVisible ); 
    118126                /** Pulls up the visibility from the child nodes. */ 
    119127                void pullUpVisibility( SceneNode *node ); 
     
    121129                void deleteQueries(); 
    122130                /** Renders bounding box of specified node. 
    123                 @param the scene node contained in the bounding box to be rendered 
    124                 */ 
    125                 void renderBoundingBox( SceneNode *node ); 
     131                @param box the bounding box of the scene node to be rendered */ 
     132                void renderBoundingBox( AxisAlignedBox *box ); 
    126133                /** Returns one half of the bounding box. 
    127                 @param the half of the bouding box 
     134                @param half the half index of the bouding box (0 or 1) 
    128135                */ 
    129136                SolidHalfBoundingBox *getSolidHalfBoundingBox( int half ); 
     
    147154                int mQueryMode; 
    148155 
     156                unsigned int mNumQueries; 
     157 
    149158                //--- statistics 
    150159                unsigned int mNumSceneNodes; 
  • trunk/VUT/OcclusionCullingSceneManager/include/OgreOcclusionCullingTerrainSceneManager.h

    r40 r41  
    5555 
    5656        protected: 
    57                 //OcclusionCullingTerrainSceneTraverser *mOcclusionCullingTerrainSceneTraverser; 
    58                 OcclusionCullingSceneTraverser *mOcclusionCullingTerrainSceneTraverser; 
     57                /** Recursively counts octree size (i.e., number of octree instances) 
     58                @param root current octree 
     59                */ 
     60                unsigned int countOctreeSize(Octree *root); 
     61 
     62                OcclusionCullingTerrainSceneTraverser *mOcclusionCullingTerrainSceneTraverser; 
     63                //OcclusionCullingSceneTraverser *mOcclusionCullingTerrainSceneTraverser; 
    5964        }; 
    6065 
  • trunk/VUT/OcclusionCullingSceneManager/include/OgreOcclusionCullingTerrainSceneTraverser.h

    r40 r41  
    5959                 
    6060                void pullUpVisibility( Octree *octree ); 
    61                 void traverseOctree( Camera *cam, Octree *octree ); 
    62                 void renderOctree( Camera *cam, Octree *octree ); 
     61                void traverseOctant(Camera *cam, Octree *octant ); 
     62                void renderOctant( Camera *cam, Octree *octant ); 
    6363 
    6464                OctreePriorityQueue *mDistanceQueue; 
  • trunk/VUT/OcclusionCullingSceneManager/src/OgreOcclusionCullingSceneManager.cpp

    r37 r41  
    4242        { 
    4343                mOcclusionCullingSceneTraverser->setNumSceneNodes(mSceneNodes.size()); 
     44                mOcclusionCullingSceneTraverser->setNumQueries(mSceneNodes.size()); 
    4445                mOcclusionCullingSceneTraverser->setRenderSystem(mDestRenderSystem); 
    4546 
  • trunk/VUT/OcclusionCullingSceneManager/src/OgreOcclusionCullingSceneTraverser.cpp

    r40 r41  
    1616        mFrameId(1), mDistanceQueue(NULL), mVisibilityThreshold(0), mCurrentTestIdx(0), 
    1717        mQueryMode(MODE_RENDER), mNumSceneNodes(0), mCurrentAlgorithm(RENDER_COHERENT), 
    18         mNumTraversedNodes(0), mNumQueryCulledNodes(0), mNumFrustumCulledNodes(0),  
     18        mNumQueries(0), mNumTraversedNodes(0), mNumQueryCulledNodes(0), mNumFrustumCulledNodes(0),  
    1919        mNumRenderedGeometry(0), mSceneManager(sm), mRenderSystem(rsys) 
    2020        {                
     
    4242                mCurrentTestIdx = 0; 
    4343 
    44 mCurrentAlgorithm = RENDER_CULL_FRUSTUM; 
     44//mCurrentAlgorithm = RENDER_CULL_FRUSTUM; 
    4545                switch(mCurrentAlgorithm) 
    4646                { 
     
    9999                                SceneNode *node = mDistanceQueue->top(); 
    100100                                mDistanceQueue->pop(); 
    101          
    102                                 if(cam->isVisible(node->_getWorldAABB())) 
    103                                 { 
    104                                         // identify previously visible nodes 
    105                                         bool wasVisible = node->isNodeVisible() && (node->lastVisited() == mFrameId - 1); 
     101                                 
     102                                //TODO: Isvisible also checked inside scenenode::findvisibleobjects 
     103                                if(!cam->isVisible(node->_getWorldAABB())) 
     104                                { 
     105                    mNumFrustumCulledNodes ++; 
     106                                        continue; 
     107                                } 
     108 
     109                                // identify previously visible nodes 
     110                                bool wasVisible = node->isNodeVisible() && (node->lastVisited() == mFrameId - 1); 
    106111                                         
    107                                         // identify nodes that we cannot skip queries for 
    108                                         bool leafOrWasInvisible = !wasVisible || isLeaf(node); 
    109  
    110                                         // reset node's visibility classification  
    111                                         node->setNodeVisible(false); 
    112  
    113                                         // update node's visited flag 
    114                                         node->setLastVisited(mFrameId); 
     112                                // identify nodes that we cannot skip queries for 
     113                                bool leafOrWasInvisible = !wasVisible || isLeaf(node); 
     114 
     115                                // reset node's visibility classification  
     116                                node->setNodeVisible(false); 
     117 
     118                                // update node's visited flag 
     119                                node->setLastVisited(mFrameId); 
    115120                                 
    116                                         // skip testing previously visible interior nodes 
    117                                         if(leafOrWasInvisible) 
    118                                         { 
    119                                                 HardwareOcclusionQuery *query = issueOcclusionQuery(node, wasVisible); 
    120                                                 queryQueue.push(QueryPair(node, query)); 
    121                                         } 
     121                                // skip testing previously visible interior nodes 
     122                                if(leafOrWasInvisible) 
     123                                { 
     124                                        HardwareOcclusionQuery *query = issueOcclusionQuery(&node->_getWorldAABB(), wasVisible); 
     125                                        queryQueue.push(QueryPair(node, query)); 
     126                                } 
    122127                                         
    123                                         // always traverse a node if it was visible 
    124                                         if(wasVisible) 
    125                                         { 
    126                                                 traverseNode(cam, node); 
    127                                         } 
     128                                // always traverse a node if it was visible 
     129                                if(wasVisible) 
     130                                { 
     131                                        traverseNode(cam, node); 
    128132                                } 
    129133                                else 
     
    144148                        // interesting for visualization purpose 
    145149                        node->setNodeVisible(false); 
    146                                  
    147                         if(cam->isVisible(node->_getWorldAABB())) 
    148                         { 
    149                                 // update node's visited flag  
    150                                 char msg2[100]; 
    151                                 sprintf(msg2,"yes, visible\n"); 
    152                                 OutputDebugString(msg2); 
    153  
    154                                 node->setLastVisited(mFrameId); 
    155                                 node->setNodeVisible(true); 
    156                                 traverseNode(cam, node); 
    157                         } 
    158                         else 
     150 
     151                        //TODO: IsVisible also checked inside scenenode::_findvisibleobjects 
     152                        if(!cam->isVisible(node->_getWorldAABB())) 
    159153                        {                        
    160154                                char msg2[100]; 
     
    163157 
    164158                                mNumFrustumCulledNodes ++; 
     159                                continue; 
    165160                        } 
     161 
     162                        // update node's visited flag  
     163                        node->setLastVisited(mFrameId); 
     164                        node->setNodeVisible(true); 
     165                        traverseNode(cam, node); 
     166 
     167                        char msg2[100]; 
     168                        sprintf(msg2,"yes, visible\n"); 
     169                        OutputDebugString(msg2); 
    166170                } 
    167171        }        
     
    178182                        node->setLastVisited(mFrameId); 
    179183 
    180                         if(cam->isVisible(node->_getWorldAABB())) 
     184                        //TODO: Isvisible also checked inside scenenode::findvisibleobjects 
     185                        if(!cam->isVisible(node->_getWorldAABB())) 
    181186                        { 
    182                                 HardwareOcclusionQuery *query = issueOcclusionQuery(node, false); 
     187                                mNumFrustumCulledNodes ++; 
     188                                continue; 
     189                        } 
     190 
     191                        HardwareOcclusionQuery *query = issueOcclusionQuery(&node->_getWorldAABB(), false); 
    183192                                 
    184                                 unsigned int visiblePixels; 
    185                                 // wait if result not available 
    186                                 query->pullOcclusionQuery(&visiblePixels); 
     193                        unsigned int visiblePixels; 
     194                        // wait if result not available 
     195                        query->pullOcclusionQuery(&visiblePixels); 
    187196                                 
    188                                 // node visible 
    189                                 if(visiblePixels > mVisibilityThreshold) 
    190                                 { 
    191                                         traverseNode(cam, node); 
    192                                 } 
    193                                 else 
    194                                 { 
    195                                         mNumQueryCulledNodes ++; 
    196                                 } 
     197                        // node visible 
     198                        if(visiblePixels > mVisibilityThreshold) 
     199                        { 
     200                                traverseNode(cam, node); 
    197201                        } 
    198202                        else 
    199203                        { 
    200                                 mNumFrustumCulledNodes ++; 
     204                                mNumQueryCulledNodes ++; 
    201205                        } 
    202206                } 
    203207        } 
    204208        //----------------------------------------------------------------------- 
    205         HardwareOcclusionQuery *OcclusionCullingSceneTraverser::issueOcclusionQuery( SceneNode *node, bool wasVisible ) 
     209        HardwareOcclusionQuery *OcclusionCullingSceneTraverser::issueOcclusionQuery(  
     210                AxisAlignedBox *box, bool wasVisible ) 
    206211        { 
    207212                // change state so the bounding box gets not actually rendered on the screen 
     213                // TODO: in rendervisibleobjects, the rendermode is changed by ogre itself => change this!! 
    208214                setRenderingMode(MODE_QUERY); 
    209215                //setRenderingMode(MODE_RENDER); 
    210216 
     217                char msg2[100]; 
     218                sprintf(msg2,"this is query %d of overall %d\n", mCurrentTestIdx, mNumQueries); 
     219                OutputDebugString(msg2); 
     220 
    211221                // get next available test id 
    212222                HardwareOcclusionQuery *query = mOcclusionQueries[mCurrentTestIdx++]; 
    213                  
     223 
     224                //-- the actual query test 
    214225                query->beginOcclusionQuery(); 
    215226                                 
    216                 renderBoundingBox(node); 
     227                renderBoundingBox(box); 
    217228 
    218229                query->endOcclusionQuery(); 
     
    258269        void OcclusionCullingSceneTraverser::renderSceneNode( Camera *cam, SceneNode *node ) 
    259270        { 
     271                //TODO: does not do any changes 
    260272                setRenderingMode(MODE_RENDER); 
    261273                 
     
    268280                deleteQueries(); 
    269281 
    270                 for(unsigned int i=0; i < mNumSceneNodes; i++) 
     282                for(unsigned int i=0; i < mNumQueries; i++) 
    271283                { 
    272284                        mOcclusionQueries.push_back(mRenderSystem->createHardwareOcclusionQuery()); 
     
    321333        } 
    322334        //----------------------------------------------------------------------- 
    323         void OcclusionCullingSceneTraverser::renderBoundingBox( SceneNode *node ) 
     335        void OcclusionCullingSceneTraverser::renderBoundingBox( AxisAlignedBox *box ) 
    324336        { 
    325337                // Render two halfes of the bounding box (using triangle fans) 
     
    327339                { 
    328340                        //static Matrix4 xform[256]; 
    329  
    330                         SolidHalfBoundingBox *box = getSolidHalfBoundingBox(half); 
    331                         box->setupBoundingBox(node->_getWorldAABB()); 
     341                        //TODO: this should be full boudning box 
     342                        SolidHalfBoundingBox *halfbox = getSolidHalfBoundingBox(half); 
     343                        halfbox->setupBoundingBox(*box); 
    332344 
    333345                        mRenderSystem->_setWorldMatrix(Matrix4::IDENTITY); 
     
    335347                        static RenderOperation ro; 
    336348 
    337                         mSceneManager->useRenderableViewProjMode(box); 
    338                         box->getRenderOperation(ro); 
    339                         ro.srcRenderable = box;  
     349                        mSceneManager->useRenderableViewProjMode(halfbox); 
     350                        halfbox->getRenderOperation(ro); 
     351                        ro.srcRenderable = halfbox;  
    340352                        mRenderSystem->_render(ro); 
    341353 
     
    421433                mNumSceneNodes = num; 
    422434        } 
     435        //----------------------------------------------------------------------- 
     436        void OcclusionCullingSceneTraverser::setNumQueries(int num) 
     437        { 
     438                mNumQueries = num; 
     439        } 
    423440}        
  • trunk/VUT/OcclusionCullingSceneManager/src/OgreOcclusionCullingTerrainSceneManager.cpp

    r40 r41  
    88#include "OgreSolidHalfBoundingBox.h" 
    99 
    10 //#include <windows.h> 
     10#include <windows.h> 
    1111 
    1212namespace Ogre { 
     
    1414        OcclusionCullingTerrainSceneManager::OcclusionCullingTerrainSceneManager() 
    1515        { 
    16                 //mOcclusionCullingTerrainSceneTraverser =  
    17                 //      new OcclusionCullingTerrainSceneTraverser(this, mDestRenderSystem); 
     16                mOcclusionCullingTerrainSceneTraverser =  
     17                        new OcclusionCullingTerrainSceneTraverser(this, mDestRenderSystem); 
     18                        //new OcclusionCullingSceneTraverser(this, mDestRenderSystem); 
    1819 
    19                 mOcclusionCullingTerrainSceneTraverser =  
    20                         new OcclusionCullingSceneTraverser(this, mDestRenderSystem); 
    21  
    22                 mDisplayNodes = true; 
     20                //mDisplayNodes = true; 
    2321                //mShowBoundingBoxes = true; 
    2422                mShowBoxes = true; 
     23                mMaxDepth = 20; 
    2524        } 
    2625        //----------------------------------------------------------------------- 
     
    4645                setSpecialCaseRenderQueueMode(SceneManager::SCRQM_EXCLUDE); 
    4746 
    48                 //mOcclusionCullingTerrainSceneTraverser->renderScene(mCameraInProgress, mOctree); 
     47                mOcclusionCullingTerrainSceneTraverser->renderScene(mCameraInProgress, mOctree); 
    4948                //mOcclusionCullingTerrainSceneTraverser->renderScene(mCameraInProgress, mTerrainRoot); 
    50                 mOcclusionCullingTerrainSceneTraverser->renderScene(mCullCamera, mSceneRoot); 
     49                //mOcclusionCullingTerrainSceneTraverser->renderScene(mCameraInProgress, mSceneRoot); 
    5150                _deleteRenderedQueueGroups(); 
    5251 
     
    6766        { 
    6867        mOcclusionCullingTerrainSceneTraverser->setNumSceneNodes(mSceneNodes.size()); 
     68                //HACK 
     69                mOcclusionCullingTerrainSceneTraverser->setNumQueries(countOctreeSize(mOctree)); 
    6970                mOcclusionCullingTerrainSceneTraverser->setRenderSystem(mDestRenderSystem); 
    7071 
     
    9899                //Add stuff to be rendered; 
    99100        NodeList::iterator it = octant->mNodes.begin(); 
    100  
    101         if ( mShowBoxes ) 
    102         { 
    103             mBoxes.push_back( octant->getWireBoundingBox() ); 
    104         } 
    105  
     101          
    106102        while ( it != octant->mNodes.end() ) 
    107103        { 
     
    118114 
    119115                                if ( mDisplayNodes ) 
    120                                 { 
    121116                                        getRenderQueue()->addRenderable( sn ); 
    122117 
    123                                         // check if the scene manager or this node wants the bounding box shown. 
    124                                         if (sn->getShowBoundingBox() || mShowBoundingBoxes) 
    125                                                 sn->_addBoundingBoxToQueue(getRenderQueue()); 
    126                                 } 
     118                                // check if the scene manager or this node wants the bounding box shown. 
     119                                if (sn->getShowBoundingBox() || mShowBoundingBoxes) 
     120                                        sn->_addBoundingBoxToQueue(getRenderQueue()); 
     121 
     122                                if ( mShowBoxes ) 
     123                                        getRenderQueue()->addRenderable(octant->getWireBoundingBox()); 
    127124                        } 
    128125            ++it; 
     
    134131                _deleteRenderedQueueGroups(); 
    135132        } 
     133        //----------------------------------------------------------------------- 
     134        unsigned int OcclusionCullingTerrainSceneManager::countOctreeSize(Octree *root) 
     135        { 
     136                unsigned int result = 1; 
     137                                 
     138                for(int i=0; i<8; i++) 
     139                { 
     140                        Octree *nextChild = root->mChildren[(i & 4) >> 2][(i & 2) >> 1][i & 1]; 
     141                 
     142                        if(nextChild != 0) 
     143                                result += countOctreeSize(nextChild); 
     144                } 
     145                 
     146                return result; 
     147        } 
    136148}        
  • trunk/VUT/OcclusionCullingSceneManager/src/OgreOcclusionCullingTerrainSceneTraverser.cpp

    r40 r41  
    11#include "OgreOcclusionCullingTerrainSceneTraverser.h" 
    22#include "OgreOcclusionCullingTerrainSceneManager.h" 
     3#include "OgreHardwareOcclusionQuery.h" 
    34 
    45#include <windows.h> 
     
    1112        } 
    1213        //----------------------------------------------------------------------- 
    13         void OcclusionCullingTerrainSceneTraverser::traverseOctree( Camera *cam, Octree *octree ) 
     14        void OcclusionCullingTerrainSceneTraverser::traverseOctant(Camera *cam, Octree *octant ) 
    1415        { 
    1516                mNumTraversedNodes ++; 
    1617         
    17                 if(octree->numNodes() > 0) 
    18                 { 
    19                         renderOctree(cam, octree); 
    20                 } 
     18                //if(octant->numNodes() > 0) 
     19                        renderOctant(cam, octant); 
    2120 
    2221                for(int i=0; i<8; i++) 
    2322                { 
    24                         char msg[100]; 
    25                         sprintf(msg,"current node: %d\n", i); 
    26                         OutputDebugString(msg); 
    27  
    28                         if(octree->mChildren[i & 4][i & 2][i & 1] != 0) 
    29                                 traverseOctree(cam, octree->mChildren[i & 4][i & 2][i & 1]);                     
     23                        Octree *nextChild = octant->mChildren[(i & 4) >> 2][(i & 2) >> 1][i & 1]; 
     24                 
     25                        if(nextChild != 0) 
     26                                mDistanceQueue->push(nextChild); 
    3027                } 
    3128        } 
     
    4340                mCurrentTestIdx = 0; 
    4441                 
    45 mCurrentAlgorithm = RENDER_CULL_FRUSTUM; 
     42//mCurrentAlgorithm = RENDER_CULL_FRUSTUM; 
    4643                switch(mCurrentAlgorithm) 
    4744                { 
     
    5350                                break; 
    5451                        case RENDER_COHERENT: 
    55                                 renderCoherentWithQueue(cam); 
     52                                //renderCoherentWithQueue(cam); 
     53                                renderStopAndWait(cam); 
    5654                                break; 
    5755                        default: 
     
    6866        { 
    6967                AxisAlignedBox box; 
    70                 FrustumPlane plane; 
    7168 
    7269                while(!mDistanceQueue->empty()) 
    7370                { 
    74                         Octree *octree = mDistanceQueue->top(); 
     71                        Octree *octant = mDistanceQueue->top(); 
    7572                        mDistanceQueue->pop(); 
    7673         
    7774                        // interesting for visualization purpose 
    7875                        //TODO: octree->setNodeVisible(false); 
    79                         octree->_getCullBounds(&box); 
     76                        octant->_getCullBounds(&box); 
     77                         
     78                        if(static_cast<OctreeCamera *>(cam)->getVisibility(box) == OctreeCamera::NONE) 
     79                        if(!cam->isVisible(box)) 
     80                        { 
     81                                mNumFrustumCulledNodes ++; 
     82                                continue; 
     83                        } 
    8084 
    81                         //if(cam->isVisible(box, &plane)) 
    82                         //{ 
    83                                 // update node's visited flag  
    84                                 //TODO: octree->setLastVisited(mFrameId); 
    85                                 //TODO: octree->setNodeVisible(true); 
    86                                 traverseOctree(cam, octree); 
    87                         /*} 
    88                         else 
    89                         {                        
    90                                 mNumFrustumCulledNodes ++; 
    91                         }*/ 
     85                        // update node's visited flag  
     86                        //TODO: octree->setLastVisited(mFrameId); 
     87                        //TODO: octree->setNodeVisible(true); 
     88                 
     89                        traverseOctant(cam, octant); 
    9290                } 
    9391        }        
    94          
     92        //----------------------------------------------------------------------- 
    9593        /** Renders the scene with the hierarchical stop and wait algorithm. */ 
    9694        void OcclusionCullingTerrainSceneTraverser::renderStopAndWait( Camera *cam ) 
    9795        { 
     96                AxisAlignedBox box; 
     97 
     98                while(!mDistanceQueue->empty()) 
     99                { 
     100                        Octree *octant = mDistanceQueue->top(); 
     101                        mDistanceQueue->pop(); 
     102                 
     103                        // interesting for visualization purpose 
     104                        //octant->setNodeVisible(false); 
     105                        //octant->setLastVisited(mFrameId); 
     106 
     107                        //TODO: Isvisible also checked inside scenenode::findvisibleobjects 
     108                        octant->_getCullBounds(&box); 
     109 
     110                        char msg[100];  
     111                        Vector3 max = box.getMaximum(); 
     112                        Vector3 min = box.getMinimum(); 
     113 
     114                        sprintf(msg, "box max: %3.3f, %3.3f, %3.3f, min: %3.3f, %3.3f, %3.3f\n",max.x,max.y,max.z,min.x,min.y,min.z); 
     115                        OutputDebugString(msg); 
     116 
     117                        if(static_cast<OctreeCamera *>(cam)->getVisibility(box) == OctreeCamera::NONE) 
     118                        //if(!cam->isVisible(box)) 
     119                        { 
     120                                mNumFrustumCulledNodes ++; 
     121                                continue; 
     122                        } 
     123 
     124                        HardwareOcclusionQuery *query = issueOcclusionQuery(&box, false); 
     125                                 
     126                        unsigned int visiblePixels; 
     127                        // wait if result not available 
     128                        query->pullOcclusionQuery(&visiblePixels); 
     129//traverseOctant(cam, octant);                   
     130                        // node visible 
     131                        if(visiblePixels > mVisibilityThreshold) 
     132                        { 
     133                                traverseOctant(cam, octant); 
     134                                //mNumQueryCulledNodes ++; 
     135                        } 
     136                        else 
     137                        { 
     138                                mNumQueryCulledNodes ++; 
     139                        } 
     140                } 
    98141        } 
    99  
     142        //----------------------------------------------------------------------- 
    100143        /** Renders the scene with the coherent hierarchical algorithm and the query queye. */ 
    101144        void OcclusionCullingTerrainSceneTraverser::renderCoherentWithQueue( Camera *cam ) 
    102145        { 
    103146        } 
    104          
    105         //----------------------------------------------------------------------- 
    106 /*      bool OcclusionCullingTerrainSceneTraverser::isLeaf( SceneNode *node ) 
    107         { 
    108                 return (node->numChildren() == 0); 
    109         }*/ 
    110147        //----------------------------------------------------------------------- 
    111148        void OcclusionCullingTerrainSceneTraverser::pullUpVisibility( Octree *node ) 
     
    113150        } 
    114151        //----------------------------------------------------------------------- 
    115         void OcclusionCullingTerrainSceneTraverser::renderOctree( Camera *cam, Octree *octree ) 
     152        void OcclusionCullingTerrainSceneTraverser::renderOctant( Camera *cam, Octree *octree ) 
    116153        { 
    117154                setRenderingMode(MODE_RENDER); 
Note: See TracChangeset for help on using the changeset viewer.