sgdk
|
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_