From c286e4ae5ad4fc05bd080a8d4ff385aa0c00e93e Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Thu, 29 Apr 2021 18:43:22 +1000 Subject: [PATCH] Decompile modelApplyCullMode --- src/include/constants.h | 4 +++ src/include/lib/model.h | 2 +- src/include/types.h | 2 +- src/lib/model.c | 63 +++++++++++------------------------------ 4 files changed, 22 insertions(+), 49 deletions(-) diff --git a/src/include/constants.h b/src/include/constants.h index dded10aa5..618a8cf7f 100644 --- a/src/include/constants.h +++ b/src/include/constants.h @@ -651,6 +651,10 @@ #define CROUCHPOS_DUCK 1 #define CROUCHPOS_STAND 2 +#define CULLMODE_NONE 1 +#define CULLMODE_FRONT 2 +#define CULLMODE_BACK 3 + #define DAMAGETYPE_0 0 #define DAMAGETYPE_1 1 #define DAMAGETYPE_2 2 diff --git a/src/include/lib/model.h b/src/include/lib/model.h index 959376e0f..c7527842c 100644 --- a/src/include/lib/model.h +++ b/src/include/lib/model.h @@ -83,7 +83,7 @@ void func0001f7e0(struct modelrenderdata *renderdata); void func0001f890(struct modelrenderdata *renderdata, bool arg1); void func00020248(struct modelrenderdata *renderdata, bool arg1); void func00020bdc(struct modelrenderdata *renderdata); -void func00020c90(struct modelrenderdata *renderdata); +void modelApplyCullMode(struct modelrenderdata *renderdata); void modelRenderNodeGundl(struct modelrenderdata *renderdata, struct model *model, struct modelnode *node); void modelRenderNodeDl(struct modelrenderdata *renderdata, struct model *model, struct modelnode *node); void modelRenderNodeType16(struct modelrenderdata *renderdata, struct modelnode *node); diff --git a/src/include/types.h b/src/include/types.h index aab5ce079..72d67dc54 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -6041,7 +6041,7 @@ struct modelrenderdata { /*0x30*/ u32 unk30; /*0x34*/ u32 colour34; /*0x38*/ u32 colour38; - /*0x3c*/ u32 unk3c; + /*0x3c*/ u32 cullmode; }; struct rend_vidat { diff --git a/src/lib/model.c b/src/lib/model.c index a538d4787..21367fb68 100644 --- a/src/lib/model.c +++ b/src/lib/model.c @@ -7738,47 +7738,16 @@ glabel func00020bdc /* 20c8c: ac790000 */ sw $t9,0x0($v1) ); -GLOBAL_ASM( -glabel func00020c90 -/* 20c90: 8c82003c */ lw $v0,0x3c($a0) -/* 20c94: 24010001 */ addiu $at,$zero,0x1 -/* 20c98: 5441000a */ bnel $v0,$at,.L00020cc4 -/* 20c9c: 24010002 */ addiu $at,$zero,0x2 -/* 20ca0: 8c83000c */ lw $v1,0xc($a0) -/* 20ca4: 3c0fb600 */ lui $t7,0xb600 -/* 20ca8: 24183000 */ addiu $t8,$zero,0x3000 -/* 20cac: 246e0008 */ addiu $t6,$v1,0x8 -/* 20cb0: ac8e000c */ sw $t6,0xc($a0) -/* 20cb4: ac780004 */ sw $t8,0x4($v1) -/* 20cb8: 03e00008 */ jr $ra -/* 20cbc: ac6f0000 */ sw $t7,0x0($v1) -/* 20cc0: 24010002 */ addiu $at,$zero,0x2 -.L00020cc4: -/* 20cc4: 5441000a */ bnel $v0,$at,.L00020cf0 -/* 20cc8: 24010003 */ addiu $at,$zero,0x3 -/* 20ccc: 8c83000c */ lw $v1,0xc($a0) -/* 20cd0: 3c08b700 */ lui $t0,0xb700 -/* 20cd4: 24091000 */ addiu $t1,$zero,0x1000 -/* 20cd8: 24790008 */ addiu $t9,$v1,0x8 -/* 20cdc: ac99000c */ sw $t9,0xc($a0) -/* 20ce0: ac690004 */ sw $t1,0x4($v1) -/* 20ce4: 03e00008 */ jr $ra -/* 20ce8: ac680000 */ sw $t0,0x0($v1) -/* 20cec: 24010003 */ addiu $at,$zero,0x3 -.L00020cf0: -/* 20cf0: 14410008 */ bne $v0,$at,.L00020d14 -/* 20cf4: 00000000 */ nop -/* 20cf8: 8c83000c */ lw $v1,0xc($a0) -/* 20cfc: 3c0bb700 */ lui $t3,0xb700 -/* 20d00: 240c2000 */ addiu $t4,$zero,0x2000 -/* 20d04: 246a0008 */ addiu $t2,$v1,0x8 -/* 20d08: ac8a000c */ sw $t2,0xc($a0) -/* 20d0c: ac6c0004 */ sw $t4,0x4($v1) -/* 20d10: ac6b0000 */ sw $t3,0x0($v1) -.L00020d14: -/* 20d14: 03e00008 */ jr $ra -/* 20d18: 00000000 */ nop -); +void modelApplyCullMode(struct modelrenderdata *renderdata) +{ + if (renderdata->cullmode == CULLMODE_NONE) { + gSPClearGeometryMode(renderdata->gdl++, G_CULL_BOTH); + } else if (renderdata->cullmode == CULLMODE_FRONT) { + gSPSetGeometryMode(renderdata->gdl++, G_CULL_FRONT); + } else if (renderdata->cullmode == CULLMODE_BACK) { + gSPSetGeometryMode(renderdata->gdl++, G_CULL_BACK); + } +} void modelRenderNodeGundl(struct modelrenderdata *renderdata, struct model *model, struct modelnode *node) { @@ -7791,8 +7760,8 @@ void modelRenderNodeGundl(struct modelrenderdata *renderdata, struct model *mode if ((renderdata->flags & 1) && rodata->unk00) { gSPSegment(renderdata->gdl++, 0x05, osVirtualToPhysical(rodata->unk08)); - if (renderdata->unk3c) { - func00020c90(renderdata); + if (renderdata->cullmode) { + modelApplyCullMode(renderdata); } switch (rodata->unk12) { @@ -7825,8 +7794,8 @@ void modelRenderNodeGundl(struct modelrenderdata *renderdata, struct model *mode && rodata->unk04) { gSPSegment(renderdata->gdl++, 0x05, osVirtualToPhysical(rodata->unk08)); - if (renderdata->unk3c) { - func00020c90(renderdata); + if (renderdata->cullmode) { + modelApplyCullMode(renderdata); } func00020248(renderdata, false); @@ -7880,7 +7849,7 @@ glabel modelRenderNodeDl /* 20fcc: 8e0c003c */ lw $t4,0x3c($s0) /* 20fd0: 51800004 */ beqzl $t4,.L00020fe4 /* 20fd4: 8fad004c */ lw $t5,0x4c($sp) -/* 20fd8: 0c008324 */ jal func00020c90 +/* 20fd8: 0c008324 */ jal modelApplyCullMode /* 20fdc: 02002025 */ or $a0,$s0,$zero /* 20fe0: 8fad004c */ lw $t5,0x4c($sp) .L00020fe4: @@ -8002,7 +7971,7 @@ glabel modelRenderNodeDl /* 21198: 8e0a003c */ lw $t2,0x3c($s0) /* 2119c: 51400004 */ beqzl $t2,.L000211b0 /* 211a0: 8e03000c */ lw $v1,0xc($s0) -/* 211a4: 0c008324 */ jal func00020c90 +/* 211a4: 0c008324 */ jal modelApplyCullMode /* 211a8: 02002025 */ or $a0,$s0,$zero /* 211ac: 8e03000c */ lw $v1,0xc($s0) .L000211b0: