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