00001
00002
00008
00009
00011
00012 #ifndef __ICEMATRIX3X3_H__
00013 #define __ICEMATRIX3X3_H__
00014
00015
00016 class Quat;
00017
00018 #define MATRIX3X3_EPSILON (1.0e-7f)
00019
00020 class ICEMATHS_API Matrix3x3
00021 {
00022 public:
00024 inline_ Matrix3x3() {}
00026 inline_ Matrix3x3(float m00, float m01, float m02, float m10, float m11, float m12, float m20, float m21, float m22)
00027 {
00028 m[0][0] = m00; m[0][1] = m01; m[0][2] = m02;
00029 m[1][0] = m10; m[1][1] = m11; m[1][2] = m12;
00030 m[2][0] = m20; m[2][1] = m21; m[2][2] = m22;
00031 }
00033 inline_ Matrix3x3(const Matrix3x3& mat) { CopyMemory(m, &mat.m, 9*sizeof(float)); }
00035 inline_ ~Matrix3x3() {}
00036
00038 inline_ void Set(float m00, float m01, float m02, float m10, float m11, float m12, float m20, float m21, float m22)
00039 {
00040 m[0][0] = m00; m[0][1] = m01; m[0][2] = m02;
00041 m[1][0] = m10; m[1][1] = m11; m[1][2] = m12;
00042 m[2][0] = m20; m[2][1] = m21; m[2][2] = m22;
00043 }
00044
00046 inline_ void SetScale(const Point& p) { m[0][0] = p.x; m[1][1] = p.y; m[2][2] = p.z; }
00047
00049 inline_ void SetScale(float sx, float sy, float sz) { m[0][0] = sx; m[1][1] = sy; m[2][2] = sz; }
00050
00052 inline_ void Scale(const Point& p)
00053 {
00054 m[0][0] *= p.x; m[0][1] *= p.x; m[0][2] *= p.x;
00055 m[1][0] *= p.y; m[1][1] *= p.y; m[1][2] *= p.y;
00056 m[2][0] *= p.z; m[2][1] *= p.z; m[2][2] *= p.z;
00057 }
00058
00060 inline_ void Scale(float sx, float sy, float sz)
00061 {
00062 m[0][0] *= sx; m[0][1] *= sx; m[0][2] *= sx;
00063 m[1][0] *= sy; m[1][1] *= sy; m[1][2] *= sy;
00064 m[2][0] *= sz; m[2][1] *= sz; m[2][2] *= sz;
00065 }
00066
00068 inline_ void Copy(const Matrix3x3& source) { CopyMemory(m, source.m, 9*sizeof(float)); }
00069
00070
00072 inline_ void GetRow(const udword r, Point& p) const { p.x = m[r][0]; p.y = m[r][1]; p.z = m[r][2]; }
00074 inline_ const Point& GetRow(const udword r) const { return *(const Point*)&m[r][0]; }
00076 inline_ Point& GetRow(const udword r) { return *(Point*)&m[r][0]; }
00078 inline_ void SetRow(const udword r, const Point& p) { m[r][0] = p.x; m[r][1] = p.y; m[r][2] = p.z; }
00080 inline_ void GetCol(const udword c, Point& p) const { p.x = m[0][c]; p.y = m[1][c]; p.z = m[2][c]; }
00082 inline_ void SetCol(const udword c, const Point& p) { m[0][c] = p.x; m[1][c] = p.y; m[2][c] = p.z; }
00083
00085 inline_ float Trace() const { return m[0][0] + m[1][1] + m[2][2]; }
00087 inline_ void Zero() { ZeroMemory(&m, sizeof(m)); }
00089 inline_ void Identity() { Zero(); m[0][0] = m[1][1] = m[2][2] = 1.0f; }
00091 inline_ bool IsIdentity() const
00092 {
00093 if(IR(m[0][0])!=IEEE_1_0) return false;
00094 if(IR(m[0][1])!=0) return false;
00095 if(IR(m[0][2])!=0) return false;
00096
00097 if(IR(m[1][0])!=0) return false;
00098 if(IR(m[1][1])!=IEEE_1_0) return false;
00099 if(IR(m[1][2])!=0) return false;
00100
00101 if(IR(m[2][0])!=0) return false;
00102 if(IR(m[2][1])!=0) return false;
00103 if(IR(m[2][2])!=IEEE_1_0) return false;
00104
00105 return true;
00106 }
00107
00109 inline_ BOOL IsValid() const
00110 {
00111 for(udword j=0;j<3;j++)
00112 {
00113 for(udword i=0;i<3;i++)
00114 {
00115 if(!IsValidFloat(m[j][i])) return FALSE;
00116 }
00117 }
00118 return TRUE;
00119 }
00120
00127 inline_ void SkewSymmetric(const Point& a)
00128 {
00129 m[0][0] = 0.0f;
00130 m[0][1] = -a.z;
00131 m[0][2] = a.y;
00132
00133 m[1][0] = a.z;
00134 m[1][1] = 0.0f;
00135 m[1][2] = -a.x;
00136
00137 m[2][0] = -a.y;
00138 m[2][1] = a.x;
00139 m[2][2] = 0.0f;
00140 }
00141
00143 inline_ void Neg()
00144 {
00145 m[0][0] = -m[0][0]; m[0][1] = -m[0][1]; m[0][2] = -m[0][2];
00146 m[1][0] = -m[1][0]; m[1][1] = -m[1][1]; m[1][2] = -m[1][2];
00147 m[2][0] = -m[2][0]; m[2][1] = -m[2][1]; m[2][2] = -m[2][2];
00148 }
00149
00151 inline_ void Neg(const Matrix3x3& mat)
00152 {
00153 m[0][0] = -mat.m[0][0]; m[0][1] = -mat.m[0][1]; m[0][2] = -mat.m[0][2];
00154 m[1][0] = -mat.m[1][0]; m[1][1] = -mat.m[1][1]; m[1][2] = -mat.m[1][2];
00155 m[2][0] = -mat.m[2][0]; m[2][1] = -mat.m[2][1]; m[2][2] = -mat.m[2][2];
00156 }
00157
00159 inline_ void Add(const Matrix3x3& mat)
00160 {
00161 m[0][0] += mat.m[0][0]; m[0][1] += mat.m[0][1]; m[0][2] += mat.m[0][2];
00162 m[1][0] += mat.m[1][0]; m[1][1] += mat.m[1][1]; m[1][2] += mat.m[1][2];
00163 m[2][0] += mat.m[2][0]; m[2][1] += mat.m[2][1]; m[2][2] += mat.m[2][2];
00164 }
00165
00167 inline_ void Sub(const Matrix3x3& mat)
00168 {
00169 m[0][0] -= mat.m[0][0]; m[0][1] -= mat.m[0][1]; m[0][2] -= mat.m[0][2];
00170 m[1][0] -= mat.m[1][0]; m[1][1] -= mat.m[1][1]; m[1][2] -= mat.m[1][2];
00171 m[2][0] -= mat.m[2][0]; m[2][1] -= mat.m[2][1]; m[2][2] -= mat.m[2][2];
00172 }
00174 inline_ void Mac(const Matrix3x3& a, const Matrix3x3& b, float s)
00175 {
00176 m[0][0] = a.m[0][0] + b.m[0][0] * s;
00177 m[0][1] = a.m[0][1] + b.m[0][1] * s;
00178 m[0][2] = a.m[0][2] + b.m[0][2] * s;
00179
00180 m[1][0] = a.m[1][0] + b.m[1][0] * s;
00181 m[1][1] = a.m[1][1] + b.m[1][1] * s;
00182 m[1][2] = a.m[1][2] + b.m[1][2] * s;
00183
00184 m[2][0] = a.m[2][0] + b.m[2][0] * s;
00185 m[2][1] = a.m[2][1] + b.m[2][1] * s;
00186 m[2][2] = a.m[2][2] + b.m[2][2] * s;
00187 }
00189 inline_ void Mac(const Matrix3x3& a, float s)
00190 {
00191 m[0][0] += a.m[0][0] * s; m[0][1] += a.m[0][1] * s; m[0][2] += a.m[0][2] * s;
00192 m[1][0] += a.m[1][0] * s; m[1][1] += a.m[1][1] * s; m[1][2] += a.m[1][2] * s;
00193 m[2][0] += a.m[2][0] * s; m[2][1] += a.m[2][1] * s; m[2][2] += a.m[2][2] * s;
00194 }
00195
00197 inline_ void Mult(const Matrix3x3& a, float s)
00198 {
00199 m[0][0] = a.m[0][0] * s; m[0][1] = a.m[0][1] * s; m[0][2] = a.m[0][2] * s;
00200 m[1][0] = a.m[1][0] * s; m[1][1] = a.m[1][1] * s; m[1][2] = a.m[1][2] * s;
00201 m[2][0] = a.m[2][0] * s; m[2][1] = a.m[2][1] * s; m[2][2] = a.m[2][2] * s;
00202 }
00203
00204 inline_ void Add(const Matrix3x3& a, const Matrix3x3& b)
00205 {
00206 m[0][0] = a.m[0][0] + b.m[0][0]; m[0][1] = a.m[0][1] + b.m[0][1]; m[0][2] = a.m[0][2] + b.m[0][2];
00207 m[1][0] = a.m[1][0] + b.m[1][0]; m[1][1] = a.m[1][1] + b.m[1][1]; m[1][2] = a.m[1][2] + b.m[1][2];
00208 m[2][0] = a.m[2][0] + b.m[2][0]; m[2][1] = a.m[2][1] + b.m[2][1]; m[2][2] = a.m[2][2] + b.m[2][2];
00209 }
00210
00211 inline_ void Sub(const Matrix3x3& a, const Matrix3x3& b)
00212 {
00213 m[0][0] = a.m[0][0] - b.m[0][0]; m[0][1] = a.m[0][1] - b.m[0][1]; m[0][2] = a.m[0][2] - b.m[0][2];
00214 m[1][0] = a.m[1][0] - b.m[1][0]; m[1][1] = a.m[1][1] - b.m[1][1]; m[1][2] = a.m[1][2] - b.m[1][2];
00215 m[2][0] = a.m[2][0] - b.m[2][0]; m[2][1] = a.m[2][1] - b.m[2][1]; m[2][2] = a.m[2][2] - b.m[2][2];
00216 }
00217
00219 inline_ void Mult(const Matrix3x3& a, const Matrix3x3& b)
00220 {
00221 m[0][0] = a.m[0][0] * b.m[0][0] + a.m[0][1] * b.m[1][0] + a.m[0][2] * b.m[2][0];
00222 m[0][1] = a.m[0][0] * b.m[0][1] + a.m[0][1] * b.m[1][1] + a.m[0][2] * b.m[2][1];
00223 m[0][2] = a.m[0][0] * b.m[0][2] + a.m[0][1] * b.m[1][2] + a.m[0][2] * b.m[2][2];
00224 m[1][0] = a.m[1][0] * b.m[0][0] + a.m[1][1] * b.m[1][0] + a.m[1][2] * b.m[2][0];
00225 m[1][1] = a.m[1][0] * b.m[0][1] + a.m[1][1] * b.m[1][1] + a.m[1][2] * b.m[2][1];
00226 m[1][2] = a.m[1][0] * b.m[0][2] + a.m[1][1] * b.m[1][2] + a.m[1][2] * b.m[2][2];
00227 m[2][0] = a.m[2][0] * b.m[0][0] + a.m[2][1] * b.m[1][0] + a.m[2][2] * b.m[2][0];
00228 m[2][1] = a.m[2][0] * b.m[0][1] + a.m[2][1] * b.m[1][1] + a.m[2][2] * b.m[2][1];
00229 m[2][2] = a.m[2][0] * b.m[0][2] + a.m[2][1] * b.m[1][2] + a.m[2][2] * b.m[2][2];
00230 }
00231
00233 inline_ void MultAtB(const Matrix3x3& a, const Matrix3x3& b)
00234 {
00235 m[0][0] = a.m[0][0] * b.m[0][0] + a.m[1][0] * b.m[1][0] + a.m[2][0] * b.m[2][0];
00236 m[0][1] = a.m[0][0] * b.m[0][1] + a.m[1][0] * b.m[1][1] + a.m[2][0] * b.m[2][1];
00237 m[0][2] = a.m[0][0] * b.m[0][2] + a.m[1][0] * b.m[1][2] + a.m[2][0] * b.m[2][2];
00238 m[1][0] = a.m[0][1] * b.m[0][0] + a.m[1][1] * b.m[1][0] + a.m[2][1] * b.m[2][0];
00239 m[1][1] = a.m[0][1] * b.m[0][1] + a.m[1][1] * b.m[1][1] + a.m[2][1] * b.m[2][1];
00240 m[1][2] = a.m[0][1] * b.m[0][2] + a.m[1][1] * b.m[1][2] + a.m[2][1] * b.m[2][2];
00241 m[2][0] = a.m[0][2] * b.m[0][0] + a.m[1][2] * b.m[1][0] + a.m[2][2] * b.m[2][0];
00242 m[2][1] = a.m[0][2] * b.m[0][1] + a.m[1][2] * b.m[1][1] + a.m[2][2] * b.m[2][1];
00243 m[2][2] = a.m[0][2] * b.m[0][2] + a.m[1][2] * b.m[1][2] + a.m[2][2] * b.m[2][2];
00244 }
00245
00247 inline_ void MultABt(const Matrix3x3& a, const Matrix3x3& b)
00248 {
00249 m[0][0] = a.m[0][0] * b.m[0][0] + a.m[0][1] * b.m[0][1] + a.m[0][2] * b.m[0][2];
00250 m[0][1] = a.m[0][0] * b.m[1][0] + a.m[0][1] * b.m[1][1] + a.m[0][2] * b.m[1][2];
00251 m[0][2] = a.m[0][0] * b.m[2][0] + a.m[0][1] * b.m[2][1] + a.m[0][2] * b.m[2][2];
00252 m[1][0] = a.m[1][0] * b.m[0][0] + a.m[1][1] * b.m[0][1] + a.m[1][2] * b.m[0][2];
00253 m[1][1] = a.m[1][0] * b.m[1][0] + a.m[1][1] * b.m[1][1] + a.m[1][2] * b.m[1][2];
00254 m[1][2] = a.m[1][0] * b.m[2][0] + a.m[1][1] * b.m[2][1] + a.m[1][2] * b.m[2][2];
00255 m[2][0] = a.m[2][0] * b.m[0][0] + a.m[2][1] * b.m[0][1] + a.m[2][2] * b.m[0][2];
00256 m[2][1] = a.m[2][0] * b.m[1][0] + a.m[2][1] * b.m[1][1] + a.m[2][2] * b.m[1][2];
00257 m[2][2] = a.m[2][0] * b.m[2][0] + a.m[2][1] * b.m[2][1] + a.m[2][2] * b.m[2][2];
00258 }
00259
00261 Matrix3x3& FromTo(const Point& from, const Point& to);
00262
00267 void RotX(float angle);
00272 void RotY(float angle);
00277 void RotZ(float angle);
00281 void RotYX(float y, float x);
00282
00284 Matrix3x3& Rot(float angle, const Point& axis);
00285
00287 void Transpose()
00288 {
00289 IR(m[1][0]) ^= IR(m[0][1]); IR(m[0][1]) ^= IR(m[1][0]); IR(m[1][0]) ^= IR(m[0][1]);
00290 IR(m[2][0]) ^= IR(m[0][2]); IR(m[0][2]) ^= IR(m[2][0]); IR(m[2][0]) ^= IR(m[0][2]);
00291 IR(m[2][1]) ^= IR(m[1][2]); IR(m[1][2]) ^= IR(m[2][1]); IR(m[2][1]) ^= IR(m[1][2]);
00292 }
00293
00295 void Transpose(const Matrix3x3& a)
00296 {
00297 m[0][0] = a.m[0][0]; m[0][1] = a.m[1][0]; m[0][2] = a.m[2][0];
00298 m[1][0] = a.m[0][1]; m[1][1] = a.m[1][1]; m[1][2] = a.m[2][1];
00299 m[2][0] = a.m[0][2]; m[2][1] = a.m[1][2]; m[2][2] = a.m[2][2];
00300 }
00301
00303 float Determinant() const
00304 {
00305 return (m[0][0]*m[1][1]*m[2][2] + m[0][1]*m[1][2]*m[2][0] + m[0][2]*m[1][0]*m[2][1])
00306 - (m[2][0]*m[1][1]*m[0][2] + m[2][1]*m[1][2]*m[0][0] + m[2][2]*m[1][0]*m[0][1]);
00307 }
00308
00310
00311
00312
00313
00314
00315
00317 Matrix3x3& Invert()
00318 {
00319 float Det = Determinant();
00320 float OneOverDet = 1.0f / Det;
00321
00322 Matrix3x3 Temp;
00323 Temp.m[0][0] = +(m[1][1] * m[2][2] - m[2][1] * m[1][2]) * OneOverDet;
00324 Temp.m[1][0] = -(m[1][0] * m[2][2] - m[2][0] * m[1][2]) * OneOverDet;
00325 Temp.m[2][0] = +(m[1][0] * m[2][1] - m[2][0] * m[1][1]) * OneOverDet;
00326 Temp.m[0][1] = -(m[0][1] * m[2][2] - m[2][1] * m[0][2]) * OneOverDet;
00327 Temp.m[1][1] = +(m[0][0] * m[2][2] - m[2][0] * m[0][2]) * OneOverDet;
00328 Temp.m[2][1] = -(m[0][0] * m[2][1] - m[2][0] * m[0][1]) * OneOverDet;
00329 Temp.m[0][2] = +(m[0][1] * m[1][2] - m[1][1] * m[0][2]) * OneOverDet;
00330 Temp.m[1][2] = -(m[0][0] * m[1][2] - m[1][0] * m[0][2]) * OneOverDet;
00331 Temp.m[2][2] = +(m[0][0] * m[1][1] - m[1][0] * m[0][1]) * OneOverDet;
00332
00333 *this = Temp;
00334
00335 return *this;
00336 }
00337
00338 Matrix3x3& Normalize();
00339
00341 Matrix3x3& Exp(const Matrix3x3& a);
00342
00343 void FromQuat(const Quat &q);
00344 void FromQuatL2(const Quat &q, float l2);
00345
00346
00348 inline_ Matrix3x3 operator+(const Matrix3x3& mat) const
00349 {
00350 return Matrix3x3(
00351 m[0][0] + mat.m[0][0], m[0][1] + mat.m[0][1], m[0][2] + mat.m[0][2],
00352 m[1][0] + mat.m[1][0], m[1][1] + mat.m[1][1], m[1][2] + mat.m[1][2],
00353 m[2][0] + mat.m[2][0], m[2][1] + mat.m[2][1], m[2][2] + mat.m[2][2]);
00354 }
00355
00357 inline_ Matrix3x3 operator-(const Matrix3x3& mat) const
00358 {
00359 return Matrix3x3(
00360 m[0][0] - mat.m[0][0], m[0][1] - mat.m[0][1], m[0][2] - mat.m[0][2],
00361 m[1][0] - mat.m[1][0], m[1][1] - mat.m[1][1], m[1][2] - mat.m[1][2],
00362 m[2][0] - mat.m[2][0], m[2][1] - mat.m[2][1], m[2][2] - mat.m[2][2]);
00363 }
00364
00366 inline_ Matrix3x3 operator*(const Matrix3x3& mat) const
00367 {
00368 return Matrix3x3(
00369 m[0][0]*mat.m[0][0] + m[0][1]*mat.m[1][0] + m[0][2]*mat.m[2][0],
00370 m[0][0]*mat.m[0][1] + m[0][1]*mat.m[1][1] + m[0][2]*mat.m[2][1],
00371 m[0][0]*mat.m[0][2] + m[0][1]*mat.m[1][2] + m[0][2]*mat.m[2][2],
00372
00373 m[1][0]*mat.m[0][0] + m[1][1]*mat.m[1][0] + m[1][2]*mat.m[2][0],
00374 m[1][0]*mat.m[0][1] + m[1][1]*mat.m[1][1] + m[1][2]*mat.m[2][1],
00375 m[1][0]*mat.m[0][2] + m[1][1]*mat.m[1][2] + m[1][2]*mat.m[2][2],
00376
00377 m[2][0]*mat.m[0][0] + m[2][1]*mat.m[1][0] + m[2][2]*mat.m[2][0],
00378 m[2][0]*mat.m[0][1] + m[2][1]*mat.m[1][1] + m[2][2]*mat.m[2][1],
00379 m[2][0]*mat.m[0][2] + m[2][1]*mat.m[1][2] + m[2][2]*mat.m[2][2]);
00380 }
00381
00383 inline_ Point operator*(const Point& v) const { return Point(GetRow(0)|v, GetRow(1)|v, GetRow(2)|v); }
00384
00386 inline_ Matrix3x3 operator*(float s) const
00387 {
00388 return Matrix3x3(
00389 m[0][0]*s, m[0][1]*s, m[0][2]*s,
00390 m[1][0]*s, m[1][1]*s, m[1][2]*s,
00391 m[2][0]*s, m[2][1]*s, m[2][2]*s);
00392 }
00393
00395 inline_ friend Matrix3x3 operator*(float s, const Matrix3x3& mat)
00396 {
00397 return Matrix3x3(
00398 s*mat.m[0][0], s*mat.m[0][1], s*mat.m[0][2],
00399 s*mat.m[1][0], s*mat.m[1][1], s*mat.m[1][2],
00400 s*mat.m[2][0], s*mat.m[2][1], s*mat.m[2][2]);
00401 }
00402
00404 inline_ Matrix3x3 operator/(float s) const
00405 {
00406 if (s) s = 1.0f / s;
00407 return Matrix3x3(
00408 m[0][0]*s, m[0][1]*s, m[0][2]*s,
00409 m[1][0]*s, m[1][1]*s, m[1][2]*s,
00410 m[2][0]*s, m[2][1]*s, m[2][2]*s);
00411 }
00412
00414 inline_ friend Matrix3x3 operator/(float s, const Matrix3x3& mat)
00415 {
00416 return Matrix3x3(
00417 s/mat.m[0][0], s/mat.m[0][1], s/mat.m[0][2],
00418 s/mat.m[1][0], s/mat.m[1][1], s/mat.m[1][2],
00419 s/mat.m[2][0], s/mat.m[2][1], s/mat.m[2][2]);
00420 }
00421
00423 inline_ Matrix3x3& operator+=(const Matrix3x3& mat)
00424 {
00425 m[0][0] += mat.m[0][0]; m[0][1] += mat.m[0][1]; m[0][2] += mat.m[0][2];
00426 m[1][0] += mat.m[1][0]; m[1][1] += mat.m[1][1]; m[1][2] += mat.m[1][2];
00427 m[2][0] += mat.m[2][0]; m[2][1] += mat.m[2][1]; m[2][2] += mat.m[2][2];
00428 return *this;
00429 }
00430
00432 inline_ Matrix3x3& operator-=(const Matrix3x3& mat)
00433 {
00434 m[0][0] -= mat.m[0][0]; m[0][1] -= mat.m[0][1]; m[0][2] -= mat.m[0][2];
00435 m[1][0] -= mat.m[1][0]; m[1][1] -= mat.m[1][1]; m[1][2] -= mat.m[1][2];
00436 m[2][0] -= mat.m[2][0]; m[2][1] -= mat.m[2][1]; m[2][2] -= mat.m[2][2];
00437 return *this;
00438 }
00439
00441 inline_ Matrix3x3& operator*=(const Matrix3x3& mat)
00442 {
00443 Point TempRow;
00444
00445 GetRow(0, TempRow);
00446 m[0][0] = TempRow.x*mat.m[0][0] + TempRow.y*mat.m[1][0] + TempRow.z*mat.m[2][0];
00447 m[0][1] = TempRow.x*mat.m[0][1] + TempRow.y*mat.m[1][1] + TempRow.z*mat.m[2][1];
00448 m[0][2] = TempRow.x*mat.m[0][2] + TempRow.y*mat.m[1][2] + TempRow.z*mat.m[2][2];
00449
00450 GetRow(1, TempRow);
00451 m[1][0] = TempRow.x*mat.m[0][0] + TempRow.y*mat.m[1][0] + TempRow.z*mat.m[2][0];
00452 m[1][1] = TempRow.x*mat.m[0][1] + TempRow.y*mat.m[1][1] + TempRow.z*mat.m[2][1];
00453 m[1][2] = TempRow.x*mat.m[0][2] + TempRow.y*mat.m[1][2] + TempRow.z*mat.m[2][2];
00454
00455 GetRow(2, TempRow);
00456 m[2][0] = TempRow.x*mat.m[0][0] + TempRow.y*mat.m[1][0] + TempRow.z*mat.m[2][0];
00457 m[2][1] = TempRow.x*mat.m[0][1] + TempRow.y*mat.m[1][1] + TempRow.z*mat.m[2][1];
00458 m[2][2] = TempRow.x*mat.m[0][2] + TempRow.y*mat.m[1][2] + TempRow.z*mat.m[2][2];
00459 return *this;
00460 }
00461
00463 inline_ Matrix3x3& operator*=(float s)
00464 {
00465 m[0][0] *= s; m[0][1] *= s; m[0][2] *= s;
00466 m[1][0] *= s; m[1][1] *= s; m[1][2] *= s;
00467 m[2][0] *= s; m[2][1] *= s; m[2][2] *= s;
00468 return *this;
00469 }
00470
00472 inline_ Matrix3x3& operator/=(float s)
00473 {
00474 if (s) s = 1.0f / s;
00475 m[0][0] *= s; m[0][1] *= s; m[0][2] *= s;
00476 m[1][0] *= s; m[1][1] *= s; m[1][2] *= s;
00477 m[2][0] *= s; m[2][1] *= s; m[2][2] *= s;
00478 return *this;
00479 }
00480
00481
00483 operator Matrix4x4() const;
00485 operator Quat() const;
00486
00487 inline_ const Point& operator[](int row) const { return *(const Point*)&m[row][0]; }
00488 inline_ Point& operator[](int row) { return *(Point*)&m[row][0]; }
00489
00490 public:
00491
00492 float m[3][3];
00493 };
00494
00495 #endif // __ICEMATRIX3X3_H__
00496