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

#ifndef __glm_gtx_fast_trigonometry__
#define __glm_gtx_fast_trigonometry__

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

namespace glm
{
    template <typename T> T fastSinGTX(const T angle);
    template <typename T> detail::tvec2<T> fastSinGTX(const detail::tvec2<T>& angle);
    template <typename T> detail::tvec3<T> fastSinGTX(const detail::tvec3<T>& angle);
    template <typename T> detail::tvec4<T> fastSinGTX(const detail::tvec4<T>& angle);

    template <typename T> T fastCosGTX(const T angle);
    template <typename T> detail::tvec2<T> fastCosGTX(const detail::tvec2<T>& angle);
    template <typename T> detail::tvec3<T> fastCosGTX(const detail::tvec3<T>& angle);
    template <typename T> detail::tvec4<T> fastCosGTX(const detail::tvec4<T>& angle);

    template <typename T> T fastTanGTX(const T angle);
    template <typename T> detail::tvec2<T> fastTanGTX(const detail::tvec2<T>& angle);
    template <typename T> detail::tvec3<T> fastTanGTX(const detail::tvec3<T>& angle);
    template <typename T> detail::tvec4<T> fastTanGTX(const detail::tvec4<T>& angle);

    template <typename T> T fastAsinGTX(const T x);
    template <typename T> detail::tvec2<T> fastAsinGTX(const detail::tvec2<T>& x);
    template <typename T> detail::tvec3<T> fastAsinGTX(const detail::tvec3<T>& x);
    template <typename T> detail::tvec4<T> fastAsinGTX(const detail::tvec4<T>& x);

    template <typename T> T fastAcosGTX(const T x);
    template <typename T> detail::tvec2<T> fastAcosGTX(const detail::tvec2<T>& x);
    template <typename T> detail::tvec3<T> fastAcosGTX(const detail::tvec3<T>& x);
    template <typename T> detail::tvec4<T> fastAcosGTX(const detail::tvec4<T>& x);

    template <typename T> T fastAtanGTX(const T y, const T x);
    template <typename T> detail::tvec2<T> fastAtanGTX(const detail::tvec2<T>& y, const detail::tvec2<T>& x);
    template <typename T> detail::tvec3<T> fastAtanGTX(const detail::tvec3<T>& y, const detail::tvec3<T>& x);
	template <typename T> detail::tvec4<T> fastAtanGTX(const detail::tvec4<T>& y, const detail::tvec4<T>& x);

    template <typename T> T fastAtanGTX(const T y_over_x);
    template <typename T> detail::tvec2<T> fastAtanGTX(const detail::tvec2<T>& y_over_x);
    template <typename T> detail::tvec3<T> fastAtanGTX(const detail::tvec3<T>& y_over_x);
    template <typename T> detail::tvec4<T> fastAtanGTX(const detail::tvec4<T>& y_over_x);

    namespace gtx
    {
		//! GLM_GTX_fast_trigonometry extension: Fast but less accurate implementations of trigonometric functions.
        namespace fast_trigonometry
        {
            template <typename T> inline T fastSin(const T& angle){return fastSinGTX(angle);}			//!< \brief Faster than the common sin function but less accurate. Defined between -2pi and 2pi. (From GLM_GTX_fast_trigonometry extension)
            template <typename T> inline T fastCos(const T& angle){return fastCosGTX(angle);}			//!< \brief Faster than the common cos function but less accurate. Defined between -2pi and 2pi. (From GLM_GTX_fast_trigonometry extension)
            template <typename T> inline T fastTan(const T& angle){return fastTanGTX(angle);}			//!< \brief Faster than the common tan function but less accurate. Defined between -2pi and 2pi. (From GLM_GTX_fast_trigonometry extension)
            template <typename T> inline T fastAsin(const T& angle){return fastAsinGTX(angle);}			//!< \brief Faster than the common asin function but less accurate. Defined between -2pi and 2pi. (From GLM_GTX_fast_trigonometry extension)
            template <typename T> inline T fastAcos(const T& angle){return fastAcosGTX(angle);}			//!< \brief Faster than the common acos function but less accurate. Defined between -2pi and 2pi. (From GLM_GTX_fast_trigonometry extension)
            template <typename T> inline T fastAtan(const T& y, const T& x){return fastAtanGTX(y, x);}	//!< \brief Faster than the common atan function but less accurate. Defined between -2pi and 2pi. (From GLM_GTX_fast_trigonometry extension)
            template <typename T> inline T fastAtan(const T& angle){return fastAtanGTX(angle);}			//!< \brief Faster than the common atan function but less accurate. Defined between -2pi and 2pi. (From GLM_GTX_fast_trigonometry extension)
        }
    }
}

#define GLM_GTX_fast_trigonometry namespace gtx::fast_trigonometry

#include "fast_trigonometry.inl"

#endif//__glm_gtx_fast_trigonometry__
