diff --git a/include/functions.h b/include/functions.h index 273f13af..f3e2903b 100644 --- a/include/functions.h +++ b/include/functions.h @@ -612,7 +612,7 @@ extern void viewport_setFrustumPlanes(f32 arg0[4], f32 arg1[4], f32 arg2[4], f32 extern bool viewport_isBoundingBoxInFrustum(f32 min[3], f32 max[3]); extern bool cube_isInFrustum(Cube *cube); extern bool cube_isInFrustum2(Cube *cube); -extern bool viewport_func_8024DB50(f32 arg0[3], f32 arg1); +extern bool viewport_func_8024DB50(f32 pos[3], f32 distance); extern bool viewport_isPointOutsideFrustum_3f(f32 x, f32 y, f32 z); extern bool viewport_isPointOutsideFrustum_vec3f(f32 arg0[3]); extern bool viewport_isPointPlane_3f(f32 arg0, f32 arg1, f32 arg2); @@ -622,9 +622,9 @@ extern f32 viewport_getFOVy(void); extern void viewport_setFOVy(f32 fovy); extern f32 viewport_getAspectRatio(void); extern f32 viewport_getNear(void); -extern f32 viewport_func_8024DDD8(f32 arg0[3], f32 arg1); -extern f32 viewport_func_8024DE1C(f32 arg0, f32 arg1, f32 arg2[3], f32 arg3[3]); -extern bool viewport_func_8024E030(f32 arg0[3], f32 *arg1); +extern f32 viewport_adjustAngleToRight(f32 pos[3], f32 angle); +extern f32 viewport_transformCoordinate(f32 x, f32 y, f32 viewport_translation[3], f32 viewport_rotation[3]); +extern bool viewport_func_8024E030(f32 pos[3], f32 *arg1); extern void viewport_backupState(void); extern void viewport_restoreState(void); extern void viewport_adjustPointDistance(f32 pos[3], f32 distance); diff --git a/src/core1/code_18350.c b/src/core1/code_18350.c index 0c73aaa8..3695831a 100644 --- a/src/core1/code_18350.c +++ b/src/core1/code_18350.c @@ -1044,6 +1044,7 @@ f32 ml_cos_deg(f32 angle_deg) return cosf(angle_deg * BAD_DTOR); } +// brings angle in range between 0 and 360 degrees f32 mlNormalizeAngle(f32 angle) { if (angle < 0.0) // f64 diff --git a/src/core1/code_EAF0.c b/src/core1/code_EAF0.c index 887b2498..2f0d5d7f 100644 --- a/src/core1/code_EAF0.c +++ b/src/core1/code_EAF0.c @@ -351,16 +351,17 @@ bool cube_isInFrustum2(Cube *cube) { return viewport_isBoundingBoxInFrustum(min, max); } -bool viewport_func_8024DB50(f32 arg0[3], f32 arg1) { +// viewport_distanceFromPlane ? +bool viewport_func_8024DB50(f32 pos[3], f32 distance) { f32 delta[3]; s32 i; - delta[0] = arg0[0] - sViewportPosition[0]; - delta[1] = arg0[1] - sViewportPosition[1]; - delta[2] = arg0[2] - sViewportPosition[2]; + delta[0] = pos[0] - sViewportPosition[0]; + delta[1] = pos[1] - sViewportPosition[1]; + delta[2] = pos[2] - sViewportPosition[2]; for(i = 0; i < 4; i++) { - if(arg1 <= ml_dotProduct_vec3f(delta, sViewportFrustumPlanes[i])){ + if(distance <= ml_dotProduct_vec3f(delta, sViewportFrustumPlanes[i])) { return FALSE; } } @@ -411,37 +412,42 @@ f32 viewport_getNear(void) { return sViewportNear; } -f32 viewport_func_8024DDD8(f32 arg0[3], f32 arg1) { - return mlNormalizeAngle((sViewportRotation[1] + arg1) + 90.0); +f32 viewport_adjustAngleToRight(f32 pos[3], f32 angle) { + return mlNormalizeAngle((sViewportRotation[1] + angle) + 90.0); } -f32 viewport_func_8024DE1C(f32 arg0, f32 arg1, f32 arg2[3], f32 arg3[3]) { +f32 viewport_transformCoordinate(f32 x, f32 y, f32 viewport_translation[3], f32 viewport_rotation[3]) { f32 fovy_rad; - static f32 D_8028101C; - static f32 D_80281020; - static f32 D_80281024; + static f32 fovy; + static f32 near; + static f32 scale; - if ((sViewportFOVy != D_8028101C) || (sViewportNear != D_80281020)) { + if ((sViewportFOVy != fovy) || (sViewportNear != near)) { fovy_rad = (sViewportFOVy * M_PI) / 360.0; - D_80281024 = (500.0 + sViewportNear) / (((framebuffer_height / (f32)2) / sinf(fovy_rad)) * cosf(fovy_rad)); - D_8028101C = sViewportFOVy; - D_80281020 = sViewportNear; + scale = (500.0 + sViewportNear) / (((framebuffer_height / (f32)2) / sinf(fovy_rad)) * cosf(fovy_rad)); + fovy = sViewportFOVy; + near = sViewportNear; } - arg0 = arg0 - (framebuffer_width / (f32)2); - arg1 = (framebuffer_height / (f32)2) - arg1; - arg3[0] = sViewportRotation[0]; - arg3[1] = sViewportRotation[1]; - arg3[2] = sViewportRotation[2]; - arg2[0] = arg0 * D_80281024; - arg2[1] = arg1 * D_80281024; - arg2[2] = (-500.0 - sViewportNear); - ml_vec3f_pitch_rotate_copy(arg2, arg2, arg3[0]); - ml_vec3f_yaw_rotate_copy(arg2, arg2, arg3[1]); + + x = x - (framebuffer_width / (f32)2); + y = (framebuffer_height / (f32)2) - y; + + viewport_rotation[0] = sViewportRotation[0]; + viewport_rotation[1] = sViewportRotation[1]; + viewport_rotation[2] = sViewportRotation[2]; + + viewport_translation[0] = x * scale; + viewport_translation[1] = y * scale; + viewport_translation[2] = (-500.0 - sViewportNear); + + ml_vec3f_pitch_rotate_copy(viewport_translation, viewport_translation, viewport_rotation[0]); + ml_vec3f_yaw_rotate_copy(viewport_translation, viewport_translation, viewport_rotation[1]); - arg2[0] += sViewportPosition[0]; - arg2[1] += sViewportPosition[1]; - arg2[2] += sViewportPosition[2]; - return D_80281024; + viewport_translation[0] += sViewportPosition[0]; + viewport_translation[1] += sViewportPosition[1]; + viewport_translation[2] += sViewportPosition[2]; + + return scale; } f32 sViewportBackupPosition[3]; @@ -450,31 +456,32 @@ f32 sViewportBackupFrustumPlanes[4][4]; f32 sViewportBackupLookVector[3]; f32 sViewportBackupMatrix[4][4]; -bool viewport_func_8024E030(f32 arg0[3], f32 *arg1) +// ?? +bool viewport_func_8024E030(f32 pos[3], f32 *arg1) { - f32 sp34[3]; + f32 delta[3]; f32 temp_f2_2; f32 temp_f2; f32 fovy_radians; fovy_radians = (sViewportFOVy * M_PI) / 360.0; - sp34[0] = arg0[0] - sViewportPosition[0]; - sp34[1] = arg0[1] - sViewportPosition[1]; - sp34[2] = arg0[2] - sViewportPosition[2]; + delta[0] = pos[0] - sViewportPosition[0]; + delta[1] = pos[1] - sViewportPosition[1]; + delta[2] = pos[2] - sViewportPosition[2]; - ml_vec3f_yaw_rotate_copy(sp34, sp34, -sViewportRotation[1]); - ml_vec3f_pitch_rotate_copy(sp34, sp34, -sViewportRotation[0]); + ml_vec3f_yaw_rotate_copy(delta, delta, -sViewportRotation[1]); + ml_vec3f_pitch_rotate_copy(delta, delta, -sViewportRotation[0]); - if ((-sViewportNear) <= sp34[2]) { + if ((-sViewportNear) <= delta[2]) { return FALSE; } - temp_f2 = gu_sqrtf((sp34[1] * sp34[1]) + (sp34[2] * sp34[2])) * sinf(fovy_radians); + temp_f2 = gu_sqrtf((delta[1] * delta[1]) + (delta[2] * delta[2])) * sinf(fovy_radians); temp_f2_2 = (((f32) framebuffer_width) / ((f32) framebuffer_height)) * temp_f2; - arg1[0] = (f32) (((sp34[0] / temp_f2_2) + 1) * (((f32) framebuffer_width) / 2)); - arg1[1] = (f32) ((1 - (sp34[1] / temp_f2)) * (((f32) framebuffer_height) / 2)); + arg1[0] = (f32) (((delta[0] / temp_f2_2) + 1) * (((f32) framebuffer_width) / 2)); + arg1[1] = (f32) ((1 - (delta[1] / temp_f2)) * (((f32) framebuffer_height) / 2)); if ((arg1[0] < (-((f32) framebuffer_width))) || ((((f32) framebuffer_width) * 2) < arg1[0])) { return FALSE; @@ -483,6 +490,7 @@ bool viewport_func_8024E030(f32 arg0[3], f32 *arg1) if ((arg1[1] < (-((f32) framebuffer_height))) || ((((f32) framebuffer_height) * 2) < arg1[1])) { return FALSE; } + return TRUE; } diff --git a/src/core2/code_13FC0.c b/src/core2/code_13FC0.c index 50baa41f..8087dcd5 100644 --- a/src/core2/code_13FC0.c +++ b/src/core2/code_13FC0.c @@ -140,7 +140,7 @@ f32 func_8029B33C(void){ f32 sp1C[3]; _player_getPosition(sp1C); - return viewport_func_8024DDD8(sp1C, func_8029B2F4()); + return viewport_adjustAngleToRight(sp1C, func_8029B2F4()); } s32 func_8029B370(void){ diff --git a/src/core2/code_39D0.c b/src/core2/code_39D0.c index 0e4b07ff..8419e9ec 100644 --- a/src/core2/code_39D0.c +++ b/src/core2/code_39D0.c @@ -142,8 +142,8 @@ bool func_8028AE10(void) { _player_getPosition(sp1C); ideal_yaw = yaw_getIdeal(); - sp2C = viewport_func_8024DDD8(sp1C, 90.0f); - sp28 = viewport_func_8024DDD8(sp1C, 270.0f); + sp2C = viewport_adjustAngleToRight(sp1C, 90.0f); + sp28 = viewport_adjustAngleToRight(sp1C, 270.0f); if (sp28 < sp2C) { return (sp2C < ideal_yaw) || (ideal_yaw < sp28); } diff --git a/src/core2/fx/common3score.c b/src/core2/fx/common3score.c index f4dfa4bb..c4333ef7 100644 --- a/src/core2/fx/common3score.c +++ b/src/core2/fx/common3score.c @@ -191,7 +191,7 @@ void fxcommon3score_draw(enum item_e item_id, void *arg1, Gfx **gfx, Mtx **mtx, a1->value_string[0] = '\0'; strIToA(a1->value_string, itemPrint_getValue(item_id)); print_bold_spaced(a1->unk30 + a1->unk40, sp40 + a1->unk44, a1->value_string); - sp3C = viewport_func_8024DE1C(a1->unk30, sp40, sp5C, sp68); + sp3C = viewport_transformCoordinate(a1->unk30, sp40, sp5C, sp68); sp44[0] = 0.0f; sp44[1] = a1->unk38; diff --git a/src/core2/gc/pauseMenu.c b/src/core2/gc/pauseMenu.c index 5f736465..f706830b 100644 --- a/src/core2/gc/pauseMenu.c +++ b/src/core2/gc/pauseMenu.c @@ -1209,7 +1209,7 @@ void __gcpausemenu_drawSprite(Gfx** gdl, Mtx** mptr, Vtx** vptr, BKSprite* sprit func_8033837C(0); viewport_getPosition_vec3f(sp50); - sp34 = viewport_func_8024DE1C(x, y, sp5C, sp44); + sp34 = viewport_transformCoordinate(x, y, sp5C, sp44); mlMtxIdent(); //matrix_stack_identity sp38[0] = sp5C[0] - sp50[0]; sp38[1] = sp5C[1] - sp50[1]; diff --git a/src/core2/gc/zoombox.c b/src/core2/gc/zoombox.c index 825eee6a..687151e1 100644 --- a/src/core2/gc/zoombox.c +++ b/src/core2/gc/zoombox.c @@ -822,7 +822,7 @@ void func_803163A8(GcZoombox *this, Gfx **gfx, Mtx **mtx) { f32 sp38[3]; f32 sp34; - sp34 = viewport_func_8024DE1C(this->unk170, this->unk172, sp50, sp5C); + sp34 = viewport_transformCoordinate(this->unk170, this->unk172, sp50, sp5C); if (this->unk1A4_24) { sp5C[1] += 180.0f; sp5C[0] -= 2*sp5C[0];