Decompile modelPromoteOffsetsToPointers

This commit is contained in:
Ryan Dwyer 2021-04-28 20:15:00 +10:00
parent fa9faedee1
commit f073f5ef30
5 changed files with 91 additions and 125 deletions

View File

@ -10020,7 +10020,7 @@ glabel func0f09e144
/* f09e250: 02202025 */ or $a0,$s1,$zero
/* f09e254: 02202025 */ or $a0,$s1,$zero
/* f09e258: 3c050500 */ lui $a1,0x500
/* f09e25c: 0c008a89 */ jal func00022a24
/* f09e25c: 0c008a89 */ jal modelPromoteOffsetsToPointers
/* f09e260: 02203025 */ or $a2,$s1,$zero
/* f09e264: 8e4a15b4 */ lw $t2,0x15b4($s2)
/* f09e268: 240e0002 */ addiu $t6,$zero,0x2
@ -10267,7 +10267,7 @@ glabel func0f09e144
/* f09c16c: 02602025 */ or $a0,$s3,$zero
/* f09c170: 02602025 */ or $a0,$s3,$zero
/* f09c174: 3c050500 */ lui $a1,0x500
/* f09c178: 0c008eaf */ jal func00022a24
/* f09c178: 0c008eaf */ jal modelPromoteOffsetsToPointers
/* f09c17c: 02603025 */ or $a2,$s3,$zero
/* f09c180: 8e8f15b4 */ lw $t7,0x15b4($s4)
/* f09c184: 24090002 */ addiu $t1,$zero,0x2

View File

@ -260,7 +260,7 @@ void *func0f1a7794(u16 fileid, u8 *arg1, s32 arg2, s32 arg3)
}
modelPromoteTypeToPointer(filedata);
func00022a24(filedata, 0x5000000, filedata);
modelPromoteOffsetsToPointers(filedata, 0x5000000, (u32) filedata);
func0f1a7560(filedata, fileid, 0x5000000, filedata, arg3, arg1 == NULL);
return filedata;

View File

@ -92,8 +92,8 @@ u32 func0002170c(void);
void modelRender(struct modelrenderdata *renderdata, struct model *model);
u32 func000220fc(void);
s32 func000225d4(struct model *model, struct coord *arg1, struct coord *arg2, u32 *arg3);
u32 func000227a4(void);
void func00022a24(void *arg0, u32 arg1, void *arg2);
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);
void func00022d50(struct model *model, struct modelnode *node);

View File

