Merge branch 'master' into blender2.8
This commit is contained in:
		@@ -117,38 +117,44 @@ bool ray_triangle_intersect(
 | 
			
		||||
	const float3 e2 = v1 - v2;
 | 
			
		||||
 | 
			
		||||
	/* Perform edge tests. */
 | 
			
		||||
#ifdef __KERNEL_SSE2__
 | 
			
		||||
#if defined(__KERNEL_SSE2__)  && defined (__KERNEL_SSE__)
 | 
			
		||||
	const float3 crossU = cross(v2 + v0, e0);
 | 
			
		||||
	const float3 crossV = cross(v0 + v1, e1);
 | 
			
		||||
	const float3 crossW = cross(v1 + v2, e2);
 | 
			
		||||
#  ifndef __KERNEL_SSE__
 | 
			
		||||
	const ssef crossX(crossU.x, crossV.x, crossW.x, crossW.x);
 | 
			
		||||
	const ssef crossY(crossU.y, crossV.y, crossW.y, crossW.y);
 | 
			
		||||
	const ssef crossZ(crossU.z, crossV.z, crossW.z, crossW.z);
 | 
			
		||||
#  else
 | 
			
		||||
 | 
			
		||||
	ssef crossX(crossU);
 | 
			
		||||
	ssef crossY(crossV);
 | 
			
		||||
	ssef crossZ(crossW);
 | 
			
		||||
	ssef zero = _mm_setzero_ps();
 | 
			
		||||
	_MM_TRANSPOSE4_PS(crossX, crossY, crossZ, zero);
 | 
			
		||||
#  endif
 | 
			
		||||
 | 
			
		||||
	const ssef dirX(ray_dir.x);
 | 
			
		||||
	const ssef dirY(ray_dir.y);
 | 
			
		||||
	const ssef dirZ(ray_dir.z);
 | 
			
		||||
	/*const*/ ssef UVWW = crossX*dirX + crossY*dirY + crossZ*dirZ;
 | 
			
		||||
	const float minUVW = reduce_min(UVWW);
 | 
			
		||||
	const float maxUVW = reduce_max(UVWW);
 | 
			
		||||
 | 
			
		||||
	ssef UVWW = madd(crossX, dirX, madd(crossY, dirY, crossZ * dirZ));
 | 
			
		||||
#else  /* __KERNEL_SSE2__ */
 | 
			
		||||
	const float U = dot(cross(v2 + v0, e0), ray_dir);
 | 
			
		||||
	const float V = dot(cross(v0 + v1, e1), ray_dir);
 | 
			
		||||
	const float W = dot(cross(v1 + v2, e2), ray_dir);
 | 
			
		||||
#endif  /* __KERNEL_SSE2__ */
 | 
			
		||||
 | 
			
		||||
#if defined(__KERNEL_SSE2__)  && defined (__KERNEL_SSE__)
 | 
			
		||||
	int uvw_sign = movemask(UVWW) & 0x7;
 | 
			
		||||
	if (uvw_sign != 0)
 | 
			
		||||
	{
 | 
			
		||||
		if (uvw_sign != 0x7)
 | 
			
		||||
			return false;
 | 
			
		||||
	}
 | 
			
		||||
#else
 | 
			
		||||
	const float minUVW = min(U, min(V, W));
 | 
			
		||||
	const float maxUVW = max(U, max(V, W));
 | 
			
		||||
#endif  /* __KERNEL_SSE2__ */
 | 
			
		||||
 | 
			
		||||
	if(minUVW < 0.0f && maxUVW > 0.0f) {
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	/* Calculate geometry normal and denominator. */
 | 
			
		||||
	const float3 Ng1 = cross(e1, e0);
 | 
			
		||||
@@ -171,7 +177,7 @@ bool ray_triangle_intersect(
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	const float inv_den = 1.0f / den;
 | 
			
		||||
#ifdef __KERNEL_SSE2__
 | 
			
		||||
#if defined(__KERNEL_SSE2__)  && defined (__KERNEL_SSE__)
 | 
			
		||||
	UVWW *= inv_den;
 | 
			
		||||
	_mm_store_ss(isect_u, UVWW);
 | 
			
		||||
	_mm_store_ss(isect_v, shuffle<1,1,3,3>(UVWW));
 | 
			
		||||
 
 | 
			
		||||
@@ -361,6 +361,7 @@ class SEQUENCER_MT_add_effect(Menu):
 | 
			
		||||
        layout.operator("sequencer.effect_strip_add", text="Wipe").type = 'WIPE'
 | 
			
		||||
        layout.operator("sequencer.effect_strip_add", text="Glow").type = 'GLOW'
 | 
			
		||||
        layout.operator("sequencer.effect_strip_add", text="Text").type = 'TEXT'
 | 
			
		||||
        layout.operator("sequencer.effect_strip_add", text="Color Mix").type = 'COLORMIX'
 | 
			
		||||
        layout.operator("sequencer.effect_strip_add", text="Transform").type = 'TRANSFORM'
 | 
			
		||||
        layout.operator("sequencer.effect_strip_add", text="Color").type = 'COLOR'
 | 
			
		||||
        layout.operator("sequencer.effect_strip_add", text="Speed Control").type = 'SPEED'
 | 
			
		||||
@@ -602,7 +603,7 @@ class SEQUENCER_PT_effect(SequencerButtonsPanel, Panel):
 | 
			
		||||
            'ADD', 'SUBTRACT', 'ALPHA_OVER', 'ALPHA_UNDER',
 | 
			
		||||
            'CROSS', 'GAMMA_CROSS', 'MULTIPLY', 'OVER_DROP',
 | 
			
		||||
            'WIPE', 'GLOW', 'TRANSFORM', 'COLOR', 'SPEED',
 | 
			
		||||
            'MULTICAM', 'GAUSSIAN_BLUR', 'TEXT',
 | 
			
		||||
            'MULTICAM', 'GAUSSIAN_BLUR', 'TEXT', 'COLORMIX'
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    def draw(self, context):
 | 
			
		||||
@@ -750,6 +751,12 @@ class SEQUENCER_PT_effect(SequencerButtonsPanel, Panel):
 | 
			
		||||
            row = col.row(align=True)
 | 
			
		||||
            row.prop(strip, "size_x")
 | 
			
		||||
            row.prop(strip, "size_y")
 | 
			
		||||
        elif strip.type == 'COLORMIX':
 | 
			
		||||
            split = layout.split(percentage=0.35)
 | 
			
		||||
            split.label(text="Blend Mode:")
 | 
			
		||||
            split.prop(strip, "blend_effect", text="")
 | 
			
		||||
            row = layout.row(align=True)
 | 
			
		||||
            row.prop(strip, "factor", slider=True)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class SEQUENCER_PT_input(SequencerButtonsPanel, Panel):
 | 
			
		||||
@@ -770,7 +777,7 @@ class SEQUENCER_PT_input(SequencerButtonsPanel, Panel):
 | 
			
		||||
            'ADD', 'SUBTRACT', 'ALPHA_OVER', 'ALPHA_UNDER',
 | 
			
		||||
            'CROSS', 'GAMMA_CROSS', 'MULTIPLY', 'OVER_DROP',
 | 
			
		||||
            'WIPE', 'GLOW', 'TRANSFORM', 'COLOR',
 | 
			
		||||
            'MULTICAM', 'SPEED', 'ADJUSTMENT',
 | 
			
		||||
            'MULTICAM', 'SPEED', 'ADJUSTMENT', 'COLORMIX'
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    def draw(self, context):
 | 
			
		||||
@@ -1009,7 +1016,7 @@ class SEQUENCER_PT_filter(SequencerButtonsPanel, Panel):
 | 
			
		||||
            'META', 'ADD', 'SUBTRACT', 'ALPHA_OVER',
 | 
			
		||||
            'ALPHA_UNDER', 'CROSS', 'GAMMA_CROSS', 'MULTIPLY',
 | 
			
		||||
            'OVER_DROP', 'WIPE', 'GLOW', 'TRANSFORM', 'COLOR',
 | 
			
		||||
            'MULTICAM', 'SPEED', 'ADJUSTMENT',
 | 
			
		||||
            'MULTICAM', 'SPEED', 'ADJUSTMENT', 'COLORMIX'
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    def draw(self, context):
 | 
			
		||||
 
 | 
			
		||||
@@ -53,6 +53,8 @@
 | 
			
		||||
#include "IMB_imbuf.h"
 | 
			
		||||
#include "IMB_colormanagement.h"
 | 
			
		||||
 | 
			
		||||
#include "BLI_math_color_blend.h"
 | 
			
		||||
 | 
			
		||||
#include "RNA_access.h"
 | 
			
		||||
 | 
			
		||||
#include "RE_pipeline.h"
 | 
			
		||||
@@ -1266,6 +1268,274 @@ static void do_mul_effect(const SeqRenderData *context, Sequence *UNUSED(seq), f
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*********************** Blend Mode ***************************************/
 | 
			
		||||
typedef void (*IMB_blend_func_byte)(unsigned char *dst, const unsigned char *src1, const unsigned char *src2);
 | 
			
		||||
typedef void (*IMB_blend_func_float)(float *dst, const float *src1, const float *src2);
 | 
			
		||||
 | 
			
		||||
BLI_INLINE void apply_blend_function_byte(float facf0, float facf1, int x, int y, unsigned char *rect1, unsigned char *rect2, unsigned char *out, IMB_blend_func_byte blend_function)
 | 
			
		||||
{
 | 
			
		||||
	int xo;
 | 
			
		||||
	unsigned char *rt1, *rt2, *rt;
 | 
			
		||||
	unsigned int achannel;
 | 
			
		||||
	xo = x;
 | 
			
		||||
	rt1 = rect1;
 | 
			
		||||
	rt2 = rect2;
 | 
			
		||||
	rt = out;
 | 
			
		||||
	while (y--) {		
 | 
			
		||||
		for (x = xo; x > 0; x--) {
 | 
			
		||||
			achannel = rt2[3];
 | 
			
		||||
			rt2[3] = (unsigned int) achannel * facf0;
 | 
			
		||||
			blend_function(rt, rt1, rt2);
 | 
			
		||||
			rt2[3] = achannel;
 | 
			
		||||
			rt[3] = rt2[3];
 | 
			
		||||
			rt1 += 4;
 | 
			
		||||
			rt2 += 4;
 | 
			
		||||
			rt += 4;
 | 
			
		||||
		}
 | 
			
		||||
		if (y == 0) {
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
		y--;		
 | 
			
		||||
		for (x = xo; x > 0; x--) {
 | 
			
		||||
			achannel = rt2[3];
 | 
			
		||||
			rt2[3] = (unsigned int) achannel * facf1;
 | 
			
		||||
			blend_function(rt, rt1, rt2);
 | 
			
		||||
			rt2[3] = achannel;
 | 
			
		||||
			rt[3] = rt2[3];
 | 
			
		||||
			rt1 += 4;
 | 
			
		||||
			rt2 += 4;
 | 
			
		||||
			rt += 4;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
BLI_INLINE void apply_blend_function_float(float facf0, float facf1, int x, int y, float *rect1, float *rect2, float *out, IMB_blend_func_float blend_function)
 | 
			
		||||
{
 | 
			
		||||
	int xo;
 | 
			
		||||
	float *rt1, *rt2, *rt;
 | 
			
		||||
	float achannel;
 | 
			
		||||
	xo = x;
 | 
			
		||||
	rt1 = rect1;
 | 
			
		||||
	rt2 = rect2;
 | 
			
		||||
	rt = out;
 | 
			
		||||
	while (y--) {		
 | 
			
		||||
		for (x = xo; x > 0; x--) {
 | 
			
		||||
			achannel = rt2[3];
 | 
			
		||||
			rt2[3] = achannel * facf0;
 | 
			
		||||
			blend_function(rt, rt1, rt2);
 | 
			
		||||
			rt2[3] = achannel;
 | 
			
		||||
			rt[3] = rt2[3];
 | 
			
		||||
			rt1 += 4;
 | 
			
		||||
			rt2 += 4;
 | 
			
		||||
			rt += 4;
 | 
			
		||||
		}
 | 
			
		||||
		if (y == 0) {
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
		y--;		
 | 
			
		||||
		for (x = xo; x > 0; x--) {
 | 
			
		||||
			achannel = rt2[3];
 | 
			
		||||
			rt2[3] = achannel * facf1;
 | 
			
		||||
			blend_function(rt, rt1, rt2);
 | 
			
		||||
			rt2[3] = achannel;
 | 
			
		||||
			rt[3] = rt2[3];
 | 
			
		||||
			rt1 += 4;
 | 
			
		||||
			rt2 += 4;
 | 
			
		||||
			rt += 4;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void do_blend_effect_float(float facf0, float facf1, int x, int y, float *rect1, float *rect2, int btype, float *out)
 | 
			
		||||
{
 | 
			
		||||
	switch (btype) {
 | 
			
		||||
		case SEQ_TYPE_ADD:
 | 
			
		||||
			apply_blend_function_float(facf0, facf1, x, y, rect1, rect2, out, blend_color_add_float);
 | 
			
		||||
			break;
 | 
			
		||||
		case SEQ_TYPE_SUB:
 | 
			
		||||
			apply_blend_function_float(facf0, facf1, x, y, rect1, rect2, out, blend_color_sub_float);
 | 
			
		||||
			break;
 | 
			
		||||
		case SEQ_TYPE_MUL:
 | 
			
		||||
			apply_blend_function_float(facf0, facf1, x, y, rect1, rect2, out, blend_color_mul_float);
 | 
			
		||||
			break;
 | 
			
		||||
		case SEQ_TYPE_DARKEN:
 | 
			
		||||
			apply_blend_function_float(facf0, facf1, x, y, rect1, rect2, out, blend_color_darken_float);
 | 
			
		||||
			break;
 | 
			
		||||
		case SEQ_TYPE_BURN:
 | 
			
		||||
			apply_blend_function_float(facf0, facf1, x, y, rect1, rect2, out, blend_color_burn_float);
 | 
			
		||||
			break;
 | 
			
		||||
		case SEQ_TYPE_LINEAR_BURN:
 | 
			
		||||
			apply_blend_function_float(facf0, facf1, x, y, rect1, rect2, out, blend_color_linearburn_float);
 | 
			
		||||
			break;
 | 
			
		||||
		case SEQ_TYPE_SCREEN:
 | 
			
		||||
			apply_blend_function_float(facf0, facf1, x, y, rect1, rect2, out, blend_color_screen_float);
 | 
			
		||||
			break;
 | 
			
		||||
		case SEQ_TYPE_LIGHTEN:
 | 
			
		||||
			apply_blend_function_float(facf0, facf1, x, y, rect1, rect2, out, blend_color_lighten_float);
 | 
			
		||||
			break;
 | 
			
		||||
		case SEQ_TYPE_DODGE:
 | 
			
		||||
			apply_blend_function_float(facf0, facf1, x, y, rect1, rect2, out, blend_color_dodge_float);
 | 
			
		||||
			break;
 | 
			
		||||
		case SEQ_TYPE_OVERLAY:
 | 
			
		||||
			apply_blend_function_float(facf0, facf1, x, y, rect1, rect2, out, blend_color_overlay_float);
 | 
			
		||||
			break;
 | 
			
		||||
		case SEQ_TYPE_SOFT_LIGHT:
 | 
			
		||||
			apply_blend_function_float(facf0, facf1, x, y, rect1, rect2, out, blend_color_softlight_float);
 | 
			
		||||
			break;
 | 
			
		||||
		case SEQ_TYPE_HARD_LIGHT:
 | 
			
		||||
			apply_blend_function_float(facf0, facf1, x, y, rect1, rect2, out, blend_color_hardlight_float);
 | 
			
		||||
			break;
 | 
			
		||||
		case SEQ_TYPE_PIN_LIGHT:
 | 
			
		||||
			apply_blend_function_float(facf0, facf1, x, y, rect1, rect2, out, blend_color_pinlight_float);
 | 
			
		||||
			break;
 | 
			
		||||
		case SEQ_TYPE_LIN_LIGHT:
 | 
			
		||||
			apply_blend_function_float(facf0, facf1, x, y, rect1, rect2, out, blend_color_linearlight_float);
 | 
			
		||||
			break;
 | 
			
		||||
		case SEQ_TYPE_VIVID_LIGHT:
 | 
			
		||||
			apply_blend_function_float(facf0, facf1, x, y, rect1, rect2, out, blend_color_vividlight_float);
 | 
			
		||||
			break;
 | 
			
		||||
		case SEQ_TYPE_BLEND_COLOR:
 | 
			
		||||
			apply_blend_function_float(facf0, facf1, x, y, rect1, rect2, out, blend_color_color_float);
 | 
			
		||||
			break;
 | 
			
		||||
		case SEQ_TYPE_HUE:
 | 
			
		||||
			apply_blend_function_float(facf0, facf1, x, y, rect1, rect2, out, blend_color_hue_float);
 | 
			
		||||
			break;
 | 
			
		||||
		case SEQ_TYPE_SATURATION:
 | 
			
		||||
			apply_blend_function_float(facf0, facf1, x, y, rect1, rect2, out, blend_color_saturation_float);
 | 
			
		||||
			break;
 | 
			
		||||
		case SEQ_TYPE_VALUE:
 | 
			
		||||
			apply_blend_function_float(facf0, facf1, x, y, rect1, rect2, out, blend_color_luminosity_float);
 | 
			
		||||
			break;
 | 
			
		||||
		case SEQ_TYPE_DIFFERENCE:
 | 
			
		||||
			apply_blend_function_float(facf0, facf1, x, y, rect1, rect2, out, blend_color_difference_float);
 | 
			
		||||
			break;
 | 
			
		||||
		case SEQ_TYPE_EXCLUSION:
 | 
			
		||||
			apply_blend_function_float(facf0, facf1, x, y, rect1, rect2, out, blend_color_exclusion_float);
 | 
			
		||||
			break;
 | 
			
		||||
		default:
 | 
			
		||||
			break;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void do_blend_effect_byte(float facf0, float facf1, int x, int y, unsigned char *rect1, unsigned char *rect2, int btype, unsigned char *out)
 | 
			
		||||
{
 | 
			
		||||
	switch (btype) {
 | 
			
		||||
		case SEQ_TYPE_ADD:
 | 
			
		||||
			apply_blend_function_byte(facf0, facf1, x, y, rect1, rect2, out, blend_color_add_byte);
 | 
			
		||||
			break;
 | 
			
		||||
		case SEQ_TYPE_SUB:
 | 
			
		||||
			apply_blend_function_byte(facf0, facf1, x, y, rect1, rect2, out, blend_color_sub_byte);
 | 
			
		||||
			break;
 | 
			
		||||
		case SEQ_TYPE_MUL:
 | 
			
		||||
			apply_blend_function_byte(facf0, facf1, x, y, rect1, rect2, out, blend_color_mul_byte);
 | 
			
		||||
			break;
 | 
			
		||||
		case SEQ_TYPE_DARKEN:
 | 
			
		||||
			apply_blend_function_byte(facf0, facf1, x, y, rect1, rect2, out, blend_color_darken_byte);
 | 
			
		||||
			break;
 | 
			
		||||
		case SEQ_TYPE_BURN:
 | 
			
		||||
			apply_blend_function_byte(facf0, facf1, x, y, rect1, rect2, out, blend_color_burn_byte);
 | 
			
		||||
			break;
 | 
			
		||||
		case SEQ_TYPE_LINEAR_BURN:
 | 
			
		||||
			apply_blend_function_byte(facf0, facf1, x, y, rect1, rect2, out, blend_color_linearburn_byte);
 | 
			
		||||
			break;
 | 
			
		||||
		case SEQ_TYPE_SCREEN:
 | 
			
		||||
			apply_blend_function_byte(facf0, facf1, x, y, rect1, rect2, out, blend_color_screen_byte);
 | 
			
		||||
			break;
 | 
			
		||||
		case SEQ_TYPE_LIGHTEN:
 | 
			
		||||
			apply_blend_function_byte(facf0, facf1, x, y, rect1, rect2, out, blend_color_lighten_byte);
 | 
			
		||||
			break;
 | 
			
		||||
		case SEQ_TYPE_DODGE:
 | 
			
		||||
			apply_blend_function_byte(facf0, facf1, x, y, rect1, rect2, out, blend_color_dodge_byte);
 | 
			
		||||
			break;
 | 
			
		||||
		case SEQ_TYPE_OVERLAY:
 | 
			
		||||
			apply_blend_function_byte(facf0, facf1, x, y, rect1, rect2, out, blend_color_overlay_byte);
 | 
			
		||||
			break;
 | 
			
		||||
		case SEQ_TYPE_SOFT_LIGHT:
 | 
			
		||||
			apply_blend_function_byte(facf0, facf1, x, y, rect1, rect2, out, blend_color_softlight_byte);
 | 
			
		||||
			break;
 | 
			
		||||
		case SEQ_TYPE_HARD_LIGHT:
 | 
			
		||||
			apply_blend_function_byte(facf0, facf1, x, y, rect1, rect2, out, blend_color_hardlight_byte);
 | 
			
		||||
			break;
 | 
			
		||||
		case SEQ_TYPE_PIN_LIGHT:
 | 
			
		||||
			apply_blend_function_byte(facf0, facf1, x, y, rect1, rect2, out, blend_color_pinlight_byte);
 | 
			
		||||
			break;
 | 
			
		||||
		case SEQ_TYPE_LIN_LIGHT:
 | 
			
		||||
			apply_blend_function_byte(facf0, facf1, x, y, rect1, rect2, out, blend_color_linearlight_byte);
 | 
			
		||||
			break;
 | 
			
		||||
		case SEQ_TYPE_VIVID_LIGHT:
 | 
			
		||||
			apply_blend_function_byte(facf0, facf1, x, y, rect1, rect2, out, blend_color_vividlight_byte);
 | 
			
		||||
			break;
 | 
			
		||||
		case SEQ_TYPE_BLEND_COLOR:
 | 
			
		||||
			apply_blend_function_byte(facf0, facf1, x, y, rect1, rect2, out, blend_color_color_byte);
 | 
			
		||||
			break;
 | 
			
		||||
		case SEQ_TYPE_HUE:
 | 
			
		||||
			apply_blend_function_byte(facf0, facf1, x, y, rect1, rect2, out, blend_color_hue_byte);
 | 
			
		||||
			break;
 | 
			
		||||
		case SEQ_TYPE_SATURATION:
 | 
			
		||||
			apply_blend_function_byte(facf0, facf1, x, y, rect1, rect2, out, blend_color_saturation_byte);
 | 
			
		||||
			break;
 | 
			
		||||
		case SEQ_TYPE_VALUE:
 | 
			
		||||
			apply_blend_function_byte(facf0, facf1, x, y, rect1, rect2, out, blend_color_luminosity_byte);
 | 
			
		||||
			break;
 | 
			
		||||
		case SEQ_TYPE_DIFFERENCE:
 | 
			
		||||
			apply_blend_function_byte(facf0, facf1, x, y, rect1, rect2, out, blend_color_difference_byte);
 | 
			
		||||
			break;
 | 
			
		||||
		case SEQ_TYPE_EXCLUSION:
 | 
			
		||||
			apply_blend_function_byte(facf0, facf1, x, y, rect1, rect2, out, blend_color_exclusion_byte);
 | 
			
		||||
			break;
 | 
			
		||||
		default:
 | 
			
		||||
			break;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void do_blend_mode_effect(const SeqRenderData *context, Sequence *seq, float UNUSED(cfra), float facf0, float facf1,
 | 
			
		||||
                             ImBuf *ibuf1, ImBuf *ibuf2, ImBuf *UNUSED(ibuf3), int start_line, int total_lines, ImBuf *out)
 | 
			
		||||
{
 | 
			
		||||
	if (out->rect_float) {
 | 
			
		||||
		float *rect1 = NULL, *rect2 = NULL, *rect_out = NULL;
 | 
			
		||||
		slice_get_float_buffers(context, ibuf1, ibuf2, NULL, out, start_line, &rect1, &rect2, NULL, &rect_out);
 | 
			
		||||
		do_blend_effect_float(facf0, facf1, context->rectx, total_lines, rect1, rect2, seq->blend_mode, rect_out);
 | 
			
		||||
	}
 | 
			
		||||
	else {
 | 
			
		||||
		unsigned char *rect1 = NULL, *rect2 = NULL, *rect_out = NULL;
 | 
			
		||||
		slice_get_byte_buffers(context, ibuf1, ibuf2, NULL, out, start_line, &rect1, &rect2, NULL, &rect_out);
 | 
			
		||||
		do_blend_effect_byte(facf0, facf1, context->rectx, total_lines, rect1, rect2, seq->blend_mode, rect_out);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
/*********************** Color Mix Effect  *************************/
 | 
			
		||||
static void init_colormix_effect(Sequence *seq)
 | 
			
		||||
{
 | 
			
		||||
	ColorMixVars *data;
 | 
			
		||||
 | 
			
		||||
	if (seq->effectdata){
 | 
			
		||||
		MEM_freeN(seq->effectdata);
 | 
			
		||||
	}
 | 
			
		||||
	seq->effectdata = MEM_callocN(sizeof(ColorMixVars), "colormixvars");
 | 
			
		||||
	data = (ColorMixVars *) seq->effectdata;
 | 
			
		||||
	data->blend_effect = SEQ_TYPE_OVERLAY;
 | 
			
		||||
	data->factor = 1.0f;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void do_colormix_effect(const SeqRenderData *context, Sequence *seq, float UNUSED(cfra), float UNUSED(facf0), float UNUSED(facf1),
 | 
			
		||||
                               ImBuf *ibuf1, ImBuf *ibuf2, ImBuf *UNUSED(ibuf3), int start_line, int total_lines, ImBuf *out)
 | 
			
		||||
{
 | 
			
		||||
	float facf;
 | 
			
		||||
 | 
			
		||||
	ColorMixVars *data = seq->effectdata;
 | 
			
		||||
	facf = data->factor;
 | 
			
		||||
 | 
			
		||||
	if (out->rect_float) {
 | 
			
		||||
		float *rect1 = NULL, *rect2 = NULL, *rect_out = NULL;
 | 
			
		||||
		slice_get_float_buffers(context, ibuf1, ibuf2, NULL, out, start_line, &rect1, &rect2, NULL, &rect_out);
 | 
			
		||||
		do_blend_effect_float(facf, facf, context->rectx, total_lines, rect1, rect2, data->blend_effect, rect_out);
 | 
			
		||||
	}
 | 
			
		||||
	else {
 | 
			
		||||
		unsigned char *rect1 = NULL, *rect2 = NULL, *rect_out = NULL;
 | 
			
		||||
		slice_get_byte_buffers(context, ibuf1, ibuf2, NULL, out, start_line, &rect1, &rect2, NULL, &rect_out);
 | 
			
		||||
		do_blend_effect_byte(facf, facf, context->rectx, total_lines, rect1, rect2, data->blend_effect, rect_out);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*********************** Wipe *************************/
 | 
			
		||||
 | 
			
		||||
typedef struct WipeZone {
 | 
			
		||||
@@ -3336,6 +3606,36 @@ static struct SeqEffectHandle get_sequence_effect_impl(int seq_type)
 | 
			
		||||
			rval.execute_slice = do_mul_effect;
 | 
			
		||||
			rval.early_out = early_out_mul_input2;
 | 
			
		||||
			break;
 | 
			
		||||
		case SEQ_TYPE_SCREEN:
 | 
			
		||||
		case SEQ_TYPE_OVERLAY:
 | 
			
		||||
		case SEQ_TYPE_BURN:
 | 
			
		||||
		case SEQ_TYPE_LINEAR_BURN:
 | 
			
		||||
		case SEQ_TYPE_DARKEN:
 | 
			
		||||
		case SEQ_TYPE_LIGHTEN:
 | 
			
		||||
		case SEQ_TYPE_DODGE:
 | 
			
		||||
		case SEQ_TYPE_SOFT_LIGHT:
 | 
			
		||||
		case SEQ_TYPE_HARD_LIGHT:
 | 
			
		||||
		case SEQ_TYPE_PIN_LIGHT:
 | 
			
		||||
		case SEQ_TYPE_LIN_LIGHT:
 | 
			
		||||
		case SEQ_TYPE_VIVID_LIGHT:
 | 
			
		||||
		case SEQ_TYPE_BLEND_COLOR:
 | 
			
		||||
		case SEQ_TYPE_HUE:
 | 
			
		||||
		case SEQ_TYPE_SATURATION:
 | 
			
		||||
		case SEQ_TYPE_VALUE:
 | 
			
		||||
		case SEQ_TYPE_DIFFERENCE:
 | 
			
		||||
		case SEQ_TYPE_EXCLUSION:
 | 
			
		||||
			rval.multithreaded = true;
 | 
			
		||||
			rval.execute_slice = do_blend_mode_effect;
 | 
			
		||||
			rval.early_out = early_out_mul_input2;
 | 
			
		||||
			break;
 | 
			
		||||
		case SEQ_TYPE_COLORMIX:
 | 
			
		||||
			rval.multithreaded = true;
 | 
			
		||||
			rval.init = init_colormix_effect;
 | 
			
		||||
			rval.free = free_effect_default;
 | 
			
		||||
			rval.copy = copy_effect_default;
 | 
			
		||||
			rval.execute_slice = do_colormix_effect;
 | 
			
		||||
			rval.early_out = early_out_mul_input2;
 | 
			
		||||
			break;
 | 
			
		||||
		case SEQ_TYPE_ALPHAOVER:
 | 
			
		||||
			rval.multithreaded = true;
 | 
			
		||||
			rval.init = init_alpha_over_or_under;
 | 
			
		||||
 
 | 
			
		||||
@@ -1164,6 +1164,7 @@ static const char *give_seqname_by_type(int type)
 | 
			
		||||
		case SEQ_TYPE_ALPHAOVER:     return "Alpha Over";
 | 
			
		||||
		case SEQ_TYPE_ALPHAUNDER:    return "Alpha Under";
 | 
			
		||||
		case SEQ_TYPE_OVERDROP:      return "Over Drop";
 | 
			
		||||
		case SEQ_TYPE_COLORMIX:      return "Color Mix";
 | 
			
		||||
		case SEQ_TYPE_WIPE:          return "Wipe";
 | 
			
		||||
		case SEQ_TYPE_GLOW:          return "Glow";
 | 
			
		||||
		case SEQ_TYPE_TRANSFORM:     return "Transform";
 | 
			
		||||
 
 | 
			
		||||
@@ -439,10 +439,10 @@ MINLINE void blend_color_vividlight_byte(unsigned char dst[4], unsigned const ch
 | 
			
		||||
			int temp;
 | 
			
		||||
 | 
			
		||||
			if (src2[i] == 255) {
 | 
			
		||||
				temp = 255;
 | 
			
		||||
				temp = (src1[i] == 0) ? 127 : 255;
 | 
			
		||||
			}
 | 
			
		||||
			else if (src2[i] == 0) {
 | 
			
		||||
				temp = 0;
 | 
			
		||||
				temp = (src1[i] == 255) ? 127 : 0;
 | 
			
		||||
			}
 | 
			
		||||
			else if (src2[i] > 127) {
 | 
			
		||||
				temp = min_ii(((src1[i]) * 255) / (2 * (255 - src2[i])), 255);
 | 
			
		||||
@@ -784,7 +784,7 @@ MINLINE void blend_color_add_alpha_float(float dst[4], const float src1[4], cons
 | 
			
		||||
MINLINE void blend_color_overlay_float(float dst[4], const float src1[4], const float src2[4])
 | 
			
		||||
{
 | 
			
		||||
	const float fac = src2[3];
 | 
			
		||||
	if (fac != 0.0f && fac < 1.0f) {
 | 
			
		||||
	if (fac != 0.0f) {
 | 
			
		||||
		const float mfac = 1.0f - fac;
 | 
			
		||||
		int i = 3;
 | 
			
		||||
 | 
			
		||||
@@ -810,7 +810,7 @@ MINLINE void blend_color_overlay_float(float dst[4], const float src1[4], const
 | 
			
		||||
MINLINE void blend_color_hardlight_float(float dst[4], const float src1[4], const float src2[4])
 | 
			
		||||
{
 | 
			
		||||
	const float fac = src2[3];
 | 
			
		||||
	if (fac != 0.0f && fac < 1.0f) {
 | 
			
		||||
	if (fac != 0.0f) {
 | 
			
		||||
		const float mfac = 1.0f - fac;
 | 
			
		||||
		int i = 3;
 | 
			
		||||
 | 
			
		||||
@@ -835,7 +835,7 @@ MINLINE void blend_color_hardlight_float(float dst[4], const float src1[4], cons
 | 
			
		||||
MINLINE void blend_color_burn_float(float dst[4], const float src1[4], const float src2[4])
 | 
			
		||||
{
 | 
			
		||||
	const float fac = src2[3];
 | 
			
		||||
	if (fac != 0.0f && fac < 1.0f) {
 | 
			
		||||
	if (fac != 0.0f) {
 | 
			
		||||
		const float mfac = 1.0f - fac;
 | 
			
		||||
		int i = 3;
 | 
			
		||||
 | 
			
		||||
@@ -853,7 +853,7 @@ MINLINE void blend_color_burn_float(float dst[4], const float src1[4], const flo
 | 
			
		||||
MINLINE void blend_color_linearburn_float(float dst[4], const float src1[4], const float src2[4])
 | 
			
		||||
{
 | 
			
		||||
	const float fac = src2[3];
 | 
			
		||||
	if (fac != 0.0f && fac < 1.0f) {
 | 
			
		||||
	if (fac != 0.0f) {
 | 
			
		||||
		const float mfac = 1.0f - fac;
 | 
			
		||||
		int i = 3;
 | 
			
		||||
 | 
			
		||||
@@ -872,7 +872,7 @@ MINLINE void blend_color_linearburn_float(float dst[4], const float src1[4], con
 | 
			
		||||
MINLINE void blend_color_dodge_float(float dst[4], const float src1[4], const float src2[4])
 | 
			
		||||
{
 | 
			
		||||
	const float fac = src2[3];
 | 
			
		||||
	if (fac != 0.0f && fac < 1.0f) {
 | 
			
		||||
	if (fac != 0.0f) {
 | 
			
		||||
		const float mfac = 1.0f - fac;
 | 
			
		||||
		int i = 3;
 | 
			
		||||
 | 
			
		||||
@@ -890,7 +890,7 @@ MINLINE void blend_color_dodge_float(float dst[4], const float src1[4], const fl
 | 
			
		||||
MINLINE void blend_color_screen_float(float dst[4], const float src1[4], const float src2[4])
 | 
			
		||||
{
 | 
			
		||||
	const float fac = src2[3];
 | 
			
		||||
	if (fac != 0.0f && fac < 1.0f) {
 | 
			
		||||
	if (fac != 0.0f) {
 | 
			
		||||
		const float mfac = 1.0f - fac;
 | 
			
		||||
		int i = 3;
 | 
			
		||||
 | 
			
		||||
@@ -908,7 +908,7 @@ MINLINE void blend_color_screen_float(float dst[4], const float src1[4], const f
 | 
			
		||||
MINLINE void blend_color_softlight_float(float dst[4], const float src1[4], const float src2[4])
 | 
			
		||||
{
 | 
			
		||||
	const float fac = src2[3];
 | 
			
		||||
	if (fac != 0.0f && fac < 1.0f) {
 | 
			
		||||
	if (fac != 0.0f) {
 | 
			
		||||
		const float mfac = 1.0f - fac;
 | 
			
		||||
		int i = 3;
 | 
			
		||||
 | 
			
		||||
@@ -933,7 +933,7 @@ MINLINE void blend_color_softlight_float(float dst[4], const float src1[4], cons
 | 
			
		||||
MINLINE void blend_color_pinlight_float(float dst[4], const float src1[4], const float src2[4])
 | 
			
		||||
{
 | 
			
		||||
	const float fac = src2[3];
 | 
			
		||||
	if (fac != 0.0f && fac < 1.0f) {
 | 
			
		||||
	if (fac != 0.0f) {
 | 
			
		||||
		const float mfac = 1.0f - fac;
 | 
			
		||||
		int i = 3;
 | 
			
		||||
 | 
			
		||||
@@ -959,7 +959,7 @@ MINLINE void blend_color_pinlight_float(float dst[4], const float src1[4], const
 | 
			
		||||
MINLINE void blend_color_linearlight_float(float dst[4], const float src1[4], const float src2[4])
 | 
			
		||||
{
 | 
			
		||||
	const float fac = src2[3];
 | 
			
		||||
	if (fac != 0.0f && fac < 1.0f) {
 | 
			
		||||
	if (fac != 0.0f) {
 | 
			
		||||
		const float mfac = 1.0f - fac;
 | 
			
		||||
		int i = 3;
 | 
			
		||||
 | 
			
		||||
@@ -985,7 +985,7 @@ MINLINE void blend_color_linearlight_float(float dst[4], const float src1[4], co
 | 
			
		||||
MINLINE void blend_color_vividlight_float(float dst[4], const float src1[4], const float src2[4])
 | 
			
		||||
{
 | 
			
		||||
	const float fac = src2[3];
 | 
			
		||||
	if (fac != 0.0f && fac < 1.0f) {
 | 
			
		||||
	if (fac != 0.0f) {
 | 
			
		||||
		const float mfac = 1.0f - fac;
 | 
			
		||||
		int i = 3;
 | 
			
		||||
 | 
			
		||||
@@ -993,10 +993,10 @@ MINLINE void blend_color_vividlight_float(float dst[4], const float src1[4], con
 | 
			
		||||
			float temp;
 | 
			
		||||
 | 
			
		||||
			if (src2[i] == 1.0f) {
 | 
			
		||||
				temp = 1.0f;
 | 
			
		||||
				temp = (src1[i] == 0.0f) ? 0.5f : 1.0f;
 | 
			
		||||
			}
 | 
			
		||||
			else if (src2[i] == 0.0f) {
 | 
			
		||||
				temp = 0.0f;
 | 
			
		||||
				temp = (src1[i] == 1.0f) ? 0.5f : 0.0f;
 | 
			
		||||
			}
 | 
			
		||||
			else if (src2[i] > 0.5f) {
 | 
			
		||||
				temp = min_ff(((src1[i]) * 1.0f) / (2.0f * (1.0f - src2[i])), 1.0f);
 | 
			
		||||
@@ -1016,7 +1016,7 @@ MINLINE void blend_color_vividlight_float(float dst[4], const float src1[4], con
 | 
			
		||||
MINLINE void blend_color_difference_float(float dst[4], const float src1[4], const float src2[4])
 | 
			
		||||
{
 | 
			
		||||
	const float fac = src2[3];
 | 
			
		||||
	if (fac != 0.0f && fac < 1.0f) {
 | 
			
		||||
	if (fac != 0.0f) {
 | 
			
		||||
		const float mfac = 1.0f - fac;
 | 
			
		||||
		int i = 3;
 | 
			
		||||
 | 
			
		||||
@@ -1034,7 +1034,7 @@ MINLINE void blend_color_difference_float(float dst[4], const float src1[4], con
 | 
			
		||||
MINLINE void blend_color_exclusion_float(float dst[4], const float src1[4], const float src2[4])
 | 
			
		||||
{
 | 
			
		||||
	const float fac = src2[3];
 | 
			
		||||
	if (fac != 0.0f && fac < 1.0f) {
 | 
			
		||||
	if (fac != 0.0f) {
 | 
			
		||||
		const float mfac = 1.0f - fac;
 | 
			
		||||
		int i = 3;
 | 
			
		||||
 | 
			
		||||
@@ -1053,7 +1053,7 @@ MINLINE void blend_color_exclusion_float(float dst[4], const float src1[4], cons
 | 
			
		||||
MINLINE void blend_color_color_float(float dst[4], const float src1[4], const float src2[4])
 | 
			
		||||
{
 | 
			
		||||
	const float fac = src2[3];
 | 
			
		||||
	if (fac != 0.0f && fac < 1.0f) {
 | 
			
		||||
	if (fac != 0.0f) {
 | 
			
		||||
		const float mfac = 1.0f - fac;
 | 
			
		||||
		float h1, s1, v1;
 | 
			
		||||
		float h2, s2, v2;
 | 
			
		||||
@@ -1081,7 +1081,7 @@ MINLINE void blend_color_color_float(float dst[4], const float src1[4], const fl
 | 
			
		||||
MINLINE void blend_color_hue_float(float dst[4], const float src1[4], const float src2[4])
 | 
			
		||||
{
 | 
			
		||||
	const float fac = src2[3];
 | 
			
		||||
	if (fac != 0.0f && fac < 1.0f) {
 | 
			
		||||
	if (fac != 0.0f) {
 | 
			
		||||
		const float mfac = 1.0f - fac;
 | 
			
		||||
		float h1, s1, v1;
 | 
			
		||||
		float h2, s2, v2;
 | 
			
		||||
@@ -1107,7 +1107,7 @@ MINLINE void blend_color_hue_float(float dst[4], const float src1[4], const floa
 | 
			
		||||
MINLINE void blend_color_saturation_float(float dst[4], const float src1[4], const float src2[4])
 | 
			
		||||
{
 | 
			
		||||
	const float fac = src2[3];
 | 
			
		||||
	if (fac != 0.0f && fac < 1.0f) {
 | 
			
		||||
	if (fac != 0.0f) {
 | 
			
		||||
		const float mfac = 1.0f - fac;
 | 
			
		||||
		float h1, s1, v1;
 | 
			
		||||
		float h2, s2, v2;
 | 
			
		||||
@@ -1134,7 +1134,7 @@ MINLINE void blend_color_saturation_float(float dst[4], const float src1[4], con
 | 
			
		||||
MINLINE void blend_color_luminosity_float(float dst[4], const float src1[4], const float src2[4])
 | 
			
		||||
{
 | 
			
		||||
	const float fac = src2[3];
 | 
			
		||||
	if (fac != 0.0f && fac < 1.0f) {
 | 
			
		||||
	if (fac != 0.0f) {
 | 
			
		||||
		const float mfac = 1.0f - fac;
 | 
			
		||||
		float h1, s1, v1;
 | 
			
		||||
		float h2, s2, v2;
 | 
			
		||||
 
 | 
			
		||||
@@ -2708,6 +2708,9 @@ static void write_scene(WriteData *wd, Scene *sce)
 | 
			
		||||
						case SEQ_TYPE_TEXT:
 | 
			
		||||
							writestruct(wd, DATA, TextVars, 1, seq->effectdata);
 | 
			
		||||
							break;
 | 
			
		||||
						case SEQ_TYPE_COLORMIX:
 | 
			
		||||
							writestruct(wd, DATA, ColorMixVars, 1, seq->effectdata);
 | 
			
		||||
							break;
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -157,6 +157,7 @@ void color3ubv_from_seq(Scene *curscene, Sequence *seq, unsigned char col[3])
 | 
			
		||||
		case SEQ_TYPE_MULTICAM:
 | 
			
		||||
		case SEQ_TYPE_ADJUSTMENT:
 | 
			
		||||
		case SEQ_TYPE_GAUSSIAN_BLUR:
 | 
			
		||||
		case SEQ_TYPE_COLORMIX:
 | 
			
		||||
			UI_GetThemeColor3ubv(TH_SEQ_EFFECT, col);
 | 
			
		||||
 | 
			
		||||
			/* slightly offset hue to distinguish different effects */
 | 
			
		||||
@@ -171,6 +172,7 @@ void color3ubv_from_seq(Scene *curscene, Sequence *seq, unsigned char col[3])
 | 
			
		||||
			else if (seq->type == SEQ_TYPE_MULTICAM)      rgb_byte_set_hue_float_offset(col, 0.32);
 | 
			
		||||
			else if (seq->type == SEQ_TYPE_ADJUSTMENT)    rgb_byte_set_hue_float_offset(col, 0.40);
 | 
			
		||||
			else if (seq->type == SEQ_TYPE_GAUSSIAN_BLUR) rgb_byte_set_hue_float_offset(col, 0.42);
 | 
			
		||||
			else if (seq->type == SEQ_TYPE_COLORMIX)      rgb_byte_set_hue_float_offset(col, 0.46);
 | 
			
		||||
			break;
 | 
			
		||||
 | 
			
		||||
		case SEQ_TYPE_COLOR:
 | 
			
		||||
 
 | 
			
		||||
@@ -95,6 +95,7 @@ EnumPropertyItem sequencer_prop_effect_types[] = {
 | 
			
		||||
	{SEQ_TYPE_ADJUSTMENT, "ADJUSTMENT", 0, "Adjustment Layer", ""},
 | 
			
		||||
	{SEQ_TYPE_GAUSSIAN_BLUR, "GAUSSIAN_BLUR", 0, "Gaussian Blur", ""},
 | 
			
		||||
	{SEQ_TYPE_TEXT, "TEXT", 0, "Text", ""},
 | 
			
		||||
	{SEQ_TYPE_COLORMIX, "COLORMIX", 0, "Color Mix", ""},
 | 
			
		||||
	{0, NULL, 0, NULL, NULL}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -301,6 +301,11 @@ enum {
 | 
			
		||||
	SEQ_TEXT_ALIGN_Y_BOTTOM = 2,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
typedef struct ColorMixVars {
 | 
			
		||||
	int blend_effect;    /* value from SEQ_TYPE_XXX enumeration */
 | 
			
		||||
	float factor;        /* blend factor [0.0f, 1.0f]           */
 | 
			
		||||
} ColorMixVars;
 | 
			
		||||
 | 
			
		||||
/* ***************** Sequence modifiers ****************** */
 | 
			
		||||
 | 
			
		||||
typedef struct SequenceModifierData {
 | 
			
		||||
@@ -516,8 +521,29 @@ enum {
 | 
			
		||||
	SEQ_TYPE_ADJUSTMENT  = 31,
 | 
			
		||||
	SEQ_TYPE_GAUSSIAN_BLUR = 40,
 | 
			
		||||
	SEQ_TYPE_TEXT = 41,
 | 
			
		||||
	SEQ_TYPE_COLORMIX    = 42,
 | 
			
		||||
 | 
			
		||||
	SEQ_TYPE_MAX  = 41
 | 
			
		||||
	/* Blend modes */
 | 
			
		||||
	SEQ_TYPE_SCREEN      = 43,
 | 
			
		||||
	SEQ_TYPE_LIGHTEN     = 44,
 | 
			
		||||
	SEQ_TYPE_DODGE       = 45,
 | 
			
		||||
	SEQ_TYPE_DARKEN      = 46,
 | 
			
		||||
	SEQ_TYPE_BURN        = 47,
 | 
			
		||||
	SEQ_TYPE_LINEAR_BURN = 48,
 | 
			
		||||
	SEQ_TYPE_OVERLAY     = 49,
 | 
			
		||||
	SEQ_TYPE_HARD_LIGHT  = 50,
 | 
			
		||||
	SEQ_TYPE_SOFT_LIGHT  = 51,
 | 
			
		||||
	SEQ_TYPE_PIN_LIGHT   = 52,
 | 
			
		||||
	SEQ_TYPE_LIN_LIGHT   = 53,
 | 
			
		||||
	SEQ_TYPE_VIVID_LIGHT = 54,
 | 
			
		||||
	SEQ_TYPE_HUE         = 55,
 | 
			
		||||
	SEQ_TYPE_SATURATION  = 56,
 | 
			
		||||
	SEQ_TYPE_VALUE       = 57,
 | 
			
		||||
	SEQ_TYPE_BLEND_COLOR = 58,
 | 
			
		||||
	SEQ_TYPE_DIFFERENCE  = 59,
 | 
			
		||||
	SEQ_TYPE_EXCLUSION   = 60,
 | 
			
		||||
 | 
			
		||||
	SEQ_TYPE_MAX         = 60
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define SEQ_MOVIECLIP_RENDER_UNDISTORTED (1 << 0)
 | 
			
		||||
 
 | 
			
		||||
@@ -121,6 +121,7 @@ extern StructRNA RNA_ColorManagedViewSettings;
 | 
			
		||||
extern StructRNA RNA_ColorRamp;
 | 
			
		||||
extern StructRNA RNA_ColorRampElement;
 | 
			
		||||
extern StructRNA RNA_ColorSequence;
 | 
			
		||||
extern StructRNA RNA_ColorMixSequence;
 | 
			
		||||
extern StructRNA RNA_CompositorNode;
 | 
			
		||||
extern StructRNA RNA_CompositorNodeAlphaOver;
 | 
			
		||||
extern StructRNA RNA_CompositorNodeBilateralblur;
 | 
			
		||||
 
 | 
			
		||||
@@ -550,6 +550,8 @@ static StructRNA *rna_Sequence_refine(struct PointerRNA *ptr)
 | 
			
		||||
			return &RNA_GaussianBlurSequence;
 | 
			
		||||
		case SEQ_TYPE_TEXT:
 | 
			
		||||
			return &RNA_TextSequence;
 | 
			
		||||
		case SEQ_TYPE_COLORMIX:
 | 
			
		||||
			return &RNA_ColorMixSequence;
 | 
			
		||||
		default:
 | 
			
		||||
			return &RNA_Sequence;
 | 
			
		||||
	}
 | 
			
		||||
@@ -1338,6 +1340,24 @@ static const EnumPropertyItem blend_mode_items[] = {
 | 
			
		||||
	{SEQ_TYPE_GAMCROSS, "GAMMA_CROSS", 0, "Gamma Cross", ""},
 | 
			
		||||
	{SEQ_TYPE_MUL, "MULTIPLY", 0, "Multiply", ""},
 | 
			
		||||
	{SEQ_TYPE_OVERDROP, "OVER_DROP", 0, "Over Drop", ""},
 | 
			
		||||
	{SEQ_TYPE_LIGHTEN, "LIGHTEN", 0, "Lighten", ""},
 | 
			
		||||
	{SEQ_TYPE_DARKEN, "DARKEN", 0, "Darken", ""},
 | 
			
		||||
	{SEQ_TYPE_SCREEN, "SCREEN", 0, "Screen", ""},
 | 
			
		||||
	{SEQ_TYPE_OVERLAY, "OVERLAY", 0, "Overlay", ""},
 | 
			
		||||
	{SEQ_TYPE_DODGE, "DODGE", 0, "Dodge", ""},
 | 
			
		||||
	{SEQ_TYPE_BURN, "BURN", 0, "Burn", ""},
 | 
			
		||||
	{SEQ_TYPE_LINEAR_BURN, "LINEAR_BURN", 0, "Linear Burn", ""},
 | 
			
		||||
	{SEQ_TYPE_SOFT_LIGHT, "SOFT_LIGHT", 0, "Soft Light", ""},
 | 
			
		||||
	{SEQ_TYPE_HARD_LIGHT, "HARD_LIGHT", 0, "Hard Light", ""},
 | 
			
		||||
	{SEQ_TYPE_PIN_LIGHT, "PIN_LIGHT", 0, "Pin Light", ""},
 | 
			
		||||
	{SEQ_TYPE_LIN_LIGHT, "LINEAR_LIGHT", 0, "Linear Light", ""},
 | 
			
		||||
	{SEQ_TYPE_VIVID_LIGHT, "VIVID_LIGHT", 0, "Vivid Light", ""},
 | 
			
		||||
	{SEQ_TYPE_BLEND_COLOR, "COLOR", 0, "Color", ""},
 | 
			
		||||
	{SEQ_TYPE_HUE, "HUE", 0, "Hue", ""},
 | 
			
		||||
	{SEQ_TYPE_SATURATION, "SATURATION", 0, "Saturation", ""},
 | 
			
		||||
	{SEQ_TYPE_VALUE, "VALUE", 0, "Value", ""},
 | 
			
		||||
	{SEQ_TYPE_DIFFERENCE, "DIFFERENCE", 0, "Difference", ""},
 | 
			
		||||
	{SEQ_TYPE_EXCLUSION, "EXCLUSION", 0, "Exclusion", ""},
 | 
			
		||||
	{0, NULL, 0, NULL, NULL}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@@ -1411,6 +1431,7 @@ static void rna_def_sequence(BlenderRNA *brna)
 | 
			
		||||
		{SEQ_TYPE_ADJUSTMENT, "ADJUSTMENT", 0, "Adjustment Layer", ""},
 | 
			
		||||
		{SEQ_TYPE_GAUSSIAN_BLUR, "GAUSSIAN_BLUR", 0, "Gaussian Blur", ""},
 | 
			
		||||
		{SEQ_TYPE_TEXT, "TEXT", 0, "Text", ""},
 | 
			
		||||
		{SEQ_TYPE_COLORMIX, "COLORMIX", 0, "Color Mix", ""},
 | 
			
		||||
		{0, NULL, 0, NULL, NULL}
 | 
			
		||||
	};
 | 
			
		||||
	
 | 
			
		||||
@@ -2378,6 +2399,49 @@ static void rna_def_text(StructRNA *srna)
 | 
			
		||||
	RNA_def_property_update(prop, NC_SCENE | ND_SEQUENCER, "rna_Sequence_update");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void rna_def_color_mix(StructRNA *srna)
 | 
			
		||||
{
 | 
			
		||||
	static EnumPropertyItem blend_color_items[] = {
 | 
			
		||||
		{SEQ_TYPE_ADD, "ADD", 0, "Add", ""},
 | 
			
		||||
		{SEQ_TYPE_SUB, "SUBTRACT", 0, "Subtract", ""},
 | 
			
		||||
		{SEQ_TYPE_MUL, "MULTIPLY", 0, "Multiply", ""},
 | 
			
		||||
		{SEQ_TYPE_LIGHTEN, "LIGHTEN", 0, "Lighten", ""},
 | 
			
		||||
		{SEQ_TYPE_DARKEN, "DARKEN", 0, "Darken", ""},
 | 
			
		||||
		{SEQ_TYPE_SCREEN, "SCREEN", 0, "Screen", ""},
 | 
			
		||||
		{SEQ_TYPE_OVERLAY, "OVERLAY", 0, "Overlay", ""},
 | 
			
		||||
		{SEQ_TYPE_DODGE, "DODGE", 0, "Dodge", ""},
 | 
			
		||||
		{SEQ_TYPE_BURN, "BURN", 0, "Burn", ""},
 | 
			
		||||
		{SEQ_TYPE_LINEAR_BURN, "LINEAR_BURN", 0, "Linear Burn", ""},
 | 
			
		||||
		{SEQ_TYPE_SOFT_LIGHT, "SOFT_LIGHT", 0, "Soft Light", ""},
 | 
			
		||||
		{SEQ_TYPE_HARD_LIGHT, "HARD_LIGHT", 0, "Hard Light", ""},
 | 
			
		||||
		{SEQ_TYPE_PIN_LIGHT, "PIN_LIGHT", 0, "Pin Light", ""},
 | 
			
		||||
		{SEQ_TYPE_LIN_LIGHT, "LINEAR_LIGHT", 0, "Linear Light", ""},
 | 
			
		||||
		{SEQ_TYPE_VIVID_LIGHT, "VIVID_LIGHT", 0, "Vivid Light", ""},
 | 
			
		||||
		{SEQ_TYPE_BLEND_COLOR, "COLOR", 0, "Color", ""},
 | 
			
		||||
		{SEQ_TYPE_HUE, "HUE", 0, "Hue", ""},
 | 
			
		||||
		{SEQ_TYPE_SATURATION, "SATURATION", 0, "Saturation", ""},
 | 
			
		||||
		{SEQ_TYPE_VALUE, "VALUE", 0, "Value", ""},
 | 
			
		||||
		{SEQ_TYPE_DIFFERENCE, "DIFFERENCE", 0, "Difference", ""},
 | 
			
		||||
		{SEQ_TYPE_EXCLUSION, "EXCLUSION", 0, "Exclusion", ""},
 | 
			
		||||
		{0, NULL, 0, NULL, NULL}
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	PropertyRNA *prop;
 | 
			
		||||
 | 
			
		||||
	RNA_def_struct_sdna_from(srna, "ColorMixVars", "effectdata");
 | 
			
		||||
 | 
			
		||||
	prop = RNA_def_property(srna, "blend_effect", PROP_ENUM, PROP_NONE);
 | 
			
		||||
	RNA_def_property_enum_sdna(prop, NULL, "blend_effect");
 | 
			
		||||
	RNA_def_property_enum_items(prop, blend_color_items);
 | 
			
		||||
	RNA_def_property_ui_text(prop, "Blend Effect", "Method for controlling how the strip combines with other strips");
 | 
			
		||||
	RNA_def_property_update(prop, NC_SCENE | ND_SEQUENCER, "rna_Sequence_update");
 | 
			
		||||
 | 
			
		||||
	prop = RNA_def_property(srna, "factor", PROP_FLOAT, PROP_FACTOR);
 | 
			
		||||
	RNA_def_property_range(prop, 0.0f, 1.0f);
 | 
			
		||||
	RNA_def_property_ui_text(prop, "Blend Factor", "Percentage of how much the strip's colors affect other strips");
 | 
			
		||||
	RNA_def_property_update(prop, NC_SCENE | ND_SEQUENCER, "rna_Sequence_update");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static EffectInfo def_effects[] = {
 | 
			
		||||
	{"AddSequence", "Add Sequence", "Add Sequence", NULL, 2},
 | 
			
		||||
	{"AdjustmentSequence", "Adjustment Layer Sequence",
 | 
			
		||||
@@ -2404,6 +2468,7 @@ static EffectInfo def_effects[] = {
 | 
			
		||||
	 rna_def_gaussian_blur, 1},
 | 
			
		||||
	{"TextSequence", "Text Sequence", "Sequence strip creating text",
 | 
			
		||||
	 rna_def_text, 0},
 | 
			
		||||
	{"ColorMixSequence", "Color Mix Sequence", "Color Mix Sequence", rna_def_color_mix, 2},
 | 
			
		||||
	{"", "", "", NULL, 0}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -475,6 +475,7 @@ void RNA_api_sequences(BlenderRNA *brna, PropertyRNA *cprop)
 | 
			
		||||
		{SEQ_TYPE_ADJUSTMENT, "ADJUSTMENT", 0, "Adjustment Layer", ""},
 | 
			
		||||
		{SEQ_TYPE_GAUSSIAN_BLUR, "GAUSSIAN_BLUR", 0, "Gaussian Blur", ""},
 | 
			
		||||
		{SEQ_TYPE_TEXT, "TEXT", 0, "Text", ""},
 | 
			
		||||
		{SEQ_TYPE_COLORMIX, "COLORMIX", 0, "Color Mix", ""},
 | 
			
		||||
		{0, NULL, 0, NULL, NULL}
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user