diff --git a/config/GALE01/splits.txt b/config/GALE01/splits.txt index 018f6d769f..c615e11a17 100644 --- a/config/GALE01/splits.txt +++ b/config/GALE01/splits.txt @@ -45,11 +45,15 @@ melee/lb/lbvector.c: .sdata start:0x804D3720 end:0x804D3728 .sdata2 start:0x804D7AA8 end:0x804D7B30 +melee/lb/lb_E9F0.c: + .text start:0x8000E9F0 end:0x8000ED54 + .sdata2 start:0x804D7B30 end:0x804D7B58 + melee/lb/lbshadow.c: - .text start:0x8000E9F0 end:0x8000F9F8 + .text start:0x8000ED54 end:0x8000F9F8 .data start:0x803BA0D8 end:0x803BA150 .sdata start:0x804D3728 end:0x804D3740 - .sdata2 start:0x804D7B30 end:0x804D7BA0 + .sdata2 start:0x804D7B58 end:0x804D7BA0 melee/lb/lbspdisplay.c: .text start:0x8000F9F8 end:0x80014ABC diff --git a/configure.py b/configure.py index f3d3d21644..721a57131d 100755 --- a/configure.py +++ b/configure.py @@ -494,6 +494,7 @@ def MatchingFor(*versions): Object(Matching, "melee/lb/lb_00B0.c"), Object(Matching, "melee/lb/lb_00CE.c"), Object(Matching, "melee/lb/lbvector.c"), + Object(NonMatching, "melee/lb/lb_E9F0.c"), Object(NonMatching, "melee/lb/lbshadow.c"), Object(NonMatching, "melee/lb/lbspdisplay.c"), Object(Matching, "melee/lb/lbarq.c"), diff --git a/src/melee/gr/grbigblueroute.c b/src/melee/gr/grbigblueroute.c index 228ce0b259..c04472b751 100644 --- a/src/melee/gr/grbigblueroute.c +++ b/src/melee/gr/grbigblueroute.c @@ -17,7 +17,7 @@ #include "gr/types.h" #include "if/ifhazard.h" #include "lb/lb_00B0.h" -#include "lb/lbshadow.h" +#include "lb/lb_E9F0.h" #include "lb/lbspdisplay.h" #include "lb/lbvector.h" diff --git a/src/melee/gr/grmutecity.c b/src/melee/gr/grmutecity.c index 8738832865..e479fedefb 100644 --- a/src/melee/gr/grmutecity.c +++ b/src/melee/gr/grmutecity.c @@ -19,8 +19,8 @@ #include "cm/camera.h" #include "if/ifhazard.h" #include "lb/lb_00B0.h" +#include "lb/lb_E9F0.h" #include "lb/lbaudio_ax.h" -#include "lb/lbshadow.h" #include "lb/lbspdisplay.h" #include "lb/lbvector.h" #include "mp/mplib.h" diff --git a/src/melee/gr/ground.c b/src/melee/gr/ground.c index 552088c979..2385b35431 100644 --- a/src/melee/gr/ground.c +++ b/src/melee/gr/ground.c @@ -30,9 +30,9 @@ #include "it/itzako.h" #include "it/types.h" #include "lb/lb_00B0.h" +#include "lb/lb_E9F0.h" #include "lb/lbaudio_ax.h" #include "lb/lbdvd.h" -#include "lb/lbshadow.h" #include "lb/lbspdisplay.h" #include "lb/lbvector.h" #include "mp/mpcoll.h" diff --git a/src/melee/lb/lb_E9F0.c b/src/melee/lb/lb_E9F0.c new file mode 100644 index 0000000000..b90f7a5ac4 --- /dev/null +++ b/src/melee/lb/lb_E9F0.c @@ -0,0 +1,106 @@ +#include "lb_E9F0.h" + +#include + +#include + +/// @todo Emitted only to lay out the .sdata2 literal pool in retail order. +static void sdata2_order(void) +{ + (void) -3.0f; + (void) 4.0f; + (void) 1.0f; + (void) 3.0f; + (void) 2.0f; + (void) 0.5f; + (void) 0.0f; + (void) S32_TO_F32; +} + +/// @todo Case 1 emits its @c fnmsubs after the @c t2 multiply. +void lbShadow_8000E9F0(Vec3* p, HSD_Spline* spline, f32 u) +{ + Vec3* cp; + s16 idx; + f32 t; + f32 orig_u; + + PAD_STACK(8); + + if (u < 0.0F || u > 1.0F) { + return; + } + + orig_u = u; + u *= spline->numcv - 1; + idx = (s16) u; + t = u - (f32) idx; + + switch (spline->type) { + case 0: + if (orig_u == 1.0F) { + idx -= 1; + } + cp = &spline->cv[idx]; + p->x = cp[1].x - cp[0].x; + p->y = cp[1].y - cp[0].y; + p->z = cp[1].z - cp[0].z; + return; + case 1: { + f32 t2, u_1, bez1, bez0, bez2; + cp = &spline->cv[idx * 3]; + t2 = 3.0F * (t * t); + bez1 = 1.0F - (4.0F * t); + u_1 = t - 1.0F; + bez0 = -3.0F * u_1 * u_1; + bez1 = 3.0F * (bez1 + t2); + bez2 = 3.0F * ((2.0F * t) - t2); + p->x = (cp[3].x * t2) + + ((cp[2].x * bez2) + ((cp[0].x * bez0) + (cp[1].x * bez1))); + p->y = (cp[3].y * t2) + + ((cp[2].y * bez2) + ((cp[0].y * bez0) + (cp[1].y * bez1))); + p->z = (cp[3].z * t2) + + ((cp[2].z * bez2) + ((cp[0].z * bez0) + (cp[1].z * bez1))); + return; + } + case 2: { + f32 b3, b2, b1, b0, half, u_1, u2; + cp = &spline->cv[idx]; + u2 = t * t; + u_1 = 1.0F - t; + half = 0.5F; + { + f32 b0_tmp = u_1 * (-half * u_1); + b0 = b0_tmp; + } + b1 = half * ((3.0F * u2) - (4.0F * t)); + b2 = half * (1.0F + ((-3.0F * u2) + (2.0F * t))); + b3 = half * u2; + p->x = (cp[3].x * b3) + + ((cp[2].x * b2) + ((cp[0].x * b0) + (cp[1].x * b1))); + p->y = (cp[3].y * b3) + + ((cp[2].y * b2) + ((cp[0].y * b0) + (cp[1].y * b1))); + p->z = (cp[3].z * b3) + + ((cp[2].z * b2) + ((cp[0].z * b0) + (cp[1].z * b1))); + return; + } + case 3: { + f32 u2 = t * t; + f32 tension = spline->tension; + f32 car1, car0, car3, car2; + cp = &spline->cv[idx]; + car0 = tension * (((-3.0F * u2) + (4.0F * t)) - 1.0F); + car1 = (3.0F * (2.0F - tension) * u2) + (2.0F * (tension - 3.0F) * t); + car2 = tension + ((3.0F * (tension - 2.0F) * u2) + + (2.0F * -((2.0F * tension) - 3.0F) * t)); + car3 = tension * ((3.0F * u2) - (2.0F * t)); + p->x = (cp[3].x * car3) + + ((cp[2].x * car2) + ((cp[0].x * car0) + (cp[1].x * car1))); + p->y = (cp[3].y * car3) + + ((cp[2].y * car2) + ((cp[0].y * car0) + (cp[1].y * car1))); + p->z = (cp[3].z * car3) + + ((cp[2].z * car2) + ((cp[0].z * car0) + (cp[1].z * car1))); + break; + } + } +} diff --git a/src/melee/lb/lb_E9F0.h b/src/melee/lb/lb_E9F0.h new file mode 100644 index 0000000000..40af468180 --- /dev/null +++ b/src/melee/lb/lb_E9F0.h @@ -0,0 +1,10 @@ +#ifndef MELEE_LB_LB_E9F0_H +#define MELEE_LB_LB_E9F0_H + +#include + +#include + +/* 00E9F0 */ void lbShadow_8000E9F0(Vec3*, HSD_Spline*, f32); + +#endif diff --git a/src/melee/lb/lbshadow.c b/src/melee/lb/lbshadow.c index 494f7814db..b9c09d5235 100644 --- a/src/melee/lb/lbshadow.c +++ b/src/melee/lb/lbshadow.c @@ -1,5 +1,7 @@ #include "lbshadow.h" +#include + #include #include #include @@ -22,93 +24,6 @@ #include #include -void lbShadow_8000E9F0(Vec3* p, HSD_Spline* spline, f32 u) -{ - Vec3* cp; - s16 idx; - f32 t; - f32 orig_u; - - PAD_STACK(8); - - if (u < 0.0F || u > 1.0F) { - return; - } - - orig_u = u; - u *= spline->numcv - 1; - idx = (s16) u; - t = u - (f32) idx; - - switch (spline->type) { - case 0: - if (orig_u == 1.0F) { - idx -= 1; - } - cp = &spline->cv[idx]; - p->x = cp[1].x - cp[0].x; - p->y = cp[1].y - cp[0].y; - p->z = cp[1].z - cp[0].z; - return; - case 1: { - f32 t2, u_1, bez1, bez0, bez2; - cp = &spline->cv[idx * 3]; - t2 = 3.0F * (t * t); - bez1 = (-4.0F * t) + 1.0F; - u_1 = t - 1.0F; - bez0 = -3.0F * u_1 * u_1; - bez1 = 3.0F * (bez1 + t2); - bez2 = 3.0F * ((2.0F * t) - t2); - p->x = (cp[3].x * t2) + - ((cp[2].x * bez2) + ((cp[0].x * bez0) + (cp[1].x * bez1))); - p->y = (cp[3].y * t2) + - ((cp[2].y * bez2) + ((cp[0].y * bez0) + (cp[1].y * bez1))); - p->z = (cp[3].z * t2) + - ((cp[2].z * bez2) + ((cp[0].z * bez0) + (cp[1].z * bez1))); - return; - } - case 2: { - f32 b3, b2, b1, b0, half, u_1, u2; - cp = &spline->cv[idx]; - u2 = t * t; - u_1 = 1.0F - t; - half = 0.5F; - { - f32 b0_tmp = u_1 * (-half * u_1); - b0 = b0_tmp; - } - b1 = half * ((3.0F * u2) - (4.0F * t)); - b2 = half * (1.0F + ((-3.0F * u2) + (2.0F * t))); - b3 = half * u2; - p->x = (cp[3].x * b3) + - ((cp[2].x * b2) + ((cp[0].x * b0) + (cp[1].x * b1))); - p->y = (cp[3].y * b3) + - ((cp[2].y * b2) + ((cp[0].y * b0) + (cp[1].y * b1))); - p->z = (cp[3].z * b3) + - ((cp[2].z * b2) + ((cp[0].z * b0) + (cp[1].z * b1))); - return; - } - case 3: { - f32 u2 = t * t; - f32 tension = spline->tension; - f32 car1, car0, car3, car2; - cp = &spline->cv[idx]; - car0 = tension * (((-3.0F * u2) + (4.0F * t)) - 1.0F); - car1 = (3.0F * (2.0F - tension) * u2) + (2.0F * (tension - 3.0F) * t); - car2 = tension + ((3.0F * (tension - 2.0F) * u2) + - (2.0F * -((2.0F * tension) - 3.0F) * t)); - car3 = tension * ((3.0F * u2) - (2.0F * t)); - p->x = (cp[3].x * car3) + - ((cp[2].x * car2) + ((cp[0].x * car0) + (cp[1].x * car1))); - p->y = (cp[3].y * car3) + - ((cp[2].y * car2) + ((cp[0].y * car0) + (cp[1].y * car1))); - p->z = (cp[3].z * car3) + - ((cp[2].z * car2) + ((cp[0].z * car0) + (cp[1].z * car1))); - break; - } - } -} - void lbShadow_8000ED54(LbShadow* lbshadow, HSD_JObj* jobj) { HSD_Shadow* shadow; @@ -303,6 +218,7 @@ static inline f32 lbShadow_Sqrtf(f32 x) return x; } +/// @todo Retail recycles @c lobj's zero into @c fallback's init. void lbShadow_8000F38C(s32 arg0) { HSD_ViewingRect rect; diff --git a/src/melee/lb/lbshadow.h b/src/melee/lb/lbshadow.h index 04a3377e2e..ceac9c3788 100644 --- a/src/melee/lb/lbshadow.h +++ b/src/melee/lb/lbshadow.h @@ -10,7 +10,6 @@ #include #include -/* 00E9F0 */ void lbShadow_8000E9F0(Vec3*, HSD_Spline*, f32); /* 00ED54 */ void lbShadow_8000ED54(LbShadow*, HSD_JObj*); /* 00EE8C */ void lbShadow_8000EE8C(LbShadow*); /* 00EEE0 */ void lbShadow_8000EEE0(HSD_GObj*);