[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [51414] trunk/blender/source/blender/ blenkernel/intern/modifiers_bmesh.c: DM_to_bmesh_ex() now initializes index values when running in empty meshes.

Campbell Barton ideasman42 at gmail.com
Fri Oct 19 05:28:47 CEST 2012


Revision: 51414
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=51414
Author:   campbellbarton
Date:     2012-10-19 03:28:41 +0000 (Fri, 19 Oct 2012)
Log Message:
-----------
DM_to_bmesh_ex() now initializes index values when running in empty meshes. saves running extra loop on vert/edge/face data if these values are needed after.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/modifiers_bmesh.c

Modified: trunk/blender/source/blender/blenkernel/intern/modifiers_bmesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/modifiers_bmesh.c	2012-10-19 03:07:58 UTC (rev 51413)
+++ trunk/blender/source/blender/blenkernel/intern/modifiers_bmesh.c	2012-10-19 03:28:41 UTC (rev 51414)
@@ -55,6 +55,7 @@
 	BLI_array_declare(verts);
 	BLI_array_declare(edges);
 	int i, j, k, totvert, totedge /* , totface */ /* UNUSED */ ;
+	int is_init = (bm->totvert == 0) && (bm->totedge == 0) && (bm->totface == 0);
 
 	/*merge custom data layout*/
 	CustomData_bmesh_merge(&dm->vertData, &bm->vdata, CD_MASK_DERIVEDMESH, CD_CALLOC, bm, BM_VERT);
@@ -81,6 +82,7 @@
 		v = BM_vert_create(bm, mv->co, NULL);
 		normal_short_to_float_v3(v->no, mv->no);
 		v->head.hflag = BM_vert_flag_from_mflag(mv->flag);
+		BM_elem_index_set(v, i); /* set_inline */
 
 		CustomData_to_bmesh_block(&dm->vertData, &bm->vdata, i, &v->head.data);
 
@@ -89,6 +91,7 @@
 		vtable[i] = v;
 	}
 	MEM_freeN(mvert);
+	if (is_init) bm->elem_index_dirty &= ~BM_VERT;
 
 	/*do edges*/
 	me = medge = dm->dupEdgeArray(dm);
@@ -96,6 +99,7 @@
 		e = BM_edge_create(bm, vtable[me->v1], vtable[me->v2], NULL, FALSE);
 
 		e->head.hflag = BM_edge_flag_from_mflag(me->flag);
+		BM_elem_index_set(e, i); /* set_inline */
 
 		CustomData_to_bmesh_block(&dm->edgeData, &bm->edata, i, &e->head.data);
 		etable[i] = e;
@@ -106,8 +110,10 @@
 		BM_elem_float_data_set(&bm->edata, e, CD_BWEIGHT, (float)me->bweight / 255.0f);
 	}
 	MEM_freeN(medge);
+	if (is_init) bm->elem_index_dirty &= ~BM_EDGE;
 
-	/*do faces*/
+	/* do faces */
+	/* note: i_alt is aligned with bmesh faces which may not always align with mpolys */
 	mp = dm->getPolyArray(dm);
 	mloop = dm->getLoopArray(dm);
 	face_normals = CustomData_get_layer(&dm->polyData, CD_NORMAL);  /* can be NULL */
@@ -134,6 +140,7 @@
 		}
 
 		f->head.hflag = BM_face_flag_from_mflag(mp->flag);
+		BM_elem_index_set(f, bm->totface - 1); /* set_inline */
 		f->mat_nr = mp->mat_nr;
 
 		l = BM_iter_new(&liter, bm, BM_LOOPS_OF_FACE, f);
@@ -151,6 +158,7 @@
 			BM_face_normal_update(f);
 		}
 	}
+	if (is_init) bm->elem_index_dirty &= ~BM_FACE;
 
 	MEM_freeN(vtable);
 	MEM_freeN(etable);




More information about the Bf-blender-cvs mailing list