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

Revision 421, 11.2 KB checked in by mattausch, 19 years ago (diff)

fixed controls for terrain demo
fixed member names in vspkdtree

RevLine 
[133]1#ifndef _TerrainFrameListener_H__
2#define _TerrainFrameListener_H__
[115]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"
[130]11#include "VisibilityManager.h"
[115]12#include "OgreTerrainContentGenerator.h"
[151]13#include "OgrePlatformQueryManager.h"
[115]14
[173]15
[160]16class TestCullingTerrainApplication;
17
18
[115]19using namespace Ogre;
20
[259]21/** Struct storing walktrough statistics
22*/
23struct WalkthroughStats
24{
25public:
[115]26
[259]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        {}
[254]41
[259]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
[161]92/** Frame listener specialised for terrains.
[115]93*/
[161]94class TerrainFrameListener: public FrameListener, public MouseListener,
95                                                        public MouseMotionListener, public KeyListener
[115]96{
97public:
98       
[160]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);
[115]108
[133]109   ~TerrainFrameListener();
[115]110
111   bool frameStarted(const FrameEvent& evt);
112   bool frameEnded(const FrameEvent& evt);
[417]113     
[115]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.
[161]121   void mousePressed(MouseEvent* e);
[115]122
123   // This is when the mouse button is let UP.
[161]124   void mouseReleased(MouseEvent* e);
[115]125
126   /* MouseMotionListener callbacks */
[161]127   void mouseMoved(MouseEvent *e);
[115]128   
129   // This is when the mouse is clicked, held and dragged.
[161]130   void mouseDragged(MouseEvent *e);
[115]131
[161]132   void mouseDragDropped(MouseEvent *e);
[115]133   void keyPressed(KeyEvent* e);
134
135   void keyReleased(KeyEvent* e);
136   void keyClicked(KeyEvent* e);
137 
[161]138   /** The information about camera position and orienation per frame.
139   */
[115]140   typedef struct
141   {
142           Vector3 position;
143           Quaternion orientation;
144           Real timeElapsed;
[254]145           Real fps;
[115]146   } frame_info;
147
[254]148   typedef std::vector<frame_info> FrameInfoContainer;
149
[115]150   enum  {WALKTHROUGH, REPLAY, STATE_NUM};
151
152   // visualization modes for scene nodes
153   enum {NODEVIZ_NONE, NODEVIZ_RENDER_NODES, NODEVIZ_RENDER_NODES_AND_CONTENT, NODEVIZ_MODES_NUM};
154   //enum {NODEVIZ_NONE, NODEVIZ_RENDER_GEOMETRY, NODEVIZ_MODES_NUM};
155
[173]156   void zoomVizCamera(int zoom);
[115]157       
[254]158   void addFrameInfo(FrameInfoContainer &frameInfos, SceneNode *camNode, Real timeElapsed);
[115]159   void setCurrentFrameInfo(Real timeElapsed);
160
161   void setAlgorithm(int algorithm);
162
163   void moveCamera();
164
165   void writeFrames();
166   void loadFrames();
167
[254]168        // quick hack
169        void writeNewFrameInfo();
[115]170   
171    bool processUnbufferedKeyInput(const FrameEvent& evt);
172    bool processUnbufferedMouseInput(const FrameEvent& evt);
173
[417]174        void switchMouseMode()
175        {
176        mUseBufferedInputMouse = !mUseBufferedInputMouse;
177                mInputDevice->setBufferedInput(true, mUseBufferedInputMouse);
[418]178
179                if (!mUseBufferedInputMouse)
180                        CEGUI::MouseCursor::getSingleton().hide();
181                else
182                        CEGUI::MouseCursor::getSingleton().show();
[417]183        }
184
[254]185        /** Shows the frame / algorithm statistics.
186        */
[120]187    void showStats(bool show);
[115]188
[254]189        /** Updates frame statistics and the frame statistics display.
190        */
[120]191        void updateStats();
192
[254]193        /** Toggles wether help screen is shown or not.
194        */
[120]195        void toggleShowHelp();
[254]196       
197        /** Toggles wether shadows are shown or not.
198        */
[139]199        void toggleShowShadows();
[120]200        void toggleDisplayCameraDetails();
[254]201        /** Takes screenshot of the current scene.
202        */
[164]203        void takeScreenshot();
[254]204        /** Takes one video frame.
205        */
206        void takeVideoFrame(std::ofstream &ofstr);
207
[120]208        void nextSceneDetailLevel();
209        void nextFilter();
210        void nextAlgorithm();
211        void nextNodeVizMode();
212        void nextAppState();
213    void changeThreshold(int incr);
[146]214        void changeAssumedVisibility(int incr);
[187]215        void setTestGeometryForVisibleLeaves(bool testGeometryForVisibleLeaves);
[254]216        /** Shows octree hierarchy of the scene.
217        */
[120]218        void toggleShowOctree();
[254]219        /** Toggles wether we use the initial depth pass.
220        */
[120]221        void toggleUseDepthPass();
[343]222        /** Toggles wether we use ARB or NV queries.
223        */
224        void toggleUseArbQueries();
[254]225        /** Toggles wether the visualization is shown.
226        */
[120]227        void toggleShowViz();
[254]228        /** Toggles wether the frames are recorded.
229        */
[120]230        void toggleRecord();
231
[133]232        /** Applies visibility query. Collects the visible objects
233                and their visibility information.
[154]234                @param fromPoint if query should be from point or from camera
235                @param relativeVisibility if query should return number of visible pixels or
236                the ratio visible / projected pixels.
237                @param useItemBuffer if item buffer should be used or occlusion queries
[133]238        */
[160]239        void applyVisibilityQuery(bool fromPoint, bool relativeVisibility, bool useItemBuffer);
[130]240
[254]241        /** Shows result from visibility queries.
242        */
[135]243        void toggleShowQueryStats();
244
[160]245        /** Sets the type of the objects generated in the scene.
246        */
247        void setObjectType(int objectType);
248
[173]249        static String msAlgorithmCaptions[];
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
[115]257protected:
258
[160]259        void initHelpOverlayElement(String name, int top);
[173]260        void initOverlayElement(OverlayElement **elInfo, String ext, String name,
261                                                        int top, String caption);
[160]262
263        //-- initialise overlays
264        void initHelpOverlay();
265        void initVisStatsOverlay();
266        void initQueryOverlay();
[115]267       
[120]268        SceneManager *mSceneMgr;           // A pointer to the scene manager
[115]269   
270        CEGUI::Renderer *mGUIRenderer;     // cegui renderer
271       
272        int mCurrentAlgorithm;
273        int mVisibilityThreshold;
[146]274        int mAssumedVisibility;
[254]275        /// the current frame number
[120]276        int mCurrentFrame;
[254]277        /// the current application state
[120]278        int mAppState;
[254]279        /// The number of objects on the screen
[120]280        int mObjectCount;           
[254]281        /// visualization mode
[120]282        int mNodeVizMode;
[254]283        /// number of video frames
284        int mNumVideoFrames;
285        /// the newly created object
286        SceneNode *mCurrentObject;   
[259]287
288        WalkthroughStats mWalkthroughStats;
289
290        /// HACK for demo
291        float mDemoFps;
292        bool mUseDemoFps;
293
[115]294        OverlayElement *mAlgorithmInfo;
295        OverlayElement *mThresholdInfo;
[146]296        OverlayElement *mAssumedVisibilityInfo;
[115]297        OverlayElement *mFrustumCulledNodesInfo;
298        OverlayElement *mQueryCulledNodesInfo;
299    OverlayElement *mTraversedNodesInfo;
300        OverlayElement *mHierarchyNodesInfo;
[155]301        OverlayElement *mTestGeometryForVisibleLeavesInfo;
[115]302        OverlayElement *mUseDepthPassInfo;
[343]303        OverlayElement *mUseArbQueriesInfo;
[115]304        OverlayElement *mRenderedNodesInfo;
[160]305        OverlayElement *mObjectsCountInfo;
[115]306        OverlayElement *mQueriesIssuedInfo;
[155]307        OverlayElement *mDelayedQueriesIssuedInfo;
308        OverlayElement *mDelayedTraversedNodesInfo;
[160]309        OverlayElement *mCurrentObjectTypeInfo;
[115]310
[135]311        OverlayElement *mQueryTypeInfo;
312        OverlayElement *mQueryVisibleNodesInfo;
[159]313        OverlayElement *mQueryVisibleGeometryInfo;
314        OverlayElement *mQueryVisiblePatchInfo;
315
[135]316        OverlayElement *mQueryVisiblityInfo;
317        OverlayElement *mQueryNodeVisibilityInfo;
318        OverlayElement *mQueryGeometryVisibilityInfo;
[159]319        OverlayElement *mQueryPatchVisibilityInfo;
[161]320        //OverlayElement *mHelpInfo;
[135]321
[115]322        RayQueryExecutor *mRayQueryExecutor;
323        TerrainContentGenerator *mTerrainContentGenerator;
324
[155]325        bool mTestGeometryForVisibleLeaves;
[115]326        bool mShowOctree;
327        bool mUseDepthPass;
[343]328        bool mUseArbQueries;
[115]329        bool mShowVisualization;
330        bool mCullCamera;
[254]331        bool mRecordFrames;
[139]332        bool mShowShadows;
[120]333        bool mVisualizeCulledNodes;
334        bool mShowHelp;
335        bool mStatsOn;
336        bool mLMouseDown, mRMouseDown;     // True if the mouse buttons are down
337        bool mShutdownRequested;
338        bool mDisplayCameraDetails;
[159]339        bool mUseItemBuffer;
[161]340        bool mUseAnimation;
[174]341       
342        int mItemBufferMode;
[159]343
[115]344        Real mVizCameraHeight;
345
346        Camera *mVizCamera;
347        SceneNode *mCamNode;
348       
[254]349        /// Per frame data stored for a walkthrough
350        FrameInfoContainer mFrameInfo;
351        /// HACK: for demo
352        FrameInfoContainer mSavedFrameInfo;
353       
[160]354        Real mReplayTimeElapsed;
[115]355        //EventProcessor* mEventProcessor;
356    InputReader* mInputDevice;
357    Camera* mCamera;
358
359    Vector3 mTranslateVector;
360    RenderWindow* mWindow;
[120]361   
[115]362        unsigned int mNumScreenShots;
[120]363    int mSceneDetailIndex;
364        int mAniso;
365
366        float mMoveScale;
[115]367    Degree mRotScale;
[164]368
[115]369    // just to stop toggles flipping too fast
[120]370    Real mTimeDelay;
[115]371    Radian mRotX, mRotY;
372    TextureFilterOptions mFiltering;
[120]373 
374        Real mMoveSpeed;
[115]375    Degree mRotateSpeed;
[120]376   
377        Overlay* mDebugOverlay;
378        Overlay* mHelpOverlay;
379        Overlay* mCullStatsOverlay;
[135]380        Overlay* mQueryOverlay;
[121]381
382        Light *mSunLight;
[130]383        GtpVisibility::VisibilityManager *mVisibilityManager;
384        EventProcessor* mEventProcessor;
385       
[133]386        bool mShiftPressed;
[135]387        bool mShowQueryStats;
[259]388       
[133]389        //bool mUseBufferedInputKeys, mUseBufferedInputMouse, mInputTypeSwitchingOn;
[151]390        PlatformQueryManager *mQueryManager;
[155]391
392        float mDelayedQueriesIssued;
393        float mDelayedTraversedNodes;
[159]394
[160]395        int mCurrentObjectType;
396
[164]397        bool mDeleteObjects;
[254]398        bool mRecordVideo;
[164]399
[254]400        Timer *mTimer;
401        long mTimeFrameEnded;
402        long mTimeFrameStarted;
403        float mPureRenderTimeFps;
[160]404        TestCullingTerrainApplication *mApplication;
[417]405
406        bool mUseBufferedInputMouse;
[421]407        Matrix4 rotMatrix;
[115]408};
409
410
[133]411#endif //_TerrainFrameListener_H__
Note: See TracBrowser for help on using the repository browser.