[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [24299] branches/bmesh/blender/source/ blender/editors/mesh: ringsel works right again.

Joseph Eagar joeedh at gmail.com
Wed Nov 4 10:37:08 CET 2009


Revision: 24299
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=24299
Author:   joeedh
Date:     2009-11-04 10:37:08 +0100 (Wed, 04 Nov 2009)

Log Message:
-----------
ringsel works right again.  improved shift-vkey rip tool.

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c
    branches/bmesh/blender/source/blender/editors/mesh/loopcut.c

Modified: branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c	2009-11-04 09:22:16 UTC (rev 24298)
+++ branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c	2009-11-04 09:37:08 UTC (rev 24299)
@@ -399,18 +399,6 @@
 	BMO_HeaderFlag_To_Slot(bm, &extop, "edgefacein",
 		               flag, BM_VERT|BM_EDGE|BM_FACE);
 
-	BM_ITER(vert, &iter, bm, BM_VERTS_OF_MESH, NULL) {
-		BM_Select(bm, vert, 0);
-	}
-
-	BM_ITER(edge, &iter, bm, BM_EDGES_OF_MESH, NULL) {
-		BM_Select(bm, edge, 0);
-	}
-
-	BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) {
-		BM_Select(bm, f, 0);
-	}
-
 	/* If a mirror modifier with clipping is on, we need to adjust some 
 	 * of the cases above to handle edges on the line of symmetry.
 	 */
@@ -461,6 +449,18 @@
 		}
 	}
 
+	BM_ITER(vert, &iter, bm, BM_VERTS_OF_MESH, NULL) {
+		BM_Select(bm, vert, 0);
+	}
+
+	BM_ITER(edge, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+		BM_Select(bm, edge, 0);
+	}
+
+	BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) {
+		BM_Select(bm, f, 0);
+	}
+
 	BMO_Exec_Op(bm, &extop);
 
 	nor[0] = nor[1] = nor[2] = 0.0f;
@@ -2973,7 +2973,7 @@
 	BMLoop *l;
 	BMEdge *e, *e2, *closest = NULL;
 	BMVert *v;
-	int side = 0, i;
+	int side = 0, i, singlesel = 0;
 	float projectMat[4][4], fmval[3] = {event->mval[0], event->mval[1], 0.0f};
 	float dist = FLT_MAX, d;
 
@@ -2989,6 +2989,8 @@
 	  the closest edge around that vert to the mouse cursor,
 	  then rip the two adjacent edges in the vert fan.*/
 	if (em->bm->totvertsel == 1 && em->bm->totedgesel == 0 && em->bm->totfacesel == 0) {
+		singlesel = 1;
+
 		/*find selected vert*/
 		BM_ITER(v, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
 			if (BM_TestHFlag(v, BM_SELECT))
@@ -3015,21 +3017,23 @@
 		/*rip two adjacent edges*/
 		if (BM_Edge_FaceCount(e2) == 1) {
 			l = e2->loop;
-			e = BM_OtherFaceLoop(e2, l->f, v);
+			e = BM_OtherFaceLoop(e2, l->f, v)->e;
 
 			BMINDEX_SET(e, 1);
 			BM_SetHFlag(e, BM_SELECT);
 		} else if (BM_Edge_FaceCount(e2) == 2) {
 			l = e2->loop;
-			e = BM_OtherFaceLoop(e2, l->f, v);
+			e = BM_OtherFaceLoop(e2, l->f, v)->e;
 			BMINDEX_SET(e, 1);
 			BM_SetHFlag(e, BM_SELECT);
 			
 			l = e2->loop->radial.next->data;
-			e = BM_OtherFaceLoop(e2, l->f, v);
+			e = BM_OtherFaceLoop(e2, l->f, v)->e;
 			BMINDEX_SET(e, 1);
 			BM_SetHFlag(e, BM_SELECT);
 		}
+
+		dist = FLT_MAX;
 	} else {
 		/*expand edge selection*/
 		BM_ITER(v, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
@@ -3121,8 +3125,12 @@
 			}
 		}
 		
-		if (i == 1) 
-			BM_Select(em->bm, e2, 0);
+		if (i == 1)  {
+			if (singlesel)
+				BM_Select(em->bm, v, 0);
+			else
+				BM_Select(em->bm, e2, 0);
+		}
 	}
 
 	EDBM_selectmode_flush(em);

