X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fmatrix.cpp;h=a4c36a022a9ecb338406a496760f12c1d0655540;hp=cac4a4fcd99afe6d2e110c80030aad39dd9352c1;hb=a4549c55a6d47129bd9e42c6a49a671b759ce6d9;hpb=60ca0094db80ea88ad546c98866f73a8d152e02b diff --git a/source/matrix.cpp b/source/matrix.cpp index cac4a4fc..a4c36a02 100644 --- a/source/matrix.cpp +++ b/source/matrix.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include "error.h" #include "matrix.h" @@ -14,59 +15,29 @@ Matrix::Matrix(): { } Matrix::Matrix(const float *m): - Base(LinAl::SquareMatrix(m)) -{ } - -Matrix::Matrix(const double *m): Base(m) { } -Matrix::Matrix(const LinAl::Matrix &other): +Matrix::Matrix(const LinAl::Matrix &other): Base(other) { } -void Matrix::multiply(const Matrix &other) -{ - *this = *this*other; -} - -void Matrix::translate(const Vector3 &t) +Matrix &Matrix::translate(const Vector3 &t) { - multiply(translation(t)); + return multiply(translation(t)); } -void Matrix::rotate(const Angle &a, const Vector3 &x) +Matrix &Matrix::rotate(const Angle &a, const Vector3 &x) { - multiply(rotation(a, x)); + return multiply(rotation(a, x)); } -void Matrix::scale(const Vector3 &s) +Matrix &Matrix::scale(const Vector3 &s) { - multiply(scaling(s)); + return 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 +float Matrix::operator[](unsigned i) const { if(i>=16) throw out_of_range("Matrix::operator[]"); @@ -75,20 +46,20 @@ double Matrix::operator[](unsigned i) const Matrix Matrix::translation(const Vector3 &t) { - return Geometry::AffineTransformation::translation(t).get_matrix(); + return Geometry::AffineTransformation::translation(t).get_matrix(); } Matrix Matrix::rotation(const Angle &a, const Vector3 &x) { - return Geometry::AffineTransformation::rotation(a, x).get_matrix(); + return Geometry::AffineTransformation::rotation(a, x).get_matrix(); } Matrix Matrix::scaling(const Vector3 &s) { - return Geometry::AffineTransformation::scaling(s).get_matrix(); + return Geometry::AffineTransformation::scaling(s).get_matrix(); } -Matrix Matrix::ortho(double l, double r, double b, double t, double n, double f) +Matrix Matrix::ortho(float l, float r, float b, float t, float n, float f) { if(l==r || b==t || n==f) throw invalid_argument("Matrix::ortho"); @@ -103,22 +74,22 @@ Matrix Matrix::ortho(double l, double r, double b, double t, double n, double f) return result; } -Matrix Matrix::ortho_centered(double w, double h) +Matrix Matrix::ortho_centered(float w, float h) { return ortho(-w/2, w/2, -h/2, h/2, -1, 1); } -Matrix Matrix::ortho_bottomleft(double w, double h) +Matrix Matrix::ortho_bottomleft(float w, float h) { return ortho(0, w, 0, h, -1, 1); } -Matrix Matrix::ortho_topleft(double w, double h) +Matrix Matrix::ortho_topleft(float w, float h) { return ortho(0, w, h, 0, -1, 1); } -Matrix Matrix::frustum(double l, double r, double b, double t, double n, double f) +Matrix Matrix::frustum(float l, float r, float b, float t, float n, float f) { if(l==r || b==t || n<=0 || f<=n) throw invalid_argument("Matrix::frustum"); @@ -131,18 +102,18 @@ Matrix Matrix::frustum(double l, double r, double b, double t, double n, double result(2, 2) = -(f+n)/(f-n); result(3, 2) = -1; result(2, 3) = -2*f*n/(f-n); - result(3 ,3) = 0; + result(3, 3) = 0; return result; } -Matrix Matrix::frustum_centered(double w, double h, double n, double f) +Matrix Matrix::frustum_centered(float w, float h, float n, float f) { return frustum(-w/2, w/2, -h/2, h/2, n, f); } -Matrix Matrix::perspective(const Angle &h, double a, double n, double f) +Matrix Matrix::perspective(const Angle &h, float a, float n, float f) { - double hh = tan(h/2.0)*n; + float hh = tan(h/2.0f)*n; return frustum(-hh*a, hh*a, -hh, hh, n, f); } @@ -199,13 +170,15 @@ void MatrixStack::update() if(!mode) return; + static Require _req(MSP_legacy_features); + if(mode!=current_mode) { glMatrixMode(mode); current_mode = mode; } - glLoadMatrixd(matrices.back().data()); + glLoadMatrixf(matrices.back().data()); } MatrixStack &MatrixStack::operator=(const Matrix &m)