diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2015-12-02 12:50:42 +0100 |
---|---|---|
committer | Sean Harmer <sean.harmer@kdab.com> | 2015-12-04 19:07:29 +0000 |
commit | ae4b285959cb901ed9dc9f328116a5ea8e22d4ef (patch) | |
tree | 3a21690d19af18a048a4ff24762035b562827f41 /src | |
parent | eb1f2fb369d41787d9a96bd89018c1951c677b48 (diff) |
Further improve axis/action dispatch
Change-Id: I6c6dd6b6c78f1c348ef75f6dae4c68b64ba638b2
Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/input/backend/axisactionhandler.cpp | 33 | ||||
-rw-r--r-- | src/input/backend/axisactionhandler_p.h | 9 | ||||
-rw-r--r-- | src/input/backend/axisactionpayload_p.h | 37 | ||||
-rw-r--r-- | src/input/backend/updateaxisactionjob.cpp | 1 | ||||
-rw-r--r-- | src/input/backend/updatehandlerjob.cpp | 73 | ||||
-rw-r--r-- | src/input/backend/updatehandlerjob_p.h | 3 | ||||
-rw-r--r-- | src/input/frontend/qaxisactionhandler.cpp | 26 |
7 files changed, 122 insertions, 60 deletions
diff --git a/src/input/backend/axisactionhandler.cpp b/src/input/backend/axisactionhandler.cpp index 0090d73e7..fa6b05a7a 100644 --- a/src/input/backend/axisactionhandler.cpp +++ b/src/input/backend/axisactionhandler.cpp @@ -59,6 +59,7 @@ void AxisActionHandler::updateFromPeer(Qt3DCore::QNode *peer) Qt3DInput::QAxisActionHandler *handler = static_cast<Qt3DInput::QAxisActionHandler *>(peer); if (handler->logicalDevice()) m_logicalDevice = handler->logicalDevice()->id(); + // TO DO: Store the state of the actions } void AxisActionHandler::cleanup() @@ -66,18 +67,30 @@ void AxisActionHandler::cleanup() m_logicalDevice = Qt3DCore::QNodeId(); } -void AxisActionHandler::setAndTransmitPayload(const AxisActionPayload &payload) +void AxisActionHandler::setAndTransmitActionPayload(const ActionPayload &payloadState, const ActionPayload &deltaPayload) { - if (m_lastPayload == payload) - return; - - m_lastPayload = payload; + if (m_lastActionPayload != payloadState) { + m_lastActionPayload = payloadState; + + Qt3DCore::QBackendScenePropertyChangePtr e(new Qt3DCore::QBackendScenePropertyChange(Qt3DCore::NodeUpdated, peerUuid())); + e->setTargetNode(peerUuid()); + e->setPropertyName("actionPayload"); + e->setValue(QVariant::fromValue(deltaPayload)); + notifyObservers(e); + } +} - Qt3DCore::QBackendScenePropertyChangePtr e(new Qt3DCore::QBackendScenePropertyChange(Qt3DCore::NodeUpdated, peerUuid())); - e->setTargetNode(peerUuid()); - e->setPropertyName("payload"); - e->setValue(QVariant::fromValue(payload)); - notifyObservers(e); +void AxisActionHandler::setAndTransmitAxisPayload(const AxisPayload &payload) +{ + if (m_lastAxisPayload != payload) { + m_lastAxisPayload = payload; + + Qt3DCore::QBackendScenePropertyChangePtr e(new Qt3DCore::QBackendScenePropertyChange(Qt3DCore::NodeUpdated, peerUuid())); + e->setTargetNode(peerUuid()); + e->setPropertyName("axisPayload"); + e->setValue(QVariant::fromValue(payload)); + notifyObservers(e); + } } void AxisActionHandler::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) diff --git a/src/input/backend/axisactionhandler_p.h b/src/input/backend/axisactionhandler_p.h index 2a20b3fa5..31efe03de 100644 --- a/src/input/backend/axisactionhandler_p.h +++ b/src/input/backend/axisactionhandler_p.h @@ -66,15 +66,18 @@ public: void updateFromPeer(Qt3DCore::QNode *peer) Q_DECL_OVERRIDE; void cleanup(); inline Qt3DCore::QNodeId logicalDevice() const { return m_logicalDevice; } - void setAndTransmitPayload(const AxisActionPayload &payload); - inline AxisActionPayload lastPayload() const { return m_lastPayload; } + void setAndTransmitActionPayload(const ActionPayload &payloadState, const ActionPayload &deltaPayload); + void setAndTransmitAxisPayload(const AxisPayload &payload); + inline AxisPayload lastAxisPayload() const { return m_lastAxisPayload; } + inline ActionPayload lastActionPayload() const { return m_lastActionPayload; } protected: void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) Q_DECL_OVERRIDE; private: Qt3DCore::QNodeId m_logicalDevice; - AxisActionPayload m_lastPayload; + AxisPayload m_lastAxisPayload; + ActionPayload m_lastActionPayload; }; class AxisActionHandlerNodeFunctor : public Qt3DCore::QBackendNodeFunctor diff --git a/src/input/backend/axisactionpayload_p.h b/src/input/backend/axisactionpayload_p.h index cb5160e76..1d4144aac 100644 --- a/src/input/backend/axisactionpayload_p.h +++ b/src/input/backend/axisactionpayload_p.h @@ -49,6 +49,7 @@ // #include <Qt3DInput/qt3dinput_global.h> +#include <Qt3DCore/qnodeid.h> #include <QDebug> QT_BEGIN_NAMESPACE @@ -59,34 +60,55 @@ namespace Input { struct AxisUpdate { + Qt3DCore::QNodeId id; QString name; float value; bool operator ==(const AxisUpdate &other) const { - return (name == other.name) && qFuzzyCompare(value, other.value); + return (id == other.id) && qFuzzyCompare(value, other.value); } }; struct ActionUpdate { + Qt3DCore::QNodeId id; QString name; bool triggered; bool operator ==(const ActionUpdate &other) const { - return (name == other.name) && (triggered == other.triggered); + return (id == other.id) && (triggered == other.triggered); } }; -struct AxisActionPayload +struct ActionPayload { - QVector<AxisUpdate> axes; QVector<ActionUpdate> actions; - bool operator ==(const AxisActionPayload &other) const + bool operator ==(const ActionPayload &other) const + { + return actions == other.actions; + } + + bool operator !=(const ActionPayload &other) const + { + return !(*this == other); + } +}; + +struct AxisPayload +{ + QVector<AxisUpdate> axes; + + bool operator ==(const AxisPayload &other) const + { + return axes == other.axes; + } + + bool operator !=(const AxisPayload &other) const { - return /*(axes == other.axes) &&*/ (actions == other.actions); + return !(*this == other); } }; @@ -96,7 +118,8 @@ struct AxisActionPayload QT_END_NAMESPACE -Q_DECLARE_METATYPE(Qt3DInput::Input::AxisActionPayload); +Q_DECLARE_METATYPE(Qt3DInput::Input::AxisPayload); +Q_DECLARE_METATYPE(Qt3DInput::Input::ActionPayload); #endif // QT3DINPUT_INPUT_AXISACTIONPAYLOAD_P_H diff --git a/src/input/backend/updateaxisactionjob.cpp b/src/input/backend/updateaxisactionjob.cpp index 8cb5c01f3..e89f70ec6 100644 --- a/src/input/backend/updateaxisactionjob.cpp +++ b/src/input/backend/updateaxisactionjob.cpp @@ -99,7 +99,6 @@ void UpdateAxisActionJob::updateAction(LogicalDevice *device) actionTriggered |= anyOfRequiredKeysPressed(actionInput->keys(), physicalDeviceBackend); } } - action->setActionTriggered(actionTriggered); } } diff --git a/src/input/backend/updatehandlerjob.cpp b/src/input/backend/updatehandlerjob.cpp index ca8bd3579..149c10f80 100644 --- a/src/input/backend/updatehandlerjob.cpp +++ b/src/input/backend/updatehandlerjob.cpp @@ -49,18 +49,18 @@ namespace Input namespace { -int containsAxis(const QString &axisName, const AxisActionPayload &payload) +int containsAxis(const Qt3DCore::QNodeId axisId, const AxisPayload &payload) { for (int i = 0, m = payload.axes.size(); i < m; ++i) - if (payload.axes.at(i).name == axisName) + if (payload.axes.at(i).id == axisId) return i; return -1; } -int containsAction(const QString &actionName, const AxisActionPayload &payload) +int containsAction(const Qt3DCore::QNodeId actionId, const ActionPayload &payload) { for (int i = 0, m = payload.actions.size(); i < m; ++i) - if (payload.actions.at(i).name == actionName) + if (payload.actions.at(i).id == actionId) return i; return -1; } @@ -80,52 +80,71 @@ void UpdateHandlerJob::run() // 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 - AxisActionPayload payload; // = m_axisActionHandler->lastPayload(); LogicalDevice *logicalDevice = m_handler->logicalDeviceManager()->data(m_logicalDeviceHandle); + updateActions(logicalDevice); + updateAxes(logicalDevice); +} + +void UpdateHandlerJob::updateAxes(LogicalDevice *device) +{ + AxisPayload payload = m_axisActionHandler->lastAxisPayload(); - Q_FOREACH (const Qt3DCore::QNodeId axesId, logicalDevice->axes()) { - const Axis *axis = m_handler->axisManager()->lookupResource(axesId); - const int axisPositionInPayload = containsAxis(axis->name(), payload); + Q_FOREACH (const Qt3DCore::QNodeId axisId, device->axes()) { + const Axis *axis = m_handler->axisManager()->lookupResource(axisId); + const int axisPositionInPayload = containsAxis(axisId, payload); if (axisPositionInPayload < 0) { // Not contained in the payload AxisUpdate axisUpdate; axisUpdate.name = axis->name(); + axisUpdate.id = axisId; axisUpdate.value = axis->axisValue(); payload.axes.push_back(axisUpdate); } else { // The axis has the same value as before -> remove from the payload - if (payload.axes.at(axisPositionInPayload).value == axis->axisValue()) - payload.axes.removeAt(axisPositionInPayload); - else + if (payload.axes.at(axisPositionInPayload).value != axis->axisValue()) payload.axes[axisPositionInPayload].value = axis->axisValue(); } } - Q_FOREACH (const Qt3DCore::QNodeId actionId, logicalDevice->actions()) { + m_axisActionHandler->setAndTransmitAxisPayload(payload); +} + +void UpdateHandlerJob::updateActions(LogicalDevice *device) +{ + ActionPayload payload; + + // Push each action into the payload to build the current action state for the frame + Q_FOREACH (const Qt3DCore::QNodeId actionId, device->actions()) { const Action *action = m_handler->actionManager()->lookupResource(actionId); - const int actionPositionInPayload = containsAction(action->name(), payload); + ActionUpdate actionUpdate; + actionUpdate.name = action->name(); + actionUpdate.id = actionId; + actionUpdate.triggered = action->actionTriggered(); + payload.actions.push_back(actionUpdate); + } - if (actionPositionInPayload < 0) { - // Not contained in the payload - ActionUpdate actionUpdate; - actionUpdate.name = action->name(); - actionUpdate.triggered = action->actionTriggered(); - payload.actions.push_back(actionUpdate); - } else { - // The stored action has the same triggered flas as the current action -> no change - if (payload.actions.at(actionPositionInPayload).triggered == action->actionTriggered()) - payload.actions.removeAt(actionPositionInPayload); - else - payload.actions[actionPositionInPayload].triggered = action->actionTriggered(); - } + // Compare the action state against the previous payload state + ActionPayload oldPayload = m_axisActionHandler->lastActionPayload(); + ActionPayload deltaPayload; + + // Build up a delta payload + Q_FOREACH (const ActionUpdate &actionUpdate, payload.actions) { + const int posOfActionInOldPayload = containsAction(actionUpdate.id, oldPayload); + // If the action is not in the old payload or + // is in the old payload state but has a different value + // we add it to the delta payload + if (posOfActionInOldPayload < 0 || + oldPayload.actions.at(posOfActionInOldPayload).triggered != actionUpdate.triggered) + deltaPayload.actions.push_back(actionUpdate); } - m_axisActionHandler->setAndTransmitPayload(payload); + m_axisActionHandler->setAndTransmitActionPayload(payload, deltaPayload); } } // Input diff --git a/src/input/backend/updatehandlerjob_p.h b/src/input/backend/updatehandlerjob_p.h index 2ba151373..9d94f44c1 100644 --- a/src/input/backend/updatehandlerjob_p.h +++ b/src/input/backend/updatehandlerjob_p.h @@ -72,6 +72,9 @@ private: AxisActionHandler *m_axisActionHandler; HLogicalDevice m_logicalDeviceHandle; InputHandler *m_handler; + + void updateAxes(LogicalDevice *device); + void updateActions(LogicalDevice *device); }; typedef QScopedPointer<UpdateHandlerJob> UpdateHandlerJobPtr; diff --git a/src/input/frontend/qaxisactionhandler.cpp b/src/input/frontend/qaxisactionhandler.cpp index ae47ab519..d69400e5b 100644 --- a/src/input/frontend/qaxisactionhandler.cpp +++ b/src/input/frontend/qaxisactionhandler.cpp @@ -93,20 +93,22 @@ void QAxisActionHandler::copy(const QNode *ref) 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); + if (e->type() == Qt3DCore::NodeUpdated) { + if (e->propertyName() == QByteArrayLiteral("axisPayload")) { + Qt3DInput::Input::AxisPayload payload = e->value().value<Qt3DInput::Input::AxisPayload>(); + Q_FOREACH (const Qt3DInput::Input::AxisUpdate &axisUpdate, payload.axes) + axisValueChanged(axisUpdate.name, axisUpdate.value); + + } else if (e->propertyName() == QByteArrayLiteral("actionPayload")) { + Qt3DInput::Input::ActionPayload payload = e->value().value<Qt3DInput::Input::ActionPayload>(); + Q_FOREACH (const Qt3DInput::Input::ActionUpdate &actionUpdate, payload.actions) { + if (actionUpdate.triggered) + actionStarted(actionUpdate.name); + else + actionFinished(actionUpdate.name); + } } } - } QT_END_NAMESPACE |