decompile math_util

This commit is contained in:
RevoSucks 2023-09-02 23:36:37 -04:00
parent 9116960fd6
commit a67fbd2dce
6 changed files with 1527 additions and 6 deletions

1424
include/trig_tables.inc.c Normal file

File diff suppressed because it is too large Load Diff

View File

@ -48,7 +48,7 @@ segments:
- [0x75F0, asm] # stage loader
- [0x8EC0, c, crash_screen] # crash handler
- [0x9D20, c, profiler]
- [0xAF00, asm] # camera code
- [0xAF00, c, math_util]
- [0xB130, c, hal_libc]
- [0xB230, c, gb_tower]
- [0xC030, c] # extra sprites loader
@ -331,6 +331,8 @@ segments:
- [0x6A3B0, .data, profiler]
- [0x6A3D0, .data, gb_tower]
- [0x6A3E0, data, rom_data_6A3E0]
- [0x6A3F0, .data, math_util]
- [0x6FC00, data, rom_data_6FC00]
- [0x7A180, .data, libleo/driverominit]
- [0x7A190, data, rom_data_7A190]
- [0x7A2A0, .data, libultra/os/initialize]

View File

@ -1,9 +1,7 @@
#include <ultra64.h>
#include "controller.h"
#include "gb_tower.h"
// TODO: Identify/move to header
extern s16 func_8000A360(float, float);
#include "math_util.h"
struct Controller gControllers[4];
OSMesgQueue gSIEventMesgQueue;
@ -77,7 +75,7 @@ void Cont_AdjustAnalogStick(struct Controller* controller) {
}
if (controller->stickMag > 0.0f) {
controller->unkE = func_8000A360(-controller->stickY, controller->stickX);
controller->unkE = MathUtil_Atan2s(-controller->stickY, controller->stickX);
}
}

77
src/math_util.c Normal file
View File

@ -0,0 +1,77 @@
#include <ultra64.h>
#include "math_util.h"
// this file might be the leftovers of math_util.c from sm64/mk64.
#include "trig_tables.inc.c"
/**
* Helper function for atan2s. Does a look up of the arctangent of y/x assuming
* the resulting angle is in range [0, 0x2000] (1/8 of a circle).
*/
u16 MathUtil_Atan2Lookup(f32 y, f32 x) {
u16 ret;
if (x == 0) {
ret = gArctanTable[0];
} else {
ret = gArctanTable[(s32)(y / x * 1024 + 0.5f)];
}
return ret;
}
/**
* Compute the angle from (0, 0) to (x, y) as a s16. Given that terrain is in
* the xz-plane, this is commonly called with (z, x) to get a yaw angle.
*/
s16 MathUtil_Atan2s(f32 y, f32 x) {
u16 ret;
if (x >= 0) {
if (y >= 0) {
if (y >= x) {
ret = MathUtil_Atan2Lookup(x, y);
} else {
ret = 0x4000 - MathUtil_Atan2Lookup(y, x);
}
} else {
y = -y;
if (y < x) {
ret = 0x4000 + MathUtil_Atan2Lookup(y, x);
} else {
ret = 0x8000 - MathUtil_Atan2Lookup(x, y);
}
}
} else {
x = -x;
if (y < 0) {
y = -y;
if (y >= x) {
ret = 0x8000 + MathUtil_Atan2Lookup(x, y);
} else {
ret = 0xC000 - MathUtil_Atan2Lookup(y, x);
}
} else {
if (y < x) {
ret = 0xC000 + MathUtil_Atan2Lookup(y, x);
} else {
ret = -MathUtil_Atan2Lookup(x, y);
}
}
}
return ret;
}
/**
* Gets a random 16-bit value determined by the guRandom call.
*/
s32 MathUtil_Random16(void) {
return guRandom() & 0xFFFF; // would prototype this as u16, but doesnt match with other calls.
}
/**
* Gets a random float between 0.0 to 1.0.
*/
f32 MathUtil_Random_ZeroOne(void) {
return MathUtil_Random16() / 65536.0f;
}

13
src/math_util.h Normal file
View File

@ -0,0 +1,13 @@
#ifndef _MATH_UTIL_H_
#define _MATH_UTIL_H_
extern f32 gSineTable[];
extern f32 gCosineTable[0x1000];
extern s16 gArctanTable[0x401];
u16 MathUtil_Atan2Lookup(f32 y, f32 x);
s16 MathUtil_Atan2s(f32 y, f32 x);
s32 MathUtil_Random16(void);
f32 MathUtil_Random_ZeroOne(void);
#endif // _MATH_UTIL_H_

View File

@ -592,4 +592,11 @@ mem_pool_alloc = 0x80002AF8;
mem_pool_free = 0x80002BD0;
Util_DrawMemProfiler = 0x8000310C;
Util_Malloc = 0x80002FDC;
Util_Free = 0x80003004;
Util_Free = 0x80003004;
MathUtil_Atan2Lookup = 0x8000A300;
MathUtil_Atan2s = 0x8000A360;
gArctanTable = 0x8006E7F0;
gSineTable = 0x800697F0;
gCosineTable = 0x8006A7F0;
MathUtil_Random16 = 0x8000A4D4;
MathUtil_Random_ZeroOne = 0x8000A4F8;