[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [44678] trunk/blender/source/blender/bmesh /intern: bmesh: speedup for deselecting all, ( avoid topology loops since all get deselected anyway).

Campbell Barton ideasman42 at gmail.com
Tue Mar 6 17:18:03 CET 2012


Revision: 44678
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=44678
Author:   campbellbarton
Date:     2012-03-06 16:17:55 +0000 (Tue, 06 Mar 2012)
Log Message:
-----------
bmesh: speedup for deselecting all, (avoid topology loops since all get deselected anyway).
& some ascii art to explain BM_face_other_vert_loop() behavior.

Modified Paths:
--------------
    trunk/blender/source/blender/bmesh/intern/bmesh_marking.c
    trunk/blender/source/blender/bmesh/intern/bmesh_mods.c
    trunk/blender/source/blender/bmesh/intern/bmesh_queries.c
    trunk/blender/source/blender/bmesh/intern/bmesh_structure.c

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_marking.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_marking.c	2012-03-06 14:48:11 UTC (rev 44677)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_marking.c	2012-03-06 16:17:55 UTC (rev 44678)
@@ -757,14 +757,27 @@
 		BM_select_history_clear(bm);
 	}
 
-	for (i = 0; i < 3; i++) {
-		if (htype & iter_types[i]) {
+	if (htype == (BM_VERT | BM_EDGE | BM_FACE) && (hflag == BM_ELEM_SELECT)) {
+		/* fast path for deselect all, avoid topology loops
+		 * since we know all will be de-selected anyway. */
+		for (i = 0; i < 3; i++) {
 			ele = BM_iter_new(&iter, bm, iter_types[i], NULL);
 			for ( ; ele; ele = BM_iter_step(&iter)) {
-				if (hflag & BM_ELEM_SELECT) {
-					BM_elem_select_set(bm, ele, FALSE);
+				BM_elem_flag_disable(ele, BM_ELEM_SELECT);
+			}
+		}
+		bm->totvertsel = bm->totedgesel = bm->totfacesel = 0;
+	}
+	else {
+		for (i = 0; i < 3; i++) {
+			if (htype & iter_types[i]) {
+				ele = BM_iter_new(&iter, bm, iter_types[i], NULL);
+				for ( ; ele; ele = BM_iter_step(&iter)) {
+					if (hflag & BM_ELEM_SELECT) {
+						BM_elem_select_set(bm, ele, FALSE);
+					}
+					BM_elem_flag_disable(ele, hflag);
 				}
-				BM_elem_flag_disable(ele, hflag);
 			}
 		}
 	}
@@ -783,6 +796,10 @@
 		BM_select_history_clear(bm);
 	}
 
+	/* note, better not attempt a fast path for selection as done with de-select
+	 * because hidden geometry and different selection modes can give different results,
+	 * we could ofcourse check for no hiddent faces and then use quicker method but its not worth it. */
+
 	for (i = 0; i < 3; i++) {
 		if (htype & iter_types[i]) {
 			ele = BM_iter_new(&iter, bm, iter_types[i], NULL);

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_mods.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_mods.c	2012-03-06 14:48:11 UTC (rev 44677)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_mods.c	2012-03-06 16:17:55 UTC (rev 44678)
@@ -44,16 +44,22 @@
  *
  * Turns the face region surrounding a manifold vertex into a single polygon.
  *
- *
  * \par Example:
  *
- *              |=========|             |=========|
+ *              +---------+             +---------+
  *              |  \   /  |             |         |
- *     Before:  |    V    |      After: |         |
+ *     Before:  |    v    |      After: |         |
  *              |  /   \  |             |         |
- *              |=========|             |=========|
+ *              +---------+             +---------+
  *
  *
+ * This function can also collapse edges too
+ * in cases when it cant merge into faces.
+ *
+ * \par Example:
+ *
+ *     Before:  +----v----+      After: +---------+
+ *
  * \note dissolves vert, in more situations then BM_disk_dissolve
  * (e.g. if the vert is part of a wire edge, etc).
  */
@@ -218,7 +224,6 @@
  *
  * \return pointer to the combined face
  */
-
 BMFace *BM_faces_join_pair(BMesh *bm, BMFace *f1, BMFace *f2, BMEdge *e,
                            const short do_del)
 {
@@ -274,7 +279,6 @@
  *
  * \return The newly created edge.
  */
-
 BMEdge *BM_verts_connect(BMesh *bm, BMVert *v1, BMVert *v2, BMFace **r_f)
 {
 	BMIter fiter;
@@ -562,7 +566,6 @@
  *
  * \return The New Edge
  */
-
 BMEdge *BM_vert_collapse_edge(BMesh *bm, BMEdge *ke, BMVert *kv,
                               const short kill_degenerate_faces)
 {
@@ -722,7 +725,9 @@
 	return nv;
 }
 
-/* split an edge multiple times evenly */
+/**
+ * \brief Split an edge multiple times evenly
+ */
 BMVert  *BM_edge_split_n(BMesh *bm, BMEdge *e, int numcuts)
 {
 	int i;
@@ -736,7 +741,9 @@
 	return nv;
 }
 
-/* checks if a face is valid in the data structure */
+/**
+ * Checks if a face is valid in the data structure
+ */
 int BM_face_validate(BMesh *bm, BMFace *face, FILE *err)
 {
 	BMIter iter;
@@ -1062,7 +1069,9 @@
 	return nl->e;
 }
 
-/* Rip a single face from a vertex fan */
+/**
+ * \brief Rip a single face from a vertex fan
+ */
 BMVert *BM_vert_rip(BMesh *bm, BMFace *sf, BMVert *sv)
 {
 	return bmesh_urmv(bm, sf, sv);

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_queries.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_queries.c	2012-03-06 14:48:11 UTC (rev 44677)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_queries.c	2012-03-06 16:17:55 UTC (rev 44678)
@@ -63,9 +63,20 @@
 }
 
 /**
- * \brief BMESH OTHER EDGE IN FACE SHARING A VERTEX
+ * \brief Other Loop in Face Sharing an Edge
  *
  * Finds the other loop that shares \a v with \a e loop in \a f.
+ *
+ *     +----------+
+ *     |          |
+ *     |    f     |
+ *     |          |
+ *     +----------+ <-- return the face loop of this vertex.
+ *     v --> e
+ *     ^     ^ <------- These vert args define direction
+ *                      in the face to check.
+ *                      The faces loop direction is ignored.
+ *
  */
 BMLoop *BM_face_other_edge_loop(BMFace *f, BMEdge *e, BMVert *v)
 {
@@ -86,7 +97,7 @@
 }
 
 /**
- * \brief BMESH NEXT LOOP IN FACE SHARING A VERTEX
+ * \brief Other Loop in Face Sharing a Vertex
  *
  * Finds the other loop in a face.
  *

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_structure.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_structure.c	2012-03-06 14:48:11 UTC (rev 44677)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_structure.c	2012-03-06 16:17:55 UTC (rev 44678)
@@ -38,7 +38,6 @@
 
 /**
  *	MISC utility functions.
- *
  */
 
 int bmesh_vert_in_edge(BMEdge *e, BMVert *v)




More information about the Bf-blender-cvs mailing list