master
Christophe Riccio ago%!(EXTRA string=14 years)
parent 6eba3a9db9
commit 6f6d161afb
  1. 353
      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{ #include "../core/_vectorize.hpp"
// fastSqrt namespace glm
template <typename genType> {
GLM_FUNC_QUALIFIER genType fastSqrt // fastSqrt
( template <typename genType>
genType const & x GLM_FUNC_QUALIFIER genType fastSqrt
) (
{ genType const & x
return genType(1) / fastInverseSqrt(x); )
} {
GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'fastSqrt' only accept floating-point input");
template <typename valType>
GLM_FUNC_QUALIFIER detail::tvec2<valType> fastSqrt return genType(1) / fastInverseSqrt(x);
( }
detail::tvec2<valType> const & x
) VECTORIZE_VEC(fastSqrt)
{
return detail::tvec2<valType>( // fastInversesqrt
fastSqrt(x.x), template <typename genType>
fastSqrt(x.y)); GLM_FUNC_QUALIFIER genType fastInverseSqrt
} (
genType const & x
template <typename valType> )
GLM_FUNC_QUALIFIER detail::tvec3<valType> fastSqrt {
( genType tmp = x;
detail::tvec3<valType> const & x float xhalf = 0.5f * float(tmp);
) uint i = *(uint*)&x;
{ i = 0x5f375a86 - (i >> 1);
return detail::tvec3<valType>( //x = *(float*)&i;
fastSqrt(x.x), //x = *((float*)(char*)&i);
fastSqrt(x.y), tmp = detail::uif(i).f;
fastSqrt(x.z)); tmp = tmp * (1.5f - xhalf * tmp * tmp);
} return genType(tmp);
}
template <typename valType>
GLM_FUNC_QUALIFIER detail::tvec4<valType> fastSqrt VECTORIZE_VEC(fastInverseSqrt)
(
detail::tvec4<valType> const & x // fastLength
) template <typename genType>
{ GLM_FUNC_QUALIFIER genType fastLength
return detail::tvec4<valType>( (
fastSqrt(x.x), genType const & x
fastSqrt(x.y), )
fastSqrt(x.z), {
fastSqrt(x.w)); return abs(x);
} }
// fastInversesqrt template <typename valType>
template <typename genType> GLM_FUNC_QUALIFIER valType fastLength
GLM_FUNC_QUALIFIER genType fastInverseSqrt (
( detail::tvec2<valType> const & x
genType const & x )
) {
{ valType sqr = x.x * x.x + x.y * x.y;
genType tmp = x; return fastSqrt(sqr);
float xhalf = 0.5f * float(tmp); }
uint i = *(uint*)&x;
i = 0x5f375a86 - (i >> 1); template <typename valType>
//x = *(float*)&i; GLM_FUNC_QUALIFIER valType fastLength
//x = *((float*)(char*)&i); (
tmp = detail::uif(i).f; detail::tvec3<valType> const & x
tmp = tmp * (1.5f - xhalf * tmp * tmp); )
return genType(tmp); {
} valType sqr = x.x * x.x + x.y * x.y + x.z * x.z;
return fastSqrt(sqr);
template <typename valType> }
GLM_FUNC_QUALIFIER detail::tvec2<valType> fastInverseSqrt
( template <typename valType>
detail::tvec2<valType> const & x GLM_FUNC_QUALIFIER valType fastLength
) (
{ detail::tvec4<valType> const & x
return detail::tvec2<valType>( )
fastInverseSqrt(x.x), {
fastInverseSqrt(x.y)); valType sqr = x.x * x.x + x.y * x.y + x.z * x.z + x.w * x.w;
} return fastSqrt(sqr);
}
template <typename valType>
GLM_FUNC_QUALIFIER detail::tvec3<valType> fastInverseSqrt // fastDistance
( template <typename genType>
detail::tvec3<valType> const & x GLM_FUNC_QUALIFIER genType fastDistance
) (
{ genType const & x,
return detail::tvec3<valType>( genType const & y
fastInverseSqrt(x.x), )
fastInverseSqrt(x.y), {
fastInverseSqrt(x.z)); return fastLength(y - x);
} }
template <typename valType> // fastNormalize
GLM_FUNC_QUALIFIER detail::tvec4<valType> fastInverseSqrt template <typename genType>
( GLM_FUNC_QUALIFIER genType fastNormalize
detail::tvec4<valType> const & x (
) genType const & x
{ )
return detail::tvec4<valType>( {
fastInverseSqrt(x.x), return x > genType(0) ? genType(1) : -genType(1);
fastInverseSqrt(x.y), }
fastInverseSqrt(x.z),
fastInverseSqrt(x.w)); template <typename valType>
} GLM_FUNC_QUALIFIER detail::tvec2<valType> fastNormalize
(
// fastLength detail::tvec2<valType> const & x
template <typename genType> )
GLM_FUNC_QUALIFIER genType fastLength {
( valType sqr = x.x * x.x + x.y * x.y;
genType const & x return x * fastInverseSqrt(sqr);
) }
{
return abs(x); template <typename valType>
} GLM_FUNC_QUALIFIER detail::tvec3<valType> fastNormalize
(
template <typename valType> detail::tvec3<valType> const & x
GLM_FUNC_QUALIFIER valType fastLength )
( {
detail::tvec2<valType> const & x valType sqr = x.x * x.x + x.y * x.y + x.z * x.z;
) return x * fastInverseSqrt(sqr);
{ }
valType sqr = x.x * x.x + x.y * x.y;
return fastSqrt(sqr); template <typename valType>
} GLM_FUNC_QUALIFIER detail::tvec4<valType> fastNormalize
(
template <typename valType> detail::tvec4<valType> const & x
GLM_FUNC_QUALIFIER valType fastLength )
( {
detail::tvec3<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);
{ }
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);
}
}//namespace glm }//namespace glm

Loading…
Cancel
Save