X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fmatrix.h;h=ce21b46f1192aab039ddbdd53b391a3e4e21b43c;hb=60ca0094db80ea88ad546c98866f73a8d152e02b;hp=5444b8b4e4fae1c1789077ea58eb2099a06d8e58;hpb=1b7b75e3aaec35433cce81fc58e58e50e5a3f36e;p=libs%2Fgl.git diff --git a/source/matrix.h b/source/matrix.h index 5444b8b4..ce21b46f 100644 --- a/source/matrix.h +++ b/source/matrix.h @@ -2,60 +2,58 @@ #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(); + Matrix(const LinAl::Matrix &); -public: - const double *data() const { return matrix; } + const double *data() const { return &Base::operator()(0, 0); } 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); + void translate(double x, double y, double z) { translate(Vector3(x, y, z)); } + void translate(const Vector3 &); + void rotate(const Angle &a, double x, double y, double z) { rotate(a, Vector3(x, y, z)); } + void rotate(const Angle &, const Vector3 &); + void rotate(double a, double x, double y, double z) { rotate(Angle::from_radians(a), Vector3(x, y, z)); } + void rotate(double a, const Vector3 &x) { rotate(Angle::from_radians(a), x); } + void rotate_deg(double a, double x, double y, double z) { rotate(Angle::from_degrees(a), Vector3(x, y, z)); } + void rotate_deg(double a, const Vector3 & x) { rotate(Angle::from_degrees(a), x); } + void scale(double s) { scale(Vector3(s, s, s)); } + void scale(double x, double y, double z) { scale(Vector3(x, y, z)); } + void scale(const Vector3 &); Matrix operator*(const Matrix &) const; Matrix &operator*=(const Matrix &); Vector4 operator*(const Vector4 &) const; + Vector3 operator*(const Vector3 &) 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 translation(double x, double y, double z) { return translation(Vector3(x, y, z)); } + static Matrix translation(const Vector3 &); + static Matrix rotation(const Angle &a, double x, double y, double z) { return rotation(a, Vector3(x, y, z)); } + static Matrix rotation(const Angle &, const Vector3 &); + static Matrix rotation(double a, double x, double y, double z) { return rotation(Angle::from_radians(a), Vector3(x, y, z)); } + static Matrix rotation(double a, const Vector3 &x) { return rotation(Angle::from_radians(a), x); } + static Matrix rotation_deg(double a, double x, double y, double z) { return rotation(Angle::from_degrees(a), Vector3(x, y, z)); } + static Matrix rotation_deg(double a, const Vector3 &x) { return rotation(Angle::from_degrees(a), x); } + static Matrix scaling(double s) { return scaling(Vector3(s, s, s)); } + static Matrix scaling(double x, double y, double z) { return scaling(Vector3(x, y, z)); } + static Matrix scaling(const Vector3 &); static Matrix ortho(double, double, double, double, double, double); static Matrix ortho_centered(double, double); @@ -63,7 +61,7 @@ public: 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); + static Matrix perspective(const Angle &, double, double, double); }; class MatrixStack @@ -107,38 +105,6 @@ public: static MatrixStack &projection(); }; - -/* The stuff below is deprecated and preserved (for now) only for compatibility -with existing applications */ - -enum MatrixMode -{ - MODELVIEW = GL_MODELVIEW, - PROJECTION = GL_PROJECTION, - TEXTURE = GL_TEXTURE -}; - -void matrix_mode(MatrixMode); -void load_identity(); -void load_matrix(const float *); -void load_matrix(const double *); -void mult_matrix(const float *); -void mult_matrix(const double *); -void push_matrix(); -void pop_matrix(); - -/// RAII object - pushes matrix when constructed and pops when destroyed -struct PushMatrix -{ - PushMatrix() { push_matrix(); } - ~PushMatrix() { pop_matrix(); } -}; - -void translate(float, float, float); -void rotate(float, float, float, float); -void scale(float, float, float); -void scale_uniform(float); - } // namespace GL } // namespace Msp