OMKDistributedCameraOgreListener.cpp

Go to the documentation of this file.
00001 //-------------------------------------------------------------------------
00002 #include "OMKDistributedCameraOgreListener.h"
00003 #include "OMKOgreVis.h"
00004 #include "OMKTransformType.h"
00005 //-------------------------------------------------------------------------
00006 using namespace OMK ;
00007 using namespace OMK::Inp ;
00008 using namespace OMK::Vis ;
00009 using namespace OMK::Type ;
00010 using namespace Ogre ;
00011 using namespace Wm4 ;
00012 using namespace OIS ;
00013 
00014 //-------------------------------------------------------------------------
00015 REGISTER_INPUT_LISTENER_FACTORY( DistributedCameraOgreListener, "DistributedCameraOgreListener") ;
00016 
00017 //-------------------------------------------------------------------------
00018 // constructor
00019 //-------------------------------------------------------------------------
00020 DistributedCameraOgreListener::DistributedCameraOgreListener( ExtensibleSimulatedObject* sender, const Name& id, 
00021                                         const ConfigurationParameterDescriptor* node )
00022 : InputListener( sender, id, node ),
00023   _ogreVis( dynamic_cast< OgreVis* >( sender ) ),
00024   _updateTransform( false ),
00025   _translationSpeed( 1.0f ),
00026   _wheelTranslationSpeed( 8.0f ),
00027   _rotationSpeed( 0.001f )
00028 {
00029   OMASSERTM( _ogreVis, "Must be an OgreVis object" ) ;
00030   OMTRACEID("OMKDistributedCameraOgreListener", "Constructor" );
00031 
00032   OMK::ParametersAccessor::get(node, "translationSpeed",_translationSpeed);
00033   OMK::ParametersAccessor::get(node, "rotationSpeed",_rotationSpeed);
00034   OMK::ParametersAccessor::get(node, "wheelTranslationSpeed",_wheelTranslationSpeed);
00035 }
00036 //-------------------------------------------------------------------------
00037 // destructor
00038 //-------------------------------------------------------------------------
00039 DistributedCameraOgreListener::~DistributedCameraOgreListener()
00040 {
00041 }
00042 //-------------------------------------------------------------------------
00043 bool DistributedCameraOgreListener::keyPressed( const OIS::KeyEvent &e )
00044 {
00045   switch( e.key )
00046   {
00047   case OIS::KC_UP :
00048     _transform.setTranslate( _transform.getTranslate() - ( _transform.getDirection() * _translationSpeed ) ) ;
00049     _updateTransform = true ;
00050     break ;
00051   case OIS::KC_DOWN :
00052     _transform.setTranslate( _transform.getTranslate() + ( _transform.getDirection() * _translationSpeed ) ) ;
00053     _updateTransform = true ;
00054     break ;
00055   case OIS::KC_RIGHT :
00056     _transform.setTranslate( _transform.getTranslate() + ( _transform.getRight() * _translationSpeed ) ) ;
00057     _updateTransform = true ;
00058     break ;
00059   case OIS::KC_LEFT :
00060     _transform.setTranslate( _transform.getTranslate() - ( _transform.getRight() * _translationSpeed ) ) ;
00061     _updateTransform = true ;
00062     break ;
00063   case OIS::KC_PGUP :
00064     _transform.setTranslate( _transform.getTranslate() - ( _transform.getUp() * _translationSpeed ) ) ;
00065     _updateTransform = true ;
00066     break ;
00067   case OIS::KC_PGDOWN :
00068     _transform.setTranslate( _transform.getTranslate() + ( _transform.getUp() * _translationSpeed ) ) ;
00069     _updateTransform = true ;
00070      // increase move speed
00071   case OIS::KC_ADD :
00072     _translationSpeed += 1;
00073     break ;
00074     // decrease move speed
00075   case OIS::KC_SUBTRACT :
00076     _translationSpeed -= ( 0 < _translationSpeed - 1 ) ? 1 : 0 ;
00077     break ;
00078   default :
00079     ;  
00080   }
00081   if ( _updateTransform)
00082     postComputeParameters();
00083   return true ;
00084 }
00085 //-------------------------------------------------------------------------
00086 bool DistributedCameraOgreListener::mouseMoved( const OIS::MouseEvent &e )
00087 {
00088   if( 0 < e.state.Z.rel )
00089   {
00090     _transform.setTranslate( _transform.getTranslate() - ( _transform.getDirection() * _wheelTranslationSpeed ) ) ;
00091     _updateTransform = true ;
00092   }
00093   else if ( e.state.Z.rel < 0 )
00094   {
00095     _transform.setTranslate( _transform.getTranslate() + ( _transform.getDirection() * _wheelTranslationSpeed ) ) ;
00096     _updateTransform = true ;
00097   }
00098 
00099   /* Rotation factors, may not be used if the second mouse button is pressed. */
00100   /* If the second mouse button is pressed, then the mouse movement results in 
00101      sliding the camera, otherwise we rotate. */
00102   if( e.state.buttonDown( OIS::MB_Left ) ) 
00103   {
00104      //float tx = e.state.X.rel * 0.13f ;
00105      float tx = e.state.X.rel * _translationSpeed ;
00106      float ty = e.state.Y.rel * _translationSpeed ;
00107       
00108      if ( ( tx != 0.f ) || ( ty != 0.f ) )
00109      {
00110      _transform.setTranslate( _transform.getTranslate() 
00111          + ( _transform.getRotate() * Vector3f (tx,ty,0)));
00112     _updateTransform = true ;
00113      }
00114   }
00115   else if( e.state.buttonDown( OIS::MB_Right ) ) 
00116   {
00117     float dx( e.state.X.rel * _rotationSpeed ) ;
00118     float dy( e.state.Y.rel * _rotationSpeed ) ;
00119     
00120     if ( ( dx != 0.f ) || ( dy != 0.f ) )
00121     {
00122       Matrix3f rotation ;
00123       // yaw (fixed to the world axis)
00124       rotation.FromAxisAngle( Vector3f::UNIT_Y, -dx ) ;
00125       _transform.setRotate( rotation * _transform.getRotate() ) ;
00126       // pitch
00127       rotation.FromAxisAngle( _transform.getRotate() * Vector3f::UNIT_X, -dy ) ;
00128       _transform.setRotate( rotation * _transform.getRotate() ) ;
00129 
00130     _updateTransform = true ;
00131     }
00132   }
00133   if ( _updateTransform)
00134     postComputeParameters();
00135   return true ;
00136 }
00137 //-------------------------------------------------------------------------
00138 void DistributedCameraOgreListener::postComputeParameters()
00139 {
00140   if ( _updateTransform == true )
00141   {
00142     OMTRACEID("OMKDistributedCameraOgreListener", "Signal" );
00143     _sender->fireValuedSignal< TransformType >( "moveCamera", _transform ) ;
00144     _updateTransform = false ;
00145   }
00146  
00147 }
00148 //-------------------------------------------------------------------------

logo OpenMask

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

Generated with doxygen by Dimitri van Heesch ,   1997-2007