Merge pull request #1 from tanema/master

Updated stuffs
This commit is contained in:
Paul Liverman 2014-11-10 13:00:47 -08:00
commit d81a656812
12 changed files with 284 additions and 232 deletions

View File

@ -10,12 +10,12 @@ only it has been largely refactored and edited to allow for scaling and proper t
## How to use
```lua
local LightWorld = require "lib/light_world"
local LightWorld = require "lib" --the path to where light_world is (in this repo "lib")
-- create light world
lightWorld = LightWorld({
drawBackground = drawBackground, --the callback to use for drawing the background
drawForground = drawForground, --the callback to use for drawing the foreground
drawForeground = drawForeground, --the callback to use for drawing the foreground
ambient = {55,55,55}, --the general ambient light in the environment
})

View File

@ -1,5 +1,5 @@
-- Example: Complex Example
local LightWorld = require "lib/light_world"
local LightWorld = require "lib"
function initScene()
-- physic world
@ -94,7 +94,7 @@ function love.load()
refractionStrength = 16.0,
reflectionVisibility = 0.75,
drawBackground = drawBackground,
drawForground = drawForground
drawForeground = drawForeground
})
mouseLight = lightWorld:newLight(0, 0, 255, 191, 127, lightRange)
@ -131,9 +131,11 @@ end
function love.update(dt)
love.window.setTitle("Light vs. Shadow Engine (FPS:" .. love.timer.getFPS() .. ")")
mouseLight:setPosition(love.mouse.getX(), love.mouse.getY(), 16.0 + (math.sin(lightDirection) + 1.0) * 64.0)
mx = love.mouse.getX()
my = love.mouse.getY()
mx, my = (love.mouse.getX() - offsetX)/scale, (love.mouse.getY() - offsetY)/scale
mouseLight:setPosition(mx, my, 16.0 + (math.sin(lightDirection) + 1.0) * 64.0)
lightDirection = lightDirection + dt
colorAberration = math.max(0.0, colorAberration - dt * 10.0)
@ -357,7 +359,7 @@ function drawBackground(l,t,w,h)
end
end
function drawForground(l,t,w,h)
function drawForeground(l,t,w,h)
love.graphics.setBlendMode("alpha")
for i = 1, phyCnt do
if phyLight[i]:getType() == "polygon" then

View File

@ -1,18 +1,18 @@
-- Example: Normal map Example
local LightWorld = require "lib/light_world"
local LightWorld = require "lib"
function love.load()
x = 0
y = 0
scale = 1
-- load images
image = love.graphics.newImage("gfx/crossColor.jpg")
image_normal = love.graphics.newImage("gfx/crossnrm.jpg")
image = love.graphics.newImage("gfx/rock.png")
image_normal = love.graphics.newImage("gfx/rock_n.png")
-- create light world
lightWorld = LightWorld({
drawBackground = drawBackground,
drawForground = drawForground,
drawForeground = drawForeground,
ambient = {55,55,55},
refractionStrength = 32.0,
reflectionVisibility = 0.75,
@ -21,6 +21,7 @@ function love.load()
-- create light
lightMouse = lightWorld:newLight(0, 0, 160, 160, 160, 300)
lightMouse:setGlowStrength(0.3)
--lightMouse.normalInvert = true
-- create shadow bodys
local w, h = love.graphics.getWidth(), love.graphics.getHeight()
@ -65,7 +66,7 @@ function drawBackground(l,t,w,h)
love.graphics.rectangle("fill", -l/scale, -t/scale, w/scale, h/scale)
end
function drawForground(l,t,w,h)
function drawForeground(l,t,w,h)
love.graphics.setColor(255, 255, 255)
local w, h = love.graphics.getWidth(), love.graphics.getHeight()
love.graphics.draw(image, w/2-(image:getWidth()/2), h/2-(image:getHeight()/2))

View File

@ -1,5 +1,5 @@
-- Example: Short Example
local LightWorld = require "lib/light_world"
local LightWorld = require "lib"
function love.load()
testShader = 0
@ -16,7 +16,7 @@ function love.load()
-- create light world
lightWorld = LightWorld({
drawBackground = drawBackground,
drawForground = drawForground,
drawForeground = drawForeground,
ambient = {55,55,55},
refractionStrength = 32.0,
reflectionVisibility = 0.75,
@ -77,6 +77,12 @@ function love.keypressed(k)
if colorAberration == 0.0 then
colorAberration = 3.0
end
elseif k == "f" then
lightWorld:remove(lightMouse)
elseif k == "g" then
lightWorld:remove(circleTest)
elseif k == "h" then
lightWorld:remove(rectangleTest)
end
end
@ -110,7 +116,7 @@ function love.update(dt)
lightWorld.post_shader:removeEffect("chromatic_aberration")
end
lightMouse:setPosition(love.mouse.getX()/scale, love.mouse.getY()/scale)
lightMouse:setPosition((love.mouse.getX() - x)/scale, (love.mouse.getY() - y)/scale)
end
function love.draw()
@ -132,7 +138,7 @@ function drawBackground(l,t,w,h)
love.graphics.rectangle("fill", -l/scale, -t/scale, w/scale, h/scale)
end
function drawForground(l,t,w,h)
function drawForeground(l,t,w,h)
love.graphics.setColor(63, 255, 127)
local cx, cy = circleTest:getPosition()
love.graphics.circle("fill", cx, cy, circleTest:getRadius())

BIN
gfx/rock.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 127 KiB

BIN
gfx/rock_n.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

View File

@ -109,6 +109,17 @@ function body:setPosition(x, y)
end
end
-- move position
function body:move(x, y)
if x then
self.x = self.x + x
end
if y then
self.y = self.y + y
end
self:refresh()
end
-- get x position
function body:getPosition()
return self.x, self.y
@ -617,10 +628,12 @@ function body:calculateCircleShadow(light)
curShadowGeometry[6] = y3 - (light.y - y3) * shadowLength
curShadowGeometry[7] = x2 - (light.x - x2) * shadowLength
curShadowGeometry[8] = y2 - (light.y - y2) * shadowLength
curShadowGeometry.alpha = self.alpha
curShadowGeometry.red = self.red
curShadowGeometry.green = self.green
curShadowGeometry.blue = self.blue
curShadowGeometry.alpha = self.alpha
return curShadowGeometry
else
return nil

View File

@ -21,21 +21,24 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
]]
local _PACKAGE = (...):match("^(.+)[%./][^%./]+") or ""
local class = require(_PACKAGE..'/class')
local Light = require(_PACKAGE..'/light')
local Body = require(_PACKAGE..'/body')
local util = require(_PACKAGE..'/util')
local normal_map = require(_PACKAGE..'/normal_map')
local PostShader = require(_PACKAGE..'/postshader')
require(_PACKAGE..'/postshader')
local _PACKAGE = string.gsub(...,"%.","/") or ""
if string.len(_PACKAGE) > 0 then
_PACKAGE = _PACKAGE .. "/"
end
local class = require(_PACKAGE..'class')
local Light = require(_PACKAGE..'light')
local Body = require(_PACKAGE..'body')
local util = require(_PACKAGE..'util')
local normal_map = require(_PACKAGE..'normal_map')
local PostShader = require(_PACKAGE..'postshader')
require(_PACKAGE..'postshader')
local light_world = class()
light_world.blurv = love.graphics.newShader(_PACKAGE.."/shaders/blurv.glsl")
light_world.blurh = love.graphics.newShader(_PACKAGE.."/shaders/blurh.glsl")
light_world.refractionShader = love.graphics.newShader(_PACKAGE.."/shaders/refraction.glsl")
light_world.reflectionShader = love.graphics.newShader(_PACKAGE.."/shaders/reflection.glsl")
light_world.blurv = love.graphics.newShader(_PACKAGE.."shaders/blurv.glsl")
light_world.blurh = love.graphics.newShader(_PACKAGE.."shaders/blurh.glsl")
light_world.refractionShader = love.graphics.newShader(_PACKAGE.."shaders/refraction.glsl")
light_world.reflectionShader = love.graphics.newShader(_PACKAGE.."shaders/reflection.glsl")
function light_world:init(options)
self.lights = {}
@ -55,7 +58,7 @@ function light_world:init(options)
self.glowDown = false
self.drawBackground = function() end
self.drawForground = function() end
self.drawForeground = function() end
options = options or {}
for k, v in pairs(options) do self[k] = v end
@ -99,7 +102,7 @@ function light_world:draw(l,t,s)
util.drawto(self.render_buffer, l, t, s, function()
self.drawBackground( l,t,w,h,s)
self:drawShadow( l,t,w,h,s)
self.drawForground( l,t,w,h,s)
self.drawForeground( l,t,w,h,s)
self:drawMaterial( l,t,w,h,s)
self:drawShine( l,t,w,h,s)
self:drawPixelShadow(l,t,w,h,s)
@ -177,7 +180,7 @@ function light_world:drawPixelShadow(l,t,w,h,s)
self.pixelShadow2:clear()
for i = 1, #self.lights do
self.lights[i]:drawPixelShadow(l,t,w,h, self.normalMap, self.pixelShadow2)
self.lights[i]:drawPixelShadow(l,t,w,h,s, self.normalMap, self.pixelShadow2)
end
self.pixelShadow:clear(255, 255, 255)
@ -185,7 +188,7 @@ function light_world:drawPixelShadow(l,t,w,h,s)
util.drawto(self.pixelShadow, l, t, s, function()
love.graphics.setBlendMode("additive")
love.graphics.setColor({self.ambient[1], self.ambient[2], self.ambient[3]})
love.graphics.rectangle("fill", l/s,t/s,w/s,h/s)
love.graphics.rectangle("fill", -l/s, -t/s, w/s,h/s)
end)
util.drawCanvasToCanvas(self.pixelShadow, self.render_buffer, {blendmode = "multiplicative"})
@ -277,7 +280,7 @@ end
function light_world:clear()
light_world:clearLights()
light_world:clearBodys()
light_world:clearBodies()
end
-- clear lights
@ -287,7 +290,7 @@ function light_world:clearLights()
end
-- clear objects
function light_world:clearBodys()
function light_world:clearBodies()
self.body = {}
self.isShadows = false
self.isRefraction = false
@ -299,7 +302,7 @@ function light_world:setBackgroundMethod(fn)
end
function light_world:setForegroundMethod(fn)
self.drawForground = fn or function() end
self.drawForeground = fn or function() end
end
-- set ambient color
@ -340,7 +343,7 @@ end
-- new rectangle
function light_world:newRectangle(x, y, w, h)
self.isShadows = true
return self:newBody("rectangle", x, y, width, height)
return self:newBody("rectangle", x, y, w, h)
end
-- new circle
@ -414,4 +417,25 @@ function light_world:getLight(n)
return self.lights[n]
end
function light_world:remove(to_kill)
if to_kill:is_a(Body) then
for i = 1, #self.body do
if self.body[i] == to_kill then
table.remove(self.body, i)
return true
end
end
elseif to_kill:is_a(Light) then
for i = 1, #self.lights do
if self.lights[i] == to_kill then
table.remove(self.lights, i)
return true
end
end
end
-- failed to find it
return false
end
return light_world

View File

@ -32,6 +32,8 @@ function light:refresh(w, h)
self.shadow = love.graphics.newCanvas(w, h)
self.shine = love.graphics.newCanvas(w, h)
self.normalInvertShader:send('screenResolution', {w, h})
self.normalShader:send('screenResolution', {w, h})
end
-- set position
@ -47,7 +49,7 @@ end
-- get x
function light:getPosition()
return self.x, self.y
return self.x, self.y, self.z
end
-- set color
@ -105,15 +107,17 @@ function light:setGlowStrength(strength)
self.glowStrength = strength
end
function light:inRange(l,t,w,h)
return self.x + self.range > l and
self.x - self.range < (l+w) and
self.y + self.range > t and
self.y - self.range < (t+h)
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 (lx + rs) > 0 and
(lx - rs) < w/s and
(ly + rs) > 0 and
(ly - rs) < h/s
end
function light:drawShadow(l,t,w,h,s,bodies, canvas)
if self.visible and self:inRange(l,t,w,h) then
if self.visible and self:inRange(l,t,w,h,s) then
-- calculate shadows
local shadow_geometry = {}
for i = 1, #bodies do
@ -126,7 +130,8 @@ function light:drawShadow(l,t,w,h,s,bodies, canvas)
-- draw shadow
self.shadow:clear()
util.drawto(self.shadow, l, t, s, function()
self.shader:send("lightPosition", {self.x*s, (h/s - self.y)*s, self.z})
self.shader:send("lightPosition", {(self.x + l/s) * s, (h/s - (self.y + t/s)) * s, self.z/255.0})
self.shader:send("lightRange", self.range*s)
self.shader:send("lightColor", {self.red / 255.0, self.green / 255.0, self.blue / 255.0})
self.shader:send("lightSmooth", self.smooth)
@ -164,7 +169,7 @@ function light:drawShadow(l,t,w,h,s,bodies, canvas)
end
function light:drawShine(l,t,w,h,s,bodies,canvas)
if self.visible then
if self.visible and self:inRange(l,t,w,h,s) then
--update shine
self.shine:clear(255, 255, 255)
util.drawto(self.shine, l, t, s, function()
@ -179,21 +184,19 @@ function light:drawShine(l,t,w,h,s,bodies,canvas)
end
end
function light:drawPixelShadow(l,t,w,h, normalMap, canvas)
if self.visible then
function light:drawPixelShadow(l,t,w,h,s, normalMap, canvas)
if self.visible and self:inRange(l,t,w,h,s) then
if self.normalInvert then
self.normalInvertShader:send('screenResolution', {w, h})
self.normalInvertShader:send('lightColor', {self.red / 255.0, self.green / 255.0, self.blue / 255.0})
self.normalInvertShader:send('lightPosition',{self.x, lh - self.y, self.z / 255.0})
self.normalInvertShader:send("lightPosition", {(self.x + l/s) * s, (h/s - (self.y + t/s)) * s, self.z / 255.0})
self.normalInvertShader:send('lightRange',{self.range})
self.normalInvertShader:send("lightSmooth", self.smooth)
self.normalInvertShader:send("lightAngle", math.pi - self.angle / 2.0)
self.normalInvertShader:send("lightDirection", self.direction)
util.drawCanvasToCanvas(normalMap, canvas, {shader = self.normalInvertShader})
else
self.normalShader:send('screenResolution', {w, h})
self.normalShader:send('lightColor', {self.red / 255.0, self.green / 255.0, self.blue / 255.0})
self.normalShader:send('lightPosition',{self.x, h - self.y, self.z / 255.0})
self.normalShader:send("lightPosition", {(self.x + l/s) * s, (h/s - (self.y + t/s)) * s, self.z / 255.0})
self.normalShader:send('lightRange',{self.range})
self.normalShader:send("lightSmooth", self.smooth)
self.normalShader:send("lightAngle", math.pi - self.angle / 2.0)
@ -203,4 +206,8 @@ function light:drawPixelShadow(l,t,w,h, normalMap, canvas)
end
end
function light:setVisible(visible)
self.visible = visible
end
return light

View File

@ -1,5 +1,4 @@
extern Image glowImage;
extern float glowTime;
vec4 effect(vec4 color, Image texture, vec2 texture_coords, vec2 pixel_coords) {

View File

@ -7,7 +7,7 @@
-- Updated by Dresenpai
require "lib/postshader"
local LightWorld = require "lib/light_world"
local LightWorld = require "lib"
exf = {}
exf.current = nil
@ -49,7 +49,6 @@ function love.keypressed(k) end
function love.keyreleased(k) end
function love.mousepressed(x, y, b) end
function love.mousereleased(x, y, b) end
function exf.empty() end
function exf.update(dt)
@ -77,7 +76,7 @@ function exf.drawBackground()
exf.list:draw()
end
function exf.drawForground()
function exf.drawForeground()
love.graphics.setColor(255, 255, 255)
love.graphics.draw(exf.bigball, 800 - 128, 600 - 128, love.timer.getTime(), 1, 1, exf.bigball:getWidth() * 0.5, exf.bigball:getHeight() * 0.5)
end
@ -163,8 +162,6 @@ function exf.clear()
love.graphics.setColor(255, 255, 255)
love.graphics.setLineWidth(1)
love.graphics.setLineStyle("smooth")
--love.graphics.setLine(1, "smooth")
--love.graphics.setColorMode("replace")
love.graphics.setBlendMode("alpha")
love.mouse.setVisible(true)
end
@ -184,7 +181,7 @@ function exf.resume()
-- create light world
lightWorld = LightWorld({
drawBackground = exf.drawBackground,
drawForground = exf.drawForground
drawForeground = exf.drawForeground
})
lightWorld:setAmbientColor(127, 127, 127)
@ -278,7 +275,6 @@ function List:update(dt)
end
self.bar_lock.y = love.mouse.getY()
end
end
@ -296,10 +292,14 @@ function List:mousepressed(mx, my, b)
if b == "wd" then
self.bar_pos = self.bar_pos + bar_pixel_dt
if self.bar_pos > self.bar_max_pos then self.bar_pos = self.bar_max_pos end
if self.bar_pos > self.bar_max_pos then
self.bar_pos = self.bar_max_pos
end
elseif b == "wu" then
self.bar_pos = self.bar_pos - bar_pixel_dt
if self.bar_pos < 0 then self.bar_pos = 0 end
if self.bar_pos < 0 then
self.bar_pos = 0
end
end
end
@ -323,14 +323,12 @@ function List:mousereleased(x, y, b)
end
function List:getBarRect()
return
self.x+self.width+2, self.y+1+self.bar_pos,
return self.x+self.width+2, self.y+1+self.bar_pos,
self.bar_width-3, self.bar_size
end
function List:getItemRect(i)
return
self.x+2, self.y+((self.item_height+1)*(i-1)+1)-self:getOffset(),
return self.x+2, self.y+((self.item_height+1)*(i-1)+1)-self:getOffset(),
self.width-3, self.item_height
end
@ -346,8 +344,10 @@ function List:draw()
-- Get interval to display.
local start_i = math.floor( self:getOffset()/(self.item_height+1) ) + 1
local end_i = start_i+math.floor( self.height/(self.item_height+1) ) + 1
if end_i > self.items.n then end_i = self.items.n end
if end_i > self.items.n then
end_i = self.items.n
end
love.graphics.setScissor(self.x, self.y, self.width, self.height)