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,14 +1,14 @@
# light_world.lua # light_world.lua
This is the light modeling done by Priorblue [here](https://bitbucket.org/PriorBlue/love2d-light-and-shadow-engine), This is the light modeling done by Priorblue [here](https://bitbucket.org/PriorBlue/love2d-light-and-shadow-engine),
only it has been largely refactored and edited to allow for scaling and proper translation. only it has been largely refactored and edited to allow for scaling and proper translation.
*Supports love 11.2(master branch), 0.10.1(commit 414b9b74c0eb95bfb8b5e26a11caf2b32beccca0) *Supports love 11.2(master branch), 0.10.1(commit 414b9b74c0eb95bfb8b5e26a11caf2b32beccca0)
## Installation ## Installation
Copy and rename the lib folder into your project. Copy and rename the lib folder into your project.
## How to use ## How to use
```lua ```lua
@ -37,7 +37,7 @@ function love.draw()
end end
``` ```
For more information please check out the [wiki](https://github.com/tanema/light_world.lua/wiki) and see the examples directory to see how it is fully used. This project can be run with love to see the demonstrations in action. For more information please check out the [wiki](https://github.com/tanema/light_world.lua/wiki) and see the examples directory to see how it is fully used. This project can be run with love to see the demonstrations in action.
### Gamera & HUMP ### Gamera & HUMP
There are example in the example directory how to use both of these with the library. There are example in the example directory how to use both of these with the library.
@ -61,14 +61,14 @@ There are example in the example directory how to use both of these with the lib
* chromatic aberration [Preview](http://onepixelahead.de/love2d_polyshadow16.gif) * chromatic aberration [Preview](http://onepixelahead.de/love2d_polyshadow16.gif)
* postshader with many included postshaders, plus easy to extend * postshader with many included postshaders, plus easy to extend
* animations in tandem with normal maps thanks to [anim8](https://github.com/kikito/anim8) * animations in tandem with normal maps thanks to [anim8](https://github.com/kikito/anim8)
## License ## License
A License has been included in this project A License has been included in this project
## Contributors ## Contributors
- Jon @xiejiangzhi - Jon @xiejiangzhi
- Brandon Blanker Lim-it @flamendless - Brandon Blanker Lim-it @flamendless
- @Azorlogh - @Azorlogh
- Gustavo Kishima @gukiboy - Gustavo Kishima @gukiboy
- Rose L. Liverman @TangentFoxy - Rose L. Liverman @TangentFoxy

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")
@ -83,7 +80,7 @@ function love.draw()
love.graphics.setColor(255, 255, 255) love.graphics.setColor(255, 255, 255)
love.graphics.rectangle("fill", -x/scale, -y/scale, love.graphics.getWidth()/scale, love.graphics.getHeight()/scale) love.graphics.rectangle("fill", -x/scale, -y/scale, love.graphics.getWidth()/scale, love.graphics.getHeight()/scale)
animation:drawAnimation() animation:drawAnimation()
animation2:draw(image, 200, 30) animation2:draw(image, 200, 30)
end) end)
love.graphics.pop() love.graphics.pop()

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
@ -34,9 +31,9 @@ function love.load()
rectangleTest = lightWorld:newRectangle(512, 512, 64, 64) rectangleTest = lightWorld:newRectangle(512, 512, 64, 64)
local px, py, pw, ph = 100, 200, 20, 50 local px, py, pw, ph = 100, 200, 20, 50
polygonTest = lightWorld:newPolygon( polygonTest = lightWorld:newPolygon(
px, py, px, py,
px+pw, py, px+pw, py,
px+pw, py+ph, px+pw, py+ph,
px-50, py+ph) px-50, py+ph)
imageTest = lightWorld:newImage(image, 64, 64, 24, 6) imageTest = lightWorld:newImage(image, 64, 64, 24, 6)
@ -104,7 +101,7 @@ function love.update(dt)
x = x + dt * 200 x = x + dt * 200
end end
if love.keyboard.isDown("k") then if love.keyboard.isDown("k") then
polygonTest:move(0, -(dt * 200)) polygonTest:move(0, -(dt * 200))
elseif love.keyboard.isDown("j") then elseif love.keyboard.isDown("j") then
@ -124,7 +121,7 @@ function love.update(dt)
if love.keyboard.isDown("s") then if love.keyboard.isDown("s") then
polygonTest:rotate(0.05) polygonTest:rotate(0.05)
elseif love.keyboard.isDown("d") then elseif love.keyboard.isDown("d") then
polygonTest:rotate(-0.05) polygonTest:rotate(-0.05)
end end
if love.keyboard.isDown("-") then if love.keyboard.isDown("-") then
@ -132,7 +129,7 @@ function love.update(dt)
elseif love.keyboard.isDown("=") then elseif love.keyboard.isDown("=") then
scale = scale + 0.01 scale = scale + 0.01
end end
colorAberration = math.max(0.0, colorAberration - dt * 10.0) colorAberration = math.max(0.0, colorAberration - dt * 10.0)
if colorAberration > 0.0 then if colorAberration > 0.0 then
lightWorld.post_shader:addEffect("blur", 2.0, 2.0) lightWorld.post_shader:addEffect("blur", 2.0, 2.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
@ -26,13 +23,13 @@ function love.load()
-- walls -- walls
lightWorld:newRectangle(400, 32, 800, 64):setNormalMap(image_normal, 800, 64) lightWorld:newRectangle(400, 32, 800, 64):setNormalMap(image_normal, 800, 64)
lightWorld:newRectangle(32, 272, 64, 416):setNormalMap(image_normal, 64, 416) lightWorld:newRectangle(32, 272, 64, 416):setNormalMap(image_normal, 64, 416)
lightWorld:newRectangle(400, 464, 800, 32):setNormalMap(image_normal, 800, 32) lightWorld:newRectangle(400, 464, 800, 32):setNormalMap(image_normal, 800, 32)
lightWorld:newRectangle(784, 272, 32, 416):setNormalMap(image_normal, 32, 416) lightWorld:newRectangle(784, 272, 32, 416):setNormalMap(image_normal, 32, 416)
--blocks --blocks
lightWorld:newRectangle(224, 256, 128, 124):setNormalMap(image_normal, 128, 124) lightWorld:newRectangle(224, 256, 128, 124):setNormalMap(image_normal, 128, 124)
lightWorld:newRectangle(592, 224, 224, 64):setNormalMap(image_normal, 224, 64) lightWorld:newRectangle(592, 224, 224, 64):setNormalMap(image_normal, 224, 64)
end end
function love.update(dt) function love.update(dt)

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