@ -651,6 +651,7 @@ struct modelfiledata {
s16 nummatrices;
f32 unk10;
u16 unk14;
void *unk18;
};
struct model {

View File

@ -9912,56 +9912,56 @@ glabel var70054514
);
GLOBAL_ASM(
glabel func000227a4
glabel modelPromoteNodeOffsetsToPointers
.late_rodata
glabel var70054518
.word func000227a4+0x09c
.word modelPromoteNodeOffsetsToPointers+0x09c
glabel var7005451c
.word func000227a4+0x0a4
.word modelPromoteNodeOffsetsToPointers+0x0a4
glabel var70054520
.word func000227a4+0x234
.word modelPromoteNodeOffsetsToPointers+0x234
glabel var70054524
.word func000227a4+0x0ac
.word modelPromoteNodeOffsetsToPointers+0x0ac
glabel var70054528
.word func000227a4+0x234
.word modelPromoteNodeOffsetsToPointers+0x234
glabel var7005452c
.word func000227a4+0x234
.word modelPromoteNodeOffsetsToPointers+0x234
glabel var70054530
.word func000227a4+0x234
.word modelPromoteNodeOffsetsToPointers+0x234
glabel var70054534
.word func000227a4+0x0f4
.word modelPromoteNodeOffsetsToPointers+0x0f4
glabel var70054538
.word func000227a4+0x13c
.word modelPromoteNodeOffsetsToPointers+0x13c
glabel var7005453c
.word func000227a4+0x234
.word modelPromoteNodeOffsetsToPointers+0x234
glabel var70054540
.word func000227a4+0x190
.word modelPromoteNodeOffsetsToPointers+0x190
glabel var70054544
.word func000227a4+0x1b4
.word modelPromoteNodeOffsetsToPointers+0x1b4
glabel var70054548
.word func000227a4+0x1d8
.word modelPromoteNodeOffsetsToPointers+0x1d8
glabel var7005454c
.word func000227a4+0x234
.word modelPromoteNodeOffsetsToPointers+0x234
glabel var70054550
.word func000227a4+0x234
.word modelPromoteNodeOffsetsToPointers+0x234
glabel var70054554
.word func000227a4+0x234
.word modelPromoteNodeOffsetsToPointers+0x234
glabel var70054558
.word func000227a4+0x170
.word modelPromoteNodeOffsetsToPointers+0x170
glabel var7005455c
.word func000227a4+0x11c
.word modelPromoteNodeOffsetsToPointers+0x11c
glabel var70054560
.word func000227a4+0x234
.word modelPromoteNodeOffsetsToPointers+0x234
glabel var70054564
.word func000227a4+0x234
.word modelPromoteNodeOffsetsToPointers+0x234
glabel var70054568
.word func000227a4+0x234
.word modelPromoteNodeOffsetsToPointers+0x234
glabel var7005456c
.word func000227a4+0x210
.word modelPromoteNodeOffsetsToPointers+0x210
glabel var70054570
.word func000227a4+0x234
.word modelPromoteNodeOffsetsToPointers+0x234
glabel var70054574
.word func000227a4+0x0d0
.word modelPromoteNodeOffsetsToPointers+0x0d0
.text
/* 227a4: 1080009d */ beqz $a0,.L00022a1c
/* 227a8: 00000000 */ nop
@ -10150,101 +10150,66 @@ glabel var70054574
/* 22a20: 00000000 */ nop
);
GLOBAL_ASM(
glabel func00022a24
/* 22a24: 27bdffe0 */ addiu $sp,$sp,-32
/* 22a28: afbf001c */ sw $ra,0x1c($sp)
/* 22a2c: afb00018 */ sw $s0,0x18($sp)
/* 22a30: 8c820000 */ lw $v0,0x0($a0)
/* 22a34: 00808025 */ or $s0,$a0,$zero
/* 22a38: 00c03825 */ or $a3,$a2,$zero
/* 22a3c: 10400003 */ beqz $v0,.L00022a4c
/* 22a40: 00c57023 */ subu $t6,$a2,$a1
/* 22a44: 004e7821 */ addu $t7,$v0,$t6
/* 22a48: ac8f0000 */ sw $t7,0x0($a0)
.L00022a4c:
/* 22a4c: 8e020008 */ lw $v0,0x8($s0)
/* 22a50: 00e5c023 */ subu $t8,$a3,$a1
/* 22a54: 00e57023 */ subu $t6,$a3,$a1
/* 22a58: 10400002 */ beqz $v0,.L00022a64
/* 22a5c: 0058c821 */ addu $t9,$v0,$t8
/* 22a60: ae190008 */ sw $t9,0x8($s0)
.L00022a64:
/* 22a64: 8e020018 */ lw $v0,0x18($s0)
/* 22a68: 00003025 */ or $a2,$zero,$zero
/* 22a6c: 10400002 */ beqz $v0,.L00022a78
/* 22a70: 004e7821 */ addu $t7,$v0,$t6
/* 22a74: ae0f0018 */ sw $t7,0x18($s0)
.L00022a78:
/* 22a78: 8604000c */ lh $a0,0xc($s0)
/* 22a7c: 00004825 */ or $t1,$zero,$zero
/* 22a80: 5880000e */ blezl $a0,.L00022abc
/* 22a84: 8e040000 */ lw $a0,0x0($s0)
.L00022a88:
/* 22a88: 8e180008 */ lw $t8,0x8($s0)
/* 22a8c: 00e5c823 */ subu $t9,$a3,$a1
/* 22a90: 25290001 */ addiu $t1,$t1,0x1
/* 22a94: 03061821 */ addu $v1,$t8,$a2
/* 22a98: 8c620000 */ lw $v0,0x0($v1)
/* 22a9c: 10400003 */ beqz $v0,.L00022aac
/* 22aa0: 00597021 */ addu $t6,$v0,$t9
/* 22aa4: ac6e0000 */ sw $t6,0x0($v1)
/* 22aa8: 8604000c */ lh $a0,0xc($s0)
.L00022aac:
/* 22aac: 0124082a */ slt $at,$t1,$a0
/* 22ab0: 1420fff5 */ bnez $at,.L00022a88
/* 22ab4: 24c60004 */ addiu $a2,$a2,0x4
/* 22ab8: 8e040000 */ lw $a0,0x0($s0)
.L00022abc:
/* 22abc: 0c0089e9 */ jal func000227a4
/* 22ac0: 00e03025 */ or $a2,$a3,$zero
/* 22ac4: 8604000c */ lh $a0,0xc($s0)
/* 22ac8: 8e0f0008 */ lw $t7,0x8($s0)
/* 22acc: 240d0001 */ addiu $t5,$zero,0x1
/* 22ad0: 0004c080 */ sll $t8,$a0,0x2
/* 22ad4: 1080001f */ beqz $a0,.L00022b54
/* 22ad8: 01f86021 */ addu $t4,$t7,$t8
/* 22adc: 248affff */ addiu $t2,$a0,-1
/* 22ae0: 00005825 */ or $t3,$zero,$zero
.L00022ae4:
/* 22ae4: 19400019 */ blez $t2,.L00022b4c
/* 22ae8: 00004825 */ or $t1,$zero,$zero
/* 22aec: 01801025 */ or $v0,$t4,$zero
.L00022af0:
/* 22af0: 84470002 */ lh $a3,0x2($v0)
/* 22af4: 84480000 */ lh $t0,0x0($v0)
/* 22af8: 00e8082a */ slt $at,$a3,$t0
/* 22afc: 50200010 */ beqzl $at,.L00022b40
/* 22b00: 25290001 */ addiu $t1,$t1,0x1
/* 22b04: a4470000 */ sh $a3,0x0($v0)
/* 22b08: a4480002 */ sh $t0,0x2($v0)
/* 22b0c: 8e0e0008 */ lw $t6,0x8($s0)
/* 22b10: 00093080 */ sll $a2,$t1,0x2
/* 22b14: 01a05825 */ or $t3,$t5,$zero
/* 22b18: 01c61821 */ addu $v1,$t6,$a2
/* 22b1c: 8c6f0004 */ lw $t7,0x4($v1)
/* 22b20: 8c650000 */ lw $a1,0x0($v1)
/* 22b24: ac6f0000 */ sw $t7,0x0($v1)
/* 22b28: 8e180008 */ lw $t8,0x8($s0)
/* 22b2c: 0306c821 */ addu $t9,$t8,$a2
/* 22b30: af250004 */ sw $a1,0x4($t9)
/* 22b34: 860a000c */ lh $t2,0xc($s0)
/* 22b38: 254affff */ addiu $t2,$t2,-1
/* 22b3c: 25290001 */ addiu $t1,$t1,0x1
.L00022b40:
/* 22b40: 012a082a */ slt $at,$t1,$t2
/* 22b44: 1420ffea */ bnez $at,.L00022af0
/* 22b48: 24420002 */ addiu $v0,$v0,0x2
.L00022b4c:
/* 22b4c: 516dffe5 */ beql $t3,$t5,.L00022ae4
/* 22b50: 00005825 */ or $t3,$zero,$zero
.L00022b54:
/* 22b54: 8fbf001c */ lw $ra,0x1c($sp)
/* 22b58: 8fb00018 */ lw $s0,0x18($sp)
/* 22b5c: 27bd0020 */ addiu $sp,$sp,0x20
/* 22b60: 03e00008 */ jr $ra
/* 22b64: 00000000 */ nop
);
/**
* Convert a model file's file-relative offsets to global pointers,
* and sort the part numbers list so they can be looked up using bisection.
*
* Offsets in model files are based from virtual memory address 0x0f000000.
* This vma address is specified as an argument to the function.
*/
void modelPromoteOffsetsToPointers(struct modelfiledata *filedata, u32 vma, u32 fileramaddr)
{
s32 diff = fileramaddr - vma;
s32 i;
s16 *partnums;
if ((u32)filedata->rootnode != 0) {
filedata->rootnode = (struct modelnode *)((u32)filedata->rootnode + diff);
}
if ((u32)filedata->parts != 0) {
filedata->parts = (struct modelnode **)((u32)filedata->parts + diff);
}
if ((u32)filedata->unk18 != 0) {
filedata->unk18 = (void *)((u32)filedata->unk18 + diff);
}
for (i = 0; i < filedata->numparts; i++) {
if (filedata->parts[i]) {
filedata->parts[i] = (struct modelnode *)((u32)filedata->parts[i] + diff);
}
}
modelPromoteNodeOffsetsToPointers(filedata->rootnode, vma, fileramaddr);
// Sort parts by part number so they can be bisected during lookup
partnums = (s16 *)&filedata->parts[filedata->numparts];
if (filedata->numparts) {
struct modelnode *tmpnode;
s16 tmpnum;
bool changed;
do {
changed = false;
for (i = 0; i < filedata->numparts - 1; i++) {
if (partnums[i] > partnums[i + 1]) {
tmpnum = partnums[i];
partnums[i] = partnums[i + 1];
partnums[i + 1] = tmpnum;
tmpnode = filedata->parts[i];
filedata->parts[i] = filedata->parts[i + 1];
filedata->parts[i + 1] = tmpnode;
changed = true;
}
}
} while (changed == true);
}
}
GLOBAL_ASM(
glabel func00022b68