diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2006-11-12 02:23:15 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2006-11-12 02:23:15 +0300 |
commit | e4a1eb4e09384aee760d45db1841666c92972743 (patch) | |
tree | b83af584c08afa2e08c21da528d4defde8813bf9 /source/blender/src/editmesh.c | |
parent | 8857f4ce86cd277d45e513ef1025cd91c4c74753 (diff) |
Added custom vertex data support to editmode. Only used for vertex groups
now, others can be added later (sticky, shape keys). Beside one small fix
for knife exact vertex group interpolation, is intended to work the same
as before.
Also fixes bug #5200, related to editmode undo and vertex groups. And
corrects the editmode to faceselect mode selection conversion, that was
broken in a previous commit.
Diffstat (limited to 'source/blender/src/editmesh.c')
-rw-r--r-- | source/blender/src/editmesh.c | 121 |
1 files changed, 59 insertions, 62 deletions
diff --git a/source/blender/src/editmesh.c b/source/blender/src/editmesh.c index a891fe1adab..34fb0f1d17a 100644 --- a/source/blender/src/editmesh.c +++ b/source/blender/src/editmesh.c @@ -134,7 +134,7 @@ static void *(*callocvert)(size_t, size_t) = calloc; static void *(*callocedge)(size_t, size_t) = calloc; static void *(*callocface)(size_t, size_t) = calloc; -EditVert *addvertlist(float *vec) +EditVert *addvertlist(float *vec, EditVert *example) { EditMesh *em = G.editMesh; EditVert *eve; @@ -156,6 +156,11 @@ EditVert *addvertlist(float *vec) createVerseVert(eve); #endif + if(example) + CustomData_em_copy_data(&em->vdata, &em->vdata, example->data, &eve->data); + else + CustomData_em_set_default(&em->vdata, &eve->data); + return eve; } @@ -172,11 +177,10 @@ void free_editvert (EditVert *eve) } #endif - if(eve->dw) MEM_freeN(eve->dw); EM_remove_selection(eve, EDITVERT); - if(eve->fast==0){ + CustomData_em_free_block(&G.editMesh->vdata, &eve->data); + if(eve->fast==0) free(eve); - } } @@ -411,7 +415,7 @@ EditFace *addfacelist(EditVert *v1, EditVert *v2, EditVert *v3, EditVert *v4, Ed if(example) { efa->mat_nr= example->mat_nr; efa->flag= example->flag; - CustomData_em_copy_data(&em->fdata, example->data, &efa->data); + CustomData_em_copy_data(&em->fdata, &em->fdata, example->data, &efa->data); } else { if (G.obedit && G.obedit->actcol) @@ -554,6 +558,7 @@ void free_editMesh(EditMesh *em) if(em->faces.first) free_facelist(&em->faces); if(em->selected.first) BLI_freelistN(&(em->selected)); + CustomData_free(&em->vdata); CustomData_free(&em->fdata); if(em->derivedFinal) { @@ -784,7 +789,7 @@ void make_editMesh() EditFace *efa; EditEdge *eed; EditSelection *ese; - CustomData mfdata; + CustomData mvdata, mfdata; int tot, a, eekadoodle= 0; #ifdef WITH_VERSE @@ -817,11 +822,16 @@ void make_editMesh() } /* make editverts */ + CustomData_init(&mvdata, 0, me->totvert, SUB_ELEMS_VERT); + if(me->dvert) + CustomData_add_layer(&mvdata, LAYERTYPE_MDEFORMVERT, LAYERFLAG_NOFREE, me->dvert); + CustomData_from_template(&mvdata, &em->vdata, 0, 0); + mvert= me->mvert; evlist= (EditVert **)MEM_mallocN(tot*sizeof(void *),"evlist"); for(a=0; a<tot; a++, mvert++) { - eve= addvertlist(mvert->co); + eve= addvertlist(mvert->co, NULL); evlist[a]= eve; // face select sets selection in next loop @@ -839,16 +849,11 @@ void make_editMesh() */ eve->keyindex = a; - if (me->dvert){ - eve->totweight = me->dvert[a].totweight; - if (me->dvert[a].dw){ - eve->dw = MEM_callocN (sizeof(MDeformWeight) * me->dvert[a].totweight, "deformWeight"); - memcpy (eve->dw, me->dvert[a].dw, sizeof(MDeformWeight) * me->dvert[a].totweight); - } - } - + CustomData_to_em_block(&mvdata, &em->vdata, a, &eve->data); } + CustomData_free(&mvdata); + if(actkey && actkey->totelem!=me->totvert); else { MEdge *medge= me->medge; @@ -972,8 +977,7 @@ void load_editMesh(void) EditSelection *ese; float *fp, *newkey, *oldkey, nor[3]; int i, a, ototvert, totedge=0; - MDeformVert *dvert; - CustomData mfdata; + CustomData mvdata, mfdata; #ifdef WITH_VERSE if(em->vnode) { @@ -1010,13 +1014,19 @@ void load_editMesh(void) if(G.totface==0) mface= NULL; else mface= MEM_callocN(G.totface*sizeof(MFace), "loadeditMesh face"); - /* are we adding dverts? */ - if (G.totvert==0) dvert= NULL; - else if(G.obedit->defbase.first==NULL) dvert= NULL; - else dvert = MEM_callocN(G.totvert*sizeof(MDeformVert), "loadeditMesh3"); - - if (me->dvert) free_dverts(me->dvert, me->totvert); - me->dvert=dvert; + /* free vertex and face data */ + if (me->dvert) { + free_dverts(me->dvert, me->totvert); + me->dvert= NULL; + } + if(me->tface) { + MEM_freeN(me->tface); + me->tface = NULL; + } + if(me->mcol) { + MEM_freeN(me->mcol); + me->mcol = NULL; + } /* lets save the old verts just in case we are actually working on * a key ... we now do processing of the keys at the end */ @@ -1036,15 +1046,8 @@ void load_editMesh(void) me->mface= mface; me->totface= G.totface; - /* face data */ - if(me->tface) { - MEM_freeN(me->tface); - me->tface = NULL; - } - if(me->mcol) { - MEM_freeN(me->mcol); - me->mcol = NULL; - } + /* vertex and face data */ + CustomData_from_template(&em->vdata, &mvdata, LAYERFLAG_NOFREE, me->totvert); CustomData_from_template(&em->fdata, &mfdata, LAYERFLAG_NOFREE, me->totface); /* the vertices, use ->tmp.l as counter */ @@ -1060,16 +1063,9 @@ void load_editMesh(void) VecMulf(nor, 32767.0); VECCOPY(mvert->no, nor); - /* note: it used to remove me->dvert when it was not in use, cancelled that... annoying when you have a fresh vgroup */ - if (dvert){ - dvert->totweight=eve->totweight; - if (eve->dw){ - dvert->dw = MEM_callocN (sizeof(MDeformWeight)*eve->totweight, - "deformWeight"); - memcpy (dvert->dw, eve->dw, - sizeof(MDeformWeight)*eve->totweight); - } - } + /* note: it used to remove me->dvert when it was not in use, cancelled + that... annoying when you have a fresh vgroup */ + CustomData_from_em_block(&em->vdata, &mvdata, eve->data, a); eve->tmp.l = a++; /* counter */ @@ -1086,9 +1082,12 @@ void load_editMesh(void) #endif eve= eve->next; mvert++; - if(dvert) dvert++; } + /* from CustomData to dvert in Mesh */ + me->dvert = CustomData_get(&mvdata, 0, LAYERTYPE_MDEFORMVERT); + CustomData_free(&mvdata); + /* the edges */ a= 0; eed= em->edges.first; @@ -1180,14 +1179,14 @@ void load_editMesh(void) /* sync hide and select flags with faceselect mode */ if(G.f & G_FACESELECT) { - if(me->tface && (me->totface > 0)) { + if(CustomData_has_layer(&mfdata, LAYERTYPE_TFACE) && (me->totface > 0)) { efa= em->faces.first; - for(a=0, efa=em->faces.first; efa; a++, efa++) { + for(a=0, efa=em->faces.first; efa; a++, efa=efa->next) { tf = CustomData_get(&mfdata, a, LAYERTYPE_TFACE); if(efa->h) tf->flag |= TF_HIDE; else tf->flag &= ~TF_HIDE; - if(efa->f & SELECT) tf->flag |= TF_SELECT; + if(efa->f & SELECT) tf->flag |= TF_SELECT; else tf->flag &= ~TF_SELECT; } } @@ -1196,7 +1195,6 @@ void load_editMesh(void) /* from CustomData to tface and mcol in Mesh */ me->tface = CustomData_get(&mfdata, 0, LAYERTYPE_TFACE); me->mcol = CustomData_get(&mfdata, 0, LAYERTYPE_MCOL); - CustomData_free(&mfdata); /* patch hook indices */ @@ -1566,6 +1564,7 @@ void separate_mesh(void) emcopy.alledges= NULL; emcopy.allfaces= NULL; emcopy.derivedFinal= emcopy.derivedCage= NULL; + memset(&emcopy.vdata, 0, sizeof(emcopy.vdata)); memset(&emcopy.fdata, 0, sizeof(emcopy.fdata)); free_editMesh(&emcopy); @@ -1760,6 +1759,7 @@ void separate_mesh_loose(void) emcopy.alledges= NULL; emcopy.allfaces= NULL; emcopy.derivedFinal= emcopy.derivedCage= NULL; + memset(&emcopy.vdata, 0, sizeof(emcopy.vdata)); memset(&emcopy.fdata, 0, sizeof(emcopy.fdata)); free_editMesh(&emcopy); @@ -1801,8 +1801,6 @@ typedef struct EditVertC float no[3]; float co[3]; unsigned char f, h; - short totweight; - struct MDeformWeight *dw; int keyindex; } EditVertC; @@ -1835,7 +1833,7 @@ typedef struct UndoMesh { short selectmode; RetopoPaintData *retopo_paint_data; char retopo_mode; - CustomData fdata; + CustomData vdata, fdata; } UndoMesh; /* for callbacks */ @@ -1843,18 +1841,13 @@ typedef struct UndoMesh { static void free_undoMesh(void *umv) { UndoMesh *um= umv; - EditVertC *evec; - int a; - - for(a=0, evec= um->verts; a<um->totvert; a++, evec++) { - if(evec->dw) MEM_freeN(evec->dw); - } if(um->verts) MEM_freeN(um->verts); if(um->edges) MEM_freeN(um->edges); if(um->faces) MEM_freeN(um->faces); if(um->selected) MEM_freeN(um->selected); if(um->retopo_paint_data) retopo_free_paint_data(um->retopo_paint_data); + CustomData_free(&um->vdata); CustomData_free(&um->fdata); MEM_freeN(um); } @@ -1888,6 +1881,7 @@ static void *editMesh_to_undoMesh(void) if(um->totface) efac= um->faces= MEM_callocN(um->totface*sizeof(EditFaceC), "allfacesC"); if(um->totsel) esec= um->selected= MEM_callocN(um->totsel*sizeof(EditSelectionC), "allselections"); + if(um->totvert) CustomData_from_template(&em->vdata, &um->vdata, 0, um->totvert); if(um->totface) CustomData_from_template(&em->fdata, &um->fdata, 0, um->totface); /* now copy vertices */ @@ -1899,9 +1893,9 @@ static void *editMesh_to_undoMesh(void) evec->f= eve->f; evec->h= eve->h; evec->keyindex= eve->keyindex; - evec->totweight= eve->totweight; - evec->dw= MEM_dupallocN(eve->dw); eve->tmp.l = a; /*store index*/ + + CustomData_from_em_block(&em->vdata, &um->vdata, eve->data, a); } /* copy edges */ @@ -1988,17 +1982,20 @@ static void undoMesh_to_editMesh(void *umv) #endif /* now copy vertices */ + CustomData_free(&em->vdata); + CustomData_from_template(&um->vdata, &em->vdata, 0, 0); + if(um->totvert) evar= MEM_mallocN(um->totvert*sizeof(EditVert *), "vertex ar"); for(a=0, evec= um->verts; a<um->totvert; a++, evec++) { - eve= addvertlist(evec->co); + eve= addvertlist(evec->co, NULL); evar[a]= eve; VECCOPY(eve->no, evec->no); eve->f= evec->f; eve->h= evec->h; - eve->totweight= evec->totweight; eve->keyindex= evec->keyindex; - eve->dw= MEM_dupallocN(evec->dw); + + CustomData_to_em_block(&um->vdata, &em->vdata, a, &eve->data); } /* copy edges */ |