[Bf-blender-cvs] [50c64487815] master: Fix T78909: Curve-edit proportional connected-only broken

Sebastian Parborg noreply at git.blender.org
Wed Jul 15 12:29:51 CEST 2020


Commit: 50c64487815a8533761728bc41a57b83f0e06094
Author: Sebastian Parborg
Date:   Wed Jul 15 12:28:32 2020 +0200
Branches: master
https://developer.blender.org/rB50c64487815a8533761728bc41a57b83f0e06094

Fix T78909: Curve-edit proportional connected-only broken

Now it calculates the actual distance when traveling along the curve.

I addition to this, it also now supports cyclic curves.

Reviewed By: Campbell

Differential Revision: http://developer.blender.org/D8293

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

M	source/blender/editors/transform/transform_convert.c
M	source/blender/editors/transform/transform_convert.h
M	source/blender/editors/transform/transform_convert_curve.c
M	source/blender/editors/transform/transform_convert_gpencil.c
M	source/blender/editors/transform/transform_convert_particle.c

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

diff --git a/source/blender/editors/transform/transform_convert.c b/source/blender/editors/transform/transform_convert.c
index be6af1e3a99..9c8ecf52ce4 100644
--- a/source/blender/editors/transform/transform_convert.c
+++ b/source/blender/editors/transform/transform_convert.c
@@ -27,6 +27,7 @@
 #include "MEM_guardedalloc.h"
 
 #include "BLI_kdtree.h"
+#include "BLI_linklist_stack.h"
 #include "BLI_listbase.h"
 #include "BLI_math.h"
 
@@ -409,59 +410,64 @@ void transform_autoik_update(TransInfo *t, short mode)
 /** \name Curve Surface
  * \{ */
 
