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

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