mirror of
https://github.com/tanema/light_world.lua.git
synced 2024-12-24 20:24:19 +00:00
fixing light in the main list
This commit is contained in:
parent
eb964de9f9
commit
d8ad342739
16
README.md
16
README.md
@ -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
|
||||||
|
@ -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()
|
||||||
|
@ -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")
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
@ -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
193
examples/vendor/list.lua
vendored
Normal 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
375
main.lua
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user