[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [13859] trunk/blender/source/blender: -> Bevel

Geoffrey Bantle hairbat at yahoo.com
Mon Feb 25 05:53:39 CET 2008


Revision: 13859
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=13859
Author:   briggs
Date:     2008-02-25 05:53:37 +0100 (Mon, 25 Feb 2008)

Log Message:
-----------
-> Bevel

Fixed the following problems with Bevel code

  -meshes with 2 edged faces left over at the end would cause buffer
   overrun whens converting from a Bmesh to a Derived Mesh. The
   conversion process now checks for both double edges and faces
   and removes them when present.

  -BME_reverse_loop euler had a bug that was causing the corruption of
   radial cycle. This would lead to the bevel tool hanging for a long time
   and possibly crashing.

  -Added optimization of BME_reverse loop so that it no longer does tiny
   allocations but instead uses an area of 'scratch' memory. The same thing
   will be done to the Make Face euler soon

  -Added proper call to selection flushing for editmode.

  -Some miscellaneous cleanups and removal of unneeded debug printfs.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_bmesh.h
    trunk/blender/source/blender/blenkernel/intern/BME_conversions.c
    trunk/blender/source/blender/blenkernel/intern/BME_eulers.c
    trunk/blender/source/blender/blenkernel/intern/BME_mesh.c
    trunk/blender/source/blender/blenkernel/intern/BME_tools.c
    trunk/blender/source/blender/src/editmesh_tools.c

Modified: trunk/blender/source/blender/blenkernel/BKE_bmesh.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_bmesh.h	2008-02-25 04:38:48 UTC (rev 13858)
+++ trunk/blender/source/blender/blenkernel/BKE_bmesh.h	2008-02-25 04:53:37 UTC (rev 13859)
@@ -67,20 +67,18 @@
 	struct CustomData vdata, edata, pdata, ldata;	/*Custom Data Layer information*/
 	struct DerivedMesh *derivedFinal, *derivedCage;
 	struct RetopoPaintData *retopo_paint_data; /*here for temporary code compatibility only*/
-	//BME_ElementList selection;
+	/*some temporary storage used by loop reverse and make face eulers*/
+	struct BME_Edge **edar;
+	int edarlen;
 	int lastDataMask;
 } BME_Mesh;
 
