//	Darkstar Engine  (c) UnderWorld Interactive Studio (all coding by Svarog    2007)
//
//      Данный файл является частью Darkstar Engine. Любое использование кода файла
//      без согласия компании, является нарушением закона об авторском праве (в слу-
//      чае если не оговорено обратное).
//
//      Имя файла: quat.hpp
//      Краткое описание: работа с кватернионами
//

#ifndef DSE_MATH_QUAT_HPP
#define DSE_MATH_QUAT_HPP

#include <Darkstar/common.hpp>

#include <Darkstar/Math/common_math.hpp>
#include <Darkstar/Math/vect.hpp>

namespace math
{
	class Quat
	{
	public:
		float a;
		Vect3 v;

		Quat();
		Quat(const Quat& q);
		Quat(const float a, const float b, const float c, const float d);
		Quat(const float* abcd);
		Quat(const float a, const Vect3& v);
		Quat(const Vect4& v4);
		explicit Quat(const Matr3& m);
		explicit Quat(const Matr4& m);
		explicit Quat(const Matr34& m);
		~Quat();

		Quat& operator=(const Quat& q);

		Quat operator+(const Quat& q) const;
		const Quat& operator+=(const Quat& q);
		Quat operator-(const Quat& q) const;
		const Quat& operator-=(const Quat& q);
		Quat operator*(const Quat& q) const;
		const Quat& operator*=(const Quat& q);

		Quat operator-() const;

		bool operator==(const Quat& q) const;
		bool operator!=(const Quat& q) const;

		float norm() const;
		float sqNorm() const;
		const Quat& invert();
		Quat getInvert() const;
		const Quat& fastInvert();
		Quat getFastInvert() const;
		const Quat& normalize();
		Quat getNormalize() const;
		const Quat& conj();
		Quat getConj() const;

		Matr3 getAsMatrix3() const;
		Matr4 getAsMatrix4() const;
		Matr34 getAsMatrix34() const;

		const Quat& setRotation(const float angle, const Vect3& axe);
		const Quat& setRotation(const Matr4& m);
		const Quat& setRotation(const Matr3& m);
		const Quat& setRotation(const Matr34& m);

		Vect3 rotate(const Vect3& v) const;
		Vect4 rotate(const Vect4& v) const;
	};

	Quat slerp(const Quat& q1, const Quat& q2, const float t);

	std::ostream& operator<<(std::ostream& os, const Quat& q1);
};

#include <Darkstar/Math/quat.inl>

#endif