-void calc_distanceCurveVerts(TransData *head, TransData *tail)
+void calc_distanceCurveVerts(TransData *head, TransData *tail, bool cyclic)
 {
-  TransData *td, *td_near = NULL;
+  TransData *td;
+  BLI_LINKSTACK_DECLARE(queue, TransData *);
+  BLI_LINKSTACK_INIT(queue);
   for (td = head; td <= tail; td++) {
     if (td->flag & TD_SELECTED) {
-      td_near = td;
       td->dist = 0.0f;
+      BLI_LINKSTACK_PUSH(queue, td);
     }
-    else if (td_near) {
-      float dist;
-      float vec[3];
+    else {
+      td->dist = FLT_MAX;
+    }
+  }
+
+  while ((td = BLI_LINKSTACK_POP(queue))) {
+    float dist;
+    float vec[3];
 
-      sub_v3_v3v3(vec, td_near->center, td->center);
+    TransData *next_td = NULL;
+
+    if (td + 1 <= tail) {
+      next_td = td + 1;
+    }
+    else if (cyclic) {
+      next_td = head;
+    }
+
+    if (next_td != NULL && !(next_td->flag & TD_NOTCONNECTED)) {
+      sub_v3_v3v3(vec, next_td->center, td->center);
       mul_m3_v3(head->mtx, vec);
-      dist = len_v3(vec);
+      dist = len_v3(vec) + td->dist;
 
-      if (dist < (td - 1)->dist) {
-        td->dist = (td - 1)->dist;
-      }
-      else {
-        td->dist = dist;
+      if (dist < next_td->dist) {
+        next_td->dist = dist;
+        BLI_LINKSTACK_PUSH(queue, next_td);
       }
     }
-    else {
-      td->dist = FLT_MAX;
-      td->flag |= TD_NOTCONNECTED;
+
+    if (td - 1 >= head) {
+      next_td = td - 1;
     }
-  }
-  td_near = NULL;
-  for (td = tail; td >= head; td--) {
-    if (td->flag & TD_SELECTED) {
-      td_near = td;
-      td->dist = 0.0f;
+    else if (cyclic) {
+      next_td = tail;
     }
-    else if (td_near) {
-      float dist;
-      float vec[3];
 
-      sub_v3_v3v3(vec, td_near->center, td->center);
+    if (next_td != NULL && !(next_td->flag & TD_NOTCONNECTED)) {
+      sub_v3_v3v3(vec, next_td->center, td->center);
       mul_m3_v3(head->mtx, vec);
-      dist = len_v3(vec);
+      dist = len_v3(vec) + td->dist;
 
-      if (td->flag & TD_NOTCONNECTED || dist < td->dist || (td + 1)->dist < td->dist) {
-        td->flag &= ~TD_NOTCONNECTED;
-        if (dist < (td + 1)->dist) {
-          td->dist = (td + 1)->dist;
-        }
-        else {
-          td->dist = dist;
-        }
+      if (dist < next_td->dist) {
+        next_td->dist = dist;
+        BLI_LINKSTACK_PUSH(queue, next_td);
       }
     }
   }
+  BLI_LINKSTACK_FREE(queue);
 }
 
 /* Utility function for getting the handle data from bezier's */
diff --git a/source/blender/editors/transform/transform_convert.h b/source/blender/editors/transform/transform_convert.h
index f7eea286983..ee478ad8567 100644
--- a/source/blender/editors/transform/transform_convert.h
+++ b/source/blender/editors/transform/transform_convert.h
@@ -87,7 +87,7 @@ void transform_around_single_fallback_ex(TransInfo *t, int data_len_all);
 void transform_around_single_fallback(TransInfo *t);
 void posttrans_fcurve_clean(struct FCurve *fcu, const int sel_flag, const bool use_handle);
 bool constraints_list_needinv(TransInfo *t, ListBase *list);
-void calc_distanceCurveVerts(TransData *head, TransData *tail);
+void calc_distanceCurveVerts(TransData *head, TransData *tail, bool cyclic);
 struct TransDataCurveHandleFlags *initTransDataCurveHandles(TransData *td, struct BezTriple *bezt);
 char transform_convert_frame_side_dir_get(TransInfo *t, float cframe);
 bool FrameOnMouseSide(char side, float frame, float cframe);
diff --git a/source/blender/editors/transform/transform_convert_curve.c b/source/blender/editors/transform/transform_convert_curve.c
index 37e37072ed7..65b2c9f9382 100644
--- a/source/blender/editors/transform/transform_convert_curve.c
+++ b/source/blender/editors/transform/transform_convert_curve.c
@@ -350,12 +350,14 @@ void createTransCurveVerts(TransInfo *t)
             (void)hdata; /* quiet warning */
           }
           else if (is_prop_edit && head != tail) {
-            calc_distanceCurveVerts(head, tail - 1);
-            head = tail;
+            tail->flag |= TD_NOTCONNECTED;
+            td++;
+            tail++;
           }
         }
         if (is_prop_edit && head != tail) {
-          calc_distanceCurveVerts(head, tail - 1);
+          bool cyclic = (nu->flagu & CU_NURB_CYCLIC) != 0;
+          calc_distanceCurveVerts(head, tail - 1, cyclic);
         }
 
         /* TODO - in the case of tilt and radius we can also avoid allocating the
@@ -425,12 +427,14 @@ void createTransCurveVerts(TransInfo *t)
             }
           }
           else if (is_prop_edit && head != tail) {
-            calc_distanceCurveVerts(head, tail - 1);
-            head = tail;
+            tail->flag |= TD_NOTCONNECTED;
+            td++;
+            tail++;
           }
         }
         if (is_prop_edit && head != tail) {
-          calc_distanceCurveVerts(head, tail - 1);
+          bool cyclic = (nu->flagu & CU_NURB_CYCLIC) != 0;
+          calc_distanceCurveVerts(head, tail - 1, cyclic);
         }
       }
     }
diff --git a/source/blender/editors/transform/transform_convert_gpencil.c b/source/blender/editors/transform/transform_convert_gpencil.c
index 22261b9bbd8..0eb12aeabed 100644
--- a/source/blender/editors/transform/transform_convert_gpencil.c
+++ b/source/blender/editors/transform/transform_convert_gpencil.c
@@ -354,7 +354,7 @@ void createTransGPencil(bContext *C, TransInfo *t)
 
               /* March over these points, and calculate the proportional editing distances */
               if (is_prop_edit && (head != tail)) {
-                calc_distanceCurveVerts(head, tail - 1);
+                calc_distanceCurveVerts(head, tail - 1, false);
               }
             }
           }
diff --git a/source/blender/editors/transform/transform_convert_particle.c b/source/blender/editors/transform/transform_convert_particle.c
index 3fa722d14cf..fbe9c07ebe9 100644
--- a/source/blender/editors/transform/transform_convert_particle.c
+++ b/source/blender/editors/transform/transform_convert_particle.c
@@ -183,7 +183,7 @@ void createTransParticleVerts(bContext *C, TransInfo *t)
         tail++;
       }
       if (is_prop_edit && head != tail) {
-        calc_distanceCurveVerts(head, tail - 1);
+        calc_distanceCurveVerts(head, tail - 1, false);
       }
     }
   }



More information about the Bf-blender-cvs mailing list