summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/datavisualization/utils/scatterobjectbufferhelper.cpp13
-rw-r--r--tests/scattertest/scatterchart.cpp15
2 files changed, 27 insertions, 1 deletions
diff --git a/src/datavisualization/utils/scatterobjectbufferhelper.cpp b/src/datavisualization/utils/scatterobjectbufferhelper.cpp
index dae60b96..6135c225 100644
--- a/src/datavisualization/utils/scatterobjectbufferhelper.cpp
+++ b/src/datavisualization/utils/scatterobjectbufferhelper.cpp
@@ -20,6 +20,7 @@
#include "objecthelper_p.h"
#include <QtGui/QVector2D>
#include <QtGui/QMatrix4x4>
+#include <QtCore/qmath.h>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
@@ -232,6 +233,8 @@ uint ScatterObjectBufferHelper::createRangeGradientUVs(ScatterSeriesRenderCache
const ScatterRenderItemArray &renderArray = cache->renderArray();
const bool updateAll = (cache->updateIndices().size() == 0);
const int updateSize = updateAll ? renderArray.size() : cache->updateIndices().size();
+ const float yAdjustment = 0.1f / gradientTextureHeight;
+ const float flippedYAdjustment = 0.9f / gradientTextureHeight;
QVector2D uv;
uv.setX(0.0f);
@@ -243,7 +246,17 @@ uint ScatterObjectBufferHelper::createRangeGradientUVs(ScatterSeriesRenderCache
continue;
float y = ((item.translation().y() + m_scaleY) * 0.5f) / m_scaleY;
+
+ // Avoid values near gradient texel boundary, as this causes artifacts
+ // with some graphics cards.
+ const float floorY = float(qFloor(y * gradientTextureHeight));
+ const float diff = y - floorY;
+ if (diff < yAdjustment)
+ y += yAdjustment;
+ else if (diff > flippedYAdjustment)
+ y -= yAdjustment;
uv.setY(y);
+
int offset = pos * uvsCount;
for (int j = 0; j < uvsCount; j++)
buffered_uvs[j + offset] = uv;
diff --git a/tests/scattertest/scatterchart.cpp b/tests/scattertest/scatterchart.cpp
index c7b93c32..e5a7acc3 100644
--- a/tests/scattertest/scatterchart.cpp
+++ b/tests/scattertest/scatterchart.cpp
@@ -723,8 +723,21 @@ void ScatterDataModifier::changeBunch()
if (m_targetSeries->dataProxy()->array()->size()) {
int amount = qMin(m_targetSeries->dataProxy()->array()->size(), 100);
QScatterDataArray items(amount);
- for (int i = 0; i < items.size(); i++)
+ for (int i = 0; i < items.size(); i++) {
items[i].setPosition(randVector());
+ // Change the Y-values of first few items to exact gradient boundaries
+ if (i == 0)
+ items[i].setY(0.65f);
+ else if (i == 1)
+ items[i].setY(0.1f);
+ else if (i == 2)
+ items[i].setY(-0.45f);
+ else if (i == 3)
+ items[i].setY(-1.0f);
+ else if (i == 4)
+ items[i].setY(1.2f);
+ }
+
m_targetSeries->dataProxy()->setItems(0, items);
qDebug() << m_loopCounter << "Changed bunch, array size:" << m_targetSeries->dataProxy()->array()->size();
}