From 23f8ddd5d1c1fe40dca60c7b249c82277b27bc17 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Wed, 27 Apr 2022 21:17:20 +1000 Subject: [PATCH] Decompile room0f15e85c --- src/game/bg.c | 272 ++++++++++----------------------- src/include/game/bg.h | 2 +- src/include/game/game_13b670.h | 2 +- src/include/types.h | 11 +- 4 files changed, 88 insertions(+), 199 deletions(-) diff --git a/src/game/bg.c b/src/game/bg.c index 32379e64d..7b0dca93e 100644 --- a/src/game/bg.c +++ b/src/game/bg.c @@ -10065,197 +10065,81 @@ void bgTickRooms(void) } } -GLOBAL_ASM( -glabel func0f15e85c -/* f15e85c: 27bdff90 */ addiu $sp,$sp,-112 -/* f15e860: afb20020 */ sw $s2,0x20($sp) -/* f15e864: afb1001c */ sw $s1,0x1c($sp) -/* f15e868: afb00018 */ sw $s0,0x18($sp) -/* f15e86c: 00808025 */ or $s0,$a0,$zero -/* f15e870: 00c08825 */ or $s1,$a2,$zero -/* f15e874: 00a09025 */ or $s2,$a1,$zero -/* f15e878: afbf0024 */ sw $ra,0x24($sp) -/* f15e87c: 14c00003 */ bnez $a2,.L0f15e88c -/* f15e880: afa7007c */ sw $a3,0x7c($sp) -/* f15e884: 100000a2 */ b .L0f15eb10 -/* f15e888: 00801025 */ or $v0,$a0,$zero -.L0f15e88c: -/* f15e88c: 92220000 */ lbu $v0,0x0($s1) -/* f15e890: 001218c0 */ sll $v1,$s2,0x3 -/* f15e894: 00721821 */ addu $v1,$v1,$s2 -/* f15e898: 10400006 */ beqz $v0,.L0f15e8b4 -/* f15e89c: 00031880 */ sll $v1,$v1,0x2 -/* f15e8a0: 24010001 */ addiu $at,$zero,0x1 -/* f15e8a4: 5041004f */ beql $v0,$at,.L0f15e9e4 -/* f15e8a8: 8e240008 */ lw $a0,0x8($s1) -/* f15e8ac: 10000098 */ b .L0f15eb10 -/* f15e8b0: 02001025 */ or $v0,$s0,$zero -.L0f15e8b4: -/* f15e8b4: 3c0e800a */ lui $t6,%hi(g_Rooms) -/* f15e8b8: 8dce4928 */ lw $t6,%lo(g_Rooms)($t6) -/* f15e8bc: 00721823 */ subu $v1,$v1,$s2 -/* f15e8c0: 00031880 */ sll $v1,$v1,0x2 -/* f15e8c4: 01c37821 */ addu $t7,$t6,$v1 -/* f15e8c8: 95f80000 */ lhu $t8,0x0($t7) -/* f15e8cc: 02402025 */ or $a0,$s2,$zero -/* f15e8d0: 33190002 */ andi $t9,$t8,0x2 -/* f15e8d4: 53200006 */ beqzl $t9,.L0f15e8f0 -/* f15e8d8: 3c08bc00 */ lui $t0,0xbc00 -/* f15e8dc: 8e25000c */ lw $a1,0xc($s1) -/* f15e8e0: 0fc4ef12 */ jal func0f13bc48 -/* f15e8e4: afa30028 */ sw $v1,0x28($sp) -/* f15e8e8: 8fa30028 */ lw $v1,0x28($sp) -/* f15e8ec: 3c08bc00 */ lui $t0,0xbc00 -.L0f15e8f0: -/* f15e8f0: 35083806 */ ori $t0,$t0,0x3806 -/* f15e8f4: 02001025 */ or $v0,$s0,$zero -/* f15e8f8: ac480000 */ sw $t0,0x0($v0) -/* f15e8fc: 8e29000c */ lw $t1,0xc($s1) -/* f15e900: 3c018000 */ lui $at,0x8000 -/* f15e904: 26100008 */ addiu $s0,$s0,0x8 -/* f15e908: 01215021 */ addu $t2,$t1,$at -/* f15e90c: ac4a0004 */ sw $t2,0x4($v0) -/* f15e910: afa30028 */ sw $v1,0x28($sp) -/* f15e914: 0fc01181 */ jal func0f004604 -/* f15e918: 02402025 */ or $a0,$s2,$zero -/* f15e91c: 3c0b800a */ lui $t3,%hi(g_Rooms) -/* f15e920: 8fa30028 */ lw $v1,0x28($sp) -/* f15e924: 8d6b4928 */ lw $t3,%lo(g_Rooms)($t3) -/* f15e928: 3c068000 */ lui $a2,0x8000 -/* f15e92c: 24070001 */ addiu $a3,$zero,0x1 -/* f15e930: 01632821 */ addu $a1,$t3,$v1 -/* f15e934: 8ca20058 */ lw $v0,0x58($a1) -/* f15e938: 3c0bbc00 */ lui $t3,0xbc00 -/* f15e93c: 356b3406 */ ori $t3,$t3,0x3406 -/* f15e940: 50400012 */ beqzl $v0,.L0f15e98c -/* f15e944: 8e220010 */ lw $v0,0x10($s1) -/* f15e948: 8ca30014 */ lw $v1,0x14($a1) -/* f15e94c: 8e390010 */ lw $t9,0x10($s1) -/* f15e950: 846c0014 */ lh $t4,0x14($v1) -/* f15e954: 8c6e0000 */ lw $t6,0x0($v1) -/* f15e958: 000c6880 */ sll $t5,$t4,0x2 -/* f15e95c: 01ac6823 */ subu $t5,$t5,$t4 -/* f15e960: 000d6880 */ sll $t5,$t5,0x2 -/* f15e964: 01ae2021 */ addu $a0,$t5,$t6 -/* f15e968: 24840007 */ addiu $a0,$a0,0x7 -/* f15e96c: 348f0007 */ ori $t7,$a0,0x7 -/* f15e970: 39f80007 */ xori $t8,$t7,0x7 -/* f15e974: 03384023 */ subu $t0,$t9,$t8 -/* f15e978: 00084883 */ sra $t1,$t0,0x2 -/* f15e97c: 00095080 */ sll $t2,$t1,0x2 -/* f15e980: 10000002 */ b .L0f15e98c -/* f15e984: 004a1021 */ addu $v0,$v0,$t2 -/* f15e988: 8e220010 */ lw $v0,0x10($s1) -.L0f15e98c: -/* f15e98c: 02001825 */ or $v1,$s0,$zero -/* f15e990: 26100008 */ addiu $s0,$s0,0x8 -/* f15e994: 00466021 */ addu $t4,$v0,$a2 -/* f15e998: ac6c0004 */ sw $t4,0x4($v1) -/* f15e99c: ac6b0000 */ sw $t3,0x0($v1) -/* f15e9a0: 02002025 */ or $a0,$s0,$zero -/* f15e9a4: 3c0d0600 */ lui $t5,0x600 -/* f15e9a8: ac8d0000 */ sw $t5,0x0($a0) -/* f15e9ac: 8e2e0008 */ lw $t6,0x8($s1) -/* f15e9b0: 26100008 */ addiu $s0,$s0,0x8 -/* f15e9b4: 02402825 */ or $a1,$s2,$zero -/* f15e9b8: 01c67821 */ addu $t7,$t6,$a2 -/* f15e9bc: ac8f0004 */ sw $t7,0x4($a0) -/* f15e9c0: 8fb8007c */ lw $t8,0x7c($sp) -/* f15e9c4: 02002025 */ or $a0,$s0,$zero -/* f15e9c8: 53000051 */ beqzl $t8,.L0f15eb10 -/* f15e9cc: 02001025 */ or $v0,$s0,$zero -/* f15e9d0: 0fc57a17 */ jal func0f15e85c -/* f15e9d4: 8e260004 */ lw $a2,0x4($s1) -/* f15e9d8: 1000004c */ b .L0f15eb0c -/* f15e9dc: 00408025 */ or $s0,$v0,$zero -/* f15e9e0: 8e240008 */ lw $a0,0x8($s1) -.L0f15e9e4: -/* f15e9e4: 5080004a */ beqzl $a0,.L0f15eb10 -/* f15e9e8: 02001025 */ or $v0,$s0,$zero -/* f15e9ec: afa40058 */ sw $a0,0x58($sp) -/* f15e9f0: 8c880004 */ lw $t0,0x4($a0) -/* f15e9f4: 3c03800a */ lui $v1,%hi(g_Vars+0x284) -/* f15e9f8: 8c63a244 */ lw $v1,%lo(g_Vars+0x284)($v1) -/* f15e9fc: afa80054 */ sw $t0,0x54($sp) -/* f15ea00: 8e22000c */ lw $v0,0xc($s1) -/* f15ea04: 0080c825 */ or $t9,$a0,$zero -/* f15ea08: 00003825 */ or $a3,$zero,$zero -/* f15ea0c: c444000c */ lwc1 $f4,0xc($v0) -/* f15ea10: 02002025 */ or $a0,$s0,$zero -/* f15ea14: 8fa60054 */ lw $a2,0x54($sp) -/* f15ea18: e7a40040 */ swc1 $f4,0x40($sp) -/* f15ea1c: c4460010 */ lwc1 $f6,0x10($v0) -/* f15ea20: 02402825 */ or $a1,$s2,$zero -/* f15ea24: e7a60044 */ swc1 $f6,0x44($sp) -/* f15ea28: c4480014 */ lwc1 $f8,0x14($v0) -/* f15ea2c: e7a80048 */ swc1 $f8,0x48($sp) -/* f15ea30: c4701bb0 */ lwc1 $f16,0x1bb0($v1) -/* f15ea34: c44a0000 */ lwc1 $f10,0x0($v0) -/* f15ea38: 46105481 */ sub.s $f18,$f10,$f16 -/* f15ea3c: e7b20034 */ swc1 $f18,0x34($sp) -/* f15ea40: c4661bb4 */ lwc1 $f6,0x1bb4($v1) -/* f15ea44: c4440004 */ lwc1 $f4,0x4($v0) -/* f15ea48: 46062201 */ sub.s $f8,$f4,$f6 -/* f15ea4c: c7a60034 */ lwc1 $f6,0x34($sp) -/* f15ea50: c7a40040 */ lwc1 $f4,0x40($sp) -/* f15ea54: e7a80038 */ swc1 $f8,0x38($sp) -/* f15ea58: c4701bb8 */ lwc1 $f16,0x1bb8($v1) -/* f15ea5c: c44a0008 */ lwc1 $f10,0x8($v0) -/* f15ea60: 46062202 */ mul.s $f8,$f4,$f6 -/* f15ea64: 46105481 */ sub.s $f18,$f10,$f16 -/* f15ea68: c7b00038 */ lwc1 $f16,0x38($sp) -/* f15ea6c: c7aa0044 */ lwc1 $f10,0x44($sp) -/* f15ea70: e7b2003c */ swc1 $f18,0x3c($sp) -/* f15ea74: 46105482 */ mul.s $f18,$f10,$f16 -/* f15ea78: c7aa0048 */ lwc1 $f10,0x48($sp) -/* f15ea7c: c7a6003c */ lwc1 $f6,0x3c($sp) -/* f15ea80: 460a3402 */ mul.s $f16,$f6,$f10 -/* f15ea84: 46124100 */ add.s $f4,$f8,$f18 -/* f15ea88: 44804000 */ mtc1 $zero,$f8 -/* f15ea8c: 46048000 */ add.s $f0,$f16,$f4 -/* f15ea90: 4608003c */ c.lt.s $f0,$f8 -/* f15ea94: 00000000 */ nop -/* f15ea98: 4500000c */ bc1f .L0f15eacc -/* f15ea9c: 00000000 */ nop -/* f15eaa0: 02002025 */ or $a0,$s0,$zero -/* f15eaa4: 02402825 */ or $a1,$s2,$zero -/* f15eaa8: 0fc57a17 */ jal func0f15e85c -/* f15eaac: 03203025 */ or $a2,$t9,$zero -/* f15eab0: 00402025 */ or $a0,$v0,$zero -/* f15eab4: 02402825 */ or $a1,$s2,$zero -/* f15eab8: 8fa60054 */ lw $a2,0x54($sp) -/* f15eabc: 0fc57a17 */ jal func0f15e85c -/* f15eac0: 00003825 */ or $a3,$zero,$zero -/* f15eac4: 10000009 */ b .L0f15eaec -/* f15eac8: 00408025 */ or $s0,$v0,$zero -.L0f15eacc: -/* f15eacc: 0fc57a17 */ jal func0f15e85c -/* f15ead0: 00003825 */ or $a3,$zero,$zero -/* f15ead4: 00402025 */ or $a0,$v0,$zero -/* f15ead8: 02402825 */ or $a1,$s2,$zero -/* f15eadc: 8fa60058 */ lw $a2,0x58($sp) -/* f15eae0: 0fc57a17 */ jal func0f15e85c -/* f15eae4: 00003825 */ or $a3,$zero,$zero -/* f15eae8: 00408025 */ or $s0,$v0,$zero -.L0f15eaec: -/* f15eaec: 8fa9007c */ lw $t1,0x7c($sp) -/* f15eaf0: 02002025 */ or $a0,$s0,$zero -/* f15eaf4: 02402825 */ or $a1,$s2,$zero -/* f15eaf8: 11200004 */ beqz $t1,.L0f15eb0c -/* f15eafc: 24070001 */ addiu $a3,$zero,0x1 -/* f15eb00: 0fc57a17 */ jal func0f15e85c -/* f15eb04: 8e260004 */ lw $a2,0x4($s1) -/* f15eb08: 00408025 */ or $s0,$v0,$zero -.L0f15eb0c: -/* f15eb0c: 02001025 */ or $v0,$s0,$zero -.L0f15eb10: -/* f15eb10: 8fbf0024 */ lw $ra,0x24($sp) -/* f15eb14: 8fb00018 */ lw $s0,0x18($sp) -/* f15eb18: 8fb1001c */ lw $s1,0x1c($sp) -/* f15eb1c: 8fb20020 */ lw $s2,0x20($sp) -/* f15eb20: 03e00008 */ jr $ra -/* f15eb24: 27bd0070 */ addiu $sp,$sp,0x70 -); +Gfx *room0f15e85c(Gfx *gdl, s32 roomnum, struct roomgfxdata18 *arg2, bool arg3) +{ + u32 v0; + + if (arg2 == NULL) { + return gdl; + } + + switch (arg2->type) { + case 0: + if (g_Rooms[roomnum].flags & ROOMFLAG_0002) { + func0f13bc48(roomnum, arg2->vertices); + } + + gSPSegment(gdl++, 0xe, OS_PHYSICAL_TO_K0(arg2->vertices)); + + func0f004604(roomnum); + + v0 = g_Rooms[roomnum].unk58; + + if (v0 != NULL) { + s32 addr = ALIGN8((u32)&g_Rooms[roomnum].gfxdata->vertices[g_Rooms[roomnum].gfxdata->numvertices]); + v0 += (((s32)arg2->colours - addr) >> 2) * 4; + } else { + v0 = (u32)arg2->colours; + } + + gSPSegment(gdl++, 0x0d, OS_PHYSICAL_TO_K0(v0)); + + gSPDisplayList(gdl++, OS_PHYSICAL_TO_K0(arg2->gdl)); + + if (arg3) { + gdl = room0f15e85c(gdl, roomnum, arg2->next, true); + } + break; + case 1: + if (arg2->child != NULL) { + struct roomgfxdata18 *sp58; + struct roomgfxdata18 *sp54; + struct coord *coord; + f32 sum; + f32 sp40[3]; + f32 sp34[3]; + u32 stack; + + sp58 = arg2->child; + sp54 = sp58->next; + coord = arg2->unk0c; + + sp40[0] = coord[1].f[0]; + sp40[1] = coord[1].f[1]; + sp40[2] = coord[1].f[2]; + sp34[0] = coord[0].f[0] - g_Vars.currentplayer->cam_pos.f[0]; + sp34[1] = coord[0].f[1] - g_Vars.currentplayer->cam_pos.f[1]; + sp34[2] = coord[0].f[2] - g_Vars.currentplayer->cam_pos.f[2]; + + sum = sp40[0] * sp34[0] + sp40[1] * sp34[1] + sp40[2] * sp34[2]; + + if (sum < 0.0f) { + gdl = room0f15e85c(gdl, roomnum, sp58, false); + gdl = room0f15e85c(gdl, roomnum, sp54, false); + } else { + gdl = room0f15e85c(gdl, roomnum, sp54, false); + gdl = room0f15e85c(gdl, roomnum, sp58, false); + } + + if (arg3) { + gdl = room0f15e85c(gdl, roomnum, arg2->next, true); + } + } + break; + } + + return gdl; +} /** * Render the opaque layer of the room. @@ -10268,7 +10152,7 @@ Gfx *bgRenderRoomOpaque(Gfx *gdl, s32 roomnum) gdl = room0f166d7c(gdl, roomnum); gdl = func0f001138(gdl, roomnum); - gdl = func0f15e85c(gdl, roomnum, g_Rooms[roomnum].gfxdata->unk08, true); + gdl = room0f15e85c(gdl, roomnum, g_Rooms[roomnum].gfxdata->unk08, true); gdl = func0f001300(gdl); g_Rooms[roomnum].loaded240 = 1; @@ -10328,7 +10212,7 @@ glabel bgRenderRoomAlpha /* f15ec84: 01636021 */ addu $t4,$t3,$v1 /* f15ec88: 8d8d0014 */ lw $t5,0x14($t4) /* f15ec8c: 24070001 */ addiu $a3,$zero,0x1 -/* f15ec90: 0fc57a17 */ jal func0f15e85c +/* f15ec90: 0fc57a17 */ jal room0f15e85c /* f15ec94: 8da6000c */ lw $a2,0xc($t5) /* f15ec98: 3c0f800a */ lui $t7,%hi(g_Rooms) /* f15ec9c: 8fa30018 */ lw $v1,0x18($sp) @@ -10372,7 +10256,7 @@ glabel bgRenderRoomAlpha // } // // gdl = room0f166d7c(gdl, roomnum); -// gdl = func0f15e85c(gdl, roomnum, g_Rooms[roomnum].gfxdata->unk0c, 1); +// gdl = room0f15e85c(gdl, roomnum, g_Rooms[roomnum].gfxdata->unk0c, 1); // // g_Rooms[roomnum].loaded240 = 1; // } else { diff --git a/src/include/game/bg.h b/src/include/game/bg.h index 929248777..2bcb8ecba 100644 --- a/src/include/game/bg.h +++ b/src/include/game/bg.h @@ -59,7 +59,7 @@ void roomUnload(s32 room); void bgUnloadAllRooms(void); void bgGarbageCollectRooms(s32 bytesneeded, bool desparate); void bgTickRooms(void); -Gfx *func0f15e85c(Gfx *gdl, s32 roomnum, struct roomgfxdata18 *arg2, bool arg3); +Gfx *room0f15e85c(Gfx *gdl, s32 roomnum, struct roomgfxdata18 *arg2, bool arg3); Gfx *bgRenderRoomOpaque(Gfx *gdl, s32 roomnum); Gfx *bgRenderRoomAlpha(Gfx *gdl, s32 roomnum); s32 func0f15ecd8(s32 roomnum, void *allocation, Gfx *gdl, s32 arg3, struct gfxvtx *vtx, s32 arg5); diff --git a/src/include/game/game_13b670.h b/src/include/game/game_13b670.h index f3608bdba..52caab866 100644 --- a/src/include/game/game_13b670.h +++ b/src/include/game/game_13b670.h @@ -9,7 +9,7 @@ u32 func0f13b754(void); u32 func0f13b7bc(void); u32 func0f13b8a0(void); u32 func0f13bb5c(void); -u32 func0f13bc48(void); +void func0f13bc48(s32 roomnum, struct gfxvtx *vertices); void func0f13c07c(s32 arg0); void func0f13c2e8(s16 arg0); void func0f13c370(s16 roomnum); diff --git a/src/include/types.h b/src/include/types.h index 0d0d33829..47ca19d98 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -3655,10 +3655,15 @@ struct roomgfxdata18 { u8 type; struct roomgfxdata18 *next; union { - Gfx *gdl; // type 0 - struct roomgfxdata18 *child; // type 1 + struct { // type 0 + Gfx *gdl; + struct gfxvtx *vertices; + }; + struct { // type 1 + struct roomgfxdata18 *child; + struct coord *unk0c; // pointer to 2 coords at least + }; }; - struct gfxvtx *vertices; u32 *colours; };