summaryrefslogtreecommitdiffstats
path: root/src/input
diff options
context:
space:
mode:
authorColin Ogilvie <colin.ogilvie@kdab.com>2016-02-04 17:35:54 +0000
committerSean Harmer <sean.harmer@kdab.com>2016-05-12 09:39:51 +0000
commitc3e628f334b54a883ae5d5f83630855bd0f052d0 (patch)
tree5da059d969d9c6b53fcc98160bc6951ac6cb2b5c /src/input
parentfaf56f50608f9391d2a73ed7c61bfdd9c2afab78 (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.cpp30
-rw-r--r--src/input/backend/buttonaxisinput_p.h17
-rw-r--r--src/input/backend/updateaxisactionjob.cpp6
-rw-r--r--src/input/backend/updateaxisactionjob_p.h1
-rw-r--r--src/input/frontend/qbuttonaxisinput.cpp32
-rw-r--r--src/input/frontend/qbuttonaxisinput.h11
-rw-r--r--src/input/frontend/qbuttonaxisinput_p.h6
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