OPENVR Scol plugin
vrmaths.h
1 
2 #ifndef __VRMATHS_H__
3 #define __VRMATHS_H__
4 
5 #include <string.h>
6 #include <math.h>
7 
8 class Matrix3;
9 class Quaternion;
10 
11 class Vector3
12 {
13 public:
14  float x, y, z;
15 
16 public:
17  static const Vector3 ZERO;
18 
19  inline Vector3()
20  {
21  }
22 
23  inline Vector3(const float fX, const float fY, const float fZ)
24  : x(fX), y(fY), z(fZ) {}
25 
26  inline explicit Vector3(const float afCoordinate[3])
27  : x(afCoordinate[0]),
28  y(afCoordinate[1]),
29  z(afCoordinate[2]) {}
30 
31  inline explicit Vector3(const int afCoordinate[3])
32  {
33  x = (float)afCoordinate[0];
34  y = (float)afCoordinate[1];
35  z = (float)afCoordinate[2];
36  }
37 
38  inline explicit Vector3(float* const r)
39  : x(r[0]), y(r[1]), z(r[2]) {}
40 
41  inline explicit Vector3(const float scaler)
42  : x(scaler)
43  , y(scaler)
44  , z(scaler) {}
45 
46  inline float operator [] (const size_t i) const
47  {
48  return *(&x + i);
49  }
50 
51  inline float& operator [] (const size_t i)
52  {
53  return *(&x + i);
54  }
56  inline float* ptr()
57  {
58  return &x;
59  }
61  inline const float* ptr() const
62  {
63  return &x;
64  }
65 
66  inline Vector3& operator = (const Vector3& rkVector)
67  {
68  x = rkVector.x;
69  y = rkVector.y;
70  z = rkVector.z;
71 
72  return *this;
73  }
74 
75  inline Vector3& operator = (const float fScaler)
76  {
77  x = fScaler;
78  y = fScaler;
79  z = fScaler;
80 
81  return *this;
82  }
83 
84  inline bool operator == (const Vector3& rkVector) const
85  {
86  return (x == rkVector.x && y == rkVector.y && z == rkVector.z);
87  }
88 
89  inline bool operator != (const Vector3& rkVector) const
90  {
91  return (x != rkVector.x || y != rkVector.y || z != rkVector.z);
92  }
93 
94  // arithmetic operations
95  inline Vector3 operator + (const Vector3& rkVector) const
96  {
97  return Vector3(
98  x + rkVector.x,
99  y + rkVector.y,
100  z + rkVector.z);
101  }
102 
103  inline Vector3 operator - (const Vector3& rkVector) const
104  {
105  return Vector3(
106  x - rkVector.x,
107  y - rkVector.y,
108  z - rkVector.z);
109  }
110 
111  inline Vector3 operator * (const float fScalar) const
112  {
113  return Vector3(
114  x * fScalar,
115  y * fScalar,
116  z * fScalar);
117  }
118 
119  inline Vector3 operator * (const Vector3& rhs) const
120  {
121  return Vector3(
122  x * rhs.x,
123  y * rhs.y,
124  z * rhs.z);
125  }
126 
127  inline Vector3 operator / (const float fScalar) const
128  {
129  float fInv = 1.0f / fScalar;
130 
131  return Vector3(
132  x * fInv,
133  y * fInv,
134  z * fInv);
135  }
136 
137  inline Vector3 operator / (const Vector3& rhs) const
138  {
139  return Vector3(
140  x / rhs.x,
141  y / rhs.y,
142  z / rhs.z);
143  }
144 
145  inline const Vector3& operator + () const
146  {
147  return *this;
148  }
149 
150  inline Vector3 operator - () const
151  {
152  return Vector3(-x, -y, -z);
153  }
154 
155  // overloaded operators to help Vector3
156  inline friend Vector3 operator * (const float fScalar, const Vector3& rkVector)
157  {
158  return Vector3(
159  fScalar * rkVector.x,
160  fScalar * rkVector.y,
161  fScalar * rkVector.z);
162  }
163 
164  inline friend Vector3 operator / (const float fScalar, const Vector3& rkVector)
165  {
166  return Vector3(
167  fScalar / rkVector.x,
168  fScalar / rkVector.y,
169  fScalar / rkVector.z);
170  }
171 
172  inline friend Vector3 operator + (const Vector3& lhs, const float rhs)
173  {
174  return Vector3(
175  lhs.x + rhs,
176  lhs.y + rhs,
177  lhs.z + rhs);
178  }
179 
180  inline friend Vector3 operator + (const float lhs, const Vector3& rhs)
181  {
182  return Vector3(
183  lhs + rhs.x,
184  lhs + rhs.y,
185  lhs + rhs.z);
186  }
187 
188  inline friend Vector3 operator - (const Vector3& lhs, const float rhs)
189  {
190  return Vector3(
191  lhs.x - rhs,
192  lhs.y - rhs,
193  lhs.z - rhs);
194  }
195 
196  inline friend Vector3 operator - (const float lhs, const Vector3& rhs)
197  {
198  return Vector3(
199  lhs - rhs.x,
200  lhs - rhs.y,
201  lhs - rhs.z);
202  }
203 
204  // arithmetic updates
205  inline Vector3& operator += (const Vector3& rkVector)
206  {
207  x += rkVector.x;
208  y += rkVector.y;
209  z += rkVector.z;
210 
211  return *this;
212  }
213 
214  inline Vector3& operator += (const float fScalar)
215  {
216  x += fScalar;
217  y += fScalar;
218  z += fScalar;
219  return *this;
220  }
221 
222  inline Vector3& operator -= (const Vector3& rkVector)
223  {
224  x -= rkVector.x;
225  y -= rkVector.y;
226  z -= rkVector.z;
227 
228  return *this;
229  }
230 
231  inline Vector3& operator -= (const float fScalar)
232  {
233  x -= fScalar;
234  y -= fScalar;
235  z -= fScalar;
236  return *this;
237  }
238 
239  inline Vector3& operator *= (const float fScalar)
240  {
241  x *= fScalar;
242  y *= fScalar;
243  z *= fScalar;
244  return *this;
245  }
246 
247  inline Vector3& operator *= (const Vector3& rkVector)
248  {
249  x *= rkVector.x;
250  y *= rkVector.y;
251  z *= rkVector.z;
252 
253  return *this;
254  }
255 
256  inline Vector3& operator /= (const float fScalar)
257  {
258  float fInv = 1.0f / fScalar;
259 
260  x *= fInv;
261  y *= fInv;
262  z *= fInv;
263 
264  return *this;
265  }
266 
267  inline Vector3& operator /= (const Vector3& rkVector)
268  {
269  x /= rkVector.x;
270  y /= rkVector.y;
271  z /= rkVector.z;
272 
273  return *this;
274  }
275 };
276 
277 class Matrix3
278 {
279 public:
280  inline Matrix3() {}
281  inline explicit Matrix3(const float arr[3][3])
282  {
283  memcpy(m, arr, 9 * sizeof(float));
284  }
285  inline Matrix3(const Matrix3& rkMatrix)
286  {
287  memcpy(m, rkMatrix.m, 9 * sizeof(float));
288  }
289  Matrix3(float fEntry00, float fEntry01, float fEntry02,
290  float fEntry10, float fEntry11, float fEntry12,
291  float fEntry20, float fEntry21, float fEntry22)
292  {
293  m[0][0] = fEntry00;
294  m[0][1] = fEntry01;
295  m[0][2] = fEntry02;
296  m[1][0] = fEntry10;
297  m[1][1] = fEntry11;
298  m[1][2] = fEntry12;
299  m[2][0] = fEntry20;
300  m[2][1] = fEntry21;
301  m[2][2] = fEntry22;
302  }
303 
304  inline const float* operator[] (size_t iRow) const
305  {
306  return m[iRow];
307  }
308 
309  inline float* operator[] (size_t iRow)
310  {
311  return m[iRow];
312  }
313 
314  inline Matrix3& operator= (const Matrix3& rkMatrix)
315  {
316  memcpy(m, rkMatrix.m, 9 * sizeof(float));
317  return *this;
318  }
319 
320  bool operator== (const Matrix3& rkMatrix) const;
321 
322  inline bool operator!= (const Matrix3& rkMatrix) const
323  {
324  return !operator==(rkMatrix);
325  }
326 
327 protected:
328  float m[3][3];
329 
330  // for faster access
331  friend class Matrix4;
332 };
333 
335 {
336 public:
337  float w, x, y, z;
338 
339  inline Quaternion() : w(1), x(0), y(0), z(0) {}
340 
341  inline Quaternion(float fW, float fX, float fY, float fZ) : w(fW), x(fX), y(fY), z(fZ) {}
342 
343  inline Quaternion(const Matrix3& rot)
344  {
345  this->FromRotationMatrix(rot);
346  }
347 
348  inline float operator [] (const size_t i) const
349  {
350  return *(&w + i);
351  }
352 
353  inline float& operator [] (const size_t i)
354  {
355  return *(&w + i);
356  }
357 
358  void FromRotationMatrix(const Matrix3& kRot);
359 
360  inline Quaternion& operator= (const Quaternion& rkQ)
361  {
362  w = rkQ.w;
363  x = rkQ.x;
364  y = rkQ.y;
365  z = rkQ.z;
366  return *this;
367  }
368  Quaternion operator+ (const Quaternion& rkQ) const
369  {
370  return Quaternion(w + rkQ.w, x + rkQ.x, y + rkQ.y, z + rkQ.z);
371  }
372  Quaternion operator- (const Quaternion& rkQ) const
373  {
374  return Quaternion(w - rkQ.w, x - rkQ.x, y - rkQ.y, z - rkQ.z);
375  }
376  Quaternion operator* (const Quaternion& rkQ) const
377  {
378  return Quaternion
379  (
380  w * rkQ.w - x * rkQ.x - y * rkQ.y - z * rkQ.z,
381  w * rkQ.x + x * rkQ.w + y * rkQ.z - z * rkQ.y,
382  w * rkQ.y + y * rkQ.w + z * rkQ.x - x * rkQ.z,
383  w * rkQ.z + z * rkQ.w + x * rkQ.y - y * rkQ.x
384  );
385  }
386  Quaternion operator* (float fScalar) const
387  {
388  return Quaternion(fScalar*w, fScalar*x, fScalar*y, fScalar*z);
389  }
390  Quaternion operator- () const
391  {
392  return Quaternion(-w, -x, -y, -z);
393  }
394  inline bool operator== (const Quaternion& rhs) const
395  {
396  return (rhs.x == x) && (rhs.y == y) && (rhs.z == z) && (rhs.w == w);
397  }
398  inline bool operator!= (const Quaternion& rhs) const
399  {
400  return !operator==(rhs);
401  }
402  inline float* ptr()
403  {
404  return &w;
405  }
406  inline const float* ptr() const
407  {
408  return &w;
409  }
410  float Norm() const;
411  float normalise(void);
412  Quaternion Inverse() const;
413 };
414 
415 class Matrix4
416 {
417 protected:
418  union {
419  float m[4][4];
420  float _m[16];
421  };
422 public:
423  static const Matrix4 IDENTITY;
424 
425  inline Matrix4() {}
426 
427  inline Matrix4(
428  float m00, float m01, float m02, float m03,
429  float m10, float m11, float m12, float m13,
430  float m20, float m21, float m22, float m23,
431  float m30, float m31, float m32, float m33)
432  {
433  m[0][0] = m00;
434  m[0][1] = m01;
435  m[0][2] = m02;
436  m[0][3] = m03;
437  m[1][0] = m10;
438  m[1][1] = m11;
439  m[1][2] = m12;
440  m[1][3] = m13;
441  m[2][0] = m20;
442  m[2][1] = m21;
443  m[2][2] = m22;
444  m[2][3] = m23;
445  m[3][0] = m30;
446  m[3][1] = m31;
447  m[3][2] = m32;
448  m[3][3] = m33;
449  }
450 
451  inline Matrix4(const Matrix3& m3x3)
452  {
453  operator=(IDENTITY);
454  operator=(m3x3);
455  }
456 
457  inline void extract3x3Matrix(Matrix3& m3x3) const
458  {
459  m3x3.m[0][0] = m[0][0];
460  m3x3.m[0][1] = m[0][1];
461  m3x3.m[0][2] = m[0][2];
462  m3x3.m[1][0] = m[1][0];
463  m3x3.m[1][1] = m[1][1];
464  m3x3.m[1][2] = m[1][2];
465  m3x3.m[2][0] = m[2][0];
466  m3x3.m[2][1] = m[2][1];
467  m3x3.m[2][2] = m[2][2];
468  }
469 
470  inline Quaternion extractQuaternion() const
471  {
472  Matrix3 m3x3;
473  extract3x3Matrix(m3x3);
474  return Quaternion(m3x3);
475  }
476 
477  inline Vector3 getTrans() const
478  {
479  return Vector3(m[0][3], m[1][3], m[2][3]);
480  }
481  inline void operator = (const Matrix3& mat3)
482  {
483  m[0][0] = mat3.m[0][0]; m[0][1] = mat3.m[0][1]; m[0][2] = mat3.m[0][2];
484  m[1][0] = mat3.m[1][0]; m[1][1] = mat3.m[1][1]; m[1][2] = mat3.m[1][2];
485  m[2][0] = mat3.m[2][0]; m[2][1] = mat3.m[2][1]; m[2][2] = mat3.m[2][2];
486  }
487  inline float* operator [] (size_t iRow)
488  {
489  return m[iRow];
490  }
491 
492  inline const float *operator [] (size_t iRow) const
493  {
494  return m[iRow];
495  }
496 };
497 
498 #endif //__VRMATHS_H__
float * ptr()
Pointer accessor for direct copying.
Definition: vrmaths.h:56
const float * ptr() const
Pointer accessor for direct copying.
Definition: vrmaths.h:61