#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); } struct Quaternion : Quat { public: Quaternion(); Quaternion(float _x, float _y, float _z, float _w); Quaternion(Vector3 _xyz, float _w); Quaternion(Quat q); ~Quaternion(); const static Quaternion identity; float GetLength() const; float GetLengthSquared() const; static float GetLengthSquared(const Quaternion& q); void Normalize(); static Quaternion Normalize(const Quaternion& q); static void Normalize(const Quaternion& q, Quaternion& result); static float Dot(Quaternion a, Quaternion b); 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); public: Vector3 xyz() const; }; //#include "Vector3.h" #endif