diff options
author | Campbell Barton <ideasman42@gmail.com> | 2009-12-21 11:37:30 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2009-12-21 11:37:30 +0300 |
commit | 824b76332202c33da0a9ec6fe803e4eb752618d5 (patch) | |
tree | cc14c7ac1d8e3cae6eb5c769c082c70053a60665 /source | |
parent | c050f5f1deb7ae2627ce913f467e497a16a2aa2c (diff) |
solidify modifier - rim faces now copy values from the faces they extrude from (material, face flags but not uvs or vcols yet)
this doesnt work in editmode yet.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenkernel/intern/modifier.c | 63 |
1 files changed, 40 insertions, 23 deletions
diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c index 732ba2a651e..e4728602d65 100644 --- a/source/blender/blenkernel/intern/modifier.c +++ b/source/blender/blenkernel/intern/modifier.c @@ -5967,6 +5967,8 @@ static DerivedMesh *solidifyModifier_applyModifier(ModifierData *md, int *new_edge_arr= NULL; int newEdges = 0; + int *edge_users= NULL; + float (*vert_nors)[3]= NULL; orig_mface = dm->getFaceArray(dm); @@ -5977,7 +5979,7 @@ static DerivedMesh *solidifyModifier_applyModifier(ModifierData *md, EdgeHash *edgehash = BLI_edgehash_new(); EdgeHashIterator *ehi; int v1, v2; - int *edge_users; + int edu, eidx; for(i=0, mv=orig_mvert; i<numVerts; i++, mv++) { mv->flag &= ~ME_VERT_TMP_TAG; @@ -5987,38 +5989,47 @@ static DerivedMesh *solidifyModifier_applyModifier(ModifierData *md, BLI_edgehash_insert(edgehash, ed->v1, ed->v2, (void *)i); } - edge_users= MEM_callocN(sizeof(int) * numEdges, "solid_mod edges"); +#define INVALID_UNUSED -1 +#define INVALID_PAIR -2 + +#define ADD_EDGE_USER(_v1, _v2) \ + eidx= GET_INT_FROM_POINTER(BLI_edgehash_lookup(edgehash, _v1, _v2)); \ + if(edge_users[eidx] == INVALID_UNUSED) { \ + edge_users[eidx]= (_v1 < _v2) ? i:(i+numFaces); \ + } else { \ + edge_users[eidx]= INVALID_PAIR; \ + } \ -/* will be incorrect if an edge happens to have this many face users (very unlikely) */ -#define LARGE_NUM 1000000 + + edge_users= MEM_mallocN(sizeof(int) * numEdges, "solid_mod edges"); + memset(edge_users, INVALID_UNUSED, sizeof(int) * numEdges); for(i=0, mf=orig_mface; i<numFaces; i++, mf++) { if(mf->v4) { - edge_users[(int)BLI_edgehash_lookup(edgehash, mf->v1, mf->v2)] += mf->v1 < mf->v2 ? 1:LARGE_NUM; - edge_users[(int)BLI_edgehash_lookup(edgehash, mf->v2, mf->v3)] += mf->v2 < mf->v3 ? 1:LARGE_NUM; - edge_users[(int)BLI_edgehash_lookup(edgehash, mf->v3, mf->v4)] += mf->v3 < mf->v4 ? 1:LARGE_NUM; - edge_users[(int)BLI_edgehash_lookup(edgehash, mf->v4, mf->v1)] += mf->v4 < mf->v1 ? 1:LARGE_NUM; + ADD_EDGE_USER(mf->v1, mf->v2); + ADD_EDGE_USER(mf->v2, mf->v3); + ADD_EDGE_USER(mf->v3, mf->v4); + ADD_EDGE_USER(mf->v4, mf->v1); } else { - edge_users[(int)BLI_edgehash_lookup(edgehash, mf->v1, mf->v2)] += mf->v1 < mf->v2 ? 1:LARGE_NUM; - edge_users[(int)BLI_edgehash_lookup(edgehash, mf->v2, mf->v3)] += mf->v2 < mf->v3 ? 1:LARGE_NUM; - edge_users[(int)BLI_edgehash_lookup(edgehash, mf->v3, mf->v1)] += mf->v3 < mf->v1 ? 1:LARGE_NUM; + ADD_EDGE_USER(mf->v1, mf->v2); + ADD_EDGE_USER(mf->v2, mf->v3); + ADD_EDGE_USER(mf->v3, mf->v1); } } +#undef ADD_EDGE_USER +#undef INVALID_UNUSED +#undef INVALID_PAIR + + new_edge_arr= MEM_callocN(sizeof(int) * numEdges, "solid_mod arr"); ehi= BLI_edgehashIterator_new(edgehash); for(; !BLI_edgehashIterator_isDone(ehi); BLI_edgehashIterator_step(ehi)) { - int eidx= (int)BLI_edgehashIterator_getValue(ehi); - if(edge_users[eidx] == 1 || edge_users[eidx] == LARGE_NUM) { + int eidx= GET_INT_FROM_POINTER(BLI_edgehashIterator_getValue(ehi)); + if(edge_users[eidx] >= 0) { BLI_edgehashIterator_getKey(ehi, &v1, &v2); - - /* we need to order the edge */ - if(edge_users[eidx] == LARGE_NUM) { - eidx= -(eidx + 1); - } - orig_mvert[v1].flag |= ME_VERT_TMP_TAG; orig_mvert[v2].flag |= ME_VERT_TMP_TAG; new_edge_arr[newFaces]= eidx; @@ -6026,9 +6037,8 @@ static DerivedMesh *solidifyModifier_applyModifier(ModifierData *md, } } BLI_edgehashIterator_free(ehi); - MEM_freeN(edge_users); -#undef LARGE_NUM + new_vert_arr= MEM_callocN(sizeof(int) * numVerts, "solid_mod new_varr"); for(i=0, mv=orig_mvert; i<numVerts; i++, mv++) { @@ -6184,10 +6194,11 @@ static DerivedMesh *solidifyModifier_applyModifier(ModifierData *md, for(i=0; i<newFaces; i++, mf++) { /* TODO, get UV's and VCols from the faces we're extruded from */ int eidx= new_edge_arr[i]; + int fidx= edge_users[eidx]; int flip; - if(eidx < 0) { - eidx= (-eidx) -1; + if(fidx >= numFaces) { + fidx -= numFaces; flip= 1; } else { @@ -6196,6 +6207,9 @@ static DerivedMesh *solidifyModifier_applyModifier(ModifierData *md, ed= medge + eidx; + /* copy most of the face settings */ + *mf= mface[fidx]; + if(flip) { mf->v1= ed->v1; mf->v2= ed->v2; @@ -6207,6 +6221,8 @@ static DerivedMesh *solidifyModifier_applyModifier(ModifierData *md, mf->v2= ed->v1; mf->v3= ed->v1 + numVerts; mf->v4= ed->v2 + numVerts; + + } if(smd->crease_outer > 0.0f) @@ -6220,6 +6236,7 @@ static DerivedMesh *solidifyModifier_applyModifier(ModifierData *md, MEM_freeN(new_vert_arr); MEM_freeN(new_edge_arr); + MEM_freeN(edge_users); } return result; |