112 lines
2.8 KiB
C
112 lines
2.8 KiB
C
#ifndef __FAST_CODE_H_INCLUDED__
|
|
#define __FAST_CODE_H_INCLUDED__
|
|
|
|
// Needed to control floating-point pecision
|
|
#include <float.h>
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
// Casting - Taken from the www.gamedev.net forums and www.nvidia.com
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
#define __clamp(v, _min, _max) ( (v>_max) ? (_max) : ( (v<_min) ? (_min) : (v) ) )
|
|
|
|
#ifdef WIN64
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
//////////////////////////////////////////////////////////////////////////
|
|
// Round a floating point number to an integer. Note that (int + .5)
|
|
// is rounded to (int + 1).
|
|
__forceinline int RoundFloatToInt (float f)
|
|
{
|
|
return (int)(f+0.5f);
|
|
}
|
|
|
|
// Doesn't take the pointer, is a bit faster
|
|
__forceinline int __stdcall FloatToIntRet(float x)
|
|
{
|
|
return (int)(x+0.5f);
|
|
}
|
|
|
|
// Casting floats to unsigned chars is also very expensive, just
|
|
// NEVER cast with (unsigned char)
|
|
__forceinline BYTE __stdcall FloatToByte(float x)
|
|
{
|
|
float t = x + (float) 0xC00000;
|
|
return * (BYTE *) &t;
|
|
}
|
|
|
|
// Fast floor() for (x >= 0) && (x < 2^31). MUCH faster than the normal
|
|
// floor()
|
|
__forceinline unsigned int __stdcall ifloor(float x)
|
|
{
|
|
DWORD e = (0x7F + 31) - ((* (DWORD *) &x & 0x7F800000) >> 23);
|
|
DWORD m = 0x80000000 | (* (DWORD *) &x << 8);
|
|
return (m >> e) & -(e < 32);
|
|
}
|
|
|
|
// Converts to integer equal to or less than, asm version
|
|
__forceinline int ftoi(float f)
|
|
{
|
|
return (int)(f);
|
|
}
|
|
//////////////////////////////////////////////////////////////////////////
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
#else //WIN64
|
|
|
|
// Round a floating point number to an integer. Note that (int + .5)
|
|
// is rounded to (int + 1).
|
|
__forceinline int RoundFloatToInt (float f)
|
|
{
|
|
int i;
|
|
__asm fld [f]
|
|
__asm fistp [i]
|
|
return i;
|
|
}
|
|
|
|
// Doesn't take the pointer, is a bit faster
|
|
__forceinline int __stdcall FloatToIntRet(float x)
|
|
{
|
|
int t;
|
|
__asm fld x
|
|
__asm fistp t
|
|
return t;
|
|
}
|
|
|
|
// Casting floats to unsigned chars is also very expensive, just
|
|
// NEVER cast with (unsigned char)
|
|
__forceinline BYTE __stdcall FloatToByte(float x)
|
|
{
|
|
float t = x + (float) 0xC00000;
|
|
return * (BYTE *) &t;
|
|
}
|
|
|
|
// Fast floor() for (x >= 0) && (x < 2^31). MUCH faster than the normal
|
|
// floor()
|
|
__forceinline unsigned int __stdcall ifloor(float x)
|
|
{
|
|
DWORD e = (0x7F + 31) - ((* (DWORD *) &x & 0x7F800000) >> 23);
|
|
DWORD m = 0x80000000 | (* (DWORD *) &x << 8);
|
|
return (m >> e) & -(e < 32);
|
|
}
|
|
|
|
// Converts to integer equal to or less than, asm version
|
|
__forceinline int ftoi(float f)
|
|
{
|
|
static float Half = 0.5;
|
|
int i;
|
|
__asm fld [f]
|
|
__asm fsub [Half]
|
|
__asm fistp [i]
|
|
return i;
|
|
}
|
|
|
|
#endif //WIN64
|
|
|
|
//! Return random value in [-1,1] diaposone.
|
|
inline float frand()
|
|
{
|
|
return ((float)rand()*2.0f / RAND_MAX) - 1.0f;
|
|
}
|
|
|
|
#endif // __FAST_CODE_H_INCLUDED__
|