[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [30085] trunk/blender/source/blender: duplicating a sequence strip now duplicates its fcurves

Campbell Barton ideasman42 at gmail.com
Wed Jul 7 18:17:19 CEST 2010


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)





More information about the Bf-blender-cvs mailing list