Modified: branches/bmesh/blender/source/blender/editors/mesh/loopcut.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/loopcut.c	2009-11-04 09:22:16 UTC (rev 24298)
+++ branches/bmesh/blender/source/blender/editors/mesh/loopcut.c	2009-11-04 09:37:08 UTC (rev 24299)
@@ -384,6 +384,79 @@
 
 
 	switch (event->type) {
+		case LEFTMOUSE: /* abort */ // XXX hardcoded
+			ED_region_tag_redraw(lcd->ar);
+			ringsel_exit(C, op);
+
+			return OPERATOR_FINISHED;
+		case RIGHTMOUSE: /* confirm */ // XXX hardcoded
+			if (event->val == KM_RELEASE) {
+				/* finish */
+				ED_region_tag_redraw(lcd->ar);
+				
+				ringsel_finish(C, op);
+				ringsel_exit(C, op);
+				
+				return OPERATOR_FINISHED;
+			}
+			
+			ED_region_tag_redraw(lcd->ar);
+			break;
+		case ESCKEY:
+			if (event->val == KM_RELEASE) {
+				/* cancel */
+				ED_region_tag_redraw(lcd->ar);
+				
+				return ringsel_cancel(C, op);
+			}
+			
+			ED_region_tag_redraw(lcd->ar);
+			break;
+		case WHEELUPMOUSE:  /* change number of cuts */
+			cuts++;
+			RNA_int_set(op->ptr,"number_cuts",cuts);
+			ringsel_find_edge(lcd, C, lcd->ar, cuts);
+			
+			ED_region_tag_redraw(lcd->ar);
+			break;
+		case WHEELDOWNMOUSE:  /* change number of cuts */
+			cuts=MAX2(cuts-1,1);
+			RNA_int_set(op->ptr,"number_cuts",cuts);
+			ringsel_find_edge(lcd, C, lcd->ar,cuts);
+			
+			ED_region_tag_redraw(lcd->ar);
+			break;
+		case MOUSEMOVE: { /* mouse moved somewhere to select another loop */
+			int dist = 75;
+			BMEdge *edge;
+
+			lcd->vc.mval[0] = event->mval[0];
+			lcd->vc.mval[1] = event->mval[1];
+			edge = EDBM_findnearestedge(&lcd->vc, &dist);
+
+			if (edge != lcd->eed) {
+				lcd->eed = edge;
+				ringsel_find_edge(lcd, C, lcd->ar, cuts);
+			}
+
+			ED_region_tag_redraw(lcd->ar);
+			break;
+		}			
+	}
+	
+	/* keep going until the user confirms */
+	return OPERATOR_RUNNING_MODAL;
+}
+
+static int loopcut_modal (bContext *C, wmOperator *op, wmEvent *event)
+{
+	int cuts= RNA_int_get(op->ptr,"number_cuts");
+	tringselOpData *lcd= op->customdata;
+
+	view3d_operator_needs_opengl(C);
+
+
+	switch (event->type) {
 		case LEFTMOUSE: /* confirm */ // XXX hardcoded
 			if (event->val == KM_RELEASE) {
 				/* finish */
@@ -398,6 +471,10 @@
 			ED_region_tag_redraw(lcd->ar);
 			break;
 		case RIGHTMOUSE: /* abort */ // XXX hardcoded
+			ED_region_tag_redraw(lcd->ar);
+			ringsel_exit(C, op);
+
+			return OPERATOR_FINISHED;
 		case ESCKEY:
 			if (event->val == KM_RELEASE) {
 				/* cancel */
@@ -472,7 +549,7 @@
 	
 	/* callbacks */
 	ot->invoke= ringcut_invoke;
-	ot->modal= ringsel_modal;
+	ot->modal= loopcut_modal;
 	ot->cancel= ringsel_cancel;
 	ot->poll= ED_operator_editmesh;
 	





More information about the Bf-blender-cvs mailing list