///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2008 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2006-11-02
// Updated : 2006-12-15
// Licence : This source is under MIT License
// File    : glm/gtx/rotate_vector.h
///////////////////////////////////////////////////////////////////////////////////////////////////
// Dependency:
// - GLM core
///////////////////////////////////////////////////////////////////////////////////////////////////

#ifndef __glm_gtx_rotate_vector__
#define __glm_gtx_rotate_vector__

// Dependency:
#include "../../glm.h"
#include "../gtx/transform.h"

namespace glm
{
    template <typename T> detail::tvec2<T> rotateGTX(const detail::tvec2<T>& v, T angle);
    template <typename T> detail::tvec3<T> rotateGTX(const detail::tvec3<T>& v, T angle, const detail::tvec3<T>& normal);
    template <typename T> detail::tvec4<T> rotateGTX(const detail::tvec4<T>& v, T angle, const detail::tvec3<T>& normal);
    template <typename T> detail::tvec3<T> rotateXGTX(const detail::tvec3<T>& v, T angle);
    template <typename T> detail::tvec3<T> rotateYGTX(const detail::tvec3<T>& v, T angle);
    template <typename T> detail::tvec3<T> rotateZGTX(const detail::tvec3<T>& v, T angle);
    template <typename T> detail::tvec4<T> rotateXGTX(const detail::tvec4<T>& v, T angle);
    template <typename T> detail::tvec4<T> rotateYGTX(const detail::tvec4<T>& v, T angle);
    template <typename T> detail::tvec4<T> rotateZGTX(const detail::tvec4<T>& v, T angle);
	template <typename T> detail::tmat4x4<T> orientationGTX(const detail::tvec3<T>& Normal, const detail::tvec3<T>& Up);

    namespace gtx
    {
		//! GLM_GTX_rotate_vector extension: Function to directly rotate a vector
        namespace rotate_vector
        {
            template <typename T> inline detail::tvec2<T> rotate(const detail::tvec2<T>& v, T angle){return rotateGTX(v, angle);}												//!< \brief Rotate a two dimentionnals vector (from GLM_GTX_rotate_vector extension)
            template <typename T> inline detail::tvec3<T> rotate(const detail::tvec3<T>& v, T angle, const detail::tvec3<T>& normal){return rotateGTX(v, angle, normal);}    //!< \brief Rotate a three dimentionnals vector around an axis (from GLM_GTX_rotate_vector extension)
            template <typename T> inline detail::tvec4<T> rotate(const detail::tvec4<T>& v, T angle, const detail::tvec3<T>& normal){return rotateGTX(v, angle, normal);}    //!< \brief Rotate a four dimentionnals vector around an axis (from GLM_GTX_rotate_vector extension)
            template <typename T> inline detail::tvec3<T> rotateX(const detail::tvec3<T>& v, T angle){return rotateXGTX(v, angle);}											//!< \brief Rotate a three dimentionnals vector around the X axis (from GLM_GTX_rotate_vector extension)
            template <typename T> inline detail::tvec3<T> rotateY(const detail::tvec3<T>& v, T angle){return rotateYGTX(v, angle);}											//!< \brief Rotate a three dimentionnals vector around the Y axis (from GLM_GTX_rotate_vector extension)
            template <typename T> inline detail::tvec3<T> rotateZ(const detail::tvec3<T>& v, T angle){return rotateZGTX(v, angle);}											//!< \brief Rotate a three dimentionnals vector around the Z axis (from GLM_GTX_rotate_vector extension)
            template <typename T> inline detail::tvec4<T> rotateX(const detail::tvec4<T>& v, T angle){return rotateXGTX(v, angle);}											//!< \brief Rotate a four dimentionnals vector around the X axis (from GLM_GTX_rotate_vector extension)
            template <typename T> inline detail::tvec4<T> rotateY(const detail::tvec4<T>& v, T angle){return rotateYGTX(v, angle);}											//!< \brief Rotate a four dimentionnals vector around the X axis (from GLM_GTX_rotate_vector extension)
            template <typename T> inline detail::tvec4<T> rotateZ(const detail::tvec4<T>& v, T angle){return rotateZGTX(v, angle);}											//!< \brief Rotate a four dimentionnals vector around the X axis (from GLM_GTX_rotate_vector extension)
	        template <typename T> inline detail::tmat4x4<T> orientation(const detail::tvec3<T>& Normal, const detail::tvec3<T>& Up){return orientationGTX(Normal, Up);}        //!< \brief Build a rotation matrix from a normal and a up vector (from GLM_GTX_rotate_vector extension)
        }
    }
}

#define GLM_GTX_rotate_vector namespace gtx::rotate_vector

#include "rotate_vector.inl"

#endif//__glm_gtx_rotate_vector__
