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

#ifndef glm_gtx_color_space
#define glm_gtx_color_space

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

namespace glm
{
	namespace test{
		void main_ext_gtx_color_space();
	}//namespace test

    template <typename T> detail::tvec3<T> rgbColorGTX(const detail::tvec3<T>& hsvValue);
    template <typename T> detail::tvec3<T> hsvColorGTX(const detail::tvec3<T>& rgbValue);
	template <typename T> detail::tmat4x4<T> saturationGTX(const T s);
	template <typename T> detail::tvec3<T> saturationGTX(const T s, const detail::tvec3<T>& color);
	template <typename T> detail::tvec4<T> saturationGTX(const T s, const detail::tvec4<T>& color);
	template <typename T> T luminosityGTX(const detail::tvec3<T>& cColor);

    namespace gtx{
	//! GLM_GTX_color_space extension: Related to RGB to HSV conversions and operations
    namespace color_space
    {
        template <typename T> inline detail::tvec3<T> rgbColor(const detail::tvec3<T>& hsvValue){return rgbColorGTX(hsvValue);}				//!< \brief Converts a color from HSV color space to its color in RGB color space (from GLM_GTX_color_space extension)
        template <typename T> inline detail::tvec3<T> hsvColor(const detail::tvec3<T>& rgbValue){return hsvColorGTX(rgbValue);}				//!< \brief Converts a color from RGB color space to its color in HSV color space (from GLM_GTX_color_space extension)
        template <typename T> inline detail::tmat4x4<T> saturation(const T s){return saturationGTX(s);}											//!< \brief Build a saturation matrix (from GLM_GTX_color_space extension)
        template <typename T> inline detail::tvec3<T> saturation(const T s, const detail::tvec3<T>& color){return saturationGTX(s, color);}	//!< \brief Modify the saturation of a color (from GLM_GTX_color_space extension)
        template <typename T> inline detail::tvec4<T> saturation(const T s, const detail::tvec4<T>& color){return saturationGTX(s, color);}	//!< \brief Modify the saturation of a color (from GLM_GTX_color_space extension)
		template <typename T> inline T luminosity(const detail::tvec3<T>& color){return luminosityGTX(color);}									//!< \brief Compute color luminosity associating ratios (0.33, 0.59, 0.11) to RGB canals (from GLM_GTX_color_space extension)
	}//namespace color_space
	}//namespace gtx
}//namespace glm

#define GLM_GTX_color_space namespace gtx::color_space

#include "color_space.inl"

#endif//glm_gtx_color_space
