Browse Source

Vectorized

Christophe Riccio 14 years ago
parent
commit
6f6d161afb
1 changed files with 129 additions and 224 deletions
  1. 129 224
      glm/gtx/fast_square_root.inl

+ 129 - 224
glm/gtx/fast_square_root.inl

@@ -2,232 +2,137 @@
 // OpenGL Mathematics Copyright (c) 2005 - 2011 G-Truc Creation (www.g-truc.net)
 // OpenGL Mathematics Copyright (c) 2005 - 2011 G-Truc Creation (www.g-truc.net)
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // Created : 2006-01-04
 // Created : 2006-01-04
-// Updated : 2008-10-07
+// Updated : 2011-10-14
 // Licence : This source is under MIT License
 // Licence : This source is under MIT License
 // File    : glm/gtx/fast_square_root.inl
 // File    : glm/gtx/fast_square_root.inl
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
 
-namespace glm{
-
-// fastSqrt
-template <typename genType>
-GLM_FUNC_QUALIFIER genType fastSqrt
-(
-	genType const & x
-)
-{
-    return genType(1) / fastInverseSqrt(x);
-}
-
-template <typename valType>
-GLM_FUNC_QUALIFIER detail::tvec2<valType> fastSqrt
-(
-	detail::tvec2<valType> const & x
-)
-{
-    return detail::tvec2<valType>(
-        fastSqrt(x.x), 
-        fastSqrt(x.y));
-}
-
-template <typename valType>
-GLM_FUNC_QUALIFIER detail::tvec3<valType> fastSqrt
-(
-	detail::tvec3<valType> const & x
-)
-{
-    return detail::tvec3<valType>(
-        fastSqrt(x.x), 
-        fastSqrt(x.y), 
-        fastSqrt(x.z));
-}
-
-template <typename valType>
-GLM_FUNC_QUALIFIER detail::tvec4<valType> fastSqrt
-(
-	detail::tvec4<valType> const & x
-)
-{
-    return detail::tvec4<valType>(
-        fastSqrt(x.x), 
-        fastSqrt(x.y), 
-        fastSqrt(x.z), 
-        fastSqrt(x.w));
-}
-
-// fastInversesqrt
-template <typename genType>
-GLM_FUNC_QUALIFIER genType fastInverseSqrt
-(
-	genType const & x
-)
-{
-	genType tmp = x;
-    float xhalf = 0.5f * float(tmp);
-    uint i = *(uint*)&x;
-    i = 0x5f375a86 - (i >> 1);
-    //x = *(float*)&i;
-	//x = *((float*)(char*)&i);
-	tmp = detail::uif(i).f;
-	tmp = tmp * (1.5f - xhalf * tmp * tmp);
-    return genType(tmp);
-}
-
-template <typename valType>
-GLM_FUNC_QUALIFIER detail::tvec2<valType> fastInverseSqrt
-(
-	detail::tvec2<valType> const & x
-)
-{
-    return detail::tvec2<valType>(
-        fastInverseSqrt(x.x), 
-        fastInverseSqrt(x.y));
-}
-
-template <typename valType>
-GLM_FUNC_QUALIFIER detail::tvec3<valType> fastInverseSqrt
-(
-	detail::tvec3<valType> const & x
-)
-{
-    return detail::tvec3<valType>(
-        fastInverseSqrt(x.x), 
-        fastInverseSqrt(x.y), 
-        fastInverseSqrt(x.z));
-}
-
-template <typename valType>
-GLM_FUNC_QUALIFIER detail::tvec4<valType> fastInverseSqrt
-(
-	detail::tvec4<valType> const & x
-)
-{
-    return detail::tvec4<valType>(
-        fastInverseSqrt(x.x), 
-        fastInverseSqrt(x.y), 
-        fastInverseSqrt(x.z), 
-        fastInverseSqrt(x.w));
-}
-
-// fastLength
-template <typename genType>
-GLM_FUNC_QUALIFIER genType fastLength
-(
-	genType const & x
-)
-{
-    return abs(x);
-}
-
-template <typename valType>
-GLM_FUNC_QUALIFIER valType fastLength
-(
-	detail::tvec2<valType> const & x
-)
-{
-    valType sqr = x.x * x.x + x.y * x.y;
-    return fastSqrt(sqr);
-}
-
-template <typename valType>
-GLM_FUNC_QUALIFIER valType fastLength
-(
-	detail::tvec3<valType> const & x
-)
-{
-    valType sqr = x.x * x.x + x.y * x.y + x.z * x.z;
-    return fastSqrt(sqr);
-}
-
-template <typename valType>
-GLM_FUNC_QUALIFIER valType fastLength
-(
-	detail::tvec4<valType> const & x
-)
-{
-    valType sqr = x.x * x.x + x.y * x.y + x.z * x.z + x.w * x.w;
-    return fastSqrt(sqr);
-}
-
-// fastDistance
-template <typename genType>
-GLM_FUNC_QUALIFIER genType fastDistance
-(
-	genType const & x, 
-	genType const & y
-)
-{
-    return fastLength(y - x);
-}
-
-template <typename valType>
-GLM_FUNC_QUALIFIER valType fastDistance
-(
-	detail::tvec2<valType> const & x, 
-	detail::tvec2<valType> const & y
-)
-{
-    return fastLength(y - x);
-}
-
-template <typename valType>
-GLM_FUNC_QUALIFIER valType fastDistance
-(
-	detail::tvec3<valType> const & x, 
-	detail::tvec3<valType> const & y
-)
-{
-    return fastLength(y - x);
-}
-
-template <typename valType>
-GLM_FUNC_QUALIFIER valType fastDistance
-(
-	detail::tvec4<valType> const & x, 
-	detail::tvec4<valType> const & y
-)
-{
-    return fastLength(y - x);
-}
-
-// fastNormalize
-template <typename genType>
-GLM_FUNC_QUALIFIER genType fastNormalize
-(
-	genType const & x
-)
-{
-    return x > genType(0) ? genType(1) : -genType(1);
-}
-
-template <typename valType>
-GLM_FUNC_QUALIFIER detail::tvec2<valType> fastNormalize
-(
-	detail::tvec2<valType> const & x
-)
-{
-    valType sqr = x.x * x.x + x.y * x.y;
-    return x * fastInverseSqrt(sqr);
-}
-
-template <typename valType>
-GLM_FUNC_QUALIFIER detail::tvec3<valType> fastNormalize
-(
-	detail::tvec3<valType> const & x
-)
-{
-    valType sqr = x.x * x.x + x.y * x.y + x.z * x.z;
-    return x * fastInverseSqrt(sqr);
-}
-
-template <typename valType>
-GLM_FUNC_QUALIFIER detail::tvec4<valType> fastNormalize
-(
-	detail::tvec4<valType> const & x
-)
-{
-    valType sqr = x.x * x.x + x.y * x.y + x.z * x.z + x.w * x.w;
-    return x * fastInverseSqrt(sqr);
-}
-
+#include "../core/_vectorize.hpp"
+
+namespace glm
+{
+	// fastSqrt
+	template <typename genType>
+	GLM_FUNC_QUALIFIER genType fastSqrt
+	(
+		genType const & x
+	)
+	{
+		GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'fastSqrt' only accept floating-point input");
+
+		return genType(1) / fastInverseSqrt(x);
+	}
+
+	VECTORIZE_VEC(fastSqrt)
+
+	// fastInversesqrt
+	template <typename genType>
+	GLM_FUNC_QUALIFIER genType fastInverseSqrt
+	(
+		genType const & x
+	)
+	{
+		genType tmp = x;
+		float xhalf = 0.5f * float(tmp);
+		uint i = *(uint*)&x;
+		i = 0x5f375a86 - (i >> 1);
+		//x = *(float*)&i;
+		//x = *((float*)(char*)&i);
+		tmp = detail::uif(i).f;
+		tmp = tmp * (1.5f - xhalf * tmp * tmp);
+		return genType(tmp);
+	}
+
+	VECTORIZE_VEC(fastInverseSqrt)
+
+	// fastLength
+	template <typename genType>
+	GLM_FUNC_QUALIFIER genType fastLength
+	(
+		genType const & x
+	)
+	{
+		return abs(x);
+	}
+
+	template <typename valType>
+	GLM_FUNC_QUALIFIER valType fastLength
+	(
+		detail::tvec2<valType> const & x
+	)
+	{
+		valType sqr = x.x * x.x + x.y * x.y;
+		return fastSqrt(sqr);
+	}
+
+	template <typename valType>
+	GLM_FUNC_QUALIFIER valType fastLength
+	(
+		detail::tvec3<valType> const & x
+	)
+	{
+		valType sqr = x.x * x.x + x.y * x.y + x.z * x.z;
+		return fastSqrt(sqr);
+	}
+
+	template <typename valType>
+	GLM_FUNC_QUALIFIER valType fastLength
+	(
+		detail::tvec4<valType> const & x
+	)
+	{
+		valType sqr = x.x * x.x + x.y * x.y + x.z * x.z + x.w * x.w;
+		return fastSqrt(sqr);
+	}
+
+	// fastDistance
+	template <typename genType>
+	GLM_FUNC_QUALIFIER genType fastDistance
+	(
+		genType const & x, 
+		genType const & y
+	)
+	{
+		return fastLength(y - x);
+	}
+
+	// fastNormalize
+	template <typename genType>
+	GLM_FUNC_QUALIFIER genType fastNormalize
+	(
+		genType const & x
+	)
+	{
+		return x > genType(0) ? genType(1) : -genType(1);
+	}
+
+	template <typename valType>
+	GLM_FUNC_QUALIFIER detail::tvec2<valType> fastNormalize
+	(
+		detail::tvec2<valType> const & x
+	)
+	{
+		valType sqr = x.x * x.x + x.y * x.y;
+		return x * fastInverseSqrt(sqr);
+	}
+
+	template <typename valType>
+	GLM_FUNC_QUALIFIER detail::tvec3<valType> fastNormalize
+	(
+		detail::tvec3<valType> const & x
+	)
+	{
+		valType sqr = x.x * x.x + x.y * x.y + x.z * x.z;
+		return x * fastInverseSqrt(sqr);
+	}
+
+	template <typename valType>
+	GLM_FUNC_QUALIFIER detail::tvec4<valType> fastNormalize
+	(
+		detail::tvec4<valType> const & x
+	)
+	{
+		valType sqr = x.x * x.x + x.y * x.y + x.z * x.z + x.w * x.w;
+		return x * fastInverseSqrt(sqr);
+	}
 }//namespace glm
 }//namespace glm