From f05626176636c49ba27c3ba2b69658f50c9b5730 Mon Sep 17 00:00:00 2001 From: Erik Reider <35975961+ErikReider@users.noreply.github.com> Date: Fri, 27 Sep 2024 04:55:55 +0200 Subject: Fixed shadows not respecting offset (#63) --- include/render/fx_renderer/shaders.h | 1 + render/fx_renderer/fx_pass.c | 1 + render/fx_renderer/gles2/shaders/box_shadow.frag | 6 +++++- render/fx_renderer/shaders.c | 1 + 4 files changed, 8 insertions(+), 1 deletion(-) diff --git a/include/render/fx_renderer/shaders.h b/include/render/fx_renderer/shaders.h index 946f02c..6c19744 100644 --- a/include/render/fx_renderer/shaders.h +++ b/include/render/fx_renderer/shaders.h @@ -91,6 +91,7 @@ struct box_shadow_shader { GLint pos_attrib; GLint position; GLint size; + GLint offset; GLint blur_sigma; GLint corner_radius; }; diff --git a/render/fx_renderer/fx_pass.c b/render/fx_renderer/fx_pass.c index f26f5e9..f0af02b 100644 --- a/render/fx_renderer/fx_pass.c +++ b/render/fx_renderer/fx_pass.c @@ -487,6 +487,7 @@ void fx_render_pass_add_box_shadow(struct fx_gles_render_pass *pass, glUniform1f(renderer->shaders.box_shadow.blur_sigma, shadow_data->blur_sigma); glUniform1f(renderer->shaders.box_shadow.corner_radius, options->corner_radius); glUniform2f(renderer->shaders.box_shadow.size, shadow_box.width, shadow_box.height); + glUniform2f(renderer->shaders.box_shadow.offset, options->shadow_data->offset_x, options->shadow_data->offset_y); glUniform2f(renderer->shaders.box_shadow.position, shadow_box.x, shadow_box.y); // TODO: also account for options->clip diff --git a/render/fx_renderer/gles2/shaders/box_shadow.frag b/render/fx_renderer/gles2/shaders/box_shadow.frag index e98cf92..d318c93 100644 --- a/render/fx_renderer/gles2/shaders/box_shadow.frag +++ b/render/fx_renderer/gles2/shaders/box_shadow.frag @@ -11,6 +11,7 @@ varying vec2 v_texcoord; uniform vec2 position; uniform vec2 size; +uniform vec2 offset; uniform float blur_sigma; uniform float corner_radius; @@ -80,7 +81,10 @@ void main() { shadow_alpha += (random() - 0.5) / 128.0; // get the window alpha so we can render around the window - float window_alpha = 1.0 - smoothstep(-1.0, 1.0, roundRectSDF((size * 0.5) - blur_sigma, position + blur_sigma, corner_radius)); + float window_alpha = 1.0 - smoothstep(-1.0, 1.0, + roundRectSDF((size * 0.5) - blur_sigma, + vec2(position.x + blur_sigma - offset.x, position.y + blur_sigma - offset.y), + corner_radius)); gl_FragColor = vec4(v_color.rgb, shadow_alpha) * (1.0 - window_alpha); } diff --git a/render/fx_renderer/shaders.c b/render/fx_renderer/shaders.c index 064136d..2c2aa7e 100644 --- a/render/fx_renderer/shaders.c +++ b/render/fx_renderer/shaders.c @@ -196,6 +196,7 @@ bool link_box_shadow_program(struct box_shadow_shader *shader) { shader->pos_attrib = glGetAttribLocation(prog, "pos"); shader->position = glGetUniformLocation(prog, "position"); shader->size = glGetUniformLocation(prog, "size"); + shader->offset = glGetUniformLocation(prog, "offset"); shader->blur_sigma = glGetUniformLocation(prog, "blur_sigma"); shader->corner_radius = glGetUniformLocation(prog, "corner_radius"); -- cgit v1.2.3