[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [44010] branches/bmesh/blender/source/ blender/editors: reviewed selection flushing code, some of this was incorrect, checked all uses against trunk.

Campbell Barton ideasman42 at gmail.com
Fri Feb 10 07:16:32 CET 2012


Revision: 44010
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=44010
Author:   campbellbarton
Date:     2012-02-10 06:16:21 +0000 (Fri, 10 Feb 2012)
Log Message:
-----------
reviewed selection flushing code, some of this was incorrect, checked all uses against trunk.

loop select also was incorrectly calling EDBM_select_flush() rather then EDBM_store_selection(), tsk tsk. (and strange nobody noticed this).

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/editors/include/ED_mesh.h
    branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c
    branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c
    branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c
    branches/bmesh/blender/source/blender/editors/mesh/editbmesh_add.c
    branches/bmesh/blender/source/blender/editors/mesh/loopcut.c
    branches/bmesh/blender/source/blender/editors/space_view3d/view3d_select.c
    branches/bmesh/blender/source/blender/editors/uvedit/uvedit_ops.c

Modified: branches/bmesh/blender/source/blender/editors/include/ED_mesh.h
===================================================================
--- branches/bmesh/blender/source/blender/editors/include/ED_mesh.h	2012-02-10 05:10:52 UTC (rev 44009)
+++ branches/bmesh/blender/source/blender/editors/include/ED_mesh.h	2012-02-10 06:16:21 UTC (rev 44010)
@@ -157,9 +157,8 @@
 
 int EDBM_get_actSelection(struct BMEditMesh *em, struct BMEditSelection *ese);
 
-/*exactly the same as EDBM_selectmode_flush, but you pass in the selectmode
-  instead of using the current one*/
-void EDBM_select_mode_flush(struct BMEditMesh *em, int selectmode);
+void EDBM_selectmode_flush_ex(struct BMEditMesh *em, int selectmode);
+void EDBM_selectmode_flush(struct BMEditMesh *em);
 
 void EDBM_deselect_flush(struct BMEditMesh *em);
 void EDBM_select_flush(struct BMEditMesh *em);

Modified: branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c	2012-02-10 05:10:52 UTC (rev 44009)
+++ branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c	2012-02-10 06:16:21 UTC (rev 44010)
@@ -766,7 +766,7 @@
 
 	/* select the output */
 	BMO_HeaderFlag_Buffer(em->bm, &bmop, "edgeout", BM_SELECT, BM_ALL);
-	EDBM_select_flush(em);
+	EDBM_selectmode_flush(em);
 
 	/* finish the operator */
 	if (!EDBM_FinishOp(em, &bmop, op, TRUE)) {
@@ -817,7 +817,7 @@
 		return OPERATOR_CANCELLED;
 	}
 
-	EDBM_select_flush(em);
+	EDBM_selectmode_flush(em);
 
 	/* dependencies graph and notification stuff */
 	DAG_id_tag_update(ob->data, OB_RECALC_DATA);
@@ -956,14 +956,14 @@
 			eed = edarray[edindex];
 			walker_select(em, BMW_EDGERING, eed, 1);
 		}
-		EDBM_select_flush(em);
+		EDBM_selectmode_flush(em);
 	}
 	else{
 		for(edindex = 0; edindex < totedgesel; edindex +=1) {
 			eed = edarray[edindex];
 			walker_select(em, BMW_LOOP, eed, 1);
 		}
-		EDBM_select_flush(em);
+		EDBM_selectmode_flush(em);
 	}
 	MEM_freeN(edarray);
 //	if (EM_texFaceCheck())
@@ -1041,7 +1041,7 @@
 				walker_select(em, BMW_LOOP, eed, select);
 		}
 
-		EDBM_select_flush(em);
+		EDBM_selectmode_flush(em);
 //			if (EM_texFaceCheck())
 		
 		/* sets as active, useful for other tools */
@@ -1394,7 +1394,7 @@
 			edgetag_context_set(em, vc.scene, e, act); /* switch the edge option */
 		}
 		
-		EDBM_select_flush(em);
+		EDBM_selectmode_flush(em);
 
 		/* even if this is selected it may not be in the selection list */
 		if (edgetag_context_check(vc.scene, em, e)==0)
@@ -1506,7 +1506,7 @@
 			}
 		}
 		
-		EDBM_select_flush(vc.em);
+		EDBM_selectmode_flush(vc.em);
 		  
 //		if (EM_texFaceCheck()) {
 
