diff options
author | Geoffrey Bantle <hairbat@yahoo.com> | 2008-02-24 15:57:11 +0300 |
---|---|---|
committer | Geoffrey Bantle <hairbat@yahoo.com> | 2008-02-24 15:57:11 +0300 |
commit | eb21b2b16e2b2fb307058f28ce78d268115b59d1 (patch) | |
tree | 161123a1218809e168af67c89cd2f4199c8ab51b /source | |
parent | a9568cc932df27cdf0c339f0b258f3854ff04378 (diff) |
-> Bevel Crash Fix (again redux)
More fixes for 2 edged faces
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenkernel/intern/BME_conversions.c | 55 |
1 files changed, 38 insertions, 17 deletions
diff --git a/source/blender/blenkernel/intern/BME_conversions.c b/source/blender/blenkernel/intern/BME_conversions.c index 9d7e06c6fe9..f7a9cfcb15c 100644 --- a/source/blender/blenkernel/intern/BME_conversions.c +++ b/source/blender/blenkernel/intern/BME_conversions.c @@ -329,13 +329,29 @@ DerivedMesh *BME_bmesh_to_derivedmesh(BME_Mesh *bm, DerivedMesh *dm) 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 = BLI_countlist(&(bm->edges)); + totedge = 0; + + /*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 @@ DerivedMesh *BME_bmesh_to_derivedmesh(BME_Mesh *bm, DerivedMesh *dm) /*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; - } - else{ - me->v1 = e->v2->tflag1; - me->v2 = e->v1->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++; } - 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 @@ DerivedMesh *BME_bmesh_to_derivedmesh(BME_Mesh *bm, DerivedMesh *dm) CustomData_from_em_block(&bm->pdata, &result->faceData, f->data, i); } } - + BLI_edgehash_free(edge_hash, NULL); return result; } |