diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2015-12-01 18:20:47 +0100 |
---|---|---|
committer | Sean Harmer <sean.harmer@kdab.com> | 2015-12-04 19:07:25 +0000 |
commit | ad086d65f3a24cf2ec8f0dbd17ed90b4c7d2bcc5 (patch) | |
tree | 0276e639daec019de727ba91391ce222b9759e78 /src/input/frontend | |
parent | 670d242385172262f802f378c996545cd328ca94 (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.cpp | 21 | ||||
-rw-r--r-- | src/input/frontend/qaxisactionhandler.h | 1 | ||||
-rw-r--r-- | src/input/frontend/qinputaspect.cpp | 30 |
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; } |