64 lines
2.1 KiB
Lua
64 lines
2.1 KiB
Lua
local easing = require "lib.utils.easing"
|
|
--- @class ShadowcasterBehavior : Behavior
|
|
local behavior = {}
|
|
behavior.id = "shadowcaster"
|
|
behavior.__index = behavior
|
|
|
|
function behavior.new() return setmetatable({}, behavior) end
|
|
|
|
function behavior:draw()
|
|
local sprite = self.owner:has(Tree.behaviors.sprite)
|
|
local map = self.owner:has(Tree.behaviors.map)
|
|
if not map then return end
|
|
|
|
local ppm = Tree.level.camera.pixelsPerMeter
|
|
local position = map.displayedPosition + Vec3 { 0.5, 0.5 }
|
|
|
|
local lightIds = Tree.level.lightGrid:query(position, 5)
|
|
--- @type Character[]
|
|
local lights = {}
|
|
for _, id in ipairs(lightIds) do
|
|
table.insert(lights, Tree.level.characters[id])
|
|
end
|
|
|
|
Tree.level.camera:attach()
|
|
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)
|
|
love.graphics.ellipse("fill", 0, 0, 0.2, 0.2 * math.cos(math.pi / 4))
|
|
love.graphics.pop()
|
|
|
|
if not sprite then
|
|
love.graphics.setCanvas()
|
|
return
|
|
end
|
|
|
|
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
|
|
local lightVec = lightPos - position
|
|
|
|
local lightColor = light:has(Tree.behaviors.light).color
|
|
if lightPos.y > position.y then
|
|
love.graphics.setColor(lightColor.x, lightColor.y, lightColor.z,
|
|
1 - 0.3 * lightVec:length())
|
|
elseif position.y - lightPos.y < 3 then
|
|
love.graphics.setColor(lightColor.x, lightColor.y, lightColor.z,
|
|
(1 - easing.easeInSine((position.y - lightPos.y))) - 0.3 * lightVec:length())
|
|
end
|
|
|
|
sprite.animationTable[sprite.state]:draw(Tree.assets.files.sprites.character[sprite.state],
|
|
position.x,
|
|
position.y, nil, 1 / ppm * sprite.side, 1 / ppm, 38, 47)
|
|
end
|
|
love.graphics.setBlendMode("alpha")
|
|
|
|
Tree.level.camera:detach()
|
|
love.graphics.setColor(1, 1, 1)
|
|
love.graphics.setCanvas()
|
|
end
|
|
|
|
return behavior
|