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
45 #ifdef PI // make sure we don't collide with a define
57 #ifdef PI64 // make sure we don't collide with a define
61 const f64 PI64 = 3.1415926535897932384626433832795028841971693993751;
116 inline const T&
min_(
const T& a,
const T& b)
118 return a < b ? a : b;
123 inline const T&
min_(
const T& a,
const T& b,
const T& c)
125 return a < b ?
min_(a, c) :
min_(b, c);
130 inline const T&
max_(
const T& a,
const T& b)
132 return a < b ? b : a;
137 inline const T&
max_(
const T& a,
const T& b,
const T& c)
139 return a < b ?
max_(b, c) :
max_(a, c);
146 return a < (T)0 ? -a : a;
152 inline T
lerp(
const T& a,
const T& b,
const f32 t)
154 return (T)(a*(1.f-t)) + (b*t);
159 inline const T
clamp (
const T& value,
const T& low,
const T& high)
161 return min_ (
max_(value,low), high);
169 template <
class T1,
class T2>
180 return (a + tolerance >= b) && (a - tolerance <= b);
186 return (a + tolerance >= b) && (a - tolerance <= b);
204 return (a + tolerance >= b) && (a - tolerance <= b);
210 return (a + tolerance >= b) && (a - tolerance <= b);
217 return fabs(a) <= tolerance;
223 return fabsf(a) <= tolerance;
229 return fabsf(a) > tolerance;
235 return ( a & 0x7ffffff ) <= tolerance;
241 return a <= tolerance;
246 const s32 mask = (a - b) >> 31;
247 return (a & mask) | (b & ~mask);
252 const s32 mask = (a - b) >> 31;
253 return (b & mask) | (a & ~mask);
276 #define F32_AS_S32(f) (*((s32 *) &(f)))
277 #define F32_AS_U32(f) (*((u32 *) &(f)))
278 #define F32_AS_U32_POINTER(f) ( ((u32 *) &(f)))
280 #define F32_VALUE_0 0x00000000
281 #define F32_VALUE_1 0x3f800000
282 #define F32_SIGN_BIT 0x80000000U
283 #define F32_EXPON_MANTISSA 0x7FFFFFFFU
287 #ifdef IRRLICHT_FAST_MATH
288 #define IR(x) ((u32&)(x))
294 #define AIR(x) (IR(x)&0x7fffffff)
297 #ifdef IRRLICHT_FAST_MATH
298 #define FR(x) ((f32&)(x))
305 #define IEEE_1_0 0x3f800000
307 #define IEEE_255_0 0x437f0000
309 #ifdef IRRLICHT_FAST_MATH
310 #define F32_LOWER_0(f) (F32_AS_U32(f) > F32_SIGN_BIT)
311 #define F32_LOWER_EQUAL_0(f) (F32_AS_S32(f) <= F32_VALUE_0)
312 #define F32_GREATER_0(f) (F32_AS_S32(f) > F32_VALUE_0)
313 #define F32_GREATER_EQUAL_0(f) (F32_AS_U32(f) <= F32_SIGN_BIT)
314 #define F32_EQUAL_1(f) (F32_AS_U32(f) == F32_VALUE_1)
315 #define F32_EQUAL_0(f) ( (F32_AS_U32(f) & F32_EXPON_MANTISSA ) == F32_VALUE_0)
318 #define F32_A_GREATER_B(a,b) (F32_AS_S32((a)) > F32_AS_S32((b)))
322 #define F32_LOWER_0(n) ((n) < 0.0f)
323 #define F32_LOWER_EQUAL_0(n) ((n) <= 0.0f)
324 #define F32_GREATER_0(n) ((n) > 0.0f)
325 #define F32_GREATER_EQUAL_0(n) ((n) >= 0.0f)
326 #define F32_EQUAL_1(n) ((n) == 1.0f)
327 #define F32_EQUAL_0(n) ((n) == 0.0f)
328 #define F32_A_GREATER_B(a,b) ((a) > (b))
334 #define REALINLINE __forceinline
336 #define REALINLINE inline
340 #if defined(__BORLANDC__) || defined (__BCPLUSPLUS__)
347 return ( ( -condition >> 7 ) & ( a ^ b ) ) ^ b;
353 return ( -condition >> 31 ) & a;
360 return ( ( -condition >> 31 ) & ( a ^ b ) ) ^ b;
366 return ( ( -condition >> 15 ) & ( a ^ b ) ) ^ b;
372 return ( -condition >> 31 ) & a;
383 state ^= ( ( -condition >> 31 ) ^ state ) & mask;
388 return floorf( x + 0.5f );
393 #ifdef IRRLICHT_FAST_MATH
396 feclearexcept(FE_ALL_EXCEPT);
397 #elif defined(_MSC_VER)
399 #elif defined(__GNUC__) && defined(__x86__)
400 __asm__ __volatile__ (
"fclex \n\t");
402 # warn clearFPUException not supported.
428 return 1.0 / sqrt(x);
434 #if defined ( IRRLICHT_FAST_MATH )
435 #if defined(_MSC_VER)
439 __asm rsqrtss xmm0, f
440 __asm movss recsqrt, xmm0
450 return 1.f / sqrtf(f);
452 #else // no fast math
453 return 1.f / sqrtf(f);
466 #if defined (IRRLICHT_FAST_MATH)
475 __asm mulss xmm1, xmm0
476 __asm mulss xmm1, xmm0
477 __asm addss xmm0, xmm0
478 __asm subss xmm0, xmm1
480 __asm movss rec, xmm0
491 #else // no fast math
506 #if defined( IRRLICHT_FAST_MATH)
515 __asm mulss xmm1, xmm0
516 __asm mulss xmm1, xmm0
517 __asm addss xmm0, xmm0
518 __asm subss xmm0, xmm1
520 __asm movss rec, xmm0
536 #else // no fast math
544 #ifdef IRRLICHT_FAST_MATH
549 #if defined(_MSC_VER)
556 #elif defined(__GNUC__)
557 __asm__ __volatile__ (
565 # warn IRRLICHT_FAST_MATH not supported.
566 return (
s32) floorf ( x );
569 #else // no fast math
570 return (
s32) floorf ( x );
577 #ifdef IRRLICHT_FAST_MATH
582 #if defined(_MSC_VER)
589 #elif defined(__GNUC__)
590 __asm__ __volatile__ (
598 # warn IRRLICHT_FAST_MATH not supported.
599 return (
s32) ceilf ( x );
602 #else // not fast math
603 return (
s32) ceilf ( x );
611 #if defined(IRRLICHT_FAST_MATH)
614 #if defined(_MSC_VER)
620 #elif defined(__GNUC__)
621 __asm__ __volatile__ (
628 # warn IRRLICHT_FAST_MATH not supported.
632 #else // no fast math
639 return a > b ? (a > c ? a : c) : (b > c ? b : c);
644 return a < b ? (a < c ? a : c) : (b < c ? b : c);
649 return x - floorf ( x );
655 #ifndef IRRLICHT_FAST_MATH