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.
This commit is contained in:
VodBox 2019-07-30 16:25:09 +12:00 committed by jp9000
parent e8c1ec4035
commit 6645eaf1b8
2 changed files with 39 additions and 9 deletions

View File

@ -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"

View File

@ -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,
};