/***************************************************************************
*                                                                          *
*  Copyright (C) Golaem S.A.  All Rights Reserved.                         *
*                                                                          *
****************************************************************************/

#pragma once

#include "glmMathBase.h"

namespace glm
{
	class Quaternion;
	class RotationMatrix;
	class Matrix4;
	class Vector3;
	class AxisAngle;
	class EulerAngles;
	typedef float Angle;

	GLM_CORE_API void fromQuaternion(Matrix4& result, const Quaternion& srcQuaternion);
	GLM_CORE_API Matrix4 MatrixFromQuaternion(const Quaternion& srcQuaternion);
	GLM_CORE_API void fromQuaternion(RotationMatrix& result, const Quaternion& srcQuaternion);
	GLM_CORE_API void toQuaternion(Quaternion& result, const Matrix4& matrix);
	GLM_CORE_API void toQuaternion(Quaternion& result, const RotationMatrix& rotationMatrix);
	GLM_CORE_API void toQuaternion(Quaternion& result, const AxisAngle & axisAngle);
	GLM_CORE_API void toQuaternionXYZ(Quaternion& result, const EulerAngles& eulerAngle);
	GLM_CORE_API void toQuaternionXZY(Quaternion& result, const EulerAngles& eulerAngle);
	GLM_CORE_API void toQuaternionYZX(Quaternion& result, const EulerAngles& eulerAngle);
	GLM_CORE_API void toQuaternionZXY(Quaternion& result, const EulerAngles& eulerAngle);
	GLM_CORE_API void toQuaternionZYX(Quaternion& result, const EulerAngles& eulerAngle);
	GLM_CORE_API void toQuaternion(Quaternion& result, Angle angle, Axis::Value axis);
	GLM_CORE_API void toQuaternion(Quaternion& result, const Vector3& ux, const Vector3& uy, const Vector3& uz);
	GLM_CORE_API Quaternion Axis_Xy_toQuaternion(const Vector3& vx, const Vector3& vy);
	GLM_CORE_API Quaternion Axis_Xz_toQuaternion(const Vector3& vx, const Vector3& vz);
	GLM_CORE_API Quaternion Axis_Yx_toQuaternion(const Vector3& vy, const Vector3& vx);
	GLM_CORE_API Quaternion Axis_Yz_toQuaternion(const Vector3& vy, const Vector3& vz);
	GLM_CORE_API Quaternion Axis_Zx_toQuaternion(const Vector3& vz, const Vector3& vx);
	GLM_CORE_API void Axis_Zx_toQuaternion(const Vector3& vz, const Vector3& vx, Quaternion& result);
	GLM_CORE_API Quaternion Axis_Zy_toQuaternion(const Vector3& vz, const Vector3& vy);
	GLM_CORE_API void Axis_Zy_toQuaternion(const Vector3& vz, const Vector3& vy, Quaternion& result);
}
