[Bf-committers] Edgering Selection Patch

Johnny Matthews johnny.matthews at gmail.com
Thu Mar 10 18:12:11 CET 2005


Here is a patch to allow for edgering selection in edge select mode

activate it with alt-ctrl-rightclick on an edge. Shift modifier works 
the same as edgeloop.

Johnny Matthews
guitargeek
-------------- next part --------------
Index: source/blender/src/editmesh_mods.c
===================================================================
RCS file: /cvsroot/bf-blender/blender/source/blender/src/editmesh_mods.c,v
retrieving revision 1.44
diff -u -r1.44 editmesh_mods.c
--- source/blender/src/editmesh_mods.c	9 Mar 2005 19:45:56 -0000	1.44
+++ source/blender/src/editmesh_mods.c	10 Mar 2005 16:26:25 -0000
@@ -982,6 +982,74 @@
 	}
 }
 
+/* 
+   Almostly exactly the same code as faceloop select
+*/
+static void edgering_select(EditEdge *startedge, int select){
+	EditMesh *em = G.editMesh;
+	EditEdge *eed;
+	EditFace *efa;
+	int looking= 1;
+	
+	/* in eed->f1 we put the valence (amount of faces in edge) */
+	/* in eed->f2 we put tagged flag as correct loop */
+	/* in efa->f1 we put tagged flag as correct to select */
+
+	for(eed= em->edges.first; eed; eed= eed->next) {
+		eed->f1= 0;
+		eed->f2= 0;
+	}
+	for(efa= em->faces.first; efa; efa= efa->next) {
+		efa->f1= 0;
+		if(efa->h==0) {
+			efa->e1->f1++;
+			efa->e2->f1++;
+			efa->e3->f1++;
+			if(efa->e4) efa->e4->f1++;
+		}
+	}
+	
+	// tag startedge OK
+	startedge->f2= 1;
+	
+	while(looking) {
+		looking= 0;
+		
+		for(efa= em->faces.first; efa; efa= efa->next) {
+			if(efa->e4 && efa->f1==0) {	// not done quad
+				if(efa->e1->f1<=2 && efa->e2->f1<=2 && efa->e3->f1<=2 && efa->e4->f1<=2) { // valence ok
+
+					// if edge tagged, select opposing edge and mark face ok
+					if(efa->e1->f2) {
+						efa->e3->f2= 1;
+						efa->f1= 1;
+						looking= 1;
+					}
+					else if(efa->e2->f2) {
+						efa->e4->f2= 1;
+						efa->f1= 1;
+						looking= 1;
+					}
+					if(efa->e3->f2) {
+						efa->e1->f2= 1;
+						efa->f1= 1;
+						looking= 1;
+					}
+					if(efa->e4->f2) {
+						efa->e2->f2= 1;
+						efa->f1= 1;
+						looking= 1;
+					}
+				}
+			}
+		}
+	}
+	
+	/* (de)select the edges */
+	for(eed= em->edges.first; eed; eed= eed->next) {
+    		if(eed->f2) EM_select_edge(eed, select);
+	}
+}
 /* ***************** MAIN MOUSE SELECTION ************** */
 
 // just to have the functions nice together
@@ -1001,8 +1069,14 @@
 		if(G.scene->selectmode & SCE_SELECT_FACE) {
 			faceloop_select(eed, eed->f & SELECT);
 		}
-		else {
-			edgeloop_select(eed, eed->f & SELECT);
+		else if(G.scene->selectmode & SCE_SELECT_EDGE) {
+            if(G.qual == (LR_CTRLKEY | LR_ALTKEY) || G.qual == (LR_CTRLKEY | LR_ALTKEY |LR_SHIFTKEY))
+    			edgering_select(eed, eed->f & SELECT);
+            else if(G.qual & LR_ALTKEY)
+    			edgeloop_select(eed, eed->f & SELECT);
+		}
+        else if(G.scene->selectmode & SCE_SELECT_VERTEX) {
+            edgeloop_select(eed, eed->f & SELECT);
 		}
 
 		/* frontbuffer draw of last selected only */


More information about the Bf-committers mailing list