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

Revision 1604, 12.4 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 applyCurrentAlgorithm();
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 visualization of octree hierarchy nodes.
213        */
214        void toggleShowOctree();
215        /** Shows visualization of the view cells.
216        */
217        void toggleShowViewCells();
218        /** Toggles between view cells / no view cells.
219        */
220        void toggleUseViewCells();
221
222        void toggleUseVisibilityFilter();
223
224        /** Toggles whether we use the initial depth pass.
225        */
226        void toggleUseDepthPass();
227        /** Toggles whether the visualization is shown.
228        */
229        void toggleShowViz();
230        /** Toggles whether the frames are recorded.
231        */
232        void toggleRecord();
233
234        /** Applies visibility query. Collects the visible objects
235                and their visibility information.
236                @param fromPoint if query should be from point or from camera
237                @param relativeVisibility if query should return number of visible pixels or
238                the ratio visible / projected pixels.
239                @param useItemBuffer if item buffer should be used or occlusion queries
240        */
241        void applyVisibilityQuery(bool fromPoint, bool relativeVisibility, bool useItemBuffer);
242
243        /** Shows result from visibility queries.
244        */
245        void toggleShowQueryStats();
246
247        /** Sets the type of the objects generated in the scene.
248        */
249        void applyObjectType();
250
251        void setAlgorithm(const int algorithm);
252
253
254        static String msAlgorithmCaptions[];
255        static String msApprevAlgorithmCaptions[];
256        static String msQueryTypeCaptions[];
257        static String msQueryRelativeVisCaptions[];
258        static String msQueryMethodCaptions[];
259        static Real msObjectTerrainOffsets[];
260        static Real msObjectScales[];
261        static String msObjectCaptions[];
262
263protected:
264
265        void initHelpOverlayElement(String name, int top);
266        void initOverlayElement(OverlayElement **elInfo, String ext, String name,
267                                                        int top, String caption);
268
269        //-- initialise overlays
270        void initHelpOverlay();
271        void initVisStatsOverlay();
272        void initQueryOverlay();
273       
274        SceneManager *mSceneMgr;           // A pointer to the scene manager
275   
276        CEGUI::Renderer *mGUIRenderer;     // cegui renderer
277       
278        int mCurrentAlgorithm;
279        int mVisibilityThreshold;
280        int mAssumedVisibility;
281        /// the current frame number
282        int mCurrentFrame;
283        /// the current application state
284        int mAppState;
285        /// The number of objects on the screen
286        int mObjectCount;           
287        /// visualization mode
288        int mNodeVizMode;
289        /// number of video frames
290        int mNumVideoFrames;
291        /// the newly created object
292        SceneNode *mCurrentObject;   
293
294        WalkthroughStats mWalkthroughStats;
295
296        /// visualization scale
297        float mVizScale;
298
299        ////////////////////////////////////////////////////////////////////////
300
301        /** HACK for recording demo:
302                1) the walkthrough must be recorded.
303                2) the walktrough must be replayed using the different options, e.g., CHC
304                   with the mSavePrecomputedFps (key "E") option. This saves the frame rates
305                   for the different methods.
306            3) the walkthrough must then be replayed with the mRecordDemo (KEY "M") options turned on.
307                   for the video recording we are using FRAPS.
308        */
309
310        /// the currently interpolated FPS
311        float mPrecomputedFps;
312        /// saves the precomputed fps for the different methods.
313        bool mSavePrecomputedFps;
314        /// displayes the precomputed fps
315        bool mRecordDemo;
316       
317        ////////////////////////////////////////////////////////////////////////////
318
319
320        OverlayElement *mAlgorithmInfo;
321        OverlayElement *mThresholdInfo;
322        OverlayElement *mAssumedVisibilityInfo;
323        OverlayElement *mFrustumCulledNodesInfo;
324        OverlayElement *mQueryCulledNodesInfo;
325    OverlayElement *mTraversedNodesInfo;
326        OverlayElement *mHierarchyNodesInfo;
327        OverlayElement *mTestGeometryForVisibleLeavesInfo;
328        OverlayElement *mUseDepthPassInfo;
329        OverlayElement *mRenderedNodesInfo;
330        OverlayElement *mObjectsCountInfo;
331        OverlayElement *mQueriesIssuedInfo;
332        OverlayElement *mDelayedQueriesIssuedInfo;
333        OverlayElement *mDelayedTraversedNodesInfo;
334        OverlayElement *mCurrentObjectTypeInfo;
335        OverlayElement *mViewCellsInfo;
336
337        OverlayElement *mMyStatsAlgorithmInfo;
338        OverlayElement *mMyStatsFpsInfo;
339
340        OverlayElement *mMyLoadingInfo;
341       
342        OverlayElement *mQueryTypeInfo;
343        OverlayElement *mQueryVisibleNodesInfo;
344        OverlayElement *mQueryVisibleGeometryInfo;
345        OverlayElement *mQueryVisiblePatchInfo;
346
347        OverlayElement *mQueryVisiblityInfo;
348        OverlayElement *mQueryNodeVisibilityInfo;
349        OverlayElement *mQueryGeometryVisibilityInfo;
350        OverlayElement *mQueryPatchVisibilityInfo;
351        //OverlayElement *mHelpInfo;
352
353        RayQueryExecutor *mRayQueryExecutor;
354        TerrainContentGenerator *mTerrainContentGenerator;
355
356        bool mTestGeometryForVisibleLeaves;
357        bool mShowOctree;
358        bool mShowViewCells;
359        bool mUseDepthPass;
360        bool mShowVisualization;
361        bool mCullCamera;
362        bool mRecordFrames;
363        bool mShowShadows;
364        bool mVisualizeCulledNodes;
365        bool mShowHelp;
366        bool mStatsOn;
367        bool mLMouseDown;
368        bool mRMouseDown;     // True if the mouse buttons are down
369        bool mShutdownRequested;
370        bool mDisplayCameraDetails;
371        bool mUseItemBuffer;
372        bool mUseAnimation;
373       
374        int mItemBufferMode;
375
376        Real mVizCameraHeight;
377
378        Camera *mVizCamera;
379        SceneNode *mCamNode;
380       
381        /// Per frame data stored for a walkthrough
382        FrameInfoContainer mFrameInfo;
383        /// HACK for demo
384        FrameInfoContainer mPrecomputedFpsFrameInfo;
385       
386        Real mReplayTimeElapsed;
387        //EventProcessor* mEventProcessor;
388    InputReader* mInputDevice;
389    Camera* mCamera;
390
391    Vector3 mTranslateVector;
392    RenderWindow* mWindow;
393   
394        unsigned int mNumScreenShots;
395    int mSceneDetailIndex;
396        int mAniso;
397
398        float mMoveScale;
399    Degree mRotScale;
400
401    // just to stop toggles flipping too fast
402    Real mTimeDelay;
403    Radian mRotX, mRotY;
404    TextureFilterOptions mFiltering;
405 
406        Real mMoveSpeed;
407    Degree mRotateSpeed;
408   
409        Overlay* mDebugOverlay;
410        Overlay* mHelpOverlay;
411        Overlay* mCullStatsOverlay;
412        Overlay* mQueryOverlay;
413        Overlay* mMyStatsOverlay;
414        Overlay *mLoadingOverlay;
415
416        Light *mSunLight;
417        GtpVisibility::VisibilityManager *mVisibilityManager;
418        EventProcessor* mEventProcessor;
419       
420        bool mShiftPressed;
421        bool mShowQueryStats;
422       
423        //bool mUseBufferedInputKeys, mUseBufferedInputMouse, mInputTypeSwitchingOn;
424        PlatformQueryManager *mQueryManager;
425
426        float mDelayedQueriesIssued;
427        float mDelayedTraversedNodes;
428
429        int mCurrentObjectType;
430       
431        bool mDeleteObjects;
432        bool mRecordVideo;
433
434        Timer *mTimer;
435        long mTimeFrameEnded;
436        long mTimeFrameStarted;
437        float mPureRenderTimeFps;
438        TestCullingTerrainApplication *mApplication;
439
440        bool mUseBufferedInputMouse;
441       
442        bool mUseViewCells;
443        bool mViewCellsLoaded;
444        bool mUseVisibilityFilter;
445};
446
447
448#endif //_TerrainFrameListener_H__
Note: See TracBrowser for help on using the repository browser.