Beispiel #1
0
void FPSViewController::handleMouseEvent(ViewportMouseEvent& event)
{
  if ( event.shift() )
  {
    setStatus( "<b>Left-Click:</b> Move X/Y.  <b>Right-Click:</b>: Move Z." );
  }
  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::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.shift() && event.left() ))
  {
    setCursor( MoveXY );
    move( diff_x*0.01, -diff_y*0.01, 0.0f );
  }
  else if( event.right() )
  {
    setCursor( MoveZ );
    move( 0.0f, 0.0f, diff_y*0.1 );
  }
  else
  {
    setCursor( event.shift() ? MoveXY : Rotate3D );
  }

  if ( event.wheel_delta != 0 )
  {
    int diff = event.wheel_delta;
    move( 0.0f, 0.0f, -diff * 0.01 );

    moved = true;
  }

  if (moved)
  {
    context_->queueRender();
  }
}
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();
  }
}