diff options
author | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2013-09-26 11:16:12 +0300 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2013-09-27 08:05:12 +0300 |
commit | f2a5c09144f17f3240ae6a7e7b48237f1b234d9b (patch) | |
tree | 28f40212cd228f66277e8db84885ddef0ebb6c5a /src/datavisualization/engine/surface3drenderer.cpp | |
parent | b776b6d3aa287b973c9346736badc6181e50cbc7 (diff) |
Allow resetting with existing array for surface
Improves performance when doing stuff like resetting image data.
Task-number: QTRD-2335
Change-Id: I9e8ce49fd520b67125305a7614afc550b2244169
Reviewed-by: Tomi Korpipää <tomi.korpipaa@digia.com>
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@digia.com>
Diffstat (limited to 'src/datavisualization/engine/surface3drenderer.cpp')
-rw-r--r-- | src/datavisualization/engine/surface3drenderer.cpp | 54 |
1 files changed, 33 insertions, 21 deletions
diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index 0c234910..25a6a519 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -203,10 +203,6 @@ void Surface3DRenderer::initializeOpenGL() void Surface3DRenderer::updateDataModel(QSurfaceDataProxy *dataProxy) { - for (int i = 0; i < m_dataArray.size(); i++) - delete m_dataArray.at(i); - m_dataArray.clear(); - calculateSceneScalingFactors(); const QSurfaceDataArray *array = dataProxy->array(); @@ -219,17 +215,22 @@ void Surface3DRenderer::updateDataModel(QSurfaceDataProxy *dataProxy) if (m_sampleSpace != sampleSpace) { dimensionChanged = true; m_sampleSpace = sampleSpace; + + for (int i = 0; i < m_dataArray.size(); i++) + delete m_dataArray.at(i); + m_dataArray.clear(); } // TODO: Handle partial surface grids on the graph edges if (sampleSpace.width() >= 2 && sampleSpace.height() >= 2) { - m_dataArray.reserve(sampleSpace.height()); + if (dimensionChanged) { + m_dataArray.reserve(sampleSpace.height()); + for (int i = 0; i < sampleSpace.height(); i++) + m_dataArray << new QSurfaceDataRow(sampleSpace.width()); + } for (int i = 0; i < sampleSpace.height(); i++) { - QSurfaceDataRow *newRow = new QSurfaceDataRow(); - newRow->resize(sampleSpace.width()); for (int j = 0; j < sampleSpace.width(); j++) - (*newRow)[j] = array->at(i + sampleSpace.y())->at(j + sampleSpace.x()); - m_dataArray << newRow; + (*(m_dataArray.at(i)))[j] = array->at(i + sampleSpace.y())->at(j + sampleSpace.x()); } if (m_dataArray.size() > 0) { @@ -237,10 +238,15 @@ void Surface3DRenderer::updateDataModel(QSurfaceDataProxy *dataProxy) loadSurfaceObj(); // Note: Data setup can change samplespace (as min width/height is 1) - if (m_cachedSmoothSurface) - m_surfaceObj->setUpSmoothData(m_dataArray, m_sampleSpace, m_heightNormalizer, dimensionChanged); - else - m_surfaceObj->setUpData(m_dataArray, m_sampleSpace, m_heightNormalizer, dimensionChanged); + if (m_cachedSmoothSurface) { + m_surfaceObj->setUpSmoothData(m_dataArray, m_sampleSpace, m_heightNormalizer, + dimensionChanged, + m_cachedSelectionMode != QDataVis::ModeNone); + } else { + m_surfaceObj->setUpData(m_dataArray, m_sampleSpace, m_heightNormalizer, + dimensionChanged, + m_cachedSelectionMode != QDataVis::ModeNone); + } if (dimensionChanged) updateSelectionTexture(); @@ -285,10 +291,13 @@ void Surface3DRenderer::updateSliceDataModel(int selectionId) if (!m_sliceSurfaceObj) loadSliceSurfaceObj(); - if (m_cachedSmoothSurface) - m_sliceSurfaceObj->setUpSmoothData(m_sliceDataArray, sliceRect, m_heightNormalizer, true); - else - m_sliceSurfaceObj->setUpData(m_sliceDataArray, sliceRect, m_heightNormalizer, true); + if (m_cachedSmoothSurface) { + m_sliceSurfaceObj->setUpSmoothData(m_sliceDataArray, sliceRect, m_heightNormalizer, + true, true); + } else { + m_sliceSurfaceObj->setUpData(m_sliceDataArray, sliceRect, m_heightNormalizer, true, + true); + } } } @@ -1736,10 +1745,13 @@ bool Surface3DRenderer::updateSmoothStatus(bool enable) if (m_cachedSmoothSurface == false && !m_flatSupported) m_cachedSmoothSurface = true; - if (m_cachedSmoothSurface) - m_surfaceObj->setUpSmoothData(m_dataArray, m_sampleSpace, m_heightNormalizer, true); - else - m_surfaceObj->setUpData(m_dataArray, m_sampleSpace, m_heightNormalizer, true); + if (m_cachedSmoothSurface) { + m_surfaceObj->setUpSmoothData(m_dataArray, m_sampleSpace, m_heightNormalizer, true, + m_cachedSelectionMode != QDataVis::ModeNone); + } else { + m_surfaceObj->setUpData(m_dataArray, m_sampleSpace, m_heightNormalizer, true, + m_cachedSelectionMode != QDataVis::ModeNone); + } initSurfaceShaders(); |