source: trunk/VUT/OcclusionCullingSceneManager/TestCulling/TestCullingApplication.cpp @ 33

Revision 33, 9.1 KB checked in by Mattausch, 19 years ago (diff)
Line 
1/**
2    \file
3        TestCullingApplication.cpp
4    \brief
5        Tests the occlusion 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 "TestCullingApplication.h"
17#include "OgreOcclusionCullingSceneTraverser.h"
18
19#define WIN32_LEAN_AND_MEAN
20#include "windows.h"
21
22/***********************************************/
23/* TestCullingApplication implementation       */
24/***********************************************/
25
26
27//-----------------------------------------------------------------------
28void TestCullingApplication::createScene(void)
29{
30     // Create a skybox
31     mSceneMgr->setSkyBox(true, "Examples/SpaceSkyBox");
32         mShip = mSceneMgr->createEntity("razor", "razor.mesh");
33         mShipNode = mSceneMgr->getRootSceneNode()->createChildSceneNode();
34         mShipNode->attachObject(mShip);
35
36         mSceneMgr->setAmbientLight(ColourValue(0.5, 0.5, 0.5));
37
38         // CEGUI setup
39     mGUIRenderer = new CEGUI::OgreCEGUIRenderer(mWindow, Ogre::RENDER_QUEUE_OVERLAY, false, 3000, ST_GENERIC);
40     mGUISystem = new CEGUI::System(mGUIRenderer);
41
42         // Mouse
43     CEGUI::SchemeManager::getSingleton().loadScheme((CEGUI::utf8*)"TaharezLook.scheme");
44     CEGUI::MouseCursor::getSingleton().setImage("TaharezLook", "MouseArrow");
45         mGUISystem->setDefaultMouseCursor(
46                (CEGUI::utf8*)"TaharezLook", (CEGUI::utf8*)"MouseArrow");
47
48         CEGUI::MouseCursor::getSingleton().show( );
49     
50        /* CEGUI::Window* sheet =
51            CEGUI::WindowManager::getSingleton().loadWindowLayout(
52                (CEGUI::utf8*)"ogregui.layout");
53
54     mGUISystem->setGUISheet(sheet);*/
55}
56//-----------------------------------------------------------------------
57void TestCullingApplication::createFrameListener(void)
58{
59        mFrameListener= new MouseQueryListener(mWindow, mCamera, mSceneMgr, mGUIRenderer, mShipNode);
60        mFrameListener->showDebugOverlay(true);
61        mRoot->addFrameListener(mFrameListener);
62}
63//-----------------------------------------------------------------------
64void TestCullingApplication::chooseSceneManager(void)
65{
66    //mSceneMgr = mRoot->getSceneManager(ST_GENERIC);
67        mSceneMgr = mRoot->getSceneManager(ST_EXTERIOR_CLOSE);
68}
69
70/***********************************************/
71/* MouseQueryListener implementation           */
72/***********************************************/
73
74//-----------------------------------------------------------------------
75MouseQueryListener::MouseQueryListener(RenderWindow* win, Camera* cam, SceneManager *sceneManager, CEGUI::Renderer *renderer,
76                                           SceneNode* shipNode)
77        : ExampleFrameListener(win, cam, false, true), mGUIRenderer(renderer), mShipNode(shipNode)//,  mShutdownRequested(false)
78{
79
80        // Setup default variables
81        mCurrentObject = NULL;
82        mLMouseDown = false;
83        mRMouseDown = false;
84        mSceneMgr = sceneManager;
85
86    // Reduce move speed
87        mMoveSpeed = 50;
88        mRotateSpeed *= 2;
89
90        mCurrentAlgorithm = OcclusionCullingSceneTraverser::RENDER_COHERENT;
91        mThreshold = 0;
92   
93        // Register this so that we get mouse events.
94        mEventProcessor->addMouseListener(this);
95        mEventProcessor->addMouseMotionListener(this);
96        mEventProcessor->addKeyListener(this);
97
98        // show overlay
99        Overlay* pOver = OverlayManager::getSingleton().getByName("Example/OcclusionDemoOverlay");
100
101        mAlgorithmInfo = OverlayManager::getSingleton().getOverlayElement("Example/Occlusion/AlgorithmInfo");
102        mThresholdInfo = OverlayManager::getSingleton().getOverlayElement("Example/Occlusion/ThresholdInfo");
103        mFrustumCulledNodesInfo = OverlayManager::getSingleton().getOverlayElement("Example/Occlusion/FrustumCulledNodesInfo");
104        mQueryCulledNodesInfo = OverlayManager::getSingleton().getOverlayElement("Example/Occlusion/QueryCulledNodesInfo");
105    mTraversedNodesInfo = OverlayManager::getSingleton().getOverlayElement("Example/Occlusion/TraversedNodesInfo");
106
107        mAlgorithmInfo->setCaption(": " + mCurrentAlgorithmCaptions[mCurrentAlgorithm]);
108        mThresholdInfo->setCaption(": 0");
109        mFrustumCulledNodesInfo->setCaption(": 0");
110        mQueryCulledNodesInfo->setCaption(": 0");
111        mTraversedNodesInfo->setCaption(": 0");
112
113    pOver->show();
114} // MouseQueryListener
115//-----------------------------------------------------------------------
116void MouseQueryListener::mouseMoved (MouseEvent *e)
117{
118        // Update CEGUI with the mouse motion
119    CEGUI::System::getSingleton().injectMouseMove(e->getRelX() * mGUIRenderer->getWidth(), e->getRelY() * mGUIRenderer->getHeight());
120}
121//-----------------------------------------------------------------------
122void MouseQueryListener::mousePressed(MouseEvent* e)
123{
124     // Left mouse button down
125     if (e->getButtonID() & InputEvent::BUTTON0_MASK)
126     {
127                 CEGUI::MouseCursor::getSingleton().hide( );
128                 mLMouseDown = true;
129     } // if
130     // Right mouse button down
131     else if (e->getButtonID() & InputEvent::BUTTON1_MASK)
132     {
133         CEGUI::MouseCursor::getSingleton().hide( );
134         mRMouseDown = true;
135     } // else if
136} // mousePressed
137
138 //-----------------------------------------------------------------------
139void MouseQueryListener::mouseReleased(MouseEvent* e)
140{
141    // Left mouse button up
142    if (e->getButtonID() & InputEvent::BUTTON0_MASK)
143    {
144                CEGUI::MouseCursor::getSingleton().show( );
145        mLMouseDown = false;
146    } // if
147    // Right mouse button up
148    else if (e->getButtonID() & InputEvent::BUTTON1_MASK)
149    {
150        CEGUI::MouseCursor::getSingleton().show( );
151        mRMouseDown = false;
152    } // else if
153} // mouseReleased
154//-----------------------------------------------------------------------
155void MouseQueryListener::mouseDragged (MouseEvent *e)
156 {
157     // If we are dragging the left mouse button.
158     if ( mLMouseDown )
159     {
160                  mShipNode->translate(-e->getRelX() * 200, -e->getRelY() * 200, 0.0);
161     } // if
162
163    // If we are dragging the right mouse button.
164    else if ( mRMouseDown )
165    {
166        mCamera->yaw( -e->getRelX() * mRotateSpeed );
167        mCamera->pitch( -e->getRelY() * mRotateSpeed );
168    } // else if
169} // mouseDragged
170//-----------------------------------------------------------------------
171bool MouseQueryListener::frameEnded(const FrameEvent& evt)
172{
173        if (mShutdownRequested)
174                return false;
175
176    if (timeDelay >= 0)
177        timeDelay -= evt.timeSinceLastFrame;
178
179    KEY_PRESSED(KC_SPACE, 0.3, changeAlgorithm());
180
181        KEY_PRESSED(KC_SUBTRACT, 0.3, changeThreshold(-10));
182        KEY_PRESSED(KC_ADD, 0, changeThreshold(10));
183        //KEY_PRESSED(KC_T, 1, change);
184     
185        changeStats();
186
187    return ExampleFrameListener::frameStarted(evt) && ExampleFrameListener::frameEnded(evt);       
188}
189//-----------------------------------------------------------------------
190void MouseQueryListener::changeThreshold(int incr)
191{
192        mThreshold += incr; if(mThreshold < 0) mThreshold = 0;
193       
194        char str[100]; sprintf(str,": %d", mThreshold);
195
196        mSceneMgr->setOption("Threshold", &mThreshold);
197        mThresholdInfo->setCaption(str);
198}
199//-----------------------------------------------------------------------
200void MouseQueryListener::changeAlgorithm()
201{
202    mCurrentAlgorithm = ++mCurrentAlgorithm % OcclusionCullingSceneTraverser::NUM_RENDERMODES;
203
204        mAlgorithmInfo->setCaption(": " + mCurrentAlgorithmCaptions[mCurrentAlgorithm]);
205        mSceneMgr->setOption("Algorithm", &mCurrentAlgorithm);
206}
207//-----------------------------------------------------------------------
208void MouseQueryListener::changeStats()
209{
210        unsigned int opt = 0;
211        char str[100];
212       
213        mSceneMgr->getOption("NumFrustumCulledNodes", &opt); sprintf(str,": %d", opt);
214        mFrustumCulledNodesInfo->setCaption(str);
215       
216        mSceneMgr->getOption("NumQueryCulledNodes", &opt); sprintf(str,": %d", opt);
217        mQueryCulledNodesInfo->setCaption(str);
218       
219        mSceneMgr->getOption("NumTraversedNodes", &opt); sprintf(str,": %d", opt);
220        mTraversedNodesInfo->setCaption(str);
221}
222//-----------------------------------------------------------------------
223void MouseQueryListener::keyPressed(KeyEvent* e)
224{
225        if(e->getKey() == KC_ESCAPE)
226    {
227                mShutdownRequested = true;
228                e->consume();
229                return;
230        }
231
232        CEGUI::System::getSingleton().injectKeyDown(e->getKey());
233        CEGUI::System::getSingleton().injectChar(e->getKeyChar());
234        e->consume();
235}
236//-----------------------------------------------------------------------
237void MouseQueryListener::keyReleased(KeyEvent* e)
238{
239        CEGUI::System::getSingleton().injectKeyUp(e->getKey());
240        e->consume();
241}
242//-----------------------------------------------------------------------
243void MouseQueryListener::keyClicked(KeyEvent* e)
244{
245        // Do nothing
246        e->consume();
247}
248//-----------------------------------------------------------------------
249INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
250{
251    // Create application object
252    TestCullingApplication app;
253
254        try {
255        app.go();
256    } catch( Ogre::Exception& e ) {
257        MessageBox( NULL, e.getFullDescription().c_str(), "An exception has occured!", MB_OK | MB_ICONERROR | MB_TASKMODAL);
258    }   
259
260    return 0;
261}
Note: See TracBrowser for help on using the repository browser.