. #1@Qcv 02TvͫgE#2Tv2Tv =000000000000000000000000000000?̺wvffUUEUTDDUDDDDDD4DDDDDDDDTTUTDUUUUfUfVfeffffffefeffUVUUUUUEDDDDDC343C342"##33"#"22"""""""""""""!ۛ˺vfvfVeTTTTDDDDDDDDDDDDDDDEDDTDTUUUefVeffffffvvfvvvfefffUUUUUTDTDDDDC3333C33#333"#23""""#"""""""!!!!"""""흞˩wvvVUeUTTEDDDTEDDDDDDDDDUEDTETTUUeUUeffefvfgfgvvvvvffffeeUUUEEEDDDD3D43333333322"""#2""2""""!"""!"!!!ڜʩwvffVUUTEDTTTDTDDDDDDDUETUTUUTTUfeUfffvgfwgvwwvwwvwvffeVUUUUUUDDDD34443C33333#"2#2"#"###"""""""!"""!!"ܝ˪wwfffUUUTDEEDDDTDDDDDDDUDDETDUUVUeeffvfgvwwwwwwwgwffwwfffeeUUUDDDDDD3CCC33#3#33"2###223""""""!!"""ۜ˺wvgffUUUEUDUDDDDDDDDDDTEDDUUUUefffeffvgwwwwwwwwwfwvfVfUUUUDDTDDCD3DC333#3""2##"""""2"#"""!"!"!!!"!"ܝͫxwffUUUUEUTDEDDDDDDDDTDDEUTTUUeUeevwwwgwwxwwwvvfgfVUVUTUDTDD44CD443333323#323##""#""!"""!"""""˩wgeUeUUUUETTEDEDDTTUDTTUTEUefVUfffvwvwwwvgwffffUEUDTDDDCCD3C43323#32#3##2"""""""""!"!"""!̪xffVUVUTEUDTTEDEDTTETTTUUUUefUeffwvwxxwwggfVVUUUDEDDD43C34333#333"3""""""""""""!""""!̪wffUeUUUUDEETDTDDEDDEDEETTUUfffvvvwwfvefVeTUEDDD3D3CC3333333#3"#""2""""""""""!"""ܫwgfffUUTEUTUTEDTTDEEEUTEUUeUVffgvwwwxwvffeUUUTDD44D4433333332"#"##"2"""2""""""!"!!""ͺxvffeUUTUUUTTDUETUDETUUTUUUeeevvgwwwvfffUUTDDDD33C33333#333#32222##""""""""!!"!""ΫxwgVeeUEUTEEEUTTDDTUTTTUUUUVefffvffffeUUETDDDDDC4C3333##33"3"""3""""""""""!"!ͻvfeUVUTUDUTEUUUETUUDDETUVfffvvwwʻwwgvfffUETTEDDC33333332#3#3"2"2"""2""!""!"""""""λxwggfeUUUUDETTEEDEEUDEUTUUfefffww̻wgvfffUEEUT4DD34D3333333##""232""""""""""!""!!"!ͫwwffeeUUUEUTUETDDDDUUUTUeVUfffwww˻wvfeeUETEDDD4DCC4333333332333333"""""""""""""ͫwwffVUUUUTUDUUEUETUUTTUUeefffwww˻wxwffefEUTEDCCC4D3333#3#232##3#""""""""""!""!ٟ̪wgvfVUeDEEUTTEDUDEUUUUUUUUffvvww윜˺wgffUUUTEDCDD3D433333#322#""2#""#""""!"""!""!!ݙټwwfUUUUUTUUDEDUETUUUUUUeUUeffvw흞ͼxwgfeUUDEDDDC434343333233""""#""""""""""""""!!"μwggfVVUUUUUUEUUUUDUUUUUUVfefvwۜ˺wggfUUEUEEDDC4443333#"2"2#"""""""#"!""!"!"!"""ͻxggffVeUUUUUUETUUUUTUUUUeeVffwwܝݻwffeUUEDDDCCD43C333222##3"2#2"""""""!""!""""ٟɼxwgfVVUfUUUTUEUTTUTUUUeUeefvvwwܝ˪wffeVEETDDDDC3C43333333##2""3"""""""""""!""!ٽwwgffVVUUUTUEUEUUTTTUUUeVeffvvxݞ̫wwwfeUEEEUDDDDDD433#333"32"2#"2""""!!"""!!!!!ɹwwfVfUUUUUUEUUEEUDUUUUUUVfefvww۝ͫwwfVUUUDDDDD433D333333#"#"#2"""""""!""""!!"""ݼxwvgfVeUUUUUUEUUEUUUUUUUefefvvwxܝݼxxgfVUUUEDED43D3D333333#"3#2"""""""""""!""xwgvffUUUUUUUUUUUEUUUUUVefefggw̪vffVUUUDDD4C4DCC333333323"#"2"#""""""!"!"""xwggfffUVUUUUUUUUUUUUUUVeUVffwwww˝ټwffVUUDUD4D444333333#3222""22"""""""""""""xwxwgfffVVeUUUUUEUUUUUUUeefffffv̝ͫwwffeUUTEDDC3C43433332"3#"32"""#""""""""""""xwwvgffVVVfUUUUUUTUUUUVUUUfVfffwx̝鼫wwgfUVTEUUD43C3D333332##3#""2"#"""""""""""xxxwgwfffVUeUUUUUUUUUUUUUUUffVfvfvwܙ̪ggfUUUTDTD44C4C434333#3#3"""""""""""""""!!"wxxxwvfffeeVVVVVUUUUUUUUUUUUVVfffgwwܙͫxgffeUUUDDDDD4CC333#33##"33"#"#"""""!"!"""""gxxxyyxxwxgfgfffUUefUUUVUUUUUUUeVfffffvwwܙ齫wwgffUUUDDDDCDC4334332#3"22#3#23"""""""!""!wgwwxwxxwwwwfffVfUVVUUeUUUUUUUUUUfUffffgwwܙͫxwfffUUETDDDDCCC34433#33##3"2#""""#""""""!fvwxwhhggwwfffVffeeVVUUfUUUVUeeUVVUVffffwfw̙ټwgffUUUDDEDDD4C34323223"3##23"2""""""!"!!""ffwggwwwgggfffffUUfefVVUVUUUVUUeUVVVeffffgvwܙټxgfVUUUTUEED4DDC343333322#""3#""2""""!"""!!VfgggggwfgvgfffffUVeUUeVUeUeUVUUUeUeefegvvwwλwvfffeEEETDDDDC3343333"2"3#2"""#2#"""""""""""ffffvwffgffgfgfefeeeVUfUUfeeVUUVVfUeffffvww̝ͼxwfffUUTDDTDD343C4C3333""##2#""""""""!""""""VfffgffggfWffVVfVVUUVfUefVUeUeVUeVVVfffggfwwݙͬxgvffUUUTDDDDD3C3D3333##332#3#2""2"""""""""""!fVUfgffgfgfffffVfVfffeUUUffUUUfUfUfUeeffgvwwݙμxffVfVUUTTDDDDD33C33#333##23"2""##"""""!"!"!!UUffVVWVfWfffffVVVeffeUeeUUeVUeUUVUffffffwwxٙٽxwwffVUUUDETDDDDD3D333333##"22""#22#"""""!"""!"VVfUefVffffVfVffeeUVfVeVUVUfVffVUUeffffffwwwݙ̼wgffVUUUEETD4DD443333332#22""""""""""!""""!VUVVfffVfffVVffeVVfVVVeeVUVVVfVUfVfUUffvfvww陟ͼggfUVeUUEDDDC3C44C333333333#22""""""""""""""UUUUeeVffVVVfeffVefVUVfUefUUeUfefffVfffvwfwwxݙͼxwwffUeUEDEDDCCDD3333332333#2"""#""""""""""""UUUVVVefVfffUfVfffVefUfVVffVefeVfffffffvfggwx陙μwgffVUUUETEDDD433333333322#22#22""""""!""""!!"UUUVUUVfeUfeVfffffVfeVUffVeUfVffffffffffggwwͼxwggffeVUEUDTD44C4C3433233332#"#"""#""""""""UUUUfVeVVUefVVUVVVfUefffVfeVffVffeffefffggwwwxͼxxwwfffUUUUUTTTDDC3C3D333323#3"3""""2""""""""""EUUUUUfVUfVeVeVfVfffffffffffeffffeVVfffwwwfww̻xwffffUUEUDEDDDD4C43C33333#3233#2#2#"""""""!"TUUUUUUUUfffffVffffffffffffffVffVfffvfgfggwwxxxwgffVVUUEUTUDD4443433333#3#2"#2#2#"""""""!!""EUEUUUUeUUffffUfffffffgvfffffffffffffgvvvgwwwxxxwwgVVUUEUUETDDDDD44433333"3222""2"#22"""""""!UUUUUUUeVfffVVfffffffgfgfwwffffffwffffffvwgvwxxxxwwggfeeVUEUTTDD4443CC3333332#"##"#""#"""""""!UUDEUUUUeffeefffffffvfwfffgfvgfgfffffffvwfwwwwwwffffeUVUETDTE4C3444C4333332#2##"##""#"""!"!!UTEUUUUUfVfUeffgfgwffgvfvvfvgvvvfffggffwggvwwxwxwwfgfeUVUEUETDDDDD3DCC3433323#32"2""""""""""""""DDETUUUVUUfUVefgfvvgvwwwfgvwwvffgfvvvfvfgwfwwwxwwgfgfeeeUUUTEEEDDD3C33333333"22"##2#""""""!"""!UUDEUUVeeffffffffvwwwfvwwvvwfgwfgfffffvwvfwvfwwwwxxxxxxggfffVUUUUTDTDDDDD3DCC3333#33##"""2#"2"""""""!"!EUUTUUUfUffffvvvgwvgvgwwwgwwwwwwvvffgfvfgfvfwwwwxxwwwgffeeUUUTEUUDDDD43333332323323""""2""""""""!"DEETVUfeVUfffvwggvwwwwwwxwxwwgvfgvgwfgfwffwgvwwwxwxxwwwgwffffUVUUTDEDDDD3C43333333#33"#2"2""""""!!"""ETUUUUUfVeffffgggwgwwwwxwwwvgwgvwffvwgfwwwwwxwxxxxwggfgfeeUUDUTDDD44D3D443333323""#""""""""""""""UTEUUVeVeVffffvvwwxxxxwwwwwwwwwfvgvfvvwgwxwwwyxxxwxwggffeUUUUUEDDDD4344333333#33"32###"""""""""!DEUUUUfeVffggggwwwxxxwwwwwwgwfwwwfwfvwwwwwwxwwxwwggvVfVVUUDDDUDD4DC3D33333332###33""""""""""!!TTDUUUeVeffwfggwwxwxxxwwwwwwgwfvgwwvgwwwwxwxwxxwwwwwvgfffUVUUUTEDDDD43D3C33332####2"#"2""""""""""UUUUVefVUfgfgvwwxxwwwwwgwfwwggwfvfwwxwwwwxxxxwwwwwgvVVVUUUUUUEDDCD33333333#3#"3#2""""#""""""!""!UDUUUVVeUfggwwwwxxwwwwwwwwwvgfgvwgwwwwxxxxxxwwgwvffVfeUUEUTDDDDDDC33333333232"2""""#"""""""!UUTUUeefffvvwwxxwwwwggvwgwggwwwwwwxxwxxxxwwwwgvfffffeUEEUDDD4DCD4DC3333#332""2"2""""""""""TDUUUVUffvfgwwwwwgwwvwwvwwwxwxwxwxwwxxxwwwvwvfUVUUUUTDDDDD434343333#23#32#"#""2""!"!"""UEUUefUVffvwxwwwwwwvggwgwwwwwwwwxxxxwwwgvfffUfUUTUEDDD4D33C3333232#222""""""""""""!!EUTUUefffggwxxxxxxwwwwggggggwwwwwxwwwxxxxwxxwwvwffVfeUUUUTDDD3DCD3C333323#"3"""2"""""""""EUUUefVfvwwxwwwfwvgggwwggwwwwwxxxwwwwgffeVUUUEDUD4DDC4CC333332""""#32"""""!""!"TUUUUfVffgwxwxwwgwgvwgggwgwwgwwxxwxxxwwwgfffUUUUUUTUDDDC3D3433#3"33"#"22"#""""!"""!TETUVVeffww˻wwwwwvwwvwfwwwgwwxxwwwwwwfffVUETUDDDD3D3D3333333#"2#"#""""""!"!""UUUfeffgwwwxͼxwwfvvwwwwwgwwwwxwxwwyxwwgffffUEUETDD4DDDD33333"#3"22""""#"""""""""!EUUUeVffww̼wwwwvwwvwfgfwwwwwwxwwxwwggfVfUUUUDDDD4DC4343#33##2#2#"""""""""""!TTUefVffw陙̻wwwwwgvggwwwwwwwwxxxxwgfeeeUUUEDDDCCDC33323#3#33##"""""""""!"""EUUeUffvvw̻xwwwwwwgwgwvwwwwwwxxwxwfgefeUDUDDDDD3D4433#333"3"""3"2"""""!"""""UUUUUVfgw陙ͻwwwwwwfvvwwwwwwwxxwvgffUUUUTDD4DC4CC33333#"#"""222"""""""UEUUVfffw홙̻xwwwwvwvvwgwwwwwwxvffVVUTEEEDDCD3343432333"3"##"""""""!""!TTUUeffwwޙͼwwwwvwvwvwwwwwx̼vfffVUUUTDDDDDC343333233322"322"""""""""""TUUUVffgxܞݼxwwwwwwvwgwwwxw̼wvfVeUUEDED4DCD43333332###"#""#"""""""!"""TUeUffgw̻wwwwwggwwwwwwxwx̻wwveVfUUDEDDDDC3D3333"33233"###"""""""""!!UUUefvfwݞͻwwwwwwwwwwwxwwݙݼwffUUUUEDDDD33D333#2#3"2#3#""""""""""""ETUUfvgwݙ̻wwwwwwwwwwwxxܻٙxwwfeeTTDDDDDCD333333323""3"22"""""""""!EUUeVwfwx̝̻wwwwwwwwwwwwwx̫wgfUUUUUDDD4D3DCC333#23333"2"""""""""""DTUVfff̙̻wwwwwwwwxٟܻwvfVUUUUTD4CC33C3433333"3"23"2""""""!""""UUUUevvw̻xxxwwwwwwxwxޙ޼wggeUUEUDD44D33C4332333#""22"""""""""""!TUUefvvw̻wwwwwwxwxٟ̺wvfUVUTUTDDCD3C3333332#"33#"""""""""""TUUefwww˝̻xwxwwwwwwwwwݙ̻gfVeUUEEDDDC434333323#""3""""""""""""""EUUVffgw۞̼wwwxwwwwwٙܺfffUeUDDUCDCC43333323#"32"#2#"""""""""UUeffwwܞ̼xxwwwwwwwwxݙ޻wfeVVUTTDDC3CD33333"2#222""""#""""""!DUUeffwwܙܻwxwwwwxٟxwffeUEUDED4DD33332333#33#2##""""""""""EeVefgwܙͼwwww̞ݼwvfVUDTDDDDC3CD3333#2#3"#""#""""""""TUUffggwܙ̻wwwٟ˩wweVUTDDTCD4334D333#3#2#"2#""3""""""!DUeUffwwܙ̼xxx̙޻wfffUDTUDD433C3333#"#3"3"#22"""""""""!!"UUeffvwwܞ̻x˩xwvfUUTDDDD4D3D33323#233""#""2"""""!""""TUeUffvܞ̻xx̞ݻgffeUEUDDD4C4C3333333#3"3#"#2""""""!""!UUefffw۝˻ٙ컙wfeUUETTDDDC33333233#3"2""#""""""""!""UUUVffv̝ͻݙܫxwfVfUTTDDDD4333333#3"3#""""""""""!"""EEfVffgw۝̻xޙ˺wffeUEEDDD4D33433333"""#""""#"""""!""""EUUUfvwwx̻xݙ޻xwfeUUUEDDDDC34C3233332"#"""22#""""!!!!UUUUfffw잙˫陙ʹwvffVUEEDDCD34DD33323"#2##2#""""""""!!!"EUUUVffvܝݼݙ˪xwvfVeUUEDD4D4C444332#33"323"2"""""""""!"TUUVVfwww홙ݼʺʺޙʹwwwfVUUTEDDDD3C333333#33"#"#"""""""""""""DUUffffgܝݼޞ˪wffUUUUUDDDCD3333332#2"2""2"""2""""!"!"UUUUUUfww힙̫ʺwvfeeUUTUDDD3CC333322332""""""#"""""""""UUUUefffwܞ̫˺gffUUUUDDDD4433333"3322"222""#"""""""""TUUVUVvgwxݝ̻ۜ˺wwffeUTUDDDDD3433C3332"2"#""""""""""""""!!EEUUeffvwݝ̫ܝ̼̻xwwffeUUEUDEDD3334333#2#3#32"22"""""""!"!!EETUeffvvwx홙ڛ̼̻wvfeVUUETDDDDCCC33333##23#""""""""""""""DUUUeUffwwxݞ̪ܜ̼wfffeUUTUDDDDD3333333##"""2""3""""""""""!!DDTUUeVfgwxܻڛ˻wwfefUUDTDDDDCD34C3332#22""22""#"""""""!!DUTUUeefgwwݙܻܝ̼xwvfffUUUEEDDD333343333"22#32"2#"""""!"""TDTUefUfggwݙ̻ʛ̻wvffffUUTUDD4DC443333#333##322#"""""!"!""""DDDTUefefwvw˼힙̻ͼwwgfVffUEUDDDD43C3433332""2232#"""#"""""!!DDTUUUffefwww홙̪ڜͫwvgffVUUTDEDDCDD3C333#3323#"#"2"""""""""!"""DDDUUeeefggvwݞͫ۝̫wwwfVeeUUUTEDDDD343433323#3""333""""""""""""TDTDEUUfffvwwݙ˻ۜɽxwfffefUUTDDTD44C3333333#2##2"""#"""""""!!"DDTTUUUVefggwwݙ̻۝ٽxgwffffUUUDDDDD3D44C333#32#33#""#"#""""""!""!!"DDDDUEUUffffvwxݙ˻۝ɽwggffeUUUUUTDDCC4DD443332"#3"#""2""""""""!"!!!CDDDTUUfeefvwwww̻wܝɽxwwffeUUUTDDDDDD4CC333333#3##""#3#""""""""""!!DDDDDUUUUeffwgwwͼ˺ܝɬwwgvwfeUUUUUUDDD43CD33333222323##2""""""""""""!"DDDTDDDUUefffffwww̼̻x۝ɼwggfffUUUETDDDDDCC44333233""3""##"""""""""""""!DDDUUETUUfVffvfwwwwx˜ɬwgwgfUeUUUTDEDC44D43333332#3"##32""#"""""!"""""4DDDETTUeUefefgwwwwwxxwwݙ齻xwfffUeUUEETDDDDD43D333333""#"3""""#""""!"!!!""CDDEDDETUUVfffvgfvwwxwwxɾxwwwfUVVVUUETDDDCDD3433332#23"22"2""""""""""""!"!!DCDDDDUEDUUeUfffvwwwxwww̝ټxxggffVVUUTUEED4D44CC333333#"3222232"#"""!"""""""4CDDUETTUEUeUfeffwwwwwwwwwwxw홟ϹyxxwgfVVeUEEUTDEDDCC333333333323#22""""""""""!"!""DDDDDTETUUUefUfffvgvvwwwwwgvwܙͫxwgffVUVUEEDTEDD34D3C33333#323#"""#"""""""""!!""4CCDDDTTEEUUUfUfffgggwwwwwwwggvvwwwݙٹyxgggVeVUUDEEEDD4DDCDD3333#33232""3""""""""""""""!"CDDDDDDDUUEUUVfVffffwvwwwxxwxwwwwwgwvvwݙٽxgwwfeVUEUUEDDDD444C3CC33333#32"3#"2"""""""""""!!"!CC4DDDDTTTEUUUUeVffffvgwwwwxxwwwwxwgvwfgffwvwɹxhgfVfUVEUEUDEDDC34DC333332#3##"2##"##"""""!""""!"3DDDDDDDUTETUUUVefffgvwfvwwxwxwwfwwgffwfvfwwwxͽwffffeUUEUDTDD4D433333323322323"""#"#""""!""""""""!3334DDDEUDTETUUefeeUffvfggvwwwwwwwwvvwgffvvvvfwwxwxxgfVfeVUEDDDDDCCDD4334332#332"""#"""""""""""!!"!!"""!D44CDDDDEDDEUUUVUfeUffffggwvwvgwwwfvfffwfffvvfvwwwwwwgfVVUUUTEDEDDD3D3D33333232#3#"#""#""""""""""""D4CCDCCEDEEEUUUUVffUfffffvwgggvgfvvwgffffffffgvgfwwxgggWffVUUEDEDD44D4D33433#3#3####3"#"2"""""""!""""""!43D3DDDDDEEETETUUUUUUfffffffffvfffvfffffffffffvfgwwwwvwffUUUTEEEEDD4C33433333333""3"#"##3#"""""""!""!"!33CC4DCDEDDUDTUUUUUUeeeeffffvfgfffvfffffVffffffvgwgwwxxyhhgffVVUUEUEDDDDDC33CC333222##22#3"32""""""""""!"!""!3CCDC44DDDDEDEDDUUUUVeeffVeUffffffffUefVfVffVffvffwwwxxwwwfVffUUUTUUDDDDCD343343#3#3333"#"3""""""""""!"!"""!""334C4C4DDDDTDEDUDEUUVUffeeUUUfUfVVfeffVeVfVfffffffgvwwwxxxxxggfVfVUUTTTEDDCDC3C3343333#23"""2#"2"""""""""!!"!""!! -- title: Metaballs -- author: TehShadowz -- desc: Metaball rendering program -- script: lua t = 0 size = 10 -- size of balls width, height = 240, 136 balls = {} -- list numBalls = 8 -- colour density function exponent colourExp = 2 / 3 previousTime = 0 -- Constructor function Ball() local theta = math.random() * math.pi * 2 local speed = math.random() * 30 + 10 return { x = math.random(size, width - size), y = math.random(size, height - size), xDir = math.cos(theta) * speed, yDir = math.sin(theta) * speed } end -- Update function updateBall(ball, delta) ball.x = ball.x + ball.xDir * delta ball.y = ball.y + ball.yDir * delta if ball.xDir > 0 and ball.x > width - size then ball.xDir = -ball.xDir ball.x = 2 * (width - size) - ball.x elseif ball.xDir < 0 and ball.x < size then ball.xDir = -ball.xDir ball.x = 2 * size - ball.x end if ball.yDir > 0 and ball.y > height - size then ball.yDir = -ball.yDir ball.y = 2 * (height - size) - ball.y elseif ball.yDir < 0 and ball.y < size then ball.yDir = -ball.yDir ball.y = 2 * size - ball.y end end -- Render function drawBall(ball, colour) circ(ball.x, ball.y, size - 2, colour) end -- INIT do -- Generate palette for i = 0, 15 do local val = (i / 15) ^ (1 / colourExp) * 255 poke(0x3FC0 + i * 3 + 0, val) poke(0x3FC0 + i * 3 + 1, 0) poke(0x3FC0 + i * 3 + 2, 0) end --sync(32, 0, true) -- Generate balls --math.randomseed(6) for i = 1, numBalls do balls[i] = Ball() end end function TIC() local currentTime = time() local delta = (currentTime - previousTime) / 1000 do -- Bring vars and functions to local scope -- (good performance boost) local pix, balls, size2, width, height = pix, balls, size * size, width, height for index, ball in ipairs(balls) do updateBall(ball, delta) end local border = math.sin(t / 5) * 3 + 7 -- Render pixel by pixel (every fourth -- pixel each frame) for y = t >> 1 & 1, height - 1, 2 do for x = (t ~ y) & 1, width - 1, 2 do -- Metaball calculations local sum = 0 for index = 1, numBalls do local ball = balls[index] local xDs, yDs = ball.x - x, ball.y - y sum = sum + size2 / (xDs * xDs + yDs * yDs) end if math.abs(sum - 1.1) < 0.2 then pix(x, y, border) else local int, frac = math.modf(math.min(sum, 1) ^ colourExp * 15) if math.random() < frac then pix(x, y, int + 1) else pix(x, y, int) end end --pix(x, y, math.min(sum, 1) ^ colourExp * 15 // 1) end end -- Draw balls over --for index = 1, numBalls do --drawBall(balls[index], index) --end end if true then -- AVG FPS COUNTER rect(0, 0, 78, 7, 0) print(string.format( "%.2f avg fps", t * 1000 / time() ), 0, 0, 15, true) else -- REAL FPS COUNTER rect(0, 0, 54, 7, 0) print(string.format( "%5.2f fps", 1 / delta ), 0, 0, 15, true) end t = t + 1 previousTime = currentTime end