[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [52205] trunk/blender/source/blender/bmesh /operators/bmo_bevel.c: speedup bevel by tagging verts and edges to bevel, this avoids a loop over all bevel edges for each bevel vert ( can use edges-of-vert instead)

Campbell Barton ideasman42 at gmail.com
Wed Nov 14 11:08:42 CET 2012


Revision: 52205
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=52205
Author:   campbellbarton
Date:     2012-11-14 10:08:39 +0000 (Wed, 14 Nov 2012)
Log Message:
-----------
speedup bevel by tagging verts and edges to bevel, this avoids a loop over all bevel edges for each bevel vert (can use edges-of-vert instead)

Modified Paths:
--------------
    trunk/blender/source/blender/bmesh/operators/bmo_bevel.c

Modified: trunk/blender/source/blender/bmesh/operators/bmo_bevel.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_bevel.c	2012-11-14 09:45:15 UTC (rev 52204)
+++ trunk/blender/source/blender/bmesh/operators/bmo_bevel.c	2012-11-14 10:08:39 UTC (rev 52205)
@@ -107,8 +107,6 @@
 	ListBase vertList;      /* list of BevVert for each vertex involved in bevel */
 	float offset;           /* blender units to offset each side of a beveled edge */
 	int seg;                /* number of segments in beveled edge profile */
-
-	BMOperator *op;
 } BevelParams;
 
 /* Make a new BoundVert of the given kind, insert it at the end of the circular linked
@@ -1164,10 +1162,8 @@
 /*
  * Construction around the vertex
  */
-static void bevel_vert_construct(BMesh *bm, BevelParams *bp, BMOperator *op, BMVert *v)
+static void bevel_vert_construct(BMesh *bm, BevelParams *bp, BMVert *v)
 {
-
-	BMOIter siter;
 	BMEdge *bme;
 	BevVert *bv;
 	BMEdge *bme2, *unflagged_bme;
@@ -1179,12 +1175,10 @@
 
 	/* Gather input selected edges.
 	 * Only bevel selected edges that have exactly two incident faces.
-	 *
-	 * TODO, optimization - we could tag edges in 'geom'
-	 * and then just iterate edges-of-vert, checking tags.
 	 */
-	BMO_ITER (bme, &siter, bm, op, "geom", BM_EDGE) {
-		if (BM_vert_in_edge(bme, v)) {
+
+	BM_ITER_ELEM (bme, &iter, v, BM_EDGES_OF_VERT) {
+		if (BM_elem_flag_test(bme, BM_ELEM_TAG)) {
 			if (BM_edge_is_manifold(bme)) {
 				BMO_elem_flag_enable(bm, bme, EDGE_SELECTED);
 				nsel++;
@@ -1464,33 +1458,51 @@
 
 void bmo_bevel_exec(BMesh *bm, BMOperator *op)
 {
+	BMIter iter;
 	BMOIter siter;
 	BMVert *v;
 	BMEdge *e;
 	BevelParams bp = {{NULL}};
 
 	bp.offset = BMO_slot_float_get(op, "offset");
-	bp.op = op;
 	bp.seg = BMO_slot_int_get(op, "segments");
 
 	if (bp.offset > 0) {
+		/* first flush 'geom' into flags, this makes it possible to check connected data */
+		BM_mesh_elem_hflag_disable_all(bm, BM_VERT | BM_EDGE, BM_ELEM_TAG, FALSE);
+
+		BMO_ITER (v, &siter, bm, op, "geom", BM_VERT | BM_EDGE) {
+			BM_elem_flag_enable(v, BM_ELEM_TAG);
+		}
+
 		/* The analysis of the input vertices and execution additional constructions */
-		BMO_ITER (v, &siter, bm, op, "geom", BM_VERT) {
-			bevel_vert_construct(bm, &bp, op, v);
+		BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) {
+			if (BM_elem_flag_test(v, BM_ELEM_TAG)) {
+				bevel_vert_construct(bm, &bp, v);
+			}
 		}
+
 		/* Build polygons for edges */
-		BMO_ITER (e, &siter, bm, op, "geom", BM_EDGE) {
-			bevel_build_edge_polygons(bm, &bp, e);
+		BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
+			if (BM_elem_flag_test(e, BM_ELEM_TAG)) {
+				bevel_build_edge_polygons(bm, &bp, e);
+			}
 		}
 
-		BMO_ITER (v, &siter, bm, op, "geom", BM_VERT) {
-			bevel_rebuild_existing_polygons(bm, &bp, v);
+		BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) {
+			if (BM_elem_flag_test(v, BM_ELEM_TAG)) {
+				bevel_rebuild_existing_polygons(bm, &bp, v);
+			}
 		}
 
-		BMO_ITER (v, &siter, bm, op, "geom", BM_VERT) {
-			if (find_bevvert(&bp, v))
-				BM_vert_kill(bm, v);
+		BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) {
+			if (BM_elem_flag_test(v, BM_ELEM_TAG)) {
+				if (find_bevvert(&bp, v)) {
+					BM_vert_kill(bm, v);
+				}
+			}
 		}
+
 		free_bevel_params(&bp);
 	}
 }




More information about the Bf-blender-cvs mailing list