-//60, 52, 52, 12 704
-//60, 52, 84 
-
-
 typedef struct BME_Vert
 {
 	struct BME_Vert *next, *prev;
 	int	EID;
-	float co[3];									/*vertex location. Actually pointer to custom data block*/
-	float no[3];									/*vertex normal. Actually pointer to custom data block*/
+	float co[3];									
+	float no[3];									
 	struct BME_Edge *edge;							/*first edge in the disk cycle for this vertex*/
 	void *data;										/*custom vertex data*/
 	int eflag1, eflag2;								/*reserved for use by eulers*/
@@ -122,7 +120,6 @@
 {
 	struct BME_Poly *next, *prev;
 	int EID;
-	//~ float no[3];
 	struct BME_Loop *loopbase;						/*First editloop around Polygon.*/
 	struct ListBase holes;							/*list of inner loops in the face*/
 	unsigned int len;								/*total length of the face. Eulers should preserve this data*/
@@ -156,7 +153,6 @@
 /*MESH CREATION/DESTRUCTION*/
 struct BME_Mesh *BME_make_mesh(void);
 void BME_free_mesh(struct BME_Mesh *bm);
-struct BME_Mesh *BME_copy_mesh(struct BME_Mesh *bm);
 /*FULL MESH VALIDATION*/
 int BME_validate_mesh(struct BME_Mesh *bm, int halt);
 /*ENTER/EXIT MODELLING LOOP*/
@@ -181,10 +177,6 @@
 /*NORMAL FLIP(Is its own inverse)*/
 int BME_loop_reverse(struct BME_Mesh *bm, struct BME_Poly *f);
 
-/*TOOLS CODE*/
-struct BME_Loop *BME_inset_edge(struct BME_Mesh *bm, struct BME_Loop *l, struct BME_Poly *f);
-struct BME_Poly *BME_inset_poly(struct BME_Mesh *bm, struct BME_Poly *f);
-
 /* bevel tool defines */
 /* element flags */
 #define BME_BEVEL_ORIG			1

Modified: trunk/blender/source/blender/blenkernel/intern/BME_conversions.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/BME_conversions.c	2008-02-25 04:38:48 UTC (rev 13858)
+++ trunk/blender/source/blender/blenkernel/intern/BME_conversions.c	2008-02-25 04:53:37 UTC (rev 13859)
@@ -191,17 +191,19 @@
 	/* make edges */
 	CustomData_copy(&bm->edata, &em->edata, CD_MASK_EDITMESH, CD_CALLOC, 0);
 	for (e=bm->edges.first;e;e=e->next) {
-		eed= addedgelist(evlist[e->v1->tflag1], evlist[e->v2->tflag1], NULL);
-		eed->crease = e->crease;
-		eed->bweight = e->bweight;
-		if(e->flag & ME_SEAM) eed->seam = 1;
-		if(e->flag & ME_SHARP) eed->sharp = 1;
-		if(e->flag & SELECT) eed->f |= SELECT;
-		if(e->flag & ME_FGON) eed->h= EM_FGON; // 2 different defines!
-		if(e->flag & ME_HIDE) eed->h |= 1;
-		if(G.scene->selectmode==SCE_SELECT_EDGE) 
-			EM_select_edge(eed, eed->f & SELECT);
-		CustomData_em_copy_data(&bm->edata, &em->edata, e->data, &eed->data);
+		if(!(findedgelist(evlist[e->v1->tflag1], evlist[e->v2->tflag1]))){
+			eed= addedgelist(evlist[e->v1->tflag1], evlist[e->v2->tflag1], NULL);
+			eed->crease = e->crease;
+			eed->bweight = e->bweight;
+			if(e->flag & ME_SEAM) eed->seam = 1;
+			if(e->flag & ME_SHARP) eed->sharp = 1;
+			if(e->flag & SELECT) eed->f |= SELECT;
+			if(e->flag & ME_FGON) eed->h= EM_FGON; // 2 different defines!
+			if(e->flag & ME_HIDE) eed->h |= 1;
+			if(G.scene->selectmode==SCE_SELECT_EDGE) 
+				EM_select_edge(eed, eed->f & SELECT);
+			CustomData_em_copy_data(&bm->edata, &em->edata, e->data, &eed->data);
+		}
 	}
 
 	/* make faces */
@@ -417,10 +419,10 @@
 					test_index_face(mf, NULL, i, len);
 				}
 				i++;
+				mf->mat_nr = (unsigned char)f->mat_nr;
+				mf->flag = (unsigned char)f->flag;
+				CustomData_from_em_block(&bm->pdata, &result->faceData, f->data, i);
 			}
-			mf->mat_nr = (unsigned char)f->mat_nr;
-			mf->flag = (unsigned char)f->flag;
-			CustomData_from_em_block(&bm->pdata, &result->faceData, f->data, i);
 		}
 	}
 	BLI_edgehash_free(edge_hash, NULL);

Modified: trunk/blender/source/blender/blenkernel/intern/BME_eulers.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/BME_eulers.c	2008-02-25 04:38:48 UTC (rev 13858)
+++ trunk/blender/source/blender/blenkernel/intern/BME_eulers.c	2008-02-25 04:53:37 UTC (rev 13859)
@@ -132,7 +132,7 @@
 	int valance1=0, valance2=0, edok;
 	
 	/*edge must be between two distinct vertices...*/
-	if(v1 == v2) return BME_exit("ME returned NULL");
+	if(v1 == v2) return NULL;
 	
 	#ifndef BME_FASTEULER
 	/*count valance of v1*/
