5 #ifndef __IRR_MATH_H_INCLUDED__
6 #define __IRR_MATH_H_INCLUDED__
15 #if defined(_IRR_SOLARIS_PLATFORM_) || defined(__BORLANDC__) || defined (__BCPLUSPLUS__) || defined (_WIN32_WCE)
16 #define sqrtf(X) (irr::f32)sqrt((irr::f64)(X))
17 #define sinf(X) (irr::f32)sin((irr::f64)(X))
18 #define cosf(X) (irr::f32)cos((irr::f64)(X))
19 #define asinf(X) (irr::f32)asin((irr::f64)(X))
20 #define acosf(X) (irr::f32)acos((irr::f64)(X))
21 #define atan2f(X,Y) (irr::f32)atan2((irr::f64)(X),(irr::f64)(Y))
22 #define ceilf(X) (irr::f32)ceil((irr::f64)(X))
23 #define floorf(X) (irr::f32)floor((irr::f64)(X))
24 #define powf(X,Y) (irr::f32)pow((irr::f64)(X),(irr::f64)(Y))
25 #define fmodf(X,Y) (irr::f32)fmod((irr::f64)(X),(irr::f64)(Y))
26 #define fabsf(X) (irr::f32)fabs((irr::f64)(X))
27 #define logf(X) (irr::f32)log((irr::f64)(X))
31 #define FLT_MAX 3.402823466E+38F
35 #define FLT_MIN 1.17549435e-38F
52 #ifdef PI // make sure we don't collide with a define
64 #ifdef PI64 // make sure we don't collide with a define
68 const f64 PI64 = 3.1415926535897932384626433832795028841971693993751;
123 inline const T&
min_(
const T& a,
const T& b)
125 return a < b ? a : b;
130 inline const T&
min_(
const T& a,
const T& b,
const T& c)
132 return a < b ?
min_(a, c) :
min_(b, c);
137 inline const T&
max_(
const T& a,
const T& b)
139 return a < b ? b : a;
144 inline const T&
max_(
const T& a,
const T& b,
const T& c)
146 return a < b ?
max_(b, c) :
max_(a, c);
153 return a < (T)0 ? -a : a;
159 inline T
lerp(
const T& a,
const T& b,
const f32 t)
161 return (T)(a*(1.f-t)) + (b*t);
166 inline const T
clamp (
const T& value,
const T& low,
const T& high)
168 return min_ (
max_(value,low), high);
176 template <
class T1,
class T2>
187 return (a + tolerance >= b) && (a - tolerance <= b);
193 return (a + tolerance >= b) && (a - tolerance <= b);
200 bool sign()
const {
return (
i >> 31) != 0; }
229 int ulpsDiff =
abs_(fa.
i- fb.
i);
230 if (ulpsDiff <= maxUlpDiff)
252 return (a + tolerance >= b) && (a - tolerance <= b);
258 return (a + tolerance >= b) && (a - tolerance <= b);
265 return (a + tolerance >= b) && (a - tolerance <= b);
272 return fabs(a) <= tolerance;
278 return fabsf(a) <= tolerance;
284 return fabsf(a) > tolerance;
290 return ( a & 0x7ffffff ) <= tolerance;
296 return a <= tolerance;
303 return abs_(a) <= tolerance;
309 const s32 mask = (a - b) >> 31;
310 return (a & mask) | (b & ~mask);
315 const s32 mask = (a - b) >> 31;
316 return (b & mask) | (a & ~mask);
339 #define F32_AS_S32(f) (*((s32 *) &(f)))
340 #define F32_AS_U32(f) (*((u32 *) &(f)))
341 #define F32_AS_U32_POINTER(f) ( ((u32 *) &(f)))
343 #define F32_VALUE_0 0x00000000
344 #define F32_VALUE_1 0x3f800000
345 #define F32_SIGN_BIT 0x80000000U
346 #define F32_EXPON_MANTISSA 0x7FFFFFFFU
350 #ifdef IRRLICHT_FAST_MATH
351 #define IR(x) ((u32&)(x))
357 #define AIR(x) (IR(x)&0x7fffffff)
360 #ifdef IRRLICHT_FAST_MATH
361 #define FR(x) ((f32&)(x))
368 #define IEEE_1_0 0x3f800000
370 #define IEEE_255_0 0x437f0000
372 #ifdef IRRLICHT_FAST_MATH
373 #define F32_LOWER_0(f) (F32_AS_U32(f) > F32_SIGN_BIT)
374 #define F32_LOWER_EQUAL_0(f) (F32_AS_S32(f) <= F32_VALUE_0)
375 #define F32_GREATER_0(f) (F32_AS_S32(f) > F32_VALUE_0)
376 #define F32_GREATER_EQUAL_0(f) (F32_AS_U32(f) <= F32_SIGN_BIT)
377 #define F32_EQUAL_1(f) (F32_AS_U32(f) == F32_VALUE_1)
378 #define F32_EQUAL_0(f) ( (F32_AS_U32(f) & F32_EXPON_MANTISSA ) == F32_VALUE_0)
381 #define F32_A_GREATER_B(a,b) (F32_AS_S32((a)) > F32_AS_S32((b)))
385 #define F32_LOWER_0(n) ((n) < 0.0f)
386 #define F32_LOWER_EQUAL_0(n) ((n) <= 0.0f)
387 #define F32_GREATER_0(n) ((n) > 0.0f)
388 #define F32_GREATER_EQUAL_0(n) ((n) >= 0.0f)
389 #define F32_EQUAL_1(n) ((n) == 1.0f)
390 #define F32_EQUAL_0(n) ((n) == 0.0f)
391 #define F32_A_GREATER_B(a,b) ((a) > (b))
397 #define REALINLINE __forceinline
399 #define REALINLINE inline
403 #if defined(__BORLANDC__) || defined (__BCPLUSPLUS__)
410 return ( ( -condition >> 7 ) & ( a ^ b ) ) ^ b;
416 return ( -condition >> 31 ) & a;
423 return ( ( -condition >> 31 ) & ( a ^ b ) ) ^ b;
429 return ( ( -condition >> 15 ) & ( a ^ b ) ) ^ b;
435 return ( -condition >> 31 ) & a;
446 state ^= ( ( -condition >> 31 ) ^ state ) & mask;
451 return floorf( x + 0.5f );
456 #ifdef IRRLICHT_FAST_MATH
459 feclearexcept(FE_ALL_EXCEPT);
460 #elif defined(_MSC_VER)
462 #elif defined(__GNUC__) && defined(__x86__)
463 __asm__ __volatile__ (
"fclex \n\t");
465 # warn clearFPUException not supported.
499 return 1.0 / sqrt(x);
505 #if defined ( IRRLICHT_FAST_MATH )
506 #if defined(_MSC_VER)
510 __asm rsqrtss xmm0, f
511 __asm movss recsqrt, xmm0
521 return 1.f / sqrtf(f);
523 #else // no fast math
524 return 1.f / sqrtf(f);
537 #if defined (IRRLICHT_FAST_MATH)
546 __asm mulss xmm1, xmm0
547 __asm mulss xmm1, xmm0
548 __asm addss xmm0, xmm0
549 __asm subss xmm0, xmm1
551 __asm movss rec, xmm0
562 #else // no fast math
577 #if defined( IRRLICHT_FAST_MATH)
586 __asm mulss xmm1, xmm0
587 __asm mulss xmm1, xmm0
588 __asm addss xmm0, xmm0
589 __asm subss xmm0, xmm1
591 __asm movss rec, xmm0
607 #else // no fast math
615 #ifdef IRRLICHT_FAST_MATH
620 #if defined(_MSC_VER)
627 #elif defined(__GNUC__)
628 __asm__ __volatile__ (
636 # warn IRRLICHT_FAST_MATH not supported.
637 return (
s32) floorf ( x );
640 #else // no fast math
641 return (
s32) floorf ( x );
648 #ifdef IRRLICHT_FAST_MATH
653 #if defined(_MSC_VER)
660 #elif defined(__GNUC__)
661 __asm__ __volatile__ (
669 # warn IRRLICHT_FAST_MATH not supported.
670 return (
s32) ceilf ( x );
673 #else // not fast math
674 return (
s32) ceilf ( x );
682 #if defined(IRRLICHT_FAST_MATH)
685 #if defined(_MSC_VER)
691 #elif defined(__GNUC__)
692 __asm__ __volatile__ (
699 # warn IRRLICHT_FAST_MATH not supported.
703 #else // no fast math
710 return a > b ? (a > c ? a : c) : (b > c ? b : c);
715 return a < b ? (a < c ? a : c) : (b < c ? b : c);
720 return x - floorf ( x );
726 #ifndef IRRLICHT_FAST_MATH