summaryrefslogtreecommitdiffstats
path: root/src/datavisualization/engine/abstract3dcontroller.cpp
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@digia.com>2014-10-08 15:35:15 +0300
committerMiikka Heikkinen <miikka.heikkinen@digia.com>2014-10-09 10:09:31 +0300
commitf3a73782738c5868541086eadd5e5c7b4aaabc14 (patch)
treeee078b8e1de5a93c7d067e5ade243f5c411b3b2a /src/datavisualization/engine/abstract3dcontroller.cpp
parenta350868f0e49b52b5bb35ba5e320a0d7dc3f698a (diff)
Fix screen position based queries in threaded rendering environment
QtQuick's threaded renderer doesn't seem to always pair up sync and render (or more accurately, beforeSynchronizing and node's preprocess calls). Sometimes sync comes without a followup render, or there are two syncs in a row, even though the sync is using direct connection. Both of these cases broke the old logic for handling position based queries. Changed the logic to actually ensure we have resolved the query before emitting the relevant signal. Task-number: QTRD-3358 Change-Id: Ica6c8c311f53a06311c21532aaabc18c28556655 Reviewed-by: Tomi Korpipää <tomi.korpipaa@digia.com>
Diffstat (limited to 'src/datavisualization/engine/abstract3dcontroller.cpp')
-rw-r--r--src/datavisualization/engine/abstract3dcontroller.cpp27
1 files changed, 19 insertions, 8 deletions
diff --git a/src/datavisualization/engine/abstract3dcontroller.cpp b/src/datavisualization/engine/abstract3dcontroller.cpp
index 27d01029..f8a1a813 100644
--- a/src/datavisualization/engine/abstract3dcontroller.cpp
+++ b/src/datavisualization/engine/abstract3dcontroller.cpp
@@ -170,16 +170,14 @@ void Abstract3DController::synchDataToRenderer()
{
// Subclass implementations check for renderer validity already, so no need to check here.
+ m_renderPending = false;
+
// If there are pending queries, handle those first
- if (m_renderer->isGraphPositionQueryPending()) {
+ if (m_renderer->isGraphPositionQueryResolved())
handlePendingGraphPositionQuery();
- m_renderer->clearGraphPositionQueryPending();
- }
- if (m_renderer->isClickPending()) {
+ if (m_renderer->isClickQueryResolved())
handlePendingClick();
- m_renderer->clearClickPending();
- }
startRecordingRemovesAndInserts();
@@ -518,8 +516,6 @@ void Abstract3DController::synchDataToRenderer()
void Abstract3DController::render(const GLuint defaultFboHandle)
{
- m_renderPending = false;
-
// If not initialized, do nothing.
if (!m_renderer)
return;
@@ -1489,12 +1485,27 @@ void Abstract3DController::handlePendingClick()
m_selectedLabelIndex = m_renderer->m_selectedLabelIndex;
m_selectedCustomItemIndex = m_renderer->m_selectedCustomItemIndex;
+ // Invalidate query position to indicate the query has been handled, unless another
+ // point has been queried.
+ if (m_renderer->cachedClickQuery() == m_scene->selectionQueryPosition())
+ m_scene->setSelectionQueryPosition(Q3DScene::invalidSelectionPoint());
+
+ m_renderer->clearClickQueryResolved();
+
emit elementSelected(m_clickedType);
}
void Abstract3DController::handlePendingGraphPositionQuery()
{
m_queriedGraphPosition = m_renderer->queriedGraphPosition();
+
+ // Invalidate query position to indicate the query has been handled, unless another
+ // point has been queried.
+ if (m_renderer->cachedGraphPositionQuery() == m_scene->graphPositionQuery())
+ m_scene->setGraphPositionQuery(Q3DScene::invalidSelectionPoint());
+
+ m_renderer->clearGraphPositionQueryResolved();
+
emit queriedGraphPositionChanged(m_queriedGraphPosition);
}