source: trunk/VUT/work/TestCullingTerrain/TestCullingTerrainApplication.cpp @ 74

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

added support for release mode

Line 
1/**
2    \file
3        TestCullingTerrainApplication.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
15#include "Ogre.h"
16#include "TestCullingTerrainApplication.h"
17
18#define WIN32_LEAN_AND_MEAN
19#include "windows.h"
20
21
22/************************************************/
23/* TestCullingTerrainApplication implementation */
24/************************************************/
25TestCullingTerrainApplication::~TestCullingTerrainApplication()
26{
27        delete mRayQueryExecutor;
28        delete mTerrainContentGenerator;
29}
30
31//-----------------------------------------------------------------------
32void TestCullingTerrainApplication::createCamera( void )
33{
34        // Create the camera
35        mCamera = mSceneMgr->createCamera("PlayerCam");
36
37        // Position it at 500 in Z direction
38        mCamera->setPosition(Vector3(128,25,128));
39
40        // Look back along -Z
41    mCamera->lookAt(Vector3(0,0,-300));
42    mCamera->setNearClipDistance(1);
43    mCamera->setFarClipDistance(1000);
44}
45//-----------------------------------------------------------------------
46void TestCullingTerrainApplication::createScene( void )
47{
48        mRayQueryExecutor = new RayQueryExecutor(mSceneMgr);
49        mTerrainContentGenerator = new TerrainContentGenerator(mSceneMgr, mRayQueryExecutor);
50
51        // Set ambient light
52        mSceneMgr->setAmbientLight(ColourValue(0.5, 0.5, 0.5));
53       
54        // Create a light
55        Light* l = mSceneMgr->createLight("MainLight");
56        // Accept default settings: point light, white diffuse, just set position
57        // NB I could attach the light to a SceneNode if I wanted it to move automatically with
58        //  other objects, but I don't
59        l->setPosition(20,80,50);
60
61        // --Fog
62        // NB it's VERY important to set this before calling setWorldGeometry
63        // because the vertex program picked will be different
64        ColourValue fadeColour(0.93, 0.86, 0.76);
65        mWindow->getViewport(0)->setBackgroundColour(fadeColour);
66        //mSceneMgr->setFog( FOG_LINEAR, fadeColour, .001, 500, 1000);
67
68        // Create a skybox
69    //mSceneMgr->setSkyBox(true, "Examples/SpaceSkyBox", 500, false);
70        //mSceneMgr->setSkyDome( true, "Examples/CloudySky", 5, 8, 500, false );
71
72        /*      // Define the required skyplane
73        Plane plane;
74        // 5000 world units from the camera
75        plane.d = 5000;
76        // Above the camera, facing down
77        plane.normal = -Vector3::UNIT_Y;
78        // Create the plane 10000 units wide, tile the texture 3 times
79    mSceneMgr->setSkyPlane(true, plane, "Examples/SpaceSkyPlane",10000,3);*/
80
81        std::string terrain_cfg("terrain.cfg");
82#if OGRE_PLATFORM == OGRE_PLATFORM_APPLE
83        terrain_cfg = mResourcePath + terrain_cfg;
84#endif
85        mSceneMgr->setWorldGeometry(terrain_cfg);
86        // Infinite far plane?
87        if (mRoot->getRenderSystem()->getCapabilities()->hasCapability(RSC_INFINITE_FAR_PLANE))
88        {
89                mCamera->setFarClipDistance(0);
90        }
91
92        // Set a nice viewpoint
93        mCamera->setPosition(707,2500,528);
94        mCamera->setOrientation(Quaternion(-0.3486, 0.0122, 0.9365, 0.0329));
95
96        // CEGUI setup
97        setupGui();
98
99        mTerrainContentGenerator->generateScene(100);
100}
101//-----------------------------------------------------------------------
102void TestCullingTerrainApplication::setupGui( void )
103{
104         mGUIRenderer = new CEGUI::OgreCEGUIRenderer(mWindow, Ogre::RENDER_QUEUE_OVERLAY, false, 3000, ST_EXTERIOR_CLOSE);
105     mGUISystem = new CEGUI::System(mGUIRenderer);
106
107         // Mouse
108     CEGUI::SchemeManager::getSingleton().loadScheme((CEGUI::utf8*)"TaharezLook.scheme");
109     CEGUI::MouseCursor::getSingleton().setImage("TaharezLook", "MouseArrow");
110         mGUISystem->setDefaultMouseCursor(
111                (CEGUI::utf8*)"TaharezLook", (CEGUI::utf8*)"MouseArrow");
112
113         CEGUI::MouseCursor::getSingleton().show( );
114}
115//-----------------------------------------------------------------------
116void TestCullingTerrainApplication::createFrameListener(void)
117{
118        mFrameListener= new MouseQueryListener(mWindow, mCamera, mSceneMgr, mGUIRenderer, mRayQueryExecutor);
119        mFrameListener->showDebugOverlay(true);
120        mRoot->addFrameListener(mFrameListener);
121}
122//-----------------------------------------------------------------------
123void TestCullingTerrainApplication::chooseSceneManager(void)
124{
125        mSceneMgr = mRoot->getSceneManager(ST_EXTERIOR_CLOSE);
126}
127
128/***********************************************/
129/* MouseQueryListener implementation           */
130/***********************************************/
131//-----------------------------------------------------------------------
132MouseQueryListener::MouseQueryListener(RenderWindow* win, Camera* cam, SceneManager *sceneManager, CEGUI::Renderer *renderer, RayQueryExecutor *rqe)
133        : ExampleFrameListener(win, cam, false, true), mGUIRenderer(renderer), mShutdownRequested(false), mRayQueryExecutor(rqe)
134{
135
136        // Setup default variables
137        mCurrentObject = NULL;
138        mLMouseDown = false;
139        mRMouseDown = false;
140        mSceneMgr = sceneManager;
141
142    // Reduce move speed
143        mMoveSpeed = 50;
144        mRotateSpeed *= 2;
145
146        mCurrentAlgorithm = GtpVisibility::VisibilityEnvironment::COHERENT_HIERARCHICAL_CULLING,
147        mThreshold = 0;
148   
149        // Register this so that we get mouse events.
150        mEventProcessor->addMouseListener(this);
151        mEventProcessor->addMouseMotionListener(this);
152        mEventProcessor->addKeyListener(this);
153
154        mRayQueryExecutor = new RayQueryExecutor(mSceneMgr);
155
156        // show overlay
157        Overlay* pOver = OverlayManager::getSingleton().getByName("Example/VisibilityDemoOverlay");
158
159        mAlgorithmInfo = OverlayManager::getSingleton().getOverlayElement("Example/Visibility/AlgorithmInfo");
160        mThresholdInfo = OverlayManager::getSingleton().getOverlayElement("Example/Visibility/ThresholdInfo");
161        mFrustumCulledNodesInfo = OverlayManager::getSingleton().getOverlayElement("Example/Visibility/FrustumCulledNodesInfo");
162        mQueryCulledNodesInfo = OverlayManager::getSingleton().getOverlayElement("Example/Visibility/QueryCulledNodesInfo");
163    mTraversedNodesInfo = OverlayManager::getSingleton().getOverlayElement("Example/Visibility/TraversedNodesInfo");
164        mHierarchyNodesInfo = OverlayManager::getSingleton().getOverlayElement("Example/Visibility/HierarchyNodesInfo");
165        mRenderedNodesInfo = OverlayManager::getSingleton().getOverlayElement("Example/Visibility/RenderedNodesInfo");
166
167        mAlgorithmInfo->setCaption(": " + mCurrentAlgorithmCaptions[mCurrentAlgorithm]);
168        mThresholdInfo->setCaption(": 0");
169        mFrustumCulledNodesInfo->setCaption(": 0");
170        mQueryCulledNodesInfo->setCaption(": 0");
171        mTraversedNodesInfo->setCaption(": 0");
172        mHierarchyNodesInfo->setCaption(": 0");
173        mRenderedNodesInfo->setCaption(": 0");
174               
175    pOver->show();
176}
177//-----------------------------------------------------------------------
178MouseQueryListener::~MouseQueryListener( )
179{
180        delete mRayQueryExecutor;
181}
182//-----------------------------------------------------------------------
183void MouseQueryListener::mouseMoved (MouseEvent *e)
184{
185        // Update CEGUI with the mouse motion
186    CEGUI::System::getSingleton().injectMouseMove(e->getRelX() * mGUIRenderer->getWidth(), e->getRelY() * mGUIRenderer->getHeight());
187}
188//-----------------------------------------------------------------------
189void MouseQueryListener::mousePressed(MouseEvent* e)
190{
191     // Left mouse button down
192     if (e->getButtonID() & InputEvent::BUTTON0_MASK)
193     {
194                 CEGUI::MouseCursor::getSingleton().hide( );
195
196                 // Setup the ray scene query
197         Ray mouseRay = mCamera->getCameraToViewportRay( e->getX(), e->getY() );
198   
199                 Vector3 queryResult;
200         // Get results, create a node/entity on the position
201                 if(mRayQueryExecutor->executeRayQuery(&queryResult, mouseRay))
202         {
203                         char name[16];
204             sprintf( name, "Robot%d", mCount++ );
205
206             Entity *ent = mSceneMgr->createEntity(name, "robot.mesh");
207             mCurrentObject = mSceneMgr->getRootSceneNode()->
208                                 createChildSceneNode( String(name) + "Node", queryResult);
209             mCurrentObject->attachObject( ent );
210             mCurrentObject->setScale( 0.1f, 0.1f, 0.1f );
211         }
212
213         mLMouseDown = true;
214     }
215     // Right mouse button down
216     else if (e->getButtonID() & InputEvent::BUTTON1_MASK)
217     {
218         CEGUI::MouseCursor::getSingleton().hide( );
219         mRMouseDown = true;
220     } // else if
221} // mousePressed
222
223 //-----------------------------------------------------------------------
224void MouseQueryListener::mouseReleased(MouseEvent* e)
225{
226    // Left mouse button up
227    if (e->getButtonID() & InputEvent::BUTTON0_MASK)
228    {
229                CEGUI::MouseCursor::getSingleton().show( );
230        mLMouseDown = false;
231    }
232    // Right mouse button up
233    else if (e->getButtonID() & InputEvent::BUTTON1_MASK)
234    {
235        CEGUI::MouseCursor::getSingleton().show( );
236        mRMouseDown = false;
237    }
238}
239//-----------------------------------------------------------------------
240void MouseQueryListener::mouseDragged (MouseEvent *e)
241 {
242         // If we are dragging the left mouse button.           
243         if ( mLMouseDown )
244     {
245                 Vector3 queryResult;
246                 Ray mouseRay = mCamera->getCameraToViewportRay(e->getX(), e->getY());
247
248                 if(mRayQueryExecutor->executeRayQuery(&queryResult, mouseRay))
249                 {
250                         mCurrentObject->setPosition(queryResult);
251                 }
252     }
253         // If we are dragging the right mouse button.
254         if ( mRMouseDown )
255         {
256                 mCamera->yaw( -e->getRelX() * mRotateSpeed );
257                 mCamera->pitch( -e->getRelY() * mRotateSpeed );
258         }
259}
260//-----------------------------------------------------------------------
261bool MouseQueryListener::frameStarted(const FrameEvent &evt)
262{
263        // clamp to terrain
264        Vector3 camPos = mCamera->getPosition();
265        Vector3 queryResult;
266
267    if(mRayQueryExecutor->executeRayQuery(&queryResult,
268                Vector3(camPos.x, 5000.0f, camPos.z), Vector3::NEGATIVE_UNIT_Y))
269        {
270                mCamera->setPosition(mCamera->getPosition().x, queryResult.y + 10,
271                        mCamera->getPosition().z);
272        }
273         
274        return ExampleFrameListener::frameStarted(evt);
275}
276//-----------------------------------------------------------------------
277bool MouseQueryListener::frameEnded(const FrameEvent& evt)
278{
279        if (mShutdownRequested)
280                return false;
281
282    if (timeDelay >= 0)
283        timeDelay -= evt.timeSinceLastFrame;
284
285    KEY_PRESSED(KC_SPACE, 0.3, changeAlgorithm());
286
287        KEY_PRESSED(KC_SUBTRACT, 0, changeThreshold(-10));
288        KEY_PRESSED(KC_ADD, 0, changeThreshold(10));
289        //KEY_PRESSED(KC_T, 1, change);
290     
291        changeStats();
292
293    return ExampleFrameListener::frameStarted(evt) && ExampleFrameListener::frameEnded(evt);       
294}
295//-----------------------------------------------------------------------
296void MouseQueryListener::changeThreshold(int incr)
297{
298        mThreshold += incr; if(mThreshold < 0) mThreshold = 0;
299       
300        char str[100]; sprintf(str,": %d", mThreshold);
301
302        mSceneMgr->setOption("Threshold", &mThreshold);
303        mThresholdInfo->setCaption(str);
304}
305//-----------------------------------------------------------------------
306void MouseQueryListener::changeAlgorithm()
307{
308        mCurrentAlgorithm = ++mCurrentAlgorithm %
309                GtpVisibility::VisibilityEnvironment::NUM_CULLING_MANAGERS,
310
311        mAlgorithmInfo->setCaption(": " + mCurrentAlgorithmCaptions[mCurrentAlgorithm]);
312        mSceneMgr->setOption("Algorithm", &mCurrentAlgorithm);
313}
314//-----------------------------------------------------------------------
315void MouseQueryListener::changeStats()
316{
317        unsigned int opt = 0;
318        char str[100];
319       
320        mSceneMgr->getOption("NumFrustumCulledNodes", &opt); sprintf(str,": %d", opt);
321        mFrustumCulledNodesInfo->setCaption(str);
322       
323        mSceneMgr->getOption("NumQueryCulledNodes", &opt); sprintf(str,": %d", opt);
324        mQueryCulledNodesInfo->setCaption(str);
325       
326        mSceneMgr->getOption("NumTraversedNodes", &opt); sprintf(str,": %d", opt);
327        mTraversedNodesInfo->setCaption(str);
328
329        mSceneMgr->getOption("NumHierarchyNodes", &opt); sprintf(str,": %d", opt);
330        mHierarchyNodesInfo->setCaption(str);
331
332        mSceneMgr->getOption("NumRenderedNodes", &opt); sprintf(str,": %d", opt);
333        mRenderedNodesInfo->setCaption(str);
334}
335//-----------------------------------------------------------------------
336void MouseQueryListener::keyPressed(KeyEvent* e)
337{
338        if(e->getKey() == KC_ESCAPE)
339    {
340                mShutdownRequested = true;
341                e->consume();
342                return;
343        }
344
345        CEGUI::System::getSingleton().injectKeyDown(e->getKey());
346        CEGUI::System::getSingleton().injectChar(e->getKeyChar());
347        e->consume();
348}
349//-----------------------------------------------------------------------
350void MouseQueryListener::keyReleased(KeyEvent* e)
351{
352        CEGUI::System::getSingleton().injectKeyUp(e->getKey());
353        e->consume();
354}
355//-----------------------------------------------------------------------
356void MouseQueryListener::keyClicked(KeyEvent* e)
357{
358        // Do nothing
359        e->consume();
360}
361//-----------------------------------------------------------------------
362INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
363{
364    // Create application object
365    TestCullingTerrainApplication app;
366
367        try
368        {
369        app.go();
370    }
371        catch( Ogre::Exception& e )
372        {
373        MessageBox( NULL, e.getFullDescription().c_str(), "An exception has occured!", MB_OK | MB_ICONERROR | MB_TASKMODAL);
374    }   
375
376    return 0;
377}
Note: See TracBrowser for help on using the repository browser.