summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMika Salmela <mika.salmela@digia.com>2014-10-07 00:04:03 +0300
committerMika Salmela <mika.salmela@digia.com>2014-10-07 12:09:29 +0300
commitaab6b4f77d408c523bd9335ffa48bcc552c00c62 (patch)
tree940d1e136f2344ace8a2de058c1548f8e27f6e78
parent0e5b7fba379fe4e751bb2c609bb03d0c9bb01eaa (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.cpp5
-rw-r--r--src/datavisualization/utils/surfaceobject.cpp12
-rw-r--r--src/datavisualization/utils/surfaceobject_p.h7
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