summaryrefslogtreecommitdiffstats
path: root/src/datavisualization/engine/surface3drenderer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/datavisualization/engine/surface3drenderer.cpp')
-rw-r--r--src/datavisualization/engine/surface3drenderer.cpp78
1 files changed, 59 insertions, 19 deletions
diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp
index 4942c4ae..81da15da 100644
--- a/src/datavisualization/engine/surface3drenderer.cpp
+++ b/src/datavisualization/engine/surface3drenderer.cpp
@@ -285,14 +285,8 @@ void Surface3DRenderer::updateSeries(const QList<QAbstract3DSeries *> &seriesLis
}
}
-void Surface3DRenderer::updateRows(int startIndex, int count)
+void Surface3DRenderer::updateRows(const QVector<int> &rows)
{
- // TODO: Properly support non-straight rows and columns (QTRD-2643)
- if (startIndex > m_sampleSpace.height()) {
- // No changes on visible area
- return;
- }
-
// Surface only supports single series for now, so we are only interested in the first series
const QSurfaceDataArray *array = 0;
if (m_visibleSeriesList.size()) {
@@ -306,22 +300,68 @@ void Surface3DRenderer::updateRows(int startIndex, int count)
if (array && array->size() >= 2 && array->at(0)->size() >= 2 &&
m_sampleSpace.width() >= 2 && m_sampleSpace.height() >= 2) {
- int endRow = startIndex + count;
- if (endRow > m_sampleSpace.height())
- endRow = m_sampleSpace.height();
+ bool updateBuffers = false;
+ int sampleSpaceTop = m_sampleSpace.y() + m_sampleSpace.height();
+ foreach (int row, rows) {
+ if (row >= m_sampleSpace.y() && row <= sampleSpaceTop) {
+ updateBuffers = true;
+ for (int j = 0; j < m_sampleSpace.width(); j++)
+ (*(m_dataArray.at(row - m_sampleSpace.y())))[j] =
+ array->at(row)->at(j + m_sampleSpace.x());
+
+ if (m_cachedFlatShading) {
+ m_surfaceObj->updateCoarseRow(m_dataArray, row - m_sampleSpace.y(), m_heightNormalizer,
+ m_axisCacheY.min());
+ } else {
+ m_surfaceObj->updateSmoothRow(m_dataArray, row - m_sampleSpace.y(), m_heightNormalizer,
+ m_axisCacheY.min());
+ }
+ }
+ }
+ if (updateBuffers)
+ m_surfaceObj->uploadBuffers();
+ }
+
+ updateSelectedPoint(m_selectedPoint, m_selectedSeries);
+}
- for (int i = startIndex; i < endRow; i++) {
- for (int j = 0; j < m_sampleSpace.width(); j++)
- (*(m_dataArray.at(i)))[j] = array->at(i + m_sampleSpace.y())->at(j + m_sampleSpace.x());
+void Surface3DRenderer::updateItem(const QVector<QPoint> &points)
+{
+ // TODO: Properly support non-straight rows and columns (QTRD-2643)
+
+ // Surface only supports single series for now, so we are only interested in the first series
+ const QSurfaceDataArray *array = 0;
+ if (m_visibleSeriesList.size()) {
+ QSurface3DSeries *firstSeries = static_cast<QSurface3DSeries *>(m_visibleSeriesList.at(0).series());
+ if (m_cachedSurfaceGridOn || m_cachedSurfaceVisible) {
+ QSurfaceDataProxy *dataProxy = firstSeries->dataProxy();
+ if (dataProxy)
+ array = dataProxy->array();
}
+ }
- if (!m_cachedFlatShading) {
- m_surfaceObj->updateSmoothRows(m_dataArray, startIndex, endRow, m_heightNormalizer,
- m_axisCacheY.min());
- } else {
- m_surfaceObj->updateCoarseRows(m_dataArray, startIndex, endRow, m_heightNormalizer,
- m_axisCacheY.min());
+ if (array && array->size() >= 2 && array->at(0)->size() >= 2 &&
+ m_sampleSpace.width() >= 2 && m_sampleSpace.height() >= 2) {
+ int sampleSpaceTop = m_sampleSpace.y() + m_sampleSpace.height();
+ int sampleSpaceRight = m_sampleSpace.x() + m_sampleSpace.width();
+ bool updateBuffers = false;
+ foreach (QPoint item, points) {
+ if (item.y() <= sampleSpaceTop && item.y() >= m_sampleSpace.y() &&
+ item.x() <= sampleSpaceRight && item.x() >= m_sampleSpace.x()) {
+ updateBuffers = true;
+ int x = item.x() - m_sampleSpace.x();
+ int y = item.y() - m_sampleSpace.y();
+ (*(m_dataArray.at(y)))[x] = array->at(item.y())->at(item.x());
+
+ if (m_cachedFlatShading) {
+ m_surfaceObj->updateCoarseItem(m_dataArray, y, x, m_heightNormalizer, m_axisCacheY.min());
+ } else {
+ m_surfaceObj->updateSmoothItem(m_dataArray, y, x, m_heightNormalizer, m_axisCacheY.min());
+ }
+ }
}
+ if (updateBuffers)
+ m_surfaceObj->uploadBuffers();
}
updateSelectedPoint(m_selectedPoint, m_selectedSeries);