#pragma once #include namespace LinearAlgebra { /// A 4-by-4 matrix for affine transformations and perspective projections of 3D geometry. /* This matrix can represent the most generic form of transformations for 3D objects, * including perspective projections, which a 4-by-3 cannot store, * and translations, which a 3-by-3 cannot represent. * The elements of this matrix are * m_00, m_01, m_02, m_03 * m_10, m_11, m_12, m_13 * m_20, m_21, m_22, xm_23, * m_30, m_31, m_32, m_33 * * The element m_yx is the value on the row y and column x. * You can access m_yx using the double-bracket notation m[y][x] */ class Matrix4x4 { public: enum { Rows = 4 }; enum { Cols = 4 }; static const Matrix4x4 Zero; static const Matrix4x4 Identity; static const Matrix4x4 NaN; Matrix4x4() {} Matrix4x4(float val); Matrix4x4(float m00, float m01, float m02, float m03, float m10, float m11, float m12, float m13, float m20, float m21, float m22, float m23, float m30, float m31, float m32, float m33); Matrix4x4(const Vector4& r1, const Vector4& r2, const Vector4& r3, const Vector4& r4); explicit Matrix4x4(const Quaternion& orientation); Vector4 GetRow(int index) const; Vector4 GetColumn(int index) const; float At(int x, int y) const; Vector4 Diagonal() const; Vector4 WorldX() const; Vector4 WorldY() const; Vector4 WorldZ() const; /// Computes the determinant of this matrix. // If the determinant is nonzero, this matrix is invertible. float Determinant() const; Matrix4x4 Inverse() const; Matrix4x4 Transpose() const; Vector2 Transform(const Vector2& rhs) const; Vector3 Transform(const Vector3& rhs) const; Vector4 Transform(const Vector4& rhs) const; Vector3 GetTranslationComponent() const; Matrix3x3 GetRotationComponent() const; Vector4 GetRow() const; Vector4 GetColumn() const; protected: float elems[4][4]; }; }