diff options
Diffstat (limited to 'source/blender/editors')
-rw-r--r-- | source/blender/editors/include/ED_uvedit.h | 1 | ||||
-rw-r--r-- | source/blender/editors/space_api/spacetypes.c | 1 | ||||
-rw-r--r-- | source/blender/editors/transform/transform_conversions.c | 7 | ||||
-rw-r--r-- | source/blender/editors/uvedit/uvedit_draw.c | 5 | ||||
-rw-r--r-- | source/blender/editors/uvedit/uvedit_ops.c | 91 |
5 files changed, 92 insertions, 13 deletions
diff --git a/source/blender/editors/include/ED_uvedit.h b/source/blender/editors/include/ED_uvedit.h index 6e2adaca004..e11b8883a70 100644 --- a/source/blender/editors/include/ED_uvedit.h +++ b/source/blender/editors/include/ED_uvedit.h @@ -49,6 +49,7 @@ struct wmKeyConfig; /* uvedit_ops.c */ void ED_operatortypes_uvedit(void); void ED_keymap_uvedit(struct wmKeyConfig *keyconf); +void ED_operatormacros_uvedit(void); void ED_uvedit_assign_image(struct Main *bmain, struct Scene *scene, struct Object *obedit, struct Image *ima, struct Image *previma); bool ED_uvedit_minmax(struct Scene *scene, struct Image *ima, struct Object *obedit, float min[2], float max[2]); diff --git a/source/blender/editors/space_api/spacetypes.c b/source/blender/editors/space_api/spacetypes.c index 83040a26480..6ae2d2fbdc2 100644 --- a/source/blender/editors/space_api/spacetypes.c +++ b/source/blender/editors/space_api/spacetypes.c @@ -143,6 +143,7 @@ void ED_spacetypes_init(void) ED_operatormacros_curve(); ED_operatormacros_mask(); ED_operatormacros_sequencer(); + ED_operatormacros_uvedit(); /* register dropboxes (can use macros) */ spacetypes = BKE_spacetypes_list(); diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c index aecaa6528fc..73c0aedbf8c 100644 --- a/source/blender/editors/transform/transform_conversions.c +++ b/source/blender/editors/transform/transform_conversions.c @@ -2591,6 +2591,7 @@ static void createTransUVsNURBS(bContext *C, TransInfo *t) BPoint *pt; int count=0,num_bp,i; float aspx, aspy; + bool trim_selected; /* First see how many trim control points + knots we will be dragging (count) */ for (nu=cu->editnurb->nurbs.first; nu; nu=nu->next) { @@ -2600,10 +2601,11 @@ static void createTransUVsNURBS(bContext *C, TransInfo *t) for (i=0; i<ek->num_breaksv; i++) if (ek->breaksv[i].flag&SELECT) count++; for (nt=nu->trims.first; nt; nt=nt->next) { + trim_selected = nt->flag & SELECT; for (trimnu=nt->nurb_list.first; trimnu; trimnu=trimnu->next) { num_bp = trimnu->pntsu * trimnu->pntsv; for (i=0; i<num_bp; i++) - if (trimnu->bp[i].f1 & SELECT) count++; + if (trimnu->bp[i].f1&SELECT || trim_selected) count++; } } } @@ -2652,11 +2654,12 @@ static void createTransUVsNURBS(bContext *C, TransInfo *t) count += 1; } for (nt=nu->trims.first; nt; nt=nt->next) { + trim_selected = nt->flag & SELECT; for (trimnu=nt->nurb_list.first; trimnu; trimnu=trimnu->next) { num_bp = trimnu->pntsu * trimnu->pntsv; for (i=0; i<num_bp; i++) { pt = &trimnu->bp[i]; - if (pt->f1 & SELECT) { + if (pt->f1&SELECT || trim_selected) { td = &t->data[count]; td2d = &t->data2d[count]; td2d->loc[0] = pt->vec[0]; diff --git a/source/blender/editors/uvedit/uvedit_draw.c b/source/blender/editors/uvedit/uvedit_draw.c index b9a453eb020..e047f4f5460 100644 --- a/source/blender/editors/uvedit/uvedit_draw.c +++ b/source/blender/editors/uvedit/uvedit_draw.c @@ -1096,7 +1096,6 @@ static void draw_nurbuv(const struct bContext *C, ARegion *ar, Object *obedit) glShadeModel(GL_SMOOTH); for (nu=cu->editnurb->nurbs.first; nu; nu=nu->next) { if (!(nu->flag2&CU_SELECTED2)) continue; - resoltrim = nu->resol_trim; for (nt=nu->trims.first; nt; nt=nt->next) { glBegin(GL_LINE_STRIP); UI_ThemeColor(TH_WIRE); @@ -1118,7 +1117,6 @@ static void draw_nurbuv(const struct bContext *C, ARegion *ar, Object *obedit) /******* (Normalized Coordinates) draw trim curves *********/ for (nu=cu->editnurb->nurbs.first; nu; nu=nu->next) { if (!(nu->flag2&CU_SELECTED2)) continue; - resoltrim = nu->resol_trim; for (nt=nu->trims.first; nt; nt=nt->next) { glBegin(GL_LINE_STRIP); UI_ThemeColor(TH_WIRE); @@ -1133,7 +1131,7 @@ static void draw_nurbuv(const struct bContext *C, ARegion *ar, Object *obedit) UI_ThemeColor((nt->flag&SELECT)? TH_NURB_SEL_TRIM_ADD : TH_NURB_TRIM_ADD); break; } - j = BKE_nurbTrim_tess(nt, resoltrim, &trim_uv_pnts); + j = BKE_nurbTrim_tess(nt, &trim_uv_pnts); for (i=0; i<j; i++) { glVertex2f(trim_uv_pnts[i][0], trim_uv_pnts[i][1]); } @@ -1148,7 +1146,6 @@ static void draw_nurbuv(const struct bContext *C, ARegion *ar, Object *obedit) glBegin(GL_POINTS); for (nu=cu->editnurb->nurbs.first; nu; nu=nu->next) { if (!(nu->flag2&CU_SELECTED2)) continue; - resoltrim = nu->resol_trim; for (nt=nu->trims.first; nt; nt=nt->next) { /* if (!(nt->flag & SELECT)) continue; */ for (trimnu=nt->nurb_list.first; trimnu; trimnu=trimnu->next) { diff --git a/source/blender/editors/uvedit/uvedit_ops.c b/source/blender/editors/uvedit/uvedit_ops.c index 0ee2c6fe3bc..1f06cb0a229 100644 --- a/source/blender/editors/uvedit/uvedit_ops.c +++ b/source/blender/editors/uvedit/uvedit_ops.c @@ -2518,7 +2518,7 @@ static int nurbsuv_mouse_select(bContext *C, const float co[2], bool extend) { } /* Figure out nearest trim to click co */ for (nt=nu->trims.first; nt; nt=nt->next) { - num_trim_verts = BKE_nurbTrim_tess(nt, nu->resol_trim, &trim_verts); + num_trim_verts = BKE_nurbTrim_tess(nt, &trim_verts); for (i=0; i<num_trim_verts-1; i++) { dist = dist2_pt_lineseg(co, trim_verts[i][0], trim_verts[i][1], trim_verts[i+1][0], trim_verts[i+1][1]); if (dist<trim) { @@ -2610,6 +2610,60 @@ static void UV_OT_select(wmOperatorType *ot) "Location", "Mouse location in normalized coordinates, 0.0 to 1.0 is within the image bounds", -100.0f, 100.0f); } +static int nurbs_trim_duplicate(bContext *C, wmOperator *UNUSED(op)) +{ + Object *obedit = CTX_data_edit_object(C); + Curve *cu = (Curve*)obedit->data; + Nurb *nu, *trimnu; + NurbTrim *nt, *dup_nt, *first_dup_nt; + int i,num_bp; + + BLI_assert(obedit->type == OB_SURF); + for (nu=(Nurb*)cu->editnurb->nurbs.first; nu; nu=nu->next) { + first_dup_nt = NULL; + for (nt=(NurbTrim*)nu->trims.first; nt && nt!=first_dup_nt; nt=nt->next) { + /* First, propagate vertex selections to trim curve selections */ + for (trimnu=(Nurb*)nt->nurb_list.first; trimnu; trimnu=trimnu->next) { + num_bp = trimnu->pntsu * trimnu->pntsv; + for (i=0; i<num_bp; i++) { + if (trimnu->bp[i].f1&SELECT) { + nt->flag |= SELECT; + break; + } + } + if (nt->flag&SELECT) break; + } + /* If this trim curve is selected, duplicate it */ + if (nt->flag&SELECT) { + dup_nt = BKE_nurbTrim_duplicate(nt); + if (!first_dup_nt) first_dup_nt = dup_nt; + BLI_addtail(&nu->trims, dup_nt); + dup_nt->flag |= SELECT; + } + /* Clear the selection on the original, leaving dup to be dragged alone */ + nt->flag &= ~SELECT; + for (trimnu=(Nurb*)nt->nurb_list.first; trimnu; trimnu=trimnu->next) { + num_bp = trimnu->pntsu * trimnu->pntsv; + for (i=0; i<num_bp; i++) trimnu->bp[i].f1 &= ~SELECT; + } + } + } + return OPERATOR_FINISHED; +} + +static void UV_OT_nurbs_trim_duplicate(wmOperatorType *ot) +{ + /* identifiers */ + ot->name = "Duplicate Trims"; + ot->description = "Duplicate selected NURBS trim curves"; + ot->idname = "UV_OT_nurbs_trim_duplicate"; + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + + /* api callbacks */ + ot->exec = nurbs_trim_duplicate; + ot->poll = ED_operator_nurbsuv; /* requires space image */; +} + /* ******************** loop select operator **************** */ static int uv_select_loop_exec(bContext *C, wmOperator *op) @@ -4121,6 +4175,10 @@ static int nurbsuv_add_square(bContext *C, wmOperator *UNUSED(op)) BLI_addtail(&nu->trims, new_nt); BKE_nurbs_cached_UV_mesh_clear(nu, true); WM_event_add_notifier(C, NC_GEOM | ND_DATA, cu); + DAG_id_tag_update(&obedit->id, OB_RECALC_DATA); + + nurbsuv_set_selected_all(C, false); + new_nt->flag |= SELECT; return OPERATOR_FINISHED; } @@ -4180,6 +4238,10 @@ static int nurbsuv_add_circle(bContext *C, wmOperator *UNUSED(op)) BLI_addtail(&nu->trims, new_nt); BKE_nurbs_cached_UV_mesh_clear(nu, true); WM_event_add_notifier(C, NC_GEOM | ND_DATA, cu); + DAG_id_tag_update(&obedit->id, OB_RECALC_DATA); + + nurbsuv_set_selected_all(C, false); + new_nt->flag |= SELECT; return OPERATOR_FINISHED; } @@ -4848,9 +4910,6 @@ void ED_operatortypes_uvedit(void) WM_operatortype_append(UV_OT_select_linked_pick); WM_operatortype_append(UV_OT_select_split); WM_operatortype_append(UV_OT_select_pinned); - WM_operatortype_append(UV_OT_nurbsuv_add_square); - WM_operatortype_append(UV_OT_nurbsuv_add_circle); - WM_operatortype_append(UV_OT_nurbsuv_delete_trim); WM_operatortype_append(UV_OT_select_border); WM_operatortype_append(UV_OT_select_lasso); WM_operatortype_append(UV_OT_circle_select); @@ -4885,6 +4944,24 @@ void ED_operatortypes_uvedit(void) WM_operatortype_append(UV_OT_cursor_set); WM_operatortype_append(UV_OT_tile_set); + + WM_operatortype_append(UV_OT_nurbsuv_add_square); + WM_operatortype_append(UV_OT_nurbsuv_add_circle); + WM_operatortype_append(UV_OT_nurbsuv_delete_trim); + WM_operatortype_append(UV_OT_nurbs_trim_duplicate); +} + +void ED_operatormacros_uvedit(void) { + wmOperatorType *ot; + wmOperatorTypeMacro *otmacro; + + ot = WM_operatortype_append_macro("UV_OT_nurbs_trim_duplicate_move", "Duplicate Trims", + "Duplicate selected trims and move them", OPTYPE_UNDO | OPTYPE_REGISTER); + if (ot) { + WM_operatortype_macro_define(ot, "UV_OT_nurbs_trim_duplicate"); + otmacro = WM_operatortype_macro_define(ot, "TRANSFORM_OT_translate"); + RNA_enum_set(otmacro->ptr, "proportional", PROP_EDIT_OFF); + } } void ED_keymap_uvedit(wmKeyConfig *keyconf) @@ -4971,9 +5048,9 @@ void ED_keymap_uvedit(wmKeyConfig *keyconf) WM_keymap_add_menu(keymap, "IMAGE_MT_uvs_select_mode", TABKEY, KM_PRESS, KM_CTRL, 0); /* NURBS UV Editor */ - WM_keymap_add_menu(keymap, "UV_OT_nurbsuv_add_square", AKEY, KM_PRESS, KM_SHIFT, 0); - WM_keymap_add_menu(keymap, "UV_OT_nurbsuv_add_circle", AKEY, KM_PRESS, KM_SHIFT, 0); - WM_keymap_add_menu(keymap, "UV_OT_nurbsuv_delete_trim", XKEY, KM_PRESS, 0, 0); + WM_keymap_add_menu(keymap, "IMAGE_MT_add", AKEY, KM_PRESS, KM_SHIFT, 0); + WM_keymap_add_item(keymap, "UV_OT_nurbsuv_delete_trim", XKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "UV_OT_nurbs_trim_duplicate_move", DKEY, KM_PRESS, KM_SHIFT, 0); ED_keymap_proportional_cycle(keyconf, keymap); ED_keymap_proportional_editmode(keyconf, keymap, false); |