source: trunk/VUT/Ogre/src/OgreVisibilityOctreeSceneManager.cpp @ 87

Revision 87, 4.9 KB checked in by mattausch, 19 years ago (diff)
Line 
1#include "OgreVisibilityOctreeSceneManager.h"
2#include "OgreVisibilityOptionsManager.h"
3#include <OgreMath.h>
4#include <OgreIteratorWrappers.h>
5#include <OgreRenderSystem.h>
6#include <OgreCamera.h>
7
8#include <windows.h>
9
10namespace Ogre {
11
12//-----------------------------------------------------------------------
13VisibilityOctreeSceneManager::VisibilityOctreeSceneManager(
14        GtpVisibility::VisibilityManager *visManager)
15: mVisibilityManager(visManager), mUseCulling(true)
16{
17        mHierarchyInterface =
18                new OctreeHierarchyInterface(this, mDestRenderSystem);
19//      visManager->SetCullingManager(GtpVisibility::VisibilityEnvironment::STOP_AND_WAIT_CULLING);
20        //mDisplayNodes = true;
21        //mShowBoundingBoxes = true;
22        //mShowBoxes = true;
23
24        mMaxDepth = 20;
25}
26//-----------------------------------------------------------------------
27VisibilityOctreeSceneManager::~VisibilityOctreeSceneManager()
28{
29        delete mHierarchyInterface;
30}
31//-----------------------------------------------------------------------
32void VisibilityOctreeSceneManager::_renderVisibleObjects()
33{
34        mHierarchyInterface->InitFrame(mOctree, mCameraInProgress);
35        mVisibilityManager->GetCullingManager()->InitFrame();
36
37        if(!mUseCulling)
38        {       
39                OctreeSceneManager::_renderVisibleObjects();
40                return;
41        }
42   
43        //-- hierarchical culling
44        // the objects of different layers (e.g., background, scene,
45        // overlay) must be identified and rendered one after another
46
47        //-- render background
48        clearSpecialCaseRenderQueues();
49        addSpecialCaseRenderQueue(RENDER_QUEUE_BACKGROUND);
50        addSpecialCaseRenderQueue(RENDER_QUEUE_SKIES_EARLY);
51
52        setSpecialCaseRenderQueueMode(SceneManager::SCRQM_INCLUDE);
53        SceneManager::_renderVisibleObjects();
54
55#ifdef GTP_VISIBILITY_MODIFIED_OGRE
56        _deleteRenderedQueueGroups();
57#endif
58
59        //-- render visible objects (i.e., all but overlay)
60        clearSpecialCaseRenderQueues();
61        addSpecialCaseRenderQueue(RENDER_QUEUE_OVERLAY);
62        setSpecialCaseRenderQueueMode(SceneManager::SCRQM_EXCLUDE);
63
64        //-- the hierarchical culling algorithm
65        mVisibilityManager->ApplyVisibilityCulling();
66
67#ifdef GTP_VISIBILITY_MODIFIED_OGRE
68        _deleteRenderedQueueGroups();
69#endif
70
71        //-- render remaining objects, e.g., overlay
72        clearSpecialCaseRenderQueues();
73        SceneManager::_renderVisibleObjects();
74}
75//-----------------------------------------------------------------------
76void VisibilityOctreeSceneManager::_findVisibleObjects(Camera* cam, bool onlyShadowCasters)
77{
78        // empty if hierarchical culling is used =>
79        // we interleave identification and rendering of objects
80        // in _renderVisibibleObjects
81        if(!mUseCulling)
82        {
83                OctreeSceneManager::_findVisibleObjects(cam, onlyShadowCasters);
84        }
85}
86//-----------------------------------------------------------------------
87void VisibilityOctreeSceneManager::_updateSceneGraph(Camera* cam)
88{
89        mVisibilityManager->GetCullingManager()->SetHierarchyInterface(mHierarchyInterface);
90        mHierarchyInterface->SetRenderSystem(mDestRenderSystem);
91
92#ifdef GTP_VISIBILITY_MODIFIED_OGRE
93    mHierarchyInterface->SetNumOctreeNodes(mNumOctreeNodes);
94#endif
95        OctreeSceneManager::_updateSceneGraph(cam);
96}
97//-----------------------------------------------------------------------
98bool VisibilityOctreeSceneManager::setOption(const String & key, const void * val)
99{
100        if (key == "UseCulling")
101        {
102                mUseCulling = (*static_cast<const bool *>(val));
103                return true;
104        }
105
106        return VisibilityOptionsManager(mVisibilityManager, mHierarchyInterface).
107                setOption(key, val) || OctreeSceneManager::setOption(key, val);
108}
109//-----------------------------------------------------------------------
110bool VisibilityOctreeSceneManager::getOption(const String & key, void *val)
111{
112        if (key == "NumHierarchyNodes")
113        {
114                * static_cast<unsigned int *>(val) = (unsigned int)mNumOctreeNodes;
115                return true;
116        }
117
118        return VisibilityOptionsManager(mVisibilityManager, mHierarchyInterface).
119                getOption(key, val) && OctreeSceneManager::getOption(key, val);
120}
121//-----------------------------------------------------------------------
122bool VisibilityOctreeSceneManager::getOptionValues(const String & key, StringVector  &refValueList)
123{
124        return OctreeSceneManager::getOptionValues( key, refValueList );
125}
126//-----------------------------------------------------------------------
127bool VisibilityOctreeSceneManager::getOptionKeys(StringVector & refKeys)
128{
129        return  VisibilityOptionsManager(mVisibilityManager, mHierarchyInterface).
130                getOptionKeys ( refKeys ) || OctreeSceneManager::getOptionKeys(refKeys);
131}
132//-----------------------------------------------------------------------
133void VisibilityOctreeSceneManager::setVisibilityManager(GtpVisibility::VisibilityManager *visManager)
134{
135    mVisibilityManager = visManager;
136}
137//-----------------------------------------------------------------------
138GtpVisibility::VisibilityManager *VisibilityOctreeSceneManager::getVisibilityManager()
139{
140        return mVisibilityManager;
141}
142
143}   // namespace Ogre
Note: See TracBrowser for help on using the repository browser.