[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [43065] branches/bmesh/blender/source/ blender/bmesh/operators/mesh_conv.c: Edit BMesh --> Mesh conversion code was using its own face filling functions, replace this with a call to mesh_recalcTesselation() once everything else is converted.
Campbell Barton
ideasman42 at gmail.com
Mon Jan 2 04:52:22 CET 2012
Revision: 43065
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=43065
Author: campbellbarton
Date: 2012-01-02 03:52:10 +0000 (Mon, 02 Jan 2012)
Log Message:
-----------
Edit BMesh --> Mesh conversion code was using its own face filling functions, replace this with a call to mesh_recalcTesselation() once everything else is converted.
gives an overall 3x speedup running bmesh_to_mesh_exec() on suzzane subsurf level 5 (applied).
also removes duplicate code.
Modified Paths:
--------------
branches/bmesh/blender/source/blender/bmesh/operators/mesh_conv.c
Modified: branches/bmesh/blender/source/blender/bmesh/operators/mesh_conv.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/operators/mesh_conv.c 2012-01-02 03:27:08 UTC (rev 43064)
+++ branches/bmesh/blender/source/blender/bmesh/operators/mesh_conv.c 2012-01-02 03:52:10 UTC (rev 43065)
@@ -331,51 +331,6 @@
MEM_freeN(et);
}
-
-static void loops_to_corners(BMesh *bm, Mesh *me, int findex,
- BMFace *f, BMLoop *ls[3], int numTex, int numCol)
-{
- BMLoop *l;
- MTFace *texface;
- MTexPoly *texpoly;
- MCol *mcol;
- MLoopCol *mloopcol;
- MLoopUV *mloopuv;
- int i, j;
-
- for(i=0; i < numTex; i++) {
- texface = CustomData_get_n(&me->fdata, CD_MTFACE, findex, i);
- texpoly = CustomData_bmesh_get_n(&bm->pdata, f->head.data, CD_MTEXPOLY, i);
-
- texface->tpage = texpoly->tpage;
- texface->flag = texpoly->flag;
- texface->transp = texpoly->transp;
- texface->mode = texpoly->mode;
- texface->tile = texpoly->tile;
- texface->unwrap = texpoly->unwrap;
-
- for (j=0; j<3; j++) {
- l = ls[j];
- mloopuv = CustomData_bmesh_get_n(&bm->ldata, l->head.data, CD_MLOOPUV, i);
- texface->uv[j][0] = mloopuv->uv[0];
- texface->uv[j][1] = mloopuv->uv[1];
- }
- }
-
- for(i=0; i < numCol; i++) {
- mcol = CustomData_get_n(&me->fdata, CD_MCOL, findex, i);
-
- for (j=0; j<3; j++) {
- l = ls[j];
- mloopcol = CustomData_bmesh_get_n(&bm->ldata, l->head.data, CD_MLOOPCOL, i);
- mcol[j].r = mloopcol->r;
- mcol[j].g = mloopcol->g;
- mcol[j].b = mloopcol->b;
- mcol[j].a = mloopcol->a;
- }
- }
-}
-
void object_load_bmesh_exec(BMesh *bm, BMOperator *op)
{
Object *ob = BMO_Get_Pnt(op, "object");
@@ -453,17 +408,13 @@
MPoly *mpoly;
MVert *mvert, *oldverts;
MEdge *med, *medge;
- MFace *mface;
BMVert *v, *eve;
BMEdge *e;
BMLoop *l;
BMFace *f;
- BMIter iter, liter; float *facenors = NULL;
- int i, j, *keyi, ototvert, totloop, totface, numTex, numCol, *polyindex = NULL;
+ BMIter iter, liter;
+ int i, j, *keyi, ototvert, totloop;
int dotess = !BMO_Get_Int(op, "notesselation");
-
- numTex = CustomData_number_of_layers(&bm->pdata, CD_MTEXPOLY);
- numCol = CustomData_number_of_layers(&bm->ldata, CD_MLOOPCOL);
ototvert = me->totvert;
@@ -572,116 +523,6 @@
}
bm->elem_index_dirty &= ~BM_EDGE;
- /*new scanfill tesselation code*/
- if (dotess) {
- /*first counter number of faces we'll need*/
- totface = 0;
- BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) {
- EditVert *eve, *lasteve = NULL, *firsteve = NULL;
-
- BLI_begin_edgefill();
- i = 0;
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, f) {
- eve = BLI_addfillvert(l->v->co);
- eve->tmp.p = l;
-
- BM_SetIndex(l, i); /* set_loop */
-
- if (lasteve) {
- BLI_addfilledge(lasteve, eve);
- }
-
- lasteve = eve;
- if (!firsteve) firsteve = eve;
-
- i++;
- }
-
- BLI_addfilledge(lasteve, firsteve);
- totface += BLI_edgefill(0);
-
- BLI_end_edgefill();
- }
-
- me->totface = totface;
-
- /* new tess face block */
- if(totface==0) mface= NULL;
- else {
- mface= MEM_callocN(totface*sizeof(MFace), "loadeditbMesh face");
- facenors = MEM_callocN(totface*sizeof(float)*3, "facenors");
- polyindex = MEM_callocN(totface*sizeof(int), "polyindex");
- }
-
- CustomData_add_layer(&me->fdata, CD_MFACE, CD_ASSIGN, mface, me->totface);
- CustomData_add_layer(&me->fdata, CD_POLYINDEX, CD_ASSIGN, polyindex, me->totface);
- CustomData_add_layer(&me->fdata, CD_NORMAL, CD_ASSIGN, facenors, me->totface);
- CustomData_from_bmeshpoly(&me->fdata, &bm->pdata, &bm->ldata, totface);
-
- mesh_update_customdata_pointers(me, TRUE);
-
- i = 0;
- BM_ITER_INDEX(f, &iter, bm, BM_FACES_OF_MESH, NULL, j) {
- EditVert *eve, *lasteve = NULL, *firsteve = NULL;
- EditFace *efa;
- BMLoop *ls[3];
-
- BLI_begin_edgefill();
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, f) {
- eve = BLI_addfillvert(l->v->co);
- eve->tmp.p = l;
-
- if (lasteve) {
- BLI_addfilledge(lasteve, eve);
- }
-
- lasteve = eve;
- if (!firsteve) firsteve = eve;
- }
-
- BLI_addfilledge(lasteve, firsteve);
- BLI_edgefill(0);
-
- for (efa=fillfacebase.first; efa; efa=efa->next) {
- ls[0] = efa->v1->tmp.p;
- ls[1] = efa->v2->tmp.p;
- ls[2] = efa->v3->tmp.p;
-
- /*ensure correct winding. I believe this is
- analogous to bubble sort on three elements.*/
- if (BM_GetIndex(ls[0]) > BM_GetIndex(ls[1])) {
- SWAP(BMLoop*, ls[0], ls[1]);
- }
- if (BM_GetIndex(ls[1]) > BM_GetIndex(ls[2])) {
- SWAP(BMLoop*, ls[1], ls[2]);
- }
- if (BM_GetIndex(ls[0]) > BM_GetIndex(ls[1])) {
- SWAP(BMLoop*, ls[0], ls[1]);
- }
-
- mface->mat_nr = f->mat_nr;
- mface->flag = BM_Face_Flag_To_MEFlag(f);
-
- mface->v1 = BM_GetIndex(ls[0]->v);
- mface->v2 = BM_GetIndex(ls[1]->v);
- mface->v3 = BM_GetIndex(ls[2]->v);
-
- test_index_face(mface, &me->fdata, i, 1);
-
- loops_to_corners(bm, me, i, f, ls, numTex, numCol);
- copy_v3_v3(facenors, ls[0]->f->no);
-
- *polyindex = j;
-
- mface++;
- facenors += 3;
- polyindex++;
- i++;
- }
- BLI_end_edgefill();
- }
- }
-
i = 0;
j = 0;
BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) {
@@ -769,6 +610,12 @@
if (vertMap) MEM_freeN(vertMap);
}
+ if (dotess) {
+ me->totface= mesh_recalcTesselation(&me->fdata, &me->ldata, &me->pdata,
+ me->mvert,
+ me->totface, me->totloop, me->totpoly);
+ }
+
mesh_update_customdata_pointers(me, dotess);
{
More information about the Bf-blender-cvs
mailing list