[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [44619] trunk/blender/source/blender: bmesh support for rotating multiple edges at once.

Campbell Barton ideasman42 at gmail.com
Sat Mar 3 13:49:07 CET 2012


Revision: 44619
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=44619
Author:   campbellbarton
Date:     2012-03-03 12:49:03 +0000 (Sat, 03 Mar 2012)
Log Message:
-----------
bmesh support for rotating multiple edges at once.

Modified Paths:
--------------
    trunk/blender/source/blender/bmesh/operators/bmo_triangulate.c
    trunk/blender/source/blender/bmesh/operators/bmo_utils.c
    trunk/blender/source/blender/editors/mesh/bmesh_tools.c

Modified: trunk/blender/source/blender/bmesh/operators/bmo_triangulate.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_triangulate.c	2012-03-03 12:35:37 UTC (rev 44618)
+++ trunk/blender/source/blender/bmesh/operators/bmo_triangulate.c	2012-03-03 12:49:03 UTC (rev 44619)
@@ -138,7 +138,7 @@
 				fac2 = opp1 / (len2 + len3 + len6) + opp2 / (len4 + len1 + len6);
 				
 				if (fac1 > fac2) {
-					e = BM_edge_rotate(bm, e, 0);
+					e = BM_edge_rotate(bm, e, FALSE);
 					if (e) {
 						BMO_elem_flag_enable(bm, e, ELE_NEW);
 

Modified: trunk/blender/source/blender/bmesh/operators/bmo_utils.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_utils.c	2012-03-03 12:35:37 UTC (rev 44618)
+++ trunk/blender/source/blender/bmesh/operators/bmo_utils.c	2012-03-03 12:49:03 UTC (rev 44619)
@@ -129,6 +129,9 @@
 #define FACE_TAINT 1
 
 	BMO_ITER(e, &siter, bm, op, "edges", BM_EDGE) {
+		/**
+		 * this ends up being called twice, could add option to not to call check in
+		 * #BM_edge_rotate to get some extra speed */
 		if (BM_edge_rotate_check(bm, e)) {
 			BMFace *fa, *fb;
 			if (BM_edge_face_pair(e, &fa, &fb)) {

Modified: trunk/blender/source/blender/editors/mesh/bmesh_tools.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/bmesh_tools.c	2012-03-03 12:35:37 UTC (rev 44618)
+++ trunk/blender/source/blender/editors/mesh/bmesh_tools.c	2012-03-03 12:49:03 UTC (rev 44619)
@@ -1345,52 +1345,38 @@
 	BMEdge *eed;
 	BMIter iter;
 	const int do_ccw = RNA_enum_get(op->ptr, "direction") == 1;
-	int do_deselect = FALSE; /* do we deselect */
-	
-	if (!(em->bm->totfacesel == 2 || em->bm->totedgesel == 1)) {
-		BKE_report(op->reports, RPT_ERROR, "Select one edge or two adjacent faces");
+	int tot = 0;
+
+	if (em->bm->totedgesel == 0) {
+		BKE_report(op->reports, RPT_ERROR, "Select edges or face pairs for edge loops to rotate about");
 		return OPERATOR_CANCELLED;
 	}
 
 	/* first see if we have two adjacent faces */
 	BM_ITER(eed, &iter, em->bm, BM_EDGES_OF_MESH, NULL) {
-		if (BM_edge_face_count(eed) == 2) {
-			if ((BM_elem_flag_test(eed->l->f, BM_ELEM_SELECT) && BM_elem_flag_test(eed->l->radial_next->f, BM_ELEM_SELECT))
-				 && !(BM_elem_flag_test(eed->l->f, BM_ELEM_HIDDEN) || BM_elem_flag_test(eed->l->radial_next->f, BM_ELEM_HIDDEN)))
-			{
-				break;
+		BM_elem_flag_disable(eed, BM_ELEM_TAG);
+		if (BM_elem_flag_test(eed, BM_ELEM_SELECT)) {
+			BMFace *fa, *fb;
+			if (BM_edge_face_pair(eed, &fa, &fb)) {
+				/* if both faces are selected we rotate between them,
+				 * otherwise - rotate between 2 unselected - but not mixed */
+				if (BM_elem_flag_test(fa, BM_ELEM_SELECT) == BM_elem_flag_test(fb, BM_ELEM_SELECT)) {
+					BM_elem_flag_enable(eed, BM_ELEM_TAG);
+					tot++;
+				}
 			}
 		}
 	}
 	
 	/* ok, we don't have two adjacent faces, but we do have two selected ones.
 	 * that's an error condition.*/
-	if (!eed && em->bm->totfacesel == 2) {
-		BKE_report(op->reports, RPT_ERROR, "Select one edge or two adjacent faces");
+	if (tot == 0) {
+		BKE_report(op->reports, RPT_ERROR, "Could not find any selected edges that can be rotated");
 		return OPERATOR_CANCELLED;
 	}
-
-	if (!eed) {
-		BM_ITER(eed, &iter, em->bm, BM_EDGES_OF_MESH, NULL) {
-			if (BM_elem_flag_test(eed, BM_ELEM_SELECT)) {
-				/* de-select the edge before */
-				do_deselect = TRUE;
-				break;
-			}
-		}
-	}
-
-	/* this should never happen */
-	if (!eed)
-		return OPERATOR_CANCELLED;
 	
-	EDBM_InitOpf(em, &bmop, op, "edgerotate edges=%e ccw=%b", eed, do_ccw);
+	EDBM_InitOpf(em, &bmop, op, "edgerotate edges=%he ccw=%b", BM_ELEM_TAG, do_ccw);
 
-	/* avoid adding to the selection if we start off with only a selected edge,
-	 * we could also just deselect the single edge easily but use the BMO api
-	 * since it seems this is more 'correct' */
-	if (do_deselect) BMO_slot_buffer_hflag_disable(em->bm, &bmop, "edges", BM_ELEM_SELECT, BM_EDGE, TRUE);
-
 	BMO_op_exec(em->bm, &bmop);
 	BMO_slot_buffer_hflag_enable(em->bm, &bmop, "edgeout", BM_ELEM_SELECT, BM_EDGE, TRUE);
 




More information about the Bf-blender-cvs mailing list