2025-04-16 21:38:42 +08:00

47 lines
3.3 KiB
Lua

--[[ Generated with https://github.com/TypeScriptToLua/TypeScriptToLua ]]
local ____exports = {}
local ____storyteller = require("code.engine.storyteller")
local ST = ____storyteller.ST
function ____exports.default(options)
local canvas = love.graphics.newCanvas(ST.width * ST.scale, ST.height * ST.scale)
local shader = love.graphics.newShader("\n extern vec2 size;\n extern int xsamples;\n extern int ysamples;\n extern float threshold;\n extern float intensity;\n extern float limit;\n extern float bleed;\n extern float absorb;\n\n int xdiff = (xsamples - 1) / 2;\n int ydiff = (ysamples - 1) / 2;\n float mdiff = max(xdiff, ydiff);\n float square = xsamples * ysamples;\n\n vec4 effect (vec4 color, Image tex, vec2 tc, vec2 sc) {\n vec4 src = Texel(tex, tc);\n float src_max = max(max(src.r, src.g), src.b);\n float src_min = min(min(src.r, src.g), src.b);\n float src_avg = ((src_min + src_max) / 2.0) * (1.0 - bleed);\n float src_glw = 1.0 - pow(1.0 - src_avg, 4.0) * absorb;\n vec4 sum = vec4(0.0);\n for (int x = -xdiff; x <= xdiff; x++) {\n for (int y = -ydiff; y <= ydiff; y++) {\n if (abs(x) + abs(y) <= mdiff) {\n vec4 add = Texel(tex, tc + vec2(x, y) * size);\n float add_max = max(max(add.r, add.g), add.b);\n float add_min = min(min(add.r, add.g), add.b);\n float add_avg = (add_min + add_max) / 2.0;\n if (threshold <= add_avg && add_avg <= limit && add_avg > src_avg) {\n sum += add * (add_avg - src_avg) * src_glw;\n }\n }\n }\n }\n vec4 res = (src + (sum / square) * intensity) * color;\n return vec4(max(res.r, src.r), max(res.g, src.g), max(res.b, src.b), max(res.a, src.a));\n }\n ")
return {
drawer = function(self)
if not options.enabled() then
return
end
local cv = {love.graphics.getCanvas()}
love.graphics.setCanvas(canvas)
love.graphics.clear(0, 0, 0, 0)
return function()
love.graphics.push()
love.graphics.replaceTransform(love.math.newTransform(
0,
0,
0,
1,
1
))
love.graphics.setCanvas(cv)
shader:send("size", {2 / (ST.width * ST.scale), 2 / (ST.height * ST.scale)})
shader:send("xsamples", options.xsamples)
shader:send("ysamples", options.ysamples)
shader:send("threshold", options.threshold)
shader:send("intensity", options.intensity)
shader:send("limit", options.limit)
shader:send("bleed", options.bleed)
shader:send("absorb", options.absorb)
love.graphics.setShader(shader)
love.graphics.draw(canvas)
love.graphics.setShader()
love.graphics.pop()
end
end,
release = function(self)
canvas:release()
shader:release()
end
}
end
return ____exports