[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