1
1

VSE: Add Sequence.parent_meta() python API function

This function can be used to find metastrip parent of nested strip.

Reviewed By: ISS

Differential Revision: https://developer.blender.org/D11985
This commit is contained in:
Félix
2021-08-24 01:16:22 +02:00
committed by Richard Antalik
parent 929d7597b3
commit eec1ea0ccf
6 changed files with 41 additions and 25 deletions

View File

@@ -124,6 +124,14 @@ static Sequence *rna_Sequence_split(
return r_seq;
}
static Sequence *rna_Sequence_parent_meta(ID *id, Sequence *seq_self)
{
Scene *scene = (Scene *)id;
Editing *ed = SEQ_editing_get(scene, false);
return SEQ_find_metastrip_by_sequence(&ed->seqbase, NULL, seq_self);
}
static Sequence *rna_Sequences_new_clip(ID *id,
ListBase *seqbase,
Main *bmain,
@@ -702,6 +710,13 @@ void RNA_api_sequence_strip(StructRNA *srna)
"Meta to move the strip into");
RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
func = RNA_def_function(srna, "parent_meta", "rna_Sequence_parent_meta");
RNA_def_function_flag(func, FUNC_USE_SELF_ID);
RNA_def_function_ui_description(func, "Parent meta");
/* return type */
parm = RNA_def_pointer(func, "sequence", "Sequence", "", "Parent Meta");
RNA_def_function_return(func, parm);
func = RNA_def_function(srna, "invalidate_cache", "rna_Sequence_invalidate_cache_rnafunc");
RNA_def_function_flag(func, FUNC_USE_SELF_ID);
RNA_def_function_ui_description(func,

View File

@@ -65,6 +65,9 @@ void SEQ_cache_iterate(
void *userdata,
bool callback_init(void *userdata, size_t item_count),
bool callback_iter(void *userdata, struct Sequence *seq, int timeline_frame, int cache_type));
struct Sequence *SEQ_find_metastrip_by_sequence(ListBase *seqbase /* = ed->seqbase */,
struct Sequence *meta /* = NULL */,
struct Sequence *seq);
#ifdef __cplusplus
}
#endif

View File

@@ -61,6 +61,7 @@
#include "SEQ_effects.h"
#include "SEQ_proxy.h"
#include "SEQ_relations.h"
#include "SEQ_render.h"
#include "SEQ_utils.h"
@@ -3023,7 +3024,7 @@ static ImBuf *do_adjustment_impl(const SeqRenderData *context, Sequence *seq, fl
if (!i) {
Sequence *meta;
meta = seq_find_metastrip_by_sequence(&ed->seqbase, NULL, seq);
meta = SEQ_find_metastrip_by_sequence(&ed->seqbase, NULL, seq);
if (meta) {
i = do_adjustment_impl(context, meta, timeline_frame);

View File

@@ -504,3 +504,23 @@ void SEQ_relations_check_uuids_unique_and_report(const Scene *scene)
BLI_gset_free(used_uuids, NULL);
}
/* Return immediate parent meta of sequence */
struct Sequence *SEQ_find_metastrip_by_sequence(ListBase *seqbase, Sequence *meta, Sequence *seq)
{
Sequence *iseq;
for (iseq = seqbase->first; iseq; iseq = iseq->next) {
Sequence *rval;
if (seq == iseq) {
return meta;
}
if (iseq->seqbase.first &&
(rval = SEQ_find_metastrip_by_sequence(&iseq->seqbase, iseq, seq))) {
return rval;
}
}
return NULL;
}

View File

@@ -431,7 +431,7 @@ const Sequence *SEQ_get_topmost_sequence(const Scene *scene, int frame)
return best_seq;
}
/* in cases where we done know the sequence's listbase */
/* in cases where we don't know the sequence's listbase */
ListBase *SEQ_get_seqbase_by_seq(ListBase *seqbase, Sequence *seq)
{
Sequence *iseq;
@@ -449,25 +449,6 @@ ListBase *SEQ_get_seqbase_by_seq(ListBase *seqbase, Sequence *seq)
return NULL;
}
Sequence *seq_find_metastrip_by_sequence(ListBase *seqbase, Sequence *meta, Sequence *seq)
{
Sequence *iseq;
for (iseq = seqbase->first; iseq; iseq = iseq->next) {
Sequence *rval;
if (seq == iseq) {
return meta;
}
if (iseq->seqbase.first &&
(rval = seq_find_metastrip_by_sequence(&iseq->seqbase, iseq, seq))) {
return rval;
}
}
return NULL;
}
/**
* Only use as last resort when the StripElem is available but no the Sequence.
* (needed for RNA)

View File

@@ -31,10 +31,6 @@ struct Scene;
bool sequencer_seq_generates_image(struct Sequence *seq);
void seq_open_anim_file(struct Scene *scene, struct Sequence *seq, bool openfile);
struct Sequence *seq_find_metastrip_by_sequence(ListBase *seqbase /* = ed->seqbase */,
struct Sequence *meta /* = NULL */,
struct Sequence *seq);
#ifdef __cplusplus
}
#endif