#ifndef QUATERNION_H #define QUATERNION_H #pragma once struct Vector3; extern "C" { typedef struct Quat { float x; float y; float z; float w; } Quat; void CopyQuat(const Quat& q1, Quat& q2); } /// /// A quaternion /// struct Quaternion : Quat { public: /// /// Create a new identity quaternion /// Quaternion(); /// /// create a new quaternion with the given values /// /// x axis value /// y axis value /// z axis value /// w axis value Quaternion(float _x, float _y, float _z, float _w); /// /// Create a quaternion from C-style Quat /// /// Quaternion(Quat q); ~Quaternion(); /// /// An identity quaternion /// const static Quaternion identity; void Normalize(); static Quaternion Normalize(const Quaternion& q); static void Normalize(const Quaternion& q, Quaternion& result); static Vector3 ToAngles(const Quaternion& q1); Vector3 operator *(const Vector3& p) const; Quaternion operator *(const Quaternion& r2) const; bool operator ==(const Quaternion& q); static Quaternion Inverse(Quaternion r); static Quaternion LookRotation(const Vector3& forward, const Vector3& upwards); static Quaternion LookRotation(const Vector3& forward); static Quaternion FromToRotation(Vector3 fromDirection, Vector3 toDirection); static Quaternion RotateTowards(const Quaternion& from, const Quaternion& to, float maxDegreesDelta); static Quaternion AngleAxis(float angle, const Vector3& axis); void ToAngleAxis(float* angle, Vector3* axis); static void ToAxisAngleRad(const Quaternion& q, Vector3* const axis, float* angle); static float Angle(Quaternion a, Quaternion b); static Quaternion Slerp(const Quaternion& a, const Quaternion& b, float t); static Quaternion SlerpUnclamped(const Quaternion& a, const Quaternion& b, float t); static Quaternion Euler(float x, float y, float z); static Quaternion Euler(Vector3 euler); static Quaternion FromEulerRad(Vector3 euler); static float GetAngleAround(Vector3 axis, Quaternion rotation); static Quaternion GetRotationAround(Vector3 axis, Quaternion rotation); static void GetSwingTwist(Vector3 axis, Quaternion rotation, Quaternion* swing, Quaternion* twist); protected: float GetLength() const; float GetLengthSquared() const; static float GetLengthSquared(const Quaternion& q); static float Dot(Quaternion a, Quaternion b); public: Vector3 xyz() const; }; //#include "Vector3.h" #endif