X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fmatrix.h;h=5c20d60c7d333b2a4c468bf9c7fcd250dc1ee312;hb=2b779717e42b514210f7128cf9aee2276650e003;hp=b574c7359506bf05e9cecc46fd9f4593f721bab2;hpb=b617c5d7b5283ad260a77f01e42e6170cabbc03d;p=libs%2Fgl.git diff --git a/source/matrix.h b/source/matrix.h index b574c735..5c20d60c 100644 --- a/source/matrix.h +++ b/source/matrix.h @@ -1,45 +1,107 @@ -/* $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 "gl.h" +#include "vector.h" namespace Msp { namespace GL { -enum MatrixMode +class Matrix: public LinAl::SquareMatrix { - MODELVIEW = GL_MODELVIEW, - PROJECTION = GL_PROJECTION, - TEXTURE = GL_TEXTURE +private: + typedef LinAl::SquareMatrix Base; + typedef Geometry::Angle Angle; + +public: + Matrix(); + Matrix(const float *); + Matrix(const double *); + Matrix(const LinAl::Matrix &); + + const double *data() const { return &Base::operator()(0, 0); } + + void multiply(const Matrix &); + 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 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); + 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); }; -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 +class MatrixStack { - PushMatrix() { push_matrix(); } - ~PushMatrix() { pop_matrix(); } -}; +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; -void translate(float, float, float); -void rotate(float, float, float, float); -void scale(float, float, float); -void scale_uniform(float); + 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(); +}; } // namespace GL } // namespace Msp