[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [43959] branches/bmesh/blender/source/ blender/bmesh: speedup for edge split modifier/operator

Campbell Barton ideasman42 at gmail.com
Tue Feb 7 17:08:34 CET 2012


Revision: 43959
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=43959
Author:   campbellbarton
Date:     2012-02-07 16:08:19 +0000 (Tue, 07 Feb 2012)
Log Message:
-----------
speedup for edge split modifier/operator
- don't call 'del' operator now, expose the internal function instead.
- use the index values stored in the header rather then the operator.

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/bmesh/bmesh_operator_api.h
    branches/bmesh/blender/source/blender/bmesh/bmesh_operators.h
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c
    branches/bmesh/blender/source/blender/bmesh/operators/bmesh_dupeops.c
    branches/bmesh/blender/source/blender/bmesh/operators/edgesplitop.c

Modified: branches/bmesh/blender/source/blender/bmesh/bmesh_operator_api.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh_operator_api.h	2012-02-07 15:14:08 UTC (rev 43958)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh_operator_api.h	2012-02-07 16:08:19 UTC (rev 43959)
@@ -256,6 +256,20 @@
 void BMO_remove_tagged_edges(struct BMesh *bm, const short oflag);
 void BMO_remove_tagged_verts(struct BMesh *bm, const short oflag);
 
+/* take care, uses operator flag DEL_WIREVERT */
+void BMO_remove_tagged_context(BMesh *bm, const short oflag, const int type);
+
+/* del "context" slot values, used for operator too */
+enum {
+	DEL_VERTS = 1,
+	DEL_EDGES,
+	DEL_ONLYFACES,
+	DEL_EDGESFACES,
+	DEL_FACES,
+	DEL_ALL	,
+	DEL_ONLYTAGGED
+};
+
 void BMO_Set_OpFlag(struct BMesh *bm, struct BMOperator *op, const int op_flag);
 void BMO_Clear_OpFlag(struct BMesh *bm, struct BMOperator *op, const int op_flag);
 

Modified: branches/bmesh/blender/source/blender/bmesh/bmesh_operators.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh_operators.h	2012-02-07 15:14:08 UTC (rev 43958)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh_operators.h	2012-02-07 16:08:19 UTC (rev 43959)
@@ -27,17 +27,6 @@
 
 /*--------defines/enumerations for specific operators-------*/
 
-/*del operator "context" slot values*/
-enum {
-	DEL_VERTS = 1,
-	DEL_EDGES,
-	DEL_ONLYFACES,
-	DEL_EDGESFACES,
-	DEL_FACES,
-	DEL_ALL	,
-	DEL_ONLYTAGGED
-};
-
 /*quad innervert values*/
 enum {
 	SUBD_INNERVERT,

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c	2012-02-07 15:14:08 UTC (rev 43958)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c	2012-02-07 16:08:19 UTC (rev 43959)
@@ -404,6 +404,154 @@
 	}
 }
 
