From 049b9453cf079d9aa0710b3a885e96d0920e5547 Mon Sep 17 00:00:00 2001 From: John Tsiombikas Date: Wed, 30 Dec 2015 01:17:34 +0200 Subject: [PATCH] adding quats --- src/quat.cc | 9 +++++++++ src/quat.h | 31 ++++++++++++++++++++++++++++++- src/quat.inl | 18 ++++++++++++++++++ 3 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 src/quat.cc create mode 100644 src/quat.inl diff --git a/src/quat.cc b/src/quat.cc new file mode 100644 index 0000000..292ab24 --- /dev/null +++ b/src/quat.cc @@ -0,0 +1,9 @@ +#include "quat.h" + +namespace gph { + +Quaternion Quaternion::identity; + + + +} // namespace gph 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_ diff --git a/src/quat.inl b/src/quat.inl new file mode 100644 index 0000000..5552165 --- /dev/null +++ b/src/quat.inl @@ -0,0 +1,18 @@ +inline Quaternion operator -(const Quaternion &q) +{ + return Quaternion(-q.x, -q.y, -q.z, -q.w); +} + +inline Quaternion operator +(const Quaternion &a, const Quaternion &b) +{ + return Quaternion(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w); +} + +inline Quaternion operator -(const Quaternion &a, const Quaternion &b) +{ + return Quaternion(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w); +} + +inline Quaternion operator *(const Quaternion &a, const Quaternion &b) +{ + float x = a.w * b.w - (a.x * b.x + a.y * b.y + a.z * b.z); -- 1.7.10.4