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

Revision 103, 4.7 KB checked in by mattausch, 19 years ago (diff)

fixed bug with shadow maps

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