source: GTP/trunk/App/Demos/Vis/HillyTerrain/OGRE/TerrainFrameListener.h @ 945

Revision 945, 12.2 KB checked in by mattausch, 18 years ago (diff)
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                        << "#frames: " << mFrameCount << "\n"
84                        << "avg. #triangles: " << avgTris << " M\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     
114
115   /* MouseListener callbacks. */
116   virtual void mouseClicked(MouseEvent* e) { }
117   virtual void mouseEntered(MouseEvent* e) { }
118   virtual void mouseExited(MouseEvent* e)  { }
119
120   // This is when the mouse button goes DOWN.
121   void mousePressed(MouseEvent* e);
122
123   // This is when the mouse button is let UP.
124   void mouseReleased(MouseEvent* e);
125
126   /* MouseMotionListener callbacks */
127   void mouseMoved(MouseEvent *e);
128   
129   // This is when the mouse is clicked, held and dragged.
130   void mouseDragged(MouseEvent *e);
131
132   void mouseDragDropped(MouseEvent *e);
133   void keyPressed(KeyEvent* e);
134
135   void keyReleased(KeyEvent* e);
136   void keyClicked(KeyEvent* e);
137 
138   /** The information about camera position and orienation per frame.
139   */
140   typedef struct
141   {
142           Vector3 position;
143           Quaternion orientation;
144           Real timeElapsed;
145           Real fps;
146   } frame_info;
147
148   typedef std::vector<frame_info> FrameInfoContainer;
149
150   enum  {WALKTHROUGH, REPLAY, STATE_NUM};
151
152   // visualization modes for scene nodes
153   enum {
154                 NODEVIZ_NONE,
155                 NODEVIZ_RENDER_NODES,
156                 NODEVIZ_RENDER_NODES_AND_CONTENT,
157                 NODEVIZ_MODES_NUM};
158
159   //enum {NODEVIZ_NONE, NODEVIZ_RENDER_GEOMETRY, NODEVIZ_MODES_NUM};
160
161   void zoomVizCamera(int zoom);
162       
163   void addFrameInfo(FrameInfoContainer &frameInfos, SceneNode *camNode, Real timeElapsed);
164   void setCurrentFrameInfo(Real timeElapsed);
165
166   void setAlgorithm(int algorithm);
167
168   void moveCamera();
169
170   void writeFrames(const std::string filename, const FrameInfoContainer &frameInfo) const;
171   void loadFrames(const std::string filename, FrameInfoContainer &frameInfo);
172
173    bool processUnbufferedKeyInput(const FrameEvent& evt);
174    bool processUnbufferedMouseInput(const FrameEvent& evt);
175
176        void switchMouseMode();
177       
178        /** Shows the frame / algorithm statistics.
179        */
180    void showStats(bool show);
181
182        /** Updates frame statistics and the frame statistics display.
183        */
184        void updateStats();
185
186        /** Toggles whether help screen is shown or not.
187        */
188        void toggleShowHelp();
189       
190        /** Toggles whether shadows are shown or not.
191        */
192        void toggleShowShadows();
193        /** if camera stats (e.g, location, orientation, ...) should be displayed-
194        */
195        void toggleDisplayCameraDetails();
196        /** Takes screenshot of the current scene.
197        */
198        void takeScreenshot();
199        /** Takes one video frame.
200        */
201        void takeVideoFrame(std::ofstream &ofstr);
202
203        void nextSceneDetailLevel();
204        void nextFilter();
205        void nextAlgorithm();
206        void nextNodeVizMode();
207        void nextAppState();
208    void changeThreshold(int incr);
209        void changeAssumedVisibility(int incr);
210        void changeVizScale(const int incr);
211        void setTestGeometryForVisibleLeaves(bool testGeometryForVisibleLeaves);
212        /** Shows octree hierarchy of the scene.
213        */
214        void toggleShowOctree();
215        /** Toggles between view cells / no view cells.
216        */
217        void toggleUseViewCells();
218
219        void toggleUseVisibilityFilter();
220
221        /** Toggles whether we use the initial depth pass.
222        */
223        void toggleUseDepthPass();
224        /** Toggles whether the visualization is shown.
225        */
226        void toggleShowViz();
227        /** Toggles whether the frames are recorded.
228        */
229        void toggleRecord();
230
231        /** Applies visibility query. Collects the visible objects
232                and their visibility information.
233                @param fromPoint if query should be from point or from camera
234                @param relativeVisibility if query should return number of visible pixels or
235                the ratio visible / projected pixels.
236                @param useItemBuffer if item buffer should be used or occlusion queries
237        */
238        void applyVisibilityQuery(bool fromPoint, bool relativeVisibility, bool useItemBuffer);
239
240        /** Shows result from visibility queries.
241        */
242        void toggleShowQueryStats();
243
244        /** Sets the type of the objects generated in the scene.
245        */
246        void setObjectType(int objectType);
247
248        static String msAlgorithmCaptions[];
249        static String msApprevAlgorithmCaptions[];
250        static String msQueryTypeCaptions[];
251        static String msQueryRelativeVisCaptions[];
252        static String msQueryMethodCaptions[];
253        static Real msObjectTerrainOffsets[];
254        static Real msObjectScales[];
255        static String msObjectCaptions[];
256
257protected:
258
259        void initHelpOverlayElement(String name, int top);
260        void initOverlayElement(OverlayElement **elInfo, String ext, String name,
261                                                        int top, String caption);
262
263        //-- initialise overlays
264        void initHelpOverlay();
265        void initVisStatsOverlay();
266        void initQueryOverlay();
267       
268        SceneManager *mSceneMgr;           // A pointer to the scene manager
269   
270        CEGUI::Renderer *mGUIRenderer;     // cegui renderer
271       
272        int mCurrentAlgorithm;
273        int mVisibilityThreshold;
274        int mAssumedVisibility;
275        /// the current frame number
276        int mCurrentFrame;
277        /// the current application state
278        int mAppState;
279        /// The number of objects on the screen
280        int mObjectCount;           
281        /// visualization mode
282        int mNodeVizMode;
283        /// number of video frames
284        int mNumVideoFrames;
285        /// the newly created object
286        SceneNode *mCurrentObject;   
287
288        WalkthroughStats mWalkthroughStats;
289
290        /// visualization scale
291        float mVizScale;
292
293        ////////////////////////////////////////////////////////////////////////
294
295        /** HACK for recording demo:
296                1) the walkthrough must be recorded.
297                2) the walktrough must be replayed using the different options, e.g., CHC
298                   with the mSavePrecomputedFps (key "E") option. This saves the frame rates
299                   for the different methods.
300            3) the walkthrough must then be replayed with the mRecordDemo (KEY "M") options turned on.
301                   for the video recording we are using FRAPS.
302        */
303
304        /// the currently interpolated FPS
305        float mPrecomputedFps;
306        /// saves the precomputed fps for the different methods.
307        bool mSavePrecomputedFps;
308        /// displayes the precomputed fps
309        bool mRecordDemo;
310       
311        ////////////////////////////////////////////////////////////////////////////
312
313
314        OverlayElement *mAlgorithmInfo;
315        OverlayElement *mThresholdInfo;
316        OverlayElement *mAssumedVisibilityInfo;
317        OverlayElement *mFrustumCulledNodesInfo;
318        OverlayElement *mQueryCulledNodesInfo;
319    OverlayElement *mTraversedNodesInfo;
320        OverlayElement *mHierarchyNodesInfo;
321        OverlayElement *mTestGeometryForVisibleLeavesInfo;
322        OverlayElement *mUseDepthPassInfo;
323        OverlayElement *mRenderedNodesInfo;
324        OverlayElement *mObjectsCountInfo;
325        OverlayElement *mQueriesIssuedInfo;
326        OverlayElement *mDelayedQueriesIssuedInfo;
327        OverlayElement *mDelayedTraversedNodesInfo;
328        OverlayElement *mCurrentObjectTypeInfo;
329        OverlayElement *mViewCellsInfo;
330
331        OverlayElement *mMyStatsAlgorithmInfo;
332        OverlayElement *mMyStatsFpsInfo;
333
334        OverlayElement *mMyLoadingInfo;
335       
336        OverlayElement *mQueryTypeInfo;
337        OverlayElement *mQueryVisibleNodesInfo;
338        OverlayElement *mQueryVisibleGeometryInfo;
339        OverlayElement *mQueryVisiblePatchInfo;
340
341        OverlayElement *mQueryVisiblityInfo;
342        OverlayElement *mQueryNodeVisibilityInfo;
343        OverlayElement *mQueryGeometryVisibilityInfo;
344        OverlayElement *mQueryPatchVisibilityInfo;
345        //OverlayElement *mHelpInfo;
346
347        RayQueryExecutor *mRayQueryExecutor;
348        TerrainContentGenerator *mTerrainContentGenerator;
349
350        bool mTestGeometryForVisibleLeaves;
351        bool mShowOctree;
352        bool mUseDepthPass;
353        bool mShowVisualization;
354        bool mCullCamera;
355        bool mRecordFrames;
356        bool mShowShadows;
357        bool mVisualizeCulledNodes;
358        bool mShowHelp;
359        bool mStatsOn;
360        bool mLMouseDown;
361        bool mRMouseDown;     // True if the mouse buttons are down
362        bool mShutdownRequested;
363        bool mDisplayCameraDetails;
364        bool mUseItemBuffer;
365        bool mUseAnimation;
366       
367        int mItemBufferMode;
368
369        Real mVizCameraHeight;
370
371        Camera *mVizCamera;
372        SceneNode *mCamNode;
373       
374        /// Per frame data stored for a walkthrough
375        FrameInfoContainer mFrameInfo;
376        /// HACK for demo
377        FrameInfoContainer mPrecomputedFpsFrameInfo;
378       
379        Real mReplayTimeElapsed;
380        //EventProcessor* mEventProcessor;
381    InputReader* mInputDevice;
382    Camera* mCamera;
383
384    Vector3 mTranslateVector;
385    RenderWindow* mWindow;
386   
387        unsigned int mNumScreenShots;
388    int mSceneDetailIndex;
389        int mAniso;
390
391        float mMoveScale;
392    Degree mRotScale;
393
394    // just to stop toggles flipping too fast
395    Real mTimeDelay;
396    Radian mRotX, mRotY;
397    TextureFilterOptions mFiltering;
398 
399        Real mMoveSpeed;
400    Degree mRotateSpeed;
401   
402        Overlay* mDebugOverlay;
403        Overlay* mHelpOverlay;
404        Overlay* mCullStatsOverlay;
405        Overlay* mQueryOverlay;
406        Overlay* mMyStatsOverlay;
407        Overlay *mLoadingOverlay;
408
409        Light *mSunLight;
410        GtpVisibility::VisibilityManager *mVisibilityManager;
411        EventProcessor* mEventProcessor;
412       
413        bool mShiftPressed;
414        bool mShowQueryStats;
415       
416        //bool mUseBufferedInputKeys, mUseBufferedInputMouse, mInputTypeSwitchingOn;
417        PlatformQueryManager *mQueryManager;
418
419        float mDelayedQueriesIssued;
420        float mDelayedTraversedNodes;
421
422        int mCurrentObjectType;
423       
424        bool mDeleteObjects;
425        bool mRecordVideo;
426
427        Timer *mTimer;
428        long mTimeFrameEnded;
429        long mTimeFrameStarted;
430        float mPureRenderTimeFps;
431        TestCullingTerrainApplication *mApplication;
432
433        bool mUseBufferedInputMouse;
434       
435        bool mUseViewCells;
436        bool mViewCellsLoaded;
437        bool mUseVisibilityFilter;
438};
439
440
441#endif //_TerrainFrameListener_H__
Note: See TracBrowser for help on using the repository browser.