diff options
-rw-r--r-- | examples/qt3d/simple-qml/CameraController.qml | 28 | ||||
-rw-r--r-- | src/input/backend/mousecontroller.cpp | 13 | ||||
-rw-r--r-- | src/input/backend/mousecontroller_p.h | 1 | ||||
-rw-r--r-- | src/input/frontend/qmousecontroller.cpp | 24 | ||||
-rw-r--r-- | src/input/frontend/qmousecontroller.h | 11 | ||||
-rw-r--r-- | src/input/frontend/qmousecontroller_p.h | 2 |
6 files changed, 75 insertions, 4 deletions
diff --git a/examples/qt3d/simple-qml/CameraController.qml b/examples/qt3d/simple-qml/CameraController.qml index bbdc3037f..f3d1b5739 100644 --- a/examples/qt3d/simple-qml/CameraController.qml +++ b/examples/qt3d/simple-qml/CameraController.qml @@ -58,6 +58,7 @@ Entity { property real vz: 0; property real dx: 0 property real dy: 0 + property bool fineMotion: false } KeyboardController { @@ -66,6 +67,7 @@ Entity { MouseController { id: mouseSourceDevice + sensitivity: d.fineMotion ? 0.01 : 0.1 } LogicalDevice { @@ -89,7 +91,17 @@ Entity { keys: [MouseController.Right] } ] + }, + Action { + name: "fineMotion" + inputs: [ + ActionInput { + sourceDevice: keyboardSourceDevice + keys: [Qt.Key_Shift] + } + ] } + ] // actions axes: [ @@ -204,10 +216,18 @@ Entity { case "LMB": { d.leftMouseButtonPressed = true; + break; } case "RMB": { d.rightMouseButtonPressed = true; + break; + } + + case "fineMotion": { + console.log("fineMotion started") + d.fineMotion = true; + break; } } @@ -220,10 +240,18 @@ Entity { case "LMB": { d.leftMouseButtonPressed = false; + break; } case "RMB": { d.rightMouseButtonPressed = false; + break; + } + + case "fineMotion": { + console.log("fineMotion finished") + d.fineMotion = false; + break; } } diff --git a/src/input/backend/mousecontroller.cpp b/src/input/backend/mousecontroller.cpp index e82ae1b43..2361246f4 100644 --- a/src/input/backend/mousecontroller.cpp +++ b/src/input/backend/mousecontroller.cpp @@ -50,6 +50,7 @@ namespace Input { MouseController::MouseController() : QAbstractPhysicalDeviceBackendNode(ReadOnly) + , m_sensitivity(0.1f) { } @@ -60,6 +61,8 @@ MouseController::~MouseController() void MouseController::updateFromPeer(Qt3DCore::QNode *peer) { QAbstractPhysicalDeviceBackendNode::updateFromPeer(peer); + QMouseController *object = static_cast<QMouseController *>(peer); + m_sensitivity = object->sensitivity(); } void MouseController::setInputHandler(InputHandler *handler) @@ -119,8 +122,8 @@ void MouseController::updateMouseEvents(const QList<QMouseEvent> &events) m_mouseState.leftPressed = e.buttons() & (Qt::LeftButton); m_mouseState.centerPressed = e.buttons() & (Qt::MiddleButton); m_mouseState.rightPressed = e.buttons() & (Qt::RightButton); - m_mouseState.xAxis = 0.1 * (e.screenPos().x() - m_previousPos.x()); - m_mouseState.yAxis = 0.1 * (m_previousPos.y() - e.screenPos().y()); + m_mouseState.xAxis = m_sensitivity * (e.screenPos().x() - m_previousPos.x()); + m_mouseState.yAxis = m_sensitivity * (m_previousPos.y() - e.screenPos().y()); m_previousPos = e.screenPos(); } } else { @@ -130,7 +133,11 @@ void MouseController::updateMouseEvents(const QList<QMouseEvent> &events) void MouseController::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) { - Q_UNUSED(e); + if (e->type() == Qt3DCore::NodeUpdated) { + Qt3DCore::QScenePropertyChangePtr propertyChange = qSharedPointerCast<Qt3DCore::QScenePropertyChange>(e); + if (propertyChange->propertyName() == QByteArrayLiteral("sensitivity")) + m_sensitivity = propertyChange->value().toFloat(); + } } MouseControllerFunctor::MouseControllerFunctor(InputHandler *handler) diff --git a/src/input/backend/mousecontroller_p.h b/src/input/backend/mousecontroller_p.h index 3605659ff..77db72a72 100644 --- a/src/input/backend/mousecontroller_p.h +++ b/src/input/backend/mousecontroller_p.h @@ -103,6 +103,7 @@ private: MouseState m_mouseState; QPointF m_previousPos; + float m_sensitivity; }; class MouseControllerFunctor : public Qt3DCore::QBackendNodeFunctor diff --git a/src/input/frontend/qmousecontroller.cpp b/src/input/frontend/qmousecontroller.cpp index 1ec91ec9b..a8e3cbc61 100644 --- a/src/input/frontend/qmousecontroller.cpp +++ b/src/input/frontend/qmousecontroller.cpp @@ -46,6 +46,7 @@ namespace Qt3DInput { QMouseControllerPrivate::QMouseControllerPrivate() : QAbstractPhysicalDevicePrivate() + , m_sensitivity(0.1f) { } @@ -126,6 +127,29 @@ int QMouseController::buttonIdentifier(const QString &name) return -1; } +float QMouseController::sensitivity() const +{ + Q_D(const QMouseController); + return d->m_sensitivity; +} + +void QMouseController::setSensitivity(float value) +{ + Q_D(QMouseController); + if (qFuzzyCompare(value, d->m_sensitivity)) + return; + + d->m_sensitivity = value; + emit sensitivityChanged(value); +} + +void QMouseController::copy(const Qt3DCore::QNode *ref) +{ + QNode::copy(ref); + const QMouseController *object = static_cast<const QMouseController *>(ref); + d_func()->m_sensitivity = object->d_func()->m_sensitivity; +} + void QMouseController::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &change) { Q_UNUSED(change); diff --git a/src/input/frontend/qmousecontroller.h b/src/input/frontend/qmousecontroller.h index ce9c2b2bc..8a03d7e14 100644 --- a/src/input/frontend/qmousecontroller.h +++ b/src/input/frontend/qmousecontroller.h @@ -50,6 +50,7 @@ class QMouseInput; class QT3DINPUTSHARED_EXPORT QMouseController : public Qt3DInput::QAbstractPhysicalDevice { Q_OBJECT + Q_PROPERTY(float sensitivity READ sensitivity WRITE setSensitivity NOTIFY sensitivityChanged) public: explicit QMouseController(Qt3DCore::QNode *parent = 0); ~QMouseController(); @@ -74,9 +75,17 @@ public: int axisIdentifier(const QString &name) Q_DECL_FINAL; int buttonIdentifier(const QString &name) Q_DECL_FINAL; + float sensitivity() const; + +public Q_SLOTS: + void setSensitivity(float value); + +Q_SIGNALS: + void sensitivityChanged(float value); + protected: QMouseController(QMouseControllerPrivate &dd, Qt3DCore::QNode *parent = 0); - + void copy(const Qt3DCore::QNode *ref) Q_DECL_OVERRIDE; void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &change) Q_DECL_OVERRIDE; private: diff --git a/src/input/frontend/qmousecontroller_p.h b/src/input/frontend/qmousecontroller_p.h index efffdf51b..4e0faa6f2 100644 --- a/src/input/frontend/qmousecontroller_p.h +++ b/src/input/frontend/qmousecontroller_p.h @@ -62,6 +62,8 @@ public: QMouseControllerPrivate(); Q_DECLARE_PUBLIC(QMouseController) + + float m_sensitivity; }; } // namespace Qt3DInput |