Fix calculation of 'projmat_dimensions'

`r_left`, `r_right`, `r_bottom` and `r_top` were ignoring `clip_near` value
when in perspective view.

Also rename `projmat` to `winmat` in these cases.
This commit is contained in:
Germano Cavalcante 2021-08-03 17:34:14 -03:00
parent 18d900caca
commit fb87d236ed
Notes: blender-bot 2023-02-14 10:09:24 +01:00
Referenced by commit 145270d8d7, Fix T90427: Center View to Mouse broken
Referenced by issue #90427, Center View to Mouse broken
2 changed files with 34 additions and 34 deletions

View File

@ -682,14 +682,14 @@ void planes_from_projmat(const float mat[4][4],
float near[4],
float far[4]);
void projmat_dimensions(const float projmat[4][4],
void projmat_dimensions(const float winmat[4][4],
float *r_left,
float *r_right,
float *r_bottom,
float *r_top,
float *r_near,
float *r_far);
void projmat_dimensions_db(const float projmat[4][4],
void projmat_dimensions_db(const float winmat[4][4],
double *r_left,
double *r_right,
double *r_bottom,

View File

@ -4962,7 +4962,7 @@ void planes_from_projmat(const float mat[4][4],
}
}
void projmat_dimensions(const float projmat[4][4],
void projmat_dimensions(const float winmat[4][4],
float *r_left,
float *r_right,
float *r_bottom,
@ -4970,27 +4970,27 @@ void projmat_dimensions(const float projmat[4][4],
float *r_near,
float *r_far)
{
bool is_persp = projmat[3][3] == 0.0f;
const bool is_persp = winmat[3][3] == 0.0f;
if (is_persp) {
*r_left = (projmat[2][0] - 1.0f) / projmat[0][0];
*r_right = (projmat[2][0] + 1.0f) / projmat[0][0];
*r_bottom = (projmat[2][1] - 1.0f) / projmat[1][1];
*r_top = (projmat[2][1] + 1.0f) / projmat[1][1];
*r_near = projmat[3][2] / (projmat[2][2] - 1.0f);
*r_far = projmat[3][2] / (projmat[2][2] + 1.0f);
const float near = winmat[3][2] / (winmat[2][2] - 1.0f);
*r_left = near * ((winmat[2][0] - 1.0f) / winmat[0][0]);
*r_right = near * ((winmat[2][0] + 1.0f) / winmat[0][0]);
*r_bottom = near * ((winmat[2][1] - 1.0f) / winmat[1][1]);
*r_top = near * ((winmat[2][1] + 1.0f) / winmat[1][1]);
*r_near = near;
*r_far = winmat[3][2] / (winmat[2][2] + 1.0f);
}
else {
*r_left = (-projmat[3][0] - 1.0f) / projmat[0][0];
*r_right = (-projmat[3][0] + 1.0f) / projmat[0][0];
*r_bottom = (-projmat[3][1] - 1.0f) / projmat[1][1];
*r_top = (-projmat[3][1] + 1.0f) / projmat[1][1];
*r_near = (projmat[3][2] + 1.0f) / projmat[2][2];
*r_far = (projmat[3][2] - 1.0f) / projmat[2][2];
*r_left = (-winmat[3][0] - 1.0f) / winmat[0][0];
*r_right = (-winmat[3][0] + 1.0f) / winmat[0][0];
*r_bottom = (-winmat[3][1] - 1.0f) / winmat[1][1];
*r_top = (-winmat[3][1] + 1.0f) / winmat[1][1];
*r_near = (winmat[3][2] + 1.0f) / winmat[2][2];
*r_far = (winmat[3][2] - 1.0f) / winmat[2][2];
}
}
void projmat_dimensions_db(const float projmat_fl[4][4],
void projmat_dimensions_db(const float winmat_fl[4][4],
double *r_left,
double *r_right,
double *r_bottom,
@ -4998,26 +4998,26 @@ void projmat_dimensions_db(const float projmat_fl[4][4],
double *r_near,
double *r_far)
{
double projmat[4][4];
copy_m4d_m4(projmat, projmat_fl);
bool is_persp = projmat[3][3] == 0.0f;
double winmat[4][4];
copy_m4d_m4(winmat, winmat_fl);
const bool is_persp = winmat[3][3] == 0.0f;
if (is_persp) {
*r_left = (projmat[2][0] - 1.0) / projmat[0][0];
*r_right = (projmat[2][0] + 1.0) / projmat[0][0];
*r_bottom = (projmat[2][1] - 1.0) / projmat[1][1];
*r_top = (projmat[2][1] + 1.0) / projmat[1][1];
*r_near = projmat[3][2] / (projmat[2][2] - 1.0);
*r_far = projmat[3][2] / (projmat[2][2] + 1.0);
const double near = winmat[3][2] / (winmat[2][2] - 1.0);
*r_left = near * ((winmat[2][0] - 1.0) / winmat[0][0]);
*r_right = near * ((winmat[2][0] + 1.0) / winmat[0][0]);
*r_bottom = near * ((winmat[2][1] - 1.0) / winmat[1][1]);
*r_top = near * ((winmat[2][1] + 1.0) / winmat[1][1]);
*r_near = near;
*r_far = winmat[3][2] / (winmat[2][2] + 1.0);
}
else {
*r_left = (-projmat[3][0] - 1.0) / projmat[0][0];
*r_right = (-projmat[3][0] + 1.0) / projmat[0][0];
*r_bottom = (-projmat[3][1] - 1.0) / projmat[1][1];
*r_top = (-projmat[3][1] + 1.0) / projmat[1][1];
*r_near = (projmat[3][2] + 1.0) / projmat[2][2];
*r_far = (projmat[3][2] - 1.0) / projmat[2][2];
*r_left = (-winmat[3][0] - 1.0) / winmat[0][0];
*r_right = (-winmat[3][0] + 1.0) / winmat[0][0];
*r_bottom = (-winmat[3][1] - 1.0) / winmat[1][1];
*r_top = (-winmat[3][1] + 1.0) / winmat[1][1];
*r_near = (winmat[3][2] + 1.0) / winmat[2][2];
*r_far = (winmat[3][2] - 1.0) / winmat[2][2];
}
}