diff options
Diffstat (limited to 'source/blender/editors/mesh/loopcut.c')
-rw-r--r-- | source/blender/editors/mesh/loopcut.c | 72 |
1 files changed, 48 insertions, 24 deletions
diff --git a/source/blender/editors/mesh/loopcut.c b/source/blender/editors/mesh/loopcut.c index 13538a6f218..933aed0a758 100644 --- a/source/blender/editors/mesh/loopcut.c +++ b/source/blender/editors/mesh/loopcut.c @@ -32,11 +32,11 @@ #include <stdio.h> #include "DNA_ID.h" +#include "DNA_object_types.h" #include "DNA_screen_types.h" #include "DNA_scene_types.h" #include "DNA_userdef_types.h" #include "DNA_windowmanager_types.h" -#include "DNA_object_types.h" #include "MEM_guardedalloc.h" @@ -46,12 +46,16 @@ #include "BLI_dynstr.h" /*for WM_operator_pystring */ #include "BLI_editVert.h" #include "BLI_math.h" +#include "BLI_utildefines.h" #include "BKE_blender.h" #include "BKE_context.h" #include "BKE_depsgraph.h" -#include "BKE_scene.h" #include "BKE_mesh.h" +#include "BKE_modifier.h" +#include "BKE_report.h" +#include "BKE_scene.h" +#include "BKE_array_mallocn.h" #include "BIF_gl.h" #include "BIF_glutil.h" /* for paint cursor */ @@ -94,13 +98,15 @@ typedef struct tringselOpData { } tringselOpData; /* modal loop selection drawing callback */ -static void ringsel_draw(const bContext *C, ARegion *ar, void *arg) +static void ringsel_draw(const bContext *C, ARegion *UNUSED(ar), void *arg) { - int i; + View3D *v3d = CTX_wm_view3d(C); tringselOpData *lcd = arg; + int i; if (lcd->totedge > 0) { - glDisable(GL_DEPTH_TEST); + if(v3d && v3d->zbuf) + glDisable(GL_DEPTH_TEST); glPushMatrix(); glMultMatrixf(lcd->ob->obmat); @@ -114,7 +120,8 @@ static void ringsel_draw(const bContext *C, ARegion *ar, void *arg) glEnd(); glPopMatrix(); - glEnable(GL_DEPTH_TEST); + if(v3d && v3d->zbuf) + glEnable(GL_DEPTH_TEST); } } @@ -248,7 +255,7 @@ static void edgering_sel(tringselOpData *lcd, int previewlines, int select) lcd->totedge = tot; } -static void ringsel_find_edge(tringselOpData *lcd, const bContext *C, ARegion *ar, int cuts) +static void ringsel_find_edge(tringselOpData *lcd, int cuts) { if (lcd->eed) { edgering_sel(lcd, cuts, 0); @@ -265,9 +272,12 @@ static void ringsel_finish(bContext *C, wmOperator *op) int cuts= (lcd->do_cut)? RNA_int_get(op->ptr,"number_cuts"): 0; if (lcd->eed) { + EditMesh *em = BKE_mesh_get_editmesh(lcd->ob->data); + edgering_sel(lcd, cuts, 1); + if (lcd->do_cut) { - EditMesh *em = BKE_mesh_get_editmesh(lcd->ob->data); + esubdivideflag(lcd->ob, em, SELECT, 0.0f, 0.0f, 0, cuts, 0, SUBDIV_SELECT_LOOPCUT); /* force edge slide to edge select mode in in face select mode */ @@ -282,10 +292,17 @@ static void ringsel_finish(bContext *C, wmOperator *op) WM_event_add_notifier(C, NC_SCENE|ND_TOOLSETTINGS, CTX_data_scene(C)); } - DAG_id_flush_update(lcd->ob->data, OB_RECALC_DATA); + DAG_id_tag_update(lcd->ob->data, 0); WM_event_add_notifier(C, NC_GEOM|ND_DATA, lcd->ob->data); } else { + + /* sets as active, useful for other tools */ + if(em->selectmode & SCE_SELECT_VERTEX) + EM_store_selection(em, lcd->eed->v1, EDITVERT); + if(em->selectmode & SCE_SELECT_EDGE) + EM_store_selection(em, lcd->eed, EDITEDGE); + EM_selectmode_flush(lcd->em); WM_event_add_notifier(C, NC_GEOM|ND_SELECT, lcd->ob->data); } @@ -293,7 +310,7 @@ static void ringsel_finish(bContext *C, wmOperator *op) } /* called when modal loop selection is done... */ -static void ringsel_exit (bContext *C, wmOperator *op) +static void ringsel_exit(wmOperator *op) { tringselOpData *lcd= op->customdata; @@ -332,10 +349,10 @@ static int ringsel_init (bContext *C, wmOperator *op, int do_cut) return 1; } -static int ringcut_cancel (bContext *C, wmOperator *op) +static int ringcut_cancel (bContext *UNUSED(C), wmOperator *op) { /* this is just a wrapper around exit() */ - ringsel_exit(C, op); + ringsel_exit(op); return OPERATOR_CANCELLED; } @@ -353,7 +370,7 @@ static int ringsel_invoke (bContext *C, wmOperator *op, wmEvent *evt) lcd = op->customdata; if (lcd->em->selectmode == SCE_SELECT_FACE) { - ringsel_exit(C, op); + ringsel_exit(op); WM_operator_name_call(C, "MESH_OT_loop_select", WM_OP_INVOKE_REGION_WIN, NULL); return OPERATOR_CANCELLED; } @@ -363,25 +380,29 @@ static int ringsel_invoke (bContext *C, wmOperator *op, wmEvent *evt) edge = findnearestedge(&lcd->vc, &dist); if(!edge) { - ringsel_exit(C, op); + ringsel_exit(op); return OPERATOR_CANCELLED; } lcd->eed = edge; - ringsel_find_edge(lcd, C, lcd->ar, 1); + ringsel_find_edge(lcd, 1); ringsel_finish(C, op); - ringsel_exit(C, op); + ringsel_exit(op); return OPERATOR_FINISHED; } static int ringcut_invoke (bContext *C, wmOperator *op, wmEvent *evt) { + Object *obedit= CTX_data_edit_object(C); tringselOpData *lcd; EditEdge *edge; int dist = 75; + if(modifiers_isDeformedByLattice(obedit) || modifiers_isDeformedByArmature(obedit)) + BKE_report(op->reports, RPT_WARNING, "Loop cut doesn't work well on deformed edit mesh display"); + view3d_operator_needs_opengl(C); if (!ringsel_init(C, op, 1)) @@ -397,9 +418,10 @@ static int ringcut_invoke (bContext *C, wmOperator *op, wmEvent *evt) edge = findnearestedge(&lcd->vc, &dist); if (edge != lcd->eed) { lcd->eed = edge; - ringsel_find_edge(lcd, C, lcd->ar, 1); + ringsel_find_edge(lcd, 1); } - + ED_area_headerprint(CTX_wm_area(C), "Select a ring to be cut, use mouse-wheel or page-up/down for number of cuts"); + return OPERATOR_RUNNING_MODAL; } @@ -418,7 +440,8 @@ static int ringcut_modal (bContext *C, wmOperator *op, wmEvent *event) ED_region_tag_redraw(lcd->ar); ringsel_finish(C, op); - ringsel_exit(C, op); + ringsel_exit(op); + ED_area_headerprint(CTX_wm_area(C), NULL); return OPERATOR_FINISHED; } @@ -430,6 +453,7 @@ static int ringcut_modal (bContext *C, wmOperator *op, wmEvent *event) if (event->val == KM_RELEASE) { /* cancel */ ED_region_tag_redraw(lcd->ar); + ED_area_headerprint(CTX_wm_area(C), NULL); return ringcut_cancel(C, op); } @@ -441,7 +465,7 @@ static int ringcut_modal (bContext *C, wmOperator *op, wmEvent *event) if (event->val == KM_PRESS) { cuts++; RNA_int_set(op->ptr, "number_cuts",cuts); - ringsel_find_edge(lcd, C, lcd->ar, cuts); + ringsel_find_edge(lcd, cuts); ED_region_tag_redraw(lcd->ar); } @@ -451,7 +475,7 @@ static int ringcut_modal (bContext *C, wmOperator *op, wmEvent *event) if (event->val == KM_PRESS) { cuts=MAX2(cuts-1,1); RNA_int_set(op->ptr,"number_cuts",cuts); - ringsel_find_edge(lcd, C, lcd->ar,cuts); + ringsel_find_edge(lcd, cuts); ED_region_tag_redraw(lcd->ar); } @@ -466,7 +490,7 @@ static int ringcut_modal (bContext *C, wmOperator *op, wmEvent *event) if (edge != lcd->eed) { lcd->eed = edge; - ringsel_find_edge(lcd, C, lcd->ar, cuts); + ringsel_find_edge(lcd, cuts); } ED_region_tag_redraw(lcd->ar); @@ -487,7 +511,7 @@ void MESH_OT_edgering_select (wmOperatorType *ot) /* callbacks */ ot->invoke= ringsel_invoke; - ot->poll= ED_operator_editmesh_view3d; + ot->poll= ED_operator_editmesh_region_view3d; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -506,7 +530,7 @@ void MESH_OT_loopcut (wmOperatorType *ot) ot->invoke= ringcut_invoke; ot->modal= ringcut_modal; ot->cancel= ringcut_cancel; - ot->poll= ED_operator_editmesh_view3d; + ot->poll= ED_operator_editmesh_region_view3d; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO|OPTYPE_BLOCKING; |