[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [18756] branches/blender2.5/blender/source /blender/editors/mesh: 2.5

Ton Roosendaal ton at blender.org
Fri Jan 30 19:53:56 CET 2009


Revision: 18756
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18756
Author:   ton
Date:     2009-01-30 19:53:54 +0100 (Fri, 30 Jan 2009)

Log Message:
-----------
2.5

Edit Mesh Loop select back; 
the versions with ALT+Select (edgeloop) or with
ALT+CTRL+Select ('ring'). Hold shift for extend.

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/editors/mesh/editmesh_mods.c
    branches/blender2.5/blender/source/blender/editors/mesh/mesh_intern.h
    branches/blender2.5/blender/source/blender/editors/mesh/mesh_ops.c

Modified: branches/blender2.5/blender/source/blender/editors/mesh/editmesh_mods.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/mesh/editmesh_mods.c	2009-01-30 18:27:25 UTC (rev 18755)
+++ branches/blender2.5/blender/source/blender/editors/mesh/editmesh_mods.c	2009-01-30 18:53:54 UTC (rev 18756)
@@ -1921,37 +1921,53 @@
 		
 /* ***************** MAIN MOUSE SELECTION ************** */
 
-/* just to have the functions nice together */
 
-static void mouse_mesh_loop(ViewContext *vc)
+/* ***************** loop select (non modal) ************** */
+
+static EnumPropertyItem prop_select_types[] = {
+	{0, "LOOP_EXCLUSIVE", "Loop Exclusive", ""},
+	{1, "LOOP_EXTEND", "Loop Extend", ""},
+	{2, "RING_EXCLUSIVE", "Ring Exclusive", ""},
+	{3, "RING_EXTEND", "Ring Extend", ""},
+	{0, NULL, NULL, NULL}
+};
+
+
+static void mouse_mesh_loop(bContext *C, short mval[2], short extend, short ring)
 {
-	EditMesh *em= vc->em;
+	ViewContext vc;
+	EditMesh *em;
 	EditEdge *eed;
 	int select= 1;
 	int dist= 50;
-	int shift= 0, alt= 0, ctrl= 0; // XXX
 	
-	eed= findnearestedge(vc, &dist);
+	em_setup_viewcontext(C, &vc);
+	vc.mval[0]= mval[0];
+	vc.mval[1]= mval[1];
+	em= vc.em;
+	
+	eed= findnearestedge(&vc, &dist);
 	if(eed) {
-		if (vc->scene->toolsettings->edge_mode == EDGE_MODE_SELECT) {
-			if(shift==0) EM_clear_flag_all(em, SELECT);
+		/* XXX: should toolsettings do this? */
+		if (vc.scene->toolsettings->edge_mode == EDGE_MODE_SELECT) {
+			if(extend==0) EM_clear_flag_all(em, SELECT);
 		
 			if((eed->f & SELECT)==0) select=1;
-			else if(shift) select=0;
+			else if(extend) select=0;
 
 			if(em->selectmode & SCE_SELECT_FACE) {
 				faceloop_select(em, eed, select);
 			}
 			else if(em->selectmode & SCE_SELECT_EDGE) {
-		        if((alt && ctrl))
+		        if(ring)
 					edgering_select(em, eed, select);
-		        else if(alt)
+		        else
 					edgeloop_select(em, eed, select);
 			}
 		    else if(em->selectmode & SCE_SELECT_VERTEX) {
-		        if((alt && ctrl))
+		        if(ring)
 					edgering_select(em, eed, select);
-		        else if(alt)
+		        else 
 					edgeloop_select(em, eed, select);
 			}
 
@@ -1960,18 +1976,18 @@
 			
 		} 
 		else {
-			int act = (edgetag_context_check(vc->scene, eed)==0);
+			int act = (edgetag_context_check(vc.scene, eed)==0);
 			int path = 0;
 			
-			if (alt && ctrl && em->selected.last) {
+			if (ring && em->selected.last) {
 				EditSelection *ese = em->selected.last;
 	
 				if(ese && ese->type == EDITEDGE) {
 					EditEdge *eed_act;
 					eed_act = (EditEdge*)ese->data;
 					if (eed_act != eed) {
-						/* If shift is pressed we need to use the last active edge, (if it exists) */
-						if (edgetag_shortest_path(vc->scene, em, eed_act, eed)) {
+						/* If extend, we need to use the last active edge, (if it exists) */
+						if (edgetag_shortest_path(vc.scene, em, eed_act, eed)) {
 							EM_remove_selection(em, eed_act, EDITEDGE);
 							EM_select_edge(eed_act, 0);
 							path = 1;
@@ -1980,7 +1996,7 @@
 				}
 			}
 			if (path==0) {
-				edgetag_context_set(vc->scene, eed, act); /* switch the edge option */
+				edgetag_context_set(vc.scene, eed, act); /* switch the edge option */
 			}
 			
 			if (act) {
@@ -2000,7 +2016,7 @@
 				}
 			}
 			
-			switch (0) { // XXX scene->toolsettings->edge_mode) {
+			switch (vc.scene->toolsettings->edge_mode) {
 			case EDGE_MODE_TAG_SEAM:
 				G.f |= G_DRAWSEAMS;
 				break;
@@ -2015,13 +2031,51 @@
 				break;
 			}
 			
-//			DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
+			DAG_object_flush_update(vc.scene, vc.obedit, OB_RECALC_DATA);
 		}
-				
+		
+		WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, vc.obedit);
 	}
 }
 
+static int mesh_loop_select_invoke(bContext *C, wmOperator *op, wmEvent *event)
+{
+	ARegion *ar= CTX_wm_region(C);
+	short extend= RNA_int_get(op->ptr, "type");
+	short mval[2], ring= 0;	
+	
+	mval[0]= event->x - ar->winrct.xmin;
+	mval[1]= event->y - ar->winrct.ymin;
+	
+	view3d_operator_needs_opengl(C);
+	
+	/* hmrs, 4 selections in 1 property this way? */
+	if(extend>1) ring= 1;
+	extend &= ~2;
+	
+	mouse_mesh_loop(C, mval, extend, ring);
+	
+	/* allowing tweaks */
+	return OPERATOR_PASS_THROUGH;
+}
 
+void MESH_OT_loop_select(wmOperatorType *ot)
+{
+	/* identifiers */
+	ot->name= "Loop Select";
+	ot->idname= "MESH_OT_loop_select";
+	
+	/* api callbacks */
+	ot->invoke= mesh_loop_select_invoke;
+	ot->poll= ED_operator_editmesh;
+	
+	/* properties */
+	RNA_def_enum(ot->srna, "type", prop_select_types, 0, "Type", "");
+}
+
+/* ************************************************** */
+
+
 /* here actual select happens */
 /* gets called via generic mouse select operator */
 void mouse_mesh(bContext *C, short mval[2], short extend)
@@ -2030,15 +2084,13 @@
 	EditVert *eve;
 	EditEdge *eed;
 	EditFace *efa;
-	int  alt= 0; // XXX
 	
 	/* setup view context for argument to callbacks */
 	em_setup_viewcontext(C, &vc);
 	vc.mval[0]= mval[0];
 	vc.mval[1]= mval[1];
 	
-	if(alt) mouse_mesh_loop(&vc);
-	else if(unified_findnearest(&vc, &eve, &eed, &efa)) {
+	if(unified_findnearest(&vc, &eve, &eed, &efa)) {
 		
 		if(extend==0) EM_clear_flag_all(vc.em, SELECT);
 		
@@ -2089,7 +2141,6 @@
 
 	WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, vc.obedit);
 	
-//	rightmouse_transform();
 }
 
 // XXX should we use CTX_scene(C)->selectmode & SCE_SELECT_FACE like it was in the past ? calls selectconnected_delimit_mesh_all if true

Modified: branches/blender2.5/blender/source/blender/editors/mesh/mesh_intern.h
===================================================================
--- branches/blender2.5/blender/source/blender/editors/mesh/mesh_intern.h	2009-01-30 18:27:25 UTC (rev 18755)
+++ branches/blender2.5/blender/source/blender/editors/mesh/mesh_intern.h	2009-01-30 18:53:54 UTC (rev 18756)
@@ -168,7 +168,7 @@
 
 
 /* ******************* editmesh_mods.c */
-
+void MESH_OT_loop_select(struct wmOperatorType *ot);
 void MESH_OT_de_select_all(struct wmOperatorType *ot);
 void MESH_OT_select_more(struct wmOperatorType *ot);
 void MESH_OT_select_less(struct wmOperatorType *ot);

Modified: branches/blender2.5/blender/source/blender/editors/mesh/mesh_ops.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/mesh/mesh_ops.c	2009-01-30 18:27:25 UTC (rev 18755)
+++ branches/blender2.5/blender/source/blender/editors/mesh/mesh_ops.c	2009-01-30 18:53:54 UTC (rev 18756)
@@ -139,7 +139,7 @@
 	WM_operatortype_append(MESH_OT_edit_faces);
 	WM_operatortype_append(MESH_OT_separate);
 	WM_operatortype_append(MESH_OT_dupli_extrude_cursor);
-	
+	WM_operatortype_append(MESH_OT_loop_select);
 }
 
 /* note mesh keymap also for other space? */
@@ -148,6 +148,10 @@
 	ListBase *keymap= WM_keymap_listbase(wm, "EditMesh", 0, 0);
 	
 	/* selecting */
+	RNA_int_set(WM_keymap_add_item(keymap, "MESH_OT_loop_select", SELECTMOUSE, KM_PRESS, KM_ALT, 0)->ptr, "type", 0);
+	RNA_int_set(WM_keymap_add_item(keymap, "MESH_OT_loop_select", SELECTMOUSE, KM_PRESS, KM_SHIFT|KM_ALT, 0)->ptr, "type", 1);
+	RNA_int_set(WM_keymap_add_item(keymap, "MESH_OT_loop_select", SELECTMOUSE, KM_PRESS, KM_ALT|KM_CTRL, 0)->ptr, "type", 2);
+	RNA_int_set(WM_keymap_add_item(keymap, "MESH_OT_loop_select", SELECTMOUSE, KM_PRESS, KM_SHIFT|KM_ALT|KM_CTRL, 0)->ptr, "type", 3);
 	WM_keymap_add_item(keymap, "MESH_OT_de_select_all", AKEY, KM_PRESS, 0, 0);
 	WM_keymap_add_item(keymap, "MESH_OT_select_more", PADPLUSKEY, KM_PRESS, KM_CTRL, 0);
 	WM_keymap_add_item(keymap, "MESH_OT_select_less", PADMINUS, KM_PRESS, KM_CTRL, 0);
@@ -161,6 +165,8 @@
 	RNA_float_set(WM_keymap_add_item(keymap, "MESH_OT_select_linked_flat_faces", FKEY, KM_PRESS, (KM_CTRL|KM_SHIFT|KM_ALT), 0)->ptr,"sharpness",135.0);
 	RNA_float_set(WM_keymap_add_item(keymap, "MESH_OT_select_sharp_edges", SKEY, KM_PRESS, (KM_CTRL|KM_SHIFT|KM_ALT), 0)->ptr,"sharpness",135.0);		
 	
+	/* transform keymap already defined, so no tweaks for select */
+	
 	/* hide */
 	WM_keymap_add_item(keymap, "MESH_OT_hide_mesh", HKEY, KM_PRESS, 0, 0);
 	RNA_boolean_set(WM_keymap_add_item(keymap, "MESH_OT_hide_mesh", HKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "swap", 1);





More information about the Bf-blender-cvs mailing list