From bfad8deb0be0d014b5e05c7e1af564acb3d494d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix?= Date: Fri, 19 Mar 2021 23:55:39 +0100 Subject: VSE: Add new_meta RNA API function This function can be used to create empty meta strip, which is not straightforward when using operators. Very useful for import/export scripts. Reviewed By: ISS Differential Revision: https://developer.blender.org/D10661 --- source/blender/makesrna/intern/rna_sequencer_api.c | 56 +++++++++++++++++++++- source/blender/sequencer/SEQ_add.h | 3 ++ source/blender/sequencer/intern/strip_add.c | 26 ++++++++++ 3 files changed, 84 insertions(+), 1 deletion(-) diff --git a/source/blender/makesrna/intern/rna_sequencer_api.c b/source/blender/makesrna/intern/rna_sequencer_api.c index 04ca3cfdb32..a6a0e9d3dcd 100644 --- a/source/blender/makesrna/intern/rna_sequencer_api.c +++ b/source/blender/makesrna/intern/rna_sequencer_api.c @@ -382,6 +382,32 @@ static Sequence *rna_Sequences_meta_new_sound(ID *id, id, &seq->seqbase, bmain, reports, name, file, channel, frame_start); } +/* Meta sequence + * Possibility to create an empty meta to avoid plenty of meta toggling + * Created meta have a length equal to 1, must be set through the API. */ +static Sequence *rna_Sequences_new_meta( + ID *id, ListBase *seqbase, const char *name, int channel, int frame_start) +{ + Scene *scene = (Scene *)id; + SeqLoadData load_data; + SEQ_add_load_data_init(&load_data, name, NULL, frame_start, channel); + Sequence *seqm = SEQ_add_meta_strip(scene, seqbase, &load_data); + + return seqm; +} + +static Sequence *rna_Sequences_editing_new_meta( + ID *id, Editing *ed, const char *name, int channel, int frame_start) +{ + return rna_Sequences_new_meta(id, &ed->seqbase, name, channel, frame_start); +} + +static Sequence *rna_Sequences_meta_new_meta( + ID *id, Sequence *seq, const char *name, int channel, int frame_start) +{ + return rna_Sequences_new_meta(id, &seq->seqbase, name, channel, frame_start); +} + static Sequence *rna_Sequences_new_effect(ID *id, ListBase *seqbase, ReportList *reports, @@ -626,7 +652,11 @@ void RNA_api_sequence_strip(StructRNA *srna) func = RNA_def_function(srna, "move_to_meta", "rna_Sequences_move_strip_to_meta"); RNA_def_function_flag(func, FUNC_USE_SELF_ID | FUNC_USE_MAIN); - parm = RNA_def_pointer(func, "meta_sequence", "Sequence", "Destination Meta Sequence", "Meta to move the strip into"); + parm = RNA_def_pointer(func, + "meta_sequence", + "Sequence", + "Destination Meta Sequence", + "Meta to move the strip into"); RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED); func = RNA_def_function(srna, "invalidate_cache", "rna_Sequence_invalidate_cache_rnafunc"); @@ -699,6 +729,7 @@ void RNA_api_sequences(BlenderRNA *brna, PropertyRNA *cprop, const bool metastri const char *new_image_func_name = "rna_Sequences_editing_new_image"; const char *new_movie_func_name = "rna_Sequences_editing_new_movie"; const char *new_sound_func_name = "rna_Sequences_editing_new_sound"; + const char *new_meta_func_name = "rna_Sequences_editing_new_meta"; const char *new_effect_func_name = "rna_Sequences_editing_new_effect"; const char *remove_func_name = "rna_Sequences_editing_remove"; @@ -713,6 +744,7 @@ void RNA_api_sequences(BlenderRNA *brna, PropertyRNA *cprop, const bool metastri new_image_func_name = "rna_Sequences_meta_new_image"; new_movie_func_name = "rna_Sequences_meta_new_movie"; new_sound_func_name = "rna_Sequences_meta_new_sound"; + new_meta_func_name = "rna_Sequences_meta_new_meta"; new_effect_func_name = "rna_Sequences_meta_new_effect"; remove_func_name = "rna_Sequences_meta_remove"; } @@ -868,6 +900,28 @@ void RNA_api_sequences(BlenderRNA *brna, PropertyRNA *cprop, const bool metastri parm = RNA_def_pointer(func, "sequence", "Sequence", "", "New Sequence"); RNA_def_function_return(func, parm); + func = RNA_def_function(srna, "new_meta", new_meta_func_name); + RNA_def_function_flag(func, FUNC_USE_SELF_ID); + RNA_def_function_ui_description(func, "Add a new meta sequence"); + parm = RNA_def_string(func, "name", "Name", 0, "", "Name for the new sequence"); + RNA_def_parameter_flags(parm, 0, PARM_REQUIRED); + parm = RNA_def_int( + func, "channel", 0, 1, MAXSEQ, "Channel", "The channel for the new sequence", 1, MAXSEQ); + RNA_def_parameter_flags(parm, 0, PARM_REQUIRED); + parm = RNA_def_int(func, + "frame_start", + 0, + -MAXFRAME, + MAXFRAME, + "", + "The start frame for the new sequence", + -MAXFRAME, + MAXFRAME); + RNA_def_parameter_flags(parm, 0, PARM_REQUIRED); + /* return type */ + parm = RNA_def_pointer(func, "sequence", "Sequence", "", "New Sequence"); + RNA_def_function_return(func, parm); + func = RNA_def_function(srna, "new_effect", new_effect_func_name); RNA_def_function_flag(func, FUNC_USE_REPORTS | FUNC_USE_SELF_ID); RNA_def_function_ui_description(func, "Add a new effect sequence"); diff --git a/source/blender/sequencer/SEQ_add.h b/source/blender/sequencer/SEQ_add.h index 7d728b25a30..983f5ab1391 100644 --- a/source/blender/sequencer/SEQ_add.h +++ b/source/blender/sequencer/SEQ_add.h @@ -79,6 +79,9 @@ struct Sequence *SEQ_add_sound_strip(struct Main *bmain, struct Scene *scene, struct ListBase *seqbase, struct SeqLoadData *load_data); +struct Sequence *SEQ_add_meta_strip(struct Scene *scene, + struct ListBase *seqbase, + struct SeqLoadData *load_data); struct Sequence *SEQ_add_movie_strip(struct Main *bmain, struct Scene *scene, struct ListBase *seqbase, diff --git a/source/blender/sequencer/intern/strip_add.c b/source/blender/sequencer/intern/strip_add.c index 54e71ff0698..aab522da659 100644 --- a/source/blender/sequencer/intern/strip_add.c +++ b/source/blender/sequencer/intern/strip_add.c @@ -412,6 +412,32 @@ Sequence *SEQ_add_sound_strip(Main *UNUSED(bmain), } #endif // WITH_AUDASPACE +/** + * Add meta strip. + * + * \param scene: Scene where strips will be added + * \param seqbase: ListBase where strips will be added + * \param load_data: SeqLoadData with information necessary to create strip + * \return created strip + */ + +Sequence *SEQ_add_meta_strip(Scene *scene, ListBase *seqbase, SeqLoadData *load_data) +{ + /* Allocate sequence. */ + Sequence *seqm = SEQ_sequence_alloc( + seqbase, load_data->start_frame, load_data->channel, SEQ_TYPE_META); + + /* Set name. */ + seq_add_set_name(seqm, load_data); + + /* Set frames start and length. */ + seqm->start = load_data->start_frame; + seqm->len = 1; + SEQ_time_update_sequence(scene, seqm); + + return seqm; +} + /** * Add movie strip. * -- cgit v1.2.3