source: GTP/trunk/Lib/Illum/IBRBillboardCloudTrees/OGRE/src/OBAOgreFrameListenerMode.cpp @ 900

Revision 900, 11.9 KB checked in by igarcia, 18 years ago (diff)
Line 
1
2#include "OBAOgreFrameListenerMode.h"
3
4namespace OBA {
5
6OgreFrameListenerMode::OgreFrameListenerMode(Ogre::RenderWindow *win, unsigned int ogreFrameListenerModeHandle, bool useBufferedInputKeys, bool useBufferedInputMouse)
7{
8        mOgreFrameListenerModeHandle = ogreFrameListenerModeHandle;
9
10        mDebugOverlay = Ogre::OverlayManager::getSingleton().getByName("Core/DebugOverlay");
11       
12        mInputTypeSwitchingOn = useBufferedInputKeys || useBufferedInputMouse;
13        mUseBufferedInputKeys = useBufferedInputKeys;
14        mUseBufferedInputMouse = useBufferedInputMouse;
15
16        mRotateSpeed = 36;
17        mMoveSpeed = 100;
18
19    mWindow = win;
20
21        Ogre::LogManager::getSingleton().logMessage("mWindow.IsClosed->" + Ogre::StringConverter::toString(mWindow->isClosed()));
22
23    mStatsOn = true;
24        mNumScreenShots = 0;
25        mTimeUntilNextToggle = 0;
26    mSceneDetailIndex = 0;
27    mMoveScale = 0.0f;
28    mRotScale = 0.0f;
29        mTranslateVector = Ogre::Vector3::ZERO;
30    mAniso = 1;
31        mFiltering = Ogre::TFO_BILINEAR;
32
33    showDebugOverlay(true);
34}
35
36OgreFrameListenerMode::~OgreFrameListenerMode()
37{
38}
39
40void OgreFrameListenerMode::updateStats(void)
41{
42        static Ogre::String currFps = "Current FPS: ";
43    static Ogre::String avgFps = "Average FPS: ";
44    static Ogre::String bestFps = "Best FPS: ";
45    static Ogre::String worstFps = "Worst FPS: ";
46    static Ogre::String tris = "Triangle Count: ";
47
48    // update stats when necessary
49    try {
50        Ogre::OverlayElement* guiAvg = Ogre::OverlayManager::getSingleton().getOverlayElement("Core/AverageFps");
51        Ogre::OverlayElement* guiCurr = Ogre::OverlayManager::getSingleton().getOverlayElement("Core/CurrFps");
52        Ogre::OverlayElement* guiBest = Ogre::OverlayManager::getSingleton().getOverlayElement("Core/BestFps");
53        Ogre::OverlayElement* guiWorst = Ogre::OverlayManager::getSingleton().getOverlayElement("Core/WorstFps");
54
55        const Ogre::RenderTarget::FrameStats& stats = mWindow->getStatistics();
56
57        guiAvg->setCaption(avgFps + Ogre::StringConverter::toString(stats.avgFPS));
58        guiCurr->setCaption(currFps + Ogre::StringConverter::toString(stats.lastFPS));
59        guiBest->setCaption(bestFps + Ogre::StringConverter::toString(stats.bestFPS)
60            +" "+ Ogre::StringConverter::toString(stats.bestFrameTime)+" ms");
61        guiWorst->setCaption(worstFps + Ogre::StringConverter::toString(stats.worstFPS)
62            +" "+ Ogre::StringConverter::toString(stats.worstFrameTime)+" ms");
63
64        Ogre::OverlayElement* guiTris = Ogre::OverlayManager::getSingleton().getOverlayElement("Core/NumTris");
65        guiTris->setCaption(tris + Ogre::StringConverter::toString(stats.triangleCount));
66
67        Ogre::OverlayElement* guiDbg = Ogre::OverlayManager::getSingleton().getOverlayElement("Core/DebugText");
68        guiDbg->setCaption(mWindow->getDebugText());
69    }
70    catch(...)
71    {
72        // ignore
73    }
74}
75
76bool OgreFrameListenerMode::processUnbufferedKeyInput(const Ogre::FrameEvent& evt)
77{
78        if (mInputDevice->isKeyDown(Ogre::KC_A))
79    {
80        // Move camera left
81        mTranslateVector.x = -mMoveScale;
82    }
83
84        if (mInputDevice->isKeyDown(Ogre::KC_D))
85    {
86        // Move camera RIGHT
87        mTranslateVector.x = mMoveScale;
88    }
89
90    /* Move camera forward by keypress. */
91        if (mInputDevice->isKeyDown(Ogre::KC_UP) || mInputDevice->isKeyDown(Ogre::KC_W) )
92    {
93        mTranslateVector.z = -mMoveScale;
94    }
95
96    /* Move camera backward by keypress. */
97        if (mInputDevice->isKeyDown(Ogre::KC_DOWN) || mInputDevice->isKeyDown(Ogre::KC_S) )
98    {
99        mTranslateVector.z = mMoveScale;
100    }
101
102        if (mInputDevice->isKeyDown(Ogre::KC_PGUP))
103    {
104        // Move camera up
105        mTranslateVector.y = mMoveScale;
106    }
107
108        if (mInputDevice->isKeyDown(Ogre::KC_PGDOWN))
109    {
110        // Move camera down
111        mTranslateVector.y = -mMoveScale;
112    }
113
114        if (mInputDevice->isKeyDown(Ogre::KC_RIGHT))
115    {
116        mCamera->yaw(-mRotScale);
117    }
118       
119        if (mInputDevice->isKeyDown(Ogre::KC_LEFT))
120    {
121        mCamera->yaw(mRotScale);
122    }
123
124        // see if switching is on, and you want to toggle
125        if (mInputTypeSwitchingOn && mInputDevice->isKeyDown(Ogre::KC_M) && mTimeUntilNextToggle <= 0)
126    {
127                switchMouseMode();
128        mTimeUntilNextToggle = 1;
129    }
130
131        if (mInputTypeSwitchingOn && mInputDevice->isKeyDown(Ogre::KC_K) && mTimeUntilNextToggle <= 0)
132    {
133                // must be going from immediate keyboard to buffered keyboard
134                switchKeyMode();
135        mTimeUntilNextToggle = 1;
136    }
137        if (mInputDevice->isKeyDown(Ogre::KC_F) && mTimeUntilNextToggle <= 0)
138    {
139        mStatsOn = !mStatsOn;
140        showDebugOverlay(mStatsOn);
141
142        mTimeUntilNextToggle = 1;
143    }
144        if (mInputDevice->isKeyDown(Ogre::KC_T) && mTimeUntilNextToggle <= 0)
145    {
146        switch(mFiltering)
147        {
148                case Ogre::TFO_BILINEAR:
149            mFiltering = Ogre::TFO_TRILINEAR;
150            mAniso = 1;
151            break;
152        case Ogre::TFO_TRILINEAR:
153            mFiltering = Ogre::TFO_ANISOTROPIC;
154            mAniso = 8;
155            break;
156        case Ogre::TFO_ANISOTROPIC:
157            mFiltering = Ogre::TFO_BILINEAR;
158            mAniso = 1;
159            break;
160        default:
161            break;
162        }
163        Ogre::MaterialManager::getSingleton().setDefaultTextureFiltering(mFiltering);
164        Ogre::MaterialManager::getSingleton().setDefaultAnisotropy(mAniso);
165
166
167        showDebugOverlay(mStatsOn);
168
169        mTimeUntilNextToggle = 1;
170    }
171
172    if (mInputDevice->isKeyDown(Ogre::KC_SYSRQ) && mTimeUntilNextToggle <= 0)
173    {
174                char tmp[20];
175                sprintf(tmp, "screenshot_%d.png", ++mNumScreenShots);
176        mWindow->writeContentsToFile(tmp);
177        mTimeUntilNextToggle = 0.5;
178                mWindow->setDebugText(Ogre::String("Wrote ") + tmp);
179    }
180       
181        if (mInputDevice->isKeyDown(Ogre::KC_R) && mTimeUntilNextToggle <=0)
182        {
183                mSceneDetailIndex = (mSceneDetailIndex+1)%3 ;
184                switch(mSceneDetailIndex) {
185                        case 0 : mCamera->setPolygonMode(Ogre::PM_SOLID) ; break ;
186                        case 1 : mCamera->setPolygonMode(Ogre::PM_WIREFRAME) ; break ;
187                        case 2 : mCamera->setPolygonMode(Ogre::PM_POINTS) ; break ;
188                }
189                mTimeUntilNextToggle = 0.5;
190        }
191
192    static bool displayCameraDetails = false;
193    if (mInputDevice->isKeyDown(Ogre::KC_P) && mTimeUntilNextToggle <= 0)
194    {
195        displayCameraDetails = !displayCameraDetails;
196        mTimeUntilNextToggle = 0.5;
197        if (!displayCameraDetails)
198            mWindow->setDebugText("");
199    }
200    if (displayCameraDetails)
201    {
202        // Print camera details
203        mWindow->setDebugText("P: " + Ogre::StringConverter::toString(mCamera->getDerivedPosition()) + " " +
204            "O: " + Ogre::StringConverter::toString(mCamera->getDerivedOrientation()));
205    }
206
207    // Return true to continue rendering
208    return true;
209}
210
211bool OgreFrameListenerMode::processUnbufferedMouseInput(const Ogre::FrameEvent& evt)
212{
213    /* Rotation factors, may not be used if the second mouse button is pressed. */
214
215    /* If the second mouse button is pressed, then the mouse movement results in
216        sliding the camera, otherwise we rotate. */
217    if( mInputDevice->getMouseButton( 1 ) )
218    {
219        mTranslateVector.x += mInputDevice->getMouseRelativeX() * 0.13;
220        mTranslateVector.y -= mInputDevice->getMouseRelativeY() * 0.13;
221    }
222    else
223    {
224        mRotX = Ogre::Degree(-mInputDevice->getMouseRelativeX() * 0.13);
225        mRotY = Ogre::Degree(-mInputDevice->getMouseRelativeY() * 0.13);
226    }
227
228        return true;
229}
230
231bool OgreFrameListenerMode::frameEnded(const Ogre::FrameEvent& evt)
232{
233        updateStats();
234
235        return true;
236}
237
238bool OgreFrameListenerMode::frameStarted(const Ogre::FrameEvent& evt, Ogre::InputReader *inputDevice)
239{
240        mInputDevice = inputDevice;
241
242        if(mWindow->isClosed())
243        return false;   
244
245        if ( !mUseBufferedInputMouse || !mUseBufferedInputKeys)
246        {
247                // one of the input modes is immediate, so setup what is needed for immediate mouse/key movement
248                if (mTimeUntilNextToggle >= 0)
249                {
250                        mTimeUntilNextToggle -= evt.timeSinceLastFrame;
251                }
252
253                // If this is the first frame, pick a speed
254                if (evt.timeSinceLastFrame == 0)
255                {
256                        mMoveScale = 1;
257                        mRotScale = 0.1;
258                }
259                // Otherwise scale movement units by time passed since last frame
260                else
261                {
262                        // Move about 100 units per second,
263                        mMoveScale = mMoveSpeed * evt.timeSinceLastFrame;
264                        // Take about 10 seconds for full rotation
265                        mRotScale = mRotateSpeed * evt.timeSinceLastFrame;
266                }
267                mRotX = 0;
268        mRotY = 0;
269            mTranslateVector = Ogre::Vector3::ZERO;
270        }
271
272    if (mUseBufferedInputKeys)
273    {
274        // no need to do any processing here, it is handled by event processor and
275                // you get the results as KeyEvents
276    }
277    else
278    {
279        if (processUnbufferedKeyInput(evt) == false)
280                {
281                        return false;
282                }
283    }
284    if (mUseBufferedInputMouse)
285    {
286        // no need to do any processing here, it is handled by event processor and
287                // you get the results as MouseEvents
288    }
289    else
290    {
291        if (processUnbufferedMouseInput(evt) == false)
292                {
293                        return false;
294                }
295    }
296
297        if ( !mUseBufferedInputMouse || !mUseBufferedInputKeys)
298        {
299                // one of the input modes is immediate, so update the movement vector
300
301                moveCamera();
302
303        }
304
305        return true;
306}
307
308void OgreFrameListenerMode::moveCamera()
309{
310
311    // Make all the changes to the camera
312    // Note that YAW direction is around a fixed axis (freelook style) rather than a natural YAW (e.g. airplane)
313    mCamera->yaw(mRotX);
314    mCamera->pitch(mRotY);
315    mCamera->moveRelative(mTranslateVector);
316}
317       
318void OgreFrameListenerMode::showDebugOverlay(bool show)
319{
320    if (mDebugOverlay)
321    {
322        if (show)
323        {
324            mDebugOverlay->show();
325        }
326        else
327        {
328            mDebugOverlay->hide();
329        }
330    }
331}
332
333void OgreFrameListenerMode::switchMouseMode()
334{
335    mUseBufferedInputMouse = !mUseBufferedInputMouse;
336        mInputDevice->setBufferedInput(mUseBufferedInputKeys, mUseBufferedInputMouse);
337}
338
339void OgreFrameListenerMode::switchKeyMode()
340{
341    mUseBufferedInputKeys = !mUseBufferedInputKeys;
342        mInputDevice->setBufferedInput(mUseBufferedInputKeys, mUseBufferedInputMouse);
343}
344
345void OgreFrameListenerMode::keyClicked(Ogre::KeyEvent* e)
346{
347        if (e->getKeyChar() == 'm')
348        {
349                switchMouseMode();
350        }
351        else if (e->getKeyChar() == 'k')
352        {
353                switchKeyMode();
354        }
355
356}
357
358void OgreFrameListenerMode::keyPressed(Ogre::KeyEvent* e)
359{
360}
361
362void OgreFrameListenerMode::keyReleased(Ogre::KeyEvent* e)
363{
364}
365
366void OgreFrameListenerMode::chooseSceneManager(void)
367{
368    // Create the SceneManager, in this case a generic one
369        mSceneMgr = Ogre::Root::getSingleton().createSceneManager(Ogre::ST_GENERIC, "SceneMgr_" + Ogre::StringConverter::toString(mOgreFrameListenerModeHandle));
370}
371
372Ogre::SceneManager* OgreFrameListenerMode::getSceneManager(void)
373{
374        return mSceneMgr;
375}
376
377void OgreFrameListenerMode::createCamera(void)
378{
379    // Create the camera
380    mCamera = mSceneMgr->createCamera("SceneMgr_" + Ogre::StringConverter::toString(mOgreFrameListenerModeHandle) + "_Camera");
381
382    // Position it at 200 in Z direction
383    mCamera->setPosition(Ogre::Vector3(0.0, 0.0, 200.0));
384    // Look back along -Z
385    mCamera->lookAt(Ogre::Vector3(0.0, 0.0, -300.0));
386    mCamera->setNearClipDistance(2.0);
387}
388
389void OgreFrameListenerMode::createViewports(void)
390{
391    // Create one viewport, entire window
392        if (mWindow->getNumViewports() == 0)
393        {
394                Ogre::Viewport* vp = mWindow->addViewport(mCamera,mOgreFrameListenerModeHandle);
395                vp->setBackgroundColour(Ogre::ColourValue(0.0, 0.0, 0.0));
396        }
397        // Alter the camera aspect ratio to match the viewport
398        mCamera->setAspectRatio(
399                Ogre::Real(mWindow->getViewport(0)->getActualWidth()) / Ogre::Real(mWindow->getViewport(0)->getActualHeight()));
400}
401
402unsigned int OgreFrameListenerMode::getHandle()
403{
404        return mOgreFrameListenerModeHandle;
405}
406
407Ogre::Camera* OgreFrameListenerMode::getCamera()
408{
409        return mCamera;
410}
411
412void OgreFrameListenerMode::createScene()
413{
414
415}
416
417void OgreFrameListenerMode::destroyScene()
418{
419
420}
421
422}
Note: See TracBrowser for help on using the repository browser.