diff options
-rw-r--r-- | src/datavisualization/engine/abstract3dcontroller.cpp | 27 | ||||
-rw-r--r-- | src/datavisualization/engine/abstract3drenderer.cpp | 19 | ||||
-rw-r--r-- | src/datavisualization/engine/abstract3drenderer_p.h | 13 | ||||
-rw-r--r-- | src/datavisualization/engine/bars3drenderer.cpp | 1 | ||||
-rw-r--r-- | src/datavisualization/engine/q3dscene.cpp | 5 | ||||
-rw-r--r-- | src/datavisualization/engine/scatter3drenderer.cpp | 1 | ||||
-rw-r--r-- | src/datavisualization/engine/surface3drenderer.cpp | 1 | ||||
-rw-r--r-- | tests/qmldynamicdata/qml/qmldynamicdata/main.qml | 28 |
8 files changed, 62 insertions, 33 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); } diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index a5b517fd..c47e2b29 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -53,8 +53,9 @@ Abstract3DRenderer::Abstract3DRenderer(Abstract3DController *controller) m_selectionState(SelectNone), m_devicePixelRatio(1.0f), m_selectionLabelDirty(true), - m_clickPending(false), + m_clickResolved(false), m_graphPositionQueryPending(false), + m_graphPositionQueryResolved(false), m_clickedSeries(0), m_clickedType(QAbstract3DGraph::ElementNone), m_selectedLabelIndex(-1), @@ -337,10 +338,6 @@ void Abstract3DRenderer::updateScene(Q3DScene *scene) if (Q3DScene::invalidSelectionPoint() == logicalPixelPosition) { updateSelectionState(SelectNone); } else { - // Selections are one-shot, reset selection active to false before processing - scene->setSelectionQueryPosition(Q3DScene::invalidSelectionPoint()); - m_clickPending = true; - if (scene->isSlicingActive()) { if (scene->isPointInPrimarySubView(logicalPixelPosition)) updateSelectionState(SelectOnOverview); @@ -353,10 +350,14 @@ void Abstract3DRenderer::updateScene(Q3DScene *scene) } } - if (Q3DScene::invalidSelectionPoint() != logicalGraphPosition) { + if (Q3DScene::invalidSelectionPoint() != logicalGraphPosition) m_graphPositionQueryPending = true; - scene->setGraphPositionQuery(Q3DScene::invalidSelectionPoint()); - } + + // Queue up another render when we have a query that needs resolving. + // This is needed because QtQuick scene graph can sometimes do a sync without following it up + // with a render. + if (m_graphPositionQueryPending || m_selectionState != SelectNone) + emit needRender(); } void Abstract3DRenderer::updateTextures() @@ -1767,6 +1768,8 @@ void Abstract3DRenderer::queriedGraphPosition(const QMatrix4x4 &projectionViewMa m_queriedGraphPosition = QVector3D(normalizedValues.x(), normalizedValues.y(), normalizedValues.z()); + m_graphPositionQueryResolved = true; + m_graphPositionQueryPending = false; } void Abstract3DRenderer::calculatePolarXZ(const QVector3D &dataPos, float &x, float &z) const diff --git a/src/datavisualization/engine/abstract3drenderer_p.h b/src/datavisualization/engine/abstract3drenderer_p.h index 4833afaa..d8ca7696 100644 --- a/src/datavisualization/engine/abstract3drenderer_p.h +++ b/src/datavisualization/engine/abstract3drenderer_p.h @@ -148,13 +148,15 @@ public: void generateBaseColorTexture(const QColor &color, GLuint *texture); void fixGradientAndGenerateTexture(QLinearGradient *gradient, GLuint *gradientTexture); - inline bool isClickPending() { return m_clickPending; } - inline void clearClickPending() { m_clickPending = false; } + inline bool isClickQueryResolved() const { return m_clickResolved; } + inline void clearClickQueryResolved() { m_clickResolved = false; } + inline QPoint cachedClickQuery() const { return m_cachedScene->selectionQueryPosition(); } inline QAbstract3DSeries *clickedSeries() const { return m_clickedSeries; } inline QAbstract3DGraph::ElementType clickedType() { return m_clickedType; } - inline bool isGraphPositionQueryPending() { return m_graphPositionQueryPending; } - inline void clearGraphPositionQueryPending() { m_graphPositionQueryPending = false; } + inline bool isGraphPositionQueryResolved() const { return m_graphPositionQueryResolved; } + inline void clearGraphPositionQueryResolved() { m_graphPositionQueryResolved = false; } inline QVector3D queriedGraphPosition() const { return m_queriedGraphPosition; } + inline QPoint cachedGraphPositionQuery() const { return m_cachedScene->graphPositionQuery(); } LabelItem &selectionLabelItem(); void setSelectionLabel(const QString &label); @@ -253,8 +255,9 @@ protected: QRect m_secondarySubViewport; float m_devicePixelRatio; bool m_selectionLabelDirty; - bool m_clickPending; + bool m_clickResolved; bool m_graphPositionQueryPending; + bool m_graphPositionQueryResolved; QAbstract3DSeries *m_clickedSeries; QAbstract3DGraph::ElementType m_clickedType; int m_selectedLabelIndex; diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index 7e2de98f..e18e4fa5 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -1250,6 +1250,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) QVector4D clickedColor = Utils::getSelection(m_inputPosition, m_viewport.height()); m_clickedPosition = selectionColorToArrayPosition(clickedColor); m_clickedSeries = selectionColorToSeries(clickedColor); + m_clickResolved = true; emit needRender(); diff --git a/src/datavisualization/engine/q3dscene.cpp b/src/datavisualization/engine/q3dscene.cpp index 6ea41d6a..e4015c2b 100644 --- a/src/datavisualization/engine/q3dscene.cpp +++ b/src/datavisualization/engine/q3dscene.cpp @@ -560,6 +560,11 @@ void Q3DScenePrivate::sync(Q3DScenePrivate &other) m_changeTracker.selectionQueryPositionChanged = false; other.m_changeTracker.selectionQueryPositionChanged = false; } + if (m_changeTracker.graphPositionQueryPositionChanged) { + other.q_ptr->setGraphPositionQuery(q_ptr->graphPositionQuery()); + m_changeTracker.graphPositionQueryPositionChanged = false; + other.m_changeTracker.graphPositionQueryPositionChanged = false; + } if (m_changeTracker.cameraChanged) { m_camera->setDirty(true); m_changeTracker.cameraChanged = false; diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp index 62496538..f5d0793f 100644 --- a/src/datavisualization/engine/scatter3drenderer.cpp +++ b/src/datavisualization/engine/scatter3drenderer.cpp @@ -802,6 +802,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) QVector4D clickedColor = Utils::getSelection(m_inputPosition, m_viewport.height()); selectionColorToSeriesAndIndex(clickedColor, m_clickedIndex, m_clickedSeries); + m_clickResolved = true; emit needRender(); diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index df78d491..15df5598 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -1353,6 +1353,7 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) + uint(clickedColor.w()) * alphaMultiplier; m_clickedPosition = selectionIdToSurfacePoint(selectionId); + m_clickResolved = true; emit needRender(); diff --git a/tests/qmldynamicdata/qml/qmldynamicdata/main.qml b/tests/qmldynamicdata/qml/qmldynamicdata/main.qml index 0ec9d277..29c51fb3 100644 --- a/tests/qmldynamicdata/qml/qmldynamicdata/main.qml +++ b/tests/qmldynamicdata/qml/qmldynamicdata/main.qml @@ -71,18 +71,16 @@ Rectangle { isIncreasing = false; } } else { - // TODO: Once QTRD-2645 is fixed, change this to remove from - // random index to add coverage. - graphModel.remove(2); - graphModel.remove(2); - graphModel.remove(2); - graphModel.remove(2); - graphModel.remove(2); - graphModel.remove(2); - graphModel.remove(2); - graphModel.remove(2); - graphModel.remove(2); - graphModel.remove(2); + graphModel.remove(Math.random() * (graphModel.count - 1)); + graphModel.remove(Math.random() * (graphModel.count - 1)); + graphModel.remove(Math.random() * (graphModel.count - 1)); + graphModel.remove(Math.random() * (graphModel.count - 1)); + graphModel.remove(Math.random() * (graphModel.count - 1)); + graphModel.remove(Math.random() * (graphModel.count - 1)); + graphModel.remove(Math.random() * (graphModel.count - 1)); + graphModel.remove(Math.random() * (graphModel.count - 1)); + graphModel.remove(Math.random() * (graphModel.count - 1)); + graphModel.remove(Math.random() * (graphModel.count - 1)); if (graphModel.count == 2) { scatterGraph.theme.type = Theme3D.ThemeDigia; isIncreasing = true; @@ -118,6 +116,12 @@ Rectangle { shadowQuality: AbstractGraph3D.ShadowQualitySoftMedium scene.activeCamera.yRotation: 30.0 inputHandler: null + axisX.min: 0 + axisY.min: 0 + axisZ.min: 0 + axisX.max: 1 + axisY.max: 1 + axisZ.max: 1 Scatter3DSeries { id: scatterSeries |