Reverts previous HMM_FastInverseSquareRoot revert :P

Hlkpf3 on Mārtiņš Možeiko's comment:

i don't really want to be that guy here.. but it's the internet
and i have no free will: the new built-ins are using 'the function',
so they are not faster than 'the function' - they're just quicker at it.
also, many instruction sets don't offer that functionality yet.
and for some it doesn't make any sense. playstations and the nintendo wii,
for instance, were using powerpc - no. the nintendo wii u also doesn't
have it. the "new 3ds" should in theory be the first nintendo-device with
this intrinsic thanks to ARM11 NEON. can someone confirm that? heck,
some MPUs still don't even have floating-point units. i have heard of
a case where the energy-consumption of a sensor-network for
indoor-localisation could be halved by replacing the sqrt they used
for Pythagoras with this neat buddy here.
This commit is contained in:
Kyle De'Vir
2016-05-29 04:16:28 +10:00
parent 1458cb9321
commit 52a05290b2

View File

@@ -223,6 +223,7 @@ HMMDEF float HMM_ToRadians(float Degrees);
HMMDEF float HMM_Inner(hmm_vec3 A, hmm_vec3 B);
HMMDEF float HMM_SquareRoot(float Float);
HMMDEF float HMM_LengthSquareRoot(hmm_vec3 A);
HMMDEF float HMM_FastInverseSquareRoot(float Number);
HMMDEF float HMM_Length(hmm_vec3 A);
HMMDEF float HMM_Power(float Base, int Exponent);
HMMDEF float HMM_Clamp(float Min, float Value, float Max);
@@ -351,6 +352,24 @@ HMM_LengthSquareRoot(hmm_vec3 A)
return (Result);
}
HINLINE float
HMM_FastInverseSquareRoot(float Number)
{
long i;
float x2, y;
const float threehalfs = 1.5f;
x2 = Number * 0.5f;
y = Number;
i = * ( long * ) &y; // evil floating point bit level hacking
i = 0x5f3759df - ( i >> 1 ); // what the fuck?
y = * ( float * ) &i;
y = y * ( threehalfs - ( x2 * y * y ) );
return ( y );
}
HINLINE float
HMM_Length(hmm_vec3 A)
{