summaryrefslogtreecommitdiffstats
path: root/debian/fireflies/fireflies-2.08/libgfx/include/gfx/quat.h
diff options
context:
space:
mode:
Diffstat (limited to 'debian/fireflies/fireflies-2.08/libgfx/include/gfx/quat.h')
-rw-r--r--debian/fireflies/fireflies-2.08/libgfx/include/gfx/quat.h118
1 files changed, 118 insertions, 0 deletions
diff --git a/debian/fireflies/fireflies-2.08/libgfx/include/gfx/quat.h b/debian/fireflies/fireflies-2.08/libgfx/include/gfx/quat.h
new file mode 100644
index 00000000..172a8b30
--- /dev/null
+++ b/debian/fireflies/fireflies-2.08/libgfx/include/gfx/quat.h
@@ -0,0 +1,118 @@
+#ifndef GFXQUAT_INCLUDED // -*- C++ -*-
+#define GFXQUAT_INCLUDED
+#if !defined(__GNUC__)
+# pragma once
+#endif
+
+/************************************************************************
+
+ Quaternion class
+
+ $Id: quat.h 440 2005-02-23 05:14:13Z garland $
+
+ ************************************************************************/
+
+#include "mat4.h"
+
+namespace gfx
+{
+
+class Quat
+{
+private:
+ Vec3 v; // Vector component
+ double s; // Scalar component
+
+public:
+ Quat() { v=0.0; s=1.0; }
+ Quat(double x, double y, double z, double w) { v[0]=x;v[1]=y;v[2]=z; s=w; }
+ Quat(const Vec3& a, double b) { v=a; s=b; }
+ Quat(const Quat& q) { *this=q; }
+
+ // Access methods
+ const Vec3& vector() const { return v; }
+ Vec3& vector() { return v; }
+ double scalar() const { return s; }
+ double& scalar() { return s; }
+
+ // Assignment and in-place arithmetic methods
+ Quat& operator=(const Quat& q);
+ Quat& operator+=(const Quat& q);
+ Quat& operator-=(const Quat& q);
+ Quat& operator=(double d);
+ Quat& operator*=(double d);
+ Quat& operator/=(double d);
+
+ // Construction of standard quaternions
+ static Quat ident();
+};
+
+////////////////////////////////////////////////////////////////////////
+//
+// Implementation of Quat methods
+//
+
+inline Quat& Quat::operator=(const Quat& q) { v=q.v; s=q.s; return *this; }
+inline Quat& Quat::operator+=(const Quat& q) { v+=q.v; s+=q.s; return *this; }
+inline Quat& Quat::operator-=(const Quat& q) { v-=q.v; s-=q.s; return *this; }
+
+inline Quat& Quat::operator=(double d) { v=d; s=d; return *this; }
+inline Quat& Quat::operator*=(double d) { v*=d; s*=d; return *this; }
+inline Quat& Quat::operator/=(double d) { v/=d; s/=d; return *this; }
+
+inline Quat Quat::ident() { return Quat(0, 0, 0, 1); }
+
+////////////////////////////////////////////////////////////////////////
+//
+// Standard arithmetic operators on quaternions
+//
+
+inline Quat operator+(const Quat& q, const Quat& r)
+ { return Quat(q.vector()+r.vector(), q.scalar()+r.scalar()); }
+
+inline Quat operator*(const Quat& q, const Quat& r)
+{
+ return Quat(cross(q.vector(),r.vector()) +
+ r.scalar()*q.vector() +
+ q.scalar()*r.vector(),
+ q.scalar()*r.scalar() - q.vector()*r.vector());
+}
+
+inline Quat operator*(const Quat& q, double s)
+ { return Quat(q.vector()*s, q.scalar()*s); }
+inline Quat operator*(double s, const Quat& q)
+ { return Quat(q.vector()*s, q.scalar()*s); }
+
+inline Quat operator/(const Quat& q, double s)
+ { return Quat(q.vector()/s, q.scalar()/s); }
+
+inline std::ostream &operator<<(std::ostream &out, const Quat& q)
+ { return out << q.vector() << " " << q.scalar(); }
+
+inline std::istream &operator>>(std::istream &in, Quat& q)
+ { return in >> q.vector() >> q.scalar(); }
+
+
+////////////////////////////////////////////////////////////////////////
+//
+// Standard functions on quaternions
+//
+
+inline double norm(const Quat& q)
+ { return q.scalar()*q.scalar() + q.vector()*q.vector(); }
+
+inline Quat conjugate(const Quat& q) { return Quat(-q.vector(), q.scalar()); }
+inline Quat inverse(const Quat& q) { return conjugate(q)/norm(q); }
+inline Quat& unitize(Quat& q) { q /= sqrt(norm(q)); return q; }
+
+extern Quat exp(const Quat& q);
+extern Quat log(const Quat& q);
+extern Quat axis_to_quat(const Vec3& a, double phi);
+extern Mat4 quat_to_matrix(const Quat& q);
+extern Mat4 unit_quat_to_matrix(const Quat& q);
+extern Quat slerp(const Quat& from, const Quat& to, double t);
+
+} // namespace gfx
+
+// GFXQUAT_INCLUDED
+#endif