void Viewport::mousePressEvent(QMouseEvent *event) { if(!m_draggingActive) { m_mousePos = event->pos(); Ray ray(getMouseRay()); if(m_drawManager.select(event->x(), event->y())) m_draggingActive = true; else m_viewportListener.handleMouseClickEvent(ray); } }
void Viewport::mouseMoveEvent(QMouseEvent *event) { if(m_draggingActive) { qApp->setOverrideCursor( QCursor( Qt::ClosedHandCursor ) ); Ray ray(getMouseRay()); m_viewportListener.handleDragEvent(ray); } else { int width = this->width(); int height = this->height(); float dx = (float) (event->x() - m_mousePos.x()) / width; float dy = (float) (event->y() - m_mousePos.y()) / height; hpvec3 forward =m_center - m_camera; forward = glm::normalize(forward); forward *= DISTANCE_TO_CENTER; hpvec3 right = glm::cross(m_up, forward); right = glm::normalize(right); right *= DISTANCE_TO_CENTER; m_up = glm::normalize(m_up); m_up *= DISTANCE_TO_CENTER; hpvec3 delta; if (event->buttons() == Qt::LeftButton) { if(!m_drawManager.isSomethingSelected()){ // Left turn arround center m_theta = dx*M_PI; m_phi = dy*M_PI; m_camera = m_center - cos(m_theta) * forward + sin(m_theta) * right; // Recalc forward forward =m_center - m_camera; forward = glm::normalize(forward); forward *= DISTANCE_TO_CENTER; m_camera = m_center - cos(m_phi) * forward + sin(m_phi) * m_up; // recalc up m_up = glm::cross(forward, right); m_up = glm::normalize(m_up); m_up *= DISTANCE_TO_CENTER; } updateGL(); } else if (event->buttons() == Qt::RightButton) { // Move left right up down delta = m_up * dy + right * dx; m_camera += delta; m_center += delta; updateGL(); } } m_mousePos = event->pos(); }
Vector3D RTSState::getMouseProjectedPosition() const { const MapView *mapView = m_gameEngine->getMapView(); Ogre::Ray requestRay = getMouseRay(); boost::optional<Vector3D> mapPosition = mapView->getIntersection(requestRay); if (mapPosition.is_initialized()) { return *mapPosition; } //TODO: projeter sur le plan de la mer, voire passer ça dans la méthode de la map pour plus de cohérence return Vector3D(0, 0, 0); }