viewport - further documentation

This commit is contained in:
mariob92
2024-09-10 09:23:21 +02:00
parent a0994765b1
commit d36f6a807c
8 changed files with 59 additions and 50 deletions

View File

@@ -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);

View File

@@ -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

View File

@@ -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]);
arg2[0] += sViewportPosition[0];
arg2[1] += sViewportPosition[1];
arg2[2] += sViewportPosition[2];
return D_80281024;
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]);
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;
}

View File

@@ -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){

View File

@@ -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);
}

View File

@@ -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;

View File

@@ -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];

View File

@@ -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];