00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef GEOM_MAT4_HH
00020 #define GEOM_MAT4_HH
00021
00022 #include <cstddef>
00023 #include <ostream>
00024
00025 #include <boost/operators.hpp>
00026
00027 #include <ost/geom/module_config.hh>
00028
00029 namespace geom {
00030
00031
00032 class Mat2;
00033 class Mat3;
00034 class Vec3;
00035
00036 class DLLEXPORT_OST_GEOM Mat4:
00037 private boost::equality_comparable<Mat4>,
00038 private boost::additive<Mat4>,
00039 private boost::multiplicative<Mat4, Real>
00040 {
00041 public:
00042 static Mat4 Identity();
00043
00045 Mat4();
00046
00048
00059 Mat4(Real i00, Real i01, Real i02, Real i03, Real i10, Real i11, Real i12, Real i13,
00060 Real i20, Real i21, Real i22, Real i23, Real i30, Real i31, Real i32, Real i33);
00062 Mat4(const Mat4& m);
00063
00065 explicit Mat4(const Mat2& m);
00066
00068 explicit Mat4(const Mat3& m);
00069
00071 explicit Mat4(const float[16]);
00072
00073 explicit Mat4(const double[16]);
00075 Mat4& operator=(const Mat4& m);
00076
00078 bool operator==(const Mat4& rhs) const;
00079
00081 Real& operator()(std::size_t r, std::size_t c);
00083 const Real& operator()(std::size_t r, std::size_t c) const;
00084
00086 Mat4& operator+=(const Mat4& rhs);
00088 Mat4& operator-=(const Mat4& rhs);
00089
00090 Mat4& operator*=(const Real d);
00091 Mat4& operator/=(const Real d);
00092
00093 Mat4& operator*=(const Mat4& m);
00094
00095 Mat3 ExtractRotation() const;
00096 void PasteRotation(const Mat3& m);
00097 Vec3 ExtractTranslation() const;
00098 void PasteTranslation(const Vec3& v);
00099
00100 Real* Data() {return &data_[0][0];}
00101 const Real* Data() const {return &data_[0][0];}
00102
00103 private:
00104 Real data_[4][4];
00105
00106 void set(float i00, float i01, float i02, float i03, float i10, float i11, float i12,
00107 float i13, float i20, float i21, float i22, float i23, float i30, float i31, float i32,
00108 float i33);
00109 void set(double i00, double i01, double i02, double i03, double i10, double i11, double
00110 i12, double i13, double i20, double i21, double i22, double i23, double i30, double i31,
00111 double i32, double i33);
00112
00113 };
00114
00115 DLLEXPORT_OST_GEOM std::ostream& operator<<(std::ostream& os, const Mat4& m);
00116
00117 }
00118
00119
00120 #endif