diff --git a/glm/gtx/fast_square_root.inl b/glm/gtx/fast_square_root.inl index 987fca1e..e993d406 100644 --- a/glm/gtx/fast_square_root.inl +++ b/glm/gtx/fast_square_root.inl @@ -2,232 +2,137 @@ // OpenGL Mathematics Copyright (c) 2005 - 2011 G-Truc Creation (www.g-truc.net) /////////////////////////////////////////////////////////////////////////////////////////////////// // Created : 2006-01-04 -// Updated : 2008-10-07 +// Updated : 2011-10-14 // Licence : This source is under MIT License // File : glm/gtx/fast_square_root.inl /////////////////////////////////////////////////////////////////////////////////////////////////// -namespace glm{ - -// fastSqrt -template -GLM_FUNC_QUALIFIER genType fastSqrt -( - genType const & x -) -{ - return genType(1) / fastInverseSqrt(x); -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 fastSqrt -( - detail::tvec2 const & x -) -{ - return detail::tvec2( - fastSqrt(x.x), - fastSqrt(x.y)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 fastSqrt -( - detail::tvec3 const & x -) -{ - return detail::tvec3( - fastSqrt(x.x), - fastSqrt(x.y), - fastSqrt(x.z)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 fastSqrt -( - detail::tvec4 const & x -) -{ - return detail::tvec4( - fastSqrt(x.x), - fastSqrt(x.y), - fastSqrt(x.z), - fastSqrt(x.w)); -} - -// fastInversesqrt -template -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 -GLM_FUNC_QUALIFIER detail::tvec2 fastInverseSqrt -( - detail::tvec2 const & x -) -{ - return detail::tvec2( - fastInverseSqrt(x.x), - fastInverseSqrt(x.y)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 fastInverseSqrt -( - detail::tvec3 const & x -) -{ - return detail::tvec3( - fastInverseSqrt(x.x), - fastInverseSqrt(x.y), - fastInverseSqrt(x.z)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 fastInverseSqrt -( - detail::tvec4 const & x -) -{ - return detail::tvec4( - fastInverseSqrt(x.x), - fastInverseSqrt(x.y), - fastInverseSqrt(x.z), - fastInverseSqrt(x.w)); -} - -// fastLength -template -GLM_FUNC_QUALIFIER genType fastLength -( - genType const & x -) -{ - return abs(x); -} - -template -GLM_FUNC_QUALIFIER valType fastLength -( - detail::tvec2 const & x -) -{ - valType sqr = x.x * x.x + x.y * x.y; - return fastSqrt(sqr); -} - -template -GLM_FUNC_QUALIFIER valType fastLength -( - detail::tvec3 const & x -) -{ - valType sqr = x.x * x.x + x.y * x.y + x.z * x.z; - return fastSqrt(sqr); -} - -template -GLM_FUNC_QUALIFIER valType fastLength -( - detail::tvec4 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 -GLM_FUNC_QUALIFIER genType fastDistance -( - genType const & x, - genType const & y -) -{ - return fastLength(y - x); -} - -template -GLM_FUNC_QUALIFIER valType fastDistance -( - detail::tvec2 const & x, - detail::tvec2 const & y -) -{ - return fastLength(y - x); -} - -template -GLM_FUNC_QUALIFIER valType fastDistance -( - detail::tvec3 const & x, - detail::tvec3 const & y -) -{ - return fastLength(y - x); -} - -template -GLM_FUNC_QUALIFIER valType fastDistance -( - detail::tvec4 const & x, - detail::tvec4 const & y -) -{ - return fastLength(y - x); -} - -// fastNormalize -template -GLM_FUNC_QUALIFIER genType fastNormalize -( - genType const & x -) -{ - return x > genType(0) ? genType(1) : -genType(1); -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 fastNormalize -( - detail::tvec2 const & x -) -{ - valType sqr = x.x * x.x + x.y * x.y; - return x * fastInverseSqrt(sqr); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 fastNormalize -( - detail::tvec3 const & x -) -{ - valType sqr = x.x * x.x + x.y * x.y + x.z * x.z; - return x * fastInverseSqrt(sqr); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 fastNormalize -( - detail::tvec4 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 + GLM_FUNC_QUALIFIER genType fastSqrt + ( + genType const & x + ) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'fastSqrt' only accept floating-point input"); + + return genType(1) / fastInverseSqrt(x); + } + + VECTORIZE_VEC(fastSqrt) + + // fastInversesqrt + template + 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 + GLM_FUNC_QUALIFIER genType fastLength + ( + genType const & x + ) + { + return abs(x); + } + + template + GLM_FUNC_QUALIFIER valType fastLength + ( + detail::tvec2 const & x + ) + { + valType sqr = x.x * x.x + x.y * x.y; + return fastSqrt(sqr); + } + + template + GLM_FUNC_QUALIFIER valType fastLength + ( + detail::tvec3 const & x + ) + { + valType sqr = x.x * x.x + x.y * x.y + x.z * x.z; + return fastSqrt(sqr); + } + + template + GLM_FUNC_QUALIFIER valType fastLength + ( + detail::tvec4 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 + GLM_FUNC_QUALIFIER genType fastDistance + ( + genType const & x, + genType const & y + ) + { + return fastLength(y - x); + } + + // fastNormalize + template + GLM_FUNC_QUALIFIER genType fastNormalize + ( + genType const & x + ) + { + return x > genType(0) ? genType(1) : -genType(1); + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 fastNormalize + ( + detail::tvec2 const & x + ) + { + valType sqr = x.x * x.x + x.y * x.y; + return x * fastInverseSqrt(sqr); + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 fastNormalize + ( + detail::tvec3 const & x + ) + { + valType sqr = x.x * x.x + x.y * x.y + x.z * x.z; + return x * fastInverseSqrt(sqr); + } + + template + GLM_FUNC_QUALIFIER detail::tvec4 fastNormalize + ( + detail::tvec4 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