diff options
author | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2014-02-24 14:03:14 +0200 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2014-02-24 14:23:34 +0200 |
commit | 37493fac3422ce5cbe34748ca25757ca6302a583 (patch) | |
tree | 4bbffa04287106049fca1857225e0711fafe4730 /src/datavisualization/engine | |
parent | e07e480d744c6f091844350704b916a71811c6b9 (diff) |
Move selection labels to renderer from render items
Creating a new label on demand is fast enough, so we don't need to
store old labels. Storing labels unnecessarily leads to unchecked
use of graphics memory.
Optimized bar slices a bit by having separate class of render items
for slice items.
Change-Id: I5afdecfb3949393341b6c3eaefbc667c65da32e3
Reviewed-by: Tomi Korpipää <tomi.korpipaa@digia.com>
Diffstat (limited to 'src/datavisualization/engine')
-rw-r--r-- | src/datavisualization/engine/abstract3drenderer.cpp | 23 | ||||
-rw-r--r-- | src/datavisualization/engine/abstract3drenderer_p.h | 7 | ||||
-rw-r--r-- | src/datavisualization/engine/bars3drenderer.cpp | 104 | ||||
-rw-r--r-- | src/datavisualization/engine/bars3drenderer_p.h | 2 | ||||
-rw-r--r-- | src/datavisualization/engine/drawer.cpp | 7 | ||||
-rw-r--r-- | src/datavisualization/engine/drawer_p.h | 3 | ||||
-rw-r--r-- | src/datavisualization/engine/scatter3drenderer.cpp | 7 |
7 files changed, 92 insertions, 61 deletions
diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index e62f2a00..3122cf76 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -44,7 +44,8 @@ Abstract3DRenderer::Abstract3DRenderer(Abstract3DController *controller) m_devicePixelRatio(1.0f), m_selectionLabelDirty(true), m_clickPending(false), - m_clickedSeries(0) + m_clickedSeries(0), + m_selectionLabelItem(0) #ifdef DISPLAY_RENDER_SPEED , m_isFirstFrame(true), m_numFrames(0) @@ -67,6 +68,7 @@ Abstract3DRenderer::~Abstract3DRenderer() delete m_textureHelper; delete m_cachedScene; delete m_cachedTheme; + delete m_selectionLabelItem; } void Abstract3DRenderer::initializeOpenGL() @@ -450,4 +452,23 @@ void Abstract3DRenderer::fixGradientAndGenerateTexture(QLinearGradient *gradient *gradientTexture = m_textureHelper->createGradientTexture(*gradient); } +LabelItem &Abstract3DRenderer::selectionLabelItem() +{ + if (!m_selectionLabelItem) + m_selectionLabelItem = new LabelItem; + return *m_selectionLabelItem; +} + +void Abstract3DRenderer::setSelectionLabel(const QString &label) +{ + if (m_selectionLabelItem) + m_selectionLabelItem->clear(); + m_selectionLabel = label; +} + +QString &Abstract3DRenderer::selectionLabel() +{ + return m_selectionLabel; +} + QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/engine/abstract3drenderer_p.h b/src/datavisualization/engine/abstract3drenderer_p.h index 4f5b644e..4eb8426f 100644 --- a/src/datavisualization/engine/abstract3drenderer_p.h +++ b/src/datavisualization/engine/abstract3drenderer_p.h @@ -101,6 +101,10 @@ public: inline void clearClickPending() { m_clickPending = false; } inline QAbstract3DSeries *clickedSeries() const { return m_clickedSeries; } + LabelItem &selectionLabelItem(); + void setSelectionLabel(const QString &label); + QString &selectionLabel(); + signals: void needRender(); // Emit this if something in renderer causes need for another render pass. void requestShadowQuality(QAbstract3DGraph::ShadowQuality quality); // For automatic quality adjustments @@ -146,6 +150,9 @@ protected: bool m_clickPending; QAbstract3DSeries *m_clickedSeries; + QString m_selectionLabel; + LabelItem *m_selectionLabelItem; + #ifdef DISPLAY_RENDER_SPEED bool m_isFirstFrame; QTime m_lastFrameTime; diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index 3ec23476..be1be0dc 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -166,7 +166,6 @@ void Bars3DRenderer::updateData() m_seriesStart = -((float(seriesCount) - 1.0f) / 2.0f) * m_seriesStep; } - if (m_keepSeriesUniform) m_seriesScaleZ = m_seriesScaleX; else @@ -485,14 +484,14 @@ void Bars3DRenderer::drawSlicedScene() int sliceItemCount = m_sliceSelection.size(); for (int bar = 0; bar < sliceItemCount; bar++) { - BarRenderItem *item = m_sliceSelection.at(bar); - if (!item) + const BarRenderSliceItem &item = m_sliceSelection.at(bar); + if (!item.value()) continue; QQuaternion seriesRotation; - if (item->seriesIndex() != currentSeriesIndex) { - currentSeriesIndex = item->seriesIndex(); + if (item.seriesIndex() != currentSeriesIndex) { + currentSeriesIndex = item.seriesIndex(); currentSeries = &(m_visibleSeriesList.at(currentSeriesIndex)); barObj = currentSeries->object(); colorStyle = currentSeries->colorStyle(); @@ -524,7 +523,7 @@ void Bars3DRenderer::drawSlicedScene() seriesRotation = currentSeries->meshRotation(); } - if (item->height() < 0) + if (item.height() < 0) glCullFace(GL_FRONT); else glCullFace(GL_BACK); @@ -532,18 +531,18 @@ void Bars3DRenderer::drawSlicedScene() QMatrix4x4 MVPMatrix; QMatrix4x4 modelMatrix; QMatrix4x4 itModelMatrix; - QQuaternion barRotation = item->rotation(); - GLfloat barPosY = item->translation().y() + barPosYAdjustment - zeroPosAdjustment; + QQuaternion barRotation = item.rotation(); + GLfloat barPosY = item.translation().y() + barPosYAdjustment - zeroPosAdjustment; if (rowMode) { - barPosX = item->translation().x(); + barPosX = item.translation().x(); } else { - barPosX = -(item->translation().z()); // flip z; frontmost bar to the left + barPosX = -(item.translation().z()); // flip z; frontmost bar to the left barRotation *= ninetyDegreeRotation; } modelMatrix.translate(barPosX, barPosY, 0.0f); - modelMatrixScaler.setY(item->height()); + modelMatrixScaler.setY(item.height()); if (!seriesRotation.isIdentity()) barRotation *= seriesRotation; @@ -561,8 +560,8 @@ void Bars3DRenderer::drawSlicedScene() QVector3D barColor; GLuint gradientTexture = 0; - if (itemMode && m_visualSelectedBarPos.x() == item->position().x() - && m_visualSelectedBarPos.y() == item->position().y()) { + if (itemMode && m_visualSelectedBarPos.x() == item.position().x() + && m_visualSelectedBarPos.y() == item.position().y()) { if (colorStyleIsUniform) barColor = highlightColor; else @@ -574,7 +573,7 @@ void Bars3DRenderer::drawSlicedScene() gradientTexture = baseGradientTexture; } - if (item->height() != 0) { + if (item.height() != 0) { // Set shader bindings barShader->setUniformValue(barShader->model(), modelMatrix); barShader->setUniformValue(barShader->nModel(), @@ -584,7 +583,7 @@ void Bars3DRenderer::drawSlicedScene() barShader->setUniformValue(barShader->color(), barColor); } else if (colorStyle == Q3DTheme::ColorStyleRangeGradient) { barShader->setUniformValue(barShader->gradientHeight(), - (qAbs(item->height()) / m_gradientFraction)); + (qAbs(item.height()) / m_gradientFraction)); } // Draw the object @@ -614,10 +613,10 @@ void Bars3DRenderer::drawSlicedScene() for (int labelNo = 0; labelNo <= lastLabel; labelNo++) { // Get labels from first series only - BarRenderItem *item = m_sliceSelection.at(labelNo); - m_dummyBarRenderItem.setTranslation(QVector3D(item->translation().x(), + const BarRenderSliceItem &item = m_sliceSelection.at(labelNo); + m_dummyBarRenderItem.setTranslation(QVector3D(item.translation().x(), barLabelYPos, - item->translation().z())); + item.translation().z())); // Draw labels m_drawer->drawLabel(m_dummyBarRenderItem, *m_sliceCache->labelItems().at(labelNo), viewMatrix, projectionMatrix, positionComp, sliceLabelRotation, @@ -627,53 +626,53 @@ void Bars3DRenderer::drawSlicedScene() } for (int col = 0; col < sliceItemCount; col++) { - BarRenderItem *item = m_sliceSelection.at(col); + BarRenderSliceItem &item = m_sliceSelection[col]; if (!sliceGridLabels) { // Draw values - if (item->height() != 0.0f || (!m_noZeroInRange && item->value() == 0.0f)) { + if (item.height() != 0.0f || (!m_noZeroInRange && item.value() == 0.0f)) { // Create label texture if we need it - if (item->sliceLabel().isNull() || m_updateLabels) { - item->setSliceLabel(generateValueLabel(m_axisCacheY.labelFormat(), - item->value())); - m_drawer->generateLabelItem(item->sliceLabelItem(), item->sliceLabel()); + if (item.sliceLabel().isNull() || m_updateLabels) { + item.setSliceLabel(generateValueLabel(m_axisCacheY.labelFormat(), + item.value())); + m_drawer->generateLabelItem(item.sliceLabelItem(), item.sliceLabel()); m_updateLabels = false; } - Qt::AlignmentFlag alignment = (item->height() < 0) ? Qt::AlignBottom : Qt::AlignTop; - Drawer::LabelPosition labelPos = (item->height() < 0) ? Drawer::LabelBelow : Drawer::LabelOver; - m_dummyBarRenderItem.setTranslation(QVector3D(item->translation().x(), + Qt::AlignmentFlag alignment = (item.height() < 0) ? Qt::AlignBottom : Qt::AlignTop; + Drawer::LabelPosition labelPos = (item.height() < 0) ? Drawer::LabelBelow : Drawer::LabelOver; + m_dummyBarRenderItem.setTranslation(QVector3D(item.translation().x(), barPosYAdjustment - zeroPosAdjustment - + item->height(), - item->translation().z())); + + item.height(), + item.translation().z())); - m_drawer->drawLabel(m_dummyBarRenderItem, item->sliceLabelItem(), viewMatrix, + m_drawer->drawLabel(m_dummyBarRenderItem, item.sliceLabelItem(), viewMatrix, projectionMatrix, zeroVector, sliceValueRotation, - item->height(), m_cachedSelectionMode, m_labelShader, + item.height(), m_cachedSelectionMode, m_labelShader, m_labelObj, activeCamera, false, false, labelPos, alignment, true); } } else { // Only draw value for selected item when grid labels are on - if (itemMode && m_visualSelectedBarPos.x() == item->position().x() - && m_visualSelectedBarPos.y() == item->position().y() - && item->seriesIndex() == m_visualSelectedBarSeriesIndex) { + if (itemMode && m_visualSelectedBarPos.x() == item.position().x() + && m_visualSelectedBarPos.y() == item.position().y() + && item.seriesIndex() == m_visualSelectedBarSeriesIndex) { // Create label texture if we need it - if (item->sliceLabel().isNull() || m_updateLabels) { - item->setSliceLabel(generateValueLabel(m_axisCacheY.labelFormat(), - item->value())); - m_drawer->generateLabelItem(item->sliceLabelItem(), item->sliceLabel()); + if (item.sliceLabel().isNull() || m_updateLabels) { + item.setSliceLabel(generateValueLabel(m_axisCacheY.labelFormat(), + item.value())); + m_drawer->generateLabelItem(item.sliceLabelItem(), item.sliceLabel()); m_updateLabels = false; } - Qt::AlignmentFlag alignment = (item->height() < 0) ? Qt::AlignBottom : Qt::AlignTop; - Drawer::LabelPosition labelPos = (item->height() < 0) ? Drawer::LabelBelow : Drawer::LabelOver; - m_dummyBarRenderItem.setTranslation(QVector3D(item->translation().x(), + Qt::AlignmentFlag alignment = (item.height() < 0) ? Qt::AlignBottom : Qt::AlignTop; + Drawer::LabelPosition labelPos = (item.height() < 0) ? Drawer::LabelBelow : Drawer::LabelOver; + m_dummyBarRenderItem.setTranslation(QVector3D(item.translation().x(), barPosYAdjustment - zeroPosAdjustment - + item->height(), - item->translation().z())); + + item.height(), + item.translation().z())); - m_drawer->drawLabel(m_dummyBarRenderItem, item->sliceLabelItem(), viewMatrix, + m_drawer->drawLabel(m_dummyBarRenderItem, item.sliceLabelItem(), viewMatrix, projectionMatrix, zeroVector, sliceValueRotation, - item->height(), m_cachedSelectionMode, m_labelShader, + item.height(), m_cachedSelectionMode, m_labelShader, m_labelObj, activeCamera, false, false, labelPos, alignment, true); } @@ -1199,9 +1198,9 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) item.setPosition(QPoint(row, bar)); item.setSeriesIndex(series); if (rowMode) - m_sliceSelection[sliceSeriesAdjust + bar] = &item; + m_sliceSelection[sliceSeriesAdjust + bar].setItem(item); else - m_sliceSelection[sliceSeriesAdjust + row] = &item; + m_sliceSelection[sliceSeriesAdjust + row].setItem(item); } break; } @@ -1221,7 +1220,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) item.setSeriesIndex(series); if (!m_sliceTitleItem && m_axisCacheZ.labelItems().size() > row) m_sliceTitleItem = m_axisCacheZ.labelItems().at(row); - m_sliceSelection[sliceSeriesAdjust + bar] = &item; + m_sliceSelection[sliceSeriesAdjust + bar].setItem(item); } } break; @@ -1248,7 +1247,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) item.setSeriesIndex(series); if (!m_sliceTitleItem && m_axisCacheX.labelItems().size() > bar) m_sliceTitleItem = m_axisCacheX.labelItems().at(bar); - m_sliceSelection[sliceSeriesAdjust + row] = &item; + m_sliceSelection[sliceSeriesAdjust + row].setItem(item); } } break; @@ -1804,10 +1803,10 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) // Print value of selected bar glDisable(GL_DEPTH_TEST); // Draw the selection label - LabelItem &labelItem = selectedBar->selectionLabelItem(); + LabelItem &labelItem = selectionLabelItem(); if (m_selectedBar != selectedBar || m_updateLabels || !labelItem.textureId() || m_selectionLabelDirty) { - QString labelText = selectedBar->selectionLabel(); + QString labelText = selectionLabel(); if (labelText.isNull() || m_selectionLabelDirty) { static const QString rowIndexTag(QStringLiteral("@rowIdx")); static const QString rowLabelTag(QStringLiteral("@rowLabel")); @@ -1851,7 +1850,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) labelText.replace(seriesNameTag, m_visibleSeriesList[m_visualSelectedBarSeriesIndex].name()); - selectedBar->setSelectionLabel(labelText); + setSelectionLabel(labelText); m_selectionLabelDirty = false; } m_drawer->generateLabelItem(labelItem, labelText); @@ -1942,6 +1941,7 @@ void Bars3DRenderer::updateSelectedBar(const QPoint &position, const QBar3DSerie m_selectedBarPos = position; m_selectedBarSeries = series; m_selectionDirty = true; + m_selectionLabelDirty = true; m_visualSelectedBarSeriesIndex = -1; if (m_renderingArrays.isEmpty()) { diff --git a/src/datavisualization/engine/bars3drenderer_p.h b/src/datavisualization/engine/bars3drenderer_p.h index 89030b30..37ac2b76 100644 --- a/src/datavisualization/engine/bars3drenderer_p.h +++ b/src/datavisualization/engine/bars3drenderer_p.h @@ -60,7 +60,7 @@ private: // Internal state BarRenderItem *m_selectedBar; // points to renderitem array - QVector<BarRenderItem *> m_sliceSelection; + QVector<BarRenderSliceItem> m_sliceSelection; AxisRenderCache *m_sliceCache; // not owned const LabelItem *m_sliceTitleItem; // not owned bool m_xFlipped; diff --git a/src/datavisualization/engine/drawer.cpp b/src/datavisualization/engine/drawer.cpp index b70d7c0e..55a2c2a5 100644 --- a/src/datavisualization/engine/drawer.cpp +++ b/src/datavisualization/engine/drawer.cpp @@ -24,6 +24,7 @@ #include "q3dcamera.h" #include "utils_p.h" #include "texturehelper_p.h" +#include "abstract3drenderer_p.h" #include <QtGui/QMatrix4x4> #include <QtCore/qmath.h> @@ -349,10 +350,10 @@ void Drawer::drawLabel(const AbstractRenderItem &item, const LabelItem &labelIte drawObject(shader, object, labelItem.textureId()); } -void Drawer::generateSelectionLabelTexture(AbstractRenderItem *item) +void Drawer::generateSelectionLabelTexture(Abstract3DRenderer *renderer) { - LabelItem &labelItem = item->selectionLabelItem(); - generateLabelItem(labelItem, item->selectionLabel()); + LabelItem &labelItem = renderer->selectionLabelItem(); + generateLabelItem(labelItem, renderer->selectionLabel()); } void Drawer::generateLabelItem(LabelItem &item, const QString &text, int widestLabel) diff --git a/src/datavisualization/engine/drawer_p.h b/src/datavisualization/engine/drawer_p.h index 54c8111e..8e98aa3a 100644 --- a/src/datavisualization/engine/drawer_p.h +++ b/src/datavisualization/engine/drawer_p.h @@ -43,6 +43,7 @@ class AbstractObjectHelper; class SurfaceObject; class TextureHelper; class Q3DCamera; +class Abstract3DRenderer; class Drawer : public QObject, public QOpenGLFunctions { @@ -83,7 +84,7 @@ public: LabelPosition position = LabelOver, Qt::AlignmentFlag alignment = Qt::AlignCenter, bool isSlicing = false); - void generateSelectionLabelTexture(AbstractRenderItem *item); + void generateSelectionLabelTexture(Abstract3DRenderer *item); void generateLabelItem(LabelItem &item, const QString &text, int widestLabel = 0); Q_SIGNALS: diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp index 19061b11..de1a769a 100644 --- a/src/datavisualization/engine/scatter3drenderer.cpp +++ b/src/datavisualization/engine/scatter3drenderer.cpp @@ -1460,10 +1460,10 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) } else { glDisable(GL_DEPTH_TEST); // Draw the selection label - LabelItem &labelItem = selectedItem->selectionLabelItem(); + LabelItem &labelItem = selectionLabelItem(); if (m_selectedItem != selectedItem || m_updateLabels || !labelItem.textureId() || m_selectionLabelDirty) { - QString labelText = selectedItem->selectionLabel(); + QString labelText = selectionLabel(); if (labelText.isNull() || m_selectionLabelDirty) { static const QString xTitleTag(QStringLiteral("@xTitle")); static const QString yTitleTag(QStringLiteral("@yTitle")); @@ -1505,7 +1505,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) } labelText.replace(seriesNameTag, m_visibleSeriesList[m_selectedItemSeriesIndex].name()); - selectedItem->setSelectionLabel(labelText); + setSelectionLabel(labelText); m_selectionLabelDirty = false; } m_drawer->generateLabelItem(labelItem, labelText); @@ -1534,6 +1534,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) void Scatter3DRenderer::updateSelectedItem(int index, const QScatter3DSeries *series) { m_selectionDirty = true; + m_selectionLabelDirty = true; m_selectedSeries = series; m_selectedItemIndex = Scatter3DController::invalidSelectionIndex(); m_selectedItemTotalIndex = Scatter3DController::invalidSelectionIndex(); |