summaryrefslogtreecommitdiffstats
path: root/src/input/frontend
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2015-12-01 18:20:47 +0100
committerSean Harmer <sean.harmer@kdab.com>2015-12-04 19:07:25 +0000
commitad086d65f3a24cf2ec8f0dbd17ed90b4c7d2bcc5 (patch)
tree0276e639daec019de727ba91391ce222b9759e78 /src/input/frontend
parent670d242385172262f802f378c996545cd328ca94 (diff)
Transmit axis/action updates to QAxisActionHandler
Change-Id: I4d1fbc3e06ff649ef73cb6a3f2458a8147a7151d Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Diffstat (limited to 'src/input/frontend')
-rw-r--r--src/input/frontend/qaxisactionhandler.cpp21
-rw-r--r--src/input/frontend/qaxisactionhandler.h1
-rw-r--r--src/input/frontend/qinputaspect.cpp30
3 files changed, 41 insertions, 11 deletions
diff --git a/src/input/frontend/qaxisactionhandler.cpp b/src/input/frontend/qaxisactionhandler.cpp
index 8f493cf9e..ae47ab519 100644
--- a/src/input/frontend/qaxisactionhandler.cpp
+++ b/src/input/frontend/qaxisactionhandler.cpp
@@ -38,6 +38,8 @@
#include "qaxisactionhandler_p.h"
#include <Qt3DInput/qlogicaldevice.h>
+#include <Qt3DInput/private/axisactionpayload_p.h>
+#include <Qt3DCore/qbackendscenepropertychange.h>
QT_BEGIN_NAMESPACE
@@ -88,6 +90,25 @@ void QAxisActionHandler::copy(const QNode *ref)
d_func()->m_logicalDevice = qobject_cast<QLogicalDevice *>(QNode::clone(component->d_func()->m_logicalDevice));
}
+void QAxisActionHandler::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &change)
+{
+ Qt3DCore::QBackendScenePropertyChangePtr e = qSharedPointerCast<Qt3DCore::QBackendScenePropertyChange>(change);
+ if (e->type() == Qt3DCore::NodeUpdated && e->propertyName() == QByteArrayLiteral("payload")) {
+ Qt3DInput::Input::AxisActionPayload payload = e->value().value<Qt3DInput::Input::AxisActionPayload>();
+
+ Q_FOREACH (const Qt3DInput::Input::AxisUpdate &axisUpdate, payload.axes)
+ axisValueChanged(axisUpdate.name, axisUpdate.value);
+
+ Q_FOREACH (const Qt3DInput::Input::ActionUpdate &actionUpdate, payload.actions) {
+ if (actionUpdate.triggered)
+ actionStarted(actionUpdate.name);
+ else
+ actionFinished(actionUpdate.name);
+ }
+ }
+
+}
+
QT_END_NAMESPACE
} // namespace Qt3DInput
diff --git a/src/input/frontend/qaxisactionhandler.h b/src/input/frontend/qaxisactionhandler.h
index 8d36bc0b3..388014f01 100644
--- a/src/input/frontend/qaxisactionhandler.h
+++ b/src/input/frontend/qaxisactionhandler.h
@@ -72,6 +72,7 @@ protected:
Q_DECLARE_PRIVATE(QAxisActionHandler)
QAxisActionHandler(QAxisActionHandlerPrivate &dd, Qt3DCore::QNode *parent = 0);
void copy(const Qt3DCore::QNode *ref) Q_DECL_OVERRIDE;
+ void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &change) Q_DECL_OVERRIDE;
private:
QT3D_CLONEABLE(QAxisActionHandler)
diff --git a/src/input/frontend/qinputaspect.cpp b/src/input/frontend/qinputaspect.cpp
index fc08b2959..65dbcfdee 100644
--- a/src/input/frontend/qinputaspect.cpp
+++ b/src/input/frontend/qinputaspect.cpp
@@ -73,6 +73,7 @@
#include <Qt3DInput/private/inputbackendnodefunctor_p.h>
#include <Qt3DInput/private/inputmanagers_p.h>
#include <Qt3DInput/private/updateaxisactionjob_p.h>
+#include <Qt3DInput/private/updatehandlerjob_p.h>
QT_BEGIN_NAMESPACE
@@ -169,24 +170,31 @@ QVector<QAspectJobPtr> QInputAspect::jobsToExecute(qint64 time)
jobs += integration->jobsToExecute(time);
// Jobs that update Axis/Action (store combined axis/action value)
- QVector<QAspectJobPtr> axisActionJobs;
+ QHash<Input::HLogicalDevice, QAspectJobPtr> logicalDeviceJobs;
+
Q_FOREACH (Input::HLogicalDevice devHandle, d->m_inputHandler->logicalDeviceManager()->activeDevices()) {
QAspectJobPtr updateAxisActionJob(new Input::UpdateAxisActionJob(d->m_inputHandler.data(), devHandle));
+ logicalDeviceJobs.insert(devHandle, updateAxisActionJob);
+
Q_FOREACH (const QAspectJobPtr job, jobs)
updateAxisActionJob->addDependency(job);
- axisActionJobs.push_back(updateAxisActionJob);
}
- jobs += axisActionJobs;
+ // Jobs that update the axisactionhandlers
+ Q_FOREACH (Input::HAxisActionHandler handlerHandle, d->m_inputHandler->axisActionHandlerManager()->activeAxisActionHandlers()) {
+ Input::AxisActionHandler *axisActionHandler = d->m_inputHandler->axisActionHandlerManager()->data(handlerHandle);
+ Input::HLogicalDevice logicalDeviceHandle = d->m_inputHandler->logicalDeviceManager()->lookupHandle(axisActionHandler->logicalDevice());
+ QAspectJobPtr updateHandlerJob(new Input::UpdateHandlerJob(axisActionHandler, logicalDeviceHandle, d->m_inputHandler.data()));
+
+ // Create AxisActionHandler Job
+ jobs += updateHandlerJob;
- // For each AxisActionInputHandler
- // Find the LogicalDevice
- // Find each Axis
- // Check if their values have changed since the last time
- // If so -> add to notification payload
- // Find each Action
- // Check if action state has changed since last frame
- // If so -> add to notification payload
+ QAspectJobPtr logicalDeviceJob = logicalDeviceJobs.value(logicalDeviceHandle);
+ if (logicalDeviceJob) {
+ updateHandlerJob->addDependency(logicalDeviceJob);
+ jobs += logicalDeviceJob;
+ }
+ }
return jobs;
}