Browse Source

Allow to specify value on diagonal in identity matrix constructor.

pull/279/head
Vladimír Vondruš 14 years ago
parent
commit
54af4015f2
  1. 7
      src/Math/Matrix.h
  2. 8
      src/Math/Matrix3.h
  3. 10
      src/Math/Matrix4.h
  4. 22
      src/Math/Test/Matrix3Test.cpp
  5. 2
      src/Math/Test/Matrix3Test.h
  6. 24
      src/Math/Test/Matrix4Test.cpp
  7. 2
      src/Math/Test/Matrix4Test.h
  8. 9
      src/Math/Test/MatrixTest.cpp

7
src/Math/Matrix.h

@ -90,12 +90,13 @@ template<class T, size_t size> class Matrix {
* @brief Default constructor
*
* You can also explicitly call this constructor with
* `Matrix m(Matrix::Identity);`.
* `Matrix m(Matrix::Identity);`. Optional parameter @p value allows
* you to specify value on diagonal.
*/
inline explicit Matrix(IdentityType = Identity): _data() {
inline explicit Matrix(IdentityType = Identity, T value = T(1)): _data() {
/** @todo constexpr how? */
for(size_t i = 0; i != size; ++i)
_data[size*i+i] = static_cast<T>(1);
_data[size*i+i] = value;
}
#ifndef DOXYGEN_GENERATING_OUTPUT

8
src/Math/Matrix3.h

@ -46,11 +46,11 @@ template<class T> class Matrix3: public Matrix<T, 3> {
inline constexpr explicit Matrix3(typename Matrix<T, 3>::ZeroType): Matrix<T, 3>(Matrix<T, 3>::Zero) {}
/** @copydoc Matrix::Matrix(IdentityType) */
inline constexpr explicit Matrix3(typename Matrix<T, 3>::IdentityType = Matrix<T, 3>::Identity): Matrix<T, 3>{
inline constexpr explicit Matrix3(typename Matrix<T, 3>::IdentityType = Matrix<T, 3>::Identity, T value = T(1)): Matrix<T, 3>{
/** @todo Make this in Matrix itself, after it will be constexpr */
1.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 1.0f
value, 0.0f, 0.0f,
0.0f, value, 0.0f,
0.0f, 0.0f, value
} {}
#ifndef DOXYGEN_GENERATING_OUTPUT

10
src/Math/Matrix4.h

@ -114,12 +114,12 @@ template<class T> class Matrix4: public Matrix<T, 4> {
inline constexpr explicit Matrix4(typename Matrix<T, 4>::ZeroType): Matrix<T, 3>(Matrix<T, 3>::Zero) {}
/** @copydoc Matrix::Matrix(IdentityType) */
inline constexpr explicit Matrix4(typename Matrix<T, 4>::IdentityType = Matrix<T, 4>::Identity): Matrix<T, 4>{
inline constexpr explicit Matrix4(typename Matrix<T, 4>::IdentityType = Matrix<T, 4>::Identity, T value = T(1)): Matrix<T, 4>{
/** @todo Make this in Matrix itself, after it will be constexpr */
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
value, 0.0f, 0.0f, 0.0f,
0.0f, value, 0.0f, 0.0f,
0.0f, 0.0f, value, 0.0f,
0.0f, 0.0f, 0.0f, value
} {}
#ifndef DOXYGEN_GENERATING_OUTPUT

22
src/Math/Test/Matrix3Test.cpp

@ -29,6 +29,28 @@ namespace Magnum { namespace Math { namespace Test {
typedef Math::Matrix3<float> Matrix3;
void Matrix3Test::constructIdentity() {
Matrix3 identity;
Matrix3 identity2(Matrix3::Identity);
Matrix3 identity3(Matrix3::Identity, 4.0f);
Matrix3 identityExpected(
1.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 1.0f
);
Matrix3 identity3Expected(
4.0f, 0.0f, 0.0f,
0.0f, 4.0f, 0.0f,
0.0f, 0.0f, 4.0f
);
QVERIFY(identity == identityExpected);
QVERIFY(identity2 == identityExpected);
QVERIFY(identity3 == identity3Expected);
}
void Matrix3Test::debug() {
Matrix3 m(
3.0f, 5.0f, 8.0f,

2
src/Math/Test/Matrix3Test.h

@ -23,6 +23,8 @@ class Matrix3Test: public QObject {
Q_OBJECT
private slots:
void constructIdentity();
void debug();
};

24
src/Math/Test/Matrix4Test.cpp

@ -31,6 +31,30 @@ namespace Magnum { namespace Math { namespace Test {
typedef Math::Matrix4<float> Matrix4;
typedef Math::Matrix3<float> Matrix3;
void Matrix4Test::constructIdentity() {
Matrix4 identity;
Matrix4 identity2(Matrix4::Identity);
Matrix4 identity3(Matrix4::Identity, 4.0f);
Matrix4 identityExpected(
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
);
Matrix4 identity3Expected(
4.0f, 0.0f, 0.0f, 0.0f,
0.0f, 4.0f, 0.0f, 0.0f,
0.0f, 0.0f, 4.0f, 0.0f,
0.0f, 0.0f, 0.0f, 4.0f
);
QVERIFY(identity == identityExpected);
QVERIFY(identity2 == identityExpected);
QVERIFY(identity3 == identity3Expected);
}
void Matrix4Test::translation() {
Matrix4 matrix(
1.0f, 0.0f, 0.0f, 0.0f,

2
src/Math/Test/Matrix4Test.h

@ -23,6 +23,8 @@ class Matrix4Test: public QObject {
Q_OBJECT
private slots:
void constructIdentity();
void translation();
void scaling();
void rotation();

9
src/Math/Test/MatrixTest.cpp

@ -66,6 +66,7 @@ void MatrixTest::constructFromVectors() {
void MatrixTest::constructIdentity() {
Matrix4 identity;
Matrix4 identity2(Matrix4::Identity);
Matrix4 identity3(Matrix4::Identity, 4.0f);
Matrix4 identityExpected(
1.0f, 0.0f, 0.0f, 0.0f,
@ -74,8 +75,16 @@ void MatrixTest::constructIdentity() {
0.0f, 0.0f, 0.0f, 1.0f
);
Matrix4 identity3Expected(
4.0f, 0.0f, 0.0f, 0.0f,
0.0f, 4.0f, 0.0f, 0.0f,
0.0f, 0.0f, 4.0f, 0.0f,
0.0f, 0.0f, 0.0f, 4.0f
);
QVERIFY(identity == identityExpected);
QVERIFY(identity2 == identityExpected);
QVERIFY(identity3 == identity3Expected);
}
void MatrixTest::constructZero() {

Loading…
Cancel
Save