source: trunk/VUT/OcclusionCullingSceneManager/src/OgreOcclusionCullingOctreeSceneManager.cpp @ 45

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