[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [50021] trunk/blender: Sequencer: per-sequence modifier stack for color grading

Sergey Sharybin sergey.vfx at gmail.com
Sun Aug 19 17:41:58 CEST 2012


Revision: 50021
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=50021
Author:   nazgul
Date:     2012-08-19 15:41:56 +0000 (Sun, 19 Aug 2012)
Log Message:
-----------
Sequencer: per-sequence modifier stack for color grading

This implements basic color grading modifiers in sequencer, supporting
color balance, RGB curves and HUE corrections.

Implementation is close to object modifiers, some details are there:

http://wiki.blender.org/index.php/User:Nazg-gul/SequencerModifiers

Modifiers supports multi-threaded calculation, masks and instant
parameter changes.

Also added cache for pre-processed image buffers for current frame,
so changing sequence properties does not require rendering of original
sequence (like rendering scene, loading file from disk and so)

Modified Paths:
--------------
    trunk/blender/release/scripts/startup/bl_ui/space_image.py
    trunk/blender/release/scripts/startup/bl_ui/space_sequencer.py
    trunk/blender/source/blender/blenkernel/BKE_colortools.h
    trunk/blender/source/blender/blenkernel/BKE_sequencer.h
    trunk/blender/source/blender/blenkernel/CMakeLists.txt
    trunk/blender/source/blender/blenkernel/intern/colortools.c
    trunk/blender/source/blender/blenkernel/intern/seqcache.c
    trunk/blender/source/blender/blenkernel/intern/sequencer.c
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/blenloader/intern/writefile.c
    trunk/blender/source/blender/editors/space_sequencer/CMakeLists.txt
    trunk/blender/source/blender/editors/space_sequencer/sequencer_intern.h
    trunk/blender/source/blender/editors/space_sequencer/sequencer_ops.c
    trunk/blender/source/blender/makesdna/DNA_sequence_types.h
    trunk/blender/source/blender/makesrna/intern/rna_sequencer.c
    trunk/blender/source/blender/makesrna/intern/rna_ui_api.c

Added Paths:
-----------
    trunk/blender/source/blender/blenkernel/intern/seqmodifier.c
    trunk/blender/source/blender/editors/space_sequencer/sequencer_modifier.c

Modified: trunk/blender/release/scripts/startup/bl_ui/space_image.py
===================================================================
--- trunk/blender/release/scripts/startup/bl_ui/space_image.py	2012-08-19 15:32:52 UTC (rev 50020)
+++ trunk/blender/release/scripts/startup/bl_ui/space_image.py	2012-08-19 15:41:56 UTC (rev 50021)
@@ -774,7 +774,7 @@
         toolsettings = context.tool_settings.image_paint
         brush = toolsettings.brush
 
-        layout.template_curve_mapping(brush, "curve")
+        layout.template_curve_mapping(brush, "curve", type='COLOR')
 
         row = layout.row(align=True)
         row.operator("brush.curve_preset", icon='SMOOTHCURVE', text="").shape = 'SMOOTH'

Modified: trunk/blender/release/scripts/startup/bl_ui/space_sequencer.py
===================================================================
--- trunk/blender/release/scripts/startup/bl_ui/space_sequencer.py	2012-08-19 15:32:52 UTC (rev 50020)
+++ trunk/blender/release/scripts/startup/bl_ui/space_sequencer.py	2012-08-19 15:41:56 UTC (rev 50021)
@@ -28,6 +28,29 @@
         return None
 
 
+def draw_color_balance(layout, color_balance):
+    col = layout.column()
+    col.label(text="Lift:")
+    col.template_color_wheel(color_balance, "lift", value_slider=True, cubic=True)
+    row = col.row()
+    row.prop(color_balance, "lift", text="")
+    row.prop(color_balance, "invert_lift", text="Inverse")
+
+    col = layout.column()
+    col.label(text="Gamma:")
+    col.template_color_wheel(color_balance, "gamma", value_slider=True, lock_luminosity=True, cubic=True)
+    row = col.row()
+    row.prop(color_balance, "gamma", text="")
+    row.prop(color_balance, "invert_gamma", text="Inverse")
+
+    col = layout.column()
+    col.label(text="Gain:")
+    col.template_color_wheel(color_balance, "gain", value_slider=True, lock_luminosity=True, cubic=True)
+    row = col.row()
+    row.prop(color_balance, "gain", text="")
+    row.prop(color_balance, "invert_gain", text="Inverse")
+
+
 class SEQUENCER_HT_header(Header):
     bl_space_type = 'SEQUENCE_EDITOR'
 
@@ -442,7 +465,7 @@
 
         if strip.is_supports_mask:
             col = layout.column()
-            col.prop_search(strip, "input_mask", sequencer, "sequences")
+            col.prop_search(strip, "input_mask_strip", sequencer, "sequences", text="Mask")
 
         if strip.type == 'COLOR':
             layout.prop(strip, "color")
@@ -772,28 +795,9 @@
 
         layout.prop(strip, "use_color_balance")
         if strip.use_color_balance and strip.color_balance:  # TODO - need to add this somehow
-            col = layout.column()
-            col.label(text="Lift:")
-            col.template_color_wheel(strip.color_balance, "lift", value_slider=True, cubic=True)
-            row = col.row()
-            row.prop(strip.color_balance, "lift", text="")
-            row.prop(strip.color_balance, "invert_lift", text="Inverse")
+            draw_color_balance(layout, strip.color_balance)
 
-            col = layout.column()
-            col.label(text="Gamma:")
-            col.template_color_wheel(strip.color_balance, "gamma", value_slider=True, lock_luminosity=True, cubic=True)
-            row = col.row()
-            row.prop(strip.color_balance, "gamma", text="")
-            row.prop(strip.color_balance, "invert_gamma", text="Inverse")
 
-            col = layout.column()
-            col.label(text="Gain:")
-            col.template_color_wheel(strip.color_balance, "gain", value_slider=True, lock_luminosity=True, cubic=True)
-            row = col.row()
-            row.prop(strip.color_balance, "gain", text="")
-            row.prop(strip.color_balance, "invert_gain", text="Inverse")
-
-
 class SEQUENCER_PT_proxy(SequencerButtonsPanel, Panel):
     bl_label = "Proxy / Timecode"
 
@@ -878,5 +882,46 @@
             col.prop(st, "show_separate_color")
         col.prop(st, "proxy_render_size")
 
+
+class SEQUENCER_PT_modifiers(SequencerButtonsPanel, Panel):
+    bl_label = "Modifiers"
+
+    def draw(self, context):
+        layout = self.layout
+
+        strip = act_strip(context)
+        sequencer = context.scene.sequence_editor
+
+        layout.operator_menu_enum("sequencer.strip_modifier_add", "type")
+
+        for mod in strip.modifiers:
+            box = layout.box()
+
+            row = box.row()
+            row.prop(mod, "show_expanded", text="", emboss=False)
+            row.prop(mod, "name")
+
+            row.prop(mod, "mute", text="")
+            props = row.operator("sequencer.strip_modifier_remove", text="", icon='X')
+            props.name = mod.name
+
+            if mod.show_expanded:
+                row = box.row()
+                row.prop(mod, "input_mask_type", expand=True)
+
+                if mod.input_mask_type == 'STRIP':
+                    box.prop_search(mod, "input_mask_strip", sequencer, "sequences", text="Mask")
+                else:
+                    box.prop(mod, "input_mask_id")
+
+                if mod.type == 'COLOR_BALANCE':
+                    box.prop(mod, "color_multiply")
+                    draw_color_balance(box, mod.color_balance)
+                elif mod.type == 'CURVES':
+                    box.template_curve_mapping(mod, "curve_mapping", type='COLOR')
+                elif mod.type == 'HUE_CORRECT':
+                    box.template_curve_mapping(mod, "curve_mapping", type='HUE')
+
+
 if __name__ == "__main__":  # only for live edit.
     bpy.utils.register_module(__name__)

Modified: trunk/blender/source/blender/blenkernel/BKE_colortools.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_colortools.h	2012-08-19 15:32:52 UTC (rev 50020)
+++ trunk/blender/source/blender/blenkernel/BKE_colortools.h	2012-08-19 15:41:56 UTC (rev 50021)
@@ -47,8 +47,11 @@
 #   define DO_INLINE static inline
 #endif
 
+void                curvemapping_set_defaults(struct CurveMapping *cumap, int tot, float minx, float miny, float maxx, float maxy);
 struct CurveMapping *curvemapping_add(int tot, float minx, float miny, float maxx, float maxy);
+void                curvemapping_free_data(struct CurveMapping *cumap);
 void                curvemapping_free(struct CurveMapping *cumap);
+void                curvemapping_copy_data(struct CurveMapping *target, struct CurveMapping *cumap);
 struct CurveMapping *curvemapping_copy(struct CurveMapping *cumap);
 void                curvemapping_set_black_white(struct CurveMapping *cumap, const float black[3], const float white[3]);
 
@@ -69,6 +72,7 @@
 float               curvemapping_evaluateF(struct CurveMapping *cumap, int cur, float value);
 void                curvemapping_evaluate3F(struct CurveMapping *cumap, float vecout[3], const float vecin[3]);
 void                curvemapping_evaluateRGBF(struct CurveMapping *cumap, float vecout[3], const float vecin[3]);
+void                curvemapping_evaluate_premulRGB(struct CurveMapping *cumap, unsigned char vecout_byte[3], const unsigned char vecin_byte[3]);
 void                curvemapping_evaluate_premulRGBF(struct CurveMapping *cumap, float vecout[3], const float vecin[3]);
 void                curvemapping_do_ibuf(struct CurveMapping *cumap, struct ImBuf *ibuf);
 void                curvemapping_premultiply(struct CurveMapping *cumap, int restore);

Modified: trunk/blender/source/blender/blenkernel/BKE_sequencer.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_sequencer.h	2012-08-19 15:32:52 UTC (rev 50020)
+++ trunk/blender/source/blender/blenkernel/BKE_sequencer.h	2012-08-19 15:41:56 UTC (rev 50021)
@@ -31,11 +31,14 @@
  */
 
 struct bContext;
+struct StripColorBalance;
 struct Editing;
 struct ImBuf;
 struct Main;
+struct Mask;
 struct Scene;
 struct Sequence;
+struct SequenceModifierData;
 struct Strip;
 struct StripElem;
 struct bSound;
@@ -241,6 +244,10 @@
 
 void BKE_sequencer_cache_cleanup_sequence(struct Sequence *seq);
 
+struct ImBuf *BKE_sequencer_preprocessed_cache_get(SeqRenderData context, struct Sequence *seq, float cfra, seq_stripelem_ibuf_t type);
+void BKE_sequencer_preprocessed_cache_put(SeqRenderData context, struct Sequence *seq, float cfra, seq_stripelem_ibuf_t type, struct ImBuf *ibuf);
+void BKE_sequencer_preprocessed_cache_cleanup_sequence(struct Sequence *seq);
+
 /* **********************************************************************
  * seqeffects.c
  *
@@ -289,6 +296,7 @@
 
 int BKE_sequence_check_depend(struct Sequence *seq, struct Sequence *cur);
 void BKE_sequence_invalidate_cache(struct Scene *scene, struct Sequence *seq);
+void BKE_sequence_invalidate_cache_for_modifier(struct Scene *scene, struct Sequence *seq);
 
 void BKE_sequencer_update_sound_bounds_all(struct Scene *scene);
 void BKE_sequencer_update_sound_bounds(struct Scene *scene, struct Sequence *seq);
@@ -347,4 +355,46 @@
 extern ListBase seqbase_clipboard;
 extern int seqbase_clipboard_frame;
 
+/* modifiers */
+typedef struct SequenceModifierTypeInfo {
+	/* default name for the modifier */
+	char name[64];  /* MAX_NAME */
+
+	/* DNA structure name used on load/save filed */
+	char struct_name[64];  /* MAX_NAME */
+
+	/* size of modifier data structure, used by allocation */
+	int struct_size;
+
+	/* data initialization */
+	void (*init_data) (struct SequenceModifierData *smd);
+
+	/* free data used by modifier,
+	 * only modifier-specific data should be freed, modifier descriptor would
+	 * be freed outside of this callback
+	 */
+	void (*free_data) (struct SequenceModifierData *smd);
+
+	/* copy data from one modifier to another */
+	void (*copy_data) (struct SequenceModifierData *smd, struct SequenceModifierData *target);
+
+	/* apply modifier on a given image buffer */
+	struct ImBuf* (*apply) (struct SequenceModifierData *smd, struct ImBuf *ibuf, struct ImBuf *mask);
+} SequenceModifierTypeInfo;
+
+struct SequenceModifierTypeInfo *BKE_sequence_modifier_type_info_get(int type);
+
+void BKE_sequence_modifier_new(struct Sequence *seq, int type);
+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);
+struct ImBuf *BKE_sequence_modifier_apply_stack(SeqRenderData context, struct Sequence *seq, struct ImBuf *ibuf, int cfra);

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list