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

Revision 96, 5.9 KB checked in by mattausch, 19 years ago (diff)
Line 
1#include "OgreVisibilityTerrainSceneManager.h"
2#include "OgreOctreeHierarchyInterface.h"
3#include "OgreVisibilityOptionsManager.h"
4#include <OgreMath.h>
5#include <OgreIteratorWrappers.h>
6#include <OgreRenderSystem.h>
7#include <OgreCamera.h>
8#include <OgreLogManager.h>
9
10#include <windows.h>
11
12namespace Ogre {
13
14//-----------------------------------------------------------------------
15VisibilityTerrainSceneManager::VisibilityTerrainSceneManager(
16        GtpVisibility::VisibilityManager *visManager)
17: mVisibilityManager(visManager), mUseCulling(true)
18{
19        mHierarchyInterface =
20                new OctreeHierarchyInterface(this, mDestRenderSystem);
21
22        //mDisplayNodes = true;
23        //mShowBoundingBoxes = true;
24        mMaxDepth = 50;
25}
26//-----------------------------------------------------------------------
27VisibilityTerrainSceneManager::~VisibilityTerrainSceneManager()
28{
29        delete mHierarchyInterface;
30}
31//-----------------------------------------------------------------------
32void VisibilityTerrainSceneManager::_renderVisibleObjects()
33{
34        // two cameras (one for culling, one for rendering)
35        mHierarchyInterface->InitFrame(mOctree, mCameraInProgress,
36                                                        mCullCamera ? getCamera("CullCamera") : NULL);
37        mVisibilityManager->GetCullingManager()->InitFrame();
38       
39        // standard scenemanager rendering without hierarchical culling
40        if(!mUseCulling)
41        {       
42                OctreeSceneManager::_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 VisibilityTerrainSceneManager::_findVisibleObjects(Camera* cam, bool onlyShadowCasters)
79{
80        // empty if hierarchical culling is used =>
81        // we interleave identification and rendering of objects
82        // in _renderVisibibleObjects
83        if(!mUseCulling)
84        {
85                OctreeSceneManager::_findVisibleObjects(cam, onlyShadowCasters);
86        }
87}
88//-----------------------------------------------------------------------
89void VisibilityTerrainSceneManager::_updateSceneGraph(Camera* cam)
90{
91        //mHierarchyInterface->setNumSceneNodes((int)mSceneNodes.size());
92        mVisibilityManager->GetCullingManager()->SetHierarchyInterface(mHierarchyInterface);
93        mHierarchyInterface->SetRenderSystem(mDestRenderSystem);
94
95#ifdef GTP_VISIBILITY_MODIFIED_OGRE
96    mHierarchyInterface->SetNumOctreeNodes(mNumOctreeNodes);
97#endif
98        TerrainSceneManager::_updateSceneGraph(cam);
99}
100//-----------------------------------------------------------------------
101bool VisibilityTerrainSceneManager::setOption(const String & key, const void * val)
102{
103        if (key == "UseCulling")
104        {
105                mUseCulling = (*static_cast<const bool *>(val));
106                return true;
107        }
108
109        return VisibilityOptionsManager(mVisibilityManager, mHierarchyInterface).
110                setOption(key, val) || TerrainSceneManager::setOption(key, val);
111}
112//-----------------------------------------------------------------------
113bool VisibilityTerrainSceneManager::getOption(const String & key, void *val)
114{
115        if (key == "NumHierarchyNodes")
116        {
117                * static_cast<unsigned int *>(val) = (unsigned int)mNumOctreeNodes;
118                return true;
119        }
120       
121        return VisibilityOptionsManager(mVisibilityManager, mHierarchyInterface).
122                getOption(key, val) && TerrainSceneManager::getOption(key, val);
123}
124//-----------------------------------------------------------------------
125bool VisibilityTerrainSceneManager::getOptionValues(const String & key, StringVector  &refValueList)
126{
127        return TerrainSceneManager::getOptionValues( key, refValueList);
128}
129//-----------------------------------------------------------------------
130bool VisibilityTerrainSceneManager::getOptionKeys(StringVector & refKeys)
131{
132        return VisibilityOptionsManager(mVisibilityManager, mHierarchyInterface).
133                getOptionKeys(refKeys) || TerrainSceneManager::getOptionKeys(refKeys);
134}
135//-----------------------------------------------------------------------
136void VisibilityTerrainSceneManager::setVisibilityManager(GtpVisibility::VisibilityManager *visManager)
137{
138        mVisibilityManager = visManager;
139}
140//-----------------------------------------------------------------------
141GtpVisibility::VisibilityManager *VisibilityTerrainSceneManager::getVisibilityManager( void )
142{
143        return mVisibilityManager;
144}
145//-----------------------------------------------------------------------
146void VisibilityTerrainSceneManager::WriteLog()
147{
148        std::stringstream d;
149
150        d << "Algorithm type: " << mVisibilityManager->GetCullingManagerType() << ", "
151          << "Hierarchy nodes: " << mNumOctreeNodes << ", " << "Traversed nodes: " << mHierarchyInterface->GetNumTraversedNodes() << ", "
152          << "Rendered nodes: " << mHierarchyInterface->GetNumRenderedNodes() << ", "
153          << "Query culled nodes: " << mVisibilityManager->GetCullingManager()->GetNumQueryCulledNodes() << ", "
154          << "Frustum culled nodes: " << mVisibilityManager->GetCullingManager()->GetNumFrustumCulledNodes() << ", "
155      << "Queries issued: " << mVisibilityManager->GetCullingManager()->GetNumQueriesIssued() << "\n";
156
157        LogManager::getSingleton().logMessage(d.str());
158}
159} // namespace Ogre
Note: See TracBrowser for help on using the repository browser.