@ -26,6 +26,10 @@ 
			
		
	
		
			
				
					/// @author Christophe Riccio  
			
		
	
		
			
				
					///////////////////////////////////////////////////////////////////////////////////  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					#include "type_vec2.hpp"  
			
		
	
		
			
				
					#include "type_vec3.hpp"  
			
		
	
		
			
				
					#include "type_vec4.hpp"  
			
		
	
		
			
				
					#include "_vectorize.hpp"  
			
		
	
		
			
				
					#include <limits>  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					namespace glm{  
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -708,113 +712,21 @@ namespace detail 
			
		
	
		
			
				
							genType const & x  
			
		
	
		
			
				
						)  
			
		
	
		
			
				
						{  
			
		
	
		
			
				
							GLM_STATIC_ASSERT(  
			
		
	
		
			
				
								std::numeric_limits<genType>::is_iec559,  
			
		
	
		
			
				
								"'step' only accept floating-point inputs");  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							return x < edge ? static_cast<genType>(0) : static_cast<genType>(1);  
			
		
	
		
			
				
						}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						template <typename T, precision P>  
			
		
	
		
			
				
						GLM_FUNC_QUALIFIER detail::tvec2<T, P> step  
			
		
	
		
			
				
						(  
			
		
	
		
			
				
							T const & edge,  
			
		
	
		
			
				
							detail::tvec2<T, P> const & x  
			
		
	
		
			
				
						)  
			
		
	
		
			
				
						{  
			
		
	
		
			
				
							GLM_STATIC_ASSERT(  
			
		
	
		
			
				
								std::numeric_limits<T>::is_iec559,  
			
		
	
		
			
				
								"'step' only accept floating-point inputs");  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							return detail::tvec2<T, P>(  
			
		
	
		
			
				
								x.x < edge ? T(0) : T(1),  
			
		
	
		
			
				
								x.y < edge ? T(0) : T(1));  
			
		
	
		
			
				
						}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						template <typename T, precision P>  
			
		
	
		
			
				
						GLM_FUNC_QUALIFIER detail::tvec3<T, P> step  
			
		
	
		
			
				
						(  
			
		
	
		
			
				
							T const & edge,  
			
		
	
		
			
				
							detail::tvec3<T, P> const & x  
			
		
	
		
			
				
						)  
			
		
	
		
			
				
						{  
			
		
	
		
			
				
							GLM_STATIC_ASSERT(  
			
		
	
		
			
				
								std::numeric_limits<T>::is_iec559,  
			
		
	
		
			
				
								"'step' only accept floating-point inputs");  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							return detail::tvec3<T, P>(  
			
		
	
		
			
				
								x.x < edge ? T(0) : T(1),  
			
		
	
		
			
				
								x.y < edge ? T(0) : T(1),  
			
		
	
		
			
				
								x.z < edge ? T(0) : T(1));  
			
		
	
		
			
				
							return mix(genType(1), genType(0), glm::lessThan(x, edge));  
			
		
	
		
			
				
						}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						template <typename T, precision P>  
			
		
	
		
			
				
						GLM_FUNC_QUALIFIER detail::tvec4 <T, P> step  
			
		
	
		
			
				
						template <template <typename, precision> class vecType, typename T, precision P>  
			
		
	
		
			
				
						GLM_FUNC_QUALIFIER vecType<T, P> step  
			
		
	
		
			
				
						(  
			
		
	
		
			
				
							T const & edge,  
			
		
	
		
			
				
							detail::tvec4<T, P> const & x  
			
		
	
		
			
				
						)  
			
		
	
		
			
				
						{  
			
		
	
		
			
				
							GLM_STATIC_ASSERT(  
			
		
	
		
			
				
								std::numeric_limits<T>::is_iec559,  
			
		
	
		
			
				
								"'step' only accept floating-point inputs");  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							return detail::tvec4<T, P>(  
			
		
	
		
			
				
								x.x < edge ? T(0) : T(1),  
			
		
	
		
			
				
								x.y < edge ? T(0) : T(1),  
			
		
	
		
			
				
								x.z < edge ? T(0) : T(1),  
			
		
	
		
			
				
								x.w < edge ? T(0) : T(1));  
			
		
	
		
			
				
						}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						template <typename T, precision P>  
			
		
	
		
			
				
						GLM_FUNC_QUALIFIER detail::tvec2<T, P> step  
			
		
	
		
			
				
						(  
			
		
	
		
			
				
							detail::tvec2<T, P> const & edge,  
			
		
	
		
			
				
							detail::tvec2<T, P> const & x  
			
		
	
		
			
				
						)  
			
		
	
		
			
				
						{  
			
		
	
		
			
				
							GLM_STATIC_ASSERT(  
			
		
	
		
			
				
								std::numeric_limits<T>::is_iec559,  
			
		
	
		
			
				
								"'step' only accept floating-point inputs");  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							return detail::tvec2<T, P>(  
			
		
	
		
			
				
								x.x < edge.x ? T(0) : T(1),  
			
		
	
		
			
				
								x.y < edge.y ? T(0) : T(1));  
			
		
	
		
			
				
						}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						template <typename T, precision P>  
			
		
	
		
			
				
						GLM_FUNC_QUALIFIER detail::tvec3<T, P> step  
			
		
	
		
			
				
						(  
			
		
	
		
			
				
							detail::tvec3<T, P> const & edge,  
			
		
	
		
			
				
							detail::tvec3<T, P> const & x  
			
		
	
		
			
				
							vecType<T, P> const & x  
			
		
	
		
			
				
						)  
			
		
	
		
			
				
						{  
			
		
	
		
			
				
							GLM_STATIC_ASSERT(  
			
		
	
		
			
				
								std::numeric_limits<T>::is_iec559,  
			
		
	
		
			
				
								"'step' only accept floating-point inputs");  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							return detail::tvec3<T, P>(  
			
		
	
		
			
				
								x.x < edge.x ? T(0) : T(1),  
			
		
	
		
			
				
								x.y < edge.y ? T(0) : T(1),  
			
		
	
		
			
				
								x.z < edge.z ? T(0) : T(1));  
			
		
	
		
			
				
						}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						template <typename T, precision P>  
			
		
	
		
			
				
						GLM_FUNC_QUALIFIER detail::tvec4<T, P> step  
			
		
	
		
			
				
						(  
			
		
	
		
			
				
							detail::tvec4<T, P> const & edge,  
			
		
	
		
			
				
							detail::tvec4<T, P> const & x  
			
		
	
		
			
				
						)  
			
		
	
		
			
				
						{  
			
		
	
		
			
				
							GLM_STATIC_ASSERT(  
			
		
	
		
			
				
								std::numeric_limits<T>::is_iec559,  
			
		
	
		
			
				
								"'step' only accept floating-point inputs");  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							return detail::tvec4<T, P>(  
			
		
	
		
			
				
								x.x < edge.x ? T(0) : T(1),  
			
		
	
		
			
				
								x.y < edge.y ? T(0) : T(1),  
			
		
	
		
			
				
								x.z < edge.z ? T(0) : T(1),  
			
		
	
		
			
				
								x.w < edge.w ? T(0) : T(1));  
			
		
	
		
			
				
							return mix(vecType<T, P>(1), vecType<T, P>(0), glm::lessThan(x, vecType<T, P>(edge)));  
			
		
	
		
			
				
						}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						// smoothstep  
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -1090,28 +1002,10 @@ namespace detail 
			
		
	
		
			
				
							return *reinterpret_cast<int*>(const_cast<float*>(&v));  
			
		
	
		
			
				
						}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						GLM_FUNC_QUALIFIER detail::tvec2<int, defaultp> floatBitsToInt  
			
		
	
		
			
				
						(  
			
		
	
		
			
				
							detail::tvec2<float, defaultp> const & v  
			
		
	
		
			
				
						)  
			
		
	
		
			
				
						{  
			
		
	
		
			
				
							return *reinterpret_cast<detail::tvec2<int, defaultp>*>(const_cast<detail::tvec2<float, defaultp>*>(&v));  
			
		
	
		
			
				
						}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						GLM_FUNC_QUALIFIER detail::tvec3<int, defaultp> floatBitsToInt  
			
		
	
		
			
				
						(  
			
		
	
		
			
				
							detail::tvec3<float, defaultp> const & v  
			
		
	
		
			
				
						)  
			
		
	
		
			
				
						{  
			
		
	
		
			
				
							return *reinterpret_cast<detail::tvec3<int, defaultp>*>(const_cast<detail::tvec3<float, defaultp>*>(&v));  
			
		
	
		
			
				
						}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						GLM_FUNC_QUALIFIER detail::tvec4<int, defaultp> floatBitsToInt  
			
		
	
		
			
				
						(  
			
		
	
		
			
				
							detail::tvec4<float, defaultp> const & v  
			
		
	
		
			
				
						)  
			
		
	
		
			
				
						template <template <typename, precision> class vecType, precision P>  
			
		
	
		
			
				
						GLM_FUNC_QUALIFIER vecType<int, P> floatBitsToInt(vecType<float, P> const & v)  
			
		
	
		
			
				
						{  
			
		
	
		
			
				
							return *reinterpret_cast<detail::tvec4<int, defaultp>*>(const_cast<detail::tvec4<float, defaultp >*>(&v));  
			
		
	
		
			
				
							return *reinterpret_cast<vecType<int, P>*>(const_cast<vecType<float, P>*>(&v));  
			
		
	
		
			
				
						}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						GLM_FUNC_QUALIFIER uint floatBitsToUint(float const & v)  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -1119,28 +1013,10 @@ namespace detail 
			
		
	
		
			
				
							return *reinterpret_cast<uint*>(const_cast<float*>(&v));  
			
		
	
		
			
				
						}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						GLM_FUNC_QUALIFIER detail::tvec2<uint, defaultp> floatBitsToUint  
			
		
	
		
			
				
						(  
			
		
	
		
			
				
							detail::tvec2<float, defaultp> const & v  
			
		
	
		
			
				
						)  
			
		
	
		
			
				
						template <template <typename, precision> class vecType, precision P>  
			
		
	
		
			
				
						GLM_FUNC_QUALIFIER vecType<uint, P> floatBitsToUint(vecType<float, P> const & v)  
			
		
	
		
			
				
						{  
			
		
	
		
			
				
							return *reinterpret_cast<detail::tvec2<uint, defaultp>*>(const_cast<detail::tvec2<float, defaultp>*>(&v));  
			
		
	
		
			
				
						}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						GLM_FUNC_QUALIFIER detail::tvec3<uint, defaultp> floatBitsToUint  
			
		
	
		
			
				
						(  
			
		
	
		
			
				
							detail::tvec3<float, defaultp> const & v  
			
		
	
		
			
				
						)  
			
		
	
		
			
				
						{  
			
		
	
		
			
				
							return *reinterpret_cast<detail::tvec3<uint, defaultp>*>(const_cast<detail::tvec3<float, defaultp>*>(&v));  
			
		
	
		
			
				
						}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						GLM_FUNC_QUALIFIER detail::tvec4<uint, defaultp> floatBitsToUint  
			
		
	
		
			
				
						(  
			
		
	
		
			
				
							detail::tvec4<float, defaultp> const & v  
			
		
	
		
			
				
						)  
			
		
	
		
			
				
						{  
			
		
	
		
			
				
							return *reinterpret_cast<detail::tvec4<uint, defaultp>*>(const_cast<detail::tvec4<float, defaultp>*>(&v));  
			
		
	
		
			
				
							return *reinterpret_cast<vecType<uint, P>*>(const_cast<vecType<float, P>*>(&v));  
			
		
	
		
			
				
						}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						GLM_FUNC_QUALIFIER float intBitsToFloat(int const & v)  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -1148,28 +1024,10 @@ namespace detail 
			
		
	
		
			
				
							return *reinterpret_cast<float*>(const_cast<int*>(&v));  
			
		
	
		
			
				
						}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						GLM_FUNC_QUALIFIER detail::tvec2<float, defaultp> intBitsToFloat  
			
		
	
		
			
				
						(  
			
		
	
		
			
				
							detail::tvec2<int, defaultp> const & v  
			
		
	
		
			
				
						)  
			
		
	
		
			
				
						{  
			
		
	
		
			
				
							return *reinterpret_cast<detail::tvec2<float, defaultp>*>(const_cast<detail::tvec2<int, defaultp>*>(&v));  
			
		
	
		
			
				
						}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						GLM_FUNC_QUALIFIER detail::tvec3<float, defaultp> intBitsToFloat  
			
		
	
		
			
				
						(  
			
		
	
		
			
				
							detail::tvec3<int, defaultp> const & v  
			
		
	
		
			
				
						)  
			
		
	
		
			
				
						{  
			
		
	
		
			
				
							return *reinterpret_cast<detail::tvec3<float, defaultp>*>(const_cast<detail::tvec3<int, defaultp>*>(&v));  
			
		
	
		
			
				
						}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						GLM_FUNC_QUALIFIER detail::tvec4<float, defaultp> intBitsToFloat  
			
		
	
		
			
				
						(  
			
		
	
		
			
				
							detail::tvec4<int, defaultp> const & v  
			
		
	
		
			
				
						)  
			
		
	
		
			
				
						template <template <typename, precision> class vecType, precision P>  
			
		
	
		
			
				
						GLM_FUNC_QUALIFIER vecType<float, P> intBitsToFloat(vecType<int, P> const & v)  
			
		
	
		
			
				
						{  
			
		
	
		
			
				
							return *reinterpret_cast<detail::tvec4<float, defaultp>*>(const_cast<detail::tvec4<int, defaultp >*>(&v));  
			
		
	
		
			
				
							return *reinterpret_cast<vecType<float, P>*>(const_cast<vecType<int, P>*>(&v));  
			
		
	
		
			
				
						}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						GLM_FUNC_QUALIFIER float uintBitsToFloat(uint const & v)  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -1177,30 +1035,12 @@ namespace detail 
			
		
	
		
			
				
							return *reinterpret_cast<float*>(const_cast<uint*>(&v));  
			
		
	
		
			
				
						}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						GLM_FUNC_QUALIFIER detail::tvec2<float, defaultp> uintBitsToFloat  
			
		
	
		
			
				
						(  
			
		
	
		
			
				
							detail::tvec2<uint, defaultp> const & v  
			
		
	
		
			
				
						)  
			
		
	
		
			
				
						{  
			
		
	
		
			
				
							return *reinterpret_cast<detail::tvec2<float, defaultp>*>(const_cast<detail::tvec2<uint, defaultp>*>(&v));  
			
		
	
		
			
				
						}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						GLM_FUNC_QUALIFIER detail::tvec3<float, defaultp> uintBitsToFloat  
			
		
	
		
			
				
						(  
			
		
	
		
			
				
							detail::tvec3<uint, defaultp> const & v  
			
		
	
		
			
				
						)  
			
		
	
		
			
				
						template <template <typename, precision> class vecType, precision P>  
			
		
	
		
			
				
						GLM_FUNC_QUALIFIER vecType<float, P> uintBitsToFloat(vecType<uint, P> const & v)  
			
		
	
		
			
				
						{  
			
		
	
		
			
				
							return *reinterpret_cast<detail::tvec3<float, defaultp>*>(const_cast<detail::tvec3<uint, defaultp >*>(&v));  
			
		
	
		
			
				
							return *reinterpret_cast<vecType<float, P>*>(const_cast<vecType<uint, P>*>(&v));  
			
		
	
		
			
				
						}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						GLM_FUNC_QUALIFIER detail::tvec4<float, defaultp> uintBitsToFloat  
			
		
	
		
			
				
						(  
			
		
	
		
			
				
							detail::tvec4<uint, defaultp> const & v  
			
		
	
		
			
				
						)  
			
		
	
		
			
				
						{  
			
		
	
		
			
				
							return *reinterpret_cast<detail::tvec4<float, defaultp>*>(const_cast<detail::tvec4<uint, defaultp>*>(&v));  
			
		
	
		
			
				
						}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						  
			
		
	
		
			
				
						template <typename genType>  
			
		
	
		
			
				
						GLM_FUNC_QUALIFIER genType fma  
			
		
	
		
			
				
						(