Exemple #1
0
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);
	}
}
Exemple #2
0
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();
}
Exemple #3
0
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);
}