[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [13662] branches/soc-2007-red_fox/source/ blender/blenkernel/intern: Two Bug fixes ( non-manifold vert and loop_reverse euler)

Levi Schooley redfox at hhofministries.org
Wed Feb 13 04:06:13 CET 2008


Revision: 13662
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=13662
Author:   red_fox
Date:     2008-02-13 04:06:09 +0100 (Wed, 13 Feb 2008)

Log Message:
-----------
Two Bug fixes (non-manifold vert and loop_reverse euler)

Couple of bug fixes:
1. As pointed out by Geoffrey Bantle (Briggs), non-manifold
verts would crash blender when the limit-by-angle option was
on in the modifier. This should correct the problem.
2. A fix I've had (apparently) hanging around since last
fall. The reverse loop euler would not swap two-edged faces.
Also added some "safety" meta-eulers that would check for
loop direction before performing the JFKE euler.

Levi

Modified Paths:
--------------
    branches/soc-2007-red_fox/source/blender/blenkernel/intern/BME_eulers.c
    branches/soc-2007-red_fox/source/blender/blenkernel/intern/BME_tools.c

Modified: branches/soc-2007-red_fox/source/blender/blenkernel/intern/BME_eulers.c
===================================================================
--- branches/soc-2007-red_fox/source/blender/blenkernel/intern/BME_eulers.c	2008-02-12 19:29:12 UTC (rev 13661)
+++ branches/soc-2007-red_fox/source/blender/blenkernel/intern/BME_eulers.c	2008-02-13 03:06:09 UTC (rev 13662)
@@ -818,8 +818,8 @@
 
 	if(len == 2){ //two edged face
 		//do some verification here!
-		l->e = elist[0];
-		l->next->e = elist[1];
+		l->e = elist[1];
+		l->next->e = elist[0];
 	}
 	else{
 		for(i=0, curloop = l; i < len; i++, curloop = curloop->next){

Modified: branches/soc-2007-red_fox/source/blender/blenkernel/intern/BME_tools.c
===================================================================
--- branches/soc-2007-red_fox/source/blender/blenkernel/intern/BME_tools.c	2008-02-12 19:29:12 UTC (rev 13661)
+++ branches/soc-2007-red_fox/source/blender/blenkernel/intern/BME_tools.c	2008-02-13 03:06:09 UTC (rev 13662)
@@ -296,18 +296,18 @@
 	return 0;
 }
 
-int BME_bevel_is_split_vert(BME_Loop *l) {
-	/* look for verts that have already been added to the edge when
-	 * beveling other polys; this can be determined by testing the
-	 * vert and the edges around it for originality
-	 */
-	if ((l->v->tflag1 & BME_BEVEL_ORIG)==0
-			&& (l->e->tflag1 & BME_BEVEL_ORIG)
-			&& (l->prev->e->tflag1 & BME_BEVEL_ORIG))
-	{
-		return 1;
+/* a wrapper for BME_JFKE that [for now just] checks to
+ * make sure loop directions are compatible */
+BME_Poly *BME_JFKE_safe(BME_Mesh *bm, BME_Poly *f1, BME_Poly *f2, BME_Edge *e) {
+	BME_Loop *l1, *l2;
+
+	l1 = e->loop;
+	l2 = l1->radial.next->data;
+	if (l1->v == l2->v) {
+		BME_loop_reverse(bm, f2);
 	}
-	return 0;
+
+	return BME_JFKE(bm, f1, f2, e);
 }
 
 /* a wrapper for BME_SFME that transfers element flags */
@@ -352,6 +352,20 @@
 	return nv;
 }
 
+int BME_bevel_is_split_vert(BME_Loop *l) {
+	/* look for verts that have already been added to the edge when
+	 * beveling other polys; this can be determined by testing the
+	 * vert and the edges around it for originality
+	 */
+	if ((l->v->tflag1 & BME_BEVEL_ORIG)==0
+			&& (l->e->tflag1 & BME_BEVEL_ORIG)
+			&& (l->prev->e->tflag1 & BME_BEVEL_ORIG))
+	{
+		return 1;
+	}
+	return 0;
+}
+
 /* get a vector, vec, that points from v1->co to wherever makes sense to
  * the bevel operation as a whole based on the relationship between v1 and v2
  * (won't necessarily be a vec from v1->co to v2->co, though it probably will be);
@@ -1057,7 +1071,7 @@
 			weight = e->bweight;
 		}
 		else if (options & BME_BEVEL_ANGLE) {
-			if (BME_bevel_get_angle(bm,e,e->v1) < threshold) {
+			if ((e->v1->tflag1 & BME_BEVEL_NONMAN) == 0 && BME_bevel_get_angle(bm,e,e->v1) < threshold) {
 				e->tflag1 |= BME_BEVEL_BEVEL;
 				e->v1->tflag1 |= BME_BEVEL_BEVEL;
 				BME_bevel_add_vweight(td, bm, e->v1, 1.0, 1.0, options);
@@ -1065,7 +1079,7 @@
 			else {
 				BME_bevel_add_vweight(td, bm, e->v1, 0.0, 1.0, options);
 			}
-			if (BME_bevel_get_angle(bm,e,e->v2) < threshold) {
+			if ((e->v2->tflag1 & BME_BEVEL_NONMAN) == 0 && BME_bevel_get_angle(bm,e,e->v2) < threshold) {
 				e->tflag1 |= BME_BEVEL_BEVEL;
 				e->v2->tflag1 |= BME_BEVEL_BEVEL;
 				BME_bevel_add_vweight(td, bm, e->v2, 1.0, 1.0, options);
@@ -1171,7 +1185,7 @@
 			oe = e;
 			while (e = BME_disk_next_edgeflag(oe, v, 0, BME_BEVEL_ORIG | BME_BEVEL_BEVEL)) {
 				/* join the faces (we'll split them later) */
-				f = BME_JFKE(bm,e->loop->f,((BME_Loop*)e->loop->radial.next->data)->f,e);
+				f = BME_JFKE_safe(bm,e->loop->f,((BME_Loop*)e->loop->radial.next->data)->f,e);
 				if (!f) printf("Non-manifold geometry not getting tagged right?\n");
 			}
 
@@ -1212,7 +1226,7 @@
 					if (l->v == v) l = l->prev;
 					else l = l->next;
 					if (e) {
-						f = BME_JFKE(bm,e->loop->f,((BME_Loop*)e->loop->radial.next->data)->f,e);
+						f = BME_JFKE_safe(bm,e->loop->f,((BME_Loop*)e->loop->radial.next->data)->f,e);
 					}
 				}
 			}
