option to transform markers in the dope sheet, needed for re-timing animation. curren...
authorCampbell Barton <ideasman42@gmail.com>
Mon, 8 Mar 2010 09:06:58 +0000 (09:06 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Mon, 8 Mar 2010 09:06:58 +0000 (09:06 +0000)
TODO:
- select markers in dope sheet.
- transform time scale.

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

index 1dc8ffd1af9fb1c971b0e03a0cf2d0b27c9a44e9..6d5619613ea6b2672fcc5c0d1a1f262a672f05c3 100644 (file)
@@ -77,6 +77,7 @@ class DOPESHEET_MT_view(bpy.types.Menu):
         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")
index 5e5131f9ccc25a7fa7b42fbc81341a72f2d7e69f..d1b4e5aef1aecce1eb04a2f31f6557e279e48897 100644 (file)
@@ -70,6 +70,8 @@ struct Object *scene_find_camera_switch(struct Scene *scene); // DURIAN_CAMERA_S
 
 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);
index 77b1202aa200911c75d3e87aa23934211f591088..630ddb49c7e9437177bd3692d2d9b583c2ddcf93 100644 (file)
@@ -783,6 +783,39 @@ char *scene_find_last_marker_name(Scene *scene, int frame)
        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)
 {
index e5e6809bf1394407e72e96def1674e05950ea8dd..5c29650b987b0de2f9dc81d1e1ac7ce97b8b27a9 100644 (file)
 #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 set_prop_dist(TransInfo *t, short with_dist)
 
 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 @@ static void createTransUVs(bContext *C, TransInfo *t)
 {
        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 short FrameOnMouseSide(char side, float frame, float cframe)
 
 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 @@ static void createTransNlaData(bContext *C, TransInfo *t)
        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 @@ static void createTransNlaData(bContext *C, TransInfo *t)
                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 @@ static void createTransNlaData(bContext *C, TransInfo *t)
                        /* 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 @@ static void createTransNlaData(bContext *C, TransInfo *t)
                                                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 @@ static void createTransNlaData(bContext *C, TransInfo *t)
                                                        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 int GPLayerToTransData (TransData *td, tGPFtransdata *tfd, bGPDlayer *gpl
 
 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 @@ static void createTransActionData(bContext *C, TransInfo *t)
        
        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 @@ static void createTransActionData(bContext *C, TransInfo *t)
                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 @@ static void createTransActionData(bContext *C, TransInfo *t)
                        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 @@ static void createTransActionData(bContext *C, TransInfo *t)
                //      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 @@ static void createTransActionData(bContext *C, TransInfo *t)
                        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 bezt_to_transdata (TransData *td, TransData2D *td2d, AnimData *adt,
 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 @@ static void createTransGraphEditData(bContext *C, TransInfo *t)
        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 @@ static void createTransGraphEditData(bContext *C, TransInfo *t)
                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 @@ static void createTransGraphEditData(bContext *C, TransInfo *t)
                
                /* 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 @@ static void createTransGraphEditData(bContext *C, TransInfo *t)
                
                /* 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 @@ static void createTransSeqData(bContext *C, TransInfo *t)
 {
 
        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 @@ static void createTransSeqData(bContext *C, TransInfo *t)
 /* 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 @@ void special_aftertrans_update(bContext *C, TransInfo *t)
                                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'))
+                                       scene_marker_tfm_extend(t->scene, floor(t->vec[0] + 0.5f), SELECT, t->scene->r.cfra, t->frame_side);
+                       }
+               }
+
 #if 0 // XXX future of this is still not clear
                else if (ac.datatype == ANIMCONT_GPENCIL) {
                        /* remove duplicate frames and also make sure points are in order! */
@@ -5139,7 +5152,7 @@ void createTransNodeData(bContext *C, TransInfo *t)
 
 void createTransData(bContext *C, TransInfo *t)
 {
-       Scene *scene = CTX_data_scene(C);
+       Scene *scene = t->scene;
        Object *ob = OBACT;
 
        if (t->options & CTX_TEXTURE) {
index 91d3a7901c4eab4cc1cb69e671c08fa7cc02c8be..2304d4aae06d5921b2fff19a3286cb8026c0bc5a 100644 (file)
@@ -597,6 +597,8 @@ typedef enum eSAction_Flag {
        SACTION_TEMP_NEEDCHANSYNC = (1<<9),
                /* don't perform realtime updates */
        SACTION_NOREALTIMEUPDATES =     (1<<10),
+               /* move markers as well as keyframes */
+       SACTION_MARKERS_MOVE = (1<<11),
 } eSAction_Flag;       
 
 /* SpaceAction Mode Settings */
index b43eb5507220995ce1cd3a8844d194b6af2edfb2..7a224cf5b49274fbaf264ae30df8e72e387d10b7 100644 (file)
@@ -1457,6 +1457,10 @@ static void rna_def_space_dopesheet(BlenderRNA *brna)
        RNA_def_property_ui_text(prop, "Realtime Updates", "When transforming keyframes, changes to the animation data are flushed to other views");
        RNA_def_property_update(prop, NC_SPACE|ND_SPACE_DOPESHEET, NULL);
 
+       prop= RNA_def_property(srna, "use_marker_sync", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_sdna(prop, NULL, "flag", SACTION_MARKERS_MOVE);
+       RNA_def_property_ui_text(prop, "Sync Markers", "Sync Markers with keyframe edits");
+
        /* dopesheet */
        prop= RNA_def_property(srna, "dopesheet", PROP_POINTER, PROP_NONE);
        RNA_def_property_struct_type(prop, "DopeSheet");