From 1886b909d466aa2f7354307b2633350cf82b9ed5 Mon Sep 17 00:00:00 2001 From: Ryan Ward Date: Sun, 17 May 2026 22:50:49 -0700 Subject: [PATCH] working on shaders --- gui/init.lua | 16 +++ gui/shaders/shaders.lua | 274 ++++++++++++++++++++++++++++++++++++++++ main.lua | 20 ++- rainbow.jpg | Bin 0 -> 29267 bytes 4 files changed, 309 insertions(+), 1 deletion(-) create mode 100644 gui/shaders/shaders.lua create mode 100644 rainbow.jpg diff --git a/gui/init.lua b/gui/init.lua index 81ac2f8..092aa8a 100644 --- a/gui/init.lua +++ b/gui/init.lua @@ -937,6 +937,22 @@ function gui:newBase(typ, x, y, w, h, sx, sy, sw, sh, virtual) function c:setShader(shader) if type(shader) == "string" then self.shader = love.graphics.newShader(shader) + elseif type(shader) == "table" then + self.shader = shader.source + for i,v in pairs(shader or {}) do + if i ~= "source" and i ~= "usage" then + if self[i] then + if type(v) == "function" then + local data = v(self) + self.shader:send(i, data) + else + self.shader:send(i, self[i]) + end + else + error(i .. " is a required argument!\n\n".. shader.usage()) + end + end + end else self.shader = shader -- already a compiled love Shader object end diff --git a/gui/shaders/shaders.lua b/gui/shaders/shaders.lua new file mode 100644 index 0000000..f9e8048 --- /dev/null +++ b/gui/shaders/shaders.lua @@ -0,0 +1,274 @@ +local shaders = {} +function NewShader(name, shader, opt_args) + local uniforms = {} + local opt_args = opt_args or {} + for typ, uname in shader:gmatch("extern%s+(%w+)%s+(%w+)%s*;") do + if uname ~= "time" and uname ~= "size" then + table.insert(uniforms, "Argument \"" .. uname .. "\" is expected to be: \"" .. typ .. "\"") + opt_args[uname] = true + end + end + if #opt_args > 0 or #uniforms > 0 then + opt_args.source = love.graphics.newShader(shader) + shaders[name] = opt_args + if opt_args.usage == nil then + opt_args.usage = function() return table.concat(uniforms,"\n").."\n" end + end + else + shaders[name] = love.graphics.newShader(shader) + end +end + +function GetShaderUniforms(name) + local source = shaders[name] -- we need the source not the compiled shader + local uniforms = {} + for type, uname in source:gmatch("extern%s+(%w+)%s+(%w+)%s*;") do + uniforms[uname] = type + end + return uniforms +end + +-- ───────────────────────────────────────────── +-- GLOW (original – kept for reference) +-- Uniforms: vec2 size, float time +-- ───────────────────────────────────────────── +NewShader("glow", [[ + extern float time; + vec4 effect(vec4 color, Image tex, vec2 tc, vec2 sc) { + vec4 pixel = Texel(tex, tc); + float pulse = 0.15 * sin(time * 3.0) + 0.85; + return vec4(pixel.rgb * pulse, pixel.a) * color; + } +]]) + +-- ───────────────────────────────────────────── +-- GRAYSCALE +-- Converts the sprite to grayscale (good for disabled/inactive state). +-- Uniforms: float grayScale (0.0 = full color, 1.0 = full gray) +-- ───────────────────────────────────────────── +NewShader("grayscale", [[ + extern float amount; + vec4 effect(vec4 col, Image tex, vec2 tc, vec2 sc) { + vec4 pixel = Texel(tex, tc) * col; + float gray = dot(pixel.rgb, vec3(0.299, 0.587, 0.114)); + float a = clamp(amount, 0.0, 1.0); + vec3 mixed = pixel.rgb * (1.0 - a) + vec3(gray) * a; + return vec4(mixed, pixel.a); + } +]]) + + +-- ───────────────────────────────────────────── +-- CHROMATIC ABERRATION +-- Uniforms: float amount (try 0.003 – 0.012) +-- ───────────────────────────────────────────── +NewShader("chromatic_aberration", [[ + extern float amount; + vec4 effect(vec4 color, Image tex, vec2 tc, vec2 sc) { + vec4 r = Texel(tex, tc + vec2(amount, 0.0)); + vec4 g = Texel(tex, tc); + vec4 b = Texel(tex, tc + vec2(-amount, 0.0)); + vec4 pixel = vec4(r.r, g.g, b.b, g.a) * color; + return pixel; + } +]]) + +-- ───────────────────────────────────────────── +-- GAUSSIAN BLUR (single-pass, 9-tap) +-- Run twice with {1,0} then {0,1} for full 2D blur. +-- Uniforms: vec2 direction ({1,0} or {0,1}), vec2 size +-- ───────────────────────────────────────────── +NewShader("blur", [[ + extern vec2 direction; + extern vec2 size; + vec4 effect(vec4 color, Image tex, vec2 tc, vec2 sc) { + vec2 px = direction / size; + vec4 result = vec4(0.0); + result += Texel(tex, tc - px * 4.0) * 0.0162; + result += Texel(tex, tc - px * 3.0) * 0.0540; + result += Texel(tex, tc - px * 2.0) * 0.1216; + result += Texel(tex, tc - px * 1.0) * 0.1945; + result += Texel(tex, tc ) * 0.2270; + result += Texel(tex, tc + px * 1.0) * 0.1945; + result += Texel(tex, tc + px * 2.0) * 0.1216; + result += Texel(tex, tc + px * 3.0) * 0.0540; + result += Texel(tex, tc + px * 4.0) * 0.0162; + return result * color; + } +]]) + +-- ───────────────────────────────────────────── +-- SCANLINES +-- Uniforms: float strength (0.0-1.0), float count (e.g. 200) +-- ───────────────────────────────────────────── +NewShader("scanlines", [[ + extern float strength; + extern float count; + vec4 effect(vec4 color, Image tex, vec2 tc, vec2 sc) { + vec4 pixel = Texel(tex, tc) * color; + float line = sin(tc.y * count * 3.14159) * 0.5 + 0.5; + float dim = 1.0 - strength * (1.0 - line); + return vec4(pixel.rgb * dim, pixel.a); + } +]]) + +-- ───────────────────────────────────────────── +-- PIXELATE +-- Uniforms: float pixels (grid cell size, e.g. 8.0), vec2 size +-- ───────────────────────────────────────────── +NewShader("pixelate", [[ + extern float pixels; + extern vec2 size; + vec4 effect(vec4 color, Image tex, vec2 tc, vec2 sc) { + vec2 grid = floor(tc * size / pixels) * pixels / size; + return Texel(tex, grid) * color; + } +]]) + +-- ───────────────────────────────────────────── +-- VIGNETTE +-- Uniforms: float intensity (0.0-1.0), float smoothness (0.0-1.0) +-- ───────────────────────────────────────────── +NewShader("vignette", [[ + extern float intensity; + extern float smoothness; + vec4 effect(vec4 color, Image tex, vec2 tc, vec2 sc) { + vec4 pixel = Texel(tex, tc) * color; + vec2 uv = tc - 0.5; + float dist = length(uv); + float vig = smoothstep(0.8, 0.8 - smoothness, dist * intensity); + return vec4(pixel.rgb * vig, pixel.a); + } +]]) + +-- ───────────────────────────────────────────── +-- HUE SHIFT +-- Uniforms: float hue (radians, 0 = no change) +-- ───────────────────────────────────────────── +NewShader("hue_shift", [[ + extern float hue; + vec3 rgb2hsv(vec3 c) { + vec4 K = vec4(0.0, -1.0/3.0, 2.0/3.0, -1.0); + vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g)); + vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r)); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + } + vec3 hsv2rgb(vec3 c) { + vec4 K = vec4(1.0, 2.0/3.0, 1.0/3.0, 3.0); + vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); + } + vec4 effect(vec4 color, Image tex, vec2 tc, vec2 sc) { + vec4 pixel = Texel(tex, tc) * color; + vec3 hsv = rgb2hsv(pixel.rgb); + hsv.x = fract(hsv.x + hue / 6.28318); + return vec4(hsv2rgb(hsv), pixel.a); + } +]]) + +--[[ + NEEDS TESTING :P +]] + +-- ───────────────────────────────────────────── +-- DISSOLVE +-- Uniforms: float threshold (0.0=visible, 1.0=gone) +-- float edge_width (e.g. 0.05) +-- vec4 edge_color +-- ───────────────────────────────────────────── +NewShader("dissolve", [[ + extern float threshold; + extern float edge_width; + extern vec4 edge_color; + float hash(vec2 p) { + return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453); + } + float noise(vec2 p) { + vec2 i = floor(p); + vec2 f = fract(p); + vec2 u = f * f * (3.0 - 2.0 * f); + return mix(mix(hash(i), hash(i + vec2(1,0)), u.x), + mix(hash(i + vec2(0,1)), hash(i + vec2(1,1)), u.x), u.y); + } + vec4 effect(vec4 color, Image tex, vec2 tc, vec2 sc) { + vec4 pixel = Texel(tex, tc) * color; + float n = noise(tc * 8.0); + if (n < threshold) discard; + if (n < threshold + edge_width) return edge_color; + return pixel; + } +]]) + +-- ───────────────────────────────────────────── +-- WAVE +-- Uniforms: float time, float amplitude (e.g. 0.01), float frequency (e.g. 10.0) +-- ───────────────────────────────────────────── +NewShader("wave", [[ + extern float time; + extern float amplitude; + extern float frequency; + vec4 effect(vec4 color, Image tex, vec2 tc, vec2 sc) { + vec2 uv = tc; + uv.x += sin(uv.y * frequency + time * 3.0) * amplitude; + uv.y += sin(uv.x * frequency + time * 2.5) * amplitude * 0.6; + return Texel(tex, uv) * color; + } +]]) + + +-- ───────────────────────────────────────────── +-- RAINBOW / IRIDESCENCE +-- Uniforms: float time, float speed (e.g. 1.0), float spread (e.g. 2.0) +-- ───────────────────────────────────────────── +NewShader("rainbow", [[ + extern float time; + extern float speed; + extern float spread; + vec3 hsv2rgb(vec3 c) { + vec4 K = vec4(1.0, 2.0/3.0, 1.0/3.0, 3.0); + vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); + } + vec4 effect(vec4 color, Image tex, vec2 tc, vec2 sc) { + vec4 pixel = Texel(tex, tc) * color; + float h = fract(tc.x * spread + time * speed * 0.1); + vec3 rainbow = hsv2rgb(vec3(h, 0.8, 1.0)); + return vec4(pixel.rgb * rainbow, pixel.a); + } +]]) + + +-- ───────────────────────────────────────────── +-- FLASH / HIT-FLASH +-- Uniforms: float flash (0.0=normal, 1.0=full flash) +-- vec4 flash_color (e.g. {1,1,1,1}) +-- ───────────────────────────────────────────── +NewShader("flash", [[ + extern float flash; + extern vec4 flash_color; + vec4 effect(vec4 color, Image tex, vec2 tc, vec2 sc) { + vec4 pixel = Texel(tex, tc) * color; + vec3 mixed = pixel.rgb * (1.0 - flash) + flash_color.rgb * flash; + return vec4(mixed, pixel.a); + } +]]) + + +-- ───────────────────────────────────────────── +-- INVERT +-- Uniforms: float amount (0.0 = normal, 1.0 = fully inverted) +-- ───────────────────────────────────────────── +NewShader("invert", [[ + extern float amount; + vec4 effect(vec4 color, Image tex, vec2 tc, vec2 sc) { + vec4 pixel = Texel(tex, tc) * color; + vec3 inverted = 1.0 - pixel.rgb; + vec3 mixed = pixel.rgb * (1.0 - amount) + inverted * amount; + return vec4(mixed, pixel.a); + } +]]) + +-- Auto hooks new shaders to SHADERS namespace, also adds the NewShader function +return {init = function(gui) gui.SHADERS=shaders gui.NewShader = NewShader end} \ No newline at end of file diff --git a/main.lua b/main.lua index efc2508..78be67b 100644 --- a/main.lua +++ b/main.lua @@ -38,6 +38,24 @@ function love.load() bg:fullFrame() bg.color = color.new("#242f9b") + local btn = bg:newImageButton("rainbow.jpg", 100, 100, 600, 450) + btn.color = color.light_blue + btn.align = gui.ALIGN_CENTER + + btn.direction = {1,0} + + btn:enableShaderTime() + btn.OnEnter(function() + btn:setShader(gui.SHADERS.blur) + end) + + btn.OnExit(function() + btn:setShader() + end) + + -- btn:fitFont() + -- btn:centerFont() + -- bg:setBlur(10) bg:OnUpdate(function(self, dt) if self.__blur then @@ -47,7 +65,7 @@ function love.load() end end) - StartGame(bg) + -- StartGame(bg) end function GetActivePlayer() diff --git a/rainbow.jpg b/rainbow.jpg new file mode 100644 index 0000000000000000000000000000000000000000..75d46688332b28e27ff9a89c335b8a1095c32f63 GIT binary patch literal 29267 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 literal 0 HcmV?d00001