OMKCameraOgreListener.cpp

Go to the documentation of this file.
00001 //-------------------------------------------------------------------------
00002 #include "OMKCameraOgreListener.h"
00003 #include "dotSceneInterface.h"
00004 #include "OMKOgreVis.h"
00005 //-------------------------------------------------------------------------
00006 using namespace OMK ;
00007 using namespace OMK::Inp ;
00008 using namespace OMK::Vis ;
00009 using namespace Ogre ;
00010 
00011 //-------------------------------------------------------------------------
00012 REGISTER_INPUT_LISTENER_FACTORY( CameraOgreListener, "CameraListener" ) ;
00013 //-------------------------------------------------------------------------
00014 CameraOgreListener::CameraOgreListener( ExtensibleSimulatedObject* sender, const Name& id, 
00015                                         const ConfigurationParameterDescriptor* node )
00016 : InputListener( sender, id, node ),
00017   _ogreVis( dynamic_cast< OgreVis* >( sender ) ),
00018   _translateVector( Ogre::Vector3::ZERO ),
00019   _moveScale( 1.0f ),
00020   _rotScale( 0.1f ),
00021   _rotX( 0.0f ),
00022   _rotY( 0.0f ),
00023   _moveSpeed( 10.0f )
00024 {
00025   OMASSERTM( _ogreVis, "Must be an OgreVis object" ) ;
00026   _cameraNode = static_cast<SceneNode*>( _ogreVis->touchRoot().getAutoCreatedWindow()->
00027                                          getViewport( 0 )->getCamera()->getParentNode() ) ;
00028   OMASSERTM( _cameraNode, "The OgreVis current camera does not have a movable parent node" ) ;
00029 }
00030 //-------------------------------------------------------------------------
00031 CameraOgreListener::~CameraOgreListener()
00032 {
00033 }
00034 //-------------------------------------------------------------------------
00035 bool CameraOgreListener::keyPressed( const OIS::KeyEvent &e )
00036 {
00037   bool cameraMove = false ;
00038   switch( e.key )
00039   {
00040   case OIS::KC_UP :
00041     _translateVector.z = -_moveScale;
00042     cameraMove = true ;
00043     break ;
00044   case OIS::KC_DOWN :
00045     _translateVector.z = _moveScale;
00046     cameraMove = true ;
00047     break ;
00048   case OIS::KC_RIGHT :
00049     _rotX = -_rotScale ;
00050     cameraMove = true ;
00051     break ;
00052   case OIS::KC_LEFT :
00053     _rotX = _rotScale ;
00054     cameraMove = true ;
00055     break ;
00056     // increase move speed
00057   case OIS::KC_ADD :
00058     _moveSpeed += 10;
00059     cameraMove = true ;
00060     break ;
00061     // decrease move speed
00062   case OIS::KC_SUBTRACT :
00063     _moveSpeed -= ( 0 < _moveSpeed - 10 ) ? 10 : 0 ;
00064     cameraMove = true ;
00065     break ;
00066   default :
00067     ;  
00068   }
00069   if( cameraMove )
00070   {
00071     moveCamera();
00072   }
00073   return true ;
00074 }
00075 //-------------------------------------------------------------------------
00076 bool CameraOgreListener::mouseMoved( const OIS::MouseEvent &e )
00077 {
00078   if( 0 < e.state.Z.rel )
00079   {
00080     _translateVector.z = _moveScale * 8.0f ;
00081   }
00082   else if ( e.state.Z.rel < 0 )
00083   {
00084     _translateVector.z = -_moveScale * 8.0f ;
00085   }
00086 
00087   /* Rotation factors, may not be used if the second mouse button is pressed. */
00088   /* If the second mouse button is pressed, then the mouse movement results in 
00089      sliding the camera, otherwise we rotate. */
00090   if( e.state.buttonDown( OIS::MB_Right ) ) 
00091   {
00092     _translateVector.x += e.state.X.rel * 0.13f ;
00093     _translateVector.y -= e.state.Y.rel * 0.13f ;
00094   }
00095   else if( e.state.buttonDown( OIS::MB_Left ) ) 
00096   {
00097     _rotX = -e.state.X.rel * 0.13f ;
00098     _rotY = -e.state.Y.rel * 0.13f ;
00099   }
00100   moveCamera();
00101   return true ;
00102 }
00103 //-------------------------------------------------------------------------
00104 void CameraOgreListener::moveCamera()
00105 {
00106   // Transform the axes of the relative vector by camera's local axes
00107   Ogre::Vector3 trans = _cameraNode->getOrientation() * _translateVector;
00108   _cameraNode->setPosition( _cameraNode->getPosition() + trans );
00109   _cameraNode->yaw( Angle( _rotX ) );
00110   _cameraNode->pitch( Angle( _rotY ) );
00111   _rotX = 0;
00112   _rotY = 0;
00113   _translateVector = Vector3::ZERO ;
00114 }
00115 //-------------------------------------------------------------------------

logo OpenMask

Documentation generated on Mon Jun 9 11:45:55 2008

Generated with doxygen by Dimitri van Heesch ,   1997-2007