diff options
author | Joseph Eagar <joeedh@gmail.com> | 2011-06-14 07:16:08 +0400 |
---|---|---|
committer | Joseph Eagar <joeedh@gmail.com> | 2011-06-14 07:16:08 +0400 |
commit | 73a545b0d52e61ca8a648f3f81e05dbeb2ba8c9b (patch) | |
tree | 894354af7ac7eb54d8d2adb5d7bb2c66b0b63fb1 /source/blender/blenkernel/intern/modifiers_bmesh.c | |
parent | f122a74b1e778bc902fa57f0689ac89c1dacbcef (diff) |
=bmesh=
Removed the DerivedMesh face iterators (they sucked).
This should make subsurf faster. Also sped up multires
a bit (not sure if it's strictly correct, need to look
at it later).
Diffstat (limited to 'source/blender/blenkernel/intern/modifiers_bmesh.c')
-rw-r--r-- | source/blender/blenkernel/intern/modifiers_bmesh.c | 40 |
1 files changed, 18 insertions, 22 deletions
diff --git a/source/blender/blenkernel/intern/modifiers_bmesh.c b/source/blender/blenkernel/intern/modifiers_bmesh.c index 7b6e843e74e..6454019be57 100644 --- a/source/blender/blenkernel/intern/modifiers_bmesh.c +++ b/source/blender/blenkernel/intern/modifiers_bmesh.c @@ -112,8 +112,8 @@ BMEditMesh *CDDM_To_BMesh(Object *ob, DerivedMesh *dm, BMEditMesh *existing) BMEditMesh *em = existing; MVert *mv, *mvert; MEdge *me, *medge; - DMFaceIter *dfiter; - DMLoopIter *dliter; + MPoly *mpoly, *mp; + MLoop *mloop, *ml; BMVert *v, **vtable, **verts=NULL; BMEdge *e, **etable, **edges=NULL; BMFace *f; @@ -171,45 +171,41 @@ BMEditMesh *CDDM_To_BMesh(Object *ob, DerivedMesh *dm, BMEditMesh *existing) MEM_freeN(medge); /*do faces*/ - k = 0; - dfiter = dm->newFaceIter(dm); - for (; !dfiter->done; dfiter->step(dfiter)) { + mpoly = mp = dm->getPolyArray(dm); + mloop = dm->getLoopArray(dm); + for (i=0; i<dm->numFaceData; i++, mp++) { BMLoop *l; BLI_array_empty(verts); BLI_array_empty(edges); - dliter = dfiter->getLoopsIter(dfiter); - for (j=0; !dliter->done; dliter->step(dliter), j++) { + ml = mloop + mp->loopstart; + for (j=0; j<mp->totloop; j++, ml++) { BLI_array_growone(verts); BLI_array_growone(edges); - verts[j] = vtable[dliter->vindex]; - edges[j] = etable[dliter->eindex]; + verts[j] = vtable[ml->v]; + edges[j] = etable[ml->e]; } - if (j < 2) - break; - - f = BM_Make_Ngon(bm, verts[0], verts[1], edges, dfiter->len, 0); + f = BM_Make_Ngon(bm, verts[0], verts[1], edges, mp->totloop, 0); - if (!f) + if (!f) continue; - f->head.flag = MEFlags_To_BMFlags(dfiter->flags, BM_FACE); - f->mat_nr = dfiter->mat_nr; + f->head.flag = MEFlags_To_BMFlags(mp->flag, BM_FACE); + f->mat_nr = mp->mat_nr; - dliter = dfiter->getLoopsIter(dfiter); l = BMIter_New(&liter, bm, BM_LOOPS_OF_FACE, f); - for (j=0; l; l=BMIter_Step(&liter)) { + k = mp->loopstart; + + for (j=0; l; l=BMIter_Step(&liter), k++) { CustomData_to_bmesh_block(&dm->loopData, &bm->ldata, k, &l->head.data); - k += 1; } - CustomData_to_bmesh_block(&dm->polyData, &bm->pdata, - dfiter->index, &f->head.data); + CustomData_to_bmesh_block(&dm->polyData, &bm->pdata, + i, &f->head.data); } - dfiter->free(dfiter); MEM_freeN(vtable); MEM_freeN(etable); |