Vectorized

This commit is contained in:
Christophe Riccio 2011-10-14 12:48:09 +01:00
parent 6eba3a9db9
commit 6f6d161afb

View File

@ -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
(
genType const & x
)
{ {
return genType(1) / fastInverseSqrt(x); // 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");
template <typename valType> return genType(1) / fastInverseSqrt(x);
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> VECTORIZE_VEC(fastSqrt)
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> // fastInversesqrt
GLM_FUNC_QUALIFIER detail::tvec4<valType> fastSqrt template <typename genType>
( GLM_FUNC_QUALIFIER genType fastInverseSqrt
detail::tvec4<valType> const & x (
) genType const & x
{ )
return detail::tvec4<valType>( {
fastSqrt(x.x), genType tmp = x;
fastSqrt(x.y), float xhalf = 0.5f * float(tmp);
fastSqrt(x.z), uint i = *(uint*)&x;
fastSqrt(x.w)); 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);
}
// fastInversesqrt VECTORIZE_VEC(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> // fastLength
GLM_FUNC_QUALIFIER detail::tvec2<valType> fastInverseSqrt template <typename genType>
( GLM_FUNC_QUALIFIER genType fastLength
detail::tvec2<valType> const & x (
) genType const & x
{ )
return detail::tvec2<valType>( {
fastInverseSqrt(x.x), return abs(x);
fastInverseSqrt(x.y)); }
}
template <typename valType> template <typename valType>
GLM_FUNC_QUALIFIER detail::tvec3<valType> fastInverseSqrt GLM_FUNC_QUALIFIER valType fastLength
( (
detail::tvec3<valType> const & x detail::tvec2<valType> const & x
) )
{ {
return detail::tvec3<valType>( valType sqr = x.x * x.x + x.y * x.y;
fastInverseSqrt(x.x), return fastSqrt(sqr);
fastInverseSqrt(x.y), }
fastInverseSqrt(x.z));
}
template <typename valType> template <typename valType>
GLM_FUNC_QUALIFIER detail::tvec4<valType> fastInverseSqrt GLM_FUNC_QUALIFIER valType fastLength
( (
detail::tvec4<valType> const & x detail::tvec3<valType> const & x
) )
{ {
return detail::tvec4<valType>( valType sqr = x.x * x.x + x.y * x.y + x.z * x.z;
fastInverseSqrt(x.x), return fastSqrt(sqr);
fastInverseSqrt(x.y), }
fastInverseSqrt(x.z),
fastInverseSqrt(x.w));
}
// fastLength template <typename valType>
template <typename genType> GLM_FUNC_QUALIFIER valType fastLength
GLM_FUNC_QUALIFIER genType fastLength (
( detail::tvec4<valType> const & x
genType const & x )
) {
{ valType sqr = x.x * x.x + x.y * x.y + x.z * x.z + x.w * x.w;
return abs(x); return fastSqrt(sqr);
} }
template <typename valType> // fastDistance
GLM_FUNC_QUALIFIER valType fastLength template <typename genType>
( GLM_FUNC_QUALIFIER genType fastDistance
detail::tvec2<valType> const & x (
) genType const & x,
{ genType const & y
valType sqr = x.x * x.x + x.y * x.y; )
return fastSqrt(sqr); {
} return fastLength(y - x);
}
template <typename valType> // fastNormalize
GLM_FUNC_QUALIFIER valType fastLength template <typename genType>
( GLM_FUNC_QUALIFIER genType fastNormalize
detail::tvec3<valType> const & x (
) genType const & x
{ )
valType sqr = x.x * x.x + x.y * x.y + x.z * x.z; {
return fastSqrt(sqr); return x > genType(0) ? genType(1) : -genType(1);
} }
template <typename valType> template <typename valType>
GLM_FUNC_QUALIFIER valType fastLength GLM_FUNC_QUALIFIER detail::tvec2<valType> fastNormalize
( (
detail::tvec4<valType> const & x detail::tvec2<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;
return fastSqrt(sqr); return x * fastInverseSqrt(sqr);
} }
// fastDistance template <typename valType>
template <typename genType> GLM_FUNC_QUALIFIER detail::tvec3<valType> fastNormalize
GLM_FUNC_QUALIFIER genType fastDistance (
( detail::tvec3<valType> const & x
genType const & x, )
genType const & y {
) valType sqr = x.x * x.x + x.y * x.y + x.z * x.z;
{ return x * fastInverseSqrt(sqr);
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);
}
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