[Bf-blender-cvs] [eb11fb52028] tmp-transform-navigate: Transform Edge Slide: Update input

Germano Cavalcante noreply at git.blender.org
Wed Mar 2 20:54:11 CET 2022


Commit: eb11fb52028ca8026b1707a2e1d57d7d1ebc5ea0
Author: Germano Cavalcante
Date:   Wed Mar 2 12:28:42 2022 -0300
Branches: tmp-transform-navigate
https://developer.blender.org/rBeb11fb52028ca8026b1707a2e1d57d7d1ebc5ea0

Transform Edge Slide: Update input

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

M	source/blender/editors/transform/transform_input.c
M	source/blender/editors/transform/transform_mode.h
M	source/blender/editors/transform/transform_mode_edge_slide.c

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

diff --git a/source/blender/editors/transform/transform_input.c b/source/blender/editors/transform/transform_input.c
index 97d44ac904f..1c56515e516 100644
--- a/source/blender/editors/transform/transform_input.c
+++ b/source/blender/editors/transform/transform_input.c
@@ -19,6 +19,7 @@
 #include "WM_types.h"
 
 #include "transform.h"
+#include "transform_mode.h"
 
 #include "MEM_guardedalloc.h"
 
@@ -485,6 +486,10 @@ void transform_input_update(TransInfo *t, const float fac)
     data->mval_prev[0] += offset_center[0];
     data->mval_prev[1] += offset_center[1];
   }
+
+  if (t->mode == TFM_EDGE_SLIDE) {
+    transform_mode_edge_slide_reproject_input(t);
+  }
 }
 
 /** \} */
diff --git a/source/blender/editors/transform/transform_mode.h b/source/blender/editors/transform/transform_mode.h
index 8fde43ffd38..353ad2ddfa3 100644
--- a/source/blender/editors/transform/transform_mode.h
+++ b/source/blender/editors/transform/transform_mode.h
@@ -104,6 +104,7 @@ void drawEdgeSlide(TransInfo *t);
 void initEdgeSlide_ex(
     TransInfo *t, bool use_double_side, bool use_even, bool flipped, bool use_clamp);
 void initEdgeSlide(TransInfo *t);
+void transform_mode_edge_slide_reproject_input(TransInfo *t);
 
 /* transform_mode_gpopacity.c */
 void initGPOpacity(TransInfo *t);
diff --git a/source/blender/editors/transform/transform_mode_edge_slide.c b/source/blender/editors/transform/transform_mode_edge_slide.c
index b8e9a0d1a4d..7da18402556 100644
--- a/source/blender/editors/transform/transform_mode_edge_slide.c
+++ b/source/blender/editors/transform/transform_mode_edge_slide.c
@@ -292,6 +292,55 @@ static BMLoop *get_next_loop(
   return NULL;
 }
 
+static void edge_slide_pair_project(TransDataEdgeSlideVert *sv,
+                                    ARegion *region,
+                                    float projectMat[4][4],
+                                    float r_sco_a[3],
+                                    float r_sco_b[3])
+{
+  BMVert *v = sv->v;
+
+  if (sv->v_side[1]) {
+    ED_view3d_project_float_v3_m4(region, sv->v_side[1]->co, r_sco_b, projectMat);
+  }
+  else {
+    add_v3_v3v3(r_sco_b, v->co, sv->dir_side[1]);
+    ED_view3d_project_float_v3_m4(region, r_sco_b, r_sco_b, projectMat);
+  }
+
+  if (sv->v_side[0]) {
+    ED_view3d_project_float_v3_m4(region, sv->v_side[0]->co, r_sco_a, projectMat);
+  }
+  else {
+    add_v3_v3v3(r_sco_a, v->co, sv->dir_side[0]);
+    ED_view3d_project_float_v3_m4(region, r_sco_a, r_sco_a, projectMat);
+  }
+}
+
+static void edge_slide_data_init_mval(MouseInput *mi, EdgeSlideData *sld, float *mval_dir)
+{
+  /* Possible all of the edge loops are pointing directly at the view. */
+  if (UNLIKELY(len_squared_v2(mval_dir) < 0.1f)) {
+    mval_dir[0] = 0.0f;
+    mval_dir[1] = 100.0f;
+  }
+
+  float mval_start[2], mval_end[2];
+
+  /* Zero out Start. */
+  zero_v2(mval_start);
+
+  /* dir holds a vector along edge loop */
+  copy_v2_v2(mval_end, mval_dir);
+  mul_v2_fl(mval_end, 0.5f);
+
+  sld->mval_start[0] = mi->imval[0] + mval_start[0];
+  sld->mval_start[1] = mi->imval[1] + mval_start[1];
+
+  sld->mval_end[0] = mi->imval[0] + mval_end[0];
+  sld->mval_end[1] = mi->imval[1] + mval_end[1];
+}
+
 /**
  * Calculate screenspace `mval_start` / `mval_end`, optionally slide direction.
  */
