| #ifndef _RIVE_MAT4_HPP_ | |
| #define _RIVE_MAT4_HPP_ | |
| #include <cstddef> | |
| namespace rive | |
| { | |
| class Mat2D; | |
| class Mat4 | |
| { | |
| private: | |
| float m_Buffer[16]; | |
| public: | |
| Mat4() : | |
| m_Buffer{ | |
| // clang-format off | |
| 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, | |
| // clang-format on | |
| } | |
| {} | |
| Mat4(const Mat4& copy) = default; | |
| // Construct a 4x4 Matrix with the provided elements stored in row-major | |
| // order. | |
| Mat4( | |
| // clang-format off | |
| float x1, float y1, float z1, float w1, | |
| float x2, float y2, float z2, float w2, | |
| float x3, float y3, float z3, float w3, | |
| float tx, float ty, float tz, float tw | |
| // clang-format on | |
| ) : | |
| m_Buffer{ | |
| // clang-format off | |
| x1, y1, z1, w1, | |
| x2, y2, z2, w2, | |
| x3, y3, z3, w3, | |
| tx, ty, tz, tw, | |
| // clang-format on | |
| } | |
| {} | |
| Mat4(const Mat2D& mat2d); | |
| inline const float* values() const { return m_Buffer; } | |
| float& operator[](std::size_t idx) { return m_Buffer[idx]; } | |
| const float& operator[](std::size_t idx) const { return m_Buffer[idx]; } | |
| Mat4& operator*=(const Mat4& rhs) | |
| { | |
| *this = Mat4::multiply(*this, rhs); | |
| return *this; | |
| } | |
| Mat4& operator*=(const Mat2D& rhs) | |
| { | |
| *this = Mat4::multiply(*this, rhs); | |
| return *this; | |
| } | |
| static Mat4 multiply(const Mat4& a, const Mat4& b); | |
| static Mat4 multiply(const Mat4& a, const Mat2D& b); | |
| }; | |
| inline Mat4 operator*(const Mat4& a, const Mat4& b) { return Mat4::multiply(a, b); } | |
| inline Mat4 operator*(const Mat4& a, const Mat2D& b) { return Mat4::multiply(a, b); } | |
| } // namespace rive | |
| #endif |