]> git.tdb.fi Git - libs/gl.git/blobdiff - source/matrix.h
Drop Id tags and copyright notices from files
[libs/gl.git] / source / matrix.h
index 13de6c8f4542030eb22e35647c443e6e473640fb..e32df7e3872ea6ea270ecfe0d13e8fe25db82d9c 100644 (file)
-/* $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 <list>
 #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<Matrix> 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();