[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