// Copyright (C) 2017 Rémi Bèges - Jérôme Leclercq // This file is part of the "Nazara Engine - Mathematics module" // For conditions of distribution and use, see copyright notice in Config.hpp #pragma once #ifndef NAZARA_QUATERNION_HPP #define NAZARA_QUATERNION_HPP #include #include namespace Nz { struct SerializationContext; template class EulerAngles; template class Vector3; template class Quaternion { public: Quaternion() = default; Quaternion(T W, T X, T Y, T Z); template Quaternion(const Angle& angle); Quaternion(const EulerAngles& angles); Quaternion(T angle, const Vector3& axis); Quaternion(const T quat[4]); //Quaternion(const Matrix3& mat); template explicit Quaternion(const Quaternion& quat); Quaternion(const Quaternion& quat) = default; ~Quaternion() = default; Quaternion& ComputeW(); Quaternion& Conjugate(); T DotProduct(const Quaternion& vec) const; Quaternion GetConjugate() const; Quaternion GetInverse() const; Quaternion GetNormal(T* length = nullptr) const; Quaternion& Inverse(); Quaternion& MakeIdentity(); Quaternion& MakeRotationBetween(const Vector3& from, const Vector3& to); Quaternion& MakeZero(); T Magnitude() const; Quaternion& Normalize(T* length = nullptr); Quaternion& Set(T W, T X, T Y, T Z); template Quaternion& Set(const Angle& angle); Quaternion& Set(const EulerAngles& angles); Quaternion& Set(T angle, const Vector3& normalizedAxis); Quaternion& Set(const T quat[4]); //Quaternion& Set(const Matrix3& mat); template Quaternion& Set(const Quaternion& quat); T SquaredMagnitude() const; EulerAngles ToEulerAngles() const; //Matrix3 ToRotationMatrix() const; String ToString() const; Quaternion& operator=(const Quaternion& quat) = default; Quaternion operator+(const Quaternion& quat) const; Quaternion operator*(const Quaternion& quat) const; Vector3 operator*(const Vector3& vec) const; Quaternion operator*(T scale) const; Quaternion operator/(const Quaternion& quat) const; Quaternion& operator+=(const Quaternion& quat); Quaternion& operator*=(const Quaternion& quat); Quaternion& operator*=(T scale); Quaternion& operator/=(const Quaternion& quat); bool operator==(const Quaternion& quat) const; bool operator!=(const Quaternion& quat) const; static Quaternion Identity(); static Quaternion Lerp(const Quaternion& from, const Quaternion& to, T interpolation); static Quaternion Normalize(const Quaternion& quat, T* length = nullptr); static Quaternion RotationBetween(const Vector3& from, const Vector3& to); static Quaternion Slerp(const Quaternion& from, const Quaternion& to, T interpolation); static 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_QUATERNION_HPP