diff options
-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 |