diff --git a/plugins/obs-transitions/CMakeLists.txt b/plugins/obs-transitions/CMakeLists.txt index c6b6f5784c5895c8e84f5cfb573c674be7176485..3b8838d596679bb5930437ddbd37ac4f98590a90 100644 --- a/plugins/obs-transitions/CMakeLists.txt +++ b/plugins/obs-transitions/CMakeLists.txt @@ -7,6 +7,7 @@ set(obs-transitions_SOURCES transition-fade.c transition-cut.c transition-fade-to-color.c + transition-luma-wipe.c ) add_library(obs-transitions MODULE diff --git a/plugins/obs-transitions/data/locale/en-US.ini b/plugins/obs-transitions/data/locale/en-US.ini index a2072690808e578949384299f28416fcf5cb27dd..3bf16840fd4c4dd5a37766e47d770dbdd05fce03 100644 --- a/plugins/obs-transitions/data/locale/en-US.ini +++ b/plugins/obs-transitions/data/locale/en-US.ini @@ -11,3 +11,41 @@ Direction.Down="Down" SwipeIn="Swipe In" Color="Color" SwitchPoint="Peak Color Point (percentage)" +LumaWipeTransition="Luma Wipe" +LumaWipe.Image="Image" +LumaWipe.Invert="Invert" +LumaWipe.Softness="Softness" +LumaWipe.Type.BarndoorBottomLeft="Barndoor Bottom Left" +LumaWipe.Type.BarndoorHorizontal="Barndoor Horizontal" +LumaWipe.Type.BarndoorTopLeft="Barndoor Top Left" +LumaWipe.Type.BarndoorVertical="Barndoor Vertical" +LumaWipe.Type.BlindsHorizontal="Blinds Horizontal" +LumaWipe.Type.BoxBottomLeft="Box Bottom Left" +LumaWipe.Type.BoxBottomRight="Box Bottom Right" +LumaWipe.Type.BoxTopLeft="Box Top Left" +LumaWipe.Type.BoxTopRight="Box Top Right" +LumaWipe.Type.Burst="Burst" +LumaWipe.Type.CheckerboardSmall="Checkerboard Small" +LumaWipe.Type.Circles="Circles" +LumaWipe.Type.Clock="Clock" +LumaWipe.Type.Cloud="Cloud" +LumaWipe.Type.Curtain="Curtain" +LumaWipe.Type.Fan="Fan" +LumaWipe.Type.Fractal="Fractal" +LumaWipe.Type.Iris="Iris" +LumaWipe.Type.LinearHorizontal="Linear Horizontal" +LumaWipe.Type.LinearTopLeft="Linear Top Left" +LumaWipe.Type.LinearTopRight="Linear Top Right" +LumaWipe.Type.LinearVertical="Linear Vertical" +LumaWipe.Type.ParallelZigzagHorizontal="Parallel Zigzag Horizontal" +LumaWipe.Type.ParallelZigzagVertical="Parallel Zigzag Vertical" +LumaWipe.Type.Sinus9="Sinus 9" +LumaWipe.Type.Spiral="Spiral" +LumaWipe.Type.Square="Square" +LumaWipe.Type.Squares="Squares" +LumaWipe.Type.Stripes="Stripes" +LumaWipe.Type.StripsHorizontal="Strips Horizontal" +LumaWipe.Type.StripsVertical="Strips Vertical" +LumaWipe.Type.Watercolor="Watercolor" +LumaWipe.Type.ZigzagHorizontal="Zigzag Horizontal" +LumaWipe.Type.ZigzagVertical="Zigzag Vertical" diff --git a/plugins/obs-transitions/data/luma_wipe_transition.effect b/plugins/obs-transitions/data/luma_wipe_transition.effect new file mode 100644 index 0000000000000000000000000000000000000000..baab294b1c01cbad1a561461b84490c6c4a95747 --- /dev/null +++ b/plugins/obs-transitions/data/luma_wipe_transition.effect @@ -0,0 +1,61 @@ +// Based rendermix wipe shader +// https://github.com/rectalogic/rendermix-basic-effects/blob/master/assets/com/rendermix/Wipe/Wipe.frag + +uniform float4x4 ViewProj; +uniform texture2d a_tex; +uniform texture2d b_tex; +uniform texture2d l_tex; +uniform float progress; +uniform bool invert; +uniform float softness; + +sampler_state textureSampler { + Filter = Linear; + AddressU = Clamp; + AddressV = Clamp; +}; + +struct VertData { + float4 pos : POSITION; + float2 uv : TEXCOORD0; +}; + +VertData VSDefault(VertData v_in) +{ + VertData vert_out; + vert_out.pos = mul(float4(v_in.pos.xyz, 1.0), ViewProj); + vert_out.uv = v_in.uv; + return vert_out; +} + +float4 PSLumaWipe(VertData v_in) : TARGET +{ + float2 uv = v_in.uv; + float4 a_color = a_tex.Sample(textureSampler, uv); + float4 b_color = b_tex.Sample(textureSampler, uv); + float luma = l_tex.Sample(textureSampler, uv).x; + + if (invert) + luma = 1.0f - luma; + + float time = lerp(0.0f, 1.0f + softness, progress); + + if (luma <= time - softness) + return b_color; + + if (luma >= time) + return a_color; + + float alpha = (time - luma) / softness; + + return lerp(a_color, b_color, alpha); +} + +technique LumaWipe +{ + pass + { + vertex_shader = VSDefault(v_in); + pixel_shader = PSLumaWipe(v_in); + } +} diff --git a/plugins/obs-transitions/data/luma_wipes/barndoor-botleft.png b/plugins/obs-transitions/data/luma_wipes/barndoor-botleft.png new file mode 100644 index 0000000000000000000000000000000000000000..0e83cfc8fa074c6eef25d984539be63de800b832 Binary files /dev/null and b/plugins/obs-transitions/data/luma_wipes/barndoor-botleft.png differ diff --git a/plugins/obs-transitions/data/luma_wipes/barndoor-h.png b/plugins/obs-transitions/data/luma_wipes/barndoor-h.png new file mode 100644 index 0000000000000000000000000000000000000000..c60729ec3edc7e9282adba57dafec6700057936d Binary files /dev/null and b/plugins/obs-transitions/data/luma_wipes/barndoor-h.png differ diff --git a/plugins/obs-transitions/data/luma_wipes/barndoor-topleft.png b/plugins/obs-transitions/data/luma_wipes/barndoor-topleft.png new file mode 100644 index 0000000000000000000000000000000000000000..a21fd8ff2249d341e421c32a9a262de26aacffdc Binary files /dev/null and b/plugins/obs-transitions/data/luma_wipes/barndoor-topleft.png differ diff --git a/plugins/obs-transitions/data/luma_wipes/barndoor-v.png b/plugins/obs-transitions/data/luma_wipes/barndoor-v.png new file mode 100644 index 0000000000000000000000000000000000000000..bb538e515ad4ca7367e08b879a7ae72c6c94bdce Binary files /dev/null and b/plugins/obs-transitions/data/luma_wipes/barndoor-v.png differ diff --git a/plugins/obs-transitions/data/luma_wipes/blinds-h.png b/plugins/obs-transitions/data/luma_wipes/blinds-h.png new file mode 100644 index 0000000000000000000000000000000000000000..8de01deb1307a3d458b5198e278b13a938cfdd82 Binary files /dev/null and b/plugins/obs-transitions/data/luma_wipes/blinds-h.png differ diff --git a/plugins/obs-transitions/data/luma_wipes/box-botleft.png b/plugins/obs-transitions/data/luma_wipes/box-botleft.png new file mode 100644 index 0000000000000000000000000000000000000000..0be56f5a1facc47328502c6a267c967b8bcb4e80 Binary files /dev/null and b/plugins/obs-transitions/data/luma_wipes/box-botleft.png differ diff --git a/plugins/obs-transitions/data/luma_wipes/box-botright.png b/plugins/obs-transitions/data/luma_wipes/box-botright.png new file mode 100644 index 0000000000000000000000000000000000000000..c2b15e8ca0e7dc08913cbfe3b34c6034e2ff4329 Binary files /dev/null and b/plugins/obs-transitions/data/luma_wipes/box-botright.png differ diff --git a/plugins/obs-transitions/data/luma_wipes/box-topleft.png b/plugins/obs-transitions/data/luma_wipes/box-topleft.png new file mode 100644 index 0000000000000000000000000000000000000000..cbef40ee6475d1bef8a0d7474a23a06941265821 Binary files /dev/null and b/plugins/obs-transitions/data/luma_wipes/box-topleft.png differ diff --git a/plugins/obs-transitions/data/luma_wipes/box-topright.png b/plugins/obs-transitions/data/luma_wipes/box-topright.png new file mode 100644 index 0000000000000000000000000000000000000000..0e55734a3b862622654d31575cc44521efeeda62 Binary files /dev/null and b/plugins/obs-transitions/data/luma_wipes/box-topright.png differ diff --git a/plugins/obs-transitions/data/luma_wipes/burst.png b/plugins/obs-transitions/data/luma_wipes/burst.png new file mode 100644 index 0000000000000000000000000000000000000000..74e5f4e99c6ea6ff9f31707c45280e8bcade03ed Binary files /dev/null and b/plugins/obs-transitions/data/luma_wipes/burst.png differ diff --git a/plugins/obs-transitions/data/luma_wipes/checkerboard-small.png b/plugins/obs-transitions/data/luma_wipes/checkerboard-small.png new file mode 100644 index 0000000000000000000000000000000000000000..d6fb8396a0e11ef38f091d337c50c146c871ea3d Binary files /dev/null and b/plugins/obs-transitions/data/luma_wipes/checkerboard-small.png differ diff --git a/plugins/obs-transitions/data/luma_wipes/circles.png b/plugins/obs-transitions/data/luma_wipes/circles.png new file mode 100644 index 0000000000000000000000000000000000000000..2b83a1b6d52d78839309e4e67b3363fa155b1ad5 Binary files /dev/null and b/plugins/obs-transitions/data/luma_wipes/circles.png differ diff --git a/plugins/obs-transitions/data/luma_wipes/clock.png b/plugins/obs-transitions/data/luma_wipes/clock.png new file mode 100644 index 0000000000000000000000000000000000000000..3bd2b877d4d195aa86ca89e549f5e9572785a7e3 Binary files /dev/null and b/plugins/obs-transitions/data/luma_wipes/clock.png differ diff --git a/plugins/obs-transitions/data/luma_wipes/cloud.png b/plugins/obs-transitions/data/luma_wipes/cloud.png new file mode 100644 index 0000000000000000000000000000000000000000..0095f710cdb01ef24b0489d3cb1c77f1574099fe Binary files /dev/null and b/plugins/obs-transitions/data/luma_wipes/cloud.png differ diff --git a/plugins/obs-transitions/data/luma_wipes/curtain.png b/plugins/obs-transitions/data/luma_wipes/curtain.png new file mode 100644 index 0000000000000000000000000000000000000000..552ee1718a4de46eafdcd572340d67176da3d177 Binary files /dev/null and b/plugins/obs-transitions/data/luma_wipes/curtain.png differ diff --git a/plugins/obs-transitions/data/luma_wipes/fan.png b/plugins/obs-transitions/data/luma_wipes/fan.png new file mode 100644 index 0000000000000000000000000000000000000000..4fd495796bb60fe59b227bc653803e9b0be6f98d Binary files /dev/null and b/plugins/obs-transitions/data/luma_wipes/fan.png differ diff --git a/plugins/obs-transitions/data/luma_wipes/fractal.png b/plugins/obs-transitions/data/luma_wipes/fractal.png new file mode 100644 index 0000000000000000000000000000000000000000..b875a5043f7d06f0680157956331110523a9dbc4 Binary files /dev/null and b/plugins/obs-transitions/data/luma_wipes/fractal.png differ diff --git a/plugins/obs-transitions/data/luma_wipes/iris.png b/plugins/obs-transitions/data/luma_wipes/iris.png new file mode 100644 index 0000000000000000000000000000000000000000..69e637c2876d66a068ff6c701843f6be3313acbc Binary files /dev/null and b/plugins/obs-transitions/data/luma_wipes/iris.png differ diff --git a/plugins/obs-transitions/data/luma_wipes/linear-h.png b/plugins/obs-transitions/data/luma_wipes/linear-h.png new file mode 100644 index 0000000000000000000000000000000000000000..10ce2798d6a80c616e95c0c0e80462204d390dff Binary files /dev/null and b/plugins/obs-transitions/data/luma_wipes/linear-h.png differ diff --git a/plugins/obs-transitions/data/luma_wipes/linear-topleft.png b/plugins/obs-transitions/data/luma_wipes/linear-topleft.png new file mode 100644 index 0000000000000000000000000000000000000000..c5bf908f6f3b3bc2911ebb8b03947291a6656a39 Binary files /dev/null and b/plugins/obs-transitions/data/luma_wipes/linear-topleft.png differ diff --git a/plugins/obs-transitions/data/luma_wipes/linear-topright.png b/plugins/obs-transitions/data/luma_wipes/linear-topright.png new file mode 100644 index 0000000000000000000000000000000000000000..dfcb76cd7815a78eac8114b8913dc957e060e25a Binary files /dev/null and b/plugins/obs-transitions/data/luma_wipes/linear-topright.png differ diff --git a/plugins/obs-transitions/data/luma_wipes/linear-v.png b/plugins/obs-transitions/data/luma_wipes/linear-v.png new file mode 100644 index 0000000000000000000000000000000000000000..031970a322ed675fd02973ed98abe2ef56fcbaae Binary files /dev/null and b/plugins/obs-transitions/data/luma_wipes/linear-v.png differ diff --git a/plugins/obs-transitions/data/luma_wipes/parallel-zigzag-h.png b/plugins/obs-transitions/data/luma_wipes/parallel-zigzag-h.png new file mode 100644 index 0000000000000000000000000000000000000000..05e5e570084779eda0f31179f9f485eeb17d8d8e Binary files /dev/null and b/plugins/obs-transitions/data/luma_wipes/parallel-zigzag-h.png differ diff --git a/plugins/obs-transitions/data/luma_wipes/parallel-zigzag-v.png b/plugins/obs-transitions/data/luma_wipes/parallel-zigzag-v.png new file mode 100644 index 0000000000000000000000000000000000000000..2c9ee23a7ca56af3a1333d2c9b218d866f9ec739 Binary files /dev/null and b/plugins/obs-transitions/data/luma_wipes/parallel-zigzag-v.png differ diff --git a/plugins/obs-transitions/data/luma_wipes/sinus9.png b/plugins/obs-transitions/data/luma_wipes/sinus9.png new file mode 100644 index 0000000000000000000000000000000000000000..07dc82000deb9d79aaf17dd4c6b4c42106d4d2f7 Binary files /dev/null and b/plugins/obs-transitions/data/luma_wipes/sinus9.png differ diff --git a/plugins/obs-transitions/data/luma_wipes/spiral.png b/plugins/obs-transitions/data/luma_wipes/spiral.png new file mode 100644 index 0000000000000000000000000000000000000000..a07a50145a20978cf03fc88eed93af0535f970fb Binary files /dev/null and b/plugins/obs-transitions/data/luma_wipes/spiral.png differ diff --git a/plugins/obs-transitions/data/luma_wipes/square.png b/plugins/obs-transitions/data/luma_wipes/square.png new file mode 100644 index 0000000000000000000000000000000000000000..f33faf38a61de35af8a068d97a626e5cfb8d205d Binary files /dev/null and b/plugins/obs-transitions/data/luma_wipes/square.png differ diff --git a/plugins/obs-transitions/data/luma_wipes/squares.png b/plugins/obs-transitions/data/luma_wipes/squares.png new file mode 100644 index 0000000000000000000000000000000000000000..2cc9ff4aff9c521ea604de1b78aaf7105ffec46c Binary files /dev/null and b/plugins/obs-transitions/data/luma_wipes/squares.png differ diff --git a/plugins/obs-transitions/data/luma_wipes/stripes.png b/plugins/obs-transitions/data/luma_wipes/stripes.png new file mode 100644 index 0000000000000000000000000000000000000000..84e90e82655d51970d13731790ce646c53864407 Binary files /dev/null and b/plugins/obs-transitions/data/luma_wipes/stripes.png differ diff --git a/plugins/obs-transitions/data/luma_wipes/strips-h.png b/plugins/obs-transitions/data/luma_wipes/strips-h.png new file mode 100644 index 0000000000000000000000000000000000000000..1b44739e6d618194912acc76b74de3329a3fc67b Binary files /dev/null and b/plugins/obs-transitions/data/luma_wipes/strips-h.png differ diff --git a/plugins/obs-transitions/data/luma_wipes/strips-v.png b/plugins/obs-transitions/data/luma_wipes/strips-v.png new file mode 100644 index 0000000000000000000000000000000000000000..e4dc4343b7357783883050b9dbe7868e3c79ea12 Binary files /dev/null and b/plugins/obs-transitions/data/luma_wipes/strips-v.png differ diff --git a/plugins/obs-transitions/data/luma_wipes/watercolor.png b/plugins/obs-transitions/data/luma_wipes/watercolor.png new file mode 100644 index 0000000000000000000000000000000000000000..571b979a92c834c817e308cade8ada2d0164ae4d Binary files /dev/null and b/plugins/obs-transitions/data/luma_wipes/watercolor.png differ diff --git a/plugins/obs-transitions/data/luma_wipes/wipes.json b/plugins/obs-transitions/data/luma_wipes/wipes.json new file mode 100644 index 0000000000000000000000000000000000000000..cc297e2cb2ff2ee4f99e76f4c27fac1b0e0070aa --- /dev/null +++ b/plugins/obs-transitions/data/luma_wipes/wipes.json @@ -0,0 +1,36 @@ +{ + "LumaWipe.Type.BarndoorBottomLeft": "barndoor-botleft.png", + "LumaWipe.Type.BarndoorHorizontal": "barndoor-h.png", + "LumaWipe.Type.BarndoorTopLeft": "barndoor-topleft.png", + "LumaWipe.Type.BarndoorVertical": "barndoor-v.png", + "LumaWipe.Type.BlindsHorizontal": "blinds-h.png", + "LumaWipe.Type.BoxBottomLeft": "box-botleft.png", + "LumaWipe.Type.BoxBottomRight": "box-botright.png", + "LumaWipe.Type.BoxTopLeft": "box-topleft.png", + "LumaWipe.Type.BoxTopRight": "box-topright.png", + "LumaWipe.Type.Burst": "burst.png", + "LumaWipe.Type.CheckerboardSmall": "checkerboard-small.png", + "LumaWipe.Type.Circles": "circles.png", + "LumaWipe.Type.Clock": "clock.png", + "LumaWipe.Type.Cloud": "cloud.png", + "LumaWipe.Type.Curtain": "curtain.png", + "LumaWipe.Type.Fan": "fan.png", + "LumaWipe.Type.Fractal": "fractal.png", + "LumaWipe.Type.Iris": "iris.png", + "LumaWipe.Type.LinearHorizontal": "linear-h.png", + "LumaWipe.Type.LinearTopLeft": "linear-topleft.png", + "LumaWipe.Type.LinearTopRight": "linear-topright.png", + "LumaWipe.Type.LinearVertical": "linear-v.png", + "LumaWipe.Type.ParallelZigzagHorizontal": "parallel-zigzag-h.png", + "LumaWipe.Type.ParallelZigzagVertical": "parallel-zigzag-v.png", + "LumaWipe.Type.Sinus9": "sinus9.png", + "LumaWipe.Type.Spiral": "spiral.png", + "LumaWipe.Type.Square": "square.png", + "LumaWipe.Type.Squares": "squares.png", + "LumaWipe.Type.Stripes": "stripes.png", + "LumaWipe.Type.StripsHorizontal": "strips-h.png", + "LumaWipe.Type.StripsVertical": "strips-v.png", + "LumaWipe.Type.Watercolor": "watercolor.png", + "LumaWipe.Type.ZigzagHorizontal": "zigzag-h.png", + "LumaWipe.Type.ZigzagVertical": "zigzag-v.png" +} diff --git a/plugins/obs-transitions/data/luma_wipes/zigzag-h.png b/plugins/obs-transitions/data/luma_wipes/zigzag-h.png new file mode 100644 index 0000000000000000000000000000000000000000..c042d49bd4a66f551b22159febb0b856631db338 Binary files /dev/null and b/plugins/obs-transitions/data/luma_wipes/zigzag-h.png differ diff --git a/plugins/obs-transitions/data/luma_wipes/zigzag-v.png b/plugins/obs-transitions/data/luma_wipes/zigzag-v.png new file mode 100644 index 0000000000000000000000000000000000000000..2f4380b9b89a3b48954f898c5c988ea8ca39a9f6 Binary files /dev/null and b/plugins/obs-transitions/data/luma_wipes/zigzag-v.png differ diff --git a/plugins/obs-transitions/obs-transitions.c b/plugins/obs-transitions/obs-transitions.c index 351726ce86bc982ebba41bbd34b6011f2cb17604..3841f4814c924b0ba7f917fc271b263bc08f7075 100644 --- a/plugins/obs-transitions/obs-transitions.c +++ b/plugins/obs-transitions/obs-transitions.c @@ -9,6 +9,7 @@ extern struct obs_source_info fade_transition; extern struct obs_source_info swipe_transition; extern struct obs_source_info slide_transition; extern struct obs_source_info fade_to_color_transition; +extern struct obs_source_info luma_wipe_transition; bool obs_module_load(void) { @@ -17,5 +18,6 @@ bool obs_module_load(void) obs_register_source(&swipe_transition); obs_register_source(&slide_transition); obs_register_source(&fade_to_color_transition); + obs_register_source(&luma_wipe_transition); return true; } diff --git a/plugins/obs-transitions/transition-luma-wipe.c b/plugins/obs-transitions/transition-luma-wipe.c new file mode 100644 index 0000000000000000000000000000000000000000..6b8ec2c869c6b6118c1023d38b003003c8c655ac --- /dev/null +++ b/plugins/obs-transitions/transition-luma-wipe.c @@ -0,0 +1,213 @@ +#include +#include +#include + +#define S_LUMA_IMG "luma_image" +#define S_LUMA_INV "luma_invert" +#define S_LUMA_SOFT "luma_softness" + +#define T_LUMA_IMG obs_module_text("LumaWipe.Image") +#define T_LUMA_INV obs_module_text("LumaWipe.Invert") +#define T_LUMA_SOFT obs_module_text("LumaWipe.Softness") + +struct luma_wipe_info { + obs_source_t *source; + + gs_effect_t *effect; + gs_eparam_t *ep_a_tex; + gs_eparam_t *ep_b_tex; + gs_eparam_t *ep_l_tex; + gs_eparam_t *ep_progress; + gs_eparam_t *ep_invert; + gs_eparam_t *ep_softness; + + gs_image_file_t luma_image; + bool invert_luma; + float softness; + obs_data_t *wipes_list; +}; + +static const char *luma_wipe_get_name(void *type_data) +{ + UNUSED_PARAMETER(type_data); + return obs_module_text("LumaWipeTransition"); +} + +static void luma_wipe_update(void *data, obs_data_t *settings) +{ + struct luma_wipe_info *lwipe = data; + + const char *name = obs_data_get_string(settings, S_LUMA_IMG); + lwipe->invert_luma = obs_data_get_bool(settings, S_LUMA_INV); + lwipe->softness = (float)obs_data_get_double(settings, S_LUMA_SOFT); + + struct dstr path = {0}; + + dstr_copy(&path, "luma_wipes/"); + dstr_cat(&path, name); + + char *file = obs_module_file(path.array); + + obs_enter_graphics(); + gs_image_file_free(&lwipe->luma_image); + obs_leave_graphics(); + + gs_image_file_init(&lwipe->luma_image, file); + + obs_enter_graphics(); + gs_image_file_init_texture(&lwipe->luma_image); + obs_leave_graphics(); + + bfree(file); + dstr_free(&path); + + UNUSED_PARAMETER(settings); +} + +static void luma_wipe_get_list(void *data) +{ + struct luma_wipe_info *lwipe = data; + + char *path = obs_module_file("luma_wipes/wipes.json"); + + lwipe->wipes_list = obs_data_create_from_json_file(path); + + bfree(path); +} + +static void *luma_wipe_create(obs_data_t *settings, obs_source_t *source) +{ + struct luma_wipe_info *lwipe; + gs_effect_t *effect; + char *file = obs_module_file("luma_wipe_transition.effect"); + + obs_enter_graphics(); + effect = gs_effect_create_from_file(file, NULL); + obs_leave_graphics(); + + if (!effect) { + blog(LOG_ERROR, "Could not open luma_wipe_transition.effect"); + return NULL; + } + + bfree(file); + + lwipe = bzalloc(sizeof(*lwipe)); + + lwipe->effect = effect; + lwipe->ep_a_tex = gs_effect_get_param_by_name(effect, "a_tex"); + lwipe->ep_b_tex = gs_effect_get_param_by_name(effect, "b_tex"); + lwipe->ep_l_tex = gs_effect_get_param_by_name(effect, "l_tex"); + lwipe->ep_progress = gs_effect_get_param_by_name(effect, "progress"); + lwipe->ep_invert = gs_effect_get_param_by_name(effect, "invert"); + lwipe->ep_softness = gs_effect_get_param_by_name(effect, "softness"); + lwipe->source = source; + + luma_wipe_get_list(lwipe); + + luma_wipe_update(lwipe, settings); + + return lwipe; +} + +static void luma_wipe_destroy(void *data) +{ + struct luma_wipe_info *lwipe = data; + + obs_enter_graphics(); + gs_image_file_free(&lwipe->luma_image); + obs_leave_graphics(); + + obs_data_release(lwipe->wipes_list); + + bfree(lwipe); +} + +static obs_properties_t *luma_wipe_properties(void *data) +{ + obs_properties_t *props = obs_properties_create(); + struct luma_wipe_info *lwipe = data; + + obs_property_t *p; + + p = obs_properties_add_list(props, S_LUMA_IMG, T_LUMA_IMG, + OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_STRING); + + obs_data_item_t *item = obs_data_first(lwipe->wipes_list); + + for (; item != NULL; obs_data_item_next(&item)) { + const char *name = obs_data_item_get_name(item); + const char *path = obs_data_item_get_string(item); + obs_property_list_add_string(p, obs_module_text(name), path); + } + + obs_properties_add_float(props, S_LUMA_SOFT, T_LUMA_SOFT, 0.0, 1.0, 0.05); + obs_properties_add_bool(props, S_LUMA_INV, T_LUMA_INV); + + return props; +} + +static void luma_wipe_defaults(obs_data_t *settings) +{ + obs_data_set_default_string(settings, S_LUMA_IMG, "linear-h.png"); + obs_data_set_default_double(settings, S_LUMA_SOFT, 0.03); + obs_data_set_default_bool(settings, S_LUMA_INV, false); +} + +static void luma_wipe_callback(void *data, gs_texture_t *a, gs_texture_t *b, + float t, uint32_t cx, uint32_t cy) +{ + struct luma_wipe_info *lwipe = data; + + gs_effect_set_texture(lwipe->ep_a_tex, a); + gs_effect_set_texture(lwipe->ep_b_tex, b); + gs_effect_set_texture(lwipe->ep_l_tex, lwipe->luma_image.texture); + gs_effect_set_float(lwipe->ep_progress, t); + + gs_effect_set_bool(lwipe->ep_invert, lwipe->invert_luma); + gs_effect_set_float(lwipe->ep_softness, lwipe->softness); + + while (gs_effect_loop(lwipe->effect, "LumaWipe")) + gs_draw_sprite(NULL, 0, cx, cy); +} + +void luma_wipe_video_render(void *data, gs_effect_t *effect) +{ + struct luma_wipe_info *lwipe = data; + obs_transition_video_render(lwipe->source, luma_wipe_callback); + UNUSED_PARAMETER(effect); +} + +static float mix_a(void *data, float t) +{ + UNUSED_PARAMETER(data); + return 1.0f - t; +} + +static float mix_b(void *data, float t) +{ + UNUSED_PARAMETER(data); + return t; +} + +bool luma_wipe_audio_render(void *data, uint64_t *ts_out, + struct obs_source_audio_mix *audio, uint32_t mixers, + size_t channels, size_t sample_rate) +{ + struct luma_wipe_info *lwipe = data; + return obs_transition_audio_render(lwipe->source, ts_out, audio, mixers, + channels, sample_rate, mix_a, mix_b); +} + +struct obs_source_info luma_wipe_transition = { + .id = "wipe_transition", + .type = OBS_SOURCE_TYPE_TRANSITION, + .get_name = luma_wipe_get_name, + .create = luma_wipe_create, + .destroy = luma_wipe_destroy, + .update = luma_wipe_update, + .video_render = luma_wipe_video_render, + .audio_render = luma_wipe_audio_render, + .get_properties = luma_wipe_properties, + .get_defaults = luma_wipe_defaults +};