Ogitor探索之代码分析(1)---OgreWidget::mouseMoveEvent;OgitorsRoot::OnMouseMove

来源:互联网 发布:形象设计师软件下 编辑:程序博客网 时间:2024/05/18 00:20
  • 在../qtOgitor/src/ogrewidget.cpp中定义的void OgreWidget::mouseMoveEvent(QMouseEvent *evt)
  • 代码如下:

 

   1: void OgreWidget::mouseMoveEvent(QMouseEvent *evt)
   2: {
   3:     if(!OgitorsRoot::getSingletonPtr()->IsSceneLoaded())
   4:         return;
   5:  
   6:     if(!hasFocus())
   7:         setFocus();
   8:  
   9:     Ogre::Vector2 pos(evt->x(), evt->y());
  10:  
  11:     OgitorsRoot::getSingletonPtr()->OnMouseMove(pos, getMouseButtons(evt->buttons(), evt->button()));
  12:  
  13:     OgreWidgetMouseMovedSincePress = true;
  14: }

 

  •  
    • 在第11行调用的OgitorsRoot::getSingletonPtr()->OnMouseMove(pos, getMouseButtons(evt->buttons(), evt->button()));
    • 将坐标传递给OnMouseMove
  • 在../Ogitor/src/OgitorsRootUtilityFunctions.cpp中定义的
  • void OgitorsRoot::OnMouseMove (Ogre::Vector2 point, unsigned int buttons)
  • point为鼠标在视口的坐标用(x,y)表示,坐标原点在左上角。
  •    1: void OgitorsRoot::OnMouseMove (Ogre::Vector2 point, unsigned int buttons)
       2: {
       3:     if(!mActiveViewport)
       4:         return;
       5:     Ogre::Vector4 rect;
       6:     mActiveViewport->getRect(rect);
       7:  
       8:     if((rect.x <= point.x) && (rect.y <= point.y) && ((rect.x + rect.z) >= point.x) && ((rect.y + rect.w) >= point.y))
       9:     {
      10:         if(mMouseListener)
      11:             mMouseListener->OnMouseMove(mActiveViewport, point - Ogre::Vector2(rect.x,rect.y), buttons);
      12:         else
      13:             mActiveViewport->OnMouseMove(point - Ogre::Vector2(rect.x,rect.y), buttons);
      14:     }
      15:     else
      16:     {
      17:         if(mMouseListener)
      18:             mMouseListener->OnMouseLeave(mActiveViewport, point - Ogre::Vector2(rect.x,rect.y), buttons);
      19:         else
      20:             mActiveViewport->OnMouseLeave(point - Ogre::Vector2(rect.x,rect.y), buttons);
      21:     }
      22: }

如图所示:

iu

仅当加载有场景时才会调用OnMouseMove,并实时更新point 的值。OnMouseMove (Ogre::Vector2 point, unsigned int buttons)其中的 buttons 的值由getMouseButtons(evt->buttons(), evt->button())传递过来;判断鼠标按键对应值如下:

        OMB_LEFT = 1,       /** Left mouse button type */
        OMB_RIGHT = 2,      /** Right mouse button type */
        OMB_MIDDLE = 4      /** Middle mouse button type */

在../qtOgitor/src/ogrewidget.cpp中

 

   1: unsigned int OgreWidget::getMouseButtons(Qt::MouseButtons buttons, Qt::MouseButton button)
   2: {
   3:     unsigned int flags = 0;
   4:     buttons |= button;
   5:  
   6:     if(buttons.testFlag(Qt::LeftButton))
   7:         flags |= OMB_LEFT;
   8:     if(buttons.testFlag(Qt::RightButton))
   9:         flags |= OMB_RIGHT;
  10:     if(buttons.testFlag(Qt::MidButton))
  11:         flags |= OMB_MIDDLE;
  12:  
  13:     return flags;
  14: }

 

在../Ogitor/include/OgitorsDefinitions.h中

   1: /** Ogitor mouse button enumeration */
   2:     enum OgitorsMouseButtons
   3:     {
   4:         OMB_LEFT = 1,       /** Left mouse button type */
   5:         OMB_RIGHT = 2,      /** Right mouse button type */
   6:         OMB_MIDDLE = 4      /** Middle mouse button type */
   7:     };
原创粉丝点击