From b9a19aa83e59e6e069f249cf89b6f61093f9b162 Mon Sep 17 00:00:00 2001 From: Banjo Kazooie Date: Fri, 16 Dec 2022 00:43:20 -0600 Subject: [PATCH] func_802E76B0() match --- README.md | 2 +- progress/progress_core2.svg | 6 +- progress/progress_total.svg | 4 +- src/core2/code_5FD90.c | 246 +++++++++++++++++------------------- 4 files changed, 122 insertions(+), 136 deletions(-) diff --git a/README.md b/README.md index e226844a..2c197f66 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# banjo (96.1105%) +# banjo (96.2679%) diff --git a/progress/progress_core2.svg b/progress/progress_core2.svg index 999792d3..2e9709a2 100644 --- a/progress/progress_core2.svg +++ b/progress/progress_core2.svg @@ -9,7 +9,7 @@ - + @@ -17,7 +17,7 @@ core2 - 94.9567% - 94.9567% + 95.2310% + 95.2310% \ No newline at end of file diff --git a/progress/progress_total.svg b/progress/progress_total.svg index 5f302ea1..712978d7 100644 --- a/progress/progress_total.svg +++ b/progress/progress_total.svg @@ -17,7 +17,7 @@ Banjo-Kazooie (us.v10) - 96.1105% - 96.1105% + 96.2679% + 96.2679% \ No newline at end of file diff --git a/src/core2/code_5FD90.c b/src/core2/code_5FD90.c index 49108b15..9d699464 100644 --- a/src/core2/code_5FD90.c +++ b/src/core2/code_5FD90.c @@ -241,56 +241,44 @@ void func_802E75D0(f32 arg0[3], f32 arg1[3], s32 arg2[3], s32 arg3[3], f32 arg4[ arg4[2] = (arg1[2] - arg0[2]); } -#ifndef NONMATCHING -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_5FD90/func_802E76B0.s") -#else -BKCollisionTri * *func_802E76B0(BKCollisionList *arg0, BKVertexList *arg1, f32 arg2[3], f32 arg3[3], f32 arg4[3], u32 arg5) { +BKCollisionTri *func_802E76B0(BKCollisionList *arg0, BKVertexList *arg1, f32 arg2[3], f32 arg3[3], f32 arg4[3], u32 arg5) { + s32 i; + s32 j; BKCollisionGeo **sp18C; BKCollisionGeo **sp188; BKCollisionGeo **sp184; BKCollisionTri *sp180; + BKCollisionGeo *temp_v1; BKCollisionTri *sp178; + BKCollisionTri *phi_s1; + Vtx *vtx_pool; Vtx *sp164[3]; s32 sp158[3]; s32 sp14C[3]; f32 sp140[3]; + Vtx *temp_a2; f32 sp130[3]; f32 sp124[3]; f32 sp118[3]; f32 sp10C[3]; - f32 spFC[3]; - f32 spF8; - f32 spF4; - f32 spF0; - f32 spEC; - f32 spE8; - f32 spE4; - f32 spBC[3]; - f32 sp90[3][3]; - BKCollisionTri *sp8C; f32 temp_f0_2; + f32 spFC[3]; + f32 spF0[3]; + f32 spE4[3]; + f32 temp_f12_2; f32 temp_f12_3; f32 temp_f12_4; f32 temp_f14_2; - f32 temp_f18_2; f32 temp_f20; - f32 temp_f22; - f32 temp_f26; f32 temp_f2_2; f32 temp_f2_6; - Vtx *temp_a2; - s32 temp_hi; - s32 temp_hi_2; - Vtx *vtx_pool; - BKCollisionTri *temp_t1; - BKCollisionGeo *temp_v1; - BKCollisionTri *phi_s1; - f32 phi_f0; - f32 phi_f12; + f32 spBC[3]; + s32 phi_a0_2; - s32 i; - s32 j; + f32 pad; + f32 sp90[3][3]; + BKCollisionTri *sp8C; sp8C = NULL; temp_f20 = (f32) arg1->unk16; @@ -302,119 +290,117 @@ BKCollisionTri * *func_802E76B0(BKCollisionList *arg0, BKVertexList *arg1, f32 a } func_802E70FC(arg0, sp158, sp14C, &sp18C, &sp184); for(sp188 = sp18C; sp188 < sp184; sp188++){ - temp_v1 = *sp188; // sp180 = (temp_v1->unk0 * 0xC) + (s32)arg0 + (arg0->unk10 * 4) + sizeof(BKCollisionList); - sp180 = (BKCollisionTri *)((BKCollisionGeo *)(arg0 + 1) + arg0->unk10) + temp_v1->start_tri_index; - sp178 = sp180 + temp_v1->tri_count; + sp180 = (BKCollisionTri *)((BKCollisionGeo *)(arg0 + 1) + arg0->unk10) + (*sp188)->start_tri_index; + sp178 = sp180 + (*sp188)->tri_count; for(phi_s1 = sp180; phi_s1 < sp178; phi_s1++){ - if(!(phi_s1->flags & arg5)){ - vtx_pool = (s32)arg1 + sizeof(BKVertexList); - sp164[0] = &vtx_pool[phi_s1->unk0[0]]; - sp164[1] = &vtx_pool[phi_s1->unk0[1]]; - sp164[2] = &vtx_pool[phi_s1->unk0[2]]; - if( !((sp164[0]->v.ob[0] < sp158[0]) && (sp164[1]->v.ob[0] < sp158[0]) && (sp164[2]->v.ob[0] < sp158[0])) - && !((sp14C[0] < sp164[0]->v.ob[0]) && (sp14C[0] < sp164[1]->v.ob[0]) && (sp14C[0] < sp164[2]->v.ob[0])) - && !((sp164[0]->v.ob[2] < sp158[2]) && (sp164[1]->v.ob[2] < sp158[2]) && (sp164[2]->v.ob[2] < sp158[2])) - && !((sp14C[2] < sp164[0]->v.ob[2]) && (sp14C[2] < sp164[1]->v.ob[2]) && (sp14C[2] < sp164[2]->v.ob[2])) - && !((sp164[0]->v.ob[1] < sp158[1]) && (sp164[1]->v.ob[1] < sp158[1]) && (sp164[2]->v.ob[1] < sp158[1])) - && !((sp14C[1] < sp164[0]->v.ob[1]) && (sp14C[1] < sp164[1]->v.ob[1]) && (sp14C[1] < sp164[2]->v.ob[1])) - ){ - for(i = 0; i < 3; i++){ - temp_a2 = &vtx_pool[phi_s1->unk0[i]]; - for(j = 0; j <3; j++){ - sp90[i][j] = temp_a2->v.ob[j]; - } - } - sp130[0] = sp90[1][0] - sp90[0][0];\ - sp130[1] = sp90[1][1] - sp90[0][1];\ - sp130[2] = sp90[1][2] - sp90[0][2]; + vtx_pool = (Vtx*)(arg1 + 1); + if((phi_s1->flags & arg5)) + continue; - sp124[0] = sp90[2][0] - sp90[0][0];\ - sp124[1] = sp90[2][1] - sp90[0][1];\ - sp124[2] = sp90[2][2] - sp90[0][2]; + sp164[0] = &vtx_pool[phi_s1->unk0[0]]; + sp164[1] = &vtx_pool[phi_s1->unk0[1]]; + sp164[2] = &vtx_pool[phi_s1->unk0[2]]; + if((sp164[0]->v.ob[0] < sp158[0]) && (sp164[1]->v.ob[0] < sp158[0]) && (sp164[2]->v.ob[0] < sp158[0])) continue; + if((sp14C[0] < sp164[0]->v.ob[0]) && (sp14C[0] < sp164[1]->v.ob[0]) && (sp14C[0] < sp164[2]->v.ob[0])) continue; + + if((sp164[0]->v.ob[2] < sp158[2]) && (sp164[1]->v.ob[2] < sp158[2]) && (sp164[2]->v.ob[2] < sp158[2])) continue; + if((sp14C[2] < sp164[0]->v.ob[2]) && (sp14C[2] < sp164[1]->v.ob[2]) && (sp14C[2] < sp164[2]->v.ob[2])) continue; + + if((sp164[0]->v.ob[1] < sp158[1]) && (sp164[1]->v.ob[1] < sp158[1]) && (sp164[2]->v.ob[1] < sp158[1])) continue; + if((sp14C[1] < sp164[0]->v.ob[1]) && (sp14C[1] < sp164[1]->v.ob[1]) && (sp14C[1] < sp164[2]->v.ob[1])) continue; - spBC[0] = (sp130[1] * sp124[2]) - (sp124[1] * sp130[2]); - spBC[1] = (sp130[2] * sp124[0]) - (sp124[2] * sp130[0]); - spBC[2] = (sp130[0] * sp124[1]) - (sp124[0] * sp130[1]); - if( (100000.0f < spBC[0]) || (100000.0f < spBC[1]) || (100000.0f < spBC[2]) - || (spBC[0] < -100000.0f) || (spBC[1] < -100000.0f) || (spBC[2] < -100000.0f) - ) { - spBC[0] /= 100000.0f; - spBC[1] /= 100000.0f; - spBC[2] /= 100000.0f; - } - sp118[0] = arg2[0] - sp90[0][0]; - sp118[1] = arg2[1] - sp90[0][1]; - sp118[2] = arg2[2] - sp90[0][2]; - sp10C[0] = arg3[0] - sp90[0][0]; - sp10C[1] = arg3[1] - sp90[0][1]; - sp10C[2] = arg3[2] - sp90[0][2]; - - temp_f12_2 = sp118[0]*spBC[0] + sp118[1]*spBC[1] + sp118[2]*spBC[2]; - temp_f2_2 = sp10C[0]*spBC[0] + sp10C[1]*spBC[1] + sp10C[2]*spBC[2]; - if ((!(temp_f12_2 >= 0.0f) || !(temp_f2_2 >= 0.0f)) && (!(temp_f12_2 <= 0.0f) || !(temp_f2_2 <= 0.0f))) { - if ((phi_s1->flags & 0x10000) && (temp_f12_2 < 0.0f)) { - spBC[0] = -spBC[0]; - spBC[1] = -spBC[1]; - spBC[2] = -spBC[2]; - } - if (spBC[0]*sp140[0] + spBC[1]*sp140[1] + spBC[2]*sp140[2] != 0.0f) { - temp_f0_2 = -((spBC[0]*arg2[0] + spBC[1]*arg2[1] + spBC[2]*arg2[2]) - (sp90[0][0]*spBC[0] + sp90[0][1]*spBC[1] + sp90[0][2]*spBC[2])) / temp_f12_3; - if (!(temp_f0_2 <= 0.0f) && !(temp_f0_2 >= 1.0f)) { - spFC[0] = (sp140[0] * temp_f0_2) + arg2[0]; - spFC[1] = (sp140[1] * temp_f0_2) + arg2[1]; - spFC[2] = (sp140[2] * temp_f0_2) + arg2[2]; - - phi_a0_2 = 1; - phi_f12 = (spBC[0] >= 0.0f) ? spBC[0] : -spBC[0]; - phi_f0 = (spBC[1] >= 0.0f) ? spBC[1] : -spBC[1]; - if (phi_f0 < phi_f12) { - phi_a0_2 = 0; - } - - phi_a0_2 = phi_a0_2; - phi_f12 = (spBC[2] >= 0.0f) ? spBC[2] : -spBC[2]; - phi_f0 = (spBC[phi_a0_2] >= 0.0f) ? spBC[phi_a0_2] : -spBC[phi_a0_2]; - if (phi_f0 < phi_f12) { - phi_a0_2 = 2; - } - - temp_hi = (s32) (phi_a0_2 + 1) % 3; - spF0 = spFC[temp_hi] - sp90[0][temp_hi]; - spF4 = sp130[temp_hi]; - spF8 = sp124[temp_hi]; - temp_hi_2 = (s32) (phi_a0_2 + 2) % 3; - spE4 = spFC[temp_hi_2] - sp90[0][temp_hi_2]; - spE8 = sp130[temp_hi_2]; - spEC = sp124[temp_hi_2]; - temp_f14_2 = (spF4 * spEC) - (sp124[temp_hi] * spE8); - temp_f18_2 = (spF0 * spEC) - (sp124[temp_hi] * spE4); - if (!((temp_f18_2 / temp_f14_2) < 0.0f)) { - temp_f12_4 = temp_f18_2 / temp_f14_2; - if (!(temp_f12_4 > 1.0f)) { - temp_f2_6 = ((spF4 * spE4) - (spF0 * spE8)) / temp_f14_2; - if (!(temp_f2_6 < 0.0f) && !(temp_f2_6 > 1.0f) && !((temp_f12_4 + temp_f2_6) > 1.0f)) { - sp8C = phi_s1; - arg3[0] = spFC[0]; - arg3[1] = spFC[1]; - arg3[2] = spFC[2]; - ml_vec3f_normalize_copy(arg4, spBC); - func_802E75D0(arg2, arg3, sp158, sp14C, sp140); - } - } - } - } - } - } + for(i = 0; i < 3; i++){ + temp_a2 = &vtx_pool[phi_s1->unk0[i]]; + for(j = 0; j <3; j++){ + sp90[i][j] = temp_a2->v.ob[j]; } } + sp130[0] = sp90[1][0] - sp90[0][0]; + sp130[1] = sp90[1][1] - sp90[0][1]; + sp130[2] = sp90[1][2] - sp90[0][2]; + + sp124[0] = sp90[2][0] - sp90[0][0]; + sp124[1] = sp90[2][1] - sp90[0][1]; + sp124[2] = sp90[2][2] - sp90[0][2]; + + spBC[0] = (sp130[1] * sp124[2]) - (sp130[2] * sp124[1]); + spBC[1] = (sp130[2] * sp124[0]) - (sp130[0] * sp124[2]); + spBC[2] = (sp130[0] * sp124[1]) - (sp130[1] * sp124[0]); + if( (100000.0f < spBC[0]) || (100000.0f < spBC[1]) || (100000.0f < spBC[2]) + || (spBC[0] < -100000.0f) || (spBC[1] < -100000.0f) || (spBC[2] < -100000.0f) + ) { + spBC[0] /= 100000.0f; + spBC[1] /= 100000.0f; + spBC[2] /= 100000.0f; + } + sp118[0] = arg2[0] - sp90[0][0]; + sp118[1] = arg2[1] - sp90[0][1]; + sp118[2] = arg2[2] - sp90[0][2]; + sp10C[0] = arg3[0] - sp90[0][0]; + sp10C[1] = arg3[1] - sp90[0][1]; + sp10C[2] = arg3[2] - sp90[0][2]; + + temp_f12_2 = sp118[0]*spBC[0] + sp118[1]*spBC[1] + sp118[2]*spBC[2]; + temp_f2_2 = sp10C[0]*spBC[0] + sp10C[1]*spBC[1] + sp10C[2]*spBC[2]; + pad = temp_f2_2; + if ((!((temp_f12_2 >= 0.0f) && (pad >= 0.0f)))) + if( !((temp_f12_2 <= 0.0f) && (pad <= 0.0f))) { + if ((phi_s1->flags & 0x10000) && (temp_f12_2 < 0.0f)) { + spBC[0] = -spBC[0]; + spBC[1] = -spBC[1]; + spBC[2] = -spBC[2]; + } + + temp_f12_3 = spBC[0]*sp140[0] + spBC[1]*sp140[1] + spBC[2]*sp140[2]; + pad = (sp90[0][0]*spBC[0] + sp90[0][1]*spBC[1] + sp90[0][2]*spBC[2]); + if (temp_f12_3 == 0.0f) + continue; + + temp_f0_2 = -((spBC[0]*arg2[0] + spBC[1]*arg2[1] + spBC[2]*arg2[2]) - pad)/ temp_f12_3; + if(temp_f0_2 <= 0.0f || 1.0f <= temp_f0_2) + continue; + + spFC[0] = arg2[0] + (sp140[0] * temp_f0_2); + spFC[1] = arg2[1] + (sp140[1] * temp_f0_2); + spFC[2] = arg2[2] + (sp140[2] * temp_f0_2); + + phi_a0_2 = (ABS_F(spBC[0]) > ABS_F(spBC[1])) ? 0 : 1; + phi_a0_2 = (ABS_F(spBC[2]) > ABS_F(spBC[phi_a0_2])) ? 2 : phi_a0_2; + + spF0[0] = spFC[(phi_a0_2 + 1) % 3] - sp90[0][(phi_a0_2 + 1) % 3]; + spF0[1] = sp130[(phi_a0_2 + 1) % 3]; + spF0[2] = sp124[(phi_a0_2 + 1) % 3]; + + spE4[0] = spFC[(phi_a0_2 + 2) % 3] - sp90[0][(phi_a0_2 + 2) % 3]; + spE4[1] = sp130[(phi_a0_2 + 2) % 3]; + spE4[2] = sp124[(phi_a0_2 + 2) % 3]; + temp_f14_2 = ((spF0[1] * spE4[2]) - (spE4[1] * spF0[2])); + + temp_f12_4 = ((spF0[0] * spE4[2]) - (spE4[0] * spF0[2])) / temp_f14_2; + if(temp_f12_4 < 0.0f || 1.0f < temp_f12_4) + continue; + + temp_f2_6 = ((spF0[1] * spE4[0]) - (spE4[1] * spF0[0])) / temp_f14_2; + if(temp_f2_6 < 0.0f || 1.0f < temp_f2_6) + continue; + + if(1.0f < (temp_f12_4 + temp_f2_6)) + continue; + + sp8C = phi_s1; + arg3[0] = spFC[0]; + arg3[1] = spFC[1]; + arg3[2] = spFC[2]; + ml_vec3f_normalize_copy(arg4, spBC); + func_802E75D0(arg2, arg3, sp158, sp14C, sp140); + } + } } func_802E6D20(sp8C, arg1); return sp8C; } -#endif - int func_802E805C(BKCollisionList *collision_list, BKVertexList *vtxList, f32 arg2[3], f32 arg3[3], f32 arg4, s32 arg5, s32 arg6, s32 arg7, s32 arg8){ f32 sp44[3];