master
Christophe Riccio ago%!(EXTRA string=14 years)
parent 6eba3a9db9
commit 6f6d161afb
  1. 253
      glm/gtx/fast_square_root.inl

@ -2,66 +2,36 @@
// 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
(
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
fastSqrt(x.x), template <typename genType>
fastSqrt(x.y)); GLM_FUNC_QUALIFIER genType fastSqrt
} (
genType const & x
)
{
GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'fastSqrt' only accept floating-point input");
template <typename valType> return genType(1) / fastInverseSqrt(x);
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> VECTORIZE_VEC(fastSqrt)
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 // fastInversesqrt
template <typename genType> template <typename genType>
GLM_FUNC_QUALIFIER genType fastInverseSqrt GLM_FUNC_QUALIFIER genType fastInverseSqrt
( (
genType const & x genType const & x
) )
{ {
genType tmp = x; genType tmp = x;
float xhalf = 0.5f * float(tmp); float xhalf = 0.5f * float(tmp);
uint i = *(uint*)&x; uint i = *(uint*)&x;
@ -71,163 +41,98 @@ GLM_FUNC_QUALIFIER genType fastInverseSqrt
tmp = detail::uif(i).f; tmp = detail::uif(i).f;
tmp = tmp * (1.5f - xhalf * tmp * tmp); tmp = tmp * (1.5f - xhalf * tmp * tmp);
return genType(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> VECTORIZE_VEC(fastInverseSqrt)
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 // fastLength
template <typename genType> template <typename genType>
GLM_FUNC_QUALIFIER genType fastLength GLM_FUNC_QUALIFIER genType fastLength
( (
genType const & x genType const & x
) )
{ {
return abs(x); return abs(x);
} }
template <typename valType> template <typename valType>
GLM_FUNC_QUALIFIER valType fastLength GLM_FUNC_QUALIFIER valType fastLength
( (
detail::tvec2<valType> const & x detail::tvec2<valType> const & x
) )
{ {
valType sqr = x.x * x.x + x.y * x.y; valType sqr = x.x * x.x + x.y * x.y;
return fastSqrt(sqr); return fastSqrt(sqr);
} }
template <typename valType> template <typename valType>
GLM_FUNC_QUALIFIER valType fastLength GLM_FUNC_QUALIFIER valType fastLength
( (
detail::tvec3<valType> const & x detail::tvec3<valType> const & x
) )
{ {
valType sqr = x.x * x.x + x.y * x.y + x.z * x.z; valType sqr = x.x * x.x + x.y * x.y + x.z * x.z;
return fastSqrt(sqr); return fastSqrt(sqr);
} }
template <typename valType> template <typename valType>
GLM_FUNC_QUALIFIER valType fastLength GLM_FUNC_QUALIFIER valType fastLength
( (
detail::tvec4<valType> const & x detail::tvec4<valType> const & x
) )
{ {
valType sqr = x.x * x.x + x.y * x.y + x.z * x.z + x.w * x.w; valType sqr = x.x * x.x + x.y * x.y + x.z * x.z + x.w * x.w;
return fastSqrt(sqr); return fastSqrt(sqr);
} }
// fastDistance // fastDistance
template <typename genType> template <typename genType>
GLM_FUNC_QUALIFIER genType fastDistance GLM_FUNC_QUALIFIER genType fastDistance
( (
genType const & x, genType const & x,
genType const & y genType const & y
) )
{ {
return fastLength(y - x); return fastLength(y - x);
} }
template <typename valType> // fastNormalize
GLM_FUNC_QUALIFIER valType fastDistance template <typename genType>
( GLM_FUNC_QUALIFIER genType fastNormalize
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 genType const & x
) )
{ {
return x > genType(0) ? genType(1) : -genType(1); return x > genType(0) ? genType(1) : -genType(1);
} }
template <typename valType> template <typename valType>
GLM_FUNC_QUALIFIER detail::tvec2<valType> fastNormalize GLM_FUNC_QUALIFIER detail::tvec2<valType> fastNormalize
( (
detail::tvec2<valType> const & x detail::tvec2<valType> const & x
) )
{ {
valType sqr = x.x * x.x + x.y * x.y; valType sqr = x.x * x.x + x.y * x.y;
return x * fastInverseSqrt(sqr); return x * fastInverseSqrt(sqr);
} }
template <typename valType> template <typename valType>
GLM_FUNC_QUALIFIER detail::tvec3<valType> fastNormalize GLM_FUNC_QUALIFIER detail::tvec3<valType> fastNormalize
( (
detail::tvec3<valType> const & x detail::tvec3<valType> const & x
) )
{ {
valType sqr = x.x * x.x + x.y * x.y + x.z * x.z; valType sqr = x.x * x.x + x.y * x.y + x.z * x.z;
return x * fastInverseSqrt(sqr); return x * fastInverseSqrt(sqr);
} }
template <typename valType> template <typename valType>
GLM_FUNC_QUALIFIER detail::tvec4<valType> fastNormalize GLM_FUNC_QUALIFIER detail::tvec4<valType> fastNormalize
( (
detail::tvec4<valType> const & x detail::tvec4<valType> const & x
) )
{ {
valType sqr = x.x * x.x + x.y * x.y + x.z * x.z + x.w * x.w; valType sqr = x.x * x.x + x.y * x.y + x.z * x.z + x.w * x.w;
return x * fastInverseSqrt(sqr); return x * fastInverseSqrt(sqr);
} }
}//namespace glm }//namespace glm

Loading…
Cancel
Save