diff --git a/examples/animation.lua b/examples/animation.lua index f38a281..c7374ed 100644 --- a/examples/animation.lua +++ b/examples/animation.lua @@ -1,77 +1,34 @@ --- Example: Animation Example local LightWorld = require "lib" -local anim8 = require 'lib.anim8' +local x, y, z, scale = 20, -55, 1, 3.5 -function love.load() - x, y, z, scale = 0, 0, 1, 1 - -- load images - image = love.graphics.newImage("examples/gfx/scott_pilgrim.png") - image_normal = love.graphics.newImage("examples/gfx/scott_pilgrim_NRM.png") - - -- create light world - lightWorld = LightWorld({ - ambient = {55,55,55}, - refractionStrength = 32.0, - reflectionVisibility = 0.75, - }) - - -- create light - lightMouse = lightWorld:newLight(0, 0, 255, 127, 63, 300) - lightMouse:setGlowStrength(0.3) - lightMouse.normalInvert = true - - -- create shadow bodys - animation = lightWorld:newAnimationGrid(image, 100, 100) +local function load() + -- load images + image = love.graphics.newImage("examples/gfx/scott_pilgrim.png") + image_normal = love.graphics.newImage("examples/gfx/scott_pilgrim_NRM.png") + -- create light world + lightWorld = LightWorld({ambient = {0.49, 0.49, 0.49}}) + -- create light + lightMouse = lightWorld:newLight(0, 0, 1, 0.49, 0.24, 300) + -- create shadow bodys + animation = lightWorld:newAnimationGrid(image, 100, 100) animation:setNormalMap(image_normal) grid = animation:newGrid(108, 140) animation:addAnimation('run right', grid('1-8', 1), 0.1) animation:addAnimation('run left', grid('8-1', 2), 0.1) - - local g = anim8.newGrid(108, 140, image:getWidth(), image:getHeight()) - animation2 = anim8.newAnimation(g('1-8', 1), 0.1) end -function love.update(dt) - love.window.setTitle("Light vs. Shadow Engine (FPS:" .. love.timer.getFPS() .. ")") - - if love.keyboard.isDown("down") then - y = y - dt * 200 - elseif love.keyboard.isDown("up") then - y = y + dt * 200 - end - - if love.keyboard.isDown("right") then - x = x - dt * 200 - elseif love.keyboard.isDown("left") then - x = x + dt * 200 - end - - if love.keyboard.isDown("-") then - scale = scale - 0.01 - elseif love.keyboard.isDown("=") then - scale = scale + 0.01 - end - - if love.keyboard.isDown("a") then +local function update(dt) + love.window.setTitle("Light vs. Shadow Engine (FPS:" .. love.timer.getFPS() .. ")") + if love.keyboard.isDown("a") then animation:setAnimation('run left') - elseif love.keyboard.isDown("d") then + elseif love.keyboard.isDown("d") then animation:setAnimation('run right') - end - - animation2:update(dt) + end lightWorld:update(dt) - lightMouse:setPosition((love.mouse.getX() - x)/scale, (love.mouse.getY() - y)/scale, z) + lightMouse:setPosition((love.mouse.getX() - x)/scale, (love.mouse.getY() - y)/scale, z) end -function love.mousepressed(x, y, c) - if c == "wu" then - z = z + 1 - elseif c == "wd" then - z = z - 1 - end -end - -function love.draw() +local function draw() lightWorld:setTranslation(x, y, scale) love.graphics.push() love.graphics.translate(x, y) @@ -80,9 +37,13 @@ function love.draw() love.graphics.setColor(255, 255, 255) love.graphics.rectangle("fill", -x/scale, -y/scale, love.graphics.getWidth()/scale, love.graphics.getHeight()/scale) animation:drawAnimation() - - animation2:draw(image, 200, 30) end) love.graphics.pop() end +return { + load = load, + update = update, + draw = draw, + mousepressed = mousepressed, +} diff --git a/examples/complex.lua b/examples/complex.lua index 2afeaef..5b4f95c 100644 --- a/examples/complex.lua +++ b/examples/complex.lua @@ -1,4 +1,3 @@ --- Example: Complex Example local LightWorld = require "lib" function initScene() @@ -28,7 +27,7 @@ function initScene() phyLight = {} end -function love.load() +local function load() love.graphics.setBackgroundColor(0, 0, 0) love.graphics.setDefaultFilter("nearest", "nearest") @@ -125,12 +124,12 @@ function love.load() tileY = 0 end -function love.update(dt) +local function update(dt) love.window.setTitle("Light vs. Shadow Engine (FPS:" .. love.timer.getFPS() .. ")") mx, my = (love.mouse.getX() - offsetX)/scale, (love.mouse.getY() - offsetY)/scale - mouseLight:setPosition(mx, my, 1 + (math.sin(lightDirection) + 1.0)) + mouseLight:setPosition(mx, my, 1 + (math.sin(lightDirection)+1.0)) lightDirection = lightDirection + dt colorAberration = math.max(0.0, colorAberration - dt * 10.0) @@ -187,7 +186,7 @@ function love.update(dt) lightWorld:update(dt) end -function love.draw() +local function draw() -- set shader buffer lightWorld:setTranslation(offsetX,offsetY, scale) love.graphics.push() @@ -316,7 +315,7 @@ function love.draw() end end -function love.mousepressed(x, y, c) +local function mousepressed(x, y, c) if c == "m" then -- add light local r = lightWorld:getLightCount() % 3 @@ -361,7 +360,7 @@ function love.mousepressed(x, y, c) end end -function love.keypressed(k, u) +local function keypressed(k, u) -- debug options if k == "f1" then helpOn = not helpOn @@ -574,3 +573,11 @@ function love.keypressed(k, u) end end end + +return { + load = load, + update = update, + draw = draw, + keypressed = keypressed, + mousepressed = mousepressed, +} diff --git a/examples/examples_list.lua b/examples/examples_list.lua new file mode 100644 index 0000000..b3906cd --- /dev/null +++ b/examples/examples_list.lua @@ -0,0 +1,80 @@ +local List = require('examples.lib.list') +local LightWorld = require('lib') +local examples = { + ["Animation Example"] = "animation.lua", + ["Complex Example"] = "complex.lua", + ["Gamera Example"] = "gamera.lua", + ["Hump Example"] = "hump.lua", + ["Normal Map Example"] = "normalMap.lua", + ["Only Postshader Example"] = "postshaders.lua", + ["Simple Example"] = "simple.lua", + ["STI Example"] = "simple_tiled_impl.lua", +} +local list, smallfont, bigfont, bigball, lightWorld, lightMouse + +local function start(file) + local state = love.filesystem.load("examples/" .. file)() + love.update = state.update + love.draw = state.draw + love.keyreleased = state.keyrelease + love.mousepressed = state.mousepressed + love.mousereleased = state.mousereleased + love.wheelmoved = state.wheelmoved + love.keypressed = function(k) + if k == "escape"then + if file ~= "examples_list.lua" then start("examples_list.lua") else love.event.quit() end + end + if state.keypressed ~= nil then state.keypressed(k) end + end + state.load() +end + +local function load() + list = List:new(50, 100, 400, 23) + smallfont = love.graphics.newFont(12) + bigfont = love.graphics.newFont(24) + list.font = smallfont + bigball = love.graphics.newImage("examples/gfx/love-big-ball.png") + local n = 0 + for c, v in pairs(examples) do + n = n + 1 + local title = string.format("%04d", n) .. " " .. c .. " (" .. v .. ")" + list:add(title, v, function() start(v) end) + end + love.window.setTitle("LOVE Example Browser") + lightWorld = LightWorld({ambient = {0.49, 0.49, 0.49}}) + lightMouse = lightWorld:newLight(20, 20, 1, 0.49, 0.24, 500) + lightWorld.post_shader:toggleEffect("scanlines") + lightMouse:setSmooth(2) + lightWorld:newCircle(620, 200, bigball:getWidth()*0.5) +end + +local function update(dt) + list:update(dt) + lightMouse:setPosition(love.mouse.getX(), love.mouse.getY()) + lightWorld:update(dt) +end + +local function draw() + lightWorld:draw(function() + love.graphics.setBackgroundColor(0, 0, 0) + love.graphics.setColor(0.18, 0.61, 1) + love.graphics.rectangle("fill", 0, 0, love.graphics.getWidth(), love.graphics.getHeight()) + love.graphics.setColor(1, 1, 1, 1) + love.graphics.setFont(bigfont) + love.graphics.print("Examples:", 50, 30) + love.graphics.setFont(smallfont) + love.graphics.print("Browse and click on the example you \nwant to run. To return the the example \nselection screen, press escape.", 500, 80) + list:draw() + love.graphics.setColor(1, 1, 1) + love.graphics.draw(bigball, 620, 200, love.timer.getTime()/5, 1, 1, bigball:getWidth() * 0.5, bigball:getHeight() * 0.5) + end) +end + +return { + start = start, + draw = draw, + update = update, + load = load, + mousepressed = function(x, y, b) list:mousepressed(x, y, b) end, +} diff --git a/examples/gamera.lua b/examples/gamera.lua index 2a86953..8572560 100644 --- a/examples/gamera.lua +++ b/examples/gamera.lua @@ -1,84 +1,28 @@ --- Example: Gamera Example local gamera = require "examples/vendor/gamera" -local LightWorld = require "lib" +local simple = require "examples.simple" +local keyboard = require "examples.lib.keyboard" -function love.load() - x = 0 - y = 0 - scale = 1 +local function load() cam = gamera.new(0, 0, love.graphics.getWidth(), love.graphics.getHeight()) - - image = love.graphics.newImage("examples/gfx/machine2.png") - image_normal = love.graphics.newImage("examples/gfx/cone_normal.png") - normal = love.graphics.newImage("examples/gfx/refraction_normal.png") - glow = love.graphics.newImage("examples/gfx/machine2_glow.png") - - -- create light world - lightWorld = LightWorld({ - ambient = {55,55,55}, - refractionStrength = 32.0, - reflectionVisibility = 0.75, - }) - - -- create light - lightMouse = lightWorld:newLight(0, 0, 255, 127, 63, 300) - lightMouse:setGlowStrength(0.3) - - -- create shadow bodys - circleTest = lightWorld:newCircle(256, 256, 16) - rectangleTest = lightWorld:newRectangle(512, 512, 64, 64) - - imageTest = lightWorld:newImage(image, 64, 64, 24, 6) - imageTest:setNormalMap(image_normal) - imageTest:setGlowMap(glow) - imageTest:setOffset(12, -10) - - -- create body object - objectTest = lightWorld:newRefraction(normal, 64, 64, 128, 128) - objectTest:setReflection(true) + simple.load() end -function love.update(dt) - love.window.setTitle("Light vs. Shadow Engine (FPS:" .. love.timer.getFPS() .. ")") - - if love.keyboard.isDown("down") then - y = y - dt * 200 - elseif love.keyboard.isDown("up") then - y = y + dt * 200 - end - - if love.keyboard.isDown("right") then - x = x - dt * 200 - elseif love.keyboard.isDown("left") then - x = x + dt * 200 - end - - if love.keyboard.isDown("-") then - scale = scale - 0.01 - elseif love.keyboard.isDown("=") then - scale = scale + 0.01 - end - - lightMouse:setPosition((love.mouse.getX() - x)/scale, (love.mouse.getY() - y)/scale) - +local function update(dt) + local x, y, scale = keyboard.update(dt) + simple.update(dt, x, y, scale) cam:setScale(scale) cam:setPosition(x, y) - lightWorld:update(dt) - lightWorld:setTranslation(x, y, scale) end -function love.draw() +local function draw() cam:draw(function(l,t,w,h) - lightWorld:draw(function() - love.graphics.setColor(255, 255, 255) - love.graphics.rectangle("fill", -x/scale, -y/scale, love.graphics.getWidth()/scale, love.graphics.getHeight()/scale) - love.graphics.setColor(63, 255, 127) - local cx, cy = circleTest:getPosition() - love.graphics.circle("fill", cx, cy, circleTest:getRadius()) - love.graphics.polygon("fill", rectangleTest:getPoints()) - love.graphics.setColor(255, 255, 255) - love.graphics.draw(image, 64 - image:getWidth() * 0.5, 64 - image:getHeight() * 0.5) - end) + simple.draw() end) end +return { + load = load, + update = update, + draw = draw, + keypressed = keypressed, +} diff --git a/examples/gfx/kingscard.jpeg b/examples/gfx/kingscard.jpeg new file mode 100644 index 0000000..c01e4ac Binary files /dev/null and b/examples/gfx/kingscard.jpeg differ diff --git a/examples/hump.lua b/examples/hump.lua index c95628d..b764e5e 100644 --- a/examples/hump.lua +++ b/examples/hump.lua @@ -1,83 +1,27 @@ --- Example: Hump Example local Camera = require "examples/vendor/hump/camera" -local LightWorld = require "lib" +local simple = require "examples.simple" +local keyboard = require "examples.lib.keyboard" -function love.load() - x = 0 - y = 0 - scale = 1 +local function load() cam = Camera(love.graphics.getWidth()/2, love.graphics.getHeight()/2) - - image = love.graphics.newImage("examples/gfx/machine2.png") - image_normal = love.graphics.newImage("examples/gfx/cone_normal.png") - normal = love.graphics.newImage("examples/gfx/refraction_normal.png") - glow = love.graphics.newImage("examples/gfx/machine2_glow.png") - - -- create light world - lightWorld = LightWorld({ - ambient = {55,55,55}, - refractionStrength = 32.0, - reflectionVisibility = 0.75, - }) - - -- create light - lightMouse = lightWorld:newLight(0, 0, 255, 127, 63, 300) - lightMouse:setGlowStrength(0.3) - - -- create shadow bodys - circleTest = lightWorld:newCircle(256, 256, 16) - rectangleTest = lightWorld:newRectangle(512, 512, 64, 64) - - imageTest = lightWorld:newImage(image, 64, 64, 24, 6) - imageTest:setNormalMap(image_normal) - imageTest:setGlowMap(glow) - imageTest:setOffset(12, -10) - - -- create body object - objectTest = lightWorld:newRefraction(normal, 64, 64, 128, 128) - objectTest:setReflection(true) + simple.load() end -function love.update(dt) - love.window.setTitle("Light vs. Shadow Engine (FPS:" .. love.timer.getFPS() .. ")") - - if love.keyboard.isDown("down") then - y = y - dt * 200 - elseif love.keyboard.isDown("up") then - y = y + dt * 200 - end - - if love.keyboard.isDown("right") then - x = x - dt * 200 - elseif love.keyboard.isDown("left") then - x = x + dt * 200 - end - - if love.keyboard.isDown("-") then - scale = scale - 0.01 - elseif love.keyboard.isDown("=") then - scale = scale + 0.01 - end - - lightMouse:setPosition((love.mouse.getX() - x)/scale, (love.mouse.getY() - y)/scale) - +local function update(dt) + local x, y, scale = keyboard.update(dt) + simple.update(dt, x, y, scale) cam:lookAt(x, y) cam:zoom(scale) - lightWorld:update(dt) - lightWorld:setTranslation(x, y, scale) end -function love.draw() +local function draw() cam:attach() - lightWorld:draw(function() - love.graphics.setColor(1, 1, 1) - love.graphics.rectangle("fill", -x/scale, -y/scale, love.graphics.getWidth()/scale, love.graphics.getHeight()/scale) - love.graphics.setColor(63/ 255, 1, 0.5) - local cx, cy = circleTest:getPosition() - love.graphics.circle("fill", cx, cy, circleTest:getRadius()) - love.graphics.polygon("fill", rectangleTest:getPoints()) - love.graphics.setColor(1, 1, 1) - love.graphics.draw(image, 64 - image:getWidth() * 0.5, 64 - image:getHeight() * 0.5) - end) + simple.draw() cam:detach() end + +return { + load = load, + update = update, + draw = draw, +} diff --git a/examples/lib/keyboard.lua b/examples/lib/keyboard.lua new file mode 100644 index 0000000..02cb0fb --- /dev/null +++ b/examples/lib/keyboard.lua @@ -0,0 +1,32 @@ +local x, y, scale = 0, 0, 1 + +local function update(dt) + if love.keyboard.isDown("down") then + y = y - dt * 200 + elseif love.keyboard.isDown("up") then + y = y + dt * 200 + end + + if love.keyboard.isDown("right") then + x = x - dt * 200 + elseif love.keyboard.isDown("left") then + x = x + dt * 200 + end + + if love.keyboard.isDown("-") then + scale = scale - 0.01 + elseif love.keyboard.isDown("=") then + scale = scale + 0.01 + end + + return x, y, scale +end + +local function status() + return x, y, scale +end + +return { + update = update, + status = status, +} diff --git a/examples/lib/list.lua b/examples/lib/list.lua new file mode 100644 index 0000000..ad248fb --- /dev/null +++ b/examples/lib/list.lua @@ -0,0 +1,43 @@ +local List = {} + +function List:new(x, y, w, h) + o = { + x = x, y = y, w = w, h = h, + items = {}, + } + setmetatable(o, self) + self.__index = self + return o +end + +function List:add(item, file, cb) + local x, y = self.x+2, self.y+((self.h+1)*(#self.items-1)+1) + local w, h = self.w-3, self.h + table.insert(self.items, {item = item, file = file, cb = cb, x = x, y = y, w = w, h = h, hover = false}) +end + +function List:update(dt) + local mx, my = love.mouse.getPosition() + for i, item in ipairs(self.items) do + item.hover = mx >= item.x and mx <= (item.x+item.w) and my >= item.y and my <= (item.y+item.h) + end +end + +function List:mousepressed(mx, my, b) + for i, item in ipairs(self.items) do + if item.hover then return item.cb() end + end +end + +function List:draw() + love.graphics.setFont(self.font) + love.graphics.setColor(0.18, 0.61, 1) + for i, item in ipairs(self.items) do + love.graphics.setColor(0, 0, 0, item.hover and 0.49 or 0.24) + love.graphics.rectangle("fill", item.x+1, item.y+1, item.w-3, item.h) + love.graphics.setColor(1, 1, 1, item.hover and 1 or 0.49) + love.graphics.print(item.item, item.x+10, item.y+6) + end +end + +return List diff --git a/examples/normalMap.lua b/examples/normalMap.lua index f7e26f9..420ccd5 100644 --- a/examples/normalMap.lua +++ b/examples/normalMap.lua @@ -1,69 +1,38 @@ -- Example: Normal map Example local LightWorld = require "lib" +local image, image_normal +local lightWorld, lightMouse -function love.load() - x = 0 - y = 0 - scale = 1 +local function load() -- load images image = love.graphics.newImage("examples/gfx/rock.png") image_normal = love.graphics.newImage("examples/gfx/rock_n.png") - -- create light world - lightWorld = LightWorld({ - ambient = {55,55,55}, - refractionStrength = 32.0, - reflectionVisibility = 0.75, - }) - + lightWorld = LightWorld({ambient = {0.21,0.21,0.21}}) -- create light lightMouse = lightWorld:newLight(0, 0, 160, 160, 160, 300) - lightMouse:setGlowStrength(0.3) - --lightMouse.normalInvert = true - + lightMouse.normalInvert = true -- create shadow bodys local w, h = love.graphics.getWidth(), love.graphics.getHeight() - imageTest = lightWorld:newImage(image, w/2, h/2) - imageTest:setNormalMap(image_normal) + lightWorld:newImage(image, w/2, h/2):setNormalMap(image_normal) end -function love.update(dt) +local function update(dt) love.window.setTitle("Light vs. Shadow Engine (FPS:" .. love.timer.getFPS() .. ")") - - if love.keyboard.isDown("up") then - y = y - dt * 200 - elseif love.keyboard.isDown("down") then - y = y + dt * 200 - end - - if love.keyboard.isDown("left") then - x = x - dt * 200 - elseif love.keyboard.isDown("right") then - x = x + dt * 200 - end - - if love.keyboard.isDown("-") then - scale = scale - 0.01 - elseif love.keyboard.isDown("=") then - scale = scale + 0.01 - end - lightWorld:update(dt) - lightMouse:setPosition(love.mouse.getX()/scale, love.mouse.getY()/scale) + lightMouse:setPosition(love.mouse.getX(), love.mouse.getY()) end -function love.draw() - lightWorld:setTranslation(x,y,scale) - love.graphics.push() - love.graphics.translate(x, y) - love.graphics.scale(scale) - lightWorld:draw(function(l, t, w, h, s) - love.graphics.setColor(255, 255, 255) - love.graphics.rectangle("fill", -l/scale, -t/scale, w/scale, h/scale) - 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)) - end) - love.graphics.pop() +local function draw() + love.graphics.clear(0.21,0.21,0.21) + lightWorld:draw(function(l, t, w, h, s) + love.graphics.setColor(1, 1, 1) + love.graphics.draw(image, w/2-(image:getWidth()/2), h/2-(image:getHeight()/2)) + end) end +return { + load = load, + update = update, + draw = draw, +} diff --git a/examples/postshaders.lua b/examples/postshaders.lua index 554ca06..0cbbfb7 100644 --- a/examples/postshaders.lua +++ b/examples/postshaders.lua @@ -1,25 +1,17 @@ --- Example: Only Postshader Example local PostShader = require "lib/postshader" +local colorAberration = 0 +local post_shader, render_buffer +local img -function love.load() - testShader = 0 - x = 0 - y = 0 - scale = 1 - colorAberration = 0.0 - -- load images - image = love.graphics.newImage("examples/gfx/machine2.png") - quadScreen = love.graphics.newQuad(0, 0, love.graphics.getWidth() + 32, love.graphics.getHeight() + 24, 32, 24) - imgFloor = love.graphics.newImage("examples/gfx/floor.png") - imgFloor:setWrap("repeat", "repeat") - +local function load() post_shader = PostShader() render_buffer = love.graphics.newCanvas(love.graphics.getWidth(), love.graphics.getHeight()) + img = love.graphics.newImage("examples/gfx/kingscard.jpeg") end -function love.keypressed(k) +local function keypressed(k) if k == "1" then - post_shader:toggleEffect("four_colors", {15, 56, 15}, {48, 98, 48}, {139, 172, 15}, {155, 188, 15}) + post_shader:toggleEffect("four_colors", {0.05, 0.21, 0.05}, {0.18, 0.38, 0.18}, {0.54, 0.67, 0.05}, {0.60, 0.73, 0.05}) elseif k == "2" then post_shader:toggleEffect("monochrome") elseif k == "3" then @@ -27,93 +19,63 @@ function love.keypressed(k) elseif k == "4" then post_shader:toggleEffect("tilt_shift", 4.0) elseif k == "5" then - post_shader:toggleEffect("bloom", 2.0, 0.25) + post_shader:toggleEffect("bloom", 2.0, 0.25) elseif k == "6" then - post_shader:toggleEffect("blur", 2.0, 2.0) + post_shader:toggleEffect("blur", 10.0, 10.0) elseif k == "7" then - post_shader:toggleEffect("black_and_white") + post_shader:toggleEffect("black_and_white") elseif k == "8" then - post_shader:toggleEffect("curvature") + post_shader:toggleEffect("curvature") elseif k == "9" then - post_shader:toggleEffect("edges") + post_shader:toggleEffect("edges") elseif k == "0" then - post_shader:toggleEffect("hdr_tv") + post_shader:toggleEffect("hdr_tv") elseif k == "q" then - post_shader:toggleEffect("phosphor") + post_shader:toggleEffect("phosphor") elseif k == "w" then - post_shader:toggleEffect("phosphorish") + post_shader:toggleEffect("phosphorish") elseif k == "e" then - post_shader:toggleEffect("pip") + post_shader:toggleEffect("pip") elseif k == "r" then - post_shader:toggleEffect("pixellate") + post_shader:toggleEffect("pixellate") elseif k == "t" then - post_shader:toggleEffect("radialblur") + post_shader:toggleEffect("radialblur") elseif k == "y" then - post_shader:toggleEffect("waterpaint") - elseif k == "c" then - if colorAberration == 0.0 then - colorAberration = 3.0 - end + post_shader:toggleEffect("waterpaint") + elseif k == "c" then + colorAberration = 3.0 + post_shader:addEffect("blur", 2.0, 2.0) + post_shader:addEffect("chromatic_aberration") end end -function love.update(dt) - love.window.setTitle("Light vs. Shadow Engine (FPS:" .. love.timer.getFPS() .. ")") - - if love.keyboard.isDown("down") then - y = y - dt * 200 - elseif love.keyboard.isDown("up") then - y = y + dt * 200 - end - - if love.keyboard.isDown("right") then - x = x - dt * 200 - elseif love.keyboard.isDown("left") then - x = x + dt * 200 - end - - if love.keyboard.isDown("-") then - scale = scale - 0.01 - elseif love.keyboard.isDown("=") then - scale = scale + 0.01 - end - - colorAberration = math.max(0.0, colorAberration - dt * 10.0) - if colorAberration > 0.0 then - post_shader:addEffect("blur", 2.0, 2.0) - post_shader:addEffect("chromatic_aberration") - else - post_shader:removeEffect("blur") - post_shader:removeEffect("chromatic_aberration") - end - - lightMouse:setPosition(love.mouse.getX()/scale, love.mouse.getY()/scale) +local function update(dt) + love.window.setTitle("Light vs. Shadow Engine (FPS:" .. love.timer.getFPS() .. ")") + colorAberration = math.max(0.0, colorAberration - dt * 10.0) + if colorAberration <= 0.0 then + post_shader:removeEffect("blur") + post_shader:removeEffect("chromatic_aberration") + end end -function love.draw() +local function draw() local w, h = love.graphics.getWidth(), love.graphics.getHeight() - love.graphics.push() - love.graphics.setCanvas(render_buffer) - love.graphics.clear() - love.graphics.translate(x, y) - love.graphics.scale(scale) - - love.graphics.setColor(255, 255, 255) - love.graphics.draw(imgFloor, quadScreen, 0,0) - - love.graphics.setColor(63, 255, 127) - love.graphics.circle("fill", 256, 256, 16) - love.graphics.rectangle("fill", 512, 512, 64, 64) - love.graphics.setColor(255, 255, 255) - love.graphics.draw(image, 64 - image:getWidth() * 0.5, 64 - image:getHeight() * 0.5) - love.graphics.pop() - + love.graphics.setCanvas(render_buffer) + love.graphics.clear() + love.graphics.setColor(1, 1, 1) + love.graphics.draw(img, 250, 100, 0, 0.5) love.graphics.setCanvas() post_shader:drawWith(render_buffer) - love.graphics.setBlendMode("alpha") - love.graphics.setColor(0, 0, 0, 191) + love.graphics.setColor(0, 0, 0, 0.74) love.graphics.rectangle("fill", 0, 0, love.graphics.getWidth(), 24) - love.graphics.setColor(0, 255, 0) - love.graphics.print("To toggle postshaders, use 0-9 and q->y, to scale use - and =, and to translate use arrows") + love.graphics.setColor(0, 1, 0) + love.graphics.print("To toggle postshaders, use 0-9 and q->y, c for chromatic aberration") end + +return { + load = load, + update = update, + draw = draw, + keypressed = keypressed, +} diff --git a/examples/short.lua b/examples/short.lua deleted file mode 100644 index e88dc1c..0000000 --- a/examples/short.lua +++ /dev/null @@ -1,178 +0,0 @@ --- Example: Short Example -local LightWorld = require "lib" - -function love.load() - testShader = 0 - x = 0 - y = 0 - z = 1 - scale = 1 - colorAberration = 0.0 - -- load images - image = love.graphics.newImage("examples/gfx/machine2.png") - image_normal = love.graphics.newImage("examples/gfx/cone_normal.png") - normal = love.graphics.newImage("examples/gfx/refraction_normal.png") - glow = love.graphics.newImage("examples/gfx/machine2_glow.png") - - -- create light world - lightWorld = LightWorld({ - ambient = {55,55,55}, - refractionStrength = 32.0, - reflectionVisibility = 0.75, - shadowBlur = 0.0 - }) - - -- create light - lightMouse = lightWorld:newLight(0, 0, 255, 127, 63, 300) - lightMouse:setGlowStrength(0.3) - - -- create shadow bodys - circleTest = lightWorld:newCircle(256, 256, 16) - rectangleTest = lightWorld:newRectangle(512, 512, 64, 64) - local px, py, pw, ph = 100, 200, 20, 50 - polygonTest = lightWorld:newPolygon( - px, py, - px+pw, py, - px+pw, py+ph, - px-50, py+ph) - - imageTest = lightWorld:newImage(image, 64, 64, 24, 6) - imageTest:setNormalMap(image_normal) - imageTest:setGlowMap(glow) - imageTest:setOffset(12, -10) - - -- create body object - objectTest = lightWorld:newRefraction(normal, 64, 64, 128, 128) - objectTest:setReflection(true) -end - -function love.keypressed(k) - if k == "1" then - lightWorld.post_shader:toggleEffect("four_colors", {15, 56, 15}, {48, 98, 48}, {139, 172, 15}, {155, 188, 15}) - elseif k == "2" then - lightWorld.post_shader:toggleEffect("monochrome") - elseif k == "3" then - lightWorld.post_shader:toggleEffect("scanlines") - elseif k == "4" then - lightWorld.post_shader:toggleEffect("tilt_shift", 4.0) - elseif k == "5" then - lightWorld.post_shader:toggleEffect("bloom", 2.0, 0.25) - elseif k == "6" then - lightWorld.post_shader:toggleEffect("blur", 2.0, 2.0) - elseif k == "7" then - lightWorld.post_shader:toggleEffect("black_and_white") - elseif k == "8" then - lightWorld.post_shader:toggleEffect("curvature") - elseif k == "9" then - lightWorld.post_shader:toggleEffect("edges") - elseif k == "0" then - lightWorld.post_shader:toggleEffect("hdr_tv") - elseif k == "q" then - lightWorld.post_shader:toggleEffect("phosphor") - elseif k == "w" then - lightWorld.post_shader:toggleEffect("phosphorish") - elseif k == "e" then - lightWorld.post_shader:toggleEffect("pip") - elseif k == "r" then - lightWorld.post_shader:toggleEffect("pixellate") - elseif k == "t" then - lightWorld.post_shader:toggleEffect("radialblur") - elseif k == "y" then - lightWorld.post_shader:toggleEffect("waterpaint") - elseif k == "c" then - if colorAberration == 0.0 then - colorAberration = 3.0 - end - end -end - -function love.update(dt) - love.window.setTitle("Light vs. Shadow Engine (FPS:" .. love.timer.getFPS() .. ")") - - if love.keyboard.isDown("down") then - y = y - dt * 200 - elseif love.keyboard.isDown("up") then - y = y + dt * 200 - end - - if love.keyboard.isDown("right") then - x = x - dt * 200 - elseif love.keyboard.isDown("left") then - x = x + dt * 200 - end - - - if love.keyboard.isDown("k") then - polygonTest:move(0, -(dt * 200)) - elseif love.keyboard.isDown("j") then - polygonTest:move(0, (dt * 200)) - end - if love.keyboard.isDown("h") then - polygonTest:move(-(dt * 200), 0) - elseif love.keyboard.isDown("l") then - polygonTest:move((dt * 200), 0) - end - - if love.keyboard.isDown("f") then - polygonTest:scale(0.005) - elseif love.keyboard.isDown("a") then - polygonTest:scale(-0.005) - end - if love.keyboard.isDown("s") then - polygonTest:rotate(0.05) - elseif love.keyboard.isDown("d") then - polygonTest:rotate(-0.05) - end - - if love.keyboard.isDown("-") then - scale = scale - 0.01 - elseif love.keyboard.isDown("=") then - scale = scale + 0.01 - end - - colorAberration = math.max(0.0, colorAberration - dt * 10.0) - if colorAberration > 0.0 then - lightWorld.post_shader:addEffect("blur", 2.0, 2.0) - lightWorld.post_shader:addEffect("chromatic_aberration") - else - lightWorld.post_shader:removeEffect("blur") - lightWorld.post_shader:removeEffect("chromatic_aberration") - end - - lightWorld:update(dt) - lightMouse:setPosition((love.mouse.getX() - x)/scale, (love.mouse.getY() - y)/scale, z) -end - -function love.mousepressed(x, y, c) - if c == "wu" then - z = z + 1 - elseif c == "wd" then - z = z - 1 - end -end - -function love.draw() - lightWorld:setTranslation(x, y, scale) - love.graphics.push() - love.graphics.translate(x, y) - love.graphics.scale(scale) - lightWorld:draw(function() - love.graphics.setColor(255, 255, 255) - love.graphics.rectangle("fill", -x/scale, -y/scale, love.graphics.getWidth()/scale, love.graphics.getHeight()/scale) - love.graphics.setColor(63, 255, 127) - local cx, cy = circleTest:getPosition() - love.graphics.circle("fill", cx, cy, circleTest:getRadius()) - love.graphics.polygon("fill", rectangleTest:getPoints()) - love.graphics.polygon("fill", polygonTest:getPoints()) - love.graphics.setColor(255, 255, 255) - love.graphics.draw(image, 64 - image:getWidth() * 0.5, 64 - image:getHeight() * 0.5) - end) - love.graphics.pop() - - love.graphics.setBlendMode("alpha") - love.graphics.setColor(0, 0, 0, 191) - love.graphics.rectangle("fill", 0, 0, love.graphics.getWidth(), 24) - love.graphics.setColor(0, 255, 0) - love.graphics.print("To toggle postshaders, use 0-9 and q->y, to scale use - and =, and to translate use arrows") - love.graphics.print("light z: " .. lightMouse.z, 0, 50) -end diff --git a/examples/simple.lua b/examples/simple.lua new file mode 100644 index 0000000..4c3d0e8 --- /dev/null +++ b/examples/simple.lua @@ -0,0 +1,51 @@ +local LightWorld = require "lib" +local lightWorld, lightMouse +local image, image_normal, glow, circleTest, rectangleTest, imageTest, objectTest + +local box_locations = { + {200, 200}, + {600, 200}, + {600, 400}, + {200, 400}, +} + +local function load() + image = love.graphics.newImage("examples/gfx/machine.png") + normal = love.graphics.newImage("examples/gfx/machine_normal.png") + glow = love.graphics.newImage("examples/gfx/machine_glow.png") + -- create light world + lightWorld = LightWorld({ambient = {0.21,0.21,0.21}}) + -- create light + lightMouse = lightWorld:newLight(0, 0, 255, 127, 63, 300) + lightMouse:setGlowStrength(0.3) + -- create shadow bodys + for i, v in ipairs(box_locations) do + imageTest = lightWorld:newImage(image, v[1], v[2]) + imageTest:setNormalMap(normal) + imageTest:setGlowMap(glow) + end +end + +local function update(dt, x, y, scale) + love.window.setTitle("Light vs. Shadow Engine (FPS:" .. love.timer.getFPS() .. ")") + x, y, scale = x or 0, y or 0, scale or 1 + lightMouse:setPosition((love.mouse.getX() - x)/scale, (love.mouse.getY() - y)/scale) + lightWorld:update(dt) + lightWorld:setTranslation(x, y, scale) +end + +local function draw() + lightWorld:draw(function() + love.graphics.clear(1, 1, 1) + love.graphics.setColor(1, 1, 1) + for i, v in ipairs(box_locations) do + love.graphics.draw(image, v[1] - image:getWidth() * 0.5, v[2] - image:getHeight() * 0.5) + end + end) +end + +return { + load = load, + update = update, + draw = draw, +} diff --git a/examples/simple_tiled_impl.lua b/examples/simple_tiled_impl.lua index 3ef06bd..21173eb 100644 --- a/examples/simple_tiled_impl.lua +++ b/examples/simple_tiled_impl.lua @@ -1,81 +1,43 @@ --- Example: STI Example local LightWorld = require "lib" local sti = require 'examples.vendor.sti' +local lightWorld, map, image_normal, lightMouse -function love.load() - x = 0 - y = 0 - z = 1 - scale = 1 - +local function load() -- create light world - lightWorld = LightWorld({ - ambient = {55,55,55}, - shadowBlur = 0.0 - }) - + lightWorld = LightWorld({ambient = {0.49, 0.49, 0.49}}) map = sti.new("examples/gfx/map.lua") image_normal = love.graphics.newImage("examples/gfx/border_NRM.png") - -- create light - lightMouse = lightWorld:newLight(0, 0, 255, 127, 63, 300) + lightMouse = lightWorld:newLight(0, 0, 1, 0.49, 0.24, 300) lightMouse:setGlowStrength(0.3) - - -- walls + -- create light blocking bodies for sections of the map + -- create walls lightWorld:newRectangle(400, 32, 800, 64):setNormalMap(image_normal, 800, 64) lightWorld:newRectangle(32, 272, 64, 416):setNormalMap(image_normal, 64, 416) lightWorld:newRectangle(400, 464, 800, 32):setNormalMap(image_normal, 800, 32) lightWorld:newRectangle(784, 272, 32, 416):setNormalMap(image_normal, 32, 416) - - --blocks + -- create blocks lightWorld:newRectangle(224, 256, 128, 124):setNormalMap(image_normal, 128, 124) lightWorld:newRectangle(592, 224, 224, 64):setNormalMap(image_normal, 224, 64) end -function love.update(dt) +local function update(dt) love.window.setTitle("Light vs. Shadow Engine (FPS:" .. love.timer.getFPS() .. ")") - - if love.keyboard.isDown("down") then - y = y - dt * 200 - elseif love.keyboard.isDown("up") then - y = y + dt * 200 - end - - if love.keyboard.isDown("right") then - x = x - dt * 200 - elseif love.keyboard.isDown("left") then - x = x + dt * 200 - end - - if love.keyboard.isDown("-") then - scale = scale - 0.01 - elseif love.keyboard.isDown("=") then - scale = scale + 0.01 - end - map:update(dt) lightWorld:update(dt) - lightMouse:setPosition((love.mouse.getX() - x)/scale, (love.mouse.getY() - y)/scale, z) + lightMouse:setPosition(love.mouse.getX(), love.mouse.getY()) end -function love.mousepressed(x, y, c) - if c == "wu" then - z = z + 1 - elseif c == "wd" then - z = z - 1 - end +local function draw() + love.graphics.setBackgroundColor(1, 1, 1) + lightWorld:draw(function() + map:draw() + end) end -function love.draw() - lightWorld:setTranslation(x, y, scale) - love.graphics.push() - love.graphics.translate(x, y) - love.graphics.scale(scale) - lightWorld:draw(function() - love.graphics.setColor(255, 255, 255) - love.graphics.rectangle("fill", -x/scale, -y/scale, love.graphics.getWidth()/scale, love.graphics.getHeight()/scale) - map:draw() - end) - love.graphics.pop() - -end +return { + load = load, + mousepressed = mousepressed, + update = update, + draw = draw, +} diff --git a/examples/vendor/list.lua b/examples/vendor/list.lua deleted file mode 100644 index e97f4a4..0000000 --- a/examples/vendor/list.lua +++ /dev/null @@ -1,193 +0,0 @@ -local List = {} - -function inside(mx, my, x, y, w, h) - return mx >= x and mx <= (x+w) and my >= y and my <= (y+h) -end - -function List:new() - o = {} - setmetatable(o, self) - self.__index = self - - o.items = {} - o.files = {} - - o.x = 50 - o.y = 70 - - o.width = 400 - o.height = 500 - - o.item_height = 23 - o.sum_item_height = 0 - - o.bar_size = 20 - o.bar_pos = 0 - o.bar_max_pos = 0 - o.bar_width = 15 - o.bar_lock = nil - - return o -end - -function List:add(item, file) - table.insert(self.items, item) - table.insert(self.files, file) - self.items.n = #self.items - self.bar_pos = 0 - local num_items = (self.height/self.item_height) - local ratio = num_items/self.items.n - self.bar_size = self.height * ratio - self.bar_max_pos = self.height - self.bar_size - 3 - self.sum_item_height = (self.item_height+1) * self.items.n + 2 -end - -function List:hasBar() - return self.sum_item_height > self.height -end - -function List:getBarRatio() - return self.bar_pos/self.bar_max_pos -end - -function List:getOffset() - local ratio = self.bar_pos/self.bar_max_pos - return math.floor((self.sum_item_height-self.height)*ratio + 0.5) -end - -function List:update(dt) - if self.bar_lock then - local dy = math.floor(love.mouse.getY()-self.bar_lock.y+0.5) - self.bar_pos = self.bar_pos + dy - - if self.bar_pos < 0 then - self.bar_pos = 0 - elseif self.bar_pos > self.bar_max_pos then - self.bar_pos = self.bar_max_pos - end - - self.bar_lock.y = love.mouse.getY() - end -end - -function List:mousepressed(mx, my, b) - if self:hasBar() then - if b == 1 then - local x, y, w, h = self:getBarRect() - if inside(mx, my, x, y, w, h) then - self.bar_lock = { x = mx, y = my } - end - end - - local per_pixel = (self.sum_item_height-self.height)/self.bar_max_pos - local bar_pixel_dt = math.floor(((self.item_height)*3)/per_pixel + 0.5) - - 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 - elseif b == "wu" then - self.bar_pos = self.bar_pos - bar_pixel_dt - if self.bar_pos < 0 then - self.bar_pos = 0 - end - end - end - - if b == 1 and inside(mx, my, self.x+2, self.y+1, self.width-3, self.height-3) then - local tx, ty = mx-self.x, my + self:getOffset() - self.y - local index = math.floor((ty/self.sum_item_height)*self.items.n) - local i = self.items[index+1] - local f = self.files[index+1] - if f then - exf.start(i, f) - end - end -end - -function List:mousereleased(x, y, b) - if self:hasBar() then - if b == 1 then - self.bar_lock = nil - end - end -end - -function List:getBarRect() - 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(), - self.width-3, self.item_height -end - -function List:draw() - love.graphics.setLineWidth(2) - love.graphics.setLineStyle("rough") - love.graphics.setFont(self.font) - - love.graphics.setColor(48/255, 156/255, 225 / 255) - - local mx, my = love.mouse.getPosition() - - -- 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 - - love.graphics.setScissor(self.x, self.y, self.width, self.height) - - -- Items. - for i = start_i,end_i do - local x, y, w, h = self:getItemRect(i) - local hover = inside(mx, my, x, y, w, h) - - if hover then - love.graphics.setColor(0, 0, 0, 127/255) - else - love.graphics.setColor(0, 0, 0, 63/255) - end - - love.graphics.rectangle("fill", x+1, y+i+1, w-3, h) - - if hover then - love.graphics.setColor(1, 1, 1, 1) - else - love.graphics.setColor(1, 1, 1, 127/255) - end - - local e_id = string.sub(self.items[i], 1, 5) - local e_rest = string.sub(self.items[i], 5) - - love.graphics.print(e_id, x+10, y+i+6) --Updated y placement -- Used to change position of Example IDs - love.graphics.print(e_rest, x+50, y+i+6) --Updated y placement -- Used to change position of Example Titles - end - - love.graphics.setScissor() - - -- Bar. - if self:hasBar() then - local x, y, w, h = self:getBarRect() - local hover = inside(mx, my, x, y, w, h) - - if hover or self.bar_lock then - love.graphics.setColor(0, 0, 0, 127/255) - else - love.graphics.setColor(0, 0, 0, 63/255) - end - love.graphics.rectangle("fill", x, y, w, h) - end - - -- Border. - love.graphics.setColor(0, 0, 0, 63/255) - love.graphics.rectangle("line", self.x+self.width, self.y, self.bar_width, self.height) - love.graphics.rectangle("line", self.x, self.y, self.width, self.height) -end - -return List diff --git a/main.lua b/main.lua index 1eaf9c1..110d37f 100644 --- a/main.lua +++ b/main.lua @@ -1,128 +1,5 @@ --- --- EXF: Example Framework --- --- This should make examples easier and more enjoyable to use. --- All examples in one application! Yaay! --- --- Updated by Dresenpai -require "lib/postshader" -local LightWorld = require "lib" -local ProFi = require 'examples.vendor.ProFi' -local List = require 'examples.vendor.list' - -exf = {} -exf.current = nil -exf.available = {} +local mainlist = require('examples.examples_list') function love.load() - exf.list = List:new() - exf.smallfont = love.graphics.newFont(12) - exf.bigfont = love.graphics.newFont(24) - exf.list.font = exf.smallfont - - exf.bigball = love.graphics.newImage("examples/gfx/love-big-ball.png") - - -- Find available demos. - local files = love.filesystem.getDirectoryItems("examples") - local n = 0 - - for i, v in ipairs(files) do - is_file = (love.filesystem.getInfo("examples/".. v ).type == "file") - if is_file then - n = n + 1 - table.insert(exf.available, v); - local file = love.filesystem.newFile(v, love.file_read) - file:open("r") - local contents = love.filesystem.read("examples/" .. v, 100) - local s, e, c = string.find(contents, "Example: ([%a%p ]-)[\r\n]") - file:close(file) - if not c then c = "Untitled" end - local title = string.format("%04d", n) .. " " .. c .. " (" .. v .. ")" - exf.list:add(title, v) - end - end - - exf.load() -end - -function exf.empty() end -function exf.keypressed(k) end -function exf.keyreleased(k) end -function exf.mousepressed(x, y, b) exf.list:mousepressed(x, y, b) end -function exf.mousereleased(x, y, b) exf.list:mousereleased(x, y, b) end - -function exf.load() - ProFi:stop() - ProFi:writeReport( 'light_world_profiling_report.txt' ) - - load = nil - love.update = exf.update - love.draw = exf.draw - love.keypressed = exf.keypressed - love.keyreleased = exf.keyreleased - love.mousepressed = exf.mousepressed - love.mousereleased = exf.mousereleased - - love.mouse.setVisible(true) - love.window.setTitle("LOVE Example Browser") - - lightWorld = LightWorld({ambient = {0.49, 0.49, 0.49}}) - lightMouse = lightWorld:newLight(20, 20, 1, 0.49, 0.24, 500) - lightMouse:setSmooth(2) - circleTest = lightWorld:newCircle(800 - 128, 600 - 128, exf.bigball:getWidth()*0.5) -end - -function exf.update(dt) - exf.list:update(dt) - lightMouse:setPosition(love.mouse.getX(), love.mouse.getY()) - lightWorld:update(dt) -end - -function exf.draw() - lightWorld:draw(function() - love.graphics.setBackgroundColor(0, 0, 0) - - love.graphics.setColor(0.18, 0.61, 1) - love.graphics.rectangle("fill", 0, 0, love.graphics.getWidth(), love.graphics.getHeight()) - - love.graphics.setColor(1, 1, 1, 1) - love.graphics.setFont(exf.bigfont) - love.graphics.print("Examples:", 50, 30) - - love.graphics.setFont(exf.smallfont) - love.graphics.print("Browse and click on the example you \nwant to run. To return the the example \nselection screen, press escape.", 500, 80) - - exf.list:draw() - - love.graphics.setColor(1, 1, 1) - love.graphics.draw(exf.bigball, 800 - 128, 600 - 128, love.timer.getTime()/5, 1, 1, exf.bigball:getWidth() * 0.5, exf.bigball:getHeight() * 0.5) - end) -end - -function exf.start(item, file) - love.load = exf.empty - love.update = exf.empty - love.draw = exf.empty - love.keypressed = exf.empty - love.keyreleased = exf.empty - love.mousepressed = exf.empty - love.mousereleased = exf.empty - - love.filesystem.load("examples/" .. file)() - love.graphics.setBackgroundColor(0,0,0) - love.graphics.setColor(1, 1, 1) - love.graphics.setLineWidth(1) - love.graphics.setLineStyle("smooth") - love.graphics.setBlendMode("alpha") - love.mouse.setVisible(true) - - local o_keypressed = love.keypressed - love.keypressed = function(k) - if k == "escape" then - exf.load() - end - o_keypressed(k) - end - - love.load() + mainlist.start("examples_list.lua") end