Page 1 of 12

Löve "Light vs. Shadow" Engine [0.4.3]

Posted: Fri Mar 07, 2014 1:17 am
by PriorBlue
About:
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
TODO:
  • image rotations (correct normal maps)
  • crystal reflection (chaotic)
Preview:


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

Re: Löve "Light vs. Shadow" Engine [Project Page]

Posted: Fri Mar 07, 2014 7:23 am
by OttoRobba
...

wow :ultrashocked:

Re: Löve "Light vs. Shadow" Engine [Project Page]

Posted: Fri Mar 07, 2014 9:40 am
by SiENcE
Very great stuff! Thanks man. Nice inspirations.

Re: Löve "Light vs. Shadow" Engine [Project Page]

Posted: Fri Mar 07, 2014 11:06 am
by norubal
Great, pretty and nice! :awesome:

Re: Löve "Light vs. Shadow" Engine [Project Page]

Posted: Fri Mar 07, 2014 12:15 pm
by Jeeper
This is incredible, I have been intending to do something similar for a game that I am working on, and this will be a huge help!

Re: Löve "Light vs. Shadow" Engine [Project Page]

Posted: Fri Mar 07, 2014 3:15 pm
by Ranguna259
Awesome, it's much better to have a dedicated thread :megagrin: .
Moving on, I saw that the only argumanets available to newImage are "(world, image, x, y, width, height, offsetX, offsetY)", could you add rotation too ( I dunno what shearing factor is ) ? Since the shadow uses the per-pixel method you shouldn't have any problems on the shader part I think

Re: Löve "Light vs. Shadow" Engine [Project Page]

Posted: Fri Mar 07, 2014 8:22 pm
by WetDesertRock
Looking into implementing this into the game I'm currently working on, and I have a couple questions. Forgive me if you've answered these on the other thread, feel free to redirect me there if the questions have been answered already there.

Is it possible to have a segment be a game object? Would I just use love.light.newPolygon(world, x1, y1, x2, y2) for the segment? Reason being that I have collision detection (and what will be shadow casting) based off of segments, and I want to know if I need to change that to use this library.
Also, are you going to do directional light sometime?

Re: Löve "Light vs. Shadow" Engine [Project Page]

Posted: Sat Mar 08, 2014 12:05 am
by szensk
Error
Cannot compile pixel shader code:
Line 2: error: Syntax error: "smooth" parse error

in function 'newShader'
light.lua:29: in function 'newWorld'
One must love AMD's error reporting.

Re: Löve "Light vs. Shadow" Engine [Project Page]

Posted: Sat Mar 08, 2014 3:00 pm
by Ranguna259
WetDesertRock wrote: Is it possible to have a segment be a game object?
What do you mean segment ?
WetDesetRock wrote: Also, are you going to do directional light sometime?
Directional Light ?
szensk wrote:
Error
Cannot compile pixel shader code:
Line 2: error: Syntax error: "smooth" parse error

in function 'newShader'
light.lua:29: in function 'newWorld'
One must love AMD's error reporting.
Hmmm.. What do you think that is ? A problem with AMD shader compatibility or is something wrong with shader itself ?

Re: Löve "Light vs. Shadow" Engine [Project Page]

Posted: Sat Mar 08, 2014 3:36 pm
by Jeeper
Ranguna259 wrote:
WetDesertRock wrote: Is it possible to have a segment be a game object?
What do you mean segment ?
WetDesetRock wrote: Also, are you going to do directional light sometime?
Directional Light ?
szensk wrote:
Error
Cannot compile pixel shader code:
Line 2: error: Syntax error: "smooth" parse error

in function 'newShader'
light.lua:29: in function 'newWorld'
One must love AMD's error reporting.
Hmmm.. What do you think that is ? A problem with AMD shader compatibility or is something wrong with shader itself ?
No idea, me and my friend gets the same error. Both with AMD, while it works on nvidia.