source: trunk/VUT/work/TestCullingTerrain/TerrainFrameListener.h @ 343

Revision 343, 10.9 KB checked in by mattausch, 19 years ago (diff)

added switch between NV and ARB queries in the render system and in the demos.
Fixed render queue bug: when clearing queue, we traversed through all priority groups
to clear the passmaps. This became very slow because had to traverse many elements (over 1000
for city demo). Now all we destroy the priority groups for each rendering (per hierarchy node).

Line 
1#ifndef _TerrainFrameListener_H__
2#define _TerrainFrameListener_H__
3
4#include "CEGUIForwardRefs.h"
5#include <Ogre.h>
6#include <OgreKeyEvent.h>
7#include <OgreEventListeners.h>
8#include <OgreStringConverter.h>
9#include <OgreException.h>
10#include "VisibilityEnvironment.h"
11#include "VisibilityManager.h"
12#include "OgreTerrainContentGenerator.h"
13#include "OgrePlatformQueryManager.h"
14
15
16class TestCullingTerrainApplication;
17
18
19using namespace Ogre;
20
21/** Struct storing walktrough statistics
22*/
23struct WalkthroughStats
24{
25public:
26
27        unsigned long mAccFps;
28        unsigned long mBestFps;
29        unsigned long mWorstFps;
30        unsigned long mAccTris;
31        unsigned long mAccQueryCulledNodes;
32        unsigned long mAccFrustumCulledNodes;
33        unsigned long mFrameCount;
34        unsigned long mAccRenderedNodes;
35       
36        WalkthroughStats():
37        mAccFps(0), mBestFps(0), mWorstFps(0), mAccTris(0),
38        mAccQueryCulledNodes(0), mAccFrustumCulledNodes(0),
39        mFrameCount(0), mAccRenderedNodes(0)
40        {}
41
42        void Reset()
43        {
44                mAccFps = mBestFps = mWorstFps = mAccTris = mAccQueryCulledNodes = mAccFrustumCulledNodes = mFrameCount = mAccRenderedNodes = 0;
45        }
46
47        void UpdateFrame(int currentFps, int bestFps, int worstFps, int renderedTris, int renderedNodes, int queryCulledNodes, int frustumCulledNodes)
48        {
49                mAccFps += currentFps;
50                mBestFps = bestFps;
51                mWorstFps = worstFps;
52
53                // accumulated #triangles (M)
54                mAccTris += renderedTris / 1000;
55                mAccRenderedNodes += renderedNodes;
56                mAccQueryCulledNodes += queryCulledNodes;
57                mAccFrustumCulledNodes += frustumCulledNodes;
58       
59                ++ mFrameCount;
60        }
61
62        void Print(std::ostream &d, const std::string &algorithmName) const
63        {
64                // compuate average fps and triangle count
65                float avgFps = (float)mAccFps / (float)mFrameCount;
66                float avgTris = (float)mAccTris / (float)mFrameCount;
67                float avgFrustumCulledNodes = 0;
68                float avgRenderedNodes = 0;
69                float avgQueryCulledNodes = 0;
70               
71                if (mFrameCount != 0)
72                {
73                        avgFrustumCulledNodes = (float)mAccFrustumCulledNodes / (float)mFrameCount;
74                        avgQueryCulledNodes  = (float)mAccQueryCulledNodes / (float)mFrameCount;
75                        avgRenderedNodes = (float)mAccRenderedNodes / (float) mFrameCount;
76                }
77
78                //-- write out stats for recorded walkthrough
79                d << "Algorithm: " << algorithmName << "\n"
80                        << "avg. FPS: " << avgFps << "\n"
81                        << "best FPS: " << mBestFps << "\n"
82                        << "worst FPS: " << mWorstFps << "\n"
83                        << "avg. #triangles: " << avgTris << " M\n"
84                        << "#frames: " << mFrameCount << "\n"
85                        << "avg. #query culled nodes: " << avgFrustumCulledNodes << "\n"
86                        << "avg. #frustum culled nodes: " << avgQueryCulledNodes << "\n"
87                        << "avg. #rendered nodes: " << avgRenderedNodes << "\n";
88        }
89
90};
91
92/** Frame listener specialised for terrains.
93*/
94class TerrainFrameListener: public FrameListener, public MouseListener,
95                                                        public MouseMotionListener, public KeyListener
96{
97public:
98       
99   TerrainFrameListener(RenderWindow* win,
100                                                Camera* cam,
101                                                SceneManager *sceneManager,
102                                                CEGUI::Renderer *renderer,
103                                                TerrainContentGenerator *contentGenerator,
104                                                Camera *vizCamera,
105                                                SceneNode *camNode,
106                                                Light *sunLight,
107                                                TestCullingTerrainApplication *app);
108
109   ~TerrainFrameListener();
110
111   bool frameStarted(const FrameEvent& evt);
112   bool frameEnded(const FrameEvent& evt);
113   //bool processUnbufferedKeyInput(const FrameEvent& evt);
114   
115
116   /* MouseListener callbacks. */
117   virtual void mouseClicked(MouseEvent* e) { }
118   virtual void mouseEntered(MouseEvent* e) { }
119   virtual void mouseExited(MouseEvent* e)  { }
120
121   // This is when the mouse button goes DOWN.
122   void mousePressed(MouseEvent* e);
123
124   // This is when the mouse button is let UP.
125   void mouseReleased(MouseEvent* e);
126
127   /* MouseMotionListener callbacks */
128   void mouseMoved(MouseEvent *e);
129   
130   // This is when the mouse is clicked, held and dragged.
131   void mouseDragged(MouseEvent *e);
132
133   void mouseDragDropped(MouseEvent *e);
134   void keyPressed(KeyEvent* e);
135
136   void keyReleased(KeyEvent* e);
137   void keyClicked(KeyEvent* e);
138 
139   /** The information about camera position and orienation per frame.
140   */
141   typedef struct
142   {
143           Vector3 position;
144           Quaternion orientation;
145           Real timeElapsed;
146           Real fps;
147   } frame_info;
148
149   typedef std::vector<frame_info> FrameInfoContainer;
150
151   enum  {WALKTHROUGH, REPLAY, STATE_NUM};
152
153   // visualization modes for scene nodes
154   enum {NODEVIZ_NONE, NODEVIZ_RENDER_NODES, NODEVIZ_RENDER_NODES_AND_CONTENT, NODEVIZ_MODES_NUM};
155   //enum {NODEVIZ_NONE, NODEVIZ_RENDER_GEOMETRY, NODEVIZ_MODES_NUM};
156
157   void zoomVizCamera(int zoom);
158       
159   void addFrameInfo(FrameInfoContainer &frameInfos, SceneNode *camNode, Real timeElapsed);
160   void setCurrentFrameInfo(Real timeElapsed);
161
162   void setAlgorithm(int algorithm);
163
164   void moveCamera();
165
166   void writeFrames();
167   void loadFrames();
168
169        // quick hack
170        void writeNewFrameInfo();
171   
172    bool processUnbufferedKeyInput(const FrameEvent& evt);
173    bool processUnbufferedMouseInput(const FrameEvent& evt);
174
175        /** Shows the frame / algorithm statistics.
176        */
177    void showStats(bool show);
178
179        /** Updates frame statistics and the frame statistics display.
180        */
181        void updateStats();
182
183        /** Toggles wether help screen is shown or not.
184        */
185        void toggleShowHelp();
186       
187        /** Toggles wether shadows are shown or not.
188        */
189        void toggleShowShadows();
190        void toggleDisplayCameraDetails();
191        /** Takes screenshot of the current scene.
192        */
193        void takeScreenshot();
194        /** Takes one video frame.
195        */
196        void takeVideoFrame(std::ofstream &ofstr);
197
198        void nextSceneDetailLevel();
199        void nextFilter();
200        void nextAlgorithm();
201        void nextNodeVizMode();
202        void nextAppState();
203    void changeThreshold(int incr);
204        void changeAssumedVisibility(int incr);
205        void setTestGeometryForVisibleLeaves(bool testGeometryForVisibleLeaves);
206        /** Shows octree hierarchy of the scene.
207        */
208        void toggleShowOctree();
209        /** Toggles wether we use the initial depth pass.
210        */
211        void toggleUseDepthPass();
212        /** Toggles wether we use ARB or NV queries.
213        */
214        void toggleUseArbQueries();
215        /** Toggles wether the visualization is shown.
216        */
217        void toggleShowViz();
218        /** Toggles wether the frames are recorded.
219        */
220        void toggleRecord();
221
222        /** Applies visibility query. Collects the visible objects
223                and their visibility information.
224                @param fromPoint if query should be from point or from camera
225                @param relativeVisibility if query should return number of visible pixels or
226                the ratio visible / projected pixels.
227                @param useItemBuffer if item buffer should be used or occlusion queries
228        */
229        void applyVisibilityQuery(bool fromPoint, bool relativeVisibility, bool useItemBuffer);
230
231        /** Shows result from visibility queries.
232        */
233        void toggleShowQueryStats();
234
235        /** Sets the type of the objects generated in the scene.
236        */
237        void setObjectType(int objectType);
238
239        static String msAlgorithmCaptions[];
240        static String msQueryTypeCaptions[];
241        static String msQueryRelativeVisCaptions[];
242        static String msQueryMethodCaptions[];
243        static Real msObjectTerrainOffsets[];
244        static Real msObjectScales[];
245        static String msObjectCaptions[];
246
247protected:
248
249        void initHelpOverlayElement(String name, int top);
250        void initOverlayElement(OverlayElement **elInfo, String ext, String name,
251                                                        int top, String caption);
252
253        //-- initialise overlays
254        void initHelpOverlay();
255        void initVisStatsOverlay();
256        void initQueryOverlay();
257       
258        SceneManager *mSceneMgr;           // A pointer to the scene manager
259   
260        CEGUI::Renderer *mGUIRenderer;     // cegui renderer
261       
262        int mCurrentAlgorithm;
263        int mVisibilityThreshold;
264        int mAssumedVisibility;
265        /// the current frame number
266        int mCurrentFrame;
267        /// the current application state
268        int mAppState;
269        /// The number of objects on the screen
270        int mObjectCount;           
271        /// visualization mode
272        int mNodeVizMode;
273        /// number of video frames
274        int mNumVideoFrames;
275        /// the newly created object
276        SceneNode *mCurrentObject;   
277
278        WalkthroughStats mWalkthroughStats;
279
280        /// HACK for demo
281        float mDemoFps;
282        bool mUseDemoFps;
283
284        OverlayElement *mAlgorithmInfo;
285        OverlayElement *mThresholdInfo;
286        OverlayElement *mAssumedVisibilityInfo;
287        OverlayElement *mFrustumCulledNodesInfo;
288        OverlayElement *mQueryCulledNodesInfo;
289    OverlayElement *mTraversedNodesInfo;
290        OverlayElement *mHierarchyNodesInfo;
291        OverlayElement *mTestGeometryForVisibleLeavesInfo;
292        OverlayElement *mUseDepthPassInfo;
293        OverlayElement *mUseArbQueriesInfo;
294        OverlayElement *mRenderedNodesInfo;
295        OverlayElement *mObjectsCountInfo;
296        OverlayElement *mQueriesIssuedInfo;
297        OverlayElement *mDelayedQueriesIssuedInfo;
298        OverlayElement *mDelayedTraversedNodesInfo;
299        OverlayElement *mCurrentObjectTypeInfo;
300
301        OverlayElement *mQueryTypeInfo;
302        OverlayElement *mQueryVisibleNodesInfo;
303        OverlayElement *mQueryVisibleGeometryInfo;
304        OverlayElement *mQueryVisiblePatchInfo;
305
306        OverlayElement *mQueryVisiblityInfo;
307        OverlayElement *mQueryNodeVisibilityInfo;
308        OverlayElement *mQueryGeometryVisibilityInfo;
309        OverlayElement *mQueryPatchVisibilityInfo;
310        //OverlayElement *mHelpInfo;
311
312        RayQueryExecutor *mRayQueryExecutor;
313        TerrainContentGenerator *mTerrainContentGenerator;
314
315        bool mTestGeometryForVisibleLeaves;
316        bool mShowOctree;
317        bool mUseDepthPass;
318        bool mUseArbQueries;
319        bool mShowVisualization;
320        bool mCullCamera;
321        bool mRecordFrames;
322        bool mShowShadows;
323        bool mVisualizeCulledNodes;
324        bool mShowHelp;
325        bool mStatsOn;
326        bool mLMouseDown, mRMouseDown;     // True if the mouse buttons are down
327        bool mShutdownRequested;
328        bool mDisplayCameraDetails;
329        bool mUseItemBuffer;
330        bool mUseAnimation;
331       
332        int mItemBufferMode;
333
334        Real mVizCameraHeight;
335
336        Camera *mVizCamera;
337        SceneNode *mCamNode;
338       
339        /// Per frame data stored for a walkthrough
340        FrameInfoContainer mFrameInfo;
341        /// HACK: for demo
342        FrameInfoContainer mSavedFrameInfo;
343       
344        Real mReplayTimeElapsed;
345        //EventProcessor* mEventProcessor;
346    InputReader* mInputDevice;
347    Camera* mCamera;
348
349    Vector3 mTranslateVector;
350    RenderWindow* mWindow;
351   
352        unsigned int mNumScreenShots;
353    int mSceneDetailIndex;
354        int mAniso;
355
356        float mMoveScale;
357    Degree mRotScale;
358
359    // just to stop toggles flipping too fast
360    Real mTimeDelay;
361    Radian mRotX, mRotY;
362    TextureFilterOptions mFiltering;
363 
364        Real mMoveSpeed;
365    Degree mRotateSpeed;
366   
367        Overlay* mDebugOverlay;
368        Overlay* mHelpOverlay;
369        Overlay* mCullStatsOverlay;
370        Overlay* mQueryOverlay;
371
372        Light *mSunLight;
373        GtpVisibility::VisibilityManager *mVisibilityManager;
374        EventProcessor* mEventProcessor;
375       
376        bool mShiftPressed;
377        bool mShowQueryStats;
378       
379        //bool mUseBufferedInputKeys, mUseBufferedInputMouse, mInputTypeSwitchingOn;
380        PlatformQueryManager *mQueryManager;
381
382        float mDelayedQueriesIssued;
383        float mDelayedTraversedNodes;
384
385        int mCurrentObjectType;
386
387        bool mDeleteObjects;
388        bool mRecordVideo;
389
390        Timer *mTimer;
391        long mTimeFrameEnded;
392        long mTimeFrameStarted;
393        float mPureRenderTimeFps;
394        TestCullingTerrainApplication *mApplication;
395};
396
397
398#endif //_TerrainFrameListener_H__
Note: See TracBrowser for help on using the repository browser.