diff --git a/src/include/lib/lib_04840.h b/src/include/lib/lib_04840.h index d4d390cf5..0e55f3f83 100644 --- a/src/include/lib/lib_04840.h +++ b/src/include/lib/lib_04840.h @@ -3,7 +3,6 @@ #include #include "types.h" -u32 func00004840(void); void func00004a24(f32 *matrix, u16 *arg1, f32 fovy, f32 arg3, f32 arg4, f32 arg5, f32 arg6); #endif diff --git a/src/lib/lib_04840.c b/src/lib/lib_04840.c index 1072a8f22..4956197c9 100644 --- a/src/lib/lib_04840.c +++ b/src/lib/lib_04840.c @@ -13,143 +13,41 @@ #include "lib/lib_4a360.h" #include "types.h" -const u32 var700524b0[] = {0x3c8efa35}; -const u32 var700524b4[] = {0x00000000}; -const u32 var700524b8[] = {0x00000000}; -const u32 var700524bc[] = {0x00000000}; +void guPerspectiveF(float mf[4][4], u16 *perspNorm, float fovy, float aspect, float near, float far, float scale) +{ + float cot; + int i, j; -GLOBAL_ASM( -glabel func00004840 -/* 4840: 27bdffd0 */ addiu $sp,$sp,-48 -/* 4844: 44867000 */ mtc1 $a2,$f14 -/* 4848: afbf0014 */ sw $ra,0x14($sp) -/* 484c: afa50034 */ sw $a1,0x34($sp) -/* 4850: afa7003c */ sw $a3,0x3c($sp) -/* 4854: afa50034 */ sw $a1,0x34($sp) -/* 4858: afa40030 */ sw $a0,0x30($sp) -/* 485c: 0c012918 */ jal guMtxIdentF -/* 4860: e7ae0038 */ swc1 $f14,0x38($sp) -/* 4864: 3c017005 */ lui $at,%hi(var700524b0) -/* 4868: c7ae0038 */ lwc1 $f14,0x38($sp) -/* 486c: c42424b0 */ lwc1 $f4,%lo(var700524b0)($at) -/* 4870: 3c013f00 */ lui $at,0x3f00 -/* 4874: 44813000 */ mtc1 $at,$f6 -/* 4878: 46047382 */ mul.s $f14,$f14,$f4 -/* 487c: 00000000 */ nop -/* 4880: 46067302 */ mul.s $f12,$f14,$f6 -/* 4884: 0c0068f4 */ jal cosf -/* 4888: e7ac001c */ swc1 $f12,0x1c($sp) -/* 488c: c7ac001c */ lwc1 $f12,0x1c($sp) -/* 4890: 0c0068f7 */ jal sinf -/* 4894: e7a00020 */ swc1 $f0,0x20($sp) -/* 4898: c7a80020 */ lwc1 $f8,0x20($sp) -/* 489c: c7aa003c */ lwc1 $f10,0x3c($sp) -/* 48a0: c7ac0040 */ lwc1 $f12,0x40($sp) -/* 48a4: 46004083 */ div.s $f2,$f8,$f0 -/* 48a8: c7b00044 */ lwc1 $f16,0x44($sp) -/* 48ac: 8fa60030 */ lw $a2,0x30($sp) -/* 48b0: 8fa70034 */ lw $a3,0x34($sp) -/* 48b4: 46106480 */ add.s $f18,$f12,$f16 -/* 48b8: 3c01bf80 */ lui $at,0xbf80 -/* 48bc: 44814000 */ mtc1 $at,$f8 -/* 48c0: 46106381 */ sub.s $f14,$f12,$f16 -/* 48c4: 00002825 */ or $a1,$zero,$zero -/* 48c8: e4c8002c */ swc1 $f8,0x2c($a2) -/* 48cc: 44804000 */ mtc1 $zero,$f8 -/* 48d0: 24040004 */ addiu $a0,$zero,0x4 -/* 48d4: e4c8003c */ swc1 $f8,0x3c($a2) -/* 48d8: 460e9183 */ div.s $f6,$f18,$f14 -/* 48dc: e4c20014 */ swc1 $f2,0x14($a2) -/* 48e0: 460a1103 */ div.s $f4,$f2,$f10 -/* 48e4: e4c60028 */ swc1 $f6,0x28($a2) -/* 48e8: 460c6280 */ add.s $f10,$f12,$f12 -/* 48ec: e4c40000 */ swc1 $f4,0x0($a2) -/* 48f0: 46105102 */ mul.s $f4,$f10,$f16 -/* 48f4: 460e2183 */ div.s $f6,$f4,$f14 -/* 48f8: e4c60038 */ swc1 $f6,0x38($a2) -/* 48fc: c7a00048 */ lwc1 $f0,0x48($sp) -.L00004900: -/* 4900: 00001825 */ or $v1,$zero,$zero -/* 4904: 00c01025 */ or $v0,$a2,$zero -/* 4908: c44e0000 */ lwc1 $f14,0x0($v0) -/* 490c: 24630001 */ addiu $v1,$v1,0x1 -/* 4910: 46007402 */ mul.s $f16,$f14,$f0 -/* 4914: 50640008 */ beql $v1,$a0,.L00004938 -/* 4918: 24420004 */ addiu $v0,$v0,0x4 -.L0000491c: -/* 491c: c44e0004 */ lwc1 $f14,0x4($v0) -/* 4920: 24630001 */ addiu $v1,$v1,0x1 -/* 4924: e4500000 */ swc1 $f16,0x0($v0) -/* 4928: 46007402 */ mul.s $f16,$f14,$f0 -/* 492c: 1464fffb */ bne $v1,$a0,.L0000491c -/* 4930: 24420004 */ addiu $v0,$v0,0x4 -/* 4934: 24420004 */ addiu $v0,$v0,0x4 -.L00004938: -/* 4938: e450fffc */ swc1 $f16,-0x4($v0) -/* 493c: 24a50001 */ addiu $a1,$a1,0x1 -/* 4940: 14a4ffef */ bne $a1,$a0,.L00004900 -/* 4944: 24c60010 */ addiu $a2,$a2,0x10 -/* 4948: 10e00032 */ beqz $a3,.L00004a14 -/* 494c: 3c014000 */ lui $at,0x4000 -/* 4950: 44813000 */ mtc1 $at,$f6 -/* 4954: 340effff */ dli $t6,0xffff -/* 4958: 3c014800 */ lui $at,0x4800 -/* 495c: 4606903e */ c.le.s $f18,$f6 -/* 4960: 00000000 */ nop -/* 4964: 45020004 */ bc1fl .L00004978 -/* 4968: 44814000 */ mtc1 $at,$f8 -/* 496c: 10000029 */ b .L00004a14 -/* 4970: a4ee0000 */ sh $t6,0x0($a3) -/* 4974: 44814000 */ mtc1 $at,$f8 -.L00004978: -/* 4978: 24180001 */ addiu $t8,$zero,0x1 -/* 497c: 3c014f00 */ lui $at,0x4f00 -/* 4980: 46124283 */ div.s $f10,$f8,$f18 -/* 4984: 24080001 */ addiu $t0,$zero,0x1 -/* 4988: 444ff800 */ cfc1 $t7,$31 -/* 498c: 44d8f800 */ ctc1 $t8,$31 -/* 4990: 00000000 */ nop -/* 4994: 46005124 */ cvt.w.s $f4,$f10 -/* 4998: 4458f800 */ cfc1 $t8,$31 -/* 499c: 00000000 */ nop -/* 49a0: 33180078 */ andi $t8,$t8,0x78 -/* 49a4: 53000013 */ beqzl $t8,.L000049f4 -/* 49a8: 44182000 */ mfc1 $t8,$f4 -/* 49ac: 44812000 */ mtc1 $at,$f4 -/* 49b0: 24180001 */ addiu $t8,$zero,0x1 -/* 49b4: 46045101 */ sub.s $f4,$f10,$f4 -/* 49b8: 44d8f800 */ ctc1 $t8,$31 -/* 49bc: 00000000 */ nop -/* 49c0: 46002124 */ cvt.w.s $f4,$f4 -/* 49c4: 4458f800 */ cfc1 $t8,$31 -/* 49c8: 00000000 */ nop -/* 49cc: 33180078 */ andi $t8,$t8,0x78 -/* 49d0: 17000005 */ bnez $t8,.L000049e8 -/* 49d4: 00000000 */ nop -/* 49d8: 44182000 */ mfc1 $t8,$f4 -/* 49dc: 3c018000 */ lui $at,0x8000 -/* 49e0: 10000007 */ b .L00004a00 -/* 49e4: 0301c025 */ or $t8,$t8,$at -.L000049e8: -/* 49e8: 10000005 */ b .L00004a00 -/* 49ec: 2418ffff */ addiu $t8,$zero,-1 -/* 49f0: 44182000 */ mfc1 $t8,$f4 -.L000049f4: -/* 49f4: 00000000 */ nop -/* 49f8: 0700fffb */ bltz $t8,.L000049e8 -/* 49fc: 00000000 */ nop -.L00004a00: -/* 4a00: 44cff800 */ ctc1 $t7,$31 -/* 4a04: 3319ffff */ andi $t9,$t8,0xffff -/* 4a08: 1f200002 */ bgtz $t9,.L00004a14 -/* 4a0c: a4f80000 */ sh $t8,0x0($a3) -/* 4a10: a4e80000 */ sh $t0,0x0($a3) -.L00004a14: -/* 4a14: 8fbf0014 */ lw $ra,0x14($sp) -/* 4a18: 27bd0030 */ addiu $sp,$sp,0x30 -/* 4a1c: 03e00008 */ jr $ra -/* 4a20: 00000000 */ nop -); + guMtxIdentF(mf); + + fovy *= 3.1415926f / 180.0f; + cot = cosf(fovy * 0.5f) / sinf(fovy * 0.5f); + + mf[0][0] = cot / aspect; + mf[1][1] = cot; + mf[2][2] = (near + far) / (near - far); + mf[2][3] = -1; + mf[3][2] = (2.0f * near * far) / (near - far); + mf[3][3] = 0; + + for (i = 0; i < 4; i++) { + for (j = 0; j < 4; j++) { + mf[i][j] *= scale; + } + } + + if (perspNorm != (u16 *) NULL) { + if (near + far <= 2.0f) { + *perspNorm = (u16) 0xFFFF; + } else { + *perspNorm = (u16) ((2.0f * 65536.0f) / (near + far)); + + if (*perspNorm <= 0) { + *perspNorm = (u16) 0x0001; + } + } + } +} GLOBAL_ASM( glabel func00004a24 @@ -166,7 +64,7 @@ glabel func00004a24 /* 4a4c: 27a40028 */ addiu $a0,$sp,0x28 /* 4a50: e7a40010 */ swc1 $f4,0x10($sp) /* 4a54: e7a60014 */ swc1 $f6,0x14($sp) -/* 4a58: 0c001210 */ jal func00004840 +/* 4a58: 0c001210 */ jal guPerspectiveF /* 4a5c: e7a80018 */ swc1 $f8,0x18($sp) /* 4a60: 27a40028 */ addiu $a0,$sp,0x28 /* 4a64: 0c0128d8 */ jal guMtxF2L @@ -176,4 +74,4 @@ glabel func00004a24 /* 4a74: 03e00008 */ jr $ra /* 4a78: 00000000 */ nop /* 4a7c: 00000000 */ nop -); \ No newline at end of file +); diff --git a/src/lib/lib_09660.c b/src/lib/lib_09660.c index 137598773..15e9b509b 100644 --- a/src/lib/lib_09660.c +++ b/src/lib/lib_09660.c @@ -1636,7 +1636,7 @@ glabel func0000ab78 /* abb0: 27a40110 */ addiu $a0,$sp,0x110 /* abb4: 27a50046 */ addiu $a1,$sp,0x46 /* abb8: e7a60014 */ swc1 $f6,0x14($sp) -/* abbc: 0c001210 */ jal func00004840 +/* abbc: 0c001210 */ jal guPerspectiveF /* abc0: e7a80018 */ swc1 $f8,0x18($sp) /* abc4: 0fc2d5be */ jal currentPlayerGetMatrix1740 /* abc8: 00000000 */ nop @@ -1718,7 +1718,7 @@ glabel func0000aca4 /* ace8: 27a50086 */ addiu $a1,$sp,0x86 /* acec: e7a80018 */ swc1 $f8,0x18($sp) /* acf0: e7a40010 */ swc1 $f4,0x10($sp) -/* acf4: 0c001210 */ jal func00004840 +/* acf4: 0c001210 */ jal guPerspectiveF /* acf8: e7a60014 */ swc1 $f6,0x14($sp) /* acfc: 27a40044 */ addiu $a0,$sp,0x44 /* ad00: 0c0128d8 */ jal guMtxF2L @@ -1817,7 +1817,7 @@ glabel func0000ad5c /* ae64: 24a52874 */ addiu $a1,$a1,%lo(var80092874) /* ae68: 24842830 */ addiu $a0,$a0,%lo(var80092830) /* ae6c: e7a80018 */ swc1 $f8,0x18($sp) -/* ae70: 0c001210 */ jal func00004840 +/* ae70: 0c001210 */ jal guPerspectiveF /* ae74: e7a60014 */ swc1 $f6,0x14($sp) /* ae78: 3c048009 */ lui $a0,%hi(var80092830) /* ae7c: 3c058009 */ lui $a1,%hi(var80092870) @@ -1943,7 +1943,7 @@ glabel func0000af00 /* b04c: 24a52874 */ addiu $a1,$a1,%lo(var80092874) /* b050: 24842830 */ addiu $a0,$a0,%lo(var80092830) /* b054: e7a80018 */ swc1 $f8,0x18($sp) -/* b058: 0c001210 */ jal func00004840 +/* b058: 0c001210 */ jal guPerspectiveF /* b05c: e7a60014 */ swc1 $f6,0x14($sp) /* b060: 3c048009 */ lui $a0,%hi(var80092830) /* b064: 3c058009 */ lui $a1,%hi(var80092870) @@ -2004,7 +2004,7 @@ glabel func0000b0e8 /* b130: 8fa60084 */ lw $a2,0x84($sp) /* b134: 8fa70088 */ lw $a3,0x88($sp) /* b138: e7a80018 */ swc1 $f8,0x18($sp) -/* b13c: 0c001210 */ jal func00004840 +/* b13c: 0c001210 */ jal guPerspectiveF /* b140: e7a60014 */ swc1 $f6,0x14($sp) /* b144: 27a40040 */ addiu $a0,$sp,0x40 /* b148: 0c0128d8 */ jal guMtxF2L