@@ -199,10 +199,10 @@
 	BME_Vert *curvert, *tv, **vlist;
 	int i, j, done, cont, edok;
 	
-	if(len < 2) return BME_exit("MF returned NULL");
+	if(len < 2) return NULL;
 	
 	/*make sure that v1 and v2 are in elist[0]*/
-	if(BME_verts_in_edge(v1,v2,elist[0]) == 0) return BME_exit("MF returned NULL");
+	if(BME_verts_in_edge(v1,v2,elist[0]) == 0) return NULL;
 	
 	/*clear euler flags*/
 	for(i=0;i<len;i++) elist[i]->eflag1=elist[i]->eflag2 = 0;
@@ -220,9 +220,9 @@
 	*/
 	for(i=0; i<len; i++){
 		edok = BME_disk_count_edgeflag(elist[i]->v1, MF_CANDIDATE, 0);
-		if(edok != 2) return BME_exit("MF returned NULL");
+		if(edok != 2) return NULL;
 		edok = BME_disk_count_edgeflag(elist[i]->v2, MF_CANDIDATE, 0);
-		if(edok != 2) return BME_exit("MF returned NULL");
+		if(edok != 2) return NULL;
 	}
 	
 	/*set start edge, start vert and target vert for our loop traversal*/
@@ -430,7 +430,7 @@
 	BME_Edge *ne;
 	int i, edok, valance1=0, valance2=0;
 	
-	if(BME_vert_in_edge(e,tv) == 0) return BME_exit("SEMV returned NULL");
+	if(BME_vert_in_edge(e,tv) == 0) return NULL;
 	ov = BME_edge_getothervert(e,tv);
 	//v2 = tv;
 
@@ -601,7 +601,6 @@
 	BME_Edge *e;
 	int i, len, f1len, f2len;
 	
-	if(f->holes.first) return BME_exit("SFME returned NULL"); //not good, fix me
 	
 	/*verify that v1 and v2 are in face.*/
 	len = BME_cycle_length(f->loopbase);
@@ -610,7 +609,7 @@
 		else if(curloop->v == v2) v2loop = curloop;
 	}
 	
-	if(!v1loop || !v2loop) return BME_exit("SFME returned NULL");
+	if(!v1loop || !v2loop) return NULL;
 	
 	/*allocate new edge between v1 and v2*/
 	e = BME_addedgelist(bm, v1, v2,NULL);
@@ -799,12 +798,19 @@
 	int i, j, edok, len = 0;
 
 	len = BME_cycle_length(l);
-	elist = MEM_callocN(sizeof(BME_Edge *)*len, "BME Loop Reverse edge array");
+	if(bm->edarlen < len){
+		MEM_freeN(bm->edar);
+		bm->edar = MEM_callocN(sizeof(BME_Edge *)* len, "BMesh Edge pointer array");
+		bm->edarlen = bm->edarlen * len;
+	}
 	
 	for(i=0, curloop = l; i< len; i++, curloop=curloop->next){
-		BME_radial_remove_loop(curloop, curloop->e);
 		curloop->e->eflag1 = 0;
-		elist[i] = curloop->e;
+		curloop->e->eflag2 = BME_cycle_length(&curloop->radial);
+		BME_radial_remove_loop(curloop, curloop->e);
+		/*in case of border edges we HAVE to zero out curloop->radial Next/Prev*/
+		curloop->radial.next = curloop->radial.prev = NULL;
+		bm->edar[i] = curloop->e;
 	}
 	
 	/*actually reverse the loop. This belongs in BME_cycle_reverse!*/
