diff --git a/assets/masks/rrect32.png b/assets/masks/rrect32.png new file mode 100644 index 0000000..dff5102 Binary files /dev/null and b/assets/masks/rrect32.png differ diff --git a/assets/masks/squircle.png b/assets/masks/squircle.png new file mode 100644 index 0000000..8bd5a6d Binary files /dev/null and b/assets/masks/squircle.png differ diff --git a/assets/shaders/alpha_mask.glsl b/assets/shaders/alpha_mask.glsl new file mode 100644 index 0000000..5339bf7 --- /dev/null +++ b/assets/shaders/alpha_mask.glsl @@ -0,0 +1,8 @@ +vec4 effect(vec4 color, Image tex, vec2 texCoord, vec2 screenCoord) +{ + vec4 px = Texel(tex, texCoord); + if (px.a == 0.0) { + discard; + } + return vec4(1.0); +} diff --git a/assets/shaders/soft_uniform_noise.glsl b/assets/shaders/soft_uniform_noise.glsl index 6cdba61..e843952 100644 --- a/assets/shaders/soft_uniform_noise.glsl +++ b/assets/shaders/soft_uniform_noise.glsl @@ -8,10 +8,10 @@ vec2 hash(vec2 p) { vec4 effect(vec4 color, Image tex, vec2 uv, vec2 px) { - vec2 cell = floor(px / 2.0); + vec2 cell = floor(px / 2.0); // тут можно размер зерна менять float n = hash(cell).x; // 0..1 - float v = 0.9 + n * 0.2; // 0.9..1.0 + float v = 0.9 + n * 0.1; // 0.9..1.0 return vec4(v, v, v, 1.0); } diff --git a/lib/simple_ui/level/skill_row.lua b/lib/simple_ui/level/skill_row.lua index aa0e92a..049e1a5 100644 --- a/lib/simple_ui/level/skill_row.lua +++ b/lib/simple_ui/level/skill_row.lua @@ -160,8 +160,29 @@ end local c = love.graphics.newCanvas(1280, 720) --- @TODO: выставлять канвасу правильный размер в зависимости от окна function skillRow:draw() - love.graphics.setCanvas(c) + love.graphics.setCanvas({ c, stencil = true }) love.graphics.clear() + love.graphics.setColor(1, 1, 1) + + -- сначала иконки скиллов + for _, skb in ipairs(self.children) do + skb:draw() + end + + -- маска для вырезов под иконки + love.graphics.setShader(Tree.assets.files.shaders.alpha_mask) + love.graphics.stencil(function() + local mask = Tree.assets.files.masks.rrect32 + local maskSize = mask:getWidth() + for _, skb in ipairs(self.children) do + love.graphics.draw(mask, skb.bounds.x, skb.bounds.y, 0, + skb.bounds.width / maskSize, skb.bounds.height / maskSize) + end + end, "replace", 1) + love.graphics.setShader() + + -- дальше рисуем панель, перекрывая иконки + love.graphics.setStencilTest("less", 1) -- шум love.graphics.setShader(Tree.assets.files.shaders.soft_uniform_noise) love.graphics.rectangle("fill", self.bounds.x, self.bounds.y, self.bounds.width, self.bounds.height) @@ -177,9 +198,6 @@ function skillRow:draw() self:drawBorder("outer") love.graphics.setColor(1, 1, 1) - for _, skb in ipairs(self.children) do - skb:draw() - end love.graphics.setCanvas()