diff options
author | Mika Salmela <mika.salmela@digia.com> | 2014-10-07 00:04:03 +0300 |
---|---|---|
committer | Mika Salmela <mika.salmela@digia.com> | 2014-10-07 12:09:29 +0300 |
commit | aab6b4f77d408c523bd9335ffa48bcc552c00c62 (patch) | |
tree | 940d1e136f2344ace8a2de058c1548f8e27f6e78 | |
parent | 0e5b7fba379fe4e751bb2c609bb03d0c9bb01eaa (diff) |
Texture UVs for surface to follow data dimension
Change texture UVs to be generated according to data dimension. Also
utilise this change on texturesurface example.
Change-Id: Ideacfba409dc2e7cf579fb38d897e08c9f9a1b71
Reviewed-by: Tomi Korpipää <tomi.korpipaa@digia.com>
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@digia.com>
-rw-r--r-- | examples/datavisualization/texturesurface/topographicseries.cpp | 5 | ||||
-rw-r--r-- | src/datavisualization/utils/surfaceobject.cpp | 12 | ||||
-rw-r--r-- | src/datavisualization/utils/surfaceobject_p.h | 7 |
3 files changed, 19 insertions, 5 deletions
diff --git a/examples/datavisualization/texturesurface/topographicseries.cpp b/examples/datavisualization/texturesurface/topographicseries.cpp index 2fa29d35..530e56b4 100644 --- a/examples/datavisualization/texturesurface/topographicseries.cpp +++ b/examples/datavisualization/texturesurface/topographicseries.cpp @@ -49,7 +49,8 @@ void TopographicSeries::setTopographyFile(const QString file, float width, float QSurfaceDataArray *dataArray = new QSurfaceDataArray; dataArray->reserve(imageHeight); for (int i = 0; i < imageHeight; i++) { - int p = (imageHeight - 1 - i) * widthBits; + int p = i * widthBits; + float z = height - float(i) * stepZ; QSurfaceDataRow *newRow = new QSurfaceDataRow(imageWidth); for (int j = 0; j < imageWidth; j++) { uchar aa = bits[p + 0]; @@ -57,7 +58,7 @@ void TopographicSeries::setTopographyFile(const QString file, float width, float uchar gg = bits[p + 2]; uint color = uint((gg << 16) + (rr << 8) + aa); float y = float(color) / packingFactor; - (*newRow)[j].setPosition(QVector3D(float(j) * stepX, y, float(i) * stepZ)); + (*newRow)[j].setPosition(QVector3D(float(j) * stepX, y, z)); p = p + 4; } *dataArray << newRow; diff --git a/src/datavisualization/utils/surfaceobject.cpp b/src/datavisualization/utils/surfaceobject.cpp index 8f75d666..86cd2789 100644 --- a/src/datavisualization/utils/surfaceobject.cpp +++ b/src/datavisualization/utils/surfaceobject.cpp @@ -307,15 +307,21 @@ void SurfaceObject::smoothUVs(const QSurfaceDataArray &dataArray, float zRangeNormalizer = dataArray.at(rows - 1)->at(0).z() - dataArray.at(0)->at(0).z(); float xMin = dataArray.at(0)->at(0).x(); float zMin = dataArray.at(0)->at(0).z(); + const bool zDescending = m_dataDimension.testFlag(SurfaceObject::ZDescending); + const bool xDescending = m_dataDimension.testFlag(SurfaceObject::XDescending); QVector<QVector2D> uvs; uvs.resize(m_rows * m_columns); int index = 0; for (int i = 0; i < m_rows; i++) { float y = (modelArray.at(i)->at(0).z() - zMin) / zRangeNormalizer; + if (zDescending) + y = 1.0f - y; const QSurfaceDataRow &p = *modelArray.at(i); for (int j = 0; j < m_columns; j++) { float x = (p.at(j).x() - xMin) / xRangeNormalizer; + if (xDescending) + x = 1.0f - x; uvs[index] = QVector2D(x, y); index++; } @@ -601,6 +607,8 @@ void SurfaceObject::coarseUVs(const QSurfaceDataArray &dataArray, float zRangeNormalizer = dataArray.at(rows - 1)->at(0).z() - dataArray.at(0)->at(0).z(); float xMin = dataArray.at(0)->at(0).x(); float zMin = dataArray.at(0)->at(0).z(); + const bool zDescending = m_dataDimension.testFlag(SurfaceObject::ZDescending); + const bool xDescending = m_dataDimension.testFlag(SurfaceObject::XDescending); QVector<QVector2D> uvs; uvs.resize(m_rows * m_columns * 2); @@ -608,9 +616,13 @@ void SurfaceObject::coarseUVs(const QSurfaceDataArray &dataArray, int colLimit = m_columns - 1; for (int i = 0; i < m_rows; i++) { float y = (modelArray.at(i)->at(0).z() - zMin) / zRangeNormalizer; + if (zDescending) + y = 1.0f - y; const QSurfaceDataRow &p = *modelArray.at(i); for (int j = 0; j < m_columns; j++) { float x = (p.at(j).x() - xMin) / xRangeNormalizer; + if (xDescending) + x = 1.0f - x; uvs[index] = QVector2D(x, y); index++; if (j > 0 && j < colLimit) { diff --git a/src/datavisualization/utils/surfaceobject_p.h b/src/datavisualization/utils/surfaceobject_p.h index 39d10445..e7b61310 100644 --- a/src/datavisualization/utils/surfaceobject_p.h +++ b/src/datavisualization/utils/surfaceobject_p.h @@ -49,12 +49,13 @@ public: Undefined }; - enum DataDimensions { + enum DataDimension { BothAscending = 0, XDescending = 1, ZDescending = 2, BothDescending = XDescending | ZDescending }; + Q_DECLARE_FLAGS(DataDimensions, DataDimension) public: SurfaceObject(Surface3DRenderer *renderer); @@ -115,8 +116,8 @@ private: float m_maxY; GLuint m_uvTextureBuffer; bool m_returnTextureBuffer; - int m_dataDimension; - int m_oldDataDimension; + SurfaceObject::DataDimensions m_dataDimension; + SurfaceObject::DataDimensions m_oldDataDimension; }; QT_END_NAMESPACE_DATAVISUALIZATION |