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 //-------------------------------------------------------------------------
Documentation generated on Mon Jun 9 11:45:56 2008 |
Generated with doxygen by Dimitri van Heesch , 1997-2007 |