#include "OBAOgreFrameListener.h" namespace OBA { OgreFrameListener::OgreFrameListener(Ogre::RenderWindow *win, bool useBufferedInputKeys, bool useBufferedInputMouse) { mWindow = win; mDefaultOgreFrameListenerMode = new OBA::OgreFrameListenerMode(win,this->getNumFrameListenerModes()); mDefaultOgreFrameListenerMode->chooseSceneManager(); mDefaultOgreFrameListenerMode->createCamera(); mDefaultOgreFrameListenerMode->createViewports(); mDefaultOgreFrameListenerMode->createScene(); this->addFrameListenerMode(mDefaultOgreFrameListenerMode); mInputTypeSwitchingOn = useBufferedInputKeys || useBufferedInputMouse; mUseBufferedInputKeys = useBufferedInputKeys; mUseBufferedInputMouse = useBufferedInputMouse; if (mInputTypeSwitchingOn) { mEventProcessor = new Ogre::EventProcessor(); mEventProcessor->initialise(win); mEventProcessor->startProcessingEvents(); mEventProcessor->addKeyListener(this); mInputDevice = mEventProcessor->getInputReader(); } else { mInputDevice = Ogre::PlatformManager::getSingleton().createInputReader(); mInputDevice->initialise(win,true, true); } } OgreFrameListener::~OgreFrameListener() { for (unsigned int iOgreFrameListenerMode = 0; iOgreFrameListenerMode < this->getNumFrameListenerModes(); iOgreFrameListenerMode++) { this->removeFrameListenerMode(iOgreFrameListenerMode); } if (mInputTypeSwitchingOn) { if (mEventProcessor) { delete mEventProcessor; } } else { // Gametools -- BUG: 06/04/2006 //if (mInputDevice) //{ // Ogre::PlatformManager::getSingleton().destroyInputReader( mInputDevice ); //} //delete mInputDevice; } } bool OgreFrameListener::frameStarted(const Ogre::FrameEvent& evt) { if (!mInputTypeSwitchingOn) { mInputDevice->capture(); } if ( !mUseBufferedInputMouse || !mUseBufferedInputKeys) { // one of the input modes is immediate, so setup what is needed for immediate mouse/key movement if (mTimeUntilNextToggle >= 0) { mTimeUntilNextToggle -= evt.timeSinceLastFrame; } } if (mUseBufferedInputKeys) { // no need to do any processing here, it is handled by event processor and // you get the results as KeyEvents } else { if (processUnbufferedKeyInput(evt) == false) { return false; } } //mWindow->setDebugText("P: " + mDefaultOgreFrameListenerMode->getSceneManager()->getName() + " -- " + Ogre::StringConverter::toString(mTimeUntilNextToggle)); return mDefaultOgreFrameListenerMode->frameStarted(evt,mInputDevice); } bool OgreFrameListener::processUnbufferedKeyInput(const Ogre::FrameEvent& evt) { if( mInputDevice->isKeyDown(Ogre::KC_ESCAPE) ) { return false; } //if (mInputDevice->isKeyDown(Ogre::KC_TAB) && mTimeUntilNextToggle <= 0) if (mInputDevice->isKeyDown(Ogre::KC_TAB)) { mCurrentOgreFrameListenerMode = (mCurrentOgreFrameListenerMode+1) % this->getNumFrameListenerModes(); this->setEnabledFrameListenerMode(mCurrentOgreFrameListenerMode); mWindow->setDebugText("P: " + mDefaultOgreFrameListenerMode->getSceneManager()->getName()); //mTimeUntilNextToggle = 0.25; } // Return true to continue rendering return true; } bool OgreFrameListener::frameEnded(const Ogre::FrameEvent& evt) { return mDefaultOgreFrameListenerMode->frameEnded(evt); } void OgreFrameListener::keyClicked(Ogre::KeyEvent* e) { if (e->getKeyChar() == 'm') { mDefaultOgreFrameListenerMode->switchMouseMode(); } else if (e->getKeyChar() == 'k') { mDefaultOgreFrameListenerMode->switchKeyMode(); } } void OgreFrameListener::keyPressed(Ogre::KeyEvent* e) { } void OgreFrameListener::keyReleased(Ogre::KeyEvent* e) { } void OgreFrameListener::addFrameListenerMode(OgreFrameListenerMode *ogreFrameListenerMode) { mOgreFrameListenerModeList.push_back(ogreFrameListenerMode); } void OgreFrameListener::removeFrameListenerMode(unsigned int iOgreFrameListenerMode) { OgreFrameListenerMode *ogreFrameListenerMode = mOgreFrameListenerModeList[iOgreFrameListenerMode]; mOgreFrameListenerModeList.erase(mOgreFrameListenerModeList.begin()+iOgreFrameListenerMode); delete ogreFrameListenerMode; } void OgreFrameListener::setEnabledFrameListenerMode(unsigned int iOgreFrameListenerMode) { mDefaultOgreFrameListenerMode = getFrameListenerMode(iOgreFrameListenerMode); Ogre::Root::getSingleton()._setCurrentSceneManager(mDefaultOgreFrameListenerMode->getSceneManager()); mWindow->getViewport(0)->setCamera(mDefaultOgreFrameListenerMode->getCamera()); } OgreFrameListenerMode* OgreFrameListener::getFrameListenerMode(unsigned int iOgreFrameListenerMode) { return mOgreFrameListenerModeList[iOgreFrameListenerMode]; } OgreFrameListenerMode* OgreFrameListener::getEnabledFrameListenerMode() { return mDefaultOgreFrameListenerMode; } unsigned int OgreFrameListener::getNumFrameListenerModes() { return mOgreFrameListenerModeList.size(); } }