X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fmatrix.h;h=2dc3b972721ef1eeb417f4d3b2be6499bb72ca45;hb=fa5b232a16e11d7950e80764497f0167ec9e3b41;hp=b4cc339ceccd3a46601e3529c4e21bcd563150b0;hpb=3f285d3f4fd0a6790bf1efa780284dc7ba2287a2;p=libs%2Fgl.git diff --git a/source/matrix.h b/source/matrix.h index b4cc339c..2dc3b972 100644 --- a/source/matrix.h +++ b/source/matrix.h @@ -1,31 +1,108 @@ -/* $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 { -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 LinAl::Matrix &); + + const float *data() const { return &Base::operator()(0, 0); } + + void multiply(const Matrix &); + void translate(float x, float y, float z) { translate(Vector3(x, y, z)); } + void translate(const Vector3 &); + void rotate(const Angle &a, float x, float y, float z) { rotate(a, Vector3(x, y, z)); } + void rotate(const Angle &, const Vector3 &); + void rotate(float a, float x, float y, float z) { rotate(Angle::from_radians(a), Vector3(x, y, z)); } + void rotate(float a, const Vector3 &x) { rotate(Angle::from_radians(a), x); } + void rotate_deg(float a, float x, float y, float z) { rotate(Angle::from_degrees(a), Vector3(x, y, z)); } + void rotate_deg(float a, const Vector3 & x) { rotate(Angle::from_degrees(a), x); } + void scale(float s) { scale(Vector3(s, s, s)); } + void scale(float x, float y, float 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; + 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); }; -void matrix_mode(MatrixMode); -void load_identity(); -void mult_matrix(const float *); -void mult_matrix(const double *); -void push_matrix(); -void pop_matrix(); +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(); +}; } // namespace GL } // namespace Msp