introduce basic offscreen render stack
This commit is contained in:
parent
284f2ac204
commit
b259aa3839
0
lib/character/behaviors/shadowcaster.lua
Normal file
0
lib/character/behaviors/shadowcaster.lua
Normal file
@ -38,13 +38,24 @@ function sprite:update(dt)
|
|||||||
anim:update(dt)
|
anim:update(dt)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function makeGradientMesh(w, h, topColor, bottomColor)
|
||||||
|
local vertices = {
|
||||||
|
{ 0, 0, 0, 0, topColor[1], topColor[2], topColor[3], topColor[4] }, -- левый верх
|
||||||
|
{ w, 0, 1, 0, topColor[1], topColor[2], topColor[3], topColor[4] }, -- правый верх
|
||||||
|
{ w + w * 0.1, h, 1, 1, bottomColor[1], bottomColor[2], bottomColor[3], bottomColor[4] }, -- правый низ
|
||||||
|
{ 0 - w * 0.1, h, 0, 1, bottomColor[1], bottomColor[2], bottomColor[3], bottomColor[4] }, -- левый низ
|
||||||
|
}
|
||||||
|
local mesh = love.graphics.newMesh(vertices, "fan", "static")
|
||||||
|
return mesh
|
||||||
|
end
|
||||||
|
|
||||||
function sprite:draw()
|
function sprite:draw()
|
||||||
if not self.animationTable[self.state] or not Tree.assets.files.sprites.character[self.state] then return end
|
if not self.animationTable[self.state] or not Tree.assets.files.sprites.character[self.state] then return end
|
||||||
|
|
||||||
self.owner:try(Tree.behaviors.map,
|
self.owner:try(Tree.behaviors.map,
|
||||||
function(map)
|
function(map)
|
||||||
local ppm = Tree.level.camera.pixelsPerMeter
|
local ppm = Tree.level.camera.pixelsPerMeter
|
||||||
local position = map.displayedPosition
|
local position = map.displayedPosition + Vec3 { 0.5, 0.5 }
|
||||||
if Tree.level.selector.id == self.owner.id then
|
if Tree.level.selector.id == self.owner.id then
|
||||||
local texW, texH = Tree.assets.files.sprites.character[self.state]:getWidth(),
|
local texW, texH = Tree.assets.files.sprites.character[self.state]:getWidth(),
|
||||||
Tree.assets.files.sprites.character[self.state]:getHeight()
|
Tree.assets.files.sprites.character[self.state]:getHeight()
|
||||||
@ -54,11 +65,25 @@ function sprite:draw()
|
|||||||
love.graphics.setShader(shader)
|
love.graphics.setShader(shader)
|
||||||
end
|
end
|
||||||
|
|
||||||
self.animationTable[self.state]:draw(Tree.assets.files.sprites.character[self.state],
|
|
||||||
position.x + 0.5,
|
love.graphics.setCanvas(Tree.level.render.shadowLayer)
|
||||||
position.y + 0.5, nil, 1 / ppm * self.side, 1 / ppm, 38, 47)
|
love.graphics.setColor(0, 0, 0, 0.5)
|
||||||
|
love.graphics.ellipse("fill", position.x, position.y, 0.2, 0.2 * math.cos(math.pi / 4))
|
||||||
|
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.translate(-0.2, 0)
|
||||||
|
love.graphics.draw(mesh)
|
||||||
|
love.graphics.pop()
|
||||||
|
|
||||||
|
love.graphics.setCanvas(Tree.level.render.spriteLayer)
|
||||||
love.graphics.setColor(1, 1, 1)
|
love.graphics.setColor(1, 1, 1)
|
||||||
|
self.animationTable[self.state]:draw(Tree.assets.files.sprites.character[self.state],
|
||||||
|
position.x,
|
||||||
|
position.y, nil, 1 / ppm * self.side, 1 / ppm, 38, 47)
|
||||||
love.graphics.setShader()
|
love.graphics.setShader()
|
||||||
|
love.graphics.setCanvas()
|
||||||
end
|
end
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|||||||
@ -13,9 +13,11 @@ local function new(type, template, size)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function map:draw()
|
function map:draw()
|
||||||
|
love.graphics.setCanvas(Tree.level.render.floorLayer)
|
||||||
utils.each(self.__grid, function(el)
|
utils.each(self.__grid, function(el)
|
||||||
el:draw()
|
el:draw()
|
||||||
end)
|
end)
|
||||||
|
love.graphics.setCanvas()
|
||||||
end
|
end
|
||||||
|
|
||||||
return { new = new }
|
return { new = new }
|
||||||
|
|||||||
@ -8,6 +8,7 @@ local utils = require "lib.utils.utils"
|
|||||||
--- @field camera Camera
|
--- @field camera Camera
|
||||||
--- @field tileGrid TileGrid
|
--- @field tileGrid TileGrid
|
||||||
--- @field turnOrder TurnOrder
|
--- @field turnOrder TurnOrder
|
||||||
|
--- @field render Render
|
||||||
local level = {}
|
local level = {}
|
||||||
level.__index = level
|
level.__index = level
|
||||||
|
|
||||||
@ -26,6 +27,7 @@ local function new(type, template)
|
|||||||
selector = (require "lib.level.selector").new(),
|
selector = (require "lib.level.selector").new(),
|
||||||
camera = (require "lib.level.camera").new(),
|
camera = (require "lib.level.camera").new(),
|
||||||
turnOrder = (require "lib.level.turn_order").new(),
|
turnOrder = (require "lib.level.turn_order").new(),
|
||||||
|
render = (require "lib.level.render").new()
|
||||||
}, level)
|
}, level)
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -39,10 +41,15 @@ function level:update(dt)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function level:draw()
|
function level:draw()
|
||||||
|
self.camera:attach()
|
||||||
|
self.render:clear()
|
||||||
self.tileGrid:draw()
|
self.tileGrid:draw()
|
||||||
while not self.characterGrid.yOrderQueue:is_empty() do -- по сути это сортировка кучей за n log n
|
while not self.characterGrid.yOrderQueue:is_empty() do -- по сути это сортировка кучей за n log n
|
||||||
self.characterGrid.yOrderQueue:pop():draw()
|
self.characterGrid.yOrderQueue:pop():draw()
|
||||||
end
|
end
|
||||||
|
self.camera:detach()
|
||||||
|
|
||||||
|
self.render:draw()
|
||||||
end
|
end
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|||||||
39
lib/level/render.lua
Normal file
39
lib/level/render.lua
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
--- @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(1, 1, 1, 0)
|
||||||
|
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
|
||||||
|
|
||||||
|
function render:draw()
|
||||||
|
-- пол -> тени -> спрайты -> оверлей
|
||||||
|
love.graphics.draw(self.floorLayer)
|
||||||
|
love.graphics.setBlendMode("multiply", "premultiplied")
|
||||||
|
love.graphics.draw(self.shadowLayer)
|
||||||
|
love.graphics.setBlendMode("alpha")
|
||||||
|
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 }
|
||||||
@ -68,10 +68,12 @@ end
|
|||||||
function walk:draw()
|
function walk:draw()
|
||||||
if not self.path then return end
|
if not self.path then return end
|
||||||
--- Это отрисовка пути персонажа к мышке
|
--- Это отрисовка пути персонажа к мышке
|
||||||
|
love.graphics.setCanvas(Tree.level.render.overlayLayer)
|
||||||
love.graphics.setColor(0.6, 0.75, 0.5)
|
love.graphics.setColor(0.6, 0.75, 0.5)
|
||||||
for p in self.path:values() do
|
for p in self.path:values() do
|
||||||
love.graphics.circle("fill", p.x + 0.45, p.y + 0.45, 0.1)
|
love.graphics.circle("fill", p.x + 0.45, p.y + 0.45, 0.1)
|
||||||
end
|
end
|
||||||
|
love.graphics.setCanvas()
|
||||||
love.graphics.setColor(1, 1, 1)
|
love.graphics.setColor(1, 1, 1)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
3
main.lua
3
main.lua
@ -56,11 +56,8 @@ function love.draw()
|
|||||||
love.graphics.draw(Tree.assets.files.cats, 0, 0)
|
love.graphics.draw(Tree.assets.files.cats, 0, 0)
|
||||||
love.graphics.pop()
|
love.graphics.pop()
|
||||||
|
|
||||||
Tree.level.camera:attach()
|
|
||||||
|
|
||||||
Tree.level:draw()
|
Tree.level:draw()
|
||||||
|
|
||||||
Tree.level.camera:detach()
|
|
||||||
testLayout:draw()
|
testLayout:draw()
|
||||||
love.graphics.setColor(1, 1, 1)
|
love.graphics.setColor(1, 1, 1)
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user