+/*************************************************************/
+/* you need to make remove tagged verts/edges/faces
+ * api functions that take a filter callback.....
+ * and this new filter type will be for opstack flags.
+ * This is because the BM_remove_taggedXXX functions bypass iterator API.
+ *  - Ops dont care about 'UI' considerations like selection state, hide state, ect.
+ *    If you want to work on unhidden selections for instance,
+ *    copy output from a 'select context' operator to another operator....
+ */
+
+static void bmo_remove_tagged_context_verts(BMesh *bm, const short oflag)
+{
+	BMVert *v;
+	BMEdge *e;
+	BMLoop *f;
+
+	BMIter verts;
+	BMIter edges;
+	BMIter faces;
+
+	for (v = BMIter_New(&verts, bm, BM_VERTS_OF_MESH, bm); v; v = BMIter_Step(&verts)) {
+		if (BMO_TestFlag(bm, (BMHeader *)v, oflag)) {
+			/* Visit edge */
+			for (e = BMIter_New(&edges, bm, BM_EDGES_OF_VERT, v); e; e = BMIter_Step(&edges))
+				BMO_SetFlag(bm, (BMHeader *)e, oflag);
+			/* Visit face */
+			for (f = BMIter_New(&faces, bm, BM_FACES_OF_VERT, v); f; f = BMIter_Step(&faces))
+				BMO_SetFlag(bm, (BMHeader *)f, oflag);
+		}
+	}
+
+	BMO_remove_tagged_faces(bm, oflag);
+	BMO_remove_tagged_edges(bm, oflag);
+	BMO_remove_tagged_verts(bm, oflag);
+}
+
+static void bmo_remove_tagged_context_edges(BMesh *bm, const short oflag)
+{
+	BMEdge *e;
+	BMFace *f;
+
+	BMIter edges;
+	BMIter faces;
+
+	for (e = BMIter_New(&edges, bm, BM_EDGES_OF_MESH, bm); e; e = BMIter_Step(&edges)) {
+		if (BMO_TestFlag(bm, (BMHeader *)e, oflag)) {
+			for (f = BMIter_New(&faces, bm, BM_FACES_OF_EDGE, e); f; f = BMIter_Step(&faces)) {
+				BMO_SetFlag(bm, (BMHeader *)f, oflag);
+			}
+		}
+	}
+	BMO_remove_tagged_faces(bm, oflag);
+	BMO_remove_tagged_edges(bm, oflag);
+}
+
+#define DEL_WIREVERT	(1 << 10)
+
+void BMO_remove_tagged_context(BMesh *bm, const short oflag, int type)
+{
+	BMVert *v;
+	BMEdge *e;
+	BMFace *f;
+
+	BMIter verts;
+	BMIter edges;
+	BMIter faces;
+
+	if (type == DEL_VERTS) bmo_remove_tagged_context_verts(bm, oflag);
+	else if (type == DEL_EDGES) {
+		/* flush down to vert */
+		for (e = BMIter_New(&edges, bm, BM_EDGES_OF_MESH, bm); e; e = BMIter_Step(&edges)) {
+			if (BMO_TestFlag(bm, (BMHeader *)e, oflag)) {
+				BMO_SetFlag(bm, (BMHeader *)(e->v1), oflag);
+				BMO_SetFlag(bm, (BMHeader *)(e->v2), oflag);
+			}
+		}
+		bmo_remove_tagged_context_edges(bm, oflag);
+		/* remove loose vertice */
+		for (v = BMIter_New(&verts, bm, BM_VERTS_OF_MESH, bm); v; v = BMIter_Step(&verts)) {
+			if (BMO_TestFlag(bm, (BMHeader *)v, oflag) && (!(v->e)))
+				BMO_SetFlag(bm, (BMHeader *)v, DEL_WIREVERT);
+		}
+		BMO_remove_tagged_verts(bm, DEL_WIREVERT);
+	}
+	else if (type == DEL_EDGESFACES) bmo_remove_tagged_context_edges(bm, oflag);
+	else if (type == DEL_ONLYFACES) BMO_remove_tagged_faces(bm, oflag);
+	else if (type == DEL_ONLYTAGGED) {
+		BMO_remove_tagged_faces(bm, oflag);
+		BMO_remove_tagged_edges(bm, oflag);
+		BMO_remove_tagged_verts(bm, oflag);
+	}
+	else if (type == DEL_FACES) {
+		/* go through and mark all edges and all verts of all faces for delet */
+		for (f = BMIter_New(&faces, bm, BM_FACES_OF_MESH, bm); f; f = BMIter_Step(&faces)) {
+			if (BMO_TestFlag(bm, (BMHeader *)f, oflag)) {
+				for (e = BMIter_New(&edges, bm, BM_EDGES_OF_FACE, f); e; e = BMIter_Step(&edges))
+					BMO_SetFlag(bm, (BMHeader *)e, oflag);
+				for (v = BMIter_New(&verts, bm, BM_VERTS_OF_FACE, f); v; v = BMIter_Step(&verts))
+					BMO_SetFlag(bm, (BMHeader *)v, oflag);
+			}
+		}
+		/* now go through and mark all remaining faces all edges for keeping */
+		for (f = BMIter_New(&faces, bm, BM_FACES_OF_MESH, bm); f; f = BMIter_Step(&faces)) {
+			if (!BMO_TestFlag(bm, (BMHeader *)f, oflag)) {
+				for (e = BMIter_New(&edges, bm, BM_EDGES_OF_FACE, f); e; e = BMIter_Step(&edges)) {
+					BMO_ClearFlag(bm, (BMHeader *)e, oflag);
+				}
+				for (v = BMIter_New(&verts, bm, BM_VERTS_OF_FACE, f); v; v = BMIter_Step(&verts)) {
+					BMO_ClearFlag(bm, (BMHeader *)v, oflag);
+				}
+			}
+		}
+		/* also mark all the vertices of remaining edges for keeping */
+		for (e = BMIter_New(&edges, bm, BM_EDGES_OF_MESH, bm); e; e = BMIter_Step(&edges)) {
+			if (!BMO_TestFlag(bm, (BMHeader *)e, oflag)) {
+				BMO_ClearFlag(bm, (BMHeader *)e->v1, oflag);
+				BMO_ClearFlag(bm, (BMHeader *)e->v2, oflag);
+			}
+		}
+		/* now delete marked face */
+		BMO_remove_tagged_faces(bm, oflag);
+		/* delete marked edge */
+		BMO_remove_tagged_edges(bm, oflag);
+		/* remove loose vertice */
+		BMO_remove_tagged_verts(bm, oflag);
+	}
+	/* does this option even belong in here */
+	else if (type == DEL_ALL) {
+		for (f = BMIter_New(&faces, bm, BM_FACES_OF_MESH, bm); f; f = BMIter_Step(&faces))
+			BMO_SetFlag(bm, (BMHeader *)f, oflag);
+		for (e = BMIter_New(&edges, bm, BM_EDGES_OF_MESH, bm); e; e = BMIter_Step(&edges))
+			BMO_SetFlag(bm, (BMHeader *)e, oflag);
+		for (v = BMIter_New(&verts, bm, BM_VERTS_OF_MESH, bm); v; v = BMIter_Step(&verts))
+			BMO_SetFlag(bm, (BMHeader *)v, oflag);
+
+		BMO_remove_tagged_faces(bm, oflag);
+		BMO_remove_tagged_edges(bm, oflag);
+		BMO_remove_tagged_verts(bm, oflag);
+	}
+}
+/*************************************************************/
+
+
+
+
+
+
+
 static void bm_copy_vert_attributes(BMesh *source_mesh, BMesh *target_mesh,
                                     const BMVert *source_vertex, BMVert *target_vertex)
 {

Modified: branches/bmesh/blender/source/blender/bmesh/operators/bmesh_dupeops.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/operators/bmesh_dupeops.c	2012-02-07 15:14:08 UTC (rev 43958)
+++ branches/bmesh/blender/source/blender/bmesh/operators/bmesh_dupeops.c	2012-02-07 16:08:19 UTC (rev 43959)
@@ -434,162 +434,21 @@
 	BMO_Finish_Op(bm, &dupeop);
 }
 
