fixing light in the main list

This commit is contained in:
Tim Anema 2021-11-08 16:36:38 -05:00
parent eb964de9f9
commit d8ad342739
No known key found for this signature in database
GPG Key ID: 222D82A25F3857A4
7 changed files with 265 additions and 355 deletions

View File

@ -1,11 +1,8 @@
-- Example: Animation Example -- Example: Animation Example
local LightWorld = require "lib" local LightWorld = require "lib"
local anim8 = require 'lib.anim8' local anim8 = require 'lib.anim8'
local ProFi = require 'examples.vendor.ProFi'
function love.load() function love.load()
ProFi:start()
x, y, z, scale = 0, 0, 1, 1 x, y, z, scale = 0, 0, 1, 1
-- load images -- load images
image = love.graphics.newImage("examples/gfx/scott_pilgrim.png") image = love.graphics.newImage("examples/gfx/scott_pilgrim.png")

View File

@ -1,6 +1,5 @@
-- Example: Complex Example -- Example: Complex Example
local LightWorld = require "lib" local LightWorld = require "lib"
local ProFi = require 'examples.vendor.ProFi'
function initScene() function initScene()
-- physic world -- physic world
@ -30,8 +29,6 @@ function initScene()
end end
function love.load() function love.load()
ProFi:start()
love.graphics.setBackgroundColor(0, 0, 0) love.graphics.setBackgroundColor(0, 0, 0)
love.graphics.setDefaultFilter("nearest", "nearest") love.graphics.setDefaultFilter("nearest", "nearest")

View File

@ -1,10 +1,7 @@
-- Example: Short Example -- Example: Short Example
local LightWorld = require "lib" local LightWorld = require "lib"
local ProFi = require 'examples.vendor.ProFi'
function love.load() function love.load()
ProFi:start()
testShader = 0 testShader = 0
x = 0 x = 0
y = 0 y = 0

View File

@ -1,11 +1,8 @@
-- Example: STI Example -- Example: STI Example
local LightWorld = require "lib" local LightWorld = require "lib"
local sti = require 'examples.vendor.sti' local sti = require 'examples.vendor.sti'
local ProFi = require 'examples.vendor.ProFi'
function love.load() function love.load()
ProFi:start()
x = 0 x = 0
y = 0 y = 0
z = 1 z = 1

193
examples/vendor/list.lua vendored Normal file
View File

@ -0,0 +1,193 @@
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

375
main.lua
View File

@ -8,10 +8,10 @@
require "lib/postshader" require "lib/postshader"
local LightWorld = require "lib" local LightWorld = require "lib"
local ProFi = require 'examples.vendor.ProFi' local ProFi = require 'examples.vendor.ProFi'
local List = require 'examples.vendor.list'
exf = {} exf = {}
exf.current = nil exf.current = nil
exf.available = {} exf.available = {}
function love.load() function love.load()
@ -24,7 +24,7 @@ function love.load()
-- Find available demos. -- Find available demos.
local files = love.filesystem.getDirectoryItems("examples") local files = love.filesystem.getDirectoryItems("examples")
local n = 0 local n = 0
for i, v in ipairs(files) do for i, v in ipairs(files) do
is_file = (love.filesystem.getInfo("examples/".. v ).type == "file") is_file = (love.filesystem.getInfo("examples/".. v ).type == "file")
@ -37,135 +37,21 @@ function love.load()
local s, e, c = string.find(contents, "Example: ([%a%p ]-)[\r\n]") local s, e, c = string.find(contents, "Example: ([%a%p ]-)[\r\n]")
file:close(file) file:close(file)
if not c then c = "Untitled" end if not c then c = "Untitled" end
local title = exf.getn(n) .. " " .. c .. " (" .. v .. ")" local title = string.format("%04d", n) .. " " .. c .. " (" .. v .. ")"
exf.list:add(title, v) exf.list:add(title, v)
end end
end end
exf.list:done() exf.load()
exf.resume()
end end
function love.update(dt) end
function love.draw() end
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.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.update(dt) function exf.load()
exf.list:update(dt)
lightMouse:setPosition(love.mouse.getX(), love.mouse.getY())
end
function exf.draw()
lightWorld:draw(function()
love.graphics.setBackgroundColor(0, 0, 0)
love.graphics.setColor(48/255, 156/255, 225/255)
love.graphics.rectangle("fill", 0, 0, love.graphics.getWidth(), love.graphics.getHeight())
love.graphics.setColor(1, 1, 1, 191/255)
love.graphics.setFont(exf.bigfont)
love.graphics.print("Examples:", 50, 50)
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(), 1, 1, exf.bigball:getWidth() * 0.5, exf.bigball:getHeight() * 0.5)
end)
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.getn(n)
local s = ""
n = tonumber(n)
local r = n
if r <= 0 then error("Example IDs must be bigger than 0. (Got: " .. r .. ")") end
if r >= 10000 then error("Example IDs must be less than 10000. (Got: " .. r .. ")") end
while r < 1000 do
s = s .. "0"
r = r * 10
end
s = s .. n
return s
end
function exf.intable(t, e)
for k, v in ipairs(t) do
if v == e then return true end
end
return false
end
function exf.start(item, file)
local e_id = string.sub(item, 1, 4)
local e_rest = string.sub(item, 5)
local unused1, unused2, n = string.find(item, "(%s)%.lua")
if exf.intable(exf.available, file) then
if not love.filesystem.getInfo("examples/" .. file) then
print("Could not load game .. " .. file)
else
-- Clear all callbacks.
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)()
exf.clear()
--love.window.setTitle(e_rest)
-- Redirect keypress
local o_keypressed = love.keypressed
love.keypressed =
function(k)
if k == "escape" then
exf.resume()
end
o_keypressed(k)
end
love.load()
end
else
print("Example ".. e_id .. " does not exist.")
end
end
function exf.clear()
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)
end
function exf.resume()
ProFi:stop() ProFi:stop()
ProFi:writeReport( 'light_world_profiling_report.txt' ) ProFi:writeReport( 'light_world_profiling_report.txt' )
@ -180,220 +66,63 @@ function exf.resume()
love.mouse.setVisible(true) love.mouse.setVisible(true)
love.window.setTitle("LOVE Example Browser") love.window.setTitle("LOVE Example Browser")
-- create light world lightWorld = LightWorld({ambient = {0.49, 0.49, 0.49}})
lightWorld = LightWorld({ lightMouse = lightWorld:newLight(20, 20, 1, 0.49, 0.24, 500)
ambient = {127/255, 127/255, 127/255} lightMouse:setSmooth(2)
}) circleTest = lightWorld:newCircle(800 - 128, 600 - 128, exf.bigball:getWidth()*0.5)
-- create light
lightMouse = lightWorld:newLight(0, 0, 1, 127/255, 63/255, 500)
lightMouse:setSmooth(2)
-- create shadow bodys
circleTest = lightWorld:newCircle(800 - 128, 600 - 128, exf.bigball:getWidth()*0.5)
end end
function inside(mx, my, x, y, w, h) function exf.update(dt)
return mx >= x and mx <= (x+w) and my >= y and my <= (y+h) exf.list:update(dt)
lightMouse:setPosition(love.mouse.getX(), love.mouse.getY())
lightWorld:update(dt)
end end
function exf.draw()
lightWorld:draw(function()
love.graphics.setBackgroundColor(0, 0, 0)
---------------------- love.graphics.setColor(0.18, 0.61, 1)
-- List object love.graphics.rectangle("fill", 0, 0, love.graphics.getWidth(), love.graphics.getHeight())
----------------------
List = {} love.graphics.setColor(1, 1, 1, 1)
love.graphics.setFont(exf.bigfont)
love.graphics.print("Examples:", 50, 30)
function List:new() love.graphics.setFont(exf.smallfont)
o = {} love.graphics.print("Browse and click on the example you \nwant to run. To return the the example \nselection screen, press escape.", 500, 80)
setmetatable(o, self)
self.__index = self
o.items = {} exf.list:draw()
o.files = {}
o.x = 50 love.graphics.setColor(1, 1, 1)
o.y = 70 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)
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 end
function List:add(item, file) function exf.start(item, file)
table.insert(self.items, item) love.load = exf.empty
table.insert(self.files, file) love.update = exf.empty
end love.draw = exf.empty
love.keypressed = exf.empty
love.keyreleased = exf.empty
love.mousepressed = exf.empty
love.mousereleased = exf.empty
function List:done() love.filesystem.load("examples/" .. file)()
self.items.n = #self.items 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)
-- Recalc bar size. local o_keypressed = love.keypressed
self.bar_pos = 0 love.keypressed = function(k)
if k == "escape" then
local num_items = (self.height/self.item_height) exf.load()
local ratio = num_items/self.items.n
self.bar_size = self.height * ratio
self.bar_max_pos = self.height - self.bar_size - 3
-- Calculate height of everything.
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 o_keypressed(k)
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 end
love.graphics.setScissor(self.x, self.y, self.width, self.height) love.load()
-- 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 end