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