diff --git a/src/Test/CMakeLists.txt b/src/Test/CMakeLists.txt index 0aafb02ab..f79fba1f6 100644 --- a/src/Test/CMakeLists.txt +++ b/src/Test/CMakeLists.txt @@ -1,4 +1,5 @@ magnum_add_test(VectorTest VectorTest.h VectorTest.cpp) magnum_add_test(Vector3Test Vector3Test.h Vector3Test.cpp) +magnum_add_test(Vector4Test Vector4Test.h Vector4Test.cpp) magnum_add_test(MatrixTest MatrixTest.h MatrixTest.cpp) diff --git a/src/Test/Vector4Test.cpp b/src/Test/Vector4Test.cpp new file mode 100644 index 000000000..057a80a59 --- /dev/null +++ b/src/Test/Vector4Test.cpp @@ -0,0 +1,37 @@ +/* + Copyright © 2010 Vladimír Vondruš + + This file is part of Magnum. + + Magnum is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 3 + only, as published by the Free Software Foundation. + + Magnum is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License version 3 for more details. +*/ + +#include "Vector4Test.h" + +#include + +#include "Vector4.h" + +QTEST_APPLESS_MAIN(Magnum::Test::Vector4Test) + +namespace Magnum { namespace Test { + +typedef Magnum::Vector4 Vector4; +typedef Magnum::Vector3 Vector3; + +void Vector4Test::construct() { + QVERIFY(Vector4() == Vector4(0.0f, 0.0f, 0.0f, 1.0f)); +} + +void Vector4Test::threeComponent() { + QVERIFY(Vector4(1.0f, 2.0f, 3.0f, 4.0f).xyz() == Vector3(1.0f, 2.0f, 3.0f)); +} + +}} diff --git a/src/Test/Vector4Test.h b/src/Test/Vector4Test.h new file mode 100644 index 000000000..5f4c5f06d --- /dev/null +++ b/src/Test/Vector4Test.h @@ -0,0 +1,32 @@ +#ifndef Magnum_Test_Vector4Test_h +#define Magnum_Test_Vector4Test_h +/* + Copyright © 2010 Vladimír Vondruš + + This file is part of Magnum. + + Magnum is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 3 + only, as published by the Free Software Foundation. + + Magnum is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License version 3 for more details. +*/ + +#include + +namespace Magnum { namespace Test { + +class Vector4Test: public QObject { + Q_OBJECT + + private slots: + void construct(); + void threeComponent(); +}; + +}} + +#endif diff --git a/src/Vector4.h b/src/Vector4.h new file mode 100644 index 000000000..c000af2f6 --- /dev/null +++ b/src/Vector4.h @@ -0,0 +1,92 @@ +#ifndef Magnum_Vector4_h +#define Magnum_Vector4_h +/* + Copyright © 2010 Vladimír Vondruš + + This file is part of Magnum. + + Magnum is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 3 + only, as published by the Free Software Foundation. + + Magnum is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License version 3 for more details. +*/ + +/** @file + * @brief Class Magnum::Vector4 + */ + +#include "Vector.h" + +#include "Vector3.h" + +namespace Magnum { + +/** @brief Vector (four-component) */ +template class Vector4: public Vector { + public: + /** + * @copydoc Vector::Vector + * + * W / A component is set to one. + */ + inline Vector4() { + setW(T(1)); + } + + /** @copydoc Vector::Vector(const T*) */ + inline Vector4(const T* data): Vector(data) {} + + /** @copydoc Vector::Vector(const Vector&) */ + inline Vector4(const Vector& other): Vector(other) {} + + /** + * @brief Constructor + * @param x X / R value + * @param y Y / G value + * @param z Z / B value + * @param w W / A value + */ + inline Vector4(T x, T y, T z, T w) { + setX(x); setY(y); setZ(z); setW(w); + } + + inline T x() const { return Vector::at(0); } /**< @brief X component */ + inline T y() const { return Vector::at(1); } /**< @brief Y component */ + inline T z() const { return Vector::at(2); } /**< @brief Z component */ + inline T w() const { return Vector::at(3); } /**< @brief W component */ + + inline void setX(T value) { set(0, value); } /**< @brief Set X component */ + inline void setY(T value) { set(1, value); } /**< @brief Set Y component */ + inline void setZ(T value) { set(2, value); } /**< @brief Set Z component */ + inline void setW(T value) { set(3, value); } /**< @brief Set W component */ + + /** + * @brief XYZ part of the vector + * @return First three components of the vector + */ + inline Vector3 xyz() const { return Vector3(Vector::data()); } + + inline T r() const { return x(); } /**< @brief R component */ + inline T g() const { return y(); } /**< @brief G component */ + inline T b() const { return z(); } /**< @brief B component */ + inline T a() const { return w(); } /**< @brief A component */ + + inline void setR(T value) { setX(value); } /**< @brief Set R component */ + inline void setG(T value) { setY(value); } /**< @brief Set G component */ + inline void setB(T value) { setZ(value); } /**< @brief Set B component */ + inline void setA(T value) { setA(value); } /**< @brief Set A component */ + + /** + * @brief RGB part of the vector + * @return First three components of the vector + */ + inline Vector3 rgb() const { return xyz(); } +}; + +} + +#endif