00001 #ifndef GSGL_MATH_TRANSFORM_H
00002 #define GSGL_MATH_TRANSFORM_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 #include "math/vector.hpp"
00040
00041 namespace gsgl
00042 {
00043
00044 namespace math
00045 {
00046
00047 class quaternion;
00048
00049
00050
00051 class MATH_API transform
00052 : public matrix<4,4,gsgl::real_t>
00053 {
00054 public:
00055 transform();
00056 explicit transform(const gsgl::real_t *);
00057 explicit transform(const quaternion &);
00058 transform(const transform &);
00059 transform(const matrix<4,4,gsgl::real_t> &);
00060
00061 transform & operator= (const transform &);
00062 transform & operator= (const matrix<4,4,gsgl::real_t> &);
00063 transform & operator= (const quaternion &);
00064
00065 virtual ~transform();
00066
00067
00068
00069 inline const gsgl::real_t & operator[] (const gsgl::index_t & i) const { return data[i]; }
00070 inline gsgl::real_t & operator[] (const gsgl::index_t & i) { return data[i]; }
00071
00072
00073 vector get_basis_x() const;
00074 vector get_basis_y() const;
00075 vector get_basis_z() const;
00076
00077 void set_basis_x(const gsgl::real_t & x, const gsgl::real_t & y, const gsgl::real_t & z);
00078 void set_basis_x(const vector &);
00079 void set_basis_y(const gsgl::real_t & x, const gsgl::real_t & y, const gsgl::real_t & z);
00080 void set_basis_y(const vector &);
00081 void set_basis_z(const gsgl::real_t & x, const gsgl::real_t & y, const gsgl::real_t & z);
00082 void set_basis_z(const vector &);
00083
00084
00085 transform transpose() const;
00086 transform inverse() const;
00087
00088 vector translation_part() const;
00089 transform rotation_part() const;
00090
00091
00092
00093 inline vector operator* (const vector & v) const
00094 {
00095 vector res;
00096 matrix_utils::multiply<4,4,4,1,gsgl::real_t> (*this, v, res);
00097 res.normalize_h();
00098 return res;
00099 }
00100
00101 inline transform operator* (const transform & t) const
00102 {
00103 transform res;
00104 matrix_utils::multiply<4,4,4,4,gsgl::real_t> (*this, t, res);
00105 return res;
00106 }
00107
00108
00109
00110 static transform parse(const gsgl::string &);
00111 static transform translation_transform(const vector &);
00112
00113 static transform scale(const gsgl::real_t & s);
00114 static transform scale(const gsgl::real_t &, const gsgl::real_t &, const gsgl::real_t &);
00115
00116 static transform IDENTITY;
00117 };
00118
00119 }
00120
00121 }
00122
00123 #endif