X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=gph-math;a=blobdiff_plain;f=src%2Fquat.h;fp=src%2Fquat.h;h=d77f70f7cb96b0403b90bdd538d727aa9e90e1ee;hp=4b71c7c894532ddecd8c8ad4b842e56a0e4c3dad;hb=049b9453cf079d9aa0710b3a885e96d0920e5547;hpb=016badf08fbd4db92e6ee6e2ad74e7e61c5505e3 diff --git a/src/quat.h b/src/quat.h index 4b71c7c..d77f70f 100644 --- a/src/quat.h +++ b/src/quat.h @@ -1,19 +1,48 @@ #ifndef QUATERNION_H_ #define QUATERNION_H_ +#include "vector.h" + namespace gph { class Quaternion { public: float x, y, z, w; // w + xi + yj + zk + static Quaternion identity; + Quaternion() : x(0), y(0), z(0), w(1) {} Quaternion(float x_, float y_, float z_, float w_) : x(x_), y(y_), z(z_), w(w_) {} Quaternion(const Vector3 &v, float s) : x(v.x), y(v.y), z(v.z), w(s) {} - // TODO more + void normalize(); + void invert(); + + Matrix4x4 calc_matrix() const; }; +inline Quaternion operator -(const Quaternion &q); +inline Quaternion operator +(const Quaternion &a, const Quaternion &b); +inline Quaternion operator -(const Quaternion &a, const Quaternion &b); +inline Quaternion operator *(const Quaternion &a, const Quaternion &b); + +inline Quaternion &operator +=(Quaternion &a, const Quaternion &b); +inline Quaternion &operator -=(Quaternion &a, const Quaternion &b); +inline Quaternion &operator *=(Quaternion &a, const Quaternion &b); + +inline Quaternion conjugate(const Quaternion &q); + +inline float length(const Quaternion &q); +inline float length_sq(const Quaternion &q); + +inline Quaternion normalize(const Quaternion &q); +inline Quaternion inverse(const Quaternion &q); + +Quaternion slerp(const Quaternion &a, const Quaternion &b, float t); +inline Quaternion lerp(const Quaternion &a, const Quaternion &b, float t); + +#include "quat.inl" + } // namespace gph #endif // QUATERNION_H_