From fe2250b1dffc3b2541287fdb3c5363a545c83649 Mon Sep 17 00:00:00 2001 From: Tim Anema Date: Tue, 9 Nov 2021 20:15:14 -0500 Subject: [PATCH] clean up examples --- examples/animation.lua | 87 ++++----------- examples/complex.lua | 21 ++-- examples/examples_list.lua | 80 ++++++++++++++ examples/gamera.lua | 86 +++------------ examples/gfx/kingscard.jpeg | Bin 0 -> 80244 bytes examples/hump.lua | 86 +++------------ examples/lib/keyboard.lua | 32 ++++++ examples/lib/list.lua | 43 ++++++++ examples/normalMap.lua | 69 ++++-------- examples/postshaders.lua | 128 ++++++++-------------- examples/short.lua | 178 ------------------------------ examples/simple.lua | 51 +++++++++ examples/simple_tiled_impl.lua | 78 ++++--------- examples/vendor/list.lua | 193 --------------------------------- main.lua | 127 +--------------------- 15 files changed, 360 insertions(+), 899 deletions(-) create mode 100644 examples/examples_list.lua create mode 100644 examples/gfx/kingscard.jpeg create mode 100644 examples/lib/keyboard.lua create mode 100644 examples/lib/list.lua delete mode 100644 examples/short.lua create mode 100644 examples/simple.lua delete mode 100644 examples/vendor/list.lua 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 0000000000000000000000000000000000000000..c01e4ac1996a3706d4658c9c0cbeb02a658e4a02 GIT binary patch literal 80244 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 z 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%0D+n`G+ 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, 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