[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [13834] trunk/blender/source/blender/ blenkernel/intern/BME_tools.c: -> Bevel Crash Fix

Geoffrey Bantle hairbat at yahoo.com
Sun Feb 24 07:23:21 CET 2008


Revision: 13834
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=13834
Author:   briggs
Date:     2008-02-24 07:23:20 +0100 (Sun, 24 Feb 2008)

Log Message:
-----------
-> Bevel Crash Fix

Bevel code was making incorrect usage of the BME_loop_reverse euler.
Restructured the code in order to correct the problem.

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-02-23 23:14:41 UTC (rev 13833)
+++ trunk/blender/source/blender/blenkernel/intern/BME_tools.c	2008-02-24 06:23:20 UTC (rev 13834)
@@ -1151,11 +1151,11 @@
  *  A BME_Mesh pointer to the BMesh passed as a parameter.
 */
 BME_Mesh *BME_bevel_mesh(BME_Mesh *bm, float value, int res, int options, int defgrp_index, BME_TransData_Head *td) {
-	BME_Vert *v, *nv;
-	BME_Edge *e, *oe;
+	BME_Vert *v, *nv, *kv;
+	BME_Edge *e, *oe, *ne;
 	BME_Loop *l, *l2;
-	BME_Poly *f;
-	unsigned int i, len;
+	BME_Poly *f, *nf;
+	unsigned int i, len, done;
 
 	for (f=bm->polys.first; f; f=f->next) {
 		if(f->tflag1 & BME_BEVEL_ORIG) {
@@ -1212,42 +1212,51 @@
 				}
 			}
 
-			l = v->edge->loop;
-			if (len > 2) {
-				f = l->f;
-				while(f->len <= len) {
-					if (l->radial.next->data != l) {
-						e = l->e;
-						l = l->radial.next->data;
+			done = 0;
+			while(!done){
+				done = 1;
+				e = v->edge;
+				do{
+					f = NULL;
+					len = BME_cycle_length(&(e->loop->radial));
+					if(len == 2){
+						f = BME_JFKE_safe(bm,e->loop->f, ((BME_Loop*)(e->loop->radial.next->data))->f, e);
 					}
-					else {
-						e = NULL;
+					if(f){ 
+						done = 0;
+						break;
 					}
-					if (l->v == v) l = l->prev;
-					else l = l->next;
-					if (e) {
-						f = BME_JFKE_safe(bm,e->loop->f,((BME_Loop*)e->loop->radial.next->data)->f,e);
+					e = BME_disk_nextedge(e,v);
+				}while(e != v->edge);
+			}
+			BME_JEKV(bm,e,v);
+		}
+		v = nv;
+	}
+
+	/*clean up two edged faces here*/
+		for(f=bm->polys.first; f;){
+			nf = f->next;
+			if(f->len == 2){
+				e = NULL;
+				l = f->loopbase;
+				do{
+					if(BME_cycle_length(&l->radial) == 2){
+						e = l->e;
+						break;
 					}
+					l = l->next;
+				}while(l!=f->loopbase);
+
+				if(e) BME_JFKE_safe(bm,f, ((BME_Loop*)(e->loop->radial.next->data))->f, e);
+				else{
+					/*We are still leaving a stray edge? This shouldnt even be possible!*/
+					BME_KF(bm, f);
 				}
 			}
-			if (l->v == v) l = l->prev;
-			l = l->prev;
-			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_safe(bm,l->f,((BME_Loop*)l->radial.next->data)->f,l->e);
-				}
-			}
-			else {
-				BME_JEKV(bm,l->next->e,v);
-				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_safe(bm,f,((BME_Loop*)f->loopbase->radial.next->data)->f,f->loopbase->e);
-				}
-			}
+			f = nf;
 		}
-		v = nv;
-	}
+
 	return bm;
 }
 





More information about the Bf-blender-cvs mailing list