[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [53164] trunk/blender/source/blender/bmesh : use BM_face_create() over BM_face_create_ngon() in bevel and extrude individual faces to get some speedup.

Campbell Barton ideasman42 at gmail.com
Wed Dec 19 10:46:00 CET 2012


Revision: 53164
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=53164
Author:   campbellbarton
Date:     2012-12-19 09:45:56 +0000 (Wed, 19 Dec 2012)
Log Message:
-----------
use BM_face_create() over BM_face_create_ngon() in bevel and extrude individual faces to get some speedup.

Modified Paths:
--------------
    trunk/blender/source/blender/bmesh/intern/bmesh_construct.c
    trunk/blender/source/blender/bmesh/operators/bmo_extrude.c
    trunk/blender/source/blender/bmesh/tools/bmesh_bevel.c

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_construct.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_construct.c	2012-12-19 09:13:06 UTC (rev 53163)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_construct.c	2012-12-19 09:45:56 UTC (rev 53164)
@@ -980,9 +980,12 @@
 	MEM_freeN(vtable);
 	MEM_freeN(ftable);
 
+#ifdef USE_FAST_FACE_COPY
+	BLI_array_free(verts);
+#endif
+
 	BLI_array_free(loops);
 	BLI_array_free(edges);
-
 	return bm_new;
 }
 

Modified: trunk/blender/source/blender/bmesh/operators/bmo_extrude.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_extrude.c	2012-12-19 09:13:06 UTC (rev 53163)
+++ trunk/blender/source/blender/bmesh/operators/bmo_extrude.c	2012-12-19 09:45:56 UTC (rev 53164)
@@ -51,28 +51,35 @@
 
 void bmo_extrude_discrete_faces_exec(BMesh *bm, BMOperator *op)
 {
+	BMVert **verts = NULL;
+	BLI_array_declare(verts);
+	BMEdge **edges = NULL;
+	BLI_array_declare(edges);
+
 	BMOIter siter;
 	BMIter liter, liter2;
 	BMFace *f, *f2, *f3;
 	BMLoop *l, *l2, *l3, *l4, *l_tmp;
-	BMEdge **edges = NULL, *e, *laste;
+	BMEdge *e, *laste;
 	BMVert *v, *lastv, *firstv;
-	BLI_array_declare(edges);
 	int i;
 
 	BMO_ITER (f, &siter, op->slots_in, "faces", BM_FACE) {
+		BLI_array_empty(verts);
 		BLI_array_empty(edges);
+		BLI_array_grow_items(verts, f->len);
 		BLI_array_grow_items(edges, f->len);
 
 		i = 0;
 		firstv = lastv = NULL;
 		BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
 			v = BM_vert_create(bm, l->v->co, l->v, 0);
-
 			/* skip on the first iteration */
 			if (lastv) {
 				e = BM_edge_create(bm, lastv, v, l->e, 0);
-				edges[i++] = e;
+				edges[i] = e;
+				verts[i] = lastv;
+				i++;
 			}
 
 			lastv = v;
@@ -82,11 +89,13 @@
 
 		/* this fits in the array because we skip one in the loop above */
 		e = BM_edge_create(bm, v, firstv, laste, 0);
-		edges[i++] = e;
+		edges[i] = e;
+		verts[i] = lastv;
+		i++;
 
 		BMO_elem_flag_enable(bm, f, EXT_DEL);
 
-		f2 = BM_face_create_ngon(bm, firstv, BM_edge_other_vert(edges[0], firstv), edges, f->len, 0);
+		f2 = BM_face_create(bm, verts, edges, f->len, 0);
 		if (UNLIKELY(f2 == NULL)) {
 			BMO_error_raise(bm, op, BMERR_MESH_ERROR, "Extrude failed: could not create face");
 			BLI_array_free(edges);
@@ -117,6 +126,7 @@
 		}
 	}
 
+	BLI_array_free(verts);
 	BLI_array_free(edges);
 
 	BMO_op_callf(bm, op->flag,

Modified: trunk/blender/source/blender/bmesh/tools/bmesh_bevel.c
===================================================================
--- trunk/blender/source/blender/bmesh/tools/bmesh_bevel.c	2012-12-19 09:13:06 UTC (rev 53163)
+++ trunk/blender/source/blender/bmesh/tools/bmesh_bevel.c	2012-12-19 09:45:56 UTC (rev 53164)
@@ -269,7 +269,11 @@
 		for (i = 0; i < totv; i++) {
 			ee[i] = BM_edge_create(bm, vert_arr[i], vert_arr[(i + 1) % totv], NULL, BM_CREATE_NO_DOUBLE);
 		}
+#if 0
 		f = BM_face_create_ngon(bm, vert_arr[0], vert_arr[1], ee, totv, 0);
+#else
+		f = BM_face_create(bm, vert_arr, ee, totv, 0);
+#endif
 	}
 	if (facerep && f) {
 		int has_mdisps = CustomData_has_layer(&bm->ldata, CD_MDISPS);




More information about the Bf-blender-cvs mailing list