From 84c58e05baaf8d0acc8101393b8995284d83b625 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Thu, 30 Sep 2021 21:57:23 +1000 Subject: [PATCH] Decompile func0f14f2b4 --- src/game/camdraw.c | 216 +++++++++++++------------------------ src/include/constants.h | 1 + src/include/game/camdraw.h | 2 +- 3 files changed, 78 insertions(+), 141 deletions(-) diff --git a/src/game/camdraw.c b/src/game/camdraw.c index b1381718a..054f66e9e 100644 --- a/src/game/camdraw.c +++ b/src/game/camdraw.c @@ -12,6 +12,7 @@ #include "bss.h" #include "lib/main.h" #include "lib/memory.h" +#include "lib/model.h" #include "lib/lib_126b0.h" #include "lib/rng.h" #include "lib/lib_16110.h" @@ -5039,40 +5040,6 @@ s32 func0f14f05c(s32 index) return var8007f8dc[index].unk074; } -const char var7f1b6df0[] = "camdraw.c"; -const char var7f1b6dfc[] = "Cam_RebuildHead : Slot=%d\n"; -const char var7f1b6e18[] = "Cam -> Cam_ColourHeadOnePart - Remapping %s\n"; -const char var7f1b6e48[] = "Cam_ColourHead : Face Col = %u, Hair Col = %u\n"; -const char var7f1b6e78[] = "FACE"; -const char var7f1b6e80[] = "SIDE"; -const char var7f1b6e88[] = "HAIR"; -const char var7f1b6e90[] = "Cam -> Cam_SquashOnePart - pExtents=%08x, pVcopy=%08x, \n"; -const char var7f1b6ecc[] = "Cam -> Cam_SquashOnePart - Head centre at (%d,%d,%d)\n"; -const char var7f1b6f04[] = "Cam -> Cam_SquashOnePart - Scale Param 1 = %s%s%.3f\n"; -const char var7f1b6f3c[] = ""; -const char var7f1b6f40[] = ""; -const char var7f1b6f44[] = "Cam -> Cam_SquashOnePart - Scale Param 2 = %s%s%.3f\n"; -const char var7f1b6f7c[] = ""; -const char var7f1b6f80[] = ""; -const char var7f1b6f84[] = "Cam -> Cam_SquashOnePart - Scale Param 3 = %s%s%.3f\n"; -const char var7f1b6fbc[] = ""; -const char var7f1b6fc0[] = ""; -const char var7f1b6fc4[] = "Cam -> Cam_SquashOnePart - Scale Param 4 = %s%s%.3f\n"; -const char var7f1b6ffc[] = ""; -const char var7f1b7000[] = ""; -const char var7f1b7004[] = "Cam -> Cam_SquashOnePart - Scale Param 5 = %s%s%.3f\n"; -const char var7f1b703c[] = ""; -const char var7f1b7040[] = ""; -const char var7f1b7044[] = "Cam -> Cam_SquashOnePart - Scale Param 6 = %s%s%.3f\n"; -const char var7f1b707c[] = ""; -const char var7f1b7080[] = ""; -const char var7f1b7084[] = "Cam -> Cam_SquashOnePart - Scale Param 7 = %s%s%.3f\n"; -const char var7f1b70bc[] = ""; -const char var7f1b70c0[] = ""; -const char var7f1b70c4[] = "Cam_DctInitialise_Read -> %x\n"; -const char var7f1b70e4[] = "Cam_DctUnCompressSlot -> %x\n"; -const char var7f1b7104[] = "Cam_LoadFromPakIntoSlot -> Pak=%d, fileGuid=%u, pakGuid=%u, Slot=%d, pS=%x, pE=%x\n"; - Gfx *func0f14f07c(Gfx *gdl, s32 headorbodynum, s32 x1, s32 y1, s32 x2, s32 y2) { struct var800a45a0_484 *thing = &var800a45a0->unk484[headorbodynum]; @@ -5134,112 +5101,81 @@ void func0f14f1d4(s16 *src, s32 len, s32 *dst) } } -GLOBAL_ASM( -glabel func0f14f2b4 -/* f14f2b4: 27bdffa8 */ addiu $sp,$sp,-88 -/* f14f2b8: afb00018 */ sw $s0,0x18($sp) -/* f14f2bc: 00a08025 */ or $s0,$a1,$zero -/* f14f2c0: afbf001c */ sw $ra,0x1c($sp) -/* f14f2c4: afa40058 */ sw $a0,0x58($sp) -/* f14f2c8: afa60060 */ sw $a2,0x60($sp) -/* f14f2cc: 0c006a47 */ jal modelGetPart -/* f14f2d0: 24050190 */ addiu $a1,$zero,0x190 -/* f14f2d4: afa20054 */ sw $v0,0x54($sp) -/* f14f2d8: 8fa40058 */ lw $a0,0x58($sp) -/* f14f2dc: 0c006a47 */ jal modelGetPart -/* f14f2e0: 24050191 */ addiu $a1,$zero,0x191 -/* f14f2e4: 8fa40058 */ lw $a0,0x58($sp) -/* f14f2e8: 24050192 */ addiu $a1,$zero,0x192 -/* f14f2ec: 0c006a47 */ jal modelGetPart -/* f14f2f0: afa20050 */ sw $v0,0x50($sp) -/* f14f2f4: 8fad0060 */ lw $t5,0x60($sp) -/* f14f2f8: 8fa30050 */ lw $v1,0x50($sp) -/* f14f2fc: 00405825 */ or $t3,$v0,$zero -/* f14f300: 11a00002 */ beqz $t5,.L0f14f30c -/* f14f304: afa00048 */ sw $zero,0x48($sp) -/* f14f308: ada00000 */ sw $zero,0x0($t5) -.L0f14f30c: -/* f14f30c: 8fac0054 */ lw $t4,0x54($sp) -/* f14f310: 51800048 */ beqzl $t4,.L0f14f434 -/* f14f314: 8fbf001c */ lw $ra,0x1c($sp) -/* f14f318: 50600046 */ beqzl $v1,.L0f14f434 -/* f14f31c: 8fbf001c */ lw $ra,0x1c($sp) -/* f14f320: 50400044 */ beqzl $v0,.L0f14f434 -/* f14f324: 8fbf001c */ lw $ra,0x1c($sp) -/* f14f328: 8d850004 */ lw $a1,0x4($t4) -/* f14f32c: 8c660004 */ lw $a2,0x4($v1) -/* f14f330: 8d670004 */ lw $a3,0x4($t3) -/* f14f334: 84a80010 */ lh $t0,0x10($a1) -/* f14f338: 84c90010 */ lh $t1,0x10($a2) -/* f14f33c: 84ea0010 */ lh $t2,0x10($a3) -/* f14f340: afa50044 */ sw $a1,0x44($sp) -/* f14f344: 01097021 */ addu $t6,$t0,$t1 -/* f14f348: 01ca1021 */ addu $v0,$t6,$t2 -/* f14f34c: 00022080 */ sll $a0,$v0,0x2 -/* f14f350: 00822023 */ subu $a0,$a0,$v0 -/* f14f354: afa20048 */ sw $v0,0x48($sp) -/* f14f358: 00042080 */ sll $a0,$a0,0x2 -/* f14f35c: afa60040 */ sw $a2,0x40($sp) -/* f14f360: afa7003c */ sw $a3,0x3c($sp) -/* f14f364: afa80038 */ sw $t0,0x38($sp) -/* f14f368: afa90034 */ sw $t1,0x34($sp) -/* f14f36c: 0fc5db69 */ jal align16 -/* f14f370: afaa0030 */ sw $t2,0x30($sp) -/* f14f374: afa2002c */ sw $v0,0x2c($sp) -/* f14f378: 8e040000 */ lw $a0,0x0($s0) -/* f14f37c: 3c067f1b */ lui $a2,%hi(var7f1b6df0) -/* f14f380: 24c66df0 */ addiu $a2,$a2,%lo(var7f1b6df0) -/* f14f384: 14800005 */ bnez $a0,.L0f14f39c -/* f14f388: 2405114d */ addiu $a1,$zero,0x114d -/* f14f38c: 0fc52756 */ jal func0f149d58 -/* f14f390: 00402025 */ or $a0,$v0,$zero -/* f14f394: ae020000 */ sw $v0,0x0($s0) -/* f14f398: 00402025 */ or $a0,$v0,$zero -.L0f14f39c: -/* f14f39c: 8fa60038 */ lw $a2,0x38($sp) -/* f14f3a0: 8faf0044 */ lw $t7,0x44($sp) -/* f14f3a4: 0006c080 */ sll $t8,$a2,0x2 -/* f14f3a8: 0306c023 */ subu $t8,$t8,$a2 -/* f14f3ac: 00183080 */ sll $a2,$t8,0x2 -/* f14f3b0: 8de5000c */ lw $a1,0xc($t7) -/* f14f3b4: 0c012978 */ jal memcpy -/* f14f3b8: afa60024 */ sw $a2,0x24($sp) -/* f14f3bc: 8fa70034 */ lw $a3,0x34($sp) -/* f14f3c0: 8faf0040 */ lw $t7,0x40($sp) -/* f14f3c4: 8e190000 */ lw $t9,0x0($s0) -/* f14f3c8: 0007c080 */ sll $t8,$a3,0x2 -/* f14f3cc: 8fae0024 */ lw $t6,0x24($sp) -/* f14f3d0: 0307c023 */ subu $t8,$t8,$a3 -/* f14f3d4: 00183080 */ sll $a2,$t8,0x2 -/* f14f3d8: 8de5000c */ lw $a1,0xc($t7) -/* f14f3dc: afa60028 */ sw $a2,0x28($sp) -/* f14f3e0: 00c03825 */ or $a3,$a2,$zero -/* f14f3e4: 0c012978 */ jal memcpy -/* f14f3e8: 032e2021 */ addu $a0,$t9,$t6 -/* f14f3ec: 8e190000 */ lw $t9,0x0($s0) -/* f14f3f0: 8fae0024 */ lw $t6,0x24($sp) -/* f14f3f4: 8fa60030 */ lw $a2,0x30($sp) -/* f14f3f8: 8fa70028 */ lw $a3,0x28($sp) -/* f14f3fc: 032e7821 */ addu $t7,$t9,$t6 -/* f14f400: 8fb8003c */ lw $t8,0x3c($sp) -/* f14f404: 0006c880 */ sll $t9,$a2,0x2 -/* f14f408: 0326c823 */ subu $t9,$t9,$a2 -/* f14f40c: 00193080 */ sll $a2,$t9,0x2 -/* f14f410: 01e72021 */ addu $a0,$t7,$a3 -/* f14f414: 0c012978 */ jal memcpy -/* f14f418: 8f05000c */ lw $a1,0xc($t8) -/* f14f41c: 8fae0060 */ lw $t6,0x60($sp) -/* f14f420: 8faf002c */ lw $t7,0x2c($sp) -/* f14f424: 51c00003 */ beqzl $t6,.L0f14f434 -/* f14f428: 8fbf001c */ lw $ra,0x1c($sp) -/* f14f42c: adcf0000 */ sw $t7,0x0($t6) -/* f14f430: 8fbf001c */ lw $ra,0x1c($sp) -.L0f14f434: -/* f14f434: 8fa20048 */ lw $v0,0x48($sp) -/* f14f438: 8fb00018 */ lw $s0,0x18($sp) -/* f14f43c: 03e00008 */ jr $ra -/* f14f440: 27bd0058 */ addiu $sp,$sp,0x58 -); +s32 func0f14f2b4(struct modelfiledata *filedata, struct gfxvtx **dst, u32 *len) +{ + struct modelnode *node1 = modelGetPart(filedata, MODELPART_HEAD_0190); + struct modelnode *node2 = modelGetPart(filedata, MODELPART_HEAD_0191); + struct modelnode *node3 = modelGetPart(filedata, MODELPART_HEAD_0192); + + s32 totalverts = 0; + + if (len != NULL) { + *len = 0; + } + + if (node1 && node2 && node3) { + struct modelrodata_dl *node1rodata = &node1->rodata->dl; + struct modelrodata_dl *node2rodata = &node2->rodata->dl; + struct modelrodata_dl *node3rodata = &node3->rodata->dl; + + s32 node1numverts = node1rodata->numvertices; + s32 node2numverts = node2rodata->numvertices; + s32 node3numverts = node3rodata->numvertices; + + s32 size; + + totalverts = node1numverts + node2numverts + node3numverts; + size = align16(totalverts * sizeof(struct gfxvtx)); + + if (*dst == 0) { + *dst = func0f149d58(size, 4429, "camdraw.c"); + } + + memcpy(*dst, node1rodata->vertices, node1numverts * sizeof(struct gfxvtx)); + memcpy(*dst + node1numverts, node2rodata->vertices, node2numverts * sizeof(struct gfxvtx)); + memcpy(*dst + node1numverts + node2numverts, node3rodata->vertices, node3numverts * sizeof(struct gfxvtx)); + + if (len != NULL) { + *len = size; + } + } + + return totalverts; +} + +const char var7f1b6dfc[] = "Cam_RebuildHead : Slot=%d\n"; +const char var7f1b6e18[] = "Cam -> Cam_ColourHeadOnePart - Remapping %s\n"; +const char var7f1b6e48[] = "Cam_ColourHead : Face Col = %u, Hair Col = %u\n"; +const char var7f1b6e78[] = "FACE"; +const char var7f1b6e80[] = "SIDE"; +const char var7f1b6e88[] = "HAIR"; +const char var7f1b6e90[] = "Cam -> Cam_SquashOnePart - pExtents=%08x, pVcopy=%08x, \n"; +const char var7f1b6ecc[] = "Cam -> Cam_SquashOnePart - Head centre at (%d,%d,%d)\n"; +const char var7f1b6f04[] = "Cam -> Cam_SquashOnePart - Scale Param 1 = %s%s%.3f\n"; +const char var7f1b6f3c[] = ""; +const char var7f1b6f40[] = ""; +const char var7f1b6f44[] = "Cam -> Cam_SquashOnePart - Scale Param 2 = %s%s%.3f\n"; +const char var7f1b6f7c[] = ""; +const char var7f1b6f80[] = ""; +const char var7f1b6f84[] = "Cam -> Cam_SquashOnePart - Scale Param 3 = %s%s%.3f\n"; +const char var7f1b6fbc[] = ""; +const char var7f1b6fc0[] = ""; +const char var7f1b6fc4[] = "Cam -> Cam_SquashOnePart - Scale Param 4 = %s%s%.3f\n"; +const char var7f1b6ffc[] = ""; +const char var7f1b7000[] = ""; +const char var7f1b7004[] = "Cam -> Cam_SquashOnePart - Scale Param 5 = %s%s%.3f\n"; +const char var7f1b703c[] = ""; +const char var7f1b7040[] = ""; +const char var7f1b7044[] = "Cam -> Cam_SquashOnePart - Scale Param 6 = %s%s%.3f\n"; +const char var7f1b707c[] = ""; +const char var7f1b7080[] = ""; +const char var7f1b7084[] = "Cam -> Cam_SquashOnePart - Scale Param 7 = %s%s%.3f\n"; +const char var7f1b70bc[] = ""; +const char var7f1b70c0[] = ""; +const char var7f1b70c4[] = "Cam_DctInitialise_Read -> %x\n"; +const char var7f1b70e4[] = "Cam_DctUnCompressSlot -> %x\n"; +const char var7f1b7104[] = "Cam_LoadFromPakIntoSlot -> Pak=%d, fileGuid=%u, pakGuid=%u, Slot=%d, pS=%x, pE=%x\n"; + void func0f14f444(u32 arg0, u32 arg1, u32 arg2, u32 arg3) { diff --git a/src/include/constants.h b/src/include/constants.h index 03d937ea3..d65c69219 100644 --- a/src/include/constants.h +++ b/src/include/constants.h @@ -2052,6 +2052,7 @@ #define MODELPART_HEAD_HUDPIECE 0x0004 // toggle #define MODELPART_HEAD_0190 0x0190 // dl #define MODELPART_HEAD_0191 0x0191 // dl +#define MODELPART_HEAD_0192 0x0192 // dl #define MODELPART_HOVERBIKE_0064 0x0064 // type19 #define MODELPART_HUDPIECE_0000 0x0000 // gundl #define MODELPART_HUDPIECE_0001 0x0001 // position diff --git a/src/include/game/camdraw.h b/src/include/game/camdraw.h index 1eaa526cd..072871f84 100644 --- a/src/include/game/camdraw.h +++ b/src/include/game/camdraw.h @@ -5,7 +5,7 @@ #include "types.h" void func0f149c90(struct var800a45a0_484 *arg0); -u32 func0f149d58(void); +void *func0f149d58(u32 size, u32 line, char *file); void func0f149e58(u8 *arg0, u32 size); void func0f14a00c(bool arg0); struct var8007f8e0 *func0f14a06c(s32 index);