From 3d0d52438f36e9c49c5647f1abbf5f65915f603f Mon Sep 17 00:00:00 2001 From: PeaAshMeter Date: Sun, 7 Dec 2025 20:27:48 +0300 Subject: [PATCH] add a shader for a cool pixel reveal effect --- assets/shaders/reveal.glsl | 24 ++++++++++++++++++++++++ lib/simple_ui/level/layout.lua | 22 ++++++++++++++-------- lib/simple_ui/level/skill_row.lua | 2 -- 3 files changed, 38 insertions(+), 10 deletions(-) create mode 100644 assets/shaders/reveal.glsl diff --git a/assets/shaders/reveal.glsl b/assets/shaders/reveal.glsl new file mode 100644 index 0000000..2af557e --- /dev/null +++ b/assets/shaders/reveal.glsl @@ -0,0 +1,24 @@ +extern float t; +extern float blockSize; + +// hash-функция для шума по целочисленным координатам блока +float hash(vec2 p) { + p = vec2( + dot(p, vec2(127.1, 311.7)), + dot(p, vec2(269.5, 183.3)) + ); + return fract(sin(p.x + p.y) * 43758.5453123); +} + +vec4 effect(vec4 color, Image tex, vec2 texCoord, vec2 screenCoord) +{ + float blockSize = 4.0; + + vec2 cell = floor(screenCoord / blockSize); + float n = hash(cell); // [0..1] + float mask = 1.0 - step(t, n); + + vec4 base = Texel(tex, texCoord) * color; + base.a *= mask; + return base; +} diff --git a/lib/simple_ui/level/layout.lua b/lib/simple_ui/level/layout.lua index 2f2fe8a..0ace175 100644 --- a/lib/simple_ui/level/layout.lua +++ b/lib/simple_ui/level/layout.lua @@ -209,6 +209,16 @@ function characterPanel:update(dt) width = self.bars.bounds.width, height = self.bars.bounds.height + self.skillRow.bounds.height } + + --- анимация появления + local alpha = 1 + if self.state == "show" then + alpha = self.animationNode:getValue() + elseif self.state == "hide" then + alpha = 1 - self.animationNode:getValue() + end + local revealShader = Tree.assets.files.shaders.reveal + revealShader:send("t", alpha) end function characterPanel:draw() @@ -219,17 +229,13 @@ function characterPanel:draw() self:drawBorder("outer") - local alpha = 1 - if self.state == "show" then - alpha = self.animationNode:getValue() - elseif self.state == "hide" then - alpha = 1 - self.animationNode:getValue() - end - + --- рисуем текстуру шейдером появления love.graphics.setCanvas() - love.graphics.setColor(1, 1, 1, alpha) + love.graphics.setShader(Tree.assets.files.shaders.reveal) + love.graphics.setColor(1, 1, 1, 1) love.graphics.draw(c) love.graphics.setColor(1, 1, 1) + love.graphics.setShader() end ----------------------------------- diff --git a/lib/simple_ui/level/skill_row.lua b/lib/simple_ui/level/skill_row.lua index fc51b67..ebb01bd 100644 --- a/lib/simple_ui/level/skill_row.lua +++ b/lib/simple_ui/level/skill_row.lua @@ -1,6 +1,4 @@ local icons = require("lib.utils.sprite_atlas").load(Tree.assets.files.dev_icons) -local easing = require "lib.utils.easing" -local AnimationNode = require "lib.animation_node" local Element = require "lib.simple_ui.element" local Rect = require "lib.simple_ui.rect"