00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "WGEZoomTrackballManipulator.h"
00026 #include "WGraphicsEngine.h"
00027
00028 WGEZoomTrackballManipulator::WGEZoomTrackballManipulator():
00029 TrackballManipulator(),
00030 m_zoom( 1.0 ),
00031 m_allowThrow( false ),
00032 m_paintMode( 0 )
00033 {
00034 setTrackballSize( .3 );
00035 }
00036
00037 void WGEZoomTrackballManipulator::setByMatrix( const osg::Matrixd& matrix )
00038 {
00039 m_zoom = 1.0 / matrix.getScale()[0];
00040
00041
00042 TrackballManipulator::setByMatrix( osg::Matrixd::inverse( osg::Matrixd::scale( 1.0 / m_zoom, 1.0 / m_zoom, 1.0 / m_zoom ) ) * matrix );
00043 }
00044
00045 osg::Matrixd WGEZoomTrackballManipulator::getMatrix() const
00046 {
00047 return osg::Matrixd::scale( 1.0 / m_zoom, 1.0 / m_zoom, 1.0 / m_zoom ) * TrackballManipulator::getMatrix();
00048 }
00049
00050 osg::Matrixd WGEZoomTrackballManipulator::getMatrixWithoutZoom() const
00051 {
00052 return TrackballManipulator::getMatrix();
00053 }
00054
00055 osg::Matrixd WGEZoomTrackballManipulator::getInverseMatrix() const
00056 {
00057 return TrackballManipulator::getInverseMatrix() * osg::Matrixd::scale( m_zoom, m_zoom, m_zoom );
00058 }
00059
00060 void WGEZoomTrackballManipulator::home( double )
00061 {
00062 m_zoom = 1.0;
00063 TrackballManipulator::home( 0 );
00064 }
00065
00066 bool WGEZoomTrackballManipulator::zoom( const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& us )
00067 {
00068 double zoomDelta = 0.0;
00069
00070 if( ea.getKey() && ea.getEventType() == osgGA::GUIEventAdapter::KEYDOWN )
00071 {
00072 if( ea.getKey() == 45 )
00073 {
00074 zoomDelta = -0.05;
00075 }
00076 if( ea.getKey() == 43 )
00077 {
00078 zoomDelta = 0.05;
00079 }
00080
00081 if(zoomDelta != 0.0)
00082 {
00083 m_zoom *= 1.0 + zoomDelta;
00084 us.requestRedraw();
00085 }
00086 }
00087 else
00088 {
00089 switch( ea.getScrollingMotion() )
00090 {
00091 case osgGA::GUIEventAdapter::SCROLL_UP:
00092 zoomDelta = 0.05;
00093 break;
00094 case osgGA::GUIEventAdapter::SCROLL_DOWN:
00095 zoomDelta = -0.05;
00096 break;
00097 case osgGA::GUIEventAdapter::SCROLL_2D:
00098 zoomDelta = 0.05 / 120.0 * ea.getScrollingDeltaY();
00099 break;
00100
00101
00102
00103 default:
00104
00105 zoomDelta = 0.0;
00106 break;
00107 }
00108 }
00109
00110 if(zoomDelta != 0.0)
00111 {
00112 m_zoom *= 1.0 + zoomDelta;
00113 us.requestRedraw();
00114 }
00115
00116 us.requestContinuousUpdate( false );
00117 return true;
00118 }
00119
00120 bool WGEZoomTrackballManipulator::handle( const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& us )
00121 {
00122 _thrown &= m_allowThrow;
00123
00124 if( WGraphicsEngine::getGraphicsEngine()->getScene()->isHomePositionRequested() )
00125 {
00126
00127
00128 home( 0 );
00129 return true;
00130 }
00131 else if( ea.getEventType() == osgGA::GUIEventAdapter::SCROLL || ea.getKey() == 45 || ea.getKey() == 43 )
00132 {
00133 return zoom( ea, us );
00134 }
00135
00136
00137 else if( ( ea.getEventType() == osgGA::GUIEventAdapter::DRAG ) || ( ea.getEventType() == osgGA::GUIEventAdapter::PUSH ) )
00138 {
00139 if( ea.getButtonMask() == osgGA::GUIEventAdapter::RIGHT_MOUSE_BUTTON )
00140 {
00141 return true;
00142 }
00143 else if( ( ea.getButtonMask() == osgGA::GUIEventAdapter::LEFT_MOUSE_BUTTON ) && ( m_paintMode == 1 ) )
00144 {
00145 return true;
00146 }
00147 else
00148 {
00149 return TrackballManipulator::handle( ea, us );
00150 }
00151 }
00152 else
00153 {
00154 return TrackballManipulator::handle( ea, us );
00155 }
00156 }
00157
00158 void WGEZoomTrackballManipulator::setPaintMode( int mode )
00159 {
00160 m_paintMode = mode;
00161 }
00162
00163 void WGEZoomTrackballManipulator::setThrow( bool allowThrow )
00164 {
00165 m_allowThrow = allowThrow;
00166 }
00167
00168 bool WGEZoomTrackballManipulator::getThrow() const
00169 {
00170 return m_allowThrow;
00171 }
00172