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

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