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 sintab_f32[1024];
00016 extern const fix16 sintab_f16[1024];
00017 
00018 extern const fix16 log2tab_f16[0x10000];
00019 extern const fix16 log10tab_f16[0x10000];
00020 extern const fix16 sqrttab_f16[0x10000];
00021 
00022 
00027 #define min(X, Y)   (((X) < (Y))?(X):(Y))
00028 
00033 #define max(X, Y)   (((X) > (Y))?(X):(Y))
00034 
00039 #define clamp(X, L, H)   (min(max((X), (L)), (H)))
00040 
00041 #if (ENABLE_NEWLIB == 0)
00042 
00046 #define abs(X)      (((X) < 0)?-(X):(X))
00047 #endif  // ENABLE_NEWLIB
00048 
00049 #ifndef PI
00050 
00054 #define PI 3.14159265358979323846
00055 #endif
00056 
00057 
00058 #define FIX16_INT_BITS              10
00059 #define FIX16_FRAC_BITS             (16 - FIX16_INT_BITS)
00060 
00061 #define FIX16_INT_MASK              (((1 << FIX16_INT_BITS) - 1) << FIX16_FRAC_BITS)
00062 #define FIX16_FRAC_MASK             ((1 << FIX16_FRAC_BITS) - 1)
00063 
00064 
00065 #define FIX32_INT_BITS              22
00066 #define FIX32_FRAC_BITS             (32 - FIX32_INT_BITS)
00067 
00068 #define FIX32_INT_MASK              (((1 << FIX32_INT_BITS) - 1) << FIX32_FRAC_BITS)
00069 #define FIX32_FRAC_MASK             ((1 << FIX32_FRAC_BITS) - 1)
00070 
00071 
00072 #define FASTFIX16_INT_BITS          8
00073 #define FASTFIX16_FRAC_BITS         (16 - FASTFIX16_INT_BITS)
00074 
00075 #define FASTFIX16_INT_MASK          (((1 << FASTFIX16_INT_BITS) - 1) << FASTFIX16_FRAC_BITS)
00076 #define FASTFIX16_FRAC_MASK         ((1 << FASTFIX16_FRAC_BITS) - 1)
00077 
00078 
00079 #define FASTFIX32_INT_BITS          16
00080 #define FASTFIX32_FRAC_BITS         (32 - FASTFIX32_INT_BITS)
00081 
00082 #define FASTFIX32_INT_MASK          (((1 << FASTFIX32_INT_BITS) - 1) << FASTFIX32_FRAC_BITS)
00083 #define FASTFIX32_FRAC_MASK         ((1 << FASTFIX32_FRAC_BITS) - 1)
00084 
00085 
00093 #define FIX16(value)                ((fix16) ((value) * (1 << FIX16_FRAC_BITS)))
00094 
00102 #define FIX32(value)                ((fix32) ((value) * (1 << FIX32_FRAC_BITS)))
00103 
00111 #define FASTFIX16(value)                ((fastfix16) ((value) * (1 << FASTFIX16_FRAC_BITS)))
00112 
00120 #define FASTFIX32(value)                ((fastfix32) ((value) * (1 << FASTFIX32_FRAC_BITS)))
00121 
00122 
00123 // 2D STUFF
00124 
00129 typedef struct
00130 {
00131     u16 x;
00132     u16 y;
00133 } Vect2D_u16;
00134 
00139 typedef struct
00140 {
00141     s16 x;
00142     s16 y;
00143 } Vect2D_s16;
00144 
00149 typedef struct
00150 {
00151     u32 x;
00152     u32 y;
00153 } Vect2D_u32;
00154 
00159 typedef struct
00160 {
00161     s32 x;
00162     s32 y;
00163 } Vect2D_s32;
00164 
00169 typedef struct
00170 {
00171     fix16 x;
00172     fix16 y;
00173 } Vect2D_f16;
00174 
00179 typedef struct
00180 {
00181     fix32 x;
00182     fix32 y;
00183 } Vect2D_f32;
00184 
00190 typedef struct
00191 {
00192     Vect2D_f16 a;
00193     Vect2D_f16 b;
00194 } Mat2D_f16;
00195 
00201 typedef struct
00202 {
00203     Vect2D_f32 a;
00204     Vect2D_f32 b;
00205 } Mat2D_f32;
00206 
00207 
00208 // 3D STUFF
00209 
00214 typedef struct
00215 {
00216     u16 x;
00217     u16 y;
00218     u16 z;
00219 } Vect3D_u16;
00220 
00225 typedef struct
00226 {
00227     s16 x;
00228     s16 y;
00229     s16 z;
00230 } Vect3D_s16;
00231 
00236 typedef struct
00237 {
00238     u32 x;
00239     u32 y;
00240     u32 z;
00241 } Vect3D_u32;
00242 
00247 typedef struct
00248 {
00249     s32 x;
00250     s32 y;
00251     s32 z;
00252 } Vect3D_s32;
00253 
00258 typedef struct
00259 {
00260     fix16 x;
00261     fix16 y;
00262     fix16 z;
00263 } Vect3D_f16;
00264 
00269 typedef struct
00270 {
00271     fix32 x;
00272     fix32 y;
00273     fix32 z;
00274 } Vect3D_f32;
00275 
00281 typedef struct
00282 {
00283     Vect3D_f16 a;
00284     Vect3D_f16 b;
00285     Vect3D_f16 c;
00286 } Mat3D_f16;
00287 
00293 typedef struct
00294 {
00295     Vect3D_f32 a;
00296     Vect3D_f32 b;
00297     Vect3D_f32 c;
00298 } Mat3D_f32;
00299 
00300 
00301 // 4D STUFF
00302 
00307 typedef struct
00308 {
00309     fix16 x;
00310     fix16 y;
00311     fix16 z;
00312     fix16 w;
00313 } Vect4D_f16;
00314 
00319 typedef struct
00320 {
00321     fix32 x;
00322     fix32 y;
00323     fix32 z;
00324     fix32 w;
00325 } Vect4D_f32;
00326 
00332 typedef struct
00333 {
00334     Vect4D_f16 a;
00335     Vect4D_f16 b;
00336     Vect4D_f16 c;
00337     Vect4D_f16 d;
00338 } Mat4D_f16;
00339 
00345 typedef struct
00346 {
00347     Vect4D_f32 a;
00348     Vect4D_f32 b;
00349     Vect4D_f32 c;
00350     Vect4D_f32 d;
00351 } Mat4D_f32;
00352 
00353 
00354 // short alias
00355 
00359 typedef Vect2D_u16 V2u16;
00363 typedef Vect2D_s16 V2s16;
00367 typedef Vect2D_u32 V2u32;
00371 typedef Vect2D_s32 V2s32;
00375 typedef Vect2D_f16 V2f16;
00379 typedef Vect2D_f32 V2f32;
00380 
00384 typedef Vect3D_u16 V3u16;
00388 typedef Vect3D_s16 V3s16;
00392 typedef Vect3D_u32 V3u32;
00396 typedef Vect3D_s32 V3s32;
00400 typedef Vect3D_f16 V3f16;
00404 typedef Vect3D_f32 V3f32;
00405 
00409 typedef Vect4D_f16 V4f16;
00413 typedef Vect4D_f32 V4f32;
00414 
00418 typedef Mat2D_f16 M2f16;
00422 typedef Mat2D_f32 M2f32;
00426 typedef Mat3D_f16 M3f16;
00430 typedef Mat3D_f32 M3f32;
00434 typedef Mat4D_f16 M4f16;
00438 typedef Mat4D_f32 M4f32;
00439 
00440 
00451 u32 mulu(u16 op1, u16 op2);
00462 s32 muls(s16 op1, s16 op2);
00474 u16 divu(u32 op1, u16 op2);
00486 s16 divs(s32 op1, s16 op2);
00497 u16 modu(u32 op1, u16 op2);
00508 s16 mods(s32 op1, s16 op2);
00509 
00522 u32 divmodu(u32 op1, u16 op2);
00535 s32 divmods(s32 op1, s16 op2);
00536 
00537 
00542 fix16 intToFix16(s16 value);
00547 s16 fix16ToInt(fix16 value);
00552 fix32 fix16ToFix32(fix16 value);
00553 
00558 fix16 fix16Round(fix16 value);
00563 s16 fix16ToRoundedInt(fix16 value);
00568 fix16 fix16Frac(fix16 value);
00573 fix16 fix16Int(fix16 value);
00574 
00575 #define fix16Add(a, b)      _Pragma("GCC error \"This method is deprecated, simply use '+' operator to add fix16 values together.\"")
00576 #define fix16Sub(a, b)      _Pragma("GCC error \"This method is deprecated, simply use '-' operator to subtract fix16 values.\"")
00577 #define fix16Neg(a)         _Pragma("GCC error \"This method is deprecated, simply use '0 - value' to get the negative fix16 value.\"")
00578 
00583 fix16 fix16Mul(fix16 val1, fix16 val2);
00588 fix16 fix16Div(fix16 val1, fix16 val2);
00593 fix16 fix16Avg(fix16 val1, fix16 val2);
00594 
00599 fix16 fix16Log2(fix16 value);
00604 fix16 fix16Log10(fix16 value);
00609 fix16 fix16Sqrt(fix16 value);
00610 
00616 fix16 sinFix16(u16 value);
00622 fix16 cosFix16(u16 value);
00623 
00624 
00629 fix32 intToFix32(s32 value);
00634 s32 fix32ToInt(fix32 value);
00639 fix16 fix32ToFix16(fix32 value);
00640 
00645 fix32 fix32Round(fix32 value);
00650 s32 fix32ToRoundedInt(fix32 value);
00655 fix32 fix32Frac(fix32 value);
00660 fix32 fix32Int(fix32 value);
00661 
00662 #define fix32Add(a, b)      _Pragma("GCC error \"This method is deprecated, simply use '+' operator to add fix32 values together.\"")
00663 #define fix32Sub(a, b)      _Pragma("GCC error \"This method is deprecated, simply use '-' operator to subtract fix32 values.\"")
00664 #define fix32Neg(a)         _Pragma("GCC error \"This method is deprecated, simply use '0 - value' to get the negative fix32 value.\"")
00665 
00671 fix32 fix32Mul(fix32 val1, fix32 val2);
00677 fix32 fix32Div(fix32 val1, fix32 val2);
00682 fix32 fix32Avg(fix32 val1, fix32 val2);
00683 
00689 fix32 sinFix32(u16 value);
00695 fix32 cosFix32(u16 value);
00696 
00697 
00698 
00699 
00700 
00705 fastfix16 intToFastFix16(s16 value);
00710 s16 fastFix16ToInt(fastfix16 value);
00711 
00716 fastfix16 fastFix16Round(fastfix16 value);
00721 s16 fastFix16ToRoundedInt(fastfix16 value);
00726 fastfix16 fastFix16Frac(fastfix16 value);
00731 fastfix16 fastFix16Int(fastfix16 value);
00732 
00737 fastfix16 fastFix16Mul(fastfix16 val1, fastfix16 val2);
00742 fastfix16 fastFix16Div(fastfix16 val1, fastfix16 val2);
00743 
00744 
00749 fastfix32 intToFastFix32(s16 value);
00754 s16 fastFix32ToInt(fastfix32 value);
00755 
00760 fastfix32 fastFix32Round(fastfix32 value);
00765 s32 fastFix32ToRoundedInt(fastfix32 value);
00770 fastfix32 fastFix32Frac(fastfix32 value);
00775 fastfix32 fastFix32Int(fastfix32 value);
00776 
00782 fastfix32 fastFix32Mul(fastfix32 val1, fastfix32 val2);
00788 fastfix32 fastFix32Div(fastfix32 val1, fastfix32 val2);
00789 
00790 
00791 
00792 
00793 
00794 
00802 u32 intToBCD(u32 value);
00803 
00808 #define distance_approx(dx, dy) _Pragma("GCC error \"This method is deprecated, use getApproximatedDistance(..) instead.\"")
00809 
00820 u32 getApproximatedDistance(s32 dx, s32 dy);
00829 u32 getApproximatedDistanceV(V2s32* v);
00840 s32 getApproximatedLog2(s32 value);
00851 u16 getLog2Int(u32 value);
00852 
00863 u32 getNextPow2(u32 value);
00864 
00865 
00866 #endif // _MATHS_H_
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Defines