summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2015-12-02 12:50:42 +0100
committerSean Harmer <sean.harmer@kdab.com>2015-12-04 19:07:29 +0000
commitae4b285959cb901ed9dc9f328116a5ea8e22d4ef (patch)
tree3a21690d19af18a048a4ff24762035b562827f41 /src
parenteb1f2fb369d41787d9a96bd89018c1951c677b48 (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.cpp33
-rw-r--r--src/input/backend/axisactionhandler_p.h9
-rw-r--r--src/input/backend/axisactionpayload_p.h37
-rw-r--r--src/input/backend/updateaxisactionjob.cpp1
-rw-r--r--src/input/backend/updatehandlerjob.cpp73
-rw-r--r--src/input/backend/updatehandlerjob_p.h3
-rw-r--r--src/input/frontend/qaxisactionhandler.cpp26
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