@@ -1567,14 +1567,6 @@
 	EDBM_strip_selections(em); /*strip BMEditSelections from em->selected that are not relevant to new mode*/
 	
 	if (em->selectmode & SCE_SELECT_VERTEX) {
-		/*BMIter iter;
-		
-		eed = BMIter_New(&iter, em->bm, BM_EDGES_OF_MESH, NULL);
-		for ( ; eed; eed=BMIter_Step(&iter)) BM_Select(em->bm, eed, FALSE);
-		
-		efa = BMIter_New(&iter, em->bm, BM_FACES_OF_MESH, NULL);
-		for ( ; efa; efa=BMIter_Step(&iter)) BM_Select(em->bm, efa, FALSE);*/
-
 		EDBM_select_flush(em);
 	}
 	else if (em->selectmode & SCE_SELECT_EDGE) {
@@ -1590,7 +1582,7 @@
 		}
 		
 		/* selects faces based on edge status */
-		EDBM_select_flush(em);
+		EDBM_selectmode_flush(em);
 	}
 	else if (em->selectmode & SCE_SELECT_FACE) {
 		/* deselect eges, and select again based on face select */
@@ -1809,7 +1801,16 @@
 				BM_Select(bm, e->v2, sel);
 		}
 		BMW_End(&walker);
-		EDBM_select_mode_flush(em, SCE_SELECT_VERTEX);
+
+		/* BMESH_TODO, see trunks 'select_linked_pick_invoke' this uses 'f1' flag and does its own flushing
+		 * the problem with calling selectmode flush below is that it will select edges from parts
+		 * of the mesh that didnt change, perhaps we should have selection flushing functions that only check
+		 * tagged geometry.
+		 * For now I dont think this is a showstopper - campbell */
+
+		/* now use vertex select flag to select rest */
+		EDBM_selectmode_flush_ex(em, SCE_SELECT_EDGE);
+
 	}
 
 	WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit);
@@ -1908,7 +1909,7 @@
 		}
 		BMW_End(&walker);
 	}
-	EDBM_select_mode_flush(em, SCE_SELECT_VERTEX);
+	EDBM_selectmode_flush_ex(em, SCE_SELECT_VERTEX);
 
 	WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit);
 
@@ -2052,7 +2053,7 @@
 	BMO_pop(bm);
 
 	/* Flush selection up */
-	EDBM_select_mode_flush(em, flushtype);
+	EDBM_selectmode_flush_ex(em, flushtype);
 }
 
 static void deselect_nth_active(BMEditMesh *em, BMVert **v_p, BMEdge **e_p, BMFace **f_p)
@@ -2067,7 +2068,7 @@
 	*e_p= NULL;
 	*f_p= NULL;
 
-	EDBM_select_flush(em);
+	EDBM_selectmode_flush(em);
 	ese= (BMEditSelection*)em->bm->selected.last;
 
 	if (ese) {
@@ -2399,7 +2400,7 @@
 				BM_Select(em->bm, eve, TRUE);
 			}
 		}
-		EDBM_select_flush(em);
+		EDBM_selectmode_flush(em);
 	}
 	else if (em->selectmode & SCE_SELECT_EDGE) {
 		BM_ITER(eed, &iter, em->bm, BM_EDGES_OF_MESH, NULL) {
@@ -2407,7 +2408,7 @@
 				BM_Select(em->bm, eed, TRUE);
 			}
 		}
-		EDBM_select_flush(em);
+		EDBM_selectmode_flush(em);
 	}
 	else {
 		BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
@@ -2415,7 +2416,7 @@
 				BM_Select(em->bm, efa, TRUE);
 			}
 		}
-		EDBM_select_flush(em);
+		EDBM_selectmode_flush(em);
 	}
 	
 	WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);

Modified: branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c	2012-02-10 05:10:52 UTC (rev 44009)
+++ branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c	2012-02-10 06:16:21 UTC (rev 44010)
@@ -1445,7 +1445,7 @@
 			BM_Hide(em->bm, h, 1);
 	}
 
-	EDBM_select_flush(em);
+	EDBM_selectmode_flush(em);
 
 	/*original hide flushing comment (OUTDATED): 
 	  hide happens on least dominant select mode, and flushes up, not down! (helps preventing errors in subsurf) */
@@ -1532,7 +1532,7 @@
 		}
 	}
 
-	EDBM_select_flush(em);
+	EDBM_selectmode_flush(em);
 }
 
 static int reveal_mesh_exec(bContext *C, wmOperator *UNUSED(op))
@@ -2296,7 +2296,7 @@
 		return OPERATOR_CANCELLED;
 	}
 
