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

Revision 867, 11.9 KB checked in by mattausch, 18 years ago (diff)

kicked out toggling of arb / iv queries

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