source: GTP/trunk/Lib/Vis/OnlineCullingCHC/OGRE/include/OgreOcclusionCullingSceneManager.h @ 2254

Revision 2254, 9.6 KB checked in by mattausch, 17 years ago (diff)

fixed problems of particle demo + visibility manager

Line 
1#ifndef _OcclusionCullingSceneManager_H__
2#define _OcclusionCullingSceneManager_H__
3
4#include <OgreSceneNode.h>
5#include <OgreTerrainSceneManager.h>
6#include <OgreOctreeNode.h>
7#include <OgreOctreeCamera.h>
8#include <OgrePrerequisites.h>
9#include <OgreMovableObject.h>
10#include "OgreOctreeHierarchyInterface.h"
11#include "OgrePlatformQueryManager.h"
12#include "VisibilityManager.h"
13#include "Containers.h"
14#include "ViewCellsManager.h"
15#include "VisibilityInfo.h"
16
17
18namespace GtpVisibilityPreprocessor {
19class Intersectable;
20}
21
22class ObjReader;
23
24
25namespace Ogre {
26
27
28/**
29        This class extends the terrain scene manager,
30        using occlusion queries for visibility culling.
31*/
32class __declspec(dllexport) OcclusionCullingSceneManager: public TerrainSceneManager
33{
34public:
35        OcclusionCullingSceneManager(const String& name,
36                                                                 GtpVisibility::VisibilityManager *visManager);
37        ~OcclusionCullingSceneManager();
38
39        void _renderVisibleObjects();
40        void myFindVisibleObjects(Camera* cam, bool onlyShadowCasters);
41        void _updateSceneGraph(Camera* cam);
42
43        /** Sets the given option for the SceneManager
44                @remarks Options are: "Algorithm", int *;                       
45        */
46       
47        virtual bool setOption(const String &, const void *);
48        /** Gets the given option for the Scene VisibilityManager.
49            @remarks
50                See setOption
51        */
52        virtual bool getOption(const String &, void *);
53
54        bool getOptionValues(const String & key, StringVector &refValueList);
55        bool getOptionKeys(StringVector &refKeys);
56
57        /** Sets the visibility manager.
58                @param visManager the visibility manager
59        */
60        void setVisibilityManager(GtpVisibility::VisibilityManager *visManager);
61        /** See set.
62        */
63        GtpVisibility::VisibilityManager *getVisibilityManager();
64
65        /** Render a queue group.
66                Override so we can handle delayed rendering of transparent objects
67        */
68        void renderBasicQueueGroupObjects(RenderQueueGroup* pGroup,
69                                                                          QueuedRenderableCollection::OrganisationMode om);
70
71        /** Writes out stats into the Ogre log file.
72        */
73        void WriteLog();
74
75        /** Override pass so we can do the z-fail pass.
76        */
77        virtual const Pass* _setPass(const Pass* pass, bool evenIfSuppressed = false);
78
79        /** Override from SceneManager so we can skip all but first pass for depth pass.
80        */
81        bool validatePassForRendering(Pass* pass);
82
83#ifdef ITEM_BUFFER
84        void RenderItemBuffer(RenderPriorityGroup* pGroup);
85        void RenderSingleObjectForItemBuffer(Renderable *rend, Pass *pass);
86#endif // ITEM_BUFFER
87
88        void _renderQueueGroupObjects(RenderQueueGroup* pGroup,
89                                                                  QueuedRenderableCollection::OrganisationMode om);
90
91        /** Override from SceneManager so that sub entities can be assigned
92                an id for item buffer.
93        */
94        Entity* createEntity(const String& entityName, const String& meshName);
95
96        /** Returns pointer to visibility manager.
97        */
98        GtpVisibility::VisibilityManager *GetVisibilityManager();
99
100        /** Returns hierarchy interface.
101        */
102        OctreeHierarchyInterface *GetHierarchyInterface();
103
104        /** Inherited from scene manager. Neccesary to draw terrain properly.
105        */
106        void endFrame();
107
108        void renderAdditiveStencilShadowedQueueGroupObjects(
109                                RenderQueueGroup* pGroup,
110                                QueuedRenderableCollection::OrganisationMode om);
111        void renderModulativeStencilShadowedQueueGroupObjects(
112                                RenderQueueGroup* pGroup,
113                                QueuedRenderableCollection::OrganisationMode om);
114       
115        /** Override standard function so octree boxes are always of equal side length.
116                This has advantages for CHC, because terrain tiles are in different octree nodes
117                and can be culled.
118                msz: Modified to reflect changes in Ogre::TerrainSceneManager
119        */
120#if 1
121        virtual void setWorldGeometry(DataStreamPtr& stream, const String& typeName);
122#endif
123       
124        /** Loads view cells for this particular scene.
125        */
126        bool LoadViewCells(const String &filename);
127
128        void RenderDepthForQuery(Camera* camera, Viewport* vp);
129
130        void _findVisibleObjects(Camera* cam, bool onlyShadowCasters);
131
132protected:
133       
134        void MailPvsObjects();
135        void RenderPvsEntry(GtpVisibilityPreprocessor::Intersectable *obj);
136        void SetObjectVisible(GtpVisibilityPreprocessor::Intersectable *entry,
137                                                  const bool visible);
138
139        void ShowViewCellsGeometry();
140
141        /** Creates material for depth pass, e.g., a pass that only fills the depth buffer.
142        */
143        void InitDepthPass();
144        /** Creates material for item buffer.
145        */
146        void InitItemBufferPass();
147        /** Fills render queue so that a visualization can be rendered.
148        */
149        void PrepareVisualization(Camera *cam);
150        /** Initialises necessary parameters for hierarchical visibility culling.
151        */
152        void InitVisibilityCulling(Camera *cam);
153        /** Loads / unloads pvs of the view cell to set the visibility in the scene.
154        */
155        void ApplyViewCellPvs(GtpVisibilityPreprocessor::ViewCell *vc, const bool load);
156
157        /** updates pvs in current frame.
158        */
159        void UpdatePvs(Camera *cam);
160
161        /** Sets all objects invisible.
162        */
163        void SetObjectsVisible(const bool visible);
164
165        /** Creates view cells geometry from the loaded view cells.
166        */
167        void CreateViewCellsGeometry();
168        void VisualizeViewCells(const bool visualize);
169
170        /** Load an iv scene.
171        */
172        bool LoadSceneIV(const String &filename,
173                                         SceneNode *root,
174                                         const int index);
175
176        /** Load obj scene.
177        */
178        bool LoadSceneObj(const String &filename,
179                                          const String &viewCellsFile,
180                                          SceneNode *root);
181
182        /** Load a scene.
183        */
184        bool LoadScene(const String &filename,
185                                   const String &viewCellsFilename);
186
187        void loadConfig(DataStreamPtr& stream);
188
189        void RenderHierarchicalCulling(const bool fillRenderQueue = true);
190
191        void _renderScene(Camera* camera, Viewport* vp, bool includeOverlays);
192
193        int FindExactVisibleObjects(Camera *camera,
194                                                                Viewport* vp,
195                                                                const bool fromPoint,
196                                                                const bool nodeVisibility);     
197
198        void AddVisibleMeshGeometryToQueue(const GtpVisibility::MeshInfoContainer &visibleGeometry,
199                                                                           Camera *cam);
200        void AddVisibleNodeGeometryToQueue(const GtpVisibility::NodeInfoContainer &visibleNodes,
201                                                                           Camera *cam);
202
203        //////////////////////////////////////////
204
205        /// the interface to the scene hierarchy.
206        OctreeHierarchyInterface *mHierarchyInterface;
207
208        /// manages all visibility options
209        GtpVisibility::VisibilityManager *mVisibilityManager;
210
211        /// if a visualization of the hierarchical culling is shown
212        bool mShowVisualization;
213
214        /// if the culled nodes are indicated in the visualization
215        bool mVisualizeCulledNodes;
216
217        /// if symbols for the nodes are shown in the visualization
218        bool mRenderNodesForViz;
219        /// if content of the nodes is shown in the visualization
220        bool mRenderNodesContentForViz;
221
222        /// render transparents after the hierarchical traversal
223        bool mDelayRenderTransparents;
224
225        /// use a depth pass (i.e., fill only the depth buffer in the first pass)
226        bool mUseDepthPass;
227        /// flag indicating if we currently render the depth pass
228        bool mIsDepthPassPhase;
229       
230        /// if we use an item buffer for rendering (i.e., object ids as color codes
231        bool mUseItemBuffer;
232        /// if we currently render the item buffer
233        bool mIsItemBufferPhase;
234
235        /// if depth write should be enabled
236        bool mEnableDepthWrite;
237        /// if transparents are skipped during rendering
238        bool mSkipTransparents;
239
240        /// the depth pass (no lighting, just filling the depth buffer)
241        Pass *mDepthPass;
242        /// the pass for item buffer setting a color id
243        Pass *mItemBufferPass;
244
245        /// flag for passes which should not be deleted from queue during first traversal
246        int mLeavePassesInQueue;
247
248        /// if transparent object are considered for item buffer visibility
249        bool mRenderTransparentsForItemBuffer;
250        /// Always execute the vertex program of a pass, e.g., for the depth pass or item buffer
251        bool mExecuteVertexProgramForAllPasses;
252
253        /// if hierarchical culling is currently in use
254        bool mIsHierarchicalCulling;
255
256        /// do we use preprocessed visibility
257        bool mViewCellsLoaded;
258
259        /// the view cells manager handling the preprocesor stuff
260        GtpVisibilityPreprocessor::ViewCellsManager *mViewCellsManager;
261
262
263        /// Used to assign Ogre meshes to view cell entries.
264        GtpVisibilityPreprocessor::ObjectContainer mObjects;
265
266        GtpVisibilityPreprocessor::ViewCell *mElementaryViewCell;
267        GtpVisibilityPreprocessor::ViewCell *mCurrentViewCell;
268
269        /// If view cells are used.
270        bool mUseViewCells;
271
272        /// if view cells visualization should be shown
273        bool mShowViewCells;
274
275        /// if the view cells are filtered
276        bool mUseVisibilityFilter;
277
278        bool mDeleteQueueAfterRendering;
279
280        // normal terrain rendering
281        bool mNormalExecution;
282
283        // helper variable to provide sequential numbering for sub-entities
284        int mCurrentEntityId;
285
286        typedef map<int, MovableObject *> MovableMap;
287
288        /// hash table for view cells geometry
289    MovableMap mViewCellsGeometry;
290
291        bool mViewCellsGeometryLoaded;
292
293        string mViewCellsFilename;
294        string mFilename;
295
296        bool mShowTerrain;
297
298        int mFlushRate;
299        int mCurrentFrame;
300
301        ObjReader *mObjReader;
302
303        bool mUseVisibilityQueries;
304
305        bool mUseFromPointQueries;
306
307        bool mUseExactQueries;
308       
309        bool mUseDepthPassForQueries;
310};
311
312
313/** Factory for VisibilityOctreeSceneManager.
314*/
315class OcclusionCullingSceneManagerFactory : public SceneManagerFactory
316{
317protected:
318        typedef std::vector<TerrainPageSource*> TerrainPageSources;
319        TerrainPageSources mTerrainPageSources;
320        void initMetaData(void) const;
321        GtpVisibility::VisibilityManager *visManager;
322public:
323        OcclusionCullingSceneManagerFactory(GtpVisibility::VisibilityManager *vm)
324        {
325                visManager = vm;
326        }
327
328        /// Factory type name
329        static const String FACTORY_TYPE_NAME;
330        SceneManager* createInstance(const String& instanceName);
331        void destroyInstance(SceneManager* instance);
332};
333
334} // namespace Ogre
335
336#endif // OcclusionCullingSceneManager_H
Note: See TracBrowser for help on using the repository browser.