Merging r50037 through r50039 from trunk into soc-2011-tomato
authorSergey Sharybin <sergey.vfx@gmail.com>
Mon, 20 Aug 2012 10:57:51 +0000 (10:57 +0000)
committerSergey Sharybin <sergey.vfx@gmail.com>
Mon, 20 Aug 2012 10:57:51 +0000 (10:57 +0000)
source/blender/blenkernel/BKE_sequencer.h
source/blender/blenkernel/intern/seqmodifier.c
source/blender/blenkernel/intern/sequencer.c
source/blender/editors/space_sequencer/sequencer_modifier.c
source/blender/makesrna/RNA_enum_types.h
source/blender/makesrna/intern/rna_object.c
source/blender/makesrna/intern/rna_sequencer.c

index d05e065ac15c35e880b6f9eec9d44498d75bad9d..7a5c45e4800fbf9da06cc5ebeed1c0ef76a2b800 100644 (file)
@@ -384,7 +384,9 @@ typedef struct SequenceModifierTypeInfo {
 
 struct SequenceModifierTypeInfo *BKE_sequence_modifier_type_info_get(int type);
 
-void BKE_sequence_modifier_new(struct Sequence *seq, int type);
+struct SequenceModifierData *BKE_sequence_modifier_new(struct Sequence *seq, const char *name, int type);
+int BKE_sequence_modifier_remove(struct Sequence *seq, struct SequenceModifierData *smd);
+void BKE_sequence_modifier_clear(struct Sequence *seq);
 void BKE_sequence_modifier_free(struct SequenceModifierData *smd);
 void BKE_sequence_modifier_unique_name(struct Sequence *seq, struct SequenceModifierData *smd);
 struct SequenceModifierData *BKE_sequence_modifier_find_by_name(struct Sequence *seq, char *name);
index 4157a3a1562a8ad79228d281e5d518711f4bf410..26c2fe036883d4479d6ebb616fc74c50f8956af5 100644 (file)
@@ -417,7 +417,7 @@ SequenceModifierTypeInfo *BKE_sequence_modifier_type_info_get(int type)
        return modifiersTypes[type];
 }
 
-void BKE_sequence_modifier_new(Sequence *seq, int type)
+SequenceModifierData *BKE_sequence_modifier_new(Sequence *seq, const char *name, int type)
 {
        SequenceModifierData *smd;
        SequenceModifierTypeInfo *smti = BKE_sequence_modifier_type_info_get(type);
@@ -427,7 +427,10 @@ void BKE_sequence_modifier_new(Sequence *seq, int type)
        smd->type = type;
        smd->flag |= SEQUENCE_MODIFIER_EXPANDED;
 
-       BLI_strncpy(smd->name, smti->name, sizeof(smd->name));
+       if (!name || !name[0])
+               BLI_strncpy(smd->name, smti->name, sizeof(smd->name));
+       else
+               BLI_strncpy(smd->name, name, sizeof(smd->name));
 
        BLI_addtail(&seq->modifiers, smd);
 
@@ -435,6 +438,31 @@ void BKE_sequence_modifier_new(Sequence *seq, int type)
 
        if (smti->init_data)
                smti->init_data(smd);
+
+       return smd;
+}
+
+int BKE_sequence_modifier_remove(Sequence *seq, SequenceModifierData *smd)
+{
+       if (BLI_findindex(&seq->modifiers, smd) == -1)
+               return FALSE;
+
+       BLI_remlink(&seq->modifiers, smd);
+       BKE_sequence_modifier_free(smd);
+
+       return TRUE;
+}
+
+void BKE_sequence_modifier_clear(Sequence *seq)
+{
+       SequenceModifierData *smd, *smd_next;
+
+       for (smd = seq->modifiers.first; smd; smd = smd_next) {
+               smd_next = smd->next;
+               BKE_sequence_modifier_free(smd);
+       }
+
+       seq->modifiers.first = seq->modifiers.last = NULL;
 }
 
 void BKE_sequence_modifier_free(SequenceModifierData *smd)
index 7daa7fd723c99f80f2132ece9af8f4ed3acc4958..edbbbe10300d841fcd95bc67d3b7ee0f166c2890 100644 (file)
@@ -205,14 +205,7 @@ void BKE_sequence_free(Scene *scene, Sequence *seq)
        }
 
        /* free modifiers */
-       if (seq->modifiers.first) {
-               SequenceModifierData *smd, *smd_next;
-
-               for (smd = seq->modifiers.first; smd; smd = smd_next) {
-                       smd_next = smd->next;
-                       BKE_sequence_modifier_free(smd);
-               }
-       }
+       BKE_sequence_modifier_clear(seq);
 
        BKE_sequencer_cache_cleanup_sequence(seq);
        BKE_sequencer_preprocessed_cache_cleanup_sequence(seq);
@@ -2574,7 +2567,8 @@ static ImBuf *seq_render_strip(SeqRenderData context, Sequence *seq, float cfra)
 
                        ibuf = do_render_strip_uncached(context, seq, cfra);
 
