My Project
Matrix3x3.h
1 #pragma once
2 
3 namespace ParaEngine
4 {
5 
24  class Matrix3x3
25  {
26  public:
27  Matrix3x3(void);
28  ~Matrix3x3(void);
29 
32  Matrix3x3(float m00, float m01, float m02, float m10, float m11, float m12, float m20, float m21, float m22)
33  {
34  m[0][0] = m00; m[0][1] = m01; m[0][2] = m02;
35  m[1][0] = m10; m[1][1] = m11; m[1][2] = m12;
36  m[2][0] = m20; m[2][1] = m21; m[2][2] = m22;
37  }
38  Matrix3x3(const D3DXMATRIX& mat4x4);
40  Matrix3x3(const Matrix3x3& mat);
41 
43  void Set(float m00, float m01, float m02, float m10, float m11, float m12, float m20, float m21, float m22)
44  {
45  m[0][0] = m00; m[0][1] = m01; m[0][2] = m02;
46  m[1][0] = m10; m[1][1] = m11; m[1][2] = m12;
47  m[2][0] = m20; m[2][1] = m21; m[2][2] = m22;
48  }
49 
51  void SetScale(const D3DXVECTOR3& p) { m[0][0] = p.x; m[1][1] = p.y; m[2][2] = p.z; }
52 
54  void SetScale(float sx, float sy, float sz) { m[0][0] = sx; m[1][1] = sy; m[2][2] = sz; }
55 
57  void Scale(const D3DXVECTOR3& p)
58  {
59  m[0][0] *= p.x; m[0][1] *= p.x; m[0][2] *= p.x;
60  m[1][0] *= p.y; m[1][1] *= p.y; m[1][2] *= p.y;
61  m[2][0] *= p.z; m[2][1] *= p.z; m[2][2] *= p.z;
62  }
63 
65  void Scale(float sx, float sy, float sz)
66  {
67  m[0][0] *= sx; m[0][1] *= sx; m[0][2] *= sx;
68  m[1][0] *= sy; m[1][1] *= sy; m[1][2] *= sy;
69  m[2][0] *= sz; m[2][1] *= sz; m[2][2] *= sz;
70  }
71 
73  void Copy(const Matrix3x3& source);
74 
75  // Row-column access
77  void GetRow(const DWORD r, D3DXVECTOR3& p) const { p.x = m[r][0]; p.y = m[r][1]; p.z = m[r][2]; }
79  const D3DXVECTOR3& GetRow(const DWORD r) const { return *(const D3DXVECTOR3*)&m[r][0]; }
81  D3DXVECTOR3& GetRow(const DWORD r) { return *(D3DXVECTOR3*)&m[r][0]; }
83  void SetRow(const DWORD r, const D3DXVECTOR3& p) { m[r][0] = p.x; m[r][1] = p.y; m[r][2] = p.z; }
85  void GetCol(const DWORD c, D3DXVECTOR3& p) const { p.x = m[0][c]; p.y = m[1][c]; p.z = m[2][c]; }
87  void SetCol(const DWORD c, const D3DXVECTOR3& p) { m[0][c] = p.x; m[1][c] = p.y; m[2][c] = p.z; }
88 
90  float Trace() const { return m[0][0] + m[1][1] + m[2][2]; }
92  void Zero();
94  void Identity() { Zero(); m[0][0] = m[1][1] = m[2][2] = 1.0f; }
96  bool IsIdentity() const;
97 
104  void SkewSymmetric(const D3DXVECTOR3& a)
105  {
106  m[0][0] = 0.0f;
107  m[0][1] = -a.z;
108  m[0][2] = a.y;
109 
110  m[1][0] = a.z;
111  m[1][1] = 0.0f;
112  m[1][2] = -a.x;
113 
114  m[2][0] = -a.y;
115  m[2][1] = a.x;
116  m[2][2] = 0.0f;
117  }
118 
120  void Neg()
121  {
122  m[0][0] = -m[0][0]; m[0][1] = -m[0][1]; m[0][2] = -m[0][2];
123  m[1][0] = -m[1][0]; m[1][1] = -m[1][1]; m[1][2] = -m[1][2];
124  m[2][0] = -m[2][0]; m[2][1] = -m[2][1]; m[2][2] = -m[2][2];
125  }
126 
128  void Neg(const Matrix3x3& mat)
129  {
130  m[0][0] = -mat.m[0][0]; m[0][1] = -mat.m[0][1]; m[0][2] = -mat.m[0][2];
131  m[1][0] = -mat.m[1][0]; m[1][1] = -mat.m[1][1]; m[1][2] = -mat.m[1][2];
132  m[2][0] = -mat.m[2][0]; m[2][1] = -mat.m[2][1]; m[2][2] = -mat.m[2][2];
133  }
134 
136  void Add(const Matrix3x3& mat)
137  {
138  m[0][0] += mat.m[0][0]; m[0][1] += mat.m[0][1]; m[0][2] += mat.m[0][2];
139  m[1][0] += mat.m[1][0]; m[1][1] += mat.m[1][1]; m[1][2] += mat.m[1][2];
140  m[2][0] += mat.m[2][0]; m[2][1] += mat.m[2][1]; m[2][2] += mat.m[2][2];
141  }
142 
144  void Sub(const Matrix3x3& mat)
145  {
146  m[0][0] -= mat.m[0][0]; m[0][1] -= mat.m[0][1]; m[0][2] -= mat.m[0][2];
147  m[1][0] -= mat.m[1][0]; m[1][1] -= mat.m[1][1]; m[1][2] -= mat.m[1][2];
148  m[2][0] -= mat.m[2][0]; m[2][1] -= mat.m[2][1]; m[2][2] -= mat.m[2][2];
149  }
151  void Mac(const Matrix3x3& a, const Matrix3x3& b, float s)
152  {
153  m[0][0] = a.m[0][0] + b.m[0][0] * s;
154  m[0][1] = a.m[0][1] + b.m[0][1] * s;
155  m[0][2] = a.m[0][2] + b.m[0][2] * s;
156 
157  m[1][0] = a.m[1][0] + b.m[1][0] * s;
158  m[1][1] = a.m[1][1] + b.m[1][1] * s;
159  m[1][2] = a.m[1][2] + b.m[1][2] * s;
160 
161  m[2][0] = a.m[2][0] + b.m[2][0] * s;
162  m[2][1] = a.m[2][1] + b.m[2][1] * s;
163  m[2][2] = a.m[2][2] + b.m[2][2] * s;
164  }
166  void Mac(const Matrix3x3& a, float s)
167  {
168  m[0][0] += a.m[0][0] * s; m[0][1] += a.m[0][1] * s; m[0][2] += a.m[0][2] * s;
169  m[1][0] += a.m[1][0] * s; m[1][1] += a.m[1][1] * s; m[1][2] += a.m[1][2] * s;
170  m[2][0] += a.m[2][0] * s; m[2][1] += a.m[2][1] * s; m[2][2] += a.m[2][2] * s;
171  }
172 
174  void Mult(const Matrix3x3& a, float s)
175  {
176  m[0][0] = a.m[0][0] * s; m[0][1] = a.m[0][1] * s; m[0][2] = a.m[0][2] * s;
177  m[1][0] = a.m[1][0] * s; m[1][1] = a.m[1][1] * s; m[1][2] = a.m[1][2] * s;
178  m[2][0] = a.m[2][0] * s; m[2][1] = a.m[2][1] * s; m[2][2] = a.m[2][2] * s;
179  }
180 
181  void Add(const Matrix3x3& a, const Matrix3x3& b)
182  {
183  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];
184  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];
185  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];
186  }
187 
188  void Sub(const Matrix3x3& a, const Matrix3x3& b)
189  {
190  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];
191  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];
192  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];
193  }
194 
196  void Mult(const Matrix3x3& a, const Matrix3x3& b)
197  {
198  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];
199  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];
200  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];
201  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];
202  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];
203  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];
204  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];
205  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];
206  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];
207  }
208 
210  void MultAtB(const Matrix3x3& a, const Matrix3x3& b)
211  {
212  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];
213  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];
214  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];
215  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];
216  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];
217  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];
218  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];
219  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];
220  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];
221  }
222 
224  void MultABt(const Matrix3x3& a, const Matrix3x3& b)
225  {
226  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];
227  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];
228  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];
229  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];
230  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];
231  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];
232  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];
233  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];
234  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];
235  }
236 
238  Matrix3x3& FromTo(const D3DXVECTOR3& from, const D3DXVECTOR3& to);
239 
244  void RotX(float angle) { float Cos = cosf(angle), Sin = sinf(angle); Identity(); m[1][1] = m[2][2] = Cos; m[2][1] = -Sin; m[1][2] = Sin; }
245 
250  void RotY(float angle) { float Cos = cosf(angle), Sin = sinf(angle); Identity(); m[0][0] = m[2][2] = Cos; m[2][0] = Sin; m[0][2] = -Sin; }
251 
256  void RotZ(float angle) { float Cos = cosf(angle), Sin = sinf(angle); Identity(); m[0][0] = m[1][1] = Cos; m[1][0] = -Sin; m[0][1] = Sin; }
257 
261  void RotYX(float y, float x);
262 
264  Matrix3x3& Rot(float angle, const D3DXVECTOR3& axis);
265 
267  void Transpose();
268 
270  void Transpose(const Matrix3x3& a)
271  {
272  m[0][0] = a.m[0][0]; m[0][1] = a.m[1][0]; m[0][2] = a.m[2][0];
273  m[1][0] = a.m[0][1]; m[1][1] = a.m[1][1]; m[1][2] = a.m[2][1];
274  m[2][0] = a.m[0][2]; m[2][1] = a.m[1][2]; m[2][2] = a.m[2][2];
275  }
276 
278  float Determinant() const
279  {
280  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])
281  - (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]);
282  }
283  /*
285  float CoFactor(ubyte row, ubyte column) const
286  {
287  static sdword gIndex[3+2] = { 0, 1, 2, 0, 1 };
288  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]]);
289  }
290  */
293  {
294  float Det = Determinant(); // Must be !=0
295  float OneOverDet = 1.0f / Det;
296 
297  Matrix3x3 Temp;
298  Temp.m[0][0] = +(m[1][1] * m[2][2] - m[2][1] * m[1][2]) * OneOverDet;
299  Temp.m[1][0] = -(m[1][0] * m[2][2] - m[2][0] * m[1][2]) * OneOverDet;
300  Temp.m[2][0] = +(m[1][0] * m[2][1] - m[2][0] * m[1][1]) * OneOverDet;
301  Temp.m[0][1] = -(m[0][1] * m[2][2] - m[2][1] * m[0][2]) * OneOverDet;
302  Temp.m[1][1] = +(m[0][0] * m[2][2] - m[2][0] * m[0][2]) * OneOverDet;
303  Temp.m[2][1] = -(m[0][0] * m[2][1] - m[2][0] * m[0][1]) * OneOverDet;
304  Temp.m[0][2] = +(m[0][1] * m[1][2] - m[1][1] * m[0][2]) * OneOverDet;
305  Temp.m[1][2] = -(m[0][0] * m[1][2] - m[1][0] * m[0][2]) * OneOverDet;
306  Temp.m[2][2] = +(m[0][0] * m[1][1] - m[1][0] * m[0][1]) * OneOverDet;
307 
308  *this = Temp;
309 
310  return *this;
311  }
312 
313  Matrix3x3& Normalize();
314 
316  Matrix3x3& Exp(const Matrix3x3& a);
317 
318  void FromQuat(const D3DXQUATERNION &q);
319  void FromQuatL2(const D3DXQUATERNION&q, float l2);
320 
321  // Arithmetic operators
323  Matrix3x3 operator+(const Matrix3x3& mat) const
324  {
325  return Matrix3x3(
326  m[0][0] + mat.m[0][0], m[0][1] + mat.m[0][1], m[0][2] + mat.m[0][2],
327  m[1][0] + mat.m[1][0], m[1][1] + mat.m[1][1], m[1][2] + mat.m[1][2],
328  m[2][0] + mat.m[2][0], m[2][1] + mat.m[2][1], m[2][2] + mat.m[2][2]);
329  }
330 
332  Matrix3x3 operator-(const Matrix3x3& mat) const
333  {
334  return Matrix3x3(
335  m[0][0] - mat.m[0][0], m[0][1] - mat.m[0][1], m[0][2] - mat.m[0][2],
336  m[1][0] - mat.m[1][0], m[1][1] - mat.m[1][1], m[1][2] - mat.m[1][2],
337  m[2][0] - mat.m[2][0], m[2][1] - mat.m[2][1], m[2][2] - mat.m[2][2]);
338  }
339 
341  Matrix3x3 operator*(const Matrix3x3& mat) const
342  {
343  return Matrix3x3(
344  m[0][0]*mat.m[0][0] + m[0][1]*mat.m[1][0] + m[0][2]*mat.m[2][0],
345  m[0][0]*mat.m[0][1] + m[0][1]*mat.m[1][1] + m[0][2]*mat.m[2][1],
346  m[0][0]*mat.m[0][2] + m[0][1]*mat.m[1][2] + m[0][2]*mat.m[2][2],
347 
348  m[1][0]*mat.m[0][0] + m[1][1]*mat.m[1][0] + m[1][2]*mat.m[2][0],
349  m[1][0]*mat.m[0][1] + m[1][1]*mat.m[1][1] + m[1][2]*mat.m[2][1],
350  m[1][0]*mat.m[0][2] + m[1][1]*mat.m[1][2] + m[1][2]*mat.m[2][2],
351 
352  m[2][0]*mat.m[0][0] + m[2][1]*mat.m[1][0] + m[2][2]*mat.m[2][0],
353  m[2][0]*mat.m[0][1] + m[2][1]*mat.m[1][1] + m[2][2]*mat.m[2][1],
354  m[2][0]*mat.m[0][2] + m[2][1]*mat.m[1][2] + m[2][2]*mat.m[2][2]);
355  }
356 
358  D3DXVECTOR3 operator*(const D3DXVECTOR3& v) const;
359 
361  Matrix3x3 operator*(float s) const
362  {
363  return Matrix3x3(
364  m[0][0]*s, m[0][1]*s, m[0][2]*s,
365  m[1][0]*s, m[1][1]*s, m[1][2]*s,
366  m[2][0]*s, m[2][1]*s, m[2][2]*s);
367  }
368 
370  friend Matrix3x3 operator*(float s, const Matrix3x3& mat)
371  {
372  return Matrix3x3(
373  s*mat.m[0][0], s*mat.m[0][1], s*mat.m[0][2],
374  s*mat.m[1][0], s*mat.m[1][1], s*mat.m[1][2],
375  s*mat.m[2][0], s*mat.m[2][1], s*mat.m[2][2]);
376  }
377 
379  Matrix3x3 operator/(float s) const
380  {
381  if (s) s = 1.0f / s;
382  return Matrix3x3(
383  m[0][0]*s, m[0][1]*s, m[0][2]*s,
384  m[1][0]*s, m[1][1]*s, m[1][2]*s,
385  m[2][0]*s, m[2][1]*s, m[2][2]*s);
386  }
387 
389  friend Matrix3x3 operator/(float s, const Matrix3x3& mat)
390  {
391  return Matrix3x3(
392  s/mat.m[0][0], s/mat.m[0][1], s/mat.m[0][2],
393  s/mat.m[1][0], s/mat.m[1][1], s/mat.m[1][2],
394  s/mat.m[2][0], s/mat.m[2][1], s/mat.m[2][2]);
395  }
396 
399  {
400  m[0][0] += mat.m[0][0]; m[0][1] += mat.m[0][1]; m[0][2] += mat.m[0][2];
401  m[1][0] += mat.m[1][0]; m[1][1] += mat.m[1][1]; m[1][2] += mat.m[1][2];
402  m[2][0] += mat.m[2][0]; m[2][1] += mat.m[2][1]; m[2][2] += mat.m[2][2];
403  return *this;
404  }
405 
408  {
409  m[0][0] -= mat.m[0][0]; m[0][1] -= mat.m[0][1]; m[0][2] -= mat.m[0][2];
410  m[1][0] -= mat.m[1][0]; m[1][1] -= mat.m[1][1]; m[1][2] -= mat.m[1][2];
411  m[2][0] -= mat.m[2][0]; m[2][1] -= mat.m[2][1]; m[2][2] -= mat.m[2][2];
412  return *this;
413  }
414 
417  {
418  D3DXVECTOR3 TempRow;
419 
420  GetRow(0, TempRow);
421  m[0][0] = TempRow.x*mat.m[0][0] + TempRow.y*mat.m[1][0] + TempRow.z*mat.m[2][0];
422  m[0][1] = TempRow.x*mat.m[0][1] + TempRow.y*mat.m[1][1] + TempRow.z*mat.m[2][1];
423  m[0][2] = TempRow.x*mat.m[0][2] + TempRow.y*mat.m[1][2] + TempRow.z*mat.m[2][2];
424 
425  GetRow(1, TempRow);
426  m[1][0] = TempRow.x*mat.m[0][0] + TempRow.y*mat.m[1][0] + TempRow.z*mat.m[2][0];
427  m[1][1] = TempRow.x*mat.m[0][1] + TempRow.y*mat.m[1][1] + TempRow.z*mat.m[2][1];
428  m[1][2] = TempRow.x*mat.m[0][2] + TempRow.y*mat.m[1][2] + TempRow.z*mat.m[2][2];
429 
430  GetRow(2, TempRow);
431  m[2][0] = TempRow.x*mat.m[0][0] + TempRow.y*mat.m[1][0] + TempRow.z*mat.m[2][0];
432  m[2][1] = TempRow.x*mat.m[0][1] + TempRow.y*mat.m[1][1] + TempRow.z*mat.m[2][1];
433  m[2][2] = TempRow.x*mat.m[0][2] + TempRow.y*mat.m[1][2] + TempRow.z*mat.m[2][2];
434  return *this;
435  }
436 
439  {
440  m[0][0] *= s; m[0][1] *= s; m[0][2] *= s;
441  m[1][0] *= s; m[1][1] *= s; m[1][2] *= s;
442  m[2][0] *= s; m[2][1] *= s; m[2][2] *= s;
443  return *this;
444  }
445 
448  {
449  if (s) s = 1.0f / s;
450  m[0][0] *= s; m[0][1] *= s; m[0][2] *= s;
451  m[1][0] *= s; m[1][1] *= s; m[1][2] *= s;
452  m[2][0] *= s; m[2][1] *= s; m[2][2] *= s;
453  return *this;
454  }
455 
456  // Cast operators
458  operator D3DXMATRIX() const;
460  operator D3DXQUATERNION() const;
461 
462  const D3DXVECTOR3& operator[](int row) const { return *(const D3DXVECTOR3*)&m[row][0]; }
463  D3DXVECTOR3& operator[](int row) { return *(D3DXVECTOR3*)&m[row][0]; }
464 
465  public:
466 
467  float m[3][3];
468  };
469 }
Matrix3x3 operator+(const Matrix3x3 &mat) const
Operator for Matrix3x3 Plus = Matrix3x3 + Matrix3x3;.
Definition: Matrix3x3.h:323
void Set(float m00, float m01, float m02, float m10, float m11, float m12, float m20, float m21, float m22)
Assign values.
Definition: Matrix3x3.h:43
void Sub(const Matrix3x3 &mat)
Sub another matrix.
Definition: Matrix3x3.h:144
void Mult(const Matrix3x3 &a, float s)
this = A * s
Definition: Matrix3x3.h:174
Matrix3x3(float m00, float m01, float m02, float m10, float m11, float m12, float m20, float m21, float m22)
Empty constructor Constructor from 9 values.
Definition: Matrix3x3.h:32
3x3 matrix.
Definition: Matrix3x3.h:24
friend Matrix3x3 operator*(float s, const Matrix3x3 &mat)
Operator for Matrix3x3 Mul = float * Matrix3x3;.
Definition: Matrix3x3.h:370
const D3DXVECTOR3 & GetRow(const DWORD r) const
Returns a row.
Definition: Matrix3x3.h:79
Matrix3x3 & operator*=(const Matrix3x3 &mat)
Operator for Matrix3x3 *= Matrix3x3.
Definition: Matrix3x3.h:416
Matrix3x3 operator*(float s) const
Operator for Matrix3x3 Mul = Matrix3x3 * float;.
Definition: Matrix3x3.h:361
void MultABt(const Matrix3x3 &a, const Matrix3x3 &b)
this = a * transpose(b)
Definition: Matrix3x3.h:224
void RotX(float angle)
Set a rotation matrix around the X axis.
Definition: Matrix3x3.h:244
different physics engine has different winding order.
Definition: EventBinding.h:32
float Trace() const
Computes the trace. The trace is the sum of the 3 diagonal components.
Definition: Matrix3x3.h:90
void RotY(float angle)
Set a rotation matrix around the Y axis.
Definition: Matrix3x3.h:250
void Zero()
Clears the matrix.
Definition: Matrix3x3.cpp:41
void Copy(const Matrix3x3 &source)
Copy from a Matrix3x3.
Definition: Matrix3x3.cpp:36
D3DXVECTOR3 & GetRow(const DWORD r)
Returns a row.
Definition: Matrix3x3.h:81
void Neg()
Negates the matrix.
Definition: Matrix3x3.h:120
void Neg(const Matrix3x3 &mat)
Neg from another matrix.
Definition: Matrix3x3.h:128
void Mac(const Matrix3x3 &a, const Matrix3x3 &b, float s)
Mac.
Definition: Matrix3x3.h:151
void Scale(float sx, float sy, float sz)
Scales from floats. Each row is multiplied by a value.
Definition: Matrix3x3.h:65
void MultAtB(const Matrix3x3 &a, const Matrix3x3 &b)
this = transpose(a) * b
Definition: Matrix3x3.h:210
void Transpose(const Matrix3x3 &a)
this = Transpose(a)
Definition: Matrix3x3.h:270
Matrix3x3 operator*(const Matrix3x3 &mat) const
Operator for Matrix3x3 Mul = Matrix3x3 * Matrix3x3;.
Definition: Matrix3x3.h:341
void Mac(const Matrix3x3 &a, float s)
Mac.
Definition: Matrix3x3.h:166
Matrix3x3 & operator-=(const Matrix3x3 &mat)
Operator for Matrix3x3 -= Matrix3x3.
Definition: Matrix3x3.h:407
void SetScale(const D3DXVECTOR3 &p)
Sets the scale from a D3DXVECTOR3. The point is put on the diagonal.
Definition: Matrix3x3.h:51
void SetRow(const DWORD r, const D3DXVECTOR3 &p)
Sets a row.
Definition: Matrix3x3.h:83
friend Matrix3x3 operator/(float s, const Matrix3x3 &mat)
Operator for Matrix3x3 Div = float / Matrix3x3;.
Definition: Matrix3x3.h:389
void SetCol(const DWORD c, const D3DXVECTOR3 &p)
Sets a column.
Definition: Matrix3x3.h:87
void Scale(const D3DXVECTOR3 &p)
Scales from a D3DXVECTOR3. Each row is multiplied by a component.
Definition: Matrix3x3.h:57
void SetScale(float sx, float sy, float sz)
Sets the scale from floats. Values are put on the diagonal.
Definition: Matrix3x3.h:54
void Add(const Matrix3x3 &mat)
Add another matrix.
Definition: Matrix3x3.h:136
void GetRow(const DWORD r, D3DXVECTOR3 &p) const
Returns a row.
Definition: Matrix3x3.h:77
Matrix3x3 & Exp(const Matrix3x3 &a)
this = exp(a)
void RotYX(float y, float x)
cy sx.sy -sy.cx RY.RX 0 cx sx sy -sx.cy cx.cy
bool IsIdentity() const
Checks for identity.
Definition: Matrix3x3.cpp:51
float Determinant() const
Compute the determinant of the matrix. We use the rule of Sarrus.
Definition: Matrix3x3.h:278
void RotZ(float angle)
Set a rotation matrix around the Z axis.
Definition: Matrix3x3.h:256
Matrix3x3 operator/(float s) const
Operator for Matrix3x3 Div = Matrix3x3 / float;.
Definition: Matrix3x3.h:379
Matrix3x3 & Rot(float angle, const D3DXVECTOR3 &axis)
Make a rotation matrix about an arbitrary axis.
Matrix3x3 & operator*=(float s)
Operator for Matrix3x3 *= float.
Definition: Matrix3x3.h:438
Matrix3x3 & operator+=(const Matrix3x3 &mat)
Operator for Matrix3x3 += Matrix3x3.
Definition: Matrix3x3.h:398
void SkewSymmetric(const D3DXVECTOR3 &a)
Makes a skew-symmetric matrix (a.k.a.
Definition: Matrix3x3.h:104
Matrix3x3 & operator/=(float s)
Operator for Matrix3x3 /= float.
Definition: Matrix3x3.h:447
Matrix3x3 & FromTo(const D3DXVECTOR3 &from, const D3DXVECTOR3 &to)
Makes a rotation matrix mapping vector "from" to vector "to".
void Identity()
Sets the identity matrix.
Definition: Matrix3x3.h:94
void Mult(const Matrix3x3 &a, const Matrix3x3 &b)
this = a * b
Definition: Matrix3x3.h:196
void GetCol(const DWORD c, D3DXVECTOR3 &p) const
Returns a column.
Definition: Matrix3x3.h:85
void Transpose()
Transpose the matrix.
Definition: Matrix3x3.cpp:68
Matrix3x3 operator-(const Matrix3x3 &mat) const
Operator for Matrix3x3 Minus = Matrix3x3 - Matrix3x3;.
Definition: Matrix3x3.h:332
Matrix3x3 & Invert()
Invert the matrix. Determinant must be different from zero, else matrix can't be inverted.
Definition: Matrix3x3.h:292