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

Revision 1271, 12.2 KB checked in by mattausch, 18 years ago (diff)

removed the visibility env, now explicitly giving the view cells as argument

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