@@ -818,16 +824,16 @@
 
 	if(len == 2){ //two edged face
 		//do some verification here!
-		l->e = elist[1];
-		l->next->e = elist[0];
+		l->e = bm->edar[1];
+		l->next->e = bm->edar[0];
 	}
 	else{
 		for(i=0, curloop = l; i < len; i++, curloop = curloop->next){
 			edok = 0;
 			for(j=0; j < len; j++){
-				edok = BME_verts_in_edge(curloop->v, curloop->next->v, elist[j]);
+				edok = BME_verts_in_edge(curloop->v, curloop->next->v, bm->edar[j]);
 				if(edok){
-					curloop->e = elist[j];
+					curloop->e = bm->edar[j];
 					break;
 				}
 			}
@@ -839,7 +845,13 @@
 		//radok = BME_cycle_validate(curloop->e->tmp.l, &(curloop->radial));
 		//if(!radok || curloop->e->loop == NULL) BME_error();
 	}
-	MEM_freeN(elist);
+	/*validate radial*/
+	for(i=0, curloop = l; i < len; i++, curloop = curloop->next){
+		edok = BME_cycle_validate(curloop->e->eflag2, &(curloop->radial));
+		if(!edok){
+			BME_error();
+		}
+	}
 	return 1;
 }
 
@@ -881,8 +893,8 @@
 	BME_Loop *curloop, *f1loop=NULL, *f2loop=NULL;
 	int loopok = 0, newlen = 0,i, f1len=0, f2len=0, radlen=0, edok;
 	
-	if(f1->holes.first || f2->holes.first) return BME_exit("JFKE returned NULL"); //dont operate on faces with holes. Not best solution but tolerable.
-	if(f1 == f2) return BME_exit("JFKE returned NULL"); //can't join a face to itself
+	if(f1->holes.first || f2->holes.first) return NULL; //dont operate on faces with holes. Not best solution but tolerable.
+	if(f1 == f2) return NULL; //can't join a face to itself
 	/*verify that e is in both f1 and f2*/
 	f1len = BME_cycle_length(f1->loopbase);
 	f2len = BME_cycle_length(f2->loopbase);
@@ -898,23 +910,23 @@
 			break;
 		}
 	}
-	if(!(f1loop && f2loop)) return BME_exit("JFKE returned NULL");
+	if(!(f1loop && f2loop)) return NULL;
 	
 	/*validate that edge is 2-manifold edge*/
 	radlen = BME_cycle_length(&(f1loop->radial));
-	if(radlen != 2) return BME_exit("JFKE returned NULL");
+	if(radlen != 2) return NULL;
 
 	/*validate direction of f2's loop cycle is compatible.*/
-	if(f1loop->v == f2loop->v) return BME_exit("JFKE returned NULL");
+	if(f1loop->v == f2loop->v) return NULL;
 	
 	/*
 		Finally validate that for each face, each vertex has another edge in its disk cycle that is 
 		not e, and not shared.
 	*/
-	if(BME_radial_find_face(f1loop->next->e,f2)) return BME_exit("JFKE returned NULL");
-	if(BME_radial_find_face(f1loop->prev->e,f2)) return BME_exit("JFKE returned NULL");
-	if(BME_radial_find_face(f2loop->next->e,f1)) return BME_exit("JFKE returned NULL");
-	if(BME_radial_find_face(f2loop->prev->e,f1)) return BME_exit("JFKE returned NULL");
+	if(BME_radial_find_face(f1loop->next->e,f2)) return NULL;
+	if(BME_radial_find_face(f1loop->prev->e,f2)) return NULL;
+	if(BME_radial_find_face(f2loop->next->e,f1)) return NULL;
+	if(BME_radial_find_face(f2loop->prev->e,f1)) return NULL;
 	
 	/*join the two loops*/
 	f1loop->prev->next = f2loop->next;
@@ -951,57 +963,4 @@
 	BME_free_loop(bm, f2loop);
 	BME_free_poly(bm, f2);	
 	return f1;
-}
-
-/**
- *			BME_MEKL
- *
- *	MAKE EDGE KILL LOOP:
- *	
- *	Bridges a perphiary loop of a face with an internal loop
- *
- *	Examples:
- *

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list