diff --git a/src/automaton.json b/src/automaton.json index ab6e5c9..820a649 100644 --- a/src/automaton.json +++ b/src/automaton.json @@ -1 +1 @@ -{"version":"4.1.1","resolution":400,"curves":[{"nodes":[[0,1,0,0,0.16140350877192983],[1,0,-0.47719298245614045]]},{"nodes":[[],[0.6666666666666666,1,-0.4560629631300563,-0.1852941176470587],[0.6666666666666666,0,0,0,0.26644908616188,0.1029411764705882],[2,1.1900000000000002,-0.1],[2,0.00686274509803933,0,0,0.10652741514360319],[2.6666666666666665,0.7000000000000001],[2.6666666666666665,0,0,0,0.1391644908616188,0.5215686274509802],[3.333333333333333,0.9,-0.5014360313315928,-0.22647058823529403],[3.333333333333333,0,0,0,0.3974946346535474,0.10043744264185422],[4.666666666666666,1.2000000000000002,0,0,0.1],[4.666666666666666],[5.333333333333333,0.7000000000000001,-0.24079400848586707,-0.49736814906842436],[5.333333333333333],[6,0.8,-0.4356422056174482,-0.17156862745098037],[6,0,0,0,0.32852235276081576,0.05490196078431372],[7.333333333333333,1.1441176470588237,-0.1,0,0.1],[7.333333333333333],[8,0.3333],[8,0,0,0,0.08806743643105143,0.4254901960784307],[8.666666666666666,0.9,-0.3995834676293276,-0.08230605476940031],[8.666666666666666],[9.4,1.1,-0.2785205844025618,-0.17156862745098012,0.2785205844025618,0.17156862745098012],[10,1.3],[10],[10.666666666666666,0.6000000000000001,-0.11225401796276425,-0.5783350570563074]],"fxs":[{"def":"repeat","params":{"interval":0.2299999999999996},"time":7.333333333333333,"length":0.6666666666666667}]},{"nodes":[[0,0,0,0,0.12284595300261082,0.061764705882352944],[0.6666666666666666,0.4,-0.1],[0.6666666666666666,0.06568627450980391],[2,0.2],[2.236344893790143,0.4,-0.1,0,0.1],[2.6666666666666665,0,-0.34575086532310695,0,0.04271204452939744],[2.769918291305192,0.1,-0.05130523784998782,0,0.09999999999999999],[3.333333333333333,0.1],[3.6666666666666665,0.32774323388394533],[4.666666666666666,0.30000000000000004],[4.666666666666666,0.023323265139934546],[5.333333333333333,0.1],[5.333333333333333],[6,0.30000000000000004],[6,0.02745098039215696,0,0,0.09974597868276715,-0.006845312262542842],[7.333333333333333,0.1,-0.1],[7.333333333333333,0.7000000000000001],[8.666666666666666,0.7000000000000001],[8.666666666666666,1],[10,0.1],[10.666666666666666]]},{"nodes":[[0,0,0,0,0.1],[0.3333333333333333,1,-0.1,0,0.1],[0.6666666666666666,0,-0.1],[1.9166666666666665,1,-1.0007832898172324,0,0.06],[2],[2.025071712633245,1,-0.044516971279373374,0,0.1],[2.1623944411350506,0.5,-0.07221383357420871,0.2738348538091391,0.07221383357420871,-0.2738348538091391],[2.6666666666666665,0,-0.1,0,0.1],[3,1,-0.2864316909347707,0,0.24406085208595923],[3.333333333333333,0,-0.036443741726782705,0.4106336078810942],[3.6666666666666665,0.7544057184393509,-0.08631141286229893,-0.07178801363349067,0.13346814639852406,0.11100980502520727],[4.666666666666666,1,-0.33942558746736295,-0.018347344929083464,0.09208797505724492,-0.3264027483296351],[4.851079899134173,0.30000000000000004,-0.07486057061026631,-0.013179150760383026,0.1],[5.0444017511428605,0.9656862745098039,-0.1,0,0.1],[5.333333333333333,0.044689231228471016,-0.1,0,0.1],[5.666666666666666,1,-0.1,0,0.1],[6,0,-0.1],[7.333333333333333,1,-1.0426547051383652,0,0.1],[7.6000000000000005,0.7000000000000001,-0.1,0,0.1],[8,1],[8,0,-0.1,0,0.1],[8.166666666666666,1,-0.099988538641853,-0.006965859231865531],[8.489362746562259,1,0,0,0.09998887794379856,-0.006861981819672439],[8.666666666666666,0,-0.11262160793957762,0.041182622607896624],[8.9,1,-0.11617352813418727,-0.020588235294117612,0.11617352813418727,0.020588235294117612],[9.04400609908224,0.15784313725490162,-0.0988340957186134,-0.027450980392156817,0.0988340957186134,0.027450980392156817],[9.3,1,-0.09200304954112025,-0.041176470588235224,0.09200304954112025,0.041176470588235224],[9.5,0.2,-0.09449923761471994,-0.06176470588235285,0.09449923761471994,0.06176470588235285],[9.666666666666666,1,-0.08899847522943988,-0.027450980392156817,0.08899847522943988,0.027450980392156817],[10,0.30000000000000004,-0.06149466330303955,-0.06176470588235285,0.06149466330303955,0.06176470588235285],[10,1,-0.1,0,0.1],[10.666666666666666,0.1,-0.1,0,0.1]],"fxs":[{"def":"repeat","params":{"interval":0.2490000000000001},"time":2,"length":0.6666666666666665},{"def":"sine","params":{"amp":0.26,"freq":8.590000000000002,"offset":0},"time":3.934411837854859,"length":0.7322548288118069},{"def":"sine","params":{"amp":0.4400000000000004,"freq":5.889999999999998,"offset":0},"time":10.234266741175261,"length":0.4323999254914046},{"def":"hermitePatch","params":{},"time":3.821100533282267,"length":0.12610951070520438,"row":1},{"def":"hermitePatch","params":{},"time":10.18270758125172,"length":0.09198590579094379,"row":1}]},{"nodes":[[0,0,0,0,0.1],[0.6666666666666666,1,-0.1],[0.6666666666666666,0.04000000000000001],[2,0.019999999999999997],[2,0.4],[2.6666666666666665],[3.333333333333333,0.2,-0.1],[3.333333333333333,0.5],[4.666666666666666,0.6000000000000001],[4.666666666666666,0.059594068084455554],[5.333333333333333],[6,0.1],[7.333333333333333,0,-1.3219093627620064,-0.061764705882352944],[8],[8,0.8],[10,0.8],[10,0.1],[10.666666666666666]]},{"nodes":[[0,0,0,0,0.11631853785900784,0.15784313725490196],[0.3333333333333333,0.2,-0.1,-0.06862745098039215],[0.3333333333333333,0,0,0,0.10652741514360313,0.034313725490196074],[0.6257615317667536,0.4,-0.035197899213743125,-0.1178437887562426,0.05762038784328031,0.19291505927163513],[1.5833333333333333,1.6588235294117648,-0.14423846823324632,-0.08235294117647059],[1.5833333333333333,0,0,0,0.0706266318537859,0.12352941176470589],[1.8333333333333333,0.6000000000000001,-0.07923141560987097,-0.16655319476142408,0.05223508415950609,0.10980392156862741],[2,0.8,-0.07118673688066018,-0.08235294117647059]]},{"nodes":[[0,0.7000000000000001,0,0,0.14895561357702347,-0.7343137254901958],[0.6666666666666666,0.01999999999999999,-0.07958650842810296,0.0005266470222471706,0.7602446192333546,-0.005030759268204068],[1.75,0.2,-0.175065274151436,-0.0480392156862745],[2,1,-0.1]]},{"nodes":[[0,0.264705882352941,0,0,0.2664490861618798,-0.3705882352941175],[1.75,0,-0.1,0,0.1],[2,1,-0.1]]},{"nodes":[[0,0,0,0,0.1],[0.3333333333333333,0.9460784313725474,-0.1,0,0.1],[1.3333333333333333,0.3627450980392144,-0.11276290315437737,0.31798356313506776,0.058202350589290165,-0.16412659044332573],[1.6666666666666665,1,-0.1,0,0.1],[1.7304177545691903,0.1,-0.1,0,0.1],[2,1.4000000000000001,-0.05099116999738633,-0.5930547707442783]],"fxs":[{"def":"sine","params":{"amp":0.3999999999999999,"freq":17.779999999999987,"offset":0},"time":0.6103133159268926,"length":0.7230200174064406},{"def":"hermitePatch","params":{},"time":0.5580939947780674,"length":0.08289817232376029,"row":1},{"def":"hermitePatch","params":{},"time":1.2836814621409922,"length":0.11631853785900792,"row":1}]},{"nodes":[[0,1,0,0,0.06843643544269563,-0.8715686274509801],[0.6666666666666666,0,-0.47719298245614045]]},{"nodes":[[],[2,2]]},{"nodes":[[0,0.1],[1.3333333333333333,0.30000000000000004]]},{"nodes":[[],[1.3333333333333333]]},{"nodes":[[0,0,0,0,0.07564543093234954,0.8647058823529409],[1.3333333333333333,1]]},{"nodes":[[],[0.3333333333333333,0.333],[0.3333333333333333,0,0,0,0.04050107306929012,0.096078431372549],[0.5833333333333333,0.30000000000000004,-0.10502788587794674,-0.054901960784313704],[1.3333333333333333]],"fxs":[{"def":"repeat","params":{"interval":0.2499999999999999},"time":0.3333333333333333,"length":1}]},{"nodes":[[0,0,0,0,0.041253263707571805],[0.1,0.472549019607836,-0.044516971279373374,-0.2333333333333331,0.037233176309202774,0.19515571003904697],[1.3333333333333333,1,-1.2945169712793734]]},{"nodes":[[0,0,0,0,0.1],[0.8,0.9,-0.10634811016391839,-0.09574850838471399,0.10634811016391839,0.09574850838471399],[1,1,-0.034837955875665044,-0.008249475331448328]]},{"nodes":[[0,1,0,0,0.08905168734696595,-0.6204705716763121],[0.8,0.1,-0.3657976094933656,0.05238364149449456,0.3657976094933656,-0.05238364149449456],[4,0,-0.5779474714155504]]},{"nodes":[[0,0,0,0,0.33333333333333337],[0.5833333333333333,0.13137254901960788,-0.06553651288762144,-0.14663596634864273,0.06553651288762144,0.14663596634864273],[0.6673629242819844,0.7480392156862745,-0.06736292428198434,-0.16470588235294117,0.06736292428198434,0.16470588235294117],[1.563751087902524,0.9519607843137257,-0.20443864229765013,-0.02745098039215686,0.20443864229765013,0.02745098039215686],[4,1,-0.5779474714155504]]},{"nodes":[[0,0,0,0,0.3154046997389034],[1.3333333333333333,1,-0.29908616187989556]]},{"nodes":[[],[1.3333333333333333,1]]},{"nodes":[[0,1,0,0,0.08905168734696595,-0.6204705716763121],[4,0,-3.146485330423383]]},{"nodes":[[0,1,0,0,0.15000000000000002],[0.25,1,-0.1,0,0.047780678851174936],[0.3333333333333333,0,-0.006527415143603133,0.3068670573880632,0.04083550913838122,0.1415436161688415],[0.4601827676240209,0,-0.031462140992167105,0.14076447719138005,0.031462140992167105,0.08154620354285587],[0.5515665796344648,0,-0.024934725848563967,0.05959145643516391,0.03472584856396867,0.040773101771427935],[0.6364229765013054,0,-0.024934725848563963,0.02509113955164797],[1,0,0,0,0.35333333333333333],[2.333333333333333,1,-0.3643603133159269,0,0.1]]},{"nodes":[[0,0,0,0,0.3317232375979112],[2,1,-1.3746781892076712]]},{"nodes":[[0,0,0,0,0.28276762402088773],[2.6666666666666665,1,-0.4673674842468357]]},{"nodes":[[0,0,0,0,0.429634464751958],[2.6666666666666665,0.99,-1.447911227154047]]},{"nodes":[[0,1,0,0,0.03472584856396867,-0.3705882352941176],[0.6666666666666666,0,-0.6417754569190601]]},{"nodes":[[0,0.4166666666666666,0,0,0.1],[0.6666666666666666,0,-0.664621409921671]]},{"nodes":[[0,0,0,0,0.1],[1.0065274151436032,0.9480392156862747,-0.791906005221932,-0.19215686274509805,0.17102946263472904,0.04150048712872081],[1.3333333333333333,1,-0.1]]},{"nodes":[[0,0,0,0,0.09780980358890974,0.020588235294117938],[0.3333333333333333,1,-0.04311987540653206,-0.9333333333333332]]},{"nodes":[[0,0.2],[1.3333333333333333,1.8,-1.0186386106576615,-0.609915244226372]]},{"nodes":[[0,0,0,0,0.011879895561357705,0.5490196078431372],[1.3333333333333333,1,-1.2292428198433418]]},{"nodes":[[0,0,0,0,0.1],[1,0,-0.1]]},{"nodes":[[0,0,0,0,0.9453002610966057],[4,1]]},{"nodes":[[0,0.9539215686274509,0,0,0.11305483028720623,-0.5970588235294118],[0.3333333333333333,0.1294117647058824,-0.07715404699738904,0.05490196078431372,0.07715404699738904,-0.05490196078431372],[1.3333333333333333,0,-1.133333333333333]]},{"nodes":[[0,0,0,0,3.415926892950391],[4,1]]},{"nodes":[[0,0.9539215686274509,0,0,0.15548302872062658,-0.6039215686274509],[1.3333333333333333,0,-0.6862053959965185]]},{"nodes":[[0,0.9539215686274509,0,0,0.06736292428198429,-0.6862745098039215],[1.3333333333333333,0,-1.208398607484769]]},{"nodes":[[],[0.16666666666666666,0.16642898215255936],[0.16666666666666666],[0.3333333333333333,0.1728044353004796],[0.3333333333333333,0,0,0,0.04050107306929012,0.096078431372549],[0.5833333333333333,0.30000000000000004,-0.10502788587794674,-0.054901960784313704],[1.3333333333333333]],"fxs":[{"def":"repeat","params":{"interval":0.2499999999999999},"time":0.3333333333333333,"length":1}]},{"nodes":[[],[0.16666666666666666,0.16642898215255936],[0.16666666666666666],[0.3333333333333333,0.1728044353004796],[0.3333333333333333,0,0,0,0.3126188615546539,0.15175152819068202],[1.1666666666666665,1,-0.1572879554706029,-0.28764433356035396],[1.1666666666666665,0.3653790156299723],[1.3333333333333333]]},{"nodes":[[],[0.16666666666666666,0.333],[0.16666666666666666],[0.3333333333333333,0.659941132909589],[0.3333333333333333,0,0,0,0.04050107306929012,0.096078431372549],[0.5833333333333333,0.30000000000000004,-0.10502788587794674,-0.054901960784313704],[1],[1.0833333333333333,0.10984958946310308,-0.05834560450044708,-0.037115397878755355],[1.3333333333333333]],"fxs":[{"def":"repeat","params":{"interval":0.2499999999999999},"time":0.3333333333333333,"length":0.6624660750216953},{"def":"repeat","params":{"interval":0.08199999999999981},"time":1,"length":0.33333333333333326},{"def":"repeat","params":{"interval":0.040999999999999204},"time":1.1666666666666665,"length":0.16666666666666674,"row":1}]},{"nodes":[[0,0.1],[0.3333333333333333,1.2904533929940294],[1.3333333333333333,0.053457044213489124,-0.8632620739919382,0.12473310316480792]]},{"nodes":[[0,1],[0.3333333333333333,0.43235294117647044],[0.3333333333333333,1,0,0,0.04376478064109168,-0.28137254901960784],[0.5833333333333333,0.44607843137254904,-0.11808271616515305,0.10980392156862744],[1.3333333333333333]],"fxs":[{"def":"repeat","params":{"interval":0.2499999999999999},"time":0.3333333333333333,"length":1}]}],"channels":[["EnvironmentMap/accumulate",{"items":[{},{"time":5.333333333333333,"length":1,"value":0.1,"curve":26,"amp":0.9},{"time":48,"length":1,"value":0.1,"curve":26,"amp":0.9},{"time":90.66666666666666,"length":1,"value":0.1,"curve":26,"amp":0.9},{"time":110.66666666666666,"length":1,"value":0.1,"curve":26,"amp":0.9},{"time":121.33333333333333,"length":1,"value":0.1,"curve":26,"amp":0.9},{"time":122.66666666666666,"length":1,"value":0.1,"curve":26,"amp":0.9}]}],["Glitch/amp",{"items":[{},{"time":48,"length":1,"curve":0},{"time":50.666666666666664,"length":1,"curve":0},{"time":53.333333333333336,"length":1,"curve":0},{"time":56,"length":1,"curve":0},{"time":58.666666666666664,"length":1,"curve":0},{"time":61.333333333333336,"length":1,"curve":0},{"time":64,"length":1,"curve":0},{"time":66.66666666666666,"length":1,"curve":0},{"time":69.33333333333333,"length":1,"curve":0},{"time":71.99999999999999,"length":1,"curve":0},{"time":74.66666666666666,"length":1,"curve":0},{"time":77.33333333333333,"length":1,"curve":0},{"time":79.99999999999999,"length":1,"curve":0},{"time":82.66666666666666,"length":1,"curve":0},{"time":85.33333333333333,"length":1,"curve":0},{"time":88,"length":1,"curve":0},{"time":149.33333333333331,"length":4,"curve":33,"amp":0.5000000000000002},{"time":153.33333333333331,"length":0.6666666666666856,"value":0.53,"reset":true},{"time":261.3333333333333}]}],["PixelSorter/amp",{"items":[{},{"time":48,"length":1.3333333333333357,"curve":9,"speed":0.4999999999999975},{"time":50.666666666666664,"length":1.3333333333333357,"curve":9,"speed":0.4999999999999975},{"time":53.333333333333336,"length":1.3333333333333357,"curve":9,"speed":0.4999999999999975},{"time":56,"length":1.3333333333333357,"curve":9,"speed":0.4999999999999975},{"time":58.666666666666664,"length":1.3333333333333357,"curve":9,"speed":0.4999999999999975},{"time":61.333333333333336,"length":1.3333333333333357,"curve":9,"speed":0.4999999999999975},{"time":64,"length":1.3333333333333357,"curve":9,"speed":0.4999999999999975},{"time":66.66666666666666,"length":1.3333333333333357,"curve":9,"speed":0.4999999999999975},{"time":69.33333333333333,"length":1.3333333333333357,"curve":9,"speed":0.4999999999999975},{"time":71.99999999999999,"length":1.3333333333333357,"curve":9,"speed":0.4999999999999975},{"time":74.66666666666666,"length":1.3333333333333357,"curve":9,"speed":0.4999999999999975},{"time":77.33333333333333,"length":1.3333333333333357,"curve":9,"speed":0.4999999999999975},{"time":79.99999999999999,"length":1.3333333333333357,"curve":9,"speed":0.4999999999999975},{"time":82.66666666666666,"length":1.3333333333333357,"curve":9,"speed":0.4999999999999975},{"time":85.33333333333333,"length":1.3333333333333357,"curve":9,"speed":0.4999999999999975},{"time":87.99999999999999,"length":1.3333333333333357,"curve":9,"speed":0.4999999999999975},{"time":90.30000000000001,"length":0.3333333333333286,"curve":29,"speed":1.0000000000000153,"amp":-0.4},{"time":90.66666666666666,"length":0.3333333333333428,"curve":9,"speed":1.999999999999927},{"time":93.33333333333333,"length":0.3333333333333428,"curve":9,"speed":1.999999999999927},{"time":96,"length":0.3333333333333428,"curve":9,"speed":1.999999999999927},{"time":97.33333333333333},{"time":98.66666666666667,"length":0.3333333333333428,"curve":9,"speed":1.999999999999927},{"time":101.33333333333333,"length":0.3333333333333428,"curve":9,"speed":1.999999999999927},{"time":104,"length":0.3333333333333428,"curve":9,"speed":1.999999999999927},{"time":106.66666666666667,"length":0.3333333333333428,"curve":9,"speed":1.999999999999927},{"time":109.33333333333333,"length":0.3333333333333428,"curve":9,"speed":1.999999999999927},{"time":153.33333333333331,"length":0.6666666666666856,"value":0.53,"reset":true}]}],["Serial/enable",{"items":[{},{"time":91.99999999999999,"length":1.3333333333333428},{"time":94.66666666666666,"length":1.3333333333333428},{"time":97.33333333333333,"length":1.3333333333333428},{"time":99.99999999999999,"length":1.3333333333333428},{"time":102.66666666666666,"length":1.3333333333333428},{"time":105.33333333333333,"length":1.3333333333333428},{"time":107.99999999999999,"length":1.3333333333333428},{"time":110.66666666666666,"length":1.3333333333333428},{"time":153.33333333333331,"length":1.3333333333333428}]}],["SceneBegin/active",{"items":[{},{"time":5.333333333333333,"length":42.666666666666664}]}],["Sync/first/clap",{"items":[{},{"time":27.666666666666664,"length":1.3333333333333321,"curve":15},{"time":28.999999999999996,"length":1.3333333333333321,"value":1,"curve":15},{"time":30.33333333333333,"length":1.3333333333333321,"value":2,"curve":15},{"time":31.66666666666666,"length":1.3333333333333321,"value":3,"curve":15},{"time":32.99999999999999,"length":1.3333333333333321,"value":4,"curve":15},{"time":34.33333333333333,"length":1.3333333333333321,"value":5,"curve":15},{"time":35.66666666666666,"length":1.3333333333333321,"value":6,"curve":15},{"time":36.99999999999999,"length":1.3333333333333321,"value":7,"curve":15},{"time":38.33333333333332,"length":1.3333333333333321,"value":8,"curve":15},{"time":39.66666666666665,"length":1.3333333333333321,"value":9,"curve":15},{"time":40.99999999999998,"length":1.3333333333333321,"value":10,"curve":15},{"time":42.33333333333331,"length":1.3333333333333321,"value":11,"curve":15}]}],["Condition/hahaRatio",{"items":[{},{"time":42.666666666666664,"length":4,"curve":25}]}],["Condition/phaseWidth",{"items":[{"value":0.1},{"time":27.666666666666664,"length":20.333333333333332,"value":0.1,"curve":16,"speed":0.049180327868852465,"amp":0.5888750576601328}]}],["SceneNeuro/active",{"items":[{},{"time":48,"length":42.666666666666664}]}],["sufferText/push",{"items":[{"time":48},{"time":50.666666666666664,"value":1},{"time":53.333333333333336,"value":2},{"time":56,"value":3},{"time":58.666666666666664,"value":4},{"time":61.333333333333336,"value":5},{"time":64,"value":6},{"time":66.66666666666666,"value":7},{"time":69.33333333333333,"value":8},{"time":71.99999999999999,"value":9},{"time":74.66666666666666,"value":10},{"time":77.33333333333333,"value":11},{"time":79.99999999999999,"value":12},{"time":82.66666666666666,"value":13},{"time":85.33333333333333,"value":14},{"time":87.99999999999999,"value":15}]}],["IFSPistons/group0/rot",{"items":[{},{"time":48.666666666666664,"length":2,"curve":23},{"time":54,"length":2,"value":1,"curve":23},{"time":59.333333333333336,"length":2,"value":2,"curve":23},{"time":64.66666666666666,"length":2,"value":3,"curve":23},{"time":69.99999999999999,"length":2,"value":4,"curve":23},{"time":75.33333333333333,"length":2,"value":5,"curve":23},{"time":80.66666666666666,"length":2,"value":6,"curve":23},{"time":85.99999999999999,"length":2,"value":7,"curve":23}]}],["IFSPistons/group1/rot",{"items":[{},{"time":51.333333333333336,"length":2,"curve":23},{"time":56.666666666666664,"length":2,"value":1,"curve":23},{"time":62,"length":2,"value":2,"curve":23},{"time":67.33333333333333,"length":2,"value":3,"curve":23},{"time":72.66666666666666,"length":2,"value":4,"curve":23},{"time":77.99999999999999,"length":2,"value":5,"curve":23},{"time":83.33333333333333,"length":2,"value":6,"curve":23},{"time":88.66666666666666,"length":2,"value":7,"curve":23}]}],["IFSPistons/group0/pos",{"items":[{"value":3},{"time":47.666666666666664,"length":2.3333333333333357,"value":1.2000000000000002,"curve":22,"amp":1.7999999999999998},{"time":53,"length":2.3333333333333357,"value":1.2000000000000002,"curve":22,"amp":1.7999999999999998},{"time":58.333333333333336,"length":2.3333333333333357,"value":1.2000000000000002,"curve":22,"amp":1.7999999999999998},{"time":63.666666666666664,"length":2.3333333333333357,"value":1.2000000000000002,"curve":22,"amp":1.7999999999999998},{"time":69.03333333333333,"length":2.3333333333333357,"value":1.2000000000000002,"curve":22,"amp":1.7999999999999998},{"time":74.33333333333333,"length":2.3333333333333357,"value":1.2000000000000002,"curve":22,"amp":1.7999999999999998},{"time":79.66666666666666,"length":2.3333333333333357,"value":1.2000000000000002,"curve":22,"amp":1.7999999999999998},{"time":84.99999999999999,"length":2.3333333333333357,"value":1.2000000000000002,"curve":22,"amp":1.7999999999999998}]}],["IFSPistons/group1/pos",{"items":[{"value":3},{"time":50.333333333333336,"length":2.3333333333333357,"value":1.2000000000000002,"curve":22,"amp":1.7999999999999998},{"time":55.666666666666664,"length":2.3333333333333357,"value":1.2000000000000002,"curve":22,"amp":1.7999999999999998},{"time":61,"length":2.3333333333333357,"value":1.2000000000000002,"curve":22,"amp":1.7999999999999998},{"time":66.33333333333333,"length":2.3333333333333357,"value":1.2000000000000002,"curve":22,"amp":1.7999999999999998},{"time":71.66666666666666,"length":2.3333333333333357,"value":1.2000000000000002,"curve":22,"amp":1.7999999999999998},{"time":76.99999999999999,"length":2.3333333333333357,"value":1.2000000000000002,"curve":22,"amp":1.7999999999999998},{"time":82.33333333333333,"length":2.3333333333333357,"value":1.2000000000000002,"curve":22,"amp":1.7999999999999998},{"time":87.66666666666666,"length":2.3333333333333357,"value":1.2000000000000002,"curve":22,"amp":1.7999999999999998}]}],["Music/NEURO_TIME",{"items":[{},{"time":48,"length":10.666666666666664,"curve":1},{"time":58.666666666666664,"length":8.666666666666671,"curve":1},{"time":67.33333333333333,"length":1.999999999999993,"curve":5},{"time":69.33333333333333,"length":10.666666666666664,"curve":1},{"time":79.99999999999999,"length":8.666666666666671,"curve":1},{"time":88.66666666666666,"length":0.6666666666666714,"curve":5},{"time":89.33333333333333,"length":1.3333333333333286,"curve":30},{"time":90.66666666666666,"length":1.3333333333333286,"curve":10,"offset":1.4210854715202004e-14},{"time":91.99999999999999,"length":1.3333333333333286,"curve":14},{"time":93.33333333333331,"length":1.3333333333333428,"curve":10},{"time":94.66666666666666,"length":1.3333333333333286,"curve":39},{"time":95.99999999999999,"length":1.3333333333333428,"curve":10},{"time":97.33333333333333,"length":1.3333333333333286,"curve":14},{"time":98.66666666666666,"length":1.3333333333333428,"curve":10},{"time":100,"length":1.3333333333333286,"curve":40},{"time":101.33333333333333,"length":1.3333333333333428,"curve":10},{"time":102.66666666666667,"length":1.3333333333333144,"curve":14},{"time":103.99999999999999,"length":1.3333333333333428,"curve":10},{"time":105.33333333333333,"length":1.3333333333333286,"curve":39},{"time":106.66666666666666,"length":1.3333333333333428,"curve":10},{"time":108,"length":1.3333333333333286,"curve":14},{"time":109.33333333333333,"length":1.3333333333333428,"curve":10}]}],["Music/NEURO_DETUNE",{"items":[{},{"time":48,"length":10.666666666666664,"curve":2},{"time":58.666666666666664,"length":8.666666666666671,"curve":2},{"time":67.33333333333333,"length":1.999999999999993,"curve":6},{"time":69.33333333333333,"length":10.666666666666664,"curve":2},{"time":79.99999999999999,"length":8.666666666666671,"curve":2},{"time":88.66666666666666,"length":2,"curve":6,"speed":0.8333333333333358},{"time":90.66666666666666,"length":1.3333333333333286,"curve":11},{"time":93.33333333333333,"length":1.3333333333333286,"curve":11},{"time":95,"length":0.9999999999999858,"curve":2,"offset":2},{"time":95.99999999999999,"length":1.3333333333333286,"curve":11},{"time":97.33333333333331,"length":1.3333333333333428,"value":0.77},{"time":98.66666666666666,"length":1.3333333333333286,"curve":11},{"time":99.99999999999999,"length":1.3333333333333428,"curve":41},{"time":101.33333333333333,"length":1.3333333333333286,"curve":11},{"time":103.99999999999999,"length":1.3333333333333286,"curve":11},{"time":105.66666666666667,"length":0.9999999999999858,"curve":2,"offset":2},{"time":106.66666666666666,"length":1.3333333333333286,"curve":11},{"time":107.99999999999999,"length":1.3333333333333428,"value":0.77},{"time":109.33333333333333,"length":1.3333333333333286,"curve":11}]}],["Music/NEURO_DETUNE_PHASE",{"items":[{},{"time":48,"length":10.666666666666664,"curve":4},{"time":58.666666666666664,"length":8.666666666666671,"curve":4},{"time":67.33333333333333,"length":1.999999999999993,"curve":7},{"time":69.33333333333333,"length":10.666666666666664,"curve":4},{"time":79.99999999999999,"length":8.666666666666671,"curve":4},{"time":88.66666666666666,"length":2,"curve":7,"speed":0.8333333333333358},{"time":90.66666666666666,"length":1.3333333333333428,"curve":12},{"time":93.33333333333333,"length":1.3333333333333428,"curve":12},{"time":95,"length":0.9999999999999858,"curve":4,"offset":1.9999999999999858},{"time":95.99999999999999,"length":1.3333333333333428,"curve":12},{"time":98.66666666666666,"length":1.3333333333333428,"curve":12},{"time":101.33333333333333,"length":1.3333333333333428,"curve":12},{"time":103.99999999999999,"length":1.3333333333333428,"curve":12},{"time":105.66666666666667,"length":0.9999999999999858,"curve":4,"offset":1.9999999999999858},{"time":106.66666666666666,"length":1.3333333333333428,"curve":12},{"time":109.33333333333333,"length":1.3333333333333428,"curve":12}]}],["Music/NEURO_WUB_AMP",{"items":[{},{"time":48,"length":10.668578038364203,"curve":3},{"time":58.6685780383642,"length":8.664755294969133,"curve":3},{"time":67.33333333333333,"length":2.0038227433950624,"curve":8},{"time":69.33715607672839,"length":10.668578038364203,"curve":3},{"time":80.0057341150926,"length":8.660932551574064,"curve":3},{"time":88.66666666666666,"length":2,"curve":8,"speed":0.8028871529270708},{"time":90.66666666666666,"length":1.3333333333333333,"curve":13},{"time":93.33333333333333,"length":1.3333333333333333,"curve":13},{"time":94.66666666666666,"length":1.3333333333333286,"curve":3,"offset":1.6666666666666856},{"time":95.99999999999999,"length":1.3333333333333333,"curve":13},{"time":98.66666666666666,"length":1.3333333333333333,"curve":13},{"time":101.33333333333333,"length":1.3333333333333333,"curve":13},{"time":103.99999999999999,"length":1.3333333333333333,"curve":13},{"time":105.33333333333331,"length":1.0000000000000142,"curve":8,"offset":0.26762905097568646,"speed":0.8028871529270708},{"time":106.66666666666666,"length":1.3333333333333333,"curve":13},{"time":109.33333333333333,"length":1.3333333333333333,"curve":13}]}],["Music/NEURO_WUB_FREQ",{"items":[{},{"time":48,"length":2,"value":1},{"time":50,"length":0.6666666666666643,"value":0.49999999999999967},{"time":50.666666666666664,"length":0.6666666666666714,"value":1},{"time":51.333333333333336,"length":1.3333333333333286,"value":2},{"time":52.666666666666664,"length":0.6666666666666714,"value":2.5},{"time":53.333333333333336,"length":0.6666666666666643,"value":1},{"time":54,"length":1.3333333333333357,"value":1},{"time":55.333333333333336,"length":0.6666666666666643,"value":2},{"time":56,"length":2,"value":1},{"time":58,"length":0.6666666666666643,"value":2},{"time":58.666666666666664,"length":0.6666666666666714,"value":1},{"time":59.333333333333336,"length":1.3333333333333286,"value":2.1000000000000014},{"time":60.666666666666664,"length":0.6666666666666714,"value":0.5},{"time":61.333333333333336,"length":0.6666666666666643,"value":7},{"time":62,"length":1.3333333333333357,"value":3},{"time":63.333333333333336,"length":0.6666666666666714,"value":1},{"time":64,"length":0.6666666666666714,"value":0.9600000000000006},{"time":64.66666666666667,"length":1.3333333333333215,"value":6},{"time":66,"length":0.6666666666666785,"value":10.840000000000003},{"time":66.66666666666667,"length":0.6666666666666572,"value":1},{"time":67.33333333333333,"length":1.3333333333333428,"value":3.989999999999996},{"time":68.66666666666667,"length":0.6666666666666572,"value":4.109999999999999},{"time":69.33333333333333,"length":2,"value":1},{"time":71.33333333333333,"length":0.6666666666666643,"value":0.49999999999999967},{"time":71.99999999999999,"length":0.6666666666666714,"value":1},{"time":72.66666666666666,"length":1.3333333333333286,"value":2},{"time":73.99999999999999,"length":0.6666666666666714,"value":2.5},{"time":74.66666666666666,"length":0.6666666666666643,"value":1},{"time":75.33333333333333,"length":1.3333333333333357,"value":1},{"time":76.66666666666667,"length":0.6666666666666643,"value":2},{"time":77.33333333333333,"length":2,"value":1},{"time":79.33333333333333,"length":0.6666666666666643,"value":2},{"time":79.99999999999999,"length":0.6666666666666714,"value":1},{"time":80.66666666666666,"length":1.3333333333333286,"value":2.1000000000000014},{"time":81.99999999999999,"length":0.6666666666666714,"value":0.5},{"time":82.66666666666666,"length":0.6666666666666643,"value":7},{"time":83.33333333333333,"length":1.3333333333333357,"value":3},{"time":84.66666666666667,"length":0.6666666666666714,"value":1},{"time":85.33333333333334,"length":0.6666666666666714,"value":0.9600000000000006},{"time":86.00000000000001,"length":1.3333333333333144,"value":6},{"time":87.33333333333333,"length":0.6666666666666856,"value":10.840000000000003},{"time":88.00000000000001,"length":0.6666666666666572,"value":1},{"time":88.66666666666667,"length":1.3333333333333428,"value":3.9899999999999993},{"time":90.00000000000001,"length":0.6666666666666572,"value":4.109999999999999},{"time":90.66666666666667,"length":1.3333333333333144,"value":1},{"time":93.33333333333333,"length":1.3333333333333144,"value":1},{"time":94.83333333333333,"length":0.1666666666666714,"value":7.320000000000001},{"time":95,"length":0.8333333333333286,"value":0.3800000000000011},{"time":95.83333333333333,"length":1.4999999999999716,"value":1},{"time":97.3333333333333,"length":1.059777391433414,"value":2},{"time":98.66666666666666,"length":1.3333333333333144,"value":1},{"time":99.99999999999997,"length":1.333333333333357,"value":0.7099999999999999},{"time":101.33333333333333,"length":1.3333333333333144,"value":1},{"time":103.99999999999999,"length":1.3333333333333144,"value":1},{"time":105.5,"length":0.1666666666666572,"value":9.219999999999999},{"time":105.66666666666666,"length":1,"value":3.6300000000000145},{"time":106.66666666666666,"length":1.3333333333333144,"value":1},{"time":107.99999999999997,"length":1.333333333333357,"value":6.199999999999992},{"time":109.33333333333333,"length":1.3333333333333144,"value":1}]}],["Trails/active",{"items":[{}]}],["SceneDynamic/active",{"items":[{},{"time":90.66666666666666,"length":20}]}],["SceneCrystals/active",{"items":[{},{"time":109.33333333333333,"length":44.66666666666667}]}],["FlickyParticles/active",{"items":[{},{"time":48,"length":62.66666666666666},{"time":112,"length":42}]}],["SphereParticles/active",{"items":[{},{"time":112,"length":41.333333333333314}]}],["SceneCrystals/ChaosTorus/active",{"items":[{"time":-8.200000000000001},{},{"time":121.33333333333333,"length":1.3333333333333286}]}],["Phantom/amp",{"items":[{},{"time":112,"length":1.3333333333333286,"curve":31}]}],["SceneCrystals/light/amp",{"items":[{},{"time":112,"length":1.3333333333333286,"curve":31}]}],["IFSAsUsual/active",{"items":[{},{"time":98.66666666666666,"length":2.6666666666666856}]}],["IFSAsUsual/ifsSeed",{"items":[{"time":98.66666666666666,"value":3.850000000002135},{"time":100,"value":6.374792659378448},{"time":100.16666666666666,"length":0.1666666666666572,"value":6.379868935734952,"curve":15,"speed":4.000000000000053,"amp":0.6201310642650482},{"time":100.33333333333331,"length":0.2500000000000142,"value":7,"curve":15,"speed":4.000000000000053,"amp":0.5},{"time":100.58333333333333,"length":0.2500000000000142,"value":7.5,"curve":15,"speed":4.000000000000053,"amp":0.5},{"time":100.83333333333334,"length":0.1666666666666572,"value":8,"curve":15,"speed":4.000000000000053,"amp":0.5},{"time":101,"length":0.0833333333333286,"value":-0.07450980392156825,"curve":15,"speed":4.000000000000053,"amp":0.07450980392156825},{"time":101.08333333333333,"length":0.0833333333333286,"value":-0.07450980392156825,"curve":15,"speed":4.000000000000053,"amp":0.07450980392156825},{"time":101.16666666666666,"length":0.041666666666671404,"value":-0.07450980392156825,"curve":15,"speed":4.000000000000053,"amp":0.07450980392156825},{"time":101.20833333333333,"length":0.041666666666671404,"value":-0.07450980392156825,"curve":15,"speed":4.000000000000053,"amp":0.07450980392156825},{"time":101.25,"length":0.041666666666671404,"value":-0.07450980392156825,"curve":15,"speed":4.000000000000053,"amp":0.07450980392156825},{"time":101.29166666666667,"length":0.041666666666671404,"value":-0.07450980392156825,"curve":15,"speed":4.000000000000053,"amp":0.07450980392156825}]}],["FlashyBall/active",{"items":[{},{"time":96,"length":2.6666666666666856},{"time":106.66666666666666,"length":2.6666666666666856}]}],["FlashyBall/distortAmp",{"items":[{"time":96},{"time":97.33333333333333,"length":1.3333333333333286,"curve":42,"amp":2.1099999999999985},{"time":106.66666666666666},{"time":108,"length":1.3333333333333286,"curve":42,"amp":2.1199999999999983}]}],["Tetrahedron/active",{"items":[{},{"time":93.33333333333333,"length":2.6666666666666856},{"time":104,"length":2.6666666666666856}]}],["Tetrahedron/distortAmp",{"items":[{"time":93.33333333333333},{"time":94.66666666666666,"length":1.3333333333333286,"curve":3,"offset":1.6666666666666856},{"time":104},{"time":105.33333333333333,"length":1.0000000000000142,"curve":8,"offset":0.26762905097568646,"speed":0.8028871529270708}]}],["NoiseVoxels/active",{"items":[{},{"time":90.66666666666666,"length":2.6666666666666856},{"time":101.33333333333333,"length":2.6666666666666856}]}],["NoiseVoxels/phase",{"items":[{"time":90.66666666666666,"length":1.3333333333333333,"curve":20},{"time":91.99999999999999,"length":1.3333333333333333,"curve":20,"amp":3},{"time":101.33333333333333,"length":1.3333333333333333,"curve":20},{"time":102.66666666666666,"length":1.3333333333333333,"curve":20,"amp":3}]}],["Camera/pos/x",{"items":[{},{"time":48,"value":0.029999999999999923},{"time":50.666666666666664,"value":0.22},{"time":53.333333333333336,"value":-0.3300000000000002},{"time":58.666666666666664,"value":0.030000000000000478},{"time":61.333333333333336,"value":0.4300000000000005},{"time":64,"value":-0.3099999999999998},{"time":66.66666666666666,"value":0.04000000000000473},{"time":69.33333333333333,"value":0.2500000000000004},{"time":71.99999999999999,"value":0.22},{"time":74.66666666666666,"value":0.18999999999999975},{"time":77.33333333333333,"value":-0.33000000000000024},{"time":79.99999999999999,"value":0.030000000000000478},{"time":82.66666666666666,"value":-0.32999999999999946},{"time":85.33333333333333,"value":6.349087922075114e-16},{"time":88},{"time":90.66666666666666},{"time":117.33333333333333,"value":0.2599999999999958},{"time":122.66666666666666,"value":-0.25000000000000006},{"time":128}]}],["Camera/pos/y",{"items":[{},{"time":48},{"time":53.333333333333336,"value":0.18999999999999986},{"time":58.666666666666664},{"time":69.33333333333333},{"time":74.66666666666666,"value":-0.2599999999999998},{"time":79.99999999999999},{"time":87.99999999999999},{"time":90.66666666666666},{"time":104},{"time":117.33333333333333,"value":0.009999999999995882},{"time":122.66666666666666},{"time":128},{"time":149.33333333333331,"value":1.3599999999999999}]}],["Camera/pos/z",{"items":[{},{"time":48},{"time":64,"value":-0.12999999999999998},{"time":66.66666666666666,"value":0.04000000000000473},{"time":69.33333333333333},{"time":85.33333333333333,"value":-0.019999999999999588},{"time":87.99999999999999},{"time":90.66666666666666}]}],["Camera/rot/r",{"items":[{},{"time":5.333333333333333,"length":4,"value":5,"curve":17,"amp":10},{"time":26.033333333333335,"length":4,"value":5,"curve":18,"amp":-2},{"time":42,"length":4,"value":3,"curve":18,"amp":4},{"time":48,"value":3.316984746376379},{"time":50.666666666666664,"value":4.160000000000001},{"time":53.33333333333333,"value":2.9236224967058},{"time":56,"value":4.760000000000006},{"time":58.666666666666664,"value":3.490000000000002},{"time":61.333333333333336,"value":3.289999999999999},{"time":64,"value":2.519999999999998},{"time":66.66666666666666,"value":5.050000000000004},{"time":69.33333333333333,"value":4.170000000000001},{"time":71.99999999999999,"value":4.399999999999997},{"time":74.66666666666666,"value":2.699999999999999},{"time":77.33333333333333,"value":5.470000000000008},{"time":79.99999999999999,"value":3.4499999999999997},{"time":82.66666666666666,"value":4.43},{"time":85.33333333333333,"value":2.9000000000000017},{"time":88,"value":4.900000000000005},{"time":89.33333333333331,"length":1.3333333333333428,"value":4.9,"curve":28,"speed":0.4999999999999974,"amp":4.4999999999999964},{"time":90.66666666666666,"length":1.3333333333333286,"value":6,"curve":17,"speed":3.000000000000011,"amp":5},{"time":91.99999999999999,"value":5.88},{"time":93.33333333333333,"length":1.3333333333333286,"value":6,"curve":17,"speed":3.000000000000011,"amp":5},{"time":94.66666666666666,"value":2.4699999999999975},{"time":96,"length":1.3333333333333286,"value":6,"curve":17,"speed":3.000000000000011,"amp":5},{"time":97.33333333333333,"value":7.749999999999996},{"time":98.66666666666666,"length":1.3333333333333286,"value":6,"curve":17,"speed":3.000000000000011,"amp":5},{"time":99.99999999999999,"value":5},{"time":101.33333333333333,"length":1.3333333333333286,"value":6,"curve":17,"speed":3.000000000000011,"amp":5},{"time":104,"length":1.3333333333333286,"value":6,"curve":17,"speed":3.000000000000011,"amp":5},{"time":105.33333333333333,"value":2.4699999999999984},{"time":106.66666666666666,"length":1.3333333333333286,"value":6,"curve":17,"speed":3.000000000000011,"amp":5},{"time":107.99999999999999,"value":7.589999999999998},{"time":109.33333333333333,"length":1.3333333333333286,"value":6,"curve":17,"speed":3.000000000000011,"amp":5},{"time":110.66666666666666,"value":6.369999999999991},{"time":111.33333333333333,"length":4,"value":6.369999999999991,"curve":18,"speed":1.0000000000000002,"amp":-2.5399999999999983},{"time":117.33333333333333,"value":2.939999999999995},{"time":121.33333333333333,"length":1.3333333333333286,"value":6.110000000000004,"curve":31,"amp":-0.99},{"time":122.66666666666666,"length":5.333333333333329,"value":3.4599999999999933,"curve":24,"speed":0.5000000000000013,"amp":-1.2000000000000026},{"time":127.99999999999999,"value":5.5899999999999945},{"time":130,"length":3.3333333333333144,"value":5.589999999999992,"curve":18,"speed":1.0000000000000002,"amp":-2},{"time":133.33333333333331,"value":2.6600000000000015},{"time":144,"value":2.05},{"time":149.33333333333331,"value":1.8299999999999976},{"time":152,"length":2,"value":1.8299999999999996,"curve":18,"speed":0.5,"amp":1.7899999999999974}]}],["Camera/rot/t",{"items":[{},{"time":26.666666666666664,"length":5.333333333333332,"curve":19,"speed":0.2499999999999999,"amp":0.30000000000000004},{"time":31.999999999999996,"length":5.333333333333332,"value":1.2000000000000002,"curve":19,"speed":0.2499999999999999,"amp":-0.9},{"time":37.333333333333336,"length":5.333333333333329,"value":-0.3,"curve":19,"speed":0.2499999999999999,"amp":0.30000000000000004},{"time":48,"value":0.12000000000000001},{"time":50.666666666666664,"value":-0.30999999999999495},{"time":53.333333333333336,"value":0.5200000000000048},{"time":56,"value":-0.029999999999995274},{"time":58.666666666666664,"value":0.2600000000000046},{"time":61.333333333333336,"value":-0.2899999999999953},{"time":64,"value":-0.06999999999999539},{"time":66.66666666666666,"value":0.2600000000000049},{"time":69.33333333333333,"value":0.12000000000000001},{"time":71.99999999999999,"value":0.7500000000000049},{"time":74.66666666666666,"value":-0.3599999999999952},{"time":77.33333333333333,"value":-1.1999999999999946},{"time":79.99999999999999,"value":0.2600000000000046},{"time":82.65764496093742,"value":-0.2899999999999953},{"time":85.33333333333333,"value":0.39000000000000457},{"time":87.99999999999999,"value":-0.029999999999995274},{"time":90.66666666666666},{"time":91.99999999999999,"value":0.5700000000000002},{"time":93.33333333333333},{"time":94.66666666666666,"value":0.10000000000000003},{"time":95.99999999999999},{"time":98.66666666666666},{"time":100,"value":-0.2799999999999997},{"time":101.33333333333333},{"time":102.66666666666666,"value":0.52},{"time":103.99999999999999},{"time":105.33333333333333,"value":-0.4100000000000001},{"time":106.66666666666666},{"time":108,"value":-0.1399999999999995},{"time":109.33333333333333},{"time":110.66666666666666,"value":0.14999999999999633},{"time":117.33333333333333,"value":0.5699999999999952},{"time":121.33333333333331,"length":1.3333333333333428,"value":0.37000000000000166,"curve":24,"speed":1.9999999999999891,"amp":-0.08000000000000007},{"time":122.66666666666666,"value":0.09999999999999977},{"time":128,"value":0.2},{"time":133.33333333333331,"value":0.4699999999999978},{"time":144,"value":-0.3700000000000031},{"time":149.33333333333331,"value":0.18000000000000063},{"time":151.86425044104683,"length":2.066666666666663,"value":0.18,"curve":18,"speed":0.5,"amp":-1.160000000000004}]}],["Camera/rot/p",{"items":[{},{"time":26.666666666666664,"length":5.333333333333332,"curve":19,"speed":0.2499999999999999,"amp":0.30000000000000004},{"time":32,"value":-2.3500000000000125},{"time":37.333333333333336,"length":5.333333333333329,"value":-0.3,"curve":19,"speed":0.2499999999999999,"amp":0.30000000000000004},{"time":48,"length":2.6666666666666643,"curve":24},{"time":50.666666666666664,"length":2.6666666666666714,"value":-0.9690196078431373,"curve":24},{"time":53.333333333333336,"length":2.6666666666666714,"value":-0.33999999999999997,"curve":24},{"time":56.00000000000001,"length":2.6666666666666714,"value":-0.39117647058823524,"curve":24},{"time":58.66666666666668,"length":2.6666666666666714,"value":-0.12117647058823516,"curve":24},{"time":61.33333333333335,"length":2.6666666666666714,"value":-1.4311764705882353,"curve":24},{"time":64.00000000000003,"length":2.6666666666666714,"value":-0.29117647058823515,"curve":24},{"time":66.66666666666669,"length":2.6666666666666714,"value":-0.7811764705882349,"curve":24},{"time":69.33333333333336,"length":2.6666666666666643,"curve":24},{"time":72.00000000000001,"length":2.6666666666666714,"value":-0.9690196078431373,"curve":24},{"time":74.66666666666669,"length":2.6666666666666714,"value":-0.51,"curve":24},{"time":77.33333333333336,"length":2.6666666666666714,"value":-0.5111764705882352,"curve":24},{"time":80.00000000000003,"length":2.6666666666666714,"value":-0.6411764705882351,"curve":24},{"time":82.6666666666667,"length":2.6666666666666714,"value":-1.3611764705882354,"curve":24},{"time":85.33333333333337,"length":2.6666666666666714,"value":-0.4911764705882345,"curve":24},{"time":88.00000000000004,"length":1.3333333333333286,"value":-1.5411764705882351,"curve":24},{"time":89.33333333333337,"length":1.333333333333286,"value":-1.016,"curve":28,"speed":0.5000000000000079,"amp":3},{"time":90.66666666666666},{"time":91.99999999999999,"length":1.3333333333333428,"curve":20,"amp":6},{"time":93.33333333333333},{"time":94.66666666666664,"length":1.3333333333333428,"curve":20,"amp":0.21000000000000407},{"time":95.99999999999999},{"time":97.33333333333331,"length":1.3333333333333428,"curve":20,"amp":6},{"time":98.66666666666666},{"time":100,"length":1.3333333333333286,"value":-0.51,"curve":20,"amp":0.6200000000000041},{"time":101.33333333333333},{"time":102.66666666666666,"length":1.3333333333333428,"value":-1.0699999999999998,"curve":20,"amp":6},{"time":104},{"time":105.33333333333331,"length":1.3333333333333428,"value":7.999999999999989,"curve":20,"amp":-0.582999999999996},{"time":106.66666666666666},{"time":107.99999999999999,"length":1.3333333333333428,"curve":20,"amp":6},{"time":109.33333333333333},{"time":110.66666666666666,"value":0.56},{"time":112,"length":5.333333333333329,"value":0.56,"curve":24,"speed":0.5000000000000013,"amp":-1.0400000000000003},{"time":117.33333333333333,"length":3.999999999999986,"value":0.6199999999999997,"curve":24,"speed":0.5000000000000012,"amp":-1.0400000000000003},{"time":121.33333333333331,"length":1.3333333333333428,"value":-0.3799999999999981,"curve":24,"speed":1.9999999999999891,"amp":0.56},{"time":122.66666666666666,"length":5.333333333333329,"value":0.37000000000000166,"curve":24,"speed":0.5000000000000013,"amp":-0.7100000000000002},{"time":127.99999999999999,"length":2.6666666666666714,"value":-0.71,"curve":24,"speed":0.9999999999999998,"amp":0.71},{"time":133.33333333333331,"length":10.666666666666686,"curve":20,"speed":0.12499999999999978,"amp":-14.000000000000476},{"time":144,"length":10.666666666666657,"curve":20,"speed":0.1093749999999997,"amp":-14.000000000000476}]}],["Camera/roll",{"items":[{"time":5.333333333333334,"length":21.333333333333332,"value":-0.2500000000000003,"curve":21,"speed":0.1875},{"time":32,"value":-1.190000000000011},{"time":37.33333333333333,"length":5.333333333333329,"value":-0.3,"curve":19,"speed":0.2499999999999999,"amp":0.30000000000000004},{"time":48},{"time":53.333333333333336,"value":0.25},{"time":56},{"time":58.666666666666664,"value":-0.14},{"time":61.333333333333336,"value":-0.460000000000002},{"time":64},{"time":66.66666666666666},{"time":69.33333333333333,"value":0.54},{"time":71.99999999999999,"value":0.15},{"time":74.66666666666666,"value":-0.25},{"time":77.33333333333333,"value":0.5000000000000004},{"time":79.99999999999999,"value":0.33000000000000007},{"time":82.66666666666666,"value":0.23000000000000007},{"time":85.33333333333333,"value":2.380000000000001},{"time":88},{"time":89.33333333333331,"length":1.3333333333333428,"curve":28,"speed":0.4999999999999974,"amp":3},{"time":90.66666666666666},{"time":94.66666666666666,"value":0.06999999999999995},{"time":96},{"time":101.33333333333333},{"time":102.66666666666666,"value":-0.26000000000000006},{"time":104.00158889323498},{"time":105.33333333333333,"value":0.2599999999999987},{"time":106.66666666666666},{"time":108,"value":-0.33000000000000124},{"time":109.33333333333333},{"time":112,"length":5.333333333333329,"curve":24,"speed":0.5000000000000013,"amp":-0.2700000000000004},{"time":117.33333333333333,"value":0.32999999999999585},{"time":121.33333333333333,"value":-0.10000000000000413},{"time":122.66666666666666,"length":5.333333333333329,"value":0.10999999999999989,"curve":24,"speed":0.5000000000000013,"amp":0.049999999999999524},{"time":127.99999999999999},{"time":133.33333333333331,"value":0.4699999999999978},{"time":144,"value":-0.3300000000000022}]}],["Rings/begin",{"items":[{},{"time":110.66666666666666,"length":1.3333333333333428,"curve":20}]}],["Camera/shake",{"items":[{},{"time":48,"length":1,"curve":27},{"time":50.666666666666664,"length":1,"curve":27},{"time":53.333333333333336,"length":1,"curve":27},{"time":56,"length":1,"curve":27},{"time":58.666666666666664,"length":1,"curve":27},{"time":61.333333333333336,"length":1,"curve":27},{"time":64,"length":1,"curve":27},{"time":66.66666666666666,"length":1,"curve":27},{"time":69.33333333333333,"length":1,"curve":27},{"time":71.99999999999999,"length":1,"curve":27},{"time":74.66666666666666,"length":1,"curve":27},{"time":77.33333333333333,"length":1,"curve":27},{"time":79.99999999999999,"length":1,"curve":27},{"time":82.66666666666666,"length":1,"curve":27},{"time":85.33333333333333,"length":1,"curve":27},{"time":88,"length":1,"curve":27},{"time":121.33333333333333,"length":1.3333333333333286,"value":0.01999999999999999,"reset":true},{"time":149.33333333333331,"length":4,"curve":33,"amp":0.020000000000000004},{"time":153.33333333333331,"length":1.3333333333333428,"curve":34,"amp":0.5499999999999999}]}],["Camera/fov",{"items":[{"value":0.5},{"time":48,"value":0.8},{"time":90.66666666666666,"value":0.5},{"time":110.66666666666666,"value":0.8},{"time":152.1,"length":2.066666666666663,"value":0.8,"curve":18,"speed":0.5,"amp":0.3599999999999957}]}],["DVi/amp",{"items":[{},{"time":112,"length":1.3333333333333286,"curve":31},{"time":149.33333333333331}]}],["DVi/offset",{"items":[{"time":112,"length":2.6666666666666856,"curve":31,"speed":0.4999999999999947,"amp":19.999999999999993}]}],["Post/colorPreset",{"items":[{},{"time":48,"value":1},{"time":112,"value":2}]}],["Greetings/active",{"items":[{},{"time":133.33333333333331,"length":16}]}],["Post/mixInvert",{"items":[{},{"time":121.33333333333333,"length":1.3333333333333286,"value":1,"reset":true}]}],["Phantom/active",{"items":[{},{"time":111.33333333333333,"length":42.66666666666667}]}],["Crystal/beam/charge",{"items":[{},{"time":149.33333333333331,"length":4,"curve":35,"amp":0.36000000000000004},{"time":153.33333333333331,"length":1.3333333333333428,"curve":34,"amp":0.9599999999999995}]}],["Crystal/beam/shot",{"items":[{},{"time":153.33333333333331,"length":1.3333333333333428,"curve":34,"amp":0.9599999999999995}]}],["Crystal/beam/ring",{"items":[{},{"time":152,"length":2.666666666666657,"curve":36,"speed":0.7614331254621488,"amp":10.469999999999992}]}],["Post/mosaicAmp",{"items":[{},{"time":117.33333333333333,"length":2.666666666666657,"curve":37,"speed":0.7614331254621488,"amp":0.07},{"time":121.33333333333333,"length":1.3333333333333286,"curve":37,"speed":0.7614331254621488,"amp":0.07},{"time":122.66666666666666,"length":2.666666666666657,"curve":37,"speed":0.7614331254621488,"amp":0.07},{"time":128,"length":2.666666666666657,"curve":37,"speed":0.7614331254621488,"amp":0.07},{"time":133.33333333333331,"length":2.666666666666657,"curve":37,"speed":0.7614331254621488,"amp":0.07},{"time":144,"length":2.666666666666657,"curve":37,"speed":0.7614331254621488,"amp":0.07},{"time":149.33333333333331,"length":2.666666666666657,"curve":37,"speed":0.7614331254621488,"amp":0.07}]}],["IFSAsUsual/distortAmp",{"items":[]}]],"labels":{"zero":0,"begin":5.333333333333333,"neuro":48,"porterfuckingrobinson":112,"fuckingcamellia":90.66666666666666,"psy":154.66666666666666,"greetings":133.33333333333331},"guiSettings":{"snapTimeActive":true,"snapTimeInterval":0.1,"snapValueActive":true,"snapValueInterval":0.5,"snapBeatActive":true,"bpm":180,"beatOffset":0,"useBeatInGUI":true,"minimizedPrecisionTime":3,"minimizedPrecisionValue":3}} \ No newline at end of file +{"version":"4.1.1","resolution":400,"curves":[{"nodes":[[0,1,0,0,0.16140350877192983],[1,0,-0.47719298245614045]]},{"nodes":[[],[0.6666666666666666,1,-0.4560629631300563,-0.1852941176470587],[0.6666666666666666,0,0,0,0.26644908616188,0.1029411764705882],[2,1.1900000000000002,-0.1],[2,0.00686274509803933,0,0,0.10652741514360319],[2.6666666666666665,0.7000000000000001],[2.6666666666666665,0,0,0,0.1391644908616188,0.5215686274509802],[3.333333333333333,0.9,-0.5014360313315928,-0.22647058823529403],[3.333333333333333,0,0,0,0.3974946346535474,0.10043744264185422],[4.666666666666666,1.2000000000000002,0,0,0.1],[4.666666666666666],[5.333333333333333,0.7000000000000001,-0.24079400848586707,-0.49736814906842436],[5.333333333333333],[6,0.8,-0.4356422056174482,-0.17156862745098037],[6,0,0,0,0.32852235276081576,0.05490196078431372],[7.333333333333333,1.1441176470588237,-0.1,0,0.1],[7.333333333333333],[8,0.3333],[8,0,0,0,0.08806743643105143,0.4254901960784307],[8.666666666666666,0.9,-0.3995834676293276,-0.08230605476940031],[8.666666666666666],[9.4,1.1,-0.2785205844025618,-0.17156862745098012,0.2785205844025618,0.17156862745098012],[10,1.3],[10],[10.666666666666666,0.6000000000000001,-0.11225401796276425,-0.5783350570563074]],"fxs":[{"def":"repeat","params":{"interval":0.2299999999999996},"time":7.333333333333333,"length":0.6666666666666667}]},{"nodes":[[0,0,0,0,0.12284595300261082,0.061764705882352944],[0.6666666666666666,0.4,-0.1],[0.6666666666666666,0.06568627450980391],[2,0.2],[2.236344893790143,0.4,-0.1,0,0.1],[2.6666666666666665,0,-0.34575086532310695,0,0.04271204452939744],[2.769918291305192,0.1,-0.05130523784998782,0,0.09999999999999999],[3.333333333333333,0.1],[3.6666666666666665,0.32774323388394533],[4.666666666666666,0.30000000000000004],[4.666666666666666,0.023323265139934546],[5.333333333333333,0.1],[5.333333333333333],[6,0.30000000000000004],[6,0.02745098039215696,0,0,0.09974597868276715,-0.006845312262542842],[7.333333333333333,0.1,-0.1],[7.333333333333333,0.7000000000000001],[8.666666666666666,0.7000000000000001],[8.666666666666666,1],[10,0.1],[10.666666666666666]]},{"nodes":[[0,0,0,0,0.1],[0.3333333333333333,1,-0.1,0,0.1],[0.6666666666666666,0,-0.1],[1.9166666666666665,1,-1.0007832898172324,0,0.06],[2],[2.025071712633245,1,-0.044516971279373374,0,0.1],[2.1623944411350506,0.5,-0.07221383357420871,0.2738348538091391,0.07221383357420871,-0.2738348538091391],[2.6666666666666665,0,-0.1,0,0.1],[3,1,-0.2864316909347707,0,0.24406085208595923],[3.333333333333333,0,-0.036443741726782705,0.4106336078810942],[3.6666666666666665,0.7544057184393509,-0.08631141286229893,-0.07178801363349067,0.13346814639852406,0.11100980502520727],[4.666666666666666,1,-0.33942558746736295,-0.018347344929083464,0.09208797505724492,-0.3264027483296351],[4.851079899134173,0.30000000000000004,-0.07486057061026631,-0.013179150760383026,0.1],[5.0444017511428605,0.9656862745098039,-0.1,0,0.1],[5.333333333333333,0.044689231228471016,-0.1,0,0.1],[5.666666666666666,1,-0.1,0,0.1],[6,0,-0.1],[7.333333333333333,1,-1.0426547051383652,0,0.1],[7.6000000000000005,0.7000000000000001,-0.1,0,0.1],[8,1],[8,0,-0.1,0,0.1],[8.166666666666666,1,-0.099988538641853,-0.006965859231865531],[8.489362746562259,1,0,0,0.09998887794379856,-0.006861981819672439],[8.666666666666666,0,-0.11262160793957762,0.041182622607896624],[8.9,1,-0.11617352813418727,-0.020588235294117612,0.11617352813418727,0.020588235294117612],[9.04400609908224,0.15784313725490162,-0.0988340957186134,-0.027450980392156817,0.0988340957186134,0.027450980392156817],[9.3,1,-0.09200304954112025,-0.041176470588235224,0.09200304954112025,0.041176470588235224],[9.5,0.2,-0.09449923761471994,-0.06176470588235285,0.09449923761471994,0.06176470588235285],[9.666666666666666,1,-0.08899847522943988,-0.027450980392156817,0.08899847522943988,0.027450980392156817],[10,0.30000000000000004,-0.06149466330303955,-0.06176470588235285,0.06149466330303955,0.06176470588235285],[10,1,-0.1,0,0.1],[10.666666666666666,0.1,-0.1,0,0.1]],"fxs":[{"def":"repeat","params":{"interval":0.2490000000000001},"time":2,"length":0.6666666666666665},{"def":"sine","params":{"amp":0.26,"freq":8.590000000000002,"offset":0},"time":3.934411837854859,"length":0.7322548288118069},{"def":"sine","params":{"amp":0.4400000000000004,"freq":5.889999999999998,"offset":0},"time":10.234266741175261,"length":0.4323999254914046},{"def":"hermitePatch","params":{},"time":3.821100533282267,"length":0.12610951070520438,"row":1},{"def":"hermitePatch","params":{},"time":10.18270758125172,"length":0.09198590579094379,"row":1}]},{"nodes":[[0,0,0,0,0.1],[0.6666666666666666,1,-0.1],[0.6666666666666666,0.04000000000000001],[2,0.019999999999999997],[2,0.4],[2.6666666666666665],[3.333333333333333,0.2,-0.1],[3.333333333333333,0.5],[4.666666666666666,0.6000000000000001],[4.666666666666666,0.059594068084455554],[5.333333333333333],[6,0.1],[7.333333333333333,0,-1.3219093627620064,-0.061764705882352944],[8],[8,0.8],[10,0.8],[10,0.1],[10.666666666666666]]},{"nodes":[[0,0,0,0,0.11631853785900784,0.15784313725490196],[0.3333333333333333,0.2,-0.1,-0.06862745098039215],[0.3333333333333333,0,0,0,0.10652741514360313,0.034313725490196074],[0.6257615317667536,0.4,-0.035197899213743125,-0.1178437887562426,0.05762038784328031,0.19291505927163513],[1.5833333333333333,1.6588235294117648,-0.14423846823324632,-0.08235294117647059],[1.5833333333333333,0,0,0,0.0706266318537859,0.12352941176470589],[1.8333333333333333,0.6000000000000001,-0.07923141560987097,-0.16655319476142408,0.05223508415950609,0.10980392156862741],[2,0.8,-0.07118673688066018,-0.08235294117647059]]},{"nodes":[[0,0.7000000000000001,0,0,0.14895561357702347,-0.7343137254901958],[0.6666666666666666,0.01999999999999999,-0.07958650842810296,0.0005266470222471706,0.7602446192333546,-0.005030759268204068],[1.75,0.2,-0.175065274151436,-0.0480392156862745],[2,1,-0.1]]},{"nodes":[[0,0.264705882352941,0,0,0.2664490861618798,-0.3705882352941175],[1.75,0,-0.1,0,0.1],[2,1,-0.1]]},{"nodes":[[0,0,0,0,0.1],[0.3333333333333333,0.9460784313725474,-0.1,0,0.1],[1.3333333333333333,0.3627450980392144,-0.11276290315437737,0.31798356313506776,0.058202350589290165,-0.16412659044332573],[1.6666666666666665,1,-0.1,0,0.1],[1.7304177545691903,0.1,-0.1,0,0.1],[2,1.4000000000000001,-0.05099116999738633,-0.5930547707442783]],"fxs":[{"def":"sine","params":{"amp":0.3999999999999999,"freq":17.779999999999987,"offset":0},"time":0.6103133159268926,"length":0.7230200174064406},{"def":"hermitePatch","params":{},"time":0.5580939947780674,"length":0.08289817232376029,"row":1},{"def":"hermitePatch","params":{},"time":1.2836814621409922,"length":0.11631853785900792,"row":1}]},{"nodes":[[0,1,0,0,0.06843643544269563,-0.8715686274509801],[0.6666666666666666,0,-0.47719298245614045]]},{"nodes":[[],[2,2]]},{"nodes":[[0,0.1],[1.3333333333333333,0.30000000000000004]]},{"nodes":[[],[1.3333333333333333]]},{"nodes":[[0,0,0,0,0.07564543093234954,0.8647058823529409],[1.3333333333333333,1]]},{"nodes":[[],[0.3333333333333333,0.333],[0.3333333333333333,0,0,0,0.04050107306929012,0.096078431372549],[0.5833333333333333,0.30000000000000004,-0.10502788587794674,-0.054901960784313704],[1.3333333333333333]],"fxs":[{"def":"repeat","params":{"interval":0.2499999999999999},"time":0.3333333333333333,"length":1}]},{"nodes":[[0,0,0,0,0.041253263707571805],[0.1,0.472549019607836,-0.044516971279373374,-0.2333333333333331,0.037233176309202774,0.19515571003904697],[1.3333333333333333,1,-1.2945169712793734]]},{"nodes":[[0,0,0,0,0.1],[0.8,0.9,-0.10634811016391839,-0.09574850838471399,0.10634811016391839,0.09574850838471399],[1,1,-0.034837955875665044,-0.008249475331448328]]},{"nodes":[[0,1,0,0,0.08905168734696595,-0.6204705716763121],[0.8,0.1,-0.3657976094933656,0.05238364149449456,0.3657976094933656,-0.05238364149449456],[4,0,-0.5779474714155504]]},{"nodes":[[0,0,0,0,0.33333333333333337],[0.5833333333333333,0.13137254901960788,-0.06553651288762144,-0.14663596634864273,0.06553651288762144,0.14663596634864273],[0.6673629242819844,0.7480392156862745,-0.06736292428198434,-0.16470588235294117,0.06736292428198434,0.16470588235294117],[1.563751087902524,0.9519607843137257,-0.20443864229765013,-0.02745098039215686,0.20443864229765013,0.02745098039215686],[4,1,-0.5779474714155504]]},{"nodes":[[0,0,0,0,0.3154046997389034],[1.3333333333333333,1,-0.29908616187989556]]},{"nodes":[[],[1.3333333333333333,1]]},{"nodes":[[0,1,0,0,0.08905168734696595,-0.6204705716763121],[4,0,-3.146485330423383]]},{"nodes":[[0,1,0,0,0.15000000000000002],[0.25,1,-0.1,0,0.047780678851174936],[0.3333333333333333,0,-0.006527415143603133,0.3068670573880632,0.04083550913838122,0.1415436161688415],[0.4601827676240209,0,-0.031462140992167105,0.14076447719138005,0.031462140992167105,0.08154620354285587],[0.5515665796344648,0,-0.024934725848563967,0.05959145643516391,0.03472584856396867,0.040773101771427935],[0.6364229765013054,0,-0.024934725848563963,0.02509113955164797],[1,0,0,0,0.35333333333333333],[2.333333333333333,1,-0.3643603133159269,0,0.1]]},{"nodes":[[0,0,0,0,0.3317232375979112],[2,1,-1.3746781892076712]]},{"nodes":[[0,0,0,0,0.28276762402088773],[2.6666666666666665,1,-0.4673674842468357]]},{"nodes":[[0,0,0,0,0.429634464751958],[2.6666666666666665,0.99,-1.447911227154047]]},{"nodes":[[0,1,0,0,0.03472584856396867,-0.3705882352941176],[0.6666666666666666,0,-0.6417754569190601]]},{"nodes":[[0,0.4166666666666666,0,0,0.1],[0.6666666666666666,0,-0.664621409921671]]},{"nodes":[[0,0,0,0,0.1],[1.0065274151436032,0.9480392156862747,-0.791906005221932,-0.19215686274509805,0.17102946263472904,0.04150048712872081],[1.3333333333333333,1,-0.1]]},{"nodes":[[0,0,0,0,0.09780980358890974,0.020588235294117938],[0.3333333333333333,1,-0.04311987540653206,-0.9333333333333332]]},{"nodes":[[0,0.2],[1.3333333333333333,1.8,-1.0186386106576615,-0.609915244226372]]},{"nodes":[[0,0,0,0,0.011879895561357705,0.5490196078431372],[1.3333333333333333,1,-1.2292428198433418]]},{"nodes":[[0,0,0,0,0.1],[1,0,-0.1]]},{"nodes":[[0,0,0,0,0.9453002610966057],[4,1]]},{"nodes":[[0,0.9539215686274509,0,0,0.11305483028720623,-0.5970588235294118],[0.3333333333333333,0.1294117647058824,-0.07715404699738904,0.05490196078431372,0.07715404699738904,-0.05490196078431372],[1.3333333333333333,0,-1.133333333333333]]},{"nodes":[[0,0,0,0,3.415926892950391],[4,1]]},{"nodes":[[0,0.9539215686274509,0,0,0.15548302872062658,-0.6039215686274509],[1.3333333333333333,0,-0.6862053959965185]]},{"nodes":[[0,0.9539215686274509,0,0,0.06736292428198429,-0.6862745098039215],[1.3333333333333333,0,-1.208398607484769]]},{"nodes":[[],[0.16666666666666666,0.16642898215255936],[0.16666666666666666],[0.3333333333333333,0.1728044353004796],[0.3333333333333333,0,0,0,0.04050107306929012,0.096078431372549],[0.5833333333333333,0.30000000000000004,-0.10502788587794674,-0.054901960784313704],[1.3333333333333333]],"fxs":[{"def":"repeat","params":{"interval":0.2499999999999999},"time":0.3333333333333333,"length":1}]},{"nodes":[[],[0.16666666666666666,0.16642898215255936],[0.16666666666666666],[0.3333333333333333,0.1728044353004796],[0.3333333333333333,0,0,0,0.3126188615546539,0.15175152819068202],[1.1666666666666665,1,-0.1572879554706029,-0.28764433356035396],[1.1666666666666665,0.3653790156299723],[1.3333333333333333]]},{"nodes":[[],[0.16666666666666666,0.333],[0.16666666666666666],[0.3333333333333333,0.659941132909589],[0.3333333333333333,0,0,0,0.04050107306929012,0.096078431372549],[0.5833333333333333,0.30000000000000004,-0.10502788587794674,-0.054901960784313704],[1],[1.0833333333333333,0.10984958946310308,-0.05834560450044708,-0.037115397878755355],[1.3333333333333333]],"fxs":[{"def":"repeat","params":{"interval":0.2499999999999999},"time":0.3333333333333333,"length":0.6624660750216953},{"def":"repeat","params":{"interval":0.08199999999999981},"time":1,"length":0.33333333333333326},{"def":"repeat","params":{"interval":0.040999999999999204},"time":1.1666666666666665,"length":0.16666666666666674,"row":1}]},{"nodes":[[0,0.1],[0.3333333333333333,1.2904533929940294],[1.3333333333333333,0.053457044213489124,-0.8632620739919382,0.12473310316480792]]},{"nodes":[[0,1],[0.3333333333333333,0.43235294117647044],[0.3333333333333333,1,0,0,0.04376478064109168,-0.28137254901960784],[0.5833333333333333,0.44607843137254904,-0.11808271616515305,0.10980392156862744],[1.3333333333333333]],"fxs":[{"def":"repeat","params":{"interval":0.2499999999999999},"time":0.3333333333333333,"length":1}]},{"nodes":[[0,0.9539215686274509,0,0,0.034725848563968625,-9.752547353570001e-17],[0.6666666666666666,0,-0.343516100957354]]},{"nodes":[[],[0.3333333333333333],[0.3333333333333333,-0.05198601764452032],[0.6666666666666666,-0.05003067313800835],[0.6666666666666666,0.08137254901960772],[1,0.048075328631496494],[1,-0.06985411519380896],[1.3333333333333333,0.0678987706872971],[1.3333333333333333,-0.04483877862480479],[1.6666666666666665,-0.059133256664235745],[1.6666666666666665,0.026633611572350058],[2,0.030207231082207797],[2,0.17315201147651754],[2.333333333333333,0.1910201090258063],[2.333333333333333,-0.059133256664235745],[2.6666666666666665,-0.06075153166758168]]},{"nodes":[[],[0.3333333333333333],[0.3333333333333333,0.5848468902973432],[0.6666666666666666,0.6616434679226759],[0.6666666666666666,-0.8860315941263585],[1,-0.808569470793401],[1,1],[1.3333333333333333,1.0695142284764083],[1.3333333333333333,-2],[1.6666666666666665,-2.2305568969182348],[1.6666666666666665,0.026633611572350058],[2,0.030207231082207797],[2,1.5],[2.333333333333333,1.7457274844900992],[2.333333333333333,-0.6390158901210896],[2.6666666666666665,-0.5],[2.6666666666666665,3.188286829112519],[3,3.409441685547314]]},{"nodes":[[0,3,0,0,0.520892711478413],[16.400000000000002,65]]},{"nodes":[[0,1],[1,1,0,0,0.054029590948651],[1.3333333333333333,0,-0.2860313315926893]]},{"nodes":[[0,0,0,0,0.1],[1,0,-0.1]]},{"nodes":[[0,0,0,0,0.1],[0.6666666666666666,1,-0.1,0,0.1],[4.666666666666666,1,-0.1,0,0.1],[5.333333333333333,0,-0.1]]},{"nodes":[[0,1],[0.6666666666666666,0,-0.37741514360313316]]}],"channels":[["EnvironmentMap/accumulate",{"items":[{},{"time":5.333333333333333,"length":1,"value":0.1,"curve":26,"amp":0.9},{"time":48,"length":1,"value":0.1,"curve":26,"amp":0.9},{"time":90.66666666666666,"length":1,"value":0.1,"curve":26,"amp":0.9},{"time":110.66666666666666,"length":1,"value":0.1,"curve":26,"amp":0.9},{"time":121.33333333333333,"length":1,"value":0.1,"curve":26,"amp":0.9},{"time":122.66666666666666,"length":1,"value":0.1,"curve":26,"amp":0.9},{"time":154,"length":1,"value":0.9,"curve":26,"amp":0.1}]}],["Glitch/amp",{"items":[{},{"time":48,"length":1,"curve":0},{"time":50.666666666666664,"length":1,"curve":0},{"time":53.333333333333336,"length":1,"curve":0},{"time":56,"length":1,"curve":0},{"time":58.666666666666664,"length":1,"curve":0},{"time":61.333333333333336,"length":1,"curve":0},{"time":64,"length":1,"curve":0},{"time":66.66666666666666,"length":1,"curve":0},{"time":69.33333333333333,"length":1,"curve":0},{"time":71.99999999999999,"length":1,"curve":0},{"time":74.66666666666666,"length":1,"curve":0},{"time":77.33333333333333,"length":1,"curve":0},{"time":79.99999999999999,"length":1,"curve":0},{"time":82.66666666666666,"length":1,"curve":0},{"time":85.33333333333333,"length":1,"curve":0},{"time":88,"length":1,"curve":0},{"time":149.33333333333331,"length":4,"curve":33,"amp":0.5000000000000002},{"time":153.33333333333331,"length":1.3333333333333428,"value":0.53,"reset":true}]}],["PixelSorter/amp",{"items":[{},{"time":48,"length":1.3333333333333357,"curve":9,"speed":0.4999999999999975},{"time":50.666666666666664,"length":1.3333333333333357,"curve":9,"speed":0.4999999999999975},{"time":53.333333333333336,"length":1.3333333333333357,"curve":9,"speed":0.4999999999999975},{"time":56,"length":1.3333333333333357,"curve":9,"speed":0.4999999999999975},{"time":58.666666666666664,"length":1.3333333333333357,"curve":9,"speed":0.4999999999999975},{"time":61.333333333333336,"length":1.3333333333333357,"curve":9,"speed":0.4999999999999975},{"time":64,"length":1.3333333333333357,"curve":9,"speed":0.4999999999999975},{"time":66.66666666666666,"length":1.3333333333333357,"curve":9,"speed":0.4999999999999975},{"time":69.33333333333333,"length":1.3333333333333357,"curve":9,"speed":0.4999999999999975},{"time":71.99999999999999,"length":1.3333333333333357,"curve":9,"speed":0.4999999999999975},{"time":74.66666666666666,"length":1.3333333333333357,"curve":9,"speed":0.4999999999999975},{"time":77.33333333333333,"length":1.3333333333333357,"curve":9,"speed":0.4999999999999975},{"time":79.99999999999999,"length":1.3333333333333357,"curve":9,"speed":0.4999999999999975},{"time":82.66666666666666,"length":1.3333333333333357,"curve":9,"speed":0.4999999999999975},{"time":85.33333333333333,"length":1.3333333333333357,"curve":9,"speed":0.4999999999999975},{"time":87.99999999999999,"length":1.3333333333333357,"curve":9,"speed":0.4999999999999975},{"time":90.30000000000001,"length":0.3333333333333286,"curve":29,"speed":1.0000000000000153,"amp":-0.4},{"time":90.66666666666666,"length":0.3333333333333428,"curve":9,"speed":1.999999999999927},{"time":93.33333333333333,"length":0.3333333333333428,"curve":9,"speed":1.999999999999927},{"time":96,"length":0.3333333333333428,"curve":9,"speed":1.999999999999927},{"time":97.33333333333333},{"time":98.66666666666667,"length":0.3333333333333428,"curve":9,"speed":1.999999999999927},{"time":101.33333333333333,"length":0.3333333333333428,"curve":9,"speed":1.999999999999927},{"time":104,"length":0.3333333333333428,"curve":9,"speed":1.999999999999927},{"time":106.66666666666667,"length":0.3333333333333428,"curve":9,"speed":1.999999999999927},{"time":109.33333333333333,"length":0.3333333333333428,"curve":9,"speed":1.999999999999927},{"time":153.33333333333331,"length":0.6666666666666856,"value":0.53},{"time":154,"length":0.6666666666666572,"value":0.08000000000000004,"reset":true}]}],["Serial/enable",{"items":[{},{"time":91.99999999999999,"length":1.3333333333333428},{"time":94.66666666666666,"length":1.3333333333333428},{"time":97.33333333333333,"length":1.3333333333333428},{"time":99.99999999999999,"length":1.3333333333333428},{"time":102.66666666666666,"length":1.3333333333333428},{"time":105.33333333333333,"length":1.3333333333333428},{"time":107.99999999999999,"length":1.3333333333333428},{"time":110.66666666666666,"length":1.3333333333333428},{"time":153.33333333333331,"length":1.3333333333333428}]}],["SceneBegin/active",{"items":[{},{"time":5.333333333333333,"length":42.666666666666664}]}],["Sync/first/clap",{"items":[{},{"time":27.666666666666664,"length":1.3333333333333321,"curve":15},{"time":28.999999999999996,"length":1.3333333333333321,"value":1,"curve":15},{"time":30.33333333333333,"length":1.3333333333333321,"value":2,"curve":15},{"time":31.66666666666666,"length":1.3333333333333321,"value":3,"curve":15},{"time":32.99999999999999,"length":1.3333333333333321,"value":4,"curve":15},{"time":34.33333333333333,"length":1.3333333333333321,"value":5,"curve":15},{"time":35.66666666666666,"length":1.3333333333333321,"value":6,"curve":15},{"time":36.99999999999999,"length":1.3333333333333321,"value":7,"curve":15},{"time":38.33333333333332,"length":1.3333333333333321,"value":8,"curve":15},{"time":39.66666666666665,"length":1.3333333333333321,"value":9,"curve":15},{"time":40.99999999999998,"length":1.3333333333333321,"value":10,"curve":15},{"time":42.33333333333331,"length":1.3333333333333321,"value":11,"curve":15}]}],["Condition/hahaRatio",{"items":[{},{"time":42.666666666666664,"length":4,"curve":25},{"time":159.75338772105422,"length":1,"value":0.5,"curve":26,"amp":0.16}]}],["Condition/phaseWidth",{"items":[{"value":0.1},{"time":27.666666666666664,"length":20.333333333333332,"value":0.1,"curve":16,"speed":0.049180327868852465,"amp":0.5888750576601328}]}],["SceneNeuro/active",{"items":[{},{"time":48,"length":42.66666666666666}]}],["sufferText/push",{"items":[{"time":48},{"time":50.666666666666664,"value":1},{"time":53.333333333333336,"value":2},{"time":56,"value":3},{"time":58.666666666666664,"value":4},{"time":61.333333333333336,"value":5},{"time":64,"value":6},{"time":66.66666666666666,"value":7},{"time":69.33333333333333,"value":8},{"time":71.99999999999999,"value":9},{"time":74.66666666666666,"value":10},{"time":77.33333333333333,"value":11},{"time":79.99999999999999,"value":12},{"time":82.66666666666666,"value":13},{"time":85.33333333333333,"value":14},{"time":87.99999999999999,"value":15}]}],["IFSPistons/group0/rot",{"items":[{},{"time":48.666666666666664,"length":2,"curve":23},{"time":54,"length":2,"value":1,"curve":23},{"time":59.333333333333336,"length":2,"value":2,"curve":23},{"time":64.66666666666666,"length":2,"value":3,"curve":23},{"time":69.99999999999999,"length":2,"value":4,"curve":23},{"time":75.33333333333333,"length":2,"value":5,"curve":23},{"time":80.66666666666666,"length":2,"value":6,"curve":23},{"time":85.99999999999999,"length":2,"value":7,"curve":23}]}],["IFSPistons/group1/rot",{"items":[{},{"time":51.333333333333336,"length":2,"curve":23},{"time":56.666666666666664,"length":2,"value":1,"curve":23},{"time":62,"length":2,"value":2,"curve":23},{"time":67.33333333333333,"length":2,"value":3,"curve":23},{"time":72.66666666666666,"length":2,"value":4,"curve":23},{"time":77.99999999999999,"length":2,"value":5,"curve":23},{"time":83.33333333333333,"length":2,"value":6,"curve":23},{"time":88.66666666666666,"length":2,"value":7,"curve":23}]}],["IFSPistons/group0/pos",{"items":[{"value":3},{"time":47.666666666666664,"length":2.3333333333333357,"value":1.2000000000000002,"curve":22,"amp":1.7999999999999998},{"time":53,"length":2.3333333333333357,"value":1.2000000000000002,"curve":22,"amp":1.7999999999999998},{"time":58.333333333333336,"length":2.3333333333333357,"value":1.2000000000000002,"curve":22,"amp":1.7999999999999998},{"time":63.666666666666664,"length":2.3333333333333357,"value":1.2000000000000002,"curve":22,"amp":1.7999999999999998},{"time":69.03333333333333,"length":2.3333333333333357,"value":1.2000000000000002,"curve":22,"amp":1.7999999999999998},{"time":74.33333333333333,"length":2.3333333333333357,"value":1.2000000000000002,"curve":22,"amp":1.7999999999999998},{"time":79.66666666666666,"length":2.3333333333333357,"value":1.2000000000000002,"curve":22,"amp":1.7999999999999998},{"time":84.99999999999999,"length":2.3333333333333357,"value":1.2000000000000002,"curve":22,"amp":1.7999999999999998}]}],["IFSPistons/group1/pos",{"items":[{"value":3},{"time":50.333333333333336,"length":2.3333333333333357,"value":1.2000000000000002,"curve":22,"amp":1.7999999999999998},{"time":55.666666666666664,"length":2.3333333333333357,"value":1.2000000000000002,"curve":22,"amp":1.7999999999999998},{"time":61,"length":2.3333333333333357,"value":1.2000000000000002,"curve":22,"amp":1.7999999999999998},{"time":66.33333333333333,"length":2.3333333333333357,"value":1.2000000000000002,"curve":22,"amp":1.7999999999999998},{"time":71.66666666666666,"length":2.3333333333333357,"value":1.2000000000000002,"curve":22,"amp":1.7999999999999998},{"time":76.99999999999999,"length":2.3333333333333357,"value":1.2000000000000002,"curve":22,"amp":1.7999999999999998},{"time":82.33333333333333,"length":2.3333333333333357,"value":1.2000000000000002,"curve":22,"amp":1.7999999999999998},{"time":87.66666666666666,"length":2.3333333333333357,"value":1.2000000000000002,"curve":22,"amp":1.7999999999999998}]}],["Music/NEURO_TIME",{"items":[{},{"time":48,"length":10.666666666666664,"curve":1},{"time":58.666666666666664,"length":8.666666666666671,"curve":1},{"time":67.33333333333333,"length":1.999999999999993,"curve":5},{"time":69.33333333333333,"length":10.666666666666664,"curve":1},{"time":79.99999999999999,"length":8.666666666666671,"curve":1},{"time":88.66666666666666,"length":0.6666666666666714,"curve":5},{"time":89.33333333333333,"length":1.3333333333333286,"curve":30},{"time":90.66666666666666,"length":1.3333333333333286,"curve":10,"offset":1.4210854715202004e-14},{"time":91.99999999999999,"length":1.3333333333333286,"curve":14},{"time":93.33333333333331,"length":1.3333333333333428,"curve":10},{"time":94.66666666666666,"length":1.3333333333333286,"curve":39},{"time":95.99999999999999,"length":1.3333333333333428,"curve":10},{"time":97.33333333333333,"length":1.3333333333333286,"curve":14},{"time":98.66666666666666,"length":1.3333333333333428,"curve":10},{"time":100,"length":1.3333333333333286,"curve":40},{"time":101.33333333333333,"length":1.3333333333333428,"curve":10},{"time":102.66666666666667,"length":1.3333333333333144,"curve":14},{"time":103.99999999999999,"length":1.3333333333333428,"curve":10},{"time":105.33333333333333,"length":1.3333333333333286,"curve":39},{"time":106.66666666666666,"length":1.3333333333333428,"curve":10},{"time":108,"length":1.3333333333333286,"curve":14},{"time":109.33333333333333,"length":1.3333333333333428,"curve":10}]}],["Music/NEURO_DETUNE",{"items":[{},{"time":48,"length":10.666666666666664,"curve":2},{"time":58.666666666666664,"length":8.666666666666671,"curve":2},{"time":67.33333333333333,"length":1.999999999999993,"curve":6},{"time":69.33333333333333,"length":10.666666666666664,"curve":2},{"time":79.99999999999999,"length":8.666666666666671,"curve":2},{"time":88.66666666666666,"length":2,"curve":6,"speed":0.8333333333333358},{"time":90.66666666666666,"length":1.3333333333333286,"curve":11},{"time":93.33333333333333,"length":1.3333333333333286,"curve":11},{"time":95,"length":0.9999999999999858,"curve":2,"offset":2},{"time":95.99999999999999,"length":1.3333333333333286,"curve":11},{"time":97.33333333333331,"length":1.3333333333333428,"value":0.77},{"time":98.66666666666666,"length":1.3333333333333286,"curve":11},{"time":99.99999999999999,"length":1.3333333333333428,"curve":41},{"time":101.33333333333333,"length":1.3333333333333286,"curve":11},{"time":103.99999999999999,"length":1.3333333333333286,"curve":11},{"time":105.66666666666667,"length":0.9999999999999858,"curve":2,"offset":2},{"time":106.66666666666666,"length":1.3333333333333286,"curve":11},{"time":107.99999999999999,"length":1.3333333333333428,"value":0.77},{"time":109.33333333333333,"length":1.3333333333333286,"curve":11}]}],["Music/NEURO_DETUNE_PHASE",{"items":[{},{"time":48,"length":10.666666666666664,"curve":4},{"time":58.666666666666664,"length":8.666666666666671,"curve":4},{"time":67.33333333333333,"length":1.999999999999993,"curve":7},{"time":69.33333333333333,"length":10.666666666666664,"curve":4},{"time":79.99999999999999,"length":8.666666666666671,"curve":4},{"time":88.66666666666666,"length":2,"curve":7,"speed":0.8333333333333358},{"time":90.66666666666666,"length":1.3333333333333428,"curve":12},{"time":93.33333333333333,"length":1.3333333333333428,"curve":12},{"time":95,"length":0.9999999999999858,"curve":4,"offset":1.9999999999999858},{"time":95.99999999999999,"length":1.3333333333333428,"curve":12},{"time":98.66666666666666,"length":1.3333333333333428,"curve":12},{"time":101.33333333333333,"length":1.3333333333333428,"curve":12},{"time":103.99999999999999,"length":1.3333333333333428,"curve":12},{"time":105.66666666666667,"length":0.9999999999999858,"curve":4,"offset":1.9999999999999858},{"time":106.66666666666666,"length":1.3333333333333428,"curve":12},{"time":109.33333333333333,"length":1.3333333333333428,"curve":12}]}],["Music/NEURO_WUB_AMP",{"items":[{},{"time":48,"length":10.668578038364203,"curve":3},{"time":58.6685780383642,"length":8.664755294969133,"curve":3},{"time":67.33333333333333,"length":2.0038227433950624,"curve":8},{"time":69.33715607672839,"length":10.668578038364203,"curve":3},{"time":80.0057341150926,"length":8.660932551574064,"curve":3},{"time":88.66666666666666,"length":2,"curve":8,"speed":0.8028871529270708},{"time":90.66666666666666,"length":1.3333333333333333,"curve":13},{"time":93.33333333333333,"length":1.3333333333333333,"curve":13},{"time":94.66666666666666,"length":1.3333333333333286,"curve":3,"offset":1.6666666666666856},{"time":95.99999999999999,"length":1.3333333333333333,"curve":13},{"time":98.66666666666666,"length":1.3333333333333333,"curve":13},{"time":101.33333333333333,"length":1.3333333333333333,"curve":13},{"time":103.99999999999999,"length":1.3333333333333333,"curve":13},{"time":105.33333333333331,"length":1.0000000000000142,"curve":8,"offset":0.26762905097568646,"speed":0.8028871529270708},{"time":106.66666666666666,"length":1.3333333333333333,"curve":13},{"time":109.33333333333333,"length":1.3333333333333333,"curve":13}]}],["Music/NEURO_WUB_FREQ",{"items":[{},{"time":48,"length":2,"value":1},{"time":50,"length":0.6666666666666643,"value":0.49999999999999967},{"time":50.666666666666664,"length":0.6666666666666714,"value":1},{"time":51.333333333333336,"length":1.3333333333333286,"value":2},{"time":52.666666666666664,"length":0.6666666666666714,"value":2.5},{"time":53.333333333333336,"length":0.6666666666666643,"value":1},{"time":54,"length":1.3333333333333357,"value":1},{"time":55.333333333333336,"length":0.6666666666666643,"value":2},{"time":56,"length":2,"value":1},{"time":58,"length":0.6666666666666643,"value":2},{"time":58.666666666666664,"length":0.6666666666666714,"value":1},{"time":59.333333333333336,"length":1.3333333333333286,"value":2.1000000000000014},{"time":60.666666666666664,"length":0.6666666666666714,"value":0.5},{"time":61.333333333333336,"length":0.6666666666666643,"value":7},{"time":62,"length":1.3333333333333357,"value":3},{"time":63.333333333333336,"length":0.6666666666666714,"value":1},{"time":64,"length":0.6666666666666714,"value":0.9600000000000006},{"time":64.66666666666667,"length":1.3333333333333215,"value":6},{"time":66,"length":0.6666666666666785,"value":10.840000000000003},{"time":66.66666666666667,"length":0.6666666666666572,"value":1},{"time":67.33333333333333,"length":1.3333333333333428,"value":3.989999999999996},{"time":68.66666666666667,"length":0.6666666666666572,"value":4.109999999999999},{"time":69.33333333333333,"length":2,"value":1},{"time":71.33333333333333,"length":0.6666666666666643,"value":0.49999999999999967},{"time":71.99999999999999,"length":0.6666666666666714,"value":1},{"time":72.66666666666666,"length":1.3333333333333286,"value":2},{"time":73.99999999999999,"length":0.6666666666666714,"value":2.5},{"time":74.66666666666666,"length":0.6666666666666643,"value":1},{"time":75.33333333333333,"length":1.3333333333333357,"value":1},{"time":76.66666666666667,"length":0.6666666666666643,"value":2},{"time":77.33333333333333,"length":2,"value":1},{"time":79.33333333333333,"length":0.6666666666666643,"value":2},{"time":79.99999999999999,"length":0.6666666666666714,"value":1},{"time":80.66666666666666,"length":1.3333333333333286,"value":2.1000000000000014},{"time":81.99999999999999,"length":0.6666666666666714,"value":0.5},{"time":82.66666666666666,"length":0.6666666666666643,"value":7},{"time":83.33333333333333,"length":1.3333333333333357,"value":3},{"time":84.66666666666667,"length":0.6666666666666714,"value":1},{"time":85.33333333333334,"length":0.6666666666666714,"value":0.9600000000000006},{"time":86.00000000000001,"length":1.3333333333333144,"value":6},{"time":87.33333333333333,"length":0.6666666666666856,"value":10.840000000000003},{"time":88.00000000000001,"length":0.6666666666666572,"value":1},{"time":88.66666666666667,"length":1.3333333333333428,"value":3.9899999999999993},{"time":90.00000000000001,"length":0.6666666666666572,"value":4.109999999999999},{"time":90.66666666666667,"length":1.3333333333333144,"value":1},{"time":93.33333333333333,"length":1.3333333333333144,"value":1},{"time":94.83333333333333,"length":0.1666666666666714,"value":7.320000000000001},{"time":95,"length":0.8333333333333286,"value":0.3800000000000011},{"time":95.83333333333333,"length":1.4999999999999716,"value":1},{"time":97.3333333333333,"length":1.059777391433414,"value":2},{"time":98.66666666666666,"length":1.3333333333333144,"value":1},{"time":99.99999999999997,"length":1.333333333333357,"value":0.7099999999999999},{"time":101.33333333333333,"length":1.3333333333333144,"value":1},{"time":103.99999999999999,"length":1.3333333333333144,"value":1},{"time":105.5,"length":0.1666666666666572,"value":9.219999999999999},{"time":105.66666666666666,"length":1,"value":3.6300000000000145},{"time":106.66666666666666,"length":1.3333333333333144,"value":1},{"time":107.99999999999997,"length":1.333333333333357,"value":6.199999999999992},{"time":109.33333333333333,"length":1.3333333333333144,"value":1}]}],["Trails/active",{"items":[{}]}],["SceneDynamic/active",{"items":[{},{"time":90.66666666666666,"length":20}]}],["SceneCrystals/active",{"items":[{},{"time":109.33333333333333,"length":44.66666666666667}]}],["FlickyParticles/active",{"items":[{},{"time":48,"length":62.66666666666666},{"time":112,"length":42}]}],["SphereParticles/active",{"items":[{},{"time":112,"length":41.333333333333314}]}],["SceneCrystals/ChaosTorus/active",{"items":[{"time":-8.200000000000001},{},{"time":121.33333333333333,"length":1.3333333333333286}]}],["Phantom/amp",{"items":[{},{"time":112,"length":1.3333333333333286,"curve":31}]}],["SceneCrystals/light/amp",{"items":[{},{"time":112,"length":1.3333333333333286,"curve":31}]}],["IFSAsUsual/active",{"items":[{},{"time":98.66666666666666,"length":2.6666666666666856}]}],["IFSAsUsual/ifsSeed",{"items":[{},{"time":98.66666666666667,"length":1.3333333333333333,"value":3.75,"curve":20,"amp":0.12999999999999956},{"time":100,"value":6.387075950831853},{"time":100.16666666666666,"length":0.1666666666666572,"value":6.379868935734952,"curve":15,"speed":4.000000000000053,"amp":0.6201310642650482},{"time":100.33333333333331,"length":0.2500000000000142,"value":7,"curve":15,"speed":4.000000000000053,"amp":0.5},{"time":100.58333333333333,"length":0.2500000000000142,"value":7.5,"curve":15,"speed":4.000000000000053,"amp":0.5},{"time":100.83333333333334,"length":0.1666666666666572,"value":8,"curve":15,"speed":4.000000000000053,"amp":0.5},{"time":101,"length":0.0833333333333286,"value":-0.07450980392156825,"curve":15,"speed":4.000000000000053,"amp":0.07450980392156825},{"time":101.08333333333333,"length":0.0833333333333286,"value":-0.07450980392156825,"curve":15,"speed":4.000000000000053,"amp":0.07450980392156825},{"time":101.16666666666666,"length":0.041666666666671404,"value":-0.07450980392156825,"curve":15,"speed":4.000000000000053,"amp":0.07450980392156825},{"time":101.20833333333333,"length":0.041666666666671404,"value":-0.07450980392156825,"curve":15,"speed":4.000000000000053,"amp":0.07450980392156825},{"time":101.25,"length":0.041666666666671404,"value":-0.07450980392156825,"curve":15,"speed":4.000000000000053,"amp":0.07450980392156825},{"time":101.29166666666667,"length":0.041666666666671404,"value":-0.07450980392156825,"curve":15,"speed":4.000000000000053,"amp":0.07450980392156825}]}],["FlashyBall/active",{"items":[{},{"time":96,"length":2.6666666666666856},{"time":106.66666666666666,"length":2.6666666666666856}]}],["FlashyBall/distortAmp",{"items":[{"time":96},{"time":97.33333333333333,"length":1.3333333333333286,"curve":42,"amp":2.1099999999999985},{"time":106.66666666666666},{"time":108,"length":1.3333333333333286,"curve":42,"amp":2.1199999999999983}]}],["Tetrahedron/active",{"items":[{},{"time":93.33333333333333,"length":2.6666666666666856},{"time":104,"length":2.6666666666666856}]}],["Tetrahedron/distortAmp",{"items":[{"time":93.33333333333333},{"time":94.66666666666666,"length":1.3333333333333286,"curve":3,"offset":1.6666666666666856},{"time":104},{"time":105.33333333333333,"length":1.0000000000000142,"curve":8,"offset":0.26762905097568646,"speed":0.8028871529270708}]}],["NoiseVoxels/active",{"items":[{},{"time":90.66666666666666,"length":2.6666666666666856},{"time":101.33333333333333,"length":2.6666666666666856}]}],["NoiseVoxels/phase",{"items":[{"time":90.66666666666666,"length":1.3333333333333333,"curve":20},{"time":91.99999999999999,"length":1.3333333333333333,"curve":20,"amp":3},{"time":101.33333333333333,"length":1.3333333333333333,"curve":20},{"time":102.66666666666666,"length":1.3333333333333333,"curve":20,"amp":3}]}],["ScenePsy/active",{"items":[{},{"time":154,"length":38}]}],["Camera/pos/x",{"items":[{},{"time":48,"value":0.029999999999999923},{"time":50.666666666666664,"value":0.22},{"time":53.333333333333336,"value":-0.3300000000000002},{"time":58.666666666666664,"value":0.030000000000000478},{"time":61.333333333333336,"value":0.4300000000000005},{"time":64,"value":-0.3099999999999998},{"time":66.66666666666666,"value":0.04000000000000473},{"time":69.33333333333333,"value":0.2500000000000004},{"time":71.99999999999999,"value":0.22},{"time":74.66666666666666,"value":0.18999999999999975},{"time":77.33333333333333,"value":-0.33000000000000024},{"time":79.99999999999999,"value":0.030000000000000478},{"time":82.66666666666666,"value":-0.32999999999999946},{"time":85.33333333333333,"value":6.349087922075114e-16},{"time":88},{"time":90.66666666666666},{"time":117.33333333333333,"value":0.2599999999999958},{"time":122.66666666666666,"value":-0.25000000000000006},{"time":128},{"time":154,"value":0.53}]}],["Camera/pos/y",{"items":[{},{"time":48},{"time":53.333333333333336,"value":0.18999999999999986},{"time":58.666666666666664},{"time":69.33333333333333},{"time":74.66666666666666,"value":-0.2599999999999998},{"time":79.99999999999999},{"time":87.99999999999999},{"time":90.66666666666666},{"time":104},{"time":117.33333333333333,"value":0.009999999999995882},{"time":122.66666666666666},{"time":128},{"time":149.33333333333331,"value":1.3599999999999999},{"time":154}]}],["Camera/pos/z",{"items":[{},{"time":48},{"time":64,"value":-0.12999999999999998},{"time":66.66666666666666,"value":0.04000000000000473},{"time":69.33333333333333},{"time":85.33333333333333,"value":-0.019999999999999588},{"time":87.99999999999999},{"time":90.66666666666666}]}],["Camera/rot/r",{"items":[{},{"time":5.333333333333333,"length":4,"value":5,"curve":17,"amp":10},{"time":26.033333333333335,"length":4,"value":5,"curve":18,"amp":-2},{"time":42.1,"length":4,"value":3,"curve":18,"amp":4},{"time":48,"value":3.316984746376379},{"time":50.666666666666664,"value":4.160000000000001},{"time":53.33333333333333,"value":2.9236224967058},{"time":56,"value":4.760000000000006},{"time":58.666666666666664,"value":3.490000000000002},{"time":61.333333333333336,"value":3.289999999999999},{"time":64,"value":2.519999999999998},{"time":66.66666666666666,"value":5.050000000000004},{"time":69.33333333333333,"value":4.170000000000001},{"time":71.99999999999999,"value":4.399999999999997},{"time":74.66666666666666,"value":2.699999999999999},{"time":77.33333333333333,"value":5.470000000000008},{"time":79.99999999999999,"value":3.4499999999999997},{"time":82.66666666666666,"value":4.43},{"time":85.33333333333333,"value":2.9000000000000017},{"time":88,"value":4.900000000000005},{"time":89.33333333333331,"length":1.3333333333333428,"value":4.9,"curve":28,"speed":0.4999999999999974,"amp":4.4999999999999964},{"time":90.66666666666666,"length":1.3333333333333286,"value":6,"curve":17,"speed":3.000000000000011,"amp":5},{"time":91.99999999999999,"value":5.88},{"time":93.33333333333333,"length":1.3333333333333286,"value":6,"curve":17,"speed":3.000000000000011,"amp":5},{"time":94.66666666666666,"value":2.4699999999999975},{"time":96,"length":1.3333333333333286,"value":6,"curve":17,"speed":3.000000000000011,"amp":5},{"time":97.33333333333333,"value":7.749999999999996},{"time":98.66666666666666,"length":1.3333333333333286,"value":6,"curve":17,"speed":3.000000000000011,"amp":5},{"time":99.99999999999999,"value":5},{"time":101.33333333333333,"length":1.3333333333333286,"value":6,"curve":17,"speed":3.000000000000011,"amp":5},{"time":104,"length":1.3333333333333286,"value":6,"curve":17,"speed":3.000000000000011,"amp":5},{"time":105.33333333333333,"value":2.4699999999999984},{"time":106.66666666666666,"length":1.3333333333333286,"value":6,"curve":17,"speed":3.000000000000011,"amp":5},{"time":107.99999999999999,"value":7.589999999999998},{"time":109.33333333333333,"length":1.3333333333333286,"value":6,"curve":17,"speed":3.000000000000011,"amp":5},{"time":110.66666666666666,"value":4.339999999999998},{"time":111.33333333333333,"length":4,"value":4.34,"curve":18,"speed":1.0000000000000002,"amp":-1.2999999999999967},{"time":117.33333333333333,"value":2.939999999999995},{"time":121.33333333333333,"length":1.3333333333333286,"value":6.110000000000004,"curve":31,"amp":-0.99},{"time":122.66666666666666,"length":5.333333333333329,"value":3.4599999999999933,"curve":24,"speed":0.5000000000000013,"amp":-1.2000000000000026},{"time":127.99999999999999,"value":5.5899999999999945},{"time":130,"length":3.3333333333333144,"value":5.589999999999992,"curve":18,"speed":1.0000000000000002,"amp":-2},{"time":133.33333333333331,"value":2.6600000000000015},{"time":144,"value":2.05},{"time":149.33333333333331,"value":1.8299999999999976},{"time":152,"length":2,"value":1.8299999999999996,"curve":18,"speed":0.5,"amp":1.7899999999999974},{"time":154,"length":3.3333333333333144,"value":5,"curve":18,"offset":0.32538475665232625,"speed":0.5},{"time":157.33333333333331,"length":6.666666666666686,"value":6,"curve":19,"speed":0.19999999999999943,"amp":-3.170000000000002},{"time":165.16666666666666,"value":4.300000000000013},{"time":175.83333333333331,"length":16.166666666666686,"curve":46}]}],["Camera/rot/t",{"items":[{},{"time":26.666666666666664,"length":5.333333333333332,"curve":19,"speed":0.2499999999999999,"amp":0.30000000000000004},{"time":31.999999999999996,"length":5.333333333333332,"value":1.2000000000000002,"curve":19,"speed":0.2499999999999999,"amp":-0.9},{"time":37.333333333333336,"length":5.333333333333329,"value":-0.3,"curve":19,"speed":0.2499999999999999,"amp":0.30000000000000004},{"time":48,"value":0.12000000000000001},{"time":50.666666666666664,"value":-0.30999999999999495},{"time":53.333333333333336,"value":0.5200000000000048},{"time":56,"value":-0.029999999999995274},{"time":58.666666666666664,"value":0.2600000000000046},{"time":61.333333333333336,"value":-0.2899999999999953},{"time":64,"value":-0.06999999999999539},{"time":66.66666666666666,"value":0.2600000000000049},{"time":69.33333333333333,"value":0.12000000000000001},{"time":71.99999999999999,"value":0.7500000000000049},{"time":74.66666666666666,"value":-0.3599999999999952},{"time":77.33333333333333,"value":-1.1999999999999946},{"time":79.99999999999999,"value":0.2600000000000046},{"time":82.65764496093742,"value":-0.2899999999999953},{"time":85.33333333333333,"value":0.39000000000000457},{"time":87.99999999999999,"value":-0.029999999999995274},{"time":90.66666666666666},{"time":91.99999999999999,"value":0.5700000000000002},{"time":93.33333333333333},{"time":94.66666666666666,"value":0.10000000000000003},{"time":95.99999999999999},{"time":98.66666666666666},{"time":100,"value":-0.2799999999999997},{"time":101.33333333333333},{"time":102.66666666666666,"value":0.52},{"time":103.99999999999999},{"time":105.33333333333333,"value":-0.4100000000000001},{"time":106.66666666666666},{"time":108,"value":-0.1399999999999995},{"time":109.33333333333333},{"time":110.66666666666666,"value":0.14999999999999633},{"time":117.33333333333333,"value":0.5699999999999952},{"time":121.33333333333331,"length":1.3333333333333428,"value":0.37000000000000166,"curve":24,"speed":1.9999999999999891,"amp":-0.08000000000000007},{"time":122.66666666666666,"value":0.09999999999999977},{"time":128,"value":0.2},{"time":133.33333333333331,"value":0.4699999999999978},{"time":144,"value":-0.3700000000000031},{"time":149.33333333333331,"value":0.18000000000000063},{"time":151.86425044104683,"length":2.066666666666663,"value":0.18,"curve":18,"speed":0.5,"amp":-1.160000000000004},{"time":154},{"time":165.16666666666666,"length":2.666666666666657,"curve":44},{"time":167.83333333333331,"length":2.666666666666657,"curve":44},{"time":170.49999999999997,"length":2.666666666666657,"curve":44},{"time":173.16666666666663,"length":2.666666666666657,"curve":44},{"time":175.8333333333333,"length":0.16666666666671404}]}],["Camera/rot/p",{"items":[{},{"time":26.666666666666664,"length":5.333333333333332,"curve":19,"speed":0.2499999999999999,"amp":0.30000000000000004},{"time":32,"value":-2.3500000000000125},{"time":37.333333333333336,"length":5.333333333333329,"value":-0.3,"curve":19,"speed":0.2499999999999999,"amp":0.30000000000000004},{"time":48,"length":2.6666666666666643,"curve":24},{"time":50.666666666666664,"length":2.6666666666666714,"value":-0.9690196078431373,"curve":24},{"time":53.333333333333336,"length":2.6666666666666714,"value":-0.33999999999999997,"curve":24},{"time":56.00000000000001,"length":2.6666666666666714,"value":-0.39117647058823524,"curve":24},{"time":58.66666666666668,"length":2.6666666666666714,"value":-0.12117647058823516,"curve":24},{"time":61.33333333333335,"length":2.6666666666666714,"value":-1.4311764705882353,"curve":24},{"time":64.00000000000003,"length":2.6666666666666714,"value":-0.29117647058823515,"curve":24},{"time":66.66666666666669,"length":2.6666666666666714,"value":-0.7811764705882349,"curve":24},{"time":69.33333333333336,"length":2.6666666666666643,"curve":24},{"time":72.00000000000001,"length":2.6666666666666714,"value":-0.9690196078431373,"curve":24},{"time":74.66666666666669,"length":2.6666666666666714,"value":-0.51,"curve":24},{"time":77.33333333333336,"length":2.6666666666666714,"value":-0.5111764705882352,"curve":24},{"time":80.00000000000003,"length":2.6666666666666714,"value":-0.6411764705882351,"curve":24},{"time":82.6666666666667,"length":2.6666666666666714,"value":-1.3611764705882354,"curve":24},{"time":85.33333333333337,"length":2.6666666666666714,"value":-0.4911764705882345,"curve":24},{"time":88.00000000000004,"length":1.3333333333333286,"value":-1.5411764705882351,"curve":24},{"time":89.33333333333337,"length":1.333333333333286,"value":-1.016,"curve":28,"speed":0.5000000000000079,"amp":3},{"time":90.66666666666666},{"time":91.99999999999999,"length":1.3333333333333428,"curve":20,"amp":6},{"time":93.33333333333333},{"time":94.66666666666664,"length":1.3333333333333428,"curve":20,"amp":0.21000000000000407},{"time":95.99999999999999},{"time":97.33333333333331,"length":1.3333333333333428,"curve":20,"amp":6},{"time":98.66666666666666},{"time":100,"length":1.3333333333333286,"value":0.12000000000000002,"curve":20,"amp":0.6200000000000041},{"time":101.33333333333333},{"time":102.66666666666666,"length":1.3333333333333428,"value":-1.0699999999999998,"curve":20,"amp":6},{"time":104},{"time":105.33333333333331,"length":1.3333333333333428,"value":7.999999999999989,"curve":20,"amp":-0.582999999999996},{"time":106.66666666666666},{"time":107.99999999999999,"length":1.3333333333333428,"curve":20,"amp":6},{"time":109.33333333333333},{"time":110.66666666666666,"value":0.56},{"time":112,"length":5.333333333333329,"value":0.56,"curve":24,"speed":0.5000000000000013,"amp":-1.0400000000000003},{"time":117.33333333333333,"length":3.999999999999986,"value":0.6199999999999997,"curve":24,"speed":0.5000000000000012,"amp":-1.0400000000000003},{"time":121.33333333333331,"length":1.3333333333333428,"value":-0.3799999999999981,"curve":24,"speed":1.9999999999999891,"amp":0.56},{"time":122.66666666666666,"length":5.333333333333329,"value":0.37000000000000166,"curve":24,"speed":0.5000000000000013,"amp":-0.7100000000000002},{"time":127.99999999999999,"length":2.6666666666666714,"value":-0.71,"curve":24,"speed":0.9999999999999998,"amp":0.71},{"time":133.33333333333331,"length":10.666666666666686,"curve":20,"speed":0.12499999999999978,"amp":-14.000000000000476},{"time":144,"length":10,"curve":20,"speed":0.1093749999999997,"amp":-14.000000000000476},{"time":154,"value":1.2000000000000002},{"time":154.66666666666666,"length":10.5,"value":1.2000000000000002,"curve":33,"speed":0.37500000000000033,"amp":2.100000000000002},{"time":165.16666666666666,"length":3,"curve":45},{"time":168.16666666666666,"length":3,"curve":45},{"time":171.16666666666666,"length":3,"curve":45},{"time":174.16666666666666,"length":1.6666666666666572,"curve":45},{"time":175.83333333333331,"length":0.16666666666668561}]}],["Camera/roll",{"items":[{"time":5.333333333333334,"length":21.333333333333332,"value":-0.2500000000000003,"curve":21,"speed":0.1875},{"time":32,"value":-1.190000000000011},{"time":37.33333333333333,"length":5.333333333333329,"value":-0.3,"curve":19,"speed":0.2499999999999999,"amp":0.30000000000000004},{"time":48},{"time":53.333333333333336,"value":0.25},{"time":56},{"time":58.666666666666664,"value":-0.14},{"time":61.333333333333336,"value":-0.460000000000002},{"time":64},{"time":66.66666666666666},{"time":69.33333333333333,"value":0.54},{"time":71.99999999999999,"value":0.15},{"time":74.66666666666666,"value":-0.25},{"time":77.33333333333333,"value":0.5000000000000004},{"time":79.99999999999999,"value":0.33000000000000007},{"time":82.66666666666666,"value":0.23000000000000007},{"time":85.33333333333333,"value":2.380000000000001},{"time":88},{"time":89.33333333333331,"length":1.3333333333333428,"curve":28,"speed":0.4999999999999974,"amp":3},{"time":90.66666666666666},{"time":94.66666666666666,"value":0.06999999999999995},{"time":96},{"time":101.33333333333333},{"time":102.66666666666666,"value":-0.26000000000000006},{"time":104.00158889323498},{"time":105.33333333333333,"value":0.2599999999999987},{"time":106.66666666666666},{"time":108,"value":-0.33000000000000124},{"time":109.33333333333333},{"time":112,"length":5.333333333333329,"curve":24,"speed":0.5000000000000013,"amp":-0.2700000000000004},{"time":117.33333333333333,"value":0.32999999999999585},{"time":121.33333333333333,"value":-0.10000000000000413},{"time":122.66666666666666,"length":5.333333333333329,"value":0.10999999999999989,"curve":24,"speed":0.5000000000000013,"amp":0.049999999999999524},{"time":127.99999999999999},{"time":133.33333333333331,"value":0.4699999999999978},{"time":144,"value":-0.3300000000000022},{"time":154},{"time":154.66666666666666,"length":10.5,"curve":33,"speed":0.37500000000000033,"amp":2.100000000000002},{"time":165.16666666666666,"length":1.6666666666666572,"curve":45,"offset":1},{"time":166.83333333333331,"length":2.6666666666666856,"curve":45},{"time":169.5,"length":2.6666666666666856,"curve":45},{"time":172.16666666666669,"length":2.6666666666666856,"curve":45},{"time":174.83333333333337,"length":0.9999999999999432,"curve":45},{"time":175.83333333333331,"length":0.16666666666668561,"value":-0.27500000000000036}]}],["Rings/begin",{"items":[{},{"time":110.66666666666666,"length":1.3333333333333428,"curve":20}]}],["Camera/shake",{"items":[{},{"time":48,"length":1,"curve":27},{"time":50.666666666666664,"length":1,"curve":27},{"time":53.333333333333336,"length":1,"curve":27},{"time":56,"length":1,"curve":27},{"time":58.666666666666664,"length":1,"curve":27},{"time":61.333333333333336,"length":1,"curve":27},{"time":64,"length":1,"curve":27},{"time":66.66666666666666,"length":1,"curve":27},{"time":69.33333333333333,"length":1,"curve":27},{"time":71.99999999999999,"length":1,"curve":27},{"time":74.66666666666666,"length":1,"curve":27},{"time":77.33333333333333,"length":1,"curve":27},{"time":79.99999999999999,"length":1,"curve":27},{"time":82.66666666666666,"length":1,"curve":27},{"time":85.33333333333333,"length":1,"curve":27},{"time":88,"length":1,"curve":27},{"time":121.33333333333333,"length":1.3333333333333286,"value":0.01999999999999999,"reset":true},{"time":149.33333333333331,"length":4,"curve":33,"amp":0.020000000000000004},{"time":153.33333333333331,"length":1.3333333333333428,"curve":34,"amp":0.5499999999999999}]}],["Camera/fov",{"items":[{"value":0.5},{"time":48,"value":0.8},{"time":90.66666666666666,"value":0.5},{"time":110.66666666666666,"value":0.8},{"time":152.1,"length":1.9000000000000057,"value":0.8,"curve":18,"speed":0.5,"amp":0.3599999999999957},{"time":154,"value":0.9}]}],["DVi/amp",{"items":[{},{"time":112,"length":1.3333333333333286,"curve":31},{"time":149.33333333333331}]}],["DVi/offset",{"items":[{"time":112,"length":2.6666666666666856,"curve":31,"speed":0.4999999999999947,"amp":19.999999999999993}]}],["Post/colorPreset",{"items":[{},{"time":48,"value":1},{"time":112,"value":2}]}],["Greetings/active",{"items":[{},{"time":133.33333333333331,"length":16}]}],["Post/mixInvert",{"items":[{},{"time":121.33333333333333,"length":1.3333333333333286,"value":1,"reset":true}]}],["Crystal/enableDepth",{"items":[{"time":109.33333333333333,"length":1.3333333333333286}]}],["Crystal/beam/charge",{"items":[{},{"time":149.33333333333331,"length":4,"curve":35,"amp":0.36000000000000004},{"time":153.33333333333331,"length":1.3333333333333428,"curve":34,"amp":0.9599999999999995}]}],["Crystal/beam/shot",{"items":[{},{"time":153.33333333333331,"length":1.3333333333333428,"curve":34,"amp":0.9599999999999995}]}],["Crystal/beam/ring",{"items":[{},{"time":152,"length":2.666666666666657,"curve":36,"speed":0.7614331254621488,"amp":10.469999999999992}]}],["Post/mosaicAmp",{"items":[{},{"time":117.33333333333333,"length":2.666666666666657,"curve":37,"speed":0.7614331254621488,"amp":0.07},{"time":121.33333333333333,"length":1.3333333333333286,"curve":37,"speed":0.7614331254621488,"amp":0.07},{"time":122.66666666666666,"length":2.666666666666657,"curve":37,"speed":0.7614331254621488,"amp":0.07},{"time":128,"length":2.666666666666657,"curve":37,"speed":0.7614331254621488,"amp":0.07},{"time":133.33333333333331,"length":2.666666666666657,"curve":37,"speed":0.7614331254621488,"amp":0.07},{"time":144,"length":2.666666666666657,"curve":37,"speed":0.7614331254621488,"amp":0.07},{"time":149.33333333333331,"length":2.666666666666657,"curve":37,"speed":0.7614331254621488,"amp":0.07}]}],["BigBlur/amp",{"items":[{},{"time":5.333333333333333,"length":0.666666666666667,"curve":47,"offset":0.9999999999999627,"speed":0.5000000000000273,"amp":0.20999999999999935},{"time":32,"length":0.666666666666667,"curve":47,"offset":0.9999999999999627,"speed":0.5000000000000273,"amp":0.20999999999999935},{"time":37.33333333333333,"length":0.666666666666667,"curve":47,"offset":0.9999999999999627,"speed":0.5000000000000273,"amp":0.20999999999999935},{"time":154,"length":0.8000000000000398,"curve":47,"offset":0.5333333333332746,"amp":0.20999999999999935},{"time":181,"length":8.799999999999983,"curve":35,"speed":0.45454545454545536,"amp":1.4500000000000002}]}],["SufferTexts/active",{"items":[{"time":48,"length":42.66666666666666}]}],["TextOverlay/texture",{"items":[{"time":26.666666666666664},{"time":32,"value":1},{"time":37.33333333333333,"value":2},{"time":176,"value":3}]}],["TextOverlay/amp",{"items":[{},{"time":26.666666666666664,"length":5.333333333333336,"curve":49},{"time":32,"length":5.333333333333336,"curve":49},{"time":37.333333333333336,"length":5.333333333333336,"curve":49},{"time":184,"length":4,"curve":49}]}],["TestScreen/circle",{"items":[{"time":2.6666666666666665,"length":0.3333333333333335,"curve":50},{"time":3,"length":0.3333333333333335,"curve":50},{"time":3.3333333333333335,"length":0.3333333333333335,"curve":50},{"time":3.666666666666667,"length":0.3333333333333335,"curve":50},{"time":4,"length":0.3333333333333335,"curve":50},{"time":4.333333333333334,"length":0.3333333333333335,"curve":50},{"time":4.666666666666668,"length":0.3333333333333335,"curve":50},{"time":5.000000000000002,"length":0.3333333333333335,"curve":50}]}],["TestScreen/fade",{"items":[{"length":2.6666666666666665,"curve":20,"speed":0.5}]}],["TestScreen/mode",{"items":[{"value":1},{"time":2.6666666666666665,"value":2},{"time":5.333333333333333}]}],["SSR/active",{"items":[{"time":154,"length":38}]}],["Hooperball/deformSeed",{"items":[{"time":154,"value":13.679999999999938},{"time":165.16666666666666,"value":2},{"time":165.5,"value":3.249999999999995},{"time":165.83333333333331,"value":5.27999999999999},{"time":166.16666666666666,"value":6.569999999999989},{"time":166.5,"value":7.769999999999978},{"time":166.83333333333331,"value":8.979999999999974},{"time":167.16666666666666,"value":9.639999999999969},{"time":167.5,"value":10.329999999999961},{"time":167.83333333333331,"value":2},{"time":168.16666666666666,"value":3.249999999999995},{"time":168.5,"value":5.27999999999999},{"time":168.83333333333331,"value":6.569999999999989},{"time":169.16666666666666,"value":7.769999999999978},{"time":169.5,"value":8.979999999999974},{"time":169.83333333333331,"value":9.639999999999969},{"time":170.16666666666666,"value":10.329999999999961},{"time":170.5,"value":2},{"time":170.83333333333331,"value":3.249999999999995},{"time":171.16666666666666,"value":5.27999999999999},{"time":171.5,"value":6.569999999999989},{"time":171.83333333333331,"value":7.769999999999978},{"time":172.16666666666666,"value":8.979999999999974},{"time":172.5,"value":9.639999999999969},{"time":172.83333333333331,"value":10.329999999999961},{"time":173.16666666666666,"value":2},{"time":173.5,"value":3.249999999999995},{"time":173.83333333333331,"value":5.27999999999999},{"time":174.16666666666666,"value":6.569999999999989},{"time":174.5,"value":7.769999999999978},{"time":174.83333333333331,"value":8.979999999999974},{"time":175.16666666666666,"value":9.639999999999969},{"time":175.5,"value":10.329999999999961},{"time":175.83333333333331,"value":2}]}],["Racer/active",{"items":[{},{"time":154.66666666666666,"length":37.33333333333334}]}]],"labels":{"zero":0,"begin":5.333333333333333,"neuro":48,"porterfuckingrobinson":112,"fuckingcamellia":90.66666666666666,"psy":154.66666666666666,"greetings":133.33333333333331,"fadeout":176},"guiSettings":{"snapTimeActive":true,"snapTimeInterval":0.1,"snapValueActive":true,"snapValueInterval":0.5,"snapBeatActive":true,"bpm":180,"beatOffset":0,"useBeatInGUI":true,"minimizedPrecisionTime":3,"minimizedPrecisionValue":3}} \ No newline at end of file diff --git a/src/config-hot.ts b/src/config-hot.ts index 14564fc..4435794 100644 --- a/src/config-hot.ts +++ b/src/config-hot.ts @@ -2,13 +2,13 @@ export const RTINSPECTOR_MULTIPLE = false, // RTINSPECTOR_MULTIPLE = true, RTINSPECTOR_CAPTURE_NAME: string | null = null, - // RTINSPECTOR_CAPTURE_NAME: string | null = 'PixelSorter/index', + // RTINSPECTOR_CAPTURE_NAME: string | null = 'SSR/quad', // RTINSPECTOR_CAPTURE_NAME: string | null = 'Greetings/intermediate0', // RTINSPECTOR_CAPTURE_NAME: string | null = 'main/postSwap0', // RTINSPECTOR_CAPTURE_NAME: string | null = 'EnvironmentMap/swap0', // RTINSPECTOR_CAPTURE_NAME: string | null = 'DeferredCamera/cameraTarget', - RTINSPECTOR_CAPTURE_INDEX = 0, + RTINSPECTOR_CAPTURE_INDEX = 3, COMPONENT_UPDATE_BREAKPOINT: string | null = null, - // COMPONENT_UPDATE_BREAKPOINT: string | null = 'ForwardCamera/camera', + // COMPONENT_UPDATE_BREAKPOINT: string | null = 'lightDynamic2/shadowMapCamera', // COMPONENT_UPDATE_BREAKPOINT: string | null = 'lightDynamic1/shadowMapCamera', COMPONENT_DRAW_BREAKPOINT: string | null = null; diff --git a/src/entities/BigBlur.ts b/src/entities/BigBlur.ts new file mode 100644 index 0000000..2abcbc3 --- /dev/null +++ b/src/entities/BigBlur.ts @@ -0,0 +1,100 @@ +import { Blit } from '../heck/components/Blit'; +import { BufferRenderTarget } from '../heck/BufferRenderTarget'; +import { Entity } from '../heck/Entity'; +import { Material } from '../heck/Material'; +import { Quad } from '../heck/components/Quad'; +import { RenderTarget } from '../heck/RenderTarget'; +import { auto } from '../globals/automaton'; +import { dummyRenderTarget } from '../globals/dummyRenderTarget'; +import { quadGeometry } from '../globals/quadGeometry'; +import bigBlurFrag from '../shaders/big-blur.frag'; +import quadVert from '../shaders/quad.vert'; + +export interface BigBlurOptions { + input: BufferRenderTarget; + target: RenderTarget; +} + +export class BigBlur extends Entity { + public constructor( options: BigBlurOptions ) { + super(); + + const entityBypass = new Entity(); + entityBypass.visible = false; + this.children.push( entityBypass ); + + const entityMain = new Entity(); + entityMain.active = false; + entityMain.visible = false; + this.children.push( entityMain ); + + // -- bypass ----------------------------------------------------------------------------------- + entityBypass.components.push( new Blit( { + src: options.input, + dst: options.target, + name: 'BigBlur/blitBypass', + } ) ); + + // -- h ---------------------------------------------------------------------------------------- + const targetH = new BufferRenderTarget( { + width: options.target.width, + height: options.target.height, + name: process.env.DEV && 'BigBlur/targetH', + } ); + + const materialH = new Material( + quadVert, + bigBlurFrag, + { initOptions: { geometry: quadGeometry, target: dummyRenderTarget } }, + ); + materialH.addUniformTexture( 'sampler0', options.input.texture ); + + if ( module.hot ) { + module.hot.accept( '../shaders/big-blur.frag', () => { + materialH.replaceShader( quadVert, bigBlurFrag ); + } ); + } + + const quadH = new Quad( { + target: targetH, + material: materialH, + name: process.env.DEV && 'BigBlur/quadH', + } ); + entityMain.components.push( quadH ); + + // -- h ---------------------------------------------------------------------------------------- + const materialV = new Material( + quadVert, + bigBlurFrag, + { + defines: [ 'IS_VERTICAL 1' ], + initOptions: { geometry: quadGeometry, target: dummyRenderTarget } + }, + ); + materialV.addUniformTexture( 'sampler0', targetH.texture ); + + if ( module.hot ) { + module.hot.accept( '../shaders/big-blur.frag', () => { + materialV.replaceShader( quadVert, bigBlurFrag ); + } ); + } + + const quadV = new Quad( { + target: options.target, + material: materialV, + name: process.env.DEV && 'BigBlur/quad', + } ); + entityMain.components.push( quadV ); + + // -- update uniform --------------------------------------------------------------------------- + auto( 'BigBlur/amp', ( { value } ) => { + materialH.addUniform( 'ratio', '1f', Math.min( 1.0, 100.0 * value ) ); + materialH.addUniform( 'sigma', '1f', 100.0 * value ); + materialV.addUniform( 'ratio', '1f', Math.min( 1.0, 100.0 * value ) ); + materialV.addUniform( 'sigma', '1f', 100.0 * value ); + + entityMain.active = 0.0 < value; + entityBypass.active = !entityMain.active; + } ); + } +} diff --git a/src/entities/Crystal.ts b/src/entities/Crystal.ts index fb4ab26..f2230d1 100644 --- a/src/entities/Crystal.ts +++ b/src/entities/Crystal.ts @@ -4,11 +4,11 @@ import { BeamShot } from './BeamShot'; import { Entity } from '../heck/Entity'; import { Geometry } from '../heck/Geometry'; import { Lambda } from '../heck/components/Lambda'; -import { Material } from '../heck/Material'; +import { Material, MaterialMap } from '../heck/Material'; import { Mesh, MeshCull } from '../heck/components/Mesh'; import { Vector3 } from '@fms-cat/experimental'; import { auto } from '../globals/automaton'; -import { dummyRenderTargetFourDrawBuffers } from '../globals/dummyRenderTarget'; +import { dummyRenderTarget, dummyRenderTargetFourDrawBuffers } from '../globals/dummyRenderTarget'; import { genCube } from '../geometries/genCube'; import { objectValuesMap } from '../utils/objectEntriesMap'; import crystalFrag from '../shaders/crystal.frag'; @@ -49,44 +49,52 @@ export class Crystal extends Entity { }, ); - // I don't think we need this - // const depth = new Material( - // raymarchObjectVert, - // crystalFrag, - // { - // defines: [ 'DEPTH 1' ], - // initOptions: { geometry, target: dummyRenderTarget } - // }, - // ); + const depth = new Material( + raymarchObjectVert, + crystalFrag, + { + defines: [ 'DEPTH 1' ], + initOptions: { geometry, target: dummyRenderTarget } + }, + ); - const materials = { deferred }; + const materials: MaterialMap = { deferred }; if ( process.env.DEV ) { if ( module.hot ) { module.hot.accept( '../shaders/crystal.frag', () => { deferred.replaceShader( raymarchObjectVert, crystalFrag ); - // depth.replaceShader( raymarchObjectVert, crystalFrag ); + depth.replaceShader( raymarchObjectVert, crystalFrag ); } ); } } objectValuesMap( materials, ( material ) => { - material.addUniform( 'size', '2f', width, height ); - material.addUniform( 'noiseOffset', '1f', noiseOffset ); + material?.addUniform( 'size', '2f', width, height ); + material?.addUniform( 'noiseOffset', '1f', noiseOffset ); + } ); + + // haha + auto( 'Crystal/enableDepth', ( { uninit } ) => { + if ( uninit ) { + delete materials.depth; + } else { + materials.depth = depth; + } } ); // -- updater ---------------------------------------------------------------------------------- this.components.push( new Lambda( { onDraw: ( event ) => { objectValuesMap( materials, ( material ) => { - material.addUniform( + material?.addUniform( 'cameraNearFar', '2f', event.camera.near, event.camera.far ); - material.addUniformMatrixVector( + material?.addUniformMatrixVector( 'inversePVM', 'Matrix4fv', event.projectionMatrix diff --git a/src/entities/DeferredCamera.ts b/src/entities/DeferredCamera.ts index 0ca6827..21792db 100644 --- a/src/entities/DeferredCamera.ts +++ b/src/entities/DeferredCamera.ts @@ -49,7 +49,6 @@ export class DeferredCamera extends Entity { name: 'DeferredCamera/camera', materialTag: 'deferred', } ); - this.camera.clear = []; // -- ao --------------------------------------------------------------------------------------- const aoTarget = new BufferRenderTarget( { diff --git a/src/entities/Greetings.ts b/src/entities/Greetings.ts index eef3436..d5ea7a8 100644 --- a/src/entities/Greetings.ts +++ b/src/entities/Greetings.ts @@ -20,7 +20,7 @@ import greetingsPreLainFrag from '../shaders/greetings-pre-lain.frag'; import greetingsVert from '../shaders/greetings.vert'; import quadVert from '../shaders/quad.vert'; -const INSTANCES = 256; +const INSTANCES = 64; // -- preprocessor --------------------------------------------------------------------------------- const materialBlurH = new Material( @@ -171,6 +171,8 @@ const charPosList = [ 'holon', 'gam0022', 'gaz', + 'gyabo', + 'iYOYi', 'jetlag', 'Jugem-T', 'kaneta', diff --git a/src/entities/HooperBall.ts b/src/entities/HooperBall.ts new file mode 100644 index 0000000..bb0d60b --- /dev/null +++ b/src/entities/HooperBall.ts @@ -0,0 +1,96 @@ +import { Entity } from '../heck/Entity'; +import { Geometry } from '../heck/Geometry'; +import { Lambda } from '../heck/components/Lambda'; +import { Material } from '../heck/Material'; +import { Mesh, MeshCull } from '../heck/components/Mesh'; +import { auto } from '../globals/automaton'; +import { dummyRenderTarget, dummyRenderTargetFourDrawBuffers } from '../globals/dummyRenderTarget'; +import { genOctahedron } from '../geometries/genOctahedron'; +import { objectValuesMap } from '../utils/objectEntriesMap'; +import { randomTexture, randomTextureStatic } from '../globals/randomTexture'; +import hooperballFrag from '../shaders/hooperball.frag'; +import raymarchObjectVert from '../shaders/raymarch-object.vert'; + +export class Hooperball extends Entity { + public constructor() { + super(); + + // -- geometry --------------------------------------------------------------------------------- + const octahedron = genOctahedron( { radius: 2.0, div: 1 } ); + + const geometry = new Geometry(); + + geometry.vao.bindVertexbuffer( octahedron.position, 0, 3 ); + geometry.vao.bindIndexbuffer( octahedron.index ); + + geometry.count = octahedron.count; + geometry.mode = octahedron.mode; + geometry.indexType = octahedron.indexType; + + // -- materials -------------------------------------------------------------------------------- + const deferred = new Material( + raymarchObjectVert, + hooperballFrag, + { + defines: [ 'DEFERRED 1' ], + initOptions: { geometry, target: dummyRenderTargetFourDrawBuffers }, + }, + ); + + const depth = new Material( + raymarchObjectVert, + hooperballFrag, + { + defines: [ 'DEPTH 1' ], + initOptions: { geometry, target: dummyRenderTarget } + }, + ); + + const materials = { deferred, depth }; + + if ( process.env.DEV ) { + if ( module.hot ) { + module.hot.accept( '../shaders/hooperball.frag', () => { + deferred.replaceShader( raymarchObjectVert, hooperballFrag ); + depth.replaceShader( raymarchObjectVert, hooperballFrag ); + } ); + } + } + + // -- updater ---------------------------------------------------------------------------------- + this.components.push( new Lambda( { + onDraw: ( event ) => { + objectValuesMap( materials, ( material ) => { + material.addUniform( + 'cameraNearFar', + '2f', + event.camera.near, + event.camera.far + ); + + material.addUniformMatrixVector( + 'inversePVM', + 'Matrix4fv', + event.projectionMatrix + .multiply( event.viewMatrix ) + .multiply( event.globalTransform.matrix ) + .inverse! + .elements + ); + + material.addUniform( 'deformSeed', '1f', auto( 'Hooperball/deformSeed' ) ); + } ); + }, + name: process.env.DEV && 'Hooperball/updater', + } ) ); + + // -- mesh ------------------------------------------------------------------------------------- + const mesh = new Mesh( { + geometry, + materials, + name: process.env.DEV && 'Hooperball/mesh', + } ); + mesh.cull = MeshCull.None; + this.components.push( mesh ); + } +} diff --git a/src/entities/IFSAsUsual.ts b/src/entities/IFSAsUsual.ts index 461f397..0ef4c76 100644 --- a/src/entities/IFSAsUsual.ts +++ b/src/entities/IFSAsUsual.ts @@ -8,7 +8,6 @@ import { auto } from '../globals/automaton'; import { dummyRenderTarget, dummyRenderTargetFourDrawBuffers } from '../globals/dummyRenderTarget'; import { genCube } from '../geometries/genCube'; import { objectValuesMap } from '../utils/objectEntriesMap'; -import { randomTexture, randomTextureStatic } from '../globals/randomTexture'; import ifsAsUsualFrag from '../shaders/ifs-as-usual.frag'; import raymarchObjectVert from '../shaders/raymarch-object.vert'; @@ -47,7 +46,7 @@ export class IFSAsUsual extends Entity { }, ); - const materials = { deferred, depth }; + const materials = { deferred }; if ( process.env.DEV ) { if ( module.hot ) { @@ -58,11 +57,6 @@ export class IFSAsUsual extends Entity { } } - objectValuesMap( materials, ( material ) => { - material.addUniformTexture( 'samplerRandom', randomTexture.texture ); - material.addUniformTexture( 'samplerRandomStatic', randomTextureStatic.texture ); - } ); - // -- updater ---------------------------------------------------------------------------------- this.components.push( new Lambda( { onDraw: ( event ) => { @@ -88,6 +82,22 @@ export class IFSAsUsual extends Entity { name: process.env.DEV && 'IFSAsUsual/updater', } ) ); + // -- speen ------------------------------------------------------------------------------------ + const axis = new Vector3( [ 1.0, -1.0, 1.0 ] ).normalized; + this.components.push( new Lambda( { + onUpdate: ( { time } ) => { + this.transform.rotation = Quaternion.fromAxisAngle( axis, time ); + }, + name: process.env.DEV && 'IFSAsUsual/updater2', + } ) ); + + // -- auto ------------------------------------------------------------------------------------- + auto( 'IFSAsUsual/ifsSeed', ( { value } ) => { + objectValuesMap( materials, ( material ) => { + material.addUniform( 'ifsSeed', '1f', value ); + } ); + } ); + // -- mesh ------------------------------------------------------------------------------------- const mesh = new Mesh( { geometry, @@ -96,17 +106,5 @@ export class IFSAsUsual extends Entity { } ); mesh.cull = MeshCull.None; this.components.push( mesh ); - - // -- speen ------------------------------------------------------------------------------------ - const axis = new Vector3( [ 1.0, -1.0, 1.0 ] ).normalized; - this.components.push( new Lambda( { - onUpdate: ( { time } ) => { - this.transform.rotation = Quaternion.fromAxisAngle( axis, time ); - objectValuesMap( materials, ( material ) => { - material.addUniform( 'ifsSeed', '1f', auto( 'IFSAsUsual/ifsSeed' ) ); - } ); - }, - name: process.env.DEV && 'IFSAsUsual/update', - } ) ); } } diff --git a/src/entities/PsyField.ts b/src/entities/PsyField.ts new file mode 100644 index 0000000..a965448 --- /dev/null +++ b/src/entities/PsyField.ts @@ -0,0 +1,117 @@ +import { Entity } from '../heck/Entity'; +import { Geometry } from '../heck/Geometry'; +import { Lambda } from '../heck/components/Lambda'; +import { LightEntity } from './LightEntity'; +import { Material } from '../heck/Material'; +import { Mesh, MeshCull } from '../heck/components/Mesh'; +import { Vector3 } from '@fms-cat/experimental'; +import { dummyRenderTarget, dummyRenderTargetFourDrawBuffers } from '../globals/dummyRenderTarget'; +import { genCube } from '../geometries/genCube'; +import { objectValuesMap } from '../utils/objectEntriesMap'; +import psyFieldFrag from '../shaders/psy-field.frag'; +import raymarchObjectVert from '../shaders/raymarch-object.vert'; + +export class PsyField extends Entity { + public lights: LightEntity[] = []; + + public constructor() { + super(); + + this.transform.position = new Vector3( [ 0.0, 0.0, 0.0 ] ); + this.transform.scale = new Vector3( [ 1.0, 1.0, 1.0 ] ); + + // -- geometry --------------------------------------------------------------------------------- + const cube = genCube( { dimension: [ 100.0, 1.0, 100.0 ] } ); + + const geometry = new Geometry(); + + geometry.vao.bindVertexbuffer( cube.position, 0, 3 ); + geometry.vao.bindIndexbuffer( cube.index ); + + geometry.count = cube.count; + geometry.mode = cube.mode; + geometry.indexType = cube.indexType; + + // -- materials -------------------------------------------------------------------------------- + // const forward = new Material( + // raymarchObjectVert, + // psyFieldFrag, + // { + // defines: [ 'FORWARD 1' ], + // initOptions: { geometry, target: dummyRenderTarget }, + // }, + // ); + + const deferred = new Material( + raymarchObjectVert, + psyFieldFrag, + { + defines: [ 'DEFERRED 1' ], + initOptions: { geometry, target: dummyRenderTargetFourDrawBuffers }, + }, + ); + + const depth = new Material( + raymarchObjectVert, + psyFieldFrag, + { + defines: [ 'DEPTH 1' ], + initOptions: { geometry, target: dummyRenderTarget } + }, + ); + + const materials = { deferred, depth }; + + if ( process.env.DEV ) { + if ( module.hot ) { + module.hot.accept( '../shaders/psy-field.frag', () => { + // forward.replaceShader( raymarchObjectVert, psyFieldFrag ); + deferred.replaceShader( raymarchObjectVert, psyFieldFrag ); + depth.replaceShader( raymarchObjectVert, psyFieldFrag ); + } ); + } + } + + // -- forward lights --------------------------------------------------------------------------- + // this.components.push( new Lambda( { + // onDraw: ( { frameCount } ) => { + // setLightUniforms( forward, this.lights, frameCount ); + // }, + // name: process.env.DEV && 'PsyField/setLightUniforms', + // } ) ); + + // -- updater ---------------------------------------------------------------------------------- + this.components.push( new Lambda( { + onDraw: ( event ) => { + objectValuesMap( materials, ( material ) => { + material.addUniform( + 'cameraNearFar', + '2f', + event.camera.near, + event.camera.far + ); + + material.addUniformMatrixVector( + 'inversePVM', + 'Matrix4fv', + event.projectionMatrix + .multiply( event.viewMatrix ) + .multiply( event.globalTransform.matrix ) + .inverse! + .elements + ); + } ); + }, + name: process.env.DEV && 'PsyField/updater', + } ) ); + + // -- mesh ------------------------------------------------------------------------------------- + const mesh = new Mesh( { + geometry, + materials, + name: process.env.DEV && 'PsyField/mesh', + } ); + mesh.cull = MeshCull.None; + this.components.push( mesh ); + } +} diff --git a/src/entities/Racer.ts b/src/entities/Racer.ts new file mode 100644 index 0000000..3b07b0f --- /dev/null +++ b/src/entities/Racer.ts @@ -0,0 +1,146 @@ +import { Entity } from '../heck/Entity'; +import { GPUParticles } from './GPUParticles'; +import { Geometry } from '../heck/Geometry'; +import { Lambda } from '../heck/components/Lambda'; +import { Material } from '../heck/Material'; +import { auto } from '../globals/automaton'; +import { dummyRenderTargetFourDrawBuffers, dummyRenderTargetTwoDrawBuffers } from '../globals/dummyRenderTarget'; +import { gl, glCat } from '../globals/canvas'; +import { matrix2d } from '@fms-cat/experimental'; +import { quadGeometry } from '../globals/quadGeometry'; +import { randomTexture } from '../globals/randomTexture'; +import quadVert from '../shaders/quad.vert'; +import racerComputeFrag from '../shaders/racer-compute.frag'; +import racerRenderFrag from '../shaders/racer-render.frag'; +import racerRenderVert from '../shaders/racer-render.vert'; + +const TRAILS = 4096; +const TRAIL_LENGTH = 64; + +export class Racer extends Entity { + public constructor() { + super(); + + // -- material compute ------------------------------------------------------------------------- + const materialCompute = new Material( + quadVert, + racerComputeFrag, + { initOptions: { geometry: quadGeometry, target: dummyRenderTargetTwoDrawBuffers } }, + ); + + materialCompute.addUniform( 'trails', '1f', TRAILS ); + materialCompute.addUniform( 'trailLength', '1f', TRAIL_LENGTH ); + materialCompute.addUniformTexture( 'samplerRandom', randomTexture.texture ); + + if ( process.env.DEV ) { + if ( module.hot ) { + module.hot.accept( '../shaders/racer-compute.frag', () => { + materialCompute.replaceShader( quadVert, racerComputeFrag ); + } ); + } + } + + // -- lambda to say update --------------------------------------------------------------------- + this.components.push( new Lambda( { + onUpdate: ( { time, deltaTime } ) => { + const shouldUpdate + = Math.floor( 60.0 * time ) !== Math.floor( 60.0 * ( time - deltaTime ) ); + materialCompute.addUniform( 'shouldUpdate', '1i', shouldUpdate ? 1 : 0 ); + }, + } ) ); + + // -- geometry render -------------------------------------------------------------------------- + const geometryRender = new Geometry(); + + const bufferComputeUV = glCat.createBuffer(); + bufferComputeUV.setVertexbuffer( + new Float32Array( matrix2d( TRAIL_LENGTH, TRAILS ) ).map( ( v, i ) => { + if ( i % 2 === 0 ) { return ( v + 0.5 ) / TRAIL_LENGTH; } + else { return ( v + 0.5 ) / TRAILS; } + } ) + ); + + geometryRender.vao.bindVertexbuffer( bufferComputeUV, 0, 2 ); + + geometryRender.count = TRAILS * TRAIL_LENGTH; + geometryRender.mode = gl.POINTS; + + // -- materials render ------------------------------------------------------------------------- + const forward = new Material( + racerRenderVert, + racerRenderFrag, + { + defines: [ 'FORWARD 1' ], + initOptions: { geometry: geometryRender, target: dummyRenderTargetFourDrawBuffers }, + blend: [ gl.ONE, gl.ONE ], + }, + ); + + // const cubemap = new Material( + // racerRenderVert, + // racerRenderFrag, + // { + // defines: [ 'FORWARD 1', 'CUBEMAP 1' ], + // initOptions: { geometry: geometryRender, target: dummyRenderTargetFourDrawBuffers }, + // blend: [ gl.ONE, gl.ONE ], + // }, + // ); + + const deferred = new Material( + racerRenderVert, + racerRenderFrag, + { + defines: [ 'DEFERRED 1' ], + initOptions: { geometry: geometryRender, target: dummyRenderTargetFourDrawBuffers }, + }, + ); + + forward.addUniform( 'trails', '1f', TRAILS ); + forward.addUniform( 'trailLength', '1f', TRAIL_LENGTH ); + + // cubemap.addUniform( 'trails', '1f', TRAILS ); + // cubemap.addUniform( 'trailLength', '1f', TRAIL_LENGTH ); + + deferred.addUniform( 'trails', '1f', TRAILS ); + deferred.addUniform( 'trailLength', '1f', TRAIL_LENGTH ); + + const materialsRender = { forward, deferred }; + + if ( process.env.DEV ) { + if ( module.hot ) { + module.hot.accept( + [ + '../shaders/racer-render.vert', + '../shaders/racer-render.frag', + ], + () => { + forward.replaceShader( racerRenderVert, racerRenderFrag ); + // cubemap.replaceShader( racerRenderVert, racerRenderFrag ); + deferred.replaceShader( racerRenderVert, racerRenderFrag ); + } + ); + } + } + + // -- auto ------------------------------------------------------------------------------------- + auto( 'Racer/active', ( { init, uninit } ) => { + this.active = !uninit; + this.visible = !uninit; + + materialCompute.addUniform( 'init', '1i', init ? 1 : 0 ); + } ); + + // -- gpu particles ---------------------------------------------------------------------------- + const gpuParticles = new GPUParticles( { + materialCompute, + geometryRender, + materialsRender, + computeWidth: TRAIL_LENGTH, + computeHeight: TRAILS, + computeNumBuffers: 2, + namePrefix: process.env.DEV && 'Racer', + } ); + gpuParticles.meshRender.depthWrite = false; + this.children.push( gpuParticles ); + } +} diff --git a/src/entities/SSR.ts b/src/entities/SSR.ts new file mode 100644 index 0000000..c501806 --- /dev/null +++ b/src/entities/SSR.ts @@ -0,0 +1,123 @@ +import { Blit } from '../heck/components/Blit'; +import { BufferRenderTarget } from '../heck/BufferRenderTarget'; +import { DeferredCamera } from './DeferredCamera'; +import { Entity } from '../heck/Entity'; +import { Lambda } from '../heck/components/Lambda'; +import { Material } from '../heck/Material'; +import { Quad } from '../heck/components/Quad'; +import { RenderTarget } from '../heck/RenderTarget'; +import { auto } from '../globals/automaton'; +import { dummyRenderTarget } from '../globals/dummyRenderTarget'; +import { gl } from '../globals/canvas'; +import { quadGeometry } from '../globals/quadGeometry'; +import { randomTexture } from '../globals/randomTexture'; +import quadVert from '../shaders/quad.vert'; +import ssrFrag from '../shaders/ssr.frag'; + +export interface SSROptions { + camera: DeferredCamera; + shaded: BufferRenderTarget; + target: RenderTarget; +} + +export class SSR extends Entity { + public constructor( options: SSROptions ) { + super(); + + const entityBypass = new Entity(); + entityBypass.visible = false; + this.children.push( entityBypass ); + + const entityMain = new Entity(); + entityMain.active = false; + entityMain.visible = false; + this.children.push( entityMain ); + + // -- bypass ----------------------------------------------------------------------------------- + entityBypass.components.push( new Blit( { + src: options.shaded, + dst: options.target, + name: 'SSR/blitBypass', + } ) ); + + // -- ha --------------------------------------------------------------------------------------- + const { camera } = options; + + const material = new Material( + quadVert, + ssrFrag, + { + initOptions: { geometry: quadGeometry, target: dummyRenderTarget }, + }, + ); + + material.addUniformTexture( 'samplerRandom', randomTexture.texture ); + + for ( let i = 0; i < 4; i ++ ) { + material.addUniformTexture( + 'sampler' + i, + options.camera.cameraTarget.getTexture( gl.COLOR_ATTACHMENT0 + i ) + ); + } + + material.addUniformTexture( 'samplerShaded', options.shaded.texture ); + + if ( process.env.DEV ) { + if ( module.hot ) { + module.hot.accept( '../shaders/ssr.frag', () => { + material.replaceShader( quadVert, ssrFrag ); + } ); + } + } + + // -- camera uniforms -------------------------------------------------------------------------- + const lambda = new Lambda( { + onUpdate: () => { + const cameraView = camera.transform.matrix.inverse!; + + material.addUniformMatrixVector( + 'cameraView', + 'Matrix4fv', + cameraView.elements + ); + + material.addUniformMatrixVector( + 'cameraPV', + 'Matrix4fv', + camera.camera.projectionMatrix.multiply( + cameraView + ).elements + ); + + material.addUniform( + 'cameraNearFar', + '2f', + camera.camera.near, + camera.camera.far + ); + + material.addUniform( + 'cameraPos', + '3f', + ...camera.transform.position.elements + ); + }, + name: process.env.DEV && 'SSR/shading/setCameraUniforms', + } ); + entityMain.components.push( lambda ); + + // -- quad ------------------------------------------------------------------------------------- + const quad = new Quad( { + target: options.target, + material, + name: process.env.DEV && 'SSR/quad', + } ); + entityMain.components.push( quad ); + + // -- auto ------------------------------------------------------------------------------------- + auto( 'SSR/active', ( { uninit } ) => { + entityMain.active = !uninit; + entityBypass.active = !entityMain.active; + } ); + } +} diff --git a/src/entities/SceneCrystals.ts b/src/entities/SceneCrystals.ts index eee380f..9685df1 100644 --- a/src/entities/SceneCrystals.ts +++ b/src/entities/SceneCrystals.ts @@ -89,11 +89,11 @@ export class SceneCrystals extends Entity { shadowMapFar: 20.0, namePrefix: process.env.DEV && 'lightCrystals1', } ); - light1.color = [ 400.0, 400.0, 400.0 ]; + light1.color = [ 100.0, 100.0, 100.0 ]; light1.transform.lookAt( new Vector3( [ 0.0, 4.0, 1.0 ] ) ); auto( 'SceneCrystals/light/amp', ( { value } ) => { - light1.color = [ 400.0 * value, 400.0 * value, 400.0 * value ]; + light1.color = [ 100.0 * value, 100.0 * value, 100.0 * value ]; } ); this.lights = [ light1 ]; diff --git a/src/entities/SceneNeuro.ts b/src/entities/SceneNeuro.ts index d2874b2..660f52f 100644 --- a/src/entities/SceneNeuro.ts +++ b/src/entities/SceneNeuro.ts @@ -5,7 +5,6 @@ import { IFSPistons } from './IFSPistons'; import { LightEntity } from './LightEntity'; import { LightShaft } from './LightShaft'; import { Quaternion, Vector3 } from '@fms-cat/experimental'; -import { SufferTexts } from './SufferTexts'; import { Wobbleball } from './Wobbleball'; interface SceneNeuroOptions { @@ -69,7 +68,6 @@ export class SceneNeuro extends Entity { new Wobbleball(), new IFSPistons(), boundingBox, - new SufferTexts(), ...this.lights, ); } diff --git a/src/entities/ScenePsy.ts b/src/entities/ScenePsy.ts new file mode 100644 index 0000000..8053dd6 --- /dev/null +++ b/src/entities/ScenePsy.ts @@ -0,0 +1,43 @@ +import { Entity } from '../heck/Entity'; +import { Hooperball } from './HooperBall'; +import { LightEntity } from './LightEntity'; +import { PsyField } from './PsyField'; +import { Racer } from './Racer'; +import { Vector3 } from '@fms-cat/experimental'; + +interface ScenePsyOptions { + scenes: Entity[]; +} + +export class ScenePsy extends Entity { + public readonly lights: LightEntity[]; + + public constructor( { scenes }: ScenePsyOptions ) { + super(); + + // -- hooperball ------------------------------------------------------------------------------- + const hooperball = new Hooperball(); + + // -- field ------------------------------------------------------------------------------------ + const psyField = new PsyField(); + psyField.transform.position = new Vector3( [ 0.0, -2.0, 0.0 ] ); + + const psyField2 = new PsyField(); + psyField2.transform.position = new Vector3( [ 0.0, 2.0, 0.0 ] ); + + // -- racer ------------------------------------------------------------------------------------ + const racer = new Racer(); + + // -- no lights -------------------------------------------------------------------------------- + this.lights = []; + + // -- scene ------------------------------------------------------------------------------------ + this.children.push( + hooperball, + psyField, + psyField2, + racer, + ...this.lights, + ); + } +} diff --git a/src/entities/SufferTexts.ts b/src/entities/SufferTexts.ts index d4a63fe..7918406 100644 --- a/src/entities/SufferTexts.ts +++ b/src/entities/SufferTexts.ts @@ -21,7 +21,7 @@ const PARTICLES = 256; const sufferList = [ '#DEFINE DISGRACE 1', 'WELCOME TO THE MANGLER HELL', - 'CTRL + ALT + DESPAIR', + 'DEADLINE HARMS YOUR HEALTH', 'LIBOPUS IS CHEATING', 'PUBLIC GET FUCKED()', '\'RETRUN\': UNDECLARED IDENTIFIER', @@ -33,7 +33,7 @@ const sufferList = [ 'SVG.GETPOINTATLENGTH IS CHEATING', 'COPY\'N\'PASTE ENGINEER', '60FPS OR DIE', - '', + 'EXPECT A TERRIBLE STYLE INCONSISTENCY', 'END MY SUFFER', ]; diff --git a/src/entities/TestScreen.ts b/src/entities/TestScreen.ts new file mode 100644 index 0000000..7544764 --- /dev/null +++ b/src/entities/TestScreen.ts @@ -0,0 +1,60 @@ +import { Entity } from '../heck/Entity'; +import { Material } from '../heck/Material'; +import { Quad } from '../heck/components/Quad'; +import { RenderTarget } from '../heck/RenderTarget'; +import { auto } from '../globals/automaton'; +import { dummyRenderTarget } from '../globals/dummyRenderTarget'; +import { quadGeometry } from '../globals/quadGeometry'; +import { randomTexture } from '../globals/randomTexture'; +import quadVert from '../shaders/quad.vert'; +import testScreenFrag from '../shaders/test-screen.frag'; + +export interface TestScreenOptions { + target: RenderTarget; +} + +export class TestScreen extends Entity { + public constructor( options: TestScreenOptions ) { + super(); + + // -- post ------------------------------------------------------------------------------------- + const material = new Material( + quadVert, + testScreenFrag, + { + initOptions: { geometry: quadGeometry, target: dummyRenderTarget }, + }, + ); + + material.addUniformTexture( 'samplerRandom', randomTexture.texture ); + + if ( process.env.DEV ) { + if ( module.hot ) { + module.hot.accept( '../shaders/test-screen.frag', () => { + material.replaceShader( quadVert, testScreenFrag ); + } ); + } + } + + const quad = new Quad( { + target: options.target, + material, + name: process.env.DEV && 'TestScreen/quad', + } ); + this.components.push( quad ); + + // -- auto ------------------------------------------------------------------------------------- + auto( 'TestScreen/circle', ( { value } ) => { + material.addUniform( 'circle', '1f', value ); + } ); + + auto( 'TestScreen/fade', ( { value } ) => { + material.addUniform( 'fade', '1f', value ); + } ); + + auto( 'TestScreen/mode', ( { value } ) => { + this.active = value > 0.0; + material.addUniform( 'mode', '1f', value ); + } ); + } +} diff --git a/src/entities/TextOverlay.ts b/src/entities/TextOverlay.ts new file mode 100644 index 0000000..7ffdf0b --- /dev/null +++ b/src/entities/TextOverlay.ts @@ -0,0 +1,108 @@ +import { Entity } from '../heck/Entity'; +import { GLCatTexture } from '@fms-cat/glcat-ts'; +import { Material } from '../heck/Material'; +import { Quad } from '../heck/components/Quad'; +import { RenderTarget } from '../heck/RenderTarget'; +import { auto } from '../globals/automaton'; +import { dummyRenderTarget } from '../globals/dummyRenderTarget'; +import { gl, glCat } from '../globals/canvas'; +import { quadGeometry } from '../globals/quadGeometry'; +import quadVert from '../shaders/quad.vert'; +import textOverlayFrag from '../shaders/text-overlay.frag'; + +export interface TextOverlayOptions { + target: RenderTarget; +} + +export class TextOverlay extends Entity { + public constructor( options: TextOverlayOptions ) { + super(); + + // -- create cards ----------------------------------------------------------------------------- + const canvasText = document.createElement( 'canvas' ); + const width = canvasText.width = options.target.width; + const height = canvasText.height = options.target.height; + + const context = canvasText.getContext( '2d' )!; + context.fillStyle = '#fff'; + context.textAlign = 'center'; + context.textBaseline = 'middle'; + context.font = `100 ${ 0.02 * width }px Bahnschrift, sans-serif`; + + const heck = ( texture: GLCatTexture, text: string ): GLCatTexture => { + context.clearRect( 0, 0, width, height ); + context.fillText( text, width / 2.0, height / 2.0 ); + texture.setTexture( canvasText ); + return texture; + }; + + const textures = [ + heck( glCat.createTexture(), 'Revision 2021' ), + heck( glCat.createTexture(), 'A 64k WebGL intro' ), + glCat.createTexture(), + glCat.createTexture(), + ]; + + { + context.clearRect( 0, 0, width, height ); + context.fillText( 'Code, Graphics, Music', 0.5 * width, 0.47 * height ); + context.font = `100 ${ 0.03 * width }px Bahnschrift, sans-serif`; + context.fillText( 'FMS_Cat', 0.5 * width, 0.52 * height ); + context.font = `100 ${ 0.02 * width }px Bahnschrift, sans-serif`; + + textures[ 2 ].setTexture( canvasText ); + } + + { + context.clearRect( 0, 0, width, height ); + context.fillText( 'I promise I will hire a', 0.5 * width, 0.48 * height ); + context.fillText( 'graphic direction guy next time', 0.5 * width, 0.52 * height ); + + context.textAlign = 'right'; + context.fillText( 'Press Esc to exit the experience', 0.9 * width, 0.91 * height ); + + context.textAlign = 'left'; + context.fillText( 'by FMS_Cat', 0.28 * width, 0.85 * height ); + context.fillText( 'A 64K WebGL Intro @ Revision 2021', 0.1 * width, 0.91 * height ); + context.font = `100 ${ 0.04 * width }px Bahnschrift, sans-serif`; + context.fillText( 'Condition', 0.1 * width, 0.84 * height ); + + textures[ 3 ].setTexture( canvasText ); + } + + // -- post ------------------------------------------------------------------------------------- + const material = new Material( + quadVert, + textOverlayFrag, + { + initOptions: { geometry: quadGeometry, target: dummyRenderTarget }, + blend: [ gl.ONE, gl.ONE ], + }, + ); + material.addUniformTexture( 'sampler0', textures[ 0 ] ); + + if ( process.env.DEV ) { + if ( module.hot ) { + module.hot.accept( '../shaders/text-overlay.frag', () => { + material.replaceShader( quadVert, textOverlayFrag ); + } ); + } + } + + const quad = new Quad( { + target: options.target, + material, + name: process.env.DEV && 'TextOverlay/quad', + } ); + this.components.push( quad ); + + // -- auto ------------------------------------------------------------------------------------- + auto( 'TextOverlay/texture', ( { value } ) => { + material.addUniformTexture( 'sampler0', textures[ value ] ); + } ); + + auto( 'TextOverlay/amp', ( { value } ) => { + material.addUniform( 'amp', '1f', value ); + } ); + } +} diff --git a/src/entities/Trails.ts b/src/entities/Trails.ts deleted file mode 100644 index cc8777b..0000000 --- a/src/entities/Trails.ts +++ /dev/null @@ -1,163 +0,0 @@ -import { Entity } from '../heck/Entity'; -import { GPUParticles } from './GPUParticles'; -import { InstancedGeometry } from '../heck/InstancedGeometry'; -import { Lambda } from '../heck/components/Lambda'; -import { Material } from '../heck/Material'; -import { dummyRenderTarget, dummyRenderTargetFourDrawBuffers, dummyRenderTargetTwoDrawBuffers } from '../globals/dummyRenderTarget'; -import { gl, glCat } from '../globals/canvas'; -import { quadGeometry } from '../globals/quadGeometry'; -import { randomTexture, randomTextureStatic } from '../globals/randomTexture'; -import depthFrag from '../shaders/depth.frag'; -import quadVert from '../shaders/quad.vert'; -import trailsComputeFrag from '../shaders/trails-compute.frag'; -import trailsRenderFrag from '../shaders/trails-render.frag'; -import trailsRenderVert from '../shaders/trails-render.vert'; - -const TRAILS = 4096; -const TRAIL_LENGTH = 64; - -export class Trails extends Entity { - public constructor() { - super(); - - // -- material compute ------------------------------------------------------------------------- - const materialCompute = new Material( - quadVert, - trailsComputeFrag, - { initOptions: { geometry: quadGeometry, target: dummyRenderTargetTwoDrawBuffers } }, - ); - - materialCompute.addUniform( 'trails', '1f', TRAILS ); - materialCompute.addUniform( 'trailLength', '1f', TRAIL_LENGTH ); - materialCompute.addUniformTexture( 'samplerRandom', randomTexture.texture ); - - if ( process.env.DEV ) { - if ( module.hot ) { - module.hot.accept( '../shaders/trails-compute.frag', () => { - materialCompute.replaceShader( quadVert, trailsComputeFrag ); - } ); - } - } - - // -- lambda to say update --------------------------------------------------------------------- - this.components.push( new Lambda( { - onUpdate: ( { time, deltaTime } ) => { - const shouldUpdate - = Math.floor( 60.0 * time ) !== Math.floor( 60.0 * ( time - deltaTime ) ); - materialCompute.addUniform( 'shouldUpdate', '1i', shouldUpdate ? 1 : 0 ); - }, - } ) ); - - // -- geometry render -------------------------------------------------------------------------- - const geometryRender = new InstancedGeometry(); - - const bufferComputeU = glCat.createBuffer(); - bufferComputeU.setVertexbuffer( ( () => { - const ret = new Float32Array( TRAIL_LENGTH * 3 ); - for ( let i = 0; i < TRAIL_LENGTH; i ++ ) { - const u = ( 0.5 + i ) / TRAIL_LENGTH; - ret[ i * 3 + 0 ] = u; - ret[ i * 3 + 1 ] = u; - ret[ i * 3 + 2 ] = u; - } - return ret; - } )() ); - - geometryRender.vao.bindVertexbuffer( bufferComputeU, 0, 1 ); - - const bufferComputeV = glCat.createBuffer(); - bufferComputeV.setVertexbuffer( ( () => { - const ret = new Float32Array( TRAILS ); - for ( let i = 0; i < TRAILS; i ++ ) { - ret[ i ] = ( i + 0.5 ) / TRAILS; - } - return ret; - } )() ); - - geometryRender.vao.bindVertexbuffer( bufferComputeV, 1, 1, 1 ); - - const bufferTriIndex = glCat.createBuffer(); - bufferTriIndex.setVertexbuffer( ( () => { - const ret = new Float32Array( 3 * TRAIL_LENGTH ); - for ( let i = 0; i < TRAIL_LENGTH; i ++ ) { - ret[ i * 3 + 0 ] = 0; - ret[ i * 3 + 1 ] = 1; - ret[ i * 3 + 2 ] = 2; - } - return ret; - } )() ); - - geometryRender.vao.bindVertexbuffer( bufferTriIndex, 2, 1 ); - - const indexBuffer = glCat.createBuffer(); - indexBuffer.setIndexbuffer( ( () => { - const ret = new Uint16Array( ( TRAIL_LENGTH - 1 ) * 18 ); - for ( let i = 0; i < TRAIL_LENGTH - 1; i ++ ) { - for ( let j = 0; j < 3; j ++ ) { - const jn = ( j + 1 ) % 3; - ret[ i * 18 + j * 6 + 0 ] = i * 3 + j; - ret[ i * 18 + j * 6 + 1 ] = i * 3 + 3 + j; - ret[ i * 18 + j * 6 + 2 ] = i * 3 + 3 + jn; - ret[ i * 18 + j * 6 + 3 ] = i * 3 + j; - ret[ i * 18 + j * 6 + 4 ] = i * 3 + 3 + jn; - ret[ i * 18 + j * 6 + 5 ] = i * 3 + jn; - } - } - return ret; - } )() ); - - geometryRender.vao.bindIndexbuffer( indexBuffer ); - - geometryRender.count = ( TRAIL_LENGTH - 1 ) * 18; - geometryRender.primcount = TRAILS; - geometryRender.mode = gl.TRIANGLES; - geometryRender.indexType = gl.UNSIGNED_SHORT; - - // -- materials render ------------------------------------------------------------------------- - const deferred = new Material( - trailsRenderVert, - trailsRenderFrag, - { - defines: [ 'DEFERRED 1' ], - initOptions: { geometry: geometryRender, target: dummyRenderTargetFourDrawBuffers }, - }, - ); - const depth = new Material( - trailsRenderVert, - depthFrag, - { initOptions: { geometry: geometryRender, target: dummyRenderTarget } }, - ); - - const materialsRender = { deferred, depth }; - - deferred.addUniformTexture( 'samplerRandomStatic', randomTextureStatic.texture ); - depth.addUniformTexture( 'samplerRandomStatic', randomTextureStatic.texture ); - - if ( process.env.DEV ) { - if ( module.hot ) { - module.hot.accept( - [ - '../shaders/trails-render.vert', - '../shaders/trails-render.frag', - ], - () => { - deferred.replaceShader( trailsRenderVert, trailsRenderFrag ); - depth.replaceShader( trailsRenderVert, depthFrag ); - } - ); - } - } - - // -- gpu particles ---------------------------------------------------------------------------- - const gpuParticles = new GPUParticles( { - materialCompute, - geometryRender, - materialsRender, - computeWidth: TRAIL_LENGTH, - computeHeight: TRAILS, - computeNumBuffers: 2, - namePrefix: process.env.DEV && 'Trails', - } ); - this.children.push( gpuParticles ); - } -} diff --git a/src/main.ts b/src/main.ts index d01cfbe..c1963b8 100644 --- a/src/main.ts +++ b/src/main.ts @@ -57,15 +57,6 @@ if ( process.env.DEV ) { } ); } -if ( !process.env.DEV ) { - window.addEventListener( 'keydown', ( event ) => { - if ( event.key === 'Escape' ) { // panic button - dog.root.active = false; - music.isPlaying = false; - } - } ); -} - // -- wenis ---------------------------------------------------------------------------------------- if ( process.env.DEV ) { console.info( Component.nameMap ); @@ -80,21 +71,31 @@ async function load(): Promise { } if ( !process.env.DEV ) { - document.write( 'Wait a moment... ' ); + document.body.innerHTML = ''; + document.write( 'Wait a moment...' ); } await music.prepare(); if ( !process.env.DEV ) { + document.body.innerHTML = ''; + const button = document.createElement( 'a' ); - document.body.appendChild( button ); + document.body.prepend( button ); button.innerHTML = 'click me!'; button.onclick = () => { - document.body.appendChild( canvas ); + document.body.prepend( canvas ); music.isPlaying = true; document.body.requestFullscreen(); }; + + window.addEventListener( 'keydown', ( event ) => { + if ( event.key === 'Escape' ) { // panic button + dog.root.active = false; + music.isPlaying = false; + } + } ); } } load(); diff --git a/src/music/Music.ts b/src/music/Music.ts index db4a7fc..22b90b7 100644 --- a/src/music/Music.ts +++ b/src/music/Music.ts @@ -21,6 +21,8 @@ const sectionResets = [ 336.0, 400.0, 464.0, + 528.0, + 560.0, 1E9, ].map( ( v ) => v * 60.0 / MUSIC_BPM ); diff --git a/src/music/music.vert b/src/music/music.vert index c53c257..e6e27c6 100644 --- a/src/music/music.vert +++ b/src/music/music.vert @@ -14,6 +14,7 @@ const float SECTION_WHOA = 272.0 * BEAT; const float SECTION_PORTER_FUCKING_ROBINSON = 336.0 * BEAT; const float SECTION_AAAA = 400.0 * BEAT; const float SECTION_PSY = 464.0 * BEAT; +const float SECTION_END = 528.0 * BEAT; #define saturate(i) clamp(i, 0.,1.) #define aSaturate(i) clamp((i),-1.,1.) @@ -42,6 +43,13 @@ in float off; out float outL; out float outR; +float seed; + +float random() { + seed = fs( seed ); + return 2.0 * seed - 1.0; +} + float auto( float y ) { return texture( samplerAutomaton, vec2( off / bufferLength, y ) ).x; } @@ -256,14 +264,23 @@ vec2 mainAudio( vec4 time ) { -3, 3, 7, 12, 17, 22 ); - int progB = ( time.w < SECTION_AAAA - 8.0 * BEAT ) - ? 6 * ( int( time.z / ( 8.0 * BEAT ) ) % 8 ) + int progB = ( time.w < SECTION_PORTER_FUCKING_ROBINSON ) ? 6 * ( int( time.z / ( 8.0 * BEAT ) ) % 8 ) + : ( time.w < SECTION_AAAA - 8.0 * BEAT ) ? 6 * ( 4 + ( int( time.z / ( 8.0 * BEAT ) ) % 4 ) ) : 36; float bassfreq = n2f( 0.0 ); float sidechain = 1.0; + float fadeout = smoothstep( SECTION_END + 32.0 * BEAT, SECTION_END, time.w ); + + // -- test --------------------------------------------------------------------------------------- + if ( inRange( time.w, SECTION_BEGIN - 8.0 * BEAT, SECTION_BEGIN ) ) { + float freq = 1000.0 * ( 1.0 + step( time.y, BEAT ) ); + float amp = inRangeSmooth( time.x, 0.0, 0.04, 1E3 ); + dest += 0.3 * amp * sin( TAU * freq * time.x ); + } + // -- kick --------------------------------------------------------------------------------------- if ( inRange( time.w, SECTION_BEGIN + 64.0 * BEAT, SECTION_NEURO - 14.5 * BEAT ) ) { float t = mod( mod( time.z - 1.5 * BEAT, 4.0 * BEAT ), 2.5 * BEAT ); @@ -329,29 +346,6 @@ vec2 mainAudio( vec4 time ) { dest += 0.14 * mix( 0.3, 1.0, sidechain ) * aSaturate( sum ); } - // -- choir -------------------------------------------------------------------------------------- - if ( inRange( time.w, 0.0, SECTION_PORTER_FUCKING_ROBINSON ) ) { - const int notes[7] = int[]( - 10, 0, 10, 7, -5, 0, -5 - ); - - vec2 sum = vec2( 0.0 ); - - vec2 radius = vec2( 0.00002 ); - float tb = lofi( time.z, 0.5 * BEAT ); - float t = time.z - tb; - - for ( int i = 0; i < 21; i ++ ) { - int note = notes[ int( time.z / ( 0.5 * BEAT ) ) % 7 ]; - float freq = n2f( note ) * 0.25; - freq *= 1.0 + 0.01 * ( 0.5 - fs( float( i ) ) ); - float phase = 2.0 * tri( time.w * freq ); - sum += 0.1 * inRangeSmooth( t, 0.0, 0.5 * BEAT, 1E3 ) * wavetable( phase, radius, vec2( 0.3 * float( i ) ) ); - } - - //dest += 0.14 * aSaturate( sum ); - } - // -- kick --------------------------------------------------------------------------------------- if ( inRange( time.w, SECTION_NEURO, SECTION_WHOA - 2.5 * BEAT ) ) { float t = mod( mod( mod( time.y, 4.0 * BEAT ), 3.25 * BEAT ), 1.75 * BEAT ); @@ -500,7 +494,8 @@ vec2 mainAudio( vec4 time ) { : time.w < SECTION_AAAA ? 1E9 : time.w < SECTION_AAAA + 1.0 * BEAT ? time.x + mod( lofi( time.z, BEAT ), 8.0 * BEAT ) : time.w < SECTION_PSY ? 1E9 - : time.x; + : time.w < SECTION_END ? time.x + : time.z; { sidechain = smoothstep( 0.0, 0.7 * BEAT, tKick ); dest += 0.25 * kick( tKick, 1.0 ); @@ -523,7 +518,7 @@ vec2 mainAudio( vec4 time ) { if ( inRange( time.w, SECTION_PORTER_FUCKING_ROBINSON, SECTION_AAAA - 8.0 * BEAT ) || - inRange( time.w, SECTION_PSY + 16.0 * BEAT, 1E9 ) + inRange( time.w, SECTION_PSY + 16.0 * BEAT, SECTION_END ) ) { float t = mod( time.x, 0.25 * BEAT ); float decay = mix( 40.0, 100.0, fs( floor( time.z / ( 0.25 * BEAT ) ) ) ); @@ -531,42 +526,20 @@ vec2 mainAudio( vec4 time ) { } if ( - inRange( time.w, SECTION_PSY + 31.5 * BEAT, 1E9 ) + inRange( time.w, SECTION_PSY + 31.5 * BEAT, SECTION_END ) ) { float t = mod( time.x - 0.5 * BEAT, BEAT ); dest += 0.1 * mix( 0.3, 1.0, sidechain ) * hihat( t, 20.0 ); } - // -- clap --------------------------------------------------------------------------------------- + // -- crash -------------------------------------------------------------------------------------- if ( - inRange( time.w, SECTION_PSY + 64.0 * BEAT, 1E9 ) - ) { - float t = mod( time.y - 1.0 * BEAT, 2.0 * BEAT ); - dest += 0.1 * clap( t ); - } - - // -- crash --------------------------------------------------------------------------------------- - if ( - !inRange( time.w, 0.0, SECTION_PORTER_FUCKING_ROBINSON ) && - !inRange( time.w, SECTION_PSY, SECTION_PSY + 16.0 * BEAT ) + inRange( time.w, SECTION_PORTER_FUCKING_ROBINSON, SECTION_PSY ) ) { float t = time.z; dest += 0.14 * crash( t ); } - // -- psysaw ------------------------------------------------------------------------------------- - if ( - inRange( time.w, SECTION_PSY + 64.0 * BEAT, 1E9 ) - ) { - float t = mod( time.z, 0.25 * BEAT ); - float begin = time.z - t; - float dice = fs( begin ); - if ( t < ( 0.25 - dice * 0.2 ) * BEAT ) { - float freq = 20.0 * sin( TAU * begin * 1.8 ); - dest += 0.07 * saw( 20.0 * exp( -2.0 * fract( 10.0 * exp( -freq * t ) ) ) ); - } - } - // -- amen --------------------------------------------------------------------------------------- if ( inRange( time.w, SECTION_PORTER_FUCKING_ROBINSON, SECTION_AAAA - 8.0 * BEAT ) || @@ -574,7 +547,7 @@ vec2 mainAudio( vec4 time ) { ) { float chunk = floor( 6.0 * fs( lofi( time.z, 0.5 * BEAT ) ) ); // float chunk = time.y / ( 1.0 * BEAT ); - vec2 vib = 0.003 * sin( 3.0 * time.z + vec2( 0.0, 0.2 ) ); + vec2 vib = 0.003 * sin( 3.0 * time.z + vec2( 0.0, 1.4 ) ); vec2 tread = 2.0 * time.x + vib; float roll = fs( 2.4 + lofi( time.z, 0.5 * BEAT ) ); @@ -591,7 +564,7 @@ vec2 mainAudio( vec4 time ) { } // -- psy bass ----------------------------------------------------------------------------------- - if ( SECTION_PSY < time.w ) { + if ( inRange( time.w, SECTION_PSY, SECTION_END ) ) { // float t = mod( aTime - 0.5 beat, 1.0 beat ); float t = mod( time.x, 0.25 * BEAT ); float decay = exp( -50.0 * t ); @@ -603,6 +576,30 @@ vec2 mainAudio( vec4 time ) { dest += 0.12 * sidechain * wave * exp( -max( 0.0, t - 0.22 * BEAT ) * 400.0 ); } + // -- pad ---------------------------------------------------------------------------------------- + if ( SECTION_PSY < time.w ) { + vec2 sum = vec2( 0.0 ); + + float tb = lofi( time.z, 0.25 * BEAT ); + float t = time.z - tb; + float rev = exp( 3.0 * fs( tb ) - 3.0 ) * exp( -20.0 * t ); + vec2 radius = vec2( 0.02 ) * fadeout; + + for ( int i = 0; i < 21; i ++ ) { + float freq = n2f( chordsA[ ( i % 8 ) ] ) * 0.25; + freq *= 1.0 + 0.001 * ( 0.5 - fs( float( i ) ) ); + float phase = tri( time.w * freq ) * rev; + sum += 0.14 * wavetable( phase, radius, vec2( 0.3 * float( i ) ) ); + } + + for ( int i = 0; i < 7; i ++ ) { + float rate = n2r( float( chordsA[ i ] ) ) * 0.5; + sum += 0.1 * choir( time.z * rate * 0.5 ) * exp( -30.0 * t ); + } + + dest += 0.14 * mix( 0.3, 1.0, sidechain ) * aSaturate( sum ); + } + // -- superbass ---------------------------------------------------------------------------------- if ( inRange( time.w, SECTION_PORTER_FUCKING_ROBINSON, SECTION_AAAA ) ) { float t = mod( time.z, 8.0 * BEAT ); @@ -658,10 +655,10 @@ vec2 mainAudio( vec4 time ) { // -- lead --------------------------------------------------------------------------------------- if ( inRange( time.w, SECTION_PORTER_FUCKING_ROBINSON, SECTION_PSY ) ) { const int notes[16] = int[]( - 0, 10, 12, 19, - 0, 14, 15, 22, + -4, 10, 12, 19, + -5, 14, 15, 22, 0, 17, 19, 26, - 0, 14, 15, 22 + -3, 14, 15, 22 ); vec2 sum = vec2( 0.0 ); @@ -700,6 +697,10 @@ vec2 mainAudio( vec4 time ) { dest += 0.3 * deepkick( mod( time.z, 8.0 * BEAT ) ); } + if ( inRange( time.w, SECTION_END, SECTION_END + 64.0 * BEAT ) ) { + dest += 0.3 * deepkick( time.z ); + } + // -- buildup ------------------------------------------------------------------------------------ if ( inRange( time.w, SECTION_AAAA + 32.0 * BEAT, SECTION_PSY ) ) { float ph = linearstep( SECTION_AAAA + 32.0 * BEAT, SECTION_PSY, time.w ); @@ -733,23 +734,42 @@ vec2 mainAudio( vec4 time ) { dest += 0.2 * kick( time.y - 3.5 * BEAT, 1.0 ) * inRangeSmooth( time.y, 3.0 * BEAT, 3.75 * BEAT, 100.0 ); } - // -- fill, psy crashes -------------------------------------------------------------------------- - if ( inRange( time.w, SECTION_PSY + 61.0 * BEAT, SECTION_PSY + 64.0 * BEAT ) ) { - dest *= 0.0; + // -- fadeout ------------------------------------------------------------------------------------ + dest *= fadeout; - float stretch = time.x - lofi( time.x, 0.02 ) * 0.9; - float range = inRangeFloat( time.y, 0.0 * BEAT, 1.75 * BEAT ); - dest += 0.2 * kick( stretch, 1.0 ) * range; - dest += 0.1 * crash( stretch ) * range; + // -- oidos!! ------------------------------------------------------------------------------------ + // https://www.shadertoy.com/view/NdlGDl + if ( inRange( time.w, SECTION_END, 1E9 ) ) { + seed = 0.261; - dest += 0.2 * kick( mod( time.x - 0.25 * BEAT, 0.5 * BEAT ), 1.0 ) * inRangeFloat( time.y, 1.75 * BEAT, 2.5 * BEAT ); + for ( int i = 0; i < 50; i ++ ) { + float reltone = 4.0 + random() * 45.0; - dest += 0.2 * kick( mod( time.x, 0.5 * BEAT ), 1.0 ) * inRangeFloat( time.y, 2.5 * BEAT, 1E9 ); - dest += vec2( 0.1, 0.07 ) * crash( time.y - 2.5 * BEAT ) * inRangeSmooth( time.y, 0.0, 2.75 * BEAT, 400.0 ); - dest += vec2( 0.07, 0.1 ) * crash( time.y - 3.0 * BEAT ) * inRangeSmooth( time.y, 0.0, 3.25 * BEAT, 400.0 ); - dest += vec2( 0.1, 0.07 ) * crash( time.y - 3.5 * BEAT ) * inRangeSmooth( time.y, 0.0, 3.75 * BEAT, 400.0 ); + float relfreq = pow( 2.0, reltone / 12.0 ); + float relfreqOt = floor( relfreq + 0.5 ); + float relfreqH = mix( relfreq, relfreqOt, 0.2 ); + reltone = log2( relfreqH ) * 12.0; + + float mtone = reltone; + float mfreq = 220.0 * pow( 2.0, mtone / 12.0 ); + + for ( int j = 0; j < 50; j ++ ) { + float ptone = mtone + random() * 0.5; + + float freq = 220.0 * pow( 2.0, ptone / 12.0 ); + + float noisePhase = TAU * fract( freq * time.z * 5.0 ); + vec2 tt = time.z + 0.002 * wavetable( noisePhase, vec2( 0.0001 ), vec2( 0.03 * float( j ) ) ); + + vec2 phase = TAU * fract( freq * tt ) + TAU * vec2( random(), random() ); + dest += ( 1.0 - fadeout ) * 0.0002 * sin( phase ); + } + } } + float realfadeout = smoothstep( SECTION_END + 48.0 * BEAT, SECTION_END + 16.0 * BEAT, time.w ); + dest *= realfadeout; + return aSaturate( dest ); } diff --git a/src/scene.ts b/src/scene.ts index e20a92f..b1f59d5 100644 --- a/src/scene.ts +++ b/src/scene.ts @@ -1,4 +1,5 @@ import { Antialias } from './entities/Antialias'; +import { BigBlur } from './entities/BigBlur'; import { Bloom } from './entities/Bloom'; import { BufferRenderTarget } from './heck/BufferRenderTarget'; import { CanvasRenderTarget } from './heck/CanvasRenderTarget'; @@ -20,15 +21,19 @@ import { NoiseVoxels } from './entities/NoiseVoxels'; import { PixelSorter } from './entities/PixelSorter'; import { Post } from './entities/Post'; import { RTInspector } from './entities/RTInspector'; +import { SSR } from './entities/SSR'; import { SceneBegin } from './entities/SceneBegin'; import { SceneCrystals } from './entities/SceneCrystals'; import { SceneDynamic } from './entities/SceneDynamic'; import { SceneNeuro } from './entities/SceneNeuro'; +import { ScenePsy } from './entities/ScenePsy'; import { Serial } from './entities/Serial'; import { SphereParticles } from './entities/SphereParticles'; +import { SufferTexts } from './entities/SufferTexts'; import { Swap, Vector3 } from '@fms-cat/experimental'; +import { TestScreen } from './entities/TestScreen'; import { Tetrahedron } from './entities/Tetrahedron'; -import { Trails } from './entities/Trails'; +import { TextOverlay } from './entities/TextOverlay'; import { arraySetDelete } from './utils/arraySetDelete'; import { auto, automaton } from './globals/automaton'; import { music } from './globals/music'; @@ -92,9 +97,25 @@ class EntityReplacer { const ibllut = new IBLLUT(); dog.root.children.push( ibllut.entity ); -// -- deferred stuff ------------------------------------------------------------------------------- -const deferredRoot = new Entity(); -dog.root.children.push( deferredRoot ); +const replacerFlickyParticles = new EntityReplacer( + () => new FlickyParticles(), + 'FlickyParticles', +); +if ( process.env.DEV && module.hot ) { + module.hot.accept( './entities/FlickyParticles', () => { + replacerFlickyParticles.replace(); + } ); +} + +const replacerSufferTexts = new EntityReplacer( + () => new SufferTexts(), + 'SufferTexts', +); +if ( process.env.DEV && module.hot ) { + module.hot.accept( './entities/SufferTexts', () => { + replacerSufferTexts.replace(); + } ); +} const replacerSphereParticles = new EntityReplacer( () => new SphereParticles(), @@ -146,13 +167,6 @@ if ( process.env.DEV && module.hot ) { } ); } -const replacerTrails = new EntityReplacer( () => new Trails(), 'Trails' ); -if ( process.env.DEV && module.hot ) { - module.hot.accept( './entities/Trails', () => { - replacerTrails.replace(); - } ); -} - const replacerSceneBegin = new EntityReplacer( () => new SceneBegin( { scenes: [ dog.root ] } ), 'SceneBegin' @@ -206,17 +220,15 @@ if ( process.env.DEV && module.hot ) { } ); } -// -- forward stuff -------------------------------------------------------------------------------- -const forwardRoot = new Entity(); -dog.root.children.push( forwardRoot ); - -const replacerFlickyParticles = new EntityReplacer( - () => new FlickyParticles(), - 'FlickyParticles', +const replacerScenePsy = new EntityReplacer( + () => new ScenePsy( { scenes: [ dog.root ] } ), + 'ScenePsy' ); if ( process.env.DEV && module.hot ) { - module.hot.accept( './entities/FlickyParticles', () => { - replacerFlickyParticles.replace(); + module.hot.accept( './entities/ScenePsy', () => { + replacerScenePsy.current.lights.map( ( light ) => arraySetDelete( lights, light ) ); + replacerScenePsy.replace(); + lights.push( ...replacerScenePsy.current.lights ); } ); } @@ -242,6 +254,7 @@ const lights = [ ...replacerSceneNeuro.current.lights, ...replacerSceneDynamic.current.lights, ...replacerSceneCrystals.current.lights, + ...replacerScenePsy.current.lights, ]; // const light2 = new LightEntity( { @@ -345,6 +358,14 @@ dog.root.components.push( new Lambda( { name: process.env.DEV && 'main/updateCamera', } ) ); +swap.swap(); +const ssr = new SSR( { + camera: deferredCamera, + shaded: swap.i, + target: swap.o, +} ); +dog.root.children.push( ssr ); + // -- post ----------------------------------------------------------------------------------------- swap.swap(); const antialias = new Antialias( { @@ -353,6 +374,18 @@ const antialias = new Antialias( { } ); dog.root.children.push( antialias ); +swap.swap(); +const bigBlur = new BigBlur( { + input: swap.i, + target: swap.o, +} ); +dog.root.children.push( bigBlur ); + +const textOverlay = new TextOverlay( { + target: swap.o, +} ); +dog.root.children.push( textOverlay ); + swap.swap(); const bloom = new Bloom( { input: swap.i, @@ -395,6 +428,11 @@ const post = new Post( { } ); dog.root.children.push( post ); +const testScreen = new TestScreen( { + target: canvasRenderTarget +} ); +dog.root.children.push( testScreen ); + if ( process.env.DEV ) { const rtInspector = new RTInspector( { target: canvasRenderTarget diff --git a/src/shaders/big-blur.frag b/src/shaders/big-blur.frag new file mode 100644 index 0000000..51f0f82 --- /dev/null +++ b/src/shaders/big-blur.frag @@ -0,0 +1,40 @@ +#version 300 es + +precision highp float; + +const float PI = 3.14159265; + +in vec2 vUv; + +out vec4 fragColor; + +uniform float ratio; +uniform float sigma; +uniform vec2 resolution; +uniform sampler2D sampler0; + +float gaussian( float x ) { + return 1.0 / sqrt( 2.0 * PI * sigma ) * exp( - x * x / 2.0 / sigma ); +} + +void main() { + vec2 bv; + +#ifdef IS_VERTICAL + bv = vec2( 0.0, 4.0 ) / resolution; +#else + bv = vec2( 4.0, 0.0 ) / resolution; +#endif + + vec4 sum = vec4( 0.0 ); + + for ( int i = -100; i < 100; i ++ ) { + float fi = float( i ); + vec2 uvt = vUv + fi * bv; + if ( abs( uvt.x - 0.5 ) < 0.5 && abs( uvt.y - 0.5 ) < 0.5 ) { + sum += gaussian( fi ) * texture( sampler0, uvt ); + } + } + + fragColor = mix( texture( sampler0, vUv ), sum / sum.w, ratio ); +} diff --git a/src/shaders/crystal.frag b/src/shaders/crystal.frag index a1fd215..8fbf39e 100644 --- a/src/shaders/crystal.frag +++ b/src/shaders/crystal.frag @@ -101,7 +101,7 @@ void main() { #endif #ifdef DEPTH - MARCH_ITER = 10; + MARCH_ITER = 30; #endif for ( int i = 0; i < MARCH_ITER; i ++ ) { @@ -128,7 +128,7 @@ void main() { fragPosition = vec4( modelPos.xyz, depth ); fragNormal = vec4( modelNormal, 1.0 ); fragColor = vec4( vec3( 0.5 ), 1.0 ); - fragWTF = vec4( vec3( 0.04, 1.0, 0.0 ), 3 ); + fragWTF = vec4( vec3( 0.08, 0.9, 0.0 ), 3 ); #endif #ifdef DEPTH diff --git a/src/shaders/cyclic-board.frag b/src/shaders/cyclic-board.frag index e157b3d..a772164 100644 --- a/src/shaders/cyclic-board.frag +++ b/src/shaders/cyclic-board.frag @@ -181,7 +181,7 @@ void main() { fragPosition = vec4( modelPos.xyz, depth ); fragNormal = vec4( modelNormal, 1.0 ); fragColor = vec4( vec3( 0.6, 0.5, 0.4 ), 1.0 ); - fragWTF = vec4( vec3( 0.5, 0.2, 0.0 ), 3 ); + fragWTF = vec4( vec3( 0.5, 0.2, 0.0 ), 2 ); #endif #ifdef DEPTH diff --git a/src/shaders/greetings.vert b/src/shaders/greetings.vert index 904731d..ae3ceb4 100644 --- a/src/shaders/greetings.vert +++ b/src/shaders/greetings.vert @@ -42,10 +42,6 @@ void main() { vec2 offset = ( 0.6 - 0.2 * exp( -5.0 * vTime ) ) * vec2( vCharParams.y, 0.0 ); vPosition.xy += ( offset + shape ) * min( 500.0 / charParams2.x, 1.0 ); - vPosition.xy += 1.0 - * ( fs( vCharParams.z + vec2( 2.66, 1.79 ) ) * 2.0 - 1.0 ) - * pow( fs( vCharParams.z + 7.8 ), 2.0 ); - // == send the vertex position =================================================================== vPosition = vPosition; vec4 outPos = vPosition; diff --git a/src/shaders/hooperball.frag b/src/shaders/hooperball.frag new file mode 100644 index 0000000..2b7afaa --- /dev/null +++ b/src/shaders/hooperball.frag @@ -0,0 +1,214 @@ +#version 300 es + +// rip of https://www.shadertoy.com/view/tsyBWD + +precision highp float; + +#define fs(i) (fract(sin((i)*114.514)*1919.810)) +#define lofi(i,j) (floor((i)/(j))*(j)) +#define saturate(x) clamp(x,0.,1.) +#define linearstep(a,b,x) saturate(((x)-(a))/((b)-(a))) + +const int MARCH_ITER = 90; +const float PI = 3.14159265; +const float TAU = PI * 2.0; +const float foldcos = cos( PI / 5.0 ); +const float foldrem = sqrt( 0.75 - foldcos * foldcos ); +const vec3 foldvec = vec3( -0.5, -foldcos, foldrem ); +const vec3 foldface = vec3( 0.0, foldrem, foldcos ); +const vec3 foldu = vec3( 1.0, 0.0, 0.0 ); +const vec3 foldv = normalize( cross( foldu, foldface ) ); + +#ifdef DEFERRED + layout (location = 0) out vec4 fragPosition; + layout (location = 1) out vec4 fragNormal; + layout (location = 2) out vec4 fragColor; + layout (location = 3) out vec4 fragWTF; +#endif + +in vec4 vPositionWithoutModel; + +#ifdef DEPTH + out vec4 fragColor; +#endif + +uniform float deformSeed; +uniform float time; +uniform vec2 resolution; +uniform vec2 cameraNearFar; +uniform vec3 cameraPos; +uniform mat4 normalMatrix; +uniform mat4 modelMatrix; +uniform mat4 viewMatrix; +uniform mat4 projectionMatrix; +uniform mat4 inversePVM; + +vec3 divideByW( vec4 v ) { + return v.xyz / v.w; +} + +struct Heck{ + vec2 coord; + vec2 cell; + float len; +}; + +vec2 uv2heck( vec2 v ) { + v.y *= 2.0 / sqrt( 3.0 ); + v.x += v.y * 0.5; + return v; +} + +vec2 heck2uv( vec2 v ) { + v.y /= 2.0 / sqrt( 3.0 ); + v.x -= v.y * 0.5; + return v; +} + +Heck doHeck( vec2 v, float scale ) { + Heck heck; + + v = uv2heck( v ) * scale; + + heck.cell.x = floor( v.x ); + heck.cell.y = lofi( v.y + heck.cell.x + 2.0, 3.0 ) - heck.cell.x - 2.0; + heck.coord = v - heck.cell - vec2( 0.0, 1.0 ); + + bool a = heck.coord.x < heck.coord.y; + heck.cell += a ? vec2( 0.0, 2.0 ) : vec2( 1.0, 1.0 ); + heck.coord += a ? vec2( 0.0, -1.0 ) : vec2( -1.0, 0.0 ); + + heck.cell = heck2uv( heck.cell / scale ); + + heck.len = max( abs( heck.coord.x ), abs( heck.coord.y ) ); + heck.len = max( heck.len, abs( heck.coord.y - heck.coord.x ) ); + + return heck; +} + + +// https://www.iquilezles.org/www/articles/smin/smin.htm +float smin( float a, float b, float k ) { + float h = max( k - abs( a - b ), 0.0 ) / k; + return min( a, b ) - h * h * h * k * ( 1.0 / 6.0 ); +} + +mat2 rot2d( float t ) { + float c = cos( t ); + float s = sin( t ); + return mat2( c, -s, s, c ); +} + +#pragma glslify: noise = require( ./-simplex4d ); + +vec3 fold( vec3 p ) { + for ( int i = 0; i < 5; i ++ ) { + p.xy = abs( p.xy ); + p -= 2.0 * min( dot( foldvec, p ), 0.0 ) * foldvec; + } + return p; +} + +vec4 mapIcosa(vec3 p){ + p.zx = rot2d( 0.8 * time ) * p.zx; + p.xy = rot2d( 1.8 * time ) * p.xy; + p = fold( p ); + + vec3 isect = p / dot( foldface, p ); + vec2 uv = vec2( dot( isect, foldu ), dot( isect, foldv ) ); + + float phase = deformSeed; + float scale = 5.0 + 4.0 * sin( 1.8 * phase ); + Heck heck = doHeck( uv, scale ); + vec3 point = normalize( foldface + heck.cell.x * foldu + heck.cell.y * foldv ); + + phase += 4.7 * length( heck.cell ); + float height = 1.0 + 0.1 * sin( 4.9 * phase ); + + float dotPointP = dot( point, p ); + float d = max( dotPointP - height, ( heck.len - 0.4 / dotPointP ) / scale * dotPointP * dotPointP ); + vec4 ia = vec4( d, 1, 0, 0 ); + + float width = 0.8 + 0.2 * sin( 7.6 * phase ); + float haha = abs( dotPointP - height ) - 0.02; + float haha2 = ( heck.len - width ) / scale * dotPointP; + d = max( haha, haha2 ); + vec4 ib = vec4( d, 2, step( -0.03, heck.len - width ) * step( -haha, 0.03 ), 0 ); + + ia = ib.x < ia.x ? ib : ia; + + return ia; +} + +vec4 map( vec3 p ) { + vec3 pt = p; + return mapIcosa( pt ); +} + +vec3 normalFunc( vec3 p, float dd ) { + vec2 d = vec2( 0.0, dd ); + return normalize( vec3( + map( p + d.yxx ).x - map( p - d.yxx ).x, + map( p + d.xyx ).x - map( p - d.xyx ).x, + map( p + d.xxy ).x - map( p - d.xxy ).x + ) ); +} + +void main() { + vec2 p = ( gl_FragCoord.xy * 2.0 - resolution ) / resolution.y; + + vec3 rayOri = divideByW( inversePVM * vec4( p, 0.0, 1.0 ) ); + vec3 farPos = divideByW( inversePVM * vec4( p, 1.0, 1.0 ) ); + vec3 rayDir = normalize( farPos - rayOri ); + float rayLen = length( vPositionWithoutModel.xyz - rayOri ); + vec3 rayPos = rayOri + rayDir * rayLen; + vec4 isect; + + for ( int i = 0; i < MARCH_ITER; i ++ ) { + isect = map( rayPos ); + rayLen += 0.5 * isect.x; + rayPos = rayOri + rayDir * rayLen; + + if ( abs( isect.x ) < 1E-3 ) { break; } + if ( rayLen > cameraNearFar.y ) { break; } + } + + if ( 0.01 < isect.x ) { + discard; + } + + vec3 modelNormal = normalize( normalMatrix * vec4( normalFunc( rayPos, 1E-3 ), 1.0 ) ).xyz; + + vec4 modelPos = modelMatrix * vec4( rayPos, 1.0 ); + vec4 projPos = projectionMatrix * viewMatrix * modelPos; // terrible + float depth = projPos.z / projPos.w; + gl_FragDepth = 0.5 + 0.5 * depth; + + #ifdef DEFERRED + fragPosition = vec4( modelPos.xyz, depth ); + fragNormal = vec4( modelNormal, 1.0 ); + + if ( isect.y == 1.0 ) { + fragColor = vec4( vec3( 0.1 ), 1.0 ); + fragWTF = vec4( vec3( 0.8, 0.7, 0.0 ), 2 ); + } else if ( isect.y == 2.0 ) { + if ( isect.z > 0.99 ) { + fragColor = vec4( 0.1, 0.5, 0.4, 1.0 ); + fragWTF = vec4( vec3( 0.8, 0.1, 1.0 ), 2 ); + } else { + fragColor = vec4( vec3( 0.1 ), 1.0 ); + fragWTF = vec4( vec3( 0.7, 0.8, 0.0 ), 2 ); + } + } + + #endif + + #ifdef DEPTH + float shadowDepth = linearstep( + cameraNearFar.x, + cameraNearFar.y, + length( cameraPos - modelPos.xyz ) + ); + fragColor = vec4( shadowDepth, shadowDepth * shadowDepth, shadowDepth, 1.0 ); + #endif +} diff --git a/src/shaders/ifs-as-usual.frag b/src/shaders/ifs-as-usual.frag index c4ec639..9952c1f 100644 --- a/src/shaders/ifs-as-usual.frag +++ b/src/shaders/ifs-as-usual.frag @@ -2,6 +2,7 @@ precision highp float; +#define lofi(i,j) (floor((i)/(j))*(j)) #define fs(i) (fract(sin((i)*114.514)*1919.810)) #define saturate(x) clamp(x,0.,1.) #define linearstep(a,b,x) saturate(((x)-(a))/((b)-(a))) @@ -23,7 +24,6 @@ in vec4 vPositionWithoutModel; out vec4 fragColor; #endif -uniform float time; uniform float ifsSeed; uniform vec2 resolution; uniform vec2 cameraNearFar; @@ -33,9 +33,6 @@ uniform mat4 modelMatrix; uniform mat4 viewMatrix; uniform mat4 projectionMatrix; uniform mat4 inversePVM; -uniform sampler2D samplerRandom; -uniform sampler2D samplerRandomStatic; -uniform sampler2D samplerCapture; vec3 divideByW( vec4 v ) { return v.xyz / v.w; @@ -82,7 +79,7 @@ float map( vec3 p ) { vec3 pt = p; - float clampbox = box( pt, vec3( 1.0, 1.0, 1.0 ) ); + float clampbox = box( pt, vec3( 1.0 ) ); vec3 r = mix( fs( vec3( 4.7, 3.2, 4.3 ) + floor( ifsSeed ) ), @@ -93,7 +90,7 @@ float map( vec3 p ) { pt = ifs( pt, r, 0.2 * t ); pt = ifs( pt, r.yzx, 0.1 * t.yzx ); - float d = max( box( pt, vec3( 0.08 ) ), clampbox ); + float d = max( box( pt, vec3( 0.09 ) ), clampbox ); return d; } @@ -119,7 +116,7 @@ void main() { for ( int i = 0; i < MARCH_ITER; i ++ ) { isect = map( rayPos ); - rayLen += 0.5 * isect; + rayLen += 0.8 * isect; rayPos = rayOri + rayDir * rayLen; if ( abs( isect ) < 1E-3 ) { break; } diff --git a/src/shaders/psy-field.frag b/src/shaders/psy-field.frag new file mode 100644 index 0000000..7a0e1f8 --- /dev/null +++ b/src/shaders/psy-field.frag @@ -0,0 +1,237 @@ +#version 300 es + +precision highp float; + +#define fs(i) (fract(sin((i)*114.514)*1919.810)) +#define saturate(x) clamp(x,0.,1.) +#define linearstep(a,b,x) saturate(((x)-(a))/((b)-(a))) + +const float PI = 3.14159265; +const float TAU = PI * 2.0; + +#ifdef FORWARD + out vec4 fragColor; +#endif + +#ifdef DEFERRED + layout (location = 0) out vec4 fragPosition; + layout (location = 1) out vec4 fragNormal; + layout (location = 2) out vec4 fragColor; + layout (location = 3) out vec4 fragWTF; +#endif + +in vec4 vPositionWithoutModel; + +#ifdef DEPTH + out vec4 fragColor; +#endif + +uniform int lightCount; +uniform float deformAmp; +uniform float deformFreq; +uniform float deformTime; +uniform float time; +uniform float noiseOffset; +uniform vec2 lightNearFar[ 8 ]; +uniform vec2 resolution; +uniform vec2 size; +uniform vec2 cameraNearFar; +uniform vec3 lightPos[ 8 ]; +uniform vec3 lightColor[ 8 ]; +uniform vec3 cameraPos; +uniform vec4 lightParams[ 8 ]; +uniform mat4 lightPV[ 8 ]; +uniform mat4 normalMatrix; +uniform mat4 modelMatrix; +uniform mat4 viewMatrix; +uniform mat4 projectionMatrix; +uniform mat4 inversePVM; +uniform sampler2D samplerRandom; +uniform sampler2D samplerRandomStatic; +uniform sampler2D samplerCapture; +uniform sampler2D samplerShadow[ 8 ]; + +vec3 divideByW( vec4 v ) { + return v.xyz / v.w; +} + +#pragma glslify: doAnalyticLighting = require( ./modules/doAnalyticLighting.glsl ); +#pragma glslify: doShadowMapping = require( ./modules/doShadowMapping.glsl ); + +vec4 fetchShadowMap( int iLight, vec2 uv ) { + if ( iLight == 0 ) { + return texture( samplerShadow[ 0 ], uv ); + } else if ( iLight == 1 ) { + return texture( samplerShadow[ 1 ], uv ); + } else if ( iLight == 2 ) { + return texture( samplerShadow[ 2 ], uv ); + } else if ( iLight == 3 ) { + return texture( samplerShadow[ 3 ], uv ); + } else if ( iLight == 4 ) { + return texture( samplerShadow[ 4 ], uv ); + } else if ( iLight == 5 ) { + return texture( samplerShadow[ 5 ], uv ); + } else if ( iLight == 6 ) { + return texture( samplerShadow[ 6 ], uv ); + } else if ( iLight == 7 ) { + return texture( samplerShadow[ 7 ], uv ); + } +} + +#pragma glslify: orthBasis = require( ./modules/orthBasis ); + +vec3 ifs( vec3 p, vec3 r, vec3 t ) { + vec3 s = t; + mat3 bas = orthBasis( r ); + + for ( int i = 0; i < 5; i ++ ) { + p = abs( p ) - abs( s ) * pow( 1.8, -float( i ) ); + + s = bas * s; + + p.xy = p.x < p.y ? p.yx : p.xy; + p.yz = p.y < p.z ? p.zy : p.yz; + } + + return p; +} + +float box( vec3 p, vec3 s ) { + vec3 d = abs( p ) - s; + return min( 0.0, max( d.x, max( d.y, d.z ) ) ) + length( max( vec3( 0.0 ), d ) ); +} + +float map( vec3 p ) { + vec4 isect; + + vec3 pt = p; + pt.z -= 4.0 * time; + pt.zx = mod( pt.zx - 5.0, 10.0 ) - 5.0; + + vec3 r = vec3( 1.6, 0.5, -0.8 ); + vec3 t = vec3( 4.8, 3.7, 2.1 ); + pt = ifs( pt, r, t ); + pt = ifs( pt, r.yzx, 0.4 * t.yzx ); + + float d = box( pt, vec3( 0.14 ) ); + d = max( d, abs( p.y ) - 1.0 ); + + return d; +} + +vec3 nMap( vec3 p, float dd ) { + vec2 d = vec2( 0.0, dd ); + return normalize( vec3( + map( p + d.yxx ) - map( p - d.yxx ), + map( p + d.xyx ) - map( p - d.xyx ), + map( p + d.xxy ) - map( p - d.xxy ) + ) ); +} + +void main() { + vec2 p = ( gl_FragCoord.xy * 2.0 - resolution ) / resolution.y; + + vec3 rayOri = divideByW( inversePVM * vec4( p, 0.0, 1.0 ) ); + vec3 farPos = divideByW( inversePVM * vec4( p, 1.0, 1.0 ) ); + vec3 rayDir = normalize( farPos - rayOri ); + float rayLen = length( vPositionWithoutModel.xyz - rayOri ); + vec3 rayPos = rayOri + rayDir * rayLen; + float dist; + + int MARCH_ITER; + + #ifdef FORWARD + MARCH_ITER = 10; + #endif + + #ifdef DEFERRED + MARCH_ITER = 40; + #endif + + #ifdef DEPTH + MARCH_ITER = 10; + #endif + + for ( int i = 0; i < MARCH_ITER; i ++ ) { + dist = map( rayPos ); + rayLen += 0.5 * dist; + rayPos = rayOri + rayDir * rayLen; + + if ( abs( dist ) < 1E-3 ) { break; } + if ( rayLen > cameraNearFar.y ) { break; } + } + + if ( 0.01 < dist ) { + discard; + } + + vec3 normal = nMap( rayPos, 1E-3 ); + vec3 modelNormal = normalize( normalMatrix * vec4( normal, 1.0 ) ).xyz; + + vec4 modelPos = modelMatrix * vec4( rayPos, 1.0 ); + vec4 projPos = projectionMatrix * viewMatrix * modelPos; // terrible + float depth = projPos.z / projPos.w; + gl_FragDepth = 0.5 + 0.5 * depth; + + #ifdef FORWARD + vec3 color = vec3( 0.0 ); + + // for each lights + for ( int iLight = 0; iLight < 8; iLight ++ ) { + if ( iLight >= lightCount ) { break; } + + vec3 V = cameraPos - modelPos.xyz; + vec3 L = lightPos[ iLight ] - modelPos.xyz; + + // shading + vec3 shade = doAnalyticLighting( + V, + L, + modelNormal, + vec3( 0.6, 0.5, 0.4 ), + 0.5, + 0.2 + ) * lightColor[ iLight ]; + + // fetch shadowmap + spot lighting + vec4 lightProj = lightPV[ iLight ] * modelPos; + vec2 lightP = lightProj.xy / lightProj.w; + + shade *= doShadowMapping( + L, + modelNormal, + fetchShadowMap( iLight, 0.5 + 0.5 * lightP ), + lightP, + lightNearFar[ iLight ], + lightParams[ iLight ].x + ); + + color += shade; + } + + vec3 gradient = 0.5 + 0.5 * cos( + 3.0 + 1.5 * exp( -0.4 * max( rayLen - 3.0, 0.0 ) ) + vec3( 0.0, 2.0, 4.0 ) + ); + float edge = step( 0.1, length( normal - nMap( rayPos, 1E-2 ) ) ); + + color += gradient * edge; + + fragColor = vec4( color, 1.0 ); + #endif + + #ifdef DEFERRED + fragPosition = vec4( modelPos.xyz, depth ); + fragNormal = vec4( modelNormal, 1.0 ); + fragColor = vec4( vec3( 0.0 ), 1.0 ); + fragWTF = vec4( vec3( 1.0, 0.0, 0.0 ), 4 ); + #endif + + #ifdef DEPTH + float shadowDepth = linearstep( + cameraNearFar.x, + cameraNearFar.y, + length( cameraPos - modelPos.xyz ) + ); + fragColor = vec4( shadowDepth, shadowDepth * shadowDepth, shadowDepth, 1.0 ); + #endif +} diff --git a/src/shaders/trails-compute.frag b/src/shaders/racer-compute.frag similarity index 51% rename from src/shaders/trails-compute.frag rename to src/shaders/racer-compute.frag index f99b5ea..f3ec1dc 100644 --- a/src/shaders/trails-compute.frag +++ b/src/shaders/racer-compute.frag @@ -4,12 +4,13 @@ precision highp float; const float PARTICLE_LIFE_LENGTH = 5.0; const float HUGE = 9E16; +const float INTERVAL = 0.03125; const float PI = 3.14159265; const float TAU = 6.283185307; +#define fs(i) (fract(sin((i)*114.514)*1919.810)) #define saturate(i) clamp(i,0.,1.) #define lofi(i,m) (floor((i)/(m))*(m)) -#define lofir(i,m) (floor((i)/(m)+.5)*(m)) layout (location = 0) out vec4 fragCompute0; layout (location = 1) out vec4 fragCompute1; @@ -17,40 +18,18 @@ layout (location = 1) out vec4 fragCompute1; uniform bool init; uniform bool shouldUpdate; uniform float time; -uniform float beat; uniform float trails; uniform float trailLength; -uniform float totalFrame; uniform float deltaTime; uniform vec2 resolution; uniform sampler2D samplerCompute0; uniform sampler2D samplerCompute1; uniform sampler2D samplerRandom; -uniform float noiseScale; -uniform float noisePhase; -// uniform float velScale; -// uniform float genRate; - -// ------ - -vec2 uvInvT( vec2 _uv ) { - return vec2( 0.0, 1.0 ) + vec2( 1.0, -1.0 ) * _uv; -} - -// ------ - -mat2 rotate2D( float _t ) { - return mat2( cos( _t ), sin( _t ), -sin( _t ), cos( _t ) ); -} float fractSin( float i ) { return fract( sin( i ) * 1846.42 ); } -vec4 sampleRandom( vec2 _uv ) { - return texture( samplerRandom, _uv ); -} - #pragma glslify: prng = require( ./-prng ); #pragma glslify: cyclicNoise = require( ./modules/cyclicNoise ); @@ -67,40 +46,6 @@ vec3 randomSphere( inout vec4 seed ) { return v; } -vec2 randomCircle( inout vec4 seed ) { - vec2 v; - for ( int i = 0; i < 10; i ++ ) { - v = vec2( - prng( seed ), - prng( seed ) - ) * 2.0 - 1.0; - if ( length( v ) < 1.0 ) { break; } - } - return v; -} - -vec3 randomBox( inout vec4 seed ) { - vec3 v; - v = vec3( - prng( seed ), - prng( seed ), - prng( seed ) - ) * 2.0 - 1.0; - return v; -} - -float uneune( float i, float p ) { - return sin( TAU * ( - fractSin( i ) + floor( 1.0 + 4.0 * fractSin( i + 54.12 ) ) * p - ) ); -} - -vec3 uneune3( float i, float p ) { - return vec3( uneune( i, p ), uneune( i + 11.87, p ), uneune( i + 21.92, p ) ); -} - -// ------ - void main() { vec2 uv = gl_FragCoord.xy / resolution; @@ -115,8 +60,14 @@ void main() { vec4 tex0 = texture( samplerCompute0, uv ); vec4 tex1 = texture( samplerCompute1, uv ); + tex0.z += 4.0 * deltaTime; // camera if ( shouldUpdate ) { - tex0.w = saturate( tex0.w - 1.0 / trailLength ); // decrease the life + tex0.w = tex0.w + 1.0 / trailLength; // update the life + } + + // quick patch! + if ( init ) { + tex0.w = 1E9; } fragCompute0 = tex0; @@ -140,46 +91,55 @@ void main() { float timing = mix( 0.0, PARTICLE_LIFE_LENGTH, floor( uv.y * trails ) / trails ); timing += lofi( time, PARTICLE_LIFE_LENGTH ); - if ( time - deltaTime + PARTICLE_LIFE_LENGTH < timing ) { + if ( time - dt + PARTICLE_LIFE_LENGTH < timing ) { timing -= PARTICLE_LIFE_LENGTH; } - // == initialize particles ======================================================================= - if ( - time - deltaTime < timing && timing <= time - ) { - dt = time - timing; + if ( shouldUpdate ) { + // == initialize particles ===================================================================== + if ( + time - dt < timing && timing <= time + ) { + dt = time - timing; - pos = 1.0 * randomSphere( seed ); + pos = lofi( 5.0 * randomSphere( seed ), INTERVAL ); + pos.z -= 4.0; - vel = 1.0 * randomSphere( seed ); + vel = 1.0 * randomSphere( seed ); - life = 1.0; + life = 0.0; - jumpFlag = 1.0; - } else { - jumpFlag = 0.0; // remove jumping flag + jumpFlag = 1.0; + } else { + jumpFlag = 0.0; // remove jumping flag + } + + // == update particles ========================================================================= + // noise field + vel += 4.0 * cyclicNoise( pos ) * dt; + + // resistance + // vel *= exp( -10.0 * dt ); + // vel.z += 10.0 * dt; + + vec3 v = vel; + float vmax = max( abs( v.x ), max( abs( v.y ), abs( v.z ) ) ); + v = INTERVAL * sign( v ) * ( + abs( v.x ) == vmax ? vec3( 1.0, 0.0, 0.0 ) : + abs( v.y ) == vmax ? vec3( 0.0, 1.0, 0.0 ) : + vec3( 0.0, 0.0, 1.0 ) + ) / dt; + + pos += v * dt; + life += dt / PARTICLE_LIFE_LENGTH; } - // == update particles =========================================================================== - // noise field - vel += 40.0 * cyclicNoise( pos ) * dt; + pos.z += 4.0 * deltaTime; // camera - // resistance - vel *= exp( -10.0 * dt ); - // vel.z += 10.0 * dt; - - vec3 v = vel; - // float vmax = max( abs( v.x ), max( abs( v.y ), abs( v.z ) ) ); - // v *= ( - // abs( v.x ) == vmax ? vec3( 1.0, 0.0, 0.0 ) : - // abs( v.y ) == vmax ? vec3( 0.0, 1.0, 0.0 ) : - // vec3( 0.0, 0.0, 1.0 ) - // ); - - // pos.xyz += velScale * v * dt; - pos += v * dt; - life -= dt / PARTICLE_LIFE_LENGTH; + // quick patch! + if ( init ) { + life = 1E9; + } fragCompute0 = vec4( pos, life ); fragCompute1 = vec4( vel, jumpFlag ); diff --git a/src/shaders/racer-render.frag b/src/shaders/racer-render.frag new file mode 100644 index 0000000..e792b31 --- /dev/null +++ b/src/shaders/racer-render.frag @@ -0,0 +1,55 @@ +#version 300 es + +precision highp float; + +in float vLife; +in vec4 vPosition; + +#ifdef FORWARD + out vec4 fragColor; +#endif + +#ifdef DEFERRED + layout (location = 0) out vec4 fragPosition; + layout (location = 1) out vec4 fragNormal; + layout (location = 2) out vec4 fragColor; + layout (location = 3) out vec4 fragWTF; +#endif + +uniform vec3 cameraPos; +uniform vec4 color; + +void main() { + if ( length( gl_PointCoord - 0.5 ) > 0.5 ) { discard; } + + float lenV = length( vPosition.xyz - cameraPos ); + + vec3 gradient = 0.5 + 0.5 * cos( + 3.0 + 1.5 * exp( -0.4 * max( lenV - 3.0, 0.0 ) ) + vec3( 0.0, 2.0, 4.0 ) + ); + + vec3 color = 10.0 * gradient * exp( -5.0 * vLife ); + + // too near! + color *= smoothstep( 0.5, 1.0, lenV ); + + #ifdef FORWARD + #ifndef CUBEMAP + if ( length( color.xyz ) >= 1.0 ) { discard; } + #endif + + // decay + color *= exp( -0.4 * max( lenV - 3.0, 0.0 ) ); + + fragColor.xyz = vec3( color ); + #endif + + #ifdef DEFERRED + if ( length( color.xyz ) < 1.0 ) { discard; } + + fragPosition = vPosition; + fragNormal = vec4( 0.0, 0.0, 1.0, 1.0 ); + fragColor = vec4( color.xyz, 1.0 ); + fragWTF = vec4( vec3( 0.0 ), 1 ); + #endif +} diff --git a/src/shaders/racer-render.vert b/src/shaders/racer-render.vert new file mode 100644 index 0000000..bdb5306 --- /dev/null +++ b/src/shaders/racer-render.vert @@ -0,0 +1,46 @@ +#version 300 es + +const float PI = 3.14159265; +const float TAU = 6.283185307; +const float COLOR_VAR = 0.1; + +#define saturate(x) clamp(x,0.,1.) +#define linearstep(a,b,x) saturate(((x)-(a))/((b)-(a))) + +layout (location = 0) in vec2 computeUV; + +out float vLife; +out vec4 vPosition; + +uniform vec2 resolution; +uniform mat4 projectionMatrix; +uniform mat4 viewMatrix; +uniform mat4 modelMatrix; +uniform sampler2D samplerCompute0; +uniform sampler2D samplerCompute1; + +mat2 rotate2D( float _t ) { + return mat2( cos( _t ), sin( _t ), -sin( _t ), cos( _t ) ); +} + +void main() { + vec2 uv = computeUV; + + vec4 pos = texture( samplerCompute0, uv ); + + vLife = pos.w; + + vPosition = modelMatrix * vec4( pos.xyz, 1.0 ); + vec4 outPos = projectionMatrix * viewMatrix * vPosition; + outPos.x *= resolution.y / resolution.x; + gl_Position = outPos; + + vPosition.w = outPos.z / outPos.w; + + #ifdef CUBEMAP + // ???? + gl_PointSize = 2.0; + #else + gl_PointSize = resolution.y * 0.01 / outPos.z; + #endif +} diff --git a/src/shaders/shading.frag b/src/shaders/shading.frag index 41c92a2..b7be76c 100644 --- a/src/shaders/shading.frag +++ b/src/shaders/shading.frag @@ -6,6 +6,7 @@ const int MTL_NONE = 0; const int MTL_UNLIT = 1; const int MTL_PBR = 2; const int MTL_REFRACT = 3; +const int MTL_PSY = 4; const float ENV_UV_MARGIN = 0.9375; const float AO_BIAS = 0.0; const float AO_RADIUS = 0.5; @@ -276,6 +277,27 @@ void main() { color += isect.color * texEnvRefractive; + } else if ( isect.materialId == MTL_PSY ) { + color = 0.02 * smoothstep( 0.9, 1.0, texture( samplerAo, isect.screenUv ).xyz ); + + // vec2 f = ( 1.0 - 2.0 * prng( seed ) ) / resolution; + vec2 f = 1.0 / resolution; + vec4 tex0x = texture( sampler0, vUv + f ); + vec4 tex1x = texture( sampler1, vUv + f ); + vec4 tex3x = texture( sampler3, vUv + f ); + + float valid = MTL_PSY == int( tex3x.w ) ? 1.0 : 0.0; + + float edge = saturate( + step( 0.1, abs( length( cameraPos - tex0x.xyz ) - lenV ) ) + + step( 0.1, length( tex1x.xyz - tex1.xyz ) ) + ) * valid; + + vec3 gradient = 0.5 + 0.5 * cos( + 3.0 + 1.5 * exp( -0.4 * max( lenV - 3.0, 0.0 ) ) + vec3( 0.0, 2.0, 4.0 ) + ); + color += 0.4 * gradient * edge; + } color *= exp( -0.4 * max( lenV - 3.0, 0.0 ) ); diff --git a/src/shaders/ssr.frag b/src/shaders/ssr.frag new file mode 100644 index 0000000..74e3eb3 --- /dev/null +++ b/src/shaders/ssr.frag @@ -0,0 +1,96 @@ +#version 300 es + +precision highp float; + +const float PI = 3.14159265359; +const float TAU = 6.28318530718; + +#define saturate(x) clamp(x,0.,1.) +#define linearstep(a,b,x) saturate(((x)-(a))/((b)-(a))) + +vec4 seed; + +in vec2 vUv; + +out vec4 fragColor; + +uniform vec2 resolution; +uniform vec2 cameraNearFar; +uniform vec3 cameraPos; +uniform mat4 cameraView; +uniform mat4 cameraPV; +uniform sampler2D sampler0; // position.xyz, depth +uniform sampler2D sampler1; // normal.xyz +uniform sampler2D sampler2; // color.rgba +uniform sampler2D sampler3; // materialParams.xyz, materialId +uniform sampler2D samplerShaded; +uniform sampler2D samplerRandom; + +#pragma glslify: prng = require( ./-prng ); + +// == structs ====================================================================================== +struct Isect { + vec2 screenUv; + vec3 color; + vec3 position; + float depth; + vec3 normal; + int materialId; + vec3 materialParams; +}; + +// == main procedure =============================================================================== +void main() { + vec4 tex0 = texture( sampler0, vUv ); + vec4 tex1 = texture( sampler1, vUv ); + vec4 tex2 = texture( sampler2, vUv ); + vec4 tex3 = texture( sampler3, vUv ); + vec4 shaded = texture( samplerShaded, vUv ); + + Isect isect; + isect.screenUv = vUv; + isect.position = tex0.xyz; + isect.depth = tex0.w; + isect.normal = normalize( tex1.xyz ); + isect.color = tex2.rgb; + isect.materialId = int( tex3.w + 0.5 ); + isect.materialParams = tex3.xyz; + + vec3 ssr = vec3( 0.0 ); + + if ( isect.materialId != 1 ) { + seed = texture( samplerRandom, vUv ) * 1919.810; + prng( seed ); + + // from isect + vec3 V = cameraPos - isect.position; + float lenV = length( V ); + V = normalize( V ); + + // ssr + vec3 refl = reflect( -V, clamp( isect.normal, -1.0, 1.0 ) ); + float reflLen = 0.0; + + for ( int i = 0; i < 9; i ++ ) { + reflLen += 0.1 + 0.01 * prng( seed ); + + vec3 reflP = isect.position + reflLen * refl; + vec4 reflSP = cameraPV * vec4( reflP, 1.0 ); + reflSP.x *= resolution.y / resolution.x; + reflSP /= reflSP.w; + + vec2 reflUv = 0.5 + 0.5 * reflSP.xy; + float outOfScreenMul = smoothstep( 0.5, 0.4, abs( reflUv.x - 0.5 ) ); + outOfScreenMul *= smoothstep( 0.5, 0.4, abs( reflUv.y - 0.5 ) ); + + vec4 reflTexPos = texture( sampler0, reflUv ); + if ( reflSP.z > reflTexPos.w ) { + float diff = length( reflP.xyz - reflTexPos.xyz ); + ssr += texture( samplerShaded, reflUv ).xyz * outOfScreenMul * exp( -3.0 * reflLen ) * exp( -10.0 * diff ); + break; + } + } + } + + fragColor = vec4( shaded.xyz + ssr, 1.0 ); +} diff --git a/src/shaders/test-screen.frag b/src/shaders/test-screen.frag new file mode 100644 index 0000000..173222d --- /dev/null +++ b/src/shaders/test-screen.frag @@ -0,0 +1,30 @@ +#version 300 es + +#define saturate(i) clamp(i, 0.,1.) +#define linearstep(a,b,x) saturate(((x)-(a))/((b)-(a))) +#define fs(i) (fract(sin((i)*114.514)*1919.810)) + +precision highp float; + +in vec2 vUv; + +out vec4 fragColor; + +uniform float time; +uniform float fade; +uniform float circle; +uniform float mode; +uniform vec2 resolution; +uniform sampler2D samplerRandom; + +void main() { + if ( mode == 1.0 ) { + fragColor = vec4( vUv, fade, 1.0 ); + } else if ( mode == 2.0 ) { + vec2 p = vUv * 2.0 - 1.0; + p.x *= resolution.x / resolution.y; + + float shape = linearstep( 2.0 / resolution.y, 0.0, length( p ) - 0.3 * circle ); + fragColor = vec4( vec3( shape ), 1.0 ); + } +} diff --git a/src/shaders/text-overlay.frag b/src/shaders/text-overlay.frag new file mode 100644 index 0000000..be9b141 --- /dev/null +++ b/src/shaders/text-overlay.frag @@ -0,0 +1,28 @@ +#version 300 es + +precision highp float; + +in vec2 vUv; + +out vec4 fragColor; + +uniform float amp; +uniform vec2 resolution; +uniform sampler2D sampler0; + +void main() { + vec2 uv = vUv; + uv.y = 1.0 - uv.y; + + float shape = texture( sampler0, uv ).w; + shape = pow( shape, 2.2 ); + + float blur = 0.0; + + for ( int i = -10; i < 10; i ++ ) { + float t = texture( sampler0, uv + vec2( 4 * i, 0.0 ) / resolution ).w; + blur += exp( -0.2 * abs( float( i ) ) ) * pow( t, 2.2 ); + } + + fragColor = amp * vec4( shape + 0.03 * blur ); +} diff --git a/src/shaders/trails-render.frag b/src/shaders/trails-render.frag deleted file mode 100644 index 9677759..0000000 --- a/src/shaders/trails-render.frag +++ /dev/null @@ -1,44 +0,0 @@ -#version 300 es - -precision highp float; - -const int MTL_UNLIT = 1; -const int MTL_PBR = 2; - -const float PI = 3.14159265; -const float TAU = 6.28318531; - -#define saturate(i) clamp(i,0.,1.) -#define linearstep(a,b,x) saturate(((x)-(a))/((b)-(a))) - -// == varings / uniforms =========================================================================== -in vec4 vPosition; -in vec3 vNormal; -in vec4 vColor; -in float vLife; -in vec4 vRandom; - -layout (location = 0) out vec4 fragPosition; -layout (location = 1) out vec4 fragNormal; -layout (location = 2) out vec4 fragColor; -layout (location = 3) out vec4 fragWTF; - -uniform float time; - -// == common ======================================================================================= -mat2 rotate2D( float _t ) { - return mat2( cos( _t ), sin( _t ), -sin( _t ), cos( _t ) ); -} - -// == main procedure =============================================================================== -void main() { - if ( vColor.a < 0.0 ) { discard; } - - float emissive = 0.0; - // emissive *= 0.5 + 0.5 * sin( TAU * vRandom.z + 20.0 * time ); - - fragPosition = vPosition; - fragNormal = vec4( vNormal, 1.0 ); - fragColor = vColor; - fragWTF = vec4( vec3( 0.4, 0.1, emissive ), MTL_PBR ); -} diff --git a/src/shaders/trails-render.vert b/src/shaders/trails-render.vert deleted file mode 100644 index c14f8cc..0000000 --- a/src/shaders/trails-render.vert +++ /dev/null @@ -1,122 +0,0 @@ -#version 300 es - -const float HUGE = 9E16; -const float PI = 3.14159265; -const float TAU = 6.283185307; -const float COLOR_VAR = 0.1; - -#define saturate(x) clamp(x,0.,1.) -#define linearstep(a,b,x) saturate(((x)-(a))/((b)-(a))) -#define lofi(i,m) (floor((i)/(m))*(m)) -#define lofir(i,m) (floor((i+0.5)/(m))*(m)) - -// ------------------------------------------------------------------------------------------------- -layout (location = 0) in float computeU; -layout (location = 1) in float computeV; -layout (location = 2) in float triIndex; - -out float vLife; -out vec3 vNormal; -out vec4 vPosition; -out vec4 vColor; -out vec4 vRandom; - -uniform bool isShadow; -uniform float ppp; -uniform float trailShaker; -uniform float colorVar; -uniform float colorOffset; -uniform vec2 resolution; -uniform vec2 resolutionCompute; -uniform mat4 projectionMatrix; -uniform mat4 viewMatrix; -uniform mat4 modelMatrix; -uniform mat4 normalMatrix; -uniform sampler2D samplerCompute0; -uniform sampler2D samplerCompute1; -uniform sampler2D samplerRandomStatic; - -// ------------------------------------------------------------------------------------------------- -vec3 blurpleGradient( float t ) { - vec3 colorA = vec3( 0.01, 0.04, 0.2 ); - vec3 colorB = vec3( 0.02, 0.3, 0.9 ); - vec3 colorC = vec3( 0.9, 0.01, 0.6 ); - vec3 colorD = vec3( 0.5, 0.02, 0.02 ); - - return mix( - colorA, - mix( - colorB, - mix( - colorC, - colorD, - linearstep( 0.67, 1.0, t ) - ), - linearstep( 0.33, 0.67, t ) - ), - linearstep( 0.0, 0.33, t ) - ); -} - -vec3 catColor( float _p ) { - return 0.5 + 0.5 * vec3( - cos( _p ), - cos( _p + PI / 3.0 * 4.0 ), - cos( _p + PI / 3.0 * 2.0 ) - ); -} - -vec4 random( vec2 _uv ) { - return texture( samplerRandomStatic, _uv ); -} - -mat2 rotate2D( float _t ) { - return mat2( cos( _t ), sin( _t ), -sin( _t ), cos( _t ) ); -} - -// ------------------------------------------------------------------------------------------------- - -void main() { - vec2 uv = vec2( computeU, computeV ); - - // == fetch texture ============================================================================== - vec4 pos = texture( samplerCompute0, uv ); - vec4 vel = texture( samplerCompute1, uv ); - vec4 velp = texture( samplerCompute1, uv - vec2( 1.0, 0.0 ) / resolutionCompute ); - - // == assign varying variables =================================================================== - vLife = pos.w; - - vRandom = random( uv.yy * 182.92 ); - - vColor.xyz = ( - vRandom.y < 0.8 - ? pow( catColor( TAU * ( ( vRandom.x * 2.0 - 1.0 ) * COLOR_VAR + 0.0 ) ), vec3( 2.0 ) ) - : vec3( 0.4 ) - ); - // vColor.xyz = blurpleGradient( vLife ); - // vColor.xyz = catColor( 3.0 + 4.0 * vLife ); - - vColor.w = ( velp.w < 0.5 && vel.w < 0.5 && 0.0 < vLife ) ? 1.0 : -1.0; - - // == compute size and direction ================================================================= - float size = 0.005; - size *= 1.0 + pow( vRandom.w, 2.0 ); - // size *= max( 0.0, sin( PI * vLife ) ); - - vec3 dir = normalize( vel.xyz ); - vec3 sid = normalize( cross( dir, vec3( 0.0, 1.0, 0.0 ) ) ); - vec3 top = normalize( cross( sid, dir ) ); - - float theta = triIndex / 3.0 * TAU + vLife * 1.0; - vec2 tri = vec2( sin( theta ), cos( theta ) ); - vNormal = ( normalMatrix * vec4( tri.x * sid + tri.y * top, 1.0 ) ).xyz; - pos.xyz += size * vNormal; - - vPosition = modelMatrix * vec4( pos.xyz, 1.0 ); - vec4 outPos = projectionMatrix * viewMatrix * vPosition; - outPos.x *= resolution.y / resolution.x; - gl_Position = outPos; - - vPosition.w = outPos.z / outPos.w; -} diff --git a/webpack.config.js b/webpack.config.js index abf16d3..a1d38e8 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -16,7 +16,7 @@ const terserOptions = { booleans_as_integers: true, drop_console: true, keep_fargs: false, - passes: 1, + passes: 2, unsafe_arrows: true, unsafe_math: true, },