From b8b6fad6407beba68a6307ab57a669f223ff53bf Mon Sep 17 00:00:00 2001 From: Joseph Eagar Date: Wed, 10 Mar 2010 11:16:26 +0000 Subject: [PATCH] fixed edge slide to an extent, though it still needs work (finding correct transform direction vector, uvs/vcols, etc). also got delete and vert connect (ykey) to work again. --- source/blender/bmesh/intern/bmesh_marking.c | 20 ++++++++++++++++++++ source/blender/bmesh/operators/subdivideop.c | 17 +++++++++++++++++ source/blender/editors/mesh/bmesh_tools.c | 2 +- source/blender/editors/mesh/loopcut.c | 5 +++-- source/blender/editors/mesh/mesh_ops.c | 3 ++- source/blender/editors/transform/transform.c | 16 +++++++++------- 6 files changed, 52 insertions(+), 11 deletions(-) diff --git a/source/blender/bmesh/intern/bmesh_marking.c b/source/blender/bmesh/intern/bmesh_marking.c index ff49b8d9468..94d4069bc0b 100644 --- a/source/blender/bmesh/intern/bmesh_marking.c +++ b/source/blender/bmesh/intern/bmesh_marking.c @@ -118,6 +118,9 @@ void BM_SelectMode_Flush(BMesh *bm) void BM_Select_Vert(BMesh *bm, BMVert *v, int select) { + BMIter iter; + BMEdge *e; + if(select) { if (!BM_TestHFlag(v, BM_SELECT)) bm->totvertsel += 1; BM_SetHFlag(v, BM_SELECT); @@ -125,6 +128,23 @@ void BM_Select_Vert(BMesh *bm, BMVert *v, int select) if (BM_TestHFlag(v, BM_SELECT)) bm->totvertsel -= 1; BM_ClearHFlag(v, BM_SELECT); } + + /*BMESH_TODO hrm, not sure if flushing here is such a good idea. . . + but probably easier then calling a EDBM_Normalize_Selection after + each tool?*/ +#if 0 + BM_ITER(e, &iter, bm, BM_EDGES_OF_VERT, v) { + if (!BM_TestHFlag(e, BM_SELECT) && BM_TestHFlag(e->v1, BM_SELECT) + && BM_TestHFlag(e->v2, BM_SELECT)) { + BM_SetHFlag(e, BM_SELECT); + bm->totedgesel += 1; + } else if (BM_TestHFlag(e, BM_SELECT) && (!BM_TestHFlag(e->v1, BM_SELECT) + || !BM_TestHFlag(e->v2, BM_SELECT))) { + BM_ClearHFlag(e, BM_SELECT); + bm->totedgesel -= 1; + } + } +#endif } /* diff --git a/source/blender/bmesh/operators/subdivideop.c b/source/blender/bmesh/operators/subdivideop.c index 1a351b95f51..e80515f1484 100644 --- a/source/blender/bmesh/operators/subdivideop.c +++ b/source/blender/bmesh/operators/subdivideop.c @@ -1006,6 +1006,23 @@ void BM_esubdivideflag(Object *obedit, BMesh *bm, int flag, float smooth, ele = BMO_IterNew(&iter, bm, &op, "outinner", BM_EDGE|BM_VERT); for (; ele; ele=BMO_IterStep(&iter)) { BM_Select(bm, ele, 1); + + if (ele->type == BM_VERT) { + BMEdge *e; + BMIter eiter; + + BM_ITER(e, &eiter, bm, BM_EDGES_OF_VERT, ele) { + if (!BM_TestHFlag(e, BM_SELECT) && BM_TestHFlag(e->v1, BM_SELECT) + && BM_TestHFlag(e->v2, BM_SELECT)) { + BM_SetHFlag(e, BM_SELECT); + bm->totedgesel += 1; + } else if (BM_TestHFlag(e, BM_SELECT) && (!BM_TestHFlag(e->v1, BM_SELECT) + || !BM_TestHFlag(e->v2, BM_SELECT))) { + BM_ClearHFlag(e, BM_SELECT); + bm->totedgesel -= 1; + } + } + } } } diff --git a/source/blender/editors/mesh/bmesh_tools.c b/source/blender/editors/mesh/bmesh_tools.c index 1a0ebecc2ba..ff852a51a2e 100644 --- a/source/blender/editors/mesh/bmesh_tools.c +++ b/source/blender/editors/mesh/bmesh_tools.c @@ -1158,7 +1158,7 @@ void MESH_OT_delete(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /*props */ - RNA_def_enum(ot->srna, "type", prop_mesh_delete_types, 10, "Type", "Method used for deleting mesh data"); + ot->prop = RNA_def_enum(ot->srna, "type", prop_mesh_delete_types, 10, "Type", "Method used for deleting mesh data"); } diff --git a/source/blender/editors/mesh/loopcut.c b/source/blender/editors/mesh/loopcut.c index 0e5710386e4..92cdc0e1ac6 100644 --- a/source/blender/editors/mesh/loopcut.c +++ b/source/blender/editors/mesh/loopcut.c @@ -281,16 +281,17 @@ static void ringsel_find_edge(tringselOpData *lcd, const bContext *C, ARegion *a static void ringsel_finish(bContext *C, wmOperator *op) { tringselOpData *lcd= op->customdata; - int cuts= RNA_int_get(op->ptr,"number_cuts"); + int cuts= RNA_int_get(op->ptr, "number_cuts"); if (lcd->eed) { edgering_sel(lcd, cuts, 1); if (lcd->do_cut) { BMEditMesh *em = lcd->em; + BM_esubdivideflag(lcd->ob, em->bm, BM_SELECT, 0.0f, 0.0f, 0, cuts, SUBDIV_SELECT_LOOPCUT, SUBD_PATH, 0, 0); - + WM_event_add_notifier(C, NC_GEOM|ND_SELECT|ND_DATA, lcd->ob->data); DAG_id_flush_update(lcd->ob->data, OB_RECALC_DATA); } diff --git a/source/blender/editors/mesh/mesh_ops.c b/source/blender/editors/mesh/mesh_ops.c index 3daaf5863d5..0aa7dfee67d 100644 --- a/source/blender/editors/mesh/mesh_ops.c +++ b/source/blender/editors/mesh/mesh_ops.c @@ -154,6 +154,7 @@ void ED_operatortypes_mesh(void) WM_operatortype_append(MESH_OT_solidify); WM_operatortype_append(MESH_OT_select_nth); + WM_operatortype_append(MESH_OT_vert_connect); } int ED_operator_editmesh_face_select(bContext *C) @@ -290,7 +291,7 @@ void ED_keymap_mesh(wmKeyConfig *keyconf) WM_keymap_add_menu(keymap, "INFO_MT_mesh_add", AKEY, KM_PRESS, KM_SHIFT, 0); WM_keymap_add_item(keymap, "MESH_OT_separate", PKEY, KM_PRESS, 0, 0); - WM_keymap_add_item(keymap, "MESH_OT_split", YKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "MESH_OT_vert_connect", YKEY, KM_PRESS, 0, 0); /* use KM_CLICK because same key is used for tweaks */ WM_keymap_add_item(keymap, "MESH_OT_dupli_extrude_cursor", ACTIONMOUSE, KM_CLICK, KM_CTRL, 0); diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index f3282ed9c9c..48f28368a76 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -4139,7 +4139,7 @@ static BMLoop *get_next_loop(BMesh *bm, BMVert *v, BMLoop *l, VECCOPY(vec, a); return l; } else { - sub_v3_v3v3(n, BM_OtherEdgeVert(l->e, l->v)->co, l->v->co); + sub_v3_v3v3(n, BM_OtherEdgeVert(l->e, v)->co, v->co); add_v3_v3v3(a, a, n); i += 1; } @@ -4243,8 +4243,6 @@ static int createSlideVerts(TransInfo *t) if (!v) break; - BMINDEX_SET(v, 0); - if (!v->edge) continue; @@ -4256,8 +4254,6 @@ static int createSlideVerts(TransInfo *t) /*first, rewind*/ numsel = 0; do { - BMINDEX_SET(v, 0); - e = get_other_edge(bm, v, e); if (!e) { e = v->edge; @@ -4272,6 +4268,8 @@ static int createSlideVerts(TransInfo *t) v = BM_OtherEdgeVert(e, v); } while (e != first->edge); + BMINDEX_SET(v, 0); + l1 = l2 = l = NULL; l1 = e->loop; l2 = e->loop->radial.next->data; @@ -4311,21 +4309,25 @@ static int createSlideVerts(TransInfo *t) e1 = e; e = get_other_edge(bm, v, e); if (!e) { + //v2=v, v = BM_OtherEdgeVert(l1->e, v); + sv = tempsv + j + 1; sv->v = v; sv->origvert = *v; l = BM_OtherFaceLoop(l1->e, l1->f, v); sv->up = BM_OtherEdgeVert(l->e, v); + sub_v3_v3v3(sv->upvec, BM_OtherEdgeVert(l->e, v)->co, v->co); if (l2) { l = BM_OtherFaceLoop(l2->e, l2->f, v); sv->down = BM_OtherEdgeVert(l->e, v); + sub_v3_v3v3(sv->downvec, BM_OtherEdgeVert(l->e, v)->co, v->co); } BMINDEX_SET(v, 0); BMINDEX_SET(v2, 0); - + j += 2; break; } @@ -4902,7 +4904,7 @@ int doEdgeSlide(TransInfo *t, float perc) add_v3_v3v3(sv->v->co, sv->origvert.co, vec); } else { VECCOPY(vec, sv->downvec); - mul_v3_fl(vec, perc); + mul_v3_fl(vec, -perc); add_v3_v3v3(sv->v->co, sv->origvert.co, vec); } }