[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [51697] trunk/blender/source/blender/ editors/transform/transform_conversions.c: Fix #32979: proportional edit connected was too slow with many vertices on
Brecht Van Lommel
brechtvanlommel at pandora.be
Sat Oct 27 20:54:45 CEST 2012
Revision: 51697
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=51697
Author: blendix
Date: 2012-10-27 18:54:45 +0000 (Sat, 27 Oct 2012)
Log Message:
-----------
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).
Modified Paths:
--------------
trunk/blender/source/blender/editors/transform/transform_conversions.c
Modified: trunk/blender/source/blender/editors/transform/transform_conversions.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform_conversions.c 2012-10-27 18:31:52 UTC (rev 51696)
+++ trunk/blender/source/blender/editors/transform/transform_conversions.c 2012-10-27 18:54:45 UTC (rev 51697)
@@ -125,62 +125,46 @@
/* ************************** 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(td_A->dist < td_B->dist)
+ return -1;
+ else if(td_A->dist > td_B->dist)
+ return 1;
+
+ return 0;
+}
- if (head != tail) {
- *head = *tail;
- head++;
- }
+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;
- if (t->flag & T_PROP_CONNECTED) {
- while ((head->dist <= temp->dist) && (head < tail))
- head++;
- }
- else {
- while ((head->rdist <= temp->rdist) && (head < tail))
- head++;
- }
-
- if (head != tail) {
- *tail = *head;
- tail--;
- }
- }
-
- *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)
More information about the Bf-blender-cvs
mailing list