| 1 | //************************************ bs::framework - Copyright 2018 Marko Pintera **************************************// |
| 2 | //*********** Licensed under the MIT license. See LICENSE.md for full terms. This notice is not to be removed. ***********// |
| 3 | #pragma once |
| 4 | |
| 5 | #include "Prerequisites/BsPrerequisitesUtil.h" |
| 6 | #include "Math/BsVector3.h" |
| 7 | |
| 8 | namespace bs |
| 9 | { |
| 10 | /** @addtogroup Math |
| 11 | * @{ |
| 12 | */ |
| 13 | |
| 14 | /** |
| 15 | * Class representing a NxM matrix. |
| 16 | * |
| 17 | * @note If you need to use matrices for more than just data storage then |
| 18 | * it is suggested you use specialized Matrix3 or Matrix4 classes |
| 19 | * as they provide a wide range of functionality. |
| 20 | */ |
| 21 | template<int N, int M> |
| 22 | class MatrixNxM |
| 23 | { |
| 24 | public: |
| 25 | MatrixNxM() = default; |
| 26 | MatrixNxM(const MatrixNxM&) = default; |
| 27 | MatrixNxM& operator=(const MatrixNxM&) = default; |
| 28 | |
| 29 | explicit MatrixNxM(float data[N*M]) |
| 30 | { |
| 31 | memcpy(m, data, N*M * sizeof(float)); |
| 32 | } |
| 33 | |
| 34 | /** Returns a transpose of the matrix (switched columns and rows). */ |
| 35 | MatrixNxM<M, N> transpose() const |
| 36 | { |
| 37 | MatrixNxM<M, N> matTranspose; |
| 38 | for (UINT32 row = 0; row < N; row++) |
| 39 | { |
| 40 | for (UINT32 col = 0; col < M; col++) |
| 41 | matTranspose[col][row] = m[row][col]; |
| 42 | } |
| 43 | |
| 44 | return matTranspose; |
| 45 | } |
| 46 | |
| 47 | /** Returns a row of the matrix. */ |
| 48 | float* operator[] (UINT32 row) const |
| 49 | { |
| 50 | assert(row < N); |
| 51 | |
| 52 | return (float*)m[row]; |
| 53 | } |
| 54 | |
| 55 | bool operator== (const MatrixNxM& rhs) const |
| 56 | { |
| 57 | for (UINT32 row = 0; row < N; row++) |
| 58 | { |
| 59 | for (UINT32 col = 0; col < M; col++) |
| 60 | { |
| 61 | if (m[row][col] != rhs.m[row][col]) |
| 62 | return false; |
| 63 | } |
| 64 | } |
| 65 | |
| 66 | return true; |
| 67 | } |
| 68 | |
| 69 | bool operator!= (const MatrixNxM& rhs) const |
| 70 | { |
| 71 | return !operator==(rhs); |
| 72 | } |
| 73 | |
| 74 | float m[N][M]; |
| 75 | }; |
| 76 | |
| 77 | typedef MatrixNxM<2, 2> Matrix2; |
| 78 | typedef MatrixNxM<2, 3> Matrix2x3; |
| 79 | typedef MatrixNxM<2, 4> Matrix2x4; |
| 80 | typedef MatrixNxM<3, 2> Matrix3x2; |
| 81 | typedef MatrixNxM<3, 4> Matrix3x4; |
| 82 | typedef MatrixNxM<4, 2> Matrix4x2; |
| 83 | typedef MatrixNxM<4, 3> Matrix4x3; |
| 84 | |
| 85 | /** @} */ |
| 86 | } |
| 87 | |