]> git.tdb.fi Git - libs/gl.git/commitdiff
Add conversion from Vector4 to Vector3
authorMikko Rasa <tdb@tdb.fi>
Sun, 5 Dec 2010 18:56:03 +0000 (18:56 +0000)
committerMikko Rasa <tdb@tdb.fi>
Sun, 5 Dec 2010 18:56:03 +0000 (18:56 +0000)
Add overloads of Matrix transformations with Vector3 parameters
Add multiplication operator between Matrix and Vector4

source/matrix.cpp
source/matrix.h
source/vector.h

index a4b60dc604a17fb5b95bbd7a5262628b26259408..4c3a7ee6a477d64733d1665c9766caedda5ac0ec 100644 (file)
@@ -134,6 +134,25 @@ Matrix &Matrix::operator*=(const Matrix &other)
        return *this;
 }
 
+Vector4 Matrix::operator*(const Vector4 &vec) const
+{
+       if(flags==IDENTITY)
+               return vec;
+       else if(flags==TRANSLATE)
+               return Vector4(vec.x+vec.w*matrix[12], vec.y+vec.w*matrix[13], vec.z+vec.w*matrix[14], vec.w);
+       else if(flags==SCALE)
+               return Vector4(vec.x*matrix[0], vec.y*matrix[5], vec.z*matrix[10], vec.w);
+       else
+       {
+               Vector4 result;
+               result.x = vec.x*matrix[0]+vec.y*matrix[4]+vec.z*matrix[8]+vec.w*matrix[12];
+               result.y = vec.x*matrix[1]+vec.y*matrix[5]+vec.z*matrix[9]+vec.w*matrix[13];
+               result.z = vec.x*matrix[2]+vec.y*matrix[6]+vec.z*matrix[10]+vec.w*matrix[14];
+               result.w = vec.x*matrix[3]+vec.y*matrix[7]+vec.z*matrix[11]+vec.w*matrix[15];
+               return result;
+       }
+}
+
 double Matrix::operator[](unsigned i) const
 {
        if(i>=16)
index a2194916e52d80a8e7cd322b1af93e0b3871d223..42e70c985d5d78d0cc22d408e187f1dda7a5f025 100644 (file)
@@ -10,6 +10,7 @@ Distributed under the LGPL
 
 #include <list>
 #include "gl.h"
+#include "vector.h"
 
 namespace Msp {
 namespace GL {
@@ -41,18 +42,25 @@ public:
 
        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);
 
index d1693af101ab04c5806038b247264302704e5295..25ebac1180c8fc1cc5dc531f0616e3eefe915589 100644 (file)
@@ -11,12 +11,15 @@ Distributed under the LGPL
 namespace Msp {
 namespace GL {
 
+struct Vector4;
+
 struct Vector3
 {
        float x, y, z;
 
        Vector3(): x(0), y(0), z(0) { }
        Vector3(float x_, float y_, float z_): x(x_), y(y_), z(z_) { }
+       Vector3(const Vector4 &);
 };
 
 struct Vector4
@@ -29,6 +32,10 @@ struct Vector4
        Vector4(const Vector3 &v): x(v.x), y(v.y), z(v.z), w(1) { }
 };
 
+inline Vector3::Vector3(const Vector4 &v):
+       x(v.x/v.w), y(v.y/v.w), z(v.z/v.w)
+{ }
+
 } // namespace GL
 } // namespace Msp