From c136b34b61a6e7c46cb54a33aa07106fadb1b92a Mon Sep 17 00:00:00 2001 From: Ryan Myers Date: Wed, 23 Apr 2025 15:24:11 -0400 Subject: [PATCH] Match func_800BA8E4 (#528) * First pass at func_800BA8E4 * Merge D_800E3078 into D_800E3070 and do func_800BA8E4 a better deal * Update D_800E3070 to be like D_800E3080 * Match func_800BA4B8 * Update score * Minor documenting changes * func_8002CC30 minimum compilable code. * func_800BA8E4 NON_MATCHING * Match func_800BA8E4 * Update score * Format --- README.md | 52 +++--- include/f3ddkr.h | 5 +- src/camera.c | 2 +- src/camera.h | 2 +- src/tracks.c | 233 ++++++++++++++++++++++++ src/waves.c | 258 ++++++++++++++++++++------- src/waves.h | 5 +- tools/permuter_settings.toml | 7 +- ver/symbols/symbol_addrs.jpn.v79.txt | 1 - ver/symbols/symbol_addrs.pal.v77.txt | 1 - ver/symbols/symbol_addrs.pal.v80.txt | 1 - ver/symbols/symbol_addrs.us.v77.txt | 1 - ver/symbols/symbol_addrs.us.v80.txt | 1 - 13 files changed, 468 insertions(+), 101 deletions(-) diff --git a/README.md b/README.md index fa4878a0..95735154 100644 --- a/README.md +++ b/README.md @@ -5,9 +5,9 @@ This repo contains a work-in-progress decompilation of Diddy Kong Racing for the All versions are supported, and the US 1.0 version (SHA1 = 0cb115d8716dbbc2922fda38e533b9fe63bb9670) of the game is the default if not specified. -As of April 21, 2025, this is our current score: +As of April 23, 2025, this is our current score: -    Decomp progress: 80.10% +    Decomp progress: 80.40%     Documentation progress: 53.78% @@ -117,30 +117,30 @@ s32 is_drumstick_unlocked(void) { ``` -As of April 21, 2025, this is our current score: +As of April 23, 2025, this is our current score: ``` - =================================================================== - ADVENTURE ONE (ASM -> C Decompilation) - -------------- 80.10% Complete (82.67% NON_MATCHING) -------------- - # Decompiled functions: 1857 - # GLOBAL_ASM remaining: 93 - # NON_MATCHING functions: 12 - # NON_EQUIVALENT WIP functions: 30 - --------------------------- Game Status --------------------------- - Balloons: 38/47, Keys: 4/4, Trophies: 3/5 - T.T. Amulets: 4/4, Wizpig Amulets: 3/4 - ------------------------------------------------------------------- - We are collecting silver coins in Haunted Woods. (7/8 silver coins) - =================================================================== - ADVENTURE TWO (Cleanup & Documentation) - ------------------------- 53.78% Complete ------------------------- - # Documented functions: 1136 - # Undocumented remaining: 517 - --------------------------- Game Status --------------------------- - Balloons: 26/47, Keys: 3/4, Trophies: 2/5 - T.T. Amulets: 2/4, Wizpig Amulets: 2/4 - ------------------------------------------------------------------- - We are battling in Darkwater Beach. (2 opponents remain) - =================================================================== + ======================================================== + ADVENTURE ONE (ASM -> C Decompilation) + -------- 80.40% Complete (82.97% NON_MATCHING) --------- + # Decompiled functions: 1858 + # GLOBAL_ASM remaining: 92 + # NON_MATCHING functions: 12 + # NON_EQUIVALENT WIP functions: 31 + --------------------- Game Status ---------------------- + Balloons: 39/47, Keys: 4/4, Trophies: 3/5 + T.T. Amulets: 4/4, Wizpig Amulets: 3/4 + -------------------------------------------------------- + We are racing in the rematch against Smokey. (Lap 1/3) + ======================================================== + ADVENTURE TWO (Cleanup & Documentation) + ------------------- 53.78% Complete -------------------- + # Documented functions: 1136 + # Undocumented remaining: 517 + --------------------- Game Status ---------------------- + Balloons: 26/47, Keys: 3/4, Trophies: 2/5 + T.T. Amulets: 2/4, Wizpig Amulets: 2/4 + -------------------------------------------------------- + We are battling in Darkwater Beach. (2 opponents remain) + ======================================================== ``` diff --git a/include/f3ddkr.h b/include/f3ddkr.h index 1c41758f..ef57a4f6 100644 --- a/include/f3ddkr.h +++ b/include/f3ddkr.h @@ -21,6 +21,9 @@ #define DKR_CC_UNK11 ENVIRONMENT, TEXEL0, ENV_ALPHA, TEXEL0, TEXEL0, 0, PRIMITIVE, 0 #define DKR_CC_UNK12 0, 0, 0, ENVIRONMENT, 0, 0, 0, TEXEL0 #define DKR_CC_UNK13 ENVIRONMENT, TEXEL0, ENV_ALPHA, TEXEL0, TEXEL1, 0, PRIMITIVE, 0 +#define DKR_CC_UNK14 TEXEL1, TEXEL0, SHADE, TEXEL0, 1, TEXEL0, PRIMITIVE, TEXEL0 +#define DKR_CC_UNK15 ENVIRONMENT, COMBINED, ENV_ALPHA, COMBINED, COMBINED, 0, SHADE, 0 +#define DKR_CC_UNK16 ENVIRONMENT, TEXEL0, ENV_ALPHA, TEXEL0, 0, 0, 0, PRIMITIVE #define DKR_CC_ENVIRONMENT 0, 0, 0, ENVIRONMENT, 0, 0, 0, ENVIRONMENT #define DKR_CC_DECALFADEPRIM 0, 0, 0, TEXEL0, TEXEL0, 0, PRIMITIVE, 0 @@ -90,7 +93,7 @@ gMoveWd(pkt, G_MW_BILLBOARD, 0, 0) #define gSPVertexDKR(pkt, v, n, v0) \ - gDma1p(pkt, G_VTX, v, (((n) * 8 + (n)) << 1) + 8,((n)-1)<<3|(((u32)(v) & 6))|(v0)) + gDma1p(pkt, G_VTX, v, (((n) * 8 + (n)) << 1) + 8, ((n)-1)<<3|(((u32)(v) & 6))|(v0)) #define TRIN_DISABLE_TEXTURE 0 #define TRIN_ENABLE_TEXTURE 1 diff --git a/src/camera.c b/src/camera.c index 0d200b4b..c6077f6f 100644 --- a/src/camera.c +++ b/src/camera.c @@ -1333,7 +1333,7 @@ void apply_object_shear_matrix(Gfx **dList, MatrixS **mtx, Object *arg2, Object /** * Official Name: camPushModelMtx */ -void camera_push_model_mtx(Gfx **dList, MatrixS **mtx, ObjectTransform *trans, f32 scale, f32 scaleY) { +s32 camera_push_model_mtx(Gfx **dList, MatrixS **mtx, ObjectTransform *trans, f32 scale, f32 scaleY) { f32 tempX; f32 tempY; f32 tempZ; diff --git a/src/camera.h b/src/camera.h index 3270bac7..915478a3 100644 --- a/src/camera.h +++ b/src/camera.h @@ -123,7 +123,7 @@ void set_camera_shake(f32 magnitude); void func_80067D3C(Gfx **dList, MatrixS **mats); void render_ortho_triangle_image(Gfx **dList, MatrixS **mtx, Vertex **vtx, ObjectSegment *segment, Sprite *sprite, s32 flags); s32 render_sprite_billboard(Gfx **dList, MatrixS **mtx, Vertex **vertexList, Object *obj, unk80068514_arg4 *arg4, s32 flags); -void camera_push_model_mtx(Gfx **dList, MatrixS **mtx, ObjectTransform *trans, f32 scale, f32 scaleY); +s32 camera_push_model_mtx(Gfx **dList, MatrixS **mtx, ObjectTransform *trans, f32 scale, f32 scaleY); void viewport_scissor(Gfx **dList); void apply_matrix_from_stack(Gfx **dList); void copy_viewports_to_stack(void); diff --git a/src/tracks.c b/src/tracks.c index ca46fbb7..c5d931a3 100644 --- a/src/tracks.c +++ b/src/tracks.c @@ -2674,7 +2674,240 @@ void func_8002C954(LevelModelSegment *segment, LevelModelSegmentBoundingBox *bbo } } +#ifdef NON_EQUIVALENT +s32 func_8002CC30(LevelModelSegment *segment) { + s32 spF4; + s32 spEC; + s32 spD0; + f32 tri1z; + f32 spA0; + f32 sp9C; + f32 sp98; + s32 sp78; + s32 i; + Triangle *temp_v1_4; + Vertex *temp_a0; + Vertex *temp_a0_2; + f32 tri3z; + f32 temp_f0_2; + f32 temp_f0_3; + f32 temp_f0_4; + f32 tri2y; + f32 temp_f12_2; + f32 tri2z; + f32 temp_f14_2; + f32 tri3x; + f32 temp_f16_2; + f32 tri3y; + f32 temp_f18_2; + f32 temp_f20; + f32 temp_f22; + f32 temp_f24; + f32 temp_f24_2; + f32 tri1x; + f32 temp_f28_2; + f32 tri2x; + f32 temp_f2_2; + f32 tri1y; + f32 temp_f30_2; + f32 temp_f4; + f32 var_f20; + f32 var_f22; + f32 var_f26; + s16 vertsOffset; + s16 temp_fp_2; + s16 temp_t7_2; + s16 endTri; + s16 startTri; + s16 var_a1; + s16 var_s7; + s16 var_v1; + s32 temp_s6; + s32 temp_t2; + s32 temp_t4; + s32 temp_t7; + s32 temp_t9; + s32 var_a0; + s32 var_a1_2; + s32 var_at; + s32 var_s0; + s32 var_s4; + s32 var_s5; + s32 var_t1; + s32 var_v0; + s32 var_v0_2; + u16 temp_s0; + u16 temp_s1; + u16 temp_t3; + u8 *temp_v1_2; + Vertex *temp_v0_2; + Vertex *temp_v0_3; + Vertex *temp_v0_4; + TriangleBatchInfo *temp_v0_5; + Vertex *temp_v0_6; + Vertex *temp_v0_7; + f32 *temp_v1_3; + f32 *temp_v1_5; + CollisionNode *temp_v1_6; + + spEC = 0; + var_s4 = 0; + for (i = 0; i < segment->numberOfBatches; i++) { + startTri = segment->batches[i].facesOffset; + endTri = segment->batches[i + 1].facesOffset; + vertsOffset = segment->batches[i].verticesOffset; + if (startTri < endTri) { + var_a1_2 = startTri * sizeof(Triangle); + do { + temp_v1_2 = &segment->triangles->verticesArray[var_a1_2]; + if (!(temp_v1_2[0] & 0x80)) { + temp_a0 = segment->vertices; + temp_v0_2 = &temp_a0[temp_v1_2[1] + vertsOffset]; //((temp_v1_2[1] + temp_fp) * 0xA) + temp_a0; + tri1x = temp_v0_2->x; + tri1y = temp_v0_2->y; + tri1z = temp_v0_2->z; + temp_v0_3 = + &temp_a0[temp_v1_2[2] + vertsOffset]; //((temp_v1_2[2] + curVertOffset) * 0xA) + temp_a0; + tri2x = temp_v0_3->x; + tri2y = temp_v0_3->y; + tri2z = temp_v0_3->z; + temp_v0_4 = + &temp_a0[temp_v1_2[3] + vertsOffset]; //((temp_v1_2[3] + curVertOffset) * 0xA) + temp_a0; + tri3x = temp_v0_4->x; + tri3y = temp_v0_4->y; + tri3z = temp_v0_4->z; + temp_f20 = ((tri2z - tri3z) * tri1y) + (tri2y * (tri3z - tri1z)) + (tri3y * (tri1z - tri2z)); + temp_f22 = ((tri2x - tri3x) * tri1z) + (tri2z * (tri3x - tri1x)) + (tri3z * (tri1x - tri2x)); + temp_f24 = ((tri2y - tri3y) * tri1x) + (tri2x * (tri3y - tri1y)) + (tri3x * (tri1y - tri2y)); + temp_f0_2 = sqrtf((temp_f20 * temp_f20) + (temp_f22 * temp_f22) + (temp_f24 * temp_f24)); + if (temp_f0_2 > 0.0) { + temp_f20 /= temp_f0_2; + temp_f22 /= temp_f0_2; + temp_f24 /= temp_f0_2; + } + segment->unk18[var_s4 + 0] = temp_f20; + segment->unk18[var_s4 + 1] = temp_f22; + segment->unk18[var_s4 + 2] = temp_f24; + segment->unk18[var_s4 + 3] = -((tri1x * temp_f20) + (tri1y * temp_f22) + (tri1z * temp_f24)); + var_s4++; + } + var_a1_2 += sizeof(Triangle); + } while (var_a1_2 < (endTri * 0x10)); + } + } + var_t1 = var_s4; + if (D_8011B0F8 == 0) { + spEC = 0; + if (var_a1 > 0) { + i = 0; + do { + temp_v0_5 = segment->batches + i; + temp_t7_2 = temp_v0_5[1].verticesOffset; + var_v1 = temp_v0_5->facesOffset; + temp_fp_2 = temp_v0_5->verticesOffset; + spF4 = (s32) temp_t7_2; + var_at = var_v1 < spF4; + if (temp_v0_5->flags & 0x200) { + var_v1 = temp_t7_2; + var_at = var_v1 < spF4; + } + var_s7 = var_v1; + if (var_at != 0) { + var_a0 = var_v1 * 0x10; + do { + if (!(segment->triangles->verticesArray[var_a0] & 0x80)) { + temp_s1 = segment->unk14[var_s7].triangleIndex; + temp_v1_3 = segment->unk18 + (temp_s1 * 0x10); + var_v0 = 0; + spA0 = temp_v1_3[0]; + var_s5 = 0; + sp9C = temp_v1_3[1]; + sp78 = var_a0; + temp_f24 = temp_v1_3[2]; + do { + temp_s6 = var_v0 + 1; + temp_v1_4 = &segment->triangles[var_s7]; + var_s0 = temp_s6; + if (temp_s6 >= 3) { + var_s0 = 0; + } + temp_s0 = (&segment->unk14[var_s7] + var_s5)->closestTri01; + if ((s32) temp_s0 < var_t1) { + temp_v1_5 = segment->unk18 + (temp_s0 * 0x10); + temp_a0_2 = segment->vertices; + temp_v0_6 = temp_a0_2 + + ((temp_v1_4->verticesArray[var_v0 + 1] + temp_fp_2) * + 0xA); //((temp_v1_4->verticesArray[var_v0].unk1 + temp_fp_2) * 0xA); + temp_f4 = (f32) temp_v0_6->z; + tri1z = temp_f4; + temp_v0_7 = temp_a0_2 + ((temp_v1_4->verticesArray[var_s0 + 1] + temp_fp_2) * 0xA); + temp_f28_2 = (f32) temp_v0_6->x; + spD0 = var_t1; + temp_f30_2 = (f32) temp_v0_6->y; + temp_f2_2 = (f32) temp_v0_7->x; + temp_f16_2 = ((temp_v1_5[0] + spA0) * 10.0f) + temp_f28_2; + temp_f12_2 = (f32) temp_v0_7->y; + temp_f14_2 = (f32) temp_v0_7->z; + temp_f18_2 = ((temp_v1_5[1] + sp9C) * 10.0f) + temp_f30_2; + temp_f0_3 = ((temp_v1_5[2] + temp_f24) * 10.0f) + temp_f4; + var_f20 = ((temp_f14_2 - temp_f0_3) * temp_f30_2) + + (temp_f12_2 * (temp_f0_3 - temp_f4)) + + (temp_f18_2 * (temp_f4 - temp_f14_2)); + var_f22 = ((temp_f2_2 - temp_f16_2) * temp_f4) + + (temp_f14_2 * (temp_f16_2 - temp_f28_2)) + + (temp_f0_3 * (temp_f28_2 - temp_f2_2)); + temp_f24_2 = ((temp_f12_2 - temp_f18_2) * temp_f28_2) + + (temp_f2_2 * (temp_f18_2 - temp_f30_2)) + + (temp_f16_2 * (temp_f30_2 - temp_f12_2)); + var_f26 = temp_f24_2; + temp_f0_4 = + sqrtf((var_f20 * var_f20) + (var_f22 * var_f22) + (temp_f24_2 * temp_f24_2)); + if ((f64) temp_f0_4 > 0.0) { + var_f20 /= temp_f0_4; + var_f22 /= temp_f0_4; + var_f26 = temp_f24_2 / temp_f0_4; + } + if (temp_s0 != temp_s1) { + var_v0_2 = 0; + do { + temp_v1_6 = &segment->unk14[temp_s0] + var_v0_2; + temp_t3 = temp_v1_6->closestTri01; + var_v0_2 += 2; + if (temp_s1 == temp_t3) { + temp_v1_6->closestTri01 = (s16) (var_s4 | 0x8000); + } + } while (var_v0_2 != 6); + } + (&segment->unk14[var_s7] + var_s5)->closestTri01 = (s16) var_s4; + temp_t2 = var_s4 * 0x10; + (segment->unk18[temp_t2]) = var_f20; + (segment->unk18[temp_t2 + 1]) = var_f22; + (segment->unk18[temp_t2 + 2]) = var_f26; + var_s4 += 1; + segment->unk18[temp_t2 + 3] = + (f32) - ((temp_f28_2 * var_f20) + (temp_f30_2 * var_f22) + (tri1z * var_f26)); + } + var_v0 = temp_s6; + var_s5 += 2; + } while (temp_s6 != 3); + var_a0 = sp78; + } + var_s7 += 1; + var_a0 += 0x10; + } while (var_s7 != spF4); + var_a1 = segment->numberOfBatches; + } + temp_t4 = spEC + 1; + i += 0xC; + spEC = temp_t4; + } while (temp_t4 < var_a1); + } + } + return var_s4 * 0x10; +} +#else #pragma GLOBAL_ASM("asm/nonmatchings/tracks/func_8002CC30.s") +#endif typedef struct unk8002D30C_a0 { u8 pad00[0x04]; diff --git a/src/waves.c b/src/waves.c index 0d69a83b..56b261b4 100644 --- a/src/waves.c +++ b/src/waves.c @@ -16,13 +16,13 @@ Vec2s *D_800E3044 = NULL; // holds some sort of index? TexCoords *D_800E3048 = NULL; f32 *D_800E304C[9] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }; -Vertex *gWaveVertices[4] = { NULL, NULL }; +Vertex *gWaveVertices[4][1] = { NULL, NULL }; Triangle *gWaveTriangles[4][1] = { NULL, NULL, NULL, NULL }; Triangle D_800E3090[4] = { - { { BACKFACE_DRAW, 0x00, 0x02, 0x01 }, 0, 0, 0, 0, 0, 0 }, - { { BACKFACE_DRAW, 0x01, 0x02, 0x03 }, 0, 0, 0, 0, 0, 0 }, - { { BACKFACE_DRAW, 0x00, 0x02, 0x01 }, 0, 0, 0, 0, 0, 0 }, - { { BACKFACE_DRAW, 0x01, 0x02, 0x03 }, 0, 0, 0, 0, 0, 0 }, + { { BACKFACE_DRAW, 0, 2, 1 }, 0, 0, 0, 0, 0, 0 }, + { { BACKFACE_DRAW, 1, 2, 3 }, 0, 0, 0, 0, 0, 0 }, + { { BACKFACE_DRAW, 0, 2, 1 }, 0, 0, 0, 0, 0, 0 }, + { { BACKFACE_DRAW, 1, 2, 3 }, 0, 0, 0, 0, 0, 0 }, }; TextureHeader *gWaveTextureHeader = NULL; @@ -143,7 +143,7 @@ void free_waves(void) { FREE_MEM(D_800E3044); FREE_MEM(D_800E3048); FREE_MEM(D_800E304C[0]); - FREE_MEM(gWaveVertices[0]); + FREE_MEM(gWaveVertices[0][0]); FREE_MEM(gWaveTriangles[0][0]); FREE_TEX(gWaveTextureHeader); FREE_MEM(D_800E30D4); @@ -173,13 +173,13 @@ void wave_init(void) { temp = (D_80129FC8.unk0 + 1); allocSize = (temp * 250 * (D_80129FC8.unk0 + 1)); if (D_8012A078 != 2) { - gWaveVertices[0] = (Vertex *) mempool_alloc_safe(allocSize << 1, COLOUR_TAG_CYAN); - gWaveVertices[1] = (Vertex *) (((u32) gWaveVertices[0]) + allocSize); + gWaveVertices[0][0] = (Vertex *) mempool_alloc_safe(allocSize << 1, COLOUR_TAG_CYAN); + gWaveVertices[1][0] = (Vertex *) (((u32) gWaveVertices[0][0]) + allocSize); } else { - gWaveVertices[0] = (Vertex *) mempool_alloc_safe(allocSize << 2, COLOUR_TAG_CYAN); - gWaveVertices[1] = (Vertex *) (((u32) gWaveVertices[0]) + allocSize); - gWaveVertices[2] = (Vertex *) (((u32) gWaveVertices[1]) + allocSize); - gWaveVertices[3] = (Vertex *) (((u32) gWaveVertices[2]) + allocSize); + gWaveVertices[0][0] = (Vertex *) mempool_alloc_safe(allocSize << 2, COLOUR_TAG_CYAN); + gWaveVertices[1][0] = (Vertex *) (((u32) gWaveVertices[0][0]) + allocSize); + gWaveVertices[2][0] = (Vertex *) (((u32) gWaveVertices[1][0]) + allocSize); + gWaveVertices[3][0] = (Vertex *) (((u32) gWaveVertices[2][0]) + allocSize); } allocSize = (D_80129FC8.unk0 * 32) * D_80129FC8.unk0; if (D_8012A078 != 2) { @@ -302,19 +302,19 @@ void func_800B82B4(LevelModel *model, LevelHeader *header, s32 arg2) { do { for (j_2 = 0; D_80129FC8.unk0 >= j_2; j_2++) { for (k = 0; k < arg2; k++) { - gWaveVertices[k][var_s5].x = (j_2 * D_8012A0B8) + 0.5; - gWaveVertices[k][var_s5].z = (i_2 * D_8012A0BC) + 0.5; + gWaveVertices[0][k][var_s5].x = (j_2 * D_8012A0B8) + 0.5; + gWaveVertices[0][k][var_s5].z = (i_2 * D_8012A0BC) + 0.5; // this is only 0 for hot top volcano if (D_80129FC8.darkVertexColours == 0) { - gWaveVertices[k][var_s5].r = 255; - gWaveVertices[k][var_s5].g = 255; - gWaveVertices[k][var_s5].b = 255; + gWaveVertices[0][k][var_s5].r = 255; + gWaveVertices[0][k][var_s5].g = 255; + gWaveVertices[0][k][var_s5].b = 255; } else { - gWaveVertices[k][var_s5].r = 0; - gWaveVertices[k][var_s5].g = 0; - gWaveVertices[k][var_s5].b = 0; + gWaveVertices[0][k][var_s5].r = 0; + gWaveVertices[0][k][var_s5].g = 0; + gWaveVertices[0][k][var_s5].b = 0; } - gWaveVertices[k][var_s5].a = 255; + gWaveVertices[0][k][var_s5].a = 255; } var_s5++; } @@ -346,37 +346,37 @@ void func_800B82B4(LevelModel *model, LevelHeader *header, s32 arg2) { var_s5 = (D_80129FC8.unk0 + 1) * D_80129FC8.unk0; for (i = 0; i < ARRAY_COUNT(D_8012A028); i++) { - D_8012A028[i][0].x = gWaveVertices[i][0].x; + D_8012A028[i][0].x = gWaveVertices[i][0][0].x; D_8012A028[i][0].y = 0; - D_8012A028[i][0].z = gWaveVertices[i][0].z; - D_8012A028[i][0].r = gWaveVertices[i][0].r; - D_8012A028[i][0].g = gWaveVertices[i][0].g; - D_8012A028[i][0].b = gWaveVertices[i][0].b; - D_8012A028[i][0].a = gWaveVertices[i][0].a; + D_8012A028[i][0].z = gWaveVertices[i][0][0].z; + D_8012A028[i][0].r = gWaveVertices[i][0][0].r; + D_8012A028[i][0].g = gWaveVertices[i][0][0].g; + D_8012A028[i][0].b = gWaveVertices[i][0][0].b; + D_8012A028[i][0].a = gWaveVertices[i][0][0].a; - D_8012A028[i][1].x = gWaveVertices[i][D_80129FC8.unk0].x; + D_8012A028[i][1].x = gWaveVertices[i][0][D_80129FC8.unk0].x; D_8012A028[i][1].y = 0; - D_8012A028[i][1].z = gWaveVertices[i][D_80129FC8.unk0].z; - D_8012A028[i][1].r = gWaveVertices[i][D_80129FC8.unk0].r; - D_8012A028[i][1].g = gWaveVertices[i][D_80129FC8.unk0].g; - D_8012A028[i][1].b = gWaveVertices[i][D_80129FC8.unk0].b; - D_8012A028[i][1].a = gWaveVertices[i][D_80129FC8.unk0].a; + D_8012A028[i][1].z = gWaveVertices[i][0][D_80129FC8.unk0].z; + D_8012A028[i][1].r = gWaveVertices[i][0][D_80129FC8.unk0].r; + D_8012A028[i][1].g = gWaveVertices[i][0][D_80129FC8.unk0].g; + D_8012A028[i][1].b = gWaveVertices[i][0][D_80129FC8.unk0].b; + D_8012A028[i][1].a = gWaveVertices[i][0][D_80129FC8.unk0].a; - D_8012A028[i][2].x = gWaveVertices[i][var_s5].x; + D_8012A028[i][2].x = gWaveVertices[i][0][var_s5].x; D_8012A028[i][2].y = 0; - D_8012A028[i][2].z = gWaveVertices[i][var_s5].z; - D_8012A028[i][2].r = gWaveVertices[i][var_s5].r; - D_8012A028[i][2].g = gWaveVertices[i][var_s5].g; - D_8012A028[i][2].b = gWaveVertices[i][var_s5].b; - D_8012A028[i][2].a = gWaveVertices[i][var_s5].a; + D_8012A028[i][2].z = gWaveVertices[i][0][var_s5].z; + D_8012A028[i][2].r = gWaveVertices[i][0][var_s5].r; + D_8012A028[i][2].g = gWaveVertices[i][0][var_s5].g; + D_8012A028[i][2].b = gWaveVertices[i][0][var_s5].b; + D_8012A028[i][2].a = gWaveVertices[i][0][var_s5].a; - D_8012A028[i][3].x = gWaveVertices[i][var_s5 + D_80129FC8.unk0].x; + D_8012A028[i][3].x = gWaveVertices[i][0][var_s5 + D_80129FC8.unk0].x; D_8012A028[i][3].y = 0; - D_8012A028[i][3].z = gWaveVertices[i][var_s5 + D_80129FC8.unk0].z; - D_8012A028[i][3].r = gWaveVertices[i][var_s5 + D_80129FC8.unk0].r; - D_8012A028[i][3].g = gWaveVertices[i][var_s5 + D_80129FC8.unk0].g; - D_8012A028[i][3].b = gWaveVertices[i][var_s5 + D_80129FC8.unk0].b; - D_8012A028[i][3].a = gWaveVertices[i][var_s5 + D_80129FC8.unk0].a; + D_8012A028[i][3].z = gWaveVertices[i][0][var_s5 + D_80129FC8.unk0].z; + D_8012A028[i][3].r = gWaveVertices[i][0][var_s5 + D_80129FC8.unk0].r; + D_8012A028[i][3].g = gWaveVertices[i][0][var_s5 + D_80129FC8.unk0].g; + D_8012A028[i][3].b = gWaveVertices[i][0][var_s5 + D_80129FC8.unk0].b; + D_8012A028[i][3].a = gWaveVertices[i][0][var_s5 + D_80129FC8.unk0].a; } func_800BCC70(model); @@ -600,7 +600,7 @@ void func_800B92F4(s32 arg0, s32 arg1) { } sp84 = D_8012A5E8[k].unk6; - vertices = &gWaveVertices[D_8012A018 + arg1][sp90 * sp98]; + vertices = &gWaveVertices[D_8012A018 + arg1][0][sp90 * sp98]; sp98 = D_800E30E4[sp98]; vertexIdx = 0; for (i = 0; i <= D_80129FC8.unk0; i++) { @@ -699,7 +699,7 @@ void func_800B97A8(s32 arg0, s32 arg1) { } var_a0 = D_8012A5E8[k].unk6; - vertices = &gWaveVertices[D_8012A018 + arg1][spA0 * spA8]; + vertices = &gWaveVertices[D_8012A018 + arg1][0][spA0 * spA8]; spA8 = D_800E30E4[spA8]; for (i = 0, vertexIdx = 0; i <= D_80129FC8.unk0; i++) { var_s1 = D_8012A5E8[k].unk4; @@ -901,43 +901,173 @@ void func_800BA288(s32 arg0, s32 arg1) { } void func_800BA4B8(TextureHeader *tex, s32 rtile) { - s32 mask; + s32 txmask; s32 tmem; u32 texWidth; texWidth = tex->width; tmem = 0; if (texWidth == 16) { - if (rtile != 0) { - tmem = 384; // 0x180 + txmask = 4; + if (rtile != G_TX_RENDERTILE) { + tmem = 384; } - mask = 4; } else if (texWidth == 32) { - mask = 5; - if (rtile != 0) { - tmem = 256; // 0x100 + txmask = 5; + if (rtile != G_TX_RENDERTILE) { + tmem = 256; } } else { + //!@bug: txmask is not set, so it's value will be UB. I wonder if they accidentally set the width to 3 instead + //! of the mask? texWidth = 3; - if (rtile != 0) { - tmem = 384; // 0x180 + if (rtile != G_TX_RENDERTILE) { + tmem = 384; } } // difference is G_IM_SIZ_32b vs G_IM_SIZ_16b if ((tex->format & 0xF) == TEX_FORMAT_RGBA32) { gDPLoadMultiBlock(gWaveDL++, OS_PHYSICAL_TO_K0(tex + 1), tmem, rtile, G_IM_FMT_RGBA, G_IM_SIZ_32b, texWidth, - texWidth, 0, 0, 0, mask, mask, 0, 0); - - return; + texWidth, 0, 0, 0, txmask, txmask, 0, 0); + } else { + gDPLoadMultiBlock(gWaveDL++, OS_PHYSICAL_TO_K0(tex + 1), tmem, rtile, G_IM_FMT_RGBA, G_IM_SIZ_16b, texWidth, + texWidth, 0, 0, 0, txmask, txmask, 0, 0); } - - gDPLoadMultiBlock(gWaveDL++, OS_PHYSICAL_TO_K0(tex + 1), tmem, rtile, G_IM_FMT_RGBA, G_IM_SIZ_16b, texWidth, - texWidth, 0, 0, 0, mask, mask, 0, 0); } -// https://decomp.me/scratch/9b2EF -#pragma GLOBAL_ASM("asm/nonmatchings/waves/func_800BA8E4.s") +void func_800BA8E4(Gfx **dList, MatrixS **mtx, s32 arg2) { + s32 sp11C; + Vertex *vtx; + Triangle *tri; + s32 numTris; + s32 numVerts; + s32 j; + s32 sp104; + s32 var_fp; + s32 var_t0; + ObjectTransform spE4; + LevelModel_Alternate *spE0; + s32 i; // spDC + TextureHeader *tex1; + TextureHeader *tex2; + + if ((arg2 != 1) || (D_8012A078 != 2)) { + arg2 = 0; + } else { + arg2 = 2; + } + + if (D_800E30DC > 0) { + gWaveDL = *dList; + D_80129FC4 = *mtx; + i = 0; + rendermode_reset(&gWaveDL); + gSPSetGeometryMode(gWaveDL++, G_ZBUFFER); + if (D_80129FC8.darkVertexColours) { + gSPClearGeometryMode(gWaveDL++, G_FOG); + tex1 = set_animated_texture_header(gWaveTextureHeader, D_8012A09C << 8); + tex2 = set_animated_texture_header(gWaveTexture, gWaveBatch->unk7 << 14); + func_800BA4B8(tex1, 1); + func_800BA4B8(tex2, 0); + gDPSetCombineMode(gWaveDL++, DKR_CC_UNK14, DKR_CC_UNK15); + if ((tex1->format & 0xF) == TEX_FORMAT_RGBA32 && get_viewport_count() <= 0) { + gDPSetOtherMode(gWaveDL++, DKR_OMH_2CYC_BILERP, DKR_OML_COMMON | G_RM_AA_ZB_XLU_INTER2); + } else { + gDPSetOtherMode(gWaveDL++, DKR_OMH_2CYC_BILERP, DKR_OML_COMMON | G_RM_AA_ZB_OPA_SURF2); + } + gDPSetPrimColor(gWaveDL++, 0, 0, 255, 255, 255, 0); + if (D_800E3180 != NULL) { + gDPSetEnvColor(gWaveDL++, D_800E3180->red, D_800E3180->green, D_800E3180->blue, D_800E3180->alpha); + } else { + gDPSetEnvColor(gWaveDL++, 255, 255, 255, 0); + } + } else { + gSPSetGeometryMode(gWaveDL++, G_FOG); + tex1 = set_animated_texture_header(gWaveTexture, gWaveBatch->unk7 << 14); + gDkrDmaDisplayList(gWaveDL++, OS_K0_TO_PHYSICAL(tex1->cmd), tex1->numberOfCommands); + gDPSetCombineMode(gWaveDL++, DKR_CC_UNK16, DKR_CC_UNK8); + gDPSetOtherMode(gWaveDL++, DKR_OMH_2CYC_BILERP, DKR_OML_COMMON | G_RM_FOG_SHADE_A | G_RM_AA_ZB_OPA_SURF2); + gDPSetPrimColor(gWaveDL++, 0, 0, 255, 255, 255, 255); + if (D_800E3180 != NULL) { + gDPSetEnvColor(gWaveDL++, D_800E3180->red, D_800E3180->green, D_800E3180->blue, D_800E3180->alpha); + } else { + gDPSetEnvColor(gWaveDL++, 255, 255, 255, 0); + } + } + if (D_80129FC8.unk28) { + spE4.scale = 0.5f; + } else { + spE4.scale = 1.0f; + } + + spE4.rotation.x = spE4.rotation.y = spE4.rotation.z = 0; + for (; i < D_800E30DC; i++) { + if (D_80129FC8.darkVertexColours) { + func_800B92F4(D_8012A1E8[i], arg2); + } else { + func_800B97A8(D_8012A1E8[i], arg2); + } + spE0 = &D_800E30D8[D_8012A1E8[i]]; + spE4.x_position = spE0->unk4; + spE4.y_position = spE0->unk6; + spE4.z_position = spE0->unk8; + sp104 = D_800E30D4[spE0->unkC]; + if (D_80129FC8.unk28) { + for (sp11C = 0; sp11C < 2; sp11C++) { + spE4.x_position = spE0->unk4; + for (var_fp = 0; var_fp < 2; var_fp++) { + camera_push_model_mtx(&gWaveDL, &D_80129FC4, &spE4, 1.0f, 0.0f); + if (sp104 & 0xFF) { + numTris = D_80129FC8.unk0 << 1; + numVerts = D_80129FC8.unk0 + 1; + var_t0 = ((sp104 & 0xFF) - 1) * numVerts * numVerts; + for (j = 0; j < D_80129FC8.unk0; j++) { + vtx = &gWaveVertices[D_8012A018 + arg2][0][var_t0]; + tri = &gWaveTriangles[D_8012A018 + arg2][0][j * (D_80129FC8.unk0 << 1)]; + + gSPVertexDKR(gWaveDL++, OS_K0_TO_PHYSICAL(vtx), numVerts << 1, 0); + gSPPolygon(gWaveDL++, OS_K0_TO_PHYSICAL(tri), numTris, TRIN_ENABLE_TEXTURE); + + var_t0 += D_80129FC8.unk0 + 1; + } + } else { + gSPVertexDKR(gWaveDL++, OS_K0_TO_PHYSICAL(&D_8012A028[D_8012A018]), 4, 0); + gSPPolygon(gWaveDL++, OS_K0_TO_PHYSICAL(&D_800E3090[D_8012A018 << 1]), 2, + TRIN_ENABLE_TEXTURE); + } + apply_matrix_from_stack(&gWaveDL); + sp104 >>= 8; + spE4.x_position += D_8012A0A0 * 0.5f; + } + spE4.z_position += D_8012A0A4 * 0.5f; + } + } else { + camera_push_model_mtx(&gWaveDL, &D_80129FC4, &spE4, 1.0f, 0.0f); + numTris = D_80129FC8.unk0 << 1; + numVerts = D_80129FC8.unk0 + 1; + var_t0 = ((sp104 & 0xFF) - 1) * numVerts * numVerts; + for (j = 0; j < D_80129FC8.unk0; j++) { + vtx = &gWaveVertices[D_8012A018 + arg2][0][var_t0]; + tri = &gWaveTriangles[D_8012A018 + arg2][0][j * (D_80129FC8.unk0 << 1)]; + + gSPVertexDKR(gWaveDL++, OS_K0_TO_PHYSICAL(vtx), numVerts << 1, 0); + gSPPolygon(gWaveDL++, OS_K0_TO_PHYSICAL(tri), numTris, TRIN_ENABLE_TEXTURE); + + var_t0 += D_80129FC8.unk0 + 1; + } + apply_matrix_from_stack(&gWaveDL); + } + } + if (D_80129FC8.darkVertexColours) { + gSPSetGeometryMode(gWaveDL++, G_FOG); + gDPSetPrimColor(gWaveDL++, 0, 0, 255, 255, 255, 255); + } + *dList = gWaveDL; + *mtx = D_80129FC4; + } + D_800E30DC = 0; +} f32 func_800BB2F4(s32 arg0, f32 arg1, f32 arg2, Vec3f *arg3) { f32 spA4; diff --git a/src/waves.h b/src/waves.h index d1dfad01..6c78cfda 100644 --- a/src/waves.h +++ b/src/waves.h @@ -126,7 +126,7 @@ s32 func_800B9228(LevelModelSegment *arg0); void func_800BBDDC(LevelModel *level, LevelHeader *header); void func_800BFE98(s32 arg0); void func_800B8134(LevelHeader *header); -void func_800BBE08(LevelModel *level, LevelHeader *arg1); +void func_800BBE08(LevelModel *level, LevelHeader *header); void obj_loop_wavepower(Object *obj); void func_800BFC54(unk800BFC54_arg0 *arg0, f32 arg1, f32 arg2, f32 arg3, f32 arg4); void func_800BF3E4(Object *obj); @@ -135,9 +135,10 @@ void func_800BA288(s32 arg0, s32 arg1); void func_800BF9F8(unk800BF9F8 *arg0, f32 arg1, f32 arg2); unk800E3190 *func_800BF634(Object *obj, f32 xPos, f32 zPos, f32 arg3, s32 arg4, f32 arg5, f32 arg6, f32 arg7, s32 arg8); void wave_init(void); +void func_800BA4B8(TextureHeader *tex, s32 rtile); Object_64 *func_800BE654(s16, f32, f32); // Non Matching -void func_800BBF78(LevelModel *arg0); // Non Matching +void func_800BBF78(LevelModel *model); // Non Matching f32 func_800BB2F4(s32, f32, f32, Vec3f *); void func_800B8C04(s32, s32, s32, s32, s32); void func_800BF524(Object *); diff --git a/tools/permuter_settings.toml b/tools/permuter_settings.toml index 9b0d7080..e0138995 100644 --- a/tools/permuter_settings.toml +++ b/tools/permuter_settings.toml @@ -8,7 +8,8 @@ compiler_type = "ido" "gDkr.*" = "void" "numberOfGfxCommands" = "unsigned int" "fast3d_cmd" = "void" -"OS_PHYSICAL_TO_K0" = "void *" +"OS_PHYSICAL_TO_K0" = "unsigned int" +"OS_K0_TO_PHYSICAL" = "unsigned int" "_SHIFTL" = "unsigned int" "G_IM.*" = "unsigned int" "KEEPLINEBREAK" = "void" @@ -25,6 +26,10 @@ compiler_type = "ido" "SCREEN_.*" = "unsigned int" "TV_TYPE_.*" = "unsigned int" "COLOUR_TAG_.*" = "unsigned int" +"DKR_.*" = "unsigned int" +"G_RM.*" = "unsigned int" +"G_FOG" = "unsigned int" +"G_ZBUFFER" = "unsigned int" [decompme.compilers] "tools/ido-recomp/linux/cc" = "ido5.3" diff --git a/ver/symbols/symbol_addrs.jpn.v79.txt b/ver/symbols/symbol_addrs.jpn.v79.txt index 2b54f6c0..08ffabea 100644 --- a/ver/symbols/symbol_addrs.jpn.v79.txt +++ b/ver/symbols/symbol_addrs.jpn.v79.txt @@ -2869,7 +2869,6 @@ D_800E3044 = 0x800E4B34; D_800E3048 = 0x800E4B38; D_800E304C = 0x800E4B3C; gWaveVertices = 0x800E4B60; -D_800E3078 = 0x800E4B68; gWaveTriangles = 0x800E4B70; D_800E3090 = 0x800E4B80; gWaveTextureHeader = 0x800E4BC0; diff --git a/ver/symbols/symbol_addrs.pal.v77.txt b/ver/symbols/symbol_addrs.pal.v77.txt index 517489b4..55204c1e 100644 --- a/ver/symbols/symbol_addrs.pal.v77.txt +++ b/ver/symbols/symbol_addrs.pal.v77.txt @@ -2703,7 +2703,6 @@ D_800E3044 = 0x800E30D4; D_800E3048 = 0x800E30D8; D_800E304C = 0x800E30DC; gWaveVertices = 0x800E3100; -D_800E3078 = 0x800E3108; gWaveTriangles = 0x800E3110; D_800E3090 = 0x800E3120; gWaveTextureHeader = 0x800E3160; diff --git a/ver/symbols/symbol_addrs.pal.v80.txt b/ver/symbols/symbol_addrs.pal.v80.txt index 5c0d4b96..0e548a49 100644 --- a/ver/symbols/symbol_addrs.pal.v80.txt +++ b/ver/symbols/symbol_addrs.pal.v80.txt @@ -2632,7 +2632,6 @@ D_800E3044 = 0x800E3664; D_800E3048 = 0x800E3668; D_800E304C = 0x800E366C; gWaveVertices = 0x800E3690; -D_800E3078 = 0x800E3698; gWaveTriangles = 0x800E36A0; D_800E3090 = 0x800E36B0; gWaveTextureHeader = 0x800E36F0; diff --git a/ver/symbols/symbol_addrs.us.v77.txt b/ver/symbols/symbol_addrs.us.v77.txt index a1bd5d49..c70b5ca3 100644 --- a/ver/symbols/symbol_addrs.us.v77.txt +++ b/ver/symbols/symbol_addrs.us.v77.txt @@ -2860,7 +2860,6 @@ D_800E3044 = 0x800E3044; D_800E3048 = 0x800E3048; D_800E304C = 0x800E304C; gWaveVertices = 0x800E3070; -D_800E3078 = 0x800E3078; gWaveTriangles = 0x800E3080; D_800E3090 = 0x800E3090; gWaveTextureHeader = 0x800E30D0; diff --git a/ver/symbols/symbol_addrs.us.v80.txt b/ver/symbols/symbol_addrs.us.v80.txt index a5782c60..65d162bd 100644 --- a/ver/symbols/symbol_addrs.us.v80.txt +++ b/ver/symbols/symbol_addrs.us.v80.txt @@ -2629,7 +2629,6 @@ D_800E3044 = 0x800E35D4; D_800E3048 = 0x800E35D8; D_800E304C = 0x800E35DC; gWaveVertices = 0x800E3600; -D_800E3078 = 0x800E3608; gWaveTriangles = 0x800E3610; D_800E3090 = 0x800E3620; gWaveTextureHeader = 0x800E3660;