[Bf-blender-cvs] [fb87d236edb] master: Fix calculation of 'projmat_dimensions'

Germano Cavalcante noreply at git.blender.org
Tue Aug 3 22:43:40 CEST 2021


Commit: fb87d236edb7e98c5fc526b9829e6bc6b8916828
Author: Germano Cavalcante
Date:   Tue Aug 3 17:34:14 2021 -0300
Branches: master
https://developer.blender.org/rBfb87d236edb7e98c5fc526b9829e6bc6b8916828

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.

===================================================================

M	source/blender/blenlib/BLI_math_geom.h
M	source/blender/blenlib/intern/math_geom.c

===================================================================

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



More information about the Bf-blender-cvs mailing list