76 lines
2.3 KiB
Lua
76 lines
2.3 KiB
Lua
--- @class Render
|
|
--- @field shadowLayer love.Canvas
|
|
--- @field spriteLayer love.Canvas
|
|
--- @field floorLayer love.Canvas
|
|
--- @field overlayLayer love.Canvas
|
|
local render = {}
|
|
render.__index = render
|
|
|
|
function render:clear()
|
|
love.graphics.setCanvas(self.shadowLayer)
|
|
love.graphics.clear()
|
|
love.graphics.setCanvas(self.spriteLayer)
|
|
love.graphics.clear()
|
|
love.graphics.setCanvas(self.floorLayer)
|
|
love.graphics.clear()
|
|
love.graphics.setCanvas(self.overlayLayer)
|
|
love.graphics.clear()
|
|
end
|
|
|
|
local function applyBlur(input, radius)
|
|
local blurShader = Tree.assets.files.shaders.blur
|
|
local tmp1 = love.graphics.newCanvas(1280, 720)
|
|
local tmp2 = love.graphics.newCanvas(1280, 720)
|
|
|
|
-- Горизонтальный проход
|
|
blurShader:send("direction", { 1.0, 0.0 })
|
|
blurShader:send("radius", radius)
|
|
|
|
tmp1:renderTo(function()
|
|
love.graphics.setShader(blurShader)
|
|
love.graphics.draw(input)
|
|
love.graphics.setShader()
|
|
end)
|
|
|
|
-- Вертикальный проход
|
|
tmp2:renderTo(
|
|
function()
|
|
love.graphics.setShader(blurShader)
|
|
blurShader:send("direction", { 0.0, 1.0 })
|
|
love.graphics.draw(tmp1)
|
|
love.graphics.setShader()
|
|
end
|
|
)
|
|
return tmp2
|
|
end
|
|
|
|
function render:draw()
|
|
-- пол -> тени -> спрайты -> оверлей
|
|
love.graphics.draw(self.floorLayer)
|
|
love.graphics.push()
|
|
|
|
local blurred = applyBlur(self.shadowLayer, 2)
|
|
local wc, hc = love.graphics.getWidth() / 2, love.graphics.getHeight() / 2
|
|
love.graphics.translate(wc, hc)
|
|
|
|
love.graphics.scale(Tree.level.camera.scale, Tree.level.camera.scale)
|
|
love.graphics.translate(-Tree.level.camera.position.x * Tree.level.camera.pixelsPerMeter,
|
|
-Tree.level.camera.position.y * Tree.level.camera.pixelsPerMeter)
|
|
love.graphics.draw(blurred)
|
|
love.graphics.pop()
|
|
love.graphics.draw(self.spriteLayer)
|
|
|
|
love.graphics.draw(self.overlayLayer)
|
|
end
|
|
|
|
local function new()
|
|
return setmetatable({
|
|
shadowLayer = love.graphics.newCanvas(1280, 720),
|
|
spriteLayer = love.graphics.newCanvas(1280, 720),
|
|
floorLayer = love.graphics.newCanvas(1280, 720),
|
|
overlayLayer = love.graphics.newCanvas(1280, 720),
|
|
}, render)
|
|
end
|
|
|
|
return { new = new }
|