[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [45503] trunk/blender/source/blender/bmesh /intern/bmesh_core.c: Fix related to #30859: bmesh face splitting would set the first loop of the new

Joseph Eagar joeedh at gmail.com
Tue Apr 10 13:07:03 CEST 2012


Revision: 45503
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=45503
Author:   joeedh
Date:     2012-04-10 11:07:02 +0000 (Tue, 10 Apr 2012)
Log Message:
-----------
Fix related to #30859: bmesh face splitting would set the first loop of the new
faces to a loop quite different than the original first loop. This makes e.g.
duplifaces give rotated results after subdivide or loopcut.

Now it tries to find a first loop that is similar to the old one, to try to keep
the rotations the same.

Modified Paths:
--------------
    trunk/blender/source/blender/bmesh/intern/bmesh_core.c

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_core.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_core.c	2012-04-10 10:35:55 UTC (rev 45502)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_core.c	2012-04-10 11:07:02 UTC (rev 45503)
@@ -1133,7 +1133,7 @@
 	BMLoop *l_iter, *l_first;
 	BMLoop *v1loop = NULL, *v2loop = NULL, *f1loop = NULL, *f2loop = NULL;
 	BMEdge *e;
-	int i, len, f1len, f2len;
+	int i, len, f1len, f2len, first_loop_f1;
 
 	/* verify that v1 and v2 are in face */
 	len = f->len;
@@ -1170,8 +1170,36 @@
 	lst2->first = lst2->last = f2loop;
 	lst->first = lst->last = f1loop;
 #else
-	f2->l_first = f2loop;
-	f->l_first = f1loop;
+	/* find which of the faces the original first loop is in */
+	l_iter = l_first = f1loop;
+	first_loop_f1 = 0;
+	do {
+		if(l_iter == f->l_first)
+			first_loop_f1 = 1;
+	} while ((l_iter = l_iter->next) != l_first);
+
+	if(first_loop_f1) {
+		/* original first loop was in f1, find a suitable first loop for f2
+		   which is as similar as possible to f1. the order matters for tools
+		   such as duplifaces. */
+		if(f->l_first->prev == f1loop)
+			f2->l_first = f2loop->prev;
+		else if(f->l_first->next == f1loop)
+			f2->l_first = f2loop->next;
+		else
+			f2->l_first = f2loop;
+	}
+	else {
+		/* original first loop was in f2, further do same as above */
+		f2->l_first = f->l_first;
+
+		if(f->l_first->prev == f2loop)
+			f->l_first = f1loop->prev;
+		else if(f->l_first->next == f2loop)
+			f->l_first = f1loop->next;
+		else
+			f->l_first = f1loop;
+	}
 #endif
 
 	/* validate both loop */




More information about the Bf-blender-cvs mailing list