diff --git a/CMakeLists.txt b/CMakeLists.txt index 5d0c51a..ba5985f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,7 +6,7 @@ else() cmake_minimum_required(VERSION 3.18) endif() -project(obs-retro-effects VERSION 1.0.1) +project(obs-retro-effects VERSION 1.0.2) set(PROJECT_FULL_NAME "Retro Effects") # Set new UUIDs when you start to create a new plugin. diff --git a/buildspec.json b/buildspec.json index 10f367a..36a0071 100644 --- a/buildspec.json +++ b/buildspec.json @@ -79,5 +79,5 @@ } }, "name": "obs-retro-effects", - "version": "1.0.1" + "version": "1.0.2" } \ No newline at end of file diff --git a/data/shaders/crt-composite.effect b/data/shaders/crt-composite.effect index 36c20de..9bec031 100644 --- a/data/shaders/crt-composite.effect +++ b/data/shaders/crt-composite.effect @@ -1,12 +1,10 @@ uniform float4x4 ViewProj; uniform texture2d image; -uniform texture2d blur_image; -uniform float brightness; uniform float black_level; uniform float white_level; uniform float dist; -#define EPS 1.e-8 +#define EPS 1.e-3 sampler_state textureSampler{ Filter = Linear; @@ -44,13 +42,6 @@ float4 mainImage(VertData v_in) : TARGET float aa_mask = d < 0.49 ? smoothstep(-0.7, 0.7, (abs(frac(d - 0.25) - 0.5) - 0.25) / w) : 1.0; float4 color = image.Sample(textureSampler, uv); - float4 blur_color = blur_image.Sample(textureSampler, uv); - // Brightness correction on bloom/blur layer - //blur_color.rgb *= brightness; - float threshold = brightness; - float4 highlight = saturate(blur_color - threshold) * 1.0 / (1.0 - threshold); - // Screen Blending between main color layer and bloom/blur layer - color.rgb = 1.0 - (1.0 - color.rgb) * (1.0 - highlight.rgb); // Apply black/white levels correction color.rgb = saturate((color.rgb - black_level) / (white_level - black_level)); // Apply barrel disortion anti-alias mask to alpha channel diff --git a/src/filters/bloom-f.c b/src/filters/bloom-f.c index 4962bb0..64d4303 100644 --- a/src/filters/bloom-f.c +++ b/src/filters/bloom-f.c @@ -115,7 +115,7 @@ void bloom_f_filter_properties(retro_effects_filter_data_t *data, p = obs_properties_add_float_slider( props, "bloom_size", obs_module_text("RetroEffects.Bloom.Size"), 0.0, 100.0, - 0.01); + 1.0); obs_property_float_set_suffix(p, "px"); p = obs_properties_add_float_slider( diff --git a/src/filters/crt.c b/src/filters/crt.c index 69995df..92b88e7 100644 --- a/src/filters/crt.c +++ b/src/filters/crt.c @@ -1,6 +1,7 @@ #include "crt.h" #include "../obs-utils.h" #include "../blur/blur.h" +#include "../blur/bloom.h" void crt_create(retro_effects_filter_data_t *filter) { @@ -69,13 +70,12 @@ void crt_filter_update(retro_effects_filter_data_t *data, obs_data_t *settings) (float)obs_data_get_double(settings, "crt_phosphor_width")/9.0f; filter->phosphor_size.y = (float)obs_data_get_double(settings, "crt_phosphor_height")/9.0f; - filter->brightness = - 0.3f * (1.0f - (float)obs_data_get_double(settings, "crt_bloom_threshold") / 100.0f); + filter->bloom_threshold = + (float)obs_data_get_double(settings, "crt_bloom_threshold") / 100.0f; - float bloom = (float)obs_data_get_double(settings, "crt_bloom") * - 30.0f / 100.0f; - data->blur_data->radius = bloom; - set_gaussian_radius(bloom, data->blur_data); + filter->bloom_size = (float)obs_data_get_double(settings, "crt_bloom"); + filter->bloom_intensity = + (float)obs_data_get_double(settings, "crt_bloom_intensity")/100.0f; filter->mask_intensity = (float)obs_data_get_double(settings, "crt_mask_intensity") / @@ -102,7 +102,7 @@ void crt_filter_defaults(obs_data_t *settings) { obs_data_set_default_double(settings, "crt_mask_intensity", 70.0); obs_data_set_default_double(settings, "crt_bloom", 5.0); obs_data_set_default_double(settings, "crt_bloom_threshold", 75.0); - //obs_data_set_default_double(settings, "crt_bloom_intensity", 50.0); + obs_data_set_default_double(settings, "crt_bloom_intensity", 50.0); obs_data_set_default_double(settings, "crt_corner_radius", 25.0); obs_data_set_default_double(settings, "crt_barrel_distort", 1.7); obs_data_set_default_double(settings, "crt_vignette", 15.0); @@ -140,11 +140,11 @@ void crt_filter_properties(retro_effects_filter_data_t *data, 0.1); obs_property_float_set_suffix(p, "%"); - //p = obs_properties_add_float_slider( - // phosphor_bloom, "crt_bloom_intensity", - // obs_module_text("RetroEffects.CRT.BloomIntensity"), 0.0, 100.0, - // 0.1); - //obs_property_float_set_suffix(p, "%"); + p = obs_properties_add_float_slider( + phosphor_bloom, "crt_bloom_intensity", + obs_module_text("RetroEffects.CRT.BloomIntensity"), 0.0, 100.0, + 0.1); + obs_property_float_set_suffix(p, "%"); obs_properties_add_group( props, "crt_phosphor_bloom", @@ -199,10 +199,34 @@ void crt_filter_video_render(retro_effects_filter_data_t *data) return; } crt_filter_render_crt_mask(data); - crt_filter_render_blur(data); + //crt_filter_render_blur(data); + if (filter->bloom_intensity > 0.00001) + crt_filter_render_bloom(data); crt_filter_render_composite(data); } +static void crt_filter_render_bloom(retro_effects_filter_data_t* data) +{ + crt_filter_data_t *filter = data->active_filter_data; + + gs_texture_t *image = + gs_texrender_get_texture(filter->phospher_mask_texrender); + + data->bloom_data->brightness_threshold = filter->bloom_threshold; + data->bloom_data->bloom_intensity = filter->bloom_intensity; + data->bloom_data->bloom_size = filter->bloom_size; + data->bloom_data->levels.x = 0.299f; + data->bloom_data->levels.y = 0.587f; + data->bloom_data->levels.z = 0.114f; + + bloom_render(image, data->bloom_data); + + gs_texrender_t *tmp = filter->phospher_mask_texrender; + filter->phospher_mask_texrender = data->bloom_data->output; + data->bloom_data->output = tmp; +} + + static void crt_filter_render_crt_mask(retro_effects_filter_data_t* data) { base_filter_data_t *base = data->base; @@ -283,11 +307,10 @@ static void crt_filter_render_composite(retro_effects_filter_data_t* data) crt_filter_data_t *filter = data->active_filter_data; gs_texture_t *image = gs_texrender_get_texture(filter->phospher_mask_texrender); - gs_texture_t *blur_image = gs_texrender_get_texture(data->blur_data->blur_output); gs_effect_t *effect = filter->effect_crt_composite; - if (!effect || !image || !blur_image) { + if (!effect || !image) { return; } @@ -298,15 +321,6 @@ static void crt_filter_render_composite(retro_effects_filter_data_t* data) gs_effect_set_texture(filter->param_image_composite, image); } - if (filter->param_blur_image_composite) { - gs_effect_set_texture(filter->param_blur_image_composite, blur_image); - } - - if (filter->param_brightness_composite) { - gs_effect_set_float(filter->param_brightness_composite, - filter->brightness); - } - if (filter->param_black_level_composite) { gs_effect_set_float(filter->param_black_level_composite, filter->black_level); diff --git a/src/filters/crt.h b/src/filters/crt.h index cc04565..bf7cf1f 100644 --- a/src/filters/crt.h +++ b/src/filters/crt.h @@ -30,8 +30,9 @@ struct crt_filter_data { bool loading_effect; bool reload_effect; - float brightness; - float bloom; + float bloom_threshold; + float bloom_size; + float bloom_intensity; float mask_intensity; int phosphor_type; @@ -61,4 +62,5 @@ static void crt_composite_load_effect(crt_filter_data_t *filter); static void crt_filter_render_crt_mask(retro_effects_filter_data_t *data); static void crt_filter_render_blur(retro_effects_filter_data_t *data); +static void crt_filter_render_bloom(retro_effects_filter_data_t *data); static void crt_filter_render_composite(retro_effects_filter_data_t *data); diff --git a/src/version.h b/src/version.h index 75a9782..c639ae9 100644 --- a/src/version.h +++ b/src/version.h @@ -1,6 +1,6 @@ #pragma once -#define PROJECT_VERSION "1.0.1" +#define PROJECT_VERSION "1.0.2" #define PROJECT_VERSION_MAJOR 1 #define PROJECT_VERSION_MINOR 0 -#define PROJECT_VERSION_PATCH 1 +#define PROJECT_VERSION_PATCH 2