[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [27319] trunk/blender: option to transform markers in the dope sheet, needed for re-timing animation.

Campbell Barton ideasman42 at gmail.com
Mon Mar 8 10:06:59 CET 2010


Revision: 27319
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=27319
Author:   campbellbarton
Date:     2010-03-08 10:06:58 +0100 (Mon, 08 Mar 2010)

Log Message:
-----------
option to transform markers in the dope sheet, needed for re-timing animation. currently supports translate and extend.

TODO:
- select markers in dope sheet.
- transform time scale.

Modified Paths:
--------------
    trunk/blender/release/scripts/ui/space_dopesheet.py
    trunk/blender/source/blender/blenkernel/BKE_scene.h
    trunk/blender/source/blender/blenkernel/intern/scene.c
    trunk/blender/source/blender/editors/transform/transform_conversions.c
    trunk/blender/source/blender/makesdna/DNA_action_types.h
    trunk/blender/source/blender/makesrna/intern/rna_space.c

Modified: trunk/blender/release/scripts/ui/space_dopesheet.py
===================================================================
--- trunk/blender/release/scripts/ui/space_dopesheet.py	2010-03-07 20:39:27 UTC (rev 27318)
+++ trunk/blender/release/scripts/ui/space_dopesheet.py	2010-03-08 09:06:58 UTC (rev 27319)
@@ -77,6 +77,7 @@
         layout.prop(st, "show_cframe_indicator")
         layout.prop(st, "show_sliders")
         layout.prop(st, "automerge_keyframes")
+        layout.prop(st, "use_marker_sync")
 
         if st.show_seconds:
             layout.operator("anim.time_toggle", text="Show Frames")

Modified: trunk/blender/source/blender/blenkernel/BKE_scene.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_scene.h	2010-03-07 20:39:27 UTC (rev 27318)
+++ trunk/blender/source/blender/blenkernel/BKE_scene.h	2010-03-08 09:06:58 UTC (rev 27319)
@@ -70,6 +70,8 @@
 
 char *scene_find_marker_name(struct Scene *scene, int frame);
 char *scene_find_last_marker_name(struct Scene *scene, int frame);
+int scene_marker_tfm_translate(struct Scene *scene, int delta, int flag);
+int scene_marker_tfm_extend(struct Scene *scene, int delta, int flag, int frame, char side);
 
 struct Base *scene_add_base(struct Scene *sce, struct Object *ob);
 void scene_deselect_all(struct Scene *sce);

Modified: trunk/blender/source/blender/blenkernel/intern/scene.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/scene.c	2010-03-07 20:39:27 UTC (rev 27318)
+++ trunk/blender/source/blender/blenkernel/intern/scene.c	2010-03-08 09:06:58 UTC (rev 27319)
@@ -783,7 +783,40 @@
 	return best_marker ? best_marker->name : NULL;
 }
 
+/* markers need transforming from different parts of the code so have
+ * a generic function to do this */
+int scene_marker_tfm_translate(Scene *scene, int delta, int flag)
+{
+	TimeMarker *marker;
+	int tot= 0;
 
+	for (marker= scene->markers.first; marker; marker= marker->next) {
+		if ((marker->flag & flag) == flag) {
+			marker->frame += delta;
+			tot++;
+		}
+	}
+
+	return tot;
+}
+
+int scene_marker_tfm_extend(Scene *scene, int delta, int flag, int frame, char side)
+{
+	TimeMarker *marker;
+	int tot= 0;
+
+	for (marker= scene->markers.first; marker; marker= marker->next) {
+		if ((marker->flag & flag) == flag) {
+			if((side=='L' && marker->frame < frame) || (side=='R' && marker->frame > frame)) {
+				marker->frame += delta;
+				tot++;
+			}
+		}
+	}
+
+	return tot;
+}
+
 Base *scene_add_base(Scene *sce, Object *ob)
 {
 	Base *b= MEM_callocN(sizeof(*b), "scene_add_base");

Modified: trunk/blender/source/blender/editors/transform/transform_conversions.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform_conversions.c	2010-03-07 20:39:27 UTC (rev 27318)
+++ trunk/blender/source/blender/editors/transform/transform_conversions.c	2010-03-08 09:06:58 UTC (rev 27319)
@@ -100,6 +100,7 @@
 #include "BKE_bmesh.h"
 #include "BKE_context.h"
 #include "BKE_report.h"
+#include "BKE_scene.h"
 
 //#include "BIF_editview.h"
 //#include "BIF_editlattice.h"
@@ -288,7 +289,7 @@
 
 static void createTransTexspace(bContext *C, TransInfo *t)
 {
-	Scene *scene = CTX_data_scene(C);
+	Scene *scene = t->scene;
 	TransData *td;
 	Object *ob;
 	ID *id;
@@ -2460,7 +2461,7 @@
 {
 	SpaceImage *sima = CTX_wm_space_image(C);
 	Image *ima = CTX_data_edit_image(C);
-	Scene *scene = CTX_data_scene(C);
+	Scene *scene = t->scene;
 	TransData *td = NULL;
 	TransData2D *td2d = NULL;
 	MTFace *tf;
@@ -2617,7 +2618,7 @@
 
 static void createTransNlaData(bContext *C, TransInfo *t)
 {
-	Scene *scene= CTX_data_scene(C);
+	Scene *scene= t->scene;
 	TransData *td = NULL;
 	TransDataNla *tdn = NULL;
 	
@@ -2627,7 +2628,6 @@
 	int filter;
 	
 	int count=0;
-	char side;
 	
 	/* determine what type of data we are operating on */
 	if (ANIM_animdata_get_context(C, &ac) == 0)
@@ -2643,11 +2643,11 @@
 		float xmouse, ymouse;
 		
 		UI_view2d_region_to_view(&ac.ar->v2d, t->imval[0], t->imval[1], &xmouse, &ymouse);
-		side = (xmouse > CFRA) ? 'R' : 'L'; // XXX use t->frame_side
+		t->frame_side= (xmouse > CFRA) ? 'R' : 'L'; // XXX use t->frame_side
 	}
 	else {
 		/* normal transform - both sides of current frame are considered */
-		side = 'B';
+		t->frame_side = 'B';
 	}
 	
 	/* loop 1: count how many strips are selected (consider each strip as 2 points) */
@@ -2664,8 +2664,8 @@
 			/* transition strips can't get directly transformed */
 			if (strip->type != NLASTRIP_TYPE_TRANSITION) {
 				if (strip->flag & NLASTRIP_FLAG_SELECT) {
-					if (FrameOnMouseSide(side, strip->start, (float)CFRA)) count++;
-					if (FrameOnMouseSide(side, strip->end, (float)CFRA)) count++;
+					if (FrameOnMouseSide(t->frame_side, strip->start, (float)CFRA)) count++;
+					if (FrameOnMouseSide(t->frame_side, strip->end, (float)CFRA)) count++;
 				}
 			}
 		}
@@ -2728,7 +2728,7 @@
 						center[2]= 0.0f;
 						
 						/* set td's based on which handles are applicable */
-						if (FrameOnMouseSide(side, strip->start, (float)CFRA))
+						if (FrameOnMouseSide(t->frame_side, strip->start, (float)CFRA))
 						{
 							/* just set tdn to assume that it only has one handle for now */
 							tdn->handle= -1;
@@ -2759,7 +2759,7 @@
 							td->extra= tdn;
 							td++;
 						}
-						if (FrameOnMouseSide(side, strip->end, (float)CFRA))
+						if (FrameOnMouseSide(t->frame_side, strip->end, (float)CFRA))
 						{
 							/* if tdn is already holding the start handle, then we're doing both, otherwise, only end */
 							tdn->handle= (tdn->handle) ? 2 : 1;
@@ -3156,7 +3156,7 @@
 
 static void createTransActionData(bContext *C, TransInfo *t)
 {
-	Scene *scene= CTX_data_scene(C);
+	Scene *scene= t->scene;
 	TransData *td = NULL;
 	tGPFtransdata *tfd = NULL;
 	
@@ -3167,7 +3167,6 @@
 	
 	int count=0;
 	float cfra;
-	char side;
 	
 	/* determine what type of data we are operating on */
 	if (ANIM_animdata_get_context(C, &ac) == 0)
@@ -3186,11 +3185,11 @@
 		float xmouse, ymouse;
 		
 		UI_view2d_region_to_view(&ac.ar->v2d, t->imval[0], t->imval[1], &xmouse, &ymouse);
-		side = (xmouse > CFRA) ? 'R' : 'L'; // XXX use t->frame_side
+		t->frame_side = (xmouse > CFRA) ? 'R' : 'L'; // XXX use t->frame_side
 	}
 	else {
 		/* normal transform - both sides of current frame are considered */
-		side = 'B';
+		t->frame_side = 'B';
 	}
 	
 	/* loop 1: fully select ipo-keys and count how many BezTriples are selected */
@@ -3206,9 +3205,9 @@
 			cfra = (float)CFRA;
 		
 		//if (ale->type == ANIMTYPE_GPLAYER)
-		//	count += count_gplayer_frames(ale->data, side, cfra);
+		//	count += count_gplayer_frames(ale->data, t->frame_side, cfra);
 		//else
-			count += count_fcurve_keys(ale->key_data, side, cfra);
+			count += count_fcurve_keys(ale->key_data, t->frame_side, cfra);
 	}
 	
 	/* stop if trying to build list if nothing selected */
@@ -3243,7 +3242,7 @@
 		//	bGPDlayer *gpl= (bGPDlayer *)ale->data;
 		//	int i;
 		//
-		//	i = GPLayerToTransData(td, tfd, gpl, side, cfra);
+		//	i = GPLayerToTransData(td, tfd, gpl, t->frame_side, cfra);
 		//	td += i;
 		//	tfd += i;
 		//}
@@ -3259,7 +3258,7 @@
 			else
 				cfra = (float)CFRA;
 			
-			td= FCurveToTransData(td, fcu, adt, side, cfra);
+			td= FCurveToTransData(td, fcu, adt, t->frame_side, cfra);
 		//}
 	}
 	
@@ -3351,8 +3350,8 @@
 static void createTransGraphEditData(bContext *C, TransInfo *t)
 {
 	SpaceIpo *sipo= CTX_wm_space_graph(C);
-	Scene *scene= CTX_data_scene(C);
-	ARegion *ar= CTX_wm_region(C);
+	Scene *scene= t->scene;
+	ARegion *ar= t->ar;
 	View2D *v2d= &ar->v2d;
 	
 	TransData *td = NULL;
@@ -3366,7 +3365,6 @@
 	BezTriple *bezt;
 	int count=0, i;
 	float cfra;
-	char side;
 	
 	/* determine what type of data we are operating on */
 	if (ANIM_animdata_get_context(C, &ac) == 0)
@@ -3383,11 +3381,11 @@
 		float xmouse, ymouse;
 		
 		UI_view2d_region_to_view(v2d, t->imval[0], t->imval[1], &xmouse, &ymouse);
-		side = (xmouse > CFRA) ? 'R' : 'L'; // XXX use t->frame_side
+		t->frame_side = (xmouse > CFRA) ? 'R' : 'L'; // XXX use t->frame_side
 	}
 	else {
 		/* normal transform - both sides of current frame are considered */
-		side = 'B';
+		t->frame_side = 'B';
 	}
 	
 	/* loop 1: count how many BezTriples (specifically their verts) are selected (or should be edited) */
@@ -3409,7 +3407,7 @@
 		
 		/* only include BezTriples whose 'keyframe' occurs on the same side of the current frame as mouse */
 		for (i=0, bezt=fcu->bezt; i < fcu->totvert; i++, bezt++) {
-			if (FrameOnMouseSide(side, bezt->vec[1][0], cfra)) {
+			if (FrameOnMouseSide(t->frame_side, bezt->vec[1][0], cfra)) {
 				if (sipo->around == V3D_LOCAL) {
 					/* for local-pivot we only need to count the number of selected handles only, so that centerpoints don't
 					 * don't get moved wrong
@@ -3469,7 +3467,7 @@
 		
 		/* only include BezTriples whose 'keyframe' occurs on the same side of the current frame as mouse (if applicable) */
 		for (i=0, bezt= fcu->bezt; i < fcu->totvert; i++, bezt++) {
-			if (FrameOnMouseSide(side, bezt->vec[1][0], cfra)) {
+			if (FrameOnMouseSide(t->frame_side, bezt->vec[1][0], cfra)) {
 				TransDataCurveHandleFlags *hdata = NULL;
 				short h1=1, h2=1;
 				
@@ -4147,7 +4145,7 @@
 {
 
 	View2D *v2d= UI_view2d_fromcontext(C);
-	Scene *scene= CTX_data_scene(C);
+	Scene *scene= t->scene;
 	Editing *ed= seq_give_editing(t->scene, FALSE);
 	TransData *td = NULL;
 	TransData2D *td2d= NULL;
@@ -4200,7 +4198,7 @@
 /* transcribe given object into TransData for Transforming */
 static void ObjectToTransData(bContext *C, TransInfo *t, TransData *td, Object *ob)
 {
-	Scene *scene = CTX_data_scene(C);
+	Scene *scene = t->scene;
 	Object *track;
 	float obmtx[3][3];
 	short constinv;
@@ -4795,6 +4793,21 @@
 				posttrans_action_clean(&ac, (bAction *)ac.data);
 			}
 		}
+
+		/* marker transform, not especially nice but we may want to move markers
+		 * at the same time as keyframes in the dope sheet. */
+		if ((saction->flag & SACTION_MARKERS_MOVE) && (cancelled == 0)) {
+			/* cant use , TFM_TIME_EXTEND
+			 * for some reason EXTEND is changed into TRANSLATE, so use frame_side instead */
+
+			if(t->mode == TFM_TIME_TRANSLATE) {
+				if(t->frame_side == 'B')
+					scene_marker_tfm_translate(t->scene, floor(t->vec[0] + 0.5f), SELECT);
+				else if (ELEM(t->frame_side, 'L', 'R'))

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list