forked from bartvdbraak/blender
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:
parent
18d900caca
commit
fb87d236ed
@ -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,
|
||||
|
@ -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];
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user