[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [13843] trunk/blender/source/blender/ blenkernel/intern/BME_conversions.c: -> Bevel Crash Fix (again redux)

Geoffrey Bantle hairbat at yahoo.com
Sun Feb 24 13:57:12 CET 2008


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

Log Message:
-----------
-> Bevel Crash Fix (again redux)

More fixes for 2 edged faces

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

Modified: trunk/blender/source/blender/blenkernel/intern/BME_conversions.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/BME_conversions.c	2008-02-24 12:23:47 UTC (rev 13842)
+++ trunk/blender/source/blender/blenkernel/intern/BME_conversions.c	2008-02-24 12:57:11 UTC (rev 13843)
@@ -329,13 +329,29 @@
 	int totface,totedge,totvert,i,bmeshok,len;
 
 	BME_Vert *v1=NULL;
-	BME_Edge *e=NULL;
+	BME_Edge *e=NULL, *oe=NULL;
 	BME_Poly *f=NULL;
 	
 	DerivedMesh *result;
+	EdgeHash *edge_hash = BLI_edgehash_new();
+
+	totvert = BLI_countlist(&(bm->verts));
+	totedge = 0;
 	
-	totvert = BLI_countlist(&(bm->verts));
-	totedge = BLI_countlist(&(bm->edges));
+	/*we cannot have double edges in a derived mesh!*/
+	for(i=0, v1=bm->verts.first; v1; v1=v1->next, i++) v1->tflag1 = i;
+	for(e=bm->edges.first; e; e=e->next){
+		oe = BLI_edgehash_lookup(edge_hash,e->v1->tflag1, e->v2->tflag1);
+		if(!oe){
+			totedge++;
+			BLI_edgehash_insert(edge_hash,e->v1->tflag1,e->v2->tflag1,e);
+			e->tflag2 = 1;
+		}
+		else{
+			e->tflag2 = 0;
+		}
+	}
+	
 	/*count quads and tris*/
 	totface = 0;
 	bmeshok = 1;
@@ -357,26 +373,31 @@
 	/*Make Verts*/
 	mvert = CDDM_get_verts(result);
 	for(i=0,v1=bm->verts.first,mv=mvert;v1;v1=v1->next,i++,mv++){
-		v1->tflag1 = i;
 		VECCOPY(mv->co,v1->co);
 		mv->flag = (unsigned char)v1->flag;
 		mv->bweight = (char)(255.0*v1->bweight);
 		CustomData_from_em_block(&bm->vdata, &result->vertData, v1->data, i);
 	}
 	medge = CDDM_get_edges(result);
-	for(i=0,e=bm->edges.first,me=medge;e;e=e->next,me++,i++){
-		if(e->v1->tflag1 < e->v2->tflag1){
-			me->v1 = e->v1->tflag1;
-			me->v2 = e->v2->tflag1;
+	i=0;
+	for(e=bm->edges.first,me=medge;e;e=e->next){
+		if(e->tflag2){
+			if(e->v1->tflag1 < e->v2->tflag1){
+				me->v1 = e->v1->tflag1;
+				me->v2 = e->v2->tflag1;
+			}
+			else{
+				me->v1 = e->v2->tflag1;
+				me->v2 = e->v1->tflag1;
+			}
+		
+			me->crease = (char)(255.0*e->crease);
+			me->bweight = (char)(255.0*e->bweight);
+			me->flag = e->flag;
+			CustomData_from_em_block(&bm->edata, &result->edgeData, e->data, i);
+			me++;
+			i++;
 		}
-		else{
-			me->v1 = e->v2->tflag1;
-			me->v2 = e->v1->tflag1;
-		}
-		me->crease = (char)(255.0*e->crease);
-		me->bweight = (char)(255.0*e->bweight);
-		me->flag = e->flag;
-		CustomData_from_em_block(&bm->edata, &result->edgeData, e->data, i);
 	}
 	if(totface){
 		mface = CDDM_get_faces(result);
@@ -402,6 +423,6 @@
 			CustomData_from_em_block(&bm->pdata, &result->faceData, f->data, i);
 		}
 	}
-
+	BLI_edgehash_free(edge_hash, NULL);
 	return result;
 }





More information about the Bf-blender-cvs mailing list