[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