Vegastrike 0.5.1 rc1  1.0
Original sources for Vegastrike Evolved
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Matrix.h
Go to the documentation of this file.
1 //
2 // C++ Interface: Audio::Codec
3 //
4 #ifndef __AUDIO_MATRIX_H__INCLUDED__
5 #define __AUDIO_MATRIX_H__INCLUDED__
6 
7 #include <math.h>
8 #include "Vector.h"
9 
10 namespace Audio {
11 
12  template<typename T> class TMatrix3 {
13  public:
14  T m[3][3];
15 
16  TMatrix3() {}
17  TMatrix3(T m11, T m12, T m13, T m21, T m22, T m23, T m31, T m32, T m33)
18  {
19  m[0][0] = m11; m[0][1] = m12; m[0][2] = m13;
20  m[1][0] = m21; m[1][1] = m22; m[1][2] = m23;
21  m[2][0] = m31; m[2][1] = m32; m[2][2] = m33;
22  }
23  explicit TMatrix3(T s)
24  {
25  m[0][0] = s; m[0][1] = 0; m[0][2] = 0;
26  m[1][0] = 0; m[1][1] = s; m[1][2] = 0;
27  m[2][0] = 0; m[2][1] = 0; m[2][2] = s;
28  }
29 
30  template<typename Y>
31  TMatrix3(const TMatrix3<Y> &o)
32  {
33  m[0][0] = o.m[0][0]; m[0][1] = o.m[0][1]; m[0][2] = o.m[0][2];
34  m[1][0] = o.m[1][0]; m[1][1] = o.m[1][1]; m[1][2] = o.m[1][2];
35  m[2][0] = o.m[2][0]; m[2][1] = o.m[2][1]; m[2][2] = o.m[2][2];
36  }
37 
38  template<typename Y>
39  TMatrix3(const TVector3<Y> &c1, const TVector3<Y> &c2, const TVector3<Y> &c3)
40  {
41  m[0][0] = c1.x; m[0][1] = c2.x; m[0][2] = c3.x;
42  m[1][0] = c1.y; m[1][1] = c2.y; m[1][2] = c3.y;
43  m[2][0] = c1.z; m[2][1] = c2.z; m[2][2] = c3.z;
44  }
45 
46  template<typename Y>
48  {
49  m[0][0] = o.m[0][0]; m[0][1] = o.m[0][1]; m[0][2] = o.m[0][2];
50  m[1][0] = o.m[1][0]; m[1][1] = o.m[1][1]; m[1][2] = o.m[1][2];
51  m[2][0] = o.m[2][0]; m[2][1] = o.m[2][1]; m[2][2] = o.m[2][2];
52  return *this;
53  }
54 
56  {
57  m[0][0] += o.m[0][0]; m[0][1] += o.m[0][1]; m[0][2] += o.m[0][2];
58  m[1][0] += o.m[1][0]; m[1][1] += o.m[1][1]; m[1][2] += o.m[1][2];
59  m[2][0] += o.m[2][0]; m[2][1] += o.m[2][1]; m[2][2] += o.m[2][2];
60  return *this;
61  }
62 
64  {
65  m[0][0] -= o.m[0][0]; m[0][1] -= o.m[0][1]; m[0][2] -= o.m[0][2];
66  m[1][0] -= o.m[1][0]; m[1][1] -= o.m[1][1]; m[1][2] -= o.m[1][2];
67  m[2][0] -= o.m[2][0]; m[2][1] -= o.m[2][1]; m[2][2] -= o.m[2][2];
68  return *this;
69  }
70 
72  {
73  #define DOT(m,om,r,c) (m[r][0]*om[0][c] + m[r][1]*om[1][c] + m[r][2]*om[2][c])
74  TMatrix3<T> rv;
75  rv.m[0][0] = DOT(m,o.m,0,0);
76  rv.m[0][1] = DOT(m,o.m,0,1);
77  rv.m[0][2] = DOT(m,o.m,0,2);
78  rv.m[1][0] = DOT(m,o.m,1,0);
79  rv.m[1][1] = DOT(m,o.m,1,1);
80  rv.m[1][2] = DOT(m,o.m,1,2);
81  rv.m[2][0] = DOT(m,o.m,2,0);
82  rv.m[2][1] = DOT(m,o.m,2,1);
83  rv.m[2][2] = DOT(m,o.m,2,2);
84  #undef DOT
85  return *this;
86  }
87 
89  {
90  m[0][0] *= t; m[0][1] *= t; m[0][2] *= t;
91  m[1][0] *= t; m[1][1] *= t; m[1][2] *= t;
92  m[2][0] *= t; m[2][1] *= t; m[2][2] *= t;
93  return *this;
94  }
95 
97  {
98  (*this) *= other.inverse();
99  return *this;
100  }
101 
103  {
104  (*this) *= T(1) / t;
105  return *this;
106  }
107 
109  {
110  return TMatrix3<T>(
111  m[0][0]+o.m[0][0], m[0][1]+o.m[0][1], m[0][2]+o.m[0][2],
112  m[1][0]+o.m[1][0], m[1][1]+o.m[1][1], m[1][2]+o.m[1][2],
113  m[2][0]+o.m[2][0], m[2][1]+o.m[2][1], m[2][2]+o.m[2][2]
114  );
115  }
116 
118  {
119  return TMatrix3<T>(
120  m[0][0]-o.m[0][0], m[0][1]-o.m[0][1], m[0][2]-o.m[0][2],
121  m[1][0]-o.m[1][0], m[1][1]-o.m[1][1], m[1][2]-o.m[1][2],
122  m[2][0]-o.m[2][0], m[2][1]-o.m[2][1], m[2][2]-o.m[2][2]
123  );
124  }
125 
127  {
128  #define DOT(m,om,r,c) (m[r][0]*om[0][c] + m[r][1]*om[1][c] + m[r][2]*om[2][c])
129  return TMatrix3<T>(
130  DOT(m,o.m,0,0), DOT(m,o.m,0,1), DOT(m,o.m,0,2),
131  DOT(m,o.m,1,0), DOT(m,o.m,1,1), DOT(m,o.m,1,2),
132  DOT(m,o.m,2,0), DOT(m,o.m,2,1), DOT(m,o.m,2,2)
133  );
134  #undef DOT
135  }
136 
137  TMatrix3<T> operator/(const TMatrix3<T> &other) const
138  {
139  return (*this) * other.inverse();
140  }
141 
143  {
144  return TMatrix3<T>(
145  m[0][0]*t, m[0][1]*t, m[0][2]*t,
146  m[1][0]*t, m[1][1]*t, m[1][2]*t,
147  m[2][0]*t, m[2][1]*t, m[2][2]*t
148  );
149  }
150 
152  {
153  return (*this) * (T(1) / t);
154  }
155 
156  template<typename Y>
158  {
159  return TVector3<Y>(
160  m[0][0]*t.x + m[0][1]*t.y + m[0][2]*t.z,
161  m[1][0]*t.x + m[1][1]*t.y + m[1][2]*t.z,
162  m[2][0]*t.x + m[2][1]*t.y + m[2][2]*t.z
163  );
164  }
165 
167  {
168  TMatrix3<T> rv;
169 
170  /*
171  compute adjoint matrix,
172  then divide by the determinant
173  */
174 
175  //determinant
176  float det =
177  +m[0][0] * m[1][1] * m[2][2]
178  +m[1][0] * m[2][1] * m[0][2]
179  +m[2][0] * m[0][1] * m[1][2]
180 
181  -m[0][2] * m[1][1] * m[2][0]
182  -m[1][2] * m[2][1] * m[0][0]
183  -m[2][2] * m[0][1] * m[1][0];
184  float idet = T(1) / det;
185 
186  rv.m[0][0] =+(m[1][1] * m[2][2] - m[1][2] * m[2][1]) * idet;
187  rv.m[0][1] =-(m[1][0] * m[2][2] - m[1][2] * m[2][0]) * idet;
188  rv.m[0][2] =+(m[1][0] * m[2][1] - m[1][1] * m[2][0]) * idet;
189 
190  rv.m[1][0] =-(m[0][1] * m[2][2] - m[0][2] * m[2][1]) * idet;
191  rv.m[1][1] =+(m[0][0] * m[2][2] - m[0][2] * m[2][0]) * idet;
192  rv.m[1][2] =-(m[0][0] * m[2][1] - m[0][1] * m[2][0]) * idet;
193 
194  rv.m[2][0] =+(m[0][1] * m[1][2] - m[0][2] * m[1][1]) * idet;
195  rv.m[2][1] =-(m[0][0] * m[1][2] - m[0][2] * m[1][0]) * idet;
196  rv.m[2][2] =+(m[0][0] * m[1][1] - m[0][1] * m[1][0]) * idet;
197 
198  return rv;
199  }
200 
202  {
203  return TMatrix3<T>(
204  m[0][0], m[1][0], m[2][0],
205  m[0][1], m[1][1], m[2][1],
206  m[0][2], m[1][2], m[2][2]
207  );
208  }
209  };
210 
211 };
212 
213 #endif//__AUDIO_VECTOR_H__INCLUDED__