From ebbc0cb1ce3230cb9e2ba69346e862853457d75f Mon Sep 17 00:00:00 2001 From: Michael Fabian 'Xaymar' Dirks Date: Mon, 1 Oct 2018 00:54:36 +0200 Subject: [PATCH] filter-blur: Fix Mask Type and split Color into Color and Alpha --- data/locale/en-US.ini | 2 ++ source/filter-blur.cpp | 27 +++++++++++++++++---------- source/filter-blur.h | 16 +++++++++++----- 3 files changed, 30 insertions(+), 15 deletions(-) diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index 7cba0bd3..701369c5 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -80,6 +80,8 @@ Filter.Blur.Mask.Source="Source Mask" Filter.Blur.Mask.Source.Description="Source to use for the mask." Filter.Blur.Mask.Color="Mask Color Filter" Filter.Blur.Mask.Color.Description="Filter the mask by this color before applying it." +Filter.Blur.Mask.Alpha="Mask Alpha Filter" +Filter.Blur.Mask.Alpha.Description="Filter the mask by this alpha value before applying it." Filter.Blur.Mask.Multiplier="Mask Multiplier" Filter.Blur.Mask.Multiplier.Description="Multiply the final mask value by this value." diff --git a/source/filter-blur.cpp b/source/filter-blur.cpp index 98011ffe..08de4e5d 100644 --- a/source/filter-blur.cpp +++ b/source/filter-blur.cpp @@ -59,6 +59,7 @@ extern "C" { #define P_MASK_IMAGE "Filter.Blur.Mask.Image" #define P_MASK_SOURCE "Filter.Blur.Mask.Source" #define P_MASK_COLOR "Filter.Blur.Mask.Color" +#define P_MASK_ALPHA "Filter.Blur.Mask.Alpha" #define P_MASK_MULTIPLIER "Filter.Blur.Mask.Multiplier" // Initializer & Finalizer @@ -97,7 +98,6 @@ bool filter::blur::instance::apply_shared_param(gs_texture_t* input, float texel result = result && gs_set_param_int(blur_effect->get_object(), "u_radius", (int)size); result = result && gs_set_param_int(blur_effect->get_object(), "u_diameter", (int)(1 + (size * 2))); - return result; } @@ -136,7 +136,8 @@ bool filter::blur::instance::apply_gaussian_param() return true; } -bool filter::blur::instance::apply_mask_parameters(std::shared_ptr effect, gs_texture_t * original_texture, gs_texture_t* blurred_texture) +bool filter::blur::instance::apply_mask_parameters(std::shared_ptr effect, gs_texture_t* original_texture, + gs_texture_t* blurred_texture) { if (effect->has_parameter("image_orig")) { effect->get_parameter("image_orig").set_texture(original_texture); @@ -191,9 +192,7 @@ bool filter::blur::instance::apply_mask_parameters(std::shared_ptr e // Shared if (effect->has_parameter("mask_color")) { - effect->get_parameter("mask_color") - .set_float4((mask.color & 0xFF) / 255.0f, ((mask.color >> 8) & 0xFF) / 255.0f, - ((mask.color >> 16) & 0xFF) / 255.0f, ((mask.color >> 24) & 0xFF) / 255.0f); + effect->get_parameter("mask_color").set_float4(mask.color.r, mask.color.g, mask.color.b, mask.color.a); } if (effect->has_parameter("mask_multiplier")) { effect->get_parameter("mask_multiplier").set_float(mask.multiplier); @@ -221,6 +220,7 @@ bool filter::blur::instance::modified_properties(void* ptr, obs_properties_t* pr bool show_image = (mtype == mask_type::Image) && show_mask; bool show_source = (mtype == mask_type::Source) && show_mask; + obs_property_set_visible(obs_properties_get(props, P_MASK_TYPE), show_mask); obs_property_set_visible(obs_properties_get(props, P_MASK_REGION_LEFT), show_region); obs_property_set_visible(obs_properties_get(props, P_MASK_REGION_TOP), show_region); obs_property_set_visible(obs_properties_get(props, P_MASK_REGION_RIGHT), show_region); @@ -232,6 +232,7 @@ bool filter::blur::instance::modified_properties(void* ptr, obs_properties_t* pr obs_property_set_visible(obs_properties_get(props, P_MASK_IMAGE), show_image); obs_property_set_visible(obs_properties_get(props, P_MASK_SOURCE), show_source); obs_property_set_visible(obs_properties_get(props, P_MASK_COLOR), show_image || show_source); + obs_property_set_visible(obs_properties_get(props, P_MASK_ALPHA), show_image || show_source); obs_property_set_visible(obs_properties_get(props, P_MASK_MULTIPLIER), show_image || show_source); // advanced @@ -354,6 +355,8 @@ obs_properties_t* filter::blur::instance::get_properties() /// Shared p = obs_properties_add_color(pr, P_MASK_COLOR, P_TRANSLATE(P_MASK_COLOR)); obs_property_set_long_description(p, P_TRANSLATE(P_DESC(P_MASK_COLOR))); + p = obs_properties_add_float_slider(pr, P_MASK_ALPHA, P_TRANSLATE(P_MASK_ALPHA), 0.0, 100.0, 0.1); + obs_property_set_long_description(p, P_TRANSLATE(P_DESC(P_MASK_ALPHA))); p = obs_properties_add_float_slider(pr, P_MASK_MULTIPLIER, P_TRANSLATE(P_MASK_MULTIPLIER), 0.0, 10.0, 0.01); obs_property_set_long_description(p, P_TRANSLATE(P_DESC(P_MASK_MULTIPLIER))); @@ -403,7 +406,11 @@ void filter::blur::instance::update(obs_data_t* settings) break; } if ((mask.type == mask_type::Image) || (mask.type == mask_type::Source)) { - mask.color = static_cast(obs_data_get_int(settings, P_MASK_COLOR)); + uint32_t color = static_cast(obs_data_get_int(settings, P_MASK_COLOR)); + mask.color.r = ((color >> 0) & 0xFF) / 255.0f; + mask.color.g = ((color >> 8) & 0xFF) / 255.0f; + mask.color.b = ((color >> 16) & 0xFF) / 255.0f; + mask.color.a = static_cast(obs_data_get_double(settings, P_MASK_ALPHA)); mask.multiplier = float_t(obs_data_get_double(settings, P_MASK_MULTIPLIER)); } } @@ -418,12 +425,12 @@ void filter::blur::instance::update(obs_data_t* settings) uint32_t filter::blur::instance::get_width() { - return uint32_t(); + return uint32_t(0); } uint32_t filter::blur::instance::get_height() { - return uint32_t(); + return uint32_t(0); } void filter::blur::instance::activate() {} @@ -449,7 +456,7 @@ void filter::blur::instance::video_render(gs_effect_t* effect) obs_source_skip_video_filter(m_source); return; } - if ((baseW <= 0) || (baseH <= 0)) { + if ((baseW == 0) || (baseH == 0)) { if (!have_logged_error) P_LOG_ERROR(" Instance '%s' has invalid size source '%s'.", obs_source_get_name(m_source), obs_source_get_name(target)); @@ -877,7 +884,7 @@ void filter::blur::factory::get_defaults(obs_data_t* data) obs_data_set_default_string(data, P_MASK_IMAGE, default_file); bfree(default_file); obs_data_set_default_string(data, P_MASK_SOURCE, ""); - obs_data_set_default_int(data, P_MASK_COLOR, 0xFFFFFFFF); + obs_data_set_default_int(data, P_MASK_COLOR, 0xFFFFFFFFull); obs_data_set_default_double(data, P_MASK_MULTIPLIER, 1.0); // advanced diff --git a/source/filter-blur.h b/source/filter-blur.h index f06e037b..98af9e90 100644 --- a/source/filter-blur.h +++ b/source/filter-blur.h @@ -80,8 +80,13 @@ namespace filter { std::shared_ptr source_texture; std::shared_ptr texture; } source; - uint32_t color; - float_t multiplier; + struct { + float_t r; + float_t g; + float_t b; + float_t a; + } color; + float_t multiplier; } mask; // advanced @@ -91,13 +96,14 @@ namespace filter { bool apply_shared_param(gs_texture_t* input, float texelX, float texelY); bool apply_bilateral_param(); bool apply_gaussian_param(); - bool apply_mask_parameters(std::shared_ptr effect, gs_texture_t * original_texture, gs_texture_t* blurred_texture); + bool apply_mask_parameters(std::shared_ptr effect, gs_texture_t* original_texture, + gs_texture_t* blurred_texture); static bool modified_properties(void* ptr, obs_properties_t* props, obs_property* prop, obs_data_t* settings); public: - instance(obs_data_t* settings, obs_source_t* parent); + instance(obs_data_t* settings, obs_source_t* self); ~instance(); obs_properties_t* get_properties(); @@ -133,7 +139,7 @@ namespace filter { void generate_kernel_textures(); protected: - static void* create(obs_data_t* settings, obs_source_t* parent); + static void* create(obs_data_t* settings, obs_source_t* self); static void destroy(void* source); static void get_defaults(obs_data_t* settings);