shader_type canvas_item; uniform sampler2D tex : repeat_enable; uniform float n_rows = 6.0; uniform float y_offset = 0.0; uniform float x_offset = 0.0; uniform float win_intensity : hint_range(0.0, 1.0) = 0.0; uniform vec4 win_glow_color : source_color = vec4(1.0, 0.62, 0.08, 1.0); void fragment() { vec2 uv = UV; uv.x += x_offset; uv.y /= n_rows; uv.y += y_offset; vec4 base = texture(tex, uv); if (win_intensity <= 0.001) { COLOR = base; } else { // Derive a compact halo from the existing symbol alpha so no replacement // sprite or second texture is needed. vec2 pixel = 1.0 / vec2(textureSize(tex, 0)); vec2 radius = pixel * 5.0; float nearby_alpha = 0.0; nearby_alpha = max(nearby_alpha, texture(tex, uv + vec2(radius.x, 0.0)).a); nearby_alpha = max(nearby_alpha, texture(tex, uv - vec2(radius.x, 0.0)).a); nearby_alpha = max(nearby_alpha, texture(tex, uv + vec2(0.0, radius.y)).a); nearby_alpha = max(nearby_alpha, texture(tex, uv - vec2(0.0, radius.y)).a); nearby_alpha = max(nearby_alpha, texture(tex, uv + radius).a); nearby_alpha = max(nearby_alpha, texture(tex, uv - radius).a); nearby_alpha = max(nearby_alpha, texture(tex, uv + vec2(radius.x, -radius.y)).a); nearby_alpha = max(nearby_alpha, texture(tex, uv + vec2(-radius.x, radius.y)).a); float halo = max(nearby_alpha - base.a, 0.0) * win_intensity; float flash = smoothstep(0.82, 1.0, win_intensity); vec3 rich_color = min(base.rgb * 1.18 + win_glow_color.rgb * 0.12, vec3(1.0)); vec3 symbol_color = mix(base.rgb, rich_color, win_intensity); symbol_color = mix(symbol_color, vec3(1.0), flash * 0.34 * base.a); vec3 final_rgb = symbol_color * base.a + win_glow_color.rgb * halo; COLOR = vec4(final_rgb, max(base.a, halo * 0.9)); } }