diff --git a/src/Math/Matrix3.h b/src/Math/Matrix3.h index 2b00d3239..364d120fd 100644 --- a/src/Math/Matrix3.h +++ b/src/Math/Matrix3.h @@ -38,7 +38,8 @@ template class Matrix3: public Matrix<3, T> { * @brief 2D translation matrix * @param vec Translation vector * - * @see Matrix4::translation(), Vector2::xAxis(), Vector2::yAxis() + * @see translation(), Matrix4::translation(const Vector3&), + * Vector2::xAxis(), Vector2::yAxis() */ inline constexpr static Matrix3 translation(const Vector2& vec) { return Matrix3( /* Column-major! */ @@ -122,6 +123,21 @@ template class Matrix3: public Matrix<3, T> { (*this)[1].xy().normalized()); } + /** + * @brief 2D translation part of the matrix + * + * First two elements of last column. + * @see translation(const Vector2&), Matrix4::translation() + */ + inline Vector2& translation() { + return (*this)[2].xy(); + } + + /** @overload */ + inline constexpr Vector3 translation() const { + return (*this)[2].xy(); + } + MAGNUM_MATRIX_SUBCLASS_IMPLEMENTATION(Matrix3, Vector3, 3) MAGNUM_RECTANGULARMATRIX_SUBCLASS_OPERATOR_IMPLEMENTATION(3, 3, Matrix3) }; diff --git a/src/Math/Matrix4.h b/src/Math/Matrix4.h index 1090974db..f39aa9c90 100644 --- a/src/Math/Matrix4.h +++ b/src/Math/Matrix4.h @@ -40,7 +40,8 @@ template class Matrix4: public Matrix<4, T> { * @brief 3D translation matrix * @param vec Translation vector * - * @see Matrix3::translation(), Vector3::xAxis(), Vector3::yAxis(), Vector3::zAxis() + * @see translation(), Matrix3::translation(const Vector2&), + * Vector3::xAxis(), Vector3::yAxis(), Vector3::zAxis() */ inline constexpr static Matrix4 translation(const Vector3& vec) { return Matrix4( /* Column-major! */ @@ -161,6 +162,21 @@ template class Matrix4: public Matrix<4, T> { (*this)[2].xyz().normalized()); } + /** + * @brief 3D translation part of the matrix + * + * First three elements of last column. + * @see translation(const Vector3&), Matrix3::translation() + */ + inline Vector3& translation() { + return (*this)[3].xyz(); + } + + /** @overload */ + inline constexpr Vector3 translation() const { + return (*this)[3].xyz(); + } + MAGNUM_MATRIX_SUBCLASS_IMPLEMENTATION(Matrix4, Vector4, 4) MAGNUM_RECTANGULARMATRIX_SUBCLASS_OPERATOR_IMPLEMENTATION(4, 4, Matrix4) }; diff --git a/src/Math/Test/Matrix3Test.cpp b/src/Math/Test/Matrix3Test.cpp index cdffde3bf..e2e8b8975 100644 --- a/src/Math/Test/Matrix3Test.cpp +++ b/src/Math/Test/Matrix3Test.cpp @@ -38,6 +38,7 @@ Matrix3Test::Matrix3Test() { &Matrix3Test::rotation, &Matrix3Test::rotationScalingPart, &Matrix3Test::rotationPart, + &Matrix3Test::translationPart, &Matrix3Test::debug, &Matrix3Test::configuration); } @@ -122,6 +123,14 @@ void Matrix3Test::rotationPart() { CORRADE_COMPARE(rotationTransformed.rotation(), expectedRotationPart); } +void Matrix3Test::translationPart() { + Matrix3 m(1.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, + -5.0f, 12.0f, 1.0f); + Vector2 expected(-5.0f, 12.0f); + CORRADE_COMPARE(m.translation(), expected); +} + void Matrix3Test::debug() { Matrix3 m( 3.0f, 5.0f, 8.0f, diff --git a/src/Math/Test/Matrix3Test.h b/src/Math/Test/Matrix3Test.h index 6f71f41e3..c76040678 100644 --- a/src/Math/Test/Matrix3Test.h +++ b/src/Math/Test/Matrix3Test.h @@ -30,6 +30,7 @@ class Matrix3Test: public Corrade::TestSuite::Tester { void rotation(); void rotationScalingPart(); void rotationPart(); + void translationPart(); void debug(); void configuration(); diff --git a/src/Math/Test/Matrix4Test.cpp b/src/Math/Test/Matrix4Test.cpp index 6451585f1..fdb051277 100644 --- a/src/Math/Test/Matrix4Test.cpp +++ b/src/Math/Test/Matrix4Test.cpp @@ -38,6 +38,7 @@ Matrix4Test::Matrix4Test() { &Matrix4Test::rotation, &Matrix4Test::rotationScalingPart, &Matrix4Test::rotationPart, + &Matrix4Test::translationPart, &Matrix4Test::debug, &Matrix4Test::configuration); } @@ -135,6 +136,15 @@ void Matrix4Test::rotationPart() { CORRADE_COMPARE(rotationTransformed.rotation(), expectedRotationPart); } +void Matrix4Test::translationPart() { + Matrix4 m(1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + -5.0f, 12.0f, 0.5f, 1.0f); + Vector3 expected(-5.0f, 12.0f, 0.5f); + CORRADE_COMPARE(m.translation(), expected); +} + void Matrix4Test::debug() { Matrix4 m( 3.0f, 5.0f, 8.0f, 4.0f, diff --git a/src/Math/Test/Matrix4Test.h b/src/Math/Test/Matrix4Test.h index a49cfddb1..9bc8dbe2b 100644 --- a/src/Math/Test/Matrix4Test.h +++ b/src/Math/Test/Matrix4Test.h @@ -30,6 +30,7 @@ class Matrix4Test: public Corrade::TestSuite::Tester { void rotation(); void rotationScalingPart(); void rotationPart(); + void translationPart(); void debug(); void configuration();