From a92b8b7ff6fae4a5d11baebb062b83e7b1b61dcc Mon Sep 17 00:00:00 2001 From: Peter Schlaile Date: Sun, 25 Apr 2010 12:53:39 +0000 Subject: == Sequencer == This adds MULTICAM-editing support for blender. (Well, the beginning of.) There is now a new effect track, named MULTICAM, which just selects one of the lower tracks. Doesn't sound that exciting, but if you combine this with A/B-Trim (moving split points of two directly connected tracks around, while magically resizing both strips, something to be added), you just do: * add several tracks for your camera angles * (optionally) sync those tracks * add one multicam track on top Use that multicam-track to edit your movie. (Either using fcurves on the multicam source selector or using knife-tool and A/B-Trim.) Compare that to: * add several tracks * add cross fades between them * do some python scripting to add several fcurves to make that beast somewhat work. * cry out loud, using it, if you have to move cut points around Alternatively, even harder: * just edit the old way and put strip after strip You might think, that this isn't really helpfull for animators, but consider using scene-strips (in OpenGL-mode) for input, that are set for different camera angles and can now be intercut a lot more easily... Also: small fix on the way: the speed effect can now be used in cascade. (Don't know, if anyone used it that way, but now it works.) --- source/blender/blenkernel/BKE_sequencer.h | 19 +-- source/blender/blenkernel/intern/seqeffects.c | 160 +++++++++++++++------ source/blender/blenkernel/intern/sequencer.c | 46 ++++-- .../editors/space_sequencer/sequencer_draw.c | 5 +- .../editors/space_sequencer/sequencer_edit.c | 1 + source/blender/makesdna/DNA_sequence_types.h | 6 +- source/blender/makesrna/RNA_access.h | 1 + source/blender/makesrna/intern/rna_sequencer.c | 24 ++++ 8 files changed, 201 insertions(+), 61 deletions(-) diff --git a/source/blender/blenkernel/BKE_sequencer.h b/source/blender/blenkernel/BKE_sequencer.h index 40168882dcb..2bf6eee5e6b 100644 --- a/source/blender/blenkernel/BKE_sequencer.h +++ b/source/blender/blenkernel/BKE_sequencer.h @@ -112,22 +112,22 @@ struct SeqEffectHandle { /* stores the y-range of the effect IPO */ void (*store_icu_yrange)(struct Sequence * seq, - short adrcode, float *ymin, float *ymax); + short adrcode, float *ymin, float *ymax); /* stores the default facf0 and facf1 if no IPO is present */ void (*get_default_fac)(struct Sequence *seq, int cfra, - float * facf0, float * facf1); + float * facf0, float * facf1); /* execute the effect - sequence effects are only required to either support - float-rects or byte-rects - (mixed cases are handled one layer up...) */ + sequence effects are only required to either support + float-rects or byte-rects + (mixed cases are handled one layer up...) */ void (*execute)(struct Scene *scene, struct Sequence *seq, int cfra, - float facf0, float facf1, - int x, int y, - struct ImBuf *ibuf1, struct ImBuf *ibuf2, - struct ImBuf *ibuf3, struct ImBuf *out); + float facf0, float facf1, + int x, int y, int preview_render_size, + struct ImBuf *ibuf1, struct ImBuf *ibuf2, + struct ImBuf *ibuf3, struct ImBuf *out); }; /* ********************* prototypes *************** */ @@ -149,6 +149,7 @@ char *give_seqname(struct Sequence *seq); struct ImBuf *give_ibuf_seq(struct Scene *scene, int rectx, int recty, int cfra, int chanshown, int render_size); struct ImBuf *give_ibuf_seq_threaded(struct Scene *scene, int rectx, int recty, int cfra, int chanshown, int render_size); struct ImBuf *give_ibuf_seq_direct(struct Scene *scene, int rectx, int recty, int cfra, int render_size, struct Sequence *seq); +struct ImBuf *give_ibuf_seqbase(struct Scene *scene, int rectx, int recty, int cfra, int chan_shown, int render_size, struct ListBase *seqbasep); void give_ibuf_prefetch_request(int rectx, int recty, int cfra, int chanshown, int render_size); void calc_sequence(struct Scene *scene, struct Sequence *seq); void calc_sequence_disp(struct Scene *scene, struct Sequence *seq); diff --git a/source/blender/blenkernel/intern/seqeffects.c b/source/blender/blenkernel/intern/seqeffects.c index 3c9227fd2a6..b5f9c8fe542 100644 --- a/source/blender/blenkernel/intern/seqeffects.c +++ b/source/blender/blenkernel/intern/seqeffects.c @@ -230,9 +230,10 @@ static ImBuf * IMB_cast_away_list(ImBuf * i) } static void do_plugin_effect(Scene *scene, Sequence *seq, int cfra, - float facf0, float facf1, int x, int y, - struct ImBuf *ibuf1, struct ImBuf *ibuf2, - struct ImBuf *ibuf3, struct ImBuf *out) + float facf0, float facf1, int x, int y, + int preview_render_size, + struct ImBuf *ibuf1, struct ImBuf *ibuf2, + struct ImBuf *ibuf3, struct ImBuf *out) { char *cp; int float_rendering; @@ -477,6 +478,7 @@ static void do_alphaover_effect_float(float facf0, float facf1, int x, int y, static void do_alphaover_effect(Scene *scene, Sequence *seq, int cfra, float facf0, float facf1, int x, int y, + int preview_render_size, struct ImBuf *ibuf1, struct ImBuf *ibuf2, struct ImBuf *ibuf3, struct ImBuf *out) { @@ -644,6 +646,7 @@ static void do_alphaunder_effect_float(float facf0, float facf1, int x, int y, static void do_alphaunder_effect(Scene *scene, Sequence *seq, int cfra, float facf0, float facf1, int x, int y, + int preview_render_size, struct ImBuf *ibuf1, struct ImBuf *ibuf2, struct ImBuf *ibuf3, struct ImBuf *out) { @@ -763,9 +766,10 @@ void do_cross_effect_float(float facf0, float facf1, int x, int y, /* carefull: also used by speed effect! */ static void do_cross_effect(Scene *scene, Sequence *seq, int cfra, - float facf0, float facf1, int x, int y, - struct ImBuf *ibuf1, struct ImBuf *ibuf2, - struct ImBuf *ibuf3, struct ImBuf *out) + float facf0, float facf1, int x, int y, + int preview_render_size, + struct ImBuf *ibuf1, struct ImBuf *ibuf2, + struct ImBuf *ibuf3, struct ImBuf *out) { if (out->rect_float) { do_cross_effect_float( @@ -1026,6 +1030,7 @@ static void do_gammacross_effect_float(float facf0, float facf1, static void do_gammacross_effect(Scene *scene, Sequence *seq, int cfra, float facf0, float facf1, int x, int y, + int preview_render_size, struct ImBuf *ibuf1, struct ImBuf *ibuf2, struct ImBuf *ibuf3, struct ImBuf *out) { @@ -1140,6 +1145,7 @@ static void do_add_effect_float(float facf0, float facf1, int x, int y, static void do_add_effect(Scene *scene, Sequence *seq, int cfra, float facf0, float facf1, int x, int y, + int preview_render_size, struct ImBuf *ibuf1, struct ImBuf *ibuf2, struct ImBuf *ibuf3, struct ImBuf *out) { @@ -1251,7 +1257,8 @@ static void do_sub_effect_float(float facf0, float facf1, int x, int y, } static void do_sub_effect(Scene *scene, Sequence *seq, int cfra, - float facf0, float facf1, int x, int y, + float facf0, float facf1, int x, int y, + int preview_render_size, struct ImBuf *ibuf1, struct ImBuf *ibuf2, struct ImBuf *ibuf3, struct ImBuf *out) { @@ -1360,6 +1367,7 @@ static void do_drop_effect_float(float facf0, float facf1, int x, int y, static void do_drop_effect(Scene *scene, Sequence *seq, int cfra, float facf0, float facf1, int x, int y, + int preview_render_size, struct ImBuf *ibuf1, struct ImBuf *ibuf2, struct ImBuf * ibuf3, struct ImBuf *out) @@ -1481,6 +1489,7 @@ static void do_mul_effect_float(float facf0, float facf1, int x, int y, static void do_mul_effect(Scene *scene, Sequence *seq, int cfra, float facf0, float facf1, int x, int y, + int preview_render_size, struct ImBuf *ibuf1, struct ImBuf *ibuf2, struct ImBuf *ibuf3, struct ImBuf *out) { @@ -1931,6 +1940,7 @@ static void do_wipe_effect_float(Sequence *seq, float facf0, float facf1, static void do_wipe_effect(Scene *scene, Sequence *seq, int cfra, float facf0, float facf1, int x, int y, + int preview_render_size, struct ImBuf *ibuf1, struct ImBuf *ibuf2, struct ImBuf *ibuf3, struct ImBuf *out) { @@ -2075,9 +2085,10 @@ static void do_transform(Scene *scene, Sequence *seq, float facf0, int x, int y, static void do_transform_effect(Scene *scene, Sequence *seq,int cfra, - float facf0, float facf1, int x, int y, - struct ImBuf *ibuf1, struct ImBuf *ibuf2, - struct ImBuf *ibuf3, struct ImBuf *out) + float facf0, float facf1, int x, int y, + int preview_render_size, + struct ImBuf *ibuf1, struct ImBuf *ibuf2, + struct ImBuf *ibuf3, struct ImBuf *out) { do_transform(scene, seq, facf0, x, y, ibuf1, out); } @@ -2588,6 +2599,7 @@ static void do_glow_effect_float(Sequence *seq, float facf0, float facf1, static void do_glow_effect(Scene *scene, Sequence *seq, int cfra, float facf0, float facf1, int x, int y, + int preview_render_size, struct ImBuf *ibuf1, struct ImBuf *ibuf2, struct ImBuf *ibuf3, struct ImBuf *out) { @@ -2643,6 +2655,7 @@ static int early_out_color(struct Sequence *seq, static void do_solid_color(Scene *scene, Sequence *seq, int cfra, float facf0, float facf1, int x, int y, + int preview_render_size, struct ImBuf *ibuf1, struct ImBuf *ibuf2, struct ImBuf *ibuf3, struct ImBuf *out) { @@ -2717,6 +2730,64 @@ static void do_solid_color(Scene *scene, Sequence *seq, int cfra, } } +/* ********************************************************************** + MULTICAM + ********************************************************************** */ + +/* no effect inputs for multicam, we use give_ibuf_seq */ +static int num_inputs_multicam() +{ + return 0; +} + +static int early_out_multicam(struct Sequence *seq, float facf0, float facf1) +{ + return -1; +} + +static void do_multicam(Scene *scene, Sequence *seq, int cfra, + float facf0, float facf1, int x, int y, + int preview_render_size, + struct ImBuf *ibuf1, struct ImBuf *ibuf2, + struct ImBuf *ibuf3, struct ImBuf *out) +{ + struct ImBuf * i; + Editing * ed; + ListBase * seqbasep; + + if (seq->multicam_source == 0 || seq->multicam_source >= seq->machine) { + return; + } + + ed = scene->ed; + if (!ed) { + return; + } + seqbasep = seq_seqbase(&ed->seqbase, seq); + if (!seqbasep) { + return; + } + + i = give_ibuf_seqbase(scene, + out->x, out->y, cfra, seq->multicam_source, + preview_render_size, seqbasep); + if (!i) { + return; + } + + if (out->rect && i->rect) { + memcpy(out->rect, i->rect, out->x * out->y * 4); + } else if (out->rect_float && i->rect_float) { + memcpy(out->rect_float, i->rect_float, out->x * out->y *4*sizeof(float)); + } else if (out->rect && i->rect_float) { + IMB_rect_from_float(i); + memcpy(out->rect, i->rect, out->x * out->y * 4); + } else if (out->rect_float && i->rect) { + IMB_float_from_rect(i); + memcpy(out->rect_float, i->rect_float, out->x * out->y *4*sizeof(float)); + } +} + /* ********************************************************************** SPEED ********************************************************************** */ @@ -2854,16 +2925,16 @@ void sequence_effect_speed_rebuild_map(Scene *scene, Sequence * seq, int force) for (cfra = 1; cfra < v->length; cfra++) { if(fcu) { - if((seq->flag & SEQ_IPO_FRAME_LOCKED) != 0) { - ctime = seq->startdisp + cfra; - div = 1.0; - } else { - ctime= cfra; - div= v->length / 100.0f; - if(div==0.0) return; - } - - facf = evaluate_fcurve(fcu, ctime/div); + if((seq->flag & SEQ_IPO_FRAME_LOCKED) != 0) { + ctime = seq->startdisp + cfra; + div = 1.0; + } else { + ctime= cfra; + div= v->length / 100.0f; + if(div==0.0) return; + } + + facf = evaluate_fcurve(fcu, ctime/div); } else { facf = fallback_fac; } @@ -2885,19 +2956,19 @@ void sequence_effect_speed_rebuild_map(Scene *scene, Sequence * seq, int force) for (cfra = 0; cfra < v->length; cfra++) { if(fcu) { - if((seq->flag & SEQ_IPO_FRAME_LOCKED) != 0) { - ctime = seq->startdisp + cfra; - div = 1.0; - } else { - ctime= cfra; - div= v->length / 100.0f; - if(div==0.0) return; - } - - facf = evaluate_fcurve(fcu, ctime / div); - if (v->flags & SEQ_SPEED_COMPRESS_IPO_Y) { - facf *= v->length; - } + if((seq->flag & SEQ_IPO_FRAME_LOCKED) != 0) { + ctime = seq->startdisp + cfra; + div = 1.0; + } else { + ctime= cfra; + div= v->length / 100.0f; + if(div==0.0) return; + } + + facf = evaluate_fcurve(fcu, ctime / div); + if (v->flags & SEQ_SPEED_COMPRESS_IPO_Y) { + facf *= v->length; + } } if (!fcu) { @@ -3005,16 +3076,20 @@ static void get_default_fac_fade(struct Sequence *seq, int cfra, } static void do_overdrop_effect(Scene *scene, Sequence *seq, int cfra, - float fac, float facf, - int x, int y, struct ImBuf * ibuf1, - struct ImBuf * ibuf2, - struct ImBuf * ibuf3, - struct ImBuf * out) + float fac, float facf, + int x, int y, + int preview_render_size, + struct ImBuf * ibuf1, + struct ImBuf * ibuf2, + struct ImBuf * ibuf3, + struct ImBuf * out) { do_drop_effect(scene, seq, cfra, fac, facf, x, y, - ibuf1, ibuf2, ibuf3, out); + preview_render_size, + ibuf1, ibuf2, ibuf3, out); do_alphaover_effect(scene, seq, cfra, fac, facf, x, y, - ibuf1, ibuf2, ibuf3, out); + preview_render_size, + ibuf1, ibuf2, ibuf3, out); } static struct SeqEffectHandle get_sequence_effect_impl(int seq_type) @@ -3121,6 +3196,11 @@ static struct SeqEffectHandle get_sequence_effect_impl(int seq_type) rval.early_out = do_plugin_early_out; rval.get_default_fac = get_default_fac_fade; break; + case SEQ_MULTICAM: + rval.num_inputs = num_inputs_multicam; + rval.early_out = early_out_multicam; + rval.execute = do_multicam; + break; } return rval; diff --git a/source/blender/blenkernel/intern/sequencer.c b/source/blender/blenkernel/intern/sequencer.c index d6bb5cc3745..8de093cd845 100644 --- a/source/blender/blenkernel/intern/sequencer.c +++ b/source/blender/blenkernel/intern/sequencer.c @@ -886,7 +886,8 @@ static void multibuf(ImBuf *ibuf, float fmul) } } -static void do_effect(Scene *scene, int cfra, Sequence *seq, TStripElem * se) +static void do_effect(Scene *scene, int cfra, Sequence *seq, TStripElem * se, + int render_size) { TStripElem *se1, *se2, *se3; float fac, facf; @@ -920,7 +921,7 @@ static void do_effect(Scene *scene, int cfra, Sequence *seq, TStripElem * se) if (early_out == -1) { /* no input needed */ sh.execute(scene, seq, cfra, fac, facf, - se->ibuf->x, se->ibuf->y, + se->ibuf->x, se->ibuf->y, render_size, 0, 0, 0, se->ibuf); return; } @@ -1008,7 +1009,8 @@ static void do_effect(Scene *scene, int cfra, Sequence *seq, TStripElem * se) IMB_rect_from_float(se3->ibuf); } - sh.execute(scene, seq, cfra, fac, facf, x, y, se1->ibuf, se2->ibuf, se3->ibuf, + sh.execute(scene, seq, cfra, fac, facf, x, y, render_size, + se1->ibuf, se2->ibuf, se3->ibuf, se->ibuf); } @@ -2023,7 +2025,7 @@ static void do_build_seq_ibuf(Scene *scene, Sequence * seq, TStripElem *se, int else se->ibuf= IMB_allocImBuf((short)seqrectx, (short)seqrecty, 32, IB_rect, 0); - do_effect(scene, cfra, seq, se); + do_effect(scene, cfra, seq, se, render_size); if (input_have_to_preprocess(scene, seq, se, cfra, seqrectx, seqrecty) && !build_proxy_run) { @@ -2362,7 +2364,7 @@ static TStripElem* do_handle_speed_effect(Scene *scene, Sequence * seq, int cfra test_and_auto_discard_ibuf(se, seqrectx, seqrecty); if (se->ibuf == NULL) { - se1 = do_build_seq_recursively_impl(scene, seq->seq1, cfra_left, render_size, seqrectx, seqrecty); + se1 = do_build_seq_recursively(scene, seq->seq1, cfra_left, render_size, seqrectx, seqrecty); if((se1 && se1->ibuf && se1->ibuf->rect_float)) se->ibuf= IMB_allocImBuf((short)seqrectx, (short)seqrecty, 32, IB_rectfloat, 0); @@ -2394,8 +2396,8 @@ static TStripElem* do_handle_speed_effect(Scene *scene, Sequence * seq, int cfra } if (se->ibuf == NULL) { - se1 = do_build_seq_recursively_impl(scene, seq->seq1, cfra_left, render_size, seqrectx, seqrecty); - se2 = do_build_seq_recursively_impl(scene, seq->seq1, cfra_right, render_size, seqrectx, seqrecty); + se1 = do_build_seq_recursively(scene, seq->seq1, cfra_left, render_size, seqrectx, seqrecty); + se2 = do_build_seq_recursively(scene, seq->seq1, cfra_right, render_size, seqrectx, seqrecty); if((se1 && se1->ibuf && se1->ibuf->rect_float)) se->ibuf= IMB_allocImBuf((short)seqrectx, (short)seqrecty, 32, IB_rectfloat, 0); @@ -2411,6 +2413,7 @@ static TStripElem* do_handle_speed_effect(Scene *scene, Sequence * seq, int cfra f_cfra - (float) cfra_left, f_cfra - (float) cfra_left, se->ibuf->x, se->ibuf->y, + render_size, se1->ibuf, se2->ibuf, 0, se->ibuf); } } @@ -2450,6 +2453,11 @@ static TStripElem* do_handle_speed_effect(Scene *scene, Sequence * seq, int cfra static TStripElem* do_build_seq_recursively(Scene *scene, Sequence * seq, int cfra, int render_size, int seqrectx, int seqrecty) { TStripElem *se; + + /* BAD HACK! Seperate handling for speed effects needed, since + a) you can't just fetch a different cfra within an effect strip + b) we have to blend two frames, and CFRA is not float... + */ if (seq->type == SEQ_SPEED) { se = do_handle_speed_effect(scene, seq, cfra, render_size, seqrectx, seqrecty); } else { @@ -2679,12 +2687,12 @@ static TStripElem* do_build_seq_array_recursively( if (swap_input) { sh.execute(scene, seq, cfra, - facf, facf, x, y, + facf, facf, x, y, render_size, se2->ibuf, se1->ibuf_comp, 0, se2->ibuf_comp); } else { sh.execute(scene, seq, cfra, - facf, facf, x, y, + facf, facf, x, y, render_size, se1->ibuf_comp, se2->ibuf, 0, se2->ibuf_comp); } @@ -2746,6 +2754,26 @@ static ImBuf *give_ibuf_seq_impl(Scene *scene, int rectx, int recty, int cfra, i return se->ibuf_comp; } +ImBuf *give_ibuf_seqbase(struct Scene *scene, int rectx, int recty, int cfra, int chanshown, int render_size, ListBase *seqbasep) +{ + TStripElem *se; + + se = do_build_seq_array_recursively(scene, seqbasep, cfra, chanshown, render_size, rectx, recty); + + if(!se) { + return 0; + } + + check_limiter_refcount_comp("give_ibuf_seqbase", se); + + if (se->ibuf_comp) { + IMB_cache_limiter_unref(se->ibuf_comp); + } + + return se->ibuf_comp; +} + + ImBuf *give_ibuf_seq_direct(Scene *scene, int rectx, int recty, int cfra, int render_size, Sequence *seq) { TStripElem* se; diff --git a/source/blender/editors/space_sequencer/sequencer_draw.c b/source/blender/editors/space_sequencer/sequencer_draw.c index 60927b5f3dd..0c0f44df170 100644 --- a/source/blender/editors/space_sequencer/sequencer_draw.c +++ b/source/blender/editors/space_sequencer/sequencer_draw.c @@ -126,6 +126,7 @@ static void get_seq_color3ubv(Scene *curscene, Sequence *seq, char *col) case SEQ_ALPHAUNDER: case SEQ_OVERDROP: case SEQ_GLOW: + case SEQ_MULTICAM: /* slightly offset hue to distinguish different effects */ UI_GetThemeColor3ubv(TH_SEQ_EFFECT, col); @@ -451,7 +452,9 @@ static void draw_seq_text(View2D *v2d, Sequence *seq, float x1, float x2, float else { sprintf(str, "%d | %s", seq->len, name); } - + } + else if(seq->type == SEQ_MULTICAM) { + sprintf(str, "Cam: %d", seq->multicam_source); } else if(seq->type == SEQ_IMAGE) { sprintf(str, "%d | %s%s", seq->len, seq->strip->dir, seq->strip->stripdata->name); diff --git a/source/blender/editors/space_sequencer/sequencer_edit.c b/source/blender/editors/space_sequencer/sequencer_edit.c index 7f95c1cb270..bc6efc19648 100644 --- a/source/blender/editors/space_sequencer/sequencer_edit.c +++ b/source/blender/editors/space_sequencer/sequencer_edit.c @@ -103,6 +103,7 @@ EnumPropertyItem sequencer_prop_effect_types[] = { {SEQ_TRANSFORM, "TRANSFORM", 0, "Transform", "Transform effect strip type"}, {SEQ_COLOR, "COLOR", 0, "Color", "Color effect strip type"}, {SEQ_SPEED, "SPEED", 0, "Speed", "Color effect strip type"}, + {SEQ_MULTICAM, "MULTICAM", 0, "Multicam Selector", ""}, {0, NULL, 0, NULL, NULL} }; diff --git a/source/blender/makesdna/DNA_sequence_types.h b/source/blender/makesdna/DNA_sequence_types.h index 2fd83742367..9f395d6e876 100644 --- a/source/blender/makesdna/DNA_sequence_types.h +++ b/source/blender/makesdna/DNA_sequence_types.h @@ -164,10 +164,11 @@ typedef struct Sequence { struct bSound *sound; /* the linked "bSound" object */ void *scene_sound; - float volume, pad; + float volume; float level, pan; /* level in dB (0=full), pan -1..1 */ int scenenr; /* for scene selection */ + int multicam_source; /* for multicam source selection */ float strobe; void *effectdata; /* Struct pointer for effect settings */ @@ -306,7 +307,8 @@ typedef struct SpeedControlVars { #define SEQ_TRANSFORM 27 #define SEQ_COLOR 28 #define SEQ_SPEED 29 -#define SEQ_EFFECT_MAX 29 +#define SEQ_MULTICAM 30 +#define SEQ_EFFECT_MAX 30 #define STRIPELEM_FAILED 0 #define STRIPELEM_OK 1 diff --git a/source/blender/makesrna/RNA_access.h b/source/blender/makesrna/RNA_access.h index 3ee251c4437..725e52f08fe 100644 --- a/source/blender/makesrna/RNA_access.h +++ b/source/blender/makesrna/RNA_access.h @@ -316,6 +316,7 @@ extern StructRNA RNA_MotionPath; extern StructRNA RNA_MotionPathVert; extern StructRNA RNA_MouseSensor; extern StructRNA RNA_MovieSequence; +extern StructRNA RNA_MulticamSequence; extern StructRNA RNA_MultiresModifier; extern StructRNA RNA_MusgraveTexture; extern StructRNA RNA_NandController; diff --git a/source/blender/makesrna/intern/rna_sequencer.c b/source/blender/makesrna/intern/rna_sequencer.c index 8aee2b50b52..d08819ade7c 100644 --- a/source/blender/makesrna/intern/rna_sequencer.c +++ b/source/blender/makesrna/intern/rna_sequencer.c @@ -297,6 +297,8 @@ static StructRNA* rna_Sequence_refine(struct PointerRNA *ptr) case SEQ_MUL: case SEQ_OVERDROP: return &RNA_EffectSequence; + case SEQ_MULTICAM: + return &RNA_MulticamSequence; case SEQ_PLUGIN: return &RNA_PluginSequence; case SEQ_WIPE: @@ -603,6 +605,7 @@ static void rna_def_sequence(BlenderRNA *brna) {SEQ_TRANSFORM, "TRANSFORM", 0, "Transform", ""}, {SEQ_COLOR, "COLOR", 0, "Color", ""}, {SEQ_SPEED, "SPEED", 0, "Speed", ""}, + {SEQ_MULTICAM, "MULTICAM", 0, "Multicam Selector", ""}, {0, NULL, 0, NULL, NULL}}; static const EnumPropertyItem blend_mode_items[]= { @@ -1057,6 +1060,26 @@ static void rna_def_effect(BlenderRNA *brna) rna_def_proxy(srna); } +static void rna_def_multicam(BlenderRNA *brna) +{ + StructRNA *srna; + PropertyRNA *prop; + + srna = RNA_def_struct(brna, "MulticamSequence", "Sequence"); + RNA_def_struct_ui_text(srna, "Multicam Select Sequence", "Sequence strip to perform multicam editing: select channel from below"); + RNA_def_struct_sdna(srna, "Sequence"); + + prop= RNA_def_property(srna, "multicam_source", PROP_INT, PROP_UNSIGNED); + RNA_def_property_int_sdna(prop, NULL, "multicam_source"); + RNA_def_property_range(prop, 0, MAXSEQ-1); + RNA_def_property_ui_text(prop, "Multicam Source Channel", ""); + RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update"); + + rna_def_filter_video(srna); + rna_def_proxy(srna); + rna_def_input(srna); +} + static void rna_def_plugin(BlenderRNA *brna) { StructRNA *srna; @@ -1305,6 +1328,7 @@ void RNA_def_sequencer(BlenderRNA *brna) rna_def_movie(brna); rna_def_sound(brna); rna_def_effect(brna); + rna_def_multicam(brna); rna_def_plugin(brna); rna_def_wipe(brna); rna_def_glow(brna); -- cgit v1.2.3