diff options
author | Colin Ogilvie <colin.ogilvie@kdab.com> | 2016-02-04 17:35:54 +0000 |
---|---|---|
committer | Sean Harmer <sean.harmer@kdab.com> | 2016-05-12 09:39:51 +0000 |
commit | c3e628f334b54a883ae5d5f83630855bd0f052d0 (patch) | |
tree | 5da059d969d9c6b53fcc98160bc6951ac6cb2b5c /src/input | |
parent | faf56f50608f9391d2a73ed7c61bfdd9c2afab78 (diff) |
Linear scaling for key controlled axis
Change-Id: I429fc512a836d569a55f0ac6490d020f1e8c2808
Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Diffstat (limited to 'src/input')
-rw-r--r-- | src/input/backend/buttonaxisinput.cpp | 30 | ||||
-rw-r--r-- | src/input/backend/buttonaxisinput_p.h | 17 | ||||
-rw-r--r-- | src/input/backend/updateaxisactionjob.cpp | 6 | ||||
-rw-r--r-- | src/input/backend/updateaxisactionjob_p.h | 1 | ||||
-rw-r--r-- | src/input/frontend/qbuttonaxisinput.cpp | 32 | ||||
-rw-r--r-- | src/input/frontend/qbuttonaxisinput.h | 11 | ||||
-rw-r--r-- | src/input/frontend/qbuttonaxisinput_p.h | 6 |
7 files changed, 102 insertions, 1 deletions
diff --git a/src/input/backend/buttonaxisinput.cpp b/src/input/backend/buttonaxisinput.cpp index 6f9040eae..6042b2eff 100644 --- a/src/input/backend/buttonaxisinput.cpp +++ b/src/input/backend/buttonaxisinput.cpp @@ -52,6 +52,10 @@ namespace Input { ButtonAxisInput::ButtonAxisInput() : AbstractAxisInput() , m_scale(0.0f) + , m_acceleration(-1.0f) + , m_deceleration(-1.0f) + , m_speedRatio(0.0f) + , m_lastUpdateTime(0) { } @@ -61,6 +65,8 @@ void ButtonAxisInput::initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBaseP const auto &data = typedChange->data; m_buttons = data.buttons; m_scale = data.scale; + m_acceleration = data.acceleration; + m_deceleration = data.deceleration; AbstractAxisInput::initializeFromPeer(change); } @@ -68,9 +74,29 @@ void ButtonAxisInput::cleanup() { m_scale = 0.0f; m_buttons.clear(); + m_acceleration = -1.0f; + m_deceleration = -1.0f; AbstractAxisInput::cleanup(); } +void ButtonAxisInput::updateSpeedRatio(qint64 currentTime, ButtonAxisInput::UpdateType type) +{ + const float accel = (type == Accelerate) ? acceleration() : -deceleration(); + + // Was in nanoseconds, while acceleration will be in units per square seconds + const float delta = m_lastUpdateTime ? (currentTime - m_lastUpdateTime) / 1000000000.0f : 0.0f; + const float speedRatio = m_speedRatio + delta * accel; + + // Clamp it + m_speedRatio = qMax(0.0f, qMin(speedRatio, 1.0f)); + + // If we stopped, time to start over + if (type == Decelerate && m_speedRatio == 0.0f) + m_lastUpdateTime = 0; + else + m_lastUpdateTime = currentTime; +} + void ButtonAxisInput::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) { if (e->type() == Qt3DCore::PropertyUpdated) { @@ -79,6 +105,10 @@ void ButtonAxisInput::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) m_scale = propertyChange->value().toFloat(); } else if (propertyChange->propertyName() == QByteArrayLiteral("buttons")) { m_buttons = propertyChange->value().value<QVector<int>>(); + } else if (propertyChange->propertyName() == QByteArrayLiteral("acceleration")) { + m_acceleration = propertyChange->value().toFloat(); + } else if (propertyChange->propertyName() == QByteArrayLiteral("deceleration")) { + m_deceleration = propertyChange->value().toFloat(); } } AbstractAxisInput::sceneChangeEvent(e); diff --git a/src/input/backend/buttonaxisinput_p.h b/src/input/backend/buttonaxisinput_p.h index 72f043bf4..9e82a6ebc 100644 --- a/src/input/backend/buttonaxisinput_p.h +++ b/src/input/backend/buttonaxisinput_p.h @@ -62,11 +62,24 @@ namespace Input { class Q_AUTOTEST_EXPORT ButtonAxisInput : public AbstractAxisInput { public: + enum UpdateType { + Accelerate, + Decelerate + }; + ButtonAxisInput(); void cleanup() Q_DECL_FINAL; inline float scale() const { return m_scale; } inline QVector<int> buttons() const { return m_buttons; } + + inline float acceleration() const { return m_acceleration < 0.0f ? qInf() : m_acceleration; } + inline float deceleration() const { return m_deceleration < 0.0f ? qInf() : m_deceleration; } + inline float speedRatio() const { return m_speedRatio; } + inline qint64 lastUpdateTime() const { return m_lastUpdateTime; } + + void updateSpeedRatio(qint64 currentTime, UpdateType type); + void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) Q_DECL_FINAL; private: @@ -74,6 +87,10 @@ private: QVector<int> m_buttons; float m_scale; + float m_acceleration; + float m_deceleration; + float m_speedRatio; + qint64 m_lastUpdateTime; }; } // namespace Input diff --git a/src/input/backend/updateaxisactionjob.cpp b/src/input/backend/updateaxisactionjob.cpp index 63e7ff658..f811c9ac0 100644 --- a/src/input/backend/updateaxisactionjob.cpp +++ b/src/input/backend/updateaxisactionjob.cpp @@ -188,7 +188,11 @@ void UpdateAxisActionJob::updateAxis(LogicalDevice *device) if (!buttons.isEmpty()) { // TO DO: Linear Curver for the progression of the scale value if (anyOfRequiredButtonsPressed(buttons, physicalDeviceBackend)) - axisValue += buttonInput->scale(); + buttonInput->updateSpeedRatio(m_currentTime, ButtonAxisInput::Accelerate); + else if (buttonInput->speedRatio() != 0.0f) + buttonInput->updateSpeedRatio(m_currentTime, ButtonAxisInput::Decelerate); + + axisValue += buttonInput->speedRatio() * buttonInput->scale(); } } diff --git a/src/input/backend/updateaxisactionjob_p.h b/src/input/backend/updateaxisactionjob_p.h index 5a412c46c..3b71e7a88 100644 --- a/src/input/backend/updateaxisactionjob_p.h +++ b/src/input/backend/updateaxisactionjob_p.h @@ -64,6 +64,7 @@ class QAbstractPhysicalDeviceBackendNode; namespace Input { class AbstractAxisInput; +class ButtonAxisInput; class InputHandler; class UpdateAxisActionJob : public Qt3DCore::QAspectJob diff --git a/src/input/frontend/qbuttonaxisinput.cpp b/src/input/frontend/qbuttonaxisinput.cpp index 0a5ac2156..f392605aa 100644 --- a/src/input/frontend/qbuttonaxisinput.cpp +++ b/src/input/frontend/qbuttonaxisinput.cpp @@ -96,6 +96,36 @@ QVector<int> QButtonAxisInput::buttons() const return d->m_buttons; } +float QButtonAxisInput::acceleration() const +{ + Q_D(const QButtonAxisInput); + return d->m_acceleration; +} + +void QButtonAxisInput::setAcceleration(float acceleration) +{ + Q_D(QButtonAxisInput); + if (d->m_acceleration != acceleration) { + d->m_acceleration = acceleration; + emit accelerationChanged(acceleration); + } +} + +float QButtonAxisInput::deceleration() const +{ + Q_D(const QButtonAxisInput); + return d->m_deceleration; +} + +void QButtonAxisInput::setDeceleration(float deceleration) +{ + Q_D(QButtonAxisInput); + if (d->m_deceleration != deceleration) { + d->m_deceleration = deceleration; + emit decelerationChanged(deceleration); + } +} + Qt3DCore::QNodeCreatedChangeBasePtr QButtonAxisInput::createNodeCreationChange() const { auto creationChange = Qt3DCore::QNodeCreatedChangePtr<QButtonAxisInputData>::create(this); @@ -105,6 +135,8 @@ Qt3DCore::QNodeCreatedChangeBasePtr QButtonAxisInput::createNodeCreationChange() data.sourceDeviceId = qIdForNode(d->m_sourceDevice); data.buttons = d->m_buttons; data.scale = d->m_scale; + data.acceleration = d->m_acceleration; + data.deceleration = d->m_deceleration; return creationChange; } diff --git a/src/input/frontend/qbuttonaxisinput.h b/src/input/frontend/qbuttonaxisinput.h index 2b551b8fb..cb2cb891e 100644 --- a/src/input/frontend/qbuttonaxisinput.h +++ b/src/input/frontend/qbuttonaxisinput.h @@ -54,6 +54,8 @@ class QT3DINPUTSHARED_EXPORT QButtonAxisInput : public QAbstractAxisInput Q_OBJECT Q_PROPERTY(float scale READ scale WRITE setScale NOTIFY scaleChanged) Q_PROPERTY(QVector<int> buttons READ buttons WRITE setButtons NOTIFY buttonsChanged) + Q_PROPERTY(float acceleration READ acceleration WRITE setAcceleration NOTIFY accelerationChanged) + Q_PROPERTY(float deceleration READ deceleration WRITE setDeceleration NOTIFY decelerationChanged) public: explicit QButtonAxisInput(Qt3DCore::QNode *parent = nullptr); @@ -61,14 +63,23 @@ public: float scale() const; QVector<int> buttons() const; + float acceleration() const; + float deceleration() const; + public Q_SLOTS: void setScale(float scale); void setButtons(const QVector<int> &buttons); + void setAcceleration(float acceleration); + void setDeceleration(float deceleration); + Q_SIGNALS: void scaleChanged(float scale); void buttonsChanged(const QVector<int> &buttons); + void accelerationChanged(float acceleration); + void decelerationChanged(float deceleration); + private: Q_DECLARE_PRIVATE(QButtonAxisInput) Qt3DCore::QNodeCreatedChangeBasePtr createNodeCreationChange() const Q_DECL_OVERRIDE; diff --git a/src/input/frontend/qbuttonaxisinput_p.h b/src/input/frontend/qbuttonaxisinput_p.h index 5cd672bd9..e56e58575 100644 --- a/src/input/frontend/qbuttonaxisinput_p.h +++ b/src/input/frontend/qbuttonaxisinput_p.h @@ -63,16 +63,22 @@ public: QButtonAxisInputPrivate() : QAbstractAxisInputPrivate() , m_scale(0.0f) + , m_acceleration(-1.0f) + , m_deceleration(-1.0f) {} QVector<int> m_buttons; float m_scale; + float m_acceleration; + float m_deceleration; }; struct QButtonAxisInputData : public QAbstractAxisInputData { QVector<int> buttons; float scale; + float acceleration; + float deceleration; }; } // Qt3DInput |