diff options
author | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2013-07-09 10:02:00 +0300 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2013-07-09 10:38:41 +0300 |
commit | 93b5a6af81a7c719f63870b3e9c5ce071b113970 (patch) | |
tree | 5edbb41b556b4dc859734a3d2b3616020efea3c4 | |
parent | 24275c551f0a10df022f037962d1678b7213ef09 (diff) |
Misc fixes:
- Prettied up widget example dynamic data axes a bit by only
generating label for each fifth row/column.
- Category axes clear labelitem when label string is empty.
- Inlined most render item functions.
- Cache bar height into render items.
- Fix building of rainfall example.
Change-Id: Ia945e2253bd31bf3f6b3ac4856ab6bbcc18e2d59
Reviewed-by: Mika Salmela <mika.salmela@digia.com>
-rw-r--r-- | examples/rainfall/main.cpp | 2 | ||||
-rw-r--r-- | examples/widget/chart.cpp | 20 | ||||
-rw-r--r-- | src/datavis3d/axis/qcategoryaxis.cpp | 12 | ||||
-rw-r--r-- | src/datavis3d/data/abstractrenderitem_p.h | 4 | ||||
-rw-r--r-- | src/datavis3d/data/barrenderitem.cpp | 8 | ||||
-rw-r--r-- | src/datavis3d/data/barrenderitem_p.h | 24 | ||||
-rw-r--r-- | src/datavis3d/engine/bars3drenderer.cpp | 75 | ||||
-rw-r--r-- | src/datavis3d/engine/bars3drenderer_p.h | 2 | ||||
-rw-r--r-- | src/datavis3d/engine/drawer_p.h | 2 |
9 files changed, 80 insertions, 69 deletions
diff --git a/examples/rainfall/main.cpp b/examples/rainfall/main.cpp index a13e91f9..db736903 100644 --- a/examples/rainfall/main.cpp +++ b/examples/rainfall/main.cpp @@ -45,7 +45,7 @@ #include <QGuiApplication> #include <QFont> -//#include <QDebug> +#include <QDebug> using namespace QtDataVis3D; diff --git a/examples/widget/chart.cpp b/examples/widget/chart.cpp index 8d6c5f99..39e19d4c 100644 --- a/examples/widget/chart.cpp +++ b/examples/widget/chart.cpp @@ -66,11 +66,18 @@ ChartModifier::ChartModifier(Q3DBars *barchart) { // Don't set any styles or specifications, start from defaults // Generate generic labels - for (int i = 0; i < 200; i++) - m_genericRowLabels << QStringLiteral("Row %1").arg(i); - for (int i = 0; i < 200; i++) - m_genericColumnLabels << QStringLiteral("Column %1").arg(i); - + for (int i = 0; i < 200; i++) { + if (i % 5) + m_genericRowLabels << QString(); + else + m_genericRowLabels << QStringLiteral("Row %1").arg(i); + } + for (int i = 0; i < 200; i++) { + if (i % 5) + m_genericColumnLabels << QString(); + else + m_genericColumnLabels << QStringLiteral("Column %1").arg(i); + } } ChartModifier::~ChartModifier() @@ -199,9 +206,10 @@ void ChartModifier::addRows() dataArray->append(dataRow); } m_chart->dataProxy()->insertRows(0, dataArray); + qDebug() << "Added" << m_rowCount << "rows, time:" << timer.elapsed(); if (oldCount < m_rowCount) m_chart->rowAxis()->setLabels(m_genericRowLabels.mid(0, m_rowCount)); - qDebug() << "Added" << m_rowCount << "rows, time:" << timer.elapsed(); + qDebug() << "... Including Label creation, time:" << timer.elapsed(); } void ChartModifier::changeStyle() diff --git a/src/datavis3d/axis/qcategoryaxis.cpp b/src/datavis3d/axis/qcategoryaxis.cpp index d268c98b..80dc8fdb 100644 --- a/src/datavis3d/axis/qcategoryaxis.cpp +++ b/src/datavis3d/axis/qcategoryaxis.cpp @@ -67,7 +67,9 @@ void QCategoryAxis::setLabels(const QStringList &labels) for (int i = 0; i < newSize; i++) { if (i >= oldSize) d_ptr->m_labelItems.append(new LabelItem); - if (i >= oldSize || labels.at(i) != d_ptr->m_labels.at(i)) + if (labels.at(i).isEmpty()) + d_ptr->m_labelItems[i]->clear(); + else if (i >= oldSize || labels.at(i) != d_ptr->m_labels.at(i)) d_ptr->m_drawer->generateLabelItem(*d_ptr->m_labelItems[i], labels.at(i)); } } @@ -91,8 +93,12 @@ QCategoryAxisPrivate::~QCategoryAxisPrivate() void QCategoryAxisPrivate::updateLabels() { - for (int i = 0; i < m_labels.size(); i++) - m_drawer->generateLabelItem(*m_labelItems[i], m_labels.at(i)); + for (int i = 0; i < m_labels.size(); i++) { + if (m_labels.at(i).isEmpty()) + m_labelItems[i]->clear(); + else + m_drawer->generateLabelItem(*m_labelItems[i], m_labels.at(i)); + } } QT_DATAVIS3D_END_NAMESPACE diff --git a/src/datavis3d/data/abstractrenderitem_p.h b/src/datavis3d/data/abstractrenderitem_p.h index fa896169..7db487fd 100644 --- a/src/datavis3d/data/abstractrenderitem_p.h +++ b/src/datavis3d/data/abstractrenderitem_p.h @@ -68,8 +68,8 @@ public: virtual ~AbstractRenderItem(); // Position in 3D scene - void setTranslation(const QVector3D &translation) { m_translation = translation; } - const QVector3D &translation() const {return m_translation; } + inline void setTranslation(const QVector3D &translation) { m_translation = translation; } + inline const QVector3D &translation() const {return m_translation; } // Label item for formatted label // Ownership of the label texture (if any) transfers to QAbstractDataItemPrivate diff --git a/src/datavis3d/data/barrenderitem.cpp b/src/datavis3d/data/barrenderitem.cpp index d7f5a70c..f17a5d3a 100644 --- a/src/datavis3d/data/barrenderitem.cpp +++ b/src/datavis3d/data/barrenderitem.cpp @@ -55,14 +55,6 @@ BarRenderItem::~BarRenderItem() { } -void BarRenderItem::setValue(qreal value) -{ - if (m_value != value) { - m_value = value; - setLabel(QString()); // Forces reformatting on next access - } -} - void BarRenderItem::formatLabel() { // Format the string on first access diff --git a/src/datavis3d/data/barrenderitem_p.h b/src/datavis3d/data/barrenderitem_p.h index 0bafa9ba..e576cbb7 100644 --- a/src/datavis3d/data/barrenderitem_p.h +++ b/src/datavis3d/data/barrenderitem_p.h @@ -65,15 +65,19 @@ public: virtual ~BarRenderItem(); // Position relative to data window (for bar label generation) - const QPoint &position() { return m_position; } - void setPosition(const QPoint &pos) { m_position = pos; } + inline const QPoint &position() { return m_position; } + inline void setPosition(const QPoint &pos) { m_position = pos; } // Actual cached data value of the bar (needed to trigger label reformats) - void setValue(qreal value); - qreal value() { return m_value; } + inline void setValue(qreal value); + inline qreal value() { return m_value; } + + // Normalized bar height + inline void setHeight(GLfloat height) { m_height = height; } + inline GLfloat height() { return m_height; } // TODO should be in abstract, but currently there is no abstract renderer - void setRenderer(Bars3dRenderer *renderer) { m_renderer = renderer; } + inline void setRenderer(Bars3dRenderer *renderer) { m_renderer = renderer; } protected: virtual void formatLabel(); @@ -81,10 +85,20 @@ protected: Bars3dRenderer *m_renderer; qreal m_value; QPoint m_position; // x = row, y = column + GLfloat m_height; friend class QBarDataItem; }; +void BarRenderItem::setValue(qreal value) +{ + if (m_value != value) { + m_value = value; + if (!m_label.isNull()) + setLabel(QString()); // Forces reformatting on next access + } +} + typedef QVector<BarRenderItem> BarRenderItemRow; typedef QVector<BarRenderItemRow> BarRenderItemArray; diff --git a/src/datavis3d/engine/bars3drenderer.cpp b/src/datavis3d/engine/bars3drenderer.cpp index c2bfc8ed..65b50112 100644 --- a/src/datavis3d/engine/bars3drenderer.cpp +++ b/src/datavis3d/engine/bars3drenderer.cpp @@ -110,7 +110,7 @@ Bars3dRenderer::Bars3dRenderer(Bars3dController *controller) m_selectionDepthBuffer(0), m_shadowQualityToShader(33.3f), m_autoScaleAdjustment(1.0f), - m_heightNormalizer(0.0f), + m_heightNormalizer(1.0f), m_yAdjustment(0.0f), m_rowWidth(0), m_columnDepth(0), @@ -122,7 +122,7 @@ Bars3dRenderer::Bars3dRenderer(Bars3dController *controller) m_selection(selectionSkipColor), m_hasHeightAdjustmentChanged(true), m_dataProxy(0), - m_dataWindowChanged(false) + m_valueUpdateNeeded(false) #ifdef DISPLAY_RENDER_SPEED ,m_isFirstFrame(true), m_numFrames(0) @@ -337,8 +337,8 @@ void Bars3dRenderer::render(QBarDataProxy *dataProxy, // Update cached data window // TODO Should data changes be notified via signal instead of reading data in render? // TODO this cache initialization assumes data window starts at 0,0 offset from array - if (valuesDirty || m_dataWindowChanged) { - m_dataWindowChanged = false; + if (valuesDirty || m_valueUpdateNeeded) { + m_valueUpdateNeeded = false; int dataRowCount = dataProxy->rowCount(); for (int i = 0; i < m_renderItemArray.size(); i++) { int j = 0; @@ -346,8 +346,11 @@ void Bars3dRenderer::render(QBarDataProxy *dataProxy, const QBarDataRow *dataRow = dataProxy->rowAt(i); int updateSize = qMin(dataRow->size(), m_renderItemArray[i].size()); if (dataRow) { - for (; j < updateSize ; j++) - m_renderItemArray[i][j].setValue(dataRow->at(j).value()); + for (; j < updateSize ; j++) { + qreal value = dataRow->at(j).value(); + m_renderItemArray[i][j].setValue(value); + m_renderItemArray[i][j].setHeight(value / m_heightNormalizer); + } } } for (; j < m_renderItemArray[i].size(); j++) @@ -446,9 +449,7 @@ void Bars3dRenderer::drawSlicedScene(CameraHelper *camera, if (!item) continue; - GLfloat barHeight = item->value() / m_heightNormalizer; - - if (barHeight < 0) + if (item->height() < 0) glCullFace(GL_FRONT); else glCullFace(GL_BACK); @@ -463,19 +464,19 @@ void Bars3dRenderer::drawSlicedScene(CameraHelper *camera, else barPosX = -(item->translation().z() - zComp); // flip z; frontmost bar to the left modelMatrix.translate(barPosX, barPosY, zComp); - modelMatrix.scale(QVector3D(m_scaleX, barHeight, m_scaleZ)); - itModelMatrix.scale(QVector3D(m_scaleX, barHeight, m_scaleZ)); + modelMatrix.scale(QVector3D(m_scaleX, item->height(), m_scaleZ)); + itModelMatrix.scale(QVector3D(m_scaleX, item->height(), m_scaleZ)); MVPMatrix = projectionMatrix * viewMatrix * modelMatrix; QVector3D baseColor = Utils::vectorFromColor(m_cachedTheme.m_baseColor); - QVector3D heightColor = Utils::vectorFromColor(m_cachedTheme.m_heightColor) * barHeight; + QVector3D heightColor = Utils::vectorFromColor(m_cachedTheme.m_heightColor) * item->height(); QVector3D barColor = baseColor + heightColor; GLfloat lightStrength = m_cachedTheme.m_lightStrength; - if (barHeight != 0) { + if (item->height() != 0) { // Set shader bindings m_barShader->setUniformValue(m_barShader->lightP(), lightPos); m_barShader->setUniformValue(m_barShader->view(), viewMatrix); @@ -547,7 +548,7 @@ void Bars3dRenderer::drawSlicedScene(CameraHelper *camera, // Draw values m_drawer->drawLabel(*item, item->labelItem(), viewMatrix, projectionMatrix, QVector3D(0.0f, m_yAdjustment, zComp), - QVector3D(0.0f, 0.0f, 0.0f), (item->value() / m_heightNormalizer), + QVector3D(0.0f, 0.0f, 0.0f), item->height(), m_cachedSelectionMode, m_labelShader, m_labelObj, camera); @@ -564,7 +565,7 @@ void Bars3dRenderer::drawSlicedScene(CameraHelper *camera, } m_drawer->drawLabel(*item, *labelItem, viewMatrix, projectionMatrix, QVector3D(0.0f, m_yAdjustment, zComp), - QVector3D(0.0f, 0.0f, -45.0f), (item->value() / m_heightNormalizer), + QVector3D(0.0f, 0.0f, -45.0f), item->height(), m_cachedSelectionMode, m_labelShader, m_labelObj, camera, false, false, LabelBelow); } @@ -701,16 +702,9 @@ void Bars3dRenderer::drawScene(CameraHelper *camera, if (!item.value()) continue; - // TODO Cache barHeights to render items - GLfloat barHeight = item.value() / m_heightNormalizer; - - // skip shadows for 0 -height bars - if (barHeight == 0) - continue; - // Set front face culling for positive valued bars and back face culling for // negative valued bars to reduce self-shadowing issues - if (barHeight < 0) + if (item.height() < 0) glCullFace(GL_BACK); else glCullFace(GL_FRONT); @@ -722,9 +716,9 @@ void Bars3dRenderer::drawScene(CameraHelper *camera, rowPos = (row + 1) * (m_cachedBarSpacing.height()); modelMatrix.translate((m_rowWidth - barPos) / m_scaleFactor, - barHeight - m_yAdjustment, + item.height() - m_yAdjustment, (m_columnDepth - rowPos) / m_scaleFactor + zComp); - modelMatrix.scale(QVector3D(m_scaleX, barHeight, m_scaleZ)); + modelMatrix.scale(QVector3D(m_scaleX, item.height(), m_scaleZ)); MVPMatrix = depthProjectionMatrix * depthViewMatrix * modelMatrix; @@ -801,10 +795,8 @@ void Bars3dRenderer::drawScene(CameraHelper *camera, BarRenderItem &item = m_renderItemArray[row][bar]; if (!item.value()) continue; - // TODO resolved bar heights should be cached? - GLfloat barHeight = item.value() / m_heightNormalizer; - if (barHeight < 0) + if (item.height() < 0) glCullFace(GL_FRONT); else glCullFace(GL_BACK); @@ -816,9 +808,9 @@ void Bars3dRenderer::drawScene(CameraHelper *camera, rowPos = (row + 1) * (m_cachedBarSpacing.height()); modelMatrix.translate((m_rowWidth - barPos) / m_scaleFactor, - barHeight - m_yAdjustment, + item.height() - m_yAdjustment, (m_columnDepth - rowPos) / m_scaleFactor + zComp); - modelMatrix.scale(QVector3D(m_scaleX, barHeight, m_scaleZ)); + modelMatrix.scale(QVector3D(m_scaleX, item.height(), m_scaleZ)); MVPMatrix = projectionMatrix * viewMatrix * modelMatrix; @@ -914,10 +906,7 @@ void Bars3dRenderer::drawScene(CameraHelper *camera, if (!item.value()) continue; - // TODO resolved bar heights should be cached? - GLfloat barHeight = item.value() / m_heightNormalizer; - - if (barHeight < 0) + if (item.height() < 0) glCullFace(GL_FRONT); else glCullFace(GL_BACK); @@ -930,10 +919,10 @@ void Bars3dRenderer::drawScene(CameraHelper *camera, barPos = (bar + 1) * (m_cachedBarSpacing.width()); rowPos = (row + 1) * (m_cachedBarSpacing.height()); modelMatrix.translate((m_rowWidth - barPos) / m_scaleFactor, - barHeight - m_yAdjustment, + item.height() - m_yAdjustment, (m_columnDepth - rowPos) / m_scaleFactor + zComp); - modelMatrix.scale(QVector3D(m_scaleX, barHeight, m_scaleZ)); - itModelMatrix.scale(QVector3D(m_scaleX, barHeight, m_scaleZ)); + modelMatrix.scale(QVector3D(m_scaleX, item.height(), m_scaleZ)); + itModelMatrix.scale(QVector3D(m_scaleX, item.height(), m_scaleZ)); #ifdef SHOW_DEPTH_TEXTURE_SCENE MVPMatrix = depthProjectionMatrix * depthViewMatrix * modelMatrix; #else @@ -942,7 +931,7 @@ void Bars3dRenderer::drawScene(CameraHelper *camera, depthMVPMatrix = depthProjectionMatrix * depthViewMatrix * modelMatrix; QVector3D baseColor = Utils::vectorFromColor(m_cachedTheme.m_baseColor); - QVector3D heightColor = Utils::vectorFromColor(m_cachedTheme.m_heightColor) * barHeight; + QVector3D heightColor = Utils::vectorFromColor(m_cachedTheme.m_heightColor) * item.height(); QVector3D depthColor = Utils::vectorFromColor(m_cachedTheme.m_depthColor) * (float(row) / GLfloat(m_cachedRowCount)); @@ -1011,7 +1000,7 @@ void Bars3dRenderer::drawScene(CameraHelper *camera, } } - if (barHeight != 0) { + if (item.height() != 0) { // Set shader bindings m_barShader->setUniformValue(m_barShader->lightP(), lightPos); m_barShader->setUniformValue(m_barShader->view(), viewMatrix); @@ -1400,7 +1389,7 @@ void Bars3dRenderer::drawScene(CameraHelper *camera, m_drawer->drawLabel(*m_selectedBar, m_selectedBar->label(), viewMatrix, projectionMatrix, QVector3D(0.0f, m_yAdjustment, zComp), - QVector3D(0.0f, 0.0f, 0.0f), m_heightNormalizer, + QVector3D(0.0f, 0.0f, 0.0f), m_cachedSelectionMode, m_labelShader, m_labelObj, true); #else @@ -1423,7 +1412,7 @@ void Bars3dRenderer::drawScene(CameraHelper *camera, m_drawer->drawLabel(*m_selectedBar, labelItem, viewMatrix, projectionMatrix, QVector3D(0.0f, m_yAdjustment, zComp), - QVector3D(0.0f, 0.0f, 0.0f), (m_selectedBar->value() / m_heightNormalizer), + QVector3D(0.0f, 0.0f, 0.0f), m_selectedBar->height(), m_cachedSelectionMode, m_labelShader, m_labelObj, camera, true, false); #endif @@ -1615,7 +1604,7 @@ void Bars3dRenderer::updateSampleSpace(int rowCount, int columnCount) m_renderItemArray[i][j].setRenderer(this); } - m_dataWindowChanged = true; + m_valueUpdateNeeded = true; // Force update for selection related items m_sliceAxisP = 0; @@ -1772,6 +1761,7 @@ void Bars3dRenderer::updateTickCount(GLint tickCount, GLfloat step, GLfloat mini if (tickCount > 0 && step > 0) { m_heightNormalizer = tickCount * step; calculateHeightAdjustment(QPair<float, float>(minimum, m_heightNormalizer)); + m_valueUpdateNeeded = true; } } @@ -1914,6 +1904,7 @@ void Bars3dRenderer::updateLimits(QPair<GLfloat, GLfloat> limits) if (m_tickCount == 0) { m_heightNormalizer = (GLfloat)qMax(qFabs(limits.second), qFabs(limits.first)); calculateHeightAdjustment(limits); + m_valueUpdateNeeded = true; } } diff --git a/src/datavis3d/engine/bars3drenderer_p.h b/src/datavis3d/engine/bars3drenderer_p.h index 2f56ef62..9f5c9bc3 100644 --- a/src/datavis3d/engine/bars3drenderer_p.h +++ b/src/datavis3d/engine/bars3drenderer_p.h @@ -167,7 +167,7 @@ private: QBarDataProxy *m_dataProxy; // Only valid during render BarRenderItemArray m_renderItemArray; - bool m_dataWindowChanged; + bool m_valueUpdateNeeded; #ifdef DISPLAY_RENDER_SPEED bool m_isFirstFrame; diff --git a/src/datavis3d/engine/drawer_p.h b/src/datavis3d/engine/drawer_p.h index 0657da0c..27f1e871 100644 --- a/src/datavis3d/engine/drawer_p.h +++ b/src/datavis3d/engine/drawer_p.h @@ -84,7 +84,7 @@ public: GLuint depthTextureId = 0); void drawLabel(const AbstractRenderItem &item, const LabelItem &label, const QMatrix4x4 &viewmatrix, const QMatrix4x4 &projectionmatrix, - const QVector3D &positionComp, const QVector3D &rotation, GLfloat maxHeight, + const QVector3D &positionComp, const QVector3D &rotation, GLfloat itemHeight, SelectionMode mode, ShaderHelper *shader, ObjectHelper *object, CameraHelper *camera, bool useDepth = false, bool rotateAlong = false, |