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

Revision 259, 10.8 KB checked in by mattausch, 19 years ago (diff)

refined measurements

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