diff options
author | Miikka Heikkinen <miikka.heikkinen@qt.io> | 2019-01-11 12:26:06 +0200 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@qt.io> | 2019-01-14 12:19:03 +0000 |
commit | 7c203cb04362c246c709285d583052ec1358e7de (patch) | |
tree | ecea2a8c97ec828287b10f76526a7450ab672e93 | |
parent | 85ce7c19c965f3dfdbc3eaf7365e8e6d5dc81a3d (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.cpp | 19 | ||||
-rw-r--r-- | src/runtime/q3dsscenepicker.cpp | 6 | ||||
-rw-r--r-- | src/runtime/q3dsscenepicker_p.h | 15 |
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 |