/////////////////////////////////////////////////////////////////////////////////////////////////// // OpenGL Mathematics Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) /////////////////////////////////////////////////////////////////////////////////////////////////// // Created : 2006-01-04 // 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 ) { 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