added mask tool to recalculate handles (Ctrl+N)
authorCampbell Barton <ideasman42@gmail.com>
Wed, 13 Jun 2012 14:09:20 +0000 (14:09 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Wed, 13 Jun 2012 14:09:20 +0000 (14:09 +0000)
release/scripts/startup/bl_ui/space_clip.py
source/blender/editors/mask/mask_edit.c
source/blender/editors/mask/mask_intern.h
source/blender/editors/mask/mask_ops.c

index 55922da3892d122149ea45a1f75ac106336cd113..a77302ff4ae620fdb6b1929a4d71e3ed7ca12eb5 100644 (file)
@@ -1269,6 +1269,7 @@ class CLIP_MT_mask(Menu):
         layout.separator()
         layout.operator("mask.cyclic_toggle")
         layout.operator("mask.switch_direction")
+        layout.operator("mask.normals_make_consistent")
         layout.operator("mask.feather_weight_clear")  # TODO, better place?
 
         layout.separator()
index 24f55f66bb89ce20d24aa7b7e2e7acef0dd22787..52711c8da550013381762105c8189686ccd923a2 100644 (file)
@@ -207,6 +207,7 @@ void ED_operatortypes_mask(void)
 
        /* geometry */
        WM_operatortype_append(MASK_OT_switch_direction);
+       WM_operatortype_append(MASK_OT_normals_make_consistent);
        WM_operatortype_append(MASK_OT_delete);
 
        /* select */
@@ -307,6 +308,7 @@ void ED_keymap_mask(wmKeyConfig *keyconf)
        WM_keymap_add_item(keymap, "MASK_OT_cyclic_toggle", CKEY, KM_PRESS, KM_ALT, 0);
        WM_keymap_add_item(keymap, "MASK_OT_slide_point", LEFTMOUSE, KM_PRESS, 0, 0);
        WM_keymap_add_item(keymap, "MASK_OT_handle_type_set", VKEY, KM_PRESS, 0, 0);
+       WM_keymap_add_item(keymap, "MASK_OT_normals_make_consistent", NKEY, KM_PRESS, KM_CTRL, 0);
        // WM_keymap_add_item(keymap, "MASK_OT_feather_weight_clear", SKEY, KM_PRESS, KM_ALT, 0);
        /* ... matches curve editmode */
        RNA_enum_set(WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", SKEY, KM_PRESS, KM_ALT, 0)->ptr, "mode", TFM_MASK_SHRINKFATTEN);
index fc6089238a150b65e40db00f06b8f76bb5957e92..c34558d2a01e4bdf30d0d2984ebf245f35e22943 100644 (file)
@@ -56,6 +56,7 @@ void MASK_OT_hide_view_clear(struct wmOperatorType *ot);
 void MASK_OT_hide_view_set(struct wmOperatorType *ot);
 void MASK_OT_feather_weight_clear(struct wmOperatorType *ot);
 void MASK_OT_switch_direction(struct wmOperatorType *ot);
+void MASK_OT_normals_make_consistent(struct wmOperatorType *ot);
 
 void MASK_OT_handle_type_set(struct wmOperatorType *ot);
 
index 315e40380f986c4148f874513a8bf9a927abe489..b770e5e9dbac89d8823e2955759c6cae4c64dd05 100644 (file)
@@ -992,6 +992,7 @@ void MASK_OT_delete(wmOperatorType *ot)
 /* *** switch direction *** */
 static int mask_switch_direction_exec(bContext *C, wmOperator *UNUSED(op))
 {
+       Scene *scene = CTX_data_scene(C);
        Mask *mask = CTX_data_edit_mask(C);
        MaskLayer *masklay;
 
@@ -1000,6 +1001,7 @@ static int mask_switch_direction_exec(bContext *C, wmOperator *UNUSED(op))
        /* do actual selection */
        for (masklay = mask->masklayers.first; masklay; masklay = masklay->next) {
                MaskSpline *spline;
+               int change_layer = FALSE;
 
                if (masklay->restrictflag & (MASK_RESTRICT_VIEW | MASK_RESTRICT_SELECT)) {
                        continue;
@@ -1009,6 +1011,13 @@ static int mask_switch_direction_exec(bContext *C, wmOperator *UNUSED(op))
                        if (ED_mask_spline_select_check(spline)) {
                                BKE_mask_spline_direction_switch(masklay, spline);
                                change = TRUE;
+                               change_layer = TRUE;
+                       }
+               }
+
+               if (change_layer) {
+                       if (IS_AUTOKEY_ON(scene)) {
+                               ED_mask_layer_shape_auto_key(masklay, CFRA);
                        }
                }
        }
@@ -1041,6 +1050,73 @@ void MASK_OT_switch_direction(wmOperatorType *ot)
 }
 
 
+/* *** recalc normals *** */
+static int mask_normals_make_consistent_exec(bContext *C, wmOperator *UNUSED(op))
+{
+       Scene *scene = CTX_data_scene(C);
+       Mask *mask = CTX_data_edit_mask(C);
+       MaskLayer *masklay;
+       int i;
+
+       int change = FALSE;
+
+       /* do actual selection */
+       for (masklay = mask->masklayers.first; masklay; masklay = masklay->next) {
+               MaskSpline *spline;
+               int change_layer = FALSE;
+
+               if (masklay->restrictflag & (MASK_RESTRICT_VIEW | MASK_RESTRICT_SELECT)) {
+                       continue;
+               }
+
+               for (spline = masklay->splines.first; spline; spline = spline->next) {
+                       for (i = 0; i < spline->tot_point; i++) {
+                               MaskSplinePoint *point = &spline->points[i];
+
+                               if (MASKPOINT_ISSEL_ANY(point)) {
+                                       BKE_mask_calc_handle_point_auto(spline, point, FALSE);
+                                       change = TRUE;
+                                       change_layer = TRUE;
+                               }
+                       }
+               }
+
+               if (change_layer) {
+                       if (IS_AUTOKEY_ON(scene)) {
+                               ED_mask_layer_shape_auto_key(masklay, CFRA);
+                       }
+               }
+       }
+
+       if (change) {
+               /* TODO: only update this spline */
+               BKE_mask_update_display(mask, CTX_data_scene(C)->r.cfra);
+
+               WM_event_add_notifier(C, NC_MASK | ND_SELECT, mask);
+
+               return OPERATOR_FINISHED;
+       }
+
+       return OPERATOR_CANCELLED;
+}
+
+/* named to match mesh recalc normals */
+void MASK_OT_normals_make_consistent(wmOperatorType *ot)
+{
+       /* identifiers */
+       ot->name = "Recalc Normals";
+       ot->description = "Re-calculate the direction of selected handles";
+       ot->idname = "MASK_OT_normals_make_consistent";
+
+       /* api callbacks */
+       ot->exec = mask_normals_make_consistent_exec;
+       ot->poll = ED_maskedit_mask_poll;
+
+       /* flags */
+       ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+}
+
+
 /******************** set handle type *********************/
 
 static int set_handle_type_exec(bContext *C, wmOperator *op)