diff --git a/Makefile b/Makefile index ea2cad6b4..1d0e26a5e 100644 --- a/Makefile +++ b/Makefile @@ -77,6 +77,7 @@ $(B_DIR)/lib/ultra/io/pfsgetstatus.o: LOOPUNROLL := $(B_DIR)/lib/ultra/libc/ll.o: MIPSISET := -mips3 -o32 $(B_DIR)/lib/ultra/libc/llcvt.o: MIPSISET := -mips3 -32 +$(B_DIR)/lib/ultra/gu/align.o: OPT_LVL := -O3 $(B_DIR)/lib/ultra/gu/frustum.o: OPT_LVL := -O3 $(B_DIR)/lib/ultra/gu/ortho.o: OPT_LVL := -O3 $(B_DIR)/lib/ultra/gu/scale.o: OPT_LVL := -O3 diff --git a/ld/libfiles.ntsc-beta.inc b/ld/libfiles.ntsc-beta.inc index f7407994d..2e3f57330 100644 --- a/ld/libfiles.ntsc-beta.inc +++ b/ld/libfiles.ntsc-beta.inc @@ -185,7 +185,7 @@ build/ROMID/lib/ultra/io/pfsisplug.o (section); \ build/ROMID/lib/ultra/io/contreaddata.o (section); \ build/ROMID/lib/ultra/io/motor.o (section); \ - build/ROMID/lib/lib_4f9b0.o (section); \ + build/ROMID/lib/ultra/gu/align.o (section); \ build/ROMID/lib/ultra/gu/coss.o (section); \ build/ROMID/lib/ultra/gu/sins.o (section); \ build/ROMID/lib/ultra/gu/ortho.o (section); \ diff --git a/ld/libfiles.ntsc-final.inc b/ld/libfiles.ntsc-final.inc index 216978f23..d8983505f 100644 --- a/ld/libfiles.ntsc-final.inc +++ b/ld/libfiles.ntsc-final.inc @@ -181,7 +181,7 @@ build/ROMID/lib/ultra/io/contquery.o (section); \ build/ROMID/lib/ultra/io/contreaddata.o (section); \ build/ROMID/lib/ultra/io/motor.o (section); \ - build/ROMID/lib/lib_4f9b0.o (section); \ + build/ROMID/lib/ultra/gu/align.o (section); \ build/ROMID/lib/ultra/gu/coss.o (section); \ build/ROMID/lib/ultra/gu/sins.o (section); \ build/ROMID/lib/ultra/gu/ortho.o (section); \ diff --git a/ld/libfiles.pal-final.inc b/ld/libfiles.pal-final.inc index 6790ce371..82341351f 100644 --- a/ld/libfiles.pal-final.inc +++ b/ld/libfiles.pal-final.inc @@ -181,7 +181,7 @@ build/ROMID/lib/ultra/io/contquery.o (section); \ build/ROMID/lib/ultra/io/contreaddata.o (section); \ build/ROMID/lib/ultra/io/motor.o (section); \ - build/ROMID/lib/lib_4f9b0.o (section); \ + build/ROMID/lib/ultra/gu/align.o (section); \ build/ROMID/lib/ultra/gu/coss.o (section); \ build/ROMID/lib/ultra/gu/sins.o (section); \ build/ROMID/lib/ultra/gu/ortho.o (section); \ diff --git a/src/include/PR/gu.h b/src/include/PR/gu.h index 322d2b323..8fb550202 100644 --- a/src/include/PR/gu.h +++ b/src/include/PR/gu.h @@ -23,6 +23,7 @@ void guMtxIdent(Mtx *m); void guMtxIdentF(float mf[4][4]); void guMtxL2F(float mf[4][4], Mtx *m); void guNormalize(float *, float *, float *); +void guAlignF(float mf[4][4], float a, float x, float y, float z); void guLookAt(Mtx *m, float xEye, float yEye, float zEye, float xAt, float yAt, float zAt, diff --git a/src/include/lib/lib_4f9b0.h b/src/include/lib/lib_4f9b0.h deleted file mode 100644 index 2190484b3..000000000 --- a/src/include/lib/lib_4f9b0.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef _IN_LIB_LIB_4F9B0_H -#define _IN_LIB_LIB_4F9B0_H -#include -#include "data.h" -#include "types.h" - -u32 func0004f9b0(void); - -#endif diff --git a/src/lib/lib_16110.c b/src/lib/lib_16110.c index a8eac8550..9dd06e2d4 100644 --- a/src/lib/lib_16110.c +++ b/src/lib/lib_16110.c @@ -1017,7 +1017,7 @@ glabel func00017028 /* 1704c: afa7002c */ sw $a3,0x2c($sp) /* 17050: e7a60010 */ swc1 $f6,0x10($sp) /* 17054: 44056000 */ mfc1 $a1,$f12 -/* 17058: 0c013e6c */ jal func0004f9b0 +/* 17058: 0c013e6c */ jal guAlignF /* 1705c: 00000000 */ nop /* 17060: 8fbf001c */ lw $ra,0x1c($sp) /* 17064: 27bd0020 */ addiu $sp,$sp,0x20 diff --git a/src/lib/lib_4f9b0.c b/src/lib/lib_4f9b0.c deleted file mode 100644 index 154f9b445..000000000 --- a/src/lib/lib_4f9b0.c +++ /dev/null @@ -1,151 +0,0 @@ -#include -#include "constants.h" -#include "bss.h" -#include "lib/lib_16110.h" -#include "data.h" -#include "types.h" - -u32 var8009ca70; - -const u32 var70059fd0[] = {0x3c8efa35}; - -GLOBAL_ASM( -glabel func0004f9b0 -/* 4f9b0: 27bdffd0 */ addiu $sp,$sp,-48 -/* 4f9b4: 3c017006 */ lui $at,%hi(var70059fd0) -/* 4f9b8: c4249fd0 */ lwc1 $f4,%lo(var70059fd0)($at) -/* 4f9bc: afb00018 */ sw $s0,0x18($sp) -/* 4f9c0: 00808025 */ or $s0,$a0,$zero -/* 4f9c4: 3c01800a */ lui $at,%hi(var8009ca70) -/* 4f9c8: afbf001c */ sw $ra,0x1c($sp) -/* 4f9cc: afa50034 */ sw $a1,0x34($sp) -/* 4f9d0: afa60038 */ sw $a2,0x38($sp) -/* 4f9d4: afa7003c */ sw $a3,0x3c($sp) -/* 4f9d8: 27a60040 */ addiu $a2,$sp,0x40 -/* 4f9dc: 27a5003c */ addiu $a1,$sp,0x3c -/* 4f9e0: 27a40038 */ addiu $a0,$sp,0x38 -/* 4f9e4: 0c0011e4 */ jal guNormalize -/* 4f9e8: e424ca70 */ swc1 $f4,%lo(var8009ca70)($at) -/* 4f9ec: 3c01800a */ lui $at,%hi(var8009ca70) -/* 4f9f0: c7ac0034 */ lwc1 $f12,0x34($sp) -/* 4f9f4: c426ca70 */ lwc1 $f6,%lo(var8009ca70)($at) -/* 4f9f8: 46066302 */ mul.s $f12,$f12,$f6 -/* 4f9fc: 0c0068f7 */ jal sinf -/* 4fa00: e7ac0034 */ swc1 $f12,0x34($sp) -/* 4fa04: c7ac0034 */ lwc1 $f12,0x34($sp) -/* 4fa08: 0c0068f4 */ jal cosf -/* 4fa0c: e7a0002c */ swc1 $f0,0x2c($sp) -/* 4fa10: c7ae0038 */ lwc1 $f14,0x38($sp) -/* 4fa14: c7b20040 */ lwc1 $f18,0x40($sp) -/* 4fa18: e7a00028 */ swc1 $f0,0x28($sp) -/* 4fa1c: 460e7202 */ mul.s $f8,$f14,$f14 -/* 4fa20: 00000000 */ nop -/* 4fa24: 46129282 */ mul.s $f10,$f18,$f18 -/* 4fa28: 0c012974 */ jal sqrtf -/* 4fa2c: 460a4300 */ add.s $f12,$f8,$f10 -/* 4fa30: 02002025 */ or $a0,$s0,$zero -/* 4fa34: 0c012918 */ jal guMtxIdentF -/* 4fa38: e7a00024 */ swc1 $f0,0x24($sp) -/* 4fa3c: 44806000 */ mtc1 $zero,$f12 -/* 4fa40: c7ae0024 */ lwc1 $f14,0x24($sp) -/* 4fa44: c7a20028 */ lwc1 $f2,0x28($sp) -/* 4fa48: c7b0002c */ lwc1 $f16,0x2c($sp) -/* 4fa4c: 460c7032 */ c.eq.s $f14,$f12 -/* 4fa50: 3c013f80 */ lui $at,0x3f80 -/* 4fa54: c7a6003c */ lwc1 $f6,0x3c($sp) -/* 4fa58: 45030041 */ bc1tl .L0004fb60 -/* 4fa5c: 8fbf001c */ lw $ra,0x1c($sp) -/* 4fa60: 44812000 */ mtc1 $at,$f4 -/* 4fa64: 46068202 */ mul.s $f8,$f16,$f6 -/* 4fa68: c7aa0038 */ lwc1 $f10,0x38($sp) -/* 4fa6c: c7a60040 */ lwc1 $f6,0x40($sp) -/* 4fa70: 460e2003 */ div.s $f0,$f4,$f14 -/* 4fa74: 460a4102 */ mul.s $f4,$f8,$f10 -/* 4fa78: 46003207 */ neg.s $f8,$f6 -/* 4fa7c: 46024282 */ mul.s $f10,$f8,$f2 -/* 4fa80: 46045181 */ sub.s $f6,$f10,$f4 -/* 4fa84: 46003202 */ mul.s $f8,$f6,$f0 -/* 4fa88: e6080000 */ swc1 $f8,0x0($s0) -/* 4fa8c: c7aa003c */ lwc1 $f10,0x3c($sp) -/* 4fa90: c7a60038 */ lwc1 $f6,0x38($sp) -/* 4fa94: 460a1102 */ mul.s $f4,$f2,$f10 -/* 4fa98: c7aa0040 */ lwc1 $f10,0x40($sp) -/* 4fa9c: 46062202 */ mul.s $f8,$f4,$f6 -/* 4faa0: 00000000 */ nop -/* 4faa4: 46105102 */ mul.s $f4,$f10,$f16 -/* 4faa8: 46082181 */ sub.s $f6,$f4,$f8 -/* 4faac: 46003282 */ mul.s $f10,$f6,$f0 -/* 4fab0: e60a0010 */ swc1 $f10,0x10($s0) -/* 4fab4: 460e8182 */ mul.s $f6,$f16,$f14 -/* 4fab8: c7a40038 */ lwc1 $f4,0x38($sp) -/* 4fabc: e60c0030 */ swc1 $f12,0x30($s0) -/* 4fac0: 460e1282 */ mul.s $f10,$f2,$f14 -/* 4fac4: 46002207 */ neg.s $f8,$f4 -/* 4fac8: e6080020 */ swc1 $f8,0x20($s0) -/* 4facc: e6060004 */ swc1 $f6,0x4($s0) -/* 4fad0: e60a0014 */ swc1 $f10,0x14($s0) -/* 4fad4: c7a4003c */ lwc1 $f4,0x3c($sp) -/* 4fad8: e60c0034 */ swc1 $f12,0x34($s0) -/* 4fadc: 46002207 */ neg.s $f8,$f4 -/* 4fae0: e6080024 */ swc1 $f8,0x24($s0) -/* 4fae4: c7a6003c */ lwc1 $f6,0x3c($sp) -/* 4fae8: c7a40040 */ lwc1 $f4,0x40($sp) -/* 4faec: 46068282 */ mul.s $f10,$f16,$f6 -/* 4faf0: c7a60038 */ lwc1 $f6,0x38($sp) -/* 4faf4: 46045202 */ mul.s $f8,$f10,$f4 -/* 4faf8: 00000000 */ nop -/* 4fafc: 46061282 */ mul.s $f10,$f2,$f6 -/* 4fb00: 46085101 */ sub.s $f4,$f10,$f8 -/* 4fb04: 46008287 */ neg.s $f10,$f16 -/* 4fb08: 46002182 */ mul.s $f6,$f4,$f0 -/* 4fb0c: e6060008 */ swc1 $f6,0x8($s0) -/* 4fb10: c7a80038 */ lwc1 $f8,0x38($sp) -/* 4fb14: c7a6003c */ lwc1 $f6,0x3c($sp) -/* 4fb18: 46085102 */ mul.s $f4,$f10,$f8 -/* 4fb1c: c7a80040 */ lwc1 $f8,0x40($sp) -/* 4fb20: 46061282 */ mul.s $f10,$f2,$f6 -/* 4fb24: 00000000 */ nop -/* 4fb28: 46085182 */ mul.s $f6,$f10,$f8 -/* 4fb2c: 46062281 */ sub.s $f10,$f4,$f6 -/* 4fb30: 46005202 */ mul.s $f8,$f10,$f0 -/* 4fb34: 44815000 */ mtc1 $at,$f10 -/* 4fb38: e6080018 */ swc1 $f8,0x18($s0) -/* 4fb3c: c7a40040 */ lwc1 $f4,0x40($sp) -/* 4fb40: e60c0038 */ swc1 $f12,0x38($s0) -/* 4fb44: e60c000c */ swc1 $f12,0xc($s0) -/* 4fb48: 46002187 */ neg.s $f6,$f4 -/* 4fb4c: e60c001c */ swc1 $f12,0x1c($s0) -/* 4fb50: e6060028 */ swc1 $f6,0x28($s0) -/* 4fb54: e60c002c */ swc1 $f12,0x2c($s0) -/* 4fb58: e60a003c */ swc1 $f10,0x3c($s0) -/* 4fb5c: 8fbf001c */ lw $ra,0x1c($sp) -.L0004fb60: -/* 4fb60: 8fb00018 */ lw $s0,0x18($sp) -/* 4fb64: 27bd0030 */ addiu $sp,$sp,0x30 -/* 4fb68: 03e00008 */ jr $ra -/* 4fb6c: 00000000 */ nop -); - -GLOBAL_ASM( -glabel func0004fb70 -/* 4fb70: 44856000 */ mtc1 $a1,$f12 -/* 4fb74: 44867000 */ mtc1 $a2,$f14 -/* 4fb78: 44878000 */ mtc1 $a3,$f16 -/* 4fb7c: 27bdffa0 */ addiu $sp,$sp,-96 -/* 4fb80: c7a40070 */ lwc1 $f4,0x70($sp) -/* 4fb84: afbf001c */ sw $ra,0x1c($sp) -/* 4fb88: afa40060 */ sw $a0,0x60($sp) -/* 4fb8c: 44056000 */ mfc1 $a1,$f12 -/* 4fb90: 44067000 */ mfc1 $a2,$f14 -/* 4fb94: 44078000 */ mfc1 $a3,$f16 -/* 4fb98: 27a40020 */ addiu $a0,$sp,0x20 -/* 4fb9c: 0c013e6c */ jal func0004f9b0 -/* 4fba0: e7a40010 */ swc1 $f4,0x10($sp) -/* 4fba4: 27a40020 */ addiu $a0,$sp,0x20 -/* 4fba8: 0c0128d8 */ jal guMtxF2L -/* 4fbac: 8fa50060 */ lw $a1,0x60($sp) -/* 4fbb0: 8fbf001c */ lw $ra,0x1c($sp) -/* 4fbb4: 27bd0060 */ addiu $sp,$sp,0x60 -/* 4fbb8: 03e00008 */ jr $ra -/* 4fbbc: 00000000 */ nop -); diff --git a/src/lib/ultra/gu/align.c b/src/lib/ultra/gu/align.c new file mode 100644 index 000000000..ea4194b3a --- /dev/null +++ b/src/lib/ultra/gu/align.c @@ -0,0 +1,54 @@ +#include +#include "constants.h" +#include "bss.h" +#include "lib/lib_16110.h" +#include "data.h" +#include "types.h" + +void guAlignF(float mf[4][4], float a, float x, float y, float z) +{ + static float dtor = 3.1415926f / 180.0f; + float s, c, h, hinv; + + guNormalize(&x, &y, &z); + + a *= dtor; + s = sinf(a); + c = cosf(a); + h = sqrtf(x * x + z * z); + + guMtxIdentF(mf); + + if (h != 0) { + hinv = 1 / h; + + mf[0][0] = (-z*c - s*y*x) * hinv; + mf[1][0] = (z*s - c*y*x) * hinv; + mf[2][0] = -x; + mf[3][0] = 0; + + mf[0][1] = s*h; + mf[1][1] = c*h; + mf[2][1] = -y; + mf[3][1] = 0; + + mf[0][2] = (c*x - s*y*z) * hinv; + mf[1][2] = (-s*x - c*y*z) * hinv; + mf[2][2] = -z; + mf[3][2] = 0; + + mf[0][3] = 0; + mf[1][3] = 0; + mf[2][3] = 0; + mf[3][3] = 1; + } +} + +void guAlign(Mtx *m, float a, float x, float y, float z) +{ + f32 mf[4][4]; + + guAlignF(mf, a, x, y, z); + + guMtxF2L(mf, m); +}