// Copyright (C) 2012 Rémi Bèges // Jérôme Leclercq // This file is part of the "Nazara Engine". // 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(); NzQuaternion(T W, T X, T Y, T Z); NzQuaternion(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; T DotProduct(const NzQuaternion& vec) const; NzQuaternion GetConjugate() const; NzQuaternion GetNormalized() const; T Magnitude() const; T Normalize(); T SquaredMagnitude() const; void Set(T W, T X, T Y, T Z); void Set(T quat[4]); void Set(T angle, const NzVector3& normalizedAxis); void Set(const NzEulerAngles& angles); //void Set(const NzMatrix3& mat); void Set(const NzQuaternion& quat); template void Set(const NzQuaternion& quat); void SetIdentity(); void SetZero(); NzEulerAngles ToEulerAngles() const; //NzMatrix3 ToRotationMatrix() const; NzString ToString() const; 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; bool operator<(const NzQuaternion& quat) const; bool operator<=(const NzQuaternion& quat) const; bool operator>(const NzQuaternion& quat) const; bool operator>=(const NzQuaternion& quat) const; static NzQuaternion Slerp(const NzQuaternion& quatA, const NzQuaternion& quatB, T interp); 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