Skip to content

Instantly share code, notes, and snippets.

Created September 15, 2017 22:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save anonymous/bf060f06c10fc42b9854f838a9c94b91 to your computer and use it in GitHub Desktop.
Save anonymous/bf060f06c10fc42b9854f838a9c94b91 to your computer and use it in GitHub Desktop.
pico8_vector_test
-- https://www.lexaloffle.com/bbs/?pid=34264&tid=28312
function _init()
hexchar="0123456789abcdef"
function hex(x)
x=flr(x)+1
return sub(hexchar,x,x)
end
charhex={}
for i=1,16 do
charhex[sub(hexchar,i,i)]=i-1
end
vectordata = strtovec("{{{0000{79749874ac877974ac87ada1ada195e88eb67974ada18eb679748eb677d2797477d273e7797473e76bb3}}{0a0a{7b756b65644e7b75644e7e437b757e4398407b75984098757b759875897c}}{0a07{75517a5c766f7551766f706b}}{0404{6f35813083456f358345764a}}{0000{6e2e7f2b81316e2e81317035}}{0404{663d6e3a7249663d7249694b}}{0a09{844794658859784a84478859}}{0000{b145b567ab63b145ab63a7549741b145a7549741a7549851}}}{{0000{6eb2777f9d876eb29d87a89058c36eb2a89058c3a890adb0d3eabce7bdd9adb0d3eabdd9adb0bdd989ba58c3adb089ba58c389ba61d458c361d464e658c364e659e7}}{0a0a{7a816870655c7a81655c7b4a7a817b4a9c4a7a819c4aa5657a81a5659d887a819d888d8d}}{0a07{755b7a5e737b755b737b6c75}}{0a09{7b4b8e4b94597b4b94599572}}{0404{764e824e8459764e84597957}}{0404{78388a388d4a78388d4a7c4c}}{0000{773287318938773289387a3b}}{0000{ac52ae80a97cac52a97ca2569d4aac52a256}}{0002{82ae85bc63d482ae63d45bd4}}{0404{a771ac6eae7da771ae7da77a}}}{{0000{6cd369d166ae6cd366ae727b6cd3727b8d8d8d8da285b3bd8d8db3bdb0d7a8ddaee9a5e5a8dda5e5a4cbb0d7a8dda4cb8d8db0d7a4cb8d8da4cb9ac78d8d9ac78bb08d8d8bb082b06cd38d8d82b06cd382b06ee9}}{0002{7faa8faa91b57faa91b585b07faa85b075d57faa75d56dd27faa6dd26dc8}}{0a0a{6a6d6a86606875686a6d6068756860686c5475686c54854f7568854f985275689852a7597568a759a5757568a5759d8575689d858f9175688f91767e}}{0404{667f6b816e89667f6e896789}}{0a09{8658854f9853865898538f77}}{0404{883a983b9752883a97528650}}{0000{87359836993c8735993c873b}}{0a09{6d5272566168}}{0000{9e6fa85aa77595719e6fa7759571a7759e83}}{0404{9070976b9a7090709a709476}}{0002{b0dba9dbafb4b0dbafb4b4c5}}}{{0000{69ad6792747b69ad747b8a8b69ad8a8b9e849e84aca7a9c0a9c08cda94b49e84a9c094b49e8494b489a969ad9e8489a987cf8be67dd689a987cf7dd689a97dd67cc069ad89a97cc0}}{0002{7db68ca588d7}}{0002{93d496baa0ad93d4a0adaaa993d4aaa9aac1}}{0a0a{64835f6a66576657794e995166579951aa646657aa649f869f868a8e757b9f86757b736266579f86736266577362696a64836657696a}}{0404{6079687e6886607968866084}}{0000{9384966c9b779b77a16dab6693849b77ab669384ab66a083}}{0a09{826d89509953826d99538f78826d8f788778}}{0404{8a3e9a409b528a3e9b528a51}}{0000{8c3a9b3b9b418c3a9b418c41}}{0404{8e689b689b718e689b719272}}}{{0a0a{6d6f6262654c654c794bac63654cac639e899e898893727f9e89727f7962654c9e897962654c79626b5f6d6f654c6b5f}}{0000{6c96737d8891889195839d8a88919d8aa6986c968891a6986c96a698a7a86c96a7a898c36c9698c397d36c9697d38de08de092e87fe58de07fe57dd28de07dd280c76c968de080c76c9680c770b0}}{0a09{8d549f5d8c798d548c797c71}}{0404{676b6e687173676b71736973}}{0000{9f6fae63a580916a9f6fa580916aa5809a85}}{0404{8c6d916496698c6d96699371}}{0404{8e44a1479d5d8e449d5d8b58}}{0000{8f3da242a1478f3da1478d46}}{0002{89ba89a4919b89ba919b99af89ba99afa5a989baa5a993cb}}}{{0000{6fd66fe865db6fd665db6cb46fd66cb4709770976984757d6fd67097757d6fd6757d89906fd6899099849984aaaaa5d49984a5d4a7e89984a7e89ed999849ed99acb99849acb88b76fd6998488b7}}{0a0a{6e566762615c6e56615c644d785c6e56644d785c644d7046785c7046915b777f785c915b777f915bac63777fac639885777f9885878f}}{0404{615f6c5f6d68615f6d686669}}{0a09{7c738e619e637c739e6399717c7399718b7d}}{0000{a371ac64b67e9973a371b67e9973b67eb083}}{0404{956ba16f9b79956b9b798f76}}{0404{8e4f9e4f9f638e4f9f638e5f}}{0000{8d489e4a9f508d489f508e4f}}{0002{78b387a489b678b389b66fd6}}{0002{a2c1a1abaaaca2c1aaaca7e4a2c1a7e49acc}}}{{0000{72a26a8f778372a2778389934bd672a289934bd689939a8a9a8abeccc1e8c1e8b2e7b7de9a8ac1e8b7de9a8ab7de8cb84bd69a8a8cb84bd68cb85cd34bd65cd359dd4bd659dd60e94bd660e94ae3}}{0a0a{6e575b63555d6e57555d714877626e577148776271488d58778477628d5877848d58af667784af669b8a77849b8a8997}}{0404{565a5d63556a565a556a5064}}{0a09{8e58a05f947b8e58947b897f8e58897f8074}}{0404{8e50a0519d6a8e509d6a8c62}}{0000{904ba04ca152904ba1528d51}}{0002{a0aa9a8bbdcca0aabdcca0be}}{0002{7ea78bb86ebe}}{0000{ac7da272ad64ac7dad64bd72ac7dbd72b780}}{0404{9e6ca56da4789e6ca4789b74}}}{{0000{66e060e651e866e051e861d666e061d65bc366e05bc364b866e064b866a566e066a5757f88919a85b8cd757f8891b8cd757fb8cdb6dbb6dbc2e8b2e8757fb6dbb2e8757fb2e89abf757f9abf8cb6757f8cb669cd66e0757f69cd}}{0a0a{79635f5f5d5279635d52835778827963835778828357a4627882a4629b8678829b868892}}{0404{5d57675b67655d5767655a60}}{0a09{8759965e897d8759897d7c73}}{0404{864f98529666864f96668866}}{0000{844c954d9752844c97528552}}{0000{a567c677cd93a567cd93b87da567b87d9b78a5679b789c68}}{0404{c18bcc8ad698c18bd698ca95}}{0002{64cb6db67bb064cb7bb088bb64cb88bb69cf}}{0002{938a9c88b4c5938ab4c5a1b6}}}{{0000{84d664ae718784d67187868e84d6868e988284d69882a596a596a0b896be84d6a59696be84d696be95cc7fdc84d695cc7fdc95cc8ed97fdc8ed991e67fdc91e682e5}}{0a0a{676e58655e5d7683676e5e5d76835e5d785f7683785f8f61738876838f6173888f619e6373889e639a8473889a84878e}}{0a09{7b5f8e618a817b5f8a81797d}}{0000{977995699d6597799d65b86c9779b86cd680d680d188ba7e9779d680ba7e}}{0404{6b59745876626b5976626e64}}{0404{765188508c6376518c637a64}}{0000{784b874d8952784b89527852}}{0002{9b8ca3a49bbb9b8c9bbb90b8}}{0002{8ed992e688e7}}{0404{cf8ad480d984cf8ad984d68e}}}{{0000{79e576d67bc77bc767b567a77bc767a778847bc77884898e79e57bc7898e79e5898e998179e59981a49b79e5a49b90c590c596d091e690c591e689e890c589e889de90c589de86d679e590c586d679e586d683db79e583db85e6}}{0a0a{6b6d576f5f636b6d5f636f5c77866b6d6f5c77866f5c7763778677638b6377868b63935d7786935d9e6377869e639778778697789b8277869b828a8e}}{0a09{79638b638a8479638a847a80}}{0404{785088508a6378508a637864}}{0000{784c884b8a52784c8a527852}}{0404{6e5c775a79626e5c79626f63}}{0000{956b9a65b968956bb968d27bd27bcd86b878956bd27bb878956bb8789679}}{0404{cd7cd47fcb8bcd7ccb8bc882}}{0002{9b86a69f96ba9b8696ba8fc3}}{0002{8ce590da92e4}}{0002{82cf85d881e4}}}{{0000{6bd363b867976bd3679771886bd371888e8c6bd38e8c9b809b80a595a1a4a1a4a7ada5df9b80a1a4a5dfa5df9de49fd99b80a5df9fd99b809fd998d59b8098d593b99b8093b984af9b8084af77c06bd39b8077c06bd377c078d26bd378d264e5}}{0a0a{74896367796074897960895f7489895f975d7489975d9883748998838c8e}}{0a09{7a638a61907f7a63907f8981}}{0000{965cb259b370965cb3709970}}{0404{754f864e8a61754f8a617a63}}{0000{744b8548864f744b864f7652}}{0002{97819d84a2999781a2999388}}{0002{9ec198a9a0a79ec1a0a7a6c7}}{0a07{71837169796671837966758b}}{0404{6d5f7660776a6d5f776a706b}}{0404{a562ac61ad6da562ad6da36c}}}{{0000{65e75ae75dd965e75dd955ca65e755ca5db365e75db365b065e765b0718987909982a2928790a292a0ab71898790a0ab7189a0abb1bb7189b1bbbeda7189bedabfe7bfe7a9e7b1e0bfe7b1e0a0c87189bfe7a0c87189a0c87fb471897fb46ad065e771896ad0}}{0a0a{69816a667859698178599e5269819e529c8269819c82859369818593728c}}{0a09{7b5a9156927c7b5a927c8677}}{0404{794589438f5979458f597f5a}}{0000{7840873e8944784089447a47}}{0404{9a77a27a9e869a779e869483}}{0a07{6a8376817e896a837e89728b}}{0404{7878827e7e8978787e897582}}{0002{71b07fb66ecb71b06ecb64c5}}{0002{97b59caba5b097b5a5b09cb9}}}{{0000{66e85de765d765d75dc26ea666e865d76ea66ea66f78888866e86ea688888888987dacc8acc8b4ccb2e78888acc8b2e7b2e7a7e8aad98888b2e7aad98888aad983b1888883b16ed266e888886ed266e86ed26fdb}}{0002{6cbe78a982b46cbe82b470ca}}{0002{abc4b1d1b1e0abc4b1e0a3c1}}{0a0a{757b778f698f757b698f6861757b6861814f757b814f954d757b954da454757ba4549a80757b9a80888b}}{0a09{81559252946b8155946b9074}}{0404{7f418e3f91527f4191528357}}{0000{7e388d388e3f7e388e3f7e40}}{0404{99759e6da6749975a674a07b}}{0404{698874877a9269887a926d94}}}{{0000{81e377e87bdd81e37bdd6bc481e36bc4688881e368886f7381e36f737d807d80877c8f7f8f7f9277a8947d808f7fa8947d80a894a6bd9fd299e792dda6bd9fd292dda6bd92dd95d1a6bd95d18fab7d80a6bd8fab7d808fab84a27d8084a280c181e37d8080c1}}{0a0a{67825f8459625962704d8348596283489f4f59629f4fa6609967977c858699678586707aa6609967707aa660707a6e625962a6606e6259626e62656f67825962656f}}{0a09{844a964f8c6d844a8c6d8066}}{0404{84369436954e8436954e854c}}{0000{9964a55dac689964ac68a9789964a978a174}}{0404{9464995aa2609464a2609d69}}{0404{5e8168826a8c5e816a8c628a}}{0002{989ca89ea1c6989ca1c69ab4}}{0002{7ab383a581c67ab381c679c3}}{0000{83309531933783309337853a}}}{{0000{85e18fe778e786d685e178e786d678e77ad186d67ad1669186d666916e7286d66e72807c86d6807c8e778e77a69a9ab88e779ab88cbf86d68e778cbf86d68cbf8ed2}}{0002{89c07da6819089c081908faf89c08faf9a9b89c09a9ba39989c0a39999b6}}{0a0a{6154676b555f6154555f55486e54615455486e545548704171756e54704171757041a5497175a549a7557175a7559863717598638f7a71758f7a8281}}{0a09{7e5e854598467e5e9846955c7e5e955c8867}}{0404{5d6667626a6c5d666a6c646c}}{0000{a269985ea44ba269a44baa59a269aa59b263a269b263ac6c}}{0404{93539d549a6193539a61915e}}{0404{85329631984a8532984a8446}}{0000{852e942c9633852e96338635}}}{{0000{75e567dc67b86da764866a6d6da76a6d7e7a67b86da77e7a67b87e7a8b7867b88b78968867b896889ba38bd48de680da9ba38bd480da9ba380da7dc667b89ba37dc667b87dc671d175e567b871d1}}{0a0a{644a655f5c56644a5c56593d6b51644a593d6b51593d6e3d6c6e6b516e3d6c6e6e3da0446c6ea0448d7b6c6e8d7b827c}}{0000{9c5c9a56a0429c5ca042ac62965d9c5cac62965dac62966c}}{0a09{85459946866485458664785a}}{0404{843196309847843198478445}}{0000{832f962c9731832f97318535}}{0404{5c5a665868615c5a68615f5f}}{0404{8d5b975d96668d5b96669065}}{0002{99a78cca91ac83a699a791ac}}{0002{7ca67d8784a67ca684a673d0}}}{{0000{47e348cf5cb964a05f846d7064a06d707b7b5cb964a07b7b47e35cb97b7b47e37b7b8b788b78998c989d8b78989da8ce8b78a8ceaae5aae59fe7a3d98b78aae5a3d98b78a3d985af8b7885af54d347e38b7854d347e354d357e162ea47e357e1}}{0a0a{6648665e5a3e6f4d66485a3e6f4d5a3e743c6f746f4d743c6f74743ca2466f74a2468c776f748c77837f}}{0a09{864398488663864386637d5d}}{0404{615969596b6161596b616561}}{0404{842e98309847842e98478643}}{0000{832b962b9830832b98308532}}{0000{9d7b936b91599d7b9159a2459d7ba245a178}}{0404{9772a274a37d9772a37d9a7a}}{0002{66b97ca97cb466b97cb452d5}}{0002{93ae9aa4a6d493aea6d49dc9}}}{{0000{5bdc52be6a6f5bdc6a6f858056e75bdc8580858092799d8e85809d8e9fa385809fa3a4c28580a4c29dd59dd5a4e895e19dd595e198d385809dd598d3858098d381b1858081b16abd56e785806abd56e76abd63e1}}{0a0a{6a5661605a556a565a556a3d70736a566a3d70736a3d873d7073873da2477073a247917a7073917a8482}}{0404{65476b39703f6547703f694b}}{0a09{7c5b7c3e903e7c5b903e8e557c5b8e558469}}{0000{a06e9a59a146a06ea146ae689f83a06eae689f83ae68a786}}{0404{9b909e82a9889b90a988a096}}{0404{7d29902990407d2990407d40}}{0000{7c248e248f2a7c248f2a7e2a}}{0a07{644569496161644561615954}}{0002{72987bb16bb95ec172986bb95ec16bb963cf}}{0002{95ad9d9ea2bf95ada2bf9bcf}}}{{0000{67d157bb5a9c67d15a9c6a6f67d16a6f818081809075a1938180a1939aaa81809aaa9cbf81809cbf98d091d593e78ad998d091d58ad998d08ad98dbc818098d08dbc81808dbc82a8818082a86ebe67d181806ebe66e667d16ebe66e66ebe6fdd}}{0a0a{6a59606058576a5958576c3d6e716a596c3d6e716c3d843b6e71843b9f466e719f4691786e7191788282}}{0a09{7c5b793b8e3e7c5b8e3e8b577c5b8b578066}}{0404{67346f346e4667346e466447}}{0a07{66476c476160664761605b5c}}{0000{a26f995c9f47a26f9f47ad6ca088a26fad6ca088ad6ca88b}}{0404{a082a787a096a082a0969d8d}}{0404{7b2a8d298d407b2a8d407a3f}}{0000{7a228b238c297a228c297c29}}{0002{70b07bad69c767ad70b069c7}}{0002{95ce91a09b9f95ce9b9f9bbd}}}}")
pl_x = 64
pl_y = 64
pl_scale = 0.5
pl_rot = 0
c1_x=0
c1_y=0
frame = 1;
end
function _update()
if (btn(0)) pl_x -= 1
if (btn(1)) pl_x += 1
if (btn(2)) pl_y -= 1
if (btn(3)) pl_y += 1
if (btn(4) and pl_scale > 0.1) pl_scale -= 0.01
if (btn(5) and pl_scale < 2) pl_scale += 0.01
c1_x += (((pl_x)-60)-c1_x) * 0.05
c1_y += (((pl_y)-60)-c1_y) * 0.05
camera(c1_x,c1_y)
frame +=0.4;
if(frame>#vectordata+1) then frame=1; end
end
function _draw()
cls(7)
tris1 = sprv(vectordata,flr(frame),pl_x-64,pl_y,pl_scale)
tris2 = sprv(vectordata,flr(frame),pl_x-32,pl_y,pl_scale)
tris3 = sprv(vectordata,flr(frame),pl_x,pl_y,pl_scale)
tris4 = sprv(vectordata,flr(frame),pl_x+32,pl_y,pl_scale)
tris5 = sprv(vectordata,flr(frame),pl_x+64,pl_y,pl_scale)
print(stat(1).." cpu",5,5,1)
print(tris1..' tris',5,16,1)
print(flr(frame)..' frame',5,27,1)
end
function strtovec(s, i)
local v={}
if (i==nil) i=2 -- skip top {
local i0=i
while true do
if (sub(s,i,i)=="{") then
-- add table
local t,len=strtovec(s,i+1)
add(v,t)
i+=len
elseif (sub(s,i,i)=="}") then
return v,i-i0+2
else
-- add number
x= charhex[sub(s,i,i)]*16 +
charhex[sub(s,i+1,i+1)]
add(v,x)
i+=2
end
end
end
function sprv(anim,frame,x,y,scale)
x=x-flr(128*scale)
y=y-flr(128*scale)
tris = 0 --debug
foreach(anim[frame], function(v)
col = v[1] --first item in each poly is colour
col2 = v[2] --second item in each poly is colour2
t = v[3]
for i=1, #t/6 do
b=(i-1)*6
--scale
if(scale==1) then
x0=t[1+b]
y0=t[2+b]
x1=t[3+b]
y1=t[4+b]
x2=t[5+b]
y2=t[6+b]
else
x0=flr(t[1+b]*scale)
y0=flr(t[2+b]*scale)
x1=flr(t[3+b]*scale)
y1=flr(t[4+b]*scale)
x2=flr(t[5+b]*scale)
y2=flr(t[6+b]*scale)
end
tris = tris + 1
layer_render( { x+x0,y+y0,x+x1,y+y1,x+x2,y+y2, col, col2 } )
end
end)
return tris
end
--@catatafish
-- expects an array in the form { x0, y0, x1, y1, x2, y2, color, color2 }
function layer_render(vbuf)
--for n=1,tri_count do
-- local vbuf = vertexbuffer[n]
local v0x, v0y, v1x, v1y, v2x, v2y, ps = vbuf[1], vbuf[2], vbuf[3], vbuf[4], vbuf[5], vbuf[6]
if v1y<v0y then v0x,v1x = v1x,v0x;v0y,v1y = v1y,v0y;end
if v2y<v0y then v0x,v2x = v2x,v0x;v0y,v2y = v2y,v0y;end
if v2y<v1y then
v1x,v2x = v2x,v1x
v1y,v2y = v2y,v1y
end
if v0y == v1y then -- flat top
rasterizetri_top(v0x,v0y,v1x,v2x,v2y,vbuf[7],vbuf[8])
elseif v1y == v2y then -- flat bottom
rasterizetri_bottom(v0x,v0y,v1x,v2x,v2y,vbuf[7],vbuf[8])
else -- general case
local newx = v0x + ((v1y-v0y)*(v2x-v0x)/(v2y-v0y))
rasterizetri_bottom(v0x,v0y,newx,v1x,v1y,vbuf[7],vbuf[8])
rasterizetri_top(v1x,v1y,newx,v2x,v2y,vbuf[7],vbuf[8])
end -- triangle cases
--end -- triangle loop
end
function rasterizetri_top(v0x,v0y, v1x, v2x,v2y,c1,c2)
if (v1x<v0x) v0x, v1x = v1x, v0x
local height=v2y-v0y
local dx_left, dx_right = (v2x-v0x)/height, (v2x-v1x)/height
-- if v0y<c1_y then
-- v0x-=dx_left*v0y
-- v1x-=dx_right*v0y
-- v0y=0
-- end
-- if (v2y>c1_y+128) v2y=c1_y+128
for y=v0y,v2y do
--if(y>0 and y<128) then
if(c1==c2) then color(c1) else
if(y%2==0) then color(c1) else color(c2) end
end
rectfill(v0x,y,v1x,y)
--end
v0x+=dx_left
v1x+=dx_right
end
end
function rasterizetri_bottom(v0x,v0y, v1x,v2x,v2y,c1,c2)
if (v2x<v1x) v1x, v2x = v2x, v1x
local height=v2y-v0y
local dx_left, dx_right, xend = (v1x-v0x)/height, (v2x-v0x)/height, v0x
-- if v0y<c1_y then
-- v0x -=dx_left*v0y
-- xend-=dx_right*v0y
-- v0y=0
-- end
-- if (v2y>c1_y+128) v2y=c1_y+128
for y=v0y,v2y do
--if(y>0 and y<128) then
if(c1==c2) then color(c1) else
if(y%2==0) then color(c1) else color(c2) end
end
rectfill(v0x,y,xend,y)
--end
v0x+=dx_left
xend+=dx_right
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment