[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [21929] branches/bmesh/blender/source/ blender: bmeshafied edge rotate.

Joseph Eagar joeedh at gmail.com
Sun Jul 26 16:58:34 CEST 2009


Revision: 21929
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21929
Author:   joeedh
Date:     2009-07-26 16:58:31 +0200 (Sun, 26 Jul 2009)

Log Message:
-----------
bmeshafied edge rotate.

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/bmesh/bmesh.h
    branches/bmesh/blender/source/blender/bmesh/bmesh_error.h
    branches/bmesh/blender/source/blender/bmesh/bmesh_operator_api.h
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mods.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators_private.h
    branches/bmesh/blender/source/blender/bmesh/operators/utils.c
    branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c
    branches/bmesh/blender/source/blender/editors/mesh/editmesh_tools.c

Modified: branches/bmesh/blender/source/blender/bmesh/bmesh.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh.h	2009-07-26 13:26:59 UTC (rev 21928)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh.h	2009-07-26 14:58:31 UTC (rev 21929)
@@ -290,6 +290,9 @@
   be removed in the future.*/
 BMEdge *BM_Connect_Verts(BMesh *bm, BMVert *v1, BMVert *v2, BMFace **nf);
 
+/*rotates an edge topologically, either clockwise (if ccw=0) or counterclockwise
+  (if ccw is 1).*/
+BMEdge *BM_Rotate_Edge(BMesh *bm, BMEdge *e, int ccw);
 
 /*updates a face normal*/
 void BM_Face_UpdateNormal(BMesh *bm, BMFace *f);
@@ -300,6 +303,7 @@
 /*update a vert normal (but not the faces incident on it)*/
 void BM_Vert_UpdateNormal(BMesh *bm, BMVert *v);
 
+void BM_flip_normal(BMesh *bm, BMFace *f);
 
 /*dissolves all faces around a vert, and removes it.*/
 int BM_Dissolve_Disk(BMesh *bm, BMVert *v);

Modified: branches/bmesh/blender/source/blender/bmesh/bmesh_error.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh_error.h	2009-07-26 13:26:59 UTC (rev 21928)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh_error.h	2009-07-26 14:58:31 UTC (rev 21929)
@@ -37,6 +37,7 @@
 #define BMERR_DISSOLVEVERTS_FAILED		6
 #define BMERR_TESSELATION			7
 #define BMERR_NONMANIFOLD			8
+#define BMERR_INVALID_SELECTION			9
 
 static char *bmop_error_messages[] = {
        0,
@@ -47,7 +48,8 @@
        "Could not dissolve faces",
        "Could not dissolve vertices",
        "Tesselation error",
-       "Can not deal with non-manifold geometry"
+       "Can not deal with non-manifold geometry",
+       "Invalid selection",
 };
 
 #endif /* _BMESH_ERROR_H */
\ No newline at end of file

Modified: branches/bmesh/blender/source/blender/bmesh/bmesh_operator_api.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh_operator_api.h	2009-07-26 13:26:59 UTC (rev 21928)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh_operator_api.h	2009-07-26 14:58:31 UTC (rev 21929)
@@ -79,7 +79,7 @@
 		void *buf;
 		GHash *ghash;
 	} data;
-}BMOpSlot;
+} BMOpSlot;
 
 #define BMOP_MAX_SLOTS			16 /*way more than probably needed*/
 
@@ -158,14 +158,15 @@
      %f - put float in slot
      %p - put pointer in slot
      %h[f/e/v] - put elements with a header flag in slot.
-          the letters after %h define which element types to use,
-	  so e.g. %hf will do faces, %hfe will do faces and edges,
-	  %hv will do verts, etc.  must pass in at least one
-	  element type letter.
+                  the letters after %h define which element types to use,
+	          so e.g. %hf will do faces, %hfe will do faces and edges,
+	          %hv will do verts, etc.  must pass in at least one
+	          element type letter.
      %f[f/e/v] - same as %h, except it deals with tool flags instead of
                   header flags.
      %a[f/e/v] - pass all elements (of types specified by f/e/v) to the
-                 slot.
+                  slot.
+     %e        - pass in a single element.
      %v - pointer to a float vector of length 3.
      %m[3/4] - matrix, 3/4 refers to the matrix size, 3 or 4.  the
                corrusponding argument must be a pointer to

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mods.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mods.c	2009-07-26 13:26:59 UTC (rev 21928)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mods.c	2009-07-26 14:58:31 UTC (rev 21929)
@@ -415,3 +415,53 @@
 	V_FREE(verts);
 	return ret;
 }
+
+/*
+            BM Rotate Edge
+
+    Spins an edge topologically, either counter-clockwise or clockwise.
+    If ccw is true, the edge is spun counter-clockwise, otherwise it is
+    spun clockwise.
+    
+    Returns the spun edge.  Note that this works by dissolving the edge
+    then re-creating it, so the returned edge won't have the same pointer
+    address as the original one.
+
+    Returns NULL on error (e.g., if the edge isn't surrounded by exactly
+    two faces).
+*/
+BMEdge *BM_Rotate_Edge(BMesh *bm, BMEdge *e, int ccw)
+{
+	BMVert *v1, *v2;
+	BMLoop *l, *l1, *l2, *nl;
+	BMFace *f;
+	BMIter liter;
+
+	v1 = e->v1;
+	v2 = e->v2;
+
+	if (BM_Edge_FaceCount(e) != 2)
+		return NULL;
+
+	f = BM_Join_Faces(bm, e->loop->f, ((BMLoop*)e->loop->radial.next->data)->f, e);
+	
+	BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, f) {
+		if (l->v == v1)
+			l1 = l;
+		else if (l->v == v2)
+			l2 = l;
+	}
+	
+	if (ccw) {
+		l1 = (BMLoop*) l1->head.prev;
+		l2 = (BMLoop*) l2->head.prev;
+	} else {
+		l1 = (BMLoop*) l1->head.next;
+		l2 = (BMLoop*) l2->head.next;
+	}
+
+	if (!BM_Split_Face(bm, f, l1->v, l2->v, &nl, NULL))
+		return NULL;
+
+	return nl->e;
+}

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c	2009-07-26 13:26:59 UTC (rev 21928)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c	2009-07-26 14:58:31 UTC (rev 21929)
@@ -4,6 +4,16 @@
 
 /*do not rename any operator or slot names! otherwise you must go 
   through the code and find all references to them!*/
+BMOpDefine def_edgerotate = {
+	"edgerotate",
+	{{BMOP_OPSLOT_ELEMENT_BUF, "edges"},
+	 {BMOP_OPSLOT_ELEMENT_BUF, "edgeout"}, //newly spun edges
+   	 {BMOP_OPSLOT_INT, "ccw"}, //rotate edge counter-clockwise if true, othewise clockwise
+	{0} /*null-terminating sentinel*/,
+	},
+	bmesh_edgerotate_exec,
+	0
+};
 
 
 BMOpDefine def_reversefaces = {
@@ -358,6 +368,7 @@
 	&def_mirror,
 	&def_edgesplit,
 	&def_reversefaces,
+	&def_edgerotate,
 };
 
 int bmesh_total_ops = (sizeof(opdefines) / sizeof(void*));

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators.c	2009-07-26 13:26:59 UTC (rev 21928)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators.c	2009-07-26 14:58:31 UTC (rev 21929)
@@ -1200,6 +1200,17 @@
 				state = 1;
 				break;
 			}
+			case 'e': {
+				BMHeader *ele = va_arg(vlist, void*);
+				BMOpSlot *slot = BMO_GetSlot(op, slotname);
+
+				slot->data.buf = BLI_memarena_alloc(op->arena, sizeof(void*)*4);
+				slot->len = 1;
+				*((void**)slot->data.buf) = ele;
+
+				state = 1;
+				break;
+			}
 			case 's': {
 				BMOperator *op2 = va_arg(vlist, void*);
 				char *slotname2 = va_arg(vlist, char*);

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators_private.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators_private.h	2009-07-26 13:26:59 UTC (rev 21928)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators_private.h	2009-07-26 14:58:31 UTC (rev 21929)
@@ -37,5 +37,6 @@
 void bmesh_mirror_exec(BMesh *bm, BMOperator *op);
 void esplit_exec(BMesh *bm, BMOperator *op);
 void bmesh_reversefaces_exec(BMesh *bm, BMOperator *op);
+void bmesh_edgerotate_exec(BMesh *bm, BMOperator *op);
 
 #endif

Modified: branches/bmesh/blender/source/blender/bmesh/operators/utils.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/operators/utils.c	2009-07-26 13:26:59 UTC (rev 21928)
+++ branches/bmesh/blender/source/blender/bmesh/operators/utils.c	2009-07-26 14:58:31 UTC (rev 21929)
@@ -57,8 +57,6 @@
   sure the transform op is working, since initially
   only this one will be used.*/
 void bmesh_translate_exec(BMesh *bm, BMOperator *op) {
-	BMOIter iter;
-	BMVert *v;
 	float mat[4][4], vec[3];
 	
 	BMO_Get_Vec(op, "vec", vec);
@@ -70,9 +68,7 @@
 }
 
 void bmesh_rotate_exec(BMesh *bm, BMOperator *op) {
-	BMOIter iter;
-	BMVert *v;
-	float mat[4][4], vec[3];
+	float vec[3];
 	
 	BMO_Get_Vec(op, "cent", vec);
 	
@@ -89,10 +85,27 @@
 }
 
 void bmesh_reversefaces_exec(BMesh *bm, BMOperator *op) {
-	BMOIter iter;
+	BMOIter siter;
 	BMFace *f;
 
-	BMO_ITER(f, &iter, bm, op, "faces", BM_FACE) {
+	BMO_ITER(f, &siter, bm, op, "faces", BM_FACE) {
 		BM_flip_normal(bm, f);
 	}
-}
\ No newline at end of file
+}
+
+void bmesh_edgerotate_exec(BMesh *bm, BMOperator *op) {
+	BMOIter siter;
+	BMEdge *e, *e2;
+	int ccw = BMO_Get_Int(op, "ccw");
+
+	BMO_ITER(e, &siter, bm, op, "edges", BM_EDGE) {
+		if (!(e2 = BM_Rotate_Edge(bm, e, ccw))) {
+			BMO_RaiseError(bm, op, BMERR_INVALID_SELECTION, "Could not rotate edge");
+			return;
+		}
+
+		BMO_SetFlag(bm, e2, 1);
+	}
+
+	BMO_Flag_To_Slot(bm, op, "edgeout", 1, BM_EDGE);
+}

Modified: branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c	2009-07-26 13:26:59 UTC (rev 21928)
+++ branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c	2009-07-26 14:58:31 UTC (rev 21929)
@@ -890,7 +890,7 @@
 static int dupli_extrude_cursor(bContext *C, wmOperator *op, wmEvent *event)
 {
 	ViewContext vc;
-	BMVert *eve, *v1;
+	BMVert *v1;
 	BMIter iter;
 	float min[3], max[3];
 	int done= 0;
@@ -1480,3 +1480,140 @@
 	ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
 }
 
+#define DIRECTION_CW	1
+#define DIRECTION_CCW	2
+
+static const EnumPropertyItem direction_items[]= {
+	{DIRECTION_CW, "CW", 0, "Clockwise", ""},
+	{DIRECTION_CCW, "CCW", 0, "Counter Clockwise", ""},
+	{0, NULL, 0, NULL, NULL}};
+
+/* only accepts 1 selected edge, or 2 selected faces */
+static int edge_rotate_selected(bContext *C, wmOperator *op)
+{
+	Scene *scene= CTX_data_scene(C);
+	Object *obedit= CTX_data_edit_object(C);
+	BMEditMesh *em= ((Mesh *)obedit->data)->edit_btmesh;
+	BMOperator bmop;
+	BMOIter siter;
+	BMEdge *eed;
+	BMFace *efa;
+	BMIter iter;
+	int ccw = RNA_int_get(op->ptr, "direction") == 1; // direction == 2 when clockwise and ==1 for counter CW.
+	short edgeCount = 0;
+	
+	if (!(em->bm->totfacesel == 2 || em->bm->totedgesel == 1)) {
+		BKE_report(op->reports, RPT_ERROR, "Select one edge or two adjacent faces");
+		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_FaceCount(eed) == 2) {

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list