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

Legend:

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

    r18 r26  
    55#include "CEGUIForwardRefs.h" 
    66#include "ExampleApplication.h" 
    7  
     7#include "OgreOcclusionCullingSceneManager.h" 
    88 
    99class MouseQueryListener : public ExampleFrameListener, public MouseListener, public MouseMotionListener 
     
    1313    MouseQueryListener(RenderWindow* win, Camera* cam, SceneManager *sceneManager, CEGUI::Renderer *renderer, 
    1414                                           SceneNode* shipNode) 
    15         : ExampleFrameListener(win, cam, false, true), mGUIRenderer(renderer), mShipNode(shipNode) 
     15        : ExampleFrameListener(win, cam, false, true), mGUIRenderer(renderer), mShipNode(shipNode),  mShutdownRequested(false) 
    1616    { 
    1717                // Setup default variables 
     
    2424        mMoveSpeed = 50; 
    2525        mRotateSpeed *= 2; 
     26         
     27                mAlgorithmType = OcclusionCullingSceneManager::RENDER_COHERENT; 
     28 
     29                 showDebugOverlay(false); 
    2630 
    2731                // Register this so that we get mouse events. 
    28         mEventProcessor->addMouseListener( this ); 
    29         mEventProcessor->addMouseMotionListener( this ); 
     32        mEventProcessor->addMouseListener(this); 
     33        mEventProcessor->addMouseMotionListener(this); 
     34                mEventProcessor->addKeyListener(this); 
    3035    } // MouseQueryListener 
    3136 
     
    3641    bool frameStarted(const FrameEvent &evt) 
    3742    { 
    38         return ExampleFrameListener::frameStarted( evt ); 
     43       Real MoveFactor = 80.0 * evt.timeSinceLastFrame; 
     44  
     45                mInputDevice->capture(); 
     46  
     47                if(mInputDevice->isKeyDown(Ogre::KC_UP)) 
     48                { 
     49 
     50                        mAlgorithmType = (mAlgorithmType + 1) % OcclusionCullingSceneManager::NUM_RENDERMODES; 
     51                        //mShipNode->translate(0.0, MoveFactor, 0.0); 
     52                } 
     53  
     54                if(mInputDevice->isKeyDown(Ogre::KC_DOWN)) 
     55                        mShipNode->translate(0.0, -MoveFactor, 0.0); 
     56  
     57                if(mInputDevice->isKeyDown(Ogre::KC_LEFT)) 
     58                        mShipNode->translate(-MoveFactor, 0.0, 0.0); 
     59  
     60                if(mInputDevice->isKeyDown(Ogre::KC_RIGHT)) 
     61                        mShipNode->translate(MoveFactor, 0.0, 0.0);              
     62  
     63                if(mInputDevice->isKeyDown(Ogre::KC_ESCAPE)) 
     64                        return false; 
     65 
     66                return true; 
    3967    } 
    4068 
     
    5684   virtual void mouseDragged (MouseEvent *e); 
    5785 
     86   void keyPressed(KeyEvent* e) 
     87   { 
     88        if(e->getKey() == KC_ESCAPE) 
     89        { 
     90            mShutdownRequested = true; 
     91            e->consume(); 
     92            return; 
     93        } 
     94 
     95        CEGUI::System::getSingleton().injectKeyDown(e->getKey()); 
     96                CEGUI::System::getSingleton().injectChar(e->getKeyChar()); 
     97        e->consume(); 
     98    } 
     99 
     100        void keyReleased(KeyEvent* e) 
     101        { 
     102                CEGUI::System::getSingleton().injectKeyUp(e->getKey()); 
     103                e->consume(); 
     104        } 
     105        void keyClicked(KeyEvent* e)  
     106        { 
     107                // Do nothing 
     108                e->consume(); 
     109        } 
     110 
     111          bool frameEnded(const FrameEvent& evt) 
     112    { 
     113        if (mShutdownRequested) 
     114            return false; 
     115        else 
     116            return ExampleFrameListener::frameEnded(evt); 
     117    } 
     118 
     119        void setAlgorithmType(int type) { mAlgorithmType = type; } 
     120        int getAlgorithmType() { return mAlgorithmType; } 
     121 
    58122protected: 
    59123    bool mLMouseDown, mRMouseDown;     // True if the mouse buttons are down 
     
    62126    CEGUI::Renderer *mGUIRenderer;     // cegui renderer 
    63127        SceneNode* mShipNode; 
     128        bool mShutdownRequested; 
     129        int mAlgorithmType; 
    64130}; 
    65131 
    66  
    67 class TestCullingFrameListener : public ExampleFrameListener 
    68 { 
    69 protected: 
    70     SceneNode* mShipNode; 
    71  
    72 public: 
    73     TestCullingFrameListener(RenderWindow* win, Camera* cam, SceneNode* shipNode) : ExampleFrameListener(win, cam) 
    74     { 
    75                 mShipNode = shipNode; 
    76     }; 
    77  
    78         bool frameStarted(const FrameEvent& evt) 
    79         { 
    80                 Real MoveFactor = 80.0 * evt.timeSinceLastFrame; 
    81   
    82                 mInputDevice->capture(); 
    83   
    84                 if(mInputDevice->isKeyDown(Ogre::KC_UP)) 
    85                         mShipNode->translate(0.0, MoveFactor, 0.0); 
    86   
    87                 if(mInputDevice->isKeyDown(Ogre::KC_DOWN)) 
    88                         mShipNode->translate(0.0, -MoveFactor, 0.0); 
    89   
    90                 if(mInputDevice->isKeyDown(Ogre::KC_LEFT)) 
    91                         mShipNode->translate(-MoveFactor, 0.0, 0.0); 
    92   
    93                 if(mInputDevice->isKeyDown(Ogre::KC_RIGHT)) 
    94                         mShipNode->translate(MoveFactor, 0.0, 0.0);              
    95   
    96                 if(mInputDevice->isKeyDown(Ogre::KC_ESCAPE)) 
    97                         return false; 
    98   
    99                 return true; 
    100         } 
    101 }; 
    102132 
    103133class TestCullingApplication : public ExampleApplication 
     
    106136    /*TestCullingApplication() 
    107137    { 
    108  
    109138 
    110139    }*/ 
     
    150179    { 
    151180        mSceneMgr = mRoot->getSceneManager(ST_GENERIC); 
    152                 //mSceneMgr = mRoot->getSceneManager(ST_INTERIOR); 
    153181    } 
    154         /* 
    155     // Scene creation 
    156     void createScene(void) 
    157     { 
    158  
    159         // Load world geometry 
    160         mSceneMgr->setWorldGeometry(mQuakeLevel); 
    161  
    162         // modify camera for close work 
    163         mCamera->setNearClipDistance(4); 
    164         mCamera->setFarClipDistance(4000); 
    165  
    166         // Also change position, and set Quake-type orientation 
    167         // Get random player start point 
    168         ViewPoint vp = mSceneMgr->getSuggestedViewpoint(true); 
    169         mCamera->setPosition(vp.position); 
    170         mCamera->pitch(Degree(90)); // Quake uses X/Y horizon, Z up 
    171         mCamera->rotate(vp.orientation); 
    172         // Don't yaw along variable axis, causes leaning 
    173         mCamera->setFixedYawAxis(true, Vector3::UNIT_Z); 
    174     }*/ 
    175  
     182         
    176183}; 
    177184 
  • trunk/VUT/OcclusionCullingSceneManager/include/OgreOcclusionCullingSceneManager.h

    r23 r26  
    55#include "OgreSceneManager.h" 
    66#include "OgrePrerequisites.h" 
     7#include "OgreSolidHalfBoundingBox.h" 
    78#include <queue> 
    89 
     
    2728        }; 
    2829 
     30        typedef pair<SceneNode *, HardwareOcclusionQuery *> query_pair; 
    2931        typedef priority_queue<SceneNode *, vector<SceneNode *>, myless<vector<SceneNode *>::value_type> > PriorityQueue; 
    30         typedef queue<SceneNode *> QueryQueue; 
     32        typedef queue<query_pair> QueryQueue; 
    3133        /** 
    3234                Class which implements a scene mangager which uses occlusion queries for culling occluded objects 
     
    3537        { 
    3638        public: 
    37                 enum {RENDER_CULL_FRUSTUM, RENDER_STOP_AND_WAIT, RENDER_COHERENT, NUM_RENDERMODES}; 
    38                  
    3939                OcclusionCullingSceneManager(); 
    4040                ~OcclusionCullingSceneManager(); 
    4141         
    42                 /** Overriden from SceneManager. */ 
     42 
     43                enum {RENDER_CULL_FRUSTUM, RENDER_STOP_AND_WAIT, RENDER_COHERENT, NUM_RENDERMODES}; 
     44                 
     45                /** Overriden from SceneManager. Renders the scene with the specified algorithm 
     46                /** 
     47                        The algorithm is one of 
     48                        RENDER_CULL_FRUSTUM: renders the scene with view frustum culling only 
     49                        RENDER_STOP_AND_WAIT: renders the scene with the hierarchical stop and wait algorithm 
     50                        RENDER_COHERENT: renders the scene with the coherent hierarchical algorithm 
     51                */ 
    4352                void _renderVisibleObjects(void); 
    4453                void _findVisibleObjects(Camera* cam, bool onlyShadowCasters); 
     
    6473                void renderCoherentWithQueue(); 
    6574                /** Issue a occlusion query for this node. */ 
    66                 void issueOcclusionQuery(SceneNode *node, bool wasVisible); 
     75                HardwareOcclusionQuery *issueOcclusionQuery(SceneNode *node, bool wasVisible); 
    6776                /** Pulls up the visibility from the child nodes. */ 
    6877                void pullUpVisibility(SceneNode *node); 
     78                /** delete all previously defined occlusion queries */ 
     79                void deleteQueries(); 
     80                /** Renders bounding box of specified node. 
     81                @param the node which bounding box is to be rendered 
     82                */ 
     83                void renderBoundingBox(SceneNode *node); 
     84                /** Returns one half of the bounding box. 
     85                @param the half of the bouding box 
     86                */ 
     87                SolidHalfBoundingBox *getSolidHalfBoundingBox(int half); 
     88                /** sets the type of the algorithm 
     89                @param algorithm type 
     90                */ 
     91                void setAlgorithmType(int type); 
     92         
     93                int getAlgorithmType(); 
    6994 
    70                 void deleteQueries(); 
    71  
    72                 /** we use a priority queue rather than a renderstack */ 
     95                // we use a priority queue rather than a renderstack 
    7396                PriorityQueue *mDistanceQueue;  
    74  
     97                 
    7598                unsigned int mFrameId; 
    7699                unsigned int mVisibilityThreshold; 
     
    80103                 
    81104                std::vector<HardwareOcclusionQuery *> mOcclusionQueries; 
     105                // two halfes of a aabb 
     106                SolidHalfBoundingBox *mHalfBoundingBox[2];       
     107                int mAlgorithmType; 
    82108        }; 
    83109 
  • trunk/VUT/OcclusionCullingSceneManager/scripts/Plugin_OcclusionCullingSceneManager.vcproj

    r24 r26  
    154154                        </File> 
    155155                        <File 
    156                                 RelativePath="..\src\OgreSolidBoundingBox.cpp"> 
     156                                RelativePath="..\src\OgreSolidHalfBoundingBox.cpp"> 
    157157                        </File> 
    158158                        <File 
     
    170170                        </File> 
    171171                        <File 
    172                                 RelativePath="..\include\OgreSolidBoundingBox.h"> 
     172                                RelativePath="..\include\OgreSolidHalfBoundingBox.h"> 
    173173                        </File> 
    174174                </Filter> 
  • 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.