diff --git a/assets/shaders/blur.glsl b/assets/shaders/blur.glsl new file mode 100644 index 0000000..1ab89e1 --- /dev/null +++ b/assets/shaders/blur.glsl @@ -0,0 +1,18 @@ +extern vec2 direction; // (1.0, 0.0) для X, (0.0, 1.0) для Y +extern number radius; // радиус размытия + +vec4 effect(vec4 vcolor, Image tex, vec2 texture_coords, vec2 screen_coords) +{ + vec4 sum = vec4(0.0); + float weightTotal = 0.0; + + for (int i = -10; i <= 10; i++) { + float offset = float(i); + float weight = exp(-offset * offset / (2.0 * radius * radius)); + vec2 shift = direction * offset / love_ScreenSize.xy; + sum += Texel(tex, texture_coords + shift) * weight; + weightTotal += weight; + } + + return sum / weightTotal; +} diff --git a/lib/character/behaviors/sprite.lua b/lib/character/behaviors/sprite.lua index 61d409b..5e4c0bf 100644 --- a/lib/character/behaviors/sprite.lua +++ b/lib/character/behaviors/sprite.lua @@ -72,7 +72,7 @@ function sprite:draw() local mesh = makeGradientMesh(0.4, 1.5, { 0, 0, 0, 0.5 }, { 0, 0, 0, 0 }) love.graphics.push() love.graphics.translate(position.x, position.y) - love.graphics.rotate(-3 * math.pi / 4) + love.graphics.rotate(love.timer.getTime()) love.graphics.translate(-0.2, 0) love.graphics.draw(mesh) love.graphics.pop() diff --git a/lib/level/render.lua b/lib/level/render.lua index 78d8299..826a36f 100644 --- a/lib/level/render.lua +++ b/lib/level/render.lua @@ -8,7 +8,7 @@ render.__index = render function render:clear() love.graphics.setCanvas(self.shadowLayer) - love.graphics.clear(1, 1, 1, 0) + love.graphics.clear() love.graphics.setCanvas(self.spriteLayer) love.graphics.clear() love.graphics.setCanvas(self.floorLayer) @@ -17,13 +17,37 @@ function render:clear() love.graphics.clear() end +local function applyBlur(input, radius) + local blurShader = Tree.assets.files.shaders.blur + local tmp = love.graphics.newCanvas(1280, 720) + + -- Горизонтальный проход + blurShader:send("direction", { 1.0, 0.0 }) + blurShader:send("radius", radius) + + tmp:renderTo(function() + love.graphics.setShader(blurShader) + love.graphics.draw(input) + love.graphics.setShader() + end) + + -- Вертикальный проход + love.graphics.setShader(blurShader) + blurShader:send("direction", { 0.0, 1.0 }) + love.graphics.draw(tmp) + love.graphics.setShader() +end + function render:draw() -- пол -> тени -> спрайты -> оверлей love.graphics.draw(self.floorLayer) - love.graphics.setBlendMode("multiply", "premultiplied") - love.graphics.draw(self.shadowLayer) - love.graphics.setBlendMode("alpha") + + applyBlur(self.shadowLayer, 10) + -- love.graphics.draw(self.shadowLayer) + love.graphics.setShader() + love.graphics.draw(self.spriteLayer) + love.graphics.draw(self.overlayLayer) end