diff options
| author | petrie911 <69443847+petrie911@users.noreply.github.com> | 2024-04-03 09:30:50 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-04-03 11:30:50 -0300 |
| commit | ac41c180a9e68d31d18cfc57b46032f4ccaa052a (patch) | |
| tree | af76e3fc54538127cc81f19bdb14045b9e85fc5f /src/sys/sys_math.c | |
| parent | 5f2b690a2b1ef89a33b5dc16440b0f87d9bc3779 (diff) | |
Reorganizaton of main (#199)
* reorganize main
* more names
* libc
Diffstat (limited to 'src/sys/sys_math.c')
| -rw-r--r-- | src/sys/sys_math.c | 185 |
1 files changed, 185 insertions, 0 deletions
diff --git a/src/sys/sys_math.c b/src/sys/sys_math.c new file mode 100644 index 00000000..5e9c8591 --- /dev/null +++ b/src/sys/sys_math.c @@ -0,0 +1,185 @@ +#include "sys.h" + +s32 sSeededRandSeed3; +s32 sRandSeed1; +s32 sRandSeed2; +s32 sRandSeed3; +s32 sSeededRandSeed1; +s32 sSeededRandSeed2; + +f32 Math_ModF(f32 value, f32 mod) { + return value - ((s32) (value / mod) * mod); +} + +void Rand_Init(void) { + sRandSeed1 = (s32) osGetTime() % 30000; + sRandSeed2 = (s32) osGetTime() % 30000; + sRandSeed3 = (s32) osGetTime() % 30000; +} + +f32 Rand_ZeroOne(void) { + sRandSeed1 = (sRandSeed1 * 171) % 30269; + sRandSeed2 = (sRandSeed2 * 172) % 30307; + sRandSeed3 = (sRandSeed3 * 170) % 30323; + + return fabsf(Math_ModF((sRandSeed1 / 30269.0f) + (sRandSeed2 / 30307.0f) + (sRandSeed3 / 30323.0f), 1.0f)); +} + +void Rand_SetSeed(s32 seed1, s32 seed2, s32 seed3) { + sSeededRandSeed1 = seed1; + sSeededRandSeed2 = seed2; + sSeededRandSeed3 = seed3; +} + +f32 Rand_ZeroOneSeeded(void) { + sSeededRandSeed1 = (sSeededRandSeed1 * 171) % 30269; + sSeededRandSeed2 = (sSeededRandSeed2 * 172) % 30307; + sSeededRandSeed3 = (sSeededRandSeed3 * 170) % 30323; + + return fabsf( + Math_ModF((sSeededRandSeed1 / 30269.0f) + (sSeededRandSeed2 / 30307.0f) + (sSeededRandSeed3 / 30323.0f), 1.0f)); +} + +f32 Math_Atan2F(f32 y, f32 x) { + if ((y == 0.0f) && (x == 0.0f)) { + return 0.0f; + } + + if (x == 0.0f) { + if (y < 0.0f) { + return -M_PI / 2.0f; + } else { + return M_PI / 2.0f; + } + } + + if (x < 0.0f) { + if (y < 0.0f) { + return -(M_PI - Math_FAtanF(fabs(y / x))); + } else { + return M_PI - Math_FAtanF(fabs(y / x)); + } + } else { + return Math_FAtanF(y / x); + } +} + +f32 Math_Atan2F_XY(f32 x, f32 y) { + if ((x == 0.0f) && (y == 0.0f)) { + return 0.0f; + } + + if (x == 0.0f) { + if (y < 0.0f) { + return -M_PI / 2.0f; + } else { + return M_PI / 2.0f; + } + } + + if (y == 0.0f) { + if (x > 0.0f) { + return 0.0f; + } else { + return M_PI; + } + } + + if (x < 0.0f) { + if (y < 0.0f) { + return -(M_PI - Math_FAtanF(fabs(x / y))); + } else { + return M_PI - Math_FAtanF(fabs(x / y)); + } + } else { + return Math_FAtanF(x / y); + } +} + +f32 Math_Atan2F_XYAlt(f32 x, f32 y) { + if ((x == 0.0f) && (y == 0.0f)) { + return 0.0f; + } + + if (x == 0.0f) { + if (y < 0.0f) { + return -M_PI / 2.0f; + } + return M_PI / 2.0f; + } + + if (y == 0.0f) { + return 0.0f; + } + return -Math_FAtanF(x / y); +} + +f32 Math_FactorialF(f32 n) { + f32 out = 1.0f; + s32 i; + + for (i = (s32) n; i > 1; i--) { + out *= i; + } + + return out; +} + +f32 D_800C45E0[] = { 1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800, 39916800, 479001600 }; + +f32 Math_Factorial(s32 n) { + f32 out; + s32 i; + + if (n > 12) { + out = 1.0f; + + for (i = n; i > 1; i--) { + out *= i; + } + } else { + out = D_800C45E0[n]; + } + return out; +} + +f32 Math_PowF(f32 base, s32 exp) { + f32 out = 1.0f; + + while (exp > 0) { + exp--; + out *= base; + } + return out; +} + +void Math_MinMax(s32* min, s32* max, s32 val1, s32 val2, s32 val3) { + if (val1 < val2) { + if (val2 < val3) { + *min = val1; + *max = val3; + return; + } + *max = val2; + + if (val1 < val3) { + *min = val1; + return; + } + *min = val3; + return; + } + + if (val1 < val3) { + *min = val2; + *max = val3; + return; + } + *max = val1; + + if (val2 < val3) { + *min = val2; + return; + } + *min = val3; +} |
