Sequencer: Add option to use absolute mask animation time
authorSergey Sharybin <sergey.vfx@gmail.com>
Mon, 25 Jan 2016 10:16:49 +0000 (11:16 +0100)
committerSergey Sharybin <sergey.vfx@gmail.com>
Mon, 25 Jan 2016 10:16:49 +0000 (11:16 +0100)
This is handy for cases when mask is created on top of the edit and
used for tasks like color grading and other enhancement.

That was the main purpose of the masks which was totally broken in
6786ef6. Now it's possible to have masks created as both a part of
input movie roto process (which then better be re-mapped to the strip
timing) and as a grading tool (which should be using scene timing
for the animation).

Thanks artists from the Nieve for screaming about such a broken case.

release/scripts/startup/bl_ui/space_sequencer.py
source/blender/blenkernel/intern/seqmodifier.c
source/blender/makesdna/DNA_sequence_types.h
source/blender/makesrna/intern/rna_sequencer.c

index 260919b0857d67be1173e15eda6a45a1d7bb1a2a..eeb6a5063c8687f2fdd6a66962d1cdbe54ca3de6 100644 (file)
@@ -1112,6 +1112,8 @@ class SEQUENCER_PT_modifiers(SequencerButtonsPanel, Panel):
                     box.prop_search(mod, "input_mask_strip", sequences_object, "sequences", text="Mask")
                 else:
                     box.prop(mod, "input_mask_id")
+                    row = box.row()
+                    row.prop(mod, "mask_time", expand=True)
 
                 if mod.type == 'COLOR_BALANCE':
                     box.prop(mod, "color_multiply")
index 84d1c1bc414af43e8adc98f18b60a68964bf43f4..2c46cf128444e8fdddcaf142fafa2238d5298f1e 100644 (file)
@@ -978,7 +978,19 @@ ImBuf *BKE_sequence_modifier_apply_stack(const SeqRenderData *context, Sequence
                        continue;
 
                if (smti->apply) {
-                       ImBuf *mask = modifier_mask_get(smd, context, cfra, seq->start, ibuf->rect_float != NULL);
+                       int frame_offset;
+                       if (smd->mask_time == SEQUENCE_MASK_TIME_RELATIVE) {
+                               frame_offset = seq->start;
+                       }
+                       else /*if (smd->mask_time == SEQUENCE_MASK_TIME_ABSOLUTE)*/ {
+                               frame_offset = 0;
+                       }
+
+                       ImBuf *mask = modifier_mask_get(smd,
+                                                       context,
+                                                       cfra,
+                                                       frame_offset,
+                                                       ibuf->rect_float != NULL);
 
                        if (processed_ibuf == ibuf)
                                processed_ibuf = IMB_dupImBuf(ibuf);
index 0236f41c5b9c0248153f19748dcd6fe43ca70be4..56112d2866f43100656dba66d6a3746436cc6e58 100644 (file)
@@ -308,7 +308,8 @@ typedef struct SequenceModifierData {
        char name[64]; /* MAX_NAME */
 
        /* mask input, either sequence or mask ID */
-       int mask_input_type, pad;
+       int mask_input_type;
+       int mask_time;
 
        struct Sequence *mask_sequence;
        struct Mask     *mask_id;
@@ -557,4 +558,11 @@ enum {
        SEQUENCE_MASK_INPUT_ID      = 1
 };
 
+enum {
+       /* Mask animation will be remapped relative to the strip start frame. */
+       SEQUENCE_MASK_TIME_RELATIVE = 0,
+       /* Global (scene) frame number will be used to access the mask. */
+       SEQUENCE_MASK_TIME_ABSOLUTE = 1,
+};
+
 #endif  /* __DNA_SEQUENCE_TYPES_H__ */
index b49318b436ee0366d015a03b6b63f40d3ca450ea..2c66b737ca4e0713cf0a40b99e3b0ecf998f9c22 100644 (file)
@@ -2422,6 +2422,12 @@ static void rna_def_modifier(BlenderRNA *brna)
                {0, NULL, 0, NULL, NULL}
        };
 
+       static const EnumPropertyItem mask_time_items[] = {
+               {SEQUENCE_MASK_TIME_RELATIVE, "RELATIVE", 0, "Relative", "Mask animation is offset to start of strip"},
+               {SEQUENCE_MASK_TIME_ABSOLUTE, "ABSOLUTE", 0, "Absolute", "Mask animation is in sync with scene frame"},
+               {0, NULL, 0, NULL, NULL}
+       };
+
        srna = RNA_def_struct(brna, "SequenceModifier", NULL);
        RNA_def_struct_sdna(srna, "SequenceModifierData");
        RNA_def_struct_ui_text(srna, "SequenceModifier", "Modifier for sequence strip");
@@ -2458,6 +2464,12 @@ static void rna_def_modifier(BlenderRNA *brna)
        RNA_def_property_ui_text(prop, "Mask Input Type", "Type of input data used for mask");
        RNA_def_property_update(prop, NC_SCENE | ND_SEQUENCER, "rna_SequenceModifier_update");
 
+       prop = RNA_def_property(srna, "mask_time", PROP_ENUM, PROP_NONE);
+       RNA_def_property_enum_sdna(prop, NULL, "mask_time");
+       RNA_def_property_enum_items(prop, mask_time_items);
+       RNA_def_property_ui_text(prop, "Mask Time", "Time to use for the Mask animation");
+       RNA_def_property_update(prop, NC_SCENE | ND_SEQUENCER, "rna_SequenceModifier_update");
+
        prop = RNA_def_property(srna, "input_mask_strip",  PROP_POINTER, PROP_NONE);
        RNA_def_property_pointer_sdna(prop, NULL, "mask_sequence");
        RNA_def_property_pointer_funcs(prop, NULL, NULL, NULL, "rna_SequenceModifier_otherSequence_poll");