From 0accfd3b63cc0f786cac18107b3165e60fd4d8e1 Mon Sep 17 00:00:00 2001 From: FMS-Cat Date: Wed, 31 Mar 2021 03:30:56 +0900 Subject: [PATCH] please --- src/automaton.json | 2 +- src/config-hot.ts | 1 + src/entities/Bloom.ts | 2 +- src/entities/Crystal.ts | 117 +++++++++++++++ src/entities/DVi.ts | 65 +++++++++ src/entities/DeferredCamera.ts | 19 ++- src/entities/FlickyParticles.ts | 2 + src/entities/ForwardCamera.ts | 8 +- src/entities/GPUParticles.ts | 10 +- src/entities/LightShaft.ts | 5 +- src/entities/Rings.ts | 30 +--- .../{LightsFirst.ts => SceneBegin.ts} | 39 +++-- src/entities/SceneCrystals.ts | 41 ++++++ src/entities/{LightsPink.ts => SceneNeuro.ts} | 44 ++++-- src/entities/Wobbleball.ts | 14 +- src/heck/components/PerspectiveCamera.ts | 39 ++++- src/music/music.vert | 10 +- src/scene.ts | 91 +++++------- src/shaders/crystal.frag | 136 ++++++++++++++++++ src/shaders/dvi.frag | 111 ++++++++++++++ src/shaders/ifs-piston.frag | 65 ++++++--- src/shaders/light-shaft.frag | 3 +- src/shaders/pixel-sorter.frag | 2 +- src/shaders/post.frag | 8 -- src/shaders/rings.frag | 4 +- src/shaders/rings.vert | 2 +- src/shaders/shading.frag | 14 +- src/shaders/wobbleball.frag | 4 +- 28 files changed, 691 insertions(+), 197 deletions(-) create mode 100644 src/entities/Crystal.ts create mode 100644 src/entities/DVi.ts rename src/entities/{LightsFirst.ts => SceneBegin.ts} (50%) create mode 100644 src/entities/SceneCrystals.ts rename src/entities/{LightsPink.ts => SceneNeuro.ts} (51%) create mode 100644 src/shaders/crystal.frag create mode 100644 src/shaders/dvi.frag diff --git a/src/automaton.json b/src/automaton.json index 85833ee..7843e32 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,0,0,0,0.1],[0.3747555183012014,1,-0.1,0,0.1],[1.3333333333333333,0,-0.1]]},{"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.5,0.5,0,0,0.3072250626170559,0.32683448369273865],[1.3333333333333333,1.5]]},{"nodes":[[0,0.2,0,0,0.18674781789871728,2.609799325705191],[0.6666666666666666,0.1,-0.3546547911950566,0.44607843137254866]]},{"nodes":[[0,0.15115889256979576,0,0,0.1],[1.3333333333333333,0.7344636184844164,-0.8192982456140352,-0.01372549019607843]],"fxs":[{"def":"sine","params":{"amp":0.42000000000000004,"freq":9.43,"offset":0},"time":0.5833333333333333,"length":0.75},{"def":"hermitePatch","params":{},"time":0.5,"length":0.16666666666666663,"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":[[0,0,0,0,0.1],[1,0,-0.1]]},{"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.16666666666666666,0.153],[0.16666666666666666],[0.3333333333333333,0.163],[0.3333333333333333],[0.5833333333333333,0.238],[0.5833333333333333,0.04062113856815275],[0.8333333333333333,0.22034925385572868,-0.133853348820023,-0.07010198661229775],[1.3333333333333333]],"fxs":[{"def":"repeat","params":{"interval":0.24999999999999978},"time":0.5833333333333333,"length":0.75}]},{"nodes":[[0,0.6168473268646855],[0.5833333333333333,1],[0.8333333333333333,0.6255553847107174],[1.3333333333333333]],"fxs":[{"def":"repeat","params":{"interval":0.24899999999999978},"time":0.5833333333333333,"length":0.75}]},{"nodes":[[],[0.3333333333333333,0.333,-0.1318249578245017,-0.11100980502520737],[1.3333333333333333,1.333]],"fxs":[{"def":"transpose","params":{"note":20},"time":0.3333333333333333,"length":0.08333333333333331},{"def":"transpose","params":{"note":19},"time":0.41666666666666663,"length":0.08333333333333337},{"def":"transpose","params":{"note":15},"time":0.5833333333333333,"length":0.08333333333333337},{"def":"transpose","params":{"note":19},"time":0.75,"length":0.08333333333333326},{"def":"transpose","params":{"note":20},"time":0.8333333333333333,"length":0.08333333333333337},{"def":"transpose","params":{"note":27},"time":0.9166666666666666,"length":0.08333333333333337},{"def":"transpose","params":{"note":20},"time":1.0833333333333333,"length":0.08333333333333326},{"def":"transpose","params":{"note":19},"time":1.1666666666666665,"length":0.08333333333333348},{"def":"transpose","params":{"note":12},"time":1.25,"length":0.08333333333333326}]},{"nodes":[[0,1,0,0,0.3172798432035585,-0.00842583980071474],[0.3333333333333333,0.3385612800187644,-0.1,0,0.0716601615237471,0.6414845305618694],[1.3333333333333333,1]]},{"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":[[],[1,1]]},{"nodes":[[],[0.3333333333333333,0.44812509610022166,-0.23613507086474844,-0.23458326926651907],[0.3333333333333333],[0.8333333333333333,0.6000000000000001,-0.09645837250812755,-0.07200773715280141],[0.8333333333333333],[1.3333333333333333,0.6497778461157131,-0.18770610661569506,-0.3127776923553587]]},{"nodes":[[0,0,0,0,0.07564543093234954,0.8647058823529409],[0.3333333333333333,1,-0.1,0,0.1],[0.5833333333333333,0.15890113266954908,-0.1,0,0.1],[0.8333333333333333,0.8,-0.1,0,0.1],[1.1666666666666665,0.6551804039307616,-0.1,0,0.1],[1.3333333333333333,1]]},{"nodes":[[0,0.1],[0.3333333333333333,0.7000000000000001,0,0,0.11333333333333334],[0.5833333333333333,0.2,-0.1,0,0.1],[0.8333333333333333,0.2,-0.1,0,0.1],[1.1666666666666665,0.1,-0.1,0,0.1],[1.3333333333333333,0.30000000000000004]]},{"nodes":[[],[0.25,0.5576926904226305],[0.5833333333333333,0.1],[0.8333333333333333,0.8],[0.8333333333333333,0.1],[1.3333333333333333]]},{"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.16666666666666666,0.1544139225237],[0.16666666666666666],[0.3333333333333333,0.333],[0.3333333333333333,0,0,0,0.24280370519045835,0.3313836935065723],[1.3333333333333333,1.6,-0.5476442447487717,-1.0551462481506804]]},{"nodes":[[0,0.8],[0.16666666666666666,0.2,-0.1,0,0.1],[0.3333333333333333,1,-0.1,0,0.1],[0.5833333333333333,0.2,-0.1,0,0.1],[0.8333333333333333,0.9,-0.1,0,0.1],[1.0455051873385028,0.2,-0.1,0,0.1],[1.3333333333333333,1,-0.49330842435241606,-0.2740913734470782]]},{"nodes":[[0,0.1],[0.3333333333333333,0.5],[0.7809767797069133,0.8],[1.3333333333333333,0.30000000000000004]]},{"nodes":[[0,0.1],[0.3333333333333333,0.2],[1.3333333333333333,0.1]]},{"nodes":[[0,1]]},{"nodes":[[],[0.45471939645822934,0.5,-0.1430548302872063,-0.06589575380191512],[0.45471939645822934],[1,0.7000000000000001,-0.22020017406440381,-0.2108664121661284],[1],[1.3333333333333333,0.30000000000000004,-0.1780504786771105,-0.13039215686274508]]},{"nodes":[[],[0.45471939645822934,0.5,-0.1430548302872063,-0.06589575380191512],[0.45471939645822934],[1.3333333333333333,0.9,-0.4793545802247207,-0.37137880345051055]]}],"channels":[["EnvironmentMap/accumulate",{"items":[{},{"time":5.333333333333333,"length":1,"value":0.1,"curve":31,"amp":0.9},{"time":48,"length":1,"value":0.1,"curve":31,"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":261.3333333333333}]}],["PixelSorter/amp",{"items":[{},{"time":48,"length":1.3333333333333357,"curve":13,"speed":0.4999999999999975},{"time":50.666666666666664,"length":1.3333333333333357,"curve":13,"speed":0.4999999999999975},{"time":53.333333333333336,"length":1.3333333333333357,"curve":13,"speed":0.4999999999999975},{"time":56,"length":1.3333333333333357,"curve":13,"speed":0.4999999999999975},{"time":58.666666666666664,"length":1.3333333333333357,"curve":13,"speed":0.4999999999999975},{"time":61.333333333333336,"length":1.3333333333333357,"curve":13,"speed":0.4999999999999975},{"time":64,"length":1.3333333333333357,"curve":13,"speed":0.4999999999999975},{"time":66.66666666666666,"length":1.3333333333333357,"curve":13,"speed":0.4999999999999975},{"time":69.33333333333333,"length":1.3333333333333357,"curve":13,"speed":0.4999999999999975},{"time":71.99999999999999,"length":1.3333333333333357,"curve":13,"speed":0.4999999999999975},{"time":74.66666666666666,"length":1.3333333333333357,"curve":13,"speed":0.4999999999999975},{"time":77.33333333333333,"length":1.3333333333333357,"curve":13,"speed":0.4999999999999975},{"time":79.99999999999999,"length":1.3333333333333357,"curve":13,"speed":0.4999999999999975},{"time":82.66666666666666,"length":1.3333333333333357,"curve":13,"speed":0.4999999999999975},{"time":85.33333333333333,"length":1.3333333333333357,"curve":13,"speed":0.4999999999999975},{"time":87.99999999999999,"length":1.3333333333333357,"curve":13,"speed":0.4999999999999975},{"time":90.33333333333333,"length":0.3333333333333286,"curve":43,"speed":1.0000000000000153,"amp":-0.4},{"time":90.66666666666666},{"time":91.99999999999999,"length":1.3333333333333428,"value":0.2,"reset":true},{"time":94.66666666666666,"length":1.3333333333333428,"value":0.2,"reset":true},{"time":97.33333333333333,"length":1.3333333333333428,"value":0.2,"reset":true},{"time":99.99999999999999,"length":1.3333333333333428,"value":0.2,"reset":true},{"time":102.66666666666666,"length":1.3333333333333428,"value":0.2,"reset":true},{"time":105.33333333333333,"length":1.3333333333333428,"value":0.2,"reset":true},{"time":107.99999999999999,"length":1.3333333333333428,"value":0.2,"reset":true},{"time":110.66666666666666,"length":1.3333333333333428,"value":0.2,"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}]}],["LightsFirst/active",{"items":[{},{"time":5.333333333333333,"length":42.666666666666664}]}],["Condition/active",{"items":[{},{"time":5.333333333333333,"length":42.666666666666664}]}],["Cube/active",{"items":[{},{"time":5.333333333333333,"length":42.666666666666664}]}],["Sync/first/clap",{"items":[{},{"time":27.666666666666664,"length":1.3333333333333321,"curve":19},{"time":28.999999999999996,"length":1.3333333333333321,"value":1,"curve":19},{"time":30.33333333333333,"length":1.3333333333333321,"value":2,"curve":19},{"time":31.66666666666666,"length":1.3333333333333321,"value":3,"curve":19},{"time":32.99999999999999,"length":1.3333333333333321,"value":4,"curve":19},{"time":34.33333333333333,"length":1.3333333333333321,"value":5,"curve":19},{"time":35.66666666666666,"length":1.3333333333333321,"value":6,"curve":19},{"time":36.99999999999999,"length":1.3333333333333321,"value":7,"curve":19},{"time":38.33333333333332,"length":1.3333333333333321,"value":8,"curve":19},{"time":39.66666666666665,"length":1.3333333333333321,"value":9,"curve":19},{"time":40.99999999999998,"length":1.3333333333333321,"value":10,"curve":19},{"time":42.33333333333331,"length":1.3333333333333321,"value":11,"curve":19}]}],["Condition/hahaRatio",{"items":[{},{"time":42.666666666666664,"length":4,"curve":30}]}],["Condition/phaseWidth",{"items":[{"value":0.1},{"time":27.666666666666664,"length":20.333333333333332,"value":0.1,"curve":20,"speed":0.049180327868852465,"amp":0.5888750576601328}]}],["LightsPink/active",{"items":[{},{"time":48,"length":42.666666666666664}]}],["Wobbleball/active",{"items":[{},{"time":48,"length":42.666666666666664}]}],["SufferTexts/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/active",{"items":[{},{"time":48,"length":42.666666666666664}]}],["IFSPistons/group0/rot",{"items":[{},{"time":48.666666666666664,"length":2,"curve":28},{"time":54,"length":2,"value":1,"curve":28},{"time":59.333333333333336,"length":2,"value":2,"curve":28},{"time":64.66666666666666,"length":2,"value":3,"curve":28},{"time":69.99999999999999,"length":2,"value":4,"curve":28},{"time":75.33333333333333,"length":2,"value":5,"curve":28},{"time":80.66666666666666,"length":2,"value":6,"curve":28},{"time":85.99999999999999,"length":2,"value":7,"curve":28}]}],["IFSPistons/group1/rot",{"items":[{},{"time":51.333333333333336,"length":2,"curve":28},{"time":56.666666666666664,"length":2,"value":1,"curve":28},{"time":62,"length":2,"value":2,"curve":28},{"time":67.33333333333333,"length":2,"value":3,"curve":28},{"time":72.66666666666666,"length":2,"value":4,"curve":28},{"time":77.99999999999999,"length":2,"value":5,"curve":28},{"time":83.33333333333333,"length":2,"value":6,"curve":28},{"time":88.66666666666666,"length":2,"value":7,"curve":28}]}],["IFSPistons/group0/pos",{"items":[{"value":3},{"time":47.666666666666664,"length":2.3333333333333357,"value":1.2000000000000002,"curve":27,"amp":1.7999999999999998},{"time":53,"length":2.3333333333333357,"value":1.2000000000000002,"curve":27,"amp":1.7999999999999998},{"time":58.333333333333336,"length":2.3333333333333357,"value":1.2000000000000002,"curve":27,"amp":1.7999999999999998},{"time":63.666666666666664,"length":2.3333333333333357,"value":1.2000000000000002,"curve":27,"amp":1.7999999999999998},{"time":69.03333333333333,"length":2.3333333333333357,"value":1.2000000000000002,"curve":27,"amp":1.7999999999999998},{"time":74.33333333333333,"length":2.3333333333333357,"value":1.2000000000000002,"curve":27,"amp":1.7999999999999998},{"time":79.66666666666666,"length":2.3333333333333357,"value":1.2000000000000002,"curve":27,"amp":1.7999999999999998},{"time":84.99999999999999,"length":2.3333333333333357,"value":1.2000000000000002,"curve":27,"amp":1.7999999999999998}]}],["IFSPistons/group1/pos",{"items":[{"value":3},{"time":50.333333333333336,"length":2.3333333333333357,"value":1.2000000000000002,"curve":27,"amp":1.7999999999999998},{"time":55.666666666666664,"length":2.3333333333333357,"value":1.2000000000000002,"curve":27,"amp":1.7999999999999998},{"time":61,"length":2.3333333333333357,"value":1.2000000000000002,"curve":27,"amp":1.7999999999999998},{"time":66.33333333333333,"length":2.3333333333333357,"value":1.2000000000000002,"curve":27,"amp":1.7999999999999998},{"time":71.66666666666666,"length":2.3333333333333357,"value":1.2000000000000002,"curve":27,"amp":1.7999999999999998},{"time":76.99999999999999,"length":2.3333333333333357,"value":1.2000000000000002,"curve":27,"amp":1.7999999999999998},{"time":82.33333333333333,"length":2.3333333333333357,"value":1.2000000000000002,"curve":27,"amp":1.7999999999999998},{"time":87.66666666666666,"length":2.3333333333333357,"value":1.2000000000000002,"curve":27,"amp":1.7999999999999998}]}],["Music/NEURO_TIME",{"items":[{},{"time":48,"length":10.666666666666664,"curve":2},{"time":58.666666666666664,"length":8.666666666666671,"curve":2},{"time":67.33333333333333,"length":1.999999999999993,"curve":9},{"time":69.33333333333333,"length":10.666666666666664,"curve":2},{"time":79.99999999999999,"length":8.666666666666671,"curve":2},{"time":88.66666666666666,"length":0.6666666666666714,"curve":9},{"time":89.33333333333333,"length":1.3333333333333286,"curve":44},{"time":90.66666666666666,"length":1.3333333333333286,"curve":14,"offset":1.4210854715202004e-14},{"time":93.33333333333331,"length":1.3333333333333428,"curve":14},{"time":95.99999999999999,"length":1.3333333333333428,"curve":14},{"time":98.66666666666666,"length":1.3333333333333428,"curve":14},{"time":101.33333333333333,"length":1.3333333333333428,"curve":14},{"time":103.99999999999999,"length":1.3333333333333428,"curve":14},{"time":106.66666666666666,"length":1.3333333333333428,"curve":14},{"time":109.33333333333333,"length":1.3333333333333428,"curve":14}]}],["Music/NEURO_DETUNE",{"items":[{},{"time":48,"length":10.666666666666664,"curve":3},{"time":58.666666666666664,"length":8.666666666666671,"curve":3},{"time":67.33333333333333,"length":1.999999999999993,"curve":10},{"time":69.33333333333333,"length":10.666666666666664,"curve":3},{"time":79.99999999999999,"length":8.666666666666671,"curve":3},{"time":88.66666666666666,"length":2,"curve":10,"speed":0.8333333333333358},{"time":90.66666666666666,"length":1.3333333333333286,"curve":15},{"time":93.33333333333333,"length":1.3333333333333286,"curve":15},{"time":95.99999999999999,"length":1.3333333333333286,"curve":15},{"time":98.66666666666666,"length":1.3333333333333286,"curve":15},{"time":101.33333333333333,"length":1.3333333333333286,"curve":15},{"time":103.99999999999999,"length":1.3333333333333286,"curve":15},{"time":106.66666666666666,"length":1.3333333333333286,"curve":15},{"time":109.33333333333333,"length":1.3333333333333286,"curve":15}]}],["Music/NEURO_DETUNE_PHASE",{"items":[{},{"time":48,"length":10.666666666666664,"curve":8},{"time":58.666666666666664,"length":8.666666666666671,"curve":8},{"time":67.33333333333333,"length":1.999999999999993,"curve":11},{"time":69.33333333333333,"length":10.666666666666664,"curve":8},{"time":79.99999999999999,"length":8.666666666666671,"curve":8},{"time":88.66666666666666,"length":2,"curve":11,"speed":0.8333333333333358},{"time":90.66666666666666,"length":1.3333333333333428,"curve":16},{"time":93.33333333333333,"length":1.3333333333333428,"curve":16},{"time":95.99999999999999,"length":1.3333333333333428,"curve":16},{"time":98.66666666666666,"length":1.3333333333333428,"curve":16},{"time":101.33333333333333,"length":1.3333333333333428,"curve":16},{"time":103.99999999999999,"length":1.3333333333333428,"curve":16},{"time":106.66666666666666,"length":1.3333333333333428,"curve":16},{"time":109.33333333333333,"length":1.3333333333333428,"curve":16}]}],["Music/NEURO_WUB_AMP",{"items":[{},{"time":48,"length":10.668578038364203,"curve":4},{"time":58.6685780383642,"length":8.664755294969133,"curve":4},{"time":67.33333333333333,"length":2.0038227433950624,"curve":12},{"time":69.33715607672839,"length":10.668578038364203,"curve":4},{"time":80.0057341150926,"length":8.660932551574064,"curve":4},{"time":88.66666666666666,"length":2,"curve":12,"speed":0.8028871529270708},{"time":90.66666666666666,"length":1.3333333333333333,"curve":17},{"time":93.33333333333333,"length":1.3333333333333333,"curve":17},{"time":95.99999999999999,"length":1.3333333333333333,"curve":17},{"time":98.66666666666666,"length":1.3333333333333333,"curve":17},{"time":101.33333333333333,"length":1.3333333333333333,"curve":17},{"time":103.99999999999999,"length":1.3333333333333333,"curve":17},{"time":106.66666666666666,"length":1.3333333333333333,"curve":17},{"time":109.33333333333333,"length":1.3333333333333333,"curve":17}]}],["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":95.99999999999999,"length":1.3333333333333144,"value":1},{"time":98.66666666666666,"length":1.3333333333333144,"value":1},{"time":101.33333333333333,"length":1.3333333333333144,"value":1},{"time":103.99999999999999,"length":1.3333333333333144,"value":1},{"time":106.66666666666666,"length":1.3333333333333144,"value":1},{"time":109.33333333333333,"length":1.3333333333333144,"value":1}]}],["Trails/active",{"items":[{}]}],["Rings/active",{"items":[{},{"time":111.99999999999999,"length":42.666666666666664}]}],["FlickyParticles/active",{"items":[{},{"time":48,"length":42.666666666666664},{"time":90.66666666666666,"length":1.3333333333333286},{"time":93.33333333333333,"length":1.3333333333333286},{"time":95.99999999999999,"length":1.3333333333333286},{"time":98.66666666666666,"length":1.3333333333333286},{"time":101.33333333333333,"length":1.3333333333333286},{"time":103.99999999999999,"length":1.3333333333333286},{"time":106.66666666666666,"length":1.3333333333333286},{"time":109.33333333333333,"length":1.3333333333333286},{"time":111.99999999999999,"length":21.333333333333343}]}],["SphereParticles/active",{"items":[{},{"time":90.66666666666666,"length":1.3333333333333286},{"time":93.33333333333333,"length":1.3333333333333286},{"time":95.99999999999999,"length":1.3333333333333286},{"time":98.66666666666666,"length":1.3333333333333286},{"time":101.33333333333333,"length":1.3333333333333286},{"time":103.99999999999999,"length":1.3333333333333286},{"time":106.66666666666666,"length":1.3333333333333286},{"time":109.33333333333333,"length":1.3333333333333286}]}],["FlashyTerrain/active",{"items":[{},{"time":91.99999999999999,"length":1.3333333333333428},{"time":102.66666666666666,"length":1.3333333333333428}]}],["Camera/pos/x",{"items":[{},{"time":48,"value":0.029999999999999923},{"time":50.666666666666664,"value":0.22},{"time":53.333333333333336,"value":0.18999999999999975},{"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":79.99999999999999,"value":0.030000000000000478},{"time":82.66666666666666,"value":-0.32999999999999946},{"time":85.33333333333333,"value":0.26000000000000034},{"time":88},{"time":90.66666666666666}]}],["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":102.66666666666666,"value":0.8799999999999999}]}],["Camera/pos/z",{"items":[{},{"time":48},{"time":64,"value":0.15},{"time":66.66666666666666,"value":0.04000000000000473},{"time":69.33333333333333},{"time":85.33333333333333,"value":-0.16999999999999965},{"time":87.99999999999999},{"time":90.66666666666666}]}],["Camera/rot/r",{"items":[{},{"time":5.333333333333333,"length":4,"value":5,"curve":21,"amp":10},{"time":26.033333333333335,"length":4,"value":5,"curve":22,"amp":-2},{"time":42,"length":4,"value":3,"curve":22,"amp":4},{"time":48,"value":5},{"time":50.666666666666664,"value":5.6},{"time":53.333333333333336,"value":3.5400000000000005},{"time":56,"value":6.480000000000007},{"time":58.666666666666664,"value":5},{"time":61.333333333333336,"value":5.6},{"time":64,"value":3.630000000000001},{"time":66.66666666666666,"value":6.600000000000005},{"time":69.33333333333333,"value":5},{"time":71.99999999999999,"value":5.6},{"time":74.66666666666666,"value":3.5400000000000005},{"time":77.33333333333333,"value":6.480000000000007},{"time":79.99999999999999,"value":5},{"time":82.66666666666666,"value":5.6},{"time":85.33333333333333,"value":3.630000000000001},{"time":88,"value":6.6},{"time":89.33333333333331,"length":1.3333333333333428,"value":6.6,"curve":37,"speed":0.4999999999999974,"amp":4.4999999999999964},{"time":90.66666666666666,"length":1.3333333333333286,"value":5,"curve":21,"speed":3.000000000000011,"amp":5},{"time":93.33333333333333,"length":1.3333333333333286,"value":5,"curve":21,"speed":3.000000000000011,"amp":5},{"time":96,"length":1.3333333333333286,"value":5,"curve":21,"speed":3.000000000000011,"amp":5},{"time":98.66666666666667,"length":1.3333333333333144,"value":5,"curve":21,"speed":3.000000000000011,"amp":5},{"time":101.33333333333334,"length":1.3333333333333144,"value":5,"curve":21,"speed":3.000000000000011,"amp":5},{"time":104.00000000000001,"length":1.3333333333333144,"value":5,"curve":21,"speed":3.000000000000011,"amp":5},{"time":106.66666666666669,"length":1.3333333333333002,"value":5,"curve":21,"speed":3.000000000000011,"amp":5},{"time":109.33333333333336,"length":1.3333333333333002,"value":5,"curve":21,"speed":3.000000000000011,"amp":5}]}],["Camera/rot/t",{"items":[{},{"time":26.666666666666664,"length":5.333333333333332,"curve":23,"speed":0.2499999999999999,"amp":0.30000000000000004},{"time":31.999999999999996,"length":5.333333333333332,"value":1.2000000000000002,"curve":23,"speed":0.2499999999999999,"amp":-0.9},{"time":37.333333333333336,"length":5.333333333333329,"value":-0.3,"curve":23,"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.9900000000000047},{"time":66.66666666666666,"value":-0.15999999999999523},{"time":69.33333333333333,"value":0.12000000000000001},{"time":71.99999999999999,"value":0.7500000000000049},{"time":74.66666666666666,"value":-0.3599999999999952},{"time":77.33333333333333,"value":-0.029999999999995274},{"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":95.99999999999999},{"time":98.66666666666666},{"time":101.33333333333333},{"time":102.66666666666666,"value":-0.32},{"time":103.99999999999999},{"time":106.66666666666666},{"time":109.33333333333333}]}],["Camera/rot/p",{"items":[{},{"time":26.666666666666664,"length":5.333333333333332,"curve":23,"speed":0.2499999999999999,"amp":0.30000000000000004},{"time":31.999999999999996,"value":-2.3500000000000125},{"time":37.333333333333336,"length":5.333333333333329,"value":-0.3,"curve":23,"speed":0.2499999999999999,"amp":0.30000000000000004},{"time":48,"length":2.6666666666666643,"curve":29},{"time":50.666666666666664,"length":2.6666666666666714,"value":-0.9690196078431373,"curve":29},{"time":53.333333333333336,"length":2.6666666666666714,"curve":29},{"time":56.00000000000001,"length":2.6666666666666714,"value":-0.39117647058823524,"curve":29},{"time":58.66666666666668,"length":2.6666666666666714,"value":-0.12117647058823516,"curve":29},{"time":61.33333333333335,"length":2.6666666666666714,"value":-1.4311764705882353,"curve":29},{"time":64.00000000000001,"length":2.6666666666666714,"value":-0.29117647058823515,"curve":29},{"time":66.66666666666669,"length":2.6666666666666714,"value":-0.4011764705882349,"curve":29},{"time":69.33333333333336,"length":2.6666666666666643,"curve":29},{"time":72.00000000000001,"length":2.6666666666666714,"value":-0.9690196078431373,"curve":29},{"time":74.66666666666669,"length":2.6666666666666714,"curve":29},{"time":77.33333333333336,"length":2.6666666666666714,"value":-0.39117647058823524,"curve":29},{"time":80.00000000000003,"length":2.6666666666666714,"value":-0.6411764705882351,"curve":29},{"time":82.6666666666667,"length":2.6666666666666714,"value":-1.3611764705882354,"curve":29},{"time":85.33333333333337,"length":2.6666666666666714,"value":-1.5411764705882351,"curve":29},{"time":88.00000000000004,"length":1.3333333333333286,"value":-1.5411764705882351,"curve":29},{"time":89.33333333333337,"length":1.333333333333286,"value":-1.016,"curve":37,"speed":0.5000000000000079,"amp":3},{"time":90.66666666666666},{"time":91.99999999999999,"length":1.3333333333333428,"curve":25,"amp":6},{"time":93.33333333333333},{"time":95.99999999999999},{"time":98.66666666666666},{"time":101.33333333333333},{"time":102.66666666666666,"length":1.3333333333333428,"curve":25,"amp":6},{"time":104},{"time":106.66666666666666},{"time":109.33333333333333}]}],["Camera/roll",{"items":[{"time":5.333333333333334,"length":21.333333333333332,"curve":26,"speed":0.1875},{"time":48},{"time":53.333333333333336,"value":0.25},{"time":56,"value":0.06000000000000172},{"time":58.666666666666664,"value":-0.14},{"time":61.333333333333336,"value":2.7100000000000013},{"time":64,"value":1.4300000000000013},{"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.99},{"time":79.99999999999999,"value":0.33000000000000007},{"time":82.66666666666666,"value":1.08},{"time":85.33333333333333,"value":2.380000000000001},{"time":88},{"time":89.33333333333331,"length":1.3333333333333428,"curve":37,"speed":0.4999999999999974,"amp":3},{"time":90.66666666666666},{"time":101.33333333333333},{"time":102.66666666666666,"value":-0.26000000000000006},{"time":104.00158889323498}]}],["Camera/shake",{"items":[{},{"time":48,"length":1,"curve":36},{"time":50.666666666666664,"length":1,"curve":36},{"time":53.333333333333336,"length":1,"curve":36},{"time":56,"length":1,"curve":36},{"time":58.666666666666664,"length":1,"curve":36},{"time":61.333333333333336,"length":1,"curve":36},{"time":64,"length":1,"curve":36},{"time":66.66666666666666,"length":1,"curve":36},{"time":69.33333333333333,"length":1,"curve":36},{"time":71.99999999999999,"length":1,"curve":36},{"time":74.66666666666666,"length":1,"curve":36},{"time":77.33333333333333,"length":1,"curve":36},{"time":79.99999999999999,"length":1,"curve":36},{"time":82.66666666666666,"length":1,"curve":36},{"time":85.33333333333333,"length":1,"curve":36},{"time":88,"length":1,"curve":36}]}]],"labels":{"zero":0,"begin":5.333333333333333,"neuro":48,"porterfuckingrobinson":112,"fuckingcamellia":90.66666666666666,"psy":154.66666666666666},"guiSettings":{"snapTimeActive":true,"snapTimeInterval":0.1,"snapValueActive":true,"snapValueInterval":0.1,"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,0,0,0,0.1],[0.3747555183012014,1,-0.1,0,0.1],[1.3333333333333333,0,-0.1]]},{"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.5,0.5,0,0,0.3072250626170559,0.32683448369273865],[1.3333333333333333,1.5]]},{"nodes":[[0,0.2,0,0,0.18674781789871728,2.609799325705191],[0.6666666666666666,0.1,-0.3546547911950566,0.44607843137254866]]},{"nodes":[[0,0.15115889256979576,0,0,0.1],[1.3333333333333333,0.7344636184844164,-0.8192982456140352,-0.01372549019607843]],"fxs":[{"def":"sine","params":{"amp":0.42000000000000004,"freq":9.43,"offset":0},"time":0.5833333333333333,"length":0.75},{"def":"hermitePatch","params":{},"time":0.5,"length":0.16666666666666663,"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":[[0,0,0,0,0.1],[1,0,-0.1]]},{"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.16666666666666666,0.153],[0.16666666666666666],[0.3333333333333333,0.163],[0.3333333333333333],[0.5833333333333333,0.238],[0.5833333333333333,0.04062113856815275],[0.8333333333333333,0.22034925385572868,-0.133853348820023,-0.07010198661229775],[1.3333333333333333]],"fxs":[{"def":"repeat","params":{"interval":0.24999999999999978},"time":0.5833333333333333,"length":0.75}]},{"nodes":[[0,0.6168473268646855],[0.5833333333333333,1],[0.8333333333333333,0.6255553847107174],[1.3333333333333333]],"fxs":[{"def":"repeat","params":{"interval":0.24899999999999978},"time":0.5833333333333333,"length":0.75}]},{"nodes":[[],[0.3333333333333333,0.333,-0.1318249578245017,-0.11100980502520737],[1.3333333333333333,1.333]],"fxs":[{"def":"transpose","params":{"note":20},"time":0.3333333333333333,"length":0.08333333333333331},{"def":"transpose","params":{"note":19},"time":0.41666666666666663,"length":0.08333333333333337},{"def":"transpose","params":{"note":15},"time":0.5833333333333333,"length":0.08333333333333337},{"def":"transpose","params":{"note":19},"time":0.75,"length":0.08333333333333326},{"def":"transpose","params":{"note":20},"time":0.8333333333333333,"length":0.08333333333333337},{"def":"transpose","params":{"note":27},"time":0.9166666666666666,"length":0.08333333333333337},{"def":"transpose","params":{"note":20},"time":1.0833333333333333,"length":0.08333333333333326},{"def":"transpose","params":{"note":19},"time":1.1666666666666665,"length":0.08333333333333348},{"def":"transpose","params":{"note":12},"time":1.25,"length":0.08333333333333326}]},{"nodes":[[0,1,0,0,0.3172798432035585,-0.00842583980071474],[0.3333333333333333,0.3385612800187644,-0.1,0,0.0716601615237471,0.6414845305618694],[1.3333333333333333,1]]},{"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":[[],[1,1]]},{"nodes":[[],[0.3333333333333333,0.44812509610022166,-0.23613507086474844,-0.23458326926651907],[0.3333333333333333],[0.8333333333333333,0.6000000000000001,-0.09645837250812755,-0.07200773715280141],[0.8333333333333333],[1.3333333333333333,0.6497778461157131,-0.18770610661569506,-0.3127776923553587]]},{"nodes":[[0,0,0,0,0.07564543093234954,0.8647058823529409],[0.3333333333333333,1,-0.1,0,0.1],[0.5833333333333333,0.15890113266954908,-0.1,0,0.1],[0.8333333333333333,0.8,-0.1,0,0.1],[1.1666666666666665,0.6551804039307616,-0.1,0,0.1],[1.3333333333333333,1]]},{"nodes":[[0,0.1],[0.3333333333333333,0.7000000000000001,0,0,0.11333333333333334],[0.5833333333333333,0.2,-0.1,0,0.1],[0.8333333333333333,0.2,-0.1,0,0.1],[1.1666666666666665,0.1,-0.1,0,0.1],[1.3333333333333333,0.30000000000000004]]},{"nodes":[[],[0.25,0.5576926904226305],[0.5833333333333333,0.1],[0.8333333333333333,0.8],[0.8333333333333333,0.1],[1.3333333333333333]]},{"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.16666666666666666,0.1544139225237],[0.16666666666666666],[0.3333333333333333,0.333],[0.3333333333333333,0,0,0,0.24280370519045835,0.3313836935065723],[1.3333333333333333,1.6,-0.5476442447487717,-1.0551462481506804]]},{"nodes":[[0,0.8],[0.16666666666666666,0.2,-0.1,0,0.1],[0.3333333333333333,1,-0.1,0,0.1],[0.5833333333333333,0.2,-0.1,0,0.1],[0.8333333333333333,0.9,-0.1,0,0.1],[1.0455051873385028,0.2,-0.1,0,0.1],[1.3333333333333333,1,-0.49330842435241606,-0.2740913734470782]]},{"nodes":[[0,0.1],[0.3333333333333333,0.5],[0.7809767797069133,0.8],[1.3333333333333333,0.30000000000000004]]},{"nodes":[[0,0.1],[0.3333333333333333,0.2],[1.3333333333333333,0.1]]},{"nodes":[[0,1]]},{"nodes":[[],[0.45471939645822934,0.5,-0.1430548302872063,-0.06589575380191512],[0.45471939645822934],[1,0.7000000000000001,-0.22020017406440381,-0.2108664121661284],[1],[1.3333333333333333,0.30000000000000004,-0.1780504786771105,-0.13039215686274508]]},{"nodes":[[],[0.45471939645822934,0.5,-0.1430548302872063,-0.06589575380191512],[0.45471939645822934],[1.3333333333333333,0.9,-0.4793545802247207,-0.37137880345051055]]},{"nodes":[[0,0,0,0,0.1],[1,0,-0.1]]},{"nodes":[[0,1,0,0,0.32403863251667875,-0.016549003048861238],[0.6601392515230635,0.8588235294117648,-0.3657976094933656,0.05238364149449456,0.09490988103383552,-0.27199148463174944],[0.7000000000000001,0.1,-0.1,0,0.1],[4,0,-0.5779474714155504]]},{"nodes":[[],[0.3333333333333333,0.5],[0.3333333333333333],[1.3333333333333333,0.9]]},{"nodes":[[0,0.4,0,0,0.07180156657963446,-0.28137254901960784],[0.3333333333333333,0.7000000000000001,-0.1,0,0.1],[1.3333333333333333,0.2,-0.1]]},{"nodes":[[0,0,0,0,0.1],[0.4340731070496084,0.2,-0.1,0,0.1],[1.3333333333333333,0.5,-0.1]]}],"channels":[["EnvironmentMap/accumulate",{"items":[{},{"time":5.333333333333333,"length":1,"value":0.1,"curve":31,"amp":0.9},{"time":48,"length":1,"value":0.1,"curve":31,"amp":0.9},{"time":110.66666666666666,"length":1,"value":0.1,"curve":31,"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":261.3333333333333}]}],["PixelSorter/amp",{"items":[{},{"time":48,"length":1.3333333333333357,"curve":13,"speed":0.4999999999999975},{"time":50.666666666666664,"length":1.3333333333333357,"curve":13,"speed":0.4999999999999975},{"time":53.333333333333336,"length":1.3333333333333357,"curve":13,"speed":0.4999999999999975},{"time":56,"length":1.3333333333333357,"curve":13,"speed":0.4999999999999975},{"time":58.666666666666664,"length":1.3333333333333357,"curve":13,"speed":0.4999999999999975},{"time":61.333333333333336,"length":1.3333333333333357,"curve":13,"speed":0.4999999999999975},{"time":64,"length":1.3333333333333357,"curve":13,"speed":0.4999999999999975},{"time":66.66666666666666,"length":1.3333333333333357,"curve":13,"speed":0.4999999999999975},{"time":69.33333333333333,"length":1.3333333333333357,"curve":13,"speed":0.4999999999999975},{"time":71.99999999999999,"length":1.3333333333333357,"curve":13,"speed":0.4999999999999975},{"time":74.66666666666666,"length":1.3333333333333357,"curve":13,"speed":0.4999999999999975},{"time":77.33333333333333,"length":1.3333333333333357,"curve":13,"speed":0.4999999999999975},{"time":79.99999999999999,"length":1.3333333333333357,"curve":13,"speed":0.4999999999999975},{"time":82.66666666666666,"length":1.3333333333333357,"curve":13,"speed":0.4999999999999975},{"time":85.33333333333333,"length":1.3333333333333357,"curve":13,"speed":0.4999999999999975},{"time":87.99999999999999,"length":1.3333333333333357,"curve":13,"speed":0.4999999999999975},{"time":90.33333333333333,"length":0.3333333333333286,"curve":43,"speed":1.0000000000000153,"amp":-0.4},{"time":90.66666666666666},{"time":91.99999999999999,"length":1.3333333333333428,"value":0.2,"reset":true},{"time":94.66666666666666,"length":1.3333333333333428,"value":0.2,"reset":true},{"time":97.33333333333333,"length":1.3333333333333428,"value":0.2,"reset":true},{"time":99.99999999999999,"length":1.3333333333333428,"value":0.2,"reset":true},{"time":102.66666666666666,"length":1.3333333333333428,"value":0.2,"reset":true},{"time":105.33333333333333,"length":1.3333333333333428,"value":0.2,"reset":true},{"time":107.99999999999999,"length":1.3333333333333428,"value":0.2,"reset":true},{"time":110.66666666666666,"length":1.3333333333333428,"value":0.2,"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}]}],["SceneBegin/active",{"items":[{},{"time":5.333333333333333,"length":42.666666666666664}]}],["Sync/first/clap",{"items":[{},{"time":27.666666666666664,"length":1.3333333333333321,"curve":19},{"time":28.999999999999996,"length":1.3333333333333321,"value":1,"curve":19},{"time":30.33333333333333,"length":1.3333333333333321,"value":2,"curve":19},{"time":31.66666666666666,"length":1.3333333333333321,"value":3,"curve":19},{"time":32.99999999999999,"length":1.3333333333333321,"value":4,"curve":19},{"time":34.33333333333333,"length":1.3333333333333321,"value":5,"curve":19},{"time":35.66666666666666,"length":1.3333333333333321,"value":6,"curve":19},{"time":36.99999999999999,"length":1.3333333333333321,"value":7,"curve":19},{"time":38.33333333333332,"length":1.3333333333333321,"value":8,"curve":19},{"time":39.66666666666665,"length":1.3333333333333321,"value":9,"curve":19},{"time":40.99999999999998,"length":1.3333333333333321,"value":10,"curve":19},{"time":42.33333333333331,"length":1.3333333333333321,"value":11,"curve":19}]}],["Condition/hahaRatio",{"items":[{},{"time":42.666666666666664,"length":4,"curve":30}]}],["Condition/phaseWidth",{"items":[{"value":0.1},{"time":27.666666666666664,"length":20.333333333333332,"value":0.1,"curve":20,"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":28},{"time":54,"length":2,"value":1,"curve":28},{"time":59.333333333333336,"length":2,"value":2,"curve":28},{"time":64.66666666666666,"length":2,"value":3,"curve":28},{"time":69.99999999999999,"length":2,"value":4,"curve":28},{"time":75.33333333333333,"length":2,"value":5,"curve":28},{"time":80.66666666666666,"length":2,"value":6,"curve":28},{"time":85.99999999999999,"length":2,"value":7,"curve":28}]}],["IFSPistons/group1/rot",{"items":[{},{"time":51.333333333333336,"length":2,"curve":28},{"time":56.666666666666664,"length":2,"value":1,"curve":28},{"time":62,"length":2,"value":2,"curve":28},{"time":67.33333333333333,"length":2,"value":3,"curve":28},{"time":72.66666666666666,"length":2,"value":4,"curve":28},{"time":77.99999999999999,"length":2,"value":5,"curve":28},{"time":83.33333333333333,"length":2,"value":6,"curve":28},{"time":88.66666666666666,"length":2,"value":7,"curve":28}]}],["IFSPistons/group0/pos",{"items":[{"value":3},{"time":47.666666666666664,"length":2.3333333333333357,"value":1.2000000000000002,"curve":27,"amp":1.7999999999999998},{"time":53,"length":2.3333333333333357,"value":1.2000000000000002,"curve":27,"amp":1.7999999999999998},{"time":58.333333333333336,"length":2.3333333333333357,"value":1.2000000000000002,"curve":27,"amp":1.7999999999999998},{"time":63.666666666666664,"length":2.3333333333333357,"value":1.2000000000000002,"curve":27,"amp":1.7999999999999998},{"time":69.03333333333333,"length":2.3333333333333357,"value":1.2000000000000002,"curve":27,"amp":1.7999999999999998},{"time":74.33333333333333,"length":2.3333333333333357,"value":1.2000000000000002,"curve":27,"amp":1.7999999999999998},{"time":79.66666666666666,"length":2.3333333333333357,"value":1.2000000000000002,"curve":27,"amp":1.7999999999999998},{"time":84.99999999999999,"length":2.3333333333333357,"value":1.2000000000000002,"curve":27,"amp":1.7999999999999998}]}],["IFSPistons/group1/pos",{"items":[{"value":3},{"time":50.333333333333336,"length":2.3333333333333357,"value":1.2000000000000002,"curve":27,"amp":1.7999999999999998},{"time":55.666666666666664,"length":2.3333333333333357,"value":1.2000000000000002,"curve":27,"amp":1.7999999999999998},{"time":61,"length":2.3333333333333357,"value":1.2000000000000002,"curve":27,"amp":1.7999999999999998},{"time":66.33333333333333,"length":2.3333333333333357,"value":1.2000000000000002,"curve":27,"amp":1.7999999999999998},{"time":71.66666666666666,"length":2.3333333333333357,"value":1.2000000000000002,"curve":27,"amp":1.7999999999999998},{"time":76.99999999999999,"length":2.3333333333333357,"value":1.2000000000000002,"curve":27,"amp":1.7999999999999998},{"time":82.33333333333333,"length":2.3333333333333357,"value":1.2000000000000002,"curve":27,"amp":1.7999999999999998},{"time":87.66666666666666,"length":2.3333333333333357,"value":1.2000000000000002,"curve":27,"amp":1.7999999999999998}]}],["Music/NEURO_TIME",{"items":[{},{"time":48,"length":10.666666666666664,"curve":2},{"time":58.666666666666664,"length":8.666666666666671,"curve":2},{"time":67.33333333333333,"length":1.999999999999993,"curve":9},{"time":69.33333333333333,"length":10.666666666666664,"curve":2},{"time":79.99999999999999,"length":8.666666666666671,"curve":2},{"time":88.66666666666666,"length":0.6666666666666714,"curve":9},{"time":89.33333333333333,"length":1.3333333333333286,"curve":44},{"time":90.66666666666666,"length":1.3333333333333286,"curve":14,"offset":1.4210854715202004e-14},{"time":91.99999999999999,"length":1.3333333333333286,"curve":18},{"time":93.33333333333331,"length":1.3333333333333428,"curve":14},{"time":95.99999999999999,"length":1.3333333333333428,"curve":14},{"time":97.33333333333333,"length":1.3333333333333286,"curve":18},{"time":98.66666666666666,"length":1.3333333333333428,"curve":14},{"time":101.33333333333333,"length":1.3333333333333428,"curve":14},{"time":102.66666666666667,"length":1.3333333333333144,"curve":18},{"time":103.99999999999999,"length":1.3333333333333428,"curve":14},{"time":106.66666666666666,"length":1.3333333333333428,"curve":14},{"time":108,"length":1.3333333333333286,"curve":18},{"time":109.33333333333333,"length":1.3333333333333428,"curve":14}]}],["Music/NEURO_DETUNE",{"items":[{},{"time":48,"length":10.666666666666664,"curve":3},{"time":58.666666666666664,"length":8.666666666666671,"curve":3},{"time":67.33333333333333,"length":1.999999999999993,"curve":10},{"time":69.33333333333333,"length":10.666666666666664,"curve":3},{"time":79.99999999999999,"length":8.666666666666671,"curve":3},{"time":88.66666666666666,"length":2,"curve":10,"speed":0.8333333333333358},{"time":90.66666666666666,"length":1.3333333333333286,"curve":15},{"time":93.33333333333333,"length":1.3333333333333286,"curve":15},{"time":95.99999999999999,"length":1.3333333333333286,"curve":15},{"time":97.33333333333331,"length":1.3333333333333428,"value":0.77},{"time":98.66666666666666,"length":1.3333333333333286,"curve":15},{"time":101.33333333333333,"length":1.3333333333333286,"curve":15},{"time":103.99999999999999,"length":1.3333333333333286,"curve":15},{"time":106.66666666666666,"length":1.3333333333333286,"curve":15},{"time":107.99999999999999,"length":1.3333333333333428,"value":0.77},{"time":109.33333333333333,"length":1.3333333333333286,"curve":15}]}],["Music/NEURO_DETUNE_PHASE",{"items":[{},{"time":48,"length":10.666666666666664,"curve":8},{"time":58.666666666666664,"length":8.666666666666671,"curve":8},{"time":67.33333333333333,"length":1.999999999999993,"curve":11},{"time":69.33333333333333,"length":10.666666666666664,"curve":8},{"time":79.99999999999999,"length":8.666666666666671,"curve":8},{"time":88.66666666666666,"length":2,"curve":11,"speed":0.8333333333333358},{"time":90.66666666666666,"length":1.3333333333333428,"curve":16},{"time":93.33333333333333,"length":1.3333333333333428,"curve":16},{"time":95.99999999999999,"length":1.3333333333333428,"curve":16},{"time":98.66666666666666,"length":1.3333333333333428,"curve":16},{"time":101.33333333333333,"length":1.3333333333333428,"curve":16},{"time":103.99999999999999,"length":1.3333333333333428,"curve":16},{"time":106.66666666666666,"length":1.3333333333333428,"curve":16},{"time":109.33333333333333,"length":1.3333333333333428,"curve":16}]}],["Music/NEURO_WUB_AMP",{"items":[{},{"time":48,"length":10.668578038364203,"curve":4},{"time":58.6685780383642,"length":8.664755294969133,"curve":4},{"time":67.33333333333333,"length":2.0038227433950624,"curve":12},{"time":69.33715607672839,"length":10.668578038364203,"curve":4},{"time":80.0057341150926,"length":8.660932551574064,"curve":4},{"time":88.66666666666666,"length":2,"curve":12,"speed":0.8028871529270708},{"time":90.66666666666666,"length":1.3333333333333333,"curve":17},{"time":93.33333333333333,"length":1.3333333333333333,"curve":17},{"time":95.99999999999999,"length":1.3333333333333333,"curve":17},{"time":98.66666666666666,"length":1.3333333333333333,"curve":17},{"time":101.33333333333333,"length":1.3333333333333333,"curve":17},{"time":103.99999999999999,"length":1.3333333333333333,"curve":17},{"time":106.66666666666666,"length":1.3333333333333333,"curve":17},{"time":109.33333333333333,"length":1.3333333333333333,"curve":17}]}],["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":95.99999999999999,"length":1.3333333333333144,"value":1},{"time":98.66666666666666,"length":1.3333333333333144,"value":1},{"time":101.33333333333333,"length":1.3333333333333144,"value":1},{"time":103.99999999999999,"length":1.3333333333333144,"value":1},{"time":106.66666666666666,"length":1.3333333333333144,"value":1},{"time":109.33333333333333,"length":1.3333333333333144,"value":1}]}],["Trails/active",{"items":[{}]}],["SceneCrystals/active",{"items":[{},{"time":111.33333333333333,"length":43.33333333333333}]}],["FlickyParticles/active",{"items":[{},{"time":48,"length":42.666666666666664},{"time":90.66666666666666,"length":1.3333333333333286},{"time":93.33333333333333,"length":1.3333333333333286},{"time":95.99999999999999,"length":1.3333333333333286},{"time":98.66666666666666,"length":1.3333333333333286},{"time":101.33333333333333,"length":1.3333333333333286},{"time":103.99999999999999,"length":1.3333333333333286},{"time":106.66666666666666,"length":1.3333333333333286},{"time":109.33333333333333,"length":1.3333333333333286},{"time":111.33333333333333,"length":43.33333333333333}]}],["SphereParticles/active",{"items":[{},{"time":90.66666666666666,"length":1.3333333333333286},{"time":93.33333333333333,"length":1.3333333333333286},{"time":95.99999999999999,"length":1.3333333333333286},{"time":98.66666666666666,"length":1.3333333333333286},{"time":101.33333333333333,"length":1.3333333333333286},{"time":103.99999999999999,"length":1.3333333333333286},{"time":106.66666666666666,"length":1.3333333333333286},{"time":109.33333333333333,"length":1.3333333333333286},{"time":111.33333333333333,"length":43.33333333333333}]}],["FlashyTerrain/active",{"items":[{},{"time":91.99999999999999,"length":1.3333333333333428},{"time":102.66666666666666,"length":1.3333333333333428}]}],["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":102.66666666666666,"value":0.8799999999999999},{"time":104},{"time":117.33333333333333,"value":0.009999999999995882},{"time":122.66666666666666},{"time":128}]}],["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":21,"amp":10},{"time":26.033333333333335,"length":4,"value":5,"curve":22,"amp":-2},{"time":42,"length":4,"value":3,"curve":22,"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":6.6},{"time":89.33333333333331,"length":1.3333333333333428,"value":6.6,"curve":37,"speed":0.4999999999999974,"amp":4.4999999999999964},{"time":90.66666666666666,"length":1.3333333333333286,"value":5,"curve":21,"speed":3.000000000000011,"amp":5},{"time":93.33333333333333,"length":1.3333333333333286,"value":5,"curve":21,"speed":3.000000000000011,"amp":5},{"time":96,"length":1.3333333333333286,"value":5,"curve":21,"speed":3.000000000000011,"amp":5},{"time":98.66666666666667,"length":1.3333333333333144,"value":5,"curve":21,"speed":3.000000000000011,"amp":5},{"time":101.33333333333334,"length":1.3333333333333144,"value":5,"curve":21,"speed":3.000000000000011,"amp":5},{"time":104.00000000000001,"length":1.3333333333333144,"value":5,"curve":21,"speed":3.000000000000011,"amp":5},{"time":106.66666666666669,"length":1.3333333333333002,"value":5,"curve":21,"speed":3.000000000000011,"amp":5},{"time":109.33333333333336,"length":1.3333333333333002,"value":5,"curve":21,"speed":3.000000000000011,"amp":5},{"time":111.33333333333333,"length":4,"value":5.209999999999998,"curve":22,"speed":1.0000000000000002,"amp":-2},{"time":117.33333333333333,"value":3.259999999999996},{"time":122.66666666666666,"length":5.333333333333329,"value":3.4599999999999933,"curve":29,"speed":0.5000000000000013,"amp":-1.2000000000000026},{"time":127.99999999999999,"length":2.6666666666666714,"value":5.959999999999993,"curve":29,"speed":0.9999999999999999,"amp":-1.2000000000000026}]}],["Camera/rot/t",{"items":[{},{"time":26.666666666666664,"length":5.333333333333332,"curve":23,"speed":0.2499999999999999,"amp":0.30000000000000004},{"time":31.999999999999996,"length":5.333333333333332,"value":1.2000000000000002,"curve":23,"speed":0.2499999999999999,"amp":-0.9},{"time":37.333333333333336,"length":5.333333333333329,"value":-0.3,"curve":23,"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":95.99999999999999},{"time":98.66666666666666},{"time":101.33333333333333},{"time":102.66666666666666,"value":-0.32},{"time":103.99999999999999},{"time":106.66666666666666},{"time":109.33333333333333},{"time":111.33333333333333,"value":0.14999999999999633},{"time":117.33333333333333,"value":0.5699999999999952},{"time":122.66666666666666,"value":0.09999999999999977},{"time":128}]}],["Camera/rot/p",{"items":[{},{"time":26.666666666666664,"length":5.333333333333332,"curve":23,"speed":0.2499999999999999,"amp":0.30000000000000004},{"time":32,"value":-2.3500000000000125},{"time":37.333333333333336,"length":5.333333333333329,"value":-0.3,"curve":23,"speed":0.2499999999999999,"amp":0.30000000000000004},{"time":48,"length":2.6666666666666643,"curve":29},{"time":50.666666666666664,"length":2.6666666666666714,"value":-0.9690196078431373,"curve":29},{"time":53.333333333333336,"length":2.6666666666666714,"value":-0.33999999999999997,"curve":29},{"time":56.00000000000001,"length":2.6666666666666714,"value":-0.39117647058823524,"curve":29},{"time":58.66666666666668,"length":2.6666666666666714,"value":-0.12117647058823516,"curve":29},{"time":61.33333333333335,"length":2.6666666666666714,"value":-1.4311764705882353,"curve":29},{"time":64.00000000000003,"length":2.6666666666666714,"value":-0.29117647058823515,"curve":29},{"time":66.66666666666669,"length":2.6666666666666714,"value":-0.7811764705882349,"curve":29},{"time":69.33333333333336,"length":2.6666666666666643,"curve":29},{"time":72.00000000000001,"length":2.6666666666666714,"value":-0.9690196078431373,"curve":29},{"time":74.66666666666669,"length":2.6666666666666714,"curve":29},{"time":77.33333333333336,"length":2.6666666666666714,"value":-0.5111764705882352,"curve":29},{"time":80.00000000000003,"length":2.6666666666666714,"value":-0.6411764705882351,"curve":29},{"time":82.6666666666667,"length":2.6666666666666714,"value":-1.3611764705882354,"curve":29},{"time":85.33333333333337,"length":2.6666666666666714,"value":-0.4911764705882345,"curve":29},{"time":88.00000000000004,"length":1.3333333333333286,"value":-1.5411764705882351,"curve":29},{"time":89.33333333333337,"length":1.333333333333286,"value":-1.016,"curve":37,"speed":0.5000000000000079,"amp":3},{"time":90.66666666666666},{"time":91.99999999999999,"length":1.3333333333333428,"curve":25,"amp":6},{"time":93.33333333333333},{"time":95.99999999999999},{"time":98.66666666666666},{"time":101.33333333333333},{"time":102.66666666666666,"length":1.3333333333333428,"curve":25,"amp":6},{"time":104},{"time":106.66666666666666},{"time":109.33333333333333},{"time":111.33333333333333,"value":0.56},{"time":112,"length":5.333333333333329,"value":0.56,"curve":29,"speed":0.5000000000000013,"amp":-1.0400000000000003},{"time":117.33333333333333,"length":4,"value":0.6199999999999997,"curve":29,"speed":0.5000000000000012,"amp":-1.0400000000000003},{"time":122.66666666666666,"length":5.333333333333329,"value":0.37000000000000166,"curve":29,"speed":0.5000000000000013,"amp":-0.7100000000000002},{"time":127.99999999999999,"length":2.6666666666666714,"value":0.37000000000000166,"curve":29,"speed":0.9999999999999998,"amp":-0.7100000000000002}]}],["Camera/roll",{"items":[{"time":5.333333333333334,"length":21.333333333333332,"value":-0.2500000000000003,"curve":26,"speed":0.1875},{"time":32,"value":-1.190000000000011},{"time":37.33333333333333,"length":5.333333333333329,"value":-0.3,"curve":23,"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":37,"speed":0.4999999999999974,"amp":3},{"time":90.66666666666666},{"time":101.33333333333333},{"time":102.66666666666666,"value":-0.26000000000000006},{"time":104.00158889323498},{"time":112,"length":5.333333333333329,"curve":29,"speed":0.5000000000000013,"amp":-0.2700000000000004},{"time":117.33333333333333,"value":0.32999999999999585},{"time":122.66666666666666,"length":5.333333333333329,"value":0.10999999999999989,"curve":29,"speed":0.5000000000000013,"amp":0.049999999999999524},{"time":127.99999999999999}]}],["Camera/shake",{"items":[{},{"time":48,"length":1,"curve":36},{"time":50.666666666666664,"length":1,"curve":36},{"time":53.333333333333336,"length":1,"curve":36},{"time":56,"length":1,"curve":36},{"time":58.666666666666664,"length":1,"curve":36},{"time":61.333333333333336,"length":1,"curve":36},{"time":64,"length":1,"curve":36},{"time":66.66666666666666,"length":1,"curve":36},{"time":69.33333333333333,"length":1,"curve":36},{"time":71.99999999999999,"length":1,"curve":36},{"time":74.66666666666666,"length":1,"curve":36},{"time":77.33333333333333,"length":1,"curve":36},{"time":79.99999999999999,"length":1,"curve":36},{"time":82.66666666666666,"length":1,"curve":36},{"time":85.33333333333333,"length":1,"curve":36},{"time":88,"length":1,"curve":36}]}],["Camera/fov",{"items":[{"value":0.5},{"time":48,"value":0.8}]}],["DVi/active",{"items":[{},{"time":112,"length":16}]}]],"labels":{"zero":0,"begin":5.333333333333333,"neuro":48,"porterfuckingrobinson":112,"fuckingcamellia":90.66666666666666,"psy":154.66666666666666},"guiSettings":{"snapTimeActive":true,"snapTimeInterval":0.1,"snapValueActive":true,"snapValueInterval":1,"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 e430a01..491cbe5 100644 --- a/src/config-hot.ts +++ b/src/config-hot.ts @@ -2,6 +2,7 @@ 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 = 'Bloom/swap1', // RTINSPECTOR_CAPTURE_NAME: string | null = 'main/postSwap0', // RTINSPECTOR_CAPTURE_NAME: string | null = 'DeferredCamera/cameraTarget', diff --git a/src/entities/Bloom.ts b/src/entities/Bloom.ts index 552dd75..71b72ac 100644 --- a/src/entities/Bloom.ts +++ b/src/entities/Bloom.ts @@ -40,7 +40,7 @@ export class Bloom extends Entity { this.components.push( new Blit( { src: options.input, dst: options.target, - name: 'Glitch/blitDry', + name: 'Bloom/blitDry', } ) ); // -- down ------------------------------------------------------------------------------------- diff --git a/src/entities/Crystal.ts b/src/entities/Crystal.ts new file mode 100644 index 0000000..b9eaf54 --- /dev/null +++ b/src/entities/Crystal.ts @@ -0,0 +1,117 @@ +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 { Vector3 } from '@fms-cat/experimental'; +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 crystalFrag from '../shaders/crystal.frag'; +import raymarchObjectVert from '../shaders/raymarch-object.vert'; + +interface CrystalOptions { + width: number; + height: number; + noiseOffset: number; +} + +export class Crystal extends Entity { + public constructor( { width, height, noiseOffset }: CrystalOptions ) { + 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: [ width, height, width ] } ); + + 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 deferred = new Material( + raymarchObjectVert, + crystalFrag, + { + defines: [ 'DEFERRED 1' ], + initOptions: { geometry, target: dummyRenderTargetFourDrawBuffers }, + }, + ); + + const depth = new Material( + raymarchObjectVert, + crystalFrag, + { + defines: [ 'SHADOW 1' ], + initOptions: { geometry, target: dummyRenderTarget } + }, + ); + + const materials = { deferred, depth }; + + if ( process.env.DEV ) { + if ( module.hot ) { + module.hot.accept( '../shaders/crystal.frag', () => { + deferred.replaceShader( raymarchObjectVert, crystalFrag ); + depth.replaceShader( raymarchObjectVert, crystalFrag ); + } ); + } + } + + objectValuesMap( materials, ( material ) => { + material.addUniform( 'range', '4f', -1.0, -1.0, 1.0, 1.0 ); + material.addUniform( 'size', '2f', width, height ); + material.addUniform( 'noiseOffset', '1f', noiseOffset ); + + material.addUniformTexture( 'samplerRandom', randomTexture.texture ); + material.addUniformTexture( 'samplerRandomStatic', randomTextureStatic.texture ); + } ); + + // -- 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( 'deformAmp', '1f', auto( 'Music/NEURO_WUB_AMP' ) ); + material.addUniform( 'deformFreq', '1f', auto( 'Music/NEURO_WUB_FREQ' ) + auto( 'Music/NEURO_DETUNE' ) ); + material.addUniform( 'deformTime', '1f', auto( 'Music/NEURO_TIME' ) ); + } ); + }, + name: process.env.DEV && 'Crystal/updater', + } ) ); + + // -- mesh ------------------------------------------------------------------------------------- + const mesh = new Mesh( { + geometry, + materials, + name: process.env.DEV && 'Crystal/mesh', + } ); + mesh.cull = MeshCull.None; + this.components.push( mesh ); + } +} diff --git a/src/entities/DVi.ts b/src/entities/DVi.ts new file mode 100644 index 0000000..54699b5 --- /dev/null +++ b/src/entities/DVi.ts @@ -0,0 +1,65 @@ +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 { dummyRenderTarget } from '../globals/dummyRenderTarget'; +import { quadGeometry } from '../globals/quadGeometry'; +import { randomTexture } from '../globals/randomTexture'; +import dviFrag from '../shaders/dvi.frag'; +import quadVert from '../shaders/quad.vert'; +import { auto } from '../globals/automaton'; + +export interface DViOptions { + input: BufferRenderTarget; + target: RenderTarget; +} + +export class DVi extends Entity { + public constructor( options: DViOptions ) { + super(); + + // -- bypass ----------------------------------------------------------------------------------- + const blitBypass = new Blit( { + src: options.input, + dst: options.target, + name: 'DVi/blitBypass', + } ); + + // -- dvi -------------------------------------------------------------------------------------- + const material = new Material( + quadVert, + dviFrag, + { initOptions: { geometry: quadGeometry, target: dummyRenderTarget } }, + ); + material.addUniformTexture( 'sampler0', options.input.texture ); + material.addUniformTexture( 'samplerRandom', randomTexture.texture ); + + if ( process.env.DEV ) { + if ( module.hot ) { + module.hot.accept( '../shaders/dvi.frag', () => { + material.replaceShader( quadVert, dviFrag ); + } ); + } + } + + const quadDVi = new Quad( { + target: options.target, + material, + name: process.env.DEV && 'DVi/quad', + } ); + + // -- components ------------------------------------------------------------------------------- + this.components.push( + blitBypass, + quadDVi, + ); + + // -- bypass auto ------------------------------------------------------------------------------ + auto( 'DVi/active', ( { uninit } ) => { + quadDVi.active = !uninit; + blitBypass.active = !quadDVi.active; + } ); + } +} diff --git a/src/entities/DeferredCamera.ts b/src/entities/DeferredCamera.ts index 920d261..70ae467 100644 --- a/src/entities/DeferredCamera.ts +++ b/src/entities/DeferredCamera.ts @@ -15,6 +15,7 @@ import { randomTexture } from '../globals/randomTexture'; import aoFrag from '../shaders/ao.frag'; import quadVert from '../shaders/quad.vert'; import shadingFrag from '../shaders/shading.frag'; +import { auto } from '../globals/automaton'; export interface DeferredCameraOptions { scenes: Entity[]; @@ -26,10 +27,12 @@ export interface DeferredCameraOptions { export class DeferredCamera extends Entity { public cameraTarget: BufferRenderTarget; + public camera: PerspectiveCamera; public constructor( options: DeferredCameraOptions ) { super(); + // -- camera ----------------------------------------------------------------------------------- this.cameraTarget = new BufferRenderTarget( { width: options.target.width, height: options.target.height, @@ -38,7 +41,7 @@ export class DeferredCamera extends Entity { filter: gl.NEAREST, } ); - const camera = new PerspectiveCamera( { + this.camera = new PerspectiveCamera( { scenes: options.scenes, renderTarget: this.cameraTarget, near: 0.1, @@ -46,8 +49,9 @@ export class DeferredCamera extends Entity { name: 'DeferredCamera/camera', materialTag: 'deferred', } ); - camera.clear = []; + this.camera.clear = []; + // -- ao --------------------------------------------------------------------------------------- const aoTarget = new BufferRenderTarget( { width: AO_RESOLUTION_RATIO * options.target.width, height: AO_RESOLUTION_RATIO * options.target.height, @@ -67,7 +71,7 @@ export class DeferredCamera extends Entity { aoMaterial.addUniformMatrixVector( 'cameraPV', 'Matrix4fv', - camera.projectionMatrix.multiply( + this.camera.projectionMatrix.multiply( cameraView ).elements ); @@ -90,6 +94,7 @@ export class DeferredCamera extends Entity { name: process.env.DEV && 'DeferredCamera/ao/quad', } ); + // -- deferred --------------------------------------------------------------------------------- const shadingMaterial = new Material( quadVert, shadingFrag, @@ -128,7 +133,7 @@ export class DeferredCamera extends Entity { shadingMaterial.addUniformMatrixVector( 'cameraPV', 'Matrix4fv', - camera.projectionMatrix.multiply( + this.camera.projectionMatrix.multiply( cameraView ).elements ); @@ -136,8 +141,8 @@ export class DeferredCamera extends Entity { shadingMaterial.addUniform( 'cameraNearFar', '2f', - camera.near, - camera.far + this.camera.near, + this.camera.far ); shadingMaterial.addUniform( @@ -201,7 +206,7 @@ export class DeferredCamera extends Entity { shadingMaterial.addUniformTexture( 'samplerRandom', randomTexture.texture ); this.components.push( - camera, + this.camera, lambdaAoSetCameraUniforms, aoQuad, lambda, diff --git a/src/entities/FlickyParticles.ts b/src/entities/FlickyParticles.ts index 7bc9682..b7af27c 100644 --- a/src/entities/FlickyParticles.ts +++ b/src/entities/FlickyParticles.ts @@ -2,6 +2,7 @@ import { Entity } from '../heck/Entity'; import { GPUParticles } from './GPUParticles'; import { InstancedGeometry } from '../heck/InstancedGeometry'; import { Material } from '../heck/Material'; +import { MeshCull } from '../heck/components/Mesh'; import { TRIANGLE_STRIP_QUAD } from '@fms-cat/experimental'; import { dummyRenderTarget } from '../globals/dummyRenderTarget'; import { gl, glCat } from '../globals/canvas'; @@ -118,6 +119,7 @@ export class FlickyParticles extends Entity { computeNumBuffers: 1, namePrefix: process.env.DEV && 'FlickyParticles', } ); + gpuParticles.meshRender.cull = MeshCull.None; this.children.push( gpuParticles ); } } diff --git a/src/entities/ForwardCamera.ts b/src/entities/ForwardCamera.ts index 5c3335f..4eefa02 100644 --- a/src/entities/ForwardCamera.ts +++ b/src/entities/ForwardCamera.ts @@ -10,10 +10,12 @@ export interface ForwardCameraOptions { } export class ForwardCamera extends Entity { + public camera: PerspectiveCamera; + public constructor( options: ForwardCameraOptions ) { super(); - const camera = new PerspectiveCamera( { + this.camera = new PerspectiveCamera( { scenes: options.scenes, renderTarget: options.target, near: 0.1, @@ -21,8 +23,8 @@ export class ForwardCamera extends Entity { name: 'ForwardCamera/camera', materialTag: 'forward', } ); - camera.clear = false; + this.camera.clear = false; - this.components.push( camera ); + this.components.push( this.camera ); } } diff --git a/src/entities/GPUParticles.ts b/src/entities/GPUParticles.ts index feb8e48..24a116e 100644 --- a/src/entities/GPUParticles.ts +++ b/src/entities/GPUParticles.ts @@ -20,6 +20,8 @@ export interface GPUParticlesOptions { } export class GPUParticles extends Entity { + public meshRender: Mesh; + public constructor( { materialCompute, geometryRender, @@ -59,7 +61,7 @@ export class GPUParticles extends Entity { } ); // -- render ----------------------------------------------------------------------------------- - const meshRender = new Mesh( { + this.meshRender = new Mesh( { geometry: geometryRender, materials: materialsRender, name: process.env.DEV && `${ namePrefix }/meshRender`, @@ -101,7 +103,9 @@ export class GPUParticles extends Entity { } ) ); // -- rest of components ----------------------------------------------------------------------- - this.components.push( quadCompute ); - this.components.push( meshRender ); + this.components.push( + quadCompute, + this.meshRender, + ); } } diff --git a/src/entities/LightShaft.ts b/src/entities/LightShaft.ts index c098fbf..8b97732 100644 --- a/src/entities/LightShaft.ts +++ b/src/entities/LightShaft.ts @@ -14,13 +14,14 @@ import lightShaftVert from '../shaders/light-shaft.vert'; interface LightShaftOptions { light: LightEntity; + intensity?: number; namePrefix?: string; } export class LightShaft extends Entity { private __forward: Material; - public constructor( { light, namePrefix }: LightShaftOptions ) { + public constructor( { light, intensity, namePrefix }: LightShaftOptions ) { super(); // -- geometry --------------------------------------------------------------------------------- @@ -45,6 +46,8 @@ export class LightShaft extends Entity { }, ); + forward.addUniform( 'intensity', '1f', intensity ?? 0.01 ); + forward.addUniformTexture( 'samplerRandom', randomTexture.texture ); forward.addUniformTexture( 'samplerShadow', light.shadowMap.texture ); diff --git a/src/entities/Rings.ts b/src/entities/Rings.ts index beef9c9..b798c2c 100644 --- a/src/entities/Rings.ts +++ b/src/entities/Rings.ts @@ -1,9 +1,7 @@ import { Entity } from '../heck/Entity'; import { InstancedGeometry } from '../heck/InstancedGeometry'; -import { Lambda } from '../heck/components/Lambda'; import { Material } from '../heck/Material'; import { Mesh } from '../heck/components/Mesh'; -import { Quaternion, Vector3 } from '@fms-cat/experimental'; import { dummyRenderTarget } from '../globals/dummyRenderTarget'; import { genTorus } from '../geometries/genTorus'; import { glCat } from '../globals/canvas'; @@ -17,15 +15,6 @@ export class Rings extends Entity { public constructor() { super(); - const rot0 = Quaternion.fromAxisAngle( - new Vector3( [ 1.0, 0.0, 0.0 ] ), - 0.4, - ).multiply( Quaternion.fromAxisAngle( - new Vector3( [ 0.0, 0.0, 1.0 ] ), - 0.4, - ) ); - this.transform.rotation = rot0; - // -- geometry --------------------------------------------------------------------------------- const torus = genTorus( { segmentsRadial: 256 } ); @@ -47,7 +36,7 @@ export class Rings extends Entity { geometry.primcount = PRIMCOUNT; // -- materials -------------------------------------------------------------------------------- - const forward = new Material( + const cubemap = new Material( ringsVert, ringsFrag, { @@ -72,7 +61,7 @@ export class Rings extends Entity { ); const materials = { - forward, + cubemap, deferred, depth, }; @@ -85,7 +74,7 @@ export class Rings extends Entity { '../shaders/rings.frag', ], () => { - forward.replaceShader( ringsVert, ringsFrag ); + cubemap.replaceShader( ringsVert, ringsFrag ); deferred.replaceShader( ringsVert, ringsFrag ); depth.replaceShader( ringsVert, depthFrag ); }, @@ -100,18 +89,5 @@ export class Rings extends Entity { name: process.env.DEV && 'Rings/mesh', } ); this.components.push( mesh ); - - this.components.push( new Lambda( { - onUpdate: ( { time } ) => { - this.transform.rotation = rot0.multiply( - Quaternion.fromAxisAngle( new Vector3( [ 0.0, 1.0, 0.0 ] ), time ) - ).multiply( - Quaternion.fromAxisAngle( new Vector3( [ 1.0, 0.0, 0.0 ] ), 1.0 ) - ).multiply( - Quaternion.fromAxisAngle( new Vector3( [ 0.0, 0.0, 1.0 ] ), 1.0 ) - ); - }, - name: process.env.DEV && 'Rings/speen', - } ) ); } } diff --git a/src/entities/LightsFirst.ts b/src/entities/SceneBegin.ts similarity index 50% rename from src/entities/LightsFirst.ts rename to src/entities/SceneBegin.ts index 297e8b2..3a311f2 100644 --- a/src/entities/LightsFirst.ts +++ b/src/entities/SceneBegin.ts @@ -1,46 +1,43 @@ +import { Condition } from './Condition'; +import { Cube } from './Cube'; import { Entity } from '../heck/Entity'; import { LightEntity } from './LightEntity'; import { Vector3 } from '@fms-cat/experimental'; -interface LightsFirstOptions { - scenes: Entity[]; -} - -export class LightsFirst extends Entity { +export class SceneBegin extends Entity { public readonly lights: LightEntity[]; - public constructor( { scenes }: LightsFirstOptions ) { + public constructor() { super(); - // -- 1 ---------------------------------------------------------------------------------------- + // -- lights ----------------------------------------------------------------------------------- const light1 = new LightEntity( { - scenes, + scenes: [ this ], shadowMapFov: 30.0, shadowMapNear: 1.0, shadowMapFar: 20.0, - namePrefix: process.env.DEV && 'lightFirst', + namePrefix: process.env.DEV && 'lightBegin1', } ); - - light1.color = [ 400.0, 400.0, 400.0 ]; + light1.color = [ 200.0, 200.0, 200.0 ]; light1.transform.lookAt( new Vector3( [ 4.0, 4.0, 4.0 ] ) ); - this.children.push( light1 ); - - // -- 2 ---------------------------------------------------------------------------------------- const light2 = new LightEntity( { - scenes, + scenes: [ this ], shadowMapFov: 30.0, shadowMapNear: 1.0, shadowMapFar: 20.0, - namePrefix: process.env.DEV && 'lightFirst', + namePrefix: process.env.DEV && 'lightBegin2', } ); - - light2.color = [ 100.0, 140.0, 200.0 ]; + light2.color = [ 80.0, 90.0, 100.0 ]; light2.transform.lookAt( new Vector3( [ -4.0, 0.0, -4.0 ] ) ); - this.children.push( light2 ); - - // -- haha ------------------------------------------------------------------------------------- this.lights = [ light1, light2 ]; + + // -- scene ------------------------------------------------------------------------------------ + this.children.push( + new Cube(), + new Condition(), + ...this.lights, + ); } } diff --git a/src/entities/SceneCrystals.ts b/src/entities/SceneCrystals.ts new file mode 100644 index 0000000..8c18720 --- /dev/null +++ b/src/entities/SceneCrystals.ts @@ -0,0 +1,41 @@ +import { Crystal } from './Crystal'; +import { Entity } from '../heck/Entity'; +import { Lambda } from '../heck/components/Lambda'; +import { Quaternion, Vector3 } from '@fms-cat/experimental'; +import { Rings } from './Rings'; + +export class SceneCrystals extends Entity { + public constructor() { + super(); + + const crystal = new Crystal( { width: 0.4, height: 1.5, noiseOffset: 7.0 } ); + this.children.push( crystal ); + + const speen = new Entity(); + this.children.push( speen ); + + const up = new Vector3( [ 0.0, 1.0, 0.0 ] ); + this.components.push( new Lambda( { + onUpdate: ( { time } ) => { + speen.transform.rotation = Quaternion.fromAxisAngle( up, time ); + }, + } ) ); + + for ( let i = 0; i < 3; i ++ ) { + const smolCrystal = new Crystal( { width: 0.2, height: 0.8, noiseOffset: i } ); + const t = Math.PI * i / 1.5; + smolCrystal.transform.position = new Vector3( [ Math.cos( t ), 0.0, Math.sin( t ) ] ); + speen.children.push( smolCrystal ); + } + + const rings = new Rings(); + rings.transform.rotation = Quaternion.fromAxisAngle( + new Vector3( [ 1.0, 0.0, 0.0 ] ), + 0.1, + ).multiply( Quaternion.fromAxisAngle( + new Vector3( [ 0.0, 0.0, 1.0 ] ), + 0.1, + ) ); + this.children.push( rings ); + } +} diff --git a/src/entities/LightsPink.ts b/src/entities/SceneNeuro.ts similarity index 51% rename from src/entities/LightsPink.ts rename to src/entities/SceneNeuro.ts index 81f1601..b52aa17 100644 --- a/src/entities/LightsPink.ts +++ b/src/entities/SceneNeuro.ts @@ -1,31 +1,32 @@ +import { BoundingBox } from './BoundingBox'; import { BufferRenderTarget } from '../heck/BufferRenderTarget'; import { Entity } from '../heck/Entity'; +import { IFSPistons } from './IFSPistons'; import { LightEntity } from './LightEntity'; import { LightShaft } from './LightShaft'; -import { Vector3 } from '@fms-cat/experimental'; +import { Quaternion, Vector3 } from '@fms-cat/experimental'; +import { SufferTexts } from './SufferTexts'; +import { Wobbleball } from './Wobbleball'; -interface LightsPinkOptions { - scenes: Entity[]; -} - -export class LightsPink extends Entity { +export class SceneNeuro extends Entity { public readonly lights: LightEntity[]; private readonly __shafts: LightShaft[]; - public constructor( { scenes }: LightsPinkOptions ) { + public constructor() { super(); + // -- lights ----------------------------------------------------------------------------------- type TypeScriptSucks = [ [ number, number, number ], [ number, number, number ], boolean ][]; this.__shafts = []; this.lights = ( [ - [ [ 6000.0, 40.0, 200.0 ], [ 8.0, 4.0, -8.0 ], true ], - [ [ 6000.0, 40.0, 200.0 ], [ -8.0, 4.0, -8.0 ], true ], - [ [ 10.0, 14.0, 20.0 ], [ 0.0, -4.0, 4.0 ], false ], + [ [ 2000.0, 20.0, 100.0 ], [ 8.0, 4.0, -8.0 ], true ], + [ [ 2000.0, 20.0, 100.0 ], [ -8.0, 4.0, -8.0 ], true ], + [ [ 50.0, 50.0, 50.0 ], [ 0.0, -4.0, 4.0 ], false ], ] as TypeScriptSucks ).map( ( [ color, pos, isSpot ], i ) => { const light = new LightEntity( { - scenes, + scenes: [ this ], shadowMapFov: isSpot ? 15.0 : 50.0, shadowMapNear: 0.5, shadowMapFar: 20.0, @@ -34,11 +35,9 @@ export class LightsPink extends Entity { } ); light.color = color; - light.spotness = isSpot ? 0.9 : 0.0; + light.spotness = isSpot ? 0.99 : 0.0; light.transform.lookAt( new Vector3( pos ) ); - this.children.push( light ); - if ( isSpot ) { const shaft = new LightShaft( { light, @@ -51,6 +50,23 @@ export class LightsPink extends Entity { return light; } ); + + // -- bounding box ----------------------------------------------------------------------------- + const boundingBox = new BoundingBox(); + boundingBox.transform.rotation = Quaternion.fromAxisAngle( + new Vector3( [ 0.0, 0.0, 1.0 ] ), + 0.25 * Math.PI, + ); + boundingBox.transform.scale = new Vector3( [ 1.2, 1.2, 1.2 ] ); + + // -- scene ------------------------------------------------------------------------------------ + this.children.push( + new Wobbleball(), + new IFSPistons(), + boundingBox, + new SufferTexts(), + ...this.lights, + ); } public setDefferedCameraTarget( deferredCameraTarget: BufferRenderTarget ): void { diff --git a/src/entities/Wobbleball.ts b/src/entities/Wobbleball.ts index fccb089..eb9c741 100644 --- a/src/entities/Wobbleball.ts +++ b/src/entities/Wobbleball.ts @@ -1,10 +1,9 @@ -import { BoundingBox } from './BoundingBox'; 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 { Quaternion, Vector3 } from '@fms-cat/experimental'; +import { Vector3 } from '@fms-cat/experimental'; import { auto } from '../globals/automaton'; import { dummyRenderTarget, dummyRenderTargetFourDrawBuffers } from '../globals/dummyRenderTarget'; import { genOctahedron } from '../geometries/genOctahedron'; @@ -106,16 +105,5 @@ export class Wobbleball extends Entity { } ); mesh.cull = MeshCull.None; this.components.push( mesh ); - - // -- bounding box ----------------------------------------------------------------------------- - const boundingBox = new BoundingBox(); - - boundingBox.transform.rotation = Quaternion.fromAxisAngle( - new Vector3( [ 0.0, 0.0, 1.0 ] ), - 0.25 * Math.PI, - ); - boundingBox.transform.scale = new Vector3( [ 1.2, 1.2, 1.2 ] ); - - this.children.push( boundingBox ); } } diff --git a/src/heck/components/PerspectiveCamera.ts b/src/heck/components/PerspectiveCamera.ts index 5776b71..79c7550 100644 --- a/src/heck/components/PerspectiveCamera.ts +++ b/src/heck/components/PerspectiveCamera.ts @@ -16,9 +16,32 @@ export interface PerspectiveCameraOptions extends ComponentOptions { } export class PerspectiveCamera extends Camera { - public readonly fov: number; - public readonly near: number; - public readonly far: number; + public get fov(): number { + return this.__fov; + } + public set fov( value: number ) { + this.__fov = value; + this.__updatePerspectiveCamera(); + } + private __fov: number; + + public get near(): number { + return this.__near; + } + public set near( value: number ) { + this.__near = value; + this.__updatePerspectiveCamera(); + } + private __near: number; + + public get far(): number { + return this.__far; + } + public set far( value: number ) { + this.__far = value; + this.__updatePerspectiveCamera(); + } + private __far: number; public constructor( options: PerspectiveCameraOptions ) { const fov = options.fov ?? 45.0; @@ -35,8 +58,12 @@ export class PerspectiveCamera extends Camera { clear: options.clear, } ); - this.fov = fov; - this.near = near; - this.far = far; + this.__fov = fov; + this.__near = near; + this.__far = far; + } + + protected __updatePerspectiveCamera(): void { + this.projectionMatrix = Matrix4.perspective( this.fov, this.near, this.far ); } } diff --git a/src/music/music.vert b/src/music/music.vert index 1641cfb..88a61e1 100644 --- a/src/music/music.vert +++ b/src/music/music.vert @@ -110,7 +110,7 @@ vec2 deepkick( float t ) { vec2 tt = t + mix( 0.0, 0.007, smoothstep( 0.0, 0.1, t ) ) * wavetable( 0.1 * t, vec2( 2.0 ), vec2( -0.1 ) ); vec2 phase = 50.0 * tt - 3.0 * exp( -100.0 * tt ) - 5.4 * exp( -30.0 * tt ); - return exp( -1.0 * tt ) * sin( TAU * phase ); + return exp( -0.4 * tt ) * sin( TAU * phase ); } vec2 longclap( float t, float tg ) { @@ -612,7 +612,7 @@ vec2 mainAudio( vec4 time ) { t += 1.0 * inRangeInteg( time.z, 28.0 * BEAT, 31.75 * BEAT, 50.0 ); float freq = n2f( chordsB[ progB ] ) * 0.125; float fadetime = max( 0.0, time.w - SECTION_AAAA + 8.0 * BEAT ); - dest += 0.12 * exp( -1.0 * fadetime ) * mix( 0.1, 1.0, sidechain ) * superbass( t, freq, exp( -2.0 * fadetime ) ); + dest += 0.11 * exp( -1.0 * fadetime ) * mix( 0.1, 1.0, sidechain ) * superbass( t, freq, exp( -2.0 * fadetime ) ); } // -- choir -------------------------------------------------------------------------------------- @@ -687,12 +687,12 @@ vec2 mainAudio( vec4 time ) { sum += 0.1 * mix( 0.2, 1.0, sidechain ) * phase; } - dest += 0.12 * aSaturate( sum ); + dest += 0.14 * aSaturate( sum ); } // -- deepkick ----------------------------------------------------------------------------------- - if ( inRange( time.w, SECTION_BEGIN, SECTION_BEGIN + 16.0 * BEAT ) ) { - dest += 0.3 * deepkick( mod( time.z, 16.0 * BEAT ) ); + if ( inRange( time.w, SECTION_BEGIN, SECTION_BEGIN + 64.0 * BEAT ) ) { + dest += 0.3 * deepkick( time.z ); } if ( inRange( time.w, SECTION_AAAA - 8.0 * BEAT, SECTION_AAAA ) ) { diff --git a/src/scene.ts b/src/scene.ts index c7a02a6..9594550 100644 --- a/src/scene.ts +++ b/src/scene.ts @@ -3,9 +3,8 @@ import { Bloom } from './entities/Bloom'; import { BufferRenderTarget } from './heck/BufferRenderTarget'; import { CanvasRenderTarget } from './heck/CanvasRenderTarget'; import { Component } from './heck/components/Component'; -import { Condition } from './entities/Condition'; -import { Cube } from './entities/Cube'; import { CubemapCameraEntity } from './entities/CubemapCameraEntity'; +import { DVi } from './entities/DVi'; import { DeferredCamera } from './entities/DeferredCamera'; import { Dog } from './heck/Dog'; import { Entity } from './heck/Entity'; @@ -15,20 +14,17 @@ import { FlickyParticles } from './entities/FlickyParticles'; import { ForwardCamera } from './entities/ForwardCamera'; import { Glitch } from './entities/Glitch'; import { IBLLUT } from './entities/IBLLUT'; -import { IFSPistons } from './entities/IFSPistons'; import { Lambda } from './heck/components/Lambda'; -import { LightsFirst } from './entities/LightsFirst'; -import { LightsPink } from './entities/LightsPink'; import { PixelSorter } from './entities/PixelSorter'; import { Post } from './entities/Post'; import { RTInspector } from './entities/RTInspector'; -import { Rings } from './entities/Rings'; +import { SceneBegin } from './entities/SceneBegin'; +import { SceneCrystals } from './entities/SceneCrystals'; +import { SceneNeuro } from './entities/SceneNeuro'; import { Serial } from './entities/Serial'; import { SphereParticles } from './entities/SphereParticles'; -import { SufferTexts } from './entities/SufferTexts'; import { Swap, Vector3 } from '@fms-cat/experimental'; import { Trails } from './entities/Trails'; -import { Wobbleball } from './entities/Wobbleball'; import { arraySetDelete } from './utils/arraySetDelete'; import { auto, automaton } from './globals/automaton'; import { music } from './globals/music'; @@ -109,13 +105,6 @@ if ( process.env.DEV && module.hot ) { } ); } -const replacerCondition = new EntityReplacer( deferredRoot, () => new Condition(), 'Condition' ); -if ( process.env.DEV && module.hot ) { - module.hot.accept( './entities/Condition', () => { - replacerCondition.replace(); - } ); -} - const replacerFlashyTerrain = new EntityReplacer( deferredRoot, () => new FlashyTerrain(), @@ -134,31 +123,29 @@ if ( process.env.DEV && module.hot ) { } ); } -const replacerRings = new EntityReplacer( deferredRoot, () => new Rings(), 'Rings' ); +const replacerSceneBegin = new EntityReplacer( deferredRoot, () => new SceneBegin(), 'SceneBegin' ); if ( process.env.DEV && module.hot ) { - module.hot.accept( './entities/Rings', () => { - replacerRings.replace(); + module.hot.accept( './entities/SceneBegin', () => { + replacerSceneBegin.current.lights.map( ( light ) => arraySetDelete( lights, light ) ); + replacerSceneBegin.replace(); + lights.push( ...replacerSceneBegin.current.lights ); } ); } -const replacerCube = new EntityReplacer( deferredRoot, () => new Cube(), 'Cube' ); +const replacerSceneNeuro = new EntityReplacer( deferredRoot, () => new SceneNeuro(), 'SceneNeuro' ); if ( process.env.DEV && module.hot ) { - module.hot.accept( './entities/Cube', () => { - replacerCube.replace(); + module.hot.accept( './entities/SceneNeuro', () => { + replacerSceneNeuro.current.lights.map( ( light ) => arraySetDelete( lights, light ) ); + replacerSceneNeuro.replace(); + lights.push( ...replacerSceneNeuro.current.lights ); + replacerSceneNeuro.current.setDefferedCameraTarget( deferredCamera.cameraTarget ); } ); } -const replacerWobbleball = new EntityReplacer( deferredRoot, () => new Wobbleball(), 'Wobbleball' ); +const replacerSceneCrystals = new EntityReplacer( deferredRoot, () => new SceneCrystals(), 'SceneCrystals' ); if ( process.env.DEV && module.hot ) { - module.hot.accept( './entities/Wobbleball', () => { - replacerWobbleball.replace(); - } ); -} - -const replacerIFSPistons = new EntityReplacer( deferredRoot, () => new IFSPistons(), 'IFSPistons' ); -if ( process.env.DEV && module.hot ) { - module.hot.accept( './entities/IFSPistons', () => { - replacerIFSPistons.replace(); + module.hot.accept( './entities/SceneCrystals', () => { + replacerSceneCrystals.replace(); } ); } @@ -166,17 +153,6 @@ if ( process.env.DEV && module.hot ) { const forwardRoot = new Entity(); dog.root.children.push( forwardRoot ); -const replacerSufferTexts = new EntityReplacer( - forwardRoot, - () => new SufferTexts(), - 'SufferTexts', -); -if ( process.env.DEV && module.hot ) { - module.hot.accept( './entities/SufferTexts', () => { - replacerSufferTexts.replace(); - } ); -} - const replacerFlickyParticles = new EntityReplacer( forwardRoot, () => new FlickyParticles(), @@ -205,23 +181,9 @@ const swap = new Swap( } ), ); -const replacerLightsFirst = new EntityReplacer( - dog.root, - () => new LightsFirst( { scenes: [ dog.root ] } ), - 'LightsFirst', -); - -const replacerLightsPink = new EntityReplacer( - dog.root, - () => new LightsPink( { - scenes: [ dog.root ], - } ), - 'LightsPink', -); - const lights = [ - ...replacerLightsFirst.current.lights, - ...replacerLightsPink.current.lights, + ...replacerSceneBegin.current.lights, + ...replacerSceneNeuro.current.lights, ]; // const light2 = new LightEntity( { @@ -255,7 +217,7 @@ const deferredCamera = new DeferredCamera( { textureEnv: environmentMap.texture, } ); dog.root.children.push( deferredCamera ); -replacerLightsPink.current.setDefferedCameraTarget( deferredCamera.cameraTarget ); +replacerSceneNeuro.current.setDefferedCameraTarget( deferredCamera.cameraTarget ); const forwardCamera = new ForwardCamera( { scenes: [ dog.root ], @@ -314,6 +276,10 @@ dog.root.components.push( new Lambda( { ] ).scale( shake ) ); } + + auto( 'Camera/fov', ( { value } ) => { + camera.camera.fov = 90.0 * value; + } ); } ); }, name: process.env.DEV && 'main/updateCamera', @@ -355,6 +321,13 @@ const serial = new Serial( { } ); dog.root.children.push( serial ); +swap.swap(); +const dvi = new DVi( { + input: swap.i, + target: swap.o, +} ); +dog.root.children.push( dvi ); + swap.swap(); const post = new Post( { input: swap.i, diff --git a/src/shaders/crystal.frag b/src/shaders/crystal.frag new file mode 100644 index 0000000..deb910c --- /dev/null +++ b/src/shaders/crystal.frag @@ -0,0 +1,136 @@ +#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 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 ); + +#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 SHADOW + out vec4 fragColor; +#endif + +uniform float deformAmp; +uniform float deformFreq; +uniform float deformTime; +uniform float time; +uniform float noiseOffset; +uniform vec2 resolution; +uniform vec2 size; +uniform vec2 cameraNearFar; +uniform vec3 cameraPos; +uniform mat4 normalMatrix; +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; +} + +// 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: cyclicNoise = require( ./modules/cyclicNoise ); + +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; +} + +float distFunc( vec3 p ) { + p.zx = rot2d( 0.5 * time ) * p.zx; + p -= size.xyx * vec3( 0.01, 0.2, 0.01 ) * cyclicNoise( vec3( 1.0, 0.04, 1.0 ) / size.xyx * p + noiseOffset ); + p.y -= min( 0.8 * size.y - size.x, abs( p.y ) ) * sign( p.y ); + p = fold( p ); + return dot( p, foldface ) - size.x; +} + +vec3 normalFunc( vec3 p, float dd ) { + vec2 d = vec2( 0.0, dd ); + return normalize( vec3( + distFunc( p + d.yxx ) - distFunc( p - d.yxx ), + distFunc( p + d.xyx ) - distFunc( p - d.xyx ), + distFunc( p + d.xxy ) - distFunc( 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; + + for ( int i = 0; i < MARCH_ITER; i ++ ) { + dist = distFunc( 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 modelNormal = ( normalMatrix * vec4( normalFunc( rayPos, 1E-2 ), 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 ); + fragColor = vec4( vec3( 0.5, 0.52, 1.0 ), 1.0 ); + fragWTF = vec4( vec3( 0.02, 1.0, 0.0 ), 3 ); + #endif + + #ifdef SHADOW + float shadowDepth = linearstep( + cameraNearFar.x, + cameraNearFar.y, + length( cameraPos - rayPos ) + ); + fragColor = vec4( shadowDepth, shadowDepth * shadowDepth, shadowDepth, 1.0 ); + #endif +} diff --git a/src/shaders/dvi.frag b/src/shaders/dvi.frag new file mode 100644 index 0000000..d17c334 --- /dev/null +++ b/src/shaders/dvi.frag @@ -0,0 +1,111 @@ +#version 300 es + +precision highp float; + +const float PI = 3.14159265; +const vec3 LUMA = vec3( 0.2126, 0.7152, 0.0722 ); + +#define saturate(i) clamp(i,0.,1.) +#define linearstep(a,b,x) saturate(((x)-(a))/((b)-(a))) +#define lofi(i,m) (floor((i)/(m))*(m)) + +in vec2 vUv; + +out vec4 fragColor; + +uniform float time; +uniform vec2 resolution; +uniform sampler2D sampler0; + +mat2 r2d( float t ) { + return mat2( cos( t ), sin( t ), -sin( t ), cos( t ) ); +} + +float smin(float a,float b,float k){ + float h = linearstep( k, 0.0, abs( a - b ) ); + return min( a, b ) - h * h * h * k / 6.0; +} + +float dRadial( + vec2 p, + float offr, + float repr, + float exr, + float offx, + float exx, + float r +) { + p = r2d( offr ) * p; + float a = atan( p.y, p.x ); + p = r2d( -lofi( a + repr / 2.0, repr ) ) * p; + a = atan( p.y, p.x ); + p = r2d( -sign( a ) * min( abs( a ), exr ) ) * p; + p.x -= offx; + p.x -= sign( p.x ) * min( abs( p.x ), exx ); + float d = length( p ) - r; + return d; +} + +float sdbox( vec2 p,vec2 d ) { + vec2 pt = abs( p ) - d; + return min( max( pt.x, pt.y ), 0.0 ) + length( max( pt, 0.0 ) ); +} + +float dCirc( vec2 p ) { + return max( length( p ) - 0.02, 0.018 - length( p ) ); +} + +float dOverlay( vec2 p ) { + float d = 1E9; + float t = time; + + // center bar + d = min( d, sdbox( p, vec2( 0.12, 0.002 ) ) ); + + // circles + { + vec2 pt = abs( p ); + d = min( d, dCirc( pt - vec2( 0.0, 0.05 ) ) ); + d = min( d, dCirc( pt - vec2( 0.07, 0.05 ) ) ); + d = min( d, dCirc( pt - vec2( 0.035, 0.05 + 0.035 * sqrt( 3.0 ) ) ) ); + } + + // rings + { + float d2 = 1E9; + d2 = smin( d2, dRadial( p, 0.1 * t, PI / 2.0, PI / 8.0, 0.7, 0.0, 0.02 ), 0.05 ); + d2 = smin( d2, dRadial( p, 0.1 * t + PI / 4.0, PI / 2.0, PI / 8.0, 0.72, 0.0, 0.02 ), 0.05 ); + d = min( d2, d ); + } + + d = min( d, dRadial( p, 0.1 * t, PI / 8.0, PI / 19.0, 0.76, 0.002, 0.0 ) ); + d = min( d, dRadial( p, -0.1 * t, PI / 8.0, PI / 9.0, 0.78, 0.01, 0.0 ) ); + d = min( d, dRadial( p, 0.04 * t, PI / 48.0, 0.002, 0.815, 0.008, 0.0 ) ); + d = min( d, dRadial( p, 0.04 * t, PI / 192.0, 0.002, 0.815, 0.002, 0.0 ) ); + + { + float d2 = 1E9; + d2 = smin( d2, dRadial( p, 0.1 * t, PI / 1.5, PI / 8.0, 0.86, 0.0, 0.02 ), 0.05 ); + d2 = smin( d2, dRadial( p, 0.1 * t + PI / 4.0, PI / 1.5, PI, 0.88, 0.0, 0.02 ), 0.05 ); + d = min( d2, d ); + } + + d = min( d, dRadial( p, 0.2 * t, PI / 2.0, PI / 4.2, 0.915, 0.002, 0.0 ) ); + d = min( d, dRadial( p, -.1 * t, PI / 4.0, PI / 8.5, 0.94, 0.01, 0.0 ) ); + d = min( d, dRadial( p, 0.04 * t, PI / 96.0, 0.002, 0.99, 0.03, 0.0 ) ); + + return d; +} + +void main() { + vec2 uv = vUv; + vec2 p = ( uv * resolution * 2.0 - resolution ) / resolution.y; + + vec3 col = texture( sampler0, uv ).rgb; + + float d = dOverlay( p * 0.65 ); + float shape = linearstep( 2.0 / resolution.y, 0.0, d ); + col = mix( col, saturate( 0.5 - 0.3 * col.gbr ), shape ); + + fragColor = vec4( col, 1.0 ); +} diff --git a/src/shaders/ifs-piston.frag b/src/shaders/ifs-piston.frag index 5f38f62..451cf50 100644 --- a/src/shaders/ifs-piston.frag +++ b/src/shaders/ifs-piston.frag @@ -41,6 +41,12 @@ vec3 divideByW( vec4 v ) { return v.xyz / v.w; } +// 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 ); @@ -54,7 +60,7 @@ vec3 ifs( vec3 p, vec3 r, vec3 t ) { vec3 s = t; mat3 bas = orthBasis( r ); - for ( int i = 0; i < 6; i ++ ) { + for ( int i = 0; i < 5; i ++ ) { p = abs( p ) - abs( s ) * pow( 1.8, -float( i ) ); s = bas * s; @@ -82,8 +88,8 @@ vec4 map( vec3 p ) { pt.y += 10.0; vec3 r = mix( - fs( vec3( 4.7, 2.2, 8.3 ) + floor( ifsSeed ) ), - fs( vec3( 4.7, 2.2, 8.3 ) + floor( ifsSeed + 1.0 ) ), + fs( vec3( 4.7, 3.2, 4.3 ) + floor( ifsSeed ) ), + fs( vec3( 4.7, 3.2, 4.3 ) + floor( ifsSeed + 1.0 ) ), fract( ifsSeed ) ); vec3 t = 0.1 * vec3( 4.2, 3.5, 2.2 ); @@ -91,19 +97,21 @@ vec4 map( vec3 p ) { pt = mod( pt - 0.1, 0.2 ) - 0.1; - isect = vec4( max( box( pt, vec3( 0.04 ) ), clampbox ), 2, 0, 0 ); + float d = max( box( pt, vec3( 0.05 ) ), clampbox ); + + isect = vec4( d, 2, 0, 0 ); } { vec3 pt = p; - float clampbox = box( pt, vec3( 1.0, 10.0, 1.0 ) - 0.1 ); + float clampbox = box( pt, vec3( 1.0, 10.0, 1.0 ) - 0.02 ); pt.y += 10.0; vec3 r = mix( - fs( vec3( 5.3, 1.1, 2.9 ) + floor( ifsSeed ) ), - fs( vec3( 5.3, 1.1, 2.9 ) + floor( ifsSeed + 1.0 ) ), + fs( vec3( 5.3, 1.9, 3.9 ) + floor( ifsSeed ) ), + fs( vec3( 5.3, 1.9, 3.9 ) + floor( ifsSeed + 1.0 ) ), fract( ifsSeed ) ); vec3 t = 0.2 * vec3( 3.0, 2.3, 3.5 ); @@ -111,7 +119,11 @@ vec4 map( vec3 p ) { pt = mod( pt - 0.1, 0.2 ) - 0.1; - vec4 isectb = vec4( clampbox, 2, 0, 0 ); + float d = max( box( pt, vec3( 0.07 ) ), clampbox ); + + float gorge = step( 0.0, 0.005 - abs( pt.x ) ); + + vec4 isectb = vec4( d, 1.0 + 2.0 * gorge, 0, 0 ); isect = isectb.x < isect.x ? isectb : isect; } @@ -120,7 +132,7 @@ vec4 map( vec3 p ) { float d = box( pt - vec3( 1.0, 0.0, 1.0 ), vec3( 0.02, 9.9, 0.02 ) ); - vec4 isectb = vec4( d, 3, 0, 0 ); + vec4 isectb = vec4( d, 4, 0, 0 ); isect = isectb.x < isect.x ? isectb : isect; } @@ -170,21 +182,34 @@ void main() { fragPosition = vec4( modelPos.xyz, depth ); fragNormal = vec4( modelNormal, 1.0 ); - if ( isect.y == 2.0 ) { + if ( isect.y < 2.5 ) { vec3 noise = cyclicNoise( 3.0 * rayPos ); vec3 noiseDetail = cyclicNoise( vec3( 38.0, 1.0, 1.0 ) * ( orthBasis( vec3( 1 ) ) * rayPos ) ); - float roughness = ( - 0.6 + - 0.1 * noise.x + - 0.2 * smoothstep( -0.2, 0.4, noise.y ) * ( 0.8 + 0.2 * sin( 17.0 * noiseDetail.x ) ) - ); - fragColor = vec4( vec3( 0.4 ), 1.0 ); - fragWTF = vec4( vec3( roughness, 0.9, 0.0 ), 2 ); - } else if ( isect.y == 1.0 ) { - fragColor = vec4( vec3( 1.0 ), 1.0 ); - fragWTF = vec4( vec3( 0.3, 0.1, 0.0 ), 2 ); + if ( isect.y == 1.0 ) { + float roughness = ( + 0.6 + + 0.1 * noise.x + + 0.2 * smoothstep( -0.2, 0.4, noise.y ) * ( 0.8 + 0.2 * sin( 17.0 * noiseDetail.x ) ) + ); + + fragColor = vec4( vec3( 0.04 ), 1.0 ); + fragWTF = vec4( vec3( roughness, 0.9, 0.0 ), 2 ); + } else { + float roughness = ( + 0.2 + + 0.2 * ( 0.5 + 0.5 * sin( 17.0 * noiseDetail.x ) ) + ); + + fragColor = vec4( vec3( 0.3 ), 1.0 ); + fragWTF = vec4( vec3( roughness, 0.1, 0.0 ), 2 ); + } } else if ( isect.y == 3.0 ) { + float amp = 20.0 * exp( -5.0 * fract( abs( rayPos.x ) - rayPos.y + abs( rayPos.z ) + time ) ); + + fragColor = vec4( 0.2 * vec3( 1.0, 0.002, 0.03 ), 1.0 ); + fragWTF = vec4( vec3( 0.1, 0.1, amp ), 2 ); + } else if ( isect.y == 4.0 ) { fragColor = vec4( 0.2 * vec3( 1.0, 0.002, 0.03 ), 1.0 ); fragWTF = vec4( vec3( 0.1, 0.1, 20.0 ), 2 ); } diff --git a/src/shaders/light-shaft.frag b/src/shaders/light-shaft.frag index f1c7104..ffcf025 100644 --- a/src/shaders/light-shaft.frag +++ b/src/shaders/light-shaft.frag @@ -16,6 +16,7 @@ in vec4 vPosition; out vec4 fragColor; uniform float time; +uniform float intensity; uniform vec2 lightNearFar; uniform vec2 resolution; uniform vec2 cameraNearFar; @@ -107,5 +108,5 @@ void main() { if ( rayLen > cameraNearFar.y ) { break; } } - fragColor = vec4( 0.01 * lightColor * accum, 1.0 ); + fragColor = vec4( intensity * lightColor * accum, 1.0 ); } diff --git a/src/shaders/pixel-sorter.frag b/src/shaders/pixel-sorter.frag index 550b64f..642e353 100644 --- a/src/shaders/pixel-sorter.frag +++ b/src/shaders/pixel-sorter.frag @@ -33,7 +33,7 @@ void main() { } float index = ( reverse ? texIndex.y : texIndex.x ) - 1.0; - float width = texIndex.x + texIndex.y - 1.0; + float width = texIndex.x + texIndex.y - 2.0; bool isCompHigher = mod( index, 2.0 * comp * width ) < comp * width; float offset = floor( ( ( isCompHigher ^^ reverse ) ? comp : -comp ) * width + 0.5 ); diff --git a/src/shaders/post.frag b/src/shaders/post.frag index d4bfea9..e6b73d3 100644 --- a/src/shaders/post.frag +++ b/src/shaders/post.frag @@ -24,14 +24,6 @@ uniform sampler2D samplerRandom; #pragma glslify: prng = require( ./-prng ); -vec3 colorMap( vec3 i ) { - return vec3( - smoothstep( 0.0, 1.0, i.r ), - i.g, - 0.1 + 0.8 * i.b - ); -} - vec3 barrel( float amp, vec2 uv ) { float corn = length( vec2( 0.5 ) ); float a = min( 3.0 * sqrt( amp ), corn * PI ); diff --git a/src/shaders/rings.frag b/src/shaders/rings.frag index 29fbea3..ce1006a 100644 --- a/src/shaders/rings.frag +++ b/src/shaders/rings.frag @@ -23,13 +23,13 @@ uniform float time; void main() { #ifdef FORWARD - fragColor = vec4( 8.0 * vec3( 0.1, 0.9, 0.4 ), 1.0 ); + fragColor = vec4( 8.0 * vec3( 0.1, 0.4, 1.0 ), 1.0 ); #endif #ifdef DEFERRED fragPosition = vPosition; fragNormal = vec4( normalize( vNormal ), 1.0 ); - fragColor = vec4( 0.1, 0.9, 0.4, 1.0 ); + fragColor = vec4( 0.1, 0.4, 1.0, 1.0 ); fragWTF = vec4( vec3( 0.2, 0.2, 8.0 ), MTL_PBR ); #endif } diff --git a/src/shaders/rings.vert b/src/shaders/rings.vert index e920a84..3199166 100644 --- a/src/shaders/rings.vert +++ b/src/shaders/rings.vert @@ -37,7 +37,7 @@ void main() { vNormal = normalize( ( normalMatrix * vec4( normal, 1.0 ) ).xyz ); vPosition = vec4( mix( 2.0, 2.7, random() ) * position, 1.0 ); - vPosition.xyz += mix( 0.002, 0.005, random() ) * normal; + vPosition.xyz += mix( 0.005, 0.01, random() ) * normal; vPosition.y += sin( random() * time + random() * vPosition.x + TAU * random() ) * 0.2 * random(); vPosition.y += sin( random() * time + random() * vPosition.z + TAU * random() ) * 0.2 * random(); vPosition.xy = rotate2D( 0.2 * ( random() - 0.5 ) ) * vPosition.xy; diff --git a/src/shaders/shading.frag b/src/shaders/shading.frag index 7357e54..d46e0c7 100644 --- a/src/shaders/shading.frag +++ b/src/shaders/shading.frag @@ -5,6 +5,7 @@ precision highp float; const int MTL_NONE = 0; const int MTL_UNLIT = 1; const int MTL_PBR = 2; +const int MTL_REFRACT = 3; const float ENV_UV_MARGIN = 0.9375; const float AO_BIAS = 0.0; const float AO_RADIUS = 0.5; @@ -192,7 +193,6 @@ vec3 shadePBR( Isect isect ) { ); shadow *= castShadow( iLight, lightP * 0.5 + 0.5, isect, NdotL ); - shadow = mix( 0.0, 1.0, shadow ); // do shading vec3 diffuse = brdfLambert( f0, albedo, VdotH ); @@ -268,6 +268,18 @@ void main() { } else if ( isect.materialId == MTL_PBR ) { color = shadePBR( isect ); + } else if ( isect.materialId == MTL_REFRACT ) { + color = shadePBR( isect ); + + // really really cheap full spectrum + vec3 refrEnvRefractive = refract( V, isect.normal, 1.0 / 2.56 ); + vec2 uvEnvRefractive = vec2( + 0.5 + atan( refrEnvRefractive.x, -refrEnvRefractive.z ) / TAU, + 0.5 + atan( refrEnvRefractive.y, length( refrEnvRefractive.zx ) ) / PI + ); + vec3 texEnvRefractive = sampleEnvLinear( uvEnvRefractive, 0.1 ).rgb; + + color += isect.color * texEnvRefractive; } diff --git a/src/shaders/wobbleball.frag b/src/shaders/wobbleball.frag index 588128d..c33dab6 100644 --- a/src/shaders/wobbleball.frag +++ b/src/shaders/wobbleball.frag @@ -142,8 +142,8 @@ void main() { #ifdef DEFERRED fragPosition = vec4( modelPos.xyz, depth ); fragNormal = vec4( modelNormal, 1.0 ); - fragColor = vec4( 0.4, 0.7, 0.9, 1.0 ); - fragWTF = vec4( vec3( 0.9, 0.7, 0.0 ), MTL_PBR ); + fragColor = vec4( vec3( 0.3 ), 1.0 ); + fragWTF = vec4( vec3( 1.0, 0.1, 0.0 ), MTL_PBR ); #endif #ifdef SHADOW