@@ -1221,14 +1235,14 @@
 			if (l->next->radial.next->data == l->next) { /* was part of the open end of a mesh */
 				BME_JEKV(bm,l->next->e,v);
 				if (len == 2) {
-					f = BME_JFKE(bm,l->f,((BME_Loop*)l->radial.next->data)->f,l->e);
+					f = BME_JFKE_safe(bm,l->f,((BME_Loop*)l->radial.next->data)->f,l->e);
 				}
 			}
 			else {
 				BME_JEKV(bm,l->next->e,v);
-				f = BME_JFKE(bm,l->f,((BME_Loop*)l->next->radial.next->data)->f,l->next->e);
+				f = BME_JFKE_safe(bm,l->f,((BME_Loop*)l->next->radial.next->data)->f,l->next->e);
 				if (f->len == 2) {
-					f = BME_JFKE(bm,f,((BME_Loop*)f->loopbase->radial.next->data)->f,f->loopbase->e);
+					f = BME_JFKE_safe(bm,f,((BME_Loop*)f->loopbase->radial.next->data)->f,f->loopbase->e);
 				}
 			}
 		}
@@ -1274,7 +1288,7 @@
 
 	BME_bevel_initialize(bm, options, defgrp_index, angle, td);
 
-	/* recursion math curtesy of Martin Poirier (theeth) */
+	/* recursion math courtesy of Martin Poirier (theeth) */
 	for (i=0; i<res-1; i++) {
 		if (i==0) fac += 1.0f/3.0f; else fac += 1.0f/(3 * i * 2.0f);
 	}





More information about the Bf-blender-cvs mailing list