summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@qt.io>2019-01-11 12:26:06 +0200
committerMiikka Heikkinen <miikka.heikkinen@qt.io>2019-01-14 12:19:03 +0000
commit7c203cb04362c246c709285d583052ec1358e7de (patch)
treeecea2a8c97ec828287b10f76526a7450ab672e93
parent85ce7c19c965f3dfdbc3eaf7365e8e6d5dc81a3d (diff)
Make it possible to detect pick failures with Q3DSScenePicker
Added state information to Q3DSScenePicker. This is useful for example determining whether or not to wait for the response to the pick request before reusing the picker. Task-number: QT3DS-2897 Change-Id: I42567a8cef4a1fba10c6f75af39eedddac451a00 Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io> Reviewed-by: Antti Määttä <antti.maatta@qt.io>
-rw-r--r--src/runtime/q3dsinputmanager.cpp19
-rw-r--r--src/runtime/q3dsscenepicker.cpp6
-rw-r--r--src/runtime/q3dsscenepicker_p.h15
3 files changed, 38 insertions, 2 deletions
diff --git a/src/runtime/q3dsinputmanager.cpp b/src/runtime/q3dsinputmanager.cpp
index cd42a0e..6387a1b 100644
--- a/src/runtime/q3dsinputmanager.cpp
+++ b/src/runtime/q3dsinputmanager.cpp
@@ -190,6 +190,7 @@ void Q3DSInputManager::castRayIntoLayer(Q3DSLayerNode *layer, const QPointF &pos
e.eventId = eventId;
e.picker = picker;
layerData->rayCastQueue.enqueue(e);
+ picker->setState(Q3DSScenePicker::Queued);
castNextRay(layer);
}
@@ -198,7 +199,13 @@ void Q3DSInputManager::castNextRay(Q3DSLayerNode *layer)
{
auto layerData = static_cast<Q3DSLayerAttached *>(layer->attached());
if (!layerData->layerRayCaster) {
- layerData->rayCastQueue.clear();
+ while (!layerData->rayCastQueue.isEmpty()) {
+ Q3DSLayerAttached::RayCastQueueEntry e = layerData->rayCastQueue.dequeue();
+ if (e.picker) {
+ e.picker->setState(Q3DSScenePicker::Failed);
+ e.picker->pickReady();
+ }
+ }
return;
}
if (layerData->rayCasterBusy || layerData->rayCastQueue.isEmpty())
@@ -225,6 +232,7 @@ void Q3DSInputManager::castNextRay(Q3DSLayerNode *layer)
qCDebug(lcInput) << " hit node is" << node->id();
picker->addPick(node, qreal(hit.distance()));
}
+ picker->setState(Q3DSScenePicker::Ready);
picker->pickReady();
} else {
for (auto hit : hits) {
@@ -245,6 +253,7 @@ void Q3DSInputManager::castNextRay(Q3DSLayerNode *layer)
m_connectionMap.insert(e.eventId, connection);
layerData->rayCasterBusy = true;
+ e.picker->setState(Q3DSScenePicker::Triggered);
rayCaster->trigger();
}
@@ -287,6 +296,9 @@ QPoint Q3DSInputManager::convertToViewportSpace(const QPoint &point) const
void Q3DSInputManager::pick(const QPoint &point, const InputState &inputState, Q3DSScenePicker *picker)
{
+ // Make sure pickers are not reused until user has reset them
+ Q_ASSERT(picker->state() == Q3DSScenePicker::Unqueued);
+
// Get a list of layers in this scene (in order)
QVarLengthArray<Q3DSLayerNode *, 16> layers;
Q3DSUipPresentation::forAllLayers(m_sceneManager->m_scene, [&layers](Q3DSLayerNode *layer3DS) {
@@ -306,6 +318,11 @@ void Q3DSInputManager::pick(const QPoint &point, const InputState &inputState, Q
qCDebug(lcInput) << "pick" << point << "does not intersect with layer" << layer3DS->id();
}
}
+
+ if (picker->state() == Q3DSScenePicker::Unqueued) {
+ picker->setState(Q3DSScenePicker::Failed);
+ picker->pickReady();
+ }
}
void Q3DSInputManager::pickFromLayer(Q3DSLayerNode *layer3DS, const QPoint &point, const InputState &inputState, Q3DSScenePicker *picker)
diff --git a/src/runtime/q3dsscenepicker.cpp b/src/runtime/q3dsscenepicker.cpp
index 65e1665..2ec1d16 100644
--- a/src/runtime/q3dsscenepicker.cpp
+++ b/src/runtime/q3dsscenepicker.cpp
@@ -89,3 +89,9 @@ void Q3DSScenePicker::pickReady()
{
Q_EMIT ready();
}
+
+void Q3DSScenePicker::reset()
+{
+ clearPicks();
+ m_pickState = Unqueued;
+}
diff --git a/src/runtime/q3dsscenepicker_p.h b/src/runtime/q3dsscenepicker_p.h
index b80427a..172bbc5 100644
--- a/src/runtime/q3dsscenepicker_p.h
+++ b/src/runtime/q3dsscenepicker_p.h
@@ -61,6 +61,14 @@ class Q3DSV_PRIVATE_EXPORT Q3DSScenePicker : public QObject
{
Q_OBJECT
public:
+ enum PickState {
+ Unqueued = 0,
+ Queued,
+ Triggered,
+ Ready,
+ Failed
+ };
+
Q3DSScenePicker(Q3DSSceneManager *manager);
~Q3DSScenePicker() override;
@@ -79,13 +87,18 @@ public:
void addPick(Q3DSGraphObject *object, qreal distance);
void pickReady();
+ PickState state() const { return m_pickState; }
+ void setState(PickState state) { m_pickState = state; }
+ void reset();
+
private:
QPoint m_point;
QVector<Q3DSGraphObject *> m_objects;
- QVector<qreal> m_distances;
+ QVector<qreal> m_distances;
Q3DSLayerNode *m_layer = nullptr;
Q3DSInputManager *m_inputManager = nullptr;
+ PickState m_pickState = Unqueued;
};
QT_END_NAMESPACE