diff --git a/src/game/game_02cde0.c b/src/game/game_02cde0.c index fda54a2bc..f9ede2eea 100644 --- a/src/game/game_02cde0.c +++ b/src/game/game_02cde0.c @@ -224,7 +224,7 @@ glabel var7f1a8a84 /* f02cf2c: ac82000c */ sw $v0,0xc($a0) /* f02cf30: afa30050 */ sw $v1,0x50($sp) .L0f02cf34: -/* f02cf34: 0c008b49 */ jal func00022d24 +/* f02cf34: 0c008b49 */ jal modelCalculateRwDataLen /* f02cf38: 8fa40050 */ lw $a0,0x50($sp) /* f02cf3c: 8fa9001c */ lw $t1,0x1c($sp) /* f02cf40: 8fac0050 */ lw $t4,0x50($sp) @@ -314,7 +314,7 @@ glabel var7f1a8a84 /* f02d088: 00402025 */ or $a0,$v0,$zero /* f02d08c: afa40054 */ sw $a0,0x54($sp) .L0f02d090: -/* f02d090: 0c008b49 */ jal func00022d24 +/* f02d090: 0c008b49 */ jal modelCalculateRwDataLen /* f02d094: 8fa40054 */ lw $a0,0x54($sp) /* f02d098: 8fab0050 */ lw $t3,0x50($sp) /* f02d09c: 8fac0054 */ lw $t4,0x54($sp) diff --git a/src/game/game_091e10.c b/src/game/game_091e10.c index 265f8f15e..3f6bb43b8 100644 --- a/src/game/game_091e10.c +++ b/src/game/game_091e10.c @@ -202,7 +202,7 @@ bool propLoad(s32 propnum) { if (g_ModelStates[propnum].filedata == NULL) { g_ModelStates[propnum].filedata = fileLoad(g_ModelStates[propnum].fileid); - func00022d24(g_ModelStates[propnum].filedata); + modelCalculateRwDataLen(g_ModelStates[propnum].filedata); return true; } diff --git a/src/game/game_097ba0.c b/src/game/game_097ba0.c index 4f2fb9e91..75b6e4bba 100644 --- a/src/game/game_097ba0.c +++ b/src/game/game_097ba0.c @@ -10134,7 +10134,7 @@ glabel func0f09e144 /* f09e404: 964415b2 */ lhu $a0,0x15b2($s2) /* f09e408: 0fc59ca0 */ jal fileGetSize /* f09e40c: 964415b2 */ lhu $a0,0x15b2($s2) -/* f09e410: 0c008b49 */ jal func00022d24 +/* f09e410: 0c008b49 */ jal modelCalculateRwDataLen /* f09e414: 02202025 */ or $a0,$s1,$zero /* f09e418: 0fc5cbd5 */ jal func0f172f54 /* f09e41c: 02002025 */ or $a0,$s0,$zero @@ -10377,7 +10377,7 @@ glabel func0f09e144 /* f09c310: 968415b2 */ lhu $a0,0x15b2($s4) /* f09c314: 0fc586ed */ jal fileGetSize /* f09c318: 968415b2 */ lhu $a0,0x15b2($s4) -/* f09c31c: 0c008f6f */ jal func00022d24 +/* f09c31c: 0c008f6f */ jal modelCalculateRwDataLen /* f09c320: 02602025 */ or $a0,$s3,$zero /* f09c324: 0fc5b6fb */ jal func0f172f54 /* f09c328: 02002025 */ or $a0,$s0,$zero diff --git a/src/game/game_0abe70.c b/src/game/game_0abe70.c index de257d1a7..a7d20e4a9 100644 --- a/src/game/game_0abe70.c +++ b/src/game/game_0abe70.c @@ -3942,7 +3942,7 @@ glabel var7f1acd6c /* f0ae9d8: 8d210000 */ lw $at,0x0($t1) /* f0ae9dc: 24110001 */ addiu $s1,$zero,0x1 /* f0ae9e0: af210000 */ sw $at,0x0($t9) -/* f0ae9e4: 0c008b49 */ jal func00022d24 +/* f0ae9e4: 0c008b49 */ jal modelCalculateRwDataLen /* f0ae9e8: 8fa400f0 */ lw $a0,0xf0($sp) /* f0ae9ec: 27a400c8 */ addiu $a0,$sp,0xc8 /* f0ae9f0: 8fa500f0 */ lw $a1,0xf0($sp) diff --git a/src/game/game_0b69d0.c b/src/game/game_0b69d0.c index fcd009e46..301be0e88 100644 --- a/src/game/game_0b69d0.c +++ b/src/game/game_0b69d0.c @@ -1995,12 +1995,12 @@ glabel var7f1ad5b4 /* f0b8fd4: 39ab003f */ xori $t3,$t5,0x3f /* f0b8fd8: afab00f0 */ sw $t3,0xf0($sp) .L0f0b8fdc: -/* f0b8fdc: 0c008b49 */ jal func00022d24 +/* f0b8fdc: 0c008b49 */ jal modelCalculateRwDataLen /* f0b8fe0: 8fa400fc */ lw $a0,0xfc($sp) /* f0b8fe4: 8fae00f8 */ lw $t6,0xf8($sp) /* f0b8fe8: 51c00004 */ beqzl $t6,.L0f0b8ffc /* f0b8fec: 8fa4005c */ lw $a0,0x5c($sp) -/* f0b8ff0: 0c008b49 */ jal func00022d24 +/* f0b8ff0: 0c008b49 */ jal modelCalculateRwDataLen /* f0b8ff4: 01c02025 */ or $a0,$t6,$zero /* f0b8ff8: 8fa4005c */ lw $a0,0x5c($sp) .L0f0b8ffc: @@ -2300,7 +2300,7 @@ glabel var7f1ad5b4 /* f0b9458: afa200f4 */ sw $v0,0xf4($sp) /* f0b945c: 0fc59ca0 */ jal fileGetSize /* f0b9460: 94640004 */ lhu $a0,0x4($v1) -/* f0b9464: 0c008b49 */ jal func00022d24 +/* f0b9464: 0c008b49 */ jal modelCalculateRwDataLen /* f0b9468: 8fa400f4 */ lw $a0,0xf4($sp) /* f0b946c: 10000004 */ b .L0f0b9480 /* f0b9470: 8faf00dc */ lw $t7,0xdc($sp) @@ -2653,12 +2653,12 @@ glabel var7f1ad5b4 /* f0b6cec: 39ab003f */ xori $t3,$t5,0x3f /* f0b6cf0: afab00f0 */ sw $t3,0xf0($sp) .NB0f0b6cf4: -/* f0b6cf4: 0c008f6f */ jal func00022d24 +/* f0b6cf4: 0c008f6f */ jal modelCalculateRwDataLen /* f0b6cf8: 8fa400fc */ lw $a0,0xfc($sp) /* f0b6cfc: 8fae00f8 */ lw $t6,0xf8($sp) /* f0b6d00: 51c00004 */ beqzl $t6,.NB0f0b6d14 /* f0b6d04: 8fa4005c */ lw $a0,0x5c($sp) -/* f0b6d08: 0c008f6f */ jal func00022d24 +/* f0b6d08: 0c008f6f */ jal modelCalculateRwDataLen /* f0b6d0c: 01c02025 */ or $a0,$t6,$zero /* f0b6d10: 8fa4005c */ lw $a0,0x5c($sp) .NB0f0b6d14: @@ -2942,7 +2942,7 @@ glabel var7f1ad5b4 /* f0b7134: afa200f4 */ sw $v0,0xf4($sp) /* f0b7138: 0fc586ed */ jal fileGetSize /* f0b713c: 94640004 */ lhu $a0,0x4($v1) -/* f0b7140: 0c008f6f */ jal func00022d24 +/* f0b7140: 0c008f6f */ jal modelCalculateRwDataLen /* f0b7144: 8fa400f4 */ lw $a0,0xf4($sp) /* f0b7148: 10000004 */ beqz $zero,.NB0f0b715c /* f0b714c: 8fb900dc */ lw $t9,0xdc($sp) diff --git a/src/game/game_0f09f0.c b/src/game/game_0f09f0.c index a22f39472..196a714e0 100644 --- a/src/game/game_0f09f0.c +++ b/src/game/game_0f09f0.c @@ -5385,7 +5385,7 @@ glabel var7f1b3c40pf /* f0f42a8: 3479003f */ ori $t9,$v1,0x3f /* f0f42ac: 3b29003f */ xori $t1,$t9,0x3f /* f0f42b0: 8e040054 */ lw $a0,0x54($s0) -/* f0f42b4: 0c00898a */ jal func00022d24 +/* f0f42b4: 0c00898a */ jal modelCalculateRwDataLen /* f0f42b8: afa9040c */ sw $t1,0x40c($sp) /* f0f42bc: 8fb80400 */ lw $t8,0x400($sp) /* f0f42c0: 8fa3040c */ lw $v1,0x40c($sp) @@ -5408,7 +5408,7 @@ glabel var7f1b3c40pf /* f0f4300: 8fa50400 */ lw $a1,0x400($sp) /* f0f4304: 0fc0b7b7 */ jal func0f02ddbc /* f0f4308: 8fa60404 */ lw $a2,0x404($sp) -/* f0f430c: 0c00898a */ jal func00022d24 +/* f0f430c: 0c00898a */ jal modelCalculateRwDataLen /* f0f4310: 8e040058 */ lw $a0,0x58($s0) .PF0f0f4314: /* f0f4314: 26040060 */ addiu $a0,$s0,0x60 @@ -5461,7 +5461,7 @@ glabel var7f1b3c40pf /* f0f43cc: ae020054 */ sw $v0,0x54($s0) /* f0f43d0: 0fc5a080 */ jal fileGetSize /* f0f43d4: 8e04000c */ lw $a0,0xc($s0) -/* f0f43d8: 0c00898a */ jal func00022d24 +/* f0f43d8: 0c00898a */ jal modelCalculateRwDataLen /* f0f43dc: 8e040054 */ lw $a0,0x54($s0) /* f0f43e0: 26040060 */ addiu $a0,$s0,0x60 /* f0f43e4: 8e050054 */ lw $a1,0x54($s0) @@ -6987,7 +6987,7 @@ glabel var7f1b2948 /* f0f3b54: 346d003f */ ori $t5,$v1,0x3f /* f0f3b58: 39ab003f */ xori $t3,$t5,0x3f /* f0f3b5c: 8e040054 */ lw $a0,0x54($s0) -/* f0f3b60: 0c008b49 */ jal func00022d24 +/* f0f3b60: 0c008b49 */ jal modelCalculateRwDataLen /* f0f3b64: afab040c */ sw $t3,0x40c($sp) /* f0f3b68: 8fae0400 */ lw $t6,0x400($sp) /* f0f3b6c: 8fa3040c */ lw $v1,0x40c($sp) @@ -7010,7 +7010,7 @@ glabel var7f1b2948 /* f0f3bac: 8fa50400 */ lw $a1,0x400($sp) /* f0f3bb0: 0fc0b76f */ jal func0f02ddbc /* f0f3bb4: 8fa60404 */ lw $a2,0x404($sp) -/* f0f3bb8: 0c008b49 */ jal func00022d24 +/* f0f3bb8: 0c008b49 */ jal modelCalculateRwDataLen /* f0f3bbc: 8e040058 */ lw $a0,0x58($s0) .L0f0f3bc0: /* f0f3bc0: 26040060 */ addiu $a0,$s0,0x60 @@ -7063,7 +7063,7 @@ glabel var7f1b2948 /* f0f3c78: ae020054 */ sw $v0,0x54($s0) /* f0f3c7c: 0fc59ca0 */ jal fileGetSize /* f0f3c80: 8e04000c */ lw $a0,0xc($s0) -/* f0f3c84: 0c008b49 */ jal func00022d24 +/* f0f3c84: 0c008b49 */ jal modelCalculateRwDataLen /* f0f3c88: 8e040054 */ lw $a0,0x54($s0) /* f0f3c8c: 26040060 */ addiu $a0,$s0,0x60 /* f0f3c90: 8e050054 */ lw $a1,0x54($s0) @@ -8596,7 +8596,7 @@ glabel var7f1b2948 /* f0f0698: 346d003f */ ori $t5,$v1,0x3f /* f0f069c: 39ab003f */ xori $t3,$t5,0x3f /* f0f06a0: 8e240054 */ lw $a0,0x54($s1) -/* f0f06a4: 0c008f6f */ jal func00022d24 +/* f0f06a4: 0c008f6f */ jal modelCalculateRwDataLen /* f0f06a8: afab0434 */ sw $t3,0x434($sp) /* f0f06ac: 8fae0428 */ lw $t6,0x428($sp) /* f0f06b0: 8fa30434 */ lw $v1,0x434($sp) @@ -8619,7 +8619,7 @@ glabel var7f1b2948 /* f0f06f0: 8fa50428 */ lw $a1,0x428($sp) /* f0f06f4: 0fc0b5be */ jal func0f02ddbc /* f0f06f8: 8fa6042c */ lw $a2,0x42c($sp) -/* f0f06fc: 0c008f6f */ jal func00022d24 +/* f0f06fc: 0c008f6f */ jal modelCalculateRwDataLen /* f0f0700: 8e240058 */ lw $a0,0x58($s1) .NB0f0f0704: /* f0f0704: 26240060 */ addiu $a0,$s1,0x60 @@ -8672,7 +8672,7 @@ glabel var7f1b2948 /* f0f07bc: ae220054 */ sw $v0,0x54($s1) /* f0f07c0: 0fc586ed */ jal fileGetSize /* f0f07c4: 8e24000c */ lw $a0,0xc($s1) -/* f0f07c8: 0c008f6f */ jal func00022d24 +/* f0f07c8: 0c008f6f */ jal modelCalculateRwDataLen /* f0f07cc: 8e240054 */ lw $a0,0x54($s1) /* f0f07d0: 26240060 */ addiu $a0,$s1,0x60 /* f0f07d4: 8e250054 */ lw $a1,0x54($s1) diff --git a/src/game/title.c b/src/game/title.c index 1a0ec73f7..2273759b1 100644 --- a/src/game/title.c +++ b/src/game/title.c @@ -1519,7 +1519,7 @@ glabel titleInitPdLogo /* f016db8: 356b7800 */ ori $t3,$t3,0x7800 /* f016dbc: 020a8021 */ addu $s0,$s0,$t2 /* f016dc0: 016a9023 */ subu $s2,$t3,$t2 -/* f016dc4: 0c008b49 */ jal func00022d24 +/* f016dc4: 0c008b49 */ jal modelCalculateRwDataLen /* f016dc8: 8e240240 */ lw $a0,0x240($s1) /* f016dcc: 0fc2cca0 */ jal func0f0b3280 /* f016dd0: 8e240240 */ lw $a0,0x240($s1) @@ -1555,7 +1555,7 @@ glabel titleInitPdLogo /* f016e48: 39cf003f */ xori $t7,$t6,0x3f /* f016e4c: 020f8021 */ addu $s0,$s0,$t7 /* f016e50: 024f9023 */ subu $s2,$s2,$t7 -/* f016e54: 0c008b49 */ jal func00022d24 +/* f016e54: 0c008b49 */ jal modelCalculateRwDataLen /* f016e58: 8e240248 */ lw $a0,0x248($s1) /* f016e5c: 0fc2cca0 */ jal func0f0b3280 /* f016e60: 8e240248 */ lw $a0,0x248($s1) @@ -1591,7 +1591,7 @@ glabel titleInitPdLogo /* f016ed8: 3b2c003f */ xori $t4,$t9,0x3f /* f016edc: 020c8021 */ addu $s0,$s0,$t4 /* f016ee0: 024c9023 */ subu $s2,$s2,$t4 -/* f016ee4: 0c008b49 */ jal func00022d24 +/* f016ee4: 0c008b49 */ jal modelCalculateRwDataLen /* f016ee8: 8e240268 */ lw $a0,0x268($s1) /* f016eec: 0fc2cc2b */ jal func0f0b30ac /* f016ef0: 8e240268 */ lw $a0,0x268($s1) @@ -1627,7 +1627,7 @@ glabel titleInitPdLogo /* f016f68: 3948003f */ xori $t0,$t2,0x3f /* f016f6c: 02088021 */ addu $s0,$s0,$t0 /* f016f70: 02489023 */ subu $s2,$s2,$t0 -/* f016f74: 0c008b49 */ jal func00022d24 +/* f016f74: 0c008b49 */ jal modelCalculateRwDataLen /* f016f78: 8e240270 */ lw $a0,0x270($s1) /* f016f7c: 0fc2cc2b */ jal func0f0b30ac /* f016f80: 8e240270 */ lw $a0,0x270($s1) @@ -1707,7 +1707,7 @@ glabel titleInitPdLogo // size = ALIGN64(fileGetSize(g_ModelStates[MODEL_NLOGO].fileid)); // nextaddr += size; // remaining = 0x47800 - size; -// func00022d24(g_ModelStates[MODEL_NLOGO].filedata); +// modelCalculateRwDataLen(g_ModelStates[MODEL_NLOGO].filedata); // // g_TitleModel = func0f0b3280(g_ModelStates[MODEL_NLOGO].filedata); // modelSetScale(g_TitleModel, 1); @@ -1720,7 +1720,7 @@ glabel titleInitPdLogo // size = ALIGN64(fileGetSize(g_ModelStates[MODEL_NLOGO2].fileid)); // nextaddr += size; // remaining -= size; -// func00022d24(g_ModelStates[MODEL_NLOGO2].filedata); +// modelCalculateRwDataLen(g_ModelStates[MODEL_NLOGO2].filedata); // // g_TitleModel2 = func0f0b3280(g_ModelStates[MODEL_NLOGO2].filedata); // modelSetScale(g_TitleModel2, 1); @@ -1733,7 +1733,7 @@ glabel titleInitPdLogo // size = ALIGN64(fileGetSize(g_ModelStates[MODEL_PDTWO].fileid)); // nextaddr += size; // remaining -= size; -// func00022d24(g_ModelStates[MODEL_PDTWO].filedata); +// modelCalculateRwDataLen(g_ModelStates[MODEL_PDTWO].filedata); // // var80062508 = func0f0b30ac(g_ModelStates[MODEL_PDTWO].filedata); // modelSetScale(var80062508, 1); @@ -1746,7 +1746,7 @@ glabel titleInitPdLogo // size = ALIGN64(fileGetSize(g_ModelStates[MODEL_PDTHREE].fileid)); // nextaddr += size; // remaining -= size; -// func00022d24(g_ModelStates[MODEL_PDTHREE].filedata); +// modelCalculateRwDataLen(g_ModelStates[MODEL_PDTHREE].filedata); // // var8006250c = func0f0b30ac(g_ModelStates[MODEL_PDTHREE].filedata); // modelSetScale(var8006250c, 1); @@ -5348,7 +5348,7 @@ void titleInitNintendoLogo(void) g_ModelStates[MODEL_NINTENDOLOGO].filedata = func0f1a7794(g_ModelStates[MODEL_NINTENDOLOGO].fileid, nextaddr, 0x47800, 0); - func00022d24(g_ModelStates[MODEL_NINTENDOLOGO].filedata); + modelCalculateRwDataLen(g_ModelStates[MODEL_NINTENDOLOGO].filedata); g_TitleModel = func0f0b30ac(g_ModelStates[MODEL_NINTENDOLOGO].filedata); modelSetScale(g_TitleModel, 1); modelSetRootPosition(g_TitleModel, &coord); @@ -6029,7 +6029,7 @@ void titleInitRareLogo(void) g_ModelStates[MODEL_RARELOGO].filedata = func0f1a7794(g_ModelStates[MODEL_RARELOGO].fileid, nextaddr, 0x47800, 0); - func00022d24(g_ModelStates[MODEL_RARELOGO].filedata); + modelCalculateRwDataLen(g_ModelStates[MODEL_RARELOGO].filedata); g_TitleModel = func0f0b30ac(g_ModelStates[MODEL_RARELOGO].filedata); modelSetScale(g_TitleModel, 1); modelSetRootPosition(g_TitleModel, &coord); diff --git a/src/include/lib/model.h b/src/include/lib/model.h index 9795f9014..13eba54e1 100644 --- a/src/include/lib/model.h +++ b/src/include/lib/model.h @@ -94,8 +94,8 @@ u32 func000220fc(void); s32 func000225d4(struct model *model, struct coord *arg1, struct coord *arg2, u32 *arg3); void modelPromoteNodeOffsetsToPointers(struct modelnode *node, u32 arg1, u32 arg2); void modelPromoteOffsetsToPointers(struct modelfiledata *filedata, u32 arg1, u32 arg2); -s32 func00022b68(struct modelnode *node); -void func00022d24(struct modelfiledata *filedata); +s32 modelCalculateRwDataIndexes(struct modelnode *node); +void modelCalculateRwDataLen(struct modelfiledata *filedata); void func00022d50(struct model *model, struct modelnode *node); void modelInit(struct model *model, struct modelfiledata *filedata, union modelrwdata **rwdatas, bool resetanim); void animInit(struct anim *anim); diff --git a/src/include/types.h b/src/include/types.h index 7d3898329..40e198b8e 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -648,7 +648,7 @@ struct modelfiledata { s16 numparts; s16 nummatrices; f32 unk10; - u16 unk14; + u16 rwdatalen; // in words void *unk18; }; @@ -684,10 +684,26 @@ struct modelrwdata_root { // type 0x01 u32 unk5c; }; +struct modelrwdata_05 { // type 0x05 + bool unk00; +}; + struct modelrwdata_nearfar { // type 0x08 bool visible; }; +struct modelrwdata_hat { // type 0x09 + bool visible; +}; + +struct modelrwdata_0b { // type 0x0b + u32 unk00; +}; + +struct modelrwdata_gunfire { // type 0x0c + u32 unk00; +}; + struct modelrwdata_partid { // type 0x12 union { u16 u16; @@ -695,26 +711,27 @@ struct modelrwdata_partid { // type 0x12 } visible; }; -struct modelrwdata_05 { - bool unk00; -}; - -struct modelrwdata_hat { - bool visible; -}; - struct modelrwdata_headspot { // type 0x17 struct modelfiledata *modelfiledata; void *rwdatas; }; +struct modelrwdata_displaylist { // type 0x18 + u32 unk00; + u32 unk04; + u32 unk08; +}; + union modelrwdata { struct modelrwdata_root root; + struct modelrwdata_05 type05; struct modelrwdata_nearfar nearfar; struct modelrwdata_hat hat; + struct modelrwdata_0b type0b; + struct modelrwdata_gunfire gunfire; struct modelrwdata_partid partid; - struct modelrwdata_05 type05; struct modelrwdata_headspot headspot; + struct modelrwdata_displaylist displaylist; }; struct waygroup { diff --git a/src/lib/model.c b/src/lib/model.c index 4221726d6..6a7387627 100644 --- a/src/lib/model.c +++ b/src/lib/model.c @@ -9994,183 +9994,89 @@ void modelPromoteOffsetsToPointers(struct modelfiledata *filedata, u32 vma, u32 } } -GLOBAL_ASM( -glabel func00022b68 -.late_rodata -glabel var70054578 -.word func00022b68+0x050 -glabel var7005457c -.word func00022b68+0x148 -glabel var70054580 -.word func00022b68+0x148 -glabel var70054584 -.word func00022b68+0x148 -glabel var70054588 -.word func00022b68+0x148 -glabel var7005458c -.word func00022b68+0x148 -glabel var70054590 -.word func00022b68+0x148 -glabel var70054594 -.word func00022b68+0x06c -glabel var70054598 -.word func00022b68+0x0cc -glabel var7005459c -.word func00022b68+0x148 -glabel var700545a0 -.word func00022b68+0x0f4 -glabel var700545a4 -.word func00022b68+0x110 -glabel var700545a8 -.word func00022b68+0x148 -glabel var700545ac -.word func00022b68+0x148 -glabel var700545b0 -.word func00022b68+0x148 -glabel var700545b4 -.word func00022b68+0x148 -glabel var700545b8 -.word func00022b68+0x148 -glabel var700545bc -.word func00022b68+0x08c -glabel var700545c0 -.word func00022b68+0x148 -glabel var700545c4 -.word func00022b68+0x148 -glabel var700545c8 -.word func00022b68+0x148 -glabel var700545cc -.word func00022b68+0x148 -glabel var700545d0 -.word func00022b68+0x0ac -glabel var700545d4 -.word func00022b68+0x12c -.text -/* 22b68: 27bdffd8 */ addiu $sp,$sp,-40 -/* 22b6c: afb20020 */ sw $s2,0x20($sp) -/* 22b70: afb1001c */ sw $s1,0x1c($sp) -/* 22b74: afb00018 */ sw $s0,0x18($sp) -/* 22b78: 00809025 */ or $s2,$a0,$zero -/* 22b7c: afbf0024 */ sw $ra,0x24($sp) -/* 22b80: 00008825 */ or $s1,$zero,$zero -/* 22b84: 10800060 */ beqz $a0,.L00022d08 -/* 22b88: 00808025 */ or $s0,$a0,$zero -/* 22b8c: 96020000 */ lhu $v0,0x0($s0) -.L00022b90: -/* 22b90: 304e00ff */ andi $t6,$v0,0xff -/* 22b94: 25cfffff */ addiu $t7,$t6,-1 -/* 22b98: 2de10018 */ sltiu $at,$t7,0x18 -/* 22b9c: 10200044 */ beqz $at,.L00022cb0 -/* 22ba0: 000f7880 */ sll $t7,$t7,0x2 -/* 22ba4: 3c017005 */ lui $at,%hi(var70054578) -/* 22ba8: 002f0821 */ addu $at,$at,$t7 -/* 22bac: 8c2f4578 */ lw $t7,%lo(var70054578)($at) -/* 22bb0: 01e00008 */ jr $t7 -/* 22bb4: 00000000 */ nop -/* 22bb8: 8e020004 */ lw $v0,0x4($s0) -/* 22bbc: a4510008 */ sh $s1,0x8($v0) -/* 22bc0: 26310018 */ addiu $s1,$s1,0x18 -/* 22bc4: 3238ffff */ andi $t8,$s1,0xffff -/* 22bc8: 03008825 */ or $s1,$t8,$zero -/* 22bcc: 10000039 */ b .L00022cb4 -/* 22bd0: 8e030014 */ lw $v1,0x14($s0) -/* 22bd4: 8e020004 */ lw $v0,0x4($s0) -/* 22bd8: a451000c */ sh $s1,0xc($v0) -/* 22bdc: 8c430008 */ lw $v1,0x8($v0) -/* 22be0: 26310001 */ addiu $s1,$s1,0x1 -/* 22be4: 3239ffff */ andi $t9,$s1,0xffff -/* 22be8: 03208825 */ or $s1,$t9,$zero -/* 22bec: 10000031 */ b .L00022cb4 -/* 22bf0: ae030014 */ sw $v1,0x14($s0) -/* 22bf4: 8e020004 */ lw $v0,0x4($s0) -/* 22bf8: a4510004 */ sh $s1,0x4($v0) -/* 22bfc: 8c430000 */ lw $v1,0x0($v0) -/* 22c00: 26310001 */ addiu $s1,$s1,0x1 -/* 22c04: 3229ffff */ andi $t1,$s1,0xffff -/* 22c08: 01208825 */ or $s1,$t1,$zero -/* 22c0c: 10000029 */ b .L00022cb4 -/* 22c10: ae030014 */ sw $v1,0x14($s0) -/* 22c14: 8e020004 */ lw $v0,0x4($s0) -/* 22c18: 00001825 */ or $v1,$zero,$zero -/* 22c1c: a4510000 */ sh $s1,0x0($v0) -/* 22c20: 26310002 */ addiu $s1,$s1,0x2 -/* 22c24: 322bffff */ andi $t3,$s1,0xffff -/* 22c28: 01608825 */ or $s1,$t3,$zero -/* 22c2c: 10000021 */ b .L00022cb4 -/* 22c30: ae000014 */ sw $zero,0x14($s0) -/* 22c34: 8e020004 */ lw $v0,0x4($s0) -/* 22c38: 02002025 */ or $a0,$s0,$zero -/* 22c3c: 00002825 */ or $a1,$zero,$zero -/* 22c40: a4510022 */ sh $s1,0x22($v0) -/* 22c44: 26310001 */ addiu $s1,$s1,0x1 -/* 22c48: 322cffff */ andi $t4,$s1,0xffff -/* 22c4c: 0c00721a */ jal func0001c868 -/* 22c50: 01808825 */ or $s1,$t4,$zero -/* 22c54: 10000017 */ b .L00022cb4 -/* 22c58: 8e030014 */ lw $v1,0x14($s0) -/* 22c5c: 8e020004 */ lw $v0,0x4($s0) -/* 22c60: a4510044 */ sh $s1,0x44($v0) -/* 22c64: 26310001 */ addiu $s1,$s1,0x1 -/* 22c68: 322dffff */ andi $t5,$s1,0xffff -/* 22c6c: 01a08825 */ or $s1,$t5,$zero -/* 22c70: 10000010 */ b .L00022cb4 -/* 22c74: 8e030014 */ lw $v1,0x14($s0) -/* 22c78: 8e020004 */ lw $v0,0x4($s0) -/* 22c7c: a4510020 */ sh $s1,0x20($v0) -/* 22c80: 26310001 */ addiu $s1,$s1,0x1 -/* 22c84: 322effff */ andi $t6,$s1,0xffff -/* 22c88: 01c08825 */ or $s1,$t6,$zero -/* 22c8c: 10000009 */ b .L00022cb4 -/* 22c90: 8e030014 */ lw $v1,0x14($s0) -/* 22c94: 8e020004 */ lw $v0,0x4($s0) -/* 22c98: a4510014 */ sh $s1,0x14($v0) -/* 22c9c: 26310003 */ addiu $s1,$s1,0x3 -/* 22ca0: 322fffff */ andi $t7,$s1,0xffff -/* 22ca4: 01e08825 */ or $s1,$t7,$zero -/* 22ca8: 10000002 */ b .L00022cb4 -/* 22cac: 8e030014 */ lw $v1,0x14($s0) -.L00022cb0: -/* 22cb0: 8e030014 */ lw $v1,0x14($s0) -.L00022cb4: -/* 22cb4: 10600003 */ beqz $v1,.L00022cc4 -/* 22cb8: 00000000 */ nop -/* 22cbc: 10000010 */ b .L00022d00 -/* 22cc0: 00608025 */ or $s0,$v1,$zero -.L00022cc4: -/* 22cc4: 1200000e */ beqz $s0,.L00022d00 -/* 22cc8: 00000000 */ nop -/* 22ccc: 8e430008 */ lw $v1,0x8($s2) -.L00022cd0: -/* 22cd0: 56030004 */ bnel $s0,$v1,.L00022ce4 -/* 22cd4: 8e02000c */ lw $v0,0xc($s0) -/* 22cd8: 10000009 */ b .L00022d00 -/* 22cdc: 00008025 */ or $s0,$zero,$zero -/* 22ce0: 8e02000c */ lw $v0,0xc($s0) -.L00022ce4: -/* 22ce4: 50400004 */ beqzl $v0,.L00022cf8 -/* 22ce8: 8e100008 */ lw $s0,0x8($s0) -/* 22cec: 10000004 */ b .L00022d00 -/* 22cf0: 00408025 */ or $s0,$v0,$zero -/* 22cf4: 8e100008 */ lw $s0,0x8($s0) -.L00022cf8: -/* 22cf8: 1600fff5 */ bnez $s0,.L00022cd0 -/* 22cfc: 00000000 */ nop -.L00022d00: -/* 22d00: 5600ffa3 */ bnezl $s0,.L00022b90 -/* 22d04: 96020000 */ lhu $v0,0x0($s0) -.L00022d08: -/* 22d08: 8fbf0024 */ lw $ra,0x24($sp) -/* 22d0c: 02201025 */ or $v0,$s1,$zero -/* 22d10: 8fb1001c */ lw $s1,0x1c($sp) -/* 22d14: 8fb00018 */ lw $s0,0x18($sp) -/* 22d18: 8fb20020 */ lw $s2,0x20($sp) -/* 22d1c: 03e00008 */ jr $ra -/* 22d20: 27bd0028 */ addiu $sp,$sp,0x28 -); - -void func00022d24(struct modelfiledata *filedata) +s32 modelCalculateRwDataIndexes(struct modelnode *basenode) { - filedata->unk14 = func00022b68(filedata->rootnode); + u16 len = 0; + struct modelnode *node = basenode; + union modelrodata *rodata; + + while (node) { + u32 type = node->type & 0xff; + + switch (type) { + case MODELNODETYPE_ROOT: + rodata = node->rodata; + rodata->root.rwdataindex = len; + len += sizeof(struct modelrwdata_root) / 4; + break; + case MODELNODETYPE_NEARFAR: + rodata = node->rodata; + rodata->nearfar.rwdataindex = len; + len += sizeof(struct modelrwdata_nearfar) / 4; + node->child = rodata->nearfar.target; + break; + case MODELNODETYPE_PARTID: + rodata = node->rodata; + rodata->partid.rwdataindex = len; + len += sizeof(struct modelrwdata_partid) / 4; + node->child = rodata->partid.target; + break; + case MODELNODETYPE_HEADSPOT: + rodata = node->rodata; + rodata->headspot.rwdataindex = len; + len += sizeof(struct modelrwdata_headspot) / 4; + node->child = NULL; + break; + case MODELNODETYPE_HAT: + rodata = node->rodata; + rodata->hat.rwdataindex = len; + len += sizeof(struct modelrwdata_hat) / 4; + func0001c868(node, false); + break; + case MODELNODETYPE_0B: + rodata = node->rodata; + rodata->type0b.rwdataindex = len; + len += sizeof(struct modelrwdata_0b) / 4; + break; + case MODELNODETYPE_GUNFIRE: + rodata = node->rodata; + rodata->gunfire.rwdataindex = len; + len += sizeof(struct modelrwdata_gunfire) / 4; + break; + case MODELNODETYPE_DISPLAYLIST: + rodata = node->rodata; + rodata->displaylist.rwdataindex = len; + len += sizeof(struct modelrwdata_displaylist) / 4; + break; + default: + break; + } + + if (node->child) { + node = node->child; + } else { + while (node) { + if (node == basenode->parent) { + node = NULL; + break; + } + + if (node->next) { + node = node->next; + break; + } + + node = node->parent; + } + } + } + + return len; +} + +void modelCalculateRwDataLen(struct modelfiledata *filedata) +{ + filedata->rwdatalen = modelCalculateRwDataIndexes(filedata->rootnode); } GLOBAL_ASM( @@ -10489,7 +10395,7 @@ glabel func00023108 /* 2316c: ac660008 */ sw $a2,0x8($v1) /* 23170: 8cc40014 */ lw $a0,0x14($a2) .L00023174: -/* 23174: 0c008ada */ jal func00022b68 +/* 23174: 0c008ada */ jal modelCalculateRwDataIndexes /* 23178: 00000000 */ nop /* 2317c: 8fa7001c */ lw $a3,0x1c($sp) /* 23180: 84ea0014 */ lh $t2,0x14($a3)