source: trunk/VUT/Ogre/src/OgreVisibilitySceneManager.cpp @ 111

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