-                       BKE_sequencer_preprocessed_cache_put(context, seq, cfra, SEQ_STRIPELEM_IBUF, ibuf);
+                       if (ibuf)
+                               BKE_sequencer_preprocessed_cache_put(context, seq, cfra, SEQ_STRIPELEM_IBUF, ibuf);
                }
        }
 
index 4ae4b995c110587eaa8faae34cb4fcb0b3e28465..b19d92d67a0382c8eee9df3f78fce8f16de3204e 100644 (file)
@@ -84,7 +84,7 @@ static int strip_modifier_add_exec(bContext *C, wmOperator *op)
        Sequence *seq = BKE_sequencer_active_get(scene);
        int type = RNA_enum_get(op->ptr, "type");
 
-       BKE_sequence_modifier_new(seq, type);
+       BKE_sequence_modifier_new(seq, NULL, type);
 
        BKE_sequence_invalidate_cache(scene, seq);
        WM_event_add_notifier(C, NC_SCENE | ND_SEQUENCER, scene);
@@ -96,14 +96,6 @@ void SEQUENCER_OT_strip_modifier_add(wmOperatorType *ot)
 {
        PropertyRNA *prop;
 
-       /* TODO: de-duplicate from RNA */
-       static EnumPropertyItem sequence_modifier_type_items[] = {
-               {seqModifierType_ColorBalance, "COLOR_BALANCE", ICON_NONE, "Color Balance", ""},
-               {seqModifierType_Curves, "CURVES", ICON_NONE, "Curves", ""},
-               {seqModifierType_HueCorrect,"HUE_CORRECT", ICON_NONE, "Hue Correct", ""},
-               {0, NULL, 0, NULL, NULL}
-       };
-
        /* identifiers */
        ot->name = "Add Strip Modifier";
        ot->idname = "SEQUENCER_OT_strip_modifier_add";
index 2fbee1e9e1a78d17abfcaab3e0056d61c1d253dc..dd230b7b9f821a9dc27717151a854b91725c9f74 100644 (file)
@@ -52,6 +52,7 @@ extern EnumPropertyItem region_type_items[];
 extern EnumPropertyItem modifier_type_items[];
 extern EnumPropertyItem constraint_type_items[];
 extern EnumPropertyItem boidrule_type_items[];
+extern EnumPropertyItem sequence_modifier_type_items[];
 
 extern EnumPropertyItem image_type_items[];
 extern EnumPropertyItem image_color_mode_items[];
index e1f45e4de17cab14ffa05df286f0e83ca31db57a..6dd75e94398fda97067d168b663521732f8905a4 100644 (file)
@@ -1768,7 +1768,7 @@ static void rna_def_object_modifiers(BlenderRNA *brna, PropertyRNA *cprop)
        func = RNA_def_function(srna, "new", "rna_Object_modifier_new");
        RNA_def_function_flag(func, FUNC_USE_CONTEXT | FUNC_USE_REPORTS);
        RNA_def_function_ui_description(func, "Add a new modifier");
-       parm = RNA_def_string(func, "name", "Name", 0, "", "New name for the bone");
+       parm = RNA_def_string(func, "name", "Name", 0, "", "New name for the modifier");
        RNA_def_property_flag(parm, PROP_REQUIRED);
        /* modifier to add */
        parm = RNA_def_enum(func, "type", modifier_type_items, 1, "", "Modifier type to add");
index fd8195005aaa06dd3deb5b3e4da0c169a15fd6e1..e14c1db8a767947527cb43aa989e6036291c0e27 100644 (file)
@@ -30,6 +30,7 @@
 
 #include "RNA_access.h"
 #include "RNA_define.h"
+#include "RNA_enum_types.h"
 
 #include "rna_internal.h"
 
@@ -58,8 +59,20 @@ typedef struct EffectInfo {
        int supports_mask;
 } EffectInfo;
 
+EnumPropertyItem sequence_modifier_type_items[] = {
+       {seqModifierType_ColorBalance, "COLOR_BALANCE", ICON_NONE, "Color Balance", ""},
+       {seqModifierType_Curves, "CURVES", ICON_NONE, "Curves", ""},
+       {seqModifierType_HueCorrect,"HUE_CORRECT", ICON_NONE, "Hue Correct", ""},
+       {0, NULL, 0, NULL, NULL}
+};
+
 #ifdef RNA_RUNTIME
 
+#include "BKE_report.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
 typedef struct SequenceSearchData {
        Sequence *seq;
        void *data;
@@ -961,6 +974,52 @@ static int rna_SequenceModifier_otherSequence_poll(PointerRNA *ptr, PointerRNA v
        return TRUE;
 }
 
+static SequenceModifierData *rna_Sequence_modifier_new(Sequence *seq, bContext *C, ReportList *reports, const char *name, int type)
+{
+       if (!BKE_sequence_supports_modifiers(seq)) {
+               BKE_report(reports, RPT_ERROR, "Sequence type does not support modifiers");
+
+               return NULL;
+       }
+       else {
+               Scene *scene = CTX_data_scene(C);
+               SequenceModifierData *smd;
+
+               smd = BKE_sequence_modifier_new(seq, name, type);
+
+               BKE_sequence_invalidate_cache_for_modifier(scene, seq);
+
+               WM_main_add_notifier(NC_SCENE | ND_SEQUENCER, NULL);
+
+               return smd;
+       }
+}
+
+static void rna_Sequence_modifier_remove(Sequence *seq, bContext *C, ReportList *reports, SequenceModifierData *smd)
+{
+       Scene *scene = CTX_data_scene(C);
+
+       if (BKE_sequence_modifier_remove(seq, smd)) {
+               BKE_sequence_invalidate_cache_for_modifier(scene, seq);
+
+               WM_main_add_notifier(NC_SCENE | ND_SEQUENCER, NULL);
+       }
+       else {
+               BKE_report(reports, RPT_ERROR, "Modifier was not found in the stack");
+       }
+}
+
+static void rna_Sequence_modifier_clear(Sequence *seq, bContext *C)
+{
+       Scene *scene = CTX_data_scene(C);
+
+       BKE_sequence_modifier_clear(seq);
+
+       BKE_sequence_invalidate_cache_for_modifier(scene, seq);
+
+       WM_main_add_notifier(NC_SCENE | ND_SEQUENCER, NULL);
+}
+
 #else
 
 static void rna_def_strip_element(BlenderRNA *brna)
@@ -1210,12 +1269,39 @@ static void rna_def_sequence_modifiers(BlenderRNA *brna, PropertyRNA *cprop)
 {
        StructRNA *srna;
 
+       FunctionRNA *func;
+       PropertyRNA *parm;
+
        RNA_def_property_srna(cprop, "SequenceModifiers");
        srna = RNA_def_struct(brna, "SequenceModifiers", NULL);
        RNA_def_struct_sdna(srna, "Sequence");
        RNA_def_struct_ui_text(srna, "Strip Modifiers", "Collection of strip modifiers");
 
-       /* TODO: implement new/remove/clear methods for modifier stack */
+       /* add modifier */
+       func = RNA_def_function(srna, "new", "rna_Sequence_modifier_new");
+       RNA_def_function_flag(func, FUNC_USE_CONTEXT | FUNC_USE_REPORTS);
+       RNA_def_function_ui_description(func, "Add a new modifier");
+       parm = RNA_def_string(func, "name", "Name", 0, "", "New name for the modifier");
+       RNA_def_property_flag(parm, PROP_REQUIRED);
+       /* modifier to add */
+       parm = RNA_def_enum(func, "type", sequence_modifier_type_items, seqModifierType_ColorBalance, "", "Modifier type to add");
+       RNA_def_property_flag(parm, PROP_REQUIRED);
+       /* return type */
+       parm = RNA_def_pointer(func, "modifier", "SequenceModifier", "", "Newly created modifier");
+       RNA_def_function_return(func, parm);
+
+       /* remove modifier */
+       func = RNA_def_function(srna, "remove", "rna_Sequence_modifier_remove");
+       RNA_def_function_flag(func, FUNC_USE_CONTEXT | FUNC_USE_REPORTS);
+       RNA_def_function_ui_description(func, "Remove an existing modifier from the sequence");
+       /* modifier to remove */
+       parm = RNA_def_pointer(func, "modifier", "SequenceModifier", "", "Modifier to remove");
+       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
+
+       /* clear all modifiers */
+       func = RNA_def_function(srna, "clear", "rna_Sequence_modifier_clear");
+       RNA_def_function_flag(func, FUNC_USE_CONTEXT);
+       RNA_def_function_ui_description(func, "Remove all modifiers from the sequence");
 }
 
 static void rna_def_sequence(BlenderRNA *brna)
@@ -2130,13 +2216,6 @@ static void rna_def_modifier(BlenderRNA *brna)
        StructRNA *srna;
        PropertyRNA *prop;
 
-       static EnumPropertyItem sequence_modifier_type_items[] = {
-               {seqModifierType_ColorBalance, "COLOR_BALANCE", ICON_NONE, "Color Balance", ""},
-               {seqModifierType_Curves, "CURVES", ICON_NONE, "Curves", ""},
-               {seqModifierType_HueCorrect,"HUE_CORRECT", ICON_NONE, "Hue Correct", ""},
-               {0, NULL, 0, NULL, NULL}
-       };
-
        static const EnumPropertyItem mask_input_type_items[] = {
                {SEQUENCE_MASK_INPUT_STRIP, "STRIP", 0, "Strip", "Use sequencer strip as mask input"},
                {SEQUENCE_MASK_INPUT_ID, "ID", 0, "Mask", "Use mask ID as mask input"},