]> git.tdb.fi Git - libs/gl.git/blobdiff - source/matrix.cpp
More efficient stack management
[libs/gl.git] / source / matrix.cpp
index 4c3a7ee6a477d64733d1665c9766caedda5ac0ec..b7f76bc77528965fcff8f15ef90b353cf3dd836b 100644 (file)
@@ -1,13 +1,6 @@
-/* $Id$
-
-This file is part of libmspgl
-Copyright © 2007  Mikko Rasa, Mikkosoft Productions
-Distributed under the LGPL
-*/
-
 #include <algorithm>
 #include <cmath>
-#include <msp/core/except.h>
+#include "error.h"
 #include "matrix.h"
 
 using namespace std;
@@ -156,7 +149,7 @@ Vector4 Matrix::operator*(const Vector4 &vec) const
 double Matrix::operator[](unsigned i) const
 {
        if(i>=16)
-               throw InvalidParameterValue("Matrix element index out of range");
+               throw out_of_range("Matrix::operator[]");
        return matrix[i];
 }
 
@@ -222,7 +215,7 @@ Matrix Matrix::scaling(double x, double y, double z)
 Matrix Matrix::ortho(double l, double r, double b, double t, double n, double f)
 {
        if(l==r || b==t || n==f)
-               throw InvalidParameterValue("Orthogonal projection can't have zero dimension");
+               throw invalid_argument("Matrix::ortho");
 
        Matrix result;
        result.matrix[0] = 2/(r-l);
@@ -253,7 +246,7 @@ Matrix Matrix::ortho_topleft(double w, double h)
 Matrix Matrix::frustum(double l, double r, double b, double t, double n, double f)
 {
        if(l==r || b==t || n<=0 || f<=n)
-               throw InvalidParameterValue("Invalid frustum parameters");
+               throw invalid_argument("Matrix::frustum");
 
        Matrix result;
        result.matrix[0] = 2*n/(r-l);
@@ -285,16 +278,18 @@ GLenum MatrixStack::current_mode = GL_MODELVIEW;
 MatrixStack::MatrixStack(GLenum m):
        mode(m)
 {
+       matrices.reserve(mode==GL_MODELVIEW ? 32 : 4);
        matrices.push_back(Matrix());
 }
 
 MatrixStack::MatrixStack():
        mode(0)
 {
+       matrices.reserve(32);
        matrices.push_back(Matrix());
 }
 
-const Matrix &MatrixStack::top()
+const Matrix &MatrixStack::top() const
 {
        return matrices.back();
 }
@@ -319,7 +314,7 @@ void MatrixStack::push()
 void MatrixStack::pop()
 {
        if(matrices.size()==1)
-               throw InvalidState("Can't pop the last matrix");
+               throw stack_underflow("MatrixStack::pop()");
 
        matrices.pop_back();
        update();
@@ -375,7 +370,7 @@ void matrix_mode(MatrixMode m)
        else if(m==PROJECTION)
                active_stack = &MatrixStack::projection();
        else
-               throw InvalidParameterValue("Texture matrices are not supported");
+               throw invalid_argument("matrix_mode");
 }
 
 void load_identity()