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