jeopardy/gui/shaders/blur.lua
2026-05-16 01:08:18 -07:00

70 lines
1.6 KiB
Lua

local blur_h = love.graphics.newShader([[
extern vec2 size;
extern float radius;
vec4 effect(vec4 color, Image tex, vec2 tc, vec2 sc) {
vec2 step = vec2(1.0 / size.x, 0.0);
vec4 result = vec4(0.0);
float total = 0.0;
float sigma = radius * 0.5;
float r = floor(radius);
float i = -r;
while (i <= r) {
float weight = exp(-0.5 * (i * i) / (sigma * sigma));
result += Texel(tex, tc + step * i) * weight;
total += weight;
i = i + 1.0;
}
return (result / total) * color;
}
]])
local blur_v = love.graphics.newShader([[
extern vec2 size;
extern float radius;
vec4 effect(vec4 color, Image tex, vec2 tc, vec2 sc) {
vec2 step = vec2(0.0, 1.0 / size.y);
vec4 result = vec4(0.0);
float total = 0.0;
float sigma = radius * 0.5;
float r = floor(radius);
float i = -r;
while (i <= r) {
float weight = exp(-0.5 * (i * i) / (sigma * sigma));
result += Texel(tex, tc + step * i) * weight;
total += weight;
i = i + 1.0;
}
return (result / total) * color;
}
]])
local c = {}
function c:setBlur(radius)
radius = radius or 8
c.__blur = {
radius = radius,
canvas1 = nil, -- populated on first draw
canvas2 = nil,
shader_h = blur_h,
shader_v = blur_v,
}
end
function c:clearBlur()
c.__blur = nil
end
function c:setBlurRadius(radius)
if c.__blur then
c.__blur.radius = radius
end
end
return {init = function(gui) gui.registerExtension(c) end}