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

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