X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fmatrix.h;h=e32df7e3872ea6ea270ecfe0d13e8fe25db82d9c;hp=b4cc339ceccd3a46601e3529c4e21bcd563150b0;hb=f14435e58bfa0fa697a06ba9a454bb30cd37d9d8;hpb=3f285d3f4fd0a6790bf1efa780284dc7ba2287a2 diff --git a/source/matrix.h b/source/matrix.h index b4cc339c..e32df7e3 100644 --- a/source/matrix.h +++ b/source/matrix.h @@ -1,32 +1,144 @@ -/* $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 "gl.h" +#include "vector.h" namespace Msp { namespace GL { +class Matrix +{ +private: + enum Flags + { + IDENTITY = 0, + TRANSLATE = 1, + ROTATE = 2, + SCALE = 4, + ARBITARY = 8 + }; + + double matrix[16]; + unsigned flags; + +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::list 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(); +}; + + +/* 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 + 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