sgdk
maths.h
Go to the documentation of this file.
00001 
00011 #ifndef _MATHS_H_
00012 #define _MATHS_H_
00013 
00014 
00015 extern const fix32 sintab32[1024];
00016 extern const fix16 sintab16[1024];
00017 
00018 #if (MATH_BIG_TABLES != 0)
00019 extern const fix16 log2tab16[0x10000];
00020 extern const fix16 log10tab16[0x10000];
00021 extern const fix16 sqrttab16[0x10000];
00022 #endif
00023 
00024 
00029 #define min(X, Y)   (((X) < (Y))?(X):(Y))
00030 
00035 #define max(X, Y)   (((X) > (Y))?(X):(Y))
00036 
00037 #if (ENABLE_NEWLIB == 0)
00038 
00042 #define abs(X)      (((X) < 0)?-(X):(X))
00043 #endif  // ENABLE_NEWLIB
00044 
00045 #ifndef PI
00046 
00050 #define PI 3.14159265358979323846
00051 #endif
00052 
00053 
00054 #define FIX32_INT_BITS              22
00055 #define FIX32_FRAC_BITS             (32 - FIX32_INT_BITS)
00056 
00057 #define FIX32_INT_MASK              (((1 << FIX32_INT_BITS) - 1) << FIX32_FRAC_BITS)
00058 #define FIX32_FRAC_MASK             ((1 << FIX32_FRAC_BITS) - 1)
00059 
00067 #define FIX32(value)                ((fix32) ((value) * (1 << FIX32_FRAC_BITS)))
00068 
00073 #define intToFix32(value)           ((value) << FIX32_FRAC_BITS)
00074 
00078 #define fix32ToInt(value)           ((value) >> FIX32_FRAC_BITS)
00079 
00084 #define fix32Round(value)           \
00085     ((fix32Frac(value) > FIX32(0.5))?fix32Int(value + FIX32(1)) + 1:fix32Int(value))
00086 
00091 #define fix32ToRoundedInt(value)    \
00092     ((fix32Frac(value) > FIX32(0.5))?fix32ToInt(value) + 1:fix32ToInt(value))
00093 
00098 #define fix32Frac(value)            ((value) & FIX32_FRAC_MASK)
00099 
00103 #define fix32Int(value)             ((value) & FIX32_INT_MASK)
00104 
00109 #define fix32Add(val1, val2)        ((val1) + (val2))
00110 
00114 #define fix32Sub(val1, val2)        ((val1) - (val2))
00115 
00119 #define fix32Neg(value)             (0 - (value))
00120 
00126 #define fix32Mul(val1, val2)        (((val1) >> (FIX32_FRAC_BITS / 2)) * ((val2) >> (FIX32_FRAC_BITS / 2)))
00127 
00132 #define fix32Div(val1, val2)        (((val1) << (FIX32_FRAC_BITS / 2)) / ((val2) >> (FIX32_FRAC_BITS / 2)))
00133 
00134 
00135 #define FIX16_INT_BITS              10
00136 #define FIX16_FRAC_BITS             (16 - FIX16_INT_BITS)
00137 
00138 #define FIX16_INT_MASK              (((1 << FIX16_INT_BITS) - 1) << FIX16_FRAC_BITS)
00139 #define FIX16_FRAC_MASK             ((1 << FIX16_FRAC_BITS) - 1)
00140 
00148 #define FIX16(value)                ((fix16) ((value) * (1 << FIX16_FRAC_BITS)))
00149 
00154 #define intToFix16(value)           ((value) << FIX16_FRAC_BITS)
00155 
00159 #define fix16ToInt(value)           ((value) >> FIX16_FRAC_BITS)
00160 
00165 #define fix16Round(value)           \
00166     (fix16Frac(value) > FIX16(0.5))?fix16Int(value + FIX16(1)) + 1:fix16Int(value)
00167 
00172 #define fix16ToRoundedInt(value)    \
00173     (fix16Frac(value) > FIX16(0.5))?fix16ToInt(value) + 1:fix16ToInt(value)
00174 
00179 #define fix16Frac(value)            ((value) & FIX16_FRAC_MASK)
00180 
00184 #define fix16Int(value)             ((value) & FIX16_INT_MASK)
00185 
00190 #define fix16Add(val1, val2)        ((val1) + (val2))
00191 
00195 #define fix16Sub(val1, val2)        ((val1) - (val2))
00196 
00200 #define fix16Neg(value)             (0 - (value))
00201 
00206 #define fix16Mul(val1, val2)        (((val1) * (val2)) >> FIX16_FRAC_BITS)
00207 
00211 #define fix16Div(val1, val2)        (((val1) << FIX16_FRAC_BITS) / (val2))
00212 
00213 
00214 #if (MATH_BIG_TABLES != 0)
00215 
00220 #define fix16Log2(v)                log2tab16[v]
00221 
00225 #define fix16Log10(v)               log10tab16[v]
00226 
00230 #define fix16Sqrt(v)                sqrttab16[v]
00231 
00232 #endif
00233 
00234 
00239 #define fix32ToFix16(value)         (((value) << FIX16_FRAC_BITS) >> FIX32_FRAC_BITS)
00240 
00244 #define fix16ToFix32(value)         (((value) << FIX32_FRAC_BITS) >> FIX16_FRAC_BITS)
00245 
00251 #define sinFix32(value)             sintab32[(value) & 1023]
00252 
00257 #define cosFix32(value)             sintab32[((value) + 256) & 1023]
00258 
00264 #define sinFix16(value)             sintab16[(value) & 1023]
00265 
00270 #define cosFix16(value)             sintab16[((value) + 256) & 1023]
00271 
00272 
00273 // 2D STUFF
00274 
00279 typedef struct
00280 {
00281     u16 x;
00282     u16 y;
00283 } Vect2D_u16;
00284 
00289 typedef struct
00290 {
00291     s16 x;
00292     s16 y;
00293 } Vect2D_s16;
00294 
00299 typedef struct
00300 {
00301     u32 x;
00302     u32 y;
00303 } Vect2D_u32;
00304 
00309 typedef struct
00310 {
00311     s32 x;
00312     s32 y;
00313 } Vect2D_s32;
00314 
00319 typedef struct
00320 {
00321     fix16 x;
00322     fix16 y;
00323 } Vect2D_f16;
00324 
00329 typedef struct
00330 {
00331     fix32 x;
00332     fix32 y;
00333 } Vect2D_f32;
00334 
00340 typedef struct
00341 {
00342     Vect2D_f16 a;
00343     Vect2D_f16 b;
00344 } Mat2D_f16;
00345 
00351 typedef struct
00352 {
00353     Vect2D_f32 a;
00354     Vect2D_f32 b;
00355 } Mat2D_f32;
00356 
00357 
00358 // 3D STUFF
00359 
00364 typedef struct
00365 {
00366     u16 x;
00367     u16 y;
00368     u16 z;
00369 } Vect3D_u16;
00370 
00375 typedef struct
00376 {
00377     s16 x;
00378     s16 y;
00379     s16 z;
00380 } Vect3D_s16;
00381 
00386 typedef struct
00387 {
00388     u32 x;
00389     u32 y;
00390     u32 z;
00391 } Vect3D_u32;
00392 
00397 typedef struct
00398 {
00399     s32 x;
00400     s32 y;
00401     s32 z;
00402 } Vect3D_s32;
00403 
00408 typedef struct
00409 {
00410     fix16 x;
00411     fix16 y;
00412     fix16 z;
00413 } Vect3D_f16;
00414 
00419 typedef struct
00420 {
00421     fix32 x;
00422     fix32 y;
00423     fix32 z;
00424 } Vect3D_f32;
00425 
00431 typedef struct
00432 {
00433     Vect3D_f16 a;
00434     Vect3D_f16 b;
00435     Vect3D_f16 c;
00436 } Mat3D_f16;
00437 
00443 typedef struct
00444 {
00445     Vect3D_f32 a;
00446     Vect3D_f32 b;
00447     Vect3D_f32 c;
00448 } Mat3D_f32;
00449 
00450 
00451 // 4D STUFF
00452 
00457 typedef struct
00458 {
00459     fix16 x;
00460     fix16 y;
00461     fix16 z;
00462     fix16 w;
00463 } Vect4D_f16;
00464 
00469 typedef struct
00470 {
00471     fix32 x;
00472     fix32 y;
00473     fix32 z;
00474     fix32 w;
00475 } Vect4D_f32;
00476 
00482 typedef struct
00483 {
00484     Vect4D_f16 a;
00485     Vect4D_f16 b;
00486     Vect4D_f16 c;
00487     Vect4D_f16 d;
00488 } Mat4D_f16;
00489 
00495 typedef struct
00496 {
00497     Vect4D_f32 a;
00498     Vect4D_f32 b;
00499     Vect4D_f32 c;
00500     Vect4D_f32 d;
00501 } Mat4D_f32;
00502 
00503 
00504 // short alias
00505 
00509 typedef Vect2D_u16 V2u16;
00513 typedef Vect2D_s16 V2s16;
00517 typedef Vect2D_u32 V2u32;
00521 typedef Vect2D_s32 V2s32;
00525 typedef Vect2D_f16 V2f16;
00529 typedef Vect2D_f32 V2f32;
00530 
00534 typedef Vect3D_u16 V3u16;
00538 typedef Vect3D_s16 V3s16;
00542 typedef Vect3D_u32 V3u32;
00546 typedef Vect3D_s32 V3s32;
00550 typedef Vect3D_f16 V3f16;
00554 typedef Vect3D_f32 V3f32;
00555 
00559 typedef Vect4D_f16 V4f16;
00563 typedef Vect4D_f32 V4f32;
00564 
00568 typedef Mat2D_f16 M2f16;
00572 typedef Mat2D_f32 M2f32;
00576 typedef Mat3D_f16 M3f16;
00580 typedef Mat3D_f32 M3f32;
00584 typedef Mat4D_f16 M4f16;
00588 typedef Mat4D_f32 M4f32;
00589 
00597 u32 intToBCD(u32 value);
00598 
00603 u32 distance_approx(s32 dx, s32 dy);
00614 u32 getApproximatedDistance(s32 dx, s32 dy);
00625 s32 getApproximatedLog2(s32 value);
00636 u16 getLog2Int(u32 value);
00637 
00638 
00639 #endif // _MATHS_H_
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Defines