1
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
3
* Contains code for 3x3 matrices.
5
* \author Pierre Terdiman
8
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
10
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
12
#ifndef __ICEMATRIX3X3_H__
13
#define __ICEMATRIX3X3_H__
15
// Forward declarations
18
#define MATRIX3X3_EPSILON (1.0e-7f)
24
inline_ Matrix3x3() {}
25
//! Constructor from 9 values
26
inline_ Matrix3x3(float m00, float m01, float m02, float m10, float m11, float m12, float m20, float m21, float m22)
28
m[0][0] = m00; m[0][1] = m01; m[0][2] = m02;
29
m[1][0] = m10; m[1][1] = m11; m[1][2] = m12;
30
m[2][0] = m20; m[2][1] = m21; m[2][2] = m22;
33
inline_ Matrix3x3(const Matrix3x3& mat) { CopyMemory(m, &mat.m, 9*sizeof(float)); }
35
inline_ ~Matrix3x3() {}
38
inline_ void Set(float m00, float m01, float m02, float m10, float m11, float m12, float m20, float m21, float m22)
40
m[0][0] = m00; m[0][1] = m01; m[0][2] = m02;
41
m[1][0] = m10; m[1][1] = m11; m[1][2] = m12;
42
m[2][0] = m20; m[2][1] = m21; m[2][2] = m22;
45
//! Sets the scale from a Point. The point is put on the diagonal.
46
inline_ void SetScale(const Point& p) { m[0][0] = p.x; m[1][1] = p.y; m[2][2] = p.z; }
48
//! Sets the scale from floats. Values are put on the diagonal.
49
inline_ void SetScale(float sx, float sy, float sz) { m[0][0] = sx; m[1][1] = sy; m[2][2] = sz; }
51
//! Scales from a Point. Each row is multiplied by a component.
52
inline_ void Scale(const Point& p)
54
m[0][0] *= p.x; m[0][1] *= p.x; m[0][2] *= p.x;
55
m[1][0] *= p.y; m[1][1] *= p.y; m[1][2] *= p.y;
56
m[2][0] *= p.z; m[2][1] *= p.z; m[2][2] *= p.z;
59
//! Scales from floats. Each row is multiplied by a value.
60
inline_ void Scale(float sx, float sy, float sz)
62
m[0][0] *= sx; m[0][1] *= sx; m[0][2] *= sx;
63
m[1][0] *= sy; m[1][1] *= sy; m[1][2] *= sy;
64
m[2][0] *= sz; m[2][1] *= sz; m[2][2] *= sz;
67
//! Copy from a Matrix3x3
68
inline_ void Copy(const Matrix3x3& source) { CopyMemory(m, source.m, 9*sizeof(float)); }
72
inline_ void GetRow(const udword r, Point& p) const { p.x = m[r][0]; p.y = m[r][1]; p.z = m[r][2]; }
74
inline_ const Point& GetRow(const udword r) const { return *(const Point*)&m[r][0]; }
76
inline_ Point& GetRow(const udword r) { return *(Point*)&m[r][0]; }
78
inline_ void SetRow(const udword r, const Point& p) { m[r][0] = p.x; m[r][1] = p.y; m[r][2] = p.z; }
80
inline_ void GetCol(const udword c, Point& p) const { p.x = m[0][c]; p.y = m[1][c]; p.z = m[2][c]; }
82
inline_ void SetCol(const udword c, const Point& p) { m[0][c] = p.x; m[1][c] = p.y; m[2][c] = p.z; }
84
//! Computes the trace. The trace is the sum of the 3 diagonal components.
85
inline_ float Trace() const { return m[0][0] + m[1][1] + m[2][2]; }
86
//! Clears the matrix.
87
inline_ void Zero() { ZeroMemory(&m, sizeof(m)); }
88
//! Sets the identity matrix.
89
inline_ void Identity() { Zero(); m[0][0] = m[1][1] = m[2][2] = 1.0f; }
90
//! Checks for identity
91
inline_ bool IsIdentity() const
93
if(IR(m[0][0])!=IEEE_1_0) return false;
94
if(IR(m[0][1])!=0) return false;
95
if(IR(m[0][2])!=0) return false;
97
if(IR(m[1][0])!=0) return false;
98
if(IR(m[1][1])!=IEEE_1_0) return false;
99
if(IR(m[1][2])!=0) return false;
101
if(IR(m[2][0])!=0) return false;
102
if(IR(m[2][1])!=0) return false;
103
if(IR(m[2][2])!=IEEE_1_0) return false;
108
//! Checks matrix validity
109
inline_ BOOL IsValid() const
111
for(udword j=0;j<3;j++)
113
for(udword i=0;i<3;i++)
115
if(!IsValidFloat(m[j][i])) return FALSE;
121
//! Makes a skew-symmetric matrix (a.k.a. Star(*) Matrix)
125
//! This is also called a "cross matrix" since for any vectors A and B,
126
//! A^B = Skew(A) * B = - B * Skew(A);
127
inline_ void SkewSymmetric(const Point& a)
142
//! Negates the matrix
145
m[0][0] = -m[0][0]; m[0][1] = -m[0][1]; m[0][2] = -m[0][2];
146
m[1][0] = -m[1][0]; m[1][1] = -m[1][1]; m[1][2] = -m[1][2];
147
m[2][0] = -m[2][0]; m[2][1] = -m[2][1]; m[2][2] = -m[2][2];
150
//! Neg from another matrix
151
inline_ void Neg(const Matrix3x3& mat)
153
m[0][0] = -mat.m[0][0]; m[0][1] = -mat.m[0][1]; m[0][2] = -mat.m[0][2];
154
m[1][0] = -mat.m[1][0]; m[1][1] = -mat.m[1][1]; m[1][2] = -mat.m[1][2];
155
m[2][0] = -mat.m[2][0]; m[2][1] = -mat.m[2][1]; m[2][2] = -mat.m[2][2];
158
//! Add another matrix
159
inline_ void Add(const Matrix3x3& mat)
161
m[0][0] += mat.m[0][0]; m[0][1] += mat.m[0][1]; m[0][2] += mat.m[0][2];
162
m[1][0] += mat.m[1][0]; m[1][1] += mat.m[1][1]; m[1][2] += mat.m[1][2];
163
m[2][0] += mat.m[2][0]; m[2][1] += mat.m[2][1]; m[2][2] += mat.m[2][2];
166
//! Sub another matrix
167
inline_ void Sub(const Matrix3x3& mat)
169
m[0][0] -= mat.m[0][0]; m[0][1] -= mat.m[0][1]; m[0][2] -= mat.m[0][2];
170
m[1][0] -= mat.m[1][0]; m[1][1] -= mat.m[1][1]; m[1][2] -= mat.m[1][2];
171
m[2][0] -= mat.m[2][0]; m[2][1] -= mat.m[2][1]; m[2][2] -= mat.m[2][2];
174
inline_ void Mac(const Matrix3x3& a, const Matrix3x3& b, float s)
176
m[0][0] = a.m[0][0] + b.m[0][0] * s;
177
m[0][1] = a.m[0][1] + b.m[0][1] * s;
178
m[0][2] = a.m[0][2] + b.m[0][2] * s;
180
m[1][0] = a.m[1][0] + b.m[1][0] * s;
181
m[1][1] = a.m[1][1] + b.m[1][1] * s;
182
m[1][2] = a.m[1][2] + b.m[1][2] * s;
184
m[2][0] = a.m[2][0] + b.m[2][0] * s;
185
m[2][1] = a.m[2][1] + b.m[2][1] * s;
186
m[2][2] = a.m[2][2] + b.m[2][2] * s;
189
inline_ void Mac(const Matrix3x3& a, float s)
191
m[0][0] += a.m[0][0] * s; m[0][1] += a.m[0][1] * s; m[0][2] += a.m[0][2] * s;
192
m[1][0] += a.m[1][0] * s; m[1][1] += a.m[1][1] * s; m[1][2] += a.m[1][2] * s;
193
m[2][0] += a.m[2][0] * s; m[2][1] += a.m[2][1] * s; m[2][2] += a.m[2][2] * s;
197
inline_ void Mult(const Matrix3x3& a, float s)
199
m[0][0] = a.m[0][0] * s; m[0][1] = a.m[0][1] * s; m[0][2] = a.m[0][2] * s;
200
m[1][0] = a.m[1][0] * s; m[1][1] = a.m[1][1] * s; m[1][2] = a.m[1][2] * s;
201
m[2][0] = a.m[2][0] * s; m[2][1] = a.m[2][1] * s; m[2][2] = a.m[2][2] * s;
204
inline_ void Add(const Matrix3x3& a, const Matrix3x3& b)
206
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];
207
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];
208
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];
211
inline_ void Sub(const Matrix3x3& a, const Matrix3x3& b)
213
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];
214
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];
215
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];
219
inline_ void Mult(const Matrix3x3& a, const Matrix3x3& b)
221
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];
222
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];
223
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];
224
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];
225
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];
226
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];
227
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];
228
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];
229
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];
232
//! this = transpose(a) * b
233
inline_ void MultAtB(const Matrix3x3& a, const Matrix3x3& b)
235
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];
236
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];
237
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];
238
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];
239
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];
240
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];
241
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];
242
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];
243
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];
246
//! this = a * transpose(b)
247
inline_ void MultABt(const Matrix3x3& a, const Matrix3x3& b)
249
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];
250
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];
251
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];
252
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];
253
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];
254
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];
255
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];
256
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];
257
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];
260
//! Makes a rotation matrix mapping vector "from" to vector "to".
261
Matrix3x3& FromTo(const Point& from, const Point& to);
263
//! Set a rotation matrix around the X axis.
267
void RotX(float angle);
268
//! Set a rotation matrix around the Y axis.
272
void RotY(float angle);
273
//! Set a rotation matrix around the Z axis.
277
void RotZ(float angle);
281
void RotYX(float y, float x);
283
//! Make a rotation matrix about an arbitrary axis
284
Matrix3x3& Rot(float angle, const Point& axis);
286
//! Transpose the matrix.
289
IR(m[1][0]) ^= IR(m[0][1]); IR(m[0][1]) ^= IR(m[1][0]); IR(m[1][0]) ^= IR(m[0][1]);
290
IR(m[2][0]) ^= IR(m[0][2]); IR(m[0][2]) ^= IR(m[2][0]); IR(m[2][0]) ^= IR(m[0][2]);
291
IR(m[2][1]) ^= IR(m[1][2]); IR(m[1][2]) ^= IR(m[2][1]); IR(m[2][1]) ^= IR(m[1][2]);
294
//! this = Transpose(a)
295
void Transpose(const Matrix3x3& a)
297
m[0][0] = a.m[0][0]; m[0][1] = a.m[1][0]; m[0][2] = a.m[2][0];
298
m[1][0] = a.m[0][1]; m[1][1] = a.m[1][1]; m[1][2] = a.m[2][1];
299
m[2][0] = a.m[0][2]; m[2][1] = a.m[1][2]; m[2][2] = a.m[2][2];
302
//! Compute the determinant of the matrix. We use the rule of Sarrus.
303
float Determinant() const
305
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])
306
- (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]);
309
//! Compute a cofactor. Used for matrix inversion.
310
float CoFactor(ubyte row, ubyte column) const
312
static sdword gIndex[3+2] = { 0, 1, 2, 0, 1 };
313
return (m[gIndex[row+1]][gIndex[column+1]]*m[gIndex[row+2]][gIndex[column+2]] - m[gIndex[row+2]][gIndex[column+1]]*m[gIndex[row+1]][gIndex[column+2]]);
316
//! Invert the matrix. Determinant must be different from zero, else matrix can't be inverted.
319
float Det = Determinant(); // Must be !=0
320
float OneOverDet = 1.0f / Det;
323
Temp.m[0][0] = +(m[1][1] * m[2][2] - m[2][1] * m[1][2]) * OneOverDet;
324
Temp.m[1][0] = -(m[1][0] * m[2][2] - m[2][0] * m[1][2]) * OneOverDet;
325
Temp.m[2][0] = +(m[1][0] * m[2][1] - m[2][0] * m[1][1]) * OneOverDet;
326
Temp.m[0][1] = -(m[0][1] * m[2][2] - m[2][1] * m[0][2]) * OneOverDet;
327
Temp.m[1][1] = +(m[0][0] * m[2][2] - m[2][0] * m[0][2]) * OneOverDet;
328
Temp.m[2][1] = -(m[0][0] * m[2][1] - m[2][0] * m[0][1]) * OneOverDet;
329
Temp.m[0][2] = +(m[0][1] * m[1][2] - m[1][1] * m[0][2]) * OneOverDet;
330
Temp.m[1][2] = -(m[0][0] * m[1][2] - m[1][0] * m[0][2]) * OneOverDet;
331
Temp.m[2][2] = +(m[0][0] * m[1][1] - m[1][0] * m[0][1]) * OneOverDet;
338
Matrix3x3& Normalize();
341
Matrix3x3& Exp(const Matrix3x3& a);
343
void FromQuat(const Quat &q);
344
void FromQuatL2(const Quat &q, float l2);
346
// Arithmetic operators
347
//! Operator for Matrix3x3 Plus = Matrix3x3 + Matrix3x3;
348
inline_ Matrix3x3 operator+(const Matrix3x3& mat) const
351
m[0][0] + mat.m[0][0], m[0][1] + mat.m[0][1], m[0][2] + mat.m[0][2],
352
m[1][0] + mat.m[1][0], m[1][1] + mat.m[1][1], m[1][2] + mat.m[1][2],
353
m[2][0] + mat.m[2][0], m[2][1] + mat.m[2][1], m[2][2] + mat.m[2][2]);
356
//! Operator for Matrix3x3 Minus = Matrix3x3 - Matrix3x3;
357
inline_ Matrix3x3 operator-(const Matrix3x3& mat) const
360
m[0][0] - mat.m[0][0], m[0][1] - mat.m[0][1], m[0][2] - mat.m[0][2],
361
m[1][0] - mat.m[1][0], m[1][1] - mat.m[1][1], m[1][2] - mat.m[1][2],
362
m[2][0] - mat.m[2][0], m[2][1] - mat.m[2][1], m[2][2] - mat.m[2][2]);
365
//! Operator for Matrix3x3 Mul = Matrix3x3 * Matrix3x3;
366
inline_ Matrix3x3 operator*(const Matrix3x3& mat) const
369
m[0][0]*mat.m[0][0] + m[0][1]*mat.m[1][0] + m[0][2]*mat.m[2][0],
370
m[0][0]*mat.m[0][1] + m[0][1]*mat.m[1][1] + m[0][2]*mat.m[2][1],
371
m[0][0]*mat.m[0][2] + m[0][1]*mat.m[1][2] + m[0][2]*mat.m[2][2],
373
m[1][0]*mat.m[0][0] + m[1][1]*mat.m[1][0] + m[1][2]*mat.m[2][0],
374
m[1][0]*mat.m[0][1] + m[1][1]*mat.m[1][1] + m[1][2]*mat.m[2][1],
375
m[1][0]*mat.m[0][2] + m[1][1]*mat.m[1][2] + m[1][2]*mat.m[2][2],
377
m[2][0]*mat.m[0][0] + m[2][1]*mat.m[1][0] + m[2][2]*mat.m[2][0],
378
m[2][0]*mat.m[0][1] + m[2][1]*mat.m[1][1] + m[2][2]*mat.m[2][1],
379
m[2][0]*mat.m[0][2] + m[2][1]*mat.m[1][2] + m[2][2]*mat.m[2][2]);
382
//! Operator for Point Mul = Matrix3x3 * Point;
383
inline_ Point operator*(const Point& v) const { return Point(GetRow(0)|v, GetRow(1)|v, GetRow(2)|v); }
385
//! Operator for Matrix3x3 Mul = Matrix3x3 * float;
386
inline_ Matrix3x3 operator*(float s) const
389
m[0][0]*s, m[0][1]*s, m[0][2]*s,
390
m[1][0]*s, m[1][1]*s, m[1][2]*s,
391
m[2][0]*s, m[2][1]*s, m[2][2]*s);
394
//! Operator for Matrix3x3 Mul = float * Matrix3x3;
395
inline_ friend Matrix3x3 operator*(float s, const Matrix3x3& mat)
398
s*mat.m[0][0], s*mat.m[0][1], s*mat.m[0][2],
399
s*mat.m[1][0], s*mat.m[1][1], s*mat.m[1][2],
400
s*mat.m[2][0], s*mat.m[2][1], s*mat.m[2][2]);
403
//! Operator for Matrix3x3 Div = Matrix3x3 / float;
404
inline_ Matrix3x3 operator/(float s) const
408
m[0][0]*s, m[0][1]*s, m[0][2]*s,
409
m[1][0]*s, m[1][1]*s, m[1][2]*s,
410
m[2][0]*s, m[2][1]*s, m[2][2]*s);
413
//! Operator for Matrix3x3 Div = float / Matrix3x3;
414
inline_ friend Matrix3x3 operator/(float s, const Matrix3x3& mat)
417
s/mat.m[0][0], s/mat.m[0][1], s/mat.m[0][2],
418
s/mat.m[1][0], s/mat.m[1][1], s/mat.m[1][2],
419
s/mat.m[2][0], s/mat.m[2][1], s/mat.m[2][2]);
422
//! Operator for Matrix3x3 += Matrix3x3
423
inline_ Matrix3x3& operator+=(const Matrix3x3& mat)
425
m[0][0] += mat.m[0][0]; m[0][1] += mat.m[0][1]; m[0][2] += mat.m[0][2];
426
m[1][0] += mat.m[1][0]; m[1][1] += mat.m[1][1]; m[1][2] += mat.m[1][2];
427
m[2][0] += mat.m[2][0]; m[2][1] += mat.m[2][1]; m[2][2] += mat.m[2][2];
431
//! Operator for Matrix3x3 -= Matrix3x3
432
inline_ Matrix3x3& operator-=(const Matrix3x3& mat)
434
m[0][0] -= mat.m[0][0]; m[0][1] -= mat.m[0][1]; m[0][2] -= mat.m[0][2];
435
m[1][0] -= mat.m[1][0]; m[1][1] -= mat.m[1][1]; m[1][2] -= mat.m[1][2];
436
m[2][0] -= mat.m[2][0]; m[2][1] -= mat.m[2][1]; m[2][2] -= mat.m[2][2];
440
//! Operator for Matrix3x3 *= Matrix3x3
441
inline_ Matrix3x3& operator*=(const Matrix3x3& mat)
446
m[0][0] = TempRow.x*mat.m[0][0] + TempRow.y*mat.m[1][0] + TempRow.z*mat.m[2][0];
447
m[0][1] = TempRow.x*mat.m[0][1] + TempRow.y*mat.m[1][1] + TempRow.z*mat.m[2][1];
448
m[0][2] = TempRow.x*mat.m[0][2] + TempRow.y*mat.m[1][2] + TempRow.z*mat.m[2][2];
451
m[1][0] = TempRow.x*mat.m[0][0] + TempRow.y*mat.m[1][0] + TempRow.z*mat.m[2][0];
452
m[1][1] = TempRow.x*mat.m[0][1] + TempRow.y*mat.m[1][1] + TempRow.z*mat.m[2][1];
453
m[1][2] = TempRow.x*mat.m[0][2] + TempRow.y*mat.m[1][2] + TempRow.z*mat.m[2][2];
456
m[2][0] = TempRow.x*mat.m[0][0] + TempRow.y*mat.m[1][0] + TempRow.z*mat.m[2][0];
457
m[2][1] = TempRow.x*mat.m[0][1] + TempRow.y*mat.m[1][1] + TempRow.z*mat.m[2][1];
458
m[2][2] = TempRow.x*mat.m[0][2] + TempRow.y*mat.m[1][2] + TempRow.z*mat.m[2][2];
462
//! Operator for Matrix3x3 *= float
463
inline_ Matrix3x3& operator*=(float s)
465
m[0][0] *= s; m[0][1] *= s; m[0][2] *= s;
466
m[1][0] *= s; m[1][1] *= s; m[1][2] *= s;
467
m[2][0] *= s; m[2][1] *= s; m[2][2] *= s;
471
//! Operator for Matrix3x3 /= float
472
inline_ Matrix3x3& operator/=(float s)
475
m[0][0] *= s; m[0][1] *= s; m[0][2] *= s;
476
m[1][0] *= s; m[1][1] *= s; m[1][2] *= s;
477
m[2][0] *= s; m[2][1] *= s; m[2][2] *= s;
482
//! Cast a Matrix3x3 to a Matrix4x4.
483
operator Matrix4x4() const;
484
//! Cast a Matrix3x3 to a Quat.
485
operator Quat() const;
487
inline_ const Point& operator[](int row) const { return *(const Point*)&m[row][0]; }
488
inline_ Point& operator[](int row) { return *(Point*)&m[row][0]; }
495
#endif // __ICEMATRIX3X3_H__