diff options
Diffstat (limited to 'src/datavisualization/engine/surface3drenderer.cpp')
-rw-r--r-- | src/datavisualization/engine/surface3drenderer.cpp | 38 |
1 files changed, 35 insertions, 3 deletions
diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index 55fb9d6f..ed07da4e 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -173,9 +173,14 @@ void Surface3DRenderer::updateDataModel(QSurfaceDataProxy *dataProxy) const QSurfaceDataArray *array = dataProxy->array(); - m_dataArray.reserve(array->size()); - for (int i = 0; i < array->size(); i++) { - QSurfaceDataRow *newRow = new QSurfaceDataRow(*array->at(i)); + QRect sampleSpace = calculateSampleRect(dataProxy); + + m_dataArray.reserve(sampleSpace.height()); + 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; } @@ -209,6 +214,33 @@ void Surface3DRenderer::updateDataModel(QSurfaceDataProxy *dataProxy) Abstract3DRenderer::updateDataModel(dataProxy); } +QRect Surface3DRenderer::calculateSampleRect(QSurfaceDataProxy *dataProxy) +{ + QRect sampleSpace(0, 0, dataProxy->columnCount(), dataProxy->rowCount()); + + if (dataProxy->minValueColumns() == 0.0 && dataProxy->maxValueColumns() == 0.0 && + dataProxy->minValueRows() == 0.0 && dataProxy->maxValueRows() == 0.0) { + // The user hasn't set anything, return default + return sampleSpace; + } + + qreal valueWidth = dataProxy->maxValueColumns() - dataProxy->minValueColumns(); + qreal columnBeginDiff = qAbs(dataProxy->minValueColumns() - m_axisCacheX.min()); + sampleSpace.setX(columnBeginDiff / valueWidth * dataProxy->columnCount()); + + qreal columnEndPos = (m_axisCacheX.max() - dataProxy->minValueColumns()) / valueWidth * dataProxy->columnCount(); + sampleSpace.setWidth(columnEndPos - sampleSpace.x()); + + qreal valueHeight = dataProxy->maxValueRows() - dataProxy->minValueRows(); + qreal rowBeginDiff = qAbs(dataProxy->minValueRows() - m_axisCacheZ.min()); + sampleSpace.setY(rowBeginDiff / valueHeight * dataProxy->rowCount()); + + qreal rowEndPos = (m_axisCacheZ.max() - dataProxy->minValueRows()) / valueHeight * dataProxy->rowCount(); + sampleSpace.setHeight(rowEndPos - sampleSpace.y()); + + return sampleSpace; +} + void Surface3DRenderer::updateScene(Q3DScene *scene) { // TODO: Move these to more suitable place e.g. controller should be controlling the viewports. |