summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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