From 615738d06a84ce8230838bced31713d8089adbbd Mon Sep 17 00:00:00 2001 From: PeaAshMeter Date: Mon, 8 Dec 2025 03:53:43 +0300 Subject: [PATCH] allow window resizing again --- lib/simple_ui/level/layout.lua | 43 +++++++++++---- lib/simple_ui/level/scale.lua | 2 +- lib/simple_ui/level/skill_row.lua | 90 +++++++++++++++++-------------- main.lua | 2 +- 4 files changed, 85 insertions(+), 52 deletions(-) diff --git a/lib/simple_ui/level/layout.lua b/lib/simple_ui/level/layout.lua index 0ace175..1ee1ae3 100644 --- a/lib/simple_ui/level/layout.lua +++ b/lib/simple_ui/level/layout.lua @@ -65,6 +65,8 @@ function barElement:draw() self.bounds.y, self.bounds.width, "center") end + self:drawBorder("inner") + self:drawGradientOverlay() end @@ -109,7 +111,7 @@ function bottomBars.new(cid) end function bottomBars:update(dt) - local height = 14 + local height = 16 local margin = 2 self.bounds.height = height @@ -117,16 +119,16 @@ function bottomBars:update(dt) self.hpBar.bounds = Rect { width = -2 * margin + self.bounds.width / 2, - height = height, + height = height - margin, x = self.bounds.x + margin, - y = self.bounds.y + y = self.bounds.y + margin } self.manaBar.bounds = Rect { width = -2 * margin + self.bounds.width / 2, - height = height, + height = height - margin, x = self.bounds.x + margin + self.bounds.width / 2, - y = self.bounds.y + y = self.bounds.y + margin } self.hpBar:update(dt) @@ -148,8 +150,6 @@ function bottomBars:draw() self.manaBar:draw() end -local c = love.graphics.newCanvas(1280, 720) --- @TODO: выставлять канвасу правильный размер в зависимости от окна - --- @class CharacterPanel : UIElement --- @field animationNode AnimationNode --- @field state "show" | "idle" | "hide" @@ -193,6 +193,9 @@ function characterPanel:hide() }:run() end +--- @type love.Canvas +local characterPanelCanvas; + function characterPanel:update(dt) if self.animationNode then self.animationNode:update(dt) end self.skillRow:update(dt) @@ -210,6 +213,10 @@ function characterPanel:update(dt) height = self.bars.bounds.height + self.skillRow.bounds.height } + if not characterPanelCanvas then + characterPanelCanvas = love.graphics.newCanvas(self.bounds.width, self.bounds.height) + end + --- анимация появления local alpha = 1 if self.state == "show" then @@ -222,19 +229,33 @@ function characterPanel:update(dt) end function characterPanel:draw() - love.graphics.setCanvas(c) - love.graphics.clear() self.skillRow:draw() - self.bars:draw() + --- @TODO: переписать этот ужас с жонглированием координатами, а то слишком хардкод (skillRow рисуется относительно нуля и не закрывает канвас) + love.graphics.push() + local canvas = love.graphics.getCanvas() + love.graphics.translate(0, self.bars.bounds.height) + love.graphics.setCanvas(characterPanelCanvas) + love.graphics.clear() + love.graphics.draw(canvas) + love.graphics.pop() + + love.graphics.push() + love.graphics.translate(-self.bounds.x, -self.bounds.y) + self.bars:draw() self:drawBorder("outer") + love.graphics.pop() --- рисуем текстуру шейдером появления love.graphics.setCanvas() love.graphics.setShader(Tree.assets.files.shaders.reveal) love.graphics.setColor(1, 1, 1, 1) - love.graphics.draw(c) + + love.graphics.push() + love.graphics.translate(self.bounds.x, self.bounds.y) + love.graphics.draw(characterPanelCanvas) love.graphics.setColor(1, 1, 1) + love.graphics.pop() love.graphics.setShader() end diff --git a/lib/simple_ui/level/scale.lua b/lib/simple_ui/level/scale.lua index c2b6807..fb4f658 100644 --- a/lib/simple_ui/level/scale.lua +++ b/lib/simple_ui/level/scale.lua @@ -1,2 +1,2 @@ -local UI_SCALE = 0.8 -- выдуманное значение для dependency injection +local UI_SCALE = 0.75 -- выдуманное значение для dependency injection, надо подбирать так, чтобы UI_SCALE * 64 было целым числом return UI_SCALE diff --git a/lib/simple_ui/level/skill_row.lua b/lib/simple_ui/level/skill_row.lua index ebb01bd..1f0f039 100644 --- a/lib/simple_ui/level/skill_row.lua +++ b/lib/simple_ui/level/skill_row.lua @@ -103,8 +103,11 @@ function skillRow.new(characterId) return t end +--- @type love.Canvas +local c; + function skillRow:update(dt) - local iconSize = 64 * UI_SCALE + local iconSize = math.floor(64 * UI_SCALE) local screenW, screenH = love.graphics.getDimensions() local padding, margin = 8, 4 local count = #self.children -- слоты под скиллы @@ -121,54 +124,63 @@ function skillRow:update(dt) y = self.bounds.y + margin, height = iconSize, width = iconSize } skb:update(dt) end + + if not c then + c = love.graphics.newCanvas(self.bounds.width, self.bounds.height) + end end -local c = love.graphics.newCanvas(1280, 720) --- @TODO: выставлять канвасу правильный размер в зависимости от окна - function skillRow:draw() - local oldCanvas = love.graphics.getCanvas() love.graphics.setCanvas({ c, stencil = true }) love.graphics.clear() love.graphics.setColor(1, 1, 1) - -- сначала иконки скиллов - for _, skb in ipairs(self.children) do - skb:draw() + do + --- рисуем в локальных координатах текстурки + love.graphics.push() + love.graphics.translate(-self.bounds.x, -self.bounds.y) + + -- сначала иконки скиллов + 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) + love.graphics.setShader() + + -- фон + love.graphics.setColor(38 / 255, 50 / 255, 56 / 255) + love.graphics.setBlendMode("multiply", "premultiplied") + love.graphics.rectangle("fill", self.bounds.x, self.bounds.y, self.bounds.width, self.bounds.height) + love.graphics.setBlendMode("alpha") + + love.graphics.setStencilTest() + + --затенение + self:drawGradientOverlay() + love.graphics.pop() 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) - love.graphics.setShader() - - -- фон - love.graphics.setColor(38 / 255, 50 / 255, 56 / 255) - love.graphics.setBlendMode("multiply", "premultiplied") - love.graphics.rectangle("fill", self.bounds.x, self.bounds.y, self.bounds.width, self.bounds.height) - love.graphics.setBlendMode("alpha") - - love.graphics.setStencilTest() - - --затенение - self:drawGradientOverlay() - love.graphics.setColor(1, 1, 1) - love.graphics.setCanvas(oldCanvas) - love.graphics.draw(c) + -- love.graphics.setCanvas(oldCanvas) + -- love.graphics.draw(c) end return skillRow.new diff --git a/main.lua b/main.lua index 3656037..ec2f83d 100644 --- a/main.lua +++ b/main.lua @@ -18,7 +18,7 @@ function love.load() end Tree.level.turnOrder:endRound() print("Now playing:", Tree.level.turnOrder.current) - love.window.setMode(1280, 720, { resizable = false, msaa = 0, vsync = true }) + love.window.setMode(1280, 720, { resizable = true, msaa = 4, vsync = true }) end local lt = "0"