X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fmatrix.h;h=5c20d60c7d333b2a4c468bf9c7fcd250dc1ee312;hb=2b779717e42b514210f7128cf9aee2276650e003;hp=42e70c985d5d78d0cc22d408e187f1dda7a5f025;hpb=705986ebcdd24573791aa58c7a8f2b7549c918a3;p=libs%2Fgl.git diff --git a/source/matrix.h b/source/matrix.h index 42e70c98..5c20d60c 100644 --- a/source/matrix.h +++ b/source/matrix.h @@ -1,68 +1,57 @@ -/* $Id$ - -This file is part of libmspgl -Copyright © 2007 Mikko Rasa, Mikkosoft Productions -Distributed under the LGPL -*/ - #ifndef MSP_GL_MATRIX_H_ #define MSP_GL_MATRIX_H_ -#include +#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 &, 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, 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); @@ -88,7 +77,7 @@ public: private: GLenum mode; - std::list matrices; + std::vector matrices; static GLenum current_mode; @@ -98,13 +87,13 @@ private: public: MatrixStack(); - const Matrix &top(); + const Matrix &top() const; void load(const Matrix &); void multiply(const Matrix &); void push(); void pop(); private: - void update(); + virtual void update(); public: MatrixStack &operator=(const Matrix &); @@ -114,38 +103,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