@@ -315,7 +364,6 @@ static void calcEdgeSlide_mval_range(TransInfo *t,
   /* only for use_calc_direction */
   float(*loop_dir)[3] = NULL, *loop_maxdist = NULL;
 
-  float mval_start[2], mval_end[2];
   float mval_dir[3], dist_best_sq;
 
   if (t->spacetype == SPACE_VIEW3D) {
@@ -379,21 +427,7 @@ static void calcEdgeSlide_mval_range(TransInfo *t,
         continue;
       }
 
-      if (sv->v_side[1]) {
-        ED_view3d_project_float_v3_m4(region, sv->v_side[1]->co, sco_b, projectMat);
-      }
-      else {
-        add_v3_v3v3(sco_b, v->co, sv->dir_side[1]);
-        ED_view3d_project_float_v3_m4(region, sco_b, sco_b, projectMat);
-      }
-
-      if (sv->v_side[0]) {
-        ED_view3d_project_float_v3_m4(region, sv->v_side[0]->co, sco_a, projectMat);
-      }
-      else {
-        add_v3_v3v3(sco_a, v->co, sv->dir_side[0]);
-        ED_view3d_project_float_v3_m4(region, sco_a, sco_a, projectMat);
-      }
+      edge_slide_pair_project(sv, region, projectMat, sco_a, sco_b);
 
       /* global direction */
       dist_sq = dist_squared_to_line_segment_v2(mval, sco_b, sco_a);
@@ -433,24 +467,7 @@ static void calcEdgeSlide_mval_range(TransInfo *t,
     MEM_freeN(loop_maxdist);
   }
 
-  /* possible all of the edge loops are pointing directly at the view */
-  if (UNLIKELY(len_squared_v2(mval_dir) < 0.1f)) {
-    mval_dir[0] = 0.0f;
-    mval_dir[1] = 100.0f;
-  }
-
-  /* zero out start */
-  zero_v2(mval_start);
-
-  /* dir holds a vector along edge loop */
-  copy_v2_v2(mval_end, mval_dir);
-  mul_v2_fl(mval_end, 0.5f);
-
-  sld->mval_start[0] = t->mval[0] + mval_start[0];
-  sld->mval_start[1] = t->mval[1] + mval_start[1];
-
-  sld->mval_end[0] = t->mval[0] + mval_end[0];
-  sld->mval_end[1] = t->mval[1] + mval_end[1];
+  edge_slide_data_init_mval(&t->mouse, sld, mval_dir);
 
   if (bmbvh) {
     BKE_bmbvh_free(bmbvh);
@@ -1553,3 +1570,44 @@ void initEdgeSlide(TransInfo *t)
 }
 
 /** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Mouse Input Utilities
+ * \{ */
+
+void transform_mode_edge_slide_reproject_input(TransInfo *t)
+{
+  ARegion *region = t->region;
+  RegionView3D *rv3d = NULL;
+
+  if (t->spacetype == SPACE_VIEW3D) {
+    /* Background mode support. */
+    rv3d = region ? region->regiondata : NULL;
+  }
+
+  FOREACH_TRANS_DATA_CONTAINER (t, tc) {
+    EdgeSlideData *sld = tc->custom.mode.data;
+    if (sld) {
+      float projectMat[4][4];
+      if (!rv3d) {
+        /* ok, let's try to survive this */
+        unit_m4(projectMat);
+      }
+      else {
+        ED_view3d_ob_project_mat_get(rv3d, tc->obedit, projectMat);
+      }
+
+      TransDataEdgeSlideVert *curr_sv = &sld->sv[sld->curr_sv_index];
+
+      float mval_dir[3], sco_a[3], sco_b[3];
+      edge_slide_pair_project(curr_sv, region, projectMat, sco_a, sco_b);
+      sub_v3_v3v3(mval_dir, sco_b, sco_a);
+      edge_slide_data_init_mval(&t->mouse, sld, mval_dir);
+    }
+  }
+
+  EdgeSlideData *sld = edgeSlideFirstGet(t);
+  setCustomPoints(t, &t->mouse, sld->mval_end, sld->mval_start);
+}
+
+/** \} */



More information about the Bf-blender-cvs mailing list