// Copyright (C) 2014 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 template class NzEulerAngles; template class NzVector3; template class NzQuaternion { public: NzQuaternion() = default; NzQuaternion(T W, T X, T Y, T Z); NzQuaternion(const T quat[4]); NzQuaternion(T angle, const NzVector3& axis); NzQuaternion(const NzEulerAngles& angles); //NzQuaternion(const NzMatrix3& mat); template explicit NzQuaternion(const NzQuaternion& quat); NzQuaternion(const NzQuaternion& quat) = default; ~NzQuaternion() = default; NzQuaternion& ComputeW(); NzQuaternion& Conjugate(); T DotProduct(const NzQuaternion& vec) const; NzQuaternion GetConjugate() const; NzQuaternion GetInverse() const; NzQuaternion GetNormal(T* length = nullptr) const; NzQuaternion& Inverse(); NzQuaternion& MakeIdentity(); NzQuaternion& MakeRotationBetween(const NzVector3& from, const NzVector3& to); NzQuaternion& MakeZero(); T Magnitude() const; NzQuaternion& Normalize(T* length = nullptr); NzQuaternion& Set(T W, T X, T Y, T Z); NzQuaternion& Set(const T quat[4]); NzQuaternion& Set(T angle, const NzVector3& normalizedAxis); NzQuaternion& Set(const NzEulerAngles& angles); //NzQuaternion& Set(const NzMatrix3& mat); NzQuaternion& Set(const NzQuaternion& quat); template NzQuaternion& Set(const NzQuaternion& quat); T SquaredMagnitude() const; NzEulerAngles ToEulerAngles() const; //NzMatrix3 ToRotationMatrix() const; NzString ToString() const; NzQuaternion& operator=(const NzQuaternion& quat); NzQuaternion operator+(const NzQuaternion& quat) const; NzQuaternion operator*(const NzQuaternion& quat) const; NzVector3 operator*(const NzVector3& vec) const; NzQuaternion operator*(T scale) const; NzQuaternion operator/(const NzQuaternion& quat) const; NzQuaternion& operator+=(const NzQuaternion& quat); NzQuaternion& operator*=(const NzQuaternion& quat); NzQuaternion& operator*=(T scale); NzQuaternion& operator/=(const NzQuaternion& quat); bool operator==(const NzQuaternion& quat) const; bool operator!=(const NzQuaternion& quat) const; static NzQuaternion Identity(); static NzQuaternion Lerp(const NzQuaternion& from, const NzQuaternion& to, T interpolation); static NzQuaternion RotationBetween(const NzVector3& from, const NzVector3& to); static NzQuaternion Slerp(const NzQuaternion& from, const NzQuaternion& to, T interpolation); static NzQuaternion Zero(); T w, x, y, z; }; template std::ostream& operator<<(std::ostream& out, const NzQuaternion& quat); typedef NzQuaternion NzQuaterniond; typedef NzQuaternion NzQuaternionf; #include #endif // NAZARA_QUATERNION_HPP