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

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