Commit: c1e5d966c60876453dc7b66e0c23065088e8b94b
Author: Antony Riakiotakis
Date:   Tue Apr 7 16:45:29 2015 +0200
Branches: master
https://developer.blender.org/rBc1e5d966c60876453dc7b66e0c23065088e8b94b

Proportional editing support for the action editor.

There are a few things here which are not so nice:

* Position of proportional edit circle is not centered on data
(difficult to predict positions here since those are completely custom,
 will probably be positioned at center of area later instead)

* Result is flushed to curve handles only at the end of the transform,
so if people have the graph editor open they will see handles lagging behind.

===================================================================

M       release/scripts/startup/bl_ui/space_dopesheet.py
M       source/blender/editors/space_action/action_ops.c
M       source/blender/editors/transform/transform.c
M       source/blender/editors/transform/transform_constraints.c
M       source/blender/editors/transform/transform_conversions.c
M       source/blender/editors/transform/transform_generics.c

===================================================================

diff --git a/release/scripts/startup/bl_ui/space_dopesheet.py 
b/release/scripts/startup/bl_ui/space_dopesheet.py
index bb08a7c..843cf41 100644
--- a/release/scripts/startup/bl_ui/space_dopesheet.py
+++ b/release/scripts/startup/bl_ui/space_dopesheet.py
@@ -105,6 +105,7 @@ class DOPESHEET_HT_header(Header):
         layout = self.layout
 
         st = context.space_data
+        toolsettings = context.tool_settings
 
         row = layout.row(align=True)
         row.template_header()
@@ -133,6 +134,11 @@ class DOPESHEET_HT_header(Header):
             # filters which will work here and are useful (especially for 
character animation)
             dopesheet_filter(layout, context, genericFiltersOnly=True)
 
+        row = layout.row(align=True)
+        row.prop(toolsettings, "proportional_edit", icon_only=True)
+        if toolsettings.proportional_edit != 'DISABLED':
+            row.prop(toolsettings, "proportional_edit_falloff", icon_only=True)
+
         # Grease Pencil mode doesn't need snapping, as it's frame-aligned only
         if st.mode != 'GPENCIL':
             layout.prop(st, "auto_snap", text="")
diff --git a/source/blender/editors/space_action/action_ops.c 
b/source/blender/editors/space_action/action_ops.c
index 9ad0931..0f21446 100644
--- a/source/blender/editors/space_action/action_ops.c
+++ b/source/blender/editors/space_action/action_ops.c
@@ -202,7 +202,6 @@ static void action_keymap_keyframes(wmKeyConfig *keyconf, 
wmKeyMap *keymap)
        WM_keymap_add_item(keymap, "ACTION_OT_keyframe_type", RKEY, KM_PRESS, 
0, 0); 
        
        /* destructive */
-       WM_keymap_add_item(keymap, "ACTION_OT_clean", OKEY, KM_PRESS, 0, 0);
        WM_keymap_add_item(keymap, "ACTION_OT_sample", OKEY, KM_PRESS, 
KM_SHIFT, 0);
        
        WM_keymap_add_item(keymap, "ACTION_OT_delete", XKEY, KM_PRESS, 0, 0);
@@ -241,6 +240,11 @@ static void action_keymap_keyframes(wmKeyConfig *keyconf, 
wmKeyMap *keymap)
        /* transform system */
        transform_keymap_for_space(keyconf, keymap, SPACE_ACTION);
        
+       kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle_enum", OKEY, 
KM_PRESS, 0, 0);
+       RNA_string_set(kmi->ptr, "data_path", 
"tool_settings.proportional_edit");
+       RNA_string_set(kmi->ptr, "value_1", "DISABLED");
+       RNA_string_set(kmi->ptr, "value_2", "ENABLED");
+
        /* special markers hotkeys for anim editors: see note in definition of 
this function */
        ED_marker_keymap_animedit_conflictfree(keymap);
 }
diff --git a/source/blender/editors/transform/transform.c 
b/source/blender/editors/transform/transform.c
index 4406333..17f1d61 100644
--- a/source/blender/editors/transform/transform.c
+++ b/source/blender/editors/transform/transform.c
@@ -2095,6 +2095,12 @@ bool initTransform(bContext *C, TransInfo *t, wmOperator 
*op, const wmEvent *eve
                //t->draw_handle_pixel = 
ED_region_draw_cb_activate(t->ar->type, drawTransformPixel, t, 
REGION_DRAW_POST_PIXEL);
                t->draw_handle_cursor = 
WM_paint_cursor_activate(CTX_wm_manager(C), helpline_poll, drawHelpline, t);
        }
+       else if (t->spacetype == SPACE_ACTION) {
+               unit_m3(t->spacemtx);
+               t->draw_handle_view = ED_region_draw_cb_activate(t->ar->type, 
drawTransformView, t, REGION_DRAW_POST_VIEW);
+               //t->draw_handle_pixel = 
ED_region_draw_cb_activate(t->ar->type, drawTransformPixel, t, 
REGION_DRAW_POST_PIXEL);
+               t->draw_handle_cursor = 
WM_paint_cursor_activate(CTX_wm_manager(C), helpline_poll, drawHelpline, t);
+       }
        else
                unit_m3(t->spacemtx);
 
@@ -7518,6 +7524,7 @@ static void initTimeTranslate(TransInfo *t)
 static void headerTimeTranslate(TransInfo *t, char str[MAX_INFO_LEN])
 {
        char tvec[NUM_STR_REP_LEN * 3];
+       int ofs = 0;
 
        /* if numeric input is active, use results from that, otherwise apply 
snapping to result */
        if (hasNumInput(&t->num)) {
@@ -7553,7 +7560,11 @@ static void headerTimeTranslate(TransInfo *t, char 
str[MAX_INFO_LEN])
                        BLI_snprintf(&tvec[0], NUM_STR_REP_LEN, "%.4f", val);
        }
 
-       BLI_snprintf(str, MAX_INFO_LEN, IFACE_("DeltaX: %s"), &tvec[0]);
+       ofs += BLI_snprintf(str, MAX_INFO_LEN, IFACE_("DeltaX: %s"), &tvec[0]);
+
+       if (t->flag & T_PROP_EDIT_ALL) {
+               ofs += BLI_snprintf(str + ofs, MAX_INFO_LEN - ofs, IFACE_(" 
Proportional size: %.2f"), t->prop_size);
+       }
 }
 
 static void applyTimeTranslateValue(TransInfo *t, float UNUSED(sval))
@@ -7590,7 +7601,7 @@ static void applyTimeTranslateValue(TransInfo *t, float 
UNUSED(sval))
                        }
 
                        val = BKE_nla_tweakedit_remap(adt, td->ival, 
NLATIME_CONVERT_MAP);
-                       val += deltax;
+                       val += deltax * td->factor;
                        *(td->val) = BKE_nla_tweakedit_remap(adt, val, 
NLATIME_CONVERT_UNMAP);
                }
                else {
diff --git a/source/blender/editors/transform/transform_constraints.c 
b/source/blender/editors/transform/transform_constraints.c
index bcd66f5..03d626f 100644
--- a/source/blender/editors/transform/transform_constraints.c
+++ b/source/blender/editors/transform/transform_constraints.c
@@ -765,7 +765,7 @@ void drawPropCircle(const struct bContext *C, TransInfo *t)
                        }
                        glScalef(1.0f / aspx, 1.0f / aspy, 1.0f);
                }
-               else if (t->spacetype == SPACE_IPO) {
+               else if (ELEM(t->spacetype, SPACE_IPO, SPACE_ACTION)) {
                        /* only scale y */
                        rcti *mask = &t->ar->v2d.mask;
                        rctf *datamask = &t->ar->v2d.cur;
diff --git a/source/blender/editors/transform/transform_conversions.c 
b/source/blender/editors/transform/transform_conversions.c
index 6124dab..23648c2 100644
--- a/source/blender/editors/transform/transform_conversions.c
+++ b/source/blender/editors/transform/transform_conversions.c
@@ -3328,10 +3328,10 @@ static void posttrans_action_clean(bAnimContext *ac, 
bAction *act)
 /* ----------------------------- */
 
 /* fully select selected beztriples, but only include if it's on the right 
side of cfra */
-static int count_fcurve_keys(FCurve *fcu, char side, float cfra)
+static int count_fcurve_keys(FCurve *fcu, char side, float cfra, bool propedit)
 {
        BezTriple *bezt;
-       int i, count = 0;
+       int i, count = 0, count_all = 0;
 
        if (ELEM(NULL, fcu, fcu->bezt))
                return count;
@@ -3341,20 +3341,22 @@ static int count_fcurve_keys(FCurve *fcu, char side, 
float cfra)
                if (bezt->f2 & SELECT) {
                        /* no need to adjust the handle selection since they 
are assumed
                         * selected (like graph editor with SIPO_NOHANDLES) */
-                       if (FrameOnMouseSide(side, bezt->vec[1][0], cfra)) {
-                               count += 1;
-                       }
+                       if (FrameOnMouseSide(side, bezt->vec[1][0], cfra))
+                               count++;
                }
+               count_all++;
        }
 
-       return count;
+       if (propedit && count > 0)
+               return count_all;
+       else return count;
 }
 
 /* fully select selected beztriples, but only include if it's on the right 
side of cfra */
-static int count_gplayer_frames(bGPDlayer *gpl, char side, float cfra)
+static int count_gplayer_frames(bGPDlayer *gpl, char side, float cfra, bool 
propedit)
 {
        bGPDframe *gpf;
-       int count = 0;
+       int count = 0, count_all = 0;
        
        if (gpl == NULL)
                return count;
@@ -3365,16 +3367,20 @@ static int count_gplayer_frames(bGPDlayer *gpl, char 
side, float cfra)
                        if (FrameOnMouseSide(side, (float)gpf->framenum, cfra))
                                count++;
                }
+               count_all++;
        }
        
-       return count;
+       if (propedit && count > 0)
+               return count_all;
+       else
+               return count;
 }
 
 /* fully select selected beztriples, but only include if it's on the right 
side of cfra */
-static int count_masklayer_frames(MaskLayer *masklay, char side, float cfra)
+static int count_masklayer_frames(MaskLayer *masklay, char side, float cfra, 
bool propedit)
 {
        MaskLayerShape *masklayer_shape;
-       int count = 0;
+       int count = 0, count_all = 0;
 
        if (masklay == NULL)
                return count;
@@ -3385,9 +3391,13 @@ static int count_masklayer_frames(MaskLayer *masklay, 
char side, float cfra)
                        if (FrameOnMouseSide(side, 
(float)masklayer_shape->frame, cfra))
                                count++;
                }
+               count_all++;
        }
 
-       return count;
+       if (propedit && count > 0)
+               return count_all;
+       else
+               return count;
 }
 
 
@@ -3398,6 +3408,8 @@ static void TimeToTransData(TransData *td, float *time, 
AnimData *adt)
        td->val = time;
        td->ival = *(time);
 
+       td->center[0] = td->ival;
+
        /* store the AnimData where this keyframe exists as a keyframe of the
         * active action as td->extra.
         */
@@ -3411,7 +3423,7 @@ static void TimeToTransData(TransData *td, float *time, 
AnimData *adt)
  * The 'side' argument is needed for the extend mode. 'B' = both sides, 
'R'/'L' mean only data
  * on the named side are used.
  */
-static TransData *ActionFCurveToTransData(TransData *td, TransData2D **td2dv, 
FCurve *fcu, AnimData *adt, char side, float cfra)
+static TransData *ActionFCurveToTransData(TransData *td, TransData2D **td2dv, 
FCurve *fcu, AnimData *adt, char side, float cfra, bool propedit)
 {
        BezTriple *bezt;
        TransData2D *td2d = *td2dv;
@@ -3422,11 +3434,14 @@ static TransData *ActionFCurveToTransData(TransData 
*td, TransData2D **td2dv, FC
 
        for (i = 0, bezt = fcu->bezt; i < fcu->totvert; i++, bezt++) {
                /* only add selected keyframes (for now, proportional edit is 
not enabled) */
-               if (bezt->f2 & SELECT) { /* note this MUST match 
count_fcurve_keys(), so can't use BEZSELECTED() macro */
+               if (propedit || (bezt->f2 & SELECT)) { /* note this MUST match 
count_fcurve_keys(), so can't use BEZSELECTED() macro */
                        /* only add if on the right 'side' of the current frame 
*/
                        if (FrameOnMouseSide(side, bezt->vec[1][0], cfra)) {
                                TimeToTransData(td, bezt->vec[1], adt);
                                
+                               if (bezt->f2 & SELECT)
+                                       td->flag |= TD_SELECTED;
+
                                /*set flags to move handles as necessary*/
                                td->flag |= TD_MOVEHANDLE1 | TD_MOVEHANDLE2;
                                td2d->h1 = bezt->vec[0];
@@ -3477,19 +3492,21 @@ void flushTransIntFrameActionData(TransInfo *t)
  * The 'side' argument is needed for the extend mode. 'B' = both sides, 
'R'/'L' mean only data
  * on the named side are used.
  */
-static int GPLayerToTransData(TransData *td, tGPFtransdata *tfd, bGPDlayer 
*gpl, char side, float cfra)
+static int GPLayerToTransData(TransData *td, tGPFtransdata *tfd, bGPDlayer 
*gpl, char side, float cfra, bool propedit)
 {
        bGPDframe *gpf;
        int count = 0;
        
        /* check for select frames on right side of current frame */
        for (gpf = gpl->frames.first; gpf; gpf = gpf->next) {
-               if (gpf->flag & GP_FRAME_SELECT) {
+               if (propedit || (gpf->flag & GP_FRAME_SELECT)) {
                        if (FrameOnMouseSide(side, (float)gpf->framenum, cfra)) 
{
                                /* 

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to