Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/xiejiangzhi/light
A simple light & shadow library for love2d
https://github.com/xiejiangzhi/light
light love2d lua shadow
Last synced: about 1 month ago
JSON representation
A simple light & shadow library for love2d
- Host: GitHub
- URL: https://github.com/xiejiangzhi/light
- Owner: xiejiangzhi
- License: mit
- Created: 2019-09-08T14:13:22.000Z (over 5 years ago)
- Default Branch: master
- Last Pushed: 2019-09-17T09:19:59.000Z (about 5 years ago)
- Last Synced: 2024-08-02T06:17:57.040Z (4 months ago)
- Topics: light, love2d, lua, shadow
- Language: Lua
- Size: 1.8 MB
- Stars: 12
- Watchers: 4
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- awesome-love2d - Light - A simple dynamic light implementation. (Lighting)
README
Light & Shadow
==============A simple dynamic light shadow library for LOVE2D 11.2.
It's easy to use, don't need to create body for shadow, directly generate shadow from canvas/image according alpha.
So it's not fast, and don't support 3D shadow.
If you want a fast and 3D light shadow library, [Light World](https://github.com/xiejiangzhi/light_world.lua) and [Shadow](https://github.com/matiasah/shadows) is better choice.## Example
![Example Image](./example.png)
##Usage
```
local Lib = require 'light'
local light_world = Lib.World.new()
local lightlocal lg = love.grpahics
function love.load()
light = light_world:add(200, 200, 200, 1, 0, 0)
endfunction love.update(dt)
light.x, light.y = love.mouse.getPosition()
endfunction love.draw()
-- reset light world
light_world:begin()for i = 1, 10 do
lg.circle('fill', 100 + i * 70, 300, 10)
end-- track shadow objects
light_world:track_obj()
for i = 1, 10 do
lg.circle('fill', 100 + i * 70, 300 + i * 50, 30)
end
-- draw background
light_world:track_bg()for i = 1, 10 do
lg.circle('fill', 100 + i * 70, 500 + i * 50, 30)
end-- draw scene, light and shadow
light_world:finish()lg.print('mouse: '..mx..','..my..' light: '..light.x..','..light.y, 50, 50)
end
```## Functions
### World
* `World.new({ env_light = { 0.5, 0.4, 0.5, 0.5 }, alpha_through = 0.3 })` if a object alpha less than `alpha_through`, we will not generate shadow for it
* `World:begin()` reset light world and start track background pixels.
* `World:track_obj()` switch to draw object mode, pixels is affected by light and has shadow.
* `World:track_light_objs()` switch to draw object mode, pixels is always light and has shadow.
* `World:track_bg()` switch to draw background mode, new pixels is affected by light.
* `World:track_light_bg()` switch to draw background mode, the pixels always is light and it has no shadow
* `World:finish()` draw bg, objects, light and shadow to screen.
* `World:add(x, y, radius, r, g, b, a)` add a light to world, return `light`
* `World:remove(light)` remove the light from world
* `World:clear()` remove all lights
* `World:setEnvLight(r, g, b, a)`
* `World:resize(w, h)` you must call it after change window size
* `World:setTranslate(x, y, scale)` you must call it if your applied `love.graphics.translate` or `love.graphics.scale`
* `World.env_tex=[canvas/image]`
* `World.pause=true` Stop light and shadow feature.### Light
* `Light:setSize(radius)` resize the light
## Tips
* If the `env_light` is `1, 1, 1, 1`, no light and shadow can be draw. In an overly bright environment you will not see light and shadow
* If the background alpha is too little, we will not see the light because no object can reflect this light into your eyes
* When you have a lot of light, it will very slow. the light size and quantity will affect performance. (I will try to make it faster)## TODO
* Fix shadow for `source_radius` argument.
* Support shadow for semitransparent objects.(shadow map able to save four floats.)
* Optimize according to [here](https://github.com/mattdesl/lwjgl-basics/wiki/2D-Pixel-Perfect-Shadows#optimizations)