From e029d0ea1d486dd3dbbfa4519a2125da202f22e4 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Mon, 25 Nov 2013 12:19:18 +0200 Subject: Change qreals to floats + Fix default axes to sensible + Fix some rounding errors in surface creation Task-number: QTRD-2622 Change-Id: I44450efc1e77ac8d8dbefc75814345949b8fb1f1 Reviewed-by: Mika Salmela --- src/datavisualization/data/baritemmodelhandler.cpp | 2 +- src/datavisualization/data/barrenderitem_p.h | 8 +-- src/datavisualization/data/qbardataitem.cpp | 8 +-- src/datavisualization/data/qbardataitem.h | 8 +-- src/datavisualization/data/qbardataproxy.cpp | 2 +- .../data/qheightmapsurfacedataproxy.cpp | 74 ++++++++++++++++------ src/datavisualization/data/qscatterdataitem.cpp | 4 +- src/datavisualization/data/qscatterdataitem.h | 7 +- src/datavisualization/data/qsurfacedataproxy.cpp | 6 +- src/datavisualization/data/scatterrenderitem_p.h | 7 +- .../data/surfaceitemmodelhandler.cpp | 2 +- 11 files changed, 81 insertions(+), 47 deletions(-) (limited to 'src/datavisualization/data') diff --git a/src/datavisualization/data/baritemmodelhandler.cpp b/src/datavisualization/data/baritemmodelhandler.cpp index f7611668..cbe19c43 100644 --- a/src/datavisualization/data/baritemmodelhandler.cpp +++ b/src/datavisualization/data/baritemmodelhandler.cpp @@ -92,7 +92,7 @@ void BarItemModelHandler::resolveModel() QHash columnListHash; // Sort values into rows and columns - typedef QHash ColumnValueMap; + typedef QHash ColumnValueMap; QHash itemValueMap; for (int i = 0; i < rowCount; i++) { for (int j = 0; j < columnCount; j++) { diff --git a/src/datavisualization/data/barrenderitem_p.h b/src/datavisualization/data/barrenderitem_p.h index 6cd2b0fa..a837ff2c 100644 --- a/src/datavisualization/data/barrenderitem_p.h +++ b/src/datavisualization/data/barrenderitem_p.h @@ -47,8 +47,8 @@ public: inline const QPoint &position() const { return m_position; } // Actual cached data value of the bar (needed to trigger label reformats) - inline void setValue(qreal value); - inline qreal value() const { return m_value; } + inline void setValue(float value); + inline float value() const { return m_value; } // Normalized bar height inline void setHeight(GLfloat height) { m_height = height; } @@ -62,7 +62,7 @@ public: QString &sliceLabel(); // Formats label if not previously formatted protected: - qreal m_value; + float m_value; QPoint m_position; // x = row, y = column GLfloat m_height; QString m_sliceLabel; @@ -71,7 +71,7 @@ protected: friend class QBarDataItem; }; -void BarRenderItem::setValue(qreal value) +void BarRenderItem::setValue(float value) { m_value = value; // Force reformatting on next access by setting label string to null string diff --git a/src/datavisualization/data/qbardataitem.cpp b/src/datavisualization/data/qbardataitem.cpp index a474d785..e564bd5d 100644 --- a/src/datavisualization/data/qbardataitem.cpp +++ b/src/datavisualization/data/qbardataitem.cpp @@ -37,14 +37,14 @@ QT_DATAVISUALIZATION_BEGIN_NAMESPACE */ QBarDataItem::QBarDataItem() : d_ptr(0), // private data doesn't exist by default (optimization) - m_value(0.0) + m_value(0.0f) { } /*! * Constructs QBarDataItem with \a value. */ -QBarDataItem::QBarDataItem(qreal value) +QBarDataItem::QBarDataItem(float value) : d_ptr(0), m_value(value) { @@ -81,12 +81,12 @@ QBarDataItem &QBarDataItem::operator=(const QBarDataItem &other) } /*! - * \fn void QBarDataItem::setValue(qreal value) + * \fn void QBarDataItem::setValue(float value) * Sets \a value to this data item. */ /*! - * \fn qreal QBarDataItem::value() const + * \fn float QBarDataItem::value() const * \return value of this data item. */ diff --git a/src/datavisualization/data/qbardataitem.h b/src/datavisualization/data/qbardataitem.h index 68bbcedf..f596b16b 100644 --- a/src/datavisualization/data/qbardataitem.h +++ b/src/datavisualization/data/qbardataitem.h @@ -29,14 +29,14 @@ class QT_DATAVISUALIZATION_EXPORT QBarDataItem { public: QBarDataItem(); - QBarDataItem(qreal value); + QBarDataItem(float value); QBarDataItem(const QBarDataItem &other); ~QBarDataItem(); QBarDataItem &operator=(const QBarDataItem &other); - void setValue(qreal value) { m_value = value; } - qreal value() const { return m_value; } + void setValue(float value) { m_value = value; } + float value() const { return m_value; } // TODO Set color, label format, ...? @@ -46,7 +46,7 @@ protected: QBarDataItemPrivate *d_ptr; private: - qreal m_value; + float m_value; }; QT_DATAVISUALIZATION_END_NAMESPACE diff --git a/src/datavisualization/data/qbardataproxy.cpp b/src/datavisualization/data/qbardataproxy.cpp index d22c34b5..88c08556 100644 --- a/src/datavisualization/data/qbardataproxy.cpp +++ b/src/datavisualization/data/qbardataproxy.cpp @@ -683,7 +683,7 @@ QPair QBarDataProxyPrivate::limitValues(int startRow, int endR endColumn = qMin(endColumn, row->size() - 1); for (int j = startColumn; j <= endColumn; j++) { const QBarDataItem &item = m_dataArray->at(i)->at(j); - qreal itemValue = item.value(); + float itemValue = item.value(); if (limits.second < itemValue) limits.second = itemValue; if (limits.first > itemValue) diff --git a/src/datavisualization/data/qheightmapsurfacedataproxy.cpp b/src/datavisualization/data/qheightmapsurfacedataproxy.cpp index 251ae70a..88ed2f5d 100644 --- a/src/datavisualization/data/qheightmapsurfacedataproxy.cpp +++ b/src/datavisualization/data/qheightmapsurfacedataproxy.cpp @@ -90,7 +90,7 @@ const float defaultMaxValue = 10.0f; */ /*! - * \qmlproperty qreal HeightMapSurfaceDataProxy::minXValue + * \qmlproperty real HeightMapSurfaceDataProxy::minXValue * * The minimum X value for the generated surface points. * When setting this property the corresponding maximum value is adjusted if necessary, @@ -98,7 +98,7 @@ const float defaultMaxValue = 10.0f; */ /*! - * \qmlproperty qreal HeightMapSurfaceDataProxy::maxXValue + * \qmlproperty real HeightMapSurfaceDataProxy::maxXValue * * The maximum X value for the generated surface points. * When setting this property the corresponding minimum value is adjusted if necessary, @@ -106,7 +106,7 @@ const float defaultMaxValue = 10.0f; */ /*! - * \qmlproperty qreal HeightMapSurfaceDataProxy::minZValue + * \qmlproperty real HeightMapSurfaceDataProxy::minZValue * * The minimum Z value for the generated surface points. * When setting this property the corresponding maximum value is adjusted if necessary, @@ -114,7 +114,7 @@ const float defaultMaxValue = 10.0f; */ /*! - * \qmlproperty qreal HeightMapSurfaceDataProxy::maxZValue + * \qmlproperty real HeightMapSurfaceDataProxy::maxZValue * * The maximum Z value for the generated surface points. * When setting this property the corresponding minimum value is adjusted if necessary, @@ -338,7 +338,7 @@ void QHeightMapSurfaceDataProxyPrivate::setValueRanges(float minX, float maxX, f } if (m_maxXValue != maxX || minX >= maxX) { if (minX >= maxX) { - m_maxXValue = minX + 1.0; + m_maxXValue = minX + 1.0f; qWarning() << "Warning: Tried to set invalid range for X value range." " Range automatically adjusted to a valid one:" << minX << "-" << maxX << "-->" << m_minXValue << "-" << m_maxXValue; @@ -349,7 +349,7 @@ void QHeightMapSurfaceDataProxyPrivate::setValueRanges(float minX, float maxX, f } if (m_maxZValue != maxZ || minZ >= maxZ) { if (minZ >= maxZ) { - m_maxZValue = minZ + 1.0; + m_maxZValue = minZ + 1.0f; qWarning() << "Warning: Tried to set invalid range for Z value range." " Range automatically adjusted to a valid one:" << minZ << "-" << maxZ << "-->" << m_minZValue << "-" << m_maxZValue; @@ -367,8 +367,8 @@ void QHeightMapSurfaceDataProxyPrivate::setMinXValue(float min) { if (min != m_minXValue) { if (min >= m_maxXValue) { - qreal oldMax = m_maxXValue; - m_maxXValue = min + 1.0; + float oldMax = m_maxXValue; + m_maxXValue = min + 1.0f; qWarning() << "Warning: Tried to set minimum X to equal or larger than maximum X for" " value range. Maximum automatically adjusted to a valid one:" << oldMax << "-->" << m_maxXValue; @@ -384,8 +384,8 @@ void QHeightMapSurfaceDataProxyPrivate::setMaxXValue(float max) { if (m_maxXValue != max) { if (max <= m_minXValue) { - qreal oldMin = m_minXValue; - m_minXValue = max - 1.0; + float oldMin = m_minXValue; + m_minXValue = max - 1.0f; qWarning() << "Warning: Tried to set maximum X to equal or smaller than minimum X for" " value range. Minimum automatically adjusted to a valid one:" << oldMin << "-->" << m_minXValue; @@ -401,8 +401,8 @@ void QHeightMapSurfaceDataProxyPrivate::setMinZValue(float min) { if (min != m_minZValue) { if (min >= m_maxZValue) { - qreal oldMax = m_maxZValue; - m_maxZValue = min + 1.0; + float oldMax = m_maxZValue; + m_maxZValue = min + 1.0f; qWarning() << "Warning: Tried to set minimum Z to equal or larger than maximum Z for" " value range. Maximum automatically adjusted to a valid one:" << oldMax << "-->" << m_maxZValue; @@ -418,8 +418,8 @@ void QHeightMapSurfaceDataProxyPrivate::setMaxZValue(float max) { if (m_maxZValue != max) { if (max <= m_minZValue) { - qreal oldMin = m_minZValue; - m_minZValue = max - 1.0; + float oldMin = m_minZValue; + m_minZValue = max - 1.0f; qWarning() << "Warning: Tried to set maximum Z to equal or smaller than minimum Z for" " value range. Minimum automatically adjusted to a valid one:" << oldMin << "-->" << m_minZValue; @@ -460,26 +460,58 @@ void QHeightMapSurfaceDataProxyPrivate::handlePendingResolve() float xMul = (m_maxXValue - m_minXValue) / float(imageWidth - 1); float zMul = (m_maxZValue - m_minZValue) / float(imageHeight - 1); + // Last row and column are explicitly set to max values, as relying + // on multiplier can cause rounding errors, resulting in the value being + // slightly over the specified maximum, which in turn can lead to it not + // getting rendered. + int lastRow = imageHeight - 1; + int lastCol = imageWidth - 1; + if (heightImage.isGrayscale()) { // Grayscale, it's enough to read Red byte for (int i = 0; i < imageHeight; i++, bitCount -= widthBits) { QSurfaceDataRow &newRow = *dataArray->at(i); - for (int j = 0; j < imageWidth; j++) - newRow[j].setPosition(QVector3D((float(j) * xMul) + m_minXValue, float(bits[bitCount + (j * 4)]), - (float(i) * zMul) + m_minZValue)); + float zVal; + if (i == lastRow) + zVal = m_maxZValue; + else + zVal = (float(i) * zMul) + m_minZValue; + int j = 0; + for (; j < lastCol; j++) + newRow[j].setPosition(QVector3D((float(j) * xMul) + m_minXValue, + float(bits[bitCount + (j * 4)]), + zVal)); + newRow[j].setPosition(QVector3D(m_maxXValue, + float(bits[bitCount + (j * 4)]), + zVal)); } } else { // Not grayscale, we'll need to calculate height from RGB for (int i = 0; i < imageHeight; i++, bitCount -= widthBits) { QSurfaceDataRow &newRow = *dataArray->at(i); - for (int j = 0; j < imageWidth; j++) { - int nextpixel = j * 4; + float zVal; + if (i == lastRow) + zVal = m_maxZValue; + else + zVal = (float(i) * zMul) + m_minZValue; + int j = 0; + int nextpixel = 0; + for (; j < lastCol; j++) { + nextpixel = j * 4; height = (float(bits[bitCount + nextpixel]) + float(bits[1 + bitCount + nextpixel]) + float(bits[2 + bitCount + nextpixel])); - newRow[j].setPosition(QVector3D((float(j) * xMul) + m_minXValue, height / 3.0f, - (float(i) * zMul) + m_minZValue)); + newRow[j].setPosition(QVector3D((float(j) * xMul) + m_minXValue, + height / 3.0f, + zVal)); } + nextpixel = j * 4; + height = (float(bits[bitCount + nextpixel]) + + float(bits[1 + bitCount + nextpixel]) + + float(bits[2 + bitCount + nextpixel])); + newRow[j].setPosition(QVector3D(m_maxXValue, + height / 3.0f, + zVal)); } } diff --git a/src/datavisualization/data/qscatterdataitem.cpp b/src/datavisualization/data/qscatterdataitem.cpp index 5c6f1f66..480bc13b 100644 --- a/src/datavisualization/data/qscatterdataitem.cpp +++ b/src/datavisualization/data/qscatterdataitem.cpp @@ -123,12 +123,12 @@ QScatterDataItem &QScatterDataItem::operator=(const QScatterDataItem &other) * \return the Z component of the position of this data item. */ -//void QScatterDataItem::setSize(qreal size) +//void QScatterDataItem::setSize(float size) //{ // m_size = size; //} -//const qreal &QScatterDataItem::size() const +//const float &QScatterDataItem::size() const //{ // return m_size; //} diff --git a/src/datavisualization/data/qscatterdataitem.h b/src/datavisualization/data/qscatterdataitem.h index 29154259..ab6007db 100644 --- a/src/datavisualization/data/qscatterdataitem.h +++ b/src/datavisualization/data/qscatterdataitem.h @@ -45,8 +45,9 @@ public: inline float y() const { return m_position.y(); } inline float z() const { return m_position.z(); } - //void setSize(qreal size); - //qreal size() const; + // TODO: Will we ever support item specific size? If not, remove. + //void setSize(float size); + //float size() const; protected: virtual void createExtraData(); @@ -55,7 +56,7 @@ protected: private: QVector3D m_position; - //qreal m_size; + //float m_size; }; QT_DATAVISUALIZATION_END_NAMESPACE diff --git a/src/datavisualization/data/qsurfacedataproxy.cpp b/src/datavisualization/data/qsurfacedataproxy.cpp index 8db082c7..b55fea97 100644 --- a/src/datavisualization/data/qsurfacedataproxy.cpp +++ b/src/datavisualization/data/qsurfacedataproxy.cpp @@ -226,8 +226,8 @@ QSurfaceDataProxy *QSurfaceDataProxyPrivate::qptr() void QSurfaceDataProxyPrivate::limitValues(QVector3D &minValues, QVector3D &maxValues) const { - qreal min = 0.0; - qreal max = 0.0; + float min = 0.0f; + float max = 0.0f; int rows = m_dataArray->size(); int columns = 0; @@ -243,7 +243,7 @@ void QSurfaceDataProxyPrivate::limitValues(QVector3D &minValues, QVector3D &maxV QSurfaceDataRow *row = m_dataArray->at(i); if (row) { for (int j = 0; j < columns; j++) { - qreal itemValue = m_dataArray->at(i)->at(j).y(); + float itemValue = m_dataArray->at(i)->at(j).y(); if (min > itemValue) min = itemValue; if (max < itemValue) diff --git a/src/datavisualization/data/scatterrenderitem_p.h b/src/datavisualization/data/scatterrenderitem_p.h index 58e91e96..5a97c1e9 100644 --- a/src/datavisualization/data/scatterrenderitem_p.h +++ b/src/datavisualization/data/scatterrenderitem_p.h @@ -48,13 +48,14 @@ public: inline bool isVisible() const { return m_visible; } inline void setVisible(bool visible) { m_visible = visible; } - //inline void setSize(qreal size); - //inline qreal size() const { return m_size; } + // TODO: Will we ever support item specific size? If not, remove. + //inline void setSize(float size); + //inline float size() const { return m_size; } protected: QVector3D m_position; bool m_visible; - //qreal m_size; // TODO in case we need a fourth variable that adjusts scatter item size + //float m_size; // TODO in case we need a fourth variable that adjusts scatter item size friend class QScatterDataItem; }; diff --git a/src/datavisualization/data/surfaceitemmodelhandler.cpp b/src/datavisualization/data/surfaceitemmodelhandler.cpp index 70482162..e602dedc 100644 --- a/src/datavisualization/data/surfaceitemmodelhandler.cpp +++ b/src/datavisualization/data/surfaceitemmodelhandler.cpp @@ -89,7 +89,7 @@ void SurfaceItemModelHandler::resolveModel() QHash columnListHash; // Sort values into rows and columns - typedef QHash ColumnValueMap; + typedef QHash ColumnValueMap; QHash itemValueMap; for (int i = 0; i < rowCount; i++) { for (int j = 0; j < columnCount; j++) { -- cgit v1.2.3