From 2d31d2416643598b15664c766326f18c5b698c79 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Tue, 14 Jan 2014 10:08:28 +0200 Subject: Add series name property MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit +Don't call updateScene for every render cycle +Fixed item label update when format or name changes +Misc cosmetic fixes Task-number: QTRD-2736 Task-number: QTRD-2571 Change-Id: I43aa6b8e3202b09529b17a22bb24d05fcb545609 Reviewed-by: Tomi Korpipää --- .../engine/abstract3dcontroller.cpp | 3 ++- .../engine/abstract3drenderer.cpp | 8 ++++++- .../engine/abstract3drenderer_p.h | 1 + src/datavisualization/engine/bars3drenderer.cpp | 9 ++++++-- src/datavisualization/engine/q3dobject.cpp | 4 +++- src/datavisualization/engine/q3dscene.cpp | 27 +++++++++++++++++++--- src/datavisualization/engine/q3dscene.h | 1 + src/datavisualization/engine/q3dscene_p.h | 1 + src/datavisualization/engine/scatter3drenderer.cpp | 7 ++++-- src/datavisualization/engine/seriesrendercache.cpp | 5 ++++ src/datavisualization/engine/seriesrendercache_p.h | 3 +++ src/datavisualization/engine/surface3drenderer.cpp | 12 +++++++--- 12 files changed, 68 insertions(+), 13 deletions(-) (limited to 'src/datavisualization/engine') diff --git a/src/datavisualization/engine/abstract3dcontroller.cpp b/src/datavisualization/engine/abstract3dcontroller.cpp index 14585679..919db22c 100644 --- a/src/datavisualization/engine/abstract3dcontroller.cpp +++ b/src/datavisualization/engine/abstract3dcontroller.cpp @@ -136,7 +136,8 @@ void Abstract3DController::synchDataToRenderer() if (!m_renderer) return; - m_renderer->updateScene(m_scene); + if (m_scene->d_ptr->m_sceneDirty) + m_renderer->updateScene(m_scene); m_renderer->updateTheme(m_themeManager->activeTheme()); diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index 19b9a8c8..e812496c 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -354,8 +354,14 @@ void Abstract3DRenderer::updateSeries(const QList &seriesLi visibleCount = 0; } foreach (QAbstract3DSeries *current, seriesList) { - if (current->isVisible()) + if (current->isVisible()) { + // Item selection label may need update + if (current->d_ptr->m_changeTracker.nameChanged + || current->d_ptr->m_changeTracker.itemLabelFormatChanged) { + m_selectionLabelDirty = true; + } m_visibleSeriesList[visibleCount++].populate(current, this); + } } } diff --git a/src/datavisualization/engine/abstract3drenderer_p.h b/src/datavisualization/engine/abstract3drenderer_p.h index 068ee0ef..c375b0b8 100644 --- a/src/datavisualization/engine/abstract3drenderer_p.h +++ b/src/datavisualization/engine/abstract3drenderer_p.h @@ -137,6 +137,7 @@ protected: QRect m_primarySubViewport; QRect m_secondarySubViewport; float m_devicePixelRatio; + bool m_selectionLabelDirty; #ifdef DISPLAY_RENDER_SPEED bool m_isFirstFrame; diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index 0a477d53..66a18e17 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -1756,9 +1756,10 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) glDisable(GL_DEPTH_TEST); // Draw the selection label LabelItem &labelItem = selectedBar->selectionLabelItem(); - if (m_selectedBar != selectedBar || m_updateLabels || !labelItem.textureId()) { + if (m_selectedBar != selectedBar || m_updateLabels || !labelItem.textureId() + || m_selectionLabelDirty) { QString labelText = selectedBar->selectionLabel(); - if (labelText.isNull()) { + if (labelText.isNull() || m_selectionLabelDirty) { static const QString rowIndexTag(QStringLiteral("@rowIdx")); static const QString rowLabelTag(QStringLiteral("@rowLabel")); static const QString rowTitleTag(QStringLiteral("@rowTitle")); @@ -1767,6 +1768,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) static const QString colTitleTag(QStringLiteral("@colTitle")); static const QString valueTitleTag(QStringLiteral("@valueTitle")); static const QString valueLabelTag(QStringLiteral("@valueLabel")); + static const QString seriesNameTag(QStringLiteral("@seriesName")); // Custom format expects printf format specifier. There is no tag for it. labelText = generateValueLabel( @@ -1797,7 +1799,10 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) labelText.replace(valueLabelTag, valueLabelText); } + labelText.replace(seriesNameTag, m_visibleSeriesList[m_visualSelectedBarSeriesIndex].name()); + selectedBar->setSelectionLabel(labelText); + m_selectionLabelDirty = false; } m_drawer->generateLabelItem(labelItem, labelText); m_selectedBar = selectedBar; diff --git a/src/datavisualization/engine/q3dobject.cpp b/src/datavisualization/engine/q3dobject.cpp index c4098fd0..89a682e1 100644 --- a/src/datavisualization/engine/q3dobject.cpp +++ b/src/datavisualization/engine/q3dobject.cpp @@ -18,7 +18,7 @@ #include "q3dobject.h" #include "q3dobject_p.h" -#include "q3dscene.h" +#include "q3dscene_p.h" QT_DATAVISUALIZATION_BEGIN_NAMESPACE @@ -97,6 +97,8 @@ void Q3DObject::setPosition(const QVector3D &position) void Q3DObject::setDirty(bool dirty) { d_ptr->m_isDirty = dirty; + if (parentScene()) + parentScene()->d_ptr->m_sceneDirty = true; } /*! diff --git a/src/datavisualization/engine/q3dscene.cpp b/src/datavisualization/engine/q3dscene.cpp index ce037b55..6fbfac51 100644 --- a/src/datavisualization/engine/q3dscene.cpp +++ b/src/datavisualization/engine/q3dscene.cpp @@ -185,6 +185,8 @@ void Q3DScene::setPrimarySubViewport(const QRect &primarySubViewport) d_ptr->m_primarySubViewport = intersectedViewport; d_ptr->updateGLSubViewports(); d_ptr->m_changeTracker.primarySubViewportChanged = true; + d_ptr->m_sceneDirty = true; + emit primarySubViewportChanged(intersectedViewport); emit d_ptr->needRender(); } @@ -247,6 +249,8 @@ void Q3DScene::setSecondarySubViewport(const QRect &secondarySubViewport) d_ptr->m_secondarySubViewport = intersectedViewport; d_ptr->updateGLSubViewports(); d_ptr->m_changeTracker.secondarySubViewportChanged = true; + d_ptr->m_sceneDirty = true; + emit secondarySubViewportChanged(intersectedViewport); emit d_ptr->needRender(); } @@ -265,6 +269,8 @@ void Q3DScene::setSelectionQueryPosition(const QPoint &point) if (point != d_ptr->m_selectionQueryPosition) { d_ptr->m_selectionQueryPosition = point; d_ptr->m_changeTracker.selectionQueryPositionChanged = true; + d_ptr->m_sceneDirty = true; + emit selectionQueryPositionChanged(point); emit d_ptr->needRender(); } @@ -300,6 +306,8 @@ void Q3DScene::setSlicingActive(bool isSlicing) if (d_ptr->m_isSlicingActive != isSlicing) { d_ptr->m_isSlicingActive = isSlicing; d_ptr->m_changeTracker.slicingActivatedChanged = true; + d_ptr->m_sceneDirty = true; + d_ptr->calculateSubViewports(); emit slicingActiveChanged(isSlicing); emit d_ptr->needRender(); @@ -322,6 +330,8 @@ void Q3DScene::setSecondarySubviewOnTop(bool isSecondaryOnTop) if (d_ptr->m_isSecondarySubviewOnTop != isSecondaryOnTop) { d_ptr->m_isSecondarySubviewOnTop = isSecondaryOnTop; d_ptr->m_changeTracker.subViewportOrderChanged = true; + d_ptr->m_sceneDirty = true; + emit secondarySubviewOnTopChanged(isSecondaryOnTop); emit d_ptr->needRender(); } @@ -359,6 +369,8 @@ void Q3DScene::setActiveCamera(Q3DCamera *camera) d_ptr->m_camera = camera; d_ptr->m_changeTracker.cameraChanged = true; + d_ptr->m_sceneDirty = true; + if (camera) { connect(camera, &Q3DCamera::xRotationChanged, d_ptr.data(), @@ -397,6 +409,8 @@ void Q3DScene::setActiveLight(Q3DLight *light) if (light != d_ptr->m_light) { d_ptr->m_light = light; d_ptr->m_changeTracker.lightChanged = true; + d_ptr->m_sceneDirty = true; + emit activeLightChanged(light); } } @@ -417,6 +431,8 @@ void Q3DScene::setDevicePixelRatio(float pixelRatio) if (d_ptr->m_devicePixelRatio != pixelRatio) { d_ptr->m_devicePixelRatio = pixelRatio; d_ptr->m_changeTracker.devicePixelRatioChanged = true; + d_ptr->m_sceneDirty = true; + emit devicePixelRatioChanged(pixelRatio); d_ptr->updateGLViewport(); emit d_ptr->needRender(); @@ -518,6 +534,9 @@ void Q3DScenePrivate::sync(Q3DScenePrivate &other) m_changeTracker.devicePixelRatioChanged = false; other.m_changeTracker.devicePixelRatioChanged = false; } + + m_sceneDirty = false; + other.m_sceneDirty = false; } void Q3DScenePrivate::setViewport(const QRect &viewport) @@ -553,6 +572,7 @@ void Q3DScenePrivate::setWindowSize(const QSize &size) m_windowSize = size; updateGLViewport(); m_changeTracker.windowSizeChanged = true; + m_sceneDirty = true; emit needRender(); } } @@ -568,9 +588,9 @@ void Q3DScenePrivate::calculateSubViewports() const float smallerViewPortRatio = 0.2f; if (m_isSlicingActive) { q_ptr->setPrimarySubViewport(QRect(0, - 0, - m_viewport.width() * smallerViewPortRatio, - m_viewport.height() * smallerViewPortRatio)); + 0, + m_viewport.width() * smallerViewPortRatio, + m_viewport.height() * smallerViewPortRatio)); q_ptr->setSecondarySubViewport(QRect(0, 0, m_viewport.width(), m_viewport.height())); } else { q_ptr->setPrimarySubViewport(QRect(0, 0, m_viewport.width(), m_viewport.height())); @@ -589,6 +609,7 @@ void Q3DScenePrivate::updateGLViewport() m_glViewport.setHeight(m_viewport.height() * m_devicePixelRatio); m_changeTracker.viewportChanged = true; + m_sceneDirty = true; // Do default subviewport changes first, then allow signal listeners to override. updateGLSubViewports(); diff --git a/src/datavisualization/engine/q3dscene.h b/src/datavisualization/engine/q3dscene.h index f57d3351..fb543cdb 100644 --- a/src/datavisualization/engine/q3dscene.h +++ b/src/datavisualization/engine/q3dscene.h @@ -104,6 +104,7 @@ private: friend class Surface3DRenderer; friend class Scatter3DRenderer; friend class Q3DCameraPrivate; + friend class Q3DObject; }; QT_DATAVISUALIZATION_END_NAMESPACE diff --git a/src/datavisualization/engine/q3dscene_p.h b/src/datavisualization/engine/q3dscene_p.h index c9d9d1f6..94265568 100644 --- a/src/datavisualization/engine/q3dscene_p.h +++ b/src/datavisualization/engine/q3dscene_p.h @@ -107,6 +107,7 @@ public: QRect m_glViewport; QRect m_glPrimarySubViewport; QRect m_glSecondarySubViewport; + bool m_sceneDirty; }; QT_DATAVISUALIZATION_END_NAMESPACE diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp index 9973069b..3eee8ff0 100644 --- a/src/datavisualization/engine/scatter3drenderer.cpp +++ b/src/datavisualization/engine/scatter3drenderer.cpp @@ -1471,15 +1471,16 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) // Draw the selection label LabelItem &labelItem = selectedItem->selectionLabelItem(); if (m_selectedItem != selectedItem || m_updateLabels - || !labelItem.textureId()) { + || !labelItem.textureId() || m_selectionLabelDirty) { QString labelText = selectedItem->selectionLabel(); - if (labelText.isNull()) { + if (labelText.isNull() || m_selectionLabelDirty) { static const QString xTitleTag(QStringLiteral("@xTitle")); static const QString yTitleTag(QStringLiteral("@yTitle")); static const QString zTitleTag(QStringLiteral("@zTitle")); static const QString xLabelTag(QStringLiteral("@xLabel")); static const QString yLabelTag(QStringLiteral("@yLabel")); static const QString zLabelTag(QStringLiteral("@zLabel")); + static const QString seriesNameTag(QStringLiteral("@seriesName")); labelText = m_visibleSeriesList[m_selectedItemSeriesIndex].itemLabelFormat(); @@ -1511,8 +1512,10 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) selectedItem->position().z()); labelText.replace(zLabelTag, valueLabelText); } + labelText.replace(seriesNameTag, m_visibleSeriesList[m_selectedItemSeriesIndex].name()); selectedItem->setSelectionLabel(labelText); + m_selectionLabelDirty = false; } m_drawer->generateLabelItem(labelItem, labelText); m_selectedItem = selectedItem; diff --git a/src/datavisualization/engine/seriesrendercache.cpp b/src/datavisualization/engine/seriesrendercache.cpp index 7526ac03..cea0f7b1 100644 --- a/src/datavisualization/engine/seriesrendercache.cpp +++ b/src/datavisualization/engine/seriesrendercache.cpp @@ -164,6 +164,11 @@ void SeriesRenderCache::populate(QAbstract3DSeries *series, Abstract3DRenderer * renderer->fixGradientAndGenerateTexture(&gradient, &m_multiHighlightGradientTexture); changeTracker.multiHighlightGradientChanged = false; } + + if (seriesChanged || changeTracker.nameChanged) { + m_name = series->name(); + changeTracker.nameChanged = false; + } } void SeriesRenderCache::cleanup(TextureHelper *texHelper) diff --git a/src/datavisualization/engine/seriesrendercache_p.h b/src/datavisualization/engine/seriesrendercache_p.h index 906a6c0d..2bf7a1cc 100644 --- a/src/datavisualization/engine/seriesrendercache_p.h +++ b/src/datavisualization/engine/seriesrendercache_p.h @@ -61,6 +61,7 @@ public: inline const GLuint &singleHighlightGradientTexture() const { return m_singleHighlightGradientTexture; } inline const QVector3D &multiHighlightColor() const { return m_multiHighlightColor; } inline const GLuint &multiHighlightGradientTexture() const { return m_multiHighlightGradientTexture; } + inline const QString &name() const { return m_name; } protected: QAbstract3DSeries *m_series; @@ -75,6 +76,8 @@ protected: GLuint m_singleHighlightGradientTexture; QVector3D m_multiHighlightColor; GLuint m_multiHighlightGradientTexture; + + QString m_name; }; QT_DATAVISUALIZATION_END_NAMESPACE diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index b08558b2..f89233be 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -538,8 +538,8 @@ void Surface3DRenderer::updateScene(Q3DScene *scene) Abstract3DRenderer::updateScene(scene); - if (m_selectionPointer) { - m_selectionPointer->updateScene(m_cachedScene); + if (m_selectionPointer && m_selectionActive + && m_cachedSelectionMode.testFlag(QDataVis::SelectionItem)) { m_selectionDirty = true; // Ball may need repositioning if scene changes } @@ -1692,7 +1692,7 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) glUseProgram(0); // Selection handling - if (m_selectionDirty) { + if (m_selectionDirty || m_selectionLabelDirty) { QPoint visiblePoint = Surface3DController::invalidSelectionPosition(); if (m_selectedPoint != Surface3DController::invalidSelectionPosition()) { int x = m_selectedPoint.x() - m_sampleSpace.y(); @@ -1956,6 +1956,7 @@ QString Surface3DRenderer::createSelectionLabel(float value, int column, int row static const QString xLabelTag(QStringLiteral("@xLabel")); static const QString yLabelTag(QStringLiteral("@yLabel")); static const QString zLabelTag(QStringLiteral("@zLabel")); + static const QString seriesNameTag(QStringLiteral("@seriesName")); labelText.replace(xTitleTag, m_axisCacheX.title()); labelText.replace(yTitleTag, m_axisCacheY.title()); @@ -1985,6 +1986,11 @@ QString Surface3DRenderer::createSelectionLabel(float value, int column, int row labelText.replace(zLabelTag, valueLabelText); } + // TODO: Get from correct series once multiple series supported + labelText.replace(seriesNameTag, m_visibleSeriesList[0].name()); + + m_selectionLabelDirty = false; + return labelText; } -- cgit v1.2.3