Index: source/blender/editors/mesh/mesh_intern.h =================================================================== --- source/blender/editors/mesh/mesh_intern.h (revision 41885) +++ source/blender/editors/mesh/mesh_intern.h (working copy) @@ -199,6 +199,9 @@ #define SUBDIV_CORNER_INNERVERT 1 #define SUBDIV_CORNER_FAN 2 +/* maximum of cuts for input using the keyboard */ +#define CUTMAXIMUM 200 + extern EnumPropertyItem corner_type_items[]; void join_triangles(EditMesh *em); Index: source/blender/editors/mesh/loopcut.c =================================================================== --- source/blender/editors/mesh/loopcut.c (revision 41885) +++ source/blender/editors/mesh/loopcut.c (working copy) @@ -98,6 +98,8 @@ int extend; int do_cut; + int ringcut_holdnum; + int ringcut_keys; } tringselOpData; /* modal loop selection drawing callback */ @@ -345,6 +347,8 @@ lcd->em= BKE_mesh_get_editmesh((Mesh *)lcd->ob->data); lcd->extend = do_cut ? 0 : RNA_boolean_get(op->ptr, "extend"); lcd->do_cut = do_cut; + lcd->ringcut_holdnum = -1; + lcd->ringcut_keys = 0; em_setup_viewcontext(C, &lcd->vc); ED_region_tag_redraw(lcd->ar); @@ -454,6 +458,8 @@ case RIGHTMOUSE: /* abort */ // XXX hardcoded case ESCKEY: if (event->val == KM_RELEASE) { + /* reset to first level numeric entry */ + lcd->ringcut_keys = 0; /* cancel */ ED_region_tag_redraw(lcd->ar); ED_area_headerprint(CTX_wm_area(C), NULL); @@ -463,9 +469,95 @@ ED_region_tag_redraw(lcd->ar); break; + /* using the keyboard to input the number of cuts */ + case PAD9: + case NINEKEY: + case PAD8: + case EIGHTKEY: + case PAD7: + case SEVENKEY: + case PAD6: + case SIXKEY: + case PAD5: + case FIVEKEY: + case PAD4: + case FOURKEY: + case PAD3: + case THREEKEY: + case PAD2: + case TWOKEY: + case PAD1: + case ONEKEY: + case PAD0: + case ZEROKEY: + case BACKSPACEKEY: + switch (event->type) { + case PAD9: + case NINEKEY: + lcd->ringcut_holdnum = 9; break; + case PAD8: + case EIGHTKEY: + lcd->ringcut_holdnum = 8;break; + case PAD7: + case SEVENKEY: + lcd->ringcut_holdnum = 7;break; + case PAD6: + case SIXKEY: + lcd->ringcut_holdnum = 6;break; + case PAD5: + case FIVEKEY: + lcd->ringcut_holdnum = 5;break; + case PAD4: + case FOURKEY: + lcd->ringcut_holdnum = 4;break; + case PAD3: + case THREEKEY: + lcd->ringcut_holdnum = 3;break; + case PAD2: + case TWOKEY: + lcd->ringcut_holdnum = 2;break; + case PAD1: + case ONEKEY: + lcd->ringcut_holdnum = 1;break; + case PAD0: + case ZEROKEY: + lcd->ringcut_holdnum = 0;break; + case BACKSPACEKEY: + lcd->ringcut_holdnum = -2;break; /* -2 used to identify backspace during logic */ + } + if (event->val == KM_PRESS) { + if(lcd->ringcut_holdnum >= 0){ + if(lcd->ringcut_keys == 0){ /* first level numeric entry */ + if(lcd->ringcut_holdnum > 0){ + cuts = lcd->ringcut_holdnum; + lcd->ringcut_keys++; + } + } else if(lcd->ringcut_keys > 0 && cuts*10 <= CUTMAXIMUM){ /* higher level numeric entry */ + cuts *= 10; + cuts += lcd->ringcut_holdnum; + lcd->ringcut_keys++; + } + } else if (lcd->ringcut_holdnum == -2){ /* backspace */ + if (lcd->ringcut_keys > 1){ + cuts /= 10; + lcd->ringcut_keys--; + } else { + cuts=1; + lcd->ringcut_keys = 0; + } + } + + RNA_int_set(op->ptr, "number_cuts",cuts); + ringsel_find_edge(lcd, cuts); + + ED_region_tag_redraw(lcd->ar); + } + break; case WHEELUPMOUSE: /* change number of cuts */ case PAGEUPKEY: + case PADPLUSKEY: if (event->val == KM_PRESS) { + lcd->ringcut_keys = 0; /* reset to first level numeric entry */ cuts++; RNA_int_set(op->ptr, "number_cuts",cuts); ringsel_find_edge(lcd, cuts); @@ -475,7 +567,9 @@ break; case WHEELDOWNMOUSE: /* change number of cuts */ case PAGEDOWNKEY: + case PADMINUS: if (event->val == KM_PRESS) { + lcd->ringcut_keys = 0; /* reset to first level numeric entry */ cuts=MAX2(cuts-1,1); RNA_int_set(op->ptr,"number_cuts",cuts); ringsel_find_edge(lcd, cuts); Index: source/blender/editors/mesh/editmesh_loop.c =================================================================== --- source/blender/editors/mesh/editmesh_loop.c (revision 41885) +++ source/blender/editors/mesh/editmesh_loop.c (working copy) @@ -315,7 +315,7 @@ case BACKSPACEKEY: holdnum = -2;break; } - if(holdnum >= 0 && numcuts*10 < 130){ + if(holdnum >= 0 && numcuts*10 < CUTMAXIMUM){ if(keys == 0){ // first level numeric entry if(holdnum > 0){ numcuts = holdnum;