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);
207 Float_t(
float f1 = 0.0f) : f(f1) {}
209 bool sign()
const {
return (i >> 31) != 0; }
219 if ( fa.sign() != fb.sign() )
228 int ulpsDiff =
abs_(fa.i- fb.i);
229 if (ulpsDiff <= maxUlpDiff)
251 return (a + tolerance >= b) && (a - tolerance <= b);
257 return (a + tolerance >= b) && (a - tolerance <= b);
264 return (a + tolerance >= b) && (a - tolerance <= b);
271 return fabs(a) <= tolerance;
277 return fabsf(a) <= tolerance;
283 return fabsf(a) > tolerance;
289 return ( a & 0x7ffffff ) <= tolerance;
295 return a <= tolerance;
302 return abs_(a) > tolerance;
308 const s32 mask = (a - b) >> 31;
309 return (a & mask) | (b & ~mask);
314 const s32 mask = (a - b) >> 31;
315 return (b & mask) | (a & ~mask);
338 #define F32_AS_S32(f) (*((s32 *) &(f)))
339 #define F32_AS_U32(f) (*((u32 *) &(f)))
340 #define F32_AS_U32_POINTER(f) ( ((u32 *) &(f)))
342 #define F32_VALUE_0 0x00000000
343 #define F32_VALUE_1 0x3f800000
344 #define F32_SIGN_BIT 0x80000000U
345 #define F32_EXPON_MANTISSA 0x7FFFFFFFU
349 #ifdef IRRLICHT_FAST_MATH
350 #define IR(x) ((u32&)(x))
356 #define AIR(x) (IR(x)&0x7fffffff)
359 #ifdef IRRLICHT_FAST_MATH
360 #define FR(x) ((f32&)(x))
367 #define IEEE_1_0 0x3f800000
369 #define IEEE_255_0 0x437f0000
371 #ifdef IRRLICHT_FAST_MATH
372 #define F32_LOWER_0(f) (F32_AS_U32(f) > F32_SIGN_BIT)
373 #define F32_LOWER_EQUAL_0(f) (F32_AS_S32(f) <= F32_VALUE_0)
374 #define F32_GREATER_0(f) (F32_AS_S32(f) > F32_VALUE_0)
375 #define F32_GREATER_EQUAL_0(f) (F32_AS_U32(f) <= F32_SIGN_BIT)
376 #define F32_EQUAL_1(f) (F32_AS_U32(f) == F32_VALUE_1)
377 #define F32_EQUAL_0(f) ( (F32_AS_U32(f) & F32_EXPON_MANTISSA ) == F32_VALUE_0)
380 #define F32_A_GREATER_B(a,b) (F32_AS_S32((a)) > F32_AS_S32((b)))
384 #define F32_LOWER_0(n) ((n) < 0.0f)
385 #define F32_LOWER_EQUAL_0(n) ((n) <= 0.0f)
386 #define F32_GREATER_0(n) ((n) > 0.0f)
387 #define F32_GREATER_EQUAL_0(n) ((n) >= 0.0f)
388 #define F32_EQUAL_1(n) ((n) == 1.0f)
389 #define F32_EQUAL_0(n) ((n) == 0.0f)
390 #define F32_A_GREATER_B(a,b) ((a) > (b))
396 #define REALINLINE __forceinline
398 #define REALINLINE inline
402 #if defined(__BORLANDC__) || defined (__BCPLUSPLUS__)
409 return ( ( -condition >> 7 ) & ( a ^ b ) ) ^ b;
415 return ( -condition >> 31 ) & a;
422 return ( ( -condition >> 31 ) & ( a ^ b ) ) ^ b;
428 return ( ( -condition >> 15 ) & ( a ^ b ) ) ^ b;
434 return ( -condition >> 31 ) & a;
445 state ^= ( ( -condition >> 31 ) ^ state ) & mask;
450 return floorf( x + 0.5f );
455 #ifdef IRRLICHT_FAST_MATH
458 feclearexcept(FE_ALL_EXCEPT);
459 #elif defined(_MSC_VER)
461 #elif defined(__GNUC__) && defined(__x86__)
462 __asm__ __volatile__ (
"fclex \n\t");
464 # warn clearFPUException not supported.
498 return 1.0 / sqrt(x);
504 #if defined ( IRRLICHT_FAST_MATH )
505 #if defined(_MSC_VER)
509 __asm rsqrtss xmm0, f
510 __asm movss recsqrt, xmm0
520 return 1.f / sqrtf(f);
522 #else // no fast math
523 return 1.f / sqrtf(f);
536 #if defined (IRRLICHT_FAST_MATH)
545 __asm mulss xmm1, xmm0
546 __asm mulss xmm1, xmm0
547 __asm addss xmm0, xmm0
548 __asm subss xmm0, xmm1
550 __asm movss rec, xmm0
561 #else // no fast math
576 #if defined( IRRLICHT_FAST_MATH)
585 __asm mulss xmm1, xmm0
586 __asm mulss xmm1, xmm0
587 __asm addss xmm0, xmm0
588 __asm subss xmm0, xmm1
590 __asm movss rec, xmm0
606 #else // no fast math
614 #ifdef IRRLICHT_FAST_MATH
619 #if defined(_MSC_VER)
626 #elif defined(__GNUC__)
627 __asm__ __volatile__ (
635 # warn IRRLICHT_FAST_MATH not supported.
636 return (
s32) floorf ( x );
639 #else // no fast math
640 return (
s32) floorf ( x );
647 #ifdef IRRLICHT_FAST_MATH
652 #if defined(_MSC_VER)
659 #elif defined(__GNUC__)
660 __asm__ __volatile__ (
668 # warn IRRLICHT_FAST_MATH not supported.
669 return (
s32) ceilf ( x );
672 #else // not fast math
673 return (
s32) ceilf ( x );
681 #if defined(IRRLICHT_FAST_MATH)
684 #if defined(_MSC_VER)
690 #elif defined(__GNUC__)
691 __asm__ __volatile__ (
698 # warn IRRLICHT_FAST_MATH not supported.
702 #else // no fast math
709 return a > b ? (a > c ? a : c) : (b > c ? b : c);
714 return a < b ? (a < c ? a : c) : (b < c ? b : c);
719 return x - floorf ( x );
725 #ifndef IRRLICHT_FAST_MATH