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

Revision 44, 5.5 KB checked in by mattausch, 19 years ago (diff)

implementation for terrain + octree scenemanager

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