source: trunk/VUT/OcclusionCullingSceneManager/src/OgreOcclusionCullingTerrainSceneManager.cpp @ 42

Revision 42, 5.5 KB checked in by mattausch, 19 years ago (diff)
Line 
1#include "OgreOcclusionCullingTerrainSceneManager.h"
2#include "OgreMath.h"
3#include "OgreIteratorWrappers.h"
4#include "OgreRenderSystem.h"
5#include "OgreCamera.h"
6#include "OgreHardwareOcclusionQuery.h"
7//#include "OgreWireBoundingBox.h"
8#include "OgreSolidHalfBoundingBox.h"
9
10#include <windows.h>
11
12namespace Ogre {
13        //-----------------------------------------------------------------------
14        OcclusionCullingTerrainSceneManager::OcclusionCullingTerrainSceneManager()
15        {
16                mOcclusionCullingTerrainSceneTraverser =
17                        new OcclusionCullingTerrainSceneTraverser(this, mDestRenderSystem);
18
19                //mDisplayNodes = true;
20                //mShowBoundingBoxes = true;
21                mShowBoxes = true;
22                //mMaxDepth = 20;
23        }
24        //-----------------------------------------------------------------------
25        OcclusionCullingTerrainSceneManager::~OcclusionCullingTerrainSceneManager()
26        {
27                delete mOcclusionCullingTerrainSceneTraverser;
28        }
29        //-----------------------------------------------------------------------
30        void OcclusionCullingTerrainSceneManager::_renderVisibleObjects(void)
31        {
32                //-- render background
33                clearSpecialCaseRenderQueues();
34                addSpecialCaseRenderQueue(RENDER_QUEUE_BACKGROUND);
35                addSpecialCaseRenderQueue(RENDER_QUEUE_SKIES_EARLY);
36       
37                setSpecialCaseRenderQueueMode(SceneManager::SCRQM_INCLUDE);
38                SceneManager::_renderVisibleObjects( );
39                _deleteRenderedQueueGroups();
40
41                //-- render visible objects (i.e., all but overlay)
42                clearSpecialCaseRenderQueues();
43                addSpecialCaseRenderQueue(RENDER_QUEUE_OVERLAY);
44                setSpecialCaseRenderQueueMode(SceneManager::SCRQM_EXCLUDE);
45
46                mOcclusionCullingTerrainSceneTraverser->setSceneRoot(mOctree);
47                mOcclusionCullingTerrainSceneTraverser->renderScene(mCameraInProgress);
48               
49                _deleteRenderedQueueGroups();
50
51                //-- render overlay
52                clearSpecialCaseRenderQueues();
53                SceneManager::_renderVisibleObjects( );
54       
55                clearSpecialCaseRenderQueues();
56        }
57        //-----------------------------------------------------------------------
58        void OcclusionCullingTerrainSceneManager::_findVisibleObjects(Camera* cam, bool onlyShadowCasters)
59        {
60                // must be empty because objects are found and rendered in an interleaved fashion
61                // in _renderVisibibleObjects
62                //char *msg = "now finding visible objects\n"; OutputDebugString(msg);
63        }
64        //-----------------------------------------------------------------------
65        void OcclusionCullingTerrainSceneManager::_updateSceneGraph(Camera* cam)
66        {
67                //char *msg = "now updating scenegraph\n"; OutputDebugString(msg);
68        mOcclusionCullingTerrainSceneTraverser->setNumSceneNodes((int)mSceneNodes.size());
69                mOcclusionCullingTerrainSceneTraverser->setRenderSystem(mDestRenderSystem);
70        //mOcclusionCullingTerrainSceneTraverser->preprocess();
71                mOcclusionCullingTerrainSceneTraverser->setNumOctreeNodes(mNumOctreeNodes);
72
73                TerrainSceneManager::_updateSceneGraph(cam);
74        }
75        //-----------------------------------------------------------------------
76        bool OcclusionCullingTerrainSceneManager::setOption( const String & key, const void * val )
77        {
78                return mOcclusionCullingTerrainSceneTraverser->setOption( key, val) || TerrainSceneManager::setOption( key, val );
79        }
80        //-----------------------------------------------------------------------
81        bool OcclusionCullingTerrainSceneManager::getOption( const String & key, void *val )
82        {
83                return mOcclusionCullingTerrainSceneTraverser->getOption( key, val) || TerrainSceneManager::getOption( key, val ) ;
84        }
85        //-----------------------------------------------------------------------
86        bool OcclusionCullingTerrainSceneManager::getOptionValues( const String & key, StringVector  &refValueList )
87        {
88                return TerrainSceneManager::getOptionValues( key, refValueList );
89        }
90        //-----------------------------------------------------------------------
91        bool OcclusionCullingTerrainSceneManager::getOptionKeys( StringVector & refKeys )
92        {
93                return mOcclusionCullingTerrainSceneTraverser->getOptionKeys ( refKeys ) || TerrainSceneManager::getOptionKeys( refKeys );
94        }
95        //-----------------------------------------------------------------------
96        void OcclusionCullingTerrainSceneManager::_renderOctant(Camera *cam, Octree *octant)
97        {
98                //Add stuff to be rendered;
99        NodeList::iterator it = octant->mNodes.begin();
100         
101        while ( it != octant->mNodes.end() )
102        {
103            OctreeNode *sn = *it;
104
105            mNumObjects++;
106
107                        // check bounding box visibility of scene nodes
108                        if( cam->isVisible( sn->_getWorldAABB() ) )
109                        {
110                                sn->_addToRenderQueue(cam, getRenderQueue(), false );
111                                //node->_findVisibleObjects(cam, getRenderQueue(), false, mDisplayNodes, false);
112                                mVisible.push_back( sn );
113
114                                if ( mDisplayNodes )
115                                        getRenderQueue()->addRenderable( sn );
116
117                                // check if the scene manager or this node wants the bounding box shown.
118                                if (sn->getShowBoundingBox() || mShowBoundingBoxes)
119                                        sn->_addBoundingBoxToQueue(getRenderQueue());
120
121                                if ( mShowBoxes )
122                                        getRenderQueue()->addRenderable(octant->getWireBoundingBox());
123                        }
124            ++it;
125        }
126
127                SceneManager::_renderVisibleObjects();
128       
129                // delete all rendered objects from renderqueue
130                _deleteRenderedQueueGroups();
131        }
132        //-----------------------------------------------------------------------
133        /*unsigned int OcclusionCullingTerrainSceneManager::countNumOctrees(Octree *root)
134        {
135                unsigned int result = 1;
136                               
137                for(int i=0; i<8; ++i)
138                {
139                        Octree *nextChild = root->mChildren[(i & 4) >> 2][(i & 2) >> 1][i & 1];
140               
141                        if(nextChild != 0)
142                                result += countNumOctrees(nextChild);
143                }
144               
145                return result;
146        }*/
147}       
Note: See TracBrowser for help on using the repository browser.