Revision: 30085
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=30085
Author:   campbellbarton
Date:     2010-07-07 18:17:18 +0200 (Wed, 07 Jul 2010)

Log Message:
-----------
duplicating a sequence strip now duplicates its fcurves

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_sequencer.h
    trunk/blender/source/blender/blenkernel/intern/sequencer.c
    trunk/blender/source/blender/editors/space_sequencer/sequencer_edit.c
    trunk/blender/source/blender/makesrna/intern/rna_sequencer.c

Modified: trunk/blender/source/blender/blenkernel/BKE_sequencer.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_sequencer.h     2010-07-07 
15:26:02 UTC (rev 30084)
+++ trunk/blender/source/blender/blenkernel/BKE_sequencer.h     2010-07-07 
16:17:18 UTC (rev 30085)
@@ -187,6 +187,7 @@
 int seq_test_overlap(struct ListBase * seqbasep, struct Sequence *test);
 struct ListBase *seq_seqbase(struct ListBase *seqbase, struct Sequence *seq);
 void seq_offset_animdata(struct Scene *scene, struct Sequence *seq, int ofs);
+void seq_dupe_animdata(struct Scene *scene, char *name_from, char *name_to);
 int shuffle_seq(struct ListBase * seqbasep, struct Sequence *test, struct 
Scene *evil_scene);
 int shuffle_seq_time(ListBase * seqbasep, struct Scene *evil_scene);
 int seqbase_isolated_sel_check(struct ListBase *seqbase);
@@ -232,6 +233,7 @@
 /* seq_dupli' flags */
 #define SEQ_DUPE_UNIQUE_NAME   1<<0
 #define SEQ_DUPE_CONTEXT               1<<1
+#define SEQ_DUPE_ANIM                  1<<2
 
 /* use as an api function */
 typedef struct Sequence *(*SeqLoadFunc)(struct bContext *, ListBase *, struct 
SeqLoadInfo *);

Modified: trunk/blender/source/blender/blenkernel/intern/sequencer.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/sequencer.c  2010-07-07 
15:26:02 UTC (rev 30084)
+++ trunk/blender/source/blender/blenkernel/intern/sequencer.c  2010-07-07 
16:17:18 UTC (rev 30085)
@@ -40,6 +40,7 @@
 #include "DNA_anim_types.h"
 #include "DNA_object_types.h"
 
+#include "BKE_animsys.h"
 #include "BKE_global.h"
 #include "BKE_image.h"
 #include "BKE_main.h"
@@ -3877,6 +3878,37 @@
        }
 }
 
+void seq_dupe_animdata(Scene *scene, char *name_from, char *name_to)
+{
+       char str_from[32];
+       char str_to[32];
+       FCurve *fcu;
+       FCurve *fcu_last;
+       FCurve *fcu_cpy;
+       ListBase lb= {NULL, NULL};
+
+       if(scene->adt==NULL || scene->adt->action==NULL)
+               return;
+
+       sprintf(str_from, "[\"%s\"]", name_from);
+       sprintf(str_to, "[\"%s\"]", name_to);
+
+       fcu_last= scene->adt->action->curves.last;
+
+       for (fcu= scene->adt->action->curves.first; fcu && fcu->prev != 
fcu_last; fcu= fcu->next) {
+               if(strstr(fcu->rna_path, "sequence_editor.sequences_all[") && 
strstr(fcu->rna_path, str_from)) {
+                       fcu_cpy= copy_fcurve(fcu);
+                       BLI_addtail(&lb, fcu_cpy);
+               }
+       }
+
+       /* notice validate is 0, keep this because the seq may not be added to 
the scene yet */
+       BKE_animdata_fix_paths_rename(&scene->id, scene->adt, 
"sequence_editor.sequences_all", name_from, name_to, 0, 0, 0);
+
+       /* add the original fcurves back */
+       addlisttolist(&scene->adt->action->curves, &lb);
+}
+
 /* XXX - hackish function needed to remove all fcurves belonging to a 
sequencer strip */
 static void seq_free_animdata(Scene *scene, Sequence *seq)
 {
@@ -4233,9 +4265,14 @@
                                                " now...\n");
        }
 
-       if(dupe_flag & SEQ_DUPE_UNIQUE_NAME)
+       if(dupe_flag & SEQ_DUPE_UNIQUE_NAME) {
                seqbase_unique_name_recursive(&scene->ed->seqbase, seqn);
+               printf("%s %s\n", seqn->name+2, seq->name+2);
+       }
 
