Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2012-10-27 22:54:45 +0400
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2012-10-27 22:54:45 +0400
commitb4642d203dd426f592f7d382cc5542013137232c (patch)
tree55d885473f0c9f8791d3965e19a669db42763678 /source/blender/editors/transform
parent8a6797d6a9a6fcc8f49961cf785b6748e9c5c520 (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.c72
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)