void XYOrbitViewController::handleMouseEvent(ViewportMouseEvent& event) { if ( event.shift() ) { setStatus( "<b>Left-Click:</b> Move X/Y. <b>Right-Click:</b>: Zoom." ); } else { setStatus( "<b>Left-Click:</b> Rotate. <b>Middle-Click:</b> Move X/Y. <b>Right-Click:</b>: Move Z. <b>Shift</b>: More options." ); } int32_t diff_x = 0; int32_t diff_y = 0; bool moved = false; if( event.type == QEvent::MouseButtonPress ) { focal_shape_->getRootNode()->setVisible(true); moved = true; } else if( event.type == QEvent::MouseButtonRelease ) { focal_shape_->getRootNode()->setVisible(false); moved = true; } else if( event.type == QEvent::MouseMove ) { diff_x = event.x - event.last_x; diff_y = event.y - event.last_y; moved = true; } if( event.left() && !event.shift() ) { setCursor( Rotate3D ); yaw( diff_x*0.005 ); pitch( -diff_y*0.005 ); } else if( event.middle() || (event.left() && event.shift()) ) { setCursor( MoveXY ); // handle mouse movement int width = event.viewport->getActualWidth(); int height = event.viewport->getActualHeight(); Ogre::Ray mouse_ray = event.viewport->getCamera()->getCameraToViewportRay( event.x / (float) width, event.y / (float) height ); Ogre::Ray last_mouse_ray = event.viewport->getCamera()->getCameraToViewportRay( event.last_x / (float) width, event.last_y / (float) height ); Ogre::Vector3 last_intersect, intersect; if( intersectGroundPlane( last_mouse_ray, last_intersect ) && intersectGroundPlane( mouse_ray, intersect )) { Ogre::Vector3 motion = last_intersect - intersect; // When dragging near the horizon, the motion can get out of // control. This throttles it to an arbitrary limit per mouse // event. float motion_distance_limit = 1; /*meter*/ if( motion.length() > motion_distance_limit ) { motion.normalise(); motion *= motion_distance_limit; } focal_point_property_->add( motion ); emitConfigChanged(); } } else if( event.right() ) { setCursor( Zoom ); zoom( -diff_y * 0.1 * (distance_property_->getFloat() / 10.0f) ); } else { setCursor( event.shift() ? MoveXY : Rotate3D ); } if( event.wheel_delta != 0 ) { int diff = event.wheel_delta; zoom( diff * 0.001 * distance_property_->getFloat() ); moved = true; } if( moved ) { context_->queueRender(); } }
void OrthoViewControllerCustom::handleMouseEvent(ViewportMouseEvent& event) { // if ( event.shift() ) // { setStatus( "<b>Left-Click:</b> Move X/Y." ); // } // else // { // setStatus( "<b>Left-Click:</b> Rotate. <b>Middle-Click:</b> Move X/Y. <b>Right-Click:</b>: Zoom. <b>Shift</b>: More options." ); // } bool moved = false; int32_t diff_x = 0; int32_t diff_y = 0; if( event.type == QEvent::MouseButtonPress ) { dragging_ = true; } else if( event.type == QEvent::MouseButtonRelease ) { dragging_ = false; } else if( dragging_ && event.type == QEvent::MouseMove ) { diff_x = event.x - event.last_x; diff_y = event.y - event.last_y; moved = true; } // if( event.left() && !event.shift() ) // { // setCursor( Rotate2D ); // angle_property_->add( diff_x * 0.005 ); // orientCamera(); // } // else if( event.middle() || ( event.shift() && event.left() )) // { // setCursor( MoveXY ); // float scale = scale_property_->getFloat(); // move( -diff_x / scale, diff_y / scale ); // } // else if( event.right() ) // { // setCursor( Zoom ); // scale_property_->multiply( 1.0 - diff_y * 0.01 ); // } // else // { // setCursor( event.shift() ? MoveXY : Rotate2D ); // } // can only do XY panning setCursor( MoveXY ); if( event.middle() ) { float scale = scale_property_->getFloat(); move( -diff_x / scale, diff_y / scale ); } if ( event.wheel_delta != 0 ) { int diff = event.wheel_delta; scale_property_->multiply( 1.0 - (-diff) * 0.001 ); moved = true; } if (moved) { context_->queueRender(); emitConfigChanged(); } }