summaryrefslogtreecommitdiffstats
path: root/src/datavisualization/utils/scatterobjectbufferhelper.cpp
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@digia.com>2014-10-03 14:08:25 +0300
committerMiikka Heikkinen <miikka.heikkinen@digia.com>2014-10-03 14:42:24 +0300
commit2788e9f7412fa650f41b25fad1f4b02efb0e5e89 (patch)
treeaa6e297cfca8a6e2cd4160abf6d2973dda996a43 /src/datavisualization/utils/scatterobjectbufferhelper.cpp
parentdf2571bdf0b15237a324471c63913989c80349d8 (diff)
Fix static optimization errors
- Buffer ids were not cleared appropriately - Update didn't account for items outside axis ranges - In some cases wrong shader was used for point series Task-number: QTRD-3353 Change-Id: Iea465d99eb557402feb5fb017ae92393ee8f377f Reviewed-by: Tomi Korpipää <tomi.korpipaa@digia.com>
Diffstat (limited to 'src/datavisualization/utils/scatterobjectbufferhelper.cpp')
-rw-r--r--src/datavisualization/utils/scatterobjectbufferhelper.cpp24
1 files changed, 18 insertions, 6 deletions
diff --git a/src/datavisualization/utils/scatterobjectbufferhelper.cpp b/src/datavisualization/utils/scatterobjectbufferhelper.cpp
index 5eb74011..dae60b96 100644
--- a/src/datavisualization/utils/scatterobjectbufferhelper.cpp
+++ b/src/datavisualization/utils/scatterobjectbufferhelper.cpp
@@ -58,6 +58,10 @@ void ScatterObjectBufferHelper::fullLoad(ScatterSeriesRenderCache *cache, qreal
glDeleteBuffers(1, &m_uvbuffer);
glDeleteBuffers(1, &m_normalbuffer);
glDeleteBuffers(1, &m_elementbuffer);
+ m_vertexbuffer = 0;
+ m_uvbuffer = 0;
+ m_normalbuffer = 0;
+ m_elementbuffer = 0;
}
// Index vertices
@@ -314,13 +318,14 @@ void ScatterObjectBufferHelper::update(ScatterSeriesRenderCache *cache, qreal do
QVector<QVector3D> buffered_vertices;
buffered_vertices.resize(verticeCount * updateSize);
+ int itemCount = 0;
for (int i = 0; i < updateSize; i++) {
int index = updateAll ? i : cache->updateIndices().at(i);
const ScatterRenderItem &item = renderArray.at(index);
if (!item.isVisible())
continue;
- const int offset = i * verticeCount;
+ const int offset = itemCount * verticeCount;
if (item.rotation().isIdentity()) {
for (int j = 0; j < verticeCount; j++)
buffered_vertices[j + offset] = scaled_vertices[j] + item.translation();
@@ -334,18 +339,25 @@ void ScatterObjectBufferHelper::update(ScatterSeriesRenderCache *cache, qreal do
buffered_vertices[j + offset] = indexed_vertices[j] * modelMatrix
+ item.translation();
}
+ itemCount++;
}
glBindBuffer(GL_ARRAY_BUFFER, m_vertexbuffer);
+ int sizeOfItem = verticeCount * sizeof(QVector3D);
if (updateAll) {
- glBufferData(GL_ARRAY_BUFFER, buffered_vertices.size() * sizeof(QVector3D),
- &buffered_vertices.at(0), GL_DYNAMIC_DRAW);
+ if (itemCount) {
+ glBufferData(GL_ARRAY_BUFFER, itemCount * sizeOfItem,
+ &buffered_vertices.at(0), GL_STATIC_DRAW);
+ }
} else {
- int itemSize = verticeCount * sizeof(QVector3D);
+ itemCount = 0;
for (int i = 0; i < updateSize; i++) {
int index = updateAll ? i : cache->updateIndices().at(i);
- glBufferSubData(GL_ARRAY_BUFFER, cache->bufferIndices().at(index) * itemSize,
- itemSize, &buffered_vertices.at(i * verticeCount));
+ if (renderArray.at(index).isVisible()) {
+ glBufferSubData(GL_ARRAY_BUFFER, cache->bufferIndices().at(index) * sizeOfItem,
+ sizeOfItem, &buffered_vertices.at(itemCount * verticeCount));
+ itemCount++;
+ }
}
}
glBindBuffer(GL_ARRAY_BUFFER, 0);