diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2012-10-27 22:54:45 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2012-10-27 22:54:45 +0400 |
commit | b4642d203dd426f592f7d382cc5542013137232c (patch) | |
tree | 55d885473f0c9f8791d3965e19a669db42763678 /source/blender/editors/transform | |
parent | 8a6797d6a9a6fcc8f49961cf785b6748e9c5c520 (diff) |
Fix #32979: proportional edit connected was too slow with many vertices on
some meshes, now use the system qsort instead of a custom one (which I guess
suffered from poor choice of pivot point in some cases).
Diffstat (limited to 'source/blender/editors/transform')
-rw-r--r-- | source/blender/editors/transform/transform_conversions.c | 72 |
1 files changed, 28 insertions, 44 deletions
diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c index 24479663456..53cedc78d5c 100644 --- a/source/blender/editors/transform/transform_conversions.c +++ b/source/blender/editors/transform/transform_conversions.c @@ -125,62 +125,46 @@ static short constraints_list_needinv(TransInfo *t, ListBase *list); /* ************************** Functions *************************** */ -static void qsort_trans_data(TransInfo *t, TransData *head, TransData *tail, TransData *temp) +static int trans_data_compare_dist(const void *A, const void *B) { - TransData *ihead = head; - TransData *itail = tail; - *temp = *head; + const TransData *td_A = (const TransData*)A; + const TransData *td_B = (const TransData*)B; - while (head < tail) { - if (t->flag & T_PROP_CONNECTED) { - while ((tail->dist >= temp->dist) && (head < tail)) - tail--; - } - else { - while ((tail->rdist >= temp->rdist) && (head < tail)) - tail--; - } - - if (head != tail) { - *head = *tail; - head++; - } - - if (t->flag & T_PROP_CONNECTED) { - while ((head->dist <= temp->dist) && (head < tail)) - head++; - } - else { - while ((head->rdist <= temp->rdist) && (head < tail)) - head++; - } + if(td_A->dist < td_B->dist) + return -1; + else if(td_A->dist > td_B->dist) + return 1; + + return 0; +} - if (head != tail) { - *tail = *head; - tail--; - } - } +static int trans_data_compare_rdist(const void *A, const void *B) +{ + const TransData *td_A = (const TransData*)A; + const TransData *td_B = (const TransData*)B; - *head = *temp; - if (ihead < head) { - qsort_trans_data(t, ihead, head - 1, temp); - } - if (itail > head) { - qsort_trans_data(t, head + 1, itail, temp); - } + if(td_A->rdist < td_B->rdist) + return -1; + else if(td_A->rdist > td_B->rdist) + return 1; + + return 0; } void sort_trans_data_dist(TransInfo *t) { - TransData temp; TransData *start = t->data; - int i = 1; + int i; - while (i < t->total && start->flag & TD_SELECTED) { + for (i = 0; i < t->total && start->flag & TD_SELECTED; i++) start++; - i++; + + if (i < t->total) { + if (t->flag & T_PROP_CONNECTED) + qsort(start, t->total - i, sizeof(TransData), trans_data_compare_dist); + else + qsort(start, t->total - i, sizeof(TransData), trans_data_compare_rdist); } - qsort_trans_data(t, start, t->data + t->total - 1, &temp); } static void sort_trans_data(TransInfo *t) |