[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