eleni@0: #ifndef MATRIX_H_ eleni@0: #define MATRIX_H_ eleni@0: eleni@0: #include eleni@0: #include "vector.h" eleni@0: eleni@0: class Matrix4x4 { eleni@0: public: eleni@0: float m[4][4]; eleni@0: eleni@0: static Matrix4x4 identity; eleni@0: eleni@0: Matrix4x4(); eleni@0: Matrix4x4( float m11, float m12, float m13, float m14, eleni@0: float m21, float m22, float m23, float m24, eleni@0: float m31, float m32, float m33, float m34, eleni@0: float m41, float m42, float m43, float m44); eleni@0: eleni@0: /* binary operations matrix (op) matrix */ eleni@0: friend Matrix4x4 operator +(const Matrix4x4 &m1, const Matrix4x4 &m2); eleni@0: friend Matrix4x4 operator -(const Matrix4x4 &m1, const Matrix4x4 &m2); eleni@0: friend Matrix4x4 operator *(const Matrix4x4 &m1, const Matrix4x4 &m2); eleni@0: eleni@0: friend void operator +=(Matrix4x4 &m1, const Matrix4x4 &m2); eleni@0: friend void operator -=(Matrix4x4 &m1, const Matrix4x4 &m2); eleni@0: friend inline void operator *=(Matrix4x4 &m1, const Matrix4x4 &m2); eleni@0: eleni@0: /* binary operations matrix (op) scalar and scalar (op) matrix */ eleni@0: friend Matrix4x4 operator *(const Matrix4x4 &mat, float scalar); eleni@0: friend Matrix4x4 operator *(float scalar, const Matrix4x4 &mat); eleni@0: eleni@0: friend void operator *=(Matrix4x4 &mat, float scalar); eleni@0: eleni@0: inline float *operator [](int index); eleni@0: inline const float *operator [](int index) const; eleni@0: eleni@0: inline void reset_identity(); eleni@0: eleni@0: void translate(const Vector3 &trans); eleni@0: void set_translation(const Vector3 &trans); eleni@0: eleni@0: void rotate(const Vector3 &euler); /* 3d rotation with euler angles */ eleni@0: void rotate(const Vector3 &axis, float angle); /* 3d axis/angle rotation */ eleni@0: void set_rotation(const Vector3 &euler_angles); eleni@0: void set_rotation(const Vector3 &axis, float angle); eleni@0: eleni@0: void scale(const Vector3 &scale_vec); eleni@0: void set_scaling(const Vector3 &scale_vec); eleni@0: eleni@0: void set_column_vector(const Vector3 &vec, unsigned int col_index); eleni@0: void set_row_vector(const Vector3 &vec, unsigned int row_index); eleni@0: Vector3 get_column_vector(unsigned int col_index) const; eleni@0: Vector3 get_row_vector(unsigned int row_index) const; eleni@0: eleni@0: void transpose(); eleni@0: Matrix4x4 transposed() const; eleni@0: float determinant() const; eleni@0: Matrix4x4 adjoint() const; eleni@0: Matrix4x4 inverse() const; eleni@0: }; eleni@0: eleni@0: /* binary operations matrix (op) matrix */ eleni@0: Matrix4x4 operator +(const Matrix4x4 &m1, const Matrix4x4 &m2); eleni@0: Matrix4x4 operator -(const Matrix4x4 &m1, const Matrix4x4 &m2); eleni@0: Matrix4x4 operator *(const Matrix4x4 &m1, const Matrix4x4 &m2); eleni@0: eleni@0: void operator +=(Matrix4x4 &m1, const Matrix4x4 &m2); eleni@0: void operator -=(Matrix4x4 &m1, const Matrix4x4 &m2); eleni@0: inline void operator *=(Matrix4x4 &m1, const Matrix4x4 &m2); eleni@0: eleni@0: /* binary operations matrix (op) scalar and scalar (op) matrix */ eleni@0: Matrix4x4 operator *(const Matrix4x4 &mat, float scalar); eleni@0: Matrix4x4 operator *(float scalar, const Matrix4x4 &mat); eleni@0: eleni@0: void operator *=(Matrix4x4 &mat, float scalar); eleni@0: eleni@0: std::ostream &operator <<(std::ostream &out, const Matrix4x4 &mat); eleni@0: eleni@0: eleni@0: #endif eleni@0: