[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [53857] trunk/blender/source/blender: optimize bmesh operations that use triangle BMFace's ( dyn-topo and mesh conversion).

Campbell Barton ideasman42 at gmail.com
Wed Jan 16 22:09:54 CET 2013


Revision: 53857
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=53857
Author:   campbellbarton
Date:     2013-01-16 21:09:54 +0000 (Wed, 16 Jan 2013)
Log Message:
-----------
optimize bmesh operations that use triangle BMFace's (dyn-topo and mesh conversion).

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/pbvh_bmesh.c
    trunk/blender/source/blender/bmesh/intern/bmesh_log.c
    trunk/blender/source/blender/bmesh/intern/bmesh_marking.c
    trunk/blender/source/blender/bmesh/intern/bmesh_mesh_conv.c
    trunk/blender/source/blender/bmesh/intern/bmesh_polygon.c
    trunk/blender/source/blender/bmesh/intern/bmesh_polygon.h
    trunk/blender/source/blender/gpu/intern/gpu_buffers.c
    trunk/blender/source/blender/modifiers/intern/MOD_skin.c

Modified: trunk/blender/source/blender/blenkernel/intern/pbvh_bmesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/pbvh_bmesh.c	2013-01-16 19:59:55 UTC (rev 53856)
+++ trunk/blender/source/blender/blenkernel/intern/pbvh_bmesh.c	2013-01-16 21:09:54 UTC (rev 53857)
@@ -53,7 +53,8 @@
 
 	GHASH_ITER (gh_iter, n->bm_faces) {
 		BMFace *f = BLI_ghashIterator_getKey(&gh_iter);
-		BMIter bm_iter;
+		BMLoop *l_iter;
+		BMLoop *l_first;
 		BMVert *v;
 		void *node_val = SET_INT_IN_POINTER(node_index);
 
@@ -61,7 +62,9 @@
 		BLI_ghash_insert(bvh->bm_face_to_node, f, node_val);
 
 		/* Update vertices */
-		BM_ITER_ELEM (v, &bm_iter, f, BM_VERTS_OF_FACE) {
+		l_iter = l_first = BM_FACE_FIRST_LOOP(f);
+		do {
+			v = l_iter->v;
 			if (!BLI_ghash_haskey(n->bm_unique_verts, v)) {
 				if (BLI_ghash_haskey(bvh->bm_vert_to_node, v)) {
 					if (!BLI_ghash_haskey(n->bm_other_verts, v))
@@ -74,7 +77,7 @@
 			}
 			/* Update node bounding box */
 			BB_expand(&n->vb, v->co);
-		}
+		} while ((l_iter = l_iter->next) != l_first);
 	}
 
 	BLI_assert(n->vb.bmin[0] <= n->vb.bmax[0] &&
@@ -233,15 +236,16 @@
 	prim_bbc = BLI_ghash_ptr_new("prim_bbc");
 
 	GHASH_ITER (gh_iter, bvh->nodes[node_index].bm_faces) {
-		BMIter bm_iter;
-		BMVert *v;
 		BMFace *f = BLI_ghashIterator_getKey(&gh_iter);
 		BBC *bbc = MEM_callocN(sizeof(BBC), "BBC");
+		BMLoop *l_iter;
+		BMLoop *l_first;
 
 		BB_reset((BB *)bbc);
-		BM_ITER_ELEM (v, &bm_iter, f, BM_VERTS_OF_FACE) {
-			BB_expand((BB *)bbc, v->co);
-		}
+		l_iter = l_first = BM_FACE_FIRST_LOOP(f);
+		do {
+			BB_expand((BB *)bbc, l_iter->v->co);
+		} while ((l_iter = l_iter->next) != l_first);
 		BBC_update_centroid(bbc);
 
 		BLI_ghash_insert(prim_bbc, f, bbc);
@@ -394,14 +398,18 @@
 static void pbvh_bmesh_face_remove(PBVH *bvh, BMFace *f)
 {
 	PBVHNode *f_node;
-	BMIter bm_iter;
 	BMVert *v;
 
+	BMLoop *l_iter;
+	BMLoop *l_first;
+
 	f_node = pbvh_bmesh_node_lookup(bvh, bvh->bm_face_to_node, f);
 
 	/* Check if any of this face's vertices need to be removed
 	 * from the node */
-	BM_ITER_ELEM (v, &bm_iter, f, BM_VERTS_OF_FACE) {
+	l_iter = l_first = BM_FACE_FIRST_LOOP(f);
+	do {
+		v = l_iter->v;
 		if (pbvh_bmesh_node_vert_use_count(bvh, f_node, v) == 1) {
 			if (BLI_ghash_lookup(f_node->bm_unique_verts, v)) {
 				/* Find a different node that uses 'v' */
@@ -419,7 +427,7 @@
 				BLI_ghash_remove(f_node->bm_other_verts, v, NULL, NULL);
 			}
 		}
-	}
+	} while ((l_iter = l_iter->next) != l_first);
 
 	/* Remove face from node and top level */
 	BLI_ghash_remove(f_node->bm_faces, f, NULL, NULL);
@@ -436,18 +444,21 @@
 	BLI_assert(v1 != v2);
 
 	if (triangle->len == 3) {
-		BMIter iter;
+		BMLoop *l_iter;
+		BMLoop *l_first;
 		BMVert *v, *other = NULL;
-		int found_v1 = FALSE, found_v2 = FALSE;
+		bool found_v1 = false, found_v2 = false;
 
-		BM_ITER_ELEM (v, &iter, triangle, BM_VERTS_OF_FACE) {
+		l_iter = l_first = BM_FACE_FIRST_LOOP(triangle);
+		do {
+			v = l_iter->v;
 			if (v == v1)
-				found_v1 = TRUE;
+				found_v1 = true;
 			else if (v == v2)
-				found_v2 = TRUE;
+				found_v2 = true;
 			else
 				other = v;
-		}
+		} while ((l_iter = l_iter->next) != l_first);
 
 		if (found_v1 && found_v2)
 			return other;
@@ -508,7 +519,9 @@
 	float c[3];
 
 	/* Get closest point in triangle to sphere center */
-	BM_iter_as_array(NULL, BM_VERTS_OF_FACE, f, (void **)v, 3);
+	// BM_iter_as_array(NULL, BM_VERTS_OF_FACE, f, (void **)v, 3);
+	BM_face_as_array_vert_tri(f, v);
+
 	closest_on_tri_to_point_v3(c, q->center, v[0]->co, v[1]->co, v[2]->co);
 
 	/* Check if triangle intersects the sphere */
@@ -810,7 +823,8 @@
 		int ni;
 
 		/* Get vertices, replace use of v2 with v1 */
-		BM_iter_as_array(NULL, BM_VERTS_OF_FACE, f, (void **)v, 3);
+		// BM_iter_as_array(NULL, BM_VERTS_OF_FACE, f, (void **)v, 3);
+		BM_face_as_array_vert_tri(f, v);
 		for (i = 0; i < 3; i++) {
 			if (v[i] == v2)
 				v[i] = v1;
@@ -845,7 +859,8 @@
 		BMVert *v[3];
 		int j;
 
-		BM_iter_as_array(NULL, BM_VERTS_OF_FACE, f_del, (void **)v, 3);
+		// BM_iter_as_array(NULL, BM_VERTS_OF_FACE, f_del, (void **)v, 3);
+		BM_face_as_array_vert_tri(f_del, v);
 
 		/* Check if any of the face's vertices are now unused, if so
 		   remove them from the PBVH */
@@ -965,12 +980,13 @@
 			if (f->len == 3) {
 				BMVert *v[3];
 
-				BM_iter_as_array(NULL, BM_VERTS_OF_FACE, f, (void **)v, 3);
+				// BM_iter_as_array(NULL, BM_VERTS_OF_FACE, f, (void **)v, 3);
+				BM_face_as_array_vert_tri(f, v);
 				hit |= ray_face_intersection(ray_start, ray_normal,
-											 v[0]->co,
-											 v[1]->co,
-											 v[2]->co,
-											 NULL, dist);
+				                             v[0]->co,
+				                             v[1]->co,
+				                             v[2]->co,
+				                             NULL, dist);
 			}
 		}
 	}
@@ -1083,6 +1099,17 @@
 	return modified;
 }
 
+BLI_INLINE void bm_face_as_array_index_tri(BMFace *f, int r_index[3])
+{
+	BMLoop *l = BM_FACE_FIRST_LOOP(f);
+
+	BLI_assert(f->len == 3);
+
+	r_index[0] = BM_elem_index_get(l->v); l = l->next;
+	r_index[1] = BM_elem_index_get(l->v); l = l->next;
+	r_index[2] = BM_elem_index_get(l->v);
+}
+
 /* In order to perform operations on the original node coordinates
  * (such as raycast), store the node's triangles and vertices.*/
 void BKE_pbvh_bmesh_node_save_orig(PBVHNode *node)
@@ -1120,15 +1147,19 @@
 	/* Copy the triangles */
 	i = 0;
 	GHASH_ITER (gh_iter, node->bm_faces) {
+		BMFace *f = BLI_ghashIterator_getKey(&gh_iter);
+
+#if 0
 		BMIter bm_iter;
-		BMFace *f = BLI_ghashIterator_getKey(&gh_iter);
 		BMVert *v;
 		int j = 0;
-
 		BM_ITER_ELEM (v, &bm_iter, f, BM_VERTS_OF_FACE) {
 			node->bm_ortri[i][j] = BM_elem_index_get(v);
 			j++;
 		}
+#else
+		bm_face_as_array_index_tri(f, node->bm_ortri[i]);
+#endif
 		i++;
 	}
 	node->bm_tot_ortri = i;

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_log.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_log.c	2013-01-16 19:59:55 UTC (rev 53856)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_log.c	2013-01-16 21:09:54 UTC (rev 53857)
@@ -215,7 +215,8 @@
 
 	BLI_assert(f->len == 3);
 
-	BM_iter_as_array(NULL, BM_VERTS_OF_FACE, f, (void **)v, 3);
+	// BM_iter_as_array(NULL, BM_VERTS_OF_FACE, f, (void **)v, 3);
+	BM_face_as_array_vert_tri(f, v);
 
 	lf->v_ids[0] = bm_log_vert_id_get(log, v[0]);
 	lf->v_ids[1] = bm_log_vert_id_get(log, v[1]);

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_marking.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_marking.c	2013-01-16 19:59:55 UTC (rev 53856)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_marking.c	2013-01-16 21:09:54 UTC (rev 53857)
@@ -710,12 +710,13 @@
 			cross_v3_v3v3(r_plane, efa->no, vec);
 		}
 		else {
-			BMVert *verts[4] = {NULL};
+			if (efa->len == 4) {
+				BMVert *verts[4] = {NULL};
+				float vecA[3], vecB[3];
 
-			BM_iter_as_array(NULL, BM_VERTS_OF_FACE, efa, (void **)verts, 4);
+				// BM_iter_as_array(NULL, BM_VERTS_OF_FACE, efa, (void **)verts, 4);
+				BM_face_as_array_vert_quad(efa, verts);
 
-			if (efa->len == 4) {
-				float vecA[3], vecB[3];
 				sub_v3_v3v3(vecA, verts[3]->co, verts[2]->co);
 				sub_v3_v3v3(vecB, verts[0]->co, verts[1]->co);
 				add_v3_v3v3(r_plane, vecA, vecB);

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_mesh_conv.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_mesh_conv.c	2013-01-16 19:59:55 UTC (rev 53856)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_mesh_conv.c	2013-01-16 21:09:54 UTC (rev 53857)
@@ -174,7 +174,6 @@
 	BMVert *v, **vt = NULL, **verts = NULL;
 	BMEdge *e, **fedges = NULL, **et = NULL;
 	BMFace *f;
-	BMLoop *l;
 	BLI_array_declare(fedges);
 	float (*keyco)[3] = NULL;
 	int *keyi;
@@ -343,7 +342,8 @@
 
 	mpoly = me->mpoly;
 	for (i = 0; i < me->totpoly; i++, mpoly++) {
-		BMIter iter;
+		BMLoop *l_iter;
+		BMLoop *l_first;
 
 		BLI_array_empty(fedges);
 		BLI_array_empty(verts);
@@ -401,11 +401,12 @@
 		f->mat_nr = mpoly->mat_nr;
 		if (i == me->act_face) bm->act_face = f;
 
-		j = 0;
-		BM_ITER_ELEM_INDEX (l, &iter, f, BM_LOOPS_OF_FACE, j) {
+		j = mpoly->loopstart;
+		l_iter = l_first = BM_FACE_FIRST_LOOP(f);
+		do {
 			/* Save index of correspsonding MLoop */
-			CustomData_to_bmesh_block(&me->ldata, &bm->ldata, mpoly->loopstart + j, &l->head.data, true);
-		}
+			CustomData_to_bmesh_block(&me->ldata, &bm->ldata, j++, &l_iter->head.data, true);
+		} while ((l_iter = l_iter->next) != l_first);
 
 		/* Copy Custom Data */
 		CustomData_to_bmesh_block(&me->pdata, &bm->pdata, i, &f->head.data, true);

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_polygon.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_polygon.c	2013-01-16 19:59:55 UTC (rev 53856)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_polygon.c	2013-01-16 21:09:54 UTC (rev 53857)
@@ -1080,3 +1080,37 @@
 		}
 	}
 }
+
+
+/**
+ * Small utility functions for fast access
+ *
+ * faster alternative to:
+ *  BM_iter_as_array(bm, BM_VERTS_OF_FACE, f, (void**)v, 3);
+ */
+void BM_face_as_array_vert_tri(BMFace *f, BMVert *r_verts[3])
+{
+	BMLoop *l = BM_FACE_FIRST_LOOP(f);
+
+	BLI_assert(f->len == 3);
+
+	r_verts[0] = l->v; l = l->next;
+	r_verts[1] = l->v; l = l->next;
+	r_verts[2] = l->v;
+}
+
+/**
+ * faster alternative to:
+ *  BM_iter_as_array(bm, BM_VERTS_OF_FACE, f, (void**)v, 4);
+ */
+void BM_face_as_array_vert_quad(BMFace *f, BMVert *r_verts[4])
+{
+	BMLoop *l = BM_FACE_FIRST_LOOP(f);
+
+	BLI_assert(f->len == 4);
+
+	r_verts[0] = l->v; l = l->next;
+	r_verts[1] = l->v; l = l->next;
+	r_verts[2] = l->v; l = l->next;
+	r_verts[3] = l->v;
+}

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_polygon.h
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_polygon.h	2013-01-16 19:59:55 UTC (rev 53856)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_polygon.h	2013-01-16 21:09:54 UTC (rev 53857)
@@ -50,4 +50,7 @@
 
 void  BM_face_legal_splits(BMesh *bm, BMFace *f, BMLoop *(*loops)[2], int len);
 
+void BM_face_as_array_vert_tri(BMFace *f, BMVert *r_verts[3]);
+void BM_face_as_array_vert_quad(BMFace *f, BMVert *r_verts[4]);
+
 #endif /* __BMESH_POLYGON_H__ */


@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list