Update for LOVE 11.0

Fixed color
Fixed canvas being accessed while enabled
Fixed screenshots
Updated love.run
Removed shader workaround
Removed usage of depreciated apis
Fixed cart argument

Not thoroughly tested but does atleast run and look correct.
This commit is contained in:
gamax92 2018-04-09 16:17:01 -06:00
parent 7850bae68b
commit 110189bb09
6 changed files with 81 additions and 69 deletions

View File

@ -23,7 +23,7 @@ local typecheck = {
Returns the correct alFormat enum value for the given SoundData.
]]
local function getALFormat(data)
local stereo = data:getChannels() == 2
local stereo = data:getChannelCount() == 2
local deep = data:getBitDepth() == 16
if (stereo) then

65
api.lua
View File

@ -7,7 +7,7 @@ scrblitMesh:setAttributeEnabled("VertexColor", true)
local function color(c)
c=flr(c or 0)%16
pico8.color=c
love.graphics.setColor(c, 0, 0, 255)
setColor(c)
end
local function warning(msg)
@ -64,7 +64,7 @@ function api.cls(c)
pico8.clip=nil
love.graphics.setScissor()
love.graphics.clear(c, 0, 0, 255)
love.graphics.clear(c/15, 0, 0, 1)
pico8.cursor={0, 0}
end
@ -104,8 +104,10 @@ function api.pget(x, y)
x=x-pico8.camera_x
y=y-pico8.camera_y
if x>=0 and x<pico8.resolution[1] and y>=0 and y<pico8.resolution[2] then
local r, g, b, a=pico8.screen:newImageData():getPixel(flr(x), flr(y))
return r
love.graphics.setCanvas()
local c=pico8.screen:newImageData():getPixel(flr(x), flr(y))*15
love.graphics.setCanvas(pico8.screen)
return c
end
warning(string.format("pget out of screen %d, %d", x, y))
return 0
@ -133,14 +135,14 @@ function api.print(str, x, y, col)
if not x and not y then
if pico8.cursor[2]+size>122 then
love.graphics.setShader()
love.graphics.setColor(255, 255, 255, 255)
love.graphics.setColor(1, 1, 1, 1)
love.graphics.setCanvas(pico8.tmpscr)
love.graphics.draw(pico8.screen)
love.graphics.setCanvas(pico8.screen)
love.graphics.draw(pico8.tmpscr, 0, -size)
love.graphics.setColor(0, 0, 0, 255)
love.graphics.setColor(0, 0, 0, 1)
love.graphics.rectangle("fill", 0, pico8.resolution[2]-size, pico8.resolution[1], size)
love.graphics.setColor(pico8.color, 0, 0, 255)
setColor(pico8.color)
else
pico8.cursor[2]=pico8.cursor[2]+size
end
@ -488,8 +490,8 @@ function api.sget(x, y)
x=flr(x)
y=flr(y)
if x>=0 and x<128 and y>=0 and y<128 then
local r, g, b, a=pico8.spritesheet_data:getPixel(x, y)
return r
local c=pico8.spritesheet_data:getPixel(x, y)*15
return c
end
return 0
end
@ -499,7 +501,7 @@ function api.sset(x, y, c)
y=flr(y)
c=flr(c or 0)%16
if x>=0 and x<128 and y>=0 and y<128 then
pico8.spritesheet_data:setPixel(x, y, c, 0, 0, 255)
pico8.spritesheet_data:setPixel(x, y, c/15, 0, 0, 1)
pico8.spritesheet:refresh()
end
end
@ -601,8 +603,8 @@ function api.peek(addr)
if addr<0 then
return 0
elseif addr<0x2000 then
local lo=pico8.spritesheet_data:getPixel(addr*2%128, flr(addr/64))
local hi=pico8.spritesheet_data:getPixel(addr*2%128+1, flr(addr/64))
local lo=pico8.spritesheet_data:getPixel(addr*2%128, flr(addr/64))*15
local hi=pico8.spritesheet_data:getPixel(addr*2%128+1, flr(addr/64))*15
return hi*16+lo
elseif addr<0x3000 then
addr=addr-0x2000
@ -647,8 +649,17 @@ function api.peek(addr)
-- FIXME: Unused but memory
elseif addr<0x8000 then
addr=addr-0x6000
local lo=(__scrimg or pico8.screen:newImageData()):getPixel(addr*2%128, flr(addr/64))
local hi=(__scrimg or pico8.screen:newImageData()):getPixel(addr*2%128+1, flr(addr/64))
local lo, hi
if __scrimg then
lo=__scrimg:getPixel(addr*2%128, flr(addr/64))*15
hi=__scrimg:getPixel(addr*2%128+1, flr(addr/64))*15
else
love.graphics.setCanvas()
local tmpscr = pico8.screen:newImageData()
lo=tmpscr:getPixel(addr*2%128, flr(addr/64))*15
hi=tmpscr:getPixel(addr*2%128+1, flr(addr/64))*15
love.graphics.setCanvas(pico8.screen)
end
return hi*16+lo
end
return 0
@ -661,13 +672,13 @@ function api.poke(addr, val)
elseif addr<0x1000 then
local lo=val%16
local hi=flr(val/16)
pico8.spritesheet_data:setPixel(addr*2%128, flr(addr/64), lo, 0, 0, 255)
pico8.spritesheet_data:setPixel(addr*2%128+1, flr(addr/64), hi, 0, 0, 255)
pico8.spritesheet_data:setPixel(addr*2%128, flr(addr/64), lo/15, 0, 0, 1)
pico8.spritesheet_data:setPixel(addr*2%128+1, flr(addr/64), hi/15, 0, 0, 1)
elseif addr<0x2000 then
local lo=val%16
local hi=flr(val/16)
pico8.spritesheet_data:setPixel(addr*2%128, flr(addr/64), lo, 0, 0, 255)
pico8.spritesheet_data:setPixel(addr*2%128+1, flr(addr/64), hi, 0, 0, 255)
pico8.spritesheet_data:setPixel(addr*2%128, flr(addr/64), lo/15, 0, 0, 1)
pico8.spritesheet_data:setPixel(addr*2%128+1, flr(addr/64), hi/15, 0, 0, 1)
pico8.map[flr(addr/128)][addr%128]=val
elseif addr<0x3000 then
addr=addr-0x2000
@ -718,14 +729,14 @@ function api.poke(addr, val)
local lo=val%16
local hi=flr(val/16)
if __scrblit then
table.insert(__scrblit, {addr*2%128, flr(addr/64), 0, 0, lo, 0, 0, 255})
table.insert(__scrblit, {addr*2%128+1, flr(addr/64), 0, 0, hi, 0, 0, 255})
table.insert(__scrblit, {addr*2%128, flr(addr/64), 0, 0, lo/15, 0, 0, 1})
table.insert(__scrblit, {addr*2%128+1, flr(addr/64), 0, 0, hi/15, 0, 0, 1})
else
love.graphics.setColor(lo, 0, 0, 255)
setColor(lo)
love.graphics.point(addr*2%128, flr(addr/64))
love.graphics.setColor(hi, 0, 0, 255)
setColor(hi)
love.graphics.point(addr*2%128+1, flr(addr/64))
love.graphics.setColor(pico8.color, 0, 0, 255)
setColor(pico8.color)
end
end
end
@ -754,6 +765,7 @@ function api.memcpy(dest_addr, source_addr, len)
-- Screen Hack
if source_addr+len-1>=0x6000 then
love.graphics.setCanvas()
__scrimg=pico8.screen:newImageData()
end
if dest_addr+len-1>=0x6000 then
@ -774,12 +786,15 @@ function api.memcpy(dest_addr, source_addr, len)
api.poke(i, api.peek(i-offset))
end
end
if __scrimg then
love.graphics.setCanvas(pico8.screen)
end
if __scrblit then
scrblitMesh:setVertices(__scrblit)
scrblitMesh:setDrawRange(1, #__scrblit)
love.graphics.setColor(255, 255, 255, 255)
love.graphics.setColor(1, 1, 1, 1)
love.graphics.draw(scrblitMesh)
love.graphics.setColor(pico8.color, 0, 0, 255)
setColor(pico8.color)
end
__scrblit, __scrimg=nil
end

View File

@ -86,11 +86,10 @@ function cart.load_p8(filename)
local header=love.filesystem.read(filename, 8)
if header=="\137PNG\r\n\26\n" then
local img=love.graphics.newImage(filename)
if img:getWidth()~=160 or img:getHeight()~=205 then
local data=love.image.newImageData(filename)
if data:getWidth()~=160 or data:getHeight()~=205 then
error("Image is the wrong size")
end
local data=img:getData()
local outX=0
local outY=0
@ -104,6 +103,7 @@ function cart.load_p8(filename)
for y=0, 204 do
for x=0, 159 do
local r, g, b, a=data:getPixel(x, y)
r, g, b, a=r*255, g*255, b*255, a*255
-- extract lowest bits
r=bit.band(r, 0x0003)
g=bit.band(g, 0x0003)
@ -122,9 +122,9 @@ function cart.load_p8(filename)
mapY=mapY+1
end
end
pico8.spritesheet_data:setPixel(outX, outY, lo, 0, 0, 255)
pico8.spritesheet_data:setPixel(outX, outY, lo/15, 0, 0, 1)
outX=outX+1
pico8.spritesheet_data:setPixel(outX, outY, hi, 0, 0, 255)
pico8.spritesheet_data:setPixel(outX, outY, hi/15, 0, 0, 1)
outX=outX+1
if outX==128 then
outY=outY+1
@ -240,7 +240,7 @@ function cart.load_p8(filename)
local col=0
for v in line:gmatch(".") do
v=tonumber(v, 16)
pico8.spritesheet_data:setPixel(col, row, v, 0, 0, 255)
pico8.spritesheet_data:setPixel(col, row, v/15, 0, 0, 1)
col=col+1
if col==128 then break end
@ -256,8 +256,8 @@ function cart.load_p8(filename)
for sy=64, 127 do
for sx=0, 127, 2 do
-- get the two pixel values and merge them
local lo=pico8.spritesheet_data:getPixel(sx, sy)
local hi=pico8.spritesheet_data:getPixel(sx+1, sy)
local lo=pico8.spritesheet_data:getPixel(sx, sy)*15
local hi=pico8.spritesheet_data:getPixel(sx+1, sy)*15
local v=bit.bor(bit.lshift(hi, 4), lo)
pico8.map[ty][tx]=v
shared=shared+1

View File

@ -1,6 +1,6 @@
function love.conf(t)
t.identity="picolove"
t.version="0.10.1"
t.version="11.0"
t.window.title="picolove"
t.window.width=580

View File

@ -101,6 +101,7 @@ function gif:frame(data)
for y=y0, y1 do
for x=x0, x1 do
local r, g, b=data:getPixel(x, y)
r, g, b=r*255, g*255, b*255
local index=string.char(palmap[bit.lshift(r, 16)+bit.lshift(g, 8)+b])
local temp=buffer..index
if codetbl[temp] then

View File

@ -93,7 +93,7 @@ log=print
--log=function() end
function shdr_unpack(thing)
return unpack(thing, 0, 16) -- change to 15 once love2d bug is fixed
return unpack(thing, 0, 15)
end
local function get_bits(v, s, e)
@ -109,11 +109,15 @@ function restore_clip()
end
end
function setColor(c)
love.graphics.setColor(c/15, 0, 0, 1)
end
local exts={"", ".p8", ".p8.png", ".png"}
function _load(filename)
filename=filename or cartname
for i=1, #exts do
if love.filesystem.exists(filename..exts[i]) then
if love.filesystem.getInfo(filename..exts[i]) ~= nil then
filename=filename..exts[i]
break
end
@ -127,7 +131,7 @@ function _load(filename)
love.graphics.setScissor()
api.pal()
pico8.color=6
love.graphics.setColor(6, 0, 0, 255)
setColor(pico8.color)
love.graphics.setCanvas(pico8.screen)
love.graphics.setShader(pico8.draw_shader)
@ -285,9 +289,9 @@ function love.load(argv)
extern float palette[16];
vec4 effect(vec4 color, Image texture, vec2 texture_coords, vec2 screen_coords) {
int index=int(color.r*255.0+0.5);
int index=int(color.r*15.0+0.5);
ifblock(palette);
return vec4(palette[index]/255.0, 0.0, 0.0, 1.0);
return vec4(palette[index]/15.0, 0.0, 0.0, 1.0);
}]]))
pico8.draw_shader:send('palette', shdr_unpack(pico8.draw_palette))
@ -296,10 +300,10 @@ extern float palette[16];
extern float transparent[16];
vec4 effect(vec4 color, Image texture, vec2 texture_coords, vec2 screen_coords) {
int index=int(Texel(texture, texture_coords).r*255.0+0.5);
int index=int(Texel(texture, texture_coords).r*15.0+0.5);
ifblock(palette);
ifblock(transparent);
return vec4(palette[index]/255.0, 0.0, 0.0, transparent[index]);
return vec4(palette[index]/15.0, 0.0, 0.0, transparent[index]);
}]]))
pico8.sprite_shader:send('palette', shdr_unpack(pico8.draw_palette))
pico8.sprite_shader:send('transparent', shdr_unpack(pico8.pal_transparent))
@ -309,9 +313,9 @@ extern float palette[16];
vec4 effect(vec4 color, Image texture, vec2 texture_coords, vec2 screen_coords) {
vec4 texcolor=Texel(texture, texture_coords);
int index=int(color.r*255.0+0.5);
int index=int(color.r*15.0+0.5);
ifblock(palette);
return vec4(palette[index]/255.0, 0.0, 0.0, texcolor.a);
return vec4(palette[index]/15.0, 0.0, 0.0, texcolor.a);
}]]))
pico8.text_shader:send('palette', shdr_unpack(pico8.draw_palette))
@ -319,7 +323,7 @@ vec4 effect(vec4 color, Image texture, vec2 texture_coords, vec2 screen_coords)
extern vec4 palette[16];
vec4 effect(vec4 color, Image texture, vec2 texture_coords, vec2 screen_coords) {
int index=int(Texel(texture, texture_coords).r*255.0+0.5);
int index=int(Texel(texture, texture_coords).r*15.0+0.5);
ifblock(palette);
// lookup the colour in the palette by index
return palette[index]/255.0;
@ -331,7 +335,7 @@ vec4 effect(vec4 color, Image texture, vec2 texture_coords, vec2 screen_coords)
gif=require("gif")
-- load the cart
_load(argv[2] or 'nocart.p8')
_load(argv[1] or 'nocart.p8')
end
local function inside(x, y, x0, y0, w, h)
@ -434,14 +438,14 @@ function flip_screen()
if gif_recording then
love.graphics.setCanvas(gif_canvas)
love.graphics.draw(pico8.screen, 0, 0, 0, 2, 2)
gif_recording:frame(gif_canvas:newImageData())
love.graphics.setCanvas()
gif_recording:frame(gif_canvas:newImageData())
end
-- draw touchscreen overlay
if mobile then
local col=(love.graphics.getColor())
love.graphics.setColor(255, 255, 255, 255)
love.graphics.setColor(1, 1, 1, 1)
love.graphics.setShader()
local keys=pico8.keypressed[0]
@ -451,7 +455,7 @@ function flip_screen()
love.graphics.rectangle(keys[1] and "fill" or "line", tobase*2+topad*3, screen_h-tobase*3-topad, tobase, tobase, topad, topad)
love.graphics.circle(keys[4] and "fill" or "line", screen_w-tobase*8/3, screen_h-tobase*3/2, tobase/2)
love.graphics.circle(keys[5] and "fill" or "line", screen_w-tobase, screen_h-tobase*2, tobase/2)
love.graphics.setColor(col, 0, 0, 255)
love.graphics.setColor(col, 0, 0, 1)
end
love.graphics.present()
@ -620,9 +624,8 @@ function love.keypressed(key)
paused=not paused
elseif key=='f1' or key=='f6' then
-- screenshot
local screenshot=love.graphics.newScreenshot(false)
local filename=cartname..'-'..os.time()..'.png'
screenshot:encode(filename)
love.graphics.captureScreenshot(filename)
log('saved screenshot to', filename)
elseif key=='f3' or key=='f8' then
-- start recording
@ -681,11 +684,7 @@ function love.run()
math.randomseed(os.time())
for i=1, 3 do math.random() end
if love.event then
love.event.pump()
end
if love.load then love.load(arg) end
if love.load then love.load(love.arg.parseGameArguments(arg), arg) end
-- We don't want the first frame's dt to include time taken by love.load.
if love.timer then love.timer.step() end
@ -693,28 +692,24 @@ function love.run()
local dt=0
-- Main loop time.
while true do
return function()
-- Process events.
if love.event then
love.graphics.setCanvas() -- TODO: Rework this
love.event.pump()
for e, a, b, c, d in love.event.poll() do
if e=="quit" then
love.graphics.setCanvas(pico8.screen) -- TODO: Rework this
for name, a, b, c, d, e, f in love.event.poll() do
if name == "quit" then
if not love.quit or not love.quit() then
if love.audio then
love.audio.stop()
end
return
return a or 0
end
end
love.handlers[e](a, b, c, d)
love.handlers[name](a, b, c, d, e, f)
end
end
-- Update dt, as we'll be passing it to update
if love.timer then
love.timer.step()
dt=dt+love.timer.getDelta()
end
if love.timer then dt=dt+love.timer.step() end
-- Call update and draw
local render=false
@ -726,9 +721,10 @@ function love.run()
end
dt=dt-frametime
render=true
end
if render and love.window and love.graphics and love.window.isCreated() then
if render and love.graphics and love.graphics.isActive() then
love.graphics.origin()
if paused then
api.rectfill(64-4*4, 60, 64+4*4-2, 64+4+4, 1)