| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340 |
- #ifndef __OGRE_BASE_H__
- #define __OGRE_BASE_H__
- #include <Ogre.h>
- #include <Overlay/OgreTextAreaOverlayElement.h>
- #include <Overlay/OgreOverlayManager.h>
- #include <OIS.h>
- #include "common/FileSystem.h"
- #include "Logger.h"
- extern Ogre::Root* root;
- extern Ogre::RenderWindow* window;
- extern std::vector< Ogre::Entity* > entitys;
- extern Ogre::Camera* camera;
- class DisplayFrameListener;
- extern DisplayFrameListener* frame_listener;
- class DisplayFrameListener : public Ogre::FrameListener, public Ogre::WindowEventListener, public OIS::KeyListener, public OIS::MouseListener
- {
- public:
- // Constructor takes a RenderWindow because it uses that to determine input context
- DisplayFrameListener( Ogre::RenderWindow* win ):
- m_Window(win),
- m_InputManager( 0 ),
- m_Keyboard( 0 ),
- m_Mouse( 0 ),
- m_MouseRotate( false ),
- m_Exit( false )
- {
- using namespace OIS;
- Ogre::LogManager::getSingletonPtr()->logMessage( "*** Initializing OIS ***" );
- ParamList pl;
- size_t windowHnd = 0;
- std::ostringstream windowHndStr;
- win->getCustomAttribute( "WINDOW", &windowHnd );
- windowHndStr << windowHnd;
- pl.insert( std::make_pair( std::string( "WINDOW" ), windowHndStr.str() ) );
- m_InputManager = InputManager::createInputSystem( pl );
- m_Keyboard = static_cast< Keyboard* >( m_InputManager->createInputObject( OIS::OISKeyboard, true ) );
- m_Keyboard->setEventCallback( this );
- m_Mouse = static_cast< OIS::Mouse* >( m_InputManager->createInputObject( OIS::OISMouse, true ) );
- m_Mouse->setEventCallback( this );
- //Register as a Window listener
- Ogre::WindowEventUtilities::addWindowEventListener( m_Window, this );
- // debug info
- info_text = new Ogre::TextAreaOverlayElement( "DebugText" );
- info_text->setCaption( "" );
- info_text->setMetricsMode( Ogre::GMM_PIXELS );
- info_text->setPosition( 5, 5 );
- // info_text->setFontName( "BlueHighway" );
- info_text->setCharHeight( 18 );
- info_overlay = Ogre::OverlayManager::getSingleton().create( "DebugOverlay" );
- info_overlay->setZOrder( 1 );
- info_overlay->add2D( ( Ogre::OverlayContainer* )info_text );
- info_overlay->show();
- }
- virtual
- ~DisplayFrameListener()
- {
- m_InputManager->destroyInputObject( m_Keyboard );
- OIS::InputManager::destroyInputSystem( m_InputManager );
- //Remove ourself as a Window listener
- Ogre::WindowEventUtilities::removeWindowEventListener( m_Window, this );
- windowClosed( m_Window );
- }
- //Unattach OIS before window shutdown (very important under Linux)
- virtual void
- windowClosed( Ogre::RenderWindow* rw )
- {
- m_Exit = true;
- }
- bool
- frameStarted( const Ogre::FrameEvent& evt )
- {
- if( m_Exit == true )
- {
- return false;
- }
- if( m_Keyboard )
- {
- m_Keyboard->capture();
- }
- if( m_Mouse )
- {
- m_Mouse->capture();
- }
- for (unsigned int i = 0; i < entitys.size(); ++i)
- {
- if( entitys[ i ]->isVisible() == true )
- {
- Ogre::AnimationStateIterator animations = entitys[ i ]->getAllAnimationStates()->getAnimationStateIterator();
- while( animations.hasMoreElements() == true )
- {
- Ogre::AnimationState* state = animations.getNext();
- if( state->getEnabled() == true )
- {
- state->addTime( evt.timeSinceLastFrame );
- info_text->setCaption( entitys[ i ]->getName() + ": " + state->getAnimationName() );
- }
- }
- break;
- }
- }
- if( m_Keyboard->isKeyDown( OIS::KC_A ) )
- {
- assert( m_camera );
- m_camera->moveRelative( Ogre::Vector3( -0.005f, 0.0f, 0.0f ) );
- }
- if( m_Keyboard->isKeyDown( OIS::KC_D ) )
- {
- assert( m_camera );
- m_camera->moveRelative( Ogre::Vector3( 0.005f, 0.0f, 0.0f ) );
- }
- if( m_Keyboard->isKeyDown( OIS::KC_W ) )
- {
- assert( m_camera );
- m_camera->moveRelative( Ogre::Vector3( 0.0f, 0.0f, -0.005f ) );
- }
- if( m_Keyboard->isKeyDown( OIS::KC_S ) )
- {
- assert( m_camera );
- m_camera->moveRelative( Ogre::Vector3( 0.0f, 0.0f, 0.005f ) );
- }
- if( m_MouseRotate == true )
- {
- assert( m_camera );
- m_camera->yaw( Ogre::Degree( -m_MouseMoveX * 0.13f ) );
- m_camera->pitch( Ogre::Degree( -m_MouseMoveY * 0.13f ) );
- m_MouseMoveX = 0;
- m_MouseMoveY = 0;
- }
- return true;
- }
- // KeyListener
- bool
- keyPressed( const OIS::KeyEvent& e )
- {
- switch( e.key )
- {
- case OIS::KC_RIGHT:
- {
- bool change = false;
- for (unsigned int i = 0; i < entitys.size(); ++i)
- {
- if( change == true )
- {
- entitys[ i ]->setVisible( true );
- break;
- }
- if( entitys[ i ]->isVisible() == true && ( i != entitys.size() - 1 ) )
- {
- entitys[ i ]->setVisible( false );
- change = true;
- }
- }
- }
- break;
- case OIS::KC_LEFT:
- {
- bool change = false;
- for( int i = entitys.size() - 1; i >= 0; --i )
- {
- if( change == true )
- {
- entitys[ i ]->setVisible( true );
- break;
- }
- if( entitys[ i ]->isVisible() == true && i != 0 )
- {
- entitys[ i ]->setVisible( false );
- change = true;
- }
- }
- }
- break;
- case OIS::KC_UP:
- {
- bool change = false;
- for (unsigned int i = 0; i < entitys.size(); ++i)
- {
- if( entitys[ i ]->isVisible() == true )
- {
- Ogre::AnimationStateIterator animations = entitys[ i ]->getAllAnimationStates()->getAnimationStateIterator();
- Ogre::AnimationState* old_state;
- Ogre::AnimationState* new_state = animations.getNext();
- while( animations.hasMoreElements() == true )
- {
- old_state = new_state;
- new_state = animations.getNext();
- if( new_state->getEnabled() == true )
- {
- new_state->setEnabled( false );
- new_state->setLoop( false );
- old_state->setEnabled( true );
- old_state->setLoop( true );
- }
- }
- break;
- }
- }
- }
- break;
- case OIS::KC_DOWN:
- {
- bool change = false;
- for (unsigned int i = 0; i < entitys.size(); ++i)
- {
- if( entitys[ i ]->isVisible() == true )
- {
- Ogre::AnimationStateIterator animations = entitys[ i ]->getAllAnimationStates()->getAnimationStateIterator();
- while( animations.hasMoreElements() == true )
- {
- Ogre::AnimationState* state = animations.getNext();
- if( change == true )
- {
- state->setEnabled( true );
- state->setLoop( true );
- break;
- }
- if( state->getEnabled() == true && animations.hasMoreElements() != false )
- {
- state->setEnabled( false );
- state->setLoop( false );
- change = true;
- }
- }
- break;
- }
- }
- }
- break;
- }
- return true;
- }
- bool
- keyReleased( const OIS::KeyEvent& e )
- {
- return true;
- }
- bool
- mouseMoved( const OIS::MouseEvent& e )
- {
- m_MouseMoveX = float(e.state.X.rel);
- m_MouseMoveY = float(e.state.Y.rel);
- return true;
- }
- bool
- mousePressed( const OIS::MouseEvent& e, OIS::MouseButtonID id )
- {
- if( id == OIS::MB_Right )
- {
- m_MouseRotate = true;
- }
- return true;
- }
- bool
- mouseReleased( const OIS::MouseEvent& e, OIS::MouseButtonID id )
- {
- if( id == OIS::MB_Right )
- {
- m_MouseRotate = false;
- }
- return true;
- }
- public:
- Ogre::TextAreaOverlayElement* info_text;
- Ogre::Overlay* info_overlay;
- virtual void setCamera( Ogre::Camera *camera ){ m_camera = camera; }
- private:
- Ogre::RenderWindow* m_Window;
- //OIS Input devices
- OIS::InputManager* m_InputManager;
- OIS::Keyboard* m_Keyboard;
- OIS::Mouse* m_Mouse;
- Ogre::Camera *m_camera;
- float m_MouseMoveX;
- float m_MouseMoveY;
- bool m_MouseRotate;
- bool m_Exit;
- };
- void
- InitializeOgreBase( const Ogre::String& name );
- void
- DeinitializeOgreBase();
- #endif // __OGRE_BASE_H__
|