-	EDBM_select_flush(em);
+	EDBM_selectmode_flush(em);
 
 	/* dependencies graph and notification stuff */
 /*	DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
@@ -2541,7 +2541,7 @@
 		BM_Select(bm, ripvert, TRUE);
 	}
 
-	EDBM_select_flush(em);
+	EDBM_selectmode_flush(em);
 
 	BLI_assert(singlesel ? (bm->totvertsel > 0) : (bm->totedgesel > 0));
 
@@ -2788,7 +2788,7 @@
 		}
 	}
 
-	EDBM_select_flush(em);
+	EDBM_selectmode_flush(em);
 	WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
 
 	return OPERATOR_FINISHED;
@@ -3296,20 +3296,20 @@
 	BMesh *bm = em->bm;
 	int max_iter = bm->totvert;
 
-	/*Clear all selected vertices*/
+	/* Clear all selected vertices */
 	BM_ITER(v, &iter, bm, BM_VERTS_OF_MESH, NULL) {
 		BM_Select(bm, v, FALSE);
 	}
 
-	/*Flush the selection to clear edge/face selections to match
-	  selected vertices*/
-	EDBM_select_mode_flush(em, SCE_SELECT_VERTEX);
+	/* Flush the selection to clear edge/face selections to match
+	 * selected vertices*/
+	EDBM_selectmode_flush_ex(em, SCE_SELECT_VERTEX);
 
-	/*A "while(true)" loop should work here as each iteration should
-	  select and remove at least one vertex and when all vertices
-	  are selected the loop will break out. But guard against bad
-	  behavior by limiting iterations to the number of vertices in the
-	  original mesh.*/
+	/* A "while(true)" loop should work here as each iteration should
+	 * select and remove at least one vertex and when all vertices
+	 * are selected the loop will break out. But guard against bad
+	 * behavior by limiting iterations to the number of vertices in the
+	 * original mesh.*/
 	for(i=0; i<max_iter; i++)
 	{
 		/* Get a seed vertex to start the walk */
@@ -3340,9 +3340,9 @@
 		}
 		BMW_End(&walker);
 				
-		/*Flush the selection to get edge/face selections matching
-		  the vertex selection*/
-		EDBM_select_mode_flush(em, SCE_SELECT_VERTEX);
+		/* Flush the selection to get edge/face selections matching
+		 * the vertex selection*/
+		EDBM_selectmode_flush_ex(em, SCE_SELECT_VERTEX);
 
 		if (bm->totvert == bm->totvertsel) {
 			/* Every vertex selected, nothing to separate, work is done */
@@ -3849,7 +3849,7 @@
 		}
 	}
 
-	EDBM_select_flush(em);
+	EDBM_selectmode_flush(em);
 
 	WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
 	return OPERATOR_FINISHED;
@@ -3905,7 +3905,7 @@
 		}
 	}
 
-	EDBM_select_flush(em);
+	EDBM_selectmode_flush(em);
 
 	WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
 	return OPERATOR_FINISHED;
@@ -3933,7 +3933,7 @@
 	int extend= RNA_boolean_get(op->ptr, "extend");
 
 	EDBM_select_mirrored(obedit, em, extend);
-	EDBM_select_flush(em);
+	EDBM_selectmode_flush(em);
 	WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
 
 	return OPERATOR_FINISHED;

Modified: branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c	2012-02-10 05:10:52 UTC (rev 44009)
+++ branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c	2012-02-10 06:16:21 UTC (rev 44010)
@@ -418,13 +418,18 @@
 	return (tm->face_index && index<tm->bm->totface && index>=0) ? tm->face_index[index] : NULL;
 }
 
-void EDBM_select_mode_flush(BMEditMesh *em, int selectmode)
+void EDBM_selectmode_flush_ex(BMEditMesh *em, int selectmode)
 {
 	em->bm->selectmode = selectmode;
 	BM_SelectMode_Flush(em->bm);
 	em->bm->selectmode = em->selectmode;
 }
 
+void EDBM_selectmode_flush(BMEditMesh *em)
+{
+	EDBM_selectmode_flush_ex(em, em->selectmode);
+}
+
 void EDBM_deselect_flush(BMEditMesh *em)
 {
 	/* function below doesnt use. just do this to keep the values in sync */
@@ -452,7 +457,7 @@
 	BMO_HeaderFlag_Buffer(em->bm, &bmop, "geomout", BM_SELECT, BM_ALL);
 	BMO_Finish_Op(em->bm, &bmop);
 
-	EDBM_select_flush(em);
+	EDBM_selectmode_flush(em);
 }
 
 void EDBM_select_less(BMEditMesh *em)
@@ -467,7 +472,7 @@
 	BMO_HeaderFlag_Buffer(em->bm, &bmop, "geomout", BM_SELECT, BM_ALL);
 	BMO_Finish_Op(em->bm, &bmop);
 
-	EDBM_select_flush(em);
+	EDBM_selectmode_flush(em);
 }
 
 int EDBM_get_actSelection(BMEditMesh *em, BMEditSelection *ese)

Modified: branches/bmesh/blender/source/blender/editors/mesh/editbmesh_add.c
===================================================================

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list