light_world.lua/examples/lib/object.lua
2021-11-19 20:14:08 -05:00

121 lines
3.5 KiB
Lua

local inspect = require 'examples.vendor.inspect'
local ImageObject, Rect, Circle, Refraction = {}, {}, {}, {}
ImageObject.__index = ImageObject
Rect.__index = Rect
Circle.__index = Circle
Refraction.__index = Refraction
local imageCache = {}
local function loadImg(path)
if imageCache[path] == nil and love.filesystem.getInfo(path) ~= nil then
imageCache[path] = love.graphics.newImage(path)
end
return imageCache[path]
end
local function loadMaterials(path)
if imageCache[path] == nil and love.filesystem.getInfo(path) ~= nil then
imageCache[path] = {}
local files = love.filesystem.getDirectoryItems(path)
for i, file in ipairs(files) do
imageCache[path][i] = loadImg(path .."/" .. file)
end
end
return imageCache[path]
end
function ImageObject:new(lightWorld, path, x, y, shadowType)
o = {x = x, y = y, shadowType = shadowType}
setmetatable(o, self)
o.base = loadImg(path .. "/base.png")
o.normal = loadImg(path .. "/normal.png")
o.glow = loadImg(path .. "/glow.png")
o.materials = loadMaterials(path .. "/materials")
o.body = lightWorld:newImage(o.base, x, y)
o.x, o.y = o.x - o.base:getWidth() * 0.5, o.y - o.base:getHeight() * 0.5
if o.normal ~= nil then o.body:setNormalMap(o.normal) end
if o.glow ~= nil then o.body:setGlowMap(o.glow) end
if shadowType ~= nil then
o.body:setShadowType(shadowType)
end
if o.materials ~= nil and #o.materials > 0 then
o.body:setMaterial(o.materials[math.random(1, #o.materials-1)])
end
return o
end
function ImageObject:update(dt) end
function ImageObject:draw()
love.graphics.setColor(1, 1, 1)
love.graphics.draw(self.base, self.x, self.y)
end
function Rect:new(lightWorld, x, y, w, h)
local w, h = math.random(32, 64), math.random(32, 64)
local r, g, b = math.random(), math.random(), math.random()
o = {x = x, y = y, w = w, h = h, r = r, g = g, b = b}
setmetatable(o, self)
o.body = lightWorld:newRectangle(x, y, w, h)
o.x, o.y = o.x - o.w * 0.5, o.y - o.h * 0.5
o.body:setGlowStrength(1.0)
o.body:setGlowColor(math.random(), math.random(), math.random())
o.body:setColor(r, g, b)
return o
end
function Rect:update(dt) end
function Rect:draw()
love.graphics.setColor(self.r, self.g, self.b)
love.graphics.rectangle("fill", self.x, self.y, self.w, self.h)
end
function Circle:new(lightWorld, x, y, rad)
local r, g, b = math.random(), math.random(), math.random()
o = {x = x, y = y, rad = rad, r = r, g = g, b = b}
setmetatable(o, self)
o.body = lightWorld:newCircle(x, y, rad)
o.body:setGlowStrength(1.0)
o.body:setGlowColor(math.random(), math.random(), math.random())
o.body:setColor(r, g, b)
return o
end
function Circle:update(dt) end
function Circle:draw()
love.graphics.setColor(self.r, self.g, self.b)
love.graphics.circle("fill", self.x, self.y, self.rad)
end
function Refraction:new(lightWorld, path, x, y)
o = {x = x, y = y, tx = 0, ty = 0}
setmetatable(o, self)
o.base = loadImg(path .. "/base.png")
o.normal = loadImg(path .. "/normal.png")
o.body = lightWorld:newRefraction(o.normal, x, y)
o.x, o.y = o.x - o.base:getWidth() * 0.5, o.y - o.base:getHeight() * 0.5
o.body:setReflection(true)
return o
end
function Refraction:update(dt)
self.tx = self.tx + dt * 32.0
self.ty = self.ty + dt * 8.0
self.body:setNormalTileOffset(self.tx, self.ty)
end
function Refraction:draw()
love.graphics.setBlendMode("alpha")
love.graphics.setColor(1, 1, 1, 0.74)
love.graphics.draw(self.base, self.x, self.y)
end
return {
ImageObject = ImageObject,
Rect = Rect,
Circle = Circle,
Refraction = Refraction,
}