X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fmatrix.cpp;h=a4c36a022a9ecb338406a496760f12c1d0655540;hp=092d2c62ca149cb73764d8c40ab00d7382a8f874;hb=HEAD;hpb=cdf6744cb3a73030bc767a23b7ed5215919e53c5 diff --git a/source/matrix.cpp b/source/matrix.cpp deleted file mode 100644 index 092d2c62..00000000 --- a/source/matrix.cpp +++ /dev/null @@ -1,236 +0,0 @@ -#include -#include -#include -#include "error.h" -#include "matrix.h" - -using namespace std; - -namespace Msp { -namespace GL { - -Matrix::Matrix(): - Base(Base::identity()) -{ } - -Matrix::Matrix(const float *m): - Base(LinAl::SquareMatrix(m)) -{ } - -Matrix::Matrix(const double *m): - Base(m) -{ } - -Matrix::Matrix(const LinAl::Matrix &other): - Base(other) -{ } - -void Matrix::multiply(const Matrix &other) -{ - *this = *this*other; -} - -void Matrix::translate(const Vector3 &t) -{ - multiply(translation(t)); -} - -void Matrix::rotate(const Angle &a, const Vector3 &x) -{ - multiply(rotation(a, x)); -} - -void Matrix::scale(const Vector3 &s) -{ - multiply(scaling(s)); -} - -Matrix Matrix::operator*(const Matrix &other) const -{ - return static_cast(*this)*static_cast(other); -} - -Matrix &Matrix::operator*=(const Matrix &other) -{ - multiply(other); - return *this; -} - -Vector4 Matrix::operator*(const Vector4 &vec) const -{ - return static_cast(*this)*LinAl::Vector(vec); -} - -Vector3 Matrix::operator*(const Vector3 &vec) const -{ - return Vector3((*this)*Vector4(vec, 1.0f)); -} - -double Matrix::operator[](unsigned i) const -{ - if(i>=16) - throw out_of_range("Matrix::operator[]"); - return operator()(i%4, i/4); -} - -Matrix Matrix::translation(const Vector3 &t) -{ - return Geometry::AffineTransformation::translation(t).get_matrix(); -} - -Matrix Matrix::rotation(const Angle &a, const Vector3 &x) -{ - return Geometry::AffineTransformation::rotation(a, x).get_matrix(); -} - -Matrix Matrix::scaling(const Vector3 &s) -{ - return Geometry::AffineTransformation::scaling(s).get_matrix(); -} - -Matrix Matrix::ortho(double l, double r, double b, double t, double n, double f) -{ - if(l==r || b==t || n==f) - throw invalid_argument("Matrix::ortho"); - - Matrix result; - result(0, 0) = 2/(r-l); - result(1, 1) = 2/(t-b); - result(2, 2) = -2/(f-n); - result(0, 3) = -(r+l)/(r-l); - result(1, 3) = -(t+b)/(t-b); - result(2, 3) = -(f+n)/(f-n); - return result; -} - -Matrix Matrix::ortho_centered(double w, double h) -{ - return ortho(-w/2, w/2, -h/2, h/2, -1, 1); -} - -Matrix Matrix::ortho_bottomleft(double w, double h) -{ - return ortho(0, w, 0, h, -1, 1); -} - -Matrix Matrix::ortho_topleft(double w, double h) -{ - return ortho(0, w, h, 0, -1, 1); -} - -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 invalid_argument("Matrix::frustum"); - - Matrix result; - result(0, 0) = 2*n/(r-l); - result(1, 1) = 2*n/(t-b); - result(0, 2) = (r+l)/(r-l); - result(1, 2) = (t+b)/(t-b); - result(2, 2) = -(f+n)/(f-n); - result(3, 2) = -1; - result(2, 3) = -2*f*n/(f-n); - result(3 ,3) = 0; - return result; -} - -Matrix Matrix::frustum_centered(double w, double h, double n, double f) -{ - return frustum(-w/2, w/2, -h/2, h/2, n, f); -} - -Matrix Matrix::perspective(double h, double a, double n, double f) -{ - double hh = tan(h/2)*n; - return frustum(-hh*a, hh*a, -hh, hh, n, f); -} - - -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 -{ - return matrices.back(); -} - -void MatrixStack::load(const Matrix &m) -{ - matrices.back() = m; - update(); -} - -void MatrixStack::multiply(const Matrix &m) -{ - matrices.back() *= m; - update(); -} - -void MatrixStack::push() -{ - matrices.push_back(top()); -} - -void MatrixStack::pop() -{ - if(matrices.size()==1) - throw stack_underflow("MatrixStack::pop()"); - - matrices.pop_back(); - update(); -} - -void MatrixStack::update() -{ - if(!mode) - return; - - if(mode!=current_mode) - { - glMatrixMode(mode); - current_mode = mode; - } - - glLoadMatrixd(matrices.back().data()); -} - -MatrixStack &MatrixStack::operator=(const Matrix &m) -{ - load(m); - return *this; -} - -MatrixStack &MatrixStack::operator*=(const Matrix &m) -{ - multiply(m); - return *this; -} - -MatrixStack &MatrixStack::modelview() -{ - static MatrixStack ms(GL_MODELVIEW); - return ms; -} - -MatrixStack &MatrixStack::projection() -{ - static MatrixStack ms(GL_PROJECTION); - return ms; -} - -} // namespace GL -} // namespace Msp