-#define DEL_INPUT		1
-#define DEL_WIREVERT	2
 
-static void delete_verts(BMesh *bm, const short oflag);
-static void delete_context(BMesh *bm, const short oflag, const int type);
-
 void delop_exec(BMesh *bm, BMOperator *op)
 {
+#define DEL_INPUT 1
+
 	BMOperator *delop = op;
 
 	/* Mark Buffer */
 	BMO_Flag_Buffer(bm, delop, "geom", DEL_INPUT, BM_ALL);
 
-	delete_context(bm, DEL_INPUT, BMO_Get_Int(op, "context"));
-}
+	BMO_remove_tagged_context(bm, DEL_INPUT, BMO_Get_Int(op, "context"));
 
-static void delete_verts(BMesh *bm, const short oflag)
-{
-	BMVert *v;
-	BMEdge *e;
-	BMLoop *f;
-	
-	BMIter verts;
-	BMIter edges;
-	BMIter faces;
-	
-	for (v = BMIter_New(&verts, bm, BM_VERTS_OF_MESH, bm); v; v = BMIter_Step(&verts)) {
-		if (BMO_TestFlag(bm, (BMHeader *)v, oflag)) {
-			/* Visit edge */
-			for (e = BMIter_New(&edges, bm, BM_EDGES_OF_VERT, v); e; e = BMIter_Step(&edges))
-				BMO_SetFlag(bm, (BMHeader *)e, oflag);
-			/* Visit face */
-			for (f = BMIter_New(&faces, bm, BM_FACES_OF_VERT, v); f; f = BMIter_Step(&faces))
-				BMO_SetFlag(bm, (BMHeader *)f, oflag);
-		}
-	}
-
-	BMO_remove_tagged_faces(bm, oflag);
-	BMO_remove_tagged_edges(bm, oflag);
-	BMO_remove_tagged_verts(bm, oflag);
+#undef DEL_INPUT
 }
 
-static void delete_edges(BMesh *bm, const short oflag)
-{
-	BMEdge *e;
-	BMFace *f;
-	
-	BMIter edges;
-	BMIter faces;
-
-	for (e = BMIter_New(&edges, bm, BM_EDGES_OF_MESH, bm); e; e = BMIter_Step(&edges)) {
-		if (BMO_TestFlag(bm, (BMHeader *)e, oflag)) {
-			for (f = BMIter_New(&faces, bm, BM_FACES_OF_EDGE, e); f; f = BMIter_Step(&faces)) {
-				BMO_SetFlag(bm, (BMHeader *)f, oflag);
-			}
-		}
-	}
-	BMO_remove_tagged_faces(bm, oflag);
-	BMO_remove_tagged_edges(bm, oflag);
-}
-
-/* you need to make remove tagged verts/edges/faces
- * api functions that take a filter callback.....
- * and this new filter type will be for opstack flags.
- * This is because the BM_remove_taggedXXX functions bypass iterator API.
- *  - Ops dont care about 'UI' considerations like selection state, hide state, ect.
- *    If you want to work on unhidden selections for instance,
- *    copy output from a 'select context' operator to another operator....
- */
-
-/* Break this into smaller functions */
-
-static void delete_context(BMesh *bm, const short oflag, int type)
-{
-	BMVert *v;
-	BMEdge *e;
-	BMFace *f;
-
-	BMIter verts;
-	BMIter edges;
-	BMIter faces;
-	
-	if (type == DEL_VERTS) delete_verts(bm, oflag);
-	else if (type == DEL_EDGES) {
-		/* flush down to vert */
-		for (e = BMIter_New(&edges, bm, BM_EDGES_OF_MESH, bm); e; e = BMIter_Step(&edges)) {
-			if (BMO_TestFlag(bm, (BMHeader *)e, oflag)) {
-				BMO_SetFlag(bm, (BMHeader *)(e->v1), oflag);

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list