[Bf-blender-cvs] [145270d8d7c] master: Fix T90427: Center View to Mouse broken

Germano Cavalcante noreply at git.blender.org
Wed Aug 4 15:47:17 CEST 2021


Commit: 145270d8d7c6812de9fd1ba50cc51ffc53953881
Author: Germano Cavalcante
Date:   Wed Aug 4 10:46:42 2021 -0300
Branches: master
https://developer.blender.org/rB145270d8d7c6812de9fd1ba50cc51ffc53953881

Fix T90427: Center View to Mouse broken

rBfb87d236edb7 made the values returned by `projmat_dimensions` more
standardized following the documentations. But the functions in Blender
that called `projmat_dimensions` followed a proposal that these values
corresponded to a distance of 1m of clip.

Adjust these functions to follow the new algorithm.

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

M	source/blender/draw/intern/draw_manager_data.c
M	source/blender/gpu/intern/gpu_matrix.cc

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

diff --git a/source/blender/draw/intern/draw_manager_data.c b/source/blender/draw/intern/draw_manager_data.c
index 2126385a352..af331c86a8b 100644
--- a/source/blender/draw/intern/draw_manager_data.c
+++ b/source/blender/draw/intern/draw_manager_data.c
@@ -1533,13 +1533,6 @@ static void draw_frustum_boundbox_calc(const float (*viewinv)[4],
 
   projmat_dimensions(projmat, &left, &right, &bottom, &top, &near, &far);
 
-  if (is_persp) {
-    left *= near;
-    right *= near;
-    bottom *= near;
-    top *= near;
-  }
-
   r_bbox->vec[0][2] = r_bbox->vec[3][2] = r_bbox->vec[7][2] = r_bbox->vec[4][2] = -near;
   r_bbox->vec[0][0] = r_bbox->vec[3][0] = left;
   r_bbox->vec[4][0] = r_bbox->vec[7][0] = right;
diff --git a/source/blender/gpu/intern/gpu_matrix.cc b/source/blender/gpu/intern/gpu_matrix.cc
index 6eb9cb823d5..efa04568401 100644
--- a/source/blender/gpu/intern/gpu_matrix.cc
+++ b/source/blender/gpu/intern/gpu_matrix.cc
@@ -532,17 +532,17 @@ static void gpu_mul_invert_projmat_m4_unmapped_v3_with_precalc(
     const struct GPUMatrixUnproject_Precalc *precalc, float co[3])
 {
   /* 'precalc->dims' is the result of 'projmat_dimensions(proj, ...)'. */
-  co[0] = precalc->dims.xmin + co[0] * (precalc->dims.xmax - precalc->dims.xmin);
-  co[1] = precalc->dims.ymin + co[1] * (precalc->dims.ymax - precalc->dims.ymin);
+  co[0] = (float)scalenormd(precalc->dims.xmin, precalc->dims.xmax, co[0]);
+  co[1] = (float)scalenormd(precalc->dims.ymin, precalc->dims.ymax, co[1]);
 
   if (precalc->is_persp) {
-    co[2] = precalc->dims.zmax * precalc->dims.zmin /
+    co[2] = (precalc->dims.zmax * precalc->dims.zmin) /
             (precalc->dims.zmax + co[2] * (precalc->dims.zmin - precalc->dims.zmax));
-    co[0] *= co[2];
-    co[1] *= co[2];
+    co[0] *= co[2] / precalc->dims.zmin;
+    co[1] *= co[2] / precalc->dims.zmin;
   }
   else {
-    co[2] = precalc->dims.zmin + co[2] * (precalc->dims.zmax - precalc->dims.zmin);
+    co[2] = (float)scalenormd(precalc->dims.zmin, precalc->dims.zmax, co[2]);
   }
   co[2] *= -1;
 }



More information about the Bf-blender-cvs mailing list