adding quats
[gph-math] / src / quat.h
1 #ifndef QUATERNION_H_
2 #define QUATERNION_H_
3
4 #include "vector.h"
5
6 namespace gph {
7
8 class Quaternion {
9 public:
10         float x, y, z, w;       // w + xi + yj + zk
11
12         static Quaternion identity;
13
14         Quaternion() : x(0), y(0), z(0), w(1) {}
15         Quaternion(float x_, float y_, float z_, float w_) : x(x_), y(y_), z(z_), w(w_) {}
16         Quaternion(const Vector3 &v, float s) : x(v.x), y(v.y), z(v.z), w(s) {}
17
18         void normalize();
19         void invert();
20
21         Matrix4x4 calc_matrix() const;
22 };
23
24 inline Quaternion operator -(const Quaternion &q);
25 inline Quaternion operator +(const Quaternion &a, const Quaternion &b);
26 inline Quaternion operator -(const Quaternion &a, const Quaternion &b);
27 inline Quaternion operator *(const Quaternion &a, const Quaternion &b);
28
29 inline Quaternion &operator +=(Quaternion &a, const Quaternion &b);
30 inline Quaternion &operator -=(Quaternion &a, const Quaternion &b);
31 inline Quaternion &operator *=(Quaternion &a, const Quaternion &b);
32
33 inline Quaternion conjugate(const Quaternion &q);
34
35 inline float length(const Quaternion &q);
36 inline float length_sq(const Quaternion &q);
37
38 inline Quaternion normalize(const Quaternion &q);
39 inline Quaternion inverse(const Quaternion &q);
40
41 Quaternion slerp(const Quaternion &a, const Quaternion &b, float t);
42 inline Quaternion lerp(const Quaternion &a, const Quaternion &b, float t);
43
44 #include "quat.inl"
45
46 }       // namespace gph
47
48 #endif  // QUATERNION_H_