summaryrefslogtreecommitdiffstats
path: root/tests/auto/math3d
diff options
context:
space:
mode:
authorRhys Weatherley <rhys.weatherley@nokia.com>2009-08-18 23:47:27 (GMT)
committerRhys Weatherley <rhys.weatherley@nokia.com>2009-08-18 23:47:27 (GMT)
commitf7af55e67711270286a1addf6a28399982647a62 (patch)
treea4360ce1574e9f02cf83cdc3b71735e8d0b3c344 /tests/auto/math3d
parent4377c9f6a593359b436f7c8186abac8dad772329 (diff)
downloadQt-f7af55e67711270286a1addf6a28399982647a62.zip
Qt-f7af55e67711270286a1addf6a28399982647a62.tar.gz
Qt-f7af55e67711270286a1addf6a28399982647a62.tar.bz2
Move math3d unit tests up one level to tests/auto
Some of the platform test infrastructure assumes that all unit tests are sub-directories under tests/auto, and the tests/auto/math3d sub-directory was confusing that infrastructure. Reviewed-by: trustme
Diffstat (limited to 'tests/auto/math3d')
-rw-r--r--tests/auto/math3d/math3d.pro2
-rw-r--r--tests/auto/math3d/qmatrixnxn/qmatrixnxn.pro5
-rw-r--r--tests/auto/math3d/qmatrixnxn/tst_qmatrixnxn.cpp3383
-rw-r--r--tests/auto/math3d/qquaternion/qquaternion.pro5
-rw-r--r--tests/auto/math3d/qquaternion/tst_qquaternion.cpp882
-rw-r--r--tests/auto/math3d/qvectornd/qvectornd.pro5
-rw-r--r--tests/auto/math3d/qvectornd/tst_qvectornd.cpp2141
-rw-r--r--tests/auto/math3d/shared/math3dincludes.h52
8 files changed, 0 insertions, 6475 deletions
diff --git a/tests/auto/math3d/math3d.pro b/tests/auto/math3d/math3d.pro
deleted file mode 100644
index d6189ef..0000000
--- a/tests/auto/math3d/math3d.pro
+++ /dev/null
@@ -1,2 +0,0 @@
-TEMPLATE = subdirs
-SUBDIRS = qmatrixnxn qquaternion qvectornd
diff --git a/tests/auto/math3d/qmatrixnxn/qmatrixnxn.pro b/tests/auto/math3d/qmatrixnxn/qmatrixnxn.pro
deleted file mode 100644
index 40c6cc0..0000000
--- a/tests/auto/math3d/qmatrixnxn/qmatrixnxn.pro
+++ /dev/null
@@ -1,5 +0,0 @@
-load(qttest_p4)
-VPATH += ../shared
-INCLUDEPATH += ../shared
-HEADERS += math3dincludes.h
-SOURCES += tst_qmatrixnxn.cpp
diff --git a/tests/auto/math3d/qmatrixnxn/tst_qmatrixnxn.cpp b/tests/auto/math3d/qmatrixnxn/tst_qmatrixnxn.cpp
deleted file mode 100644
index 5541162..0000000
--- a/tests/auto/math3d/qmatrixnxn/tst_qmatrixnxn.cpp
+++ /dev/null
@@ -1,3383 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the test suite of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at http://qt.nokia.com/contact.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <QtTest/QtTest>
-#include <QtCore/qmath.h>
-#include "math3dincludes.h"
-
-class tst_QMatrixNxN : public QObject
-{
- Q_OBJECT
-public:
- tst_QMatrixNxN() {}
- ~tst_QMatrixNxN() {}
-
-private slots:
- void create2x2();
- void create3x3();
- void create4x4();
- void create4x3();
-
- void isIdentity2x2();
- void isIdentity3x3();
- void isIdentity4x4();
- void isIdentity4x3();
-
- void compare2x2();
- void compare3x3();
- void compare4x4();
- void compare4x3();
-
- void transposed2x2();
- void transposed3x3();
- void transposed4x4();
- void transposed4x3();
-
- void add2x2_data();
- void add2x2();
- void add3x3_data();
- void add3x3();
- void add4x4_data();
- void add4x4();
- void add4x3_data();
- void add4x3();
-
- void subtract2x2_data();
- void subtract2x2();
- void subtract3x3_data();
- void subtract3x3();
- void subtract4x4_data();
- void subtract4x4();
- void subtract4x3_data();
- void subtract4x3();
-
- void multiply2x2_data();
- void multiply2x2();
- void multiply3x3_data();
- void multiply3x3();
- void multiply4x4_data();
- void multiply4x4();
- void multiply4x3_data();
- void multiply4x3();
-
- void multiplyFactor2x2_data();
- void multiplyFactor2x2();
- void multiplyFactor3x3_data();
- void multiplyFactor3x3();
- void multiplyFactor4x4_data();
- void multiplyFactor4x4();
- void multiplyFactor4x3_data();
- void multiplyFactor4x3();
-
- void divideFactor2x2_data();
- void divideFactor2x2();
- void divideFactor3x3_data();
- void divideFactor3x3();
- void divideFactor4x4_data();
- void divideFactor4x4();
- void divideFactor4x3_data();
- void divideFactor4x3();
-
- void negate2x2_data();
- void negate2x2();
- void negate3x3_data();
- void negate3x3();
- void negate4x4_data();
- void negate4x4();
- void negate4x3_data();
- void negate4x3();
-
- void inverted4x4_data();
- void inverted4x4();
-
- void orthonormalInverse4x4();
-
- void scale4x4_data();
- void scale4x4();
-
- void translate4x4_data();
- void translate4x4();
-
- void rotate4x4_data();
- void rotate4x4();
-
- void normalMatrix_data();
- void normalMatrix();
-
- void optimizedTransforms();
-
- void ortho();
- void frustum();
- void perspective();
- void flipCoordinates();
-
- void convertGeneric();
-
- void extractAxisRotation_data();
- void extractAxisRotation();
-
- void extractTranslation_data();
- void extractTranslation();
-
- void inferSpecialType_data();
- void inferSpecialType();
-
- void columnsAndRows();
-
- void convertQMatrix();
- void convertQTransform();
-
- void fill();
-
- void mapRect_data();
- void mapRect();
-
- void properties();
- void metaTypes();
-
-private:
- static void setMatrix(QMatrix2x2& m, const qreal *values);
- static void setMatrixDirect(QMatrix2x2& m, const qreal *values);
- static bool isSame(const QMatrix2x2& m, const qreal *values);
- static bool isIdentity(const QMatrix2x2& m);
-
- static void setMatrix(QMatrix3x3& m, const qreal *values);
- static void setMatrixDirect(QMatrix3x3& m, const qreal *values);
- static bool isSame(const QMatrix3x3& m, const qreal *values);
- static bool isIdentity(const QMatrix3x3& m);
-
- static void setMatrix(QMatrix4x4& m, const qreal *values);
- static void setMatrixDirect(QMatrix4x4& m, const qreal *values);
- static bool isSame(const QMatrix4x4& m, const qreal *values);
- static bool isIdentity(const QMatrix4x4& m);
-
- static void setMatrix(QMatrix4x3& m, const qreal *values);
- static void setMatrixDirect(QMatrix4x3& m, const qreal *values);
- static bool isSame(const QMatrix4x3& m, const qreal *values);
- static bool isIdentity(const QMatrix4x3& m);
-};
-
-static const qreal nullValues2[] =
- {0.0f, 0.0f,
- 0.0f, 0.0f};
-
-static qreal const identityValues2[16] =
- {1.0f, 0.0f,
- 0.0f, 1.0f};
-
-static const qreal doubleIdentity2[] =
- {2.0f, 0.0f,
- 0.0f, 2.0f};
-
-static qreal const uniqueValues2[16] =
- {1.0f, 2.0f,
- 5.0f, 6.0f};
-
-static qreal const transposedValues2[16] =
- {1.0f, 5.0f,
- 2.0f, 6.0f};
-
-static const qreal nullValues3[] =
- {0.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 0.0f};
-
-static qreal const identityValues3[16] =
- {1.0f, 0.0f, 0.0f,
- 0.0f, 1.0f, 0.0f,
- 0.0f, 0.0f, 1.0f};
-
-static const qreal doubleIdentity3[] =
- {2.0f, 0.0f, 0.0f,
- 0.0f, 2.0f, 0.0f,
- 0.0f, 0.0f, 2.0f};
-
-static qreal const uniqueValues3[16] =
- {1.0f, 2.0f, 3.0f,
- 5.0f, 6.0f, 7.0f,
- 9.0f, 10.0f, 11.0f};
-
-static qreal const transposedValues3[16] =
- {1.0f, 5.0f, 9.0f,
- 2.0f, 6.0f, 10.0f,
- 3.0f, 7.0f, 11.0f};
-
-static const qreal nullValues4[] =
- {0.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 0.0f};
-
-static qreal const identityValues4[16] =
- {1.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 1.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 1.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 1.0f};
-
-static const qreal doubleIdentity4[] =
- {2.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 2.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 2.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 2.0f};
-
-static qreal const uniqueValues4[16] =
- {1.0f, 2.0f, 3.0f, 4.0f,
- 5.0f, 6.0f, 7.0f, 8.0f,
- 9.0f, 10.0f, 11.0f, 12.0f,
- 13.0f, 14.0f, 15.0f, 16.0f};
-
-static qreal const transposedValues4[16] =
- {1.0f, 5.0f, 9.0f, 13.0f,
- 2.0f, 6.0f, 10.0f, 14.0f,
- 3.0f, 7.0f, 11.0f, 15.0f,
- 4.0f, 8.0f, 12.0f, 16.0f};
-
-static const qreal nullValues4x3[] =
- {0.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 0.0f};
-
-static qreal const identityValues4x3[12] =
- {1.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 1.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 1.0f, 0.0f};
-
-static qreal const doubleIdentity4x3[12] =
- {2.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 2.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 2.0f, 0.0f};
-
-static qreal const uniqueValues4x3[12] =
- {1.0f, 2.0f, 3.0f, 4.0f,
- 5.0f, 6.0f, 7.0f, 8.0f,
- 9.0f, 10.0f, 11.0f, 12.0f};
-
-static qreal const transposedValues3x4[12] =
- {1.0f, 5.0f, 9.0f,
- 2.0f, 6.0f, 10.0f,
- 3.0f, 7.0f, 11.0f,
- 4.0f, 8.0f, 12.0f};
-
-// Set a matrix to a specified array of values, which are assumed
-// to be in row-major order. This sets the values using floating-point.
-void tst_QMatrixNxN::setMatrix(QMatrix2x2& m, const qreal *values)
-{
- for (int row = 0; row < 2; ++row)
- for (int col = 0; col < 2; ++col)
- m(row, col) = values[row * 2 + col];
-}
-void tst_QMatrixNxN::setMatrix(QMatrix3x3& m, const qreal *values)
-{
- for (int row = 0; row < 3; ++row)
- for (int col = 0; col < 3; ++col)
- m(row, col) = values[row * 3 + col];
-}
-void tst_QMatrixNxN::setMatrix(QMatrix4x4& m, const qreal *values)
-{
- for (int row = 0; row < 4; ++row)
- for (int col = 0; col < 4; ++col)
- m(row, col) = values[row * 4 + col];
-}
-void tst_QMatrixNxN::setMatrix(QMatrix4x3& m, const qreal *values)
-{
- for (int row = 0; row < 3; ++row)
- for (int col = 0; col < 4; ++col)
- m(row, col) = values[row * 4 + col];
-}
-
-// Set a matrix to a specified array of values, which are assumed
-// to be in row-major order. This sets the values directly into
-// the internal data() array.
-void tst_QMatrixNxN::setMatrixDirect(QMatrix2x2& m, const qreal *values)
-{
- float *data = m.data();
- for (int row = 0; row < 2; ++row) {
- for (int col = 0; col < 2; ++col) {
- data[row + col * 2] = values[row * 2 + col];
- }
- }
-}
-void tst_QMatrixNxN::setMatrixDirect(QMatrix3x3& m, const qreal *values)
-{
- float *data = m.data();
- for (int row = 0; row < 3; ++row) {
- for (int col = 0; col < 3; ++col) {
- data[row + col * 3] = values[row * 3 + col];
- }
- }
-}
-void tst_QMatrixNxN::setMatrixDirect(QMatrix4x4& m, const qreal *values)
-{
- float *data = m.data();
- for (int row = 0; row < 4; ++row) {
- for (int col = 0; col < 4; ++col) {
- data[row + col * 4] = values[row * 4 + col];
- }
- }
-}
-void tst_QMatrixNxN::setMatrixDirect(QMatrix4x3& m, const qreal *values)
-{
- float *data = m.data();
- for (int row = 0; row < 3; ++row) {
- for (int col = 0; col < 4; ++col) {
- data[row + col * 3] = values[row * 4 + col];
- }
- }
-}
-
-// qFuzzyCompare isn't always "fuzzy" enough to handle conversion
-// between float, double, and qreal. So create "fuzzier" compares.
-static bool fuzzyCompare(float x, float y, qreal epsilon = 0.001)
-{
- float diff = x - y;
- if (diff < 0.0f)
- diff = -diff;
- return (diff < epsilon);
-}
-
-static bool fuzzyCompare(const QVector3D &v1, const QVector3D &v2, qreal epsilon = 0.001)
-{
- if (!fuzzyCompare(v1.x(), v2.x(), epsilon))
- return false;
- if (!fuzzyCompare(v1.y(), v2.y(), epsilon))
- return false;
- if (!fuzzyCompare(v1.z(), v2.z(), epsilon))
- return false;
- return true;
-}
-
-static bool matrixFuzzyCompare(const QMatrix4x4 &m1, const QMatrix4x4 &m2)
-{
- bool ret = true;
- for (int i = 0; i < 4; i++) {
- for (int j = 0; j < 4; j++) {
- ret = ret && fuzzyCompare(m1(i, j), m2(i, j));
- }
- }
-
- return ret;
-}
-
-// Determine if a matrix is the same as a specified array of values.
-// The values are assumed to be specified in row-major order.
-bool tst_QMatrixNxN::isSame(const QMatrix2x2& m, const qreal *values)
-{
- const float *mv = m.constData();
- for (int row = 0; row < 2; ++row) {
- for (int col = 0; col < 2; ++col) {
- // Check the values using the operator() function.
- if (!fuzzyCompare((float)(m(row, col)), (float)(values[row * 2 + col]))) {
- qDebug() << "floating-point failure at" << row << col << "actual =" << m(row, col) << "expected =" << values[row * 2 + col];
- return false;
- }
-
- // Check the values using direct access, which verifies that the values
- // are stored internally in column-major order.
- if (!fuzzyCompare((float)(mv[col * 2 + row]), (float)(values[row * 2 + col]))) {
- qDebug() << "column floating-point failure at" << row << col << "actual =" << mv[col * 2 + row] << "expected =" << values[row * 2 + col];
- return false;
- }
- }
- }
- return true;
-}
-bool tst_QMatrixNxN::isSame(const QMatrix3x3& m, const qreal *values)
-{
- const float *mv = m.constData();
- for (int row = 0; row < 3; ++row) {
- for (int col = 0; col < 3; ++col) {
- // Check the values using the operator() access function.
- if (!fuzzyCompare((float)(m(row, col)), (float)(values[row * 3 + col]))) {
- qDebug() << "floating-point failure at" << row << col << "actual =" << m(row, col) << "expected =" << values[row * 3 + col];
- return false;
- }
-
- // Check the values using direct access, which verifies that the values
- // are stored internally in column-major order.
- if (!fuzzyCompare((float)(mv[col * 3 + row]), (float)(values[row * 3 + col]))) {
- qDebug() << "column floating-point failure at" << row << col << "actual =" << mv[col * 3 + row] << "expected =" << values[row * 3 + col];
- return false;
- }
- }
- }
- return true;
-}
-bool tst_QMatrixNxN::isSame(const QMatrix4x4& m, const qreal *values)
-{
- const float *mv = m.constData();
- for (int row = 0; row < 4; ++row) {
- for (int col = 0; col < 4; ++col) {
- // Check the values using the operator() access function.
- if (!fuzzyCompare((float)(m(row, col)), (float)(values[row * 4 + col]))) {
- qDebug() << "floating-point failure at" << row << col << "actual =" << m(row, col) << "expected =" << values[row * 4 + col];
- return false;
- }
-
- // Check the values using direct access, which verifies that the values
- // are stored internally in column-major order.
- if (!fuzzyCompare((float)(mv[col * 4 + row]), (float)(values[row * 4 + col]))) {
- qDebug() << "column floating-point failure at" << row << col << "actual =" << mv[col * 4 + row] << "expected =" << values[row * 4 + col];
- return false;
- }
- }
- }
- return true;
-}
-bool tst_QMatrixNxN::isSame(const QMatrix4x3& m, const qreal *values)
-{
- const float *mv = m.constData();
- for (int row = 0; row < 3; ++row) {
- for (int col = 0; col < 4; ++col) {
- // Check the values using the operator() access function.
- if (!fuzzyCompare((float)(m(row, col)), (float)(values[row * 4 + col]))) {
- qDebug() << "floating-point failure at" << row << col << "actual =" << m(row, col) << "expected =" << values[row * 4 + col];
- return false;
- }
-
- // Check the values using direct access, which verifies that the values
- // are stored internally in column-major order.
- if (!fuzzyCompare((float)(mv[col * 3 + row]), (float)(values[row * 4 + col]))) {
- qDebug() << "column floating-point failure at" << row << col << "actual =" << mv[col * 3 + row] << "expected =" << values[row * 4 + col];
- return false;
- }
- }
- }
- return true;
-}
-
-// Determine if a matrix is the identity.
-bool tst_QMatrixNxN::isIdentity(const QMatrix2x2& m)
-{
- return isSame(m, identityValues2);
-}
-bool tst_QMatrixNxN::isIdentity(const QMatrix3x3& m)
-{
- return isSame(m, identityValues3);
-}
-bool tst_QMatrixNxN::isIdentity(const QMatrix4x4& m)
-{
- return isSame(m, identityValues4);
-}
-bool tst_QMatrixNxN::isIdentity(const QMatrix4x3& m)
-{
- return isSame(m, identityValues4x3);
-}
-
-// Test the creation of QMatrix2x2 objects in various ways:
-// construct, copy, and modify.
-void tst_QMatrixNxN::create2x2()
-{
- QMatrix2x2 m1;
- QVERIFY(isIdentity(m1));
- QVERIFY(m1.isIdentity());
-
- QMatrix2x2 m2;
- setMatrix(m2, uniqueValues2);
- QVERIFY(isSame(m2, uniqueValues2));
- QVERIFY(!m2.isIdentity());
-
- QMatrix2x2 m3;
- setMatrixDirect(m3, uniqueValues2);
- QVERIFY(isSame(m3, uniqueValues2));
-
- QMatrix2x2 m4(m3);
- QVERIFY(isSame(m4, uniqueValues2));
-
- QMatrix2x2 m5;
- m5 = m3;
- QVERIFY(isSame(m5, uniqueValues2));
-
- m5.setIdentity();
- QVERIFY(isIdentity(m5));
-
- QMatrix2x2 m6(uniqueValues2);
- QVERIFY(isSame(m6, uniqueValues2));
- qreal vals[4];
- m6.toValueArray(vals);
- for (int index = 0; index < 4; ++index)
- QCOMPARE((float)(vals[index]), (float)(uniqueValues2[index]));
-}
-
-// Test the creation of QMatrix3x3 objects in various ways:
-// construct, copy, and modify.
-void tst_QMatrixNxN::create3x3()
-{
- QMatrix3x3 m1;
- QVERIFY(isIdentity(m1));
- QVERIFY(m1.isIdentity());
-
- QMatrix3x3 m2;
- setMatrix(m2, uniqueValues3);
- QVERIFY(isSame(m2, uniqueValues3));
- QVERIFY(!m2.isIdentity());
-
- QMatrix3x3 m3;
- setMatrixDirect(m3, uniqueValues3);
- QVERIFY(isSame(m3, uniqueValues3));
-
- QMatrix3x3 m4(m3);
- QVERIFY(isSame(m4, uniqueValues3));
-
- QMatrix3x3 m5;
- m5 = m3;
- QVERIFY(isSame(m5, uniqueValues3));
-
- m5.setIdentity();
- QVERIFY(isIdentity(m5));
-
- QMatrix3x3 m6(uniqueValues3);
- QVERIFY(isSame(m6, uniqueValues3));
- qreal vals[9];
- m6.toValueArray(vals);
- for (int index = 0; index < 9; ++index)
- QCOMPARE((float)(vals[index]), (float)(uniqueValues3[index]));
-}
-
-// Test the creation of QMatrix4x4 objects in various ways:
-// construct, copy, and modify.
-void tst_QMatrixNxN::create4x4()
-{
- QMatrix4x4 m1;
- QVERIFY(isIdentity(m1));
- QVERIFY(m1.isIdentity());
-
- QMatrix4x4 m2;
- setMatrix(m2, uniqueValues4);
- QVERIFY(isSame(m2, uniqueValues4));
- QVERIFY(!m2.isIdentity());
-
- QMatrix4x4 m3;
- setMatrixDirect(m3, uniqueValues4);
- QVERIFY(isSame(m3, uniqueValues4));
-
- QMatrix4x4 m4(m3);
- QVERIFY(isSame(m4, uniqueValues4));
-
- QMatrix4x4 m5;
- m5 = m3;
- QVERIFY(isSame(m5, uniqueValues4));
-
- m5.setIdentity();
- QVERIFY(isIdentity(m5));
-
- QMatrix4x4 m6(uniqueValues4);
- QVERIFY(isSame(m6, uniqueValues4));
- qreal vals[16];
- m6.toValueArray(vals);
- for (int index = 0; index < 16; ++index)
- QCOMPARE((float)(vals[index]), (float)(uniqueValues4[index]));
-
- QMatrix4x4 m8
- (uniqueValues4[0], uniqueValues4[1], uniqueValues4[2], uniqueValues4[3],
- uniqueValues4[4], uniqueValues4[5], uniqueValues4[6], uniqueValues4[7],
- uniqueValues4[8], uniqueValues4[9], uniqueValues4[10], uniqueValues4[11],
- uniqueValues4[12], uniqueValues4[13], uniqueValues4[14], uniqueValues4[15]);
- QVERIFY(isSame(m8, uniqueValues4));
-}
-
-// Test the creation of QMatrix4x3 objects in various ways:
-// construct, copy, and modify.
-void tst_QMatrixNxN::create4x3()
-{
- QMatrix4x3 m1;
- QVERIFY(isIdentity(m1));
- QVERIFY(m1.isIdentity());
-
- QMatrix4x3 m2;
- setMatrix(m2, uniqueValues4x3);
- QVERIFY(isSame(m2, uniqueValues4x3));
- QVERIFY(!m2.isIdentity());
-
- QMatrix4x3 m3;
- setMatrixDirect(m3, uniqueValues4x3);
- QVERIFY(isSame(m3, uniqueValues4x3));
-
- QMatrix4x3 m4(m3);
- QVERIFY(isSame(m4, uniqueValues4x3));
-
- QMatrix4x3 m5;
- m5 = m3;
- QVERIFY(isSame(m5, uniqueValues4x3));
-
- m5.setIdentity();
- QVERIFY(isIdentity(m5));
-
- QMatrix4x3 m6(uniqueValues4x3);
- QVERIFY(isSame(m6, uniqueValues4x3));
- qreal vals[12];
- m6.toValueArray(vals);
- for (int index = 0; index < 12; ++index)
- QCOMPARE((float)(vals[index]), (float)(uniqueValues4x3[index]));
-}
-
-// Test isIdentity() for 2x2 matrices.
-void tst_QMatrixNxN::isIdentity2x2()
-{
- for (int i = 0; i < 2 * 2; ++i) {
- QMatrix2x2 m;
- QVERIFY(m.isIdentity());
- m.data()[i] = 42.0f;
- QVERIFY(!m.isIdentity());
- }
-}
-
-// Test isIdentity() for 3x3 matrices.
-void tst_QMatrixNxN::isIdentity3x3()
-{
- for (int i = 0; i < 3 * 3; ++i) {
- QMatrix3x3 m;
- QVERIFY(m.isIdentity());
- m.data()[i] = 42.0f;
- QVERIFY(!m.isIdentity());
- }
-}
-
-// Test isIdentity() for 4x4 matrices.
-void tst_QMatrixNxN::isIdentity4x4()
-{
- for (int i = 0; i < 4 * 4; ++i) {
- QMatrix4x4 m;
- QVERIFY(m.isIdentity());
- m.data()[i] = 42.0f;
- QVERIFY(!m.isIdentity());
- }
-
- // Force the "Identity" flag bit to be lost and check again.
- QMatrix4x4 m2;
- m2.data()[0] = 1.0f;
- QVERIFY(m2.isIdentity());
-}
-
-// Test isIdentity() for 4x3 matrices.
-void tst_QMatrixNxN::isIdentity4x3()
-{
- for (int i = 0; i < 4 * 3; ++i) {
- QMatrix4x3 m;
- QVERIFY(m.isIdentity());
- m.data()[i] = 42.0f;
- QVERIFY(!m.isIdentity());
- }
-}
-
-// Test 2x2 matrix comparisons.
-void tst_QMatrixNxN::compare2x2()
-{
- QMatrix2x2 m1(uniqueValues2);
- QMatrix2x2 m2(uniqueValues2);
- QMatrix2x2 m3(transposedValues2);
-
- QVERIFY(m1 == m2);
- QVERIFY(!(m1 != m2));
- QVERIFY(m1 != m3);
- QVERIFY(!(m1 == m3));
-}
-
-// Test 3x3 matrix comparisons.
-void tst_QMatrixNxN::compare3x3()
-{
- QMatrix3x3 m1(uniqueValues3);
- QMatrix3x3 m2(uniqueValues3);
- QMatrix3x3 m3(transposedValues3);
-
- QVERIFY(m1 == m2);
- QVERIFY(!(m1 != m2));
- QVERIFY(m1 != m3);
- QVERIFY(!(m1 == m3));
-}
-
-// Test 4x4 matrix comparisons.
-void tst_QMatrixNxN::compare4x4()
-{
- QMatrix4x4 m1(uniqueValues4);
- QMatrix4x4 m2(uniqueValues4);
- QMatrix4x4 m3(transposedValues4);
-
- QVERIFY(m1 == m2);
- QVERIFY(!(m1 != m2));
- QVERIFY(m1 != m3);
- QVERIFY(!(m1 == m3));
-}
-
-// Test 4x3 matrix comparisons.
-void tst_QMatrixNxN::compare4x3()
-{
- QMatrix4x3 m1(uniqueValues4x3);
- QMatrix4x3 m2(uniqueValues4x3);
- QMatrix4x3 m3(transposedValues3x4);
-
- QVERIFY(m1 == m2);
- QVERIFY(!(m1 != m2));
- QVERIFY(m1 != m3);
- QVERIFY(!(m1 == m3));
-}
-
-// Test matrix 2x2 transpose operations.
-void tst_QMatrixNxN::transposed2x2()
-{
- // Transposing the identity should result in the identity.
- QMatrix2x2 m1;
- QMatrix2x2 m2 = m1.transposed();
- QVERIFY(isIdentity(m2));
-
- // Transpose a more interesting matrix that allows us to track
- // exactly where each source element ends up.
- QMatrix2x2 m3(uniqueValues2);
- QMatrix2x2 m4 = m3.transposed();
- QVERIFY(isSame(m4, transposedValues2));
-
- // Transpose in-place, just to check that the compiler is sane.
- m3 = m3.transposed();
- QVERIFY(isSame(m3, transposedValues2));
-}
-
-// Test matrix 3x3 transpose operations.
-void tst_QMatrixNxN::transposed3x3()
-{
- // Transposing the identity should result in the identity.
- QMatrix3x3 m1;
- QMatrix3x3 m2 = m1.transposed();
- QVERIFY(isIdentity(m2));
-
- // Transpose a more interesting matrix that allows us to track
- // exactly where each source element ends up.
- QMatrix3x3 m3(uniqueValues3);
- QMatrix3x3 m4 = m3.transposed();
- QVERIFY(isSame(m4, transposedValues3));
-
- // Transpose in-place, just to check that the compiler is sane.
- m3 = m3.transposed();
- QVERIFY(isSame(m3, transposedValues3));
-}
-
-// Test matrix 4x4 transpose operations.
-void tst_QMatrixNxN::transposed4x4()
-{
- // Transposing the identity should result in the identity.
- QMatrix4x4 m1;
- QMatrix4x4 m2 = m1.transposed();
- QVERIFY(isIdentity(m2));
-
- // Transpose a more interesting matrix that allows us to track
- // exactly where each source element ends up.
- QMatrix4x4 m3(uniqueValues4);
- QMatrix4x4 m4 = m3.transposed();
- QVERIFY(isSame(m4, transposedValues4));
-
- // Transpose in-place, just to check that the compiler is sane.
- m3 = m3.transposed();
- QVERIFY(isSame(m3, transposedValues4));
-}
-
-// Test matrix 4x3 transpose operations.
-void tst_QMatrixNxN::transposed4x3()
-{
- QMatrix4x3 m3(uniqueValues4x3);
- QMatrix3x4 m4 = m3.transposed();
- qreal values[12];
- m4.toValueArray(values);
- for (int index = 0; index < 12; ++index)
- QCOMPARE(values[index], transposedValues3x4[index]);
-}
-
-// Test matrix addition for 2x2 matrices.
-void tst_QMatrixNxN::add2x2_data()
-{
- QTest::addColumn<void *>("m1Values");
- QTest::addColumn<void *>("m2Values");
- QTest::addColumn<void *>("m3Values");
-
- QTest::newRow("null")
- << (void *)nullValues2 << (void *)nullValues2 << (void *)nullValues2;
-
- QTest::newRow("identity/null")
- << (void *)identityValues2 << (void *)nullValues2 << (void *)identityValues2;
-
- QTest::newRow("identity/identity")
- << (void *)identityValues2 << (void *)identityValues2 << (void *)doubleIdentity2;
-
- static qreal const sumValues[16] =
- {2.0f, 7.0f,
- 7.0f, 12.0f};
- QTest::newRow("unique")
- << (void *)uniqueValues2 << (void *)transposedValues2 << (void *)sumValues;
-}
-void tst_QMatrixNxN::add2x2()
-{
- QFETCH(void *, m1Values);
- QFETCH(void *, m2Values);
- QFETCH(void *, m3Values);
-
- QMatrix2x2 m1((const qreal *)m1Values);
- QMatrix2x2 m2((const qreal *)m2Values);
-
- QMatrix2x2 m4(m1);
- m4 += m2;
- QVERIFY(isSame(m4, (const qreal *)m3Values));
-
- QMatrix2x2 m5;
- m5 = m1 + m2;
- QVERIFY(isSame(m5, (const qreal *)m3Values));
-}
-
-// Test matrix addition for 3x3 matrices.
-void tst_QMatrixNxN::add3x3_data()
-{
- QTest::addColumn<void *>("m1Values");
- QTest::addColumn<void *>("m2Values");
- QTest::addColumn<void *>("m3Values");
-
- QTest::newRow("null")
- << (void *)nullValues3 << (void *)nullValues3 << (void *)nullValues3;
-
- QTest::newRow("identity/null")
- << (void *)identityValues3 << (void *)nullValues3 << (void *)identityValues3;
-
- QTest::newRow("identity/identity")
- << (void *)identityValues3 << (void *)identityValues3 << (void *)doubleIdentity3;
-
- static qreal const sumValues[16] =
- {2.0f, 7.0f, 12.0f,
- 7.0f, 12.0f, 17.0f,
- 12.0f, 17.0f, 22.0f};
- QTest::newRow("unique")
- << (void *)uniqueValues3 << (void *)transposedValues3 << (void *)sumValues;
-}
-void tst_QMatrixNxN::add3x3()
-{
- QFETCH(void *, m1Values);
- QFETCH(void *, m2Values);
- QFETCH(void *, m3Values);
-
- QMatrix3x3 m1((const qreal *)m1Values);
- QMatrix3x3 m2((const qreal *)m2Values);
-
- QMatrix3x3 m4(m1);
- m4 += m2;
- QVERIFY(isSame(m4, (const qreal *)m3Values));
-
- QMatrix3x3 m5;
- m5 = m1 + m2;
- QVERIFY(isSame(m5, (const qreal *)m3Values));
-}
-
-// Test matrix addition for 4x4 matrices.
-void tst_QMatrixNxN::add4x4_data()
-{
- QTest::addColumn<void *>("m1Values");
- QTest::addColumn<void *>("m2Values");
- QTest::addColumn<void *>("m3Values");
-
- QTest::newRow("null")
- << (void *)nullValues4 << (void *)nullValues4 << (void *)nullValues4;
-
- QTest::newRow("identity/null")
- << (void *)identityValues4 << (void *)nullValues4 << (void *)identityValues4;
-
- QTest::newRow("identity/identity")
- << (void *)identityValues4 << (void *)identityValues4 << (void *)doubleIdentity4;
-
- static qreal const sumValues[16] =
- {2.0f, 7.0f, 12.0f, 17.0f,
- 7.0f, 12.0f, 17.0f, 22.0f,
- 12.0f, 17.0f, 22.0f, 27.0f,
- 17.0f, 22.0f, 27.0f, 32.0f};
- QTest::newRow("unique")
- << (void *)uniqueValues4 << (void *)transposedValues4 << (void *)sumValues;
-}
-void tst_QMatrixNxN::add4x4()
-{
- QFETCH(void *, m1Values);
- QFETCH(void *, m2Values);
- QFETCH(void *, m3Values);
-
- QMatrix4x4 m1((const qreal *)m1Values);
- QMatrix4x4 m2((const qreal *)m2Values);
-
- QMatrix4x4 m4(m1);
- m4 += m2;
- QVERIFY(isSame(m4, (const qreal *)m3Values));
-
- QMatrix4x4 m5;
- m5 = m1 + m2;
- QVERIFY(isSame(m5, (const qreal *)m3Values));
-}
-
-// Test matrix addition for 4x3 matrices.
-void tst_QMatrixNxN::add4x3_data()
-{
- QTest::addColumn<void *>("m1Values");
- QTest::addColumn<void *>("m2Values");
- QTest::addColumn<void *>("m3Values");
-
- QTest::newRow("null")
- << (void *)nullValues4x3 << (void *)nullValues4x3 << (void *)nullValues4x3;
-
- QTest::newRow("identity/null")
- << (void *)identityValues4x3 << (void *)nullValues4x3 << (void *)identityValues4x3;
-
- QTest::newRow("identity/identity")
- << (void *)identityValues4x3 << (void *)identityValues4x3 << (void *)doubleIdentity4x3;
-
- static qreal const sumValues[16] =
- {2.0f, 7.0f, 12.0f, 6.0f,
- 11.0f, 16.0f, 10.0f, 15.0f,
- 20.0f, 14.0f, 19.0f, 24.0f};
- QTest::newRow("unique")
- << (void *)uniqueValues4x3 << (void *)transposedValues3x4 << (void *)sumValues;
-}
-void tst_QMatrixNxN::add4x3()
-{
- QFETCH(void *, m1Values);
- QFETCH(void *, m2Values);
- QFETCH(void *, m3Values);
-
- QMatrix4x3 m1((const qreal *)m1Values);
- QMatrix4x3 m2((const qreal *)m2Values);
-
- QMatrix4x3 m4(m1);
- m4 += m2;
- QVERIFY(isSame(m4, (const qreal *)m3Values));
-
- QMatrix4x3 m5;
- m5 = m1 + m2;
- QVERIFY(isSame(m5, (const qreal *)m3Values));
-}
-
-// Test matrix subtraction for 2x2 matrices.
-void tst_QMatrixNxN::subtract2x2_data()
-{
- // Use the same test cases as the add test.
- add2x2_data();
-}
-void tst_QMatrixNxN::subtract2x2()
-{
- QFETCH(void *, m1Values);
- QFETCH(void *, m2Values);
- QFETCH(void *, m3Values);
-
- QMatrix2x2 m1((const qreal *)m1Values);
- QMatrix2x2 m2((const qreal *)m2Values);
- QMatrix2x2 m3((const qreal *)m3Values);
-
- QMatrix2x2 m4(m3);
- m4 -= m1;
- QVERIFY(isSame(m4, (const qreal *)m2Values));
-
- QMatrix2x2 m5;
- m5 = m3 - m1;
- QVERIFY(isSame(m5, (const qreal *)m2Values));
-
- QMatrix2x2 m6(m3);
- m6 -= m2;
- QVERIFY(isSame(m6, (const qreal *)m1Values));
-
- QMatrix2x2 m7;
- m7 = m3 - m2;
- QVERIFY(isSame(m7, (const qreal *)m1Values));
-}
-
-// Test matrix subtraction for 3x3 matrices.
-void tst_QMatrixNxN::subtract3x3_data()
-{
- // Use the same test cases as the add test.
- add3x3_data();
-}
-void tst_QMatrixNxN::subtract3x3()
-{
- QFETCH(void *, m1Values);
- QFETCH(void *, m2Values);
- QFETCH(void *, m3Values);
-
- QMatrix3x3 m1((const qreal *)m1Values);
- QMatrix3x3 m2((const qreal *)m2Values);
- QMatrix3x3 m3((const qreal *)m3Values);
-
- QMatrix3x3 m4(m3);
- m4 -= m1;
- QVERIFY(isSame(m4, (const qreal *)m2Values));
-
- QMatrix3x3 m5;
- m5 = m3 - m1;
- QVERIFY(isSame(m5, (const qreal *)m2Values));
-
- QMatrix3x3 m6(m3);
- m6 -= m2;
- QVERIFY(isSame(m6, (const qreal *)m1Values));
-
- QMatrix3x3 m7;
- m7 = m3 - m2;
- QVERIFY(isSame(m7, (const qreal *)m1Values));
-}
-
-// Test matrix subtraction for 4x4 matrices.
-void tst_QMatrixNxN::subtract4x4_data()
-{
- // Use the same test cases as the add test.
- add4x4_data();
-}
-void tst_QMatrixNxN::subtract4x4()
-{
- QFETCH(void *, m1Values);
- QFETCH(void *, m2Values);
- QFETCH(void *, m3Values);
-
- QMatrix4x4 m1((const qreal *)m1Values);
- QMatrix4x4 m2((const qreal *)m2Values);
- QMatrix4x4 m3((const qreal *)m3Values);
-
- QMatrix4x4 m4(m3);
- m4 -= m1;
- QVERIFY(isSame(m4, (const qreal *)m2Values));
-
- QMatrix4x4 m5;
- m5 = m3 - m1;
- QVERIFY(isSame(m5, (const qreal *)m2Values));
-
- QMatrix4x4 m6(m3);
- m6 -= m2;
- QVERIFY(isSame(m6, (const qreal *)m1Values));
-
- QMatrix4x4 m7;
- m7 = m3 - m2;
- QVERIFY(isSame(m7, (const qreal *)m1Values));
-}
-
-// Test matrix subtraction for 4x3 matrices.
-void tst_QMatrixNxN::subtract4x3_data()
-{
- // Use the same test cases as the add test.
- add4x3_data();
-}
-void tst_QMatrixNxN::subtract4x3()
-{
- QFETCH(void *, m1Values);
- QFETCH(void *, m2Values);
- QFETCH(void *, m3Values);
-
- QMatrix4x3 m1((const qreal *)m1Values);
- QMatrix4x3 m2((const qreal *)m2Values);
- QMatrix4x3 m3((const qreal *)m3Values);
-
- QMatrix4x3 m4(m3);
- m4 -= m1;
- QVERIFY(isSame(m4, (const qreal *)m2Values));
-
- QMatrix4x3 m5;
- m5 = m3 - m1;
- QVERIFY(isSame(m5, (const qreal *)m2Values));
-
- QMatrix4x3 m6(m3);
- m6 -= m2;
- QVERIFY(isSame(m6, (const qreal *)m1Values));
-
- QMatrix4x3 m7;
- m7 = m3 - m2;
- QVERIFY(isSame(m7, (const qreal *)m1Values));
-}
-
-// Test matrix multiplication for 2x2 matrices.
-void tst_QMatrixNxN::multiply2x2_data()
-{
- QTest::addColumn<void *>("m1Values");
- QTest::addColumn<void *>("m2Values");
- QTest::addColumn<void *>("m3Values");
-
- QTest::newRow("null")
- << (void *)nullValues2 << (void *)nullValues2 << (void *)nullValues2;
-
- QTest::newRow("null/unique")
- << (void *)nullValues2 << (void *)uniqueValues2 << (void *)nullValues2;
-
- QTest::newRow("unique/null")
- << (void *)uniqueValues2 << (void *)nullValues2 << (void *)nullValues2;
-
- QTest::newRow("unique/identity")
- << (void *)uniqueValues2 << (void *)identityValues2 << (void *)uniqueValues2;
-
- QTest::newRow("identity/unique")
- << (void *)identityValues2 << (void *)uniqueValues2 << (void *)uniqueValues2;
-
- static qreal uniqueResult[4];
- for (int row = 0; row < 2; ++row) {
- for (int col = 0; col < 2; ++col) {
- qreal sum = 0.0f;
- for (int j = 0; j < 2; ++j)
- sum += uniqueValues2[row * 2 + j] * transposedValues2[j * 2 + col];
- uniqueResult[row * 2 + col] = sum;
- }
- }
-
- QTest::newRow("unique/transposed")
- << (void *)uniqueValues2 << (void *)transposedValues2 << (void *)uniqueResult;
-}
-void tst_QMatrixNxN::multiply2x2()
-{
- QFETCH(void *, m1Values);
- QFETCH(void *, m2Values);
- QFETCH(void *, m3Values);
-
- QMatrix2x2 m1((const qreal *)m1Values);
- QMatrix2x2 m2((const qreal *)m2Values);
-
- QMatrix2x2 m5;
- m5 = m1 * m2;
- QVERIFY(isSame(m5, (const qreal *)m3Values));
-}
-
-// Test matrix multiplication for 3x3 matrices.
-void tst_QMatrixNxN::multiply3x3_data()
-{
- QTest::addColumn<void *>("m1Values");
- QTest::addColumn<void *>("m2Values");
- QTest::addColumn<void *>("m3Values");
-
- QTest::newRow("null")
- << (void *)nullValues3 << (void *)nullValues3 << (void *)nullValues3;
-
- QTest::newRow("null/unique")
- << (void *)nullValues3 << (void *)uniqueValues3 << (void *)nullValues3;
-
- QTest::newRow("unique/null")
- << (void *)uniqueValues3 << (void *)nullValues3 << (void *)nullValues3;
-
- QTest::newRow("unique/identity")
- << (void *)uniqueValues3 << (void *)identityValues3 << (void *)uniqueValues3;
-
- QTest::newRow("identity/unique")
- << (void *)identityValues3 << (void *)uniqueValues3 << (void *)uniqueValues3;
-
- static qreal uniqueResult[9];
- for (int row = 0; row < 3; ++row) {
- for (int col = 0; col < 3; ++col) {
- qreal sum = 0.0f;
- for (int j = 0; j < 3; ++j)
- sum += uniqueValues3[row * 3 + j] * transposedValues3[j * 3 + col];
- uniqueResult[row * 3 + col] = sum;
- }
- }
-
- QTest::newRow("unique/transposed")
- << (void *)uniqueValues3 << (void *)transposedValues3 << (void *)uniqueResult;
-}
-void tst_QMatrixNxN::multiply3x3()
-{
- QFETCH(void *, m1Values);
- QFETCH(void *, m2Values);
- QFETCH(void *, m3Values);
-
- QMatrix3x3 m1((const qreal *)m1Values);
- QMatrix3x3 m2((const qreal *)m2Values);
-
- QMatrix3x3 m5;
- m5 = m1 * m2;
- QVERIFY(isSame(m5, (const qreal *)m3Values));
-}
-
-// Test matrix multiplication for 4x4 matrices.
-void tst_QMatrixNxN::multiply4x4_data()
-{
- QTest::addColumn<void *>("m1Values");
- QTest::addColumn<void *>("m2Values");
- QTest::addColumn<void *>("m3Values");
-
- QTest::newRow("null")
- << (void *)nullValues4 << (void *)nullValues4 << (void *)nullValues4;
-
- QTest::newRow("null/unique")
- << (void *)nullValues4 << (void *)uniqueValues4 << (void *)nullValues4;
-
- QTest::newRow("unique/null")
- << (void *)uniqueValues4 << (void *)nullValues4 << (void *)nullValues4;
-
- QTest::newRow("unique/identity")
- << (void *)uniqueValues4 << (void *)identityValues4 << (void *)uniqueValues4;
-
- QTest::newRow("identity/unique")
- << (void *)identityValues4 << (void *)uniqueValues4 << (void *)uniqueValues4;
-
- static qreal uniqueResult[16];
- for (int row = 0; row < 4; ++row) {
- for (int col = 0; col < 4; ++col) {
- qreal sum = 0.0f;
- for (int j = 0; j < 4; ++j)
- sum += uniqueValues4[row * 4 + j] * transposedValues4[j * 4 + col];
- uniqueResult[row * 4 + col] = sum;
- }
- }
-
- QTest::newRow("unique/transposed")
- << (void *)uniqueValues4 << (void *)transposedValues4 << (void *)uniqueResult;
-}
-void tst_QMatrixNxN::multiply4x4()
-{
- QFETCH(void *, m1Values);
- QFETCH(void *, m2Values);
- QFETCH(void *, m3Values);
-
- QMatrix4x4 m1((const qreal *)m1Values);
- QMatrix4x4 m2((const qreal *)m2Values);
-
- QMatrix4x4 m4;
- m4 = m1;
- m4 *= m2;
- QVERIFY(isSame(m4, (const qreal *)m3Values));
-
- QMatrix4x4 m5;
- m5 = m1 * m2;
- QVERIFY(isSame(m5, (const qreal *)m3Values));
-}
-
-// Test matrix multiplication for 4x3 matrices.
-void tst_QMatrixNxN::multiply4x3_data()
-{
- QTest::addColumn<void *>("m1Values");
- QTest::addColumn<void *>("m2Values");
- QTest::addColumn<void *>("m3Values");
-
- QTest::newRow("null")
- << (void *)nullValues4x3 << (void *)nullValues4x3 << (void *)nullValues3;
-
- QTest::newRow("null/unique")
- << (void *)nullValues4x3 << (void *)uniqueValues4x3 << (void *)nullValues3;
-
- QTest::newRow("unique/null")
- << (void *)uniqueValues4x3 << (void *)nullValues4x3 << (void *)nullValues3;
-
- static qreal uniqueResult[9];
- for (int row = 0; row < 3; ++row) {
- for (int col = 0; col < 3; ++col) {
- qreal sum = 0.0f;
- for (int j = 0; j < 4; ++j)
- sum += uniqueValues4x3[row * 4 + j] * transposedValues3x4[j * 3 + col];
- uniqueResult[row * 3 + col] = sum;
- }
- }
-
- QTest::newRow("unique/transposed")
- << (void *)uniqueValues4x3 << (void *)transposedValues3x4 << (void *)uniqueResult;
-}
-void tst_QMatrixNxN::multiply4x3()
-{
- QFETCH(void *, m1Values);
- QFETCH(void *, m2Values);
- QFETCH(void *, m3Values);
-
- QMatrix4x3 m1((const qreal *)m1Values);
- QMatrix3x4 m2((const qreal *)m2Values);
-
- QGenericMatrix<3, 3, qreal, float> m4;
- m4 = m1 * m2;
- qreal values[9];
- m4.toValueArray(values);
- for (int index = 0; index < 9; ++index)
- QCOMPARE(values[index], ((const qreal *)m3Values)[index]);
-}
-
-// Test matrix multiplication by a factor for 2x2 matrices.
-void tst_QMatrixNxN::multiplyFactor2x2_data()
-{
- QTest::addColumn<void *>("m1Values");
- QTest::addColumn<qreal>("factor");
- QTest::addColumn<void *>("m2Values");
-
- QTest::newRow("null")
- << (void *)nullValues2 << (qreal)1.0f << (void *)nullValues2;
-
- QTest::newRow("double identity")
- << (void *)identityValues2 << (qreal)2.0f << (void *)doubleIdentity2;
-
- static qreal const values[16] =
- {1.0f, 2.0f,
- 5.0f, 6.0f};
- static qreal const doubleValues[16] =
- {2.0f, 4.0f,
- 10.0f, 12.0f};
- static qreal const negDoubleValues[16] =
- {-2.0f, -4.0f,
- -10.0f, -12.0f};
-
- QTest::newRow("unique")
- << (void *)values << (qreal)2.0f << (void *)doubleValues;
-
- QTest::newRow("neg")
- << (void *)values << (qreal)-2.0f << (void *)negDoubleValues;
-
- QTest::newRow("zero")
- << (void *)values << (qreal)0.0f << (void *)nullValues4;
-}
-void tst_QMatrixNxN::multiplyFactor2x2()
-{
- QFETCH(void *, m1Values);
- QFETCH(qreal, factor);
- QFETCH(void *, m2Values);
-
- QMatrix2x2 m1((const qreal *)m1Values);
-
- QMatrix2x2 m3;
- m3 = m1;
- m3 *= factor;
- QVERIFY(isSame(m3, (const qreal *)m2Values));
-
- QMatrix2x2 m4;
- m4 = m1 * factor;
- QVERIFY(isSame(m4, (const qreal *)m2Values));
-
- QMatrix2x2 m5;
- m5 = factor * m1;
- QVERIFY(isSame(m5, (const qreal *)m2Values));
-}
-
-// Test matrix multiplication by a factor for 3x3 matrices.
-void tst_QMatrixNxN::multiplyFactor3x3_data()
-{
- QTest::addColumn<void *>("m1Values");
- QTest::addColumn<qreal>("factor");
- QTest::addColumn<void *>("m2Values");
-
- QTest::newRow("null")
- << (void *)nullValues3 << (qreal)1.0f << (void *)nullValues3;
-
- QTest::newRow("double identity")
- << (void *)identityValues3 << (qreal)2.0f << (void *)doubleIdentity3;
-
- static qreal const values[16] =
- {1.0f, 2.0f, 3.0f,
- 5.0f, 6.0f, 7.0f,
- 9.0f, 10.0f, 11.0f};
- static qreal const doubleValues[16] =
- {2.0f, 4.0f, 6.0f,
- 10.0f, 12.0f, 14.0f,
- 18.0f, 20.0f, 22.0f};
- static qreal const negDoubleValues[16] =
- {-2.0f, -4.0f, -6.0f,
- -10.0f, -12.0f, -14.0f,
- -18.0f, -20.0f, -22.0f};
-
- QTest::newRow("unique")
- << (void *)values << (qreal)2.0f << (void *)doubleValues;
-
- QTest::newRow("neg")
- << (void *)values << (qreal)-2.0f << (void *)negDoubleValues;
-
- QTest::newRow("zero")
- << (void *)values << (qreal)0.0f << (void *)nullValues4;
-}
-void tst_QMatrixNxN::multiplyFactor3x3()
-{
- QFETCH(void *, m1Values);
- QFETCH(qreal, factor);
- QFETCH(void *, m2Values);
-
- QMatrix3x3 m1((const qreal *)m1Values);
-
- QMatrix3x3 m3;
- m3 = m1;
- m3 *= factor;
- QVERIFY(isSame(m3, (const qreal *)m2Values));
-
- QMatrix3x3 m4;
- m4 = m1 * factor;
- QVERIFY(isSame(m4, (const qreal *)m2Values));
-
- QMatrix3x3 m5;
- m5 = factor * m1;
- QVERIFY(isSame(m5, (const qreal *)m2Values));
-}
-
-// Test matrix multiplication by a factor for 4x4 matrices.
-void tst_QMatrixNxN::multiplyFactor4x4_data()
-{
- QTest::addColumn<void *>("m1Values");
- QTest::addColumn<qreal>("factor");
- QTest::addColumn<void *>("m2Values");
-
- QTest::newRow("null")
- << (void *)nullValues4 << (qreal)1.0f << (void *)nullValues4;
-
- QTest::newRow("double identity")
- << (void *)identityValues4 << (qreal)2.0f << (void *)doubleIdentity4;
-
- static qreal const values[16] =
- {1.0f, 2.0f, 3.0f, 4.0f,
- 5.0f, 6.0f, 7.0f, 8.0f,
- 9.0f, 10.0f, 11.0f, 12.0f,
- 13.0f, 14.0f, 15.0f, 16.0f};
- static qreal const doubleValues[16] =
- {2.0f, 4.0f, 6.0f, 8.0f,
- 10.0f, 12.0f, 14.0f, 16.0f,
- 18.0f, 20.0f, 22.0f, 24.0f,
- 26.0f, 28.0f, 30.0f, 32.0f};
- static qreal const negDoubleValues[16] =
- {-2.0f, -4.0f, -6.0f, -8.0f,
- -10.0f, -12.0f, -14.0f, -16.0f,
- -18.0f, -20.0f, -22.0f, -24.0f,
- -26.0f, -28.0f, -30.0f, -32.0f};
-
- QTest::newRow("unique")
- << (void *)values << (qreal)2.0f << (void *)doubleValues;
-
- QTest::newRow("neg")
- << (void *)values << (qreal)-2.0f << (void *)negDoubleValues;
-
- QTest::newRow("zero")
- << (void *)values << (qreal)0.0f << (void *)nullValues4;
-}
-void tst_QMatrixNxN::multiplyFactor4x4()
-{
- QFETCH(void *, m1Values);
- QFETCH(qreal, factor);
- QFETCH(void *, m2Values);
-
- QMatrix4x4 m1((const qreal *)m1Values);
-
- QMatrix4x4 m3;
- m3 = m1;
- m3 *= factor;
- QVERIFY(isSame(m3, (const qreal *)m2Values));
-
- QMatrix4x4 m4;
- m4 = m1 * factor;
- QVERIFY(isSame(m4, (const qreal *)m2Values));
-
- QMatrix4x4 m5;
- m5 = factor * m1;
- QVERIFY(isSame(m5, (const qreal *)m2Values));
-}
-
-// Test matrix multiplication by a factor for 4x3 matrices.
-void tst_QMatrixNxN::multiplyFactor4x3_data()
-{
- QTest::addColumn<void *>("m1Values");
- QTest::addColumn<qreal>("factor");
- QTest::addColumn<void *>("m2Values");
-
- QTest::newRow("null")
- << (void *)nullValues4x3 << (qreal)1.0f << (void *)nullValues4x3;
-
- QTest::newRow("double identity")
- << (void *)identityValues4x3 << (qreal)2.0f << (void *)doubleIdentity4x3;
-
- static qreal const values[12] =
- {1.0f, 2.0f, 3.0f, 4.0f,
- 5.0f, 6.0f, 7.0f, 8.0f,
- 9.0f, 10.0f, 11.0f, 12.0f};
- static qreal const doubleValues[12] =
- {2.0f, 4.0f, 6.0f, 8.0f,
- 10.0f, 12.0f, 14.0f, 16.0f,
- 18.0f, 20.0f, 22.0f, 24.0f};
- static qreal const negDoubleValues[12] =
- {-2.0f, -4.0f, -6.0f, -8.0f,
- -10.0f, -12.0f, -14.0f, -16.0f,
- -18.0f, -20.0f, -22.0f, -24.0f};
-
- QTest::newRow("unique")
- << (void *)values << (qreal)2.0f << (void *)doubleValues;
-
- QTest::newRow("neg")
- << (void *)values << (qreal)-2.0f << (void *)negDoubleValues;
-
- QTest::newRow("zero")
- << (void *)values << (qreal)0.0f << (void *)nullValues4x3;
-}
-void tst_QMatrixNxN::multiplyFactor4x3()
-{
- QFETCH(void *, m1Values);
- QFETCH(qreal, factor);
- QFETCH(void *, m2Values);
-
- QMatrix4x3 m1((const qreal *)m1Values);
-
- QMatrix4x3 m3;
- m3 = m1;
- m3 *= factor;
- QVERIFY(isSame(m3, (const qreal *)m2Values));
-
- QMatrix4x3 m4;
- m4 = m1 * factor;
- QVERIFY(isSame(m4, (const qreal *)m2Values));
-
- QMatrix4x3 m5;
- m5 = factor * m1;
- QVERIFY(isSame(m5, (const qreal *)m2Values));
-}
-
-// Test matrix division by a factor for 2x2 matrices.
-void tst_QMatrixNxN::divideFactor2x2_data()
-{
- // Use the same test cases as the multiplyFactor test.
- multiplyFactor2x2_data();
-}
-void tst_QMatrixNxN::divideFactor2x2()
-{
- QFETCH(void *, m1Values);
- QFETCH(qreal, factor);
- QFETCH(void *, m2Values);
-
- if (factor == 0.0f)
- return;
-
- QMatrix2x2 m2((const qreal *)m2Values);
-
- QMatrix2x2 m3;
- m3 = m2;
- m3 /= factor;
- QVERIFY(isSame(m3, (const qreal *)m1Values));
-
- QMatrix2x2 m4;
- m4 = m2 / factor;
- QVERIFY(isSame(m4, (const qreal *)m1Values));
-}
-
-// Test matrix division by a factor for 3x3 matrices.
-void tst_QMatrixNxN::divideFactor3x3_data()
-{
- // Use the same test cases as the multiplyFactor test.
- multiplyFactor3x3_data();
-}
-void tst_QMatrixNxN::divideFactor3x3()
-{
- QFETCH(void *, m1Values);
- QFETCH(qreal, factor);
- QFETCH(void *, m2Values);
-
- if (factor == 0.0f)
- return;
-
- QMatrix3x3 m2((const qreal *)m2Values);
-
- QMatrix3x3 m3;
- m3 = m2;
- m3 /= factor;
- QVERIFY(isSame(m3, (const qreal *)m1Values));
-
- QMatrix3x3 m4;
- m4 = m2 / factor;
- QVERIFY(isSame(m4, (const qreal *)m1Values));
-}
-
-// Test matrix division by a factor for 4x4 matrices.
-void tst_QMatrixNxN::divideFactor4x4_data()
-{
- // Use the same test cases as the multiplyFactor test.
- multiplyFactor4x4_data();
-}
-void tst_QMatrixNxN::divideFactor4x4()
-{
- QFETCH(void *, m1Values);
- QFETCH(qreal, factor);
- QFETCH(void *, m2Values);
-
- if (factor == 0.0f)
- return;
-
- QMatrix4x4 m2((const qreal *)m2Values);
-
- QMatrix4x4 m3;
- m3 = m2;
- m3 /= factor;
- QVERIFY(isSame(m3, (const qreal *)m1Values));
-
- QMatrix4x4 m4;
- m4 = m2 / factor;
- QVERIFY(isSame(m4, (const qreal *)m1Values));
-}
-
-// Test matrix division by a factor for 4x3 matrices.
-void tst_QMatrixNxN::divideFactor4x3_data()
-{
- // Use the same test cases as the multiplyFactor test.
- multiplyFactor4x3_data();
-}
-void tst_QMatrixNxN::divideFactor4x3()
-{
- QFETCH(void *, m1Values);
- QFETCH(qreal, factor);
- QFETCH(void *, m2Values);
-
- if (factor == 0.0f)
- return;
-
- QMatrix4x3 m2((const qreal *)m2Values);
-
- QMatrix4x3 m3;
- m3 = m2;
- m3 /= factor;
- QVERIFY(isSame(m3, (const qreal *)m1Values));
-
- QMatrix4x3 m4;
- m4 = m2 / factor;
- QVERIFY(isSame(m4, (const qreal *)m1Values));
-}
-
-// Test matrix negation for 2x2 matrices.
-void tst_QMatrixNxN::negate2x2_data()
-{
- // Use the same test cases as the multiplyFactor test.
- multiplyFactor2x2_data();
-}
-void tst_QMatrixNxN::negate2x2()
-{
- QFETCH(void *, m1Values);
-
- const qreal *values = (const qreal *)m1Values;
-
- QMatrix2x2 m1(values);
-
- qreal negated[4];
- for (int index = 0; index < 4; ++index)
- negated[index] = -values[index];
-
- QMatrix2x2 m2;
- m2 = -m1;
- QVERIFY(isSame(m2, negated));
-}
-
-// Test matrix negation for 3x3 matrices.
-void tst_QMatrixNxN::negate3x3_data()
-{
- // Use the same test cases as the multiplyFactor test.
- multiplyFactor3x3_data();
-}
-void tst_QMatrixNxN::negate3x3()
-{
- QFETCH(void *, m1Values);
-
- const qreal *values = (const qreal *)m1Values;
-
- QMatrix3x3 m1(values);
-
- qreal negated[9];
- for (int index = 0; index < 9; ++index)
- negated[index] = -values[index];
-
- QMatrix3x3 m2;
- m2 = -m1;
- QVERIFY(isSame(m2, negated));
-}
-
-// Test matrix negation for 4x4 matrices.
-void tst_QMatrixNxN::negate4x4_data()
-{
- // Use the same test cases as the multiplyFactor test.
- multiplyFactor4x4_data();
-}
-void tst_QMatrixNxN::negate4x4()
-{
- QFETCH(void *, m1Values);
-
- const qreal *values = (const qreal *)m1Values;
-
- QMatrix4x4 m1(values);
-
- qreal negated[16];
- for (int index = 0; index < 16; ++index)
- negated[index] = -values[index];
-
- QMatrix4x4 m2;
- m2 = -m1;
- QVERIFY(isSame(m2, negated));
-}
-
-// Test matrix negation for 4x3 matrices.
-void tst_QMatrixNxN::negate4x3_data()
-{
- // Use the same test cases as the multiplyFactor test.
- multiplyFactor4x3_data();
-}
-void tst_QMatrixNxN::negate4x3()
-{
- QFETCH(void *, m1Values);
-
- const qreal *values = (const qreal *)m1Values;
-
- QMatrix4x3 m1(values);
-
- qreal negated[12];
- for (int index = 0; index < 12; ++index)
- negated[index] = -values[index];
-
- QMatrix4x3 m2;
- m2 = -m1;
- QVERIFY(isSame(m2, negated));
-}
-
-// Matrix inverted. This is a more straight-forward implementation
-// of the algorithm at http://www.j3d.org/matrix_faq/matrfaq_latest.html#Q24
-// than the optimized version in the QMatrix4x4 code. Hopefully it is
-// easier to verify that this version is the same as the reference.
-
-struct Matrix3
-{
- qreal v[9];
-};
-struct Matrix4
-{
- qreal v[16];
-};
-
-static qreal m3Determinant(const Matrix3& m)
-{
- return m.v[0] * (m.v[4] * m.v[8] - m.v[7] * m.v[5]) -
- m.v[1] * (m.v[3] * m.v[8] - m.v[6] * m.v[5]) +
- m.v[2] * (m.v[3] * m.v[7] - m.v[6] * m.v[4]);
-}
-
-static bool m3Inverse(const Matrix3& min, Matrix3& mout)
-{
- qreal det = m3Determinant(min);
- if (det == 0.0f)
- return false;
- mout.v[0] = (min.v[4] * min.v[8] - min.v[5] * min.v[7]) / det;
- mout.v[1] = -(min.v[1] * min.v[8] - min.v[2] * min.v[7]) / det;
- mout.v[2] = (min.v[1] * min.v[5] - min.v[4] * min.v[2]) / det;
- mout.v[3] = -(min.v[3] * min.v[8] - min.v[5] * min.v[6]) / det;
- mout.v[4] = (min.v[0] * min.v[8] - min.v[6] * min.v[2]) / det;
- mout.v[5] = -(min.v[0] * min.v[5] - min.v[3] * min.v[2]) / det;
- mout.v[6] = (min.v[3] * min.v[7] - min.v[6] * min.v[4]) / det;
- mout.v[7] = -(min.v[0] * min.v[7] - min.v[6] * min.v[1]) / det;
- mout.v[8] = (min.v[0] * min.v[4] - min.v[1] * min.v[3]) / det;
- return true;
-}
-
-static void m3Transpose(Matrix3& m)
-{
- qSwap(m.v[1], m.v[3]);
- qSwap(m.v[2], m.v[6]);
- qSwap(m.v[5], m.v[7]);
-}
-
-static void m4Submatrix(const Matrix4& min, Matrix3& mout, int i, int j)
-{
- for (int di = 0; di < 3; ++di) {
- for (int dj = 0; dj < 3; ++dj) {
- int si = di + ((di >= i) ? 1 : 0);
- int sj = dj + ((dj >= j) ? 1 : 0);
- mout.v[di * 3 + dj] = min.v[si * 4 + sj];
- }
- }
-}
-
-static qreal m4Determinant(const Matrix4& m)
-{
- qreal det;
- qreal result = 0.0f;
- qreal i = 1.0f;
- Matrix3 msub;
- for (int n = 0; n < 4; ++n, i *= -1.0f) {
- m4Submatrix(m, msub, 0, n);
- det = m3Determinant(msub);
- result += m.v[n] * det * i;
- }
- return result;
-}
-
-static void m4Inverse(const Matrix4& min, Matrix4& mout)
-{
- qreal det = m4Determinant(min);
- Matrix3 msub;
- for (int i = 0; i < 4; ++i) {
- for (int j = 0; j < 4; ++j) {
- qreal sign = 1.0f - ((i + j) % 2) * 2.0f;
- m4Submatrix(min, msub, i, j);
- mout.v[i + j * 4] = (m3Determinant(msub) * sign) / det;
- }
- }
-}
-
-// Test matrix inverted for 4x4 matrices.
-void tst_QMatrixNxN::inverted4x4_data()
-{
- QTest::addColumn<void *>("m1Values");
- QTest::addColumn<void *>("m2Values");
- QTest::addColumn<bool>("invertible");
-
- QTest::newRow("null")
- << (void *)nullValues4 << (void *)identityValues4 << false;
-
- QTest::newRow("identity")
- << (void *)identityValues4 << (void *)identityValues4 << true;
-
- QTest::newRow("unique")
- << (void *)uniqueValues4 << (void *)identityValues4 << false;
-
- static Matrix4 const invertible = {
- {5.0f, 0.0f, 0.0f, 2.0f,
- 0.0f, 6.0f, 0.0f, 3.0f,
- 0.0f, 0.0f, 7.0f, 4.0f,
- 0.0f, 0.0f, 0.0f, 1.0f}
- };
- static Matrix4 inverted;
- m4Inverse(invertible, inverted);
-
- QTest::newRow("invertible")
- << (void *)invertible.v << (void *)inverted.v << true;
-
- static Matrix4 const translate = {
- {1.0f, 0.0f, 0.0f, 2.0f,
- 0.0f, 1.0f, 0.0f, 3.0f,
- 0.0f, 0.0f, 1.0f, 4.0f,
- 0.0f, 0.0f, 0.0f, 1.0f}
- };
- static Matrix4 const inverseTranslate = {
- {1.0f, 0.0f, 0.0f, -2.0f,
- 0.0f, 1.0f, 0.0f, -3.0f,
- 0.0f, 0.0f, 1.0f, -4.0f,
- 0.0f, 0.0f, 0.0f, 1.0f}
- };
-
- QTest::newRow("translate")
- << (void *)translate.v << (void *)inverseTranslate.v << true;
-}
-void tst_QMatrixNxN::inverted4x4()
-{
- QFETCH(void *, m1Values);
- QFETCH(void *, m2Values);
- QFETCH(bool, invertible);
-
- QMatrix4x4 m1((const qreal *)m1Values);
-
- if (invertible)
- QVERIFY(m1.determinant() != 0.0f);
- else
- QVERIFY(m1.determinant() == 0.0f);
-
- Matrix4 m1alt;
- memcpy(m1alt.v, (const qreal *)m1Values, sizeof(m1alt.v));
-
- QCOMPARE((float)(m1.determinant()), (float)(m4Determinant(m1alt)));
-
- QMatrix4x4 m2;
- bool inv;
- m2 = m1.inverted(&inv);
- QVERIFY(isSame(m2, (const qreal *)m2Values));
-
- if (invertible) {
- QVERIFY(inv);
-
- Matrix4 m2alt;
- m4Inverse(m1alt, m2alt);
- QVERIFY(isSame(m2, m2alt.v));
-
- QMatrix4x4 m3;
- m3 = m1 * m2;
- QVERIFY(isIdentity(m3));
-
- QMatrix4x4 m4;
- m4 = m2 * m1;
- QVERIFY(isIdentity(m4));
- } else {
- QVERIFY(!inv);
- }
-
- // Test again, after inferring the special matrix type.
- m1.inferSpecialType();
- m2 = m1.inverted(&inv);
- QVERIFY(isSame(m2, (const qreal *)m2Values));
- QCOMPARE(inv, invertible);
-}
-
-void tst_QMatrixNxN::orthonormalInverse4x4()
-{
- QMatrix4x4 m1;
- QVERIFY(matrixFuzzyCompare(m1.inverted(), m1));
-
- QMatrix4x4 m2;
- m2.rotate(45.0, 1.0, 0.0, 0.0);
- m2.translate(10.0, 0.0, 0.0);
-
- // Use inferSpecialType() to drop the internal flags that
- // mark the matrix as orthonormal. This will force inverted()
- // to compute m3.inverted() the long way. We can then compare
- // the result to what the faster algorithm produces on m2.
- QMatrix4x4 m3 = m2;
- m3.inferSpecialType();
- bool invertible;
- QVERIFY(matrixFuzzyCompare(m2.inverted(&invertible), m3.inverted()));
- QVERIFY(invertible);
-
- QMatrix4x4 m4;
- m4.rotate(45.0, 0.0, 1.0, 0.0);
- QMatrix4x4 m5 = m4;
- m5.inferSpecialType();
- QVERIFY(matrixFuzzyCompare(m4.inverted(), m5.inverted()));
-
- QMatrix4x4 m6;
- m1.rotate(88, 0.0, 0.0, 1.0);
- m1.translate(-20.0, 20.0, 15.0);
- m1.rotate(25, 1.0, 0.0, 0.0);
- QMatrix4x4 m7 = m6;
- m7.inferSpecialType();
- QVERIFY(matrixFuzzyCompare(m6.inverted(), m7.inverted()));
-}
-
-// Test the generation and use of 4x4 scale matrices.
-void tst_QMatrixNxN::scale4x4_data()
-{
- QTest::addColumn<qreal>("x");
- QTest::addColumn<qreal>("y");
- QTest::addColumn<qreal>("z");
- QTest::addColumn<void *>("resultValues");
-
- static const qreal nullScale[] =
- {0.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 1.0f};
- QTest::newRow("null")
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (void *)nullScale;
-
- QTest::newRow("identity")
- << (qreal)1.0f << (qreal)1.0f << (qreal)1.0f << (void *)identityValues4;
-
- static const qreal doubleScale[] =
- {2.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 2.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 2.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 1.0f};
- QTest::newRow("double")
- << (qreal)2.0f << (qreal)2.0f << (qreal)2.0f << (void *)doubleScale;
-
- static const qreal complexScale[] =
- {2.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 11.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, -6.5f, 0.0f,
- 0.0f, 0.0f, 0.0f, 1.0f};
- QTest::newRow("complex")
- << (qreal)2.0f << (qreal)11.0f << (qreal)-6.5f << (void *)complexScale;
-
- static const qreal complexScale2D[] =
- {2.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, -11.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 1.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 1.0f};
- QTest::newRow("complex2D")
- << (qreal)2.0f << (qreal)-11.0f << (qreal)1.0f << (void *)complexScale2D;
-}
-void tst_QMatrixNxN::scale4x4()
-{
- QFETCH(qreal, x);
- QFETCH(qreal, y);
- QFETCH(qreal, z);
- QFETCH(void *, resultValues);
-
- QMatrix4x4 result((const qreal *)resultValues);
-
- QMatrix4x4 m1;
- m1.scale(QVector3D(x, y, z));
- QVERIFY(isSame(m1, (const qreal *)resultValues));
-
- QMatrix4x4 m2;
- m2.scale(x, y, z);
- QVERIFY(isSame(m2, (const qreal *)resultValues));
-
- if (z == 1.0f) {
- QMatrix4x4 m2b;
- m2b.scale(x, y);
- QVERIFY(m2b == m2);
- }
-
- QVector3D v1(2.0f, 3.0f, -4.0f);
- QVector3D v2 = m1 * v1;
- QCOMPARE(v2.x(), (qreal)(2.0f * x));
- QCOMPARE(v2.y(), (qreal)(3.0f * y));
- QCOMPARE(v2.z(), (qreal)(-4.0f * z));
-
- v2 = v1 * m1;
- QCOMPARE(v2.x(), (qreal)(2.0f * x));
- QCOMPARE(v2.y(), (qreal)(3.0f * y));
- QCOMPARE(v2.z(), (qreal)(-4.0f * z));
-
- QVector4D v3(2.0f, 3.0f, -4.0f, 34.0f);
- QVector4D v4 = m1 * v3;
- QCOMPARE(v4.x(), (qreal)(2.0f * x));
- QCOMPARE(v4.y(), (qreal)(3.0f * y));
- QCOMPARE(v4.z(), (qreal)(-4.0f * z));
- QCOMPARE(v4.w(), (qreal)34.0f);
-
- v4 = v3 * m1;
- QCOMPARE(v4.x(), (qreal)(2.0f * x));
- QCOMPARE(v4.y(), (qreal)(3.0f * y));
- QCOMPARE(v4.z(), (qreal)(-4.0f * z));
- QCOMPARE(v4.w(), (qreal)34.0f);
-
- QPoint p1(2, 3);
- QPoint p2 = m1 * p1;
- QCOMPARE(p2.x(), (int)(2.0f * x));
- QCOMPARE(p2.y(), (int)(3.0f * y));
-
- p2 = p1 * m1;
- QCOMPARE(p2.x(), (int)(2.0f * x));
- QCOMPARE(p2.y(), (int)(3.0f * y));
-
- QPointF p3(2.0f, 3.0f);
- QPointF p4 = m1 * p3;
- QCOMPARE(p4.x(), (qreal)(2.0f * x));
- QCOMPARE(p4.y(), (qreal)(3.0f * y));
-
- p4 = p3 * m1;
- QCOMPARE(p4.x(), (qreal)(2.0f * x));
- QCOMPARE(p4.y(), (qreal)(3.0f * y));
-
- QMatrix4x4 m3(uniqueValues4);
- QMatrix4x4 m4(m3);
- m4.scale(x, y, z);
- QVERIFY(m4 == m3 * m1);
-
- if (x == y && y == z) {
- QMatrix4x4 m5;
- m5.scale(x);
- QVERIFY(isSame(m5, (const qreal *)resultValues));
- }
-
- if (z == 1.0f) {
- QMatrix4x4 m4b(m3);
- m4b.scale(x, y);
- QVERIFY(m4b == m4);
- }
-
- // Test coverage when the special matrix type is unknown.
-
- QMatrix4x4 m6;
- m6(0, 0) = 1.0f;
- m6.scale(QVector3D(x, y, z));
- QVERIFY(isSame(m6, (const qreal *)resultValues));
-
- QMatrix4x4 m7;
- m7(0, 0) = 1.0f;
- m7.scale(x, y, z);
- QVERIFY(isSame(m7, (const qreal *)resultValues));
-
- if (x == y && y == z) {
- QMatrix4x4 m8;
- m8(0, 0) = 1.0f;
- m8.scale(x);
- QVERIFY(isSame(m8, (const qreal *)resultValues));
-
- m8.inferSpecialType();
- m8.scale(1.0f);
- QVERIFY(isSame(m8, (const qreal *)resultValues));
-
- QMatrix4x4 m9;
- m9.translate(0.0f, 0.0f, 0.0f);
- m9.scale(x);
- QVERIFY(isSame(m9, (const qreal *)resultValues));
- }
-}
-
-// Test the generation and use of 4x4 translation matrices.
-void tst_QMatrixNxN::translate4x4_data()
-{
- QTest::addColumn<qreal>("x");
- QTest::addColumn<qreal>("y");
- QTest::addColumn<qreal>("z");
- QTest::addColumn<void *>("resultValues");
-
- QTest::newRow("null")
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (void *)identityValues4;
-
- static const qreal identityTranslate[] =
- {1.0f, 0.0f, 0.0f, 1.0f,
- 0.0f, 1.0f, 0.0f, 1.0f,
- 0.0f, 0.0f, 1.0f, 1.0f,
- 0.0f, 0.0f, 0.0f, 1.0f};
- QTest::newRow("identity")
- << (qreal)1.0f << (qreal)1.0f << (qreal)1.0f << (void *)identityTranslate;
-
- static const qreal complexTranslate[] =
- {1.0f, 0.0f, 0.0f, 2.0f,
- 0.0f, 1.0f, 0.0f, 11.0f,
- 0.0f, 0.0f, 1.0f, -6.5f,
- 0.0f, 0.0f, 0.0f, 1.0f};
- QTest::newRow("complex")
- << (qreal)2.0f << (qreal)11.0f << (qreal)-6.5f << (void *)complexTranslate;
-
- static const qreal complexTranslate2D[] =
- {1.0f, 0.0f, 0.0f, 2.0f,
- 0.0f, 1.0f, 0.0f, -11.0f,
- 0.0f, 0.0f, 1.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 1.0f};
- QTest::newRow("complex2D")
- << (qreal)2.0f << (qreal)-11.0f << (qreal)0.0f << (void *)complexTranslate2D;
-}
-void tst_QMatrixNxN::translate4x4()
-{
- QFETCH(qreal, x);
- QFETCH(qreal, y);
- QFETCH(qreal, z);
- QFETCH(void *, resultValues);
-
- QMatrix4x4 result((const qreal *)resultValues);
-
- QMatrix4x4 m1;
- m1.translate(QVector3D(x, y, z));
- QVERIFY(isSame(m1, (const qreal *)resultValues));
-
- QMatrix4x4 m2;
- m2.translate(x, y, z);
- QVERIFY(isSame(m2, (const qreal *)resultValues));
-
- if (z == 0.0f) {
- QMatrix4x4 m2b;
- m2b.translate(x, y);
- QVERIFY(m2b == m2);
- }
-
- QVector3D v1(2.0f, 3.0f, -4.0f);
- QVector3D v2 = m1 * v1;
- QCOMPARE(v2.x(), (qreal)(2.0f + x));
- QCOMPARE(v2.y(), (qreal)(3.0f + y));
- QCOMPARE(v2.z(), (qreal)(-4.0f + z));
-
- QVector4D v3(2.0f, 3.0f, -4.0f, 1.0f);
- QVector4D v4 = m1 * v3;
- QCOMPARE(v4.x(), (qreal)(2.0f + x));
- QCOMPARE(v4.y(), (qreal)(3.0f + y));
- QCOMPARE(v4.z(), (qreal)(-4.0f + z));
- QCOMPARE(v4.w(), (qreal)1.0f);
-
- QVector4D v5(2.0f, 3.0f, -4.0f, 34.0f);
- QVector4D v6 = m1 * v5;
- QCOMPARE(v6.x(), (qreal)(2.0f + x * 34.0f));
- QCOMPARE(v6.y(), (qreal)(3.0f + y * 34.0f));
- QCOMPARE(v6.z(), (qreal)(-4.0f + z * 34.0f));
- QCOMPARE(v6.w(), (qreal)34.0f);
-
- QPoint p1(2, 3);
- QPoint p2 = m1 * p1;
- QCOMPARE(p2.x(), (int)(2.0f + x));
- QCOMPARE(p2.y(), (int)(3.0f + y));
-
- QPointF p3(2.0f, 3.0f);
- QPointF p4 = m1 * p3;
- QCOMPARE(p4.x(), (qreal)(2.0f + x));
- QCOMPARE(p4.y(), (qreal)(3.0f + y));
-
- QMatrix4x4 m3(uniqueValues4);
- QMatrix4x4 m4(m3);
- m4.translate(x, y, z);
- QVERIFY(m4 == m3 * m1);
-
- if (z == 0.0f) {
- QMatrix4x4 m4b(m3);
- m4b.translate(x, y);
- QVERIFY(m4b == m4);
- }
-}
-
-// Test the generation and use of 4x4 rotation matrices.
-void tst_QMatrixNxN::rotate4x4_data()
-{
- QTest::addColumn<qreal>("angle");
- QTest::addColumn<qreal>("x");
- QTest::addColumn<qreal>("y");
- QTest::addColumn<qreal>("z");
- QTest::addColumn<void *>("resultValues");
-
- static const qreal nullRotate[] =
- {0.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 1.0f};
- QTest::newRow("null")
- << (qreal)90.0f
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f
- << (void *)nullRotate;
-
- static const qreal noRotate[] =
- {1.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 1.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 1.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 1.0f};
- QTest::newRow("zerodegrees")
- << (qreal)0.0f
- << (qreal)2.0f << (qreal)3.0f << (qreal)-4.0f
- << (void *)noRotate;
-
- static const qreal xRotate[] =
- {1.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, -1.0f, 0.0f,
- 0.0f, 1.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 1.0f};
- QTest::newRow("xrotate")
- << (qreal)90.0f
- << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f
- << (void *)xRotate;
-
- static const qreal xRotateNeg[] =
- {1.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 1.0f, 0.0f,
- 0.0f, -1.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 1.0f};
- QTest::newRow("-xrotate")
- << (qreal)90.0f
- << (qreal)-1.0f << (qreal)0.0f << (qreal)0.0f
- << (void *)xRotateNeg;
-
- static const qreal yRotate[] =
- {0.0f, 0.0f, 1.0f, 0.0f,
- 0.0f, 1.0f, 0.0f, 0.0f,
- -1.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 1.0f};
- QTest::newRow("yrotate")
- << (qreal)90.0f
- << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f
- << (void *)yRotate;
-
- static const qreal yRotateNeg[] =
- {0.0f, 0.0f, -1.0f, 0.0f,
- 0.0f, 1.0f, 0.0f, 0.0f,
- 1.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 1.0f};
- QTest::newRow("-yrotate")
- << (qreal)90.0f
- << (qreal)0.0f << (qreal)-1.0f << (qreal)0.0f
- << (void *)yRotateNeg;
-
- static const qreal zRotate[] =
- {0.0f, -1.0f, 0.0f, 0.0f,
- 1.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 1.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 1.0f};
- QTest::newRow("zrotate")
- << (qreal)90.0f
- << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f
- << (void *)zRotate;
-
- static const qreal zRotateNeg[] =
- {0.0f, 1.0f, 0.0f, 0.0f,
- -1.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 1.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 1.0f};
- QTest::newRow("-zrotate")
- << (qreal)90.0f
- << (qreal)0.0f << (qreal)0.0f << (qreal)-1.0f
- << (void *)zRotateNeg;
-
- // Algorithm from http://en.wikipedia.org/wiki/Rotation_matrix.
- // Deliberately different from the one in the code for cross-checking.
- static qreal complexRotate[16];
- qreal x = 1.0f;
- qreal y = 2.0f;
- qreal z = -6.0f;
- qreal angle = -45.0f;
- qreal c = qCos(angle * M_PI / 180.0f);
- qreal s = qSin(angle * M_PI / 180.0f);
- qreal len = qSqrt(x * x + y * y + z * z);
- qreal xu = x / len;
- qreal yu = y / len;
- qreal zu = z / len;
- complexRotate[0] = (qreal)((1 - xu * xu) * c + xu * xu);
- complexRotate[1] = (qreal)(-zu * s - xu * yu * c + xu * yu);
- complexRotate[2] = (qreal)(yu * s - xu * zu * c + xu * zu);
- complexRotate[3] = 0;
- complexRotate[4] = (qreal)(zu * s - xu * yu * c + xu * yu);
- complexRotate[5] = (qreal)((1 - yu * yu) * c + yu * yu);
- complexRotate[6] = (qreal)(-xu * s - yu * zu * c + yu * zu);
- complexRotate[7] = 0;
- complexRotate[8] = (qreal)(-yu * s - xu * zu * c + xu * zu);
- complexRotate[9] = (qreal)(xu * s - yu * zu * c + yu * zu);
- complexRotate[10] = (qreal)((1 - zu * zu) * c + zu * zu);
- complexRotate[11] = 0;
- complexRotate[12] = 0;
- complexRotate[13] = 0;
- complexRotate[14] = 0;
- complexRotate[15] = 1;
-
- QTest::newRow("complex")
- << (qreal)angle
- << (qreal)x << (qreal)y << (qreal)z
- << (void *)complexRotate;
-}
-void tst_QMatrixNxN::rotate4x4()
-{
- QFETCH(qreal, angle);
- QFETCH(qreal, x);
- QFETCH(qreal, y);
- QFETCH(qreal, z);
- QFETCH(void *, resultValues);
-
- QMatrix4x4 m1;
- m1.rotate(angle, QVector3D(x, y, z));
- QVERIFY(isSame(m1, (const qreal *)resultValues));
-
- QMatrix4x4 m2;
- m2.rotate(angle, x, y, z);
- QVERIFY(isSame(m2, (const qreal *)resultValues));
-
- QMatrix4x4 m3(uniqueValues4);
- QMatrix4x4 m4(m3);
- m4.rotate(angle, x, y, z);
- QVERIFY(matrixFuzzyCompare(m4, m3 * m1));
-
- // Null vectors don't make sense for quaternion rotations.
- if (x != 0 || y != 0 || z != 0) {
- QMatrix4x4 m5;
- m5.rotate(QQuaternion::fromAxisAndAngle(QVector3D(x, y, z), angle));
- QVERIFY(isSame(m5, (const qreal *)resultValues));
- }
-
-#define ROTATE4(xin,yin,zin,win,xout,yout,zout,wout) \
- do { \
- xout = ((const qreal *)resultValues)[0] * xin + \
- ((const qreal *)resultValues)[1] * yin + \
- ((const qreal *)resultValues)[2] * zin + \
- ((const qreal *)resultValues)[3] * win; \
- yout = ((const qreal *)resultValues)[4] * xin + \
- ((const qreal *)resultValues)[5] * yin + \
- ((const qreal *)resultValues)[6] * zin + \
- ((const qreal *)resultValues)[7] * win; \
- zout = ((const qreal *)resultValues)[8] * xin + \
- ((const qreal *)resultValues)[9] * yin + \
- ((const qreal *)resultValues)[10] * zin + \
- ((const qreal *)resultValues)[11] * win; \
- wout = ((const qreal *)resultValues)[12] * xin + \
- ((const qreal *)resultValues)[13] * yin + \
- ((const qreal *)resultValues)[14] * zin + \
- ((const qreal *)resultValues)[15] * win; \
- } while (0)
-
- // Rotate various test vectors using the straight-forward approach.
- qreal v1x, v1y, v1z, v1w;
- ROTATE4(2.0f, 3.0f, -4.0f, 1.0f, v1x, v1y, v1z, v1w);
- v1x /= v1w;
- v1y /= v1w;
- v1z /= v1w;
- qreal v3x, v3y, v3z, v3w;
- ROTATE4(2.0f, 3.0f, -4.0f, 1.0f, v3x, v3y, v3z, v3w);
- qreal v5x, v5y, v5z, v5w;
- ROTATE4(2.0f, 3.0f, -4.0f, 34.0f, v5x, v5y, v5z, v5w);
- qreal p1x, p1y, p1z, p1w;
- ROTATE4(2.0f, 3.0f, 0.0f, 1.0f, p1x, p1y, p1z, p1w);
- p1x /= p1w;
- p1y /= p1w;
- p1z /= p1w;
-
- QVector3D v1(2.0f, 3.0f, -4.0f);
- QVector3D v2 = m1 * v1;
- QVERIFY(fuzzyCompare(v2.x(), v1x));
- QVERIFY(fuzzyCompare(v2.y(), v1y));
- QVERIFY(fuzzyCompare(v2.z(), v1z));
-
- QVector4D v3(2.0f, 3.0f, -4.0f, 1.0f);
- QVector4D v4 = m1 * v3;
- QVERIFY(fuzzyCompare(v4.x(), v3x));
- QVERIFY(fuzzyCompare(v4.y(), v3y));
- QVERIFY(fuzzyCompare(v4.z(), v3z));
- QVERIFY(fuzzyCompare(v4.w(), v3w));
-
- QVector4D v5(2.0f, 3.0f, -4.0f, 34.0f);
- QVector4D v6 = m1 * v5;
- QVERIFY(fuzzyCompare(v6.x(), v5x));
- QVERIFY(fuzzyCompare(v6.y(), v5y));
- QVERIFY(fuzzyCompare(v6.z(), v5z));
- QVERIFY(fuzzyCompare(v6.w(), v5w));
-
- QPoint p1(2, 3);
- QPoint p2 = m1 * p1;
- QCOMPARE(p2.x(), qRound(p1x));
- QCOMPARE(p2.y(), qRound(p1y));
-
- QPointF p3(2.0f, 3.0f);
- QPointF p4 = m1 * p3;
- QVERIFY(fuzzyCompare((float)(p4.x()), p1x));
- QVERIFY(fuzzyCompare((float)(p4.y()), p1y));
-
- if (x != 0 || y != 0 || z != 0) {
- QQuaternion q = QQuaternion::fromAxisAndAngle(QVector3D(x, y, z), angle);
- QVector3D vq = q.rotateVector(v1);
- QVERIFY(fuzzyCompare(vq.x(), v1x));
- QVERIFY(fuzzyCompare(vq.y(), v1y));
- QVERIFY(fuzzyCompare(vq.z(), v1z));
- }
-}
-
-static bool isSame(const QMatrix3x3& m1, const Matrix3& m2)
-{
- for (int row = 0; row < 3; ++row) {
- for (int col = 0; col < 3; ++col) {
- if (!fuzzyCompare(m1(row, col), m2.v[row * 3 + col]))
- return false;
- }
- }
- return true;
-}
-
-// Test the computation of normal matrices from 4x4 transformation matrices.
-void tst_QMatrixNxN::normalMatrix_data()
-{
- QTest::addColumn<void *>("mValues");
-
- QTest::newRow("identity")
- << (void *)identityValues4;
- QTest::newRow("unique")
- << (void *)uniqueValues4; // Not invertible because determinant == 0.
-
- static qreal const translateValues[16] =
- {1.0f, 0.0f, 0.0f, 4.0f,
- 0.0f, 1.0f, 0.0f, 5.0f,
- 0.0f, 0.0f, 1.0f, -3.0f,
- 0.0f, 0.0f, 0.0f, 1.0f};
- static qreal const scaleValues[16] =
- {2.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 7.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 9.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 1.0f};
- static qreal const bothValues[16] =
- {2.0f, 0.0f, 0.0f, 4.0f,
- 0.0f, 7.0f, 0.0f, 5.0f,
- 0.0f, 0.0f, 9.0f, -3.0f,
- 0.0f, 0.0f, 0.0f, 1.0f};
- static qreal const nullScaleValues1[16] =
- {0.0f, 0.0f, 0.0f, 4.0f,
- 0.0f, 7.0f, 0.0f, 5.0f,
- 0.0f, 0.0f, 9.0f, -3.0f,
- 0.0f, 0.0f, 0.0f, 1.0f};
- static qreal const nullScaleValues2[16] =
- {2.0f, 0.0f, 0.0f, 4.0f,
- 0.0f, 0.0f, 0.0f, 5.0f,
- 0.0f, 0.0f, 9.0f, -3.0f,
- 0.0f, 0.0f, 0.0f, 1.0f};
- static qreal const nullScaleValues3[16] =
- {2.0f, 0.0f, 0.0f, 4.0f,
- 0.0f, 7.0f, 0.0f, 5.0f,
- 0.0f, 0.0f, 0.0f, -3.0f,
- 0.0f, 0.0f, 0.0f, 1.0f};
-
- QTest::newRow("translate") << (void *)translateValues;
- QTest::newRow("scale") << (void *)scaleValues;
- QTest::newRow("both") << (void *)bothValues;
- QTest::newRow("null scale 1") << (void *)nullScaleValues1;
- QTest::newRow("null scale 2") << (void *)nullScaleValues2;
- QTest::newRow("null scale 3") << (void *)nullScaleValues3;
-}
-void tst_QMatrixNxN::normalMatrix()
-{
- QFETCH(void *, mValues);
- const qreal *values = (const qreal *)mValues;
-
- // Compute the expected answer the long way.
- Matrix3 min;
- Matrix3 answer;
- min.v[0] = values[0];
- min.v[1] = values[1];
- min.v[2] = values[2];
- min.v[3] = values[4];
- min.v[4] = values[5];
- min.v[5] = values[6];
- min.v[6] = values[8];
- min.v[7] = values[9];
- min.v[8] = values[10];
- bool invertible = m3Inverse(min, answer);
- m3Transpose(answer);
-
- // Perform the test.
- QMatrix4x4 m1(values);
- QMatrix3x3 n1 = m1.normalMatrix();
-
- if (invertible)
- QVERIFY(::isSame(n1, answer));
- else
- QVERIFY(isIdentity(n1));
-
- // Perform the test again, after inferring special matrix types.
- // This tests the optimized paths in the normalMatrix() function.
- m1.inferSpecialType();
- n1 = m1.normalMatrix();
-
- if (invertible)
- QVERIFY(::isSame(n1, answer));
- else
- QVERIFY(isIdentity(n1));
-}
-
-// Test optimized transformations on 4x4 matrices.
-void tst_QMatrixNxN::optimizedTransforms()
-{
- static qreal const translateValues[16] =
- {1.0f, 0.0f, 0.0f, 4.0f,
- 0.0f, 1.0f, 0.0f, 5.0f,
- 0.0f, 0.0f, 1.0f, -3.0f,
- 0.0f, 0.0f, 0.0f, 1.0f};
- static qreal const translateDoubleValues[16] =
- {1.0f, 0.0f, 0.0f, 8.0f,
- 0.0f, 1.0f, 0.0f, 10.0f,
- 0.0f, 0.0f, 1.0f, -6.0f,
- 0.0f, 0.0f, 0.0f, 1.0f};
- static qreal const scaleValues[16] =
- {2.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 7.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 9.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 1.0f};
- static qreal const scaleDoubleValues[16] =
- {4.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 49.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 81.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 1.0f};
- static qreal const bothValues[16] =
- {2.0f, 0.0f, 0.0f, 4.0f,
- 0.0f, 7.0f, 0.0f, 5.0f,
- 0.0f, 0.0f, 9.0f, -3.0f,
- 0.0f, 0.0f, 0.0f, 1.0f};
- static qreal const bothReverseValues[16] =
- {2.0f, 0.0f, 0.0f, 4.0f * 2.0f,
- 0.0f, 7.0f, 0.0f, 5.0f * 7.0f,
- 0.0f, 0.0f, 9.0f, -3.0f * 9.0f,
- 0.0f, 0.0f, 0.0f, 1.0f};
- static qreal const bothThenTranslateValues[16] =
- {2.0f, 0.0f, 0.0f, 4.0f + 2.0f * 4.0f,
- 0.0f, 7.0f, 0.0f, 5.0f + 7.0f * 5.0f,
- 0.0f, 0.0f, 9.0f, -3.0f + 9.0f * -3.0f,
- 0.0f, 0.0f, 0.0f, 1.0f};
- static qreal const bothThenScaleValues[16] =
- {4.0f, 0.0f, 0.0f, 4.0f,
- 0.0f, 49.0f, 0.0f, 5.0f,
- 0.0f, 0.0f, 81.0f, -3.0f,
- 0.0f, 0.0f, 0.0f, 1.0f};
-
- QMatrix4x4 translate(translateValues);
- QMatrix4x4 scale(scaleValues);
- QMatrix4x4 both(bothValues);
-
- QMatrix4x4 m1;
- m1.translate(4.0f, 5.0f, -3.0f);
- QVERIFY(isSame(m1, translateValues));
- m1.translate(4.0f, 5.0f, -3.0f);
- QVERIFY(isSame(m1, translateDoubleValues));
-
- QMatrix4x4 m2;
- m2.translate(QVector3D(4.0f, 5.0f, -3.0f));
- QVERIFY(isSame(m2, translateValues));
- m2.translate(QVector3D(4.0f, 5.0f, -3.0f));
- QVERIFY(isSame(m2, translateDoubleValues));
-
- QMatrix4x4 m3;
- m3.scale(2.0f, 7.0f, 9.0f);
- QVERIFY(isSame(m3, scaleValues));
- m3.scale(2.0f, 7.0f, 9.0f);
- QVERIFY(isSame(m3, scaleDoubleValues));
-
- QMatrix4x4 m4;
- m4.scale(QVector3D(2.0f, 7.0f, 9.0f));
- QVERIFY(isSame(m4, scaleValues));
- m4.scale(QVector3D(2.0f, 7.0f, 9.0f));
- QVERIFY(isSame(m4, scaleDoubleValues));
-
- QMatrix4x4 m5;
- m5.translate(4.0f, 5.0f, -3.0f);
- m5.scale(2.0f, 7.0f, 9.0f);
- QVERIFY(isSame(m5, bothValues));
- m5.translate(4.0f, 5.0f, -3.0f);
- QVERIFY(isSame(m5, bothThenTranslateValues));
-
- QMatrix4x4 m6;
- m6.translate(QVector3D(4.0f, 5.0f, -3.0f));
- m6.scale(QVector3D(2.0f, 7.0f, 9.0f));
- QVERIFY(isSame(m6, bothValues));
- m6.translate(QVector3D(4.0f, 5.0f, -3.0f));
- QVERIFY(isSame(m6, bothThenTranslateValues));
-
- QMatrix4x4 m7;
- m7.scale(2.0f, 7.0f, 9.0f);
- m7.translate(4.0f, 5.0f, -3.0f);
- QVERIFY(isSame(m7, bothReverseValues));
-
- QMatrix4x4 m8;
- m8.scale(QVector3D(2.0f, 7.0f, 9.0f));
- m8.translate(QVector3D(4.0f, 5.0f, -3.0f));
- QVERIFY(isSame(m8, bothReverseValues));
-
- QMatrix4x4 m9;
- m9.translate(4.0f, 5.0f, -3.0f);
- m9.scale(2.0f, 7.0f, 9.0f);
- QVERIFY(isSame(m9, bothValues));
- m9.scale(2.0f, 7.0f, 9.0f);
- QVERIFY(isSame(m9, bothThenScaleValues));
-
- QMatrix4x4 m10;
- m10.translate(QVector3D(4.0f, 5.0f, -3.0f));
- m10.scale(QVector3D(2.0f, 7.0f, 9.0f));
- QVERIFY(isSame(m10, bothValues));
- m10.scale(QVector3D(2.0f, 7.0f, 9.0f));
- QVERIFY(isSame(m10, bothThenScaleValues));
-}
-
-// Test orthographic projections.
-void tst_QMatrixNxN::ortho()
-{
- QMatrix4x4 m1;
- m1.ortho(QRect(0, 0, 300, 150));
- QPointF p1 = m1 * QPointF(0, 0);
- QPointF p2 = m1 * QPointF(300, 0);
- QPointF p3 = m1 * QPointF(0, 150);
- QPointF p4 = m1 * QPointF(300, 150);
- QVector3D p5 = m1 * QVector3D(300, 150, 1);
- QVERIFY(fuzzyCompare(p1.x(), -1.0));
- QVERIFY(fuzzyCompare(p1.y(), 1.0));
- QVERIFY(fuzzyCompare(p2.x(), 1.0));
- QVERIFY(fuzzyCompare(p2.y(), 1.0));
- QVERIFY(fuzzyCompare(p3.x(), -1.0));
- QVERIFY(fuzzyCompare(p3.y(), -1.0));
- QVERIFY(fuzzyCompare(p4.x(), 1.0));
- QVERIFY(fuzzyCompare(p4.y(), -1.0));
- QVERIFY(fuzzyCompare(p5.x(), (qreal)1.0));
- QVERIFY(fuzzyCompare(p5.y(), (qreal)-1.0));
- QVERIFY(fuzzyCompare(p5.z(), (qreal)-1.0));
-
- QMatrix4x4 m2;
- m2.ortho(QRectF(0, 0, 300, 150));
- p1 = m2 * QPointF(0, 0);
- p2 = m2 * QPointF(300, 0);
- p3 = m2 * QPointF(0, 150);
- p4 = m2 * QPointF(300, 150);
- p5 = m2 * QVector3D(300, 150, 1);
- QVERIFY(fuzzyCompare(p1.x(), -1.0));
- QVERIFY(fuzzyCompare(p1.y(), 1.0));
- QVERIFY(fuzzyCompare(p2.x(), 1.0));
- QVERIFY(fuzzyCompare(p2.y(), 1.0));
- QVERIFY(fuzzyCompare(p3.x(), -1.0));
- QVERIFY(fuzzyCompare(p3.y(), -1.0));
- QVERIFY(fuzzyCompare(p4.x(), 1.0));
- QVERIFY(fuzzyCompare(p4.y(), -1.0));
- QVERIFY(fuzzyCompare(p5.x(), (qreal)1.0));
- QVERIFY(fuzzyCompare(p5.y(), (qreal)-1.0));
- QVERIFY(fuzzyCompare(p5.z(), (qreal)-1.0));
-
- QMatrix4x4 m3;
- m3.ortho(0, 300, 150, 0, -1, 1);
- p1 = m3 * QPointF(0, 0);
- p2 = m3 * QPointF(300, 0);
- p3 = m3 * QPointF(0, 150);
- p4 = m3 * QPointF(300, 150);
- p5 = m3 * QVector3D(300, 150, 1);
- QVERIFY(fuzzyCompare(p1.x(), -1.0));
- QVERIFY(fuzzyCompare(p1.y(), 1.0));
- QVERIFY(fuzzyCompare(p2.x(), 1.0));
- QVERIFY(fuzzyCompare(p2.y(), 1.0));
- QVERIFY(fuzzyCompare(p3.x(), -1.0));
- QVERIFY(fuzzyCompare(p3.y(), -1.0));
- QVERIFY(fuzzyCompare(p4.x(), 1.0));
- QVERIFY(fuzzyCompare(p4.y(), -1.0));
- QVERIFY(fuzzyCompare(p5.x(), (qreal)1.0));
- QVERIFY(fuzzyCompare(p5.y(), (qreal)-1.0));
- QVERIFY(fuzzyCompare(p5.z(), (qreal)-1.0));
-
- QMatrix4x4 m4;
- m4.ortho(0, 300, 150, 0, -2, 3);
- p1 = m4 * QPointF(0, 0);
- p2 = m4 * QPointF(300, 0);
- p3 = m4 * QPointF(0, 150);
- p4 = m4 * QPointF(300, 150);
- p5 = m4 * QVector3D(300, 150, 1);
- QVERIFY(fuzzyCompare(p1.x(), -1.0));
- QVERIFY(fuzzyCompare(p1.y(), 1.0));
- QVERIFY(fuzzyCompare(p2.x(), 1.0));
- QVERIFY(fuzzyCompare(p2.y(), 1.0));
- QVERIFY(fuzzyCompare(p3.x(), -1.0));
- QVERIFY(fuzzyCompare(p3.y(), -1.0));
- QVERIFY(fuzzyCompare(p4.x(), 1.0));
- QVERIFY(fuzzyCompare(p4.y(), -1.0));
- QVERIFY(fuzzyCompare(p5.x(), (qreal)1.0));
- QVERIFY(fuzzyCompare(p5.y(), (qreal)-1.0));
- QVERIFY(fuzzyCompare(p5.z(), (qreal)-0.6));
-
- // An empty view volume should leave the matrix alone.
- QMatrix4x4 m5;
- m5.ortho(0, 0, 150, 0, -2, 3);
- QVERIFY(m5.isIdentity());
- m5.ortho(0, 300, 150, 150, -2, 3);
- QVERIFY(m5.isIdentity());
- m5.ortho(0, 300, 150, 0, 2, 2);
- QVERIFY(m5.isIdentity());
-}
-
-// Test perspective frustum projections.
-void tst_QMatrixNxN::frustum()
-{
- QMatrix4x4 m1;
- m1.frustum(-1.0f, 1.0f, -1.0f, 1.0f, -1.0f, 1.0f);
- QVector3D p1 = m1 * QVector3D(-1.0f, -1.0f, 1.0f);
- QVector3D p2 = m1 * QVector3D(1.0f, -1.0f, 1.0f);
- QVector3D p3 = m1 * QVector3D(-1.0f, 1.0f, 1.0f);
- QVector3D p4 = m1 * QVector3D(1.0f, 1.0f, 1.0f);
- QVector3D p5 = m1 * QVector3D(0.0f, 0.0f, 2.0f);
- QVERIFY(fuzzyCompare(p1.x(), -1.0f));
- QVERIFY(fuzzyCompare(p1.y(), -1.0f));
- QVERIFY(fuzzyCompare(p1.z(), -1.0f));
- QVERIFY(fuzzyCompare(p2.x(), 1.0f));
- QVERIFY(fuzzyCompare(p2.y(), -1.0f));
- QVERIFY(fuzzyCompare(p2.z(), -1.0f));
- QVERIFY(fuzzyCompare(p3.x(), -1.0f));
- QVERIFY(fuzzyCompare(p3.y(), 1.0f));
- QVERIFY(fuzzyCompare(p3.z(), -1.0f));
- QVERIFY(fuzzyCompare(p4.x(), 1.0f));
- QVERIFY(fuzzyCompare(p4.y(), 1.0f));
- QVERIFY(fuzzyCompare(p4.z(), -1.0f));
- QVERIFY(fuzzyCompare(p5.x(), 0.0f));
- QVERIFY(fuzzyCompare(p5.y(), 0.0f));
- QVERIFY(fuzzyCompare(p5.z(), -0.5f));
-
- // An empty view volume should leave the matrix alone.
- QMatrix4x4 m5;
- m5.frustum(0, 0, 150, 0, -2, 3);
- QVERIFY(m5.isIdentity());
- m5.frustum(0, 300, 150, 150, -2, 3);
- QVERIFY(m5.isIdentity());
- m5.frustum(0, 300, 150, 0, 2, 2);
- QVERIFY(m5.isIdentity());
-}
-
-// Test perspective field-of-view projections.
-void tst_QMatrixNxN::perspective()
-{
- QMatrix4x4 m1;
- m1.perspective(45.0f, 1.0f, -1.0f, 1.0f);
- QVector3D p1 = m1 * QVector3D(-1.0f, -1.0f, 1.0f);
- QVector3D p2 = m1 * QVector3D(1.0f, -1.0f, 1.0f);
- QVector3D p3 = m1 * QVector3D(-1.0f, 1.0f, 1.0f);
- QVector3D p4 = m1 * QVector3D(1.0f, 1.0f, 1.0f);
- QVector3D p5 = m1 * QVector3D(0.0f, 0.0f, 2.0f);
- QVERIFY(fuzzyCompare(p1.x(), 2.41421));
- QVERIFY(fuzzyCompare(p1.y(), 2.41421));
- QVERIFY(fuzzyCompare(p1.z(), -1));
- QVERIFY(fuzzyCompare(p2.x(), -2.41421));
- QVERIFY(fuzzyCompare(p2.y(), 2.41421));
- QVERIFY(fuzzyCompare(p2.z(), -1.0f));
- QVERIFY(fuzzyCompare(p3.x(), 2.41421));
- QVERIFY(fuzzyCompare(p3.y(), -2.41421));
- QVERIFY(fuzzyCompare(p3.z(), -1.0f));
- QVERIFY(fuzzyCompare(p4.x(), -2.41421));
- QVERIFY(fuzzyCompare(p4.y(), -2.41421));
- QVERIFY(fuzzyCompare(p4.z(), -1.0f));
- QVERIFY(fuzzyCompare(p5.x(), 0.0f));
- QVERIFY(fuzzyCompare(p5.y(), 0.0f));
- QVERIFY(fuzzyCompare(p5.z(), -0.5f));
-
- // An empty view volume should leave the matrix alone.
- QMatrix4x4 m5;
- m5.perspective(45.0f, 1.0f, 0.0f, 0.0f);
- QVERIFY(m5.isIdentity());
- m5.perspective(45.0f, 0.0f, -1.0f, 1.0f);
- QVERIFY(m5.isIdentity());
- m5.perspective(0.0f, 1.0f, -1.0f, 1.0f);
- QVERIFY(m5.isIdentity());
-}
-
-// Test left-handed vs right-handed coordinate flipping.
-void tst_QMatrixNxN::flipCoordinates()
-{
- QMatrix4x4 m1;
- m1.flipCoordinates();
- QVector3D p1 = m1 * QVector3D(2, 3, 4);
- QVERIFY(p1 == QVector3D(2, -3, -4));
-
- QMatrix4x4 m2;
- m2.scale(2.0f, 3.0f, 1.0f);
- m2.flipCoordinates();
- QVector3D p2 = m2 * QVector3D(2, 3, 4);
- QVERIFY(p2 == QVector3D(4, -9, -4));
-
- QMatrix4x4 m3;
- m3.translate(2.0f, 3.0f, 1.0f);
- m3.flipCoordinates();
- QVector3D p3 = m3 * QVector3D(2, 3, 4);
- QVERIFY(p3 == QVector3D(4, 0, -3));
-
- QMatrix4x4 m4;
- m4.rotate(90.0f, 0.0f, 0.0f, 1.0f);
- m4.flipCoordinates();
- QVector3D p4 = m4 * QVector3D(2, 3, 4);
- QVERIFY(p4 == QVector3D(3, 2, -4));
-}
-
-// Test conversion of generic matrices to and from the non-generic types.
-void tst_QMatrixNxN::convertGeneric()
-{
- QMatrix4x3 m1(uniqueValues4x3);
-
- static qreal const unique4x4[16] = {
- 1.0f, 2.0f, 3.0f, 4.0f,
- 5.0f, 6.0f, 7.0f, 8.0f,
- 9.0f, 10.0f, 11.0f, 12.0f,
- 0.0f, 0.0f, 0.0f, 1.0f
- };
-#if !defined(QT_NO_MEMBER_TEMPLATES)
- QMatrix4x4 m4(m1);
- QVERIFY(isSame(m4, unique4x4));
-#endif
- QMatrix4x4 m5 = qGenericMatrixToMatrix4x4(m1);
- QVERIFY(isSame(m5, unique4x4));
-
- static qreal const conv4x4[12] = {
- 1.0f, 2.0f, 3.0f, 4.0f,
- 5.0f, 6.0f, 7.0f, 8.0f,
- 9.0f, 10.0f, 11.0f, 12.0f
- };
- QMatrix4x4 m9(uniqueValues4);
-#if !defined(QT_NO_MEMBER_TEMPLATES)
- QMatrix4x3 m10 = m9.toGenericMatrix<4, 3>();
- QVERIFY(isSame(m10, conv4x4));
-#endif
-
- QMatrix4x3 m11 = qGenericMatrixFromMatrix4x4<4, 3>(m9);
- QVERIFY(isSame(m11, conv4x4));
-}
-
-void tst_QMatrixNxN::extractAxisRotation_data()
-{
- QTest::addColumn<float>("x");
- QTest::addColumn<float>("y");
- QTest::addColumn<float>("z");
- QTest::addColumn<float>("angle");
-
- QTest::newRow("1, 0, 0, 0 deg") << 1.0f << 0.0f << 0.0f << 0.0f;
- QTest::newRow("1, 0, 0, 90 deg") << 1.0f << 0.0f << 0.0f << 90.0f;
- QTest::newRow("1, 0, 0, 270 deg") << 1.0f << 0.0f << 0.0f << 270.0f;
- QTest::newRow("1, 0, 0, 45 deg") << 1.0f << 0.0f << 0.0f << 45.0f;
- QTest::newRow("1, 0, 0, 120 deg") << 1.0f << 0.0f << 0.0f << 120.0f;
- QTest::newRow("1, 0, 0, 300 deg") << 1.0f << 0.0f << 0.0f << 300.0f;
-
- QTest::newRow("0, 1, 0, 90 deg") << 0.0f << 1.0f << 0.0f << 90.0f;
- QTest::newRow("0, 1, 0, 270 deg") << 0.0f << 1.0f << 0.0f << 270.0f;
- QTest::newRow("0, 1, 0, 45 deg") << 0.0f << 1.0f << 0.0f << 45.0f;
- QTest::newRow("0, 1, 0, 120 deg") << 0.0f << 1.0f << 0.0f << 120.0f;
- QTest::newRow("0, 1, 0, 300 deg") << 0.0f << 1.0f << 0.0f << 300.0f;
-
- QTest::newRow("0, 0, 1, 90 deg") << 0.0f << 0.0f << 1.0f << 90.0f;
- QTest::newRow("0, 0, 1, 270 deg") << 0.0f << 0.0f << 1.0f << 270.0f;
- QTest::newRow("0, 0, 1, 45 deg") << 0.0f << 0.0f << 1.0f << 45.0f;
- QTest::newRow("0, 0, 1, 120 deg") << 0.0f << 0.0f << 1.0f << 120.0f;
- QTest::newRow("0, 0, 1, 300 deg") << 0.0f << 0.0f << 1.0f << 300.0f;
-
- QTest::newRow("1, 1, 1, 90 deg") << 1.0f << 1.0f << 1.0f << 90.0f;
- QTest::newRow("1, 1, 1, 270 deg") << 1.0f << 1.0f << 1.0f << 270.0f;
- QTest::newRow("1, 1, 1, 45 deg") << 1.0f << 1.0f << 1.0f << 45.0f;
- QTest::newRow("1, 1, 1, 120 deg") << 1.0f << 1.0f << 1.0f << 120.0f;
- QTest::newRow("1, 1, 1, 300 deg") << 1.0f << 1.0f << 1.0f << 300.0f;
-}
-
-void tst_QMatrixNxN::extractAxisRotation()
-{
- QFETCH(float, x);
- QFETCH(float, y);
- QFETCH(float, z);
- QFETCH(float, angle);
-
- QMatrix4x4 m;
- QVector3D origAxis(x, y, z);
-
- m.rotate(angle, x, y, z);
-
- origAxis.normalize();
- QVector3D extractedAxis;
- qreal extractedAngle;
-
- m.extractAxisRotation(extractedAngle, extractedAxis);
-
- qreal epsilon = 0.001;
-
- if (angle > 180) {
- QVERIFY(fuzzyCompare(360.0f - angle, extractedAngle, epsilon));
- QVERIFY(fuzzyCompare(extractedAxis, -origAxis, epsilon));
- } else {
- QVERIFY(fuzzyCompare(angle, extractedAngle, epsilon));
- QVERIFY(fuzzyCompare(extractedAxis, origAxis, epsilon));
- }
-}
-
-void tst_QMatrixNxN::extractTranslation_data()
-{
- QTest::addColumn<QMatrix4x4>("rotation");
- QTest::addColumn<float>("x");
- QTest::addColumn<float>("y");
- QTest::addColumn<float>("z");
-
- static QMatrix4x4 m1;
-
- QTest::newRow("identity, 100, 50, 25")
- << m1 << 100.0f << 50.0f << 250.0f;
-
- m1.rotate(45.0, 1.0, 0.0, 0.0);
- QTest::newRow("rotX 45 + 100, 50, 25") << m1 << 100.0f << 50.0f << 25.0f;
-
- m1.setIdentity();
- m1.rotate(45.0, 0.0, 1.0, 0.0);
- QTest::newRow("rotY 45 + 100, 50, 25") << m1 << 100.0f << 50.0f << 25.0f;
-
- m1.setIdentity();
- m1.rotate(75, 0.0, 0.0, 1.0);
- m1.rotate(25, 1.0, 0.0, 0.0);
- m1.rotate(45, 0.0, 1.0, 0.0);
- QTest::newRow("rotZ 75, rotX 25, rotY 45, 100, 50, 25") << m1 << 100.0f << 50.0f << 25.0f;
-}
-
-void tst_QMatrixNxN::extractTranslation()
-{
- QFETCH(QMatrix4x4, rotation);
- QFETCH(float, x);
- QFETCH(float, y);
- QFETCH(float, z);
-
- rotation.translate(x, y, z);
-
- QVector3D vec = rotation.extractTranslation();
-
- qreal epsilon = 0.001;
-
- QVERIFY(fuzzyCompare(vec.x(), x, epsilon));
- QVERIFY(fuzzyCompare(vec.y(), y, epsilon));
- QVERIFY(fuzzyCompare(vec.z(), z, epsilon));
-
- QMatrix4x4 lookAt;
- QVector3D eye(1.5f, -2.5f, 2.5f);
- lookAt.lookAt(eye,
- QVector3D(10.0f, 10.0f, 10.0f),
- QVector3D(0.0f, 1.0f, 0.0f));
-
- QVector3D extEye = lookAt.extractTranslation();
-
- QVERIFY(fuzzyCompare(eye.x(), -extEye.x(), epsilon));
- QVERIFY(fuzzyCompare(eye.y(), -extEye.y(), epsilon));
- QVERIFY(fuzzyCompare(eye.z(), -extEye.z(), epsilon));
-}
-
-// Copy of "flagBits" in qmatrix4x4.h.
-enum {
- Identity = 0x0001, // Identity matrix
- General = 0x0002, // General matrix, unknown contents
- Translation = 0x0004, // Contains a simple translation
- Scale = 0x0008, // Contains a simple scale
- Rotation = 0x0010 // Contains a simple rotation
-};
-
-// Structure that allows direct access to "flagBits" for testing.
-struct Matrix4x4
-{
- float m[4][4];
- int flagBits;
-};
-
-// Test the inferring of special matrix types.
-void tst_QMatrixNxN::inferSpecialType_data()
-{
- QTest::addColumn<void *>("mValues");
- QTest::addColumn<int>("flagBits");
-
- QTest::newRow("null")
- << (void *)nullValues4 << (int)General;
- QTest::newRow("identity")
- << (void *)identityValues4 << (int)Identity;
- QTest::newRow("unique")
- << (void *)uniqueValues4 << (int)General;
-
- static qreal scaleValues[16] = {
- 2.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 3.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 4.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 1.0f
- };
- QTest::newRow("scale")
- << (void *)scaleValues << (int)Scale;
-
- static qreal translateValues[16] = {
- 1.0f, 0.0f, 0.0f, 2.0f,
- 0.0f, 1.0f, 0.0f, 3.0f,
- 0.0f, 0.0f, 1.0f, 4.0f,
- 0.0f, 0.0f, 0.0f, 1.0f
- };
- QTest::newRow("scale")
- << (void *)translateValues << (int)Translation;
-
- static qreal bothValues[16] = {
- 1.0f, 0.0f, 0.0f, 2.0f,
- 0.0f, 2.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 1.0f, 4.0f,
- 0.0f, 0.0f, 0.0f, 1.0f
- };
- QTest::newRow("both")
- << (void *)bothValues << (int)(Scale | Translation);
-
- static qreal belowValues[16] = {
- 1.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 1.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 1.0f, 0.0f,
- 4.0f, 0.0f, 0.0f, 1.0f
- };
- QTest::newRow("below")
- << (void *)belowValues << (int)General;
-}
-void tst_QMatrixNxN::inferSpecialType()
-{
- QFETCH(void *, mValues);
- QFETCH(int, flagBits);
-
- QMatrix4x4 m((const qreal *)mValues);
- m.inferSpecialType();
-
- QCOMPARE(reinterpret_cast<Matrix4x4 *>(&m)->flagBits, flagBits);
-}
-
-void tst_QMatrixNxN::columnsAndRows()
-{
- QMatrix4x4 m1(uniqueValues4);
-
- QVERIFY(m1.column(0) == QVector4D(1, 5, 9, 13));
- QVERIFY(m1.column(1) == QVector4D(2, 6, 10, 14));
- QVERIFY(m1.column(2) == QVector4D(3, 7, 11, 15));
- QVERIFY(m1.column(3) == QVector4D(4, 8, 12, 16));
-
- QVERIFY(m1.row(0) == QVector4D(1, 2, 3, 4));
- QVERIFY(m1.row(1) == QVector4D(5, 6, 7, 8));
- QVERIFY(m1.row(2) == QVector4D(9, 10, 11, 12));
- QVERIFY(m1.row(3) == QVector4D(13, 14, 15, 16));
-
- m1.setColumn(0, QVector4D(-1, -5, -9, -13));
- m1.setColumn(1, QVector4D(-2, -6, -10, -14));
- m1.setColumn(2, QVector4D(-3, -7, -11, -15));
- m1.setColumn(3, QVector4D(-4, -8, -12, -16));
-
- QVERIFY(m1.column(0) == QVector4D(-1, -5, -9, -13));
- QVERIFY(m1.column(1) == QVector4D(-2, -6, -10, -14));
- QVERIFY(m1.column(2) == QVector4D(-3, -7, -11, -15));
- QVERIFY(m1.column(3) == QVector4D(-4, -8, -12, -16));
-
- QVERIFY(m1.row(0) == QVector4D(-1, -2, -3, -4));
- QVERIFY(m1.row(1) == QVector4D(-5, -6, -7, -8));
- QVERIFY(m1.row(2) == QVector4D(-9, -10, -11, -12));
- QVERIFY(m1.row(3) == QVector4D(-13, -14, -15, -16));
-
- m1.setRow(0, QVector4D(1, 5, 9, 13));
- m1.setRow(1, QVector4D(2, 6, 10, 14));
- m1.setRow(2, QVector4D(3, 7, 11, 15));
- m1.setRow(3, QVector4D(4, 8, 12, 16));
-
- QVERIFY(m1.column(0) == QVector4D(1, 2, 3, 4));
- QVERIFY(m1.column(1) == QVector4D(5, 6, 7, 8));
- QVERIFY(m1.column(2) == QVector4D(9, 10, 11, 12));
- QVERIFY(m1.column(3) == QVector4D(13, 14, 15, 16));
-
- QVERIFY(m1.row(0) == QVector4D(1, 5, 9, 13));
- QVERIFY(m1.row(1) == QVector4D(2, 6, 10, 14));
- QVERIFY(m1.row(2) == QVector4D(3, 7, 11, 15));
- QVERIFY(m1.row(3) == QVector4D(4, 8, 12, 16));
-}
-
-// Test converting QMatrix objects into QMatrix4x4 and then
-// checking that transformations in the original perform the
-// equivalent transformations in the new matrix.
-void tst_QMatrixNxN::convertQMatrix()
-{
- QMatrix m1;
- m1.translate(-3.5, 2.0);
- QPointF p1 = m1.map(QPointF(100.0, 150.0));
- QCOMPARE(p1.x(), 100.0 - 3.5);
- QCOMPARE(p1.y(), 150.0 + 2.0);
-
- QMatrix4x4 m2(m1);
- QPointF p2 = m2 * QPointF(100.0, 150.0);
- QCOMPARE((double)p2.x(), 100.0 - 3.5);
- QCOMPARE((double)p2.y(), 150.0 + 2.0);
- QVERIFY(m1 == m2.toAffine());
-
- QMatrix m3;
- m3.scale(1.5, -2.0);
- QPointF p3 = m3.map(QPointF(100.0, 150.0));
- QCOMPARE(p3.x(), 1.5 * 100.0);
- QCOMPARE(p3.y(), -2.0 * 150.0);
-
- QMatrix4x4 m4(m3);
- QPointF p4 = m4 * QPointF(100.0, 150.0);
- QCOMPARE((double)p4.x(), 1.5 * 100.0);
- QCOMPARE((double)p4.y(), -2.0 * 150.0);
- QVERIFY(m3 == m4.toAffine());
-
- QMatrix m5;
- m5.rotate(45.0);
- QPointF p5 = m5.map(QPointF(100.0, 150.0));
-
- QMatrix4x4 m6(m5);
- QPointF p6 = m6 * QPointF(100.0, 150.0);
- QVERIFY(fuzzyCompare(p5.x(), p6.x(), 0.005));
- QVERIFY(fuzzyCompare(p5.y(), p6.y(), 0.005));
-
- QMatrix m7 = m6.toAffine();
- QVERIFY(fuzzyCompare(m5.m11(), m7.m11()));
- QVERIFY(fuzzyCompare(m5.m12(), m7.m12()));
- QVERIFY(fuzzyCompare(m5.m21(), m7.m21()));
- QVERIFY(fuzzyCompare(m5.m22(), m7.m22()));
- QVERIFY(fuzzyCompare(m5.dx(), m7.dx()));
- QVERIFY(fuzzyCompare(m5.dy(), m7.dy()));
-}
-
-// Test converting QTransform objects into QMatrix4x4 and then
-// checking that transformations in the original perform the
-// equivalent transformations in the new matrix.
-void tst_QMatrixNxN::convertQTransform()
-{
- QTransform m1;
- m1.translate(-3.5, 2.0);
- QPointF p1 = m1.map(QPointF(100.0, 150.0));
- QCOMPARE(p1.x(), 100.0 - 3.5);
- QCOMPARE(p1.y(), 150.0 + 2.0);
-
- QMatrix4x4 m2(m1);
- QPointF p2 = m2 * QPointF(100.0, 150.0);
- QCOMPARE((double)p2.x(), 100.0 - 3.5);
- QCOMPARE((double)p2.y(), 150.0 + 2.0);
- QVERIFY(m1 == m2.toTransform());
-
- QTransform m3;
- m3.scale(1.5, -2.0);
- QPointF p3 = m3.map(QPointF(100.0, 150.0));
- QCOMPARE(p3.x(), 1.5 * 100.0);
- QCOMPARE(p3.y(), -2.0 * 150.0);
-
- QMatrix4x4 m4(m3);
- QPointF p4 = m4 * QPointF(100.0, 150.0);
- QCOMPARE((double)p4.x(), 1.5 * 100.0);
- QCOMPARE((double)p4.y(), -2.0 * 150.0);
- QVERIFY(m3 == m4.toTransform());
-
- QTransform m5;
- m5.rotate(45.0);
- QPointF p5 = m5.map(QPointF(100.0, 150.0));
-
- QMatrix4x4 m6(m5);
- QPointF p6 = m6 * QPointF(100.0, 150.0);
- QVERIFY(fuzzyCompare(p5.x(), p6.x(), 0.005));
- QVERIFY(fuzzyCompare(p5.y(), p6.y(), 0.005));
-
- QTransform m7 = m6.toTransform();
- QVERIFY(fuzzyCompare(m5.m11(), m7.m11()));
- QVERIFY(fuzzyCompare(m5.m12(), m7.m12()));
- QVERIFY(fuzzyCompare(m5.m21(), m7.m21()));
- QVERIFY(fuzzyCompare(m5.m22(), m7.m22()));
- QVERIFY(fuzzyCompare(m5.dx(), m7.dx()));
- QVERIFY(fuzzyCompare(m5.dy(), m7.dy()));
- QVERIFY(fuzzyCompare(m5.m13(), m7.m13()));
- QVERIFY(fuzzyCompare(m5.m23(), m7.m23()));
- QVERIFY(fuzzyCompare(m5.m33(), m7.m33()));
-}
-
-// Test filling matrices with specific values.
-void tst_QMatrixNxN::fill()
-{
- QMatrix4x4 m1;
- m1.fill(0.0f);
- QVERIFY(isSame(m1, nullValues4));
-
- static const qreal fillValues4[] =
- {2.5f, 2.5f, 2.5f, 2.5f,
- 2.5f, 2.5f, 2.5f, 2.5f,
- 2.5f, 2.5f, 2.5f, 2.5f,
- 2.5f, 2.5f, 2.5f, 2.5f};
- m1.fill(2.5f);
- QVERIFY(isSame(m1, fillValues4));
-
- QMatrix4x3 m2;
- m2.fill(0.0f);
- QVERIFY(isSame(m2, nullValues4x3));
-
- static const qreal fillValues4x3[] =
- {2.5f, 2.5f, 2.5f, 2.5f,
- 2.5f, 2.5f, 2.5f, 2.5f,
- 2.5f, 2.5f, 2.5f, 2.5f};
- m2.fill(2.5f);
- QVERIFY(isSame(m2, fillValues4x3));
-}
-
-// Test the mapRect() function for QRect and QRectF.
-void tst_QMatrixNxN::mapRect_data()
-{
- QTest::addColumn<qreal>("x");
- QTest::addColumn<qreal>("y");
- QTest::addColumn<qreal>("width");
- QTest::addColumn<qreal>("height");
-
- QTest::newRow("null")
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f;
- QTest::newRow("rect")
- << (qreal)1.0f << (qreal)-20.5f << (qreal)100.0f << (qreal)63.75f;
-}
-void tst_QMatrixNxN::mapRect()
-{
- QFETCH(qreal, x);
- QFETCH(qreal, y);
- QFETCH(qreal, width);
- QFETCH(qreal, height);
-
- QRectF rect(x, y, width, height);
- QRect recti(qRound(x), qRound(y), qRound(width), qRound(height));
-
- QMatrix4x4 m1;
- QVERIFY(m1.mapRect(rect) == rect);
- QVERIFY(m1.mapRect(recti) == recti);
-
- QMatrix4x4 m2;
- m2.translate(-100.5f, 64.0f);
- QRectF translated = rect.translated(-100.5f, 64.0f);
- QRect translatedi = QRect(qRound(recti.x() - 100.5f), recti.y() + 64,
- recti.width(), recti.height());
- QVERIFY(m2.mapRect(rect) == translated);
- QVERIFY(m2.mapRect(recti) == translatedi);
-
- QMatrix4x4 m3;
- m3.scale(-100.5f, 64.0f);
- qreal scalex = x * -100.5f;
- qreal scaley = y * 64.0f;
- qreal scalewid = width * -100.5f;
- qreal scaleht = height * 64.0f;
- if (scalewid < 0.0f) {
- scalewid = -scalewid;
- scalex -= scalewid;
- }
- if (scaleht < 0.0f) {
- scaleht = -scaleht;
- scaley -= scaleht;
- }
- QRectF scaled(scalex, scaley, scalewid, scaleht);
- QVERIFY(m3.mapRect(rect) == scaled);
- scalex = recti.x() * -100.5f;
- scaley = recti.y() * 64.0f;
- scalewid = recti.width() * -100.5f;
- scaleht = recti.height() * 64.0f;
- if (scalewid < 0.0f) {
- scalewid = -scalewid;
- scalex -= scalewid;
- }
- if (scaleht < 0.0f) {
- scaleht = -scaleht;
- scaley -= scaleht;
- }
- QRect scaledi(qRound(scalex), qRound(scaley),
- qRound(scalewid), qRound(scaleht));
- QVERIFY(m3.mapRect(recti) == scaledi);
-
- QMatrix4x4 m4;
- m4.translate(-100.5f, 64.0f);
- m4.scale(-2.5f, 4.0f);
- qreal transx1 = x * -2.5f - 100.5f;
- qreal transy1 = y * 4.0f + 64.0f;
- qreal transx2 = (x + width) * -2.5f - 100.5f;
- qreal transy2 = (y + height) * 4.0f + 64.0f;
- if (transx1 > transx2)
- qSwap(transx1, transx2);
- if (transy1 > transy2)
- qSwap(transy1, transy2);
- QRectF trans(transx1, transy1, transx2 - transx1, transy2 - transy1);
- QVERIFY(m4.mapRect(rect) == trans);
- transx1 = recti.x() * -2.5f - 100.5f;
- transy1 = recti.y() * 4.0f + 64.0f;
- transx2 = (recti.x() + recti.width()) * -2.5f - 100.5f;
- transy2 = (recti.y() + recti.height()) * 4.0f + 64.0f;
- if (transx1 > transx2)
- qSwap(transx1, transx2);
- if (transy1 > transy2)
- qSwap(transy1, transy2);
- QRect transi(qRound(transx1), qRound(transy1),
- qRound(transx2) - qRound(transx1),
- qRound(transy2) - qRound(transy1));
- QVERIFY(m4.mapRect(recti) == transi);
-
- m4.rotate(45.0f, 0.0f, 0.0f, 1.0f);
-
- QTransform t4;
- t4.translate(-100.5f, 64.0f);
- t4.scale(-2.5f, 4.0f);
- t4.rotate(45.0f);
- QRectF mr = m4.mapRect(rect);
- QRectF tr = t4.mapRect(rect);
- QVERIFY(fuzzyCompare(mr.x(), tr.x()));
- QVERIFY(fuzzyCompare(mr.y(), tr.y()));
- QVERIFY(fuzzyCompare(mr.width(), tr.width()));
- QVERIFY(fuzzyCompare(mr.height(), tr.height()));
-
- QRect mri = m4.mapRect(recti);
- QRect tri = t4.mapRect(recti);
- QVERIFY(mri == tri);
-}
-
-class tst_QMatrixNxN4x4Properties : public QObject
-{
- Q_OBJECT
- Q_PROPERTY(QMatrix4x4 matrix READ matrix WRITE setMatrix)
-public:
- tst_QMatrixNxN4x4Properties(QObject *parent = 0) : QObject(parent) {}
-
- QMatrix4x4 matrix() const { return m; }
- void setMatrix(const QMatrix4x4& value) { m = value; }
-
-private:
- QMatrix4x4 m;
-};
-
-// Test getting and setting matrix properties via the metaobject system.
-void tst_QMatrixNxN::properties()
-{
- tst_QMatrixNxN4x4Properties obj;
-
- QMatrix4x4 m1(uniqueValues4);
- obj.setMatrix(m1);
-
- QMatrix4x4 m2 = qVariantValue<QMatrix4x4>(obj.property("matrix"));
- QVERIFY(isSame(m2, uniqueValues4));
-
- QMatrix4x4 m3(transposedValues4);
- obj.setProperty("matrix", qVariantFromValue(m3));
-
- m2 = qVariantValue<QMatrix4x4>(obj.property("matrix"));
- QVERIFY(isSame(m2, transposedValues4));
-}
-
-void tst_QMatrixNxN::metaTypes()
-{
- QVERIFY(QMetaType::type("QMatrix4x4") == QMetaType::QMatrix4x4);
-
- QCOMPARE(QByteArray(QMetaType::typeName(QMetaType::QMatrix4x4)),
- QByteArray("QMatrix4x4"));
-
- QVERIFY(QMetaType::isRegistered(QMetaType::QMatrix4x4));
-
- QVERIFY(qMetaTypeId<QMatrix4x4>() == QMetaType::QMatrix4x4);
-}
-
-QTEST_APPLESS_MAIN(tst_QMatrixNxN)
-
-#include "tst_qmatrixnxn.moc"
diff --git a/tests/auto/math3d/qquaternion/qquaternion.pro b/tests/auto/math3d/qquaternion/qquaternion.pro
deleted file mode 100644
index eea84f0..0000000
--- a/tests/auto/math3d/qquaternion/qquaternion.pro
+++ /dev/null
@@ -1,5 +0,0 @@
-load(qttest_p4)
-VPATH += ../shared
-INCLUDEPATH += ../shared
-HEADERS += math3dincludes.h
-SOURCES += tst_qquaternion.cpp
diff --git a/tests/auto/math3d/qquaternion/tst_qquaternion.cpp b/tests/auto/math3d/qquaternion/tst_qquaternion.cpp
deleted file mode 100644
index 899c5c2..0000000
--- a/tests/auto/math3d/qquaternion/tst_qquaternion.cpp
+++ /dev/null
@@ -1,882 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the test suite of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at http://qt.nokia.com/contact.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <QtTest/QtTest>
-#include <QtCore/qmath.h>
-#include "math3dincludes.h"
-
-class tst_QQuaternion : public QObject
-{
- Q_OBJECT
-public:
- tst_QQuaternion() {}
- ~tst_QQuaternion() {}
-
-private slots:
- void create();
-
- void length_data();
- void length();
-
- void normalized_data();
- void normalized();
-
- void normalize_data();
- void normalize();
-
- void compare();
-
- void add_data();
- void add();
-
- void subtract_data();
- void subtract();
-
- void multiply_data();
- void multiply();
-
- void multiplyFactor_data();
- void multiplyFactor();
-
- void divide_data();
- void divide();
-
- void negate_data();
- void negate();
-
- void conjugate_data();
- void conjugate();
-
- void fromAxisAndAngle_data();
- void fromAxisAndAngle();
-
- void slerp_data();
- void slerp();
-
- void nlerp_data();
- void nlerp();
-
- void properties();
- void metaTypes();
-};
-
-// qFuzzyCompare isn't always "fuzzy" enough to handle conversion
-// between float, double, and qreal. So create "fuzzier" compares.
-static bool fuzzyCompare(float x, float y)
-{
- float diff = x - y;
- if (diff < 0.0f)
- diff = -diff;
- return (diff < 0.001);
-}
-
-// Test the creation of QQuaternion objects in various ways:
-// construct, copy, and modify.
-void tst_QQuaternion::create()
-{
- QQuaternion identity;
- QCOMPARE(identity.x(), (qreal)0.0f);
- QCOMPARE(identity.y(), (qreal)0.0f);
- QCOMPARE(identity.z(), (qreal)0.0f);
- QCOMPARE(identity.scalar(), (qreal)1.0f);
- QVERIFY(identity.isIdentity());
-
- QQuaternion v1(34.0f, 1.0f, 2.5f, -89.25f);
- QCOMPARE(v1.x(), (qreal)1.0f);
- QCOMPARE(v1.y(), (qreal)2.5f);
- QCOMPARE(v1.z(), (qreal)-89.25f);
- QCOMPARE(v1.scalar(), (qreal)34.0f);
- QVERIFY(!v1.isNull());
-
- QQuaternion v1i(34, 1, 2, -89);
- QCOMPARE(v1i.x(), (qreal)1.0f);
- QCOMPARE(v1i.y(), (qreal)2.0f);
- QCOMPARE(v1i.z(), (qreal)-89.0f);
- QCOMPARE(v1i.scalar(), (qreal)34.0f);
- QVERIFY(!v1i.isNull());
-
- QQuaternion v2(v1);
- QCOMPARE(v2.x(), (qreal)1.0f);
- QCOMPARE(v2.y(), (qreal)2.5f);
- QCOMPARE(v2.z(), (qreal)-89.25f);
- QCOMPARE(v2.scalar(), (qreal)34.0f);
- QVERIFY(!v2.isNull());
-
- QQuaternion v4;
- QCOMPARE(v4.x(), (qreal)0.0f);
- QCOMPARE(v4.y(), (qreal)0.0f);
- QCOMPARE(v4.z(), (qreal)0.0f);
- QCOMPARE(v4.scalar(), (qreal)1.0f);
- QVERIFY(v4.isIdentity());
- v4 = v1;
- QCOMPARE(v4.x(), (qreal)1.0f);
- QCOMPARE(v4.y(), (qreal)2.5f);
- QCOMPARE(v4.z(), (qreal)-89.25f);
- QCOMPARE(v4.scalar(), (qreal)34.0f);
- QVERIFY(!v4.isNull());
-
- QQuaternion v9(34, QVector3D(1.0f, 2.5f, -89.25f));
- QCOMPARE(v9.x(), (qreal)1.0f);
- QCOMPARE(v9.y(), (qreal)2.5f);
- QCOMPARE(v9.z(), (qreal)-89.25f);
- QCOMPARE(v9.scalar(), (qreal)34.0f);
- QVERIFY(!v9.isNull());
-
- v1.setX(3.0f);
- QCOMPARE(v1.x(), (qreal)3.0f);
- QCOMPARE(v1.y(), (qreal)2.5f);
- QCOMPARE(v1.z(), (qreal)-89.25f);
- QCOMPARE(v1.scalar(), (qreal)34.0f);
- QVERIFY(!v1.isNull());
-
- v1.setY(10.5f);
- QCOMPARE(v1.x(), (qreal)3.0f);
- QCOMPARE(v1.y(), (qreal)10.5f);
- QCOMPARE(v1.z(), (qreal)-89.25f);
- QCOMPARE(v1.scalar(), (qreal)34.0f);
- QVERIFY(!v1.isNull());
-
- v1.setZ(15.5f);
- QCOMPARE(v1.x(), (qreal)3.0f);
- QCOMPARE(v1.y(), (qreal)10.5f);
- QCOMPARE(v1.z(), (qreal)15.5f);
- QCOMPARE(v1.scalar(), (qreal)34.0f);
- QVERIFY(!v1.isNull());
-
- v1.setScalar(6.0f);
- QCOMPARE(v1.x(), (qreal)3.0f);
- QCOMPARE(v1.y(), (qreal)10.5f);
- QCOMPARE(v1.z(), (qreal)15.5f);
- QCOMPARE(v1.scalar(), (qreal)6.0f);
- QVERIFY(!v1.isNull());
-
- v1.setVector(2.0f, 6.5f, -1.25f);
- QCOMPARE(v1.x(), (qreal)2.0f);
- QCOMPARE(v1.y(), (qreal)6.5f);
- QCOMPARE(v1.z(), (qreal)-1.25f);
- QCOMPARE(v1.scalar(), (qreal)6.0f);
- QVERIFY(!v1.isNull());
- QVERIFY(v1.vector() == QVector3D(2.0f, 6.5f, -1.25f));
-
- v1.setVector(QVector3D(-2.0f, -6.5f, 1.25f));
- QCOMPARE(v1.x(), (qreal)-2.0f);
- QCOMPARE(v1.y(), (qreal)-6.5f);
- QCOMPARE(v1.z(), (qreal)1.25f);
- QCOMPARE(v1.scalar(), (qreal)6.0f);
- QVERIFY(!v1.isNull());
- QVERIFY(v1.vector() == QVector3D(-2.0f, -6.5f, 1.25f));
-
- v1.setX(0.0f);
- v1.setY(0.0f);
- v1.setZ(0.0f);
- v1.setScalar(0.0f);
- QCOMPARE(v1.x(), (qreal)0.0f);
- QCOMPARE(v1.y(), (qreal)0.0f);
- QCOMPARE(v1.z(), (qreal)0.0f);
- QCOMPARE(v1.scalar(), (qreal)0.0f);
- QVERIFY(v1.isNull());
-
- QVector4D v10 = v9.toVector4D();
- QCOMPARE(v10.x(), (qreal)1.0f);
- QCOMPARE(v10.y(), (qreal)2.5f);
- QCOMPARE(v10.z(), (qreal)-89.25f);
- QCOMPARE(v10.w(), (qreal)34.0f);
-}
-
-// Test length computation for quaternions.
-void tst_QQuaternion::length_data()
-{
- QTest::addColumn<qreal>("x");
- QTest::addColumn<qreal>("y");
- QTest::addColumn<qreal>("z");
- QTest::addColumn<qreal>("w");
- QTest::addColumn<qreal>("len");
-
- QTest::newRow("null") << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f;
- QTest::newRow("1x") << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f;
- QTest::newRow("1y") << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f;
- QTest::newRow("1z") << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f << (qreal)1.0f;
- QTest::newRow("1w") << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f << (qreal)1.0f;
- QTest::newRow("-1x") << (qreal)-1.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f;
- QTest::newRow("-1y") << (qreal)0.0f << (qreal)-1.0f << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f;
- QTest::newRow("-1z") << (qreal)0.0f << (qreal)0.0f << (qreal)-1.0f << (qreal)0.0f << (qreal)1.0f;
- QTest::newRow("-1w") << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)-1.0f << (qreal)1.0f;
- QTest::newRow("two") << (qreal)2.0f << (qreal)-2.0f << (qreal)2.0f << (qreal)2.0f << (qreal)qSqrt(16.0f);
-}
-void tst_QQuaternion::length()
-{
- QFETCH(qreal, x);
- QFETCH(qreal, y);
- QFETCH(qreal, z);
- QFETCH(qreal, w);
- QFETCH(qreal, len);
-
- QQuaternion v(w, x, y, z);
- QCOMPARE((float)(v.length()), (float)len);
- QCOMPARE((float)(v.lengthSquared()), (float)(x * x + y * y + z * z + w * w));
-}
-
-// Test the unit vector conversion for quaternions.
-void tst_QQuaternion::normalized_data()
-{
- // Use the same test data as the length test.
- length_data();
-}
-void tst_QQuaternion::normalized()
-{
- QFETCH(qreal, x);
- QFETCH(qreal, y);
- QFETCH(qreal, z);
- QFETCH(qreal, w);
- QFETCH(qreal, len);
-
- QQuaternion v(w, x, y, z);
- QQuaternion u = v.normalized();
- if (v.isNull())
- QVERIFY(u.isNull());
- else
- QCOMPARE((float)(u.length()), (float)1.0f);
- QCOMPARE((float)(u.x() * len), (float)(v.x()));
- QCOMPARE((float)(u.y() * len), (float)(v.y()));
- QCOMPARE((float)(u.z() * len), (float)(v.z()));
- QCOMPARE((float)(u.scalar() * len), (float)(v.scalar()));
-}
-
-// Test the unit vector conversion for quaternions.
-void tst_QQuaternion::normalize_data()
-{
- // Use the same test data as the length test.
- length_data();
-}
-void tst_QQuaternion::normalize()
-{
- QFETCH(qreal, x);
- QFETCH(qreal, y);
- QFETCH(qreal, z);
- QFETCH(qreal, w);
-
- QQuaternion v(w, x, y, z);
- bool isNull = v.isNull();
- v.normalize();
- if (isNull)
- QVERIFY(v.isNull());
- else
- QCOMPARE((float)(v.length()), (float)1.0f);
-}
-
-// Test the comparison operators for quaternions.
-void tst_QQuaternion::compare()
-{
- QQuaternion v1(8, 1, 2, 4);
- QQuaternion v2(8, 1, 2, 4);
- QQuaternion v3(8, 3, 2, 4);
- QQuaternion v4(8, 1, 3, 4);
- QQuaternion v5(8, 1, 2, 3);
- QQuaternion v6(3, 1, 2, 4);
-
- QVERIFY(v1 == v2);
- QVERIFY(v1 != v3);
- QVERIFY(v1 != v4);
- QVERIFY(v1 != v5);
- QVERIFY(v1 != v6);
-}
-
-// Test addition for quaternions.
-void tst_QQuaternion::add_data()
-{
- QTest::addColumn<qreal>("x1");
- QTest::addColumn<qreal>("y1");
- QTest::addColumn<qreal>("z1");
- QTest::addColumn<qreal>("w1");
- QTest::addColumn<qreal>("x2");
- QTest::addColumn<qreal>("y2");
- QTest::addColumn<qreal>("z2");
- QTest::addColumn<qreal>("w2");
- QTest::addColumn<qreal>("x3");
- QTest::addColumn<qreal>("y3");
- QTest::addColumn<qreal>("z3");
- QTest::addColumn<qreal>("w3");
-
- QTest::newRow("null")
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f;
-
- QTest::newRow("xonly")
- << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f
- << (qreal)2.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f
- << (qreal)3.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f;
-
- QTest::newRow("yonly")
- << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f
- << (qreal)0.0f << (qreal)2.0f << (qreal)0.0f << (qreal)0.0f
- << (qreal)0.0f << (qreal)3.0f << (qreal)0.0f << (qreal)0.0f;
-
- QTest::newRow("zonly")
- << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f
- << (qreal)0.0f << (qreal)0.0f << (qreal)2.0f << (qreal)0.0f
- << (qreal)0.0f << (qreal)0.0f << (qreal)3.0f << (qreal)0.0f;
-
- QTest::newRow("wonly")
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)2.0f
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)3.0f;
-
- QTest::newRow("all")
- << (qreal)1.0f << (qreal)2.0f << (qreal)3.0f << (qreal)8.0f
- << (qreal)4.0f << (qreal)5.0f << (qreal)-6.0f << (qreal)9.0f
- << (qreal)5.0f << (qreal)7.0f << (qreal)-3.0f << (qreal)17.0f;
-}
-void tst_QQuaternion::add()
-{
- QFETCH(qreal, x1);
- QFETCH(qreal, y1);
- QFETCH(qreal, z1);
- QFETCH(qreal, w1);
- QFETCH(qreal, x2);
- QFETCH(qreal, y2);
- QFETCH(qreal, z2);
- QFETCH(qreal, w2);
- QFETCH(qreal, x3);
- QFETCH(qreal, y3);
- QFETCH(qreal, z3);
- QFETCH(qreal, w3);
-
- QQuaternion v1(w1, x1, y1, z1);
- QQuaternion v2(w2, x2, y2, z2);
- QQuaternion v3(w3, x3, y3, z3);
-
- QVERIFY((v1 + v2) == v3);
-
- QQuaternion v4(v1);
- v4 += v2;
- QVERIFY(v4 == v3);
-
- QCOMPARE(v4.x(), v1.x() + v2.x());
- QCOMPARE(v4.y(), v1.y() + v2.y());
- QCOMPARE(v4.z(), v1.z() + v2.z());
- QCOMPARE(v4.scalar(), v1.scalar() + v2.scalar());
-}
-
-// Test subtraction for quaternions.
-void tst_QQuaternion::subtract_data()
-{
- // Use the same test data as the add test.
- add_data();
-}
-void tst_QQuaternion::subtract()
-{
- QFETCH(qreal, x1);
- QFETCH(qreal, y1);
- QFETCH(qreal, z1);
- QFETCH(qreal, w1);
- QFETCH(qreal, x2);
- QFETCH(qreal, y2);
- QFETCH(qreal, z2);
- QFETCH(qreal, w2);
- QFETCH(qreal, x3);
- QFETCH(qreal, y3);
- QFETCH(qreal, z3);
- QFETCH(qreal, w3);
-
- QQuaternion v1(w1, x1, y1, z1);
- QQuaternion v2(w2, x2, y2, z2);
- QQuaternion v3(w3, x3, y3, z3);
-
- QVERIFY((v3 - v1) == v2);
- QVERIFY((v3 - v2) == v1);
-
- QQuaternion v4(v3);
- v4 -= v1;
- QVERIFY(v4 == v2);
-
- QCOMPARE(v4.x(), v3.x() - v1.x());
- QCOMPARE(v4.y(), v3.y() - v1.y());
- QCOMPARE(v4.z(), v3.z() - v1.z());
- QCOMPARE(v4.scalar(), v3.scalar() - v1.scalar());
-
- QQuaternion v5(v3);
- v5 -= v2;
- QVERIFY(v5 == v1);
-
- QCOMPARE(v5.x(), v3.x() - v2.x());
- QCOMPARE(v5.y(), v3.y() - v2.y());
- QCOMPARE(v5.z(), v3.z() - v2.z());
- QCOMPARE(v5.scalar(), v3.scalar() - v2.scalar());
-}
-
-// Test quaternion multiplication.
-void tst_QQuaternion::multiply_data()
-{
- QTest::addColumn<qreal>("x1");
- QTest::addColumn<qreal>("y1");
- QTest::addColumn<qreal>("z1");
- QTest::addColumn<qreal>("w1");
- QTest::addColumn<qreal>("x2");
- QTest::addColumn<qreal>("y2");
- QTest::addColumn<qreal>("z2");
- QTest::addColumn<qreal>("w2");
-
- QTest::newRow("null")
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f;
-
- QTest::newRow("unitvec")
- << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f
- << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f << (qreal)1.0f;
-
- QTest::newRow("complex")
- << (qreal)1.0f << (qreal)2.0f << (qreal)3.0f << (qreal)7.0f
- << (qreal)4.0f << (qreal)5.0f << (qreal)6.0f << (qreal)8.0f;
-}
-void tst_QQuaternion::multiply()
-{
- QFETCH(qreal, x1);
- QFETCH(qreal, y1);
- QFETCH(qreal, z1);
- QFETCH(qreal, w1);
- QFETCH(qreal, x2);
- QFETCH(qreal, y2);
- QFETCH(qreal, z2);
- QFETCH(qreal, w2);
-
- QQuaternion q1(w1, x1, y1, z1);
- QQuaternion q2(w2, x2, y2, z2);
-
- // Use the simple algorithm at:
- // http://www.j3d.org/matrix_faq/matrfaq_latest.html#Q53
- // to calculate the answer we expect to get.
- QVector3D v1(x1, y1, z1);
- QVector3D v2(x2, y2, z2);
- qreal scalar = w1 * w2 - QVector3D::dotProduct(v1, v2);
- QVector3D vector = w1 * v2 + w2 * v1 + QVector3D::crossProduct(v1, v2);
- QQuaternion result(scalar, vector);
-
- QVERIFY((q1 * q2) == result);
-}
-
-// Test multiplication by a factor for quaternions.
-void tst_QQuaternion::multiplyFactor_data()
-{
- QTest::addColumn<qreal>("x1");
- QTest::addColumn<qreal>("y1");
- QTest::addColumn<qreal>("z1");
- QTest::addColumn<qreal>("w1");
- QTest::addColumn<qreal>("factor");
- QTest::addColumn<qreal>("x2");
- QTest::addColumn<qreal>("y2");
- QTest::addColumn<qreal>("z2");
- QTest::addColumn<qreal>("w2");
-
- QTest::newRow("null")
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f
- << (qreal)100.0f
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f;
-
- QTest::newRow("xonly")
- << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f
- << (qreal)2.0f
- << (qreal)2.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f;
-
- QTest::newRow("yonly")
- << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f
- << (qreal)2.0f
- << (qreal)0.0f << (qreal)2.0f << (qreal)0.0f << (qreal)0.0f;
-
- QTest::newRow("zonly")
- << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f
- << (qreal)2.0f
- << (qreal)0.0f << (qreal)0.0f << (qreal)2.0f << (qreal)0.0f;
-
- QTest::newRow("wonly")
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f
- << (qreal)2.0f
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)2.0f;
-
- QTest::newRow("all")
- << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)4.0f
- << (qreal)2.0f
- << (qreal)2.0f << (qreal)4.0f << (qreal)-6.0f << (qreal)8.0f;
-
- QTest::newRow("allzero")
- << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)4.0f
- << (qreal)0.0f
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f;
-}
-void tst_QQuaternion::multiplyFactor()
-{
- QFETCH(qreal, x1);
- QFETCH(qreal, y1);
- QFETCH(qreal, z1);
- QFETCH(qreal, w1);
- QFETCH(qreal, factor);
- QFETCH(qreal, x2);
- QFETCH(qreal, y2);
- QFETCH(qreal, z2);
- QFETCH(qreal, w2);
-
- QQuaternion v1(w1, x1, y1, z1);
- QQuaternion v2(w2, x2, y2, z2);
-
- QVERIFY((v1 * factor) == v2);
- QVERIFY((factor * v1) == v2);
-
- QQuaternion v3(v1);
- v3 *= factor;
- QVERIFY(v3 == v2);
-
- QCOMPARE(v3.x(), v1.x() * factor);
- QCOMPARE(v3.y(), v1.y() * factor);
- QCOMPARE(v3.z(), v1.z() * factor);
- QCOMPARE(v3.scalar(), v1.scalar() * factor);
-}
-
-// Test division by a factor for quaternions.
-void tst_QQuaternion::divide_data()
-{
- // Use the same test data as the multiply test.
- multiplyFactor_data();
-}
-void tst_QQuaternion::divide()
-{
- QFETCH(qreal, x1);
- QFETCH(qreal, y1);
- QFETCH(qreal, z1);
- QFETCH(qreal, w1);
- QFETCH(qreal, factor);
- QFETCH(qreal, x2);
- QFETCH(qreal, y2);
- QFETCH(qreal, z2);
- QFETCH(qreal, w2);
-
- QQuaternion v1(w1, x1, y1, z1);
- QQuaternion v2(w2, x2, y2, z2);
-
- if (factor == (qreal)0.0f)
- return;
-
- QVERIFY((v2 / factor) == v1);
-
- QQuaternion v3(v2);
- v3 /= factor;
- QVERIFY(v3 == v1);
-
- QCOMPARE(v3.x(), v2.x() / factor);
- QCOMPARE(v3.y(), v2.y() / factor);
- QCOMPARE(v3.z(), v2.z() / factor);
- QCOMPARE(v3.scalar(), v2.scalar() / factor);
-}
-
-// Test negation for quaternions.
-void tst_QQuaternion::negate_data()
-{
- // Use the same test data as the add test.
- add_data();
-}
-void tst_QQuaternion::negate()
-{
- QFETCH(qreal, x1);
- QFETCH(qreal, y1);
- QFETCH(qreal, z1);
- QFETCH(qreal, w1);
-
- QQuaternion v1(w1, x1, y1, z1);
- QQuaternion v2(-w1, -x1, -y1, -z1);
-
- QVERIFY(-v1 == v2);
-}
-
-// Test quaternion conjugate calculations.
-void tst_QQuaternion::conjugate_data()
-{
- // Use the same test data as the add test.
- add_data();
-}
-void tst_QQuaternion::conjugate()
-{
- QFETCH(qreal, x1);
- QFETCH(qreal, y1);
- QFETCH(qreal, z1);
- QFETCH(qreal, w1);
-
- QQuaternion v1(w1, x1, y1, z1);
- QQuaternion v2(w1, -x1, -y1, -z1);
-
- QVERIFY(v1.conjugate() == v2);
-}
-
-// Test quaternion creation from an axis and an angle.
-void tst_QQuaternion::fromAxisAndAngle_data()
-{
- QTest::addColumn<qreal>("x1");
- QTest::addColumn<qreal>("y1");
- QTest::addColumn<qreal>("z1");
- QTest::addColumn<qreal>("angle");
-
- QTest::newRow("null")
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f;
-
- QTest::newRow("xonly")
- << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f << (qreal)90.0f;
-
- QTest::newRow("yonly")
- << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f << (qreal)180.0f;
-
- QTest::newRow("zonly")
- << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f << (qreal)270.0f;
-
- QTest::newRow("complex")
- << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)45.0f;
-}
-void tst_QQuaternion::fromAxisAndAngle()
-{
- QFETCH(qreal, x1);
- QFETCH(qreal, y1);
- QFETCH(qreal, z1);
- QFETCH(qreal, angle);
-
- // Use a straight-forward implementation of the algorithm at:
- // http://www.j3d.org/matrix_faq/matrfaq_latest.html#Q56
- // to calculate the answer we expect to get.
- QVector3D vector = QVector3D(x1, y1, z1).normalized();
- qreal sin_a = qSin((angle * M_PI / 180.0) / 2.0);
- qreal cos_a = qCos((angle * M_PI / 180.0) / 2.0);
- QQuaternion result((qreal)cos_a,
- (qreal)(vector.x() * sin_a),
- (qreal)(vector.y() * sin_a),
- (qreal)(vector.z() * sin_a));
- result = result.normalized();
-
- QQuaternion answer = QQuaternion::fromAxisAndAngle(QVector3D(x1, y1, z1), angle);
- QVERIFY(fuzzyCompare(answer.x(), result.x()));
- QVERIFY(fuzzyCompare(answer.y(), result.y()));
- QVERIFY(fuzzyCompare(answer.z(), result.z()));
- QVERIFY(fuzzyCompare(answer.scalar(), result.scalar()));
-
- answer = QQuaternion::fromAxisAndAngle(x1, y1, z1, angle);
- QVERIFY(fuzzyCompare(answer.x(), result.x()));
- QVERIFY(fuzzyCompare(answer.y(), result.y()));
- QVERIFY(fuzzyCompare(answer.z(), result.z()));
- QVERIFY(fuzzyCompare(answer.scalar(), result.scalar()));
-}
-
-// Test spherical interpolation of quaternions.
-void tst_QQuaternion::slerp_data()
-{
- QTest::addColumn<qreal>("x1");
- QTest::addColumn<qreal>("y1");
- QTest::addColumn<qreal>("z1");
- QTest::addColumn<qreal>("angle1");
- QTest::addColumn<qreal>("x2");
- QTest::addColumn<qreal>("y2");
- QTest::addColumn<qreal>("z2");
- QTest::addColumn<qreal>("angle2");
- QTest::addColumn<qreal>("t");
- QTest::addColumn<qreal>("x3");
- QTest::addColumn<qreal>("y3");
- QTest::addColumn<qreal>("z3");
- QTest::addColumn<qreal>("angle3");
-
- QTest::newRow("first")
- << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)90.0f
- << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)180.0f
- << (qreal)0.0f
- << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)90.0f;
- QTest::newRow("first2")
- << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)90.0f
- << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)180.0f
- << (qreal)-0.5f
- << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)90.0f;
- QTest::newRow("second")
- << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)90.0f
- << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)180.0f
- << (qreal)1.0f
- << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)180.0f;
- QTest::newRow("second2")
- << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)90.0f
- << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)180.0f
- << (qreal)1.5f
- << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)180.0f;
- QTest::newRow("middle")
- << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)90.0f
- << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)180.0f
- << (qreal)0.5f
- << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)135.0f;
- QTest::newRow("wide angle")
- << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)0.0f
- << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)270.0f
- << (qreal)0.5f
- << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)-45.0f;
-}
-void tst_QQuaternion::slerp()
-{
- QFETCH(qreal, x1);
- QFETCH(qreal, y1);
- QFETCH(qreal, z1);
- QFETCH(qreal, angle1);
- QFETCH(qreal, x2);
- QFETCH(qreal, y2);
- QFETCH(qreal, z2);
- QFETCH(qreal, angle2);
- QFETCH(qreal, t);
- QFETCH(qreal, x3);
- QFETCH(qreal, y3);
- QFETCH(qreal, z3);
- QFETCH(qreal, angle3);
-
- QQuaternion q1 = QQuaternion::fromAxisAndAngle(x1, y1, z1, angle1);
- QQuaternion q2 = QQuaternion::fromAxisAndAngle(x2, y2, z2, angle2);
- QQuaternion q3 = QQuaternion::fromAxisAndAngle(x3, y3, z3, angle3);
-
- QQuaternion result = QQuaternion::slerp(q1, q2, t);
-
- QVERIFY(fuzzyCompare(result.x(), q3.x()));
- QVERIFY(fuzzyCompare(result.y(), q3.y()));
- QVERIFY(fuzzyCompare(result.z(), q3.z()));
- QVERIFY(fuzzyCompare(result.scalar(), q3.scalar()));
-}
-
-// Test normalized linear interpolation of quaternions.
-void tst_QQuaternion::nlerp_data()
-{
- slerp_data();
-}
-void tst_QQuaternion::nlerp()
-{
- QFETCH(qreal, x1);
- QFETCH(qreal, y1);
- QFETCH(qreal, z1);
- QFETCH(qreal, angle1);
- QFETCH(qreal, x2);
- QFETCH(qreal, y2);
- QFETCH(qreal, z2);
- QFETCH(qreal, angle2);
- QFETCH(qreal, t);
-
- QQuaternion q1 = QQuaternion::fromAxisAndAngle(x1, y1, z1, angle1);
- QQuaternion q2 = QQuaternion::fromAxisAndAngle(x2, y2, z2, angle2);
-
- QQuaternion result = QQuaternion::nlerp(q1, q2, t);
-
- qreal resultx, resulty, resultz, resultscalar;
- if (t <= 0.0f) {
- resultx = q1.x();
- resulty = q1.y();
- resultz = q1.z();
- resultscalar = q1.scalar();
- } else if (t >= 1.0f) {
- resultx = q2.x();
- resulty = q2.y();
- resultz = q2.z();
- resultscalar = q2.scalar();
- } else if (qAbs(angle1 - angle2) <= 180.f) {
- resultx = q1.x() * (1 - t) + q2.x() * t;
- resulty = q1.y() * (1 - t) + q2.y() * t;
- resultz = q1.z() * (1 - t) + q2.z() * t;
- resultscalar = q1.scalar() * (1 - t) + q2.scalar() * t;
- } else {
- // Angle greater than 180 degrees: negate q2.
- resultx = q1.x() * (1 - t) - q2.x() * t;
- resulty = q1.y() * (1 - t) - q2.y() * t;
- resultz = q1.z() * (1 - t) - q2.z() * t;
- resultscalar = q1.scalar() * (1 - t) - q2.scalar() * t;
- }
-
- QQuaternion q3 = QQuaternion(resultscalar, resultx, resulty, resultz).normalized();
-
- QVERIFY(fuzzyCompare(result.x(), q3.x()));
- QVERIFY(fuzzyCompare(result.y(), q3.y()));
- QVERIFY(fuzzyCompare(result.z(), q3.z()));
- QVERIFY(fuzzyCompare(result.scalar(), q3.scalar()));
-}
-
-class tst_QQuaternionProperties : public QObject
-{
- Q_OBJECT
- Q_PROPERTY(QQuaternion quaternion READ quaternion WRITE setQuaternion)
-public:
- tst_QQuaternionProperties(QObject *parent = 0) : QObject(parent) {}
-
- QQuaternion quaternion() const { return q; }
- void setQuaternion(const QQuaternion& value) { q = value; }
-
-private:
- QQuaternion q;
-};
-
-// Test getting and setting quaternion properties via the metaobject system.
-void tst_QQuaternion::properties()
-{
- tst_QQuaternionProperties obj;
-
- obj.setQuaternion(QQuaternion(6.0f, 7.0f, 8.0f, 9.0f));
-
- QQuaternion q = qVariantValue<QQuaternion>(obj.property("quaternion"));
- QCOMPARE(q.scalar(), (qreal)6.0f);
- QCOMPARE(q.x(), (qreal)7.0f);
- QCOMPARE(q.y(), (qreal)8.0f);
- QCOMPARE(q.z(), (qreal)9.0f);
-
- obj.setProperty("quaternion",
- qVariantFromValue(QQuaternion(-6.0f, -7.0f, -8.0f, -9.0f)));
-
- q = qVariantValue<QQuaternion>(obj.property("quaternion"));
- QCOMPARE(q.scalar(), (qreal)-6.0f);
- QCOMPARE(q.x(), (qreal)-7.0f);
- QCOMPARE(q.y(), (qreal)-8.0f);
- QCOMPARE(q.z(), (qreal)-9.0f);
-}
-
-void tst_QQuaternion::metaTypes()
-{
- QVERIFY(QMetaType::type("QQuaternion") == QMetaType::QQuaternion);
-
- QCOMPARE(QByteArray(QMetaType::typeName(QMetaType::QQuaternion)),
- QByteArray("QQuaternion"));
-
- QVERIFY(QMetaType::isRegistered(QMetaType::QQuaternion));
-
- QVERIFY(qMetaTypeId<QQuaternion>() == QMetaType::QQuaternion);
-}
-
-QTEST_APPLESS_MAIN(tst_QQuaternion)
-
-#include "tst_qquaternion.moc"
diff --git a/tests/auto/math3d/qvectornd/qvectornd.pro b/tests/auto/math3d/qvectornd/qvectornd.pro
deleted file mode 100644
index 0981637..0000000
--- a/tests/auto/math3d/qvectornd/qvectornd.pro
+++ /dev/null
@@ -1,5 +0,0 @@
-load(qttest_p4)
-VPATH += ../shared
-INCLUDEPATH += ../shared
-HEADERS += math3dincludes.h
-SOURCES += tst_qvectornd.cpp
diff --git a/tests/auto/math3d/qvectornd/tst_qvectornd.cpp b/tests/auto/math3d/qvectornd/tst_qvectornd.cpp
deleted file mode 100644
index cfcce8e..0000000
--- a/tests/auto/math3d/qvectornd/tst_qvectornd.cpp
+++ /dev/null
@@ -1,2141 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the test suite of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at http://qt.nokia.com/contact.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <QtTest/QtTest>
-#include <QtCore/qmath.h>
-#include "math3dincludes.h"
-
-class tst_QVector : public QObject
-{
- Q_OBJECT
-public:
- tst_QVector() {}
- ~tst_QVector() {}
-
-private slots:
- void create2();
- void create3();
- void create4();
-
- void length2_data();
- void length2();
- void length3_data();
- void length3();
- void length4_data();
- void length4();
-
- void normalized2_data();
- void normalized2();
- void normalized3_data();
- void normalized3();
- void normalized4_data();
- void normalized4();
-
- void normalize2_data();
- void normalize2();
- void normalize3_data();
- void normalize3();
- void normalize4_data();
- void normalize4();
-
- void compare2();
- void compare3();
- void compare4();
-
- void add2_data();
- void add2();
- void add3_data();
- void add3();
- void add4_data();
- void add4();
-
- void subtract2_data();
- void subtract2();
- void subtract3_data();
- void subtract3();
- void subtract4_data();
- void subtract4();
-
- void multiply2_data();
- void multiply2();
- void multiply3_data();
- void multiply3();
- void multiply4_data();
- void multiply4();
-
- void multiplyFactor2_data();
- void multiplyFactor2();
- void multiplyFactor3_data();
- void multiplyFactor3();
- void multiplyFactor4_data();
- void multiplyFactor4();
-
- void divide2_data();
- void divide2();
- void divide3_data();
- void divide3();
- void divide4_data();
- void divide4();
-
- void negate2_data();
- void negate2();
- void negate3_data();
- void negate3();
- void negate4_data();
- void negate4();
-
- void crossProduct_data();
- void crossProduct();
- void normal_data();
- void normal();
- void distanceToPlane_data();
- void distanceToPlane();
- void distanceToLine_data();
- void distanceToLine();
-
- void dotProduct2_data();
- void dotProduct2();
- void dotProduct3_data();
- void dotProduct3();
- void dotProduct4_data();
- void dotProduct4();
-
- void properties();
- void metaTypes();
-};
-
-// qFuzzyCompare isn't always "fuzzy" enough to handle conversion
-// between float, double, and qreal. So create "fuzzier" compares.
-static bool fuzzyCompare(float x, float y)
-{
- float diff = x - y;
- if (diff < 0.0f)
- diff = -diff;
- return (diff < 0.001);
-}
-
-// Test the creation of QVector2D objects in various ways:
-// construct, copy, and modify.
-void tst_QVector::create2()
-{
- QVector2D null;
- QCOMPARE(null.x(), (qreal)0.0f);
- QCOMPARE(null.y(), (qreal)0.0f);
- QVERIFY(null.isNull());
-
- QVector2D v1(1.0f, 2.5f);
- QCOMPARE(v1.x(), (qreal)1.0f);
- QCOMPARE(v1.y(), (qreal)2.5f);
- QVERIFY(!v1.isNull());
-
- QVector2D v1i(1, 2);
- QCOMPARE(v1i.x(), (qreal)1.0f);
- QCOMPARE(v1i.y(), (qreal)2.0f);
- QVERIFY(!v1i.isNull());
-
- QVector2D v2(v1);
- QCOMPARE(v2.x(), (qreal)1.0f);
- QCOMPARE(v2.y(), (qreal)2.5f);
- QVERIFY(!v2.isNull());
-
- QVector2D v4;
- QCOMPARE(v4.x(), (qreal)0.0f);
- QCOMPARE(v4.y(), (qreal)0.0f);
- QVERIFY(v4.isNull());
- v4 = v1;
- QCOMPARE(v4.x(), (qreal)1.0f);
- QCOMPARE(v4.y(), (qreal)2.5f);
- QVERIFY(!v4.isNull());
-
- QVector2D v5(QPoint(1, 2));
- QCOMPARE(v5.x(), (qreal)1.0f);
- QCOMPARE(v5.y(), (qreal)2.0f);
- QVERIFY(!v5.isNull());
-
- QVector2D v6(QPointF(1, 2.5));
- QCOMPARE(v6.x(), (qreal)1.0f);
- QCOMPARE(v6.y(), (qreal)2.5f);
- QVERIFY(!v6.isNull());
-
- QVector2D v7(QVector3D(1.0f, 2.5f, 54.25f));
- QCOMPARE(v7.x(), (qreal)1.0f);
- QCOMPARE(v7.y(), (qreal)2.5f);
- QVERIFY(!v6.isNull());
-
- QVector2D v8(QVector4D(1.0f, 2.5f, 54.25f, 34.0f));
- QCOMPARE(v8.x(), (qreal)1.0f);
- QCOMPARE(v8.y(), (qreal)2.5f);
- QVERIFY(!v6.isNull());
-
- v1.setX(3.0f);
- QCOMPARE(v1.x(), (qreal)3.0f);
- QCOMPARE(v1.y(), (qreal)2.5f);
- QVERIFY(!v1.isNull());
-
- v1.setY(10.5f);
- QCOMPARE(v1.x(), (qreal)3.0f);
- QCOMPARE(v1.y(), (qreal)10.5f);
- QVERIFY(!v1.isNull());
-
- v1.setX(0.0f);
- v1.setY(0.0f);
- QCOMPARE(v1.x(), (qreal)0.0f);
- QCOMPARE(v1.y(), (qreal)0.0f);
- QVERIFY(v1.isNull());
-
- QPoint p1 = v8.toPoint();
- QCOMPARE(p1.x(), 1);
- QCOMPARE(p1.y(), 3);
-
- QPointF p2 = v8.toPointF();
- QCOMPARE((qreal)p2.x(), (qreal)1.0f);
- QCOMPARE((qreal)p2.y(), (qreal)2.5f);
-
- QVector3D v9 = v8.toVector3D();
- QCOMPARE(v9.x(), (qreal)1.0f);
- QCOMPARE(v9.y(), (qreal)2.5f);
- QCOMPARE(v9.z(), (qreal)0.0f);
-
- QVector4D v10 = v8.toVector4D();
- QCOMPARE(v10.x(), (qreal)1.0f);
- QCOMPARE(v10.y(), (qreal)2.5f);
- QCOMPARE(v10.z(), (qreal)0.0f);
- QCOMPARE(v10.w(), (qreal)0.0f);
-}
-
-// Test the creation of QVector3D objects in various ways:
-// construct, copy, and modify.
-void tst_QVector::create3()
-{
- QVector3D null;
- QCOMPARE(null.x(), (qreal)0.0f);
- QCOMPARE(null.y(), (qreal)0.0f);
- QCOMPARE(null.z(), (qreal)0.0f);
- QVERIFY(null.isNull());
-
- QVector3D v1(1.0f, 2.5f, -89.25f);
- QCOMPARE(v1.x(), (qreal)1.0f);
- QCOMPARE(v1.y(), (qreal)2.5f);
- QCOMPARE(v1.z(), (qreal)-89.25f);
- QVERIFY(!v1.isNull());
-
- QVector3D v1i(1, 2, -89);
- QCOMPARE(v1i.x(), (qreal)1.0f);
- QCOMPARE(v1i.y(), (qreal)2.0f);
- QCOMPARE(v1i.z(), (qreal)-89.0f);
- QVERIFY(!v1i.isNull());
-
- QVector3D v2(v1);
- QCOMPARE(v2.x(), (qreal)1.0f);
- QCOMPARE(v2.y(), (qreal)2.5f);
- QCOMPARE(v2.z(), (qreal)-89.25f);
- QVERIFY(!v2.isNull());
-
- QVector3D v3(1.0f, 2.5f, 0.0f);
- QCOMPARE(v3.x(), (qreal)1.0f);
- QCOMPARE(v3.y(), (qreal)2.5f);
- QCOMPARE(v3.z(), (qreal)0.0f);
- QVERIFY(!v3.isNull());
-
- QVector3D v3i(1, 2, 0);
- QCOMPARE(v3i.x(), (qreal)1.0f);
- QCOMPARE(v3i.y(), (qreal)2.0f);
- QCOMPARE(v3i.z(), (qreal)0.0f);
- QVERIFY(!v3i.isNull());
-
- QVector3D v4;
- QCOMPARE(v4.x(), (qreal)0.0f);
- QCOMPARE(v4.y(), (qreal)0.0f);
- QCOMPARE(v4.z(), (qreal)0.0f);
- QVERIFY(v4.isNull());
- v4 = v1;
- QCOMPARE(v4.x(), (qreal)1.0f);
- QCOMPARE(v4.y(), (qreal)2.5f);
- QCOMPARE(v4.z(), (qreal)-89.25f);
- QVERIFY(!v4.isNull());
-
- QVector3D v5(QPoint(1, 2));
- QCOMPARE(v5.x(), (qreal)1.0f);
- QCOMPARE(v5.y(), (qreal)2.0f);
- QCOMPARE(v5.z(), (qreal)0.0f);
- QVERIFY(!v5.isNull());
-
- QVector3D v6(QPointF(1, 2.5));
- QCOMPARE(v6.x(), (qreal)1.0f);
- QCOMPARE(v6.y(), (qreal)2.5f);
- QCOMPARE(v6.z(), (qreal)0.0f);
- QVERIFY(!v6.isNull());
-
- QVector3D v7(QVector2D(1.0f, 2.5f));
- QCOMPARE(v7.x(), (qreal)1.0f);
- QCOMPARE(v7.y(), (qreal)2.5f);
- QCOMPARE(v7.z(), (qreal)0.0f);
- QVERIFY(!v7.isNull());
-
- QVector3D v8(QVector2D(1.0f, 2.5f), 54.25f);
- QCOMPARE(v8.x(), (qreal)1.0f);
- QCOMPARE(v8.y(), (qreal)2.5f);
- QCOMPARE(v8.z(), (qreal)54.25f);
- QVERIFY(!v8.isNull());
-
- QVector3D v9(QVector4D(1.0f, 2.5f, 54.25f, 34.0f));
- QCOMPARE(v9.x(), (qreal)1.0f);
- QCOMPARE(v9.y(), (qreal)2.5f);
- QCOMPARE(v9.z(), (qreal)54.25f);
- QVERIFY(!v9.isNull());
-
- v1.setX(3.0f);
- QCOMPARE(v1.x(), (qreal)3.0f);
- QCOMPARE(v1.y(), (qreal)2.5f);
- QCOMPARE(v1.z(), (qreal)-89.25f);
- QVERIFY(!v1.isNull());
-
- v1.setY(10.5f);
- QCOMPARE(v1.x(), (qreal)3.0f);
- QCOMPARE(v1.y(), (qreal)10.5f);
- QCOMPARE(v1.z(), (qreal)-89.25f);
- QVERIFY(!v1.isNull());
-
- v1.setZ(15.5f);
- QCOMPARE(v1.x(), (qreal)3.0f);
- QCOMPARE(v1.y(), (qreal)10.5f);
- QCOMPARE(v1.z(), (qreal)15.5f);
- QVERIFY(!v1.isNull());
-
- v1.setX(0.0f);
- v1.setY(0.0f);
- v1.setZ(0.0f);
- QCOMPARE(v1.x(), (qreal)0.0f);
- QCOMPARE(v1.y(), (qreal)0.0f);
- QCOMPARE(v1.z(), (qreal)0.0f);
- QVERIFY(v1.isNull());
-
- QPoint p1 = v8.toPoint();
- QCOMPARE(p1.x(), 1);
- QCOMPARE(p1.y(), 3);
-
- QPointF p2 = v8.toPointF();
- QCOMPARE((qreal)p2.x(), (qreal)1.0f);
- QCOMPARE((qreal)p2.y(), (qreal)2.5f);
-
- QVector2D v10 = v8.toVector2D();
- QCOMPARE(v10.x(), (qreal)1.0f);
- QCOMPARE(v10.y(), (qreal)2.5f);
-
- QVector4D v11 = v8.toVector4D();
- QCOMPARE(v11.x(), (qreal)1.0f);
- QCOMPARE(v11.y(), (qreal)2.5f);
- QCOMPARE(v11.z(), (qreal)54.25f);
- QCOMPARE(v11.w(), (qreal)0.0f);
-}
-
-// Test the creation of QVector4D objects in various ways:
-// construct, copy, and modify.
-void tst_QVector::create4()
-{
- QVector4D null;
- QCOMPARE(null.x(), (qreal)0.0f);
- QCOMPARE(null.y(), (qreal)0.0f);
- QCOMPARE(null.z(), (qreal)0.0f);
- QCOMPARE(null.w(), (qreal)0.0f);
- QVERIFY(null.isNull());
-
- QVector4D v1(1.0f, 2.5f, -89.25f, 34.0f);
- QCOMPARE(v1.x(), (qreal)1.0f);
- QCOMPARE(v1.y(), (qreal)2.5f);
- QCOMPARE(v1.z(), (qreal)-89.25f);
- QCOMPARE(v1.w(), (qreal)34.0f);
- QVERIFY(!v1.isNull());
-
- QVector4D v1i(1, 2, -89, 34);
- QCOMPARE(v1i.x(), (qreal)1.0f);
- QCOMPARE(v1i.y(), (qreal)2.0f);
- QCOMPARE(v1i.z(), (qreal)-89.0f);
- QCOMPARE(v1i.w(), (qreal)34.0f);
- QVERIFY(!v1i.isNull());
-
- QVector4D v2(v1);
- QCOMPARE(v2.x(), (qreal)1.0f);
- QCOMPARE(v2.y(), (qreal)2.5f);
- QCOMPARE(v2.z(), (qreal)-89.25f);
- QCOMPARE(v2.w(), (qreal)34.0f);
- QVERIFY(!v2.isNull());
-
- QVector4D v3(1.0f, 2.5f, 0.0f, 0.0f);
- QCOMPARE(v3.x(), (qreal)1.0f);
- QCOMPARE(v3.y(), (qreal)2.5f);
- QCOMPARE(v3.z(), (qreal)0.0f);
- QCOMPARE(v3.w(), (qreal)0.0f);
- QVERIFY(!v3.isNull());
-
- QVector4D v3i(1, 2, 0, 0);
- QCOMPARE(v3i.x(), (qreal)1.0f);
- QCOMPARE(v3i.y(), (qreal)2.0f);
- QCOMPARE(v3i.z(), (qreal)0.0f);
- QCOMPARE(v3i.w(), (qreal)0.0f);
- QVERIFY(!v3i.isNull());
-
- QVector4D v3b(1.0f, 2.5f, -89.25f, 0.0f);
- QCOMPARE(v3b.x(), (qreal)1.0f);
- QCOMPARE(v3b.y(), (qreal)2.5f);
- QCOMPARE(v3b.z(), (qreal)-89.25f);
- QCOMPARE(v3b.w(), (qreal)0.0f);
- QVERIFY(!v3b.isNull());
-
- QVector4D v3bi(1, 2, -89, 0);
- QCOMPARE(v3bi.x(), (qreal)1.0f);
- QCOMPARE(v3bi.y(), (qreal)2.0f);
- QCOMPARE(v3bi.z(), (qreal)-89.0f);
- QCOMPARE(v3bi.w(), (qreal)0.0f);
- QVERIFY(!v3bi.isNull());
-
- QVector4D v4;
- QCOMPARE(v4.x(), (qreal)0.0f);
- QCOMPARE(v4.y(), (qreal)0.0f);
- QCOMPARE(v4.z(), (qreal)0.0f);
- QCOMPARE(v4.w(), (qreal)0.0f);
- QVERIFY(v4.isNull());
- v4 = v1;
- QCOMPARE(v4.x(), (qreal)1.0f);
- QCOMPARE(v4.y(), (qreal)2.5f);
- QCOMPARE(v4.z(), (qreal)-89.25f);
- QCOMPARE(v4.w(), (qreal)34.0f);
- QVERIFY(!v4.isNull());
-
- QVector4D v5(QPoint(1, 2));
- QCOMPARE(v5.x(), (qreal)1.0f);
- QCOMPARE(v5.y(), (qreal)2.0f);
- QCOMPARE(v5.z(), (qreal)0.0f);
- QCOMPARE(v5.w(), (qreal)0.0f);
- QVERIFY(!v5.isNull());
-
- QVector4D v6(QPointF(1, 2.5));
- QCOMPARE(v6.x(), (qreal)1.0f);
- QCOMPARE(v6.y(), (qreal)2.5f);
- QCOMPARE(v6.z(), (qreal)0.0f);
- QCOMPARE(v6.w(), (qreal)0.0f);
- QVERIFY(!v6.isNull());
-
- QVector4D v7(QVector2D(1.0f, 2.5f));
- QCOMPARE(v7.x(), (qreal)1.0f);
- QCOMPARE(v7.y(), (qreal)2.5f);
- QCOMPARE(v7.z(), (qreal)0.0f);
- QCOMPARE(v7.w(), (qreal)0.0f);
- QVERIFY(!v7.isNull());
-
- QVector4D v8(QVector3D(1.0f, 2.5f, -89.25f));
- QCOMPARE(v8.x(), (qreal)1.0f);
- QCOMPARE(v8.y(), (qreal)2.5f);
- QCOMPARE(v8.z(), (qreal)-89.25f);
- QCOMPARE(v8.w(), (qreal)0.0f);
- QVERIFY(!v8.isNull());
-
- QVector4D v9(QVector3D(1.0f, 2.5f, -89.25f), 34);
- QCOMPARE(v9.x(), (qreal)1.0f);
- QCOMPARE(v9.y(), (qreal)2.5f);
- QCOMPARE(v9.z(), (qreal)-89.25f);
- QCOMPARE(v9.w(), (qreal)34.0f);
- QVERIFY(!v9.isNull());
-
- QVector4D v10(QVector2D(1.0f, 2.5f), 23.5f, -8);
- QCOMPARE(v10.x(), (qreal)1.0f);
- QCOMPARE(v10.y(), (qreal)2.5f);
- QCOMPARE(v10.z(), (qreal)23.5f);
- QCOMPARE(v10.w(), (qreal)-8.0f);
- QVERIFY(!v10.isNull());
-
- v1.setX(3.0f);
- QCOMPARE(v1.x(), (qreal)3.0f);
- QCOMPARE(v1.y(), (qreal)2.5f);
- QCOMPARE(v1.z(), (qreal)-89.25f);
- QCOMPARE(v1.w(), (qreal)34.0f);
- QVERIFY(!v1.isNull());
-
- v1.setY(10.5f);
- QCOMPARE(v1.x(), (qreal)3.0f);
- QCOMPARE(v1.y(), (qreal)10.5f);
- QCOMPARE(v1.z(), (qreal)-89.25f);
- QCOMPARE(v1.w(), (qreal)34.0f);
- QVERIFY(!v1.isNull());
-
- v1.setZ(15.5f);
- QCOMPARE(v1.x(), (qreal)3.0f);
- QCOMPARE(v1.y(), (qreal)10.5f);
- QCOMPARE(v1.z(), (qreal)15.5f);
- QCOMPARE(v1.w(), (qreal)34.0f);
- QVERIFY(!v1.isNull());
-
- v1.setW(6.0f);
- QCOMPARE(v1.x(), (qreal)3.0f);
- QCOMPARE(v1.y(), (qreal)10.5f);
- QCOMPARE(v1.z(), (qreal)15.5f);
- QCOMPARE(v1.w(), (qreal)6.0f);
- QVERIFY(!v1.isNull());
-
- v1.setX(0.0f);
- v1.setY(0.0f);
- v1.setZ(0.0f);
- v1.setW(0.0f);
- QCOMPARE(v1.x(), (qreal)0.0f);
- QCOMPARE(v1.y(), (qreal)0.0f);
- QCOMPARE(v1.z(), (qreal)0.0f);
- QCOMPARE(v1.w(), (qreal)0.0f);
- QVERIFY(v1.isNull());
-
- QPoint p1 = v8.toPoint();
- QCOMPARE(p1.x(), 1);
- QCOMPARE(p1.y(), 3);
-
- QPointF p2 = v8.toPointF();
- QCOMPARE((qreal)p2.x(), (qreal)1.0f);
- QCOMPARE((qreal)p2.y(), (qreal)2.5f);
-
- QVector2D v11 = v8.toVector2D();
- QCOMPARE(v11.x(), (qreal)1.0f);
- QCOMPARE(v11.y(), (qreal)2.5f);
-
- QVector3D v12 = v8.toVector3D();
- QCOMPARE(v12.x(), (qreal)1.0f);
- QCOMPARE(v12.y(), (qreal)2.5f);
- QCOMPARE(v12.z(), (qreal)-89.25f);
-
- QVector2D v13 = v9.toVector2DAffine();
- QVERIFY(fuzzyCompare(v13.x(), (qreal)(1.0f / 34.0f)));
- QVERIFY(fuzzyCompare(v13.y(), (qreal)(2.5f / 34.0f)));
-
- QVector4D zerow(1.0f, 2.0f, 3.0f, 0.0f);
- v13 = zerow.toVector2DAffine();
- QVERIFY(v13.isNull());
-
- QVector3D v14 = v9.toVector3DAffine();
- QVERIFY(fuzzyCompare(v14.x(), (qreal)(1.0f / 34.0f)));
- QVERIFY(fuzzyCompare(v14.y(), (qreal)(2.5f / 34.0f)));
- QVERIFY(fuzzyCompare(v14.z(), (qreal)(-89.25f / 34.0f)));
-
- v14 = zerow.toVector3DAffine();
- QVERIFY(v14.isNull());
-}
-
-// Test vector length computation for 2D vectors.
-void tst_QVector::length2_data()
-{
- QTest::addColumn<qreal>("x");
- QTest::addColumn<qreal>("y");
- QTest::addColumn<qreal>("len");
-
- QTest::newRow("null") << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f;
- QTest::newRow("1x") << (qreal)1.0f << (qreal)0.0f << (qreal)1.0f;
- QTest::newRow("1y") << (qreal)0.0f << (qreal)1.0f << (qreal)1.0f;
- QTest::newRow("-1x") << (qreal)-1.0f << (qreal)0.0f << (qreal)1.0f;
- QTest::newRow("-1y") << (qreal)0.0f << (qreal)-1.0f << (qreal)1.0f;
- QTest::newRow("two") << (qreal)2.0f << (qreal)-2.0f << (qreal)qSqrt(8.0f);
-}
-void tst_QVector::length2()
-{
- QFETCH(qreal, x);
- QFETCH(qreal, y);
- QFETCH(qreal, len);
-
- QVector2D v(x, y);
- QCOMPARE((float)(v.length()), (float)len);
- QCOMPARE((float)(v.lengthSquared()), (float)(x * x + y * y));
-}
-
-// Test vector length computation for 3D vectors.
-void tst_QVector::length3_data()
-{
- QTest::addColumn<qreal>("x");
- QTest::addColumn<qreal>("y");
- QTest::addColumn<qreal>("z");
- QTest::addColumn<qreal>("len");
-
- QTest::newRow("null") << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f;
- QTest::newRow("1x") << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f;
- QTest::newRow("1y") << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f << (qreal)1.0f;
- QTest::newRow("1z") << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f << (qreal)1.0f;
- QTest::newRow("-1x") << (qreal)-1.0f << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f;
- QTest::newRow("-1y") << (qreal)0.0f << (qreal)-1.0f << (qreal)0.0f << (qreal)1.0f;
- QTest::newRow("-1z") << (qreal)0.0f << (qreal)0.0f << (qreal)-1.0f << (qreal)1.0f;
- QTest::newRow("two") << (qreal)2.0f << (qreal)-2.0f << (qreal)2.0f << (qreal)qSqrt(12.0f);
-}
-void tst_QVector::length3()
-{
- QFETCH(qreal, x);
- QFETCH(qreal, y);
- QFETCH(qreal, z);
- QFETCH(qreal, len);
-
- QVector3D v(x, y, z);
- QCOMPARE((float)(v.length()), (float)len);
- QCOMPARE((float)(v.lengthSquared()), (float)(x * x + y * y + z * z));
-}
-
-// Test vector length computation for 4D vectors.
-void tst_QVector::length4_data()
-{
- QTest::addColumn<qreal>("x");
- QTest::addColumn<qreal>("y");
- QTest::addColumn<qreal>("z");
- QTest::addColumn<qreal>("w");
- QTest::addColumn<qreal>("len");
-
- QTest::newRow("null") << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f;
- QTest::newRow("1x") << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f;
- QTest::newRow("1y") << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f;
- QTest::newRow("1z") << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f << (qreal)1.0f;
- QTest::newRow("1w") << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f << (qreal)1.0f;
- QTest::newRow("-1x") << (qreal)-1.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f;
- QTest::newRow("-1y") << (qreal)0.0f << (qreal)-1.0f << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f;
- QTest::newRow("-1z") << (qreal)0.0f << (qreal)0.0f << (qreal)-1.0f << (qreal)0.0f << (qreal)1.0f;
- QTest::newRow("-1w") << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)-1.0f << (qreal)1.0f;
- QTest::newRow("two") << (qreal)2.0f << (qreal)-2.0f << (qreal)2.0f << (qreal)2.0f << (qreal)qSqrt(16.0f);
-}
-void tst_QVector::length4()
-{
- QFETCH(qreal, x);
- QFETCH(qreal, y);
- QFETCH(qreal, z);
- QFETCH(qreal, w);
- QFETCH(qreal, len);
-
- QVector4D v(x, y, z, w);
- QCOMPARE((float)(v.length()), (float)len);
- QCOMPARE((float)(v.lengthSquared()), (float)(x * x + y * y + z * z + w * w));
-}
-
-// Test the unit vector conversion for 2D vectors.
-void tst_QVector::normalized2_data()
-{
- // Use the same test data as the length test.
- length2_data();
-}
-void tst_QVector::normalized2()
-{
- QFETCH(qreal, x);
- QFETCH(qreal, y);
- QFETCH(qreal, len);
-
- QVector2D v(x, y);
- QVector2D u = v.normalized();
- if (v.isNull())
- QVERIFY(u.isNull());
- else
- QCOMPARE((float)(u.length()), (float)1.0f);
- QCOMPARE((float)(u.x() * len), (float)(v.x()));
- QCOMPARE((float)(u.y() * len), (float)(v.y()));
-}
-
-// Test the unit vector conversion for 3D vectors.
-void tst_QVector::normalized3_data()
-{
- // Use the same test data as the length test.
- length3_data();
-}
-void tst_QVector::normalized3()
-{
- QFETCH(qreal, x);
- QFETCH(qreal, y);
- QFETCH(qreal, z);
- QFETCH(qreal, len);
-
- QVector3D v(x, y, z);
- QVector3D u = v.normalized();
- if (v.isNull())
- QVERIFY(u.isNull());
- else
- QCOMPARE((float)(u.length()), (float)1.0f);
- QCOMPARE((float)(u.x() * len), (float)(v.x()));
- QCOMPARE((float)(u.y() * len), (float)(v.y()));
- QCOMPARE((float)(u.z() * len), (float)(v.z()));
-}
-
-// Test the unit vector conversion for 4D vectors.
-void tst_QVector::normalized4_data()
-{
- // Use the same test data as the length test.
- length4_data();
-}
-void tst_QVector::normalized4()
-{
- QFETCH(qreal, x);
- QFETCH(qreal, y);
- QFETCH(qreal, z);
- QFETCH(qreal, w);
- QFETCH(qreal, len);
-
- QVector4D v(x, y, z, w);
- QVector4D u = v.normalized();
- if (v.isNull())
- QVERIFY(u.isNull());
- else
- QCOMPARE((float)(u.length()), (float)1.0f);
- QCOMPARE((float)(u.x() * len), (float)(v.x()));
- QCOMPARE((float)(u.y() * len), (float)(v.y()));
- QCOMPARE((float)(u.z() * len), (float)(v.z()));
- QCOMPARE((float)(u.w() * len), (float)(v.w()));
-}
-
-// Test the unit vector conversion for 2D vectors.
-void tst_QVector::normalize2_data()
-{
- // Use the same test data as the length test.
- length2_data();
-}
-void tst_QVector::normalize2()
-{
- QFETCH(qreal, x);
- QFETCH(qreal, y);
-
- QVector2D v(x, y);
- bool isNull = v.isNull();
- v.normalize();
- if (isNull)
- QVERIFY(v.isNull());
- else
- QCOMPARE((float)(v.length()), (float)1.0f);
-}
-
-// Test the unit vector conversion for 3D vectors.
-void tst_QVector::normalize3_data()
-{
- // Use the same test data as the length test.
- length3_data();
-}
-void tst_QVector::normalize3()
-{
- QFETCH(qreal, x);
- QFETCH(qreal, y);
- QFETCH(qreal, z);
-
- QVector3D v(x, y, z);
- bool isNull = v.isNull();
- v.normalize();
- if (isNull)
- QVERIFY(v.isNull());
- else
- QCOMPARE((float)(v.length()), (float)1.0f);
-}
-
-// Test the unit vector conversion for 4D vectors.
-void tst_QVector::normalize4_data()
-{
- // Use the same test data as the length test.
- length4_data();
-}
-void tst_QVector::normalize4()
-{
- QFETCH(qreal, x);
- QFETCH(qreal, y);
- QFETCH(qreal, z);
- QFETCH(qreal, w);
-
- QVector4D v(x, y, z, w);
- bool isNull = v.isNull();
- v.normalize();
- if (isNull)
- QVERIFY(v.isNull());
- else
- QCOMPARE((float)(v.length()), (float)1.0f);
-}
-
-// Test the comparison operators for 2D vectors.
-void tst_QVector::compare2()
-{
- QVector2D v1(1, 2);
- QVector2D v2(1, 2);
- QVector2D v3(3, 2);
- QVector2D v4(1, 3);
-
- QVERIFY(v1 == v2);
- QVERIFY(v1 != v3);
- QVERIFY(v1 != v4);
-}
-
-// Test the comparison operators for 3D vectors.
-void tst_QVector::compare3()
-{
- QVector3D v1(1, 2, 4);
- QVector3D v2(1, 2, 4);
- QVector3D v3(3, 2, 4);
- QVector3D v4(1, 3, 4);
- QVector3D v5(1, 2, 3);
-
- QVERIFY(v1 == v2);
- QVERIFY(v1 != v3);
- QVERIFY(v1 != v4);
- QVERIFY(v1 != v5);
-}
-
-// Test the comparison operators for 4D vectors.
-void tst_QVector::compare4()
-{
- QVector4D v1(1, 2, 4, 8);
- QVector4D v2(1, 2, 4, 8);
- QVector4D v3(3, 2, 4, 8);
- QVector4D v4(1, 3, 4, 8);
- QVector4D v5(1, 2, 3, 8);
- QVector4D v6(1, 2, 4, 3);
-
- QVERIFY(v1 == v2);
- QVERIFY(v1 != v3);
- QVERIFY(v1 != v4);
- QVERIFY(v1 != v5);
- QVERIFY(v1 != v6);
-}
-
-// Test vector addition for 2D vectors.
-void tst_QVector::add2_data()
-{
- QTest::addColumn<qreal>("x1");
- QTest::addColumn<qreal>("y1");
- QTest::addColumn<qreal>("x2");
- QTest::addColumn<qreal>("y2");
- QTest::addColumn<qreal>("x3");
- QTest::addColumn<qreal>("y3");
-
- QTest::newRow("null")
- << (qreal)0.0f << (qreal)0.0f
- << (qreal)0.0f << (qreal)0.0f
- << (qreal)0.0f << (qreal)0.0f;
-
- QTest::newRow("xonly")
- << (qreal)1.0f << (qreal)0.0f
- << (qreal)2.0f << (qreal)0.0f
- << (qreal)3.0f << (qreal)0.0f;
-
- QTest::newRow("yonly")
- << (qreal)0.0f << (qreal)1.0f
- << (qreal)0.0f << (qreal)2.0f
- << (qreal)0.0f << (qreal)3.0f;
-
- QTest::newRow("all")
- << (qreal)1.0f << (qreal)2.0f
- << (qreal)4.0f << (qreal)5.0f
- << (qreal)5.0f << (qreal)7.0f;
-}
-void tst_QVector::add2()
-{
- QFETCH(qreal, x1);
- QFETCH(qreal, y1);
- QFETCH(qreal, x2);
- QFETCH(qreal, y2);
- QFETCH(qreal, x3);
- QFETCH(qreal, y3);
-
- QVector2D v1(x1, y1);
- QVector2D v2(x2, y2);
- QVector2D v3(x3, y3);
-
- QVERIFY((v1 + v2) == v3);
-
- QVector2D v4(v1);
- v4 += v2;
- QVERIFY(v4 == v3);
-
- QCOMPARE(v4.x(), v1.x() + v2.x());
- QCOMPARE(v4.y(), v1.y() + v2.y());
-}
-
-// Test vector addition for 3D vectors.
-void tst_QVector::add3_data()
-{
- QTest::addColumn<qreal>("x1");
- QTest::addColumn<qreal>("y1");
- QTest::addColumn<qreal>("z1");
- QTest::addColumn<qreal>("x2");
- QTest::addColumn<qreal>("y2");
- QTest::addColumn<qreal>("z2");
- QTest::addColumn<qreal>("x3");
- QTest::addColumn<qreal>("y3");
- QTest::addColumn<qreal>("z3");
-
- QTest::newRow("null")
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f;
-
- QTest::newRow("xonly")
- << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f
- << (qreal)2.0f << (qreal)0.0f << (qreal)0.0f
- << (qreal)3.0f << (qreal)0.0f << (qreal)0.0f;
-
- QTest::newRow("yonly")
- << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f
- << (qreal)0.0f << (qreal)2.0f << (qreal)0.0f
- << (qreal)0.0f << (qreal)3.0f << (qreal)0.0f;
-
- QTest::newRow("zonly")
- << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f
- << (qreal)0.0f << (qreal)0.0f << (qreal)2.0f
- << (qreal)0.0f << (qreal)0.0f << (qreal)3.0f;
-
- QTest::newRow("all")
- << (qreal)1.0f << (qreal)2.0f << (qreal)3.0f
- << (qreal)4.0f << (qreal)5.0f << (qreal)-6.0f
- << (qreal)5.0f << (qreal)7.0f << (qreal)-3.0f;
-}
-void tst_QVector::add3()
-{
- QFETCH(qreal, x1);
- QFETCH(qreal, y1);
- QFETCH(qreal, z1);
- QFETCH(qreal, x2);
- QFETCH(qreal, y2);
- QFETCH(qreal, z2);
- QFETCH(qreal, x3);
- QFETCH(qreal, y3);
- QFETCH(qreal, z3);
-
- QVector3D v1(x1, y1, z1);
- QVector3D v2(x2, y2, z2);
- QVector3D v3(x3, y3, z3);
-
- QVERIFY((v1 + v2) == v3);
-
- QVector3D v4(v1);
- v4 += v2;
- QVERIFY(v4 == v3);
-
- QCOMPARE(v4.x(), v1.x() + v2.x());
- QCOMPARE(v4.y(), v1.y() + v2.y());
- QCOMPARE(v4.z(), v1.z() + v2.z());
-}
-
-// Test vector addition for 4D vectors.
-void tst_QVector::add4_data()
-{
- QTest::addColumn<qreal>("x1");
- QTest::addColumn<qreal>("y1");
- QTest::addColumn<qreal>("z1");
- QTest::addColumn<qreal>("w1");
- QTest::addColumn<qreal>("x2");
- QTest::addColumn<qreal>("y2");
- QTest::addColumn<qreal>("z2");
- QTest::addColumn<qreal>("w2");
- QTest::addColumn<qreal>("x3");
- QTest::addColumn<qreal>("y3");
- QTest::addColumn<qreal>("z3");
- QTest::addColumn<qreal>("w3");
-
- QTest::newRow("null")
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f;
-
- QTest::newRow("xonly")
- << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f
- << (qreal)2.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f
- << (qreal)3.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f;
-
- QTest::newRow("yonly")
- << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f
- << (qreal)0.0f << (qreal)2.0f << (qreal)0.0f << (qreal)0.0f
- << (qreal)0.0f << (qreal)3.0f << (qreal)0.0f << (qreal)0.0f;
-
- QTest::newRow("zonly")
- << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f
- << (qreal)0.0f << (qreal)0.0f << (qreal)2.0f << (qreal)0.0f
- << (qreal)0.0f << (qreal)0.0f << (qreal)3.0f << (qreal)0.0f;
-
- QTest::newRow("wonly")
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)2.0f
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)3.0f;
-
- QTest::newRow("all")
- << (qreal)1.0f << (qreal)2.0f << (qreal)3.0f << (qreal)8.0f
- << (qreal)4.0f << (qreal)5.0f << (qreal)-6.0f << (qreal)9.0f
- << (qreal)5.0f << (qreal)7.0f << (qreal)-3.0f << (qreal)17.0f;
-}
-void tst_QVector::add4()
-{
- QFETCH(qreal, x1);
- QFETCH(qreal, y1);
- QFETCH(qreal, z1);
- QFETCH(qreal, w1);
- QFETCH(qreal, x2);
- QFETCH(qreal, y2);
- QFETCH(qreal, z2);
- QFETCH(qreal, w2);
- QFETCH(qreal, x3);
- QFETCH(qreal, y3);
- QFETCH(qreal, z3);
- QFETCH(qreal, w3);
-
- QVector4D v1(x1, y1, z1, w1);
- QVector4D v2(x2, y2, z2, w2);
- QVector4D v3(x3, y3, z3, w3);
-
- QVERIFY((v1 + v2) == v3);
-
- QVector4D v4(v1);
- v4 += v2;
- QVERIFY(v4 == v3);
-
- QCOMPARE(v4.x(), v1.x() + v2.x());
- QCOMPARE(v4.y(), v1.y() + v2.y());
- QCOMPARE(v4.z(), v1.z() + v2.z());
- QCOMPARE(v4.w(), v1.w() + v2.w());
-}
-
-// Test vector subtraction for 2D vectors.
-void tst_QVector::subtract2_data()
-{
- // Use the same test data as the add test.
- add2_data();
-}
-void tst_QVector::subtract2()
-{
- QFETCH(qreal, x1);
- QFETCH(qreal, y1);
- QFETCH(qreal, x2);
- QFETCH(qreal, y2);
- QFETCH(qreal, x3);
- QFETCH(qreal, y3);
-
- QVector2D v1(x1, y1);
- QVector2D v2(x2, y2);
- QVector2D v3(x3, y3);
-
- QVERIFY((v3 - v1) == v2);
- QVERIFY((v3 - v2) == v1);
-
- QVector2D v4(v3);
- v4 -= v1;
- QVERIFY(v4 == v2);
-
- QCOMPARE(v4.x(), v3.x() - v1.x());
- QCOMPARE(v4.y(), v3.y() - v1.y());
-
- QVector2D v5(v3);
- v5 -= v2;
- QVERIFY(v5 == v1);
-
- QCOMPARE(v5.x(), v3.x() - v2.x());
- QCOMPARE(v5.y(), v3.y() - v2.y());
-}
-
-// Test vector subtraction for 3D vectors.
-void tst_QVector::subtract3_data()
-{
- // Use the same test data as the add test.
- add3_data();
-}
-void tst_QVector::subtract3()
-{
- QFETCH(qreal, x1);
- QFETCH(qreal, y1);
- QFETCH(qreal, z1);
- QFETCH(qreal, x2);
- QFETCH(qreal, y2);
- QFETCH(qreal, z2);
- QFETCH(qreal, x3);
- QFETCH(qreal, y3);
- QFETCH(qreal, z3);
-
- QVector3D v1(x1, y1, z1);
- QVector3D v2(x2, y2, z2);
- QVector3D v3(x3, y3, z3);
-
- QVERIFY((v3 - v1) == v2);
- QVERIFY((v3 - v2) == v1);
-
- QVector3D v4(v3);
- v4 -= v1;
- QVERIFY(v4 == v2);
-
- QCOMPARE(v4.x(), v3.x() - v1.x());
- QCOMPARE(v4.y(), v3.y() - v1.y());
- QCOMPARE(v4.z(), v3.z() - v1.z());
-
- QVector3D v5(v3);
- v5 -= v2;
- QVERIFY(v5 == v1);
-
- QCOMPARE(v5.x(), v3.x() - v2.x());
- QCOMPARE(v5.y(), v3.y() - v2.y());
- QCOMPARE(v5.z(), v3.z() - v2.z());
-}
-
-// Test vector subtraction for 4D vectors.
-void tst_QVector::subtract4_data()
-{
- // Use the same test data as the add test.
- add4_data();
-}
-void tst_QVector::subtract4()
-{
- QFETCH(qreal, x1);
- QFETCH(qreal, y1);
- QFETCH(qreal, z1);
- QFETCH(qreal, w1);
- QFETCH(qreal, x2);
- QFETCH(qreal, y2);
- QFETCH(qreal, z2);
- QFETCH(qreal, w2);
- QFETCH(qreal, x3);
- QFETCH(qreal, y3);
- QFETCH(qreal, z3);
- QFETCH(qreal, w3);
-
- QVector4D v1(x1, y1, z1, w1);
- QVector4D v2(x2, y2, z2, w2);
- QVector4D v3(x3, y3, z3, w3);
-
- QVERIFY((v3 - v1) == v2);
- QVERIFY((v3 - v2) == v1);
-
- QVector4D v4(v3);
- v4 -= v1;
- QVERIFY(v4 == v2);
-
- QCOMPARE(v4.x(), v3.x() - v1.x());
- QCOMPARE(v4.y(), v3.y() - v1.y());
- QCOMPARE(v4.z(), v3.z() - v1.z());
- QCOMPARE(v4.w(), v3.w() - v1.w());
-
- QVector4D v5(v3);
- v5 -= v2;
- QVERIFY(v5 == v1);
-
- QCOMPARE(v5.x(), v3.x() - v2.x());
- QCOMPARE(v5.y(), v3.y() - v2.y());
- QCOMPARE(v5.z(), v3.z() - v2.z());
- QCOMPARE(v5.w(), v3.w() - v2.w());
-}
-
-// Test component-wise vector multiplication for 2D vectors.
-void tst_QVector::multiply2_data()
-{
- QTest::addColumn<qreal>("x1");
- QTest::addColumn<qreal>("y1");
- QTest::addColumn<qreal>("x2");
- QTest::addColumn<qreal>("y2");
- QTest::addColumn<qreal>("x3");
- QTest::addColumn<qreal>("y3");
-
- QTest::newRow("null")
- << (qreal)0.0f << (qreal)0.0f
- << (qreal)0.0f << (qreal)0.0f
- << (qreal)0.0f << (qreal)0.0f;
-
- QTest::newRow("xonly")
- << (qreal)1.0f << (qreal)0.0f
- << (qreal)2.0f << (qreal)0.0f
- << (qreal)2.0f << (qreal)0.0f;
-
- QTest::newRow("yonly")
- << (qreal)0.0f << (qreal)1.0f
- << (qreal)0.0f << (qreal)2.0f
- << (qreal)0.0f << (qreal)2.0f;
-
- QTest::newRow("all")
- << (qreal)1.0f << (qreal)2.0f
- << (qreal)4.0f << (qreal)5.0f
- << (qreal)4.0f << (qreal)10.0f;
-}
-void tst_QVector::multiply2()
-{
- QFETCH(qreal, x1);
- QFETCH(qreal, y1);
- QFETCH(qreal, x2);
- QFETCH(qreal, y2);
- QFETCH(qreal, x3);
- QFETCH(qreal, y3);
-
- QVector2D v1(x1, y1);
- QVector2D v2(x2, y2);
- QVector2D v3(x3, y3);
-
- QVERIFY((v1 * v2) == v3);
-
- QVector2D v4(v1);
- v4 *= v2;
- QVERIFY(v4 == v3);
-
- QCOMPARE(v4.x(), v1.x() * v2.x());
- QCOMPARE(v4.y(), v1.y() * v2.y());
-}
-
-// Test component-wise vector multiplication for 3D vectors.
-void tst_QVector::multiply3_data()
-{
- QTest::addColumn<qreal>("x1");
- QTest::addColumn<qreal>("y1");
- QTest::addColumn<qreal>("z1");
- QTest::addColumn<qreal>("x2");
- QTest::addColumn<qreal>("y2");
- QTest::addColumn<qreal>("z2");
- QTest::addColumn<qreal>("x3");
- QTest::addColumn<qreal>("y3");
- QTest::addColumn<qreal>("z3");
-
- QTest::newRow("null")
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f;
-
- QTest::newRow("xonly")
- << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f
- << (qreal)2.0f << (qreal)0.0f << (qreal)0.0f
- << (qreal)2.0f << (qreal)0.0f << (qreal)0.0f;
-
- QTest::newRow("yonly")
- << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f
- << (qreal)0.0f << (qreal)2.0f << (qreal)0.0f
- << (qreal)0.0f << (qreal)2.0f << (qreal)0.0f;
-
- QTest::newRow("zonly")
- << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f
- << (qreal)0.0f << (qreal)0.0f << (qreal)2.0f
- << (qreal)0.0f << (qreal)0.0f << (qreal)2.0f;
-
- QTest::newRow("all")
- << (qreal)1.0f << (qreal)2.0f << (qreal)3.0f
- << (qreal)4.0f << (qreal)5.0f << (qreal)-6.0f
- << (qreal)4.0f << (qreal)10.0f << (qreal)-18.0f;
-}
-void tst_QVector::multiply3()
-{
- QFETCH(qreal, x1);
- QFETCH(qreal, y1);
- QFETCH(qreal, z1);
- QFETCH(qreal, x2);
- QFETCH(qreal, y2);
- QFETCH(qreal, z2);
- QFETCH(qreal, x3);
- QFETCH(qreal, y3);
- QFETCH(qreal, z3);
-
- QVector3D v1(x1, y1, z1);
- QVector3D v2(x2, y2, z2);
- QVector3D v3(x3, y3, z3);
-
- QVERIFY((v1 * v2) == v3);
-
- QVector3D v4(v1);
- v4 *= v2;
- QVERIFY(v4 == v3);
-
- QCOMPARE(v4.x(), v1.x() * v2.x());
- QCOMPARE(v4.y(), v1.y() * v2.y());
- QCOMPARE(v4.z(), v1.z() * v2.z());
-}
-
-// Test component-wise vector multiplication for 4D vectors.
-void tst_QVector::multiply4_data()
-{
- QTest::addColumn<qreal>("x1");
- QTest::addColumn<qreal>("y1");
- QTest::addColumn<qreal>("z1");
- QTest::addColumn<qreal>("w1");
- QTest::addColumn<qreal>("x2");
- QTest::addColumn<qreal>("y2");
- QTest::addColumn<qreal>("z2");
- QTest::addColumn<qreal>("w2");
- QTest::addColumn<qreal>("x3");
- QTest::addColumn<qreal>("y3");
- QTest::addColumn<qreal>("z3");
- QTest::addColumn<qreal>("w3");
-
- QTest::newRow("null")
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f;
-
- QTest::newRow("xonly")
- << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f
- << (qreal)2.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f
- << (qreal)2.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f;
-
- QTest::newRow("yonly")
- << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f
- << (qreal)0.0f << (qreal)2.0f << (qreal)0.0f << (qreal)0.0f
- << (qreal)0.0f << (qreal)2.0f << (qreal)0.0f << (qreal)0.0f;
-
- QTest::newRow("zonly")
- << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f
- << (qreal)0.0f << (qreal)0.0f << (qreal)2.0f << (qreal)0.0f
- << (qreal)0.0f << (qreal)0.0f << (qreal)2.0f << (qreal)0.0f;
-
- QTest::newRow("wonly")
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)2.0f
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)2.0f;
-
- QTest::newRow("all")
- << (qreal)1.0f << (qreal)2.0f << (qreal)3.0f << (qreal)8.0f
- << (qreal)4.0f << (qreal)5.0f << (qreal)-6.0f << (qreal)9.0f
- << (qreal)4.0f << (qreal)10.0f << (qreal)-18.0f << (qreal)72.0f;
-}
-void tst_QVector::multiply4()
-{
- QFETCH(qreal, x1);
- QFETCH(qreal, y1);
- QFETCH(qreal, z1);
- QFETCH(qreal, w1);
- QFETCH(qreal, x2);
- QFETCH(qreal, y2);
- QFETCH(qreal, z2);
- QFETCH(qreal, w2);
- QFETCH(qreal, x3);
- QFETCH(qreal, y3);
- QFETCH(qreal, z3);
- QFETCH(qreal, w3);
-
- QVector4D v1(x1, y1, z1, w1);
- QVector4D v2(x2, y2, z2, w2);
- QVector4D v3(x3, y3, z3, w3);
-
- QVERIFY((v1 * v2) == v3);
-
- QVector4D v4(v1);
- v4 *= v2;
- QVERIFY(v4 == v3);
-
- QCOMPARE(v4.x(), v1.x() * v2.x());
- QCOMPARE(v4.y(), v1.y() * v2.y());
- QCOMPARE(v4.z(), v1.z() * v2.z());
- QCOMPARE(v4.w(), v1.w() * v2.w());
-}
-
-// Test vector multiplication by a factor for 2D vectors.
-void tst_QVector::multiplyFactor2_data()
-{
- QTest::addColumn<qreal>("x1");
- QTest::addColumn<qreal>("y1");
- QTest::addColumn<qreal>("factor");
- QTest::addColumn<qreal>("x2");
- QTest::addColumn<qreal>("y2");
-
- QTest::newRow("null")
- << (qreal)0.0f << (qreal)0.0f
- << (qreal)100.0f
- << (qreal)0.0f << (qreal)0.0f;
-
- QTest::newRow("xonly")
- << (qreal)1.0f << (qreal)0.0f
- << (qreal)2.0f
- << (qreal)2.0f << (qreal)0.0f;
-
- QTest::newRow("yonly")
- << (qreal)0.0f << (qreal)1.0f
- << (qreal)2.0f
- << (qreal)0.0f << (qreal)2.0f;
-
- QTest::newRow("all")
- << (qreal)1.0f << (qreal)2.0f
- << (qreal)2.0f
- << (qreal)2.0f << (qreal)4.0f;
-
- QTest::newRow("allzero")
- << (qreal)1.0f << (qreal)2.0f
- << (qreal)0.0f
- << (qreal)0.0f << (qreal)0.0f;
-}
-void tst_QVector::multiplyFactor2()
-{
- QFETCH(qreal, x1);
- QFETCH(qreal, y1);
- QFETCH(qreal, factor);
- QFETCH(qreal, x2);
- QFETCH(qreal, y2);
-
- QVector2D v1(x1, y1);
- QVector2D v2(x2, y2);
-
- QVERIFY((v1 * factor) == v2);
- QVERIFY((factor * v1) == v2);
-
- QVector2D v3(v1);
- v3 *= factor;
- QVERIFY(v3 == v2);
-
- QCOMPARE(v3.x(), v1.x() * factor);
- QCOMPARE(v3.y(), v1.y() * factor);
-}
-
-// Test vector multiplication by a factor for 3D vectors.
-void tst_QVector::multiplyFactor3_data()
-{
- QTest::addColumn<qreal>("x1");
- QTest::addColumn<qreal>("y1");
- QTest::addColumn<qreal>("z1");
- QTest::addColumn<qreal>("factor");
- QTest::addColumn<qreal>("x2");
- QTest::addColumn<qreal>("y2");
- QTest::addColumn<qreal>("z2");
-
- QTest::newRow("null")
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f
- << (qreal)100.0f
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f;
-
- QTest::newRow("xonly")
- << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f
- << (qreal)2.0f
- << (qreal)2.0f << (qreal)0.0f << (qreal)0.0f;
-
- QTest::newRow("yonly")
- << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f
- << (qreal)2.0f
- << (qreal)0.0f << (qreal)2.0f << (qreal)0.0f;
-
- QTest::newRow("zonly")
- << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f
- << (qreal)2.0f
- << (qreal)0.0f << (qreal)0.0f << (qreal)2.0f;
-
- QTest::newRow("all")
- << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f
- << (qreal)2.0f
- << (qreal)2.0f << (qreal)4.0f << (qreal)-6.0f;
-
- QTest::newRow("allzero")
- << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f
- << (qreal)0.0f
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f;
-}
-void tst_QVector::multiplyFactor3()
-{
- QFETCH(qreal, x1);
- QFETCH(qreal, y1);
- QFETCH(qreal, z1);
- QFETCH(qreal, factor);
- QFETCH(qreal, x2);
- QFETCH(qreal, y2);
- QFETCH(qreal, z2);
-
- QVector3D v1(x1, y1, z1);
- QVector3D v2(x2, y2, z2);
-
- QVERIFY((v1 * factor) == v2);
- QVERIFY((factor * v1) == v2);
-
- QVector3D v3(v1);
- v3 *= factor;
- QVERIFY(v3 == v2);
-
- QCOMPARE(v3.x(), v1.x() * factor);
- QCOMPARE(v3.y(), v1.y() * factor);
- QCOMPARE(v3.z(), v1.z() * factor);
-}
-
-// Test vector multiplication by a factor for 4D vectors.
-void tst_QVector::multiplyFactor4_data()
-{
- QTest::addColumn<qreal>("x1");
- QTest::addColumn<qreal>("y1");
- QTest::addColumn<qreal>("z1");
- QTest::addColumn<qreal>("w1");
- QTest::addColumn<qreal>("factor");
- QTest::addColumn<qreal>("x2");
- QTest::addColumn<qreal>("y2");
- QTest::addColumn<qreal>("z2");
- QTest::addColumn<qreal>("w2");
-
- QTest::newRow("null")
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f
- << (qreal)100.0f
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f;
-
- QTest::newRow("xonly")
- << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f
- << (qreal)2.0f
- << (qreal)2.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f;
-
- QTest::newRow("yonly")
- << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f
- << (qreal)2.0f
- << (qreal)0.0f << (qreal)2.0f << (qreal)0.0f << (qreal)0.0f;
-
- QTest::newRow("zonly")
- << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f
- << (qreal)2.0f
- << (qreal)0.0f << (qreal)0.0f << (qreal)2.0f << (qreal)0.0f;
-
- QTest::newRow("wonly")
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f
- << (qreal)2.0f
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)2.0f;
-
- QTest::newRow("all")
- << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)4.0f
- << (qreal)2.0f
- << (qreal)2.0f << (qreal)4.0f << (qreal)-6.0f << (qreal)8.0f;
-
- QTest::newRow("allzero")
- << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)4.0f
- << (qreal)0.0f
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f;
-}
-void tst_QVector::multiplyFactor4()
-{
- QFETCH(qreal, x1);
- QFETCH(qreal, y1);
- QFETCH(qreal, z1);
- QFETCH(qreal, w1);
- QFETCH(qreal, factor);
- QFETCH(qreal, x2);
- QFETCH(qreal, y2);
- QFETCH(qreal, z2);
- QFETCH(qreal, w2);
-
- QVector4D v1(x1, y1, z1, w1);
- QVector4D v2(x2, y2, z2, w2);
-
- QVERIFY((v1 * factor) == v2);
- QVERIFY((factor * v1) == v2);
-
- QVector4D v3(v1);
- v3 *= factor;
- QVERIFY(v3 == v2);
-
- QCOMPARE(v3.x(), v1.x() * factor);
- QCOMPARE(v3.y(), v1.y() * factor);
- QCOMPARE(v3.z(), v1.z() * factor);
- QCOMPARE(v3.w(), v1.w() * factor);
-}
-
-// Test vector division by a factor for 2D vectors.
-void tst_QVector::divide2_data()
-{
- // Use the same test data as the multiply test.
- multiplyFactor2_data();
-}
-void tst_QVector::divide2()
-{
- QFETCH(qreal, x1);
- QFETCH(qreal, y1);
- QFETCH(qreal, factor);
- QFETCH(qreal, x2);
- QFETCH(qreal, y2);
-
- QVector2D v1(x1, y1);
- QVector2D v2(x2, y2);
-
- if (factor == (qreal)0.0f)
- return;
-
- QVERIFY((v2 / factor) == v1);
-
- QVector2D v3(v2);
- v3 /= factor;
- QVERIFY(v3 == v1);
-
- QCOMPARE(v3.x(), v2.x() / factor);
- QCOMPARE(v3.y(), v2.y() / factor);
-}
-
-// Test vector division by a factor for 3D vectors.
-void tst_QVector::divide3_data()
-{
- // Use the same test data as the multiply test.
- multiplyFactor3_data();
-}
-void tst_QVector::divide3()
-{
- QFETCH(qreal, x1);
- QFETCH(qreal, y1);
- QFETCH(qreal, z1);
- QFETCH(qreal, factor);
- QFETCH(qreal, x2);
- QFETCH(qreal, y2);
- QFETCH(qreal, z2);
-
- QVector3D v1(x1, y1, z1);
- QVector3D v2(x2, y2, z2);
-
- if (factor == (qreal)0.0f)
- return;
-
- QVERIFY((v2 / factor) == v1);
-
- QVector3D v3(v2);
- v3 /= factor;
- QVERIFY(v3 == v1);
-
- QCOMPARE(v3.x(), v2.x() / factor);
- QCOMPARE(v3.y(), v2.y() / factor);
- QCOMPARE(v3.z(), v2.z() / factor);
-}
-
-// Test vector division by a factor for 4D vectors.
-void tst_QVector::divide4_data()
-{
- // Use the same test data as the multiply test.
- multiplyFactor4_data();
-}
-void tst_QVector::divide4()
-{
- QFETCH(qreal, x1);
- QFETCH(qreal, y1);
- QFETCH(qreal, z1);
- QFETCH(qreal, w1);
- QFETCH(qreal, factor);
- QFETCH(qreal, x2);
- QFETCH(qreal, y2);
- QFETCH(qreal, z2);
- QFETCH(qreal, w2);
-
- QVector4D v1(x1, y1, z1, w1);
- QVector4D v2(x2, y2, z2, w2);
-
- if (factor == (qreal)0.0f)
- return;
-
- QVERIFY((v2 / factor) == v1);
-
- QVector4D v3(v2);
- v3 /= factor;
- QVERIFY(v3 == v1);
-
- QCOMPARE(v3.x(), v2.x() / factor);
- QCOMPARE(v3.y(), v2.y() / factor);
- QCOMPARE(v3.z(), v2.z() / factor);
- QCOMPARE(v3.w(), v2.w() / factor);
-}
-
-// Test vector negation for 2D vectors.
-void tst_QVector::negate2_data()
-{
- // Use the same test data as the add test.
- add2_data();
-}
-void tst_QVector::negate2()
-{
- QFETCH(qreal, x1);
- QFETCH(qreal, y1);
-
- QVector2D v1(x1, y1);
- QVector2D v2(-x1, -y1);
-
- QVERIFY(-v1 == v2);
-}
-
-// Test vector negation for 3D vectors.
-void tst_QVector::negate3_data()
-{
- // Use the same test data as the add test.
- add3_data();
-}
-void tst_QVector::negate3()
-{
- QFETCH(qreal, x1);
- QFETCH(qreal, y1);
- QFETCH(qreal, z1);
-
- QVector3D v1(x1, y1, z1);
- QVector3D v2(-x1, -y1, -z1);
-
- QVERIFY(-v1 == v2);
-}
-
-// Test vector negation for 4D vectors.
-void tst_QVector::negate4_data()
-{
- // Use the same test data as the add test.
- add4_data();
-}
-void tst_QVector::negate4()
-{
- QFETCH(qreal, x1);
- QFETCH(qreal, y1);
- QFETCH(qreal, z1);
- QFETCH(qreal, w1);
-
- QVector4D v1(x1, y1, z1, w1);
- QVector4D v2(-x1, -y1, -z1, -w1);
-
- QVERIFY(-v1 == v2);
-}
-
-// Test the computation of vector cross-products.
-void tst_QVector::crossProduct_data()
-{
- QTest::addColumn<qreal>("x1");
- QTest::addColumn<qreal>("y1");
- QTest::addColumn<qreal>("z1");
- QTest::addColumn<qreal>("x2");
- QTest::addColumn<qreal>("y2");
- QTest::addColumn<qreal>("z2");
- QTest::addColumn<qreal>("x3");
- QTest::addColumn<qreal>("y3");
- QTest::addColumn<qreal>("z3");
- QTest::addColumn<qreal>("dot");
-
- QTest::newRow("null")
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f
- << (qreal)0.0f;
-
- QTest::newRow("unitvec")
- << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f
- << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f
- << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f
- << (qreal)0.0f;
-
- QTest::newRow("complex")
- << (qreal)1.0f << (qreal)2.0f << (qreal)3.0f
- << (qreal)4.0f << (qreal)5.0f << (qreal)6.0f
- << (qreal)-3.0f << (qreal)6.0f << (qreal)-3.0f
- << (qreal)32.0f;
-}
-void tst_QVector::crossProduct()
-{
- QFETCH(qreal, x1);
- QFETCH(qreal, y1);
- QFETCH(qreal, z1);
- QFETCH(qreal, x2);
- QFETCH(qreal, y2);
- QFETCH(qreal, z2);
- QFETCH(qreal, x3);
- QFETCH(qreal, y3);
- QFETCH(qreal, z3);
-
- QVector3D v1(x1, y1, z1);
- QVector3D v2(x2, y2, z2);
- QVector3D v3(x3, y3, z3);
-
- QVector3D v4 = QVector3D::crossProduct(v1, v2);
- QVERIFY(v4 == v3);
-
- // Compute the cross-product long-hand and check again.
- qreal xres = y1 * z2 - z1 * y2;
- qreal yres = z1 * x2 - x1 * z2;
- qreal zres = x1 * y2 - y1 * x2;
-
- QCOMPARE(v4.x(), xres);
- QCOMPARE(v4.y(), yres);
- QCOMPARE(v4.z(), zres);
-}
-
-// Test the computation of normals.
-void tst_QVector::normal_data()
-{
- // Use the same test data as the crossProduct test.
- crossProduct_data();
-}
-void tst_QVector::normal()
-{
- QFETCH(qreal, x1);
- QFETCH(qreal, y1);
- QFETCH(qreal, z1);
- QFETCH(qreal, x2);
- QFETCH(qreal, y2);
- QFETCH(qreal, z2);
- QFETCH(qreal, x3);
- QFETCH(qreal, y3);
- QFETCH(qreal, z3);
-
- QVector3D v1(x1, y1, z1);
- QVector3D v2(x2, y2, z2);
- QVector3D v3(x3, y3, z3);
-
- QVERIFY(QVector3D::normal(v1, v2) == v3.normalized());
- QVERIFY(QVector3D::normal(QVector3D(), v1, v2) == v3.normalized());
-
- QVector3D point(1.0f, 2.0f, 3.0f);
- QVERIFY(QVector3D::normal(point, v1 + point, v2 + point) == v3.normalized());
-}
-
-// Test distance to plane calculations.
-void tst_QVector::distanceToPlane_data()
-{
- QTest::addColumn<qreal>("x1"); // Point on plane
- QTest::addColumn<qreal>("y1");
- QTest::addColumn<qreal>("z1");
- QTest::addColumn<qreal>("x2"); // Normal to plane
- QTest::addColumn<qreal>("y2");
- QTest::addColumn<qreal>("z2");
- QTest::addColumn<qreal>("x3"); // Point to test for distance
- QTest::addColumn<qreal>("y3");
- QTest::addColumn<qreal>("z3");
- QTest::addColumn<qreal>("x4"); // Second point on plane
- QTest::addColumn<qreal>("y4");
- QTest::addColumn<qreal>("z4");
- QTest::addColumn<qreal>("x5"); // Third point on plane
- QTest::addColumn<qreal>("y5");
- QTest::addColumn<qreal>("z5");
- QTest::addColumn<qreal>("distance");
-
- QTest::newRow("null")
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f
- << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f
- << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f
- << (qreal)0.0f << (qreal)2.0f << (qreal)0.0f
- << (qreal)0.0f;
-
- QTest::newRow("above")
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f
- << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f
- << (qreal)0.0f << (qreal)0.0f << (qreal)2.0f
- << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f
- << (qreal)0.0f << (qreal)2.0f << (qreal)0.0f
- << (qreal)2.0f;
-
- QTest::newRow("below")
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f
- << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f
- << (qreal)-1.0f << (qreal)1.0f << (qreal)-2.0f
- << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f
- << (qreal)0.0f << (qreal)2.0f << (qreal)0.0f
- << (qreal)-2.0f;
-}
-void tst_QVector::distanceToPlane()
-{
- QFETCH(qreal, x1);
- QFETCH(qreal, y1);
- QFETCH(qreal, z1);
- QFETCH(qreal, x2);
- QFETCH(qreal, y2);
- QFETCH(qreal, z2);
- QFETCH(qreal, x3);
- QFETCH(qreal, y3);
- QFETCH(qreal, z3);
- QFETCH(qreal, x4);
- QFETCH(qreal, y4);
- QFETCH(qreal, z4);
- QFETCH(qreal, x5);
- QFETCH(qreal, y5);
- QFETCH(qreal, z5);
- QFETCH(qreal, distance);
-
- QVector3D v1(x1, y1, z1);
- QVector3D v2(x2, y2, z2);
- QVector3D v3(x3, y3, z3);
- QVector3D v4(x4, y4, z4);
- QVector3D v5(x5, y5, z5);
-
- QCOMPARE(v3.distanceToPlane(v1, v2), distance);
- QCOMPARE(v3.distanceToPlane(v1, v4, v5), distance);
-}
-
-// Test distance to line calculations.
-void tst_QVector::distanceToLine_data()
-{
- QTest::addColumn<qreal>("x1"); // Point on line
- QTest::addColumn<qreal>("y1");
- QTest::addColumn<qreal>("z1");
- QTest::addColumn<qreal>("x2"); // Direction of the line
- QTest::addColumn<qreal>("y2");
- QTest::addColumn<qreal>("z2");
- QTest::addColumn<qreal>("x3"); // Point to test for distance
- QTest::addColumn<qreal>("y3");
- QTest::addColumn<qreal>("z3");
- QTest::addColumn<qreal>("distance");
-
- QTest::newRow("null")
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f
- << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f
- << (qreal)0.0f;
-
- QTest::newRow("on line")
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f
- << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f
- << (qreal)0.0f << (qreal)0.0f << (qreal)5.0f
- << (qreal)0.0f;
-
- QTest::newRow("off line")
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f
- << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f
- << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f
- << (qreal)1.0f;
-
- QTest::newRow("off line 2")
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f
- << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f
- << (qreal)0.0f << (qreal)-2.0f << (qreal)0.0f
- << (qreal)2.0f;
-
- QTest::newRow("points")
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f
- << (qreal)0.0f << (qreal)5.0f << (qreal)0.0f
- << (qreal)5.0f;
-}
-void tst_QVector::distanceToLine()
-{
- QFETCH(qreal, x1);
- QFETCH(qreal, y1);
- QFETCH(qreal, z1);
- QFETCH(qreal, x2);
- QFETCH(qreal, y2);
- QFETCH(qreal, z2);
- QFETCH(qreal, x3);
- QFETCH(qreal, y3);
- QFETCH(qreal, z3);
- QFETCH(qreal, distance);
-
- QVector3D v1(x1, y1, z1);
- QVector3D v2(x2, y2, z2);
- QVector3D v3(x3, y3, z3);
-
- QCOMPARE(v3.distanceToLine(v1, v2), distance);
-}
-
-// Test the computation of dot products for 2D vectors.
-void tst_QVector::dotProduct2_data()
-{
- QTest::addColumn<qreal>("x1");
- QTest::addColumn<qreal>("y1");
- QTest::addColumn<qreal>("x2");
- QTest::addColumn<qreal>("y2");
- QTest::addColumn<qreal>("dot");
-
- QTest::newRow("null")
- << (qreal)0.0f << (qreal)0.0f
- << (qreal)0.0f << (qreal)0.0f
- << (qreal)0.0f;
-
- QTest::newRow("unitvec")
- << (qreal)1.0f << (qreal)0.0f
- << (qreal)0.0f << (qreal)1.0f
- << (qreal)0.0f;
-
- QTest::newRow("complex")
- << (qreal)1.0f << (qreal)2.0f
- << (qreal)4.0f << (qreal)5.0f
- << (qreal)14.0f;
-}
-void tst_QVector::dotProduct2()
-{
- QFETCH(qreal, x1);
- QFETCH(qreal, y1);
- QFETCH(qreal, x2);
- QFETCH(qreal, y2);
- QFETCH(qreal, dot);
-
- QVector2D v1(x1, y1);
- QVector2D v2(x2, y2);
-
- QVERIFY(QVector2D::dotProduct(v1, v2) == dot);
-
- // Compute the dot-product long-hand and check again.
- qreal d = x1 * x2 + y1 * y2;
-
- QCOMPARE(QVector2D::dotProduct(v1, v2), d);
-}
-
-// Test the computation of dot products for 3D vectors.
-void tst_QVector::dotProduct3_data()
-{
- // Use the same test data as the crossProduct test.
- crossProduct_data();
-}
-void tst_QVector::dotProduct3()
-{
- QFETCH(qreal, x1);
- QFETCH(qreal, y1);
- QFETCH(qreal, z1);
- QFETCH(qreal, x2);
- QFETCH(qreal, y2);
- QFETCH(qreal, z2);
- QFETCH(qreal, x3);
- QFETCH(qreal, y3);
- QFETCH(qreal, z3);
- QFETCH(qreal, dot);
-
- Q_UNUSED(x3);
- Q_UNUSED(y3);
- Q_UNUSED(z3);
-
- QVector3D v1(x1, y1, z1);
- QVector3D v2(x2, y2, z2);
-
- QVERIFY(QVector3D::dotProduct(v1, v2) == dot);
-
- // Compute the dot-product long-hand and check again.
- qreal d = x1 * x2 + y1 * y2 + z1 * z2;
-
- QCOMPARE(QVector3D::dotProduct(v1, v2), d);
-}
-
-// Test the computation of dot products for 4D vectors.
-void tst_QVector::dotProduct4_data()
-{
- QTest::addColumn<qreal>("x1");
- QTest::addColumn<qreal>("y1");
- QTest::addColumn<qreal>("z1");
- QTest::addColumn<qreal>("w1");
- QTest::addColumn<qreal>("x2");
- QTest::addColumn<qreal>("y2");
- QTest::addColumn<qreal>("z2");
- QTest::addColumn<qreal>("w2");
- QTest::addColumn<qreal>("dot");
-
- QTest::newRow("null")
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f
- << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f
- << (qreal)0.0f;
-
- QTest::newRow("unitvec")
- << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f
- << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f
- << (qreal)0.0f;
-
- QTest::newRow("complex")
- << (qreal)1.0f << (qreal)2.0f << (qreal)3.0f << (qreal)4.0f
- << (qreal)4.0f << (qreal)5.0f << (qreal)6.0f << (qreal)7.0f
- << (qreal)60.0f;
-}
-void tst_QVector::dotProduct4()
-{
- QFETCH(qreal, x1);
- QFETCH(qreal, y1);
- QFETCH(qreal, z1);
- QFETCH(qreal, w1);
- QFETCH(qreal, x2);
- QFETCH(qreal, y2);
- QFETCH(qreal, z2);
- QFETCH(qreal, w2);
- QFETCH(qreal, dot);
-
- QVector4D v1(x1, y1, z1, w1);
- QVector4D v2(x2, y2, z2, w2);
-
- QVERIFY(QVector4D::dotProduct(v1, v2) == dot);
-
- // Compute the dot-product long-hand and check again.
- qreal d = x1 * x2 + y1 * y2 + z1 * z2 + w1 * w2;
-
- QCOMPARE(QVector4D::dotProduct(v1, v2), d);
-}
-
-class tst_QVectorProperties : public QObject
-{
- Q_OBJECT
- Q_PROPERTY(QVector2D vector2D READ vector2D WRITE setVector2D)
- Q_PROPERTY(QVector3D vector3D READ vector3D WRITE setVector3D)
- Q_PROPERTY(QVector4D vector4D READ vector4D WRITE setVector4D)
-public:
- tst_QVectorProperties(QObject *parent = 0) : QObject(parent) {}
-
- QVector2D vector2D() const { return v2; }
- void setVector2D(const QVector2D& value) { v2 = value; }
-
- QVector3D vector3D() const { return v3; }
- void setVector3D(const QVector3D& value) { v3 = value; }
-
- QVector4D vector4D() const { return v4; }
- void setVector4D(const QVector4D& value) { v4 = value; }
-
-private:
- QVector2D v2;
- QVector3D v3;
- QVector4D v4;
-};
-
-// Test getting and setting vector properties via the metaobject system.
-void tst_QVector::properties()
-{
- tst_QVectorProperties obj;
-
- obj.setVector2D(QVector2D(1.0f, 2.0f));
- obj.setVector3D(QVector3D(3.0f, 4.0f, 5.0f));
- obj.setVector4D(QVector4D(6.0f, 7.0f, 8.0f, 9.0f));
-
- QVector2D v2 = qVariantValue<QVector2D>(obj.property("vector2D"));
- QCOMPARE(v2.x(), (qreal)1.0f);
- QCOMPARE(v2.y(), (qreal)2.0f);
-
- QVector3D v3 = qVariantValue<QVector3D>(obj.property("vector3D"));
- QCOMPARE(v3.x(), (qreal)3.0f);
- QCOMPARE(v3.y(), (qreal)4.0f);
- QCOMPARE(v3.z(), (qreal)5.0f);
-
- QVector4D v4 = qVariantValue<QVector4D>(obj.property("vector4D"));
- QCOMPARE(v4.x(), (qreal)6.0f);
- QCOMPARE(v4.y(), (qreal)7.0f);
- QCOMPARE(v4.z(), (qreal)8.0f);
- QCOMPARE(v4.w(), (qreal)9.0f);
-
- obj.setProperty("vector2D",
- qVariantFromValue(QVector2D(-1.0f, -2.0f)));
- obj.setProperty("vector3D",
- qVariantFromValue(QVector3D(-3.0f, -4.0f, -5.0f)));
- obj.setProperty("vector4D",
- qVariantFromValue(QVector4D(-6.0f, -7.0f, -8.0f, -9.0f)));
-
- v2 = qVariantValue<QVector2D>(obj.property("vector2D"));
- QCOMPARE(v2.x(), (qreal)-1.0f);
- QCOMPARE(v2.y(), (qreal)-2.0f);
-
- v3 = qVariantValue<QVector3D>(obj.property("vector3D"));
- QCOMPARE(v3.x(), (qreal)-3.0f);
- QCOMPARE(v3.y(), (qreal)-4.0f);
- QCOMPARE(v3.z(), (qreal)-5.0f);
-
- v4 = qVariantValue<QVector4D>(obj.property("vector4D"));
- QCOMPARE(v4.x(), (qreal)-6.0f);
- QCOMPARE(v4.y(), (qreal)-7.0f);
- QCOMPARE(v4.z(), (qreal)-8.0f);
- QCOMPARE(v4.w(), (qreal)-9.0f);
-}
-
-void tst_QVector::metaTypes()
-{
- QVERIFY(QMetaType::type("QVector2D") == QMetaType::QVector2D);
- QVERIFY(QMetaType::type("QVector3D") == QMetaType::QVector3D);
- QVERIFY(QMetaType::type("QVector4D") == QMetaType::QVector4D);
-
- QCOMPARE(QByteArray(QMetaType::typeName(QMetaType::QVector2D)),
- QByteArray("QVector2D"));
- QCOMPARE(QByteArray(QMetaType::typeName(QMetaType::QVector3D)),
- QByteArray("QVector3D"));
- QCOMPARE(QByteArray(QMetaType::typeName(QMetaType::QVector4D)),
- QByteArray("QVector4D"));
-
- QVERIFY(QMetaType::isRegistered(QMetaType::QVector2D));
- QVERIFY(QMetaType::isRegistered(QMetaType::QVector3D));
- QVERIFY(QMetaType::isRegistered(QMetaType::QVector4D));
-
- QVERIFY(qMetaTypeId<QVector2D>() == QMetaType::QVector2D);
- QVERIFY(qMetaTypeId<QVector3D>() == QMetaType::QVector3D);
- QVERIFY(qMetaTypeId<QVector4D>() == QMetaType::QVector4D);
-}
-
-QTEST_APPLESS_MAIN(tst_QVector)
-
-#include "tst_qvectornd.moc"
diff --git a/tests/auto/math3d/shared/math3dincludes.h b/tests/auto/math3d/shared/math3dincludes.h
deleted file mode 100644
index 243c5a5..0000000
--- a/tests/auto/math3d/shared/math3dincludes.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the test suite of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at http://qt.nokia.com/contact.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef MATH3DINCLUDES_H
-#define MATH3DINCLUDES_H
-
-#include <QtGui/qmatrix4x4.h>
-#include <QtGui/qgenericmatrix.h>
-#include <QtGui/qvector2d.h>
-#include <QtGui/qvector3d.h>
-#include <QtGui/qvector4d.h>
-#include <QtGui/qquaternion.h>
-
-#endif