#ifndef __SCOP_QUATERNIONS__ #define __SCOP_QUATERNIONS__ #include #include namespace Scop { template struct Quat { T w, x, y, z; constexpr Quat() = default; constexpr Quat(T W, T X, T Y, T Z); template Quat(const Angle& angle); Quat(const EulerAngles& angles); constexpr Quat(RadianAngle angle, const Vec3& axis); constexpr Quat(const T quat[4]); template constexpr explicit Quat(const Quat& quat); constexpr Quat(const Quat&) = default; constexpr Quat(Quat&&) = default; ~Quat() = default; RadianAngle AngleBetween(const Quat& vec) const; constexpr bool ApproxEqual(const Quat& quat, T maxDifference = std::numeric_limits::epsilon()) const; Quat& ComputeW(); constexpr Quat& Conjugate(); constexpr T DotProduct(const Quat& vec) const; constexpr Quat GetConjugate() const; Quat GetInverse() const; Quat GetNormal(T* length = nullptr) const; Quat& Inverse(); T Magnitude() const; Quat& Normalize(T* length = nullptr); constexpr T SquaredMagnitude() const; RadianAngle To2DAngle() const; EulerAngles ToEulerAngles() const; std::string ToString() const; constexpr Quat& operator=(const Quat& quat) = default; constexpr Quat& operator=(Quat&&) = default; constexpr Quat operator+(const Quat& quat) const; constexpr Quat operator*(const Quat& quat) const; constexpr Vec3 operator*(const Vec3& vec) const; constexpr Quat operator*(T scale) const; constexpr Quat operator/(const Quat& quat) const; constexpr Quat& operator+=(const Quat& quat); constexpr Quat& operator*=(const Quat& quat); constexpr Quat& operator*=(T scale); constexpr Quat& operator/=(const Quat& quat); constexpr bool operator==(const Quat& quat) const; constexpr bool operator!=(const Quat& quat) const; constexpr bool operator<(const Quat& quat) const; constexpr bool operator<=(const Quat& quat) const; constexpr bool operator>(const Quat& quat) const; constexpr bool operator>=(const Quat& quat) const; static RadianAngle AngleBetween(const Quat& lhs, const Quat& rhs); static constexpr bool ApproxEqual(const Quat& lhs, const Quat& rhs, T maxDifference = std::numeric_limits::epsilon()); static constexpr Quat Identity(); static constexpr Quat Lerp(const Quat& from, const Quat& to, T interpolation); static Quat LookAt(const Vec3& forward, const Vec3& up); static Quat Normalize(const Quat& quat, T* length = nullptr); static Quat RotationBetween(const Vec3& from, const Vec3& to); static Quat RotateTowards(const Quat& from, const Quat& to, RadianAngle maxRotation); static Quat Mirror(Quat quat, const Vec3& axis); static Quat Slerp(const Quat& from, const Quat& to, T interpolation); static constexpr Quat Zero(); }; using Quatd = Quat; using Quatf = Quat; template std::ostream& operator<<(std::ostream& out, const Quat& quat); } #include #endif