Löve "Light vs. Shadow" is an engine for light and shadow calculations. It is easy to use, like the physic library in love2d. The work is not done yet, but here are the first results. The license is under MIT, so you can do what ever you want with this code.
Features:
- polygon shadow calculation Preview
- circle shadow calculation
- image shadow calculation Preview
- shadow blur
- light color, range, smooth and glow Preview
- ambient light
- self shadowing on images with normal maps Preview
- dynamic glow effect on images and circle/poly objects Preview Preview
- generate flat or gradient normal maps Preview
- convert height maps to normal maps Preview
- generate a normal map directly from the image (usually gives poor results)
- can now be used with camera translation (use: lightWorld.setTranslation(x, y))
- shadow color and alpha (glass) Preview
- directional light Preview
- refractions + reflections Preview
- chromatic aberration (press: c) Preview
- material system (plastic, chrome, glass, magma etc.) Preview
- several postshader effects (press: F10) Preview
- Wiki
- image rotations (correct normal maps)
- crystal reflection (chaotic)
New features:
How to use example:
Code: Select all
require "light"
function love.load()
-- create light world
lightWorld = love.light.newWorld()
lightWorld.setAmbientColor(15, 15, 31)
-- create light
lightMouse = lightWorld.newLight(0, 0, 255, 127, 63, 300)
lightMouse.setGlowStrength(0.3)
-- create shadow bodys
circleTest = lightWorld.newCircle(256, 256, 32)
rectangleTest = lightWorld.newRectangle(512, 512, 64, 64)
end
function love.update(dt)
love.window.setTitle("Light vs. Shadow Engine (FPS:" .. love.timer.getFPS() .. ")")
lightMouse.setPosition(love.mouse.getX(), love.mouse.getY())
end
function love.draw()
-- update lightmap (doesn't need deltatime)
lightWorld.update()
-- draw background
love.graphics.setColor(255, 255, 255)
love.graphics.rectangle("fill", 0, 0, love.graphics.getWidth(), love.graphics.getHeight())
-- draw lightmap shadows
lightWorld.drawShadow()
-- draw scene objects
love.graphics.setColor(63, 255, 127)
love.graphics.circle("fill", circleTest.getX(), circleTest.getY(), circleTest.getRadius())
love.graphics.polygon("fill", rectangleTest.getPoints())
-- draw lightmap shine
lightWorld.drawShine()
end