00001 #ifndef GSGL_math_VECTOR4_H
00002 #define GSGL_math_VECTOR4_H
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 #include "math/math.hpp"
00038 #include "math/matrix.hpp"
00039 
00040 namespace gsgl
00041 {
00042 
00043     class string;
00044     
00045     namespace math
00046     {
00047     
00048 
00049 
00050 
00051 
00052 
00053         class MATH_API vector 
00054             : public matrix<4,1,gsgl::real_t>
00055         {
00056         public:
00057             vector(gsgl::real_t x = 0, gsgl::real_t y = 0, gsgl::real_t z = 0);
00058             vector(const vector &);
00059             vector(const matrix<4,1,gsgl::real_t> &);
00060 
00061             explicit vector(const gsgl::real_t *);
00062             explicit vector(const gsgl::string &);
00063             
00064             vector & operator= (const vector &);
00065             vector & operator= (const matrix<4,1,gsgl::real_t> &);
00066             virtual ~vector();
00067                         
00068             inline const gsgl::real_t & get_x() const { return data[0]; }
00069             inline const gsgl::real_t & get_y() const { return data[1]; }
00070             inline const gsgl::real_t & get_z() const { return data[2]; }
00071             inline const gsgl::real_t & get_w() const { return data[3]; }
00072 
00073             inline gsgl::real_t & get_x() { return data[0]; }
00074             inline gsgl::real_t & get_y() { return data[1]; }
00075             inline gsgl::real_t & get_z() { return data[2]; }
00076             inline gsgl::real_t & get_w() { return data[3]; }
00077 
00078 
00079             void normalize();
00080             
00081 
00082             void normalize_h();
00083             
00084             gsgl::real_t mag() const;  
00085             gsgl::real_t mag2() const; 
00086             
00087             vector & operator+ () { return *this; }
00088             vector operator- () const;
00089             vector operator+ (const vector &) const;
00090             vector operator- (const vector &) const;
00091 
00092             vector & operator+= (const vector &);
00093             vector & operator-= (const vector &);
00094 
00095             vector & operator*= (const gsgl::real_t);
00096             vector operator* (const gsgl::real_t);
00097             
00098             gsgl::real_t dot(const vector &) const;
00099             vector cross(const vector &) const;
00100             
00101             static vector interpolate(const vector & start, const vector & end, const gsgl::real_t & percent);
00102 
00103             static vector parse(const gsgl::string &);
00104 
00105             static const vector ZERO;
00106             static const vector X_AXIS;
00107             static const vector Y_AXIS;
00108             static const vector Z_AXIS;
00109             static const vector NEG_X_AXIS;
00110             static const vector NEG_Y_AXIS;
00111             static const vector NEG_Z_AXIS;
00112         }; 
00113         
00114 
00115 
00116         inline vector operator* (gsgl::real_t n, const vector & v)
00117         {
00118             return vector(n*v.get_x(), n*v.get_y(), n*v.get_z());
00119         }
00120         
00121 
00122 
00123         inline vector operator* (const vector & v, gsgl::real_t n)
00124         {
00125             return vector(n*v.get_x(), n*v.get_y(), n*v.get_z());
00126         }
00127 
00128 
00129 
00130         inline vector operator/ (const vector & v, gsgl::real_t n)
00131         {
00132             return v * (static_cast<gsgl::real_t>(1) / n);
00133         }
00134         
00135     } 
00136     
00137 } 
00138 
00139 #endif