diff --git a/README.md b/README.md index 3c0d30b0..94494845 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# banjo (96.4497%) +# banjo (96.5443%) diff --git a/decompressed.us.v10.yaml b/decompressed.us.v10.yaml index 6e4b4b53..21bdd87c 100644 --- a/decompressed.us.v10.yaml +++ b/decompressed.us.v10.yaml @@ -708,7 +708,7 @@ segments: - [0xFB3520, c, code_5DBC0] #DONE - [0xFB5460, c, code_5FB00] #DONE - [0xFB56E0, c, code_5FD80] #DONE - - [0xFB56F0, c, code_5FD90] + - [0xFB56F0, c, code_5FD90] #DONE - [0xFB8930, c, code_62FD0] #DONE - [0xFB8A30, c, code_630D0] #DONE - [0xFB8D70, c, code_63410] #DONE diff --git a/progress/progress_core2.svg b/progress/progress_core2.svg index 462d14b9..c8611eee 100644 --- a/progress/progress_core2.svg +++ b/progress/progress_core2.svg @@ -9,7 +9,7 @@ - + @@ -17,7 +17,7 @@ core2 - 95.5478% - 95.5478% + 95.7127% + 95.7127% \ No newline at end of file diff --git a/progress/progress_total.svg b/progress/progress_total.svg index 66c8a691..746ffd0d 100644 --- a/progress/progress_total.svg +++ b/progress/progress_total.svg @@ -9,7 +9,7 @@ - + @@ -17,7 +17,7 @@ Banjo-Kazooie (us.v10) - 96.4497% - 96.4497% + 96.5443% + 96.5443% \ No newline at end of file diff --git a/src/core2/code_5FD90.c b/src/core2/code_5FD90.c index ffec1293..bc5af907 100644 --- a/src/core2/code_5FD90.c +++ b/src/core2/code_5FD90.c @@ -8,6 +8,7 @@ extern void func_80252C08(f32[3],f32[3], f32, f32[3]); extern void func_80252CC4(f32[3],s32, f32, s32); extern f32 func_802560D0(f32[3], f32[3], f32[3]); extern f32 func_802EC920(BKVertexList *); +extern void func_8033D5D0(f32 arg0[3], f32 arg1[3], f32 margin, f32 min[3], f32 max[3]); #define ABS_F(s) (((s) >= 0.0f) ? (s) : -(s)) @@ -442,153 +443,109 @@ int func_802E805C(BKCollisionList *collision_list, BKVertexList *vtxList, f32 ar return sp34; } -s32 func_802E81CC(BKCollisionList *collision_list, BKVertexList *vtx_list, f32 arg2[3], f32 arg3[3], f32[3], f32, s32, s32 *, s32 *); -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_5FD90/func_802E81CC.s") -// s32 func_802E81CC(BKCollisionList *collision_list, BKVertexList *vtx_list, f32 arg2[3], f32 arg3[3], f32 arg4[3], f32 arg5, s32 flags, s32 *arg7, s32 *arg8) { -// BKCollisionGeo **spD4; -// BKCollisionGeo **spD0; -// BKCollisionGeo **spCC; -// f32 spC0[3]; -// f32 spAC[3]; -// f32 spA0[3]; -// //pad8C; -// f32 sp80[3]; -// f32 sp74[3]; -// Struct_core2_5FD90_0 *var_s2; -// ? *var_t0; -// ? *var_v0; -// f32 *temp_v0; -// f32 *var_a0; -// f32 *var_a1; -// f32 *var_v1_3; -// f32 temp_f0; -// f32 temp_f0_2; -// f32 temp_f0_3; -// f32 temp_f0_4; -// f32 temp_f0_5; -// f32 temp_f12; -// f32 temp_f12_2; -// f32 temp_f14; -// f32 temp_f16; -// f32 temp_f18; -// f32 temp_f20; -// f32 temp_f2; -// f32 temp_f2_2; -// f32 temp_f2_3; -// BKCollisionTri *temp_v0_2; -// s16 *var_a3; -// BKCollisionTri *i_tri; -// s16 *var_v1_2; -// s16 var_t8; -// Vtx *vertices; -// s32 var_a0_2; -// s32 var_a2; -// s32 var_t1; -// s32 var_v1; -// u32 temp_t9; -// BKCollisionTri *temp_s7; -// BKCollisionGeo *temp_v1; -// void *var_t0_2; -// void *var_v0_2; -// s32 i; +s32 func_802E81CC(BKCollisionList *collisionList, BKVertexList *vertexList, f32 arg2[3], f32 arg3[3], f32 arg4[3], f32 arg5, s32 flagFilter, s32 *arg7, s32 *arg8) { + BKCollisionGeo **spD4; + BKCollisionGeo **spD0; + BKCollisionGeo **spCC; + f32 spC0[3]; + BKCollisionTri *start_tri; + BKCollisionTri *end_tri; + f32 spAC[3]; + f32 spA0[3]; + BKCollisionTri *i_tri; + Vtx *vertex_pool; + Vtx *i_vtx; + s32 i; + s32 j; + f32 sp80[3]; + f32 sp74[3]; + Struct_core2_5FD90_0 *var_s2; + f32 temp_f0; -// func_8033D5D0(arg2, arg3, arg5, &spAC, &spA0); -// temp_f0 = func_802EC920(vtx_list); -// for(var_v1 = 0; var_v1 < 3; var_v1++){ -// if ((spA0[var_v1] <= -temp_f0) || (temp_f0 <= spAC[var_v1])) { -// return 0; -// } -// } -// func_802E6DEC(collision_list, spAC, spA0, &spD4, &spCC); -// vertices = vtxList_getVertices(vtx_list); -// var_s2 = &D_8037EAD0; -// spD0 = spD4; -// if (spD4 < spCC) { -// do{ -// temp_v1 = *spD0; -// temp_v0_2 = (temp_v1->start_tri_index * sizeof(BKCollisionTri)) + (s32)collision_list + (collision_list->unk10 * 4) + sizeof(BKCollisionList); -// temp_s7 = temp_v0_2 + temp_v1->tri_count; -// for(i_tri = temp_v0_2; i_tri < temp_s7; i_tri++){ -// if ((i_tri->flags & flags) == 0) { -// for(var_a2 = 0; var_a2 < 3; var_a2++){ -// for(var_a0_2 = 0; var_a0_2 < 3; var_a0_2++) -// var_s2->unk24.unk4[var_a2][var_a0_2] = (f32) vertices[i_tri->unk0[var_a2]].v.ob[var_a0_2]; -// } -// } -// var_t1 = 1; -// var_t0_2 = var_s2 + 0xC; -// sp80[0] = var_s2->unk24.unk4[0][0]; -// sp80[1] = var_s2->unk24.unk4[0][1]; -// sp80[2] = var_s2->unk24.unk4[0][2]; -// sp74[0] = var_s2->unk24.unk4[0][0]; -// sp74[1] = var_s2->unk24.unk4[0][1]; -// sp74[2] = var_s2->unk24.unk4[0][2]; -// for(var_t1 = 0; var_t1 < 3; var_t1++){ -// var_a1 = &sp80; -// var_v1_3 = &sp74; -// for(i = 0; i < 3; i++){ -// if ( var_s2->unk24.unk4[i][0] < sp80[i]) { -// sp80[i] = var_s2->unk24.unk4[i][0]; -// } -// if (sp74[i] < var_s2->unk24.unk4[i][1]) { -// sp80[i] = var_s2->unk24.unk4[i][1]; -// } -// } -// } - -// if ( !((spA0[0] < sp80[0]) || (sp74[0] < spAC[0])) -// && !((spA0[1] < sp80[1]) || (sp74[1] < spAC[1])) -// && !((spA0[2] < sp80[2]) || (sp74[2] < spAC[2])) -// ) { -// var_s2->unk0[0] = var_s2->unk24.unk4[1][0] - var_s2->unk24.unk4[0][0]; -// var_s2->unk0[1] = var_s2->unk24.unk4[1][1] - var_s2->unk24.unk4[0][1]; -// var_s2->unk0[2] = var_s2->unk24.unk4[1][2] - var_s2->unk24.unk4[0][2]; -// var_s2->unkC[0] = var_s2->unk24.unk4[2][0] - var_s2->unk24.unk4[0][0]; -// var_s2->unkC[1] = var_s2->unk24.unk4[2][1] - var_s2->unk24.unk4[0][1]; -// var_s2->unkC[2] = var_s2->unk24.unk4[2][2] - var_s2->unk24.unk4[0][2]; -// var_s2->unk18[0] = (var_s2->unk0[1] * var_s2->unkC[2]) - (var_s2->unkC[1] *var_s2->unk0[2]); -// var_s2->unk18[1] = (var_s2->unk0[2] * var_s2->unkC[0]) - (var_s2->unkC[2] * var_s2->unk0[0]); -// var_s2->unk18[2] = (var_s2->unk0[0] * var_s2->unkC[1]) - (var_s2->unkC[0] * var_s2->unk0[1]); -// ml_vec3f_normalize( var_s2->unk18); -// if (i_tri->flags & 0x10000) { -// spC0[0] = arg2[0] - var_s2->unk24.unk4[0]; -// spC0[1] = arg2[1] - var_s2->unk24.unk4[1]; -// spC0[2] = arg2[2] - var_s2->unk24.unk4[2]; -// if (((spC0[0]*var_s2->unk18[0]) + (spC0[0]*var_s2->unk18[0]) + (spC0[0]*var_s2->unk18[0])) < 0.0f) { -// var_s2->unk18[0] = -var_s2->unk18[0]; -// var_s2->unk18[1] = -var_s2->unk18[1]; -// var_s2->unk18[2] = -var_s2->unk18[2]; -// } -// goto block_31; -// } -// if (!(((var_s2->unk18[0]*arg4[0]) + (var_s2->unk18[1]*arg4[1]) + (var_s2->unk18[2]*arg4[2])) > 0.0f)) { -// block_31: -// var_s2++; -// var_s2->unk24.unk0 = i_tri; -// if ((var_s2 - D_8037EAD0) < 0x65) { -// goto block_32; -// } -// } else { -// goto block_32; -// } -// } else { -// goto block_32; -// } -// } else { -// block_32: -// i_tri++; -// if ((u32) i_tri < (u32) temp_s7) { -// goto loop_8; -// } -// } -// } -// }while(((var_s2 - D_8037EAD0) < 0x65) && (spD0 += 4 < spCC)); -// } -// *arg7 = (s32) D_8037EAD0; -// *arg8 = (s32) var_s2; -// return var_s2 - D_8037EAD0 > 0; -// } + func_8033D5D0(arg2, arg3, arg5, spAC, spA0); + temp_f0 = func_802EC920(vertexList); + for(i = 0; i < 3; i++){ + if ((spA0[i] <= -temp_f0) || (temp_f0 <= spAC[i])) { + return 0; + } + } + func_802E6DEC(collisionList, spAC, spA0, &spD4, &spCC); + vertex_pool = vtxList_getVertices(vertexList); + var_s2 = D_8037EAD0; + for(spD0 = spD4; spD0 < spCC; spD0++){ + start_tri = (BKCollisionTri *)((BKCollisionGeo *)(collisionList + 1) + collisionList->unk10) + (*spD0)->start_tri_index; + end_tri = start_tri + (*spD0)->tri_count; + for(i_tri = start_tri; i_tri < end_tri; i_tri++){ + if (!(i_tri->flags & flagFilter)) { + for(i = 0; i < 3; i++){ + i_vtx = vertex_pool + i_tri->unk0[i]; + for(j = 0; j < 3; j++){ + var_s2->unk28[i][j] = i_vtx->v.ob[j]; + } + } + sp80[0] = var_s2->unk28[0][0];\ + sp80[1] = var_s2->unk28[0][1];\ + sp80[2] = var_s2->unk28[0][2]; + + sp74[0] = var_s2->unk28[0][0];\ + sp74[1] = var_s2->unk28[0][1];\ + sp74[2] = var_s2->unk28[0][2]; + for(i = 1; i < 3; i++){ + for(j = 0; j < 3; j++){ + if (var_s2->unk28[i][j] < sp80[j]) { + sp80[j] = var_s2->unk28[i][j]; + } + + if (sp74[j] < var_s2->unk28[i][j]) { + sp74[j] = var_s2->unk28[i][j]; + } + } + } + + if ((spA0[0] < sp80[0]) || (sp74[0] < spAC[0])) continue; + if ((spA0[1] < sp80[1]) || (sp74[1] < spAC[1])) continue; + if ((spA0[2] < sp80[2]) || (sp74[2] < spAC[2])) continue; + + var_s2->unk0[0] = var_s2->unk28[1][0] - var_s2->unk28[0][0]; + var_s2->unk0[1] = var_s2->unk28[1][1] - var_s2->unk28[0][1]; + var_s2->unk0[2] = var_s2->unk28[1][2] - var_s2->unk28[0][2]; + + var_s2->unkC[0] = var_s2->unk28[2][0] - var_s2->unk28[0][0]; + var_s2->unkC[1] = var_s2->unk28[2][1] - var_s2->unk28[0][1]; + var_s2->unkC[2] = var_s2->unk28[2][2] - var_s2->unk28[0][2]; + + var_s2->unk18[0] = (var_s2->unk0[1] * var_s2->unkC[2]) - (var_s2->unk0[2] * var_s2->unkC[1]); + var_s2->unk18[1] = (var_s2->unk0[2] * var_s2->unkC[0]) - (var_s2->unk0[0] * var_s2->unkC[2]); + var_s2->unk18[2] = (var_s2->unk0[0] * var_s2->unkC[1]) - (var_s2->unk0[1] * var_s2->unkC[0]); + ml_vec3f_normalize( var_s2->unk18); + if (i_tri->flags & 0x10000) { + spC0[0] = arg2[0] - var_s2->unk28[0][0]; + spC0[1] = arg2[1] - var_s2->unk28[0][1]; + spC0[2] = arg2[2] - var_s2->unk28[0][2]; + if (((spC0[0]*var_s2->unk18[0]) + (spC0[1]*var_s2->unk18[1]) + (spC0[2]*var_s2->unk18[2])) < 0.0f) { + var_s2->unk18[0] = -var_s2->unk18[0];\ + var_s2->unk18[1] = -var_s2->unk18[1];\ + var_s2->unk18[2] = -var_s2->unk18[2]; + } + } + else{ + if (((var_s2->unk18[0]*arg4[0]) + (var_s2->unk18[1]*arg4[1]) + (var_s2->unk18[2]*arg4[2])) > 0.0f) + continue; + } + var_s2->unk24 = i_tri; + var_s2++; + if ((var_s2 - D_8037EAD0) > 100) + break; + } + } + if ((var_s2 - D_8037EAD0) > 100) + break; + } + *arg7 = (s32) D_8037EAD0; + *arg8 = (s32) var_s2; + return var_s2 - D_8037EAD0 > 0; +} Struct_core2_5FD90_0 *func_802E879C(Struct_core2_5FD90_0 *arg0, Struct_core2_5FD90_0 *arg1, f32 arg2[3], f32 arg3, f32 arg4[3]) { s32 i;