adding quats
authorJohn Tsiombikas <nuclear@mutantstargoat.com>
Tue, 29 Dec 2015 23:17:34 +0000 (01:17 +0200)
committerJohn Tsiombikas <nuclear@mutantstargoat.com>
Tue, 29 Dec 2015 23:17:34 +0000 (01:17 +0200)
src/quat.cc [new file with mode: 0644]
src/quat.h
src/quat.inl [new file with mode: 0644]

diff --git a/src/quat.cc b/src/quat.cc
new file mode 100644 (file)
index 0000000..292ab24
--- /dev/null
@@ -0,0 +1,9 @@
+#include "quat.h"
+
+namespace gph {
+
+Quaternion Quaternion::identity;
+
+
+
+}      // namespace gph
index 4b71c7c..d77f70f 100644 (file)
@@ -1,19 +1,48 @@
 #ifndef QUATERNION_H_
 #define QUATERNION_H_
 
 #ifndef QUATERNION_H_
 #define QUATERNION_H_
 
+#include "vector.h"
+
 namespace gph {
 
 class Quaternion {
 public:
        float x, y, z, w;       // w + xi + yj + zk
 
 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) {}
 
        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_
 }      // namespace gph
 
 #endif // QUATERNION_H_
diff --git a/src/quat.inl b/src/quat.inl
new file mode 100644 (file)
index 0000000..5552165
--- /dev/null
@@ -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);