diff options
36 files changed, 812 insertions, 148 deletions
diff --git a/examples/qt3d/simple-qml/CameraController.qml b/examples/qt3d/simple-qml/CameraController.qml index c6175fed2..69eff70ed 100644 --- a/examples/qt3d/simple-qml/CameraController.qml +++ b/examples/qt3d/simple-qml/CameraController.qml @@ -123,7 +123,7 @@ Entity { Axis { name: "RX" inputs: [ - AxisInput { + AnalogAxisInput { sourceDevice: mouseSourceDevice axis: MouseDevice.X } @@ -132,7 +132,7 @@ Entity { Axis { name: "RY" inputs: [ - AxisInput { + AnalogAxisInput { sourceDevice: mouseSourceDevice axis: MouseDevice.Y } diff --git a/src/extras/defaults/qfirstpersoncameracontroller.cpp b/src/extras/defaults/qfirstpersoncameracontroller.cpp index 0a69dc2ca..1e42223a2 100644 --- a/src/extras/defaults/qfirstpersoncameracontroller.cpp +++ b/src/extras/defaults/qfirstpersoncameracontroller.cpp @@ -52,7 +52,7 @@ #include "qfirstpersoncameracontroller.h" #include <Qt3DRender/QCamera> #include <Qt3DInput/QAxis> -#include <Qt3DInput/QAxisInput> +#include <Qt3DInput/QAnalogAxisInput> #include <Qt3DInput/QButtonAxisInput> #include <Qt3DInput/QAction> #include <Qt3DInput/QActionInput> @@ -78,8 +78,8 @@ QFirstPersonCameraControllerPrivate::QFirstPersonCameraControllerPrivate() , m_tzAxis(new Qt3DInput::QAxis()) , m_leftMouseButtonInput(new Qt3DInput::QActionInput()) , m_fineMotionKeyInput(new Qt3DInput::QActionInput()) - , m_mouseRxInput(new Qt3DInput::QAxisInput()) - , m_mouseRyInput(new Qt3DInput::QAxisInput()) + , m_mouseRxInput(new Qt3DInput::QAnalogAxisInput()) + , m_mouseRyInput(new Qt3DInput::QAnalogAxisInput()) , m_keyboardTxPosInput(new Qt3DInput::QButtonAxisInput()) , m_keyboardTyPosInput(new Qt3DInput::QButtonAxisInput()) , m_keyboardTzPosInput(new Qt3DInput::QButtonAxisInput()) diff --git a/src/extras/defaults/qfirstpersoncameracontroller_p.h b/src/extras/defaults/qfirstpersoncameracontroller_p.h index 756ab668d..9ea830f85 100644 --- a/src/extras/defaults/qfirstpersoncameracontroller_p.h +++ b/src/extras/defaults/qfirstpersoncameracontroller_p.h @@ -84,7 +84,7 @@ class QLogicalDevice; class QAction; class QActionInput; class QAxis; -class QAxisInput; +class QAnalogAxisInput; class QButtonAxisInput; class QAxisActionHandler; @@ -113,8 +113,8 @@ public: Qt3DInput::QActionInput *m_leftMouseButtonInput; Qt3DInput::QActionInput *m_fineMotionKeyInput; - Qt3DInput::QAxisInput *m_mouseRxInput; - Qt3DInput::QAxisInput *m_mouseRyInput; + Qt3DInput::QAnalogAxisInput *m_mouseRxInput; + Qt3DInput::QAnalogAxisInput *m_mouseRyInput; Qt3DInput::QButtonAxisInput *m_keyboardTxPosInput; Qt3DInput::QButtonAxisInput *m_keyboardTyPosInput; Qt3DInput::QButtonAxisInput *m_keyboardTzPosInput; diff --git a/src/extras/defaults/qorbitcontrol.cpp b/src/extras/defaults/qorbitcontrol.cpp index 7c1c5e6f8..47703ea17 100644 --- a/src/extras/defaults/qorbitcontrol.cpp +++ b/src/extras/defaults/qorbitcontrol.cpp @@ -39,7 +39,7 @@ #include <QtGlobal> #include <Qt3DRender/QCamera> #include <Qt3DInput/QAxis> -#include <Qt3DInput/QAxisInput> +#include <Qt3DInput/QAnalogAxisInput> #include <Qt3DInput/QButtonAxisInput> #include <Qt3DInput/QAction> #include <Qt3DInput/QActionInput> @@ -74,8 +74,8 @@ QOrbitControlPrivate::QOrbitControlPrivate() , m_rightMouseButtonInput(new Qt3DInput::QActionInput()) , m_altButtonInput(new Qt3DInput::QActionInput()) , m_shiftButtonInput(new Qt3DInput::QActionInput()) - , m_mouseRxInput(new Qt3DInput::QAxisInput()) - , m_mouseRyInput(new Qt3DInput::QAxisInput()) + , m_mouseRxInput(new Qt3DInput::QAnalogAxisInput()) + , m_mouseRyInput(new Qt3DInput::QAnalogAxisInput()) , m_keyboardTxPosInput(new Qt3DInput::QButtonAxisInput()) , m_keyboardTyPosInput(new Qt3DInput::QButtonAxisInput()) , m_keyboardTzPosInput(new Qt3DInput::QButtonAxisInput()) diff --git a/src/extras/defaults/qorbitcontrol_p.h b/src/extras/defaults/qorbitcontrol_p.h index 900227152..f3f384493 100644 --- a/src/extras/defaults/qorbitcontrol_p.h +++ b/src/extras/defaults/qorbitcontrol_p.h @@ -70,7 +70,7 @@ class QLogicalDevice; class QAction; class QActionInput; class QAxis; -class QAxisInput; +class QAnalogAxisInput; class QButtonAxisInput; class QAxisActionHandler; @@ -103,8 +103,8 @@ public: Qt3DInput::QActionInput *m_altButtonInput; Qt3DInput::QActionInput *m_shiftButtonInput; - Qt3DInput::QAxisInput *m_mouseRxInput; - Qt3DInput::QAxisInput *m_mouseRyInput; + Qt3DInput::QAnalogAxisInput *m_mouseRxInput; + Qt3DInput::QAnalogAxisInput *m_mouseRyInput; Qt3DInput::QButtonAxisInput *m_keyboardTxPosInput; Qt3DInput::QButtonAxisInput *m_keyboardTyPosInput; Qt3DInput::QButtonAxisInput *m_keyboardTzPosInput; diff --git a/src/input/backend/analogaxisinput.cpp b/src/input/backend/analogaxisinput.cpp new file mode 100644 index 000000000..e2157f691 --- /dev/null +++ b/src/input/backend/analogaxisinput.cpp @@ -0,0 +1,94 @@ +/**************************************************************************** +** +** Copyright (C) 2016 Klaralvdalens Datakonsult AB (KDAB). +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt3D module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "analogaxisinput_p.h" +#include <Qt3DInput/qanalogaxisinput.h> +#include <Qt3DInput/qabstractphysicaldevice.h> +#include <Qt3DInput/private/qanalogaxisinput_p.h> +#include <Qt3DCore/qnodepropertychange.h> + +QT_BEGIN_NAMESPACE + +namespace Qt3DInput { + +namespace Input { + +AnalogAxisInput::AnalogAxisInput() + : AxisInput() + , m_axis(0) +{ +} + +void AnalogAxisInput::updateFromPeer(Qt3DCore::QNode *peer) +{ + QAnalogAxisInput *input = static_cast<QAnalogAxisInput *>(peer); + m_axis = input->axis(); + AxisInput::updateFromPeer(peer); +} + +void AnalogAxisInput::initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) +{ + const auto typedChange = qSharedPointerCast<Qt3DCore::QNodeCreatedChange<QAnalogAxisInputData>>(change); + const auto &data = typedChange->data; + m_axis = data.axis; + AxisInput::initializeFromPeer(change); +} + +void AnalogAxisInput::cleanup() +{ + m_axis = 0; + AxisInput::cleanup(); +} + +void AnalogAxisInput::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) +{ + if (e->type() == Qt3DCore::NodeUpdated) { + Qt3DCore::QNodePropertyChangePtr propertyChange = qSharedPointerCast<Qt3DCore::QNodePropertyChange>(e); + if (propertyChange->propertyName() == QByteArrayLiteral("axis")) { + m_axis = propertyChange->value().toInt(); + } + } + AxisInput::sceneChangeEvent(e); +} + +} // Input + +} // Qt3DInput + +QT_END_NAMESPACE diff --git a/src/input/backend/analogaxisinput_p.h b/src/input/backend/analogaxisinput_p.h new file mode 100644 index 000000000..9c574d02f --- /dev/null +++ b/src/input/backend/analogaxisinput_p.h @@ -0,0 +1,84 @@ +/**************************************************************************** +** +** Copyright (C) 2016 Klaralvdalens Datakonsult AB (KDAB). +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt3D module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QT3DINPUT_INPUT_ANALOGAXISINPUT_H +#define QT3DINPUT_INPUT_ANALOGAXISINPUT_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists for the convenience +// of other Qt classes. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include <Qt3DInput/private/axisinput_p.h> + +QT_BEGIN_NAMESPACE + +namespace Qt3DInput { + +namespace Input { + +class Q_AUTOTEST_EXPORT AnalogAxisInput : public AxisInput +{ +public: + AnalogAxisInput(); + void updateFromPeer(Qt3DCore::QNode *peer) Q_DECL_FINAL; + void cleanup() Q_DECL_FINAL; + + inline int axis() const { return m_axis; } + void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) Q_DECL_FINAL; + +private: + void initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) Q_DECL_FINAL; + + int m_axis; +}; + +} // namespace Input + +} // namespace Qt3DInput + +QT_END_NAMESPACE + +#endif // QT3DINPUT_INPUT_ANALOGAXISINPUT_H diff --git a/src/input/backend/axisinput.cpp b/src/input/backend/axisinput.cpp index 2906771aa..fe20d8ab5 100644 --- a/src/input/backend/axisinput.cpp +++ b/src/input/backend/axisinput.cpp @@ -51,7 +51,6 @@ namespace Input { AxisInput::AxisInput() : Qt3DCore::QBackendNode() - , m_axis(0) { } @@ -61,7 +60,6 @@ AxisInput::AxisInput() void AxisInput::updateFromPeer(Qt3DCore::QNode *peer) { QAxisInput *input = static_cast<QAxisInput *>(peer); - m_axis = input->axis(); if (input->sourceDevice()) m_sourceDevice = input->sourceDevice()->id(); } @@ -71,13 +69,11 @@ void AxisInput::initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &ch const auto typedChange = qSharedPointerCast<Qt3DCore::QNodeCreatedChange<QAxisInputData>>(change); const auto &data = typedChange->data; m_sourceDevice = data.sourceDeviceId; - m_axis = data.axis; } void AxisInput::cleanup() { QBackendNode::setEnabled(false); - m_axis = 0; m_sourceDevice = Qt3DCore::QNodeId(); } @@ -87,8 +83,6 @@ void AxisInput::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) Qt3DCore::QNodePropertyChangePtr propertyChange = qSharedPointerCast<Qt3DCore::QNodePropertyChange>(e); if (propertyChange->propertyName() == QByteArrayLiteral("sourceDevice")) { m_sourceDevice = propertyChange->value().value<Qt3DCore::QNodeId>(); - } else if (propertyChange->propertyName() == QByteArrayLiteral("axis")) { - m_axis = propertyChange->value().toInt(); } } QBackendNode::sceneChangeEvent(e); diff --git a/src/input/backend/axisinput_p.h b/src/input/backend/axisinput_p.h index 028bdc30a..4f5987d33 100644 --- a/src/input/backend/axisinput_p.h +++ b/src/input/backend/axisinput_p.h @@ -67,14 +67,12 @@ public: void updateFromPeer(Qt3DCore::QNode *peer) Q_DECL_OVERRIDE; virtual void cleanup(); - inline int axis() const { return m_axis; } inline Qt3DCore::QNodeId sourceDevice() const { return m_sourceDevice; } void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) Q_DECL_OVERRIDE; protected: void initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) Q_DECL_OVERRIDE; - int m_axis; Qt3DCore::QNodeId m_sourceDevice; }; diff --git a/src/input/backend/backend.pri b/src/input/backend/backend.pri index 834e9a58c..75adebdd3 100644 --- a/src/input/backend/backend.pri +++ b/src/input/backend/backend.pri @@ -15,6 +15,7 @@ HEADERS += \ $$PWD/actioninput_p.h \ $$PWD/axis_p.h \ $$PWD/action_p.h \ + $$PWD/analogaxisinput_p.h \ $$PWD/buttonaxisinput_p.h \ $$PWD/logicaldevice_p.h \ $$PWD/inputbackendnodefunctor_p.h \ @@ -45,6 +46,7 @@ SOURCES += \ $$PWD/actioninput.cpp \ $$PWD/axis.cpp \ $$PWD/action.cpp \ + $$PWD/analogaxisinput.cpp \ $$PWD/buttonaxisinput.cpp \ $$PWD/logicaldevice.cpp \ $$PWD/qabstractphysicaldevicebackendnode.cpp \ diff --git a/src/input/backend/inputhandler.cpp b/src/input/backend/inputhandler.cpp index 6d4100af7..ba4f7548d 100644 --- a/src/input/backend/inputhandler.cpp +++ b/src/input/backend/inputhandler.cpp @@ -67,6 +67,7 @@ InputHandler::InputHandler() , m_axisInputManager(new AxisInputManager()) , m_axisSettingManager(new AxisSettingManager()) , m_actionInputManager(new ActionInputManager()) + , m_analogAxisInputManager(new AnalogAxisInputManager()) , m_buttonAxisInputManager(new ButtonAxisInputManager()) , m_inputChordManager(new InputChordManager()) , m_inputSequenceManager(new InputSequenceManager()) @@ -94,6 +95,7 @@ InputHandler::~InputHandler() delete m_actionManager; delete m_axisSettingManager; delete m_axisInputManager; + delete m_analogAxisInputManager; delete m_buttonAxisInputManager; delete m_actionInputManager; delete m_inputChordManager; diff --git a/src/input/backend/inputhandler_p.h b/src/input/backend/inputhandler_p.h index d3812d35e..bc9f4044b 100644 --- a/src/input/backend/inputhandler_p.h +++ b/src/input/backend/inputhandler_p.h @@ -80,6 +80,7 @@ class ActionManager; class AxisInputManager; class AxisSettingManager; class ActionInputManager; +class AnalogAxisInputManager; class ButtonAxisInputManager; class InputChordManager; class InputSequenceManager; @@ -104,6 +105,7 @@ public: inline AxisInputManager *axisInputManager() const { return m_axisInputManager; } inline AxisSettingManager *axisSettingManager() const { return m_axisSettingManager; } inline ActionInputManager *actionInputManager() const { return m_actionInputManager; } + inline AnalogAxisInputManager *analogAxisInputManager() const { return m_analogAxisInputManager; } inline ButtonAxisInputManager *buttonAxisInputManager() const { return m_buttonAxisInputManager; } inline InputChordManager *inputChordManager() const { return m_inputChordManager; } inline InputSequenceManager *inputSequenceManager() const { return m_inputSequenceManager; } @@ -166,6 +168,7 @@ private: AxisInputManager *m_axisInputManager; AxisSettingManager *m_axisSettingManager; ActionInputManager *m_actionInputManager; + AnalogAxisInputManager *m_analogAxisInputManager; ButtonAxisInputManager *m_buttonAxisInputManager; InputChordManager *m_inputChordManager; InputSequenceManager *m_inputSequenceManager; diff --git a/src/input/backend/inputmanagers_p.h b/src/input/backend/inputmanagers_p.h index a70a5d023..3fae7e8d9 100644 --- a/src/input/backend/inputmanagers_p.h +++ b/src/input/backend/inputmanagers_p.h @@ -65,6 +65,7 @@ #include <Qt3DInput/private/action_p.h> #include <Qt3DInput/private/axis_p.h> #include <Qt3DInput/private/axissetting_p.h> +#include <Qt3DInput/private/analogaxisinput_p.h> #include <Qt3DInput/private/buttonaxisinput_p.h> #include <Qt3DInput/private/logicaldevice_p.h> #include <Qt3DInput/private/genericdevicebackendnode_p.h> @@ -164,6 +165,16 @@ public: ActionInputManager() {} }; +class AnalogAxisInputManager : public Qt3DCore::QResourceManager< + AnalogAxisInput, + Qt3DCore::QNodeId, + 16, + Qt3DCore::ArrayAllocatingPolicy> +{ +public: + AnalogAxisInputManager() {} +}; + class ButtonAxisInputManager : public Qt3DCore::QResourceManager< ButtonAxisInput, Qt3DCore::QNodeId, diff --git a/src/input/backend/updateaxisactionjob.cpp b/src/input/backend/updateaxisactionjob.cpp index cf35cbac6..2a4b69c1f 100644 --- a/src/input/backend/updateaxisactionjob.cpp +++ b/src/input/backend/updateaxisactionjob.cpp @@ -169,34 +169,33 @@ void UpdateAxisActionJob::updateAxis(LogicalDevice *device) const auto axisInputIds = axis->inputs(); for (const Qt3DCore::QNodeId axisInputId : axisInputIds) { - AxisInput *axisInput = m_handler->axisInputManager()->lookupResource(axisInputId); - ButtonAxisInput *buttonAxisInput = nullptr; - if (!axisInput) { - buttonAxisInput = m_handler->buttonAxisInputManager()->lookupResource(axisInputId); - axisInput = buttonAxisInput; + AnalogAxisInput *analogInput = m_handler->analogAxisInputManager()->lookupResource(axisInputId); + if (analogInput) { + QAbstractPhysicalDeviceBackendNode *physicalDeviceBackend = findAxisInputPhysicalDevice(analogInput); + if (physicalDeviceBackend && analogInput->axis() != -1) { + // Update the value + axisValue += physicalDeviceBackend->processedAxisValue(analogInput->axis()); + } + continue; } - Q_ASSERT(axisInput); - QAbstractPhysicalDeviceBackendNode *physicalDeviceBackend = nullptr; + ButtonAxisInput *buttonInput = m_handler->buttonAxisInputManager()->lookupResource(axisInputId); + if (buttonInput) { + QAbstractPhysicalDeviceBackendNode *physicalDeviceBackend = findAxisInputPhysicalDevice(buttonInput); + if (physicalDeviceBackend != nullptr) { + // Update the value + const QVector<int> buttons = buttonInput ? buttonInput->buttons() : QVector<int>(); + if (!buttons.isEmpty()) { + // TO DO: Linear Curver for the progression of the scale value + if (anyOfRequiredButtonsPressed(buttons, physicalDeviceBackend)) + axisValue += buttonInput->scale(); + } + } - const auto integrations = m_handler->inputDeviceIntegrations(); - for (QInputDeviceIntegration *integration : integrations) { - if ((physicalDeviceBackend = integration->physicalDevice(axisInput->sourceDevice())) != nullptr) - break; + continue; } - if (physicalDeviceBackend != nullptr) { - // Update the value - const QVector<int> buttons = buttonAxisInput ? buttonAxisInput->buttons() : QVector<int>(); - // Axis was specified -> we take this as the base value - if (axisInput->axis() != -1) - axisValue += physicalDeviceBackend->processedAxisValue(axisInput->axis()); - else if (!buttons.isEmpty()) { - // TO DO: Linear Curver for the progression of the scale value - if (anyOfRequiredButtonsPressed(buttons, physicalDeviceBackend)) - axisValue += buttonAxisInput->scale(); - } - } + Q_UNREACHABLE(); } // Clamp the axisValue -1/1 @@ -205,6 +204,18 @@ void UpdateAxisActionJob::updateAxis(LogicalDevice *device) } } +QAbstractPhysicalDeviceBackendNode *UpdateAxisActionJob::findAxisInputPhysicalDevice(AxisInput *axisInput) +{ + const auto integrations = m_handler->inputDeviceIntegrations(); + for (QInputDeviceIntegration *integration : integrations) { + QAbstractPhysicalDeviceBackendNode *physicalDeviceBackend = integration->physicalDevice(axisInput->sourceDevice()); + if (physicalDeviceBackend) + return physicalDeviceBackend; + } + + return nullptr; +} + } // Input } // Qt3DInput diff --git a/src/input/backend/updateaxisactionjob_p.h b/src/input/backend/updateaxisactionjob_p.h index 24286c731..c2b0f88e2 100644 --- a/src/input/backend/updateaxisactionjob_p.h +++ b/src/input/backend/updateaxisactionjob_p.h @@ -59,8 +59,11 @@ QT_BEGIN_NAMESPACE namespace Qt3DInput { +class QAbstractPhysicalDeviceBackendNode; + namespace Input { +class AxisInput; class InputHandler; class UpdateAxisActionJob : public Qt3DCore::QAspectJob @@ -73,6 +76,7 @@ private: void updateAction(LogicalDevice *device); bool processActionInput(const Qt3DCore::QNodeId actionInputId); void updateAxis(LogicalDevice *device); + QAbstractPhysicalDeviceBackendNode *findAxisInputPhysicalDevice(AxisInput *axisInput); const qint64 m_currentTime; InputHandler *m_handler; diff --git a/src/input/frontend/frontend.pri b/src/input/frontend/frontend.pri index 8cf3d5fa9..816cae8d4 100644 --- a/src/input/frontend/frontend.pri +++ b/src/input/frontend/frontend.pri @@ -16,6 +16,7 @@ HEADERS += \ $$PWD/qaction.h \ $$PWD/qaxisinput.h \ $$PWD/qaxis.h \ + $$PWD/qanalogaxisinput.h \ $$PWD/qbuttonaxisinput.h \ $$PWD/qlogicaldevice.h \ $$PWD/qinputdeviceintegration.h \ @@ -34,6 +35,7 @@ HEADERS += \ $$PWD/qactioninput_p.h \ $$PWD/qaxis_p.h \ $$PWD/qaxisinput_p.h \ + $$PWD/qanalogaxisinput_p.h \ $$PWD/qbuttonaxisinput_p.h \ $$PWD/qlogicaldevice_p.h \ $$PWD/qaxissetting_p.h \ @@ -56,6 +58,7 @@ SOURCES += \ $$PWD/qaction.cpp \ $$PWD/qaxisinput.cpp \ $$PWD/qaxis.cpp \ + $$PWD/qanalogaxisinput.cpp \ $$PWD/qbuttonaxisinput.cpp \ $$PWD/qlogicaldevice.cpp \ $$PWD/qinputdeviceintegration.cpp \ diff --git a/src/input/frontend/qanalogaxisinput.cpp b/src/input/frontend/qanalogaxisinput.cpp new file mode 100644 index 000000000..c6c86c723 --- /dev/null +++ b/src/input/frontend/qanalogaxisinput.cpp @@ -0,0 +1,98 @@ +/**************************************************************************** +** +** Copyright (C) 2016 Klaralvdalens Datakonsult AB (KDAB). +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt3D module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qanalogaxisinput.h" +#include "qanalogaxisinput_p.h" +#include <Qt3DInput/qabstractphysicaldevice.h> + +QT_BEGIN_NAMESPACE + +namespace Qt3DInput { + +/*! + * \qmltype AnalogAxisInput + * \instantiates Qt3DInput::QAnalogAxisInput + * \inqmlmodule Qt3D.Input + * \since 5.7 + * \TODO + * + */ + +/*! + * \class Qt3DInput::QAnalogAxisInput + * \inmodule Qt3DInput + * \since 5.7 + * \TODO + * + */ +QAnalogAxisInput::QAnalogAxisInput(Qt3DCore::QNode *parent) + : QAxisInput(*new QAnalogAxisInputPrivate, parent) +{ +} + +void QAnalogAxisInput::setAxis(int axis) +{ + Q_D(QAnalogAxisInput); + if (d->m_axis != axis) { + d->m_axis = axis; + emit axisChanged(axis); + } +} + +int QAnalogAxisInput::axis() const +{ + Q_D(const QAnalogAxisInput); + return d->m_axis; +} + +Qt3DCore::QNodeCreatedChangeBasePtr QAnalogAxisInput::createNodeCreationChange() const +{ + auto creationChange = Qt3DCore::QNodeCreatedChangePtr<QAnalogAxisInputData>::create(this); + auto &data = creationChange->data; + + Q_D(const QAnalogAxisInput); + data.sourceDeviceId = qIdForNode(d->m_sourceDevice); + data.axis = d->m_axis; + + return creationChange; +} + +} // Qt3DInput + +QT_END_NAMESPACE diff --git a/src/input/frontend/qanalogaxisinput.h b/src/input/frontend/qanalogaxisinput.h new file mode 100644 index 000000000..60bb50098 --- /dev/null +++ b/src/input/frontend/qanalogaxisinput.h @@ -0,0 +1,77 @@ +/**************************************************************************** +** +** Copyright (C) 2016 Klaralvdalens Datakonsult AB (KDAB). +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt3D module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QT3DINPUT_QANALOGAXISINPUT_H +#define QT3DINPUT_QANALOGAXISINPUT_H + +#include <Qt3DInput/qt3dinput_global.h> +#include <Qt3DInput/QAxisInput> + +QT_BEGIN_NAMESPACE + +namespace Qt3DInput { + +class QAnalogAxisInputPrivate; + +class QT3DINPUTSHARED_EXPORT QAnalogAxisInput : public QAxisInput +{ + Q_OBJECT + Q_PROPERTY(int axis READ axis WRITE setAxis NOTIFY axisChanged) + +public: + explicit QAnalogAxisInput(Qt3DCore::QNode *parent = nullptr); + + int axis() const; + +public Q_SLOTS: + void setAxis(int axis); + +Q_SIGNALS: + void axisChanged(int axis); + +private: + Q_DECLARE_PRIVATE(QAnalogAxisInput) + Qt3DCore::QNodeCreatedChangeBasePtr createNodeCreationChange() const Q_DECL_OVERRIDE; +}; + +} // Qt3DInput + +QT_END_NAMESPACE + +#endif // QT3DINPUT_QANALOGAXISINPUT_H diff --git a/src/input/frontend/qanalogaxisinput_p.h b/src/input/frontend/qanalogaxisinput_p.h new file mode 100644 index 000000000..ee60b5f4d --- /dev/null +++ b/src/input/frontend/qanalogaxisinput_p.h @@ -0,0 +1,81 @@ +/**************************************************************************** +** +** Copyright (C) 2016 Klaralvdalens Datakonsult AB (KDAB). +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt3D module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QT3DINPUT_QANALOGAXISINPUT_P_H +#define QT3DINPUT_QANALOGAXISINPUT_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists for the convenience +// of other Qt classes. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include <Qt3DInput/private/qaxisinput_p.h> + +QT_BEGIN_NAMESPACE + +namespace Qt3DInput { + +class QAnalogAxisInputPrivate : public QAxisInputPrivate +{ +public: + QAnalogAxisInputPrivate() + : QAxisInputPrivate() + , m_axis(-1) + {} + + int m_axis; +}; + +struct QAnalogAxisInputData : public QAxisInputData +{ + int axis; +}; + +} // Qt3DInput + +QT_END_NAMESPACE + +#endif // QT3DINPUT_QBUTTONAXISINPUT_P_H + diff --git a/src/input/frontend/qaxisinput.cpp b/src/input/frontend/qaxisinput.cpp index 9c2f30d43..f4caca1f1 100644 --- a/src/input/frontend/qaxisinput.cpp +++ b/src/input/frontend/qaxisinput.cpp @@ -91,21 +91,6 @@ QAbstractPhysicalDevice *QAxisInput::sourceDevice() const return d->m_sourceDevice; } -void QAxisInput::setAxis(int axis) -{ - Q_D(QAxisInput); - if (d->m_axis != axis) { - d->m_axis = axis; - emit axisChanged(axis); - } -} - -int QAxisInput::axis() const -{ - Q_D(const QAxisInput); - return d->m_axis; -} - Qt3DCore::QNodeCreatedChangeBasePtr QAxisInput::createNodeCreationChange() const { auto creationChange = Qt3DCore::QNodeCreatedChangePtr<QAxisInputData>::create(this); @@ -113,7 +98,6 @@ Qt3DCore::QNodeCreatedChangeBasePtr QAxisInput::createNodeCreationChange() const Q_D(const QAxisInput); data.sourceDeviceId = qIdForNode(d->m_sourceDevice); - data.axis = d->m_axis; return creationChange; } diff --git a/src/input/frontend/qaxisinput.h b/src/input/frontend/qaxisinput.h index da840f25a..ae67cce57 100644 --- a/src/input/frontend/qaxisinput.h +++ b/src/input/frontend/qaxisinput.h @@ -55,21 +55,17 @@ class QT3DINPUTSHARED_EXPORT QAxisInput : public Qt3DCore::QNode { Q_OBJECT Q_PROPERTY(Qt3DInput::QAbstractPhysicalDevice *sourceDevice READ sourceDevice WRITE setSourceDevice NOTIFY sourceDeviceChanged) - Q_PROPERTY(int axis READ axis WRITE setAxis NOTIFY axisChanged) public: explicit QAxisInput(Qt3DCore::QNode *parent = nullptr); QAbstractPhysicalDevice *sourceDevice() const; - int axis() const; public Q_SLOTS: void setSourceDevice(QAbstractPhysicalDevice *sourceDevice); - void setAxis(int axis); Q_SIGNALS: void sourceDeviceChanged(QAbstractPhysicalDevice *sourceDevice); - void axisChanged(int axis); protected: QAxisInput(QAxisInputPrivate &dd, QNode *parent = nullptr); diff --git a/src/input/frontend/qaxisinput_p.h b/src/input/frontend/qaxisinput_p.h index cb025ff50..5e9fd67d7 100644 --- a/src/input/frontend/qaxisinput_p.h +++ b/src/input/frontend/qaxisinput_p.h @@ -67,17 +67,14 @@ public: QAxisInputPrivate() : Qt3DCore::QNodePrivate() , m_sourceDevice(nullptr) - , m_axis(-1) {} QAbstractPhysicalDevice *m_sourceDevice; - int m_axis; }; struct QAxisInputData { Qt3DCore::QNodeId sourceDeviceId; - int axis; }; } // Qt3DInput diff --git a/src/input/frontend/qbuttonaxisinput.cpp b/src/input/frontend/qbuttonaxisinput.cpp index cd74cc8da..4d3a2d6da 100644 --- a/src/input/frontend/qbuttonaxisinput.cpp +++ b/src/input/frontend/qbuttonaxisinput.cpp @@ -103,7 +103,6 @@ Qt3DCore::QNodeCreatedChangeBasePtr QButtonAxisInput::createNodeCreationChange() Q_D(const QButtonAxisInput); data.sourceDeviceId = qIdForNode(d->m_sourceDevice); - data.axis = d->m_axis; data.buttons = d->m_buttons; data.scale = d->m_scale; diff --git a/src/input/frontend/qinputaspect.cpp b/src/input/frontend/qinputaspect.cpp index 0169be233..fa856a750 100644 --- a/src/input/frontend/qinputaspect.cpp +++ b/src/input/frontend/qinputaspect.cpp @@ -62,9 +62,9 @@ #include <Qt3DInput/qaxis.h> #include <Qt3DInput/qaction.h> -#include <Qt3DInput/qaxisinput.h> #include <Qt3DInput/qaxissetting.h> #include <Qt3DInput/qactioninput.h> +#include <Qt3DInput/qanalogaxisinput.h> #include <Qt3DInput/qbuttonaxisinput.h> #include <Qt3DInput/qinputchord.h> #include <Qt3DInput/qinputsequence.h> @@ -119,6 +119,7 @@ QInputAspect::QInputAspect(QObject *parent) registerBackendType<QMouseHandler>(QBackendNodeMapperPtr(new Input::MouseHandlerFunctor(d_func()->m_inputHandler.data()))); registerBackendType<QAxis>(QBackendNodeMapperPtr(new Input::InputNodeFunctor<Input::Axis, Input::AxisManager>(d_func()->m_inputHandler->axisManager()))); registerBackendType<QAxisInput>(QBackendNodeMapperPtr(new Input::InputNodeFunctor<Input::AxisInput, Input::AxisInputManager>(d_func()->m_inputHandler->axisInputManager()))); + registerBackendType<QAnalogAxisInput>(QBackendNodeMapperPtr(new Input::InputNodeFunctor<Input::AnalogAxisInput, Input::AnalogAxisInputManager>(d_func()->m_inputHandler->analogAxisInputManager()))); registerBackendType<QButtonAxisInput>(QBackendNodeMapperPtr(new Input::InputNodeFunctor<Input::ButtonAxisInput, Input::ButtonAxisInputManager>(d_func()->m_inputHandler->buttonAxisInputManager()))); registerBackendType<QAxisSetting>(QBackendNodeMapperPtr(new Input::InputNodeFunctor<Input::AxisSetting, Input::AxisSettingManager>(d_func()->m_inputHandler->axisSettingManager()))); registerBackendType<Qt3DInput::QAction>(QBackendNodeMapperPtr(new Input::InputNodeFunctor<Input::Action, Input::ActionManager>(d_func()->m_inputHandler->actionManager()))); diff --git a/src/quick3d/imports/extras/defaults/qml/FirstPersonCameraController.qml b/src/quick3d/imports/extras/defaults/qml/FirstPersonCameraController.qml index f1c09c5d6..0765956c9 100644 --- a/src/quick3d/imports/extras/defaults/qml/FirstPersonCameraController.qml +++ b/src/quick3d/imports/extras/defaults/qml/FirstPersonCameraController.qml @@ -105,14 +105,14 @@ Entity { // Rotation Axis { id: rxAxis - AxisInput { + AnalogAxisInput { sourceDevice: mouseSourceDevice axis: MouseDevice.X } }, Axis { id: ryAxis - AxisInput { + AnalogAxisInput { sourceDevice: mouseSourceDevice axis: MouseDevice.Y } diff --git a/src/quick3d/imports/extras/defaults/qml/OrbitController.qml b/src/quick3d/imports/extras/defaults/qml/OrbitController.qml index 3673a8d60..328b7b98e 100644 --- a/src/quick3d/imports/extras/defaults/qml/OrbitController.qml +++ b/src/quick3d/imports/extras/defaults/qml/OrbitController.qml @@ -132,14 +132,14 @@ Entity { // Mouse Axis { id: mouseXAxis - AxisInput { + AnalogAxisInput { sourceDevice: mouseSourceDevice axis: MouseDevice.X } }, Axis { id: mouseYAxis - AxisInput { + AnalogAxisInput { sourceDevice: mouseSourceDevice axis: MouseDevice.Y } diff --git a/src/quick3d/imports/input/qt3dquick3dinputplugin.cpp b/src/quick3d/imports/input/qt3dquick3dinputplugin.cpp index 25b4ae276..c18beb81d 100644 --- a/src/quick3d/imports/input/qt3dquick3dinputplugin.cpp +++ b/src/quick3d/imports/input/qt3dquick3dinputplugin.cpp @@ -46,10 +46,10 @@ #include <Qt3DInput/qmouseevent.h> #include <Qt3DInput/qaxis.h> -#include <Qt3DInput/qaxisinput.h> #include <Qt3DInput/qaxissetting.h> #include <Qt3DInput/qaction.h> #include <Qt3DInput/qactioninput.h> +#include <Qt3DInput/qanalogaxisinput.h> #include <Qt3DInput/qbuttonaxisinput.h> #include <Qt3DInput/qinputsequence.h> #include <Qt3DInput/qinputchord.h> @@ -89,6 +89,7 @@ void Qt3DQuick3DInputPlugin::registerTypes(const char *uri) qmlRegisterType<Qt3DInput::QActionInput>(uri, 2, 0, "ActionInput"); qmlRegisterType<Qt3DInput::QAxisInput>(uri, 2, 0, "AxisInput"); qmlRegisterType<Qt3DInput::QAxisSetting>(uri, 2, 0, "AxisSetting"); + qmlRegisterType<Qt3DInput::QAnalogAxisInput>(uri, 2, 0, "AnalogAxisInput"); qmlRegisterType<Qt3DInput::QButtonAxisInput>(uri, 2, 0, "ButtonAxisInput"); qmlRegisterExtendedType<Qt3DInput::QAxis, Qt3DInput::Input::Quick::Quick3DAxis>(uri, 2, 0, "Axis"); qmlRegisterExtendedType<Qt3DInput::QAction, Qt3DInput::Input::Quick::Quick3DAction>(uri, 2, 0, "Action"); diff --git a/tests/auto/input/analogaxisinput/analogaxisinput.pro b/tests/auto/input/analogaxisinput/analogaxisinput.pro new file mode 100644 index 000000000..7bd0a9865 --- /dev/null +++ b/tests/auto/input/analogaxisinput/analogaxisinput.pro @@ -0,0 +1,12 @@ +TEMPLATE = app + +TARGET = tst_analogaxisinput + +QT += core-private 3dcore 3dcore-private 3dinput 3dinput-private testlib + +CONFIG += testcase + +SOURCES += tst_analogaxisinput.cpp + +include(../../core/common/common.pri) +include(../commons/commons.pri) diff --git a/tests/auto/input/analogaxisinput/tst_analogaxisinput.cpp b/tests/auto/input/analogaxisinput/tst_analogaxisinput.cpp new file mode 100644 index 000000000..99110116c --- /dev/null +++ b/tests/auto/input/analogaxisinput/tst_analogaxisinput.cpp @@ -0,0 +1,131 @@ +/**************************************************************************** +** +** Copyright (C) 2015 Klaralvdalens Datakonsult AB (KDAB). +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt3D module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtTest/QTest> +#include <qbackendnodetester.h> +#include <Qt3DCore/private/qnode_p.h> +#include <Qt3DCore/private/qscene_p.h> +#include <Qt3DCore/qnodepropertychange.h> +#include <Qt3DInput/private/analogaxisinput_p.h> +#include <Qt3DInput/QAnalogAxisInput> +#include <Qt3DCore/qnodepropertychange.h> +#include "testdevice.h" + +class tst_AnalogAxisInput: public Qt3DCore::QBackendNodeTester +{ + Q_OBJECT + +private Q_SLOTS: + + void checkPeerPropertyMirroring() + { + // GIVEN + Qt3DInput::Input::AnalogAxisInput backendAxisInput; + Qt3DInput::QAnalogAxisInput axisInput; + TestDevice sourceDevice; + + axisInput.setAxis(327); + axisInput.setSourceDevice(&sourceDevice); + + // WHEN + simulateInitialization(&axisInput, &backendAxisInput); + + // THEN + QCOMPARE(backendAxisInput.peerId(), axisInput.id()); + QCOMPARE(backendAxisInput.isEnabled(), axisInput.isEnabled()); + QCOMPARE(backendAxisInput.axis(), axisInput.axis()); + QCOMPARE(backendAxisInput.sourceDevice(), sourceDevice.id()); + } + + void checkInitialAndCleanedUpState() + { + // GIVEN + Qt3DInput::Input::AnalogAxisInput backendAxisInput; + + // THEN + QVERIFY(backendAxisInput.peerId().isNull()); + QCOMPARE(backendAxisInput.axis(), 0); + QCOMPARE(backendAxisInput.isEnabled(), false); + QCOMPARE(backendAxisInput.sourceDevice(), Qt3DCore::QNodeId()); + + // GIVEN + Qt3DInput::QAnalogAxisInput axisInput; + TestDevice sourceDevice; + + axisInput.setAxis(327); + axisInput.setSourceDevice(&sourceDevice); + + // WHEN + backendAxisInput.updateFromPeer(&axisInput); + backendAxisInput.cleanup(); + + // THEN + QVERIFY(backendAxisInput.peerId().isNull()); + QCOMPARE(backendAxisInput.axis(), 0); + QCOMPARE(backendAxisInput.isEnabled(), false); + QCOMPARE(backendAxisInput.sourceDevice(), Qt3DCore::QNodeId()); + } + + void checkPropertyChanges() + { + // GIVEN + Qt3DInput::Input::AnalogAxisInput backendAxisInput; + + // WHEN + Qt3DCore::QNodePropertyChangePtr updateChange(new Qt3DCore::QNodePropertyChange(Qt3DCore::NodeUpdated, Qt3DCore::QSceneChange::Node, Qt3DCore::QNodeId())); + updateChange->setValue(32); + updateChange->setPropertyName("axis"); + backendAxisInput.sceneChangeEvent(updateChange); + + // THEN + QCOMPARE(backendAxisInput.axis(), 32); + + // WHEN + updateChange.reset(new Qt3DCore::QNodePropertyChange(Qt3DCore::NodeUpdated, Qt3DCore::QSceneChange::Node, Qt3DCore::QNodeId())); + updateChange->setPropertyName("enabled"); + updateChange->setValue(true); + backendAxisInput.sceneChangeEvent(updateChange); + + // THEN + QCOMPARE(backendAxisInput.isEnabled(), true); + + // WHEN + TestDevice device; + updateChange.reset(new Qt3DCore::QNodePropertyChange(Qt3DCore::NodeUpdated, Qt3DCore::QSceneChange::Node, Qt3DCore::QNodeId())); + updateChange->setPropertyName("sourceDevice"); + updateChange->setValue(QVariant::fromValue(device.id())); + backendAxisInput.sceneChangeEvent(updateChange); + + // THEN + QCOMPARE(backendAxisInput.sourceDevice(), device.id()); + } +}; + +QTEST_APPLESS_MAIN(tst_AnalogAxisInput) + +#include "tst_analogaxisinput.moc" diff --git a/tests/auto/input/axisinput/tst_axisinput.cpp b/tests/auto/input/axisinput/tst_axisinput.cpp index 011d7d2fc..06edd031a 100644 --- a/tests/auto/input/axisinput/tst_axisinput.cpp +++ b/tests/auto/input/axisinput/tst_axisinput.cpp @@ -49,7 +49,6 @@ private Q_SLOTS: Qt3DInput::QAxisInput axisInput; TestDevice sourceDevice; - axisInput.setAxis(327); axisInput.setSourceDevice(&sourceDevice); // WHEN @@ -58,7 +57,6 @@ private Q_SLOTS: // THEN QCOMPARE(backendAxisInput.peerId(), axisInput.id()); QCOMPARE(backendAxisInput.isEnabled(), axisInput.isEnabled()); - QCOMPARE(backendAxisInput.axis(), axisInput.axis()); QCOMPARE(backendAxisInput.sourceDevice(), sourceDevice.id()); } @@ -69,7 +67,6 @@ private Q_SLOTS: // THEN QVERIFY(backendAxisInput.peerId().isNull()); - QCOMPARE(backendAxisInput.axis(), 0); QCOMPARE(backendAxisInput.isEnabled(), false); QCOMPARE(backendAxisInput.sourceDevice(), Qt3DCore::QNodeId()); @@ -77,7 +74,6 @@ private Q_SLOTS: Qt3DInput::QAxisInput axisInput; TestDevice sourceDevice; - axisInput.setAxis(327); axisInput.setSourceDevice(&sourceDevice); // WHEN @@ -86,7 +82,6 @@ private Q_SLOTS: // THEN QVERIFY(backendAxisInput.peerId().isNull()); - QCOMPARE(backendAxisInput.axis(), 0); QCOMPARE(backendAxisInput.isEnabled(), false); QCOMPARE(backendAxisInput.sourceDevice(), Qt3DCore::QNodeId()); } @@ -98,15 +93,6 @@ private Q_SLOTS: // WHEN Qt3DCore::QNodePropertyChangePtr updateChange(new Qt3DCore::QNodePropertyChange(Qt3DCore::NodeUpdated, Qt3DCore::QSceneChange::Node, Qt3DCore::QNodeId())); - updateChange->setValue(32); - updateChange->setPropertyName("axis"); - backendAxisInput.sceneChangeEvent(updateChange); - - // THEN - QCOMPARE(backendAxisInput.axis(), 32); - - // WHEN - updateChange.reset(new Qt3DCore::QNodePropertyChange(Qt3DCore::NodeUpdated, Qt3DCore::QSceneChange::Node, Qt3DCore::QNodeId())); updateChange->setPropertyName("enabled"); updateChange->setValue(true); backendAxisInput.sceneChangeEvent(updateChange); diff --git a/tests/auto/input/buttonaxisinput/tst_buttonaxisinput.cpp b/tests/auto/input/buttonaxisinput/tst_buttonaxisinput.cpp index ede60e134..9f278bbbe 100644 --- a/tests/auto/input/buttonaxisinput/tst_buttonaxisinput.cpp +++ b/tests/auto/input/buttonaxisinput/tst_buttonaxisinput.cpp @@ -62,7 +62,6 @@ private Q_SLOTS: TestDevice sourceDevice; axisInput.setButtons(QVariantList() << QVariant(1 << 8)); - axisInput.setAxis(327); axisInput.setScale(0.5f); axisInput.setSourceDevice(&sourceDevice); @@ -73,7 +72,6 @@ private Q_SLOTS: QCOMPARE(backendAxisInput.peerId(), axisInput.id()); QCOMPARE(backendAxisInput.isEnabled(), axisInput.isEnabled()); compareKeys(backendAxisInput.buttons(), axisInput.buttons()); - QCOMPARE(backendAxisInput.axis(), axisInput.axis()); QCOMPARE(backendAxisInput.scale(), axisInput.scale()); QCOMPARE(backendAxisInput.sourceDevice(), sourceDevice.id()); } @@ -87,7 +85,6 @@ private Q_SLOTS: QVERIFY(backendAxisInput.peerId().isNull()); QCOMPARE(backendAxisInput.scale(), 0.0f); QVERIFY(backendAxisInput.buttons().isEmpty()); - QCOMPARE(backendAxisInput.axis(), 0); QCOMPARE(backendAxisInput.isEnabled(), false); QCOMPARE(backendAxisInput.sourceDevice(), Qt3DCore::QNodeId()); @@ -96,7 +93,6 @@ private Q_SLOTS: TestDevice sourceDevice; axisInput.setButtons(QVariantList() << QVariant(1 << 8)); - axisInput.setAxis(327); axisInput.setScale(0.5f); axisInput.setSourceDevice(&sourceDevice); @@ -108,7 +104,6 @@ private Q_SLOTS: QVERIFY(backendAxisInput.peerId().isNull()); QCOMPARE(backendAxisInput.scale(), 0.0f); QVERIFY(backendAxisInput.buttons().isEmpty()); - QCOMPARE(backendAxisInput.axis(), 0); QCOMPARE(backendAxisInput.isEnabled(), false); QCOMPARE(backendAxisInput.sourceDevice(), Qt3DCore::QNodeId()); } @@ -118,18 +113,8 @@ private Q_SLOTS: // GIVEN Qt3DInput::Input::ButtonAxisInput backendAxisInput; - // WHEN - Qt3DCore::QNodePropertyChangePtr updateChange(new Qt3DCore::QNodePropertyChange(Qt3DCore::NodeUpdated, Qt3DCore::QSceneChange::Node, Qt3DCore::QNodeId())); - updateChange->setValue(32); - updateChange->setPropertyName("axis"); - backendAxisInput.sceneChangeEvent(updateChange); - - // THEN - QCOMPARE(backendAxisInput.axis(), 32); - - // WHEN - updateChange.reset(new Qt3DCore::QNodePropertyChange(Qt3DCore::NodeUpdated, Qt3DCore::QSceneChange::Node, Qt3DCore::QNodeId())); + Qt3DCore::QNodePropertyChangePtr updateChange(new Qt3DCore::QNodePropertyChange(Qt3DCore::NodeUpdated, Qt3DCore::QSceneChange::Node, Qt3DCore::QNodeId())); updateChange->setValue(QVariantList() << QVariant(64)); updateChange->setPropertyName("buttons"); backendAxisInput.sceneChangeEvent(updateChange); diff --git a/tests/auto/input/input.pro b/tests/auto/input/input.pro index b4790f9ff..ed9bf41d6 100644 --- a/tests/auto/input/input.pro +++ b/tests/auto/input/input.pro @@ -6,10 +6,12 @@ contains(QT_CONFIG, private_tests) { qaction \ qactioninput \ qaxisinput \ + qanalogaxisinput \ qbuttonaxisinput \ qlogicaldevice \ axis \ action \ axisinput \ + analogaxisinput \ buttonaxisinput } diff --git a/tests/auto/input/qanalogaxisinput/qanalogaxisinput.pro b/tests/auto/input/qanalogaxisinput/qanalogaxisinput.pro new file mode 100644 index 000000000..e693c160b --- /dev/null +++ b/tests/auto/input/qanalogaxisinput/qanalogaxisinput.pro @@ -0,0 +1,12 @@ +TEMPLATE = app + +TARGET = tst_qanalogaxisinput + +QT += core-private 3dcore 3dcore-private 3dinput 3dinput-private testlib + +CONFIG += testcase + +SOURCES += tst_qanalogaxisinput.cpp + +include(../../render/commons/commons.pri) +include(../commons/commons.pri) diff --git a/tests/auto/input/qanalogaxisinput/tst_qanalogaxisinput.cpp b/tests/auto/input/qanalogaxisinput/tst_qanalogaxisinput.cpp new file mode 100644 index 000000000..db34a37bf --- /dev/null +++ b/tests/auto/input/qanalogaxisinput/tst_qanalogaxisinput.cpp @@ -0,0 +1,131 @@ +/**************************************************************************** +** +** Copyright (C) 2015 Klaralvdalens Datakonsult AB (KDAB). +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt3D module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtTest/QTest> +#include <Qt3DCore/private/qnode_p.h> +#include <Qt3DCore/private/qscene_p.h> +#include <Qt3DCore/private/qnodecreatedchangegenerator_p.h> + +#include <Qt3DInput/QAnalogAxisInput> +#include <Qt3DInput/QAbstractPhysicalDevice> +#include <Qt3DInput/private/qanalogaxisinput_p.h> + +#include "testpostmanarbiter.h" +#include "testdevice.h" + +class tst_QAnalogAxisInput: public QObject +{ + Q_OBJECT +public: + tst_QAnalogAxisInput() + { + qRegisterMetaType<Qt3DInput::QAbstractPhysicalDevice*>("Qt3DInput::QAbstractPhysicalDevice*"); + } + +private Q_SLOTS: + void checkCloning_data() + { + QTest::addColumn<Qt3DInput::QAnalogAxisInput *>("axisInput"); + + Qt3DInput::QAnalogAxisInput *defaultConstructed = new Qt3DInput::QAnalogAxisInput(); + QTest::newRow("defaultConstructed") << defaultConstructed; + + Qt3DInput::QAnalogAxisInput *axisInputWithAxis = new Qt3DInput::QAnalogAxisInput(); + axisInputWithAxis->setAxis(383); + QTest::newRow("axisInputWithAxis") << axisInputWithAxis; + + Qt3DInput::QAnalogAxisInput *axisInputWithAxisAndSourceDevice = new Qt3DInput::QAnalogAxisInput(); + TestDevice *device = new TestDevice(); + axisInputWithAxisAndSourceDevice->setSourceDevice(device); + axisInputWithAxisAndSourceDevice->setAxis(427); + QTest::newRow("axisInputWithAxisAndSourceDevice") << axisInputWithAxisAndSourceDevice; + } + + void checkCloning() + { + // GIVEN + QFETCH(Qt3DInput::QAnalogAxisInput *, axisInput); + + // WHEN + Qt3DCore::QNodeCreatedChangeGenerator creationChangeGenerator(axisInput); + QVector<Qt3DCore::QNodeCreatedChangeBasePtr> creationChanges = creationChangeGenerator.creationChanges(); + + // THEN + QCOMPARE(creationChanges.size(), 1 + (axisInput->sourceDevice() ? 1 : 0)); + + const Qt3DCore::QNodeCreatedChangePtr<Qt3DInput::QAnalogAxisInputData> creationChangeData = + qSharedPointerCast<Qt3DCore::QNodeCreatedChange<Qt3DInput::QAnalogAxisInputData>>(creationChanges.first()); + const Qt3DInput::QAnalogAxisInputData &cloneData = creationChangeData->data; + QCOMPARE(axisInput->id(), creationChangeData->subjectId()); + QCOMPARE(axisInput->isEnabled(), creationChangeData->isNodeEnabled()); + QCOMPARE(axisInput->metaObject(), creationChangeData->metaObject()); + QCOMPARE(axisInput->axis(), cloneData.axis); + QCOMPARE(axisInput->sourceDevice() ? axisInput->sourceDevice()->id() : Qt3DCore::QNodeId(), cloneData.sourceDeviceId); + } + + void checkPropertyUpdates() + { + // GIVEN + QScopedPointer<Qt3DInput::QAnalogAxisInput> axisInput(new Qt3DInput::QAnalogAxisInput()); + TestArbiter arbiter(axisInput.data()); + + // WHEN + axisInput->setAxis(350); + QCoreApplication::processEvents(); + + // THEN + QCOMPARE(arbiter.events.size(), 1); + Qt3DCore::QNodePropertyChangePtr change = arbiter.events.first().staticCast<Qt3DCore::QNodePropertyChange>(); + QCOMPARE(change->propertyName(), "axis"); + QCOMPARE(change->value().toInt(), 350); + QCOMPARE(change->type(), Qt3DCore::NodeUpdated); + + arbiter.events.clear(); + + // WHEN + TestDevice *device = new TestDevice(axisInput.data()); + QCoreApplication::processEvents(); + arbiter.events.clear(); + + axisInput->setSourceDevice(device); + QCoreApplication::processEvents(); + + // THEN + QCOMPARE(arbiter.events.size(), 1); + change = arbiter.events.first().staticCast<Qt3DCore::QNodePropertyChange>(); + QCOMPARE(change->propertyName(), "sourceDevice"); + QCOMPARE(change->value().value<Qt3DCore::QNodeId>(), device->id()); + QCOMPARE(change->type(), Qt3DCore::NodeUpdated); + + arbiter.events.clear(); + } +}; + +QTEST_MAIN(tst_QAnalogAxisInput) + +#include "tst_qanalogaxisinput.moc" diff --git a/tests/auto/input/qaxisinput/tst_qaxisinput.cpp b/tests/auto/input/qaxisinput/tst_qaxisinput.cpp index 465d85ee2..d34060e05 100644 --- a/tests/auto/input/qaxisinput/tst_qaxisinput.cpp +++ b/tests/auto/input/qaxisinput/tst_qaxisinput.cpp @@ -55,15 +55,10 @@ private Q_SLOTS: Qt3DInput::QAxisInput *defaultConstructed = new Qt3DInput::QAxisInput(); QTest::newRow("defaultConstructed") << defaultConstructed; - Qt3DInput::QAxisInput *axisInputWithAxis = new Qt3DInput::QAxisInput(); - axisInputWithAxis->setAxis(383); - QTest::newRow("axisInputWithAxis") << axisInputWithAxis; - - Qt3DInput::QAxisInput *axisInputWithAxisAndSourceDevice = new Qt3DInput::QAxisInput(); + Qt3DInput::QAxisInput *axisInputWithSourceDevice = new Qt3DInput::QAxisInput(); TestDevice *device = new TestDevice(); - axisInputWithAxisAndSourceDevice->setSourceDevice(device); - axisInputWithAxisAndSourceDevice->setAxis(427); - QTest::newRow("axisInputWithAxisAndSourceDevice") << axisInputWithAxisAndSourceDevice; + axisInputWithSourceDevice->setSourceDevice(device); + QTest::newRow("axisInputWithSourceDevice") << axisInputWithSourceDevice; } void checkCloning() @@ -86,7 +81,6 @@ private Q_SLOTS: QCOMPARE(axisInput->id(), creationChangeData->subjectId()); QCOMPARE(axisInput->isEnabled(), creationChangeData->isNodeEnabled()); QCOMPARE(axisInput->metaObject(), creationChangeData->metaObject()); - QCOMPARE(axisInput->axis(), cloneData.axis); QCOMPARE(axisInput->sourceDevice() ? axisInput->sourceDevice()->id() : Qt3DCore::QNodeId(), cloneData.sourceDeviceId); } @@ -97,19 +91,6 @@ private Q_SLOTS: TestArbiter arbiter(axisInput.data()); // WHEN - axisInput->setAxis(350); - QCoreApplication::processEvents(); - - // THEN - QCOMPARE(arbiter.events.size(), 1); - Qt3DCore::QNodePropertyChangePtr change = arbiter.events.first().staticCast<Qt3DCore::QNodePropertyChange>(); - QCOMPARE(change->propertyName(), "axis"); - QCOMPARE(change->value().toInt(), 350); - QCOMPARE(change->type(), Qt3DCore::NodeUpdated); - - arbiter.events.clear(); - - // WHEN TestDevice *device = new TestDevice(axisInput.data()); QCoreApplication::processEvents(); arbiter.events.clear(); @@ -119,7 +100,7 @@ private Q_SLOTS: // THEN QCOMPARE(arbiter.events.size(), 1); - change = arbiter.events.first().staticCast<Qt3DCore::QNodePropertyChange>(); + Qt3DCore::QNodePropertyChangePtr change = arbiter.events.first().staticCast<Qt3DCore::QNodePropertyChange>(); QCOMPARE(change->propertyName(), "sourceDevice"); QCOMPARE(change->value().value<Qt3DCore::QNodeId>(), device->id()); QCOMPARE(change->type(), Qt3DCore::NodeUpdated); diff --git a/tests/auto/input/qbuttonaxisinput/tst_qbuttonaxisinput.cpp b/tests/auto/input/qbuttonaxisinput/tst_qbuttonaxisinput.cpp index 62c6d8c3d..ebd266e06 100644 --- a/tests/auto/input/qbuttonaxisinput/tst_qbuttonaxisinput.cpp +++ b/tests/auto/input/qbuttonaxisinput/tst_qbuttonaxisinput.cpp @@ -55,17 +55,15 @@ private Q_SLOTS: Qt3DInput::QButtonAxisInput *defaultConstructed = new Qt3DInput::QButtonAxisInput(); QTest::newRow("defaultConstructed") << defaultConstructed; - Qt3DInput::QButtonAxisInput *axisInputWithKeysAndAxis = new Qt3DInput::QButtonAxisInput(); - axisInputWithKeysAndAxis->setButtons(QVariantList() << QVariant((1 << 1) | (1 << 5))); - axisInputWithKeysAndAxis->setAxis(383); - axisInputWithKeysAndAxis->setScale(327.0f); - QTest::newRow("axisInputWithKeys") << axisInputWithKeysAndAxis; + Qt3DInput::QButtonAxisInput *axisInputWithKeys = new Qt3DInput::QButtonAxisInput(); + axisInputWithKeys->setButtons(QVariantList() << QVariant((1 << 1) | (1 << 5))); + axisInputWithKeys->setScale(327.0f); + QTest::newRow("axisInputWithKeys") << axisInputWithKeys; Qt3DInput::QButtonAxisInput *axisInputWithKeysAndSourceDevice = new Qt3DInput::QButtonAxisInput(); TestDevice *device = new TestDevice(); axisInputWithKeysAndSourceDevice->setButtons(QVariantList() << QVariant((1 << 1) | (1 << 5))); axisInputWithKeysAndSourceDevice->setSourceDevice(device); - axisInputWithKeysAndSourceDevice->setAxis(427); axisInputWithKeysAndSourceDevice->setScale(355.0f); QTest::newRow("axisInputWithKeysAndSourceDevice") << axisInputWithKeysAndSourceDevice; } @@ -89,7 +87,6 @@ private Q_SLOTS: QCOMPARE(axisInput->isEnabled(), creationChangeData->isNodeEnabled()); QCOMPARE(axisInput->metaObject(), creationChangeData->metaObject()); QCOMPARE(axisInput->buttons(), cloneData.buttons); - QCOMPARE(axisInput->axis(), cloneData.axis); QCOMPARE(axisInput->scale(), cloneData.scale); QCOMPARE(axisInput->sourceDevice() ? axisInput->sourceDevice()->id() : Qt3DCore::QNodeId(), cloneData.sourceDeviceId); } @@ -128,19 +125,6 @@ private Q_SLOTS: arbiter.events.clear(); // WHEN - axisInput->setAxis(350); - QCoreApplication::processEvents(); - - // THEN - QCOMPARE(arbiter.events.size(), 1); - change = arbiter.events.first().staticCast<Qt3DCore::QNodePropertyChange>(); - QCOMPARE(change->propertyName(), "axis"); - QCOMPARE(change->value().toInt(), 350); - QCOMPARE(change->type(), Qt3DCore::NodeUpdated); - - arbiter.events.clear(); - - // WHEN TestDevice *device = new TestDevice(axisInput.data()); QCoreApplication::processEvents(); arbiter.events.clear(); |