[Bf-blender-cvs] [c1e5d96] master: Proportional editing support for the action editor.

Antony Riakiotakis noreply at git.blender.org
Tue Apr 7 20:50:09 CEST 2015


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. @@




More information about the Bf-blender-cvs mailing list