Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeoffrey Bantle <hairbat@yahoo.com>2008-02-24 15:57:11 +0300
committerGeoffrey Bantle <hairbat@yahoo.com>2008-02-24 15:57:11 +0300
commiteb21b2b16e2b2fb307058f28ce78d268115b59d1 (patch)
tree161123a1218809e168af67c89cd2f4199c8ab51b /source/blender/blenkernel/intern/BME_conversions.c
parenta9568cc932df27cdf0c339f0b258f3854ff04378 (diff)
-> Bevel Crash Fix (again redux)
More fixes for 2 edged faces
Diffstat (limited to 'source/blender/blenkernel/intern/BME_conversions.c')
-rw-r--r--source/blender/blenkernel/intern/BME_conversions.c55
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;
}