From d56d7703ac755022f85634db98bd43db3ee31cd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Tue, 25 Mar 2014 09:06:33 +0200 Subject: Added range gradient support for MeshPoints Task-number: QTRD-2701 Change-Id: Id3f096099ef584a6feaaebcbecc084810ec27967 Reviewed-by: Miikka Heikkinen --- README | 1 - src/datavisualization/data/qabstract3dseries.cpp | 3 ++- src/datavisualization/doc/src/qtdatavisualization.qdoc | 2 -- src/datavisualization/engine/scatter3drenderer.cpp | 7 +++++++ src/datavisualization/engine/seriesrendercache.cpp | 2 ++ src/datavisualization/engine/seriesrendercache_p.h | 2 ++ src/datavisualization/utils/utils.cpp | 10 ++++++++++ src/datavisualization/utils/utils_p.h | 2 ++ 8 files changed, 25 insertions(+), 4 deletions(-) diff --git a/README b/README index 7a4b9edb..b51eb586 100644 --- a/README +++ b/README @@ -82,6 +82,5 @@ Known Issues - Q3DLight class (and Light3D QML item) are currently not usable for anything. - Changing any of Q3DScene properties affecting subviewports currently has no effect. - The color style Q3DTheme::ColorStyleObjectGradient doesn't work for surface graphs. -- Scatter "point" meshes do not support gradients, they always use the base color. - Widget based examples layout incorrectly in iOS. - Reparenting a graph to an item in another QQuickWindow is not supported. diff --git a/src/datavisualization/data/qabstract3dseries.cpp b/src/datavisualization/data/qabstract3dseries.cpp index e593a1d9..802a4e8e 100644 --- a/src/datavisualization/data/qabstract3dseries.cpp +++ b/src/datavisualization/data/qabstract3dseries.cpp @@ -102,7 +102,8 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * Arrow pointing upwards. * \value MeshPoint * 2D point. Usable only with Q3DScatter. - * \b Note: Shadows and color gradients do not affect this style. + * \b Note: Shadows do not affect this style. Color style Q3DTheme::ColorStyleObjectGradient + * is not supported by this style. */ /*! diff --git a/src/datavisualization/doc/src/qtdatavisualization.qdoc b/src/datavisualization/doc/src/qtdatavisualization.qdoc index 061addf1..90b1a41e 100644 --- a/src/datavisualization/doc/src/qtdatavisualization.qdoc +++ b/src/datavisualization/doc/src/qtdatavisualization.qdoc @@ -323,8 +323,6 @@ \li Q3DLight class (and Light3D QML item) are currently not usable for anything. \li Changing any of Q3DScene properties affecting subviewports currently has no effect. \li The color style Q3DTheme::ColorStyleObjectGradient doesn't work for surface graphs. - \li Scatter "point" meshes (QAbstract3DSeries::MeshPoint) do not support gradients, they - always use the base color. \li Widget based examples layout incorrectly in iOS. \li Reparenting a graph to an item in another QQuickWindow is not supported. \endlist diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp index ae4b3831..2c957f79 100644 --- a/src/datavisualization/engine/scatter3drenderer.cpp +++ b/src/datavisualization/engine/scatter3drenderer.cpp @@ -730,6 +730,13 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) dotShader->setUniformValue(dotShader->MVP(), MVPMatrix); if (useColor) { + if (colorStyle == Q3DTheme::ColorStyleRangeGradient) { + // Drawing points with range gradient + // Get color from gradient based on items y position converted to percents + int position = int(item.translation().y() * 50.0f) + 50; + dotColor = Utils::vectorFromColor( + currentSeries.gradientImage().pixel(0, position)); + } dotShader->setUniformValue(dotShader->color(), dotColor); } else if (colorStyle == Q3DTheme::ColorStyleRangeGradient) { dotShader->setUniformValue(dotShader->gradientMin(), diff --git a/src/datavisualization/engine/seriesrendercache.cpp b/src/datavisualization/engine/seriesrendercache.cpp index 896b3b28..8cfd9b08 100644 --- a/src/datavisualization/engine/seriesrendercache.cpp +++ b/src/datavisualization/engine/seriesrendercache.cpp @@ -32,6 +32,7 @@ SeriesRenderCache::SeriesRenderCache() m_mesh(QAbstract3DSeries::MeshCube), m_baseUniformTexture(0), m_baseGradientTexture(0), + m_gradientImage(0), m_singleHighlightGradientTexture(0), m_multiHighlightGradientTexture(0) { @@ -150,6 +151,7 @@ void SeriesRenderCache::populate(QAbstract3DSeries *series, Abstract3DRenderer * if (seriesChanged || changeTracker.baseGradientChanged) { QLinearGradient gradient = series->baseGradient(); + m_gradientImage = Utils::getGradientImage(gradient); renderer->fixGradientAndGenerateTexture(&gradient, &m_baseGradientTexture); changeTracker.baseGradientChanged = false; } diff --git a/src/datavisualization/engine/seriesrendercache_p.h b/src/datavisualization/engine/seriesrendercache_p.h index 77e050b0..1ef67c88 100644 --- a/src/datavisualization/engine/seriesrendercache_p.h +++ b/src/datavisualization/engine/seriesrendercache_p.h @@ -60,6 +60,7 @@ public: inline const QVector3D &baseColor() const { return m_baseColor; } inline const GLuint &baseUniformTexture() const { return m_baseUniformTexture; } inline const GLuint &baseGradientTexture() const { return m_baseGradientTexture; } + inline const QImage &gradientImage() const { return m_gradientImage; } inline const QVector3D &singleHighlightColor() const { return m_singleHighlightColor; } inline const GLuint &singleHighlightGradientTexture() const { return m_singleHighlightGradientTexture; } inline const QVector3D &multiHighlightColor() const { return m_multiHighlightColor; } @@ -77,6 +78,7 @@ protected: QVector3D m_baseColor; GLuint m_baseUniformTexture; GLuint m_baseGradientTexture; + QImage m_gradientImage; QVector3D m_singleHighlightColor; GLuint m_singleHighlightGradientTexture; QVector3D m_multiHighlightColor; diff --git a/src/datavisualization/utils/utils.cpp b/src/datavisualization/utils/utils.cpp index e0b1370e..be087f91 100644 --- a/src/datavisualization/utils/utils.cpp +++ b/src/datavisualization/utils/utils.cpp @@ -138,6 +138,16 @@ QVector3D Utils::getSelection(QPoint mousepos, int height) return selectedColor; } +QImage Utils::getGradientImage(const QLinearGradient &gradient) +{ + QImage image(QSize(1, 101), QImage::Format_RGB32); + QPainter pmp(&image); + pmp.setBrush(QBrush(gradient)); + pmp.setPen(Qt::NoPen); + pmp.drawRect(0, 0, 1, 101); + return image; +} + Utils::ParamType Utils::mapFormatCharToParamType(const QChar &formatChar) { ParamType retVal = ParamTypeUnknown; diff --git a/src/datavisualization/utils/utils_p.h b/src/datavisualization/utils/utils_p.h index 7288419b..c87ef19a 100644 --- a/src/datavisualization/utils/utils_p.h +++ b/src/datavisualization/utils/utils_p.h @@ -37,6 +37,7 @@ class QPainter; class QString; class QPoint; class QImage; +class QLinearGradient; QT_BEGIN_NAMESPACE_DATAVISUALIZATION @@ -63,6 +64,7 @@ public: bool borders = false, int maxLabelWidth = 0); static QVector3D getSelection(QPoint mousepos, int height); + static QImage getGradientImage(const QLinearGradient &gradient); static ParamType findFormatParamType(const QString &format); static QString formatLabel(const QByteArray &format, ParamType paramType, float value); -- cgit v1.2.3