[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [56615] trunk/blender/source/blender: bmesh: avoid using BLI_array macros for every face when converting to bmesh, replace with alloca

Campbell Barton ideasman42 at gmail.com
Thu May 9 12:44:38 CEST 2013


Revision: 56615
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=56615
Author:   campbellbarton
Date:     2013-05-09 10:44:38 +0000 (Thu, 09 May 2013)
Log Message:
-----------
bmesh: avoid using BLI_array macros for every face when converting to bmesh, replace with alloca 

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

Modified: trunk/blender/source/blender/blenkernel/intern/modifiers_bmesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/modifiers_bmesh.c	2013-05-09 10:41:05 UTC (rev 56614)
+++ trunk/blender/source/blender/blenkernel/intern/modifiers_bmesh.c	2013-05-09 10:44:38 UTC (rev 56615)
@@ -40,6 +40,22 @@
 #include "BKE_bmesh.h"
 #include "BKE_editmesh.h"
 
+/* Static function for alloc */
+BLI_INLINE BMFace *bm_face_create_from_mpoly(MPoly *mp, MLoop *ml,
+                                             BMesh *bm, BMVert **vtable, BMEdge **etable)
+{
+	BMVert **verts = BLI_array_alloca(verts, mp->totloop);
+	BMEdge **edges = BLI_array_alloca(edges, mp->totloop);
+	int j;
+
+	for (j = 0; j < mp->totloop; j++, ml++) {
+		verts[j] = vtable[ml->v];
+		edges[j] = etable[ml->e];
+	}
+
+	return BM_face_create(bm, verts, edges, mp->totloop, BM_CREATE_SKIP_CD);
+}
+
 /**
  * The main function for copying DerivedMesh data into BMesh.
  *
@@ -50,15 +66,13 @@
 	MVert *mv, *mvert;
 	MEdge *me, *medge;
 	MPoly /* *mpoly, */ /* UNUSED */ *mp;
-	MLoop *mloop, *ml;
-	BMVert *v, **vtable, **verts = NULL;
-	BMEdge *e, **etable, **edges = NULL;
+	MLoop *mloop;
+	BMVert *v, **vtable;
+	BMEdge *e, **etable;
 	float (*face_normals)[3];
 	BMFace *f;
 	BMIter liter;
-	BLI_array_declare(verts);
-	BLI_array_declare(edges);
-	int i, j, k, totvert, totedge /* , totface */ /* UNUSED */ ;
+	int i, k, totvert, totedge /* , totface */ /* UNUSED */ ;
 	bool is_init = (bm->totvert == 0) && (bm->totedge == 0) && (bm->totface == 0);
 	bool is_cddm = (dm->type == DM_TYPE_CDDM);  /* duplicate the arrays for non cddm */
 	char has_orig_hflag = 0;
@@ -148,21 +162,9 @@
 	for (i = 0; i < dm->numPolyData; i++, mp++) {
 		BMLoop *l;
 
-		BLI_array_empty(verts);
-		BLI_array_empty(edges);
+		f = bm_face_create_from_mpoly(mp, mloop + mp->loopstart,
+		                              bm, vtable, etable);
 
-		BLI_array_grow_items(verts, mp->totloop);
-		BLI_array_grow_items(edges, mp->totloop);
-
-		ml = mloop + mp->loopstart;
-		for (j = 0; j < mp->totloop; j++, ml++) {
-
-			verts[j] = vtable[ml->v];
-			edges[j] = etable[ml->e];
-		}
-
-		f = BM_face_create(bm, verts, edges, mp->totloop, BM_CREATE_SKIP_CD);
-
 		if (UNLIKELY(f == NULL)) {
 			continue;
 		}
@@ -195,9 +197,6 @@
 
 	MEM_freeN(vtable);
 	MEM_freeN(etable);
-
-	BLI_array_free(verts);
-	BLI_array_free(edges);
 }
 
 /* converts a cddm to a BMEditMesh.  if existing is non-NULL, the

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_mesh_conv.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_mesh_conv.c	2013-05-09 10:41:05 UTC (rev 56614)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_mesh_conv.c	2013-05-09 10:44:38 UTC (rev 56615)
@@ -163,6 +163,23 @@
 	return cd_flag;
 }
 
+/* Static function for alloc (duplicate in modifiers_bmesh.c) */
+BLI_INLINE BMFace *bm_face_create_from_mpoly(MPoly *mp, MLoop *ml,
+                                             BMesh *bm, BMVert **vtable, BMEdge **etable)
+{
+	BMVert **verts = BLI_array_alloca(verts, mp->totloop);
+	BMEdge **edges = BLI_array_alloca(edges, mp->totloop);
+	int j;
+
+	for (j = 0; j < mp->totloop; j++, ml++) {
+		verts[j] = vtable[ml->v];
+		edges[j] = etable[ml->e];
+	}
+
+	return BM_face_create(bm, verts, edges, mp->totloop, BM_CREATE_SKIP_CD);
+}
+
+
 /**
  * \brief Mesh -> BMesh
  *
@@ -171,15 +188,13 @@
 void BM_mesh_bm_from_me(BMesh *bm, Mesh *me, bool set_key, int act_key_nr)
 {
 	MVert *mvert;
-	BLI_array_declare(verts);
 	MEdge *medge;
-	MLoop *ml;
-	MPoly *mpoly;
+	MLoop *mloop;
+	MPoly *mp;
 	KeyBlock *actkey, *block;
-	BMVert *v, **vt = NULL, **verts = NULL;
-	BMEdge *e, **fedges = NULL, **et = NULL;
+	BMVert *v, **vtable = NULL;
+	BMEdge *e, **etable = NULL;
 	BMFace *f;
-	BLI_array_declare(fedges);
 	float (*keyco)[3] = NULL;
 	int *keyi;
 	int totuv, i, j;
@@ -210,7 +225,7 @@
 		return; /* sanity check */
 	}
 
-	vt = MEM_mallocN(sizeof(void **) * me->totvert, "mesh to bmesh vtable");
+	vtable = MEM_mallocN(sizeof(void **) * me->totvert, "mesh to bmesh vtable");
 
 	CustomData_copy(&me->vdata, &bm->vdata, CD_MASK_BMESH, CD_CALLOC, 0);
 	CustomData_copy(&me->edata, &bm->edata, CD_MASK_BMESH, CD_CALLOC, 0);
@@ -275,9 +290,8 @@
 	cd_edge_crease_offset  = CustomData_get_offset(&bm->edata, CD_CREASE);
 
 	for (i = 0, mvert = me->mvert; i < me->totvert; i++, mvert++) {
-		v = BM_vert_create(bm, keyco && set_key ? keyco[i] : mvert->co, NULL, BM_CREATE_SKIP_CD);
+		v = vtable[i] = BM_vert_create(bm, keyco && set_key ? keyco[i] : mvert->co, NULL, BM_CREATE_SKIP_CD);
 		BM_elem_index_set(v, i); /* set_ok */
-		vt[i] = v;
 
 		/* transfer flag */
 		v->head.hflag = BM_vert_flag_from_mflag(mvert->flag & ~SELECT);
@@ -315,17 +329,16 @@
 	bm->elem_index_dirty &= ~BM_VERT; /* added in order, clear dirty flag */
 
 	if (!me->totedge) {
-		MEM_freeN(vt);
+		MEM_freeN(vtable);
 		return;
 	}
 
-	et = MEM_mallocN(sizeof(void **) * me->totedge, "mesh to bmesh etable");
+	etable = MEM_mallocN(sizeof(void **) * me->totedge, "mesh to bmesh etable");
 
 	medge = me->medge;
 	for (i = 0; i < me->totedge; i++, medge++) {
-		e = BM_edge_create(bm, vt[medge->v1], vt[medge->v2], NULL, BM_CREATE_SKIP_CD);
+		e = etable[i] = BM_edge_create(bm, vtable[medge->v1], vtable[medge->v2], NULL, BM_CREATE_SKIP_CD);
 		BM_elem_index_set(e, i); /* set_ok */
-		et[i] = e;
 
 		/* transfer flags */
 		e->head.hflag = BM_edge_flag_from_mflag(medge->flag & ~SELECT);
@@ -345,46 +358,15 @@
 
 	bm->elem_index_dirty &= ~BM_EDGE; /* added in order, clear dirty flag */
 
-	mpoly = me->mpoly;
-	for (i = 0; i < me->totpoly; i++, mpoly++) {
+	mloop = me->mloop;
+	mp = me->mpoly;
+	for (i = 0; i < me->totpoly; i++, mp++) {
 		BMLoop *l_iter;
 		BMLoop *l_first;
 
-		BLI_array_empty(fedges);
-		BLI_array_empty(verts);
+		f = bm_face_create_from_mpoly(mp, mloop + mp->loopstart,
+		                              bm, vtable, etable);
 
-		BLI_array_grow_items(fedges, mpoly->totloop);
-		BLI_array_grow_items(verts, mpoly->totloop);
-
-		for (j = 0; j < mpoly->totloop; j++) {
-			ml = &me->mloop[mpoly->loopstart + j];
-			v = vt[ml->v];
-			e = et[ml->e];
-
-			fedges[j] = e;
-			verts[j] = v;
-		}
-
-		/* not sure what this block is supposed to do,
-		 * but its unused. so commenting - campbell */
-#if 0
-		{
-			BMVert *v1, *v2;
-			v1 = vt[me->mloop[mpoly->loopstart].v];
-			v2 = vt[me->mloop[mpoly->loopstart + 1].v];
-
-			if (v1 == fedges[0]->v1) {
-				v2 = fedges[0]->v2;
-			}
-			else {
-				v1 = fedges[0]->v2;
-				v2 = fedges[0]->v1;
-			}
-		}
-#endif
-
-		f = BM_face_create(bm, verts, fedges, mpoly->totloop, BM_CREATE_SKIP_CD);
-
 		if (UNLIKELY(f == NULL)) {
 			printf("%s: Warning! Bad face in mesh"
 			       " \"%s\" at index %d!, skipping\n",
@@ -396,17 +378,17 @@
 		BM_elem_index_set(f, bm->totface - 1); /* set_ok */
 
 		/* transfer flag */
-		f->head.hflag = BM_face_flag_from_mflag(mpoly->flag & ~ME_FACE_SEL);
+		f->head.hflag = BM_face_flag_from_mflag(mp->flag & ~ME_FACE_SEL);
 
 		/* this is necessary for selection counts to work properly */
-		if (mpoly->flag & ME_FACE_SEL) {
+		if (mp->flag & ME_FACE_SEL) {
 			BM_face_select_set(bm, f, true);
 		}
 
-		f->mat_nr = mpoly->mat_nr;
+		f->mat_nr = mp->mat_nr;
 		if (i == me->act_face) bm->act_face = f;
 
-		j = mpoly->loopstart;
+		j = mp->loopstart;
 		l_iter = l_first = BM_FACE_FIRST_LOOP(f);
 		do {
 			/* Save index of correspsonding MLoop */
@@ -462,11 +444,8 @@
 		}
 	}
 
-	BLI_array_free(fedges);
-	BLI_array_free(verts);
-
-	MEM_freeN(vt);
-	MEM_freeN(et);
+	MEM_freeN(vtable);
+	MEM_freeN(etable);
 }
 
 




More information about the Bf-blender-cvs mailing list