From 9a40207d83b66072fff4aaa03eca15b02f8a11c1 Mon Sep 17 00:00:00 2001 From: Mika Salmela Date: Thu, 28 Aug 2014 10:29:39 +0300 Subject: Range gradient for points on static optimization Change-Id: Ic44a6a28617f272540d146f02bf50b4bd84cd9c8 Reviewed-by: Miikka Heikkinen --- .../utils/scatterobjectbufferhelper.cpp | 2 +- .../utils/scatterpointbufferhelper.cpp | 50 ++++++++++++++++++++++ .../utils/scatterpointbufferhelper_p.h | 7 +++ 3 files changed, 58 insertions(+), 1 deletion(-) (limited to 'src/datavisualization/utils') diff --git a/src/datavisualization/utils/scatterobjectbufferhelper.cpp b/src/datavisualization/utils/scatterobjectbufferhelper.cpp index 9ecdffdd..5e98363e 100644 --- a/src/datavisualization/utils/scatterobjectbufferhelper.cpp +++ b/src/datavisualization/utils/scatterobjectbufferhelper.cpp @@ -220,7 +220,7 @@ uint ScatterObjectBufferHelper::createRangeGradientUVs(ScatterSeriesRenderCache if (!item.isVisible()) continue; - float y = ((item.translation().y() + m_scaleY) * 0.5f ) / m_scaleY; + float y = ((item.translation().y() + m_scaleY) * 0.5f) / m_scaleY; uv.setY(y); int offset = pos * uvsCount; for (int j = 0; j < uvsCount; j++) diff --git a/src/datavisualization/utils/scatterpointbufferhelper.cpp b/src/datavisualization/utils/scatterpointbufferhelper.cpp index b14d84ad..2ddee31c 100644 --- a/src/datavisualization/utils/scatterpointbufferhelper.cpp +++ b/src/datavisualization/utils/scatterpointbufferhelper.cpp @@ -17,6 +17,7 @@ ****************************************************************************/ #include "scatterpointbufferhelper_p.h" +#include QT_BEGIN_NAMESPACE_DATAVISUALIZATION @@ -86,9 +87,14 @@ void ScatterPointBufferHelper::load(ScatterSeriesRenderCache *cache) if (m_meshDataLoaded) { // Delete old data glDeleteBuffers(1, &m_pointbuffer); + glDeleteBuffers(1, &m_uvbuffer); m_bufferedPoints.clear(); } + QVector buffered_uvs; + if (cache->colorStyle() == Q3DTheme::ColorStyleRangeGradient) + createRangeGradientUVs(cache, buffered_uvs); + bool itemsVisible = false; m_bufferedPoints.resize(renderArraySize); for (int i = 0; i < renderArraySize; i++) { @@ -110,10 +116,54 @@ void ScatterPointBufferHelper::load(ScatterSeriesRenderCache *cache) glBufferData(GL_ARRAY_BUFFER, m_bufferedPoints.size() * sizeof(QVector3D), &m_bufferedPoints.at(0), GL_DYNAMIC_DRAW); + + if (buffered_uvs.size()) { + glGenBuffers(1, &m_uvbuffer); + glBindBuffer(GL_ARRAY_BUFFER, m_uvbuffer); + glBufferData(GL_ARRAY_BUFFER, buffered_uvs.size() * sizeof(QVector2D), + &buffered_uvs.at(0), GL_STATIC_DRAW); + } + glBindBuffer(GL_ARRAY_BUFFER, 0); m_meshDataLoaded = true; } } +void ScatterPointBufferHelper::updateUVs(ScatterSeriesRenderCache *cache) +{ + QVector buffered_uvs; + + createRangeGradientUVs(cache, buffered_uvs); + + if (buffered_uvs.size()) { + if (!m_uvbuffer) + glGenBuffers(1, &m_uvbuffer); + + glBindBuffer(GL_ARRAY_BUFFER, m_uvbuffer); + glBufferData(GL_ARRAY_BUFFER, buffered_uvs.size() * sizeof(QVector2D), + &buffered_uvs.at(0), GL_STATIC_DRAW); + + glBindBuffer(GL_ARRAY_BUFFER, 0); + } +} + +void ScatterPointBufferHelper::createRangeGradientUVs(ScatterSeriesRenderCache *cache, + QVector &buffered_uvs) +{ + const ScatterRenderItemArray &renderArray = cache->renderArray(); + const uint renderArraySize = renderArray.size(); + buffered_uvs.resize(renderArraySize); + + QVector2D uv; + uv.setX(0.0f); + for (uint i = 0; i < renderArraySize; i++) { + const ScatterRenderItem &item = renderArray.at(i); + + float y = ((item.translation().y() + m_scaleY) * 0.5f) / m_scaleY; + uv.setY(y); + buffered_uvs[i] = uv; + } +} + QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/utils/scatterpointbufferhelper_p.h b/src/datavisualization/utils/scatterpointbufferhelper_p.h index d09ce0f7..3edc4c8f 100644 --- a/src/datavisualization/utils/scatterpointbufferhelper_p.h +++ b/src/datavisualization/utils/scatterpointbufferhelper_p.h @@ -46,14 +46,21 @@ public: void pushPoint(uint pointIndex); void popPoint(); void load(ScatterSeriesRenderCache *cache); + void setScaleY(float scale) { m_scaleY = scale; } + void updateUVs(ScatterSeriesRenderCache *cache); public: GLuint m_pointbuffer; +private: + void createRangeGradientUVs(ScatterSeriesRenderCache *cache, + QVector &buffered_uvs); + private: QVector m_bufferedPoints; uint m_oldRemoveIndex; bool m_oldRemove; + float m_scaleY; }; QT_END_NAMESPACE_DATAVISUALIZATION -- cgit v1.2.3