summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@qt.io>2016-09-07 15:29:01 +0300
committerMiikka Heikkinen <miikka.heikkinen@qt.io>2016-09-08 13:41:34 +0000
commit377cab78bbbbbf37a3ed87e9eec7602c6cb6837e (patch)
tree90b8827c3c5588fd415ea845beb286f7d52d7502
parent73a386d4f62dcf83576d8f3e8b7ee7bb688b661d (diff)
Fix non-symmetric extents and resolutions for QCuboidMesh
Task-number: QTBUG-55836 Change-Id: Ic5ee72f5ffb236fe15e46fa667159a139ad05b03 Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
-rw-r--r--src/extras/geometries/qcuboidgeometry.cpp34
-rw-r--r--tests/auto/extras/qcuboidgeometry/tst_qcuboidgeometry.cpp180
2 files changed, 185 insertions, 29 deletions
diff --git a/src/extras/geometries/qcuboidgeometry.cpp b/src/extras/geometries/qcuboidgeometry.cpp
index f720f1367..4e644b24a 100644
--- a/src/extras/geometries/qcuboidgeometry.cpp
+++ b/src/extras/geometries/qcuboidgeometry.cpp
@@ -76,23 +76,23 @@ void createPlaneVertexData(float w, float h, const QSize &resolution,
switch (normal) {
case NegativeX:
// Iterate over z
- for (int j = resolution.width() - 1; j >= 0; --j) {
- const float a = a0 + static_cast<float>(j) * da;
- const float u = static_cast<float>(j) * du;
+ for (int j = resolution.height() - 1; j >= 0; --j) {
+ const float b = b0 + static_cast<float>(j) * db;
+ const float v = static_cast<float>(j) * dv;
// Iterate over y
- for (int i = 0; i < resolution.height(); ++i) {
- const float b = b0 + static_cast<float>(i) * db;
- const float v = static_cast<float>(i) * dv;
+ for (int i = 0; i < resolution.width(); ++i) {
+ const float a = a0 + static_cast<float>(i) * da;
+ const float u = static_cast<float>(i) * du;
// position
*vertices++ = planeDistance;
- *vertices++ = b;
*vertices++ = a;
+ *vertices++ = b;
// texture coordinates
- *vertices++ = 1.0f - u;
*vertices++ = v;
+ *vertices++ = u;
// normal
*vertices++ = -1.0f;
@@ -102,8 +102,8 @@ void createPlaneVertexData(float w, float h, const QSize &resolution,
// tangent
*vertices++ = 0.0f;
*vertices++ = 0.0f;
- *vertices++ = -1.0f;
- *vertices++ = -1.0f;
+ *vertices++ = 1.0f;
+ *vertices++ = 1.0f;
}
}
break;
@@ -111,22 +111,22 @@ void createPlaneVertexData(float w, float h, const QSize &resolution,
case PositiveX: {
// Iterate over z
for (int j = 0; j < resolution.height(); ++j) {
- const float a = a0 + static_cast<float>(j) * da;
- const float u = static_cast<float>(j) * du;
+ const float b = b0 + static_cast<float>(j) * db;
+ const float v = static_cast<float>(j) * dv;
// Iterate over y
for (int i = 0; i < resolution.width(); ++i) {
- const float b = b0 + static_cast<float>(i) * db;
- const float v = static_cast<float>(i) * dv;
+ const float a = a0 + static_cast<float>(i) * da;
+ const float u = static_cast<float>(i) * du;
// position
*vertices++ = planeDistance;
- *vertices++ = b;
*vertices++ = a;
+ *vertices++ = b;
// texture coordinates
+ *vertices++ = 1.0f - v;
*vertices++ = u;
- *vertices++ = v;
// normal
*vertices++ = 1.0f;
@@ -136,8 +136,8 @@ void createPlaneVertexData(float w, float h, const QSize &resolution,
// tangent
*vertices++ = 0.0f;
*vertices++ = 0.0f;
- *vertices++ = 1.0f;
*vertices++ = -1.0f;
+ *vertices++ = 1.0f;
}
}
break;
diff --git a/tests/auto/extras/qcuboidgeometry/tst_qcuboidgeometry.cpp b/tests/auto/extras/qcuboidgeometry/tst_qcuboidgeometry.cpp
index ddd9eed22..fa1657732 100644
--- a/tests/auto/extras/qcuboidgeometry/tst_qcuboidgeometry.cpp
+++ b/tests/auto/extras/qcuboidgeometry/tst_qcuboidgeometry.cpp
@@ -286,13 +286,13 @@ private Q_SLOTS:
<< QVector3D(1.0f, 0.0f, 0.0f)
<< QVector3D(1.0f, 0.0f, 0.0f));
const auto texCoords = (QVector<QVector2D>()
- << QVector2D(0.0f, 0.0f)
- << QVector2D(0.0f, 1.0f)
- << QVector2D(1.0f, 0.0f));
+ << QVector2D(1.0f, 0.0f)
+ << QVector2D(1.0f, 1.0f)
+ << QVector2D(0.0f, 0.0f));
const auto tangents = (QVector<QVector4D>()
- << QVector4D(0.0f, 0.0f, 1.0f, -1.0f)
- << QVector4D(0.0f, 0.0f, 1.0f, -1.0f)
- << QVector4D(0.0f, 0.0f, 1.0f, -1.0f));
+ << QVector4D(0.0f, 0.0f, -1.0f, 1.0f)
+ << QVector4D(0.0f, 0.0f, -1.0f, 1.0f)
+ << QVector4D(0.0f, 0.0f, -1.0f, 1.0f));
QTest::newRow("default_positiveX_firstTriangle")
<< 1.0f << 1.0f << 1.0f
<< QSize(2,2) << QSize(2,2) << QSize(2,2)
@@ -312,13 +312,13 @@ private Q_SLOTS:
<< QVector3D(-1.0f, 0.0f, 0.0f)
<< QVector3D(-1.0f, 0.0f, 0.0f));
const auto texCoords = (QVector<QVector2D>()
- << QVector2D(1.0f, 0.0f)
- << QVector2D(0.0f, 1.0f)
- << QVector2D(1.0f, 1.0f));
+ << QVector2D(0.0f, 0.0f)
+ << QVector2D(1.0f, 1.0f)
+ << QVector2D(0.0f, 1.0f));
const auto tangents = (QVector<QVector4D>()
- << QVector4D(0.0f, 0.0f, -1.0f, -1.0f)
- << QVector4D(0.0f, 0.0f, -1.0f, -1.0f)
- << QVector4D(0.0f, 0.0f, -1.0f, -1.0f));
+ << QVector4D(0.0f, 0.0f, 1.0f, 1.0f)
+ << QVector4D(0.0f, 0.0f, 1.0f, 1.0f)
+ << QVector4D(0.0f, 0.0f, 1.0f, 1.0f));
QTest::newRow("default_negativeX_lastTriangle")
<< 1.0f << 1.0f << 1.0f
<< QSize(2,2) << QSize(2,2) << QSize(2,2)
@@ -429,6 +429,162 @@ private Q_SLOTS:
<< triangleIndex
<< indices << positions << normals << texCoords << tangents;
}
+
+ {
+ const int triangleIndex = 0;
+ const auto indices = (QVector<quint16>() << 0 << 1 << 2);
+ const auto positions = (QVector<QVector3D>()
+ << QVector3D(1.0f, -1.5f, -2.5f)
+ << QVector3D(1.0f, 1.5f, -2.5f)
+ << QVector3D(1.0f, -1.5f, -1.25f));
+ const auto normals = (QVector<QVector3D>()
+ << QVector3D(1.0f, 0.0f, 0.0f)
+ << QVector3D(1.0f, 0.0f, 0.0f)
+ << QVector3D(1.0f, 0.0f, 0.0f));
+ const auto texCoords = (QVector<QVector2D>()
+ << QVector2D(1.0f, 0.0f)
+ << QVector2D(1.0f, 1.0f)
+ << QVector2D(0.75f, 0.0f));
+ const auto tangents = (QVector<QVector4D>()
+ << QVector4D(0.0f, 0.0f, -1.0f, 1.0f)
+ << QVector4D(0.0f, 0.0f, -1.0f, 1.0f)
+ << QVector4D(0.0f, 0.0f, -1.0f, 1.0f));
+ QTest::newRow("default_positiveX_firstTriangle_nonSymmetric")
+ << 2.0f << 3.0f << 5.0f
+ << QSize(2,3) << QSize(2,5) << QSize(2,9)
+ << triangleIndex
+ << indices << positions << normals << texCoords << tangents;
+ }
+
+ {
+ const int triangleIndex = 15;
+ const auto indices = (QVector<quint16>() << 18 << 17 << 19);
+ const auto positions = (QVector<QVector3D>()
+ << QVector3D(-1.0f, -1.5f, -2.5f)
+ << QVector3D(-1.0f, 1.5f, -1.25f)
+ << QVector3D(-1.0f, 1.5f, -2.5f));
+ const auto normals = (QVector<QVector3D>()
+ << QVector3D(-1.0f, 0.0f, 0.0f)
+ << QVector3D(-1.0f, 0.0f, 0.0f)
+ << QVector3D(-1.0f, 0.0f, 0.0f));
+ const auto texCoords = (QVector<QVector2D>()
+ << QVector2D(0.0f, 0.0f)
+ << QVector2D(0.25f, 1.0f)
+ << QVector2D(0.0f, 1.0f));
+ const auto tangents = (QVector<QVector4D>()
+ << QVector4D(0.0f, 0.0f, 1.0f, 1.0f)
+ << QVector4D(0.0f, 0.0f, 1.0f, 1.0f)
+ << QVector4D(0.0f, 0.0f, 1.0f, 1.0f));
+ QTest::newRow("default_negativeX_lastTriangle_nonSymmetric")
+ << 2.0f << 3.0f << 5.0f
+ << QSize(2,3) << QSize(2,5) << QSize(2,9)
+ << triangleIndex
+ << indices << positions << normals << texCoords << tangents;
+ }
+
+ {
+ const int triangleIndex = 16;
+ const auto indices = (QVector<quint16>() << 20 << 21 << 22);
+ const auto positions = (QVector<QVector3D>()
+ << QVector3D(-1.0f, 1.5f, 2.5f)
+ << QVector3D(1.0f, 1.5f, 2.5f)
+ << QVector3D(-1.0f, 1.5f, 1.875f));
+ const auto normals = (QVector<QVector3D>()
+ << QVector3D(0.0f, 1.0f, 0.0f)
+ << QVector3D(0.0f, 1.0f, 0.0f)
+ << QVector3D(0.0f, 1.0f, 0.0f));
+ const auto texCoords = (QVector<QVector2D>()
+ << QVector2D(0.0f, 0.0f)
+ << QVector2D(1.0f, 0.0f)
+ << QVector2D(0.0f, 0.125f));
+ const auto tangents = (QVector<QVector4D>()
+ << QVector4D(1.0f, 0.0f, 0.0f, 1.0f)
+ << QVector4D(1.0f, 0.0f, 0.0f, 1.0f)
+ << QVector4D(1.0f, 0.0f, 0.0f, 1.0f));
+ QTest::newRow("default_positiveY_firstTriangle_nonSymmetric")
+ << 2.0f << 3.0f << 5.0f
+ << QSize(2,3) << QSize(2,5) << QSize(2,9)
+ << triangleIndex
+ << indices << positions << normals << texCoords << tangents;
+ }
+
+ {
+ const int triangleIndex = 47;
+ const auto indices = (QVector<quint16>() << 54 << 53 << 55);
+ const auto positions = (QVector<QVector3D>()
+ << QVector3D(-1.0f, -1.5f, 2.5f)
+ << QVector3D(1.0f, -1.5f, 1.875f)
+ << QVector3D(1.0f, -1.5f, 2.5f));
+ const auto normals = (QVector<QVector3D>()
+ << QVector3D(0.0f, -1.0f, 0.0f)
+ << QVector3D(0.0f, -1.0f, 0.0f)
+ << QVector3D(0.0f, -1.0f, 0.0f));
+ const auto texCoords = (QVector<QVector2D>()
+ << QVector2D(0.0f, 1.0f)
+ << QVector2D(1.0f, 0.875f)
+ << QVector2D(1.0f, 1.0f));
+ const auto tangents = (QVector<QVector4D>()
+ << QVector4D(1.0f, 0.0f, 0.0f, 1.0f)
+ << QVector4D(1.0f, 0.0f, 0.0f, 1.0f)
+ << QVector4D(1.0f, 0.0f, 0.0f, 1.0f));
+ QTest::newRow("default_negativeY_lastTriangle_nonSymmetric")
+ << 2.0f << 3.0f << 5.0f
+ << QSize(2,3) << QSize(2,5) << QSize(2,9)
+ << triangleIndex
+ << indices << positions << normals << texCoords << tangents;
+ }
+
+ {
+ const int triangleIndex = 48;
+ const auto indices = (QVector<quint16>() << 56 << 57 << 58);
+ const auto positions = (QVector<QVector3D>()
+ << QVector3D(-1.0f, -1.5f, 2.5f)
+ << QVector3D(1.0f, -1.5f, 2.5f)
+ << QVector3D(-1.0f, 0.0f, 2.5f));
+ const auto normals = (QVector<QVector3D>()
+ << QVector3D(0.0f, 0.0f, 1.0f)
+ << QVector3D(0.0f, 0.0f, 1.0f)
+ << QVector3D(0.0f, 0.0f, 1.0f));
+ const auto texCoords = (QVector<QVector2D>()
+ << QVector2D(0.0f, 0.0f)
+ << QVector2D(1.0f, 0.0f)
+ << QVector2D(0.0f, 0.5f));
+ const auto tangents = (QVector<QVector4D>()
+ << QVector4D(1.0f, 0.0f, 0.0f, 1.0f)
+ << QVector4D(1.0f, 0.0f, 0.0f, 1.0f)
+ << QVector4D(1.0f, 0.0f, 0.0f, 1.0f));
+ QTest::newRow("default_positiveZ_firstTriangle_nonSymmetric")
+ << 2.0f << 3.0f << 5.0f
+ << QSize(2,3) << QSize(2,5) << QSize(2,9)
+ << triangleIndex
+ << indices << positions << normals << texCoords << tangents;
+ }
+
+ {
+ const int triangleIndex = 55;
+ const auto indices = (QVector<quint16>() << 66 << 65 << 67);
+ const auto positions = (QVector<QVector3D>()
+ << QVector3D(1.0f, 1.5f, -2.5f)
+ << QVector3D(-1.0f, 0.0f, -2.5f)
+ << QVector3D(-1.0f, 1.5f, -2.5f));
+ const auto normals = (QVector<QVector3D>()
+ << QVector3D(0.0f, 0.0f, -1.0f)
+ << QVector3D(0.0f, 0.0f, -1.0f)
+ << QVector3D(0.0f, 0.0f, -1.0f));
+ const auto texCoords = (QVector<QVector2D>()
+ << QVector2D(0.0f, 1.0f)
+ << QVector2D(1.0f, 0.5f)
+ << QVector2D(1.0f, 1.0f));
+ const auto tangents = (QVector<QVector4D>()
+ << QVector4D(-1.0f, 0.0f, 0.0f, 1.0f)
+ << QVector4D(-1.0f, 0.0f, 0.0f, 1.0f)
+ << QVector4D(-1.0f, 0.0f, 0.0f, 1.0f));
+ QTest::newRow("default_negativeZ_lastTriangle_nonSymmetric")
+ << 2.0f << 3.0f << 5.0f
+ << QSize(2,3) << QSize(2,5) << QSize(2,9)
+ << triangleIndex
+ << indices << positions << normals << texCoords << tangents;
+ }
}
void generatedGeometryShouldBeConsistent()