00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00027
00029
00030 #ifndef __MATRIX4F_H__
00031 #define __MATRIX4F_H__
00032
00033 #include "H3DApi.h"
00034 #include "H3DBasicTypes.h"
00035 #include "Vec4f.h"
00036 #include "H3DTemplateOperators.h"
00037 #include "Exception.h"
00038 #include "Matrix3f.h"
00039
00040 namespace H3D {
00041 namespace ArithmeticTypes {
00042 class Quaternion;
00043 class Rotation;
00044 class Matrix4d;
00045
00048 class H3DAPI_API Matrix4f {
00049 public:
00052 H3D_API_EXCEPTION( SingularMatrix4f );
00053
00055 inline Matrix4f() { setToIdentity(); }
00056
00058 inline Matrix4f( H3DFloat m00, H3DFloat m01,
00059 H3DFloat m02, H3DFloat m03,
00060 H3DFloat m10, H3DFloat m11,
00061 H3DFloat m12, H3DFloat m13,
00062 H3DFloat m20, H3DFloat m21,
00063 H3DFloat m22, H3DFloat m23,
00064 H3DFloat m30, H3DFloat m31,
00065 H3DFloat m32, H3DFloat m33 ) {
00066 m[0][0] = m00; m[0][1] = m01; m[0][2] = m02; m[0][3] = m03;
00067 m[1][0] = m10; m[1][1] = m11; m[1][2] = m12; m[1][3] = m13;
00068 m[2][0] = m20; m[2][1] = m21; m[2][2] = m22; m[2][3] = m23;
00069 m[3][0] = m30; m[3][1] = m31; m[3][2] = m32; m[3][3] = m33;
00070 }
00071
00073 Matrix4f( const Rotation &r );
00074
00076 Matrix4f( const Quaternion &q );
00077
00080 explicit Matrix4f( const Matrix3f &m );
00081
00083 explicit Matrix4f( const Matrix4d &m );
00084
00086 inline void setToIdentity() {
00087 m[0][0] = 1; m[0][1] = 0; m[0][2] = 0; m[0][3] = 0;
00088 m[1][0] = 0; m[1][1] = 1; m[1][2] = 0; m[1][3] = 0;
00089 m[2][0] = 0; m[2][1] = 0; m[2][2] = 1; m[2][3] = 0;
00090 m[3][0] = 0; m[3][1] = 0; m[3][2] = 0; m[3][3] = 1;
00091 }
00092
00101 Matrix4f transformInverse() const;
00102
00104 inline Matrix4f transpose() const {
00105 return Matrix4f( m[0][0], m[1][0], m[2][0], m[3][0],
00106 m[0][1], m[1][1], m[2][1], m[3][1],
00107 m[0][2], m[1][2], m[2][2], m[3][2],
00108 m[0][3], m[1][3], m[2][3], m[3][3] );
00109 };
00110
00112 Matrix4f inverse() const;
00113
00115 inline H3DFloat* operator[]( const int i ) { return m[i]; }
00116
00118 inline const H3DFloat* operator[]( const int i ) const { return m[i]; }
00119
00121 inline Vec4f getRow( int i ) const {
00122 return Vec4f( m[i][0], m[i][1], m[i][2], m[i][3] );
00123 }
00124
00126 inline Vec4f getColumn( int i ) const {
00127 return Vec4f( m[0][i], m[1][i], m[2][i], m[3][i] );
00128 }
00129
00131 inline H3DFloat getElement( int i, int j ) const {
00132 return m[i][j];
00133 }
00134
00136 inline void setElement( int i, int j, H3DFloat v ) {
00137 m[i][j] = v;
00138 }
00139
00141 inline Matrix3f getScaleRotationPart() const {
00142 return Matrix3f( m[0][0], m[0][1], m[0][2],
00143 m[1][0], m[1][1], m[1][2],
00144 m[2][0], m[2][1], m[2][2] );
00145 }
00146
00148 inline Vec3f getScalePart() const {
00149 return getScaleRotationPart().getScalePart();
00150 }
00151
00153 Matrix3f getRotationPart() const;
00154
00155 private:
00157 H3DFloat m[4][4];
00158 };
00159
00166
00168 inline Matrix4f operator*( const Matrix4f &m1, const Matrix4f &m2 ) {
00169 return Matrix4f(
00170 m1[0][0]*m2[0][0] + m1[0][1]*m2[1][0] + m1[0][2]*m2[2][0] + m1[0][3]*m2[3][0],
00171 m1[0][0]*m2[0][1] + m1[0][1]*m2[1][1] + m1[0][2]*m2[2][1] + m1[0][3]*m2[3][1],
00172 m1[0][0]*m2[0][2] + m1[0][1]*m2[1][2] + m1[0][2]*m2[2][2] + m1[0][3]*m2[3][2],
00173 m1[0][0]*m2[0][3] + m1[0][1]*m2[1][3] + m1[0][2]*m2[2][3] + m1[0][3]*m2[3][3],
00174
00175 m1[1][0]*m2[0][0] + m1[1][1]*m2[1][0] + m1[1][2]*m2[2][0] + m1[1][3]*m2[3][0],
00176 m1[1][0]*m2[0][1] + m1[1][1]*m2[1][1] + m1[1][2]*m2[2][1] + m1[1][3]*m2[3][1],
00177 m1[1][0]*m2[0][2] + m1[1][1]*m2[1][2] + m1[1][2]*m2[2][2] + m1[1][3]*m2[3][2],
00178 m1[1][0]*m2[0][3] + m1[1][1]*m2[1][3] + m1[1][2]*m2[2][3] + m1[1][3]*m2[3][3],
00179
00180 m1[2][0]*m2[0][0] + m1[2][1]*m2[1][0] + m1[2][2]*m2[2][0] + m1[2][3]*m2[3][0],
00181 m1[2][0]*m2[0][1] + m1[2][1]*m2[1][1] + m1[2][2]*m2[2][1] + m1[2][3]*m2[3][1],
00182 m1[2][0]*m2[0][2] + m1[2][1]*m2[1][2] + m1[2][2]*m2[2][2] + m1[2][3]*m2[3][2],
00183 m1[2][0]*m2[0][3] + m1[2][1]*m2[1][3] + m1[2][2]*m2[2][3] + m1[2][3]*m2[3][3],
00184
00185 m1[3][0]*m2[0][0] + m1[3][1]*m2[1][0] + m1[3][2]*m2[2][0] + m1[3][3]*m2[3][0],
00186 m1[3][0]*m2[0][1] + m1[3][1]*m2[1][1] + m1[3][2]*m2[2][1] + m1[3][3]*m2[3][1],
00187 m1[3][0]*m2[0][2] + m1[3][1]*m2[1][2] + m1[3][2]*m2[2][2] + m1[3][3]*m2[3][2],
00188 m1[3][0]*m2[0][3] + m1[3][1]*m2[1][3] + m1[3][2]*m2[2][3] + m1[3][3]*m2[3][3]
00189 );
00190 }
00191
00193 inline Matrix4f operator+( const Matrix4f &m1, const Matrix4f &m2 ) {
00194 return Matrix4f(
00195 m1[0][0]+m2[0][0], m1[0][1]+m2[0][1], m1[0][2]+m2[0][2], m1[0][3]+m2[0][3],
00196 m1[1][0]+m2[1][0], m1[1][1]+m2[1][1], m1[1][2]+m2[1][2], m1[1][3]+m2[1][3],
00197 m1[2][0]+m2[2][0], m1[2][1]+m2[2][1], m1[2][2]+m2[2][2], m1[2][3]+m2[2][3],
00198 m1[3][0]+m2[3][0], m1[3][1]+m2[3][1], m1[3][2]+m2[3][2], m1[3][3]+m2[3][3] );
00199 }
00200
00202 inline Matrix4f operator*( const Matrix4f &m, const float &f ) {
00203 return Matrix4f( m[0][0]*f, m[0][1]*f, m[0][2]*f, m[0][3]*f,
00204 m[1][0]*f, m[1][1]*f, m[1][2]*f, m[1][3]*f,
00205 m[2][0]*f, m[2][1]*f, m[2][2]*f, m[2][3]*f,
00206 m[3][0]*f, m[3][1]*f, m[3][2]*f, m[3][3]*f );
00207 }
00209 inline Matrix4f operator*( const Matrix4f &m, const double &d ) {
00210 return Matrix4f( (H3DFloat)(m[0][0]*d), (H3DFloat)(m[0][1]*d), (H3DFloat)(m[0][2]*d), (H3DFloat)(m[0][3]*d),
00211 (H3DFloat)(m[1][0]*d), (H3DFloat)(m[1][1]*d), (H3DFloat)(m[1][2]*d), (H3DFloat)(m[1][3]*d),
00212 (H3DFloat)(m[2][0]*d), (H3DFloat)(m[2][1]*d), (H3DFloat)(m[2][2]*d), (H3DFloat)(m[2][3]*d),
00213 (H3DFloat)(m[3][0]*d), (H3DFloat)(m[3][1]*d), (H3DFloat)(m[3][2]*d), (H3DFloat)(m[3][3]*d) );
00214 }
00215
00217 inline Matrix4f operator*( const Matrix4f &m, const int &f ) {
00218 return Matrix4f( m[0][0]*f, m[0][1]*f, m[0][2]*f, m[0][3]*f,
00219 m[1][0]*f, m[1][1]*f, m[1][2]*f, m[1][3]*f,
00220 m[2][0]*f, m[2][1]*f, m[2][2]*f, m[2][3]*f,
00221 m[3][0]*f, m[3][1]*f, m[3][2]*f, m[3][3]*f );
00222 }
00223
00225 inline Matrix4f operator*( const Matrix4f &m, const long &f ) {
00226 return Matrix4f( m[0][0]*f, m[0][1]*f, m[0][2]*f, m[0][3]*f,
00227 m[1][0]*f, m[1][1]*f, m[1][2]*f, m[1][3]*f,
00228 m[2][0]*f, m[2][1]*f, m[2][2]*f, m[2][3]*f,
00229 m[3][0]*f, m[3][1]*f, m[3][2]*f, m[3][3]*f );
00230 }
00231
00233 inline bool operator==( const Matrix4f &m1, const Matrix4f &m2 ) {
00234 return m1[0][0]==m2[0][0] && m1[0][1]==m2[0][1] && m1[0][2]==m2[0][2] &&
00235 m1[0][3]==m2[0][3] && m1[1][0]==m2[1][0] && m1[1][1]==m2[1][1] &&
00236 m1[1][2]==m2[1][2] && m1[1][3]==m2[1][3] && m1[2][0]==m2[2][0] &&
00237 m1[2][1]==m2[2][1] && m1[2][2]==m2[2][2] && m1[2][3]==m2[2][3] &&
00238 m1[3][0]==m2[3][0] && m1[3][1]==m2[3][1] && m1[3][2]==m2[3][2] &&
00239 m1[3][3]==m2[3][3];
00240 }
00241
00243 H3DAPI_API ostream& operator<<( ostream &os, const Matrix4f &m );
00244
00246 inline Matrix4f operator*( const float &a, const Matrix4f &b ) { return b * a; }
00247
00249 inline Matrix4f operator*( const double &a, const Matrix4f &b ) { return b * a; }
00250
00252 inline Matrix4f operator*( const int &a, const Matrix4f &b ) { return b * a; }
00253
00255 inline Matrix4f operator*( const long &a, const Matrix4f &b ) { return b * a; }
00256
00258 inline Matrix4f operator-( const Matrix4f &m ) { return m * -1; }
00259
00261 inline Matrix4f operator-( const Matrix4f &a, const Matrix4f &b )
00262 { return a + (-b); }
00263
00265 }
00266 }
00267
00268 #endif