diff options
author | Sebastian Parborg <darkdefende@gmail.com> | 2020-07-15 13:28:32 +0300 |
---|---|---|
committer | Sebastian Parborg <darkdefende@gmail.com> | 2020-07-15 13:29:45 +0300 |
commit | 50c64487815a8533761728bc41a57b83f0e06094 (patch) | |
tree | cfcdbb24c9d4bbcd4bbe4ac4c6b09c1f0b488478 | |
parent | e8b26a05018bd56c48453a1b868021c054244765 (diff) |
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
5 files changed, 54 insertions, 44 deletions
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); } } } |