diff --git a/src/automaton.json b/src/automaton.json index 6bb1938..097b73d 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.30518542366057444],[0.16666666666666666],[0.3333333333333333,0.32598769865660215],[0.3333333333333333],[0.5833333333333333,0.48088974335080736],[0.5833333333333333,0.04062113856815275],[0.8333333333333333,0.3056520287525164,-0.13535287808567942,-0.12209691113150735],[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]]}],"channels":[["EnvironmentMap/accumulate",{"items":[{"length":1,"value":0.1,"curve":31,"amp":0.9},{"time":42.666666666666664,"length":1,"value":0.1,"curve":31,"amp":0.9}]}],["Glitch/amp",{"items":[{},{"time":42.666666666666664,"length":1,"curve":0},{"time":45.33333333333333,"length":1,"curve":0},{"time":48,"length":1,"curve":0},{"time":50.666666666666664,"length":1,"curve":0},{"time":53.33333333333333,"length":1,"curve":0},{"time":56,"length":1,"curve":0},{"time":58.666666666666664,"length":1,"curve":0},{"time":61.33333333333333,"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":72,"length":1,"curve":0},{"time":74.66666666666666,"length":1,"curve":0},{"time":77.33333333333333,"length":1,"curve":0},{"time":80,"length":1,"curve":0},{"time":82.66666666666666,"length":1,"curve":0},{"time":256}]}],["PixelSorter/amp",{"items":[{},{"time":42.666666666666664,"length":1.3333333333333357,"curve":13,"speed":0.4999999999999975},{"time":45.33333333333333,"length":1.3333333333333357,"curve":13,"speed":0.4999999999999975},{"time":48,"length":1.3333333333333357,"curve":13,"speed":0.4999999999999975},{"time":50.666666666666664,"length":1.3333333333333357,"curve":13,"speed":0.4999999999999975},{"time":53.33333333333333,"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.33333333333333,"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":72,"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":80,"length":1.3333333333333357,"curve":13,"speed":0.4999999999999975},{"time":82.66666666666666,"length":1.3333333333333357,"curve":13,"speed":0.4999999999999975}]}],["Serial/enable",{"items":[{},{"time":86.66666666666666,"length":1.3333333333333428},{"time":89.33333333333333,"length":1.3333333333333428},{"time":92,"length":1.3333333333333428},{"time":94.66666666666666,"length":1.3333333333333428},{"time":97.33333333333333,"length":1.3333333333333428},{"time":100,"length":1.3333333333333428},{"time":102.66666666666666,"length":1.3333333333333428},{"time":105.33333333333333,"length":1.3333333333333428}]}],["LightFirst/active",{"items":[{"length":42.666666666666664}]}],["Condition/active",{"items":[{"length":42.666666666666664}]}],["Cube/active",{"items":[{"length":42.666666666666664}]}],["Sync/first/clap",{"items":[{},{"time":22.333333333333332,"length":1.3333333333333321,"curve":19},{"time":23.666666666666664,"length":1.3333333333333321,"value":1,"curve":19},{"time":24.999999999999996,"length":1.3333333333333321,"value":2,"curve":19},{"time":26.33333333333333,"length":1.3333333333333321,"value":3,"curve":19},{"time":27.66666666666666,"length":1.3333333333333321,"value":4,"curve":19},{"time":28.999999999999993,"length":1.3333333333333321,"value":5,"curve":19},{"time":30.333333333333325,"length":1.3333333333333321,"value":6,"curve":19},{"time":31.666666666666657,"length":1.3333333333333321,"value":7,"curve":19},{"time":32.999999999999986,"length":1.3333333333333321,"value":8,"curve":19},{"time":34.333333333333314,"length":1.3333333333333321,"value":9,"curve":19},{"time":35.66666666666664,"length":1.3333333333333321,"value":10,"curve":19},{"time":36.99999999999997,"length":1.3333333333333321,"value":11,"curve":19}]}],["Condition/hahaRatio",{"items":[{},{"time":37.33333333333333,"length":4,"curve":30}]}],["Condition/phaseWidth",{"items":[{"value":0.1},{"time":22.333333333333332,"length":20.333333333333332,"value":0.1,"curve":20,"speed":0.049180327868852465,"amp":0.5888750576601328}]}],["LightPink/active",{"items":[{},{"time":42.666666666666664,"length":42.666666666666664}]}],["Wobbleball/active",{"items":[{},{"time":42.666666666666664,"length":42.666666666666664}]}],["SufferTexts/active",{"items":[{},{"time":42.666666666666664,"length":42.666666666666664}]}],["sufferText/push",{"items":[{"time":42.666666666666664},{"time":45.33333333333333,"value":1},{"time":48,"value":2},{"time":50.666666666666664,"value":3},{"time":53.33333333333333,"value":4},{"time":56,"value":5},{"time":58.666666666666664,"value":6},{"time":61.33333333333333,"value":7},{"time":64,"value":8},{"time":66.66666666666666,"value":9},{"time":69.33333333333333,"value":10},{"time":72,"value":11},{"time":74.66666666666666,"value":12},{"time":77.33333333333333,"value":13},{"time":80,"value":14},{"time":82.66666666666666,"value":15}]}],["IFSPistons/active",{"items":[{},{"time":42.666666666666664,"length":42.666666666666664}]}],["IFSPistons/group0/rot",{"items":[{},{"time":43.33333333333333,"length":2,"curve":28},{"time":48.666666666666664,"length":2,"value":1,"curve":28},{"time":54,"length":2,"value":2,"curve":28},{"time":59.33333333333333,"length":2,"value":3,"curve":28},{"time":64.66666666666666,"length":2,"value":4,"curve":28},{"time":70,"length":2,"value":5,"curve":28},{"time":75.33333333333333,"length":2,"value":6,"curve":28},{"time":80.66666666666666,"length":2,"value":7.319482115535903,"curve":28,"amp":0.6805178844640967}]}],["IFSPistons/group1/rot",{"items":[{},{"time":46,"length":2,"curve":28},{"time":51.33333333333333,"length":2,"value":1,"curve":28},{"time":56.666666666666664,"length":2,"value":2,"curve":28},{"time":62,"length":2,"value":3,"curve":28},{"time":67.33333333333333,"length":2,"value":4,"curve":28},{"time":72.66666666666666,"length":2,"value":5,"curve":28},{"time":78,"length":2,"value":6,"curve":28},{"time":83.33333333333333,"length":2,"value":7,"curve":28}]}],["IFSPistons/group0/pos",{"items":[{"value":3},{"time":42.33333333333333,"length":2.3333333333333357,"value":1.5,"curve":27,"amp":1.5},{"time":47.666666666666664,"length":2.3333333333333357,"value":1.5,"curve":27,"amp":1.5},{"time":53,"length":2.3333333333333357,"value":1.5,"curve":27,"amp":1.5},{"time":58.33333333333333,"length":2.3333333333333357,"value":1.5,"curve":27,"amp":1.5},{"time":63.7,"length":2.3333333333333357,"value":1.5,"curve":27,"amp":1.5},{"time":69,"length":2.3333333333333357,"value":1.5,"curve":27,"amp":1.5},{"time":74.33333333333333,"length":2.3333333333333357,"value":1.5,"curve":27,"amp":1.5},{"time":79.66666666666666,"length":2.3333333333333357,"value":1.5,"curve":27,"amp":1.5}]}],["IFSPistons/group1/pos",{"items":[{"value":3},{"time":45,"length":2.3333333333333357,"value":1.5,"curve":27,"amp":1.5},{"time":50.33333333333333,"length":2.3333333333333357,"value":1.5,"curve":27,"amp":1.5},{"time":55.666666666666664,"length":2.3333333333333357,"value":1.5,"curve":27,"amp":1.5},{"time":61,"length":2.3333333333333357,"value":1.5,"curve":27,"amp":1.5},{"time":66.33333333333333,"length":2.3333333333333357,"value":1.5,"curve":27,"amp":1.5},{"time":71.66666666666666,"length":2.3333333333333357,"value":1.5,"curve":27,"amp":1.5},{"time":77,"length":2.3333333333333357,"value":1.5,"curve":27,"amp":1.5},{"time":82.33333333333333,"length":2.3333333333333357,"value":1.5,"curve":27,"amp":1.5}]}],["Music/NEURO_TIME",{"items":[{},{"time":42.666666666666664,"length":10.666666666666664,"curve":2},{"time":53.33333333333333,"length":8.666666666666671,"curve":2},{"time":62,"length":1.999999999999993,"curve":9},{"time":63.99999999999999,"length":10.666666666666664,"curve":2},{"time":74.66666666666666,"length":8.666666666666671,"curve":2},{"time":83.33333333333333,"length":1.999999999999993,"curve":9},{"time":85.33333333333331,"length":1.3333333333333428,"curve":14},{"time":86.66666666666666,"length":1.3333333333333286,"curve":18},{"time":87.99999999999999,"length":1.3333333333333428,"curve":14},{"time":90.66666666666666,"length":1.3333333333333428,"curve":14},{"time":92,"length":1.3333333333333286,"curve":32},{"time":93.33333333333333,"length":1.3333333333333428,"curve":14},{"time":96,"length":1.3333333333333428,"curve":14},{"time":97.33333333333334,"length":1.3333333333333144,"curve":18},{"time":98.66666666666666,"length":1.3333333333333428,"curve":14},{"time":101.33333333333333,"length":1.3333333333333428,"curve":14},{"time":102.66666666666667,"length":1.3333333333333286,"curve":32},{"time":104,"length":1.3333333333333428,"curve":14}]}],["Music/NEURO_DETUNE",{"items":[{},{"time":42.666666666666664,"length":10.666666666666664,"curve":3},{"time":53.33333333333333,"length":8.666666666666671,"curve":3},{"time":62,"length":1.999999999999993,"curve":10},{"time":63.99999999999999,"length":10.666666666666664,"curve":3},{"time":74.66666666666666,"length":8.666666666666671,"curve":3},{"time":83.33333333333333,"length":1.999999999999993,"curve":10},{"time":85.33333333333333,"length":1.3333333333333286,"curve":15},{"time":88,"length":1.3333333333333286,"curve":15},{"time":90.66666666666666,"length":1.3333333333333286,"curve":15},{"time":91.99999999999999,"length":1.3333333333333428,"value":0.7799999999999995},{"time":93.33333333333333,"length":1.3333333333333286,"curve":15},{"time":96,"length":1.3333333333333286,"curve":15},{"time":98.66666666666666,"length":1.3333333333333286,"curve":15},{"time":101.33333333333333,"length":1.3333333333333286,"curve":15},{"time":102.66666666666666,"length":1.3333333333333428,"value":0.7799999999999995},{"time":104,"length":1.3333333333333286,"curve":15}]}],["Music/NEURO_DETUNE_PHASE",{"items":[{},{"time":42.666666666666664,"length":10.666666666666664,"curve":8},{"time":53.33333333333333,"length":8.666666666666671,"curve":8},{"time":62,"length":1.999999999999993,"curve":11},{"time":63.99999999999999,"length":10.666666666666664,"curve":8},{"time":74.66666666666666,"length":8.666666666666671,"curve":8},{"time":83.33333333333333,"length":1.999999999999993,"curve":11},{"time":85.33333333333333,"length":1.3333333333333428,"curve":16},{"time":88,"length":1.3333333333333428,"curve":16},{"time":90.66666666666666,"length":1.3333333333333428,"curve":16},{"time":93.33333333333333,"length":1.3333333333333428,"curve":16},{"time":96,"length":1.3333333333333428,"curve":16},{"time":98.66666666666666,"length":1.3333333333333428,"curve":16},{"time":101.33333333333333,"length":1.3333333333333428,"curve":16},{"time":102.66666666666667,"length":1.3333333333333286},{"time":104,"length":1.3333333333333428,"curve":16}]}],["Music/NEURO_WUB_AMP",{"items":[{},{"time":42.666666666666664,"length":10.668578038364203,"curve":4},{"time":53.33524470503087,"length":8.664755294969133,"curve":4},{"time":62,"length":2.0038227433950624,"curve":12},{"time":64.00382274339506,"length":10.668578038364203,"curve":4},{"time":74.67240078175926,"length":8.660932551574064,"curve":4},{"time":83.33333333333333,"length":2.0038227433950624,"curve":12},{"time":85.33715607672839,"length":1.3333333333333428,"curve":17},{"time":88,"length":1.3333333333333333,"curve":17},{"time":90.66666666666666,"length":1.3333333333333333,"curve":17},{"time":91.99999999999999,"length":1.3333333333333428,"curve":33},{"time":93.33333333333333,"length":1.3333333333333333,"curve":17},{"time":96,"length":1.3333333333333333,"curve":17},{"time":98.66666666666666,"length":1.3333333333333333,"curve":17},{"time":101.33333333333333,"length":1.3333333333333333,"curve":17},{"time":102.66666666666666,"length":1.3333333333333428,"curve":33},{"time":104,"length":1.3333333333333333,"curve":17}]}],["Music/NEURO_WUB_FREQ",{"items":[{},{"time":42.666666666666664,"length":2,"value":1},{"time":44.666666666666664,"length":0.6666666666666643,"value":0.49999999999999967},{"time":45.33333333333333,"length":0.6666666666666714,"value":1},{"time":46,"length":1.3333333333333286,"value":2},{"time":47.33333333333333,"length":0.6666666666666714,"value":2.5},{"time":48,"length":0.6666666666666643,"value":1},{"time":48.666666666666664,"length":1.3333333333333357,"value":1},{"time":50,"length":0.6666666666666643,"value":2},{"time":50.666666666666664,"length":2,"value":1},{"time":52.666666666666664,"length":0.6666666666666643,"value":2},{"time":53.33333333333333,"length":0.6666666666666714,"value":1},{"time":54,"length":1.3333333333333286,"value":2.1000000000000014},{"time":55.33333333333333,"length":0.6666666666666714,"value":0.5},{"time":56,"length":0.6666666666666643,"value":7},{"time":56.666666666666664,"length":1.3333333333333357,"value":3},{"time":58,"length":0.6666666666666714,"value":1},{"time":58.66666666666667,"length":0.6666666666666714,"value":0.9600000000000006},{"time":59.33333333333334,"length":1.3333333333333215,"value":6},{"time":60.666666666666664,"length":0.6666666666666785,"value":10.840000000000003},{"time":61.33333333333334,"length":0.6666666666666572,"value":1},{"time":62,"length":1.3333333333333428,"value":3.989999999999996},{"time":63.33333333333334,"length":0.6666666666666572,"value":4.109999999999999},{"time":64,"length":2,"value":1},{"time":66,"length":0.6666666666666643,"value":0.49999999999999967},{"time":66.66666666666666,"length":0.6666666666666714,"value":1},{"time":67.33333333333333,"length":1.3333333333333286,"value":2},{"time":68.66666666666666,"length":0.6666666666666714,"value":2.5},{"time":69.33333333333333,"length":0.6666666666666643,"value":1},{"time":70,"length":1.3333333333333357,"value":1},{"time":71.33333333333334,"length":0.6666666666666643,"value":2},{"time":72,"length":2,"value":1},{"time":74,"length":0.6666666666666643,"value":2},{"time":74.66666666666666,"length":0.6666666666666714,"value":1},{"time":75.33333333333333,"length":1.3333333333333286,"value":2.1000000000000014},{"time":76.66666666666666,"length":0.6666666666666714,"value":0.5},{"time":77.33333333333333,"length":0.6666666666666643,"value":7},{"time":78,"length":1.3333333333333357,"value":3},{"time":79.33333333333334,"length":0.6666666666666714,"value":1},{"time":80.00000000000001,"length":0.6666666666666714,"value":0.9600000000000006},{"time":80.66666666666669,"length":1.3333333333333144,"value":6},{"time":82,"length":0.6666666666666856,"value":10.840000000000003},{"time":82.66666666666669,"length":0.6666666666666572,"value":1},{"time":83.33333333333334,"length":1.3333333333333428,"value":3.9899999999999993},{"time":84.66666666666669,"length":0.6666666666666572,"value":4.109999999999999},{"time":85.33333333333334,"length":1.3333333333333144,"value":1},{"time":88,"length":1.3333333333333144,"value":1},{"time":90.66666666666666,"length":1.3333333333333144,"value":1},{"time":93.33333333333333,"length":1.3333333333333144,"value":1},{"time":96,"length":1.3333333333333144,"value":1},{"time":98.66666666666666,"length":1.3333333333333144,"value":1},{"time":101.33333333333333,"length":1.3333333333333144,"value":1},{"time":104,"length":1.3333333333333144,"value":1}]}],["Trails/active",{"items":[{}]}],["Rings/active",{"items":[{},{"time":106.66666666666666,"length":42.666666666666664}]}],["FlickyParticles/active",{"items":[{},{"time":42.666666666666664,"length":42.666666666666664},{"time":85.33333333333333,"length":1.3333333333333286},{"time":88,"length":1.3333333333333286},{"time":90.66666666666666,"length":1.3333333333333286},{"time":93.33333333333333,"length":1.3333333333333286},{"time":96,"length":1.3333333333333286},{"time":98.66666666666666,"length":1.3333333333333286},{"time":101.33333333333333,"length":1.3333333333333286},{"time":104,"length":1.3333333333333286},{"time":106.66666666666666,"length":5.333333333333343}]}],["SphereParticles/active",{"items":[{},{"time":85.33333333333333,"length":42.666666666666664}]}],["FlashyTerrain/active",{"items":[{},{"time":86.66666666666666,"length":1.3333333333333428},{"time":97.33333333333333,"length":1.3333333333333428}]}],["Camera/pos/x",{"items":[{},{"time":42.666666666666664,"value":-0.7200000000000002},{"time":45.33333333333333,"value":0.22},{"time":48,"value":0.18999999999999975},{"time":53.33333333333333,"value":0.030000000000000478},{"time":56,"value":0.4300000000000005},{"time":58.666666666666664,"value":-0.3099999999999998}]}],["Camera/pos/y",{"items":[{},{"time":42.666666666666664},{"time":48,"value":0.18999999999999986},{"time":53.33333333333333},{"time":97.33333333333333,"value":0.8799999999999999}]}],["Camera/pos/z",{"items":[{},{"time":42.666666666666664},{"time":58.666666666666664,"value":0.5}]}],["Camera/rot/r",{"items":[{"length":4,"value":5,"curve":21,"amp":10},{"time":20.700000000000003,"length":4,"value":5,"curve":22,"amp":-2},{"time":36.666666666666664,"length":4,"value":3,"curve":22,"amp":4},{"time":42.666666666666664,"value":5},{"time":45.33333333333333,"value":5.6},{"time":48,"value":3.5400000000000005},{"time":50.666666666666664,"value":6.480000000000007},{"time":53.33333333333333,"value":5},{"time":56,"value":5.6},{"time":58.666666666666664,"value":3.630000000000001},{"time":61.33333333333333,"value":6.600000000000005},{"time":85.33333333333333,"length":1.3333333333333286,"value":5,"curve":21,"speed":3.000000000000011,"amp":5},{"time":88,"length":1.3333333333333286,"value":5,"curve":21,"speed":3.000000000000011,"amp":5},{"time":90.66666666666667,"length":1.3333333333333286,"value":5,"curve":21,"speed":3.000000000000011,"amp":5},{"time":93.33333333333334,"length":1.3333333333333144,"value":5,"curve":21,"speed":3.000000000000011,"amp":5},{"time":96.00000000000001,"length":1.3333333333333144,"value":5,"curve":21,"speed":3.000000000000011,"amp":5},{"time":98.66666666666669,"length":1.3333333333333144,"value":5,"curve":21,"speed":3.000000000000011,"amp":5},{"time":101.33333333333336,"length":1.3333333333333002,"value":5,"curve":21,"speed":3.000000000000011,"amp":5},{"time":104.00000000000003,"length":1.3333333333333002,"value":5,"curve":21,"speed":3.000000000000011,"amp":5}]}],["Camera/rot/t",{"items":[{},{"time":21.333333333333332,"length":5.333333333333332,"curve":23,"speed":0.2499999999999999,"amp":0.30000000000000004},{"time":26.666666666666664,"length":5.333333333333332,"value":1.2000000000000002,"curve":23,"speed":0.2499999999999999,"amp":-0.9},{"time":32,"length":5.333333333333329,"value":-0.3,"curve":23,"speed":0.2499999999999999,"amp":0.30000000000000004},{"time":42.666666666666664,"value":0.12000000000000001},{"time":45.33333333333333,"value":-0.30999999999999495},{"time":48,"value":0.5200000000000048},{"time":50.666666666666664,"value":-0.029999999999995274},{"time":53.33333333333333,"value":0.2600000000000046},{"time":56,"value":-0.2899999999999953},{"time":58.666666666666664,"value":0.9900000000000047},{"time":61.33333333333333,"value":-0.029999999999995274},{"time":85.33333333333333},{"time":86.66666666666666,"value":0.5700000000000002},{"time":88},{"time":90.66666666666666},{"time":93.33333333333333},{"time":96},{"time":97.33333333333333,"value":-0.32},{"time":98.66666666666666},{"time":101.33333333333333},{"time":104}]}],["Camera/rot/p",{"items":[{},{"time":21.333333333333332,"length":5.333333333333332,"curve":23,"speed":0.2499999999999999,"amp":0.30000000000000004},{"time":26.666666666666664,"value":-2.3500000000000125},{"time":32,"length":5.333333333333329,"value":-0.3,"curve":23,"speed":0.2499999999999999,"amp":0.30000000000000004},{"time":42.666666666666664,"length":2.6666666666666643,"curve":29},{"time":45.33333333333333,"length":2.6666666666666714,"value":-0.9690196078431373,"curve":29},{"time":48,"length":2.6666666666666714,"curve":29},{"time":50.66666666666667,"length":2.6666666666666714,"value":-0.39117647058823524,"curve":29},{"time":53.33333333333334,"length":2.6666666666666714,"value":-0.12117647058823516,"curve":29},{"time":56.000000000000014,"length":2.6666666666666714,"value":-1.4311764705882353,"curve":29},{"time":58.666666666666686,"length":2.6666666666666714,"value":-0.29117647058823515,"curve":29},{"time":61.33333333333336,"length":2.6666666666666714,"value":-0.031176470588234743,"curve":29},{"time":85.33333333333333},{"time":86.66666666666666,"length":1.3333333333333428,"curve":25,"amp":6},{"time":88},{"time":90.66666666666666},{"time":93.33333333333333},{"time":96},{"time":97.33333333333333,"length":1.3333333333333428,"curve":25,"amp":6},{"time":98.66666666666667},{"time":101.33333333333333},{"time":104}]}],["Camera/roll",{"items":[{"length":21.333333333333332,"curve":26,"speed":0.1875},{"time":96},{"time":97.33333333333333,"value":-0.26000000000000006},{"time":98.66825555990165}]}],["IFSPistons/undefined/rot",{"items":[]}],["Camera/shake",{"items":[{},{"time":42.666666666666664,"length":1,"curve":36},{"time":45.33333333333333,"length":1,"curve":36},{"time":48,"length":1,"curve":36},{"time":50.666666666666664,"length":1,"curve":36},{"time":53.33333333333333,"length":1,"curve":36},{"time":56,"length":1,"curve":36},{"time":58.666666666666664,"length":1,"curve":36},{"time":61.33333333333333,"length":1,"curve":36}]}]],"labels":{"zero":0},"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 +{"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.30518542366057444],[0.16666666666666666],[0.3333333333333333,0.32598769865660215],[0.3333333333333333],[0.5833333333333333,0.48088974335080736],[0.5833333333333333,0.04062113856815275],[0.8333333333333333,0.3056520287525164,-0.13535287808567942,-0.12209691113150735],[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]]}],"channels":[["EnvironmentMap/accumulate",{"items":[{"length":1,"value":0.1,"curve":31,"amp":0.9},{"time":42.666666666666664,"length":1,"value":0.1,"curve":31,"amp":0.9}]}],["Glitch/amp",{"items":[{},{"time":42.666666666666664,"length":1,"curve":0},{"time":45.33333333333333,"length":1,"curve":0},{"time":48,"length":1,"curve":0},{"time":50.666666666666664,"length":1,"curve":0},{"time":53.33333333333333,"length":1,"curve":0},{"time":56,"length":1,"curve":0},{"time":58.666666666666664,"length":1,"curve":0},{"time":61.33333333333333,"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":72,"length":1,"curve":0},{"time":74.66666666666666,"length":1,"curve":0},{"time":77.33333333333333,"length":1,"curve":0},{"time":80,"length":1,"curve":0},{"time":82.66666666666666,"length":1,"curve":0},{"time":256}]}],["PixelSorter/amp",{"items":[{},{"time":42.666666666666664,"length":1.3333333333333357,"curve":13,"speed":0.4999999999999975},{"time":45.33333333333333,"length":1.3333333333333357,"curve":13,"speed":0.4999999999999975},{"time":48,"length":1.3333333333333357,"curve":13,"speed":0.4999999999999975},{"time":50.666666666666664,"length":1.3333333333333357,"curve":13,"speed":0.4999999999999975},{"time":53.33333333333333,"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.33333333333333,"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":72,"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":80,"length":1.3333333333333357,"curve":13,"speed":0.4999999999999975},{"time":82.66666666666666,"length":1.3333333333333357,"curve":13,"speed":0.4999999999999975}]}],["Serial/enable",{"items":[{},{"time":86.66666666666666,"length":1.3333333333333428},{"time":89.33333333333333,"length":1.3333333333333428},{"time":92,"length":1.3333333333333428},{"time":94.66666666666666,"length":1.3333333333333428},{"time":97.33333333333333,"length":1.3333333333333428},{"time":100,"length":1.3333333333333428},{"time":102.66666666666666,"length":1.3333333333333428},{"time":105.33333333333333,"length":1.3333333333333428}]}],["LightsFirst/active",{"items":[{"length":42.666666666666664}]}],["Condition/active",{"items":[{"length":42.666666666666664}]}],["Cube/active",{"items":[{"length":42.666666666666664}]}],["Sync/first/clap",{"items":[{},{"time":22.333333333333332,"length":1.3333333333333321,"curve":19},{"time":23.666666666666664,"length":1.3333333333333321,"value":1,"curve":19},{"time":24.999999999999996,"length":1.3333333333333321,"value":2,"curve":19},{"time":26.33333333333333,"length":1.3333333333333321,"value":3,"curve":19},{"time":27.66666666666666,"length":1.3333333333333321,"value":4,"curve":19},{"time":28.999999999999993,"length":1.3333333333333321,"value":5,"curve":19},{"time":30.333333333333325,"length":1.3333333333333321,"value":6,"curve":19},{"time":31.666666666666657,"length":1.3333333333333321,"value":7,"curve":19},{"time":32.999999999999986,"length":1.3333333333333321,"value":8,"curve":19},{"time":34.333333333333314,"length":1.3333333333333321,"value":9,"curve":19},{"time":35.66666666666664,"length":1.3333333333333321,"value":10,"curve":19},{"time":36.99999999999997,"length":1.3333333333333321,"value":11,"curve":19}]}],["Condition/hahaRatio",{"items":[{},{"time":37.33333333333333,"length":4,"curve":30}]}],["Condition/phaseWidth",{"items":[{"value":0.1},{"time":22.333333333333332,"length":20.333333333333332,"value":0.1,"curve":20,"speed":0.049180327868852465,"amp":0.5888750576601328}]}],["LightsPink/active",{"items":[{},{"time":42.666666666666664,"length":42.666666666666664}]}],["Wobbleball/active",{"items":[{},{"time":42.666666666666664,"length":42.666666666666664}]}],["SufferTexts/active",{"items":[{},{"time":42.666666666666664,"length":42.666666666666664}]}],["sufferText/push",{"items":[{"time":42.666666666666664},{"time":45.33333333333333,"value":1},{"time":48,"value":2},{"time":50.666666666666664,"value":3},{"time":53.33333333333333,"value":4},{"time":56,"value":5},{"time":58.666666666666664,"value":6},{"time":61.33333333333333,"value":7},{"time":64,"value":8},{"time":66.66666666666666,"value":9},{"time":69.33333333333333,"value":10},{"time":72,"value":11},{"time":74.66666666666666,"value":12},{"time":77.33333333333333,"value":13},{"time":80,"value":14},{"time":82.66666666666666,"value":15}]}],["IFSPistons/active",{"items":[{},{"time":42.666666666666664,"length":42.666666666666664}]}],["IFSPistons/group0/rot",{"items":[{},{"time":43.33333333333333,"length":2,"curve":28},{"time":48.666666666666664,"length":2,"value":1,"curve":28},{"time":54,"length":2,"value":2,"curve":28},{"time":59.33333333333333,"length":2,"value":3,"curve":28},{"time":64.66666666666666,"length":2,"value":4,"curve":28},{"time":70,"length":2,"value":5,"curve":28},{"time":75.33333333333333,"length":2,"value":6,"curve":28},{"time":80.66666666666666,"length":2,"value":7.319482115535903,"curve":28,"amp":0.6805178844640967}]}],["IFSPistons/group1/rot",{"items":[{},{"time":46,"length":2,"curve":28},{"time":51.33333333333333,"length":2,"value":1,"curve":28},{"time":56.666666666666664,"length":2,"value":2,"curve":28},{"time":62,"length":2,"value":3,"curve":28},{"time":67.33333333333333,"length":2,"value":4,"curve":28},{"time":72.66666666666666,"length":2,"value":5,"curve":28},{"time":78,"length":2,"value":6,"curve":28},{"time":83.33333333333333,"length":2,"value":7,"curve":28}]}],["IFSPistons/group0/pos",{"items":[{"value":3},{"time":42.33333333333333,"length":2.3333333333333357,"value":1.5,"curve":27,"amp":1.5},{"time":47.666666666666664,"length":2.3333333333333357,"value":1.5,"curve":27,"amp":1.5},{"time":53,"length":2.3333333333333357,"value":1.5,"curve":27,"amp":1.5},{"time":58.33333333333333,"length":2.3333333333333357,"value":1.5,"curve":27,"amp":1.5},{"time":63.7,"length":2.3333333333333357,"value":1.5,"curve":27,"amp":1.5},{"time":69,"length":2.3333333333333357,"value":1.5,"curve":27,"amp":1.5},{"time":74.33333333333333,"length":2.3333333333333357,"value":1.5,"curve":27,"amp":1.5},{"time":79.66666666666666,"length":2.3333333333333357,"value":1.5,"curve":27,"amp":1.5}]}],["IFSPistons/group1/pos",{"items":[{"value":3},{"time":45,"length":2.3333333333333357,"value":1.5,"curve":27,"amp":1.5},{"time":50.33333333333333,"length":2.3333333333333357,"value":1.5,"curve":27,"amp":1.5},{"time":55.666666666666664,"length":2.3333333333333357,"value":1.5,"curve":27,"amp":1.5},{"time":61,"length":2.3333333333333357,"value":1.5,"curve":27,"amp":1.5},{"time":66.33333333333333,"length":2.3333333333333357,"value":1.5,"curve":27,"amp":1.5},{"time":71.66666666666666,"length":2.3333333333333357,"value":1.5,"curve":27,"amp":1.5},{"time":77,"length":2.3333333333333357,"value":1.5,"curve":27,"amp":1.5},{"time":82.33333333333333,"length":2.3333333333333357,"value":1.5,"curve":27,"amp":1.5}]}],["Music/NEURO_TIME",{"items":[{},{"time":42.666666666666664,"length":10.666666666666664,"curve":2},{"time":53.33333333333333,"length":8.666666666666671,"curve":2},{"time":62,"length":1.999999999999993,"curve":9},{"time":63.99999999999999,"length":10.666666666666664,"curve":2},{"time":74.66666666666666,"length":8.666666666666671,"curve":2},{"time":83.33333333333333,"length":1.999999999999993,"curve":9},{"time":85.33333333333331,"length":1.3333333333333428,"curve":14},{"time":86.66666666666666,"length":1.3333333333333286,"curve":18},{"time":87.99999999999999,"length":1.3333333333333428,"curve":14},{"time":90.66666666666666,"length":1.3333333333333428,"curve":14},{"time":92,"length":1.3333333333333286,"curve":32},{"time":93.33333333333333,"length":1.3333333333333428,"curve":14},{"time":96,"length":1.3333333333333428,"curve":14},{"time":97.33333333333334,"length":1.3333333333333144,"curve":18},{"time":98.66666666666666,"length":1.3333333333333428,"curve":14},{"time":101.33333333333333,"length":1.3333333333333428,"curve":14},{"time":102.66666666666667,"length":1.3333333333333286,"curve":32},{"time":104,"length":1.3333333333333428,"curve":14}]}],["Music/NEURO_DETUNE",{"items":[{},{"time":42.666666666666664,"length":10.666666666666664,"curve":3},{"time":53.33333333333333,"length":8.666666666666671,"curve":3},{"time":62,"length":1.999999999999993,"curve":10},{"time":63.99999999999999,"length":10.666666666666664,"curve":3},{"time":74.66666666666666,"length":8.666666666666671,"curve":3},{"time":83.33333333333333,"length":1.999999999999993,"curve":10},{"time":85.33333333333333,"length":1.3333333333333286,"curve":15},{"time":88,"length":1.3333333333333286,"curve":15},{"time":90.66666666666666,"length":1.3333333333333286,"curve":15},{"time":91.99999999999999,"length":1.3333333333333428,"value":0.7799999999999995},{"time":93.33333333333333,"length":1.3333333333333286,"curve":15},{"time":96,"length":1.3333333333333286,"curve":15},{"time":98.66666666666666,"length":1.3333333333333286,"curve":15},{"time":101.33333333333333,"length":1.3333333333333286,"curve":15},{"time":102.66666666666666,"length":1.3333333333333428,"value":0.7799999999999995},{"time":104,"length":1.3333333333333286,"curve":15}]}],["Music/NEURO_DETUNE_PHASE",{"items":[{},{"time":42.666666666666664,"length":10.666666666666664,"curve":8},{"time":53.33333333333333,"length":8.666666666666671,"curve":8},{"time":62,"length":1.999999999999993,"curve":11},{"time":63.99999999999999,"length":10.666666666666664,"curve":8},{"time":74.66666666666666,"length":8.666666666666671,"curve":8},{"time":83.33333333333333,"length":1.999999999999993,"curve":11},{"time":85.33333333333333,"length":1.3333333333333428,"curve":16},{"time":88,"length":1.3333333333333428,"curve":16},{"time":90.66666666666666,"length":1.3333333333333428,"curve":16},{"time":93.33333333333333,"length":1.3333333333333428,"curve":16},{"time":96,"length":1.3333333333333428,"curve":16},{"time":98.66666666666666,"length":1.3333333333333428,"curve":16},{"time":101.33333333333333,"length":1.3333333333333428,"curve":16},{"time":102.66666666666667,"length":1.3333333333333286},{"time":104,"length":1.3333333333333428,"curve":16}]}],["Music/NEURO_WUB_AMP",{"items":[{},{"time":42.666666666666664,"length":10.668578038364203,"curve":4},{"time":53.33524470503087,"length":8.664755294969133,"curve":4},{"time":62,"length":2.0038227433950624,"curve":12},{"time":64.00382274339506,"length":10.668578038364203,"curve":4},{"time":74.67240078175926,"length":8.660932551574064,"curve":4},{"time":83.33333333333333,"length":2.0038227433950624,"curve":12},{"time":85.33715607672839,"length":1.3333333333333428,"curve":17},{"time":88,"length":1.3333333333333333,"curve":17},{"time":90.66666666666666,"length":1.3333333333333333,"curve":17},{"time":91.99999999999999,"length":1.3333333333333428,"curve":33},{"time":93.33333333333333,"length":1.3333333333333333,"curve":17},{"time":96,"length":1.3333333333333333,"curve":17},{"time":98.66666666666666,"length":1.3333333333333333,"curve":17},{"time":101.33333333333333,"length":1.3333333333333333,"curve":17},{"time":102.66666666666666,"length":1.3333333333333428,"curve":33},{"time":104,"length":1.3333333333333333,"curve":17}]}],["Music/NEURO_WUB_FREQ",{"items":[{},{"time":42.666666666666664,"length":2,"value":1},{"time":44.666666666666664,"length":0.6666666666666643,"value":0.49999999999999967},{"time":45.33333333333333,"length":0.6666666666666714,"value":1},{"time":46,"length":1.3333333333333286,"value":2},{"time":47.33333333333333,"length":0.6666666666666714,"value":2.5},{"time":48,"length":0.6666666666666643,"value":1},{"time":48.666666666666664,"length":1.3333333333333357,"value":1},{"time":50,"length":0.6666666666666643,"value":2},{"time":50.666666666666664,"length":2,"value":1},{"time":52.666666666666664,"length":0.6666666666666643,"value":2},{"time":53.33333333333333,"length":0.6666666666666714,"value":1},{"time":54,"length":1.3333333333333286,"value":2.1000000000000014},{"time":55.33333333333333,"length":0.6666666666666714,"value":0.5},{"time":56,"length":0.6666666666666643,"value":7},{"time":56.666666666666664,"length":1.3333333333333357,"value":3},{"time":58,"length":0.6666666666666714,"value":1},{"time":58.66666666666667,"length":0.6666666666666714,"value":0.9600000000000006},{"time":59.33333333333334,"length":1.3333333333333215,"value":6},{"time":60.666666666666664,"length":0.6666666666666785,"value":10.840000000000003},{"time":61.33333333333334,"length":0.6666666666666572,"value":1},{"time":62,"length":1.3333333333333428,"value":3.989999999999996},{"time":63.33333333333334,"length":0.6666666666666572,"value":4.109999999999999},{"time":64,"length":2,"value":1},{"time":66,"length":0.6666666666666643,"value":0.49999999999999967},{"time":66.66666666666666,"length":0.6666666666666714,"value":1},{"time":67.33333333333333,"length":1.3333333333333286,"value":2},{"time":68.66666666666666,"length":0.6666666666666714,"value":2.5},{"time":69.33333333333333,"length":0.6666666666666643,"value":1},{"time":70,"length":1.3333333333333357,"value":1},{"time":71.33333333333334,"length":0.6666666666666643,"value":2},{"time":72,"length":2,"value":1},{"time":74,"length":0.6666666666666643,"value":2},{"time":74.66666666666666,"length":0.6666666666666714,"value":1},{"time":75.33333333333333,"length":1.3333333333333286,"value":2.1000000000000014},{"time":76.66666666666666,"length":0.6666666666666714,"value":0.5},{"time":77.33333333333333,"length":0.6666666666666643,"value":7},{"time":78,"length":1.3333333333333357,"value":3},{"time":79.33333333333334,"length":0.6666666666666714,"value":1},{"time":80.00000000000001,"length":0.6666666666666714,"value":0.9600000000000006},{"time":80.66666666666669,"length":1.3333333333333144,"value":6},{"time":82,"length":0.6666666666666856,"value":10.840000000000003},{"time":82.66666666666669,"length":0.6666666666666572,"value":1},{"time":83.33333333333334,"length":1.3333333333333428,"value":3.9899999999999993},{"time":84.66666666666669,"length":0.6666666666666572,"value":4.109999999999999},{"time":85.33333333333334,"length":1.3333333333333144,"value":1},{"time":88,"length":1.3333333333333144,"value":1},{"time":90.66666666666666,"length":1.3333333333333144,"value":1},{"time":93.33333333333333,"length":1.3333333333333144,"value":1},{"time":96,"length":1.3333333333333144,"value":1},{"time":98.66666666666666,"length":1.3333333333333144,"value":1},{"time":101.33333333333333,"length":1.3333333333333144,"value":1},{"time":104,"length":1.3333333333333144,"value":1}]}],["Trails/active",{"items":[{}]}],["Rings/active",{"items":[{},{"time":106.66666666666666,"length":42.666666666666664}]}],["FlickyParticles/active",{"items":[{},{"time":42.666666666666664,"length":42.666666666666664},{"time":85.33333333333333,"length":1.3333333333333286},{"time":88,"length":1.3333333333333286},{"time":90.66666666666666,"length":1.3333333333333286},{"time":93.33333333333333,"length":1.3333333333333286},{"time":96,"length":1.3333333333333286},{"time":98.66666666666666,"length":1.3333333333333286},{"time":101.33333333333333,"length":1.3333333333333286},{"time":104,"length":1.3333333333333286},{"time":106.66666666666666,"length":5.333333333333343}]}],["SphereParticles/active",{"items":[{},{"time":85.33333333333333,"length":42.666666666666664}]}],["FlashyTerrain/active",{"items":[{},{"time":86.66666666666666,"length":1.3333333333333428},{"time":97.33333333333333,"length":1.3333333333333428}]}],["Camera/pos/x",{"items":[{},{"time":42.666666666666664,"value":-0.7200000000000002},{"time":45.33333333333333,"value":0.22},{"time":48,"value":0.18999999999999975},{"time":53.33333333333333,"value":0.030000000000000478},{"time":56,"value":0.4300000000000005},{"time":58.666666666666664,"value":-0.3099999999999998}]}],["Camera/pos/y",{"items":[{},{"time":42.666666666666664},{"time":48,"value":0.18999999999999986},{"time":53.33333333333333},{"time":97.33333333333333,"value":0.8799999999999999}]}],["Camera/pos/z",{"items":[{},{"time":42.666666666666664},{"time":58.666666666666664,"value":0.5}]}],["Camera/rot/r",{"items":[{"length":4,"value":5,"curve":21,"amp":10},{"time":20.700000000000003,"length":4,"value":5,"curve":22,"amp":-2},{"time":36.666666666666664,"length":4,"value":3,"curve":22,"amp":4},{"time":42.666666666666664,"value":5},{"time":45.33333333333333,"value":5.6},{"time":48,"value":3.5400000000000005},{"time":50.666666666666664,"value":6.480000000000007},{"time":53.33333333333333,"value":5},{"time":56,"value":5.6},{"time":58.666666666666664,"value":3.630000000000001},{"time":61.33333333333333,"value":6.600000000000005},{"time":85.33333333333333,"length":1.3333333333333286,"value":5,"curve":21,"speed":3.000000000000011,"amp":5},{"time":88,"length":1.3333333333333286,"value":5,"curve":21,"speed":3.000000000000011,"amp":5},{"time":90.66666666666667,"length":1.3333333333333286,"value":5,"curve":21,"speed":3.000000000000011,"amp":5},{"time":93.33333333333334,"length":1.3333333333333144,"value":5,"curve":21,"speed":3.000000000000011,"amp":5},{"time":96.00000000000001,"length":1.3333333333333144,"value":5,"curve":21,"speed":3.000000000000011,"amp":5},{"time":98.66666666666669,"length":1.3333333333333144,"value":5,"curve":21,"speed":3.000000000000011,"amp":5},{"time":101.33333333333336,"length":1.3333333333333002,"value":5,"curve":21,"speed":3.000000000000011,"amp":5},{"time":104.00000000000003,"length":1.3333333333333002,"value":5,"curve":21,"speed":3.000000000000011,"amp":5}]}],["Camera/rot/t",{"items":[{},{"time":21.333333333333332,"length":5.333333333333332,"curve":23,"speed":0.2499999999999999,"amp":0.30000000000000004},{"time":26.666666666666664,"length":5.333333333333332,"value":1.2000000000000002,"curve":23,"speed":0.2499999999999999,"amp":-0.9},{"time":32,"length":5.333333333333329,"value":-0.3,"curve":23,"speed":0.2499999999999999,"amp":0.30000000000000004},{"time":42.666666666666664,"value":0.12000000000000001},{"time":45.33333333333333,"value":-0.30999999999999495},{"time":48,"value":0.5200000000000048},{"time":50.666666666666664,"value":-0.029999999999995274},{"time":53.33333333333333,"value":0.2600000000000046},{"time":56,"value":-0.2899999999999953},{"time":58.666666666666664,"value":0.9900000000000047},{"time":61.33333333333333,"value":-0.029999999999995274},{"time":85.33333333333333},{"time":86.66666666666666,"value":0.5700000000000002},{"time":88},{"time":90.66666666666666},{"time":93.33333333333333},{"time":96},{"time":97.33333333333333,"value":-0.32},{"time":98.66666666666666},{"time":101.33333333333333},{"time":104}]}],["Camera/rot/p",{"items":[{},{"time":21.333333333333332,"length":5.333333333333332,"curve":23,"speed":0.2499999999999999,"amp":0.30000000000000004},{"time":26.666666666666664,"value":-2.3500000000000125},{"time":32,"length":5.333333333333329,"value":-0.3,"curve":23,"speed":0.2499999999999999,"amp":0.30000000000000004},{"time":42.666666666666664,"length":2.6666666666666643,"curve":29},{"time":45.33333333333333,"length":2.6666666666666714,"value":-0.9690196078431373,"curve":29},{"time":48,"length":2.6666666666666714,"curve":29},{"time":50.66666666666667,"length":2.6666666666666714,"value":-0.39117647058823524,"curve":29},{"time":53.33333333333334,"length":2.6666666666666714,"value":-0.12117647058823516,"curve":29},{"time":56.000000000000014,"length":2.6666666666666714,"value":-1.4311764705882353,"curve":29},{"time":58.666666666666686,"length":2.6666666666666714,"value":-0.29117647058823515,"curve":29},{"time":61.33333333333336,"length":2.6666666666666714,"value":-0.031176470588234743,"curve":29},{"time":85.33333333333333},{"time":86.66666666666666,"length":1.3333333333333428,"curve":25,"amp":6},{"time":88},{"time":90.66666666666666},{"time":93.33333333333333},{"time":96},{"time":97.33333333333333,"length":1.3333333333333428,"curve":25,"amp":6},{"time":98.66666666666667},{"time":101.33333333333333},{"time":104}]}],["Camera/roll",{"items":[{"length":21.333333333333332,"curve":26,"speed":0.1875},{"time":96},{"time":97.33333333333333,"value":-0.26000000000000006},{"time":98.66825555990165}]}],["IFSPistons/undefined/rot",{"items":[]}],["Camera/shake",{"items":[{},{"time":42.666666666666664,"length":1,"curve":36},{"time":45.33333333333333,"length":1,"curve":36},{"time":48,"length":1,"curve":36},{"time":50.666666666666664,"length":1,"curve":36},{"time":53.33333333333333,"length":1,"curve":36},{"time":56,"length":1,"curve":36},{"time":58.666666666666664,"length":1,"curve":36},{"time":61.33333333333333,"length":1,"curve":36}]}]],"labels":{"zero":0},"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 6a0ac08..e430a01 100644 --- a/src/config-hot.ts +++ b/src/config-hot.ts @@ -4,8 +4,8 @@ export const RTINSPECTOR_CAPTURE_NAME: string | null = null, // RTINSPECTOR_CAPTURE_NAME: string | null = 'Bloom/swap1', // RTINSPECTOR_CAPTURE_NAME: string | null = 'main/postSwap0', - // RTINSPECTOR_CAPTURE_NAME: string | null = 'CameraEntity/cameraTarget', + // RTINSPECTOR_CAPTURE_NAME: string | null = 'DeferredCamera/cameraTarget', RTINSPECTOR_CAPTURE_INDEX = 0, COMPONENT_UPDATE_BREAKPOINT: string | null = null, - // COMPONENT_UPDATE_BREAKPOINT: string | null = 'Bloom/quadUp1', + // COMPONENT_UPDATE_BREAKPOINT: string | null = 'ForwardCamera/camera', COMPONENT_DRAW_BREAKPOINT: string | null = null; diff --git a/src/config.ts b/src/config.ts index 13cbbd9..f65f496 100644 --- a/src/config.ts +++ b/src/config.ts @@ -5,7 +5,7 @@ export const AO_RESOLUTION_RATIO = 1.0, RESOLUTION = [ 1280, 720 ], MUSIC_BPM = 180, - START_POSITION = 36, + START_POSITION = 45, MUSIC_LENGTH = 213, MUSIC_AUTOMATON_TEXTURE_HEIGHT = 16, IBLLUT_ITER = 400, diff --git a/src/entities/Condition.ts b/src/entities/Condition.ts index 856548b..98ddf6c 100644 --- a/src/entities/Condition.ts +++ b/src/entities/Condition.ts @@ -102,7 +102,7 @@ export class Condition extends Entity { geometry.primcount = 12 * 16; // -- create materials ------------------------------------------------------------------------- - const forward = new Material( + const cubemap = new Material( conditionVert, conditionFrag, { @@ -129,7 +129,7 @@ export class Condition extends Entity { }, ); - const materials = { forward, deferred, depth }; + const materials = { cubemap, deferred, depth }; objectValuesMap( materials, ( material ) => { material.addUniformTexture( 'samplerSvg', texture ); @@ -155,7 +155,7 @@ export class Condition extends Entity { '../shaders/condition.frag', ], () => { - forward.replaceShader( conditionVert, conditionFrag ); + cubemap.replaceShader( conditionVert, conditionFrag ); deferred.replaceShader( conditionVert, conditionFrag ); depth.replaceShader( conditionVert, conditionFrag ); }, diff --git a/src/entities/CubemapCameraEntity.ts b/src/entities/CubemapCameraEntity.ts index 707b8fb..3f1b5c0 100644 --- a/src/entities/CubemapCameraEntity.ts +++ b/src/entities/CubemapCameraEntity.ts @@ -3,7 +3,6 @@ import { CubemapCamera } from '../heck/components/CubemapCamera'; import { CubemapRenderTarget } from '../heck/CubemapRenderTarget'; import { Entity } from '../heck/Entity'; import { LightEntity } from './LightEntity'; -import { PerspectiveCamera } from '../heck/components/PerspectiveCamera'; export interface CubemapCameraEntityOptions { scenes: Entity[]; @@ -12,7 +11,7 @@ export interface CubemapCameraEntityOptions { export class CubemapCameraEntity extends Entity { public scenes: Entity[]; - public camera: PerspectiveCamera; + public camera: CubemapCamera; public readonly target: CubemapRenderTarget; public constructor( options: CubemapCameraEntityOptions ) { @@ -31,7 +30,7 @@ export class CubemapCameraEntity extends Entity { near: 1.0, far: 20.0, name: 'CubemapCameraEntity/camera', - materialTag: 'forward', + materialTag: 'cubemap', } ); this.components.push( this.camera ); } diff --git a/src/entities/DeferredCamera.ts b/src/entities/DeferredCamera.ts index 08c21ad..096d1f4 100644 --- a/src/entities/DeferredCamera.ts +++ b/src/entities/DeferredCamera.ts @@ -25,10 +25,12 @@ export interface DeferredCameraOptions { } export class DeferredCamera extends Entity { + public cameraTarget: BufferRenderTarget; + public constructor( options: DeferredCameraOptions ) { super(); - const cameraTarget = new BufferRenderTarget( { + this.cameraTarget = new BufferRenderTarget( { width: options.target.width, height: options.target.height, numBuffers: 4, @@ -37,7 +39,7 @@ export class DeferredCamera extends Entity { const camera = new PerspectiveCamera( { scenes: options.scenes, - renderTarget: cameraTarget, + renderTarget: this.cameraTarget, near: 0.1, far: 20.0, name: 'DeferredCamera/camera', @@ -75,7 +77,7 @@ export class DeferredCamera extends Entity { for ( let i = 0; i < 2; i ++ ) { // it doesn't need 2 and 3 aoMaterial.addUniformTexture( 'sampler' + i, - cameraTarget.getTexture( gl.COLOR_ATTACHMENT0 + i ) + this.cameraTarget.getTexture( gl.COLOR_ATTACHMENT0 + i ) ); } @@ -161,6 +163,12 @@ export class DeferredCamera extends Entity { lights.map( ( light ) => light.color ).flat(), ); + shadingMaterial.addUniformVector( + 'lightParams', + '4fv', + lights.map( ( light ) => [ light.spotness, 0.0, 0.0, 0.0 ] ).flat(), + ); + shadingMaterial.addUniformMatrixVector( 'lightPV', 'Matrix4fv', @@ -182,7 +190,7 @@ export class DeferredCamera extends Entity { for ( let i = 0; i < 4; i ++ ) { shadingMaterial.addUniformTexture( 'sampler' + i, - cameraTarget.getTexture( gl.COLOR_ATTACHMENT0 + i ) + this.cameraTarget.getTexture( gl.COLOR_ATTACHMENT0 + i ) ); } diff --git a/src/entities/FlickyParticles.ts b/src/entities/FlickyParticles.ts index f331f10..7bc9682 100644 --- a/src/entities/FlickyParticles.ts +++ b/src/entities/FlickyParticles.ts @@ -3,7 +3,7 @@ import { GPUParticles } from './GPUParticles'; import { InstancedGeometry } from '../heck/InstancedGeometry'; import { Material } from '../heck/Material'; import { TRIANGLE_STRIP_QUAD } from '@fms-cat/experimental'; -import { dummyRenderTarget, dummyRenderTargetFourDrawBuffers } from '../globals/dummyRenderTarget'; +import { dummyRenderTarget } from '../globals/dummyRenderTarget'; import { gl, glCat } from '../globals/canvas'; import { objectValuesMap } from '../utils/objectEntriesMap'; import { quadGeometry } from '../globals/quadGeometry'; @@ -78,25 +78,16 @@ export class FlickyParticles extends Entity { }, ); - const deferred = new Material( + const depth = new Material( flickyParticleRenderVert, flickyParticleRenderFrag, { - defines: [ 'DEFERRED 1' ], - initOptions: { geometry: geometryRender, target: dummyRenderTargetFourDrawBuffers }, - }, - ); - - const shadow = new Material( - flickyParticleRenderVert, - flickyParticleRenderFrag, - { - defines: [ 'SHADOW 1' ], + defines: [ 'DEPTH 1' ], initOptions: { geometry: geometryRender, target: dummyRenderTarget }, }, ); - const materialsRender = { forward, deferred, shadow }; + const materialsRender = { forward, cubemap: forward, depth }; objectValuesMap( materialsRender, ( material ) => { material.addUniformTexture( 'samplerRandomStatic', randomTextureStatic.texture ); @@ -111,8 +102,7 @@ export class FlickyParticles extends Entity { ], () => { forward.replaceShader( flickyParticleRenderVert, flickyParticleRenderFrag ); - deferred.replaceShader( flickyParticleRenderVert, flickyParticleRenderFrag ); - shadow.replaceShader( flickyParticleRenderVert, flickyParticleRenderFrag ); + depth.replaceShader( flickyParticleRenderVert, flickyParticleRenderFrag ); } ); } diff --git a/src/entities/ForwardCamera.ts b/src/entities/ForwardCamera.ts index 17bb341..5c3335f 100644 --- a/src/entities/ForwardCamera.ts +++ b/src/entities/ForwardCamera.ts @@ -18,7 +18,7 @@ export class ForwardCamera extends Entity { renderTarget: options.target, near: 0.1, far: 20.0, - name: 'CameraEntity/camera', + name: 'ForwardCamera/camera', materialTag: 'forward', } ); camera.clear = false; diff --git a/src/entities/LightEntity.ts b/src/entities/LightEntity.ts index 70b62be..b270086 100644 --- a/src/entities/LightEntity.ts +++ b/src/entities/LightEntity.ts @@ -14,22 +14,34 @@ export interface LightEntityOptions { shadowMapFov?: number; shadowMapNear?: number; shadowMapFar?: number; - shadowMapWidth?: number; - shadowMapHeight?: number; + shadowMapSize?: number; namePrefix?: string; } export class LightEntity extends Entity { + public spotness: number = 0.0; public color: [ number, number, number ] = [ 1.0, 1.0, 1.0 ]; public camera: PerspectiveCamera; public shadowMap: BufferRenderTarget; + public get shadowMapFov(): number { + return this.camera.fov; + } + + public get shadowMapNear(): number { + return this.camera.near; + } + + public get shadowMapFar(): number { + return this.camera.far; + } + public constructor( options: LightEntityOptions ) { super(); const swapOptions = { - width: options.shadowMapWidth ?? 1024, - height: options.shadowMapHeight ?? 1024 + width: options.shadowMapSize ?? 1024, + height: options.shadowMapSize ?? 1024, }; const swap = new Swap( diff --git a/src/entities/LightShaft.ts b/src/entities/LightShaft.ts new file mode 100644 index 0000000..c098fbf --- /dev/null +++ b/src/entities/LightShaft.ts @@ -0,0 +1,106 @@ +import { BufferRenderTarget } from '../heck/BufferRenderTarget'; +import { Entity } from '../heck/Entity'; +import { Geometry } from '../heck/Geometry'; +import { Lambda } from '../heck/components/Lambda'; +import { LightEntity } from './LightEntity'; +import { Material } from '../heck/Material'; +import { Mesh } from '../heck/components/Mesh'; +import { dummyRenderTarget } from '../globals/dummyRenderTarget'; +import { genCube } from '../geometries/genCube'; +import { gl } from '../globals/canvas'; +import { randomTexture } from '../globals/randomTexture'; +import lightShaftFrag from '../shaders/light-shaft.frag'; +import lightShaftVert from '../shaders/light-shaft.vert'; + +interface LightShaftOptions { + light: LightEntity; + namePrefix?: string; +} + +export class LightShaft extends Entity { + private __forward: Material; + + public constructor( { light, namePrefix }: LightShaftOptions ) { + super(); + + // -- geometry --------------------------------------------------------------------------------- + const cube = genCube(); + + const geometry = new Geometry(); + + geometry.vao.bindVertexbuffer( cube.position, 0, 3 ); + geometry.vao.bindIndexbuffer( cube.index ); + + geometry.count = cube.count; + geometry.mode = cube.mode; + geometry.indexType = cube.indexType; + + // -- materials -------------------------------------------------------------------------------- + const forward = this.__forward = new Material( + lightShaftVert, + lightShaftFrag, + { + initOptions: { geometry: geometry, target: dummyRenderTarget }, + blend: [ gl.ONE, gl.ONE ], + }, + ); + + forward.addUniformTexture( 'samplerRandom', randomTexture.texture ); + forward.addUniformTexture( 'samplerShadow', light.shadowMap.texture ); + + const materials = { forward }; + + // -- updater ---------------------------------------------------------------------------------- + this.components.push( new Lambda( { + onDraw: ( event ) => { + forward.addUniform( 'lightFov', '1f', light.shadowMapFov ); + forward.addUniform( 'lightNearFar', '2f', light.shadowMapNear, light.shadowMapFar ); + forward.addUniform( 'lightPos', '3f', ...light.globalTransformCache.position.elements ); + forward.addUniform( 'lightColor', '3f', ...light.color ); + + forward.addUniformMatrixVector( + 'lightPV', + 'Matrix4fv', + light.camera.projectionMatrix.multiply( + light.globalTransformCache.matrix.inverse! + ).elements, + ); + + forward.addUniform( + 'cameraNearFar', + '2f', + event.camera.near, + event.camera.far + ); + + forward.addUniformMatrixVector( + 'inversePVM', + 'Matrix4fv', + event.projectionMatrix + .multiply( event.viewMatrix ) + .multiply( event.globalTransform.matrix ) + .inverse! + .elements + ); + }, + name: process.env.DEV && `${ namePrefix }/updater`, + } ) ); + + // -- mesh ------------------------------------------------------------------------------------- + const mesh = new Mesh( { + geometry, + materials, + name: process.env.DEV && `${ namePrefix }/mesh`, + } ); + mesh.depthTest = false; + mesh.depthWrite = false; + this.components.push( mesh ); + } + + /** + * どうやってフレームバッファのデプスを取るかわかりませんでした 許してほしい + */ + public setDefferedCameraTarget( deferredCameraTarget: BufferRenderTarget ): void { + this.__forward.addUniformTexture( 'samplerDeferred0', deferredCameraTarget.texture ); + } +} diff --git a/src/entities/LightsFirst.ts b/src/entities/LightsFirst.ts new file mode 100644 index 0000000..5220727 --- /dev/null +++ b/src/entities/LightsFirst.ts @@ -0,0 +1,30 @@ +import { Entity } from '../heck/Entity'; +import { LightEntity } from './LightEntity'; +import { Vector3 } from '@fms-cat/experimental'; + +interface LightsFirstOptions { + scenes: Entity[]; +} + +export class LightsFirst extends Entity { + public readonly lights: LightEntity[]; + + public constructor( { scenes }: LightsFirstOptions ) { + super(); + + const light = new LightEntity( { + scenes, + shadowMapFov: 30.0, + shadowMapNear: 1.0, + shadowMapFar: 20.0, + namePrefix: process.env.DEV && 'lightFirst', + } ); + + light.color = [ 100.0, 100.0, 100.0 ]; + light.transform.lookAt( new Vector3( [ 4.0, 4.0, 4.0 ] ) ); + + this.children.push( light ); + + this.lights = [ light ]; + } +} diff --git a/src/entities/LightsPink.ts b/src/entities/LightsPink.ts new file mode 100644 index 0000000..440c376 --- /dev/null +++ b/src/entities/LightsPink.ts @@ -0,0 +1,61 @@ +import { BufferRenderTarget } from '../heck/BufferRenderTarget'; +import { Entity } from '../heck/Entity'; +import { LightEntity } from './LightEntity'; +import { LightShaft } from './LightShaft'; +import { Vector3 } from '@fms-cat/experimental'; + +interface LightsPinkOptions { + scenes: Entity[]; +} + +export class LightsPink extends Entity { + public readonly lights: LightEntity[]; + private readonly __shafts: LightShaft[]; + + public constructor( { scenes }: LightsPinkOptions ) { + super(); + + type TypeScriptSucks = [ [ number, number, number ], [ number, number, number ], boolean ][]; + + this.__shafts = []; + + this.lights = ( [ + [ [ 6000.0, 10.0, 200.0 ], [ 8.0, 4.0, -8.0 ], true ], + [ [ 6000.0, 10.0, 200.0 ], [ -8.0, 4.0, -8.0 ], true ], + [ [ 30.0, 30.0, 30.0 ], [ 0.0, 4.0, 4.0 ], false ], + ] as TypeScriptSucks ).map( ( [ color, pos, isSpot ], i ) => { + const light = new LightEntity( { + scenes, + shadowMapFov: isSpot ? 10.0 : 50.0, + shadowMapNear: 0.5, + shadowMapFar: 20.0, + shadowMapSize: isSpot ? 64 : 256, + namePrefix: process.env.DEV && `lightPink${ i }/light`, + } ); + + light.color = color; + light.spotness = isSpot ? 0.9 : 0.0; + light.transform.lookAt( new Vector3( pos ) ); + + this.children.push( light ); + + if ( isSpot ) { + const shaft = new LightShaft( { + light, + namePrefix: process.env.DEV && `lightPink${ i }/Shaft`, + } ); + + this.__shafts.push( shaft ); + light.children.push( shaft ); + } + + return light; + } ); + } + + public setDefferedCameraTarget( deferredCameraTarget: BufferRenderTarget ): void { + this.__shafts.map( ( shaft ) => { + shaft.setDefferedCameraTarget( deferredCameraTarget ); + } ); + } +} diff --git a/src/entities/Wobbleball.ts b/src/entities/Wobbleball.ts index bdc24ad..eb9c741 100644 --- a/src/entities/Wobbleball.ts +++ b/src/entities/Wobbleball.ts @@ -84,7 +84,7 @@ export class Wobbleball extends Entity { 'Matrix4fv', event.projectionMatrix .multiply( event.viewMatrix ) - .multiply( this.transform.matrix ) + .multiply( event.globalTransform.matrix ) .inverse! .elements ); diff --git a/src/heck/Material.ts b/src/heck/Material.ts index 074bd0a..490f3bc 100644 --- a/src/heck/Material.ts +++ b/src/heck/Material.ts @@ -8,6 +8,7 @@ import { injectCodeToShader } from '../utils/injectCodeToShader'; export type MaterialTag = | 'deferred' | 'forward' + | 'cubemap' | 'depth'; export type MaterialMap = { [ tag in MaterialTag ]?: Material }; diff --git a/src/heck/components/Mesh.ts b/src/heck/components/Mesh.ts index af9d6f3..4c6af0c 100644 --- a/src/heck/components/Mesh.ts +++ b/src/heck/components/Mesh.ts @@ -26,6 +26,8 @@ export class Mesh extends Component { public materials: MaterialMap; public cull: MeshCull = MeshCull.Back; + public depthWrite = true; + public depthTest = true; public constructor( options: MeshOptions ) { super( options ); @@ -56,6 +58,14 @@ export class Mesh extends Component { gl.cullFace( meshCullMap[ this.cull ] ); } + if ( this.depthTest ) { + gl.enable( gl.DEPTH_TEST ); + } else { + gl.disable( gl.DEPTH_TEST ); + } + + gl.depthMask( this.depthWrite ); + material.setUniforms(); program.uniform( 'time', '1f', event.time ); diff --git a/src/heck/components/PerspectiveCamera.ts b/src/heck/components/PerspectiveCamera.ts index e6aa046..5776b71 100644 --- a/src/heck/components/PerspectiveCamera.ts +++ b/src/heck/components/PerspectiveCamera.ts @@ -16,15 +16,16 @@ export interface PerspectiveCameraOptions extends ComponentOptions { } export class PerspectiveCamera extends Camera { + public readonly fov: number; public readonly near: number; public readonly far: number; public constructor( options: PerspectiveCameraOptions ) { - const projectionMatrix = Matrix4.perspective( - options.fov || 45.0, - options.near || 0.01, - options.far || 100.0, - ); + const fov = options.fov ?? 45.0; + const near = options.near ?? 0.01; + const far = options.far ?? 100.0; + + const projectionMatrix = Matrix4.perspective( fov, near, far ); super( { ...options, @@ -34,7 +35,8 @@ export class PerspectiveCamera extends Camera { clear: options.clear, } ); - this.near = options.near || 0.01; - this.far = options.far || 100.0; + this.fov = fov; + this.near = near; + this.far = far; } } diff --git a/src/heck/components/Quad.ts b/src/heck/components/Quad.ts index 3776205..16783d4 100644 --- a/src/heck/components/Quad.ts +++ b/src/heck/components/Quad.ts @@ -1,7 +1,7 @@ import { Component, ComponentOptions, ComponentUpdateEvent } from './Component'; import { Material } from '../Material'; import { RenderTarget } from '../RenderTarget'; -import { glCat } from '../../globals/canvas'; +import { gl, glCat } from '../../globals/canvas'; import { quadGeometry } from '../../globals/quadGeometry'; export interface QuadOptions extends ComponentOptions { @@ -37,6 +37,9 @@ export class Quad extends Component { this.target.bind(); this.material.setBlendMode(); + gl.enable( gl.DEPTH_TEST ); + gl.depthMask( true ); + if ( this.clear ) { glCat.clear( ...this.clear ); } diff --git a/src/music/Music.ts b/src/music/Music.ts index c5a158e..0e04ac0 100644 --- a/src/music/Music.ts +++ b/src/music/Music.ts @@ -110,6 +110,8 @@ export abstract class Music { if ( this.isPlaying ) { this.deltaTime = now - this.__prevAudioTime; this.time += this.deltaTime; + } else { + this.deltaTime = 0.0; } this.__updateImpl(); diff --git a/src/scene.ts b/src/scene.ts index 04ac8cf..c7a02a6 100644 --- a/src/scene.ts +++ b/src/scene.ts @@ -2,7 +2,7 @@ import { Antialias } from './entities/Antialias'; import { Bloom } from './entities/Bloom'; import { BufferRenderTarget } from './heck/BufferRenderTarget'; import { CanvasRenderTarget } from './heck/CanvasRenderTarget'; -import { Component, ComponentUpdateEvent } from './heck/components/Component'; +import { Component } from './heck/components/Component'; import { Condition } from './entities/Condition'; import { Cube } from './entities/Cube'; import { CubemapCameraEntity } from './entities/CubemapCameraEntity'; @@ -17,7 +17,8 @@ import { Glitch } from './entities/Glitch'; import { IBLLUT } from './entities/IBLLUT'; import { IFSPistons } from './entities/IFSPistons'; import { Lambda } from './heck/components/Lambda'; -import { LightEntity } from './entities/LightEntity'; +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'; @@ -147,17 +148,6 @@ if ( process.env.DEV && module.hot ) { } ); } -const replacerFlickyParticles = new EntityReplacer( - deferredRoot, - () => new FlickyParticles(), - 'FlickyParticles', -); -if ( process.env.DEV && module.hot ) { - module.hot.accept( './entities/FlickyParticles', () => { - replacerFlickyParticles.replace(); - } ); -} - const replacerWobbleball = new EntityReplacer( deferredRoot, () => new Wobbleball(), 'Wobbleball' ); if ( process.env.DEV && module.hot ) { module.hot.accept( './entities/Wobbleball', () => { @@ -187,6 +177,17 @@ if ( process.env.DEV && module.hot ) { } ); } +const replacerFlickyParticles = new EntityReplacer( + forwardRoot, + () => new FlickyParticles(), + 'FlickyParticles', +); +if ( process.env.DEV && module.hot ) { + module.hot.accept( './entities/FlickyParticles', () => { + replacerFlickyParticles.replace(); + } ); +} + // -- things that is not an "object" --------------------------------------------------------------- const swapOptions = { width: canvasRenderTarget.width, @@ -204,40 +205,24 @@ const swap = new Swap( } ), ); -const replacerLightFirst = new EntityReplacer( dog.root, () => { - const light = new LightEntity( { - scenes: [ dog.root ], - shadowMapFov: 90.0, - shadowMapNear: 1.0, - shadowMapFar: 20.0, - namePrefix: process.env.DEV && 'lightFirst', - } ); - light.color = [ 100.0, 100.0, 100.0 ]; - light.transform.lookAt( new Vector3( [ 4.0, 4.0, 4.0 ] ) ); - return light; -}, 'LightFirst' ); -const lightFirst = replacerLightFirst.current; +const replacerLightsFirst = new EntityReplacer( + dog.root, + () => new LightsFirst( { scenes: [ dog.root ] } ), + 'LightsFirst', +); -const replacerLightPink = new EntityReplacer( dog.root, () => { - const light = new LightEntity( { +const replacerLightsPink = new EntityReplacer( + dog.root, + () => new LightsPink( { scenes: [ dog.root ], - shadowMapFov: 90.0, - shadowMapNear: 1.0, - shadowMapFar: 20.0, - namePrefix: process.env.DEV && 'lightPink', - } ); - light.color = [ 120.0, 2.0, 10.0 ]; - light.transform.lookAt( new Vector3( [ -1.0, 2.0, 2.0 ] ) ); - return light; -}, 'LightPink' ); -const lightPink = replacerLightPink.current; + } ), + 'LightsPink', +); -if ( process.env.DEV && module.hot ) { - module.hot.accept( './entities/LightEntity', () => { - replacerLightFirst.replace(); - replacerLightPink.replace(); - } ); -} +const lights = [ + ...replacerLightsFirst.current.lights, + ...replacerLightsPink.current.lights, +]; // const light2 = new LightEntity( { // root: dog.root, @@ -252,11 +237,7 @@ if ( process.env.DEV && module.hot ) { const cubemapCamera = new CubemapCameraEntity( { scenes: [ dog.root ], - lights: [ - lightFirst, - lightPink, - // light2 - ], + lights, } ); dog.root.children.push( cubemapCamera ); @@ -266,90 +247,78 @@ const environmentMap = new EnvironmentMap( { dog.root.children.push( environmentMap ); // -- camera --------------------------------------------------------------------------------------- -const cameraOnUpdate = ( { time }: ComponentUpdateEvent ): void => { - const r = auto( 'Camera/rot/r' ); - const t = auto( 'Camera/rot/t' ); - const p = auto( 'Camera/rot/p' ); - const x = auto( 'Camera/pos/x' ); - const y = auto( 'Camera/pos/y' ); - const z = auto( 'Camera/pos/z' ); - const roll = auto( 'Camera/roll' ); - const shake = auto( 'Camera/shake' ); - - const st = Math.sin( t ); - const ct = Math.cos( t ); - const sp = Math.sin( p ); - const cp = Math.cos( p ); - - const wubPosAmp = 0.01; - const wubPosTheta = 3.0 * time; - const wubTarAmp = 0.02; - const wubTarTheta = 4.21 * time; - - deferredCamera.transform.lookAt( - new Vector3( [ - r * ct * sp + wubPosAmp * Math.sin( wubPosTheta ), - r * st + wubPosAmp * Math.sin( 2.0 + wubPosTheta ), - r * ct * cp + wubPosAmp * Math.sin( 4.0 + wubPosTheta ), - ] ), - new Vector3( [ - wubTarAmp * Math.sin( wubTarTheta ), - wubTarAmp * Math.sin( 2.0 + wubTarTheta ), - wubTarAmp * Math.sin( 4.0 + wubTarTheta ), - ] ), - undefined, - 0.02 * Math.sin( 2.74 * time ) + roll, - ); - - deferredCamera.transform.position = deferredCamera.transform.position.add( - new Vector3( [ x, y, z ] ) - ); - - if ( shake > 0.0 ) { - deferredCamera.transform.position = deferredCamera.transform.position.add( - new Vector3( [ - Math.sin( 145.0 * time ), - Math.sin( 2.0 + 148.0 * time ), - Math.sin( 4.0 + 151.0 * time ) - ] ).scale( shake ) - ); - } -}; - const deferredCamera = new DeferredCamera( { - scenes: [ deferredRoot ], + scenes: [ dog.root ], target: swap.o, - lights: [ - lightFirst, - lightPink, - // light2 - ], + lights, textureIBLLUT: ibllut.texture, textureEnv: environmentMap.texture, } ); - -deferredCamera.components.unshift( new Lambda( { - onUpdate: cameraOnUpdate, - name: process.env.DEV && 'main/updateDeferredCamera', -} ) ); dog.root.children.push( deferredCamera ); +replacerLightsPink.current.setDefferedCameraTarget( deferredCamera.cameraTarget ); const forwardCamera = new ForwardCamera( { - scenes: [ forwardRoot ], + scenes: [ dog.root ], target: swap.o, - lights: [ - lightFirst, - lightPink, - // light2 - ], + lights, } ); - -forwardCamera.components.unshift( new Lambda( { - onUpdate: cameraOnUpdate, - name: process.env.DEV && 'main/updateForwardCamera', -} ) ); dog.root.children.push( forwardCamera ); +dog.root.components.push( new Lambda( { + onUpdate: ( { time } ) => { + const r = auto( 'Camera/rot/r' ); + const t = auto( 'Camera/rot/t' ); + const p = auto( 'Camera/rot/p' ); + const x = auto( 'Camera/pos/x' ); + const y = auto( 'Camera/pos/y' ); + const z = auto( 'Camera/pos/z' ); + const roll = auto( 'Camera/roll' ); + const shake = auto( 'Camera/shake' ); + + const st = Math.sin( t ); + const ct = Math.cos( t ); + const sp = Math.sin( p ); + const cp = Math.cos( p ); + + const wubPosAmp = 0.01; + const wubPosTheta = 3.0 * time; + const wubTarAmp = 0.02; + const wubTarTheta = 4.21 * time; + + [ deferredCamera, forwardCamera ].map( ( camera ) => { + camera.transform.lookAt( + new Vector3( [ + r * ct * sp + wubPosAmp * Math.sin( wubPosTheta ), + r * st + wubPosAmp * Math.sin( 2.0 + wubPosTheta ), + r * ct * cp + wubPosAmp * Math.sin( 4.0 + wubPosTheta ), + ] ), + new Vector3( [ + wubTarAmp * Math.sin( wubTarTheta ), + wubTarAmp * Math.sin( 2.0 + wubTarTheta ), + wubTarAmp * Math.sin( 4.0 + wubTarTheta ), + ] ), + undefined, + 0.02 * Math.sin( 2.74 * time ) + roll, + ); + + camera.transform.position = camera.transform.position.add( + new Vector3( [ x, y, z ] ) + ); + + if ( shake > 0.0 ) { + camera.transform.position = camera.transform.position.add( + new Vector3( [ + Math.sin( 145.0 * time ), + Math.sin( 2.0 + 148.0 * time ), + Math.sin( 4.0 + 151.0 * time ) + ] ).scale( shake ) + ); + } + } ); + }, + name: process.env.DEV && 'main/updateCamera', +} ) ); + // -- post ----------------------------------------------------------------------------------------- swap.swap(); const antialias = new Antialias( { diff --git a/src/shaders/flicky-particles-render.frag b/src/shaders/flicky-particles-render.frag index c080db6..6a54f09 100644 --- a/src/shaders/flicky-particles-render.frag +++ b/src/shaders/flicky-particles-render.frag @@ -43,7 +43,7 @@ uniform sampler2D samplerRandomStatic; layout (location = 3) out vec4 fragWTF; #endif -#ifdef SHADOW +#ifdef DEPTH out vec4 fragColor; uniform vec2 cameraNearFar; @@ -187,7 +187,7 @@ void main() { fragWTF = vec4( vec3( 0.0 ), MTL_UNLIT ); #endif - #ifdef SHADOW + #ifdef DEPTH float depth = linearstep( cameraNearFar.x, cameraNearFar.y, diff --git a/src/shaders/ifs-piston.frag b/src/shaders/ifs-piston.frag index afe225a..fc539ca 100644 --- a/src/shaders/ifs-piston.frag +++ b/src/shaders/ifs-piston.frag @@ -7,10 +7,6 @@ precision highp float; #define linearstep(a,b,x) saturate(((x)-(a))/((b)-(a))) const int MARCH_ITER = 90; -const int MTL_UNLIT = 1; -const int MTL_PBR = 2; -const int MTL_GRADIENT = 3; -const int MTL_IRIDESCENT = 4; const float PI = 3.14159265; const float TAU = PI * 2.0; @@ -21,15 +17,12 @@ const float TAU = PI * 2.0; layout (location = 3) out vec4 fragWTF; #endif -in vec4 vPosition; +in vec4 vPositionWithoutModel; #ifdef SHADOW out vec4 fragColor; #endif -uniform float deformAmp; -uniform float deformFreq; -uniform float deformTime; uniform float time; uniform float ifsSeed; uniform vec2 resolution; @@ -48,12 +41,6 @@ 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 ); @@ -90,7 +77,9 @@ vec4 map( vec3 p ) { float d1, d2; { - float clampbox = box( p - vec3( 0.0, 10.0, 0.0 ), vec3( 1.0, 10.0, 1.0 ) - 0.1 ); + vec3 pt = p; + + float clampbox = box( pt - vec3( 0.0, 10.0, 0.0 ), vec3( 1.0, 10.0, 1.0 ) - 0.1 ); vec3 r = mix( fs( vec3( 4.7, 2.2, 8.3 ) + floor( ifsSeed ) ), @@ -98,7 +87,7 @@ vec4 map( vec3 p ) { fract( ifsSeed ) ); vec3 t = 0.1 * vec3( 3.0, 2.3, 3.5 ); - vec3 pt = ifs( p, r, t ); + pt = ifs( pt, r, t ); pt = mod( pt - 0.1, 0.2 ) - 0.1; @@ -106,7 +95,9 @@ vec4 map( vec3 p ) { } { - float clampbox = box( p - vec3( 0.0, 10.0, 0.0 ), vec3( 1.0, 10.0, 1.0 ) ); + vec3 pt = p; + + float clampbox = box( pt - vec3( 0.0, 10.0, 0.0 ), vec3( 1.0, 10.0, 1.0 ) ); vec3 r = mix( fs( vec3( 5.3, 1.1, 2.9 ) + floor( ifsSeed ) ), @@ -114,7 +105,7 @@ vec4 map( vec3 p ) { fract( ifsSeed ) ); vec3 t = 0.2 * vec3( 3.0, 2.3, 3.5 ); - vec3 pt = ifs( p, r, t ); + pt = ifs( pt, r, t ); pt = mod( pt - 0.1, 0.2 ) - 0.1; @@ -139,7 +130,7 @@ void main() { 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( vPosition.xyz - cameraPos ); + float rayLen = length( vPositionWithoutModel.xyz - rayOri ); vec3 rayPos = rayOri + rayDir * rayLen; vec4 isect; @@ -176,11 +167,11 @@ void main() { 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 ), MTL_PBR ); + fragColor = vec4( vec3( 0.04 ), 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 ), MTL_PBR ); + fragWTF = vec4( vec3( 0.3, 0.1, 0.0 ), 2 ); } #endif diff --git a/src/shaders/light-shaft.frag b/src/shaders/light-shaft.frag new file mode 100644 index 0000000..ac57e96 --- /dev/null +++ b/src/shaders/light-shaft.frag @@ -0,0 +1,111 @@ +#version 300 es + +precision highp float; + +#define saturate(x) clamp(x,0.,1.) +#define linearstep(a,b,x) saturate(((x)-(a))/((b)-(a))) + +const int MARCH_ITER = 20; +const float INV_MARCH_ITER = 1.0 / float( MARCH_ITER ); +const float PI = 3.14159265; +const float TAU = PI * 2.0; + +in float vFrustumZ; +in vec4 vPosition; + +out vec4 fragColor; + +uniform float time; +uniform vec2 lightNearFar; +uniform vec2 resolution; +uniform vec2 cameraNearFar; +uniform vec3 cameraPos; +uniform vec3 lightColor; +uniform vec3 lightPos; +uniform mat4 lightPV; +uniform mat4 viewMatrix; +uniform mat4 projectionMatrix; +uniform mat4 inversePVM; +uniform sampler2D samplerDeferred0; +uniform sampler2D samplerRandom; +uniform sampler2D samplerShadow; + +float cameraDepth; + +#pragma glslify: prng = require( ./-prng ); + +vec3 divideByW( vec4 v ) { + return v.xyz / v.w; +} + +float map( vec3 p ) { + vec4 pt = projectionMatrix * viewMatrix * vec4( p, 1.0 ); + float depth = pt.z / pt.w; + if ( depth > cameraDepth ) { + return 0.0; + } + + float l = length( p - lightPos ); + float tooNear = smoothstep( 0.0, 0.1, l ); + + vec4 lightProj = lightPV * vec4( p, 1.0 ); + vec3 lightP = lightProj.xyz / lightProj.w; + + if ( lightP.z < 0.0 || 1.0 < lightP.z ) { + return 0.0; + } + + float depth = linearstep( + lightNearFar.x, + lightNearFar.y, + l + ); + + vec4 tex = texture( samplerShadow, 0.5 + 0.5 * lightP.xy ); + + float variance = saturate( tex.y - tex.x * tex.x ); + float md = depth - tex.x; + + float softShadow = md < 0.0 ? 1.0 : linearstep( 0.2, 1.0, variance / ( variance + md * md ) ); + + // spot + float spot = smoothstep( 1.0, 0.5, length( lightP.xy ) ); + + return tooNear * softShadow * spot * 1.0 / l / l; +} + +void main() { + vec2 p = ( gl_FragCoord.xy * 2.0 - resolution ) / resolution.y; + vec4 seed = texture( samplerRandom, p ); + prng( seed ); + + vec4 texDeferred0 = texture( samplerDeferred0, gl_FragCoord.xy / resolution.xy ); + cameraDepth = 2.0 * texDeferred0.w - 1.0; + + vec3 rayOri = cameraPos; + vec3 rayDir = normalize( vPosition.xyz - rayOri ); + float rayLen = gl_FrontFacing + ? 1E-2 + : length( vPosition.xyz - rayOri ); + vec3 rayPos = rayOri + rayDir * rayLen; + + // this is terrible + // There definitely are better ways to do this + float stepLen = gl_FrontFacing + ? 1.0 + : 0.1; + + float accum = 0.0; + float isect; + + for ( int i = 0; i < MARCH_ITER; i ++ ) { + isect = map( rayPos ); + accum += isect * INV_MARCH_ITER; + rayLen += stepLen * 0.8 + 0.2 * prng( seed ); + rayPos = rayOri + rayDir * rayLen; + + if ( rayLen > cameraNearFar.y ) { break; } + } + + fragColor = vec4( 0.01 * lightColor * accum, 1.0 ); +} diff --git a/src/shaders/light-shaft.vert b/src/shaders/light-shaft.vert new file mode 100644 index 0000000..9fd363f --- /dev/null +++ b/src/shaders/light-shaft.vert @@ -0,0 +1,33 @@ +#version 300 es + +const float PI = 3.14159265; + +layout (location = 0) in vec3 position; + +out float vFrustumZ; +out vec4 vPosition; + +uniform float lightFov; +uniform vec2 lightNearFar; +uniform vec2 resolution; +uniform mat4 projectionMatrix; +uniform mat4 viewMatrix; +uniform mat4 modelMatrix; + +// ------ + +void main() { + float vFrustumZ = 0.5 + 0.5 * position.z; + + vec3 pos = mix( + vec3( position.xy * lightNearFar.x * tan( lightFov / 360.0 * PI ), -lightNearFar.x ), + vec3( position.xy * lightNearFar.y * tan( lightFov / 360.0 * PI ), -lightNearFar.y ), + vFrustumZ + ); + + vPosition = modelMatrix * vec4( pos, 1.0 ); + vec4 outPos = projectionMatrix * viewMatrix * vPosition; + + outPos.x *= resolution.y / resolution.x; + gl_Position = outPos; +} diff --git a/src/shaders/raymarch-object.vert b/src/shaders/raymarch-object.vert index 6d915f0..04e3f2c 100644 --- a/src/shaders/raymarch-object.vert +++ b/src/shaders/raymarch-object.vert @@ -2,6 +2,7 @@ layout (location = 0) in vec3 position; +out vec4 vPositionWithoutModel; out vec4 vPosition; uniform vec2 resolution; @@ -12,7 +13,8 @@ uniform mat4 modelMatrix; // ------ void main() { - vPosition = modelMatrix * vec4( position, 1.0 ); + vPositionWithoutModel = vec4( position, 1.0 ); + vPosition = modelMatrix * vPositionWithoutModel; vec4 outPos = projectionMatrix * viewMatrix * vPosition; outPos.x *= resolution.y / resolution.x; diff --git a/src/shaders/shading.frag b/src/shaders/shading.frag index 8896c00..7357e54 100644 --- a/src/shaders/shading.frag +++ b/src/shaders/shading.frag @@ -5,8 +5,6 @@ precision highp float; const int MTL_NONE = 0; const int MTL_UNLIT = 1; const int MTL_PBR = 2; -const int MTL_GRADIENT = 3; -const int AO_ITER = 8; const float ENV_UV_MARGIN = 0.9375; const float AO_BIAS = 0.0; const float AO_RADIUS = 0.5; @@ -27,11 +25,13 @@ in vec2 vUv; out vec4 fragColor; uniform int lightCount; +uniform vec2 resolution; uniform vec2 lightNearFar[8]; uniform vec2 cameraNearFar; uniform vec3 cameraPos; uniform vec3 lightPos[8]; uniform vec3 lightColor[8]; +uniform vec4 lightParams[8]; uniform mat4 lightPV[8]; uniform mat4 cameraView; uniform mat4 cameraPV; @@ -59,27 +59,6 @@ vec3 catColor( float _p ) { ); } -vec3 blurpleGradient( float t ) { - vec3 colorA = vec3( 0.01, 0.04, 0.2 ); - vec3 colorB = vec3( 0.02, 0.3, 0.9 ); - vec3 colorC = vec3( 0.9, 0.01, 0.6 ); - vec3 colorD = vec3( 0.5, 0.02, 0.02 ); - - return mix( - colorA, - mix( - colorB, - mix( - colorC, - colorD, - linearstep( 0.67, 1.0, t ) - ), - linearstep( 0.33, 0.67, t ) - ), - linearstep( 0.0, 0.33, t ) - ); -} - vec4 sampleEnvNearest( vec2 uv, float lv ) { float p = pow( 0.5, float( lv ) ); vec2 uvt = ENV_UV_MARGIN * ( uv - 0.5 ) + 0.5; @@ -128,7 +107,7 @@ vec4 fetchShadowMap( int iLight, vec2 uv ) { } // == features ===================================================================================== -float castShadow( int iLight, Isect isect, float NdotL ) { +float castShadow( int iLight, vec2 lightUv, Isect isect, float NdotL ) { float depth = linearstep( lightNearFar[ iLight ].x, lightNearFar[ iLight ].y, @@ -138,12 +117,9 @@ float castShadow( int iLight, Isect isect, float NdotL ) { float bias = 0.0001 + 0.0001 * ( 1.0 - NdotL ); depth -= bias; - vec4 proj = lightPV[ iLight ] * vec4( isect.position, 1.0 ); - vec2 uv = proj.xy / proj.w * 0.5 + 0.5; + vec4 tex = fetchShadowMap( iLight, lightUv ); - vec4 tex = fetchShadowMap( iLight, uv ); - - float edgeClip = smoothstep( 0.4, 0.5, max( abs( uv.x - 0.5 ), abs( uv.y - 0.5 ) ) ); + float edgeClip = smoothstep( 0.4, 0.5, max( abs( lightUv.x - 0.5 ), abs( lightUv.y - 0.5 ) ) ); float variance = saturate( tex.y - tex.x * tex.x ); float md = depth - tex.x; @@ -205,9 +181,18 @@ vec3 shadePBR( Isect isect ) { float decayL = 1.0 / ( lenL * lenL ); - // fetch shadowmap - float shadow = castShadow( iLight, isect, NdotL ); - shadow = mix( 0.5, 1.0, shadow ); + // fetch shadowmap + spot lighting + vec4 lightProj = lightPV[ iLight ] * vec4( isect.position, 1.0 ); + vec2 lightP = lightProj.xy / lightProj.w; + + float shadow = mix( + 1.0, + smoothstep( 1.0, 0.5, length( lightP ) ), + lightParams[ iLight ].x + ); + + 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 ); @@ -246,11 +231,6 @@ vec3 shadePBR( Isect isect ) { } -vec3 shadeGradient( Isect isect ) { - float shade = isect.normal.y; - return blurpleGradient( 0.5 + 0.5 * shade ); -} - // == main procedure =============================================================================== void main() { vec4 tex0 = texture( sampler0, vUv ); @@ -270,6 +250,13 @@ void main() { isect.materialId = int( tex3.w + 0.5 ); isect.materialParams = tex3.xyz; + // from isect + vec3 V = cameraPos - isect.position; + float lenV = length( V ); + V = normalize( V ); + + float NdotV = clamp( dot( isect.normal, V ), EPSILON, 1.0 ); + vec3 color = vec3( 0.0 ); if ( isect.materialId == MTL_NONE ) { @@ -281,8 +268,6 @@ void main() { } else if ( isect.materialId == MTL_PBR ) { color = shadePBR( isect ); - } else if ( isect.materialId == MTL_GRADIENT ) { - color = shadeGradient( isect ); } @@ -297,4 +282,6 @@ void main() { fragColor = vec4( color, 1.0 ); // fragColor.xyz *= smoothstep( 1.0, 0.7, calcDepth( tex0.xyz ) ); + + gl_FragDepth = 0.5 + 0.5 * isect.depth; } diff --git a/src/shaders/wobbleball.frag b/src/shaders/wobbleball.frag index 0d18331..981c3c6 100644 --- a/src/shaders/wobbleball.frag +++ b/src/shaders/wobbleball.frag @@ -21,7 +21,7 @@ const float TAU = PI * 2.0; layout (location = 3) out vec4 fragWTF; #endif -in vec4 vPosition; +in vec4 vPositionWithoutModel; #ifdef SHADOW out vec4 fragColor; @@ -115,7 +115,7 @@ void main() { 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( vPosition.xyz - cameraPos ); + float rayLen = length( vPositionWithoutModel.xyz - rayOri ); vec3 rayPos = rayOri + rayDir * rayLen; float dist; @@ -132,7 +132,7 @@ void main() { discard; } - vec3 modelNormal = ( normalMatrix * vec4( normalFunc( rayPos, 1E-2 ), 1.0 ) ).xyz; + vec3 modelNormal = ( normalMatrix * vec4( normalFunc( rayPos, 1E-3 ), 1.0 ) ).xyz; vec4 modelPos = modelMatrix * vec4( rayPos, 1.0 ); vec4 projPos = projectionMatrix * viewMatrix * modelPos; // terrible @@ -143,7 +143,7 @@ void main() { 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.2, 0.0 ), MTL_PBR ); + fragWTF = vec4( vec3( 0.9, 0.7, 0.0 ), MTL_PBR ); #endif #ifdef SHADOW