Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGermano Cavalcante <germano.costa@ig.com.br>2021-08-03 23:34:14 +0300
committerGermano Cavalcante <germano.costa@ig.com.br>2021-08-03 23:35:35 +0300
commitfb87d236edb7e98c5fc526b9829e6bc6b8916828 (patch)
treeb07cf54f653ad67fef2a11bc4faed9ee819b95d6
parent18d900caca8317d33216bbc778c07b9f6ce3da84 (diff)
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.
-rw-r--r--source/blender/blenlib/BLI_math_geom.h4
-rw-r--r--source/blender/blenlib/intern/math_geom.c64
2 files changed, 34 insertions, 34 deletions
diff --git a/source/blender/blenlib/BLI_math_geom.h b/source/blender/blenlib/BLI_math_geom.h
index 9ac14a6edfe..bcda25ca533 100644
--- a/source/blender/blenlib/BLI_math_geom.h
+++ b/source/blender/blenlib/BLI_math_geom.h
@@ -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,
diff --git a/source/blender/blenlib/intern/math_geom.c b/source/blender/blenlib/intern/math_geom.c
index 803291e4a3b..823e72a91e5 100644
--- a/source/blender/blenlib/intern/math_geom.c
+++ b/source/blender/blenlib/intern/math_geom.c
@@ -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];
}
}