diff options
Diffstat (limited to 'src/datavis3d/input')
-rw-r--r-- | src/datavis3d/input/input.pri | 3 | ||||
-rw-r--r-- | src/datavis3d/input/q3dinputhandler.cpp | 52 | ||||
-rw-r--r-- | src/datavis3d/input/q3dinputhandler.h | 15 | ||||
-rw-r--r-- | src/datavis3d/input/q3dinputhandler_p.h | 51 | ||||
-rw-r--r-- | src/datavis3d/input/qabstract3dinputhandler.cpp | 64 | ||||
-rw-r--r-- | src/datavis3d/input/qabstract3dinputhandler.h | 54 | ||||
-rw-r--r-- | src/datavis3d/input/qabstract3dinputhandler_p.h | 17 | ||||
-rw-r--r-- | src/datavis3d/input/qtouch3dinputhandler.cpp | 31 | ||||
-rw-r--r-- | src/datavis3d/input/qtouch3dinputhandler.h | 8 |
9 files changed, 183 insertions, 112 deletions
diff --git a/src/datavis3d/input/input.pri b/src/datavis3d/input/input.pri index 89b032da..8305604b 100644 --- a/src/datavis3d/input/input.pri +++ b/src/datavis3d/input/input.pri @@ -2,7 +2,8 @@ HEADERS += \ $$PWD/qabstract3dinputhandler.h \ $$PWD/q3dinputhandler.h \ input/qtouch3dinputhandler.h \ - input/qabstract3dinputhandler_p.h + input/qabstract3dinputhandler_p.h \ + input/q3dinputhandler_p.h SOURCES += \ $$PWD/qabstract3dinputhandler.cpp \ diff --git a/src/datavis3d/input/q3dinputhandler.cpp b/src/datavis3d/input/q3dinputhandler.cpp index 4623a69b..a8bfc19a 100644 --- a/src/datavis3d/input/q3dinputhandler.cpp +++ b/src/datavis3d/input/q3dinputhandler.cpp @@ -16,38 +16,46 @@ ** ****************************************************************************/ #include "q3dinputhandler.h" +#include "q3dcamera.h" +#include "q3dlight.h" QT_DATAVIS3D_BEGIN_NAMESPACE -Q3DInputHandler::Q3DInputHandler() : - QAbstract3DInputHandler() +Q3DInputHandler::Q3DInputHandler(QObject *parent) : + QAbstract3DInputHandler(parent) +{ +} + +Q3DInputHandler::~Q3DInputHandler() { } // Input event listeners void Q3DInputHandler::mousePressEvent(QMouseEvent *event, const QPoint &mousePos) { - QRect mainViewPort = mainViewPortRect(); if (Qt::LeftButton == event->button()) { - if (slicingActivated()) { - if (mousePos.x() <= mainViewPort.width() - && mousePos.y() <= mainViewPort.height()) { + if (scene()->isSlicingActivated()) { + if (scene()->isInputInsideMainView(mousePos)) { setInputState(QDataVis::InputOnOverview); //qDebug() << "Mouse pressed on overview"; - } else { + } else if (scene()->isInputInsideSliceView(mousePos)) { setInputState(QDataVis::InputOnSlice); //qDebug() << "Mouse pressed on zoom"; + } else { + setInputState(QDataVis::InputNone); } } else { setInputState(QDataVis::InputOnScene); // update mouse positions to prevent jumping when releasing or repressing a button setInputPosition(mousePos); + emit selectionAtPoint(mousePos); //qDebug() << "Mouse pressed on scene"; + } } else if (Qt::MiddleButton == event->button()) { // reset rotations setInputPosition(QPoint(0, 0)); - } else if (!slicingActivated() && Qt::RightButton == event->button()) { + } else if (Qt::RightButton == event->button()) { // disable rotating when in slice view setInputState(QDataVis::InputRotating); // update mouse positions to prevent jumping when releasing or repressing a button @@ -63,28 +71,42 @@ void Q3DInputHandler::mouseReleaseEvent(QMouseEvent *event, const QPoint &mouseP if (QDataVis::InputRotating == inputState()) { // update mouse positions to prevent jumping when releasing or repressing a button setInputPosition(mousePos); - // TODO: Call actual camera class when it's been written. - //m_cameraHelper->updateMousePos(mousePos); } setInputState(QDataVis::InputNone); - } void Q3DInputHandler::mouseMoveEvent(QMouseEvent *event, const QPoint &mousePos) { Q_UNUSED(event); - if (QDataVis::InputRotating == inputState()) + if (QDataVis::InputRotating == inputState()) { + + // Calculate mouse movement since last frame + QPointF rotations = scene()->camera()->rotations(); + GLfloat xRotation = rotations.x(); + GLfloat yRotation = rotations.y(); + GLfloat mouseMoveX = GLfloat(inputPosition().x() - mousePos.x()) + / (scene()->viewport().width() / rotationSpeed); + GLfloat mouseMoveY = GLfloat(inputPosition().y() - mousePos.y()) + / (scene()->viewport().height() / rotationSpeed); + // Apply to rotations + xRotation -= mouseMoveX; + yRotation -= mouseMoveY; + scene()->camera()->setRotations(QPointF(xRotation, yRotation)); + scene()->camera()->updateViewMatrix(1.0f); + + setPreviousInputPos(inputPosition()); setInputPosition(mousePos); + } } void Q3DInputHandler::wheelEvent(QWheelEvent *event) { // disable zooming if in slice view - if (slicingActivated()) + if (scene()->isSlicingActivated()) return; // Adjust zoom level based on what zoom range we're in. - int zoomLevel = QAbstract3DInputHandler::zoomLevel(); + int zoomLevel = scene()->camera()->zoomLevel(); if (zoomLevel > oneToOneZoomLevel) zoomLevel += event->angleDelta().y() / nearZoomRangeDivider; else if (zoomLevel > halfSizeZoomLevel) @@ -96,7 +118,7 @@ void Q3DInputHandler::wheelEvent(QWheelEvent *event) else if (zoomLevel < minZoomLevel) zoomLevel = minZoomLevel; - setZoomLevel(zoomLevel); + scene()->camera()->setZoomLevel(zoomLevel); } QT_DATAVIS3D_END_NAMESPACE diff --git a/src/datavis3d/input/q3dinputhandler.h b/src/datavis3d/input/q3dinputhandler.h index d995fe3f..98d7a047 100644 --- a/src/datavis3d/input/q3dinputhandler.h +++ b/src/datavis3d/input/q3dinputhandler.h @@ -28,20 +28,31 @@ const int nearZoomRangeDivider = 12; const int midZoomRangeDivider = 60; const int farZoomRangeDivider = 120; +const float rotationSpeed = 100.0f; + #include "qabstract3dinputhandler.h" QT_DATAVIS3D_BEGIN_NAMESPACE -class Q3DInputHandler : public QAbstract3DInputHandler +class QT_DATAVIS3D_EXPORT Q3DInputHandler : public QAbstract3DInputHandler { + Q_OBJECT + public: - explicit Q3DInputHandler(); + explicit Q3DInputHandler(QObject *parent = 0); + virtual ~Q3DInputHandler(); // Input event listeners virtual void mousePressEvent(QMouseEvent *event, const QPoint &mousePos); virtual void mouseReleaseEvent(QMouseEvent *event, const QPoint &mousePos); virtual void mouseMoveEvent(QMouseEvent *event, const QPoint &mousePos); virtual void wheelEvent(QWheelEvent *event); + +signals: + void rotationSpeedChanged(int rotationSpeed); + +private: + Q_DISABLE_COPY(Q3DInputHandler) }; QT_DATAVIS3D_END_NAMESPACE diff --git a/src/datavis3d/input/q3dinputhandler_p.h b/src/datavis3d/input/q3dinputhandler_p.h new file mode 100644 index 00000000..b055bd85 --- /dev/null +++ b/src/datavis3d/input/q3dinputhandler_p.h @@ -0,0 +1,51 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVis3D module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the QtDataVis3D API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#ifndef Q3DINPUTHANDLER_P_H +#define Q3DINPUTHANDLER_P_H + +#include "datavis3dglobal_p.h" + +QT_DATAVIS3D_BEGIN_NAMESPACE + +class Q3DInputHandler; + +class Q3DInputHandlerPrivate +{ +public: + Q3DInputHandlerPrivate(Q3DInputHandler *q); + ~Q3DInputHandlerPrivate(); + +public: + Q3DInputHandler *q_ptr; + +}; + +QT_DATAVIS3D_END_NAMESPACE + +#endif // Q3DINPUTHANDLER_P_H diff --git a/src/datavis3d/input/qabstract3dinputhandler.cpp b/src/datavis3d/input/qabstract3dinputhandler.cpp index 5155e2e2..7fb4f084 100644 --- a/src/datavis3d/input/qabstract3dinputhandler.cpp +++ b/src/datavis3d/input/qabstract3dinputhandler.cpp @@ -19,12 +19,16 @@ QT_DATAVIS3D_BEGIN_NAMESPACE -QAbstract3DInputHandler::QAbstract3DInputHandler() : - QObject(), +QAbstract3DInputHandler::QAbstract3DInputHandler(QObject *parent) : + QObject(parent), d_ptr(new QAbstract3DInputHandlerPrivate(this)) { } +QAbstract3DInputHandler::~QAbstract3DInputHandler() +{ +} + // Input event listeners void QAbstract3DInputHandler::mouseDoubleClickEvent(QMouseEvent *event) { @@ -65,7 +69,7 @@ QDataVis::InputState QAbstract3DInputHandler::inputState() return d_ptr->m_inputState; } -void QAbstract3DInputHandler::setInputState(const QDataVis::InputState inputState) +void QAbstract3DInputHandler::setInputState(QDataVis::InputState inputState) { if (inputState != d_ptr->m_inputState) { d_ptr->m_inputState = inputState; @@ -73,12 +77,12 @@ void QAbstract3DInputHandler::setInputState(const QDataVis::InputState inputStat } } -QPoint QAbstract3DInputHandler::inputPosition() +QPoint QAbstract3DInputHandler::inputPosition() const { return d_ptr->m_inputPosition; } -void QAbstract3DInputHandler::setInputPosition(const QPoint position) +void QAbstract3DInputHandler::setInputPosition(const QPoint &position) { if (position != d_ptr->m_inputPosition) { d_ptr->m_inputPosition = position; @@ -86,72 +90,46 @@ void QAbstract3DInputHandler::setInputPosition(const QPoint position) } } -bool QAbstract3DInputHandler::slicingActivated() -{ - return d_ptr->m_isSlicingActivated; -} - -void QAbstract3DInputHandler::setSlicingActivated(const bool isSlicing) -{ - if (isSlicing != d_ptr->m_isSlicingActivated) { - d_ptr->m_isSlicingActivated = isSlicing; - emit slicingActiveChanged(isSlicing); - } -} - -int QAbstract3DInputHandler::zoomLevel() -{ - return d_ptr->m_zoomLevel; -} - -void QAbstract3DInputHandler::setZoomLevel(const int zoomLevel) -{ - if (zoomLevel != d_ptr->m_zoomLevel) { - d_ptr->m_zoomLevel = zoomLevel; - emit zoomLevelChanged(zoomLevel); - } -} - void QAbstract3DInputHandler::setPrevDistance(int distance) { d_ptr->m_prevDistance = distance; } -int QAbstract3DInputHandler::prevDistance() +int QAbstract3DInputHandler::prevDistance() const { return d_ptr->m_prevDistance; } -QRect QAbstract3DInputHandler::mainViewPortRect() +Q3DScene *QAbstract3DInputHandler::scene() const { - return d_ptr->m_mainViewPort; + return d_ptr->m_scene; } -void QAbstract3DInputHandler::setMainViewPortRect(const QRect viewPort) +void QAbstract3DInputHandler::setScene(Q3DScene *scene) { - d_ptr->m_mainViewPort = viewPort; + d_ptr->m_scene = scene; } -CameraHelper *QAbstract3DInputHandler::camera() +void QAbstract3DInputHandler::setPreviousInputPos(const QPoint &position) { - return d_ptr->m_camera; + d_ptr->m_previousInputPos = position; } -void QAbstract3DInputHandler::setCamera(CameraHelper *camera) +QPoint QAbstract3DInputHandler::previousInputPos() const { - d_ptr->m_camera = camera; + return d_ptr->m_previousInputPos; } + QAbstract3DInputHandlerPrivate::QAbstract3DInputHandlerPrivate(QAbstract3DInputHandler *q) : q_ptr(q), m_prevDistance(0), m_inputState(QDataVis::InputNone), - m_isSlicingActivated(false), m_inputPosition(QPoint(0,0)), - m_zoomLevel(0), - m_camera(0) + m_previousInputPos(QPoint(0,0)), + m_scene(0) { } diff --git a/src/datavis3d/input/qabstract3dinputhandler.h b/src/datavis3d/input/qabstract3dinputhandler.h index 5d98afa1..03c46a5e 100644 --- a/src/datavis3d/input/qabstract3dinputhandler.h +++ b/src/datavis3d/input/qabstract3dinputhandler.h @@ -19,29 +19,24 @@ #ifndef QABSTRACT3DINPUTHANDLER_H #define QABSTRACT3DINPUTHANDLER_H -#include <QObject> - #include "qdatavis3denums.h" #include "qabstract3dinputhandler_p.h" +#include "q3dscene.h" +#include <QObject> +#include <QMouseEvent> QT_DATAVIS3D_BEGIN_NAMESPACE -class QAbstract3DInputHandler : public QObject +class QT_DATAVIS3D_EXPORT QAbstract3DInputHandler : public QObject { Q_OBJECT Q_PROPERTY(QtDataVis3D::QDataVis::InputState inputState READ inputState WRITE setInputState NOTIFY inputStateChanged) Q_PROPERTY(QPoint inputPosition READ inputPosition WRITE setInputPosition NOTIFY positionChanged) - Q_PROPERTY(bool slicingActivated READ slicingActivated WRITE setSlicingActivated NOTIFY slicingActiveChanged) - Q_PROPERTY(int zoomLevel READ zoomLevel WRITE setZoomLevel NOTIFY zoomLevelChanged) - Q_PROPERTY(QRect mainViewPortRect READ mainViewPortRect WRITE setMainViewPortRect) - - Q_PROPERTY(CameraHelper *camera READ camera WRITE setCamera) - -private: - QScopedPointer<QAbstract3DInputHandlerPrivate> d_ptr; + Q_PROPERTY(Q3DScene *scene READ scene WRITE setScene) public: - explicit QAbstract3DInputHandler(); + explicit QAbstract3DInputHandler(QObject *parent = 0); + virtual ~QAbstract3DInputHandler(); // Input event listeners virtual void mouseDoubleClickEvent(QMouseEvent *event); @@ -56,29 +51,30 @@ public: // TODO: Check if the inputState needs to be visible outside of subclasses in the final architecture QDataVis::InputState inputState(); - void setInputState(const QDataVis::InputState inputState); - void setInputPosition(const QPoint position); - QPoint inputPosition(); - void setSlicingActivated(const bool isSlicing); - bool slicingActivated(); - void setZoomLevel(const int zoomLevel); - int zoomLevel(); - QRect mainViewPortRect(); - void setMainViewPortRect(const QRect viewPort); - - // TODO: Modify for proper camera once that is available - CameraHelper *camera(); - void setCamera(CameraHelper *camera); + void setInputState(QDataVis::InputState inputState); + void setInputPosition(const QPoint &position); + QPoint inputPosition() const; + + Q3DScene *scene() const; + void setScene(Q3DScene *scene); protected: void setPrevDistance(int distance); - int prevDistance(); + int prevDistance() const; + void setPreviousInputPos(const QPoint &position); + QPoint previousInputPos() const; signals: - void positionChanged(QPoint position); + void positionChanged(const QPoint &position); void inputStateChanged(QDataVis::InputState state); - void slicingActiveChanged(bool isSlicing); - void zoomLevelChanged(int zoomLevel); + void selectionAtPoint(const QPoint &point); + +private: + Q_DISABLE_COPY(QAbstract3DInputHandler) + + QScopedPointer<QAbstract3DInputHandlerPrivate> d_ptr; + + friend class Abstract3DController; }; QT_DATAVIS3D_END_NAMESPACE diff --git a/src/datavis3d/input/qabstract3dinputhandler_p.h b/src/datavis3d/input/qabstract3dinputhandler_p.h index 7c56c2fa..a4b61ff3 100644 --- a/src/datavis3d/input/qabstract3dinputhandler_p.h +++ b/src/datavis3d/input/qabstract3dinputhandler_p.h @@ -29,12 +29,13 @@ #ifndef QABSTRACT3DINPUTHANDLER_P_H #define QABSTRACT3DINPUTHANDLER_P_H -#include <QMouseEvent> +#include "datavis3dglobal_p.h" +#include <QRect> QT_DATAVIS3D_BEGIN_NAMESPACE class QAbstract3DInputHandler; -class CameraHelper; +class Q3DScene; class QAbstract3DInputHandlerPrivate { @@ -45,18 +46,22 @@ public: public: QAbstract3DInputHandler *q_ptr; int m_prevDistance; + QPoint m_previousInputPos; + + GLfloat m_defaultXRotation; + GLfloat m_defaultYRotation; private: QDataVis::InputState m_inputState; - bool m_isSlicingActivated; QPoint m_inputPosition; - int m_zoomLevel; QRect m_mainViewPort; - // TODO: Replace with proper camera once it's available - CameraHelper *m_camera; + // TODO: Check if this could be avoided with signals/slots or some other way. + Q3DScene *m_scene; + bool m_isDefaultHandler; friend class QAbstract3DInputHandler; + friend class Abstract3DController; }; QT_DATAVIS3D_END_NAMESPACE diff --git a/src/datavis3d/input/qtouch3dinputhandler.cpp b/src/datavis3d/input/qtouch3dinputhandler.cpp index 128b8c49..d0676719 100644 --- a/src/datavis3d/input/qtouch3dinputhandler.cpp +++ b/src/datavis3d/input/qtouch3dinputhandler.cpp @@ -16,18 +16,23 @@ ** ****************************************************************************/ #include "qtouch3dinputhandler.h" +#include "q3dcamera.h" QT_DATAVIS3D_BEGIN_NAMESPACE -QTouch3DInputHandler::QTouch3DInputHandler() : - Q3DInputHandler() +QTouch3DInputHandler::QTouch3DInputHandler(QObject *parent) : + Q3DInputHandler(parent) +{ +} + +QTouch3DInputHandler::~QTouch3DInputHandler() { } // Input event listeners void QTouch3DInputHandler::mouseDoubleClickEvent(QMouseEvent *event) { - if (!slicingActivated()) { + if (!scene()->isSlicingActivated()) { setInputState( QDataVis::InputOnScene ); // update mouse positions to prevent jumping when releasing or repressing a button setInputPosition( event->pos() ); @@ -39,13 +44,13 @@ void QTouch3DInputHandler::touchEvent(QTouchEvent *event) QList<QTouchEvent::TouchPoint> points; points = event->touchPoints(); - if (!slicingActivated() && points.count() == 2) { + if (!scene()->isSlicingActivated() && points.count() == 2) { setInputState( QDataVis::InputOnPinch ); QPointF distance = points.at(0).pos() - points.at(1).pos(); int newDistance = distance.manhattanLength(); int zoomRate = 1; - int zoomLevel = QAbstract3DInputHandler::zoomLevel(); + int zoomLevel = scene()->camera()->zoomLevel(); if (zoomLevel > 100) zoomRate = 5; if (newDistance > prevDistance()) @@ -56,7 +61,7 @@ void QTouch3DInputHandler::touchEvent(QTouchEvent *event) zoomLevel = 500; else if (zoomLevel < 10) zoomLevel = 10; - setZoomLevel(zoomLevel); + scene()->camera()->setZoomLevel(zoomLevel); setPrevDistance(newDistance); } } @@ -64,16 +69,16 @@ void QTouch3DInputHandler::touchEvent(QTouchEvent *event) void QTouch3DInputHandler::mousePressEvent(QMouseEvent *event, const QPoint &mousePos) { // TODO: This code needs revisiting with new Qt releases and possibly move to using touch events for these as well. - QRect mainViewPort = mainViewPortRect(); if (Qt::LeftButton == event->button()) { - if (slicingActivated()) { - if (mousePos.x() <= mainViewPort.width() - && mousePos.y() <= mainViewPort.height()) { + if (scene()->isSlicingActivated()) { + if (scene()->isInputInsideMainView(mousePos)) { setInputState(QDataVis::InputOnOverview); //qDebug() << "Mouse pressed on overview"; - } else { + } else if (scene()->isInputInsideSliceView(mousePos)) { setInputState(QDataVis::InputOnSlice); //qDebug() << "Mouse pressed on zoom"; + } else { + setInputState(QDataVis::InputNone); } } else { setInputState(QDataVis::InputRotating); @@ -84,14 +89,12 @@ void QTouch3DInputHandler::mousePressEvent(QMouseEvent *event, const QPoint &mou } else if (Qt::MiddleButton == event->button()) { // reset rotations setInputPosition(QPoint(0, 0)); - } else if (!slicingActivated() && Qt::RightButton == event->button()) { + } else if (Qt::RightButton == event->button()) { // disable rotating when in slice view setInputState(QDataVis::InputOnScene); // update mouse positions to prevent jumping when releasing or repressing a button setInputPosition(mousePos); } - // TODO: Call actual camera class when it's been written. - //m_cameraHelper->updateMousePos(m_mousePos); } QT_DATAVIS3D_END_NAMESPACE diff --git a/src/datavis3d/input/qtouch3dinputhandler.h b/src/datavis3d/input/qtouch3dinputhandler.h index a56f82ce..4b2dad69 100644 --- a/src/datavis3d/input/qtouch3dinputhandler.h +++ b/src/datavis3d/input/qtouch3dinputhandler.h @@ -23,17 +23,21 @@ QT_DATAVIS3D_BEGIN_NAMESPACE -class QTouch3DInputHandler : public Q3DInputHandler +class QT_DATAVIS3D_EXPORT QTouch3DInputHandler : public Q3DInputHandler { Q_OBJECT public: - explicit QTouch3DInputHandler(); + explicit QTouch3DInputHandler(QObject *parent = 0); + virtual ~QTouch3DInputHandler(); // Input event listeners virtual void mouseDoubleClickEvent(QMouseEvent *event); virtual void touchEvent(QTouchEvent *event); virtual void mousePressEvent(QMouseEvent *event, const QPoint &mousePos); + +private: + Q_DISABLE_COPY(QTouch3DInputHandler) }; QT_DATAVIS3D_END_NAMESPACE |