From 6645eaf1b885008252f678edf4be7bf28ba19d79 Mon Sep 17 00:00:00 2001 From: VodBox Date: Tue, 30 Jul 2019 16:25:09 +1200 Subject: [PATCH] obs-filters: Add toggle for scroll filter looping By giving the option to disable the looping in the scroll filter, it makes it more suitable for tasks like credits sequences, where you don't want the texture to repeat and for the motion to only be performed once. --- plugins/obs-filters/data/locale/en-US.ini | 1 + plugins/obs-filters/scroll-filter.c | 47 ++++++++++++++++++----- 2 files changed, 39 insertions(+), 9 deletions(-) diff --git a/plugins/obs-filters/data/locale/en-US.ini b/plugins/obs-filters/data/locale/en-US.ini index 5f133ee72..da442396b 100644 --- a/plugins/obs-filters/data/locale/en-US.ini +++ b/plugins/obs-filters/data/locale/en-US.ini @@ -46,6 +46,7 @@ ScrollFilter.SpeedX="Horizontal Speed" ScrollFilter.SpeedY="Vertical Speed" ScrollFilter.LimitWidth="Limit Width" ScrollFilter.LimitHeight="Limit Height" +ScrollFilter.Loop="Loop" CustomColor="Custom Color" Red="Red" Green="Green" diff --git a/plugins/obs-filters/scroll-filter.c b/plugins/obs-filters/scroll-filter.c index c316fa8d0..7f9f7c641 100644 --- a/plugins/obs-filters/scroll-filter.c +++ b/plugins/obs-filters/scroll-filter.c @@ -18,6 +18,8 @@ struct scroll_filter_data { struct vec2 size_i; struct vec2 offset; + + bool loop; }; static const char *scroll_filter_get_name(void *unused) @@ -31,15 +33,10 @@ static void *scroll_filter_create(obs_data_t *settings, obs_source_t *context) struct scroll_filter_data *filter = bzalloc(sizeof(*filter)); char *effect_path = obs_module_file("crop_filter.effect"); - struct gs_sampler_info sampler_info = {.filter = GS_FILTER_LINEAR, - .address_u = GS_ADDRESS_WRAP, - .address_v = GS_ADDRESS_WRAP}; - filter->context = context; obs_enter_graphics(); filter->effect = gs_effect_create_from_file(effect_path, NULL); - filter->sampler = gs_samplerstate_create(&sampler_info); obs_leave_graphics(); bfree(effect_path); @@ -86,6 +83,19 @@ static void scroll_filter_update(void *data, obs_data_t *settings) filter->scroll_speed.y = (float)obs_data_get_double(settings, "speed_y"); + filter->loop = obs_data_get_bool(settings, "loop"); + + struct gs_sampler_info sampler_info = { + .filter = GS_FILTER_LINEAR, + .address_u = filter->loop ? GS_ADDRESS_WRAP : GS_ADDRESS_BORDER, + .address_v = filter->loop ? GS_ADDRESS_WRAP : GS_ADDRESS_BORDER, + }; + + obs_enter_graphics(); + gs_samplerstate_destroy(filter->sampler); + filter->sampler = gs_samplerstate_create(&sampler_info); + obs_leave_graphics(); + if (filter->scroll_speed.x == 0.0f) filter->offset.x = 0.0f; if (filter->scroll_speed.y == 0.0f) @@ -136,6 +146,9 @@ static obs_properties_t *scroll_filter_properties(void *data) obs_properties_add_int(props, "cy", obs_module_text("Crop.Height"), 1, 8192, 1); + obs_properties_add_bool(props, "loop", + obs_module_text("ScrollFilter.Loop")); + UNUSED_PARAMETER(data); return props; } @@ -145,6 +158,7 @@ static void scroll_filter_defaults(obs_data_t *settings) obs_data_set_default_bool(settings, "limit_size", false); obs_data_set_default_int(settings, "cx", 100); obs_data_set_default_int(settings, "cy", 100); + obs_data_set_default_bool(settings, "loop", true); } static void scroll_filter_tick(void *data, float seconds) @@ -154,10 +168,17 @@ static void scroll_filter_tick(void *data, float seconds) filter->offset.x += filter->size_i.x * filter->scroll_speed.x * seconds; filter->offset.y += filter->size_i.y * filter->scroll_speed.y * seconds; - if (filter->offset.x > 1.0f) - filter->offset.x -= 1.0f; - if (filter->offset.y > 1.0f) - filter->offset.y -= 1.0f; + if (filter->loop) { + if (filter->offset.x > 1.0f) + filter->offset.x -= 1.0f; + if (filter->offset.y > 1.0f) + filter->offset.y -= 1.0f; + } else { + if (filter->offset.x > 1.0f) + filter->offset.x = 1.0f; + if (filter->offset.y > 1.0f) + filter->offset.y = 1.0f; + } } static void scroll_filter_render(void *data, gs_effect_t *effect) @@ -220,6 +241,13 @@ static uint32_t scroll_filter_height(void *data) : obs_source_get_base_height(target); } +static void scroll_filter_show(void *data) +{ + struct scroll_filter_data *filter = data; + filter->offset.x = 0.0f; + filter->offset.y = 0.0f; +} + struct obs_source_info scroll_filter = { .id = "scroll_filter", .type = OBS_SOURCE_TYPE_FILTER, @@ -234,4 +262,5 @@ struct obs_source_info scroll_filter = { .video_render = scroll_filter_render, .get_width = scroll_filter_width, .get_height = scroll_filter_height, + .show = scroll_filter_show, };