diff options
author | Daniel Dunbar <daniel@zuster.org> | 2004-01-07 13:17:37 +0300 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2004-01-07 13:17:37 +0300 |
commit | ecd620a5aad00c21a67301c5a029785bf6667e3a (patch) | |
tree | 54fe3fed77e477e3fc64b5a4817874048c8c41eb /source/blender/blenkernel/intern/subsurf.c | |
parent | 38e88310b04736abfdc24150cd880204472328ed (diff) |
- removed some old cruft from init_render_displist_mesh (for smeshes-RIP)
- reduced main subsurf interface to two functions to make DispListMesh
structures from an editmesh or a regular mesh. for the most part this
means that to implement a geometry modifier you only need to write
these two functions (not very plugable yet however).
- added displistmesh_from_mesh and displistmesh_from_editmesh functions
which allow simple support of subdivLevel(0) subsurfs, somewhat handy
for testing things (like why orco doesn't work for subsurf).
Diffstat (limited to 'source/blender/blenkernel/intern/subsurf.c')
-rw-r--r-- | source/blender/blenkernel/intern/subsurf.c | 100 |
1 files changed, 23 insertions, 77 deletions
diff --git a/source/blender/blenkernel/intern/subsurf.c b/source/blender/blenkernel/intern/subsurf.c index 9e4d189e935..4aab0fb6d8f 100644 --- a/source/blender/blenkernel/intern/subsurf.c +++ b/source/blender/blenkernel/intern/subsurf.c @@ -330,7 +330,7 @@ static HyperMesh *hypermesh_new(void) { return hme; } -static HyperMesh *hypermesh_from_mesh(Mesh *me, DispList *dlverts) { +static HyperMesh *hypermesh_from_mesh(Mesh *me, float *extverts) { HyperMesh *hme= hypermesh_new(); HyperVert **vert_tbl; MFace *mface= me->mface; @@ -345,8 +345,8 @@ static HyperMesh *hypermesh_from_mesh(Mesh *me, DispList *dlverts) { vert_tbl= MEM_mallocN(sizeof(*vert_tbl)*me->totvert, "vert_tbl"); for (i= 0; i<me->totvert; i++) { - if (dlverts) - vert_tbl[i]= hypermesh_add_vert(hme, &dlverts->verts[i*3], NULL); + if (extverts) + vert_tbl[i]= hypermesh_add_vert(hme, &extverts[i*3], NULL); else vert_tbl[i]= hypermesh_add_vert(hme, me->mvert[i].co, NULL); } @@ -759,10 +759,9 @@ static int hypermesh_get_nlines(HyperMesh *hme) { } /* flag is me->flag, for handles and 'optim' */ -static DispList *hypermesh_to_displist(HyperMesh *hme, short flag) { +static DispListMesh *hypermesh_to_displistmesh(HyperMesh *hme, short flag) { int nverts= hypermesh_get_nverts(hme); int nfaces= hypermesh_get_nfaces(hme) + hypermesh_get_nlines(hme); - DispList *dl= MEM_callocN(sizeof(*dl), "dl"); DispListMesh *dlm= MEM_callocN(sizeof(*dlm), "dlmesh"); HyperFace *f; HyperVert *v; @@ -785,9 +784,6 @@ static DispList *hypermesh_to_displist(HyperMesh *hme, short flag) { if (hme->orig_me==NULL && (flag & ME_OPT_EDGES)) { handles= hypermesh_get_nverts_handles(hme); } - - dl->type= DL_MESH; - dl->mesh= dlm; dlm->totvert= nverts+handles; dlm->totface= nfaces+handles; @@ -919,12 +915,12 @@ static DispList *hypermesh_to_displist(HyperMesh *hme, short flag) { displistmesh_calc_vert_normals(dlm); - return dl; + return dlm; } /* flag is me->flag, for handles and 'optim' */ -static DispList *subsurf_subdivide_to_displist(HyperMesh *hme, short subdiv, short flag) { - DispList *dl; +static DispListMesh *subsurf_subdivide_to_displistmesh(HyperMesh *hme, short subdiv, short flag) { + DispListMesh *dlm; int i; for (i= 0; i<subdiv; i++) { @@ -940,82 +936,32 @@ static DispList *subsurf_subdivide_to_displist(HyperMesh *hme, short subdiv, sho hme= tmp; } - dl= hypermesh_to_displist(hme, flag); + dlm= hypermesh_to_displistmesh(hme, flag); hypermesh_free(hme); - return dl; + return dlm; } -void subsurf_make_editmesh(Object *ob) { - if (G.eded.first) { - Mesh *me= ob->data; - HyperMesh *hme= hypermesh_from_editmesh(G.edve.first, G.eded.first, G.edvl.first); - - free_displist_by_type(&me->disp, DL_MESH); - BLI_addtail(&me->disp, subsurf_subdivide_to_displist(hme, me->subdiv, me->flag)); - } -} - -void subsurf_make_mesh(Object *ob, short subdiv) { - Mesh *me= ob->data; - - if (me->totface) { - HyperMesh *hme= hypermesh_from_mesh(me, find_displist(&ob->disp, DL_VERTS)); - - free_displist_by_type(&me->disp, DL_MESH); - BLI_addtail(&me->disp, subsurf_subdivide_to_displist(hme, subdiv, me->flag)); - } -} - -void subsurf_to_mesh(Object *oldob, Mesh *me) { - Mesh *oldme= oldob->data; - - if (oldme->totface && oldme->subdiv) { - HyperMesh *hme= hypermesh_from_mesh(oldme, NULL); - DispList *dl= subsurf_subdivide_to_displist(hme, oldme->subdiv, oldme->flag); - DispListMesh *dlm= dl->mesh; - MFace *mfaces; - int i; - - if (dlm->totvert>65000) - error("Too many vertices"); - else { - me->totface= dlm->totface; - me->totvert= dlm->totvert; - - me->mvert= MEM_dupallocN(dlm->mvert); - me->mface= mfaces= MEM_mallocN(sizeof(*mfaces)*me->totface, "me->mface"); - me->tface= MEM_dupallocN(dlm->tface); - me->mcol= MEM_dupallocN(dlm->mcol); +DispListMesh *subsurf_make_dispListMesh_from_editmesh(ListBase *verts, ListBase *edges, ListBase *faces, int subdivLevels, int flags) { + if (subdivLevels<1) { + return displistmesh_from_editmesh(verts, edges, faces); + } else { + HyperMesh *hme= hypermesh_from_editmesh(verts->first, edges->first, faces->first); - for (i=0; i<me->totface; i++) { - MFace *mf= &mfaces[i]; - MFaceInt *oldmf= &dlm->mface[i]; - - mf->v1= oldmf->v1; - mf->v2= oldmf->v2; - mf->v3= oldmf->v3; - mf->v4= oldmf->v4; - mf->flag= oldmf->flag; - mf->mat_nr= oldmf->mat_nr; - mf->puno= 0; - mf->edcode= ME_V1V2|ME_V2V3|ME_V3V4|ME_V4V1; - } - } - - free_disp_elem(dl); + return subsurf_subdivide_to_displistmesh(hme, subdivLevels, flags); } } +DispListMesh *subsurf_make_dispListMesh_from_mesh(Mesh *me, float *extverts, int subdivLevels, int flags) { + if (subdivLevels<1) { + return displistmesh_from_mesh(me, extverts); + } else { + HyperMesh *hme= hypermesh_from_mesh(me, extverts); -DispList* subsurf_mesh_to_displist(Mesh *me, DispList *dl, short subdiv) -{ - HyperMesh *hme; - - hme= hypermesh_from_mesh(me, dl); - - return subsurf_subdivide_to_displist(hme, subdiv, me->flag); + return subsurf_subdivide_to_displistmesh(hme, subdivLevels, flags); + } } + // editarmature.c void subsurf_calculate_limit_positions(Mesh *me, float (*positions_r)[3]) { /* Finds the subsurf limit positions for the verts in a mesh |