source: trunk/VUT/work/TestCulling/TestCullingApplication.cpp @ 155

Revision 155, 13.1 KB checked in by mattausch, 19 years ago (diff)

added node traversal interface

Line 
1/**
2    \file
3        TestCullingApplication.cpp
4    \brief
5        Tests the visibility culling algorithm
6*/
7
8#include <OgreNoMemoryMacros.h>
9#include <CEGUI/CEGUI.h>
10#include <../CEGUIRenderer/include/OgreCEGUIRenderer.h>
11#include <../CEGUIRenderer/include/OgreCEGUIResourceProvider.h>
12#include <../CEGUIRenderer/include/OgreCEGUITexture.h>
13#include <OgreMemoryMacros.h>
14#include <Ogre.h>
15#include "TestCullingApplication.h"
16#include "OgreSceneContentGenerator.h"
17
18#define WIN32_LEAN_AND_MEAN
19#include <windows.h>
20
21
22/***********************************************/
23/* TestCullingApplication implementation       */
24/***********************************************/
25
26//-----------------------------------------------------------------------
27/*void TestCullingApplication::createCamera( void )
28{
29        // Create the camera
30        mCamera = mSceneMgr->createCamera("CullCamera");
31
32        // Position it at 500 in Z direction
33        mCamera->setPosition(Vector3(128,25,128));
34
35        // Look back along -Z
36    mCamera->lookAt(Vector3(0,0,-300));
37    mCamera->setNearClipDistance( 1 );
38    mCamera->setFarClipDistance( 1000 );
39}*/
40//-----------------------------------------------------------------------
41TestCullingApplication::~TestCullingApplication()
42{
43        delete mSceneContentGenerator;
44}
45//-----------------------------------------------------------------------
46void TestCullingApplication::createScene(void)
47{
48        // Set ambient light
49        mSceneMgr->setAmbientLight(ColourValue(0.5, 0.5, 0.5));
50       
51        // Create a light
52        Light* l = mSceneMgr->createLight("MainLight");
53        //l->setPosition(20,80,50);
54
55        mSceneContentGenerator = new SceneContentGenerator(mSceneMgr);
56        mSceneContentGenerator->GenerateScene(3000, "sphere.mesh");
57
58        // Create a skybox
59    mSceneMgr->setSkyBox(true, "Examples/CloudyNoonSkyBox", 2000, true);
60    ColourValue fadeColour(0.1, 0.1, 0.6);
61        mWindow->getViewport(0)->setBackgroundColour(fadeColour);
62
63        // CEGUI setup
64        setupGui();
65}
66//-----------------------------------------------------------------------
67void TestCullingApplication::setupGui()
68{
69         mGUIRenderer = new CEGUI::OgreCEGUIRenderer(mWindow, Ogre::RENDER_QUEUE_OVERLAY, false, 3000, ST_EXTERIOR_CLOSE);
70     mGUISystem = new CEGUI::System(mGUIRenderer);
71
72         // Mouse
73     CEGUI::SchemeManager::getSingleton().loadScheme((CEGUI::utf8*)"TaharezLook.scheme");
74     CEGUI::MouseCursor::getSingleton().setImage("TaharezLook", "MouseArrow");
75         mGUISystem->setDefaultMouseCursor(
76                (CEGUI::utf8*)"TaharezLook", (CEGUI::utf8*)"MouseArrow");
77
78         CEGUI::MouseCursor::getSingleton().show( );
79}
80//-----------------------------------------------------------------------
81void TestCullingApplication::createFrameListener()
82{
83        mFrameListener= new TerrainFrameListener(mWindow, mCamera, mSceneMgr,
84                mGUIRenderer, mSceneContentGenerator);
85        mFrameListener->showDebugOverlay(true);
86        mRoot->addFrameListener(mFrameListener);
87}
88//-----------------------------------------------------------------------
89void TestCullingApplication::chooseSceneManager(void)
90{
91    mSceneMgr = mRoot->getSceneManager(ST_GENERIC);
92}
93
94
95/***********************************************/
96/* TerrainFrameListener implementation         */
97/***********************************************/
98//-----------------------------------------------------------------------
99TerrainFrameListener::TerrainFrameListener(RenderWindow* win, Camera* cam,
100                                                                           SceneManager *sceneManager,
101                                                                           CEGUI::Renderer *renderer,
102                                                                           SceneContentGenerator *sceneContentGenerator)
103: ExampleFrameListener(win, cam, false, true),
104mSceneMgr(sceneManager),
105mGUIRenderer(renderer),
106mShutdownRequested(false),
107mLMouseDown(false),
108mRMouseDown(false),
109mSceneContentGenerator(sceneContentGenerator),
110mVisibilityThreshold(0),
111mCurrentAlgorithm(GtpVisibility::VisibilityEnvironment::COHERENT_HIERARCHICAL_CULLING),
112mShowOctree(false),
113mUseDepthPass(false),
114mTestGeometryForVisibleLeaves(true),
115mShowVisualization(false),
116mVisualizeCulledNodes(false)
117{
118    // Reduce move speed
119        mMoveSpeed = 50;
120        mRotateSpeed *= 2;
121 
122        // Register this so that we get mouse events.
123        mEventProcessor->addMouseListener(this);
124        mEventProcessor->addMouseMotionListener(this);
125        mEventProcessor->addKeyListener(this);
126
127        // show overlay
128        Overlay* pOver = OverlayManager::getSingleton().getByName("Example/VisibilityDemoOverlay");
129
130        mAlgorithmInfo = OverlayManager::getSingleton().getOverlayElement("Example/Visibility/AlgorithmInfo");
131        mThresholdInfo = OverlayManager::getSingleton().getOverlayElement("Example/Visibility/ThresholdInfo");
132       
133        mFrustumCulledNodesInfo = OverlayManager::getSingleton().getOverlayElement("Example/Visibility/FrustumCulledNodesInfo");
134        mQueryCulledNodesInfo = OverlayManager::getSingleton().getOverlayElement("Example/Visibility/QueryCulledNodesInfo");
135    mTraversedNodesInfo = OverlayManager::getSingleton().getOverlayElement("Example/Visibility/TraversedNodesInfo");
136        mHierarchyNodesInfo = OverlayManager::getSingleton().getOverlayElement("Example/Visibility/HierarchyNodesInfo");
137        mRenderedNodesInfo = OverlayManager::getSingleton().getOverlayElement("Example/Visibility/RenderedNodesInfo");
138        mObjectsInfo = OverlayManager::getSingleton().getOverlayElement("Example/Visibility/ObjectsInfo");
139        mTestGeometryForVisibleLeavesInfo = OverlayManager::getSingleton().getOverlayElement("Example/Visibility/TestGeometryForVisibleLeavesInfo");
140        mQueriesIssuedInfo = OverlayManager::getSingleton().getOverlayElement("Example/Visibility/QueriesIssuedInfo");
141       
142
143        mAlgorithmInfo->setCaption(": " + mCurrentAlgorithmCaptions[mCurrentAlgorithm]);
144        mThresholdInfo->setCaption(": 0");
145        mFrustumCulledNodesInfo->setCaption(": 0");
146        mQueryCulledNodesInfo->setCaption(": 0");
147        mTraversedNodesInfo->setCaption(": 0");
148        mHierarchyNodesInfo->setCaption(": 0");
149        mRenderedNodesInfo->setCaption(": 0");
150        mObjectsInfo->setCaption(": 0");
151        mTestGeometryForVisibleLeavesInfo->setCaption(": true");
152        mQueriesIssuedInfo->setCaption(": 0");
153       
154
155        setAlgorithm(mCurrentAlgorithm);
156       
157        mSceneMgr->setOption("TestGeometryForVisibleLeaves", &mTestGeometryForVisibleLeaves);
158        mSceneMgr->setOption("UseDepthPass", &mUseDepthPass);
159        mSceneMgr->setOption("ShowVizualisation", &mShowVisualization);
160        mSceneMgr->setOption("ShowOctree", &mShowOctree);
161
162    pOver->show();
163}
164//-----------------------------------------------------------------------
165TerrainFrameListener::~TerrainFrameListener()
166{
167}
168//-----------------------------------------------------------------------
169void TerrainFrameListener::mouseMoved(MouseEvent *e)
170{
171        // Update CEGUI with the mouse motion
172    CEGUI::System::getSingleton().injectMouseMove(e->getRelX() *
173                mGUIRenderer->getWidth(), e->getRelY() * mGUIRenderer->getHeight());
174}
175//-----------------------------------------------------------------------
176void TerrainFrameListener::mousePressed(MouseEvent* e)
177{
178     // Left mouse button down
179     if (e->getButtonID() & InputEvent::BUTTON0_MASK)
180     {
181                mLMouseDown = true;
182     }
183     // Right mouse button down
184     else if (e->getButtonID() & InputEvent::BUTTON1_MASK)
185     {
186         CEGUI::MouseCursor::getSingleton().hide( );
187         mRMouseDown = true;
188     } // else if
189} // mousePressed
190
191 //-----------------------------------------------------------------------
192void TerrainFrameListener::mouseReleased(MouseEvent* e)
193{
194    // Left mouse button up
195    if (e->getButtonID() & InputEvent::BUTTON0_MASK)
196    {
197                CEGUI::MouseCursor::getSingleton().show();
198        mLMouseDown = false;
199    }
200    // Right mouse button up
201    else if (e->getButtonID() & InputEvent::BUTTON1_MASK)
202    {
203        CEGUI::MouseCursor::getSingleton().show();
204        mRMouseDown = false;
205    }
206}
207//-----------------------------------------------------------------------
208void TerrainFrameListener::mouseDragged (MouseEvent *e)
209 {
210         // If we are dragging the left mouse button.           
211         if ( mLMouseDown )
212     {
213               
214     }
215         // If we are dragging the right mouse button.
216         if ( mRMouseDown )
217         {
218                 mCamera->yaw(-e->getRelX() * mRotateSpeed);
219                 mCamera->pitch(-e->getRelY() * mRotateSpeed);
220         }
221}
222//-----------------------------------------------------------------------
223bool TerrainFrameListener::frameStarted(const FrameEvent &evt)
224{       
225        return ExampleFrameListener::frameStarted(evt);
226}
227//-----------------------------------------------------------------------
228bool TerrainFrameListener::frameEnded(const FrameEvent& evt)
229{
230        if (mShutdownRequested)
231                return false;
232
233    if (timeDelay >= 0)
234        timeDelay -= evt.timeSinceLastFrame;
235
236    KEY_PRESSED(KC_SPACE, 0.3, nextAlgorithm());
237
238        KEY_PRESSED(KC_SUBTRACT, 0, changeThreshold(-10));
239        KEY_PRESSED(KC_ADD, 0, changeThreshold(10));
240        KEY_PRESSED(KC_O, 0.3, toggleTestGeometryForVisibleLeaves());
241        KEY_PRESSED(KC_C, 0.3, toggleUseDepthPass());
242        KEY_PRESSED(KC_V, 0.3, toggleShowViz());
243
244        updateStats();
245
246    return ExampleFrameListener::frameStarted(evt) && ExampleFrameListener::frameEnded(evt);       
247}
248//-----------------------------------------------------------------------
249void TerrainFrameListener::changeThreshold(int incr)
250{
251        mVisibilityThreshold += incr;
252        if(mVisibilityThreshold < 0) mVisibilityThreshold = 0;
253       
254        char str[100]; sprintf(str,": %d", mVisibilityThreshold);
255
256        mSceneMgr->setOption("Threshold", &mVisibilityThreshold);
257        mThresholdInfo->setCaption(str);
258}
259//-----------------------------------------------------------------------
260void TerrainFrameListener::nextAlgorithm()
261{
262        mCurrentAlgorithm = ++mCurrentAlgorithm %
263                GtpVisibility::VisibilityEnvironment::NUM_CULLING_MANAGERS,
264
265        setAlgorithm(mCurrentAlgorithm);
266}
267//-----------------------------------------------------------------------
268void TerrainFrameListener::toggleTestGeometryForVisibleLeaves()
269{
270        mTestGeometryForVisibleLeaves = !mTestGeometryForVisibleLeaves;
271
272        mSceneMgr->setOption("TestGeometryForVisibleLeaves", &mTestGeometryForVisibleLeaves);
273
274        if(mTestGeometryForVisibleLeaves)
275                mTestGeometryForVisibleLeavesInfo->setCaption(": true");
276        else
277                mTestGeometryForVisibleLeavesInfo->setCaption(": false");
278}
279//-----------------------------------------------------------------------
280void TerrainFrameListener::toggleShowOctree()
281{
282        mShowOctree = !mShowOctree;
283
284        mSceneMgr->setOption("ShowOctree", &mShowOctree);
285}
286//-----------------------------------------------------------------------
287void TerrainFrameListener::toggleUseDepthPass()
288{
289        mUseDepthPass = !mUseDepthPass;
290
291        mSceneMgr->setOption("UseDepthPass", &mUseDepthPass);
292}
293//-----------------------------------------------------------------------
294void TerrainFrameListener::toggleShowViz()
295{
296        mShowVisualization = !mShowVisualization;
297
298        mSceneMgr->setOption("PrepareVisualization", &mShowVisualization);
299        mSceneMgr->setOption("VisualizeCulledNodes", &mVisualizeCulledNodes);
300}
301//-----------------------------------------------------------------------
302void TerrainFrameListener::setAlgorithm(int algorithm)
303{
304        mAlgorithmInfo->setCaption(": " + mCurrentAlgorithmCaptions[mCurrentAlgorithm]);
305        mSceneMgr->setOption("Algorithm", &mCurrentAlgorithm);
306}
307//-----------------------------------------------------------------------
308void TerrainFrameListener::updateStats()
309{
310        unsigned int opt = 0;
311        char str[100];
312       
313        mSceneMgr->getOption("NumFrustumCulledNodes", &opt); sprintf(str,": %d", opt);
314        mFrustumCulledNodesInfo->setCaption(str);
315       
316        mSceneMgr->getOption("NumQueriesIssued", &opt); sprintf(str,": %d", opt);
317        mQueriesIssuedInfo->setCaption(str);
318
319        mSceneMgr->getOption("NumQueryCulledNodes", &opt); sprintf(str,": %d", opt);
320        mQueryCulledNodesInfo->setCaption(str);
321       
322        mSceneMgr->getOption("NumTraversedNodes", &opt); sprintf(str,": %d", opt);
323        mTraversedNodesInfo->setCaption(str);
324
325        mSceneMgr->getOption("NumHierarchyNodes", &opt); sprintf(str,": %d", opt);
326        mHierarchyNodesInfo->setCaption(str);
327
328        mSceneMgr->getOption("NumRenderedNodes", &opt); sprintf(str,": %d", opt);
329        mRenderedNodesInfo->setCaption(str);
330
331        sprintf(str,": %d", mSceneContentGenerator->GetObjectCount());
332        mObjectsInfo->setCaption(str);
333}
334//-----------------------------------------------------------------------
335void TerrainFrameListener::keyPressed(KeyEvent* e)
336{
337        if(e->getKey() == KC_ESCAPE)
338    {
339                mShutdownRequested = true;
340                e->consume();
341                return;
342        }
343
344        CEGUI::System::getSingleton().injectKeyDown(e->getKey());
345        CEGUI::System::getSingleton().injectChar(e->getKeyChar());
346        e->consume();
347}
348//-----------------------------------------------------------------------
349void TerrainFrameListener::keyReleased(KeyEvent* e)
350{
351        CEGUI::System::getSingleton().injectKeyUp(e->getKey());
352        e->consume();
353}
354//-----------------------------------------------------------------------
355void TerrainFrameListener::keyClicked(KeyEvent* e)
356{
357        // Do nothing
358        e->consume();
359}
360//-----------------------------------------------------------------------
361INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
362{
363    // Create application object
364    TestCullingApplication app;
365
366        try
367        {
368        app.go();
369    }
370        catch( Ogre::Exception& e )
371        {
372        MessageBox( NULL, e.getFullDescription().c_str(), "An exception has occured!", MB_OK | MB_ICONERROR | MB_TASKMODAL);
373    }   
374
375    return 0;
376}
Note: See TracBrowser for help on using the repository browser.