[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [53235] trunk/blender/source/blender: minor bmesh improvements

Campbell Barton ideasman42 at gmail.com
Fri Dec 21 08:28:15 CET 2012


Revision: 53235
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=53235
Author:   campbellbarton
Date:     2012-12-21 07:28:14 +0000 (Fri, 21 Dec 2012)
Log Message:
-----------
minor bmesh improvements
- use 2 omp sections for vert -> (edge, face) selection flushing.
- dont use face-loop iterator for cddm_from_bmesh_ex conversion to give some speedup (some modifiers use this).
- use float(*)[3] for functions that return coords.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_mesh.h
    trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
    trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c
    trunk/blender/source/blender/blenkernel/intern/mesh.c
    trunk/blender/source/blender/bmesh/intern/bmesh_marking.c

Modified: trunk/blender/source/blender/blenkernel/BKE_mesh.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_mesh.h	2012-12-21 07:24:31 UTC (rev 53234)
+++ trunk/blender/source/blender/blenkernel/BKE_mesh.h	2012-12-21 07:28:14 UTC (rev 53235)
@@ -132,7 +132,7 @@
 void BKE_mesh_make_local(struct Mesh *me);
 void BKE_mesh_boundbox_calc(struct Mesh *me, float r_loc[3], float r_size[3]);
 void BKE_mesh_texspace_calc(struct Mesh *me);
-float *BKE_mesh_orco_verts_get(struct Object *ob);
+float (*BKE_mesh_orco_verts_get(struct Object *ob))[3];
 void   BKE_mesh_orco_verts_transform(struct Mesh *me, float (*orco)[3], int totvert, int invert);
 int test_index_face(struct MFace *mface, struct CustomData *mfdata, int mfindex, int nr);
 struct Mesh *BKE_mesh_from_object(struct Object *ob);

Modified: trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c	2012-12-21 07:24:31 UTC (rev 53234)
+++ trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c	2012-12-21 07:28:14 UTC (rev 53235)
@@ -857,30 +857,27 @@
 	return dm;
 }
 
-static float *get_editbmesh_orco_verts(BMEditMesh *em)
+static float (*get_editbmesh_orco_verts(BMEditMesh *em))[3]
 {
 	BMIter iter;
 	BMVert *eve;
-	float *orco;
-	int a, totvert;
+	float (*orco)[3];
+	int i;
 
 	/* these may not really be the orco's, but it's only for preview.
 	 * could be solver better once, but isn't simple */
-
-	totvert = em->bm->totvert;
 	
-	orco = MEM_mallocN(sizeof(float) * 3 * totvert, "BMEditMesh Orco");
+	orco = MEM_mallocN(sizeof(float) * 3 * em->bm->totvert, "BMEditMesh Orco");
 
-	eve = BM_iter_new(&iter, em->bm, BM_VERTS_OF_MESH, NULL);
-	for (a = 0; eve; eve = BM_iter_step(&iter), a += 3) {
-		copy_v3_v3(orco + a, eve->co);
+	BM_ITER_MESH_INDEX (eve, &iter, em->bm, BM_VERTS_OF_MESH, i) {
+		copy_v3_v3(orco[i], eve->co);
 	}
 	
 	return orco;
 }
 
 /* orco custom data layer */
-static void *get_orco_coords_dm(Object *ob, BMEditMesh *em, int layer, int *free)
+static float (*get_orco_coords_dm(Object *ob, BMEditMesh *em, int layer, int *free))[3]
 {
 	*free = 0;
 
@@ -889,9 +886,9 @@
 		*free = 1;
 
 		if (em)
-			return (float(*)[3])get_editbmesh_orco_verts(em);
+			return get_editbmesh_orco_verts(em);
 		else
-			return (float(*)[3])BKE_mesh_orco_verts_get(ob);
+			return BKE_mesh_orco_verts_get(ob);
 	}
 	else if (layer == CD_CLOTH_ORCO) {
 		/* apply shape key for cloth, this should really be solved
@@ -1815,17 +1812,18 @@
 	BLI_linklist_free((LinkNode *)datamasks, NULL);
 }
 
-float (*editbmesh_get_vertex_cos(BMEditMesh * em, int *numVerts_r))[3]
+float (*editbmesh_get_vertex_cos(BMEditMesh *em, int *numVerts_r))[3]
 {
-	int i, numVerts = *numVerts_r = em->bm->totvert;
-	float (*cos)[3];
 	BMIter iter;
 	BMVert *eve;
+	float (*cos)[3];
+	int i;
 
-	cos = MEM_mallocN(sizeof(float) * 3 * numVerts, "vertexcos");
+	*numVerts_r = em->bm->totvert;
 
-	eve = BM_iter_new(&iter, em->bm, BM_VERTS_OF_MESH, NULL);
-	for (i = 0; eve; eve = BM_iter_step(&iter), i++) {
+	cos = MEM_mallocN(sizeof(float) * 3 * em->bm->totvert, "vertexcos");
+
+	BM_ITER_MESH_INDEX (eve, &iter, em->bm, BM_VERTS_OF_MESH, i) {
 		copy_v3_v3(cos[i], eve->co);
 	}
 

Modified: trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c	2012-12-21 07:24:31 UTC (rev 53234)
+++ trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c	2012-12-21 07:28:14 UTC (rev 53235)
@@ -1875,7 +1875,7 @@
 	                           bm->totface);
 
 	CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
-	BMIter iter, liter;
+	BMIter iter;
 	BMVert *eve;
 	BMEdge *eed;
 	BMFace *efa;
@@ -1913,7 +1913,7 @@
 	                 CD_CALLOC, dm->numLoopData);
 	CustomData_merge(&bm->pdata, &dm->polyData, mask,
 	                 CD_CALLOC, dm->numPolyData);
-	
+
 	/* add tessellation mface layers */
 	if (use_tessface) {
 		CustomData_from_bmeshpoly(&dm->faceData, &dm->polyData, &dm->loopData, em_tottri);
@@ -2002,7 +2002,8 @@
 	j = 0;
 	efa = BM_iter_new(&iter, bm, BM_FACES_OF_MESH, NULL);
 	for (i = 0; efa; i++, efa = BM_iter_step(&iter), index++) {
-		BMLoop *l;
+		BMLoop *l_iter;
+		BMLoop *l_first;
 		MPoly *mp = &mpoly[i];
 
 		BM_elem_index_set(efa, i); /* set_inline */
@@ -2011,15 +2012,16 @@
 		mp->flag = BM_face_flag_to_mflag(efa);
 		mp->loopstart = j;
 		mp->mat_nr = efa->mat_nr;
-		
-		BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
-			mloop->v = BM_elem_index_get(l->v);
-			mloop->e = BM_elem_index_get(l->e);
-			CustomData_from_bmesh_block(&bm->ldata, &dm->loopData, l->head.data, j);
 
+		l_iter = l_first = BM_FACE_FIRST_LOOP(efa);
+		do {
+			mloop->v = BM_elem_index_get(l_iter->v);
+			mloop->e = BM_elem_index_get(l_iter->e);
+			CustomData_from_bmesh_block(&bm->ldata, &dm->loopData, l_iter->head.data, j);
+
 			j++;
 			mloop++;
-		}
+		} while ((l_iter = l_iter->next) != l_first);
 
 		CustomData_from_bmesh_block(&bm->pdata, &dm->polyData, efa->head.data, i);
 

Modified: trunk/blender/source/blender/blenkernel/intern/mesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/mesh.c	2012-12-21 07:24:31 UTC (rev 53234)
+++ trunk/blender/source/blender/blenkernel/intern/mesh.c	2012-12-21 07:28:14 UTC (rev 53235)
@@ -731,7 +731,7 @@
 	if (r_size) copy_v3_v3(r_size, me->size);
 }
 
-float *BKE_mesh_orco_verts_get(Object *ob)
+float (*BKE_mesh_orco_verts_get(Object *ob))[3]
 {
 	Mesh *me = ob->data;
 	MVert *mvert = NULL;
@@ -748,7 +748,7 @@
 		copy_v3_v3(vcos[a], mvert->co);
 	}
 
-	return (float *)vcos;
+	return vcos;
 }
 
 void BKE_mesh_orco_verts_transform(Mesh *me, float (*orco)[3], int totvert, int invert)

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_marking.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_marking.c	2012-12-21 07:24:31 UTC (rev 53234)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_marking.c	2012-12-21 07:28:14 UTC (rev 53235)
@@ -86,41 +86,50 @@
 	BMIter eiter;
 	BMIter fiter;
 
-	int ok;
-
 	if (selectmode & SCE_SELECT_VERTEX) {
-		BM_ITER_MESH (e, &eiter, bm, BM_EDGES_OF_MESH) {
-			if (BM_elem_flag_test(e->v1, BM_ELEM_SELECT) &&
-			    BM_elem_flag_test(e->v2, BM_ELEM_SELECT) &&
-			    !BM_elem_flag_test(e, BM_ELEM_HIDDEN))
+		/* both loops only set edge/face flags and read off verts */
+#pragma omp parallel sections if (bm->totedge + bm->totface >= BM_OMP_LIMIT)
+		{
+#pragma omp section
 			{
-				BM_elem_flag_enable(e, BM_ELEM_SELECT);
+				BM_ITER_MESH (e, &eiter, bm, BM_EDGES_OF_MESH) {
+					if (BM_elem_flag_test(e->v1, BM_ELEM_SELECT) &&
+						BM_elem_flag_test(e->v2, BM_ELEM_SELECT) &&
+						!BM_elem_flag_test(e, BM_ELEM_HIDDEN))
+					{
+						BM_elem_flag_enable(e, BM_ELEM_SELECT);
+					}
+					else {
+						BM_elem_flag_disable(e, BM_ELEM_SELECT);
+					}
+				}
 			}
-			else {
-				BM_elem_flag_disable(e, BM_ELEM_SELECT);
-			}
-		}
-		BM_ITER_MESH (f, &fiter, bm, BM_FACES_OF_MESH) {
-			ok = TRUE;
-			if (!BM_elem_flag_test(f, BM_ELEM_HIDDEN)) {
-				l_iter = l_first = BM_FACE_FIRST_LOOP(f);
-				do {
-					if (!BM_elem_flag_test(l_iter->v, BM_ELEM_SELECT)) {
+#pragma omp section
+			{
+				BM_ITER_MESH (f, &fiter, bm, BM_FACES_OF_MESH) {
+					int ok = TRUE;
+					if (!BM_elem_flag_test(f, BM_ELEM_HIDDEN)) {
+						l_iter = l_first = BM_FACE_FIRST_LOOP(f);
+						do {
+							if (!BM_elem_flag_test(l_iter->v, BM_ELEM_SELECT)) {
+								ok = FALSE;
+								break;
+							}
+						} while ((l_iter = l_iter->next) != l_first);
+					}
+					else {
 						ok = FALSE;
-						break;
 					}
-				} while ((l_iter = l_iter->next) != l_first);
+
+					BM_elem_flag_set(f, BM_ELEM_SELECT, ok);
+				}
 			}
-			else {
-				ok = FALSE;
-			}
-
-			BM_elem_flag_set(f, BM_ELEM_SELECT, ok);
 		}
+		/* end sections */
 	}
 	else if (selectmode & SCE_SELECT_EDGE) {
 		BM_ITER_MESH (f, &fiter, bm, BM_FACES_OF_MESH) {
-			ok = TRUE;
+			int ok = TRUE;
 			if (!BM_elem_flag_test(f, BM_ELEM_HIDDEN)) {
 				l_iter = l_first = BM_FACE_FIRST_LOOP(f);
 				do {




More information about the Bf-blender-cvs mailing list