[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15076] trunk/blender/source/blender/ blenkernel/intern/BME_tools.c: -Fix for bug #13067

Geoffrey Bantle hairbat at yahoo.com
Sun Jun 1 03:56:36 CEST 2008


Revision: 15076
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15076
Author:   briggs
Date:     2008-06-01 03:56:35 +0200 (Sun, 01 Jun 2008)

Log Message:
-----------
-Fix for bug #13067

Bevel tool was hanging on certain geometry where the edge
to be beveled was shared by two faces that had more than
one edge in common and caller was not checking return
status of Bmesh eulers. Fixed.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/BME_tools.c

Modified: trunk/blender/source/blender/blenkernel/intern/BME_tools.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/BME_tools.c	2008-06-01 01:49:11 UTC (rev 15075)
+++ trunk/blender/source/blender/blenkernel/intern/BME_tools.c	2008-06-01 01:56:35 UTC (rev 15076)
@@ -811,7 +811,18 @@
 
 	return Inpf(vec3,vec4);
 }
-
+static int BME_face_sharededges(BME_Poly *f1, BME_Poly *f2){
+	BME_Loop *l;
+	int count = 0;
+	
+	l = f1->loopbase;
+	do{
+		if(BME_radial_find_face(l->e,f2)) count++;
+		l = l->next;
+	}while(l != f1->loopbase);
+	
+	return count;
+}
 /**
  *			BME_bevel_initialize
  *
@@ -990,6 +1001,17 @@
 	/* face pass */
 	for (f=bm->polys.first; f; f=f->next) f->tflag1 = BME_BEVEL_ORIG;
 
+	/*clean up edges with 2 faces that share more than one edge*/
+	for (e=bm->edges.first; e; e=e->next){
+		if(e->tflag1 & BME_BEVEL_BEVEL){
+			int count = 0;
+			count = BME_face_sharededges(e->loop->f, ((BME_Loop*)e->loop->radial.next->data)->f);
+			if(count > 1){
+				e->tflag1 &= ~BME_BEVEL_BEVEL;
+			}	
+		}
+	}
+
 	return bm;
 }
 
@@ -1075,7 +1097,7 @@
 			v = BME_bevel_wire(bm, v, value, res, options, td);
 		}
 		else if (res && ((v->tflag1 & BME_BEVEL_BEVEL) && (v->tflag1 & BME_BEVEL_ORIG))) {
-			
+			int count = 0;
 			/* first, make sure we're not sitting on an edge to be removed */
 			oe = v->edge;
 			e = BME_disk_nextedge(oe,v);
@@ -1089,6 +1111,7 @@
 			/* look for original edges, and remove them */
 			oe = e;
 			while ( (e = BME_disk_next_edgeflag(oe, v, 0, BME_BEVEL_ORIG | BME_BEVEL_BEVEL)) ) {
+				count++;
 				/* join the faces (we'll split them later) */
 				f = BME_JFKE_safe(bm,e->loop->f,((BME_Loop*)e->loop->radial.next->data)->f,e);
 				if (!f){
@@ -1096,6 +1119,9 @@
 				}
 			}
 
+			/*need to do double check *before* you bevel to make sure that manifold edges are for two faces that share only *one* edge to make sure it doesnt hang here!*/
+
+
 			/* all original edges marked to be beveled have been removed;
 			 * now we need to link up the edges for this "corner" */
 			len = BME_cycle_length(BME_disk_getpointer(v->edge, v));





More information about the Bf-blender-cvs mailing list