X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fmatrix.h;h=cb61e292f0eaad46a195995f6c92a5bbf7c1afe8;hp=6aae6df0a0e5f2a494e570932f044cb64c89d8de;hb=bec07999d95b76f4b47cffcc564d0cd0afc0435e;hpb=2997aeeea512437e8b8f61bef4cb329756888695 diff --git a/source/matrix.h b/source/matrix.h index 6aae6df0..cb61e292 100644 --- a/source/matrix.h +++ b/source/matrix.h @@ -2,109 +2,67 @@ #define MSP_GL_MATRIX_H_ #include +#include +#include #include "gl.h" #include "vector.h" namespace Msp { namespace GL { -class Matrix +class Matrix: public LinAl::SquareMatrix { private: - enum Flags - { - IDENTITY = 0, - TRANSLATE = 1, - ROTATE = 2, - SCALE = 4, - ARBITARY = 8 - }; - - double matrix[16]; - unsigned flags; + typedef LinAl::SquareMatrix Base; + typedef Geometry::Angle Angle; public: Matrix(); Matrix(const float *); - Matrix(const double *); -private: - void check_flags(); - -public: - const double *data() const { return matrix; } - - void multiply(const Matrix &); - void translate(double, double, double); - void translate(const Vector3 &t) { translate(t.x, t.y, t.z); } - void rotate(double, double, double, double); - void rotate(double a, const Vector3 &x) { rotate(a, x.x, x.y, x.z); } - void rotate_deg(double, double, double, double); - void rotate_deg(double a, const Vector3 & x) { rotate_deg(a, x.x, x.y, x.z); } - void scale(double); - void scale(double, double, double); - - Matrix operator*(const Matrix &) const; - Matrix &operator*=(const Matrix &); - Vector4 operator*(const Vector4 &) const; - double operator[](unsigned) const; - - static Matrix translation(double, double, double); - static Matrix translation(const Vector3 &t) { return translation(t.x, t.y, t.z); } - static Matrix rotation(double, double, double, double); - static Matrix rotation(double a, const Vector3 &x) { return rotation(a, x.x, x.y, x.z); } - static Matrix rotation_deg(double, double, double, double); - static Matrix rotation_deg(double a, const Vector3 &x) { return rotation_deg(a, x.x, x.y, x.z); } - static Matrix scaling(double); - static Matrix scaling(double, double, double); - - static Matrix ortho(double, double, double, double, double, double); - static Matrix ortho_centered(double, double); - static Matrix ortho_bottomleft(double, double); - static Matrix ortho_topleft(double, double); - static Matrix frustum(double, double, double, double, double, double); - static Matrix frustum_centered(double, double, double, double); - static Matrix perspective(double, double, double, double); -}; - -class MatrixStack -{ -public: - class Push - { - private: - MatrixStack &stack; - - public: - Push(MatrixStack &s): stack(s) { stack.push(); } - ~Push() { stack.pop(); } - }; - -private: - GLenum mode; - std::vector matrices; - - static GLenum current_mode; - - MatrixStack(const MatrixStack &); - MatrixStack &operator=(const MatrixStack &); - MatrixStack(GLenum); -public: - MatrixStack(); - - const Matrix &top() const; - void load(const Matrix &); - void multiply(const Matrix &); - void push(); - void pop(); -private: - virtual void update(); - -public: - MatrixStack &operator=(const Matrix &); - MatrixStack &operator*=(const Matrix &); - - static MatrixStack &modelview(); - static MatrixStack &projection(); + Matrix(const LinAl::Matrix &); + + const float *data() const { return &Base::operator()(0, 0); } + + Matrix &multiply(const Matrix &m) { return operator*=(m); } + Matrix &translate(float x, float y, float z) { return translate(Vector3(x, y, z)); } + Matrix &translate(const Vector3 &); + Matrix &rotate(const Angle &a, float x, float y, float z) { return rotate(a, Vector3(x, y, z)); } + Matrix &rotate(const Angle &, const Vector3 &); + Matrix &rotate(float a, float x, float y, float z) { return rotate(Angle::from_radians(a), Vector3(x, y, z)); } + Matrix &rotate(float a, const Vector3 &x) { return rotate(Angle::from_radians(a), x); } + Matrix &rotate_deg(float a, float x, float y, float z) { return rotate(Angle::from_degrees(a), Vector3(x, y, z)); } + Matrix &rotate_deg(float a, const Vector3 & x) { return rotate(Angle::from_degrees(a), x); } + Matrix &scale(float s) { return scale(Vector3(s, s, s)); } + Matrix &scale(float x, float y, float z) { return scale(Vector3(x, y, z)); } + Matrix &scale(const Vector3 &); + + Matrix operator*(const Matrix &m) const { return static_cast(*this)*static_cast(m); } + Matrix &operator*=(const Matrix &m) { Base::operator*=(m); return *this; } + Matrix operator*(float s) const { return static_cast(*this)*s; } + Matrix &operator*=(float s) { Base::operator*=(s); return *this; } + Vector4 operator*(const Vector4 &v) const { return static_cast(*this)*v; } + Vector3 operator*(const Vector3 &v) const { return ((*this)*compose(v, 1.0f)).slice<3>(0); } + float operator[](unsigned) const; + + static Matrix translation(float x, float y, float z) { return translation(Vector3(x, y, z)); } + static Matrix translation(const Vector3 &); + static Matrix rotation(const Angle &a, float x, float y, float z) { return rotation(a, Vector3(x, y, z)); } + static Matrix rotation(const Angle &, const Vector3 &); + static Matrix rotation(float a, float x, float y, float z) { return rotation(Angle::from_radians(a), Vector3(x, y, z)); } + static Matrix rotation(float a, const Vector3 &x) { return rotation(Angle::from_radians(a), x); } + static Matrix rotation_deg(float a, float x, float y, float z) { return rotation(Angle::from_degrees(a), Vector3(x, y, z)); } + static Matrix rotation_deg(float a, const Vector3 &x) { return rotation(Angle::from_degrees(a), x); } + static Matrix scaling(float s) { return scaling(Vector3(s, s, s)); } + static Matrix scaling(float x, float y, float z) { return scaling(Vector3(x, y, z)); } + static Matrix scaling(const Vector3 &); + + static Matrix ortho(float, float, float, float, float, float); + static Matrix ortho_centered(float, float); + static Matrix ortho_bottomleft(float, float); + static Matrix ortho_topleft(float, float); + static Matrix frustum(float, float, float, float, float, float); + static Matrix frustum_centered(float, float, float, float); + static Matrix perspective(const Angle &, float, float, float); }; } // namespace GL