+       if(dupe_flag & SEQ_DUPE_ANIM)
+               seq_dupe_animdata(scene, seq->name+2, seqn->name+2);
+
        return seqn;
 }
 

Modified: trunk/blender/source/blender/editors/space_sequencer/sequencer_edit.c
===================================================================
--- trunk/blender/source/blender/editors/space_sequencer/sequencer_edit.c       
2010-07-07 15:26:02 UTC (rev 30084)
+++ trunk/blender/source/blender/editors/space_sequencer/sequencer_edit.c       
2010-07-07 16:17:18 UTC (rev 30085)
@@ -792,7 +792,7 @@
 
        if (!skip_dup) {
                /* Duplicate AFTER the first change */
-               seqn = seq_dupli_recursive(scene, seq, SEQ_DUPE_UNIQUE_NAME);
+               seqn = seq_dupli_recursive(scene, seq, SEQ_DUPE_UNIQUE_NAME | 
SEQ_DUPE_ANIM);
        }
        
        if (seqn) { 
@@ -881,7 +881,7 @@
 
        if (!skip_dup) {
                /* Duplicate AFTER the first change */
-               seqn = seq_dupli_recursive(scene, seq, SEQ_DUPE_UNIQUE_NAME);
+               seqn = seq_dupli_recursive(scene, seq, SEQ_DUPE_UNIQUE_NAME | 
SEQ_DUPE_ANIM);
        }
        
        if (seqn) { 
@@ -1598,15 +1598,19 @@
        if(ed==NULL)
                return OPERATOR_CANCELLED;
 
-       seqbase_dupli_recursive(scene, &nseqbase, ed->seqbasep, 
SEQ_DUPE_UNIQUE_NAME|SEQ_DUPE_CONTEXT);
+       seqbase_dupli_recursive(scene, &nseqbase, ed->seqbasep, 
SEQ_DUPE_CONTEXT);
 
        if(nseqbase.first) {
                Sequence * seq= nseqbase.first;
                /* rely on the nseqbase list being added at the end */
                addlisttolist(ed->seqbasep, &nseqbase);
 
-               for( ; seq; seq= seq->next)
+               for( ; seq; seq= seq->next) {
+                       char name[sizeof(seq->name)-2];
+                       strcpy(name, seq->name+2);
                        seqbase_unique_name_recursive(&ed->seqbase, seq);
+                       seq_dupe_animdata(scene, name, seq->name+2);
+               }
 
                WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER, scene);
                return OPERATOR_FINISHED;

Modified: trunk/blender/source/blender/makesrna/intern/rna_sequencer.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_sequencer.c        
2010-07-07 15:26:02 UTC (rev 30084)
+++ trunk/blender/source/blender/makesrna/intern/rna_sequencer.c        
2010-07-07 16:17:18 UTC (rev 30085)
@@ -30,6 +30,7 @@
 
 #include "rna_internal.h"
 
+#include "DNA_anim_types.h"
 #include "DNA_object_types.h"
 #include "DNA_scene_types.h"
 #include "DNA_sequence_types.h"
@@ -270,6 +271,7 @@
        Scene *scene= (Scene*)ptr->id.data;
        Sequence *seq= (Sequence*)ptr->data;
        char oldname[sizeof(seq->name)];
+       AnimData *adt;
        
        /* make a copy of the old name first */
        BLI_strncpy(oldname, seq->name+2, sizeof(seq->name)-2);
@@ -281,7 +283,12 @@
        seqbase_unique_name_recursive(&scene->ed->seqbase, seq);
        
        /* fix all the animation data which may link to this */
-       BKE_all_animdata_fix_paths_rename("sequence_editor.sequences_all", 
oldname, seq->name+2);
+
+       /* dont rename everywhere because these are per scene */
+       /* BKE_all_animdata_fix_paths_rename("sequence_editor.sequences_all", 
oldname, seq->name+2); */
+       adt= BKE_animdata_from_id(&scene->id);
+       if(adt)
+               BKE_animdata_fix_paths_rename(&scene->id, adt, 
"sequence_editor.sequences_all", oldname, seq->name+2, 0, 0, 1);
 }
 
 static StructRNA* rna_Sequence_refine(struct PointerRNA *ptr)


_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to