Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/main_reto/src/RunManager.cpp @ 123

Last change on this file since 123 was 123, checked in by rgrieder, 16 years ago
File size: 10.5 KB
Line 
1#include "RunManager.h"
2
3
4// Constructor takes a RenderWindow because it uses that to determine input context
5RunManager::RunManager(OgreControl * mOgre, bool bufferedKeys, bool bufferedMouse,
6                                           bool bufferedJoy ) :
7mOgre(mOgre), mWindow(mOgre->getRenderWindow()),
8mTranslateVector(Vector3::ZERO), mStatsOn(true), mNumScreenShots(0),
9mMoveScale(0.0f), mRotScale(0.0f), mTimeUntilNextToggle(0), mFiltering(TFO_BILINEAR),
10mAniso(1), mSceneDetailIndex(0), mMoveSpeed(100), mRotateSpeed(36), mDebugOverlay(0),
11mInputManager(0), mMouse(0), mKeyboard(0), mJoy(0)
12{
13        // create new scene
14        mSceneMgr = mOgre->getRoot()->createSceneManager(ST_GENERIC,"mScene");
15        mScene = new OrxonoxScene(mSceneMgr);
16
17        // create camera and viewport
18        createCamera();
19        createViewports();
20
21        mScene->initialise();
22
23
24        using namespace OIS;
25
26        mDebugOverlay = OverlayManager::getSingleton().getByName("Core/DebugOverlay");
27
28        LogManager::getSingletonPtr()->logMessage("*** Initializing OIS ***");
29        ParamList pl;
30        size_t windowHnd = 0;
31        std::ostringstream windowHndStr;
32
33        mWindow->getCustomAttribute("WINDOW", &windowHnd);
34        windowHndStr << windowHnd;
35        pl.insert(std::make_pair(std::string("WINDOW"), windowHndStr.str()));
36
37        mInputManager = InputManager::createInputSystem( pl );
38
39        //Create all devices (We only catch joystick exceptions here, as, most people have Key/Mouse)
40        mKeyboard = static_cast<Keyboard*>(mInputManager->createInputObject( OISKeyboard, bufferedKeys ));
41        mMouse = static_cast<Mouse*>(mInputManager->createInputObject( OISMouse, bufferedMouse ));
42        try {
43                mJoy = static_cast<JoyStick*>(mInputManager->createInputObject( OISJoyStick, bufferedJoy ));
44        }
45        catch(...) {
46                mJoy = 0;
47        }
48
49        //Set initial mouse clipping size
50        windowResized(mWindow);
51
52        showDebugOverlay(true);
53
54        //Register as a Window listener
55        WindowEventUtilities::addWindowEventListener(mWindow, this);
56}
57
58
59RunManager::~RunManager()
60{
61        //Remove ourself as a Window listener
62        WindowEventUtilities::removeWindowEventListener(mWindow, this);
63        windowClosed(mWindow);
64
65        if (mScene)
66                delete mScene;
67}
68
69
70// Override frameStarted event to process that (don't care about frameEnded)
71bool RunManager::tick(unsigned long time, float deltaTime)
72{
73        mTime = time;
74
75        updateStats();
76       
77        mScene->tick(time, deltaTime);
78
79        using namespace OIS;
80
81        if(mWindow->isClosed()) return false;
82
83        //Need to capture/update each device
84        mKeyboard->capture();
85        mMouse->capture();
86        if( mJoy ) mJoy->capture();
87
88        bool buffJ = (mJoy) ? mJoy->buffered() : true;
89
90        //Check if one of the devices is not buffered
91        if( !mMouse->buffered() || !mKeyboard->buffered() || !buffJ )
92        {
93                // one of the input modes is immediate, so setup what is needed for immediate movement
94                if (mTimeUntilNextToggle >= 0)
95                        mTimeUntilNextToggle -= deltaTime;
96
97                // If this is the first frame, pick a speed
98                if (deltaTime == 0)
99                {
100                        mMoveScale = 1;
101                        mRotScale = 0.1;
102                }
103                // Otherwise scale movement units by time passed since last frame
104                else
105                {
106                        // Move about 100 units per second,
107                        mMoveScale = mMoveSpeed * deltaTime;
108                        // Take about 10 seconds for full rotation
109                        mRotScale = mRotateSpeed * deltaTime;
110                }
111                mRotX = 0;
112                mRotY = 0;
113                mTranslateVector = Ogre::Vector3::ZERO;
114        }
115
116        //Check to see which device is not buffered, and handle it
117        if( !mKeyboard->buffered() )
118                if( processUnbufferedKeyInput() == false )
119                        return false;
120        if( !mMouse->buffered() )
121                if( processUnbufferedMouseInput() == false )
122                        return false;
123
124        if( !mMouse->buffered() || !mKeyboard->buffered() || !buffJ )
125                moveCamera();
126
127        return true;
128}
129
130
131//Adjust mouse clipping area
132void RunManager::windowResized(RenderWindow* rw)
133{
134        unsigned int width, height, depth;
135        int left, top;
136        rw->getMetrics(width, height, depth, left, top);
137
138        const OIS::MouseState &ms = mMouse->getMouseState();
139        ms.width = width;
140        ms.height = height;
141}
142
143
144//Unattach OIS before window shutdown (very important under Linux)
145void RunManager::windowClosed(RenderWindow* rw)
146{
147        //Only close for window that created OIS (the main window in these demos)
148        if( rw == mWindow )
149        {
150                if( mInputManager )
151                {
152                        mInputManager->destroyInputObject( mMouse );
153                        mInputManager->destroyInputObject( mKeyboard );
154                        mInputManager->destroyInputObject( mJoy );
155
156                        OIS::InputManager::destroyInputSystem(mInputManager);
157                        mInputManager = 0;
158                }
159        }
160}
161
162
163bool RunManager::processUnbufferedKeyInput()
164{
165        using namespace OIS;
166
167        if(mKeyboard->isKeyDown(KC_A))
168                mTranslateVector.x = -mMoveScale;       // Move camera left
169
170        if(mKeyboard->isKeyDown(KC_D))
171                mTranslateVector.x = mMoveScale;        // Move camera RIGHT
172
173        if(mKeyboard->isKeyDown(KC_UP) || mKeyboard->isKeyDown(KC_W) )
174                mTranslateVector.z = -mMoveScale;       // Move camera forward
175
176        if(mKeyboard->isKeyDown(KC_DOWN) || mKeyboard->isKeyDown(KC_S) )
177                mTranslateVector.z = mMoveScale;        // Move camera backward
178
179        if(mKeyboard->isKeyDown(KC_PGUP))
180                mTranslateVector.y = mMoveScale;        // Move camera up
181
182        if(mKeyboard->isKeyDown(KC_PGDOWN))
183                mTranslateVector.y = -mMoveScale;       // Move camera down
184
185        if(mKeyboard->isKeyDown(KC_RIGHT))
186                mCamera->yaw(-mRotScale);
187
188        if(mKeyboard->isKeyDown(KC_LEFT))
189                mCamera->yaw(mRotScale);
190
191        if( mKeyboard->isKeyDown(KC_ESCAPE) || mKeyboard->isKeyDown(KC_Q) )
192                return false;
193
194        if( mKeyboard->isKeyDown(KC_F) && mTimeUntilNextToggle <= 0 )
195        {
196                mStatsOn = !mStatsOn;
197                showDebugOverlay(mStatsOn);
198                mTimeUntilNextToggle = 1;
199        }
200
201        if( mKeyboard->isKeyDown(KC_T) && mTimeUntilNextToggle <= 0 )
202        {
203                switch(mFiltering)
204                {
205                case TFO_BILINEAR:
206                        mFiltering = TFO_TRILINEAR;
207                        mAniso = 1;
208                        break;
209                case TFO_TRILINEAR:
210                        mFiltering = TFO_ANISOTROPIC;
211                        mAniso = 8;
212                        break;
213                case TFO_ANISOTROPIC:
214                        mFiltering = TFO_BILINEAR;
215                        mAniso = 1;
216                        break;
217                default: break;
218                }
219                MaterialManager::getSingleton().setDefaultTextureFiltering(mFiltering);
220                MaterialManager::getSingleton().setDefaultAnisotropy(mAniso);
221
222                showDebugOverlay(mStatsOn);
223                mTimeUntilNextToggle = 1;
224        }
225
226        if(mKeyboard->isKeyDown(KC_SYSRQ) && mTimeUntilNextToggle <= 0)
227        {
228                std::ostringstream ss;
229                ss << "screenshot_" << ++mNumScreenShots << ".png";
230                mWindow->writeContentsToFile(ss.str());
231                mTimeUntilNextToggle = 0.5;
232                mDebugText = "Saved: " + ss.str();
233        }
234
235        if(mKeyboard->isKeyDown(KC_R) && mTimeUntilNextToggle <=0)
236        {
237                mSceneDetailIndex = (mSceneDetailIndex+1)%3 ;
238                switch(mSceneDetailIndex) {
239                                case 0 : mCamera->setPolygonMode(PM_SOLID); break;
240                                case 1 : mCamera->setPolygonMode(PM_WIREFRAME); break;
241                                case 2 : mCamera->setPolygonMode(PM_POINTS); break;
242                }
243                mTimeUntilNextToggle = 0.5;
244        }
245
246        static bool displayCameraDetails = false;
247        if(mKeyboard->isKeyDown(KC_P) && mTimeUntilNextToggle <= 0)
248        {
249                displayCameraDetails = !displayCameraDetails;
250                mTimeUntilNextToggle = 0.5;
251                if (!displayCameraDetails)
252                        mDebugText = "";
253        }
254
255        // Print camera details
256        if(displayCameraDetails)
257                mDebugText = "P: " + StringConverter::toString(mCamera->getDerivedPosition()) +
258                " " + "O: " + StringConverter::toString(mCamera->getDerivedOrientation());
259
260        // Return true to continue rendering
261        return true;
262}
263
264
265bool RunManager::processUnbufferedMouseInput()
266{
267        using namespace OIS;
268
269        // Rotation factors, may not be used if the second mouse button is pressed
270        // 2nd mouse button - slide, otherwise rotate
271        const MouseState &ms = mMouse->getMouseState();
272        if( ms.buttonDown( MB_Right ) )
273        {
274                mTranslateVector.x += ms.X.rel * 0.13;
275                mTranslateVector.y -= ms.Y.rel * 0.13;
276        }
277        else
278        {
279                mRotX = Degree(-ms.X.rel * 0.13);
280                mRotY = Degree(-ms.Y.rel * 0.13);
281        }
282
283        return true;
284}
285
286
287void RunManager::moveCamera()
288{
289        // Make all the changes to the camera
290        // Note that YAW direction is around a fixed axis (freelook style) rather than a natural YAW
291        //(e.g. airplane)
292        mCamera->yaw(mRotX);
293        mCamera->pitch(mRotY);
294        mCamera->moveRelative(mTranslateVector);
295}
296
297
298void RunManager::showDebugOverlay(bool show)
299{
300        if (mDebugOverlay)
301        {
302                if (show)
303                        mDebugOverlay->show();
304                else
305                        mDebugOverlay->hide();
306        }
307}
308
309
310
311void RunManager::updateStats(void)
312{
313        static String currFps = "Current FPS: ";
314        static String avgFps = "Average FPS: ";
315        static String bestFps = "Best FPS: ";
316        static String worstFps = "Worst FPS: ";
317        static String tris = "Triangle Count: ";
318        static String batches = "Batch Count: ";
319
320        // update stats when necessary
321        try {
322                OverlayElement* guiAvg = OverlayManager::getSingleton().getOverlayElement("Core/AverageFps");
323                OverlayElement* guiCurr = OverlayManager::getSingleton().getOverlayElement("Core/CurrFps");
324                OverlayElement* guiBest = OverlayManager::getSingleton().getOverlayElement("Core/BestFps");
325                OverlayElement* guiWorst = OverlayManager::getSingleton().getOverlayElement("Core/WorstFps");
326                //OverlayElement* asfd = OverlayManager::getSingleton().getOverlayElement(
327
328                const RenderTarget::FrameStats& stats = mWindow->getStatistics();
329                guiAvg->setCaption(avgFps + StringConverter::toString(stats.avgFPS));
330                guiCurr->setCaption(currFps + StringConverter::toString(stats.lastFPS));
331                guiBest->setCaption(bestFps + StringConverter::toString(stats.bestFPS)
332                        +" "+StringConverter::toString(stats.bestFrameTime)+" ms");
333                guiWorst->setCaption(worstFps + StringConverter::toString(stats.worstFPS)
334                        +" "+StringConverter::toString(stats.worstFrameTime)+" ms");
335
336                OverlayElement* guiTris = OverlayManager::getSingleton().getOverlayElement("Core/NumTris");
337                guiTris->setCaption(tris + StringConverter::toString(stats.triangleCount));
338
339                OverlayElement* guiBatches = OverlayManager::getSingleton().getOverlayElement("Core/NumBatches");
340                guiBatches->setCaption(batches + StringConverter::toString(stats.batchCount));
341
342                OverlayElement* guiDbg = OverlayManager::getSingleton().getOverlayElement("Core/DebugText");
343                guiDbg->setCaption(mDebugText);
344        }
345        catch(...) { /* ignore */ }
346}
347
348
349
350// create camera
351void RunManager::createCamera(void)
352{
353        mCamera = mSceneMgr->createCamera("PlayerCam");
354        mCamera->setNearClipDistance(5);
355        mCamera->setPosition(Vector3(0,10,500));
356        mCamera->lookAt(Vector3(0,0,0));
357}
358
359
360void RunManager::createViewports(void)
361{
362        // Create one viewport, entire window
363        Viewport* vp = mWindow->addViewport(mCamera);
364        vp->setBackgroundColour(ColourValue(0,0,0));
365
366        // Alter the camera aspect ratio to match the viewport
367        mCamera->setAspectRatio(
368                Real(vp->getActualWidth()) / Real(vp->getActualHeight()));
369
370        // Set default mipmap level (NB some APIs ignore this)
371        TextureManager::getSingleton().setDefaultNumMipmaps(5);
372}
373
374
Note: See TracBrowser for help on using the repository browser.