light_world.lua/lib/light.lua
2014-12-19 20:33:58 -05:00

141 lines
3.0 KiB
Lua

local _PACKAGE = (...):match("^(.+)[%./][^%./]+") or ""
local class = require(_PACKAGE.."/class")
local util = require(_PACKAGE.."/util")
local light = class()
function light:init(x, y, r, g, b, range)
self.direction = 0
self.angle = math.pi * 2.0
self.x = x or 0
self.y = y or 0
self.z = 1
self.red = r or 255
self.green = g or 255
self.blue = b or 255
self.range = range or 300
self.smooth = 1.0
self.glowSize = 0.1
self.glowStrength = 0.0
self.visible = true
self.is_on_screen = true
self:refresh(love.window.getWidth(), love.window.getHeight())
end
function light:refresh(w, h)
self.shadowMap = love.graphics.newCanvas(w, h)
end
-- set position
function light:setPosition(x, y, z)
if x ~= self.x or y ~= self.y or (z and z ~= self.z) then
self.x = x
self.y = y
if z then
self.z = z
end
end
end
-- move position
function light:move(x, y, z)
if x then
self.x = self.x + x
end
if y then
self.y = self.y + y
end
if z then
self.z = self.z + z
end
end
-- get x
function light:getPosition()
return self.x, self.y, self.z
end
-- set color
function light:setColor(red, green, blue)
self.red = red
self.green = green
self.blue = blue
end
-- set range
function light:setRange(range)
if range ~= self.range then
self.range = range
end
end
-- set direction
function light:setDirection(direction)
if direction ~= self.direction then
if direction > math.pi * 2 then
self.direction = math.mod(direction, math.pi * 2)
elseif direction < 0.0 then
self.direction = math.pi * 2 - math.mod(math.abs(direction), math.pi * 2)
else
self.direction = direction
end
end
end
-- set angle
function light:setAngle(angle)
if angle ~= self.angle then
if angle > math.pi then
self.angle = math.mod(angle, math.pi)
elseif angle < 0.0 then
self.angle = math.pi - math.mod(math.abs(angle), math.pi)
else
self.angle = angle
end
end
end
-- set glow size
function light:setSmooth(smooth)
self.smooth = smooth
end
-- set glow size
function light:setGlowSize(size)
self.glowSize = size
end
-- set glow strength
function light:setGlowStrength(strength)
self.glowStrength = strength
end
function light:inRange(l,t,w,h,s)
local lx, ly, rs = (self.x + l/s) * s, (self.y + t/s) * s, self.range * s
return self.visible and (lx + rs) > 0 and (lx - rs) < w/s and (ly + rs) > 0 and (ly - rs) < h/s
end
function light:setVisible(visible)
self.visible = visible
end
function light:isVisible()
return self.visible and self.is_on_screen
end
function light:updateShadowMap(l, t, s, bodies)
self.shadowMap:clear()
util.drawto(self.shadowMap, l, t, s, function()
for k = 1, #bodies do
if bodies[k]:isInLightRange(self) and bodies[k]:isVisible() then
bodies[k]:drawShadow(self)
end
end
local angle = math.pi - self.angle / 2.0
love.graphics.setColor(0, 0, 0)
love.graphics.arc("fill", self.x, self.y, self.range, self.direction - angle, self.direction + angle)
end)
end
return light