[Bf-blender-cvs] [e2fc9a88bcb] master: Transform: Full snapping support for Vert Slide

Germano Cavalcante noreply at git.blender.org
Mon Jun 22 14:08:28 CEST 2020


Commit: e2fc9a88bcb328284e5eab4934a9b8cc8200d55e
Author: Germano Cavalcante
Date:   Mon Jun 22 09:07:51 2020 -0300
Branches: master
https://developer.blender.org/rBe2fc9a88bcb328284e5eab4934a9b8cc8200d55e

Transform: Full snapping support for Vert Slide

Now all options for "snap to" affect the Vert Slide mode.

Reviewed By: campbellbarton

Maniphest Tasks: T66426

Differential Revision: https://developer.blender.org/D3440

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

M	source/blender/editors/transform/transform_constraints.c
M	source/blender/editors/transform/transform_constraints.h
M	source/blender/editors/transform/transform_mode_translate.c
M	source/blender/editors/transform/transform_mode_vert_slide.c
M	source/blender/editors/transform/transform_snap.c
M	source/blender/editors/transform/transform_snap.h

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

diff --git a/source/blender/editors/transform/transform_constraints.c b/source/blender/editors/transform/transform_constraints.c
index 97b14d5ddd2..abf1a78f13a 100644
--- a/source/blender/editors/transform/transform_constraints.c
+++ b/source/blender/editors/transform/transform_constraints.c
@@ -320,7 +320,7 @@ static void axisProjection(const TransInfo *t,
 /**
  * Snap to the intersection between the edge direction and the constraint plane.
  */
-static void constraint_plane_to_edge(const TransInfo *t, const float plane[4], float r_out[3])
+static void constraint_snap_plane_to_edge(const TransInfo *t, const float plane[4], float r_out[3])
 {
   float lambda;
   const float *edge_snap_point = t->tsnap.snapPoint;
@@ -336,7 +336,7 @@ static void constraint_plane_to_edge(const TransInfo *t, const float plane[4], f
  * Snap to the nearest point between the snap point and the line that
  * intersects the face plane with the constraint plane.
  */
-static void constraint_plane_to_face(const TransInfo *t, const float plane[4], float r_out[3])
+static void constraint_snap_plane_to_face(const TransInfo *t, const float plane[4], float r_out[3])
 {
   float face_plane[4], isect_orig[3], isect_dir[3];
   const float *face_snap_point = t->tsnap.snapPoint;
@@ -352,7 +352,9 @@ static void constraint_plane_to_face(const TransInfo *t, const float plane[4], f
 /**
  * Snap to the nearest point on the axis to the edge/line element.
  */
-static void constraint_axis_to_edge(const TransInfo *t, const float axis[3], float r_out[3])
+void transform_constraint_snap_axis_to_edge(const TransInfo *t,
+                                            const float axis[3],
+                                            float r_out[3])
 {
   float lambda;
   const float *edge_snap_point = t->tsnap.snapPoint;
@@ -367,7 +369,9 @@ static void constraint_axis_to_edge(const TransInfo *t, const float axis[3], flo
 /**
  * Snap to the intersection of the axis and the plane defined by the face.
  */
-static void constraint_axis_to_face(const TransInfo *t, const float axis[3], float r_out[3])
+void transform_constraint_snap_axis_to_face(const TransInfo *t,
+                                            const float axis[3],
+                                            float r_out[3])
 {
   float lambda;
   float face_plane[4];
@@ -444,10 +448,10 @@ static void applyAxisConstraintVec(
           constraint_plane_calc(t, plane);
 
           if (is_snap_to_edge) {
-            constraint_plane_to_edge(t, plane, out);
+            constraint_snap_plane_to_edge(t, plane, out);
           }
           else if (is_snap_to_face) {
-            constraint_plane_to_face(t, plane, out);
+            constraint_snap_plane_to_face(t, plane, out);
           }
           else {
             /* View alignment correction. */
@@ -471,10 +475,10 @@ static void applyAxisConstraintVec(
         }
 
         if (is_snap_to_edge) {
-          constraint_axis_to_edge(t, c, out);
+          transform_constraint_snap_axis_to_edge(t, c, out);
         }
         else if (is_snap_to_face) {
-          constraint_axis_to_face(t, c, out);
+          transform_constraint_snap_axis_to_face(t, c, out);
         }
         else {
           /* View alignment correction. */
diff --git a/source/blender/editors/transform/transform_constraints.h b/source/blender/editors/transform/transform_constraints.h
index c41b9361ca4..282060af2c3 100644
--- a/source/blender/editors/transform/transform_constraints.h
+++ b/source/blender/editors/transform/transform_constraints.h
@@ -27,6 +27,12 @@
 struct TransInfo;
 
 void constraintNumInput(TransInfo *t, float vec[3]);
+void transform_constraint_snap_axis_to_edge(const TransInfo *t,
+                                            const float axis[3],
+                                            float r_out[3]);
+void transform_constraint_snap_axis_to_face(const TransInfo *t,
+                                            const float axis[3],
+                                            float r_out[3]);
 void setConstraint(TransInfo *t, int mode, const char text[]);
 void setAxisMatrixConstraint(TransInfo *t, int mode, const char text[]);
 void setLocalConstraint(TransInfo *t, int mode, const char text[]);
diff --git a/source/blender/editors/transform/transform_mode_translate.c b/source/blender/editors/transform/transform_mode_translate.c
index 84cfeea96b0..aee05197f10 100644
--- a/source/blender/editors/transform/transform_mode_translate.c
+++ b/source/blender/editors/transform/transform_mode_translate.c
@@ -215,11 +215,6 @@ static void headerTranslation(TransInfo *t, const float vec[3], char str[UI_MAX_
   }
 }
 
-static float TranslationBetween(TransInfo *UNUSED(t), const float p1[3], const float p2[3])
-{
-  return len_squared_v3v3(p1, p2);
-}
-
 static void ApplySnapTranslation(TransInfo *t, float vec[3])
 {
   float point[3];
@@ -411,7 +406,7 @@ void initTranslation(TransInfo *t)
 
   t->transform = applyTranslation;
   t->tsnap.applySnap = ApplySnapTranslation;
-  t->tsnap.distance = TranslationBetween;
+  t->tsnap.distance = transform_snap_distance_len_squared_fn;
 
   initMouseInputMode(t, &t->mouse, INPUT_VECTOR);
 
diff --git a/source/blender/editors/transform/transform_mode_vert_slide.c b/source/blender/editors/transform/transform_mode_vert_slide.c
index 62415b1ddc6..157358016e6 100644
--- a/source/blender/editors/transform/transform_mode_vert_slide.c
+++ b/source/blender/editors/transform/transform_mode_vert_slide.c
@@ -47,6 +47,7 @@
 #include "BLT_translation.h"
 
 #include "transform.h"
+#include "transform_constraints.h"
 #include "transform_convert.h"
 #include "transform_mode.h"
 #include "transform_snap.h"
@@ -538,6 +539,37 @@ void doVertSlide(TransInfo *t, float perc)
   }
 }
 
+static void vert_slide_snap_apply(TransInfo *t, float *value)
+{
+  TransDataContainer *tc = TRANS_DATA_CONTAINER_FIRST_OK(t);
+  VertSlideData *sld = tc->custom.mode.data;
+  TransDataVertSlideVert *sv = &sld->sv[sld->curr_sv_index];
+
+  float snap_point[3], co_orig_3d[3], co_curr_3d[3], dvec[3];
+  copy_v3_v3(co_orig_3d, sv->co_orig_3d);
+  copy_v3_v3(co_curr_3d, sv->co_link_orig_3d[sv->co_link_curr]);
+  if (tc->use_local_mat) {
+    mul_m4_v3(tc->mat, co_orig_3d);
+    mul_m4_v3(tc->mat, co_curr_3d);
+  }
+
+  getSnapPoint(t, dvec);
+  sub_v3_v3(dvec, t->tsnap.snapTarget);
+  if (t->tsnap.snapElem & (SCE_SNAP_MODE_EDGE | SCE_SNAP_MODE_FACE)) {
+    float co_dir_3d[3];
+    sub_v3_v3v3(co_dir_3d, co_curr_3d, co_orig_3d);
+    if (t->tsnap.snapElem & SCE_SNAP_MODE_EDGE) {
+      transform_constraint_snap_axis_to_edge(t, co_dir_3d, dvec);
+    }
+    else {
+      transform_constraint_snap_axis_to_face(t, co_dir_3d, dvec);
+    }
+  }
+
+  add_v3_v3v3(snap_point, co_orig_3d, dvec);
+  *value = line_point_factor_v3(snap_point, co_orig_3d, co_curr_3d);
+}
+
 static void applyVertSlide(TransInfo *t, const int UNUSED(mval[2]))
 {
   char str[UI_MAX_DRAW_STR];
@@ -551,6 +583,7 @@ static void applyVertSlide(TransInfo *t, const int UNUSED(mval[2]))
 
   final = t->values[0];
 
+  applySnapping(t, &final);
   snapGridIncrement(t, &final);
 
   /* only do this so out of range values are not displayed */
@@ -596,6 +629,8 @@ void initVertSlide_ex(TransInfo *t, bool use_even, bool flipped, bool use_clamp)
   t->mode = TFM_VERT_SLIDE;
   t->transform = applyVertSlide;
   t->handleEvent = handleEventVertSlide;
+  t->tsnap.applySnap = vert_slide_snap_apply;
+  t->tsnap.distance = transform_snap_distance_len_squared_fn;
 
   {
     VertSlideParams *slp = MEM_callocN(sizeof(*slp), __func__);
diff --git a/source/blender/editors/transform/transform_snap.c b/source/blender/editors/transform/transform_snap.c
index 3afdc5a21c0..a9b3b7448ef 100644
--- a/source/blender/editors/transform/transform_snap.c
+++ b/source/blender/editors/transform/transform_snap.c
@@ -124,6 +124,9 @@ bool transformModeUseSnap(const TransInfo *t)
   if (t->mode == TFM_RESIZE) {
     return (ts->snap_transform_mode_flag & SCE_SNAP_TRANSFORM_MODE_SCALE) != 0;
   }
+  if (t->mode == TFM_VERT_SLIDE) {
+    return true;
+  }
 
   return false;
 }
@@ -1540,3 +1543,14 @@ static void applyGridIncrement(
 }
 
 /** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Generic callbacks
+ * \{ */
+
+float transform_snap_distance_len_squared_fn(TransInfo *UNUSED(t), const float p1[3], const float p2[3])
+{
+  return len_squared_v3v3(p1, p2);
+}
+
+/** \} */
diff --git a/source/blender/editors/transform/transform_snap.h b/source/blender/editors/transform/transform_snap.h
index c088cf80f0d..688661bc2cb 100644
--- a/source/blender/editors/transform/transform_snap.h
+++ b/source/blender/editors/transform/transform_snap.h
@@ -87,4 +87,6 @@ void addSnapPoint(TransInfo *t);
 eRedrawFlag updateSelectedSnapPoint(TransInfo *t);
 void removeSnapPoint(TransInfo *t);
 
+float transform_snap_distance_len_squared_fn(TransInfo *t, const float p1[3], const float p2[3]);
+
 #endif /* __TRANSFORM_SNAP_H__ */



More information about the Bf-blender-cvs mailing list