From a9867a6060b36979cb452aaeddd4332cc262dd9f Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Thu, 29 Apr 2021 12:18:38 +1000 Subject: [PATCH] Decompile modelRender --- src/include/constants.h | 2 + src/include/lib/model.h | 8 +- src/lib/model.c | 271 +++++++++++----------------------------- 3 files changed, 80 insertions(+), 201 deletions(-) diff --git a/src/include/constants.h b/src/include/constants.h index 7691fecf9..1ea7feb93 100644 --- a/src/include/constants.h +++ b/src/include/constants.h @@ -1762,6 +1762,7 @@ #define MODELNODETYPE_ROOT 0x01 #define MODELNODETYPE_POSITION 0x02 +#define MODELNODETYPE_04 0x04 #define MODELNODETYPE_05 0x05 #define MODELNODETYPE_NEARFAR 0x08 #define MODELNODETYPE_HAT 0x09 @@ -1773,6 +1774,7 @@ #define MODELNODETYPE_0F 0x0f #define MODELNODETYPE_PARTID 0x12 #define MODELNODETYPE_POSITIONHELD 0x15 +#define MODELNODETYPE_16 0x16 #define MODELNODETYPE_HEADSPOT 0x17 #define MODELNODETYPE_DISPLAYLIST 0x18 diff --git a/src/include/lib/model.h b/src/include/lib/model.h index 13eba54e1..c09f50edb 100644 --- a/src/include/lib/model.h +++ b/src/include/lib/model.h @@ -84,11 +84,11 @@ u32 func0001f890(void); u32 func00020248(void); u32 func00020bdc(void); u32 func00020c90(void); -u32 func00020d1c(void); -u32 func00020f30(void); -u32 func0002124c(void); +void func00020d1c(struct modelrenderdata *renderdata, struct model *model, struct modelnode *node); +void func00020f30(struct modelrenderdata *renderdata, struct model *model, struct modelnode *node); +void func0002124c(struct modelrenderdata *renderdata, struct modelnode *node); u32 func000216cc(void); -u32 func0002170c(void); +void func0002170c(struct modelrenderdata *renderdata, struct model *model, struct modelnode *node); void modelRender(struct modelrenderdata *renderdata, struct model *model); u32 func000220fc(void); s32 func000225d4(struct model *model, struct coord *arg1, struct coord *arg2, u32 *arg3); diff --git a/src/lib/model.c b/src/lib/model.c index 6a7387627..16a572466 100644 --- a/src/lib/model.c +++ b/src/lib/model.c @@ -8979,203 +8979,80 @@ glabel var70054454 /* 21ef0: 27bd0110 */ addiu $sp,$sp,0x110 ); -GLOBAL_ASM( -glabel modelRender -.late_rodata -glabel var70054458 -.word modelRender+0x1a8 -glabel var7005445c -.word modelRender+0x1a8 -glabel var70054460 -.word modelRender+0x1a8 -glabel var70054464 -.word modelRender+0x164 -glabel var70054468 -.word modelRender+0x1a8 -glabel var7005446c -.word modelRender+0x1a8 -glabel var70054470 -.word modelRender+0x1a8 -glabel var70054474 -.word modelRender+0x084 -glabel var70054478 -.word modelRender+0x138 -glabel var7005447c -.word modelRender+0x1a8 -glabel var70054480 -.word modelRender+0x1a8 -glabel var70054484 -.word modelRender+0x14c -glabel var70054488 -.word modelRender+0x1a8 -glabel var7005448c -.word modelRender+0x1a8 -glabel var70054490 -.word modelRender+0x1a8 -glabel var70054494 -.word modelRender+0x1a8 -glabel var70054498 -.word modelRender+0x1a8 -glabel var7005449c -.word modelRender+0x084 -glabel var700544a0 -.word modelRender+0x1a8 -glabel var700544a4 -.word modelRender+0x1a8 -glabel var700544a8 -.word modelRender+0x1a8 -glabel var700544ac -.word modelRender+0x194 -glabel var700544b0 -.word modelRender+0x0fc -glabel var700544b4 -.word modelRender+0x17c -.text -/* 21ef4: 27bdffc8 */ addiu $sp,$sp,-56 -/* 21ef8: afbf0024 */ sw $ra,0x24($sp) -/* 21efc: afb30020 */ sw $s3,0x20($sp) -/* 21f00: afb2001c */ sw $s2,0x1c($sp) -/* 21f04: afb10018 */ sw $s1,0x18($sp) -/* 21f08: afb00014 */ sw $s0,0x14($sp) -/* 21f0c: 8cae0008 */ lw $t6,0x8($a1) -/* 21f10: 8c82000c */ lw $v0,0xc($a0) -/* 21f14: 3c18bc00 */ lui $t8,0xbc00 -/* 21f18: 8dd00000 */ lw $s0,0x0($t6) -/* 21f1c: 244f0008 */ addiu $t7,$v0,0x8 -/* 21f20: ac8f000c */ sw $t7,0xc($a0) -/* 21f24: 37180c06 */ ori $t8,$t8,0xc06 -/* 21f28: 00809825 */ or $s3,$a0,$zero -/* 21f2c: ac580000 */ sw $t8,0x0($v0) -/* 21f30: 00a09025 */ or $s2,$a1,$zero -/* 21f34: 8ca4000c */ lw $a0,0xc($a1) -/* 21f38: 0c012d20 */ jal osVirtualToPhysical -/* 21f3c: 00408825 */ or $s1,$v0,$zero -/* 21f40: 12000067 */ beqz $s0,.L000220e0 -/* 21f44: ae220004 */ sw $v0,0x4($s1) -/* 21f48: 96030000 */ lhu $v1,0x0($s0) -.L00021f4c: -/* 21f4c: 307900ff */ andi $t9,$v1,0xff -/* 21f50: 2728ffff */ addiu $t0,$t9,-1 -/* 21f54: 2d010018 */ sltiu $at,$t0,0x18 -/* 21f58: 10200050 */ beqz $at,.L0002209c -/* 21f5c: 03201825 */ or $v1,$t9,$zero -/* 21f60: 00084080 */ sll $t0,$t0,0x2 -/* 21f64: 3c017005 */ lui $at,%hi(var70054458) -/* 21f68: 00280821 */ addu $at,$at,$t0 -/* 21f6c: 8c284458 */ lw $t0,%lo(var70054458)($at) -/* 21f70: 01000008 */ jr $t0 -/* 21f74: 00000000 */ nop -/* 21f78: 8e110004 */ lw $s1,0x4($s0) -/* 21f7c: afa3002c */ sw $v1,0x2c($sp) -/* 21f80: 02402025 */ or $a0,$s2,$zero -/* 21f84: 0c006a87 */ jal modelGetNodeRwData -/* 21f88: 02002825 */ or $a1,$s0,$zero -/* 21f8c: 8fa3002c */ lw $v1,0x2c($sp) -/* 21f90: 24010008 */ addiu $at,$zero,0x8 -/* 21f94: 10610005 */ beq $v1,$at,.L00021fac -/* 21f98: 24010012 */ addiu $at,$zero,0x12 -/* 21f9c: 5061000c */ beql $v1,$at,.L00021fd0 -/* 21fa0: 8c4b0000 */ lw $t3,0x0($v0) -/* 21fa4: 10000010 */ b .L00021fe8 -/* 21fa8: 00000000 */ nop -.L00021fac: -/* 21fac: 8c490000 */ lw $t1,0x0($v0) -/* 21fb0: 11200004 */ beqz $t1,.L00021fc4 -/* 21fb4: 00000000 */ nop -/* 21fb8: 8e2a0008 */ lw $t2,0x8($s1) -/* 21fbc: 1000000a */ b .L00021fe8 -/* 21fc0: ae0a0014 */ sw $t2,0x14($s0) -.L00021fc4: -/* 21fc4: 10000008 */ b .L00021fe8 -/* 21fc8: ae000014 */ sw $zero,0x14($s0) -/* 21fcc: 8c4b0000 */ lw $t3,0x0($v0) -.L00021fd0: -/* 21fd0: 51600005 */ beqzl $t3,.L00021fe8 -/* 21fd4: ae000014 */ sw $zero,0x14($s0) -/* 21fd8: 8e2c0000 */ lw $t4,0x0($s1) -/* 21fdc: 10000002 */ b .L00021fe8 -/* 21fe0: ae0c0014 */ sw $t4,0x14($s0) -/* 21fe4: ae000014 */ sw $zero,0x14($s0) -.L00021fe8: -/* 21fe8: 1000002d */ b .L000220a0 -/* 21fec: 8e020014 */ lw $v0,0x14($s0) -/* 21ff0: 02402025 */ or $a0,$s2,$zero -/* 21ff4: 0c006a87 */ jal modelGetNodeRwData -/* 21ff8: 02002825 */ or $a1,$s0,$zero -/* 21ffc: 8c440000 */ lw $a0,0x0($v0) -/* 22000: 10800008 */ beqz $a0,.L00022024 -/* 22004: 00000000 */ nop -/* 22008: 8c830000 */ lw $v1,0x0($a0) -/* 2200c: 10600005 */ beqz $v1,.L00022024 -/* 22010: ae030014 */ sw $v1,0x14($s0) -/* 22014: ac700008 */ sw $s0,0x8($v1) -.L00022018: -/* 22018: 8c63000c */ lw $v1,0xc($v1) -/* 2201c: 5460fffe */ bnezl $v1,.L00022018 -/* 22020: ac700008 */ sw $s0,0x8($v1) -.L00022024: -/* 22024: 1000001e */ b .L000220a0 -/* 22028: 8e020014 */ lw $v0,0x14($s0) -/* 2202c: 02402025 */ or $a0,$s2,$zero -/* 22030: 0c007249 */ jal func0001c924 -/* 22034: 02002825 */ or $a1,$s0,$zero -/* 22038: 10000019 */ b .L000220a0 -/* 2203c: 8e020014 */ lw $v0,0x14($s0) -/* 22040: 02602025 */ or $a0,$s3,$zero -/* 22044: 02402825 */ or $a1,$s2,$zero -/* 22048: 0c0085c3 */ jal func0002170c -/* 2204c: 02003025 */ or $a2,$s0,$zero -/* 22050: 10000013 */ b .L000220a0 -/* 22054: 8e020014 */ lw $v0,0x14($s0) -/* 22058: 02602025 */ or $a0,$s3,$zero -/* 2205c: 02402825 */ or $a1,$s2,$zero -/* 22060: 0c008347 */ jal func00020d1c -/* 22064: 02003025 */ or $a2,$s0,$zero -/* 22068: 1000000d */ b .L000220a0 -/* 2206c: 8e020014 */ lw $v0,0x14($s0) -/* 22070: 02602025 */ or $a0,$s3,$zero -/* 22074: 02402825 */ or $a1,$s2,$zero -/* 22078: 0c0083cc */ jal func00020f30 -/* 2207c: 02003025 */ or $a2,$s0,$zero -/* 22080: 10000007 */ b .L000220a0 -/* 22084: 8e020014 */ lw $v0,0x14($s0) -/* 22088: 02602025 */ or $a0,$s3,$zero -/* 2208c: 0c008493 */ jal func0002124c -/* 22090: 02002825 */ or $a1,$s0,$zero -/* 22094: 10000002 */ b .L000220a0 -/* 22098: 8e020014 */ lw $v0,0x14($s0) -.L0002209c: -/* 2209c: 8e020014 */ lw $v0,0x14($s0) -.L000220a0: -/* 220a0: 10400003 */ beqz $v0,.L000220b0 -/* 220a4: 00000000 */ nop -/* 220a8: 1000000b */ b .L000220d8 -/* 220ac: 00408025 */ or $s0,$v0,$zero -.L000220b0: -/* 220b0: 12000009 */ beqz $s0,.L000220d8 -/* 220b4: 00000000 */ nop -/* 220b8: 8e02000c */ lw $v0,0xc($s0) -.L000220bc: -/* 220bc: 50400004 */ beqzl $v0,.L000220d0 -/* 220c0: 8e100008 */ lw $s0,0x8($s0) -/* 220c4: 10000004 */ b .L000220d8 -/* 220c8: 00408025 */ or $s0,$v0,$zero -/* 220cc: 8e100008 */ lw $s0,0x8($s0) -.L000220d0: -/* 220d0: 5600fffa */ bnezl $s0,.L000220bc -/* 220d4: 8e02000c */ lw $v0,0xc($s0) -.L000220d8: -/* 220d8: 5600ff9c */ bnezl $s0,.L00021f4c -/* 220dc: 96030000 */ lhu $v1,0x0($s0) -.L000220e0: -/* 220e0: 8fbf0024 */ lw $ra,0x24($sp) -/* 220e4: 8fb00014 */ lw $s0,0x14($sp) -/* 220e8: 8fb10018 */ lw $s1,0x18($sp) -/* 220ec: 8fb2001c */ lw $s2,0x1c($sp) -/* 220f0: 8fb30020 */ lw $s3,0x20($sp) -/* 220f4: 03e00008 */ jr $ra -/* 220f8: 27bd0038 */ addiu $sp,$sp,0x38 -); +void modelRender(struct modelrenderdata *renderdata, struct model *model) +{ + union modelrodata *rodata; + union modelrwdata *rwdata; + u32 type; + struct modelnode *node = model->filedata->rootnode; + + gSPSegment(renderdata->gdl++, 0x03, osVirtualToPhysical(model->matrices)); + + while (node) { + type = node->type & 0xff; + + switch (type) { + case MODELNODETYPE_NEARFAR: + case MODELNODETYPE_PARTID: + rodata = node->rodata; + rwdata = modelGetNodeRwData(model, node); + + switch (type) { + case MODELNODETYPE_NEARFAR: + node->child = rwdata->nearfar.visible ? rodata->nearfar.target : NULL; + break; + case MODELNODETYPE_PARTID: + node->child = rwdata->partid.visible.u32 ? rodata->partid.target : NULL; + break; + } + break; + case MODELNODETYPE_HEADSPOT: + rwdata = modelGetNodeRwData(model, node); + + if (rwdata->headspot.modelfiledata) { + struct modelnode *loopnode = rwdata->headspot.modelfiledata->rootnode; + node->child = loopnode; + + while (loopnode) { + loopnode->parent = node; + loopnode = loopnode->next; + } + } + break; + case MODELNODETYPE_HAT: + func0001c924(model, node); + break; + case MODELNODETYPE_GUNFIRE: + func0002170c(renderdata, model, node); + break; + case MODELNODETYPE_04: + func00020d1c(renderdata, model, node); + break; + case MODELNODETYPE_DISPLAYLIST: + func00020f30(renderdata, model, node); + break; + case MODELNODETYPE_16: + func0002124c(renderdata, node); + break; + case MODELNODETYPE_ROOT: + default: + break; + } + + if (node->child) { + node = node->child; + } else { + while (node) { + if (node->next) { + node = node->next; + break; + } + + node = node->parent; + } + } + } +} GLOBAL_ASM( glabel func000220fc