// Copyright (C) 2024 Rémi Bèges - Jérôme "SirLynix" Leclercq (lynix680@gmail.com) // This file is part of the "Nazara Engine - Math module" // For conditions of distribution and use, see copyright notice in Config.hpp #pragma once #ifndef NAZARA_MATH_QUATERNION_HPP #define NAZARA_MATH_QUATERNION_HPP #include #include #include #include namespace Nz { struct SerializationContext; template class Quaternion { public: constexpr Quaternion() = default; constexpr Quaternion(T W, T X, T Y, T Z); template Quaternion(const Angle& angle); Quaternion(const EulerAngles& angles); constexpr Quaternion(RadianAngle angle, const Vector3& axis); constexpr Quaternion(const T quat[4]); template constexpr explicit Quaternion(const Quaternion& quat); constexpr Quaternion(const Quaternion&) = default; constexpr Quaternion(Quaternion&&) = default; ~Quaternion() = default; RadianAngle AngleBetween(const Quaternion& vec) const; constexpr bool ApproxEqual(const Quaternion& quat, T maxDifference = std::numeric_limits::epsilon()) const; Quaternion& ComputeW(); constexpr Quaternion& Conjugate(); constexpr T DotProduct(const Quaternion& vec) const; constexpr Quaternion GetConjugate() const; Quaternion GetInverse() const; Quaternion GetNormal(T* length = nullptr) const; Quaternion& Inverse(); T Magnitude() const; Quaternion& Normalize(T* length = nullptr); constexpr T SquaredMagnitude() const; RadianAngle To2DAngle() const; EulerAngles ToEulerAngles() const; std::string ToString() const; constexpr Quaternion& operator=(const Quaternion& quat) = default; constexpr Quaternion& operator=(Quaternion&&) = default; constexpr Quaternion operator+(const Quaternion& quat) const; constexpr Quaternion operator*(const Quaternion& quat) const; constexpr Vector3 operator*(const Vector3& vec) const; constexpr Quaternion operator*(T scale) const; constexpr Quaternion operator/(const Quaternion& quat) const; constexpr Quaternion& operator+=(const Quaternion& quat); constexpr Quaternion& operator*=(const Quaternion& quat); constexpr Quaternion& operator*=(T scale); constexpr Quaternion& operator/=(const Quaternion& quat); constexpr bool operator==(const Quaternion& quat) const; constexpr bool operator!=(const Quaternion& quat) const; constexpr bool operator<(const Quaternion& quat) const; constexpr bool operator<=(const Quaternion& quat) const; constexpr bool operator>(const Quaternion& quat) const; constexpr bool operator>=(const Quaternion& quat) const; static RadianAngle AngleBetween(const Quaternion& lhs, const Quaternion& rhs); static constexpr bool ApproxEqual(const Quaternion& lhs, const Quaternion& rhs, T maxDifference = std::numeric_limits::epsilon()); static constexpr Quaternion Identity(); static constexpr Quaternion Lerp(const Quaternion& from, const Quaternion& to, T interpolation); static Quaternion LookAt(const Vector3& forward, const Vector3& up); static Quaternion Normalize(const Quaternion& quat, T* length = nullptr); static Quaternion RotationBetween(const Vector3& from, const Vector3& to); static Quaternion RotateTowards(const Quaternion& from, const Quaternion& to, RadianAngle maxRotation); static Quaternion Mirror(Quaternion quat, const Vector3& axis); static Quaternion Slerp(const Quaternion& from, const Quaternion& to, T interpolation); static constexpr Quaternion Zero(); T w, x, y, z; }; using Quaterniond = Quaternion; using Quaternionf = Quaternion; template bool Serialize(SerializationContext& context, const Quaternion& quat, TypeTag>); template bool Unserialize(SerializationContext& context, Quaternion* quat, TypeTag>); template std::ostream& operator<<(std::ostream& out, const Nz::Quaternion& quat); } #include #endif // NAZARA_MATH_QUATERNION_HPP