Compare commits

...

2 Commits

9 changed files with 88 additions and 52 deletions

View File

@ -25,12 +25,12 @@ end
function behavior:draw()
Tree.level.camera:attach()
love.graphics.setCanvas(Tree.level.render.lightLayer)
love.graphics.setCanvas(Tree.level.render.textures.lightLayer)
local shader = Tree.assets.files.shaders.light
shader:send("color", { self.color.x, self.color.y, self.color.z })
shader:send("time", love.timer.getTime() + self.seed)
love.graphics.setShader(shader)
love.graphics.setBlendMode("add")
-- love.graphics.setBlendMode("add")
love.graphics.draw(Tree.assets.files.masks.circle128, self.position.x - self.intensity / 2,
self.position.y - self.intensity / 2, 0, self.intensity / 128,
self.intensity / 128)

View File

@ -22,7 +22,7 @@ function behavior:draw()
end
Tree.level.camera:attach()
love.graphics.setCanvas(Tree.level.render.shadowLayer)
love.graphics.setCanvas(Tree.level.render.textures.shadowLayer)
love.graphics.push()
love.graphics.setColor(0, 0, 0, 1)
love.graphics.translate(position.x, position.y)
@ -34,7 +34,7 @@ function behavior:draw()
return
end
love.graphics.setCanvas(Tree.level.render.spriteLightLayer)
love.graphics.setCanvas(Tree.level.render.textures.spriteLightLayer)
love.graphics.setBlendMode("add")
for _, light in ipairs(lights) do
local lightPos = light:has(Tree.behaviors.light).position

View File

@ -46,7 +46,7 @@ function sprite:draw()
local ppm = Tree.level.camera.pixelsPerMeter
local position = map.displayedPosition + Vec3 { 0.5, 0.5 }
love.graphics.setCanvas(Tree.level.render.spriteLayer)
love.graphics.setCanvas(Tree.level.render.textures.spriteLayer)
Tree.level.camera:attach()
love.graphics.setColor(1, 1, 1)

View File

@ -13,7 +13,7 @@ local function new(type, template, size)
end
function map:draw()
love.graphics.setCanvas(Tree.level.render.floorLayer)
love.graphics.setCanvas(Tree.level.render.textures.floorLayer)
Tree.level.camera:attach()
utils.each(self.__grid, function(el)
el:draw()

View File

@ -27,7 +27,8 @@ local function new(type, template)
selector = (require "lib.level.selector").new(),
camera = (require "lib.level.camera").new(),
turnOrder = (require "lib.level.turn_order").new(),
render = (require "lib.level.render").new()
render = (require "lib.level.render").new {},
weather = (require "lib.level.weather").new { ambientLight = Vec3 { 0.36, 0.42, 0.6 }, skyLight = Vec3 {} }
}, level)
end

View File

@ -1,39 +1,43 @@
--- @class Render
--- @field shadowLayer love.Canvas
--- @field spriteLayer love.Canvas
--- @field spriteLightLayer love.Canvas
--- @field floorLayer love.Canvas
--- @field lightLayer love.Canvas
--- @field overlayLayer love.Canvas
local render = {}
render.__index = render
--- @field textures table<string, love.Canvas>
local render = {
textures = {}
}
function render:clear()
love.graphics.setCanvas(self.shadowLayer)
local weather = Tree.level.weather
local txs = self.textures
love.graphics.setCanvas(txs.shadowLayer)
love.graphics.clear()
love.graphics.setCanvas(self.spriteLayer)
love.graphics.setCanvas(txs.spriteLayer)
love.graphics.clear()
love.graphics.setCanvas(self.spriteLightLayer)
love.graphics.setCanvas(txs.spriteLightLayer)
love.graphics.clear(weather.skyLight.x, weather.skyLight.y, weather.skyLight.z)
love.graphics.setCanvas(txs.floorLayer)
love.graphics.clear()
love.graphics.setCanvas(self.floorLayer)
love.graphics.clear()
love.graphics.setCanvas(self.lightLayer)
love.graphics.clear()
love.graphics.setCanvas(self.overlayLayer)
love.graphics.setCanvas(txs.lightLayer)
love.graphics.clear(weather.skyLight.x, weather.skyLight.y, weather.skyLight.z)
love.graphics.setCanvas(txs.overlayLayer)
love.graphics.clear()
end
function render:free()
for _, tx in pairs(self.textures) do
tx:release()
end
self.textures = nil
end
--- TODO: это используется для блюра, должно кэшироваться и поддерживать ресайз
local tmp1 = love.graphics.newCanvas(1280, 720)
local tmp2 = love.graphics.newCanvas(1280, 720)
local function applyBlur(input, radius)
function render:applyBlur(input, radius)
local blurShader = Tree.assets.files.shaders.blur
-- Горизонтальный проход
blurShader:send("direction", { 1.0, 0.0 })
blurShader:send("radius", radius)
tmp1:renderTo(function()
self.textures.tmp1:renderTo(function()
love.graphics.clear()
love.graphics.setShader(blurShader)
love.graphics.draw(input)
@ -41,52 +45,62 @@ local function applyBlur(input, radius)
end)
-- Вертикальный проход
tmp2:renderTo(
self.textures.tmp2:renderTo(
function()
love.graphics.clear()
love.graphics.setShader(blurShader)
blurShader:send("direction", { 0.0, 1.0 })
love.graphics.draw(tmp1)
love.graphics.draw(self.textures.tmp1)
love.graphics.setShader()
end
)
return tmp2
return self.textures.tmp2
end
function render:draw()
-- пол -> тени -> спрайты -> свет -> оверлей
love.graphics.setCanvas(self.lightLayer)
love.graphics.draw(applyBlur(self.shadowLayer, 4 * Tree.level.camera.scale))
local weather = Tree.level.weather
local txs = self.textures
love.graphics.setCanvas(txs.lightLayer)
love.graphics.draw(self:applyBlur(txs.shadowLayer, 4 * Tree.level.camera.scale))
love.graphics.setCanvas()
-- self.lightLayer:newImageData():encode("png", "lightLayer.png")
-- os.exit(0)
local lightShader = Tree.assets.files.shaders.light_postprocess
lightShader:send("scene", self.floorLayer)
lightShader:send("light", self.lightLayer)
lightShader:send("ambient", { 0.24, 0.28, 0.40 })
lightShader:send("scene", txs.floorLayer)
lightShader:send("light", self:applyBlur(txs.lightLayer, 2))
lightShader:send("ambient", { weather.ambientLight.x, weather.ambientLight.y, weather.ambientLight.z })
love.graphics.setShader(lightShader)
love.graphics.draw(self.floorLayer)
love.graphics.draw(txs.floorLayer)
lightShader:send("scene", self.spriteLayer)
lightShader:send("light", self.spriteLightLayer)
love.graphics.draw(self.spriteLayer)
lightShader:send("scene", txs.spriteLayer)
lightShader:send("light", txs.spriteLightLayer)
love.graphics.draw(txs.spriteLayer)
love.graphics.setShader()
love.graphics.draw(self.overlayLayer)
love.graphics.draw(txs.overlayLayer)
end
local function new()
---@param params {w: number?, h: number?}
---@return table|Render
local function new(params)
local w = params.w or love.graphics.getWidth()
local h = params.h or love.graphics.getHeight()
return setmetatable({
shadowLayer = love.graphics.newCanvas(1280, 720),
spriteLayer = love.graphics.newCanvas(1280, 720),
spriteLightLayer = love.graphics.newCanvas(1280, 720),
floorLayer = love.graphics.newCanvas(1280, 720),
overlayLayer = love.graphics.newCanvas(1280, 720),
lightLayer = love.graphics.newCanvas(1280, 720)
}, render)
textures = {
shadowLayer = love.graphics.newCanvas(w, h),
spriteLayer = love.graphics.newCanvas(w, h),
spriteLightLayer = love.graphics.newCanvas(w, h),
floorLayer = love.graphics.newCanvas(w, h),
overlayLayer = love.graphics.newCanvas(w, h),
lightLayer = love.graphics.newCanvas(w, h),
tmp1 = love.graphics.newCanvas(w, h),
tmp2 = love.graphics.newCanvas(w, h),
}
}, { __index = render })
end
return { new = new }

12
lib/level/weather.lua Normal file
View File

@ -0,0 +1,12 @@
--- @class Weather
--- @field skyLight Vec3
--- @field ambientLight Vec3
local weather = {}
--- @param proto Weather
--- @return Weather
local function new(proto)
return setmetatable(proto, { __index = weather })
end
return { new = new }

View File

@ -69,7 +69,7 @@ function walk:draw()
if not self.path then return end
--- Это отрисовка пути персонажа к мышке
Tree.level.camera:attach()
love.graphics.setCanvas(Tree.level.render.overlayLayer)
love.graphics.setCanvas(Tree.level.render.textures.overlayLayer)
love.graphics.setColor(0.6, 0.75, 0.5)
for p in self.path:values() do
love.graphics.circle("fill", p.x + 0.45, p.y + 0.45, 0.1)

View File

@ -1,14 +1,17 @@
-- CameraLoader = require 'lib/camera'
local character = require "lib/character/character"
require "lib/tree"
local testLayout = require "lib.simple_ui.level.layout"
local testLayout
function love.conf(t)
t.console = true
end
function love.load()
love.window.setMode(1280, 720, { resizable = true, msaa = 4, vsync = true })
require "lib/tree" -- важно это сделать после настройки окна
testLayout = require "lib.simple_ui.level.layout"
local chars = {
character.spawn("Foodor")
:addBehavior {
@ -64,7 +67,6 @@ function love.load()
Tree.level.turnOrder:endRound()
print("Now playing:", Tree.level.turnOrder.current)
love.window.setMode(1280, 720, { resizable = true, msaa = 4, vsync = true })
end
local lt = "0"
@ -116,3 +118,10 @@ function love.draw()
local t2 = love.timer.getTime()
dt = string.format("%.3f", (t2 - t1) * 1000)
end
function love.resize(w, h)
local render = Tree.level.render
if not render then return end
render:free()
Tree.level.render = (require "lib.level.render").new { w, h }
end