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

Revision 85, 11.0 KB checked in by mattausch, 19 years ago (diff)

corrected bug so chc is much faster than stop and wait

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 "SceneContentGenerator.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("PlayerCam");
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(330, "robot.mesh");
57
58        // Create a skybox
59    //mSceneMgr->setSkyBox(true, "Examples/CloudyNoonSkyBox", 1000, false);
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 MouseQueryListener(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/* MouseQueryListener implementation           */
97/***********************************************/
98//-----------------------------------------------------------------------
99MouseQueryListener::MouseQueryListener(RenderWindow* win, Camera* cam,
100                                                                           SceneManager *sceneManager,
101                                                                           CEGUI::Renderer *renderer,
102                                                                           SceneContentGenerator *sceneContentGenerator)
103        : ExampleFrameListener(win, cam, false, true), mGUIRenderer(renderer),
104                mShutdownRequested(false)
105{
106
107        // Setup default variables
108        //mOgreHead = NULL;
109        mLMouseDown = false;
110        mRMouseDown = false;
111        mSceneMgr = sceneManager;
112
113        mSceneContentGenerator = sceneContentGenerator;
114
115    // Reduce move speed
116        mMoveSpeed = 50;
117        mRotateSpeed *= 2;
118
119        mCurrentAlgorithm = GtpVisibility::VisibilityEnvironment::COHERENT_HIERARCHICAL_CULLING;
120        mVisibilityThreshold = 0;
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        mNumObjectsInfo = OverlayManager::getSingleton().getOverlayElement("Example/Visibility/NumObjectsInfo");
139
140        mAlgorithmInfo->setCaption(": " + mCurrentAlgorithmCaptions[mCurrentAlgorithm]);
141        mThresholdInfo->setCaption(": 0");
142        mFrustumCulledNodesInfo->setCaption(": 0");
143        mQueryCulledNodesInfo->setCaption(": 0");
144        mTraversedNodesInfo->setCaption(": 0");
145        mHierarchyNodesInfo->setCaption(": 0");
146        mRenderedNodesInfo->setCaption(": 0");
147        mNumObjectsInfo->setCaption(": 0");
148
149        setAlgorithm(mCurrentAlgorithm);
150
151    pOver->show();
152}
153//-----------------------------------------------------------------------
154MouseQueryListener::~MouseQueryListener( )
155{
156}
157//-----------------------------------------------------------------------
158void MouseQueryListener::mouseMoved (MouseEvent *e)
159{
160        // Update CEGUI with the mouse motion
161    CEGUI::System::getSingleton().injectMouseMove(e->getRelX() * mGUIRenderer->getWidth(), e->getRelY() * mGUIRenderer->getHeight());
162}
163//-----------------------------------------------------------------------
164void MouseQueryListener::mousePressed(MouseEvent* e)
165{
166     // Left mouse button down
167     if (e->getButtonID() & InputEvent::BUTTON0_MASK)
168     {
169                mLMouseDown = true;
170     }
171     // Right mouse button down
172     else if (e->getButtonID() & InputEvent::BUTTON1_MASK)
173     {
174         CEGUI::MouseCursor::getSingleton().hide( );
175         mRMouseDown = true;
176     } // else if
177} // mousePressed
178
179 //-----------------------------------------------------------------------
180void MouseQueryListener::mouseReleased(MouseEvent* e)
181{
182    // Left mouse button up
183    if (e->getButtonID() & InputEvent::BUTTON0_MASK)
184    {
185                CEGUI::MouseCursor::getSingleton().show();
186        mLMouseDown = false;
187    }
188    // Right mouse button up
189    else if (e->getButtonID() & InputEvent::BUTTON1_MASK)
190    {
191        CEGUI::MouseCursor::getSingleton().show();
192        mRMouseDown = false;
193    }
194}
195//-----------------------------------------------------------------------
196void MouseQueryListener::mouseDragged (MouseEvent *e)
197 {
198         // If we are dragging the left mouse button.           
199         if ( mLMouseDown )
200     {
201               
202     }
203         // If we are dragging the right mouse button.
204         if ( mRMouseDown )
205         {
206                 mCamera->yaw( -e->getRelX() * mRotateSpeed );
207                 mCamera->pitch( -e->getRelY() * mRotateSpeed );
208         }
209}
210//-----------------------------------------------------------------------
211bool MouseQueryListener::frameStarted(const FrameEvent &evt)
212{       
213        return ExampleFrameListener::frameStarted(evt);
214}
215//-----------------------------------------------------------------------
216bool MouseQueryListener::frameEnded(const FrameEvent& evt)
217{
218        if (mShutdownRequested)
219                return false;
220
221    if (timeDelay >= 0)
222        timeDelay -= evt.timeSinceLastFrame;
223
224    KEY_PRESSED(KC_SPACE, 0.3, nextAlgorithm());
225
226        KEY_PRESSED(KC_SUBTRACT, 0, changeThreshold(-10));
227        KEY_PRESSED(KC_ADD, 0, changeThreshold(10));
228        //KEY_PRESSED(KC_T, 1, change);
229     
230        changeStats();
231
232    return ExampleFrameListener::frameStarted(evt) && ExampleFrameListener::frameEnded(evt);       
233}
234//-----------------------------------------------------------------------
235void MouseQueryListener::changeThreshold(int incr)
236{
237        mVisibilityThreshold += incr;
238        if(mVisibilityThreshold < 0) mVisibilityThreshold = 0;
239       
240        char str[100]; sprintf(str,": %d", mVisibilityThreshold);
241
242        mSceneMgr->setOption("Threshold", &mVisibilityThreshold);
243        mThresholdInfo->setCaption(str);
244}
245//-----------------------------------------------------------------------
246void MouseQueryListener::nextAlgorithm()
247{
248        mCurrentAlgorithm = ++mCurrentAlgorithm %
249                GtpVisibility::VisibilityEnvironment::NUM_CULLING_MANAGERS,
250
251        setAlgorithm(mCurrentAlgorithm);
252}
253//-----------------------------------------------------------------------
254void MouseQueryListener::setAlgorithm(int algorithm)
255{
256        mAlgorithmInfo->setCaption(": " + mCurrentAlgorithmCaptions[mCurrentAlgorithm]);
257        mSceneMgr->setOption("Algorithm", &mCurrentAlgorithm);
258}
259//-----------------------------------------------------------------------
260void MouseQueryListener::changeStats()
261{
262        unsigned int opt = 0;
263        char str[100];
264       
265        mSceneMgr->getOption("NumFrustumCulledNodes", &opt); sprintf(str,": %d", opt);
266        mFrustumCulledNodesInfo->setCaption(str);
267       
268        mSceneMgr->getOption("NumQueryCulledNodes", &opt); sprintf(str,": %d", opt);
269        mQueryCulledNodesInfo->setCaption(str);
270       
271        mSceneMgr->getOption("NumTraversedNodes", &opt); sprintf(str,": %d", opt);
272        mTraversedNodesInfo->setCaption(str);
273
274        mSceneMgr->getOption("NumHierarchyNodes", &opt); sprintf(str,": %d", opt);
275        mHierarchyNodesInfo->setCaption(str);
276
277        mSceneMgr->getOption("NumRenderedNodes", &opt); sprintf(str,": %d", opt);
278        mRenderedNodesInfo->setCaption(str);
279
280        sprintf(str,": %d", mSceneContentGenerator->GetObjectCount());
281        mNumObjectsInfo->setCaption(str);
282}
283//-----------------------------------------------------------------------
284void MouseQueryListener::keyPressed(KeyEvent* e)
285{
286        if(e->getKey() == KC_ESCAPE)
287    {
288                mShutdownRequested = true;
289                e->consume();
290                return;
291        }
292
293        CEGUI::System::getSingleton().injectKeyDown(e->getKey());
294        CEGUI::System::getSingleton().injectChar(e->getKeyChar());
295        e->consume();
296}
297//-----------------------------------------------------------------------
298void MouseQueryListener::keyReleased(KeyEvent* e)
299{
300        CEGUI::System::getSingleton().injectKeyUp(e->getKey());
301        e->consume();
302}
303//-----------------------------------------------------------------------
304void MouseQueryListener::keyClicked(KeyEvent* e)
305{
306        // Do nothing
307        e->consume();
308}
309//-----------------------------------------------------------------------
310INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
311{
312    // Create application object
313    TestCullingApplication app;
314
315        try
316        {
317        app.go();
318    }
319        catch( Ogre::Exception& e )
320        {
321        MessageBox( NULL, e.getFullDescription().c_str(), "An exception has occured!", MB_OK | MB_ICONERROR | MB_TASKMODAL);
322    }   
323
324    return 0;
325}
Note: See TracBrowser for help on using the repository browser.