[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