From 892260d8cd45df895c1ac4841f1853f49c070880 Mon Sep 17 00:00:00 2001 From: FMS-Cat Date: Sun, 28 Mar 2021 19:44:09 +0900 Subject: [PATCH] feature: improve multiple light + improve condition --- src/automaton.json | 2 +- src/entities/CameraEntity.ts | 219 ++++++++++++++++++----------------- src/entities/Condition.ts | 6 +- src/heck/Entity.ts | 7 +- src/heck/Material.ts | 14 +++ src/scene.ts | 6 +- src/shaders/condition.frag | 2 + src/shaders/condition.vert | 21 ++-- src/shaders/rings.frag | 4 +- src/shaders/shading.frag | 164 +++++++++++++------------- 10 files changed, 236 insertions(+), 209 deletions(-) diff --git a/src/automaton.json b/src/automaton.json index 1a98821..425f7bf 100644 --- a/src/automaton.json +++ b/src/automaton.json @@ -1 +1 @@ -{"version":"4.1.1","resolution":100,"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.6335509138381202,0.1588235294117648,-0.0296357295978042,-0.12604773105452508,0.0296357295978042,0.12604773105452508],[0.7000000000000001,0.7549019607843139,-0.02819843342036554,-0.09607843137254903,0.02819843342036554,0.09607843137254903],[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]]}],"channels":[["EnvironmentMap/accumulate",{"items":[{"value":0.1}]}],["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":106.66666666666666}]}],["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/phaseWidth",{"items":[{"value":0.1},{"time":22.333333333333332,"length":20.333333333333332,"value":0.1,"curve":20,"speed":0.049180327868852465,"amp":0.9}]}],["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":89.33333333333333,"length":1.3333333333333286,"curve":18},{"time":90.66666666666666,"length":1.3333333333333428,"curve":14},{"time":92,"length":1.3333333333333286,"curve":18},{"time":93.33333333333333,"length":1.3333333333333428,"curve":14},{"time":94.66666666666667,"length":1.3333333333333286,"curve":18},{"time":96,"length":1.3333333333333428,"curve":14},{"time":97.33333333333334,"length":1.3333333333333144,"curve":18},{"time":98.66666666666666,"length":1.3333333333333428,"curve":14},{"time":100,"length":1.3333333333333286,"curve":18},{"time":101.33333333333333,"length":1.3333333333333428,"curve":14},{"time":102.66666666666667,"length":1.3333333333333286,"curve":18},{"time":104,"length":1.3333333333333428,"curve":14},{"time":105.33333333333334,"length":1.3333333333333286,"curve":18}]}],["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":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":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":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":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":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":[{}]}],["Camera/pos/y",{"items":[{},{"time":97.33333333333333,"value":0.8799999999999999}]}],["Camera/pos/z",{"items":[{}]}],["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":2},{"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},{"time":45.33333333333333,"value":-0.30999999999999495},{"time":48,"value":0.5200000000000048},{"time":50.666666666666664,"value":-0.029999999999995274},{"time":53.33333333333333,"value":0.5500000000000047},{"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":-0.9999999999999998},{"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.5009803921568626,"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.08882352941176483,"curve":29},{"time":56.000000000000014,"length":2.6666666666666714,"value":-1.4311764705882353,"curve":29},{"time":58.666666666666686,"length":2.6666666666666714,"value":-0.47117647058823503,"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":[]}]],"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":100,"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]]}],"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":89.33333333333333,"length":1.3333333333333286,"curve":18},{"time":90.66666666666666,"length":1.3333333333333428,"curve":14},{"time":92,"length":1.3333333333333286,"curve":18},{"time":93.33333333333333,"length":1.3333333333333428,"curve":14},{"time":94.66666666666667,"length":1.3333333333333286,"curve":18},{"time":96,"length":1.3333333333333428,"curve":14},{"time":97.33333333333334,"length":1.3333333333333144,"curve":18},{"time":98.66666666666666,"length":1.3333333333333428,"curve":14},{"time":100,"length":1.3333333333333286,"curve":18},{"time":101.33333333333333,"length":1.3333333333333428,"curve":14},{"time":102.66666666666667,"length":1.3333333333333286,"curve":18},{"time":104,"length":1.3333333333333428,"curve":14},{"time":105.33333333333334,"length":1.3333333333333286,"curve":18}]}],["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":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":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":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":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":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":[{}]}],["Camera/pos/y",{"items":[{},{"time":97.33333333333333,"value":0.8799999999999999}]}],["Camera/pos/z",{"items":[{}]}],["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},{"time":45.33333333333333,"value":-0.30999999999999495},{"time":48,"value":0.5200000000000048},{"time":50.666666666666664,"value":-0.029999999999995274},{"time":53.33333333333333,"value":0.5500000000000047},{"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.5009803921568626,"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.08882352941176483,"curve":29},{"time":56.000000000000014,"length":2.6666666666666714,"value":-1.4311764705882353,"curve":29},{"time":58.666666666666686,"length":2.6666666666666714,"value":-0.47117647058823503,"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":[]}]],"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/entities/CameraEntity.ts b/src/entities/CameraEntity.ts index da06b9d..9486abf 100644 --- a/src/entities/CameraEntity.ts +++ b/src/entities/CameraEntity.ts @@ -91,121 +91,122 @@ export class CameraEntity extends Entity { name: process.env.DEV && 'CameraEntity/ao/quad', } ); - const shadingMaterials = options.lights.map( ( light, iLight ) => { - const shadingMaterial = new Material( - quadVert, - shadingFrag, - { - defines: iLight === 0 ? [ 'IS_FIRST_LIGHT' ] : [], - initOptions: { geometry: quadGeometry, target: dummyRenderTarget }, - }, - ); + const shadingMaterial = new Material( + quadVert, + shadingFrag, + { + initOptions: { geometry: quadGeometry, target: dummyRenderTarget }, + }, + ); - const shadingQuad = new Quad( { - material: shadingMaterial, - target: options.target, - name: process.env.DEV && 'CameraEntity/shading/quad', - } ); - shadingQuad.clear = iLight === 0 ? [] : false; - - const lambda = new Lambda( { - onUpdate: ( { frameCount } ) => { - const lightHasUpdated = frameCount === light.lastUpdateFrame; - shadingQuad.active = lightHasUpdated; - if ( !lightHasUpdated ) { - return; - } - - const cameraView = this.transform.matrix.inverse!; - - shadingMaterial.addUniformMatrixVector( - 'cameraView', - 'Matrix4fv', - cameraView.elements - ); - - shadingMaterial.addUniformMatrixVector( - 'cameraPV', - 'Matrix4fv', - this.camera.projectionMatrix.multiply( - cameraView - ).elements - ); - - shadingMaterial.addUniform( - 'lightNearFar', - '2f', - light.camera.near, - light.camera.far - ); - - shadingMaterial.addUniform( - 'cameraNearFar', - '2f', - this.camera.near, - this.camera.far - ); - - shadingMaterial.addUniform( - 'cameraPos', - '3f', - ...this.transform.position.elements - ); - - shadingMaterial.addUniform( - 'lightPos', - '3f', - ...light.transform.position.elements - ); - - shadingMaterial.addUniform( - 'lightColor', - '3f', - ...light.color - ); - - shadingMaterial.addUniformMatrixVector( - 'lightPV', - 'Matrix4fv', - light.camera.projectionMatrix.multiply( - light.transform.matrix.inverse! - ).elements - ); - }, - name: process.env.DEV && 'CameraEntity/shading/setCameraUniforms', - } ); - - for ( let i = 0; i < 4; i ++ ) { - shadingMaterial.addUniformTexture( - 'sampler' + i, - cameraTarget.getTexture( gl.COLOR_ATTACHMENT0 + i ) - ); - } - - shadingMaterial.blend = [ gl.ONE, gl.ONE ]; - shadingMaterial.addUniformTexture( 'samplerAo', aoTarget.texture ); - shadingMaterial.addUniformTexture( 'samplerShadow', light.shadowMap.texture ); - shadingMaterial.addUniformTexture( 'samplerIBLLUT', options.textureIBLLUT ); - shadingMaterial.addUniformTexture( 'samplerEnv', options.textureEnv ); - shadingMaterial.addUniformTexture( 'samplerRandom', randomTexture.texture ); - - this.components.push( - this.camera, - lambdaAoSetCameraUniforms, - aoQuad, - lambda, - shadingQuad, - ); - - return shadingMaterial; + const shadingQuad = new Quad( { + material: shadingMaterial, + target: options.target, + name: process.env.DEV && 'CameraEntity/shading/quad', } ); + shadingQuad.clear = []; + + const lambda = new Lambda( { + onUpdate: ( { frameCount } ) => { + const lights = options.lights.filter( ( light ) => ( + frameCount === light.lastUpdateFrame + ) ); + + const cameraView = this.transform.matrix.inverse!; + + shadingMaterial.addUniform( + 'lightCount', + '1i', + lights.length, + ); + + shadingMaterial.addUniformMatrixVector( + 'cameraView', + 'Matrix4fv', + cameraView.elements + ); + + shadingMaterial.addUniformMatrixVector( + 'cameraPV', + 'Matrix4fv', + this.camera.projectionMatrix.multiply( + cameraView + ).elements + ); + + shadingMaterial.addUniform( + 'cameraNearFar', + '2f', + this.camera.near, + this.camera.far + ); + + shadingMaterial.addUniform( + 'cameraPos', + '3f', + ...this.transform.position.elements + ); + + shadingMaterial.addUniformVector( + 'lightNearFar', + '2fv', + lights.map( ( light ) => [ light.camera.near, light.camera.far ] ).flat(), + ); + + shadingMaterial.addUniformVector( + 'lightPos', + '3fv', + lights.map( ( light ) => light.globalTransformCache.position.elements ).flat(), + ); + + shadingMaterial.addUniformVector( + 'lightColor', + '3fv', + lights.map( ( light ) => light.color ).flat(), + ); + + shadingMaterial.addUniformMatrixVector( + 'lightPV', + 'Matrix4fv', + lights.map( ( light ) => ( + light.camera.projectionMatrix.multiply( + light.globalTransformCache.matrix.inverse! + ).elements + ) ).flat(), + ); + + shadingMaterial.addUniformTextureArray( + 'samplerShadow', + lights.map( ( light ) => light.shadowMap.texture ), + ); + }, + name: process.env.DEV && 'CameraEntity/shading/setCameraUniforms', + } ); + + for ( let i = 0; i < 4; i ++ ) { + shadingMaterial.addUniformTexture( + 'sampler' + i, + cameraTarget.getTexture( gl.COLOR_ATTACHMENT0 + i ) + ); + } + + shadingMaterial.addUniformTexture( 'samplerAo', aoTarget.texture ); + shadingMaterial.addUniformTexture( 'samplerIBLLUT', options.textureIBLLUT ); + shadingMaterial.addUniformTexture( 'samplerEnv', options.textureEnv ); + shadingMaterial.addUniformTexture( 'samplerRandom', randomTexture.texture ); + + this.components.push( + this.camera, + lambdaAoSetCameraUniforms, + aoQuad, + lambda, + shadingQuad, + ); if ( process.env.DEV ) { if ( module.hot ) { module.hot.accept( '../shaders/shading.frag', () => { - shadingMaterials.forEach( ( material ) => { - material.replaceShader( quadVert, shadingFrag ); - } ); + shadingMaterial.replaceShader( quadVert, shadingFrag ); } ); } } diff --git a/src/entities/Condition.ts b/src/entities/Condition.ts index e8417e6..856548b 100644 --- a/src/entities/Condition.ts +++ b/src/entities/Condition.ts @@ -139,7 +139,11 @@ export class Condition extends Entity { } ); auto( 'Sync/first/clap', ( { value } ) => { - material.addUniform( 'phaseOffset', '1f', 0.2 * value ); + material.addUniform( 'phaseOffset', '1f', value ); + } ); + + auto( 'Condition/hahaRatio', ( { value } ) => { + material.addUniform( 'hahaRatio', '1f', value ); } ); } ); diff --git a/src/heck/Entity.ts b/src/heck/Entity.ts index fba7166..576bff2 100644 --- a/src/heck/Entity.ts +++ b/src/heck/Entity.ts @@ -27,6 +27,7 @@ export interface EntityDrawEvent { export class Entity { public readonly transform = new Transform(); + public globalTransformCache = new Transform(); public lastUpdateFrame = 0; @@ -67,14 +68,14 @@ export class Entity { public draw( event: EntityDrawEvent ): void { if ( !this.visible ) { return; } - const globalTransform = event.globalTransform.multiply( this.transform ); + this.globalTransformCache = event.globalTransform.multiply( this.transform ); this.components.forEach( ( component ) => { component.draw( { frameCount: event.frameCount, time: event.time, renderTarget: event.renderTarget, - globalTransform, + globalTransform: this.globalTransformCache, camera: event.camera, cameraTransform: event.cameraTransform, viewMatrix: event.viewMatrix, @@ -89,7 +90,7 @@ export class Entity { frameCount: event.frameCount, time: event.time, renderTarget: event.renderTarget, - globalTransform, + globalTransform: this.globalTransformCache, viewMatrix: event.viewMatrix, projectionMatrix: event.projectionMatrix, camera: event.camera, diff --git a/src/heck/Material.ts b/src/heck/Material.ts index 633fcda..074bd0a 100644 --- a/src/heck/Material.ts +++ b/src/heck/Material.ts @@ -50,6 +50,12 @@ export class Material { }; } = {}; + protected __uniformTextureArrays: { + [ name: string ]: { + textures: GLCatTexture[]; + }; + } = {}; + protected __uniformCubemaps: { [ name: string ]: { texture: GLCatTextureCubemap | null; @@ -135,6 +141,10 @@ export class Material { this.__uniformTextures[ name ] = { texture }; } + public addUniformTextureArray( name: string, textures: GLCatTexture[] ): void { + this.__uniformTextureArrays[ name ] = { textures }; + } + public addUniformCubemap( name: string, texture: GLCatTextureCubemap | null ): void { this.__uniformCubemaps[ name ] = { texture }; } @@ -160,6 +170,10 @@ export class Material { program.uniformTexture( name, texture ); } ); + Object.entries( this.__uniformTextureArrays ).forEach( ( [ name, { textures } ] ) => { + program.uniformTextures( name, textures ); + } ); + Object.entries( this.__uniformCubemaps ).forEach( ( [ name, { texture } ] ) => { program.uniformCubemap( name, texture ); } ); diff --git a/src/scene.ts b/src/scene.ts index 5a02e96..6f1b575 100644 --- a/src/scene.ts +++ b/src/scene.ts @@ -195,8 +195,8 @@ const replacerLightFirst = new EntityReplacer( () => { shadowMapFar: 20.0, namePrefix: process.env.DEV && 'lightFirst', } ); - light.color = [ 40.0, 40.0, 40.0 ]; - light.transform.lookAt( new Vector3( [ -1.0, 2.0, 8.0 ] ) ); + 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; @@ -210,7 +210,7 @@ const replacerLightPink = new EntityReplacer( () => { namePrefix: process.env.DEV && 'lightPink', } ); light.color = [ 120.0, 2.0, 10.0 ]; - light.transform.lookAt( new Vector3( [ -1.0, 4.0, 4.0 ] ) ); + light.transform.lookAt( new Vector3( [ -1.0, 2.0, 2.0 ] ) ); return light; }, 'LightPink' ); const lightPink = replacerLightPink.current; diff --git a/src/shaders/condition.frag b/src/shaders/condition.frag index bbde3c4..84cacf6 100644 --- a/src/shaders/condition.frag +++ b/src/shaders/condition.frag @@ -11,6 +11,7 @@ const int MTL_UNLIT = 1; in float vScale; in float vPhase; +in float vFade; in vec3 vNormal; in vec4 vPosition; in vec4 vHuh; @@ -45,6 +46,7 @@ void main() { if ( lenFromCenter < RADIUS_CULL_SPHERE ) { discard; } float colorPhase = exp( -4.0 * ( lenFromCenter - RADIUS_CULL_SPHERE ) ); + colorPhase = max( colorPhase, vFade ); vec3 color = mix( vec3( 2.0 ), vec3( 0.0 ), diff --git a/src/shaders/condition.vert b/src/shaders/condition.vert index 3d5dbb6..c5c759d 100644 --- a/src/shaders/condition.vert +++ b/src/shaders/condition.vert @@ -9,11 +9,13 @@ layout (location = 1) in vec4 huh; out float vPhase; out float vScale; +out float vFade; out vec3 vNormal; out vec4 vPosition; out vec4 vHuh; uniform float time; +uniform float hahaRatio; uniform vec2 resolution; uniform mat4 projectionMatrix; uniform mat4 viewMatrix; @@ -27,10 +29,17 @@ void main() { vPhase = what.x; vHuh = huh; + vec3 randomPos = fs( vec3( 5.0, 8.6, 1.9 ) + huh.z + 2.56 * huh.y ) - 0.5; + randomPos.z = mod( randomPos.z + 0.1 * time, 1.0 ) - 0.5; + randomPos *= vec3( 5.0, 5.0, 20.0 ); + + vFade = smoothstep( 9.0, 10.0, abs( randomPos.z ) ); + + float haha = hahaRatio * smoothstep( 1.0, 2.0, randomPos.z ); + vec4 tex = texture( samplerSvg, vec2( what.x, huh.x ) ); vPosition = vec4( tex.xy, 0.0, 1.0 ); - // vPosition.x += huh.y; mat3 basis = orthBasis( vec3( tex.zw, 0.0 ) ); float theta = what.y / 3.0 * TAU; @@ -38,17 +47,15 @@ void main() { vNormal = ( normalMatrix * vec4( tube, 1.0 ) ).xyz; vScale = exp( 2.0 * fs( huh.z + 2.56 * huh.y ) ); - vPosition.xyz *= vScale; + vPosition.xyz *= mix( vScale, 1.0, haha ); + + vPosition.x += mix( 0.0, huh.y, haha ); vPosition.xyz += tube; vPosition = modelMatrix * vPosition; - vec3 randomPos = fs( vec3( 5.0, 8.6, 1.9 ) + huh.z + 2.56 * huh.y ) - 0.5; - randomPos.z = mod( randomPos.z + 0.1 * time, 1.0 ) - 0.5; - vPosition.xyz += vec3( 5.0, 5.0, 20.0 ) * randomPos; - - // vPosition.z += 6.0 - 1.2 * huh.z; + vPosition.xyz += mix( randomPos, vec3( 0.0, 0.0, 3.0 ), haha ); vec4 outPos = projectionMatrix * viewMatrix * vPosition; outPos.x *= resolution.y / resolution.x; diff --git a/src/shaders/rings.frag b/src/shaders/rings.frag index 8fc7f8d..29fbea3 100644 --- a/src/shaders/rings.frag +++ b/src/shaders/rings.frag @@ -23,13 +23,13 @@ uniform float time; void main() { #ifdef FORWARD - fragColor = vec4( 8.0 * vec3( 0.9, 0.02, 0.1 ), 1.0 ); + fragColor = vec4( 8.0 * vec3( 0.1, 0.9, 0.4 ), 1.0 ); #endif #ifdef DEFERRED fragPosition = vPosition; fragNormal = vec4( normalize( vNormal ), 1.0 ); - fragColor = vec4( 0.9, 0.02, 0.1, 1.0 ); + fragColor = vec4( 0.1, 0.9, 0.4, 1.0 ); fragWTF = vec4( vec3( 0.2, 0.2, 8.0 ), MTL_PBR ); #endif } diff --git a/src/shaders/shading.frag b/src/shaders/shading.frag index b041a0b..8896c00 100644 --- a/src/shaders/shading.frag +++ b/src/shaders/shading.frag @@ -6,7 +6,6 @@ const int MTL_NONE = 0; const int MTL_UNLIT = 1; const int MTL_PBR = 2; const int MTL_GRADIENT = 3; -const int MTL_IRIDESCENT = 4; const int AO_ITER = 8; const float ENV_UV_MARGIN = 0.9375; const float AO_BIAS = 0.0; @@ -27,19 +26,20 @@ in vec2 vUv; out vec4 fragColor; -uniform vec2 lightNearFar; +uniform int lightCount; +uniform vec2 lightNearFar[8]; uniform vec2 cameraNearFar; uniform vec3 cameraPos; -uniform vec3 lightPos; -uniform vec3 lightColor; -uniform mat4 lightPV; +uniform vec3 lightPos[8]; +uniform vec3 lightColor[8]; +uniform mat4 lightPV[8]; uniform mat4 cameraView; uniform mat4 cameraPV; uniform sampler2D sampler0; // position.xyz, depth uniform sampler2D sampler1; // normal.xyz (yes, this is not good) uniform sampler2D sampler2; // color.rgba (what is a though????) uniform sampler2D sampler3; // materialParams.xyz, materialId -uniform sampler2D samplerShadow; +uniform sampler2D samplerShadow[8]; uniform sampler2D samplerIBLLUT; uniform sampler2D samplerEnv; uniform sampler2D samplerAo; @@ -106,46 +106,42 @@ struct Isect { vec3 materialParams; }; -struct AngularInfo { - vec3 V; - vec3 L; - vec3 H; - float lenL; - float lenV; - float dotNV; - float dotNL; - float dotNH; - float dotVH; -}; - -AngularInfo genAngularInfo( Isect isect ) { - AngularInfo aI; - aI.V = cameraPos - isect.position; - aI.lenV = length( aI.V ); - aI.V = normalize( aI.V ); - - aI.L = lightPos - isect.position; - aI.lenL = length( aI.L ); - aI.L = normalize( aI.L ); - - aI.H = normalize( aI.V + aI.L ); - aI.dotNV = clamp( dot( isect.normal, aI.V ), EPSILON, 1.0 ); - aI.dotNL = clamp( dot( isect.normal, aI.L ), EPSILON, 1.0 ); - aI.dotNH = clamp( dot( isect.normal, aI.H ), EPSILON, 1.0 ); - aI.dotVH = clamp( dot( aI.V, aI.H ), EPSILON, 1.0 ); - return aI; +// == this is BAD ================================================================================== +vec4 fetchShadowMap( int iLight, vec2 uv ) { + if ( iLight == 0 ) { + return texture( samplerShadow[ 0 ], uv ); + } else if ( iLight == 1 ) { + return texture( samplerShadow[ 1 ], uv ); + } else if ( iLight == 2 ) { + return texture( samplerShadow[ 2 ], uv ); + } else if ( iLight == 3 ) { + return texture( samplerShadow[ 3 ], uv ); + } else if ( iLight == 4 ) { + return texture( samplerShadow[ 4 ], uv ); + } else if ( iLight == 5 ) { + return texture( samplerShadow[ 5 ], uv ); + } else if ( iLight == 6 ) { + return texture( samplerShadow[ 6 ], uv ); + } else if ( iLight == 7 ) { + return texture( samplerShadow[ 7 ], uv ); + } } // == features ===================================================================================== -float castShadow( Isect isect, AngularInfo aI ) { - float depth = linearstep( lightNearFar.x, lightNearFar.y, length( isect.position - lightPos ) ); - float bias = 0.0001 + 0.0001 * ( 1.0 - aI.dotNL ); +float castShadow( int iLight, Isect isect, float NdotL ) { + float depth = linearstep( + lightNearFar[ iLight ].x, + lightNearFar[ iLight ].y, + length( isect.position - lightPos[ iLight ] ) + ); + + float bias = 0.0001 + 0.0001 * ( 1.0 - NdotL ); depth -= bias; - vec4 proj = lightPV * vec4( isect.position, 1.0 ); + vec4 proj = lightPV[ iLight ] * vec4( isect.position, 1.0 ); vec2 uv = proj.xy / proj.w * 0.5 + 0.5; - vec4 tex = texture( samplerShadow, uv ); + vec4 tex = fetchShadowMap( iLight, uv ); float edgeClip = smoothstep( 0.4, 0.5, max( abs( uv.x - 0.5 ), abs( uv.y - 0.5 ) ) ); @@ -170,32 +166,57 @@ float calcDepth( vec3 pos ) { } // == shading functions ============================================================================ -vec3 shadePBR( Isect isect, AngularInfo aI ) { +vec3 shadePBR( Isect isect ) { // ref: https://github.com/KhronosGroup/glTF-Sample-Viewer/blob/master/src/shaders/metallic-roughness.frag + // from isect + vec3 V = cameraPos - isect.position; + float lenV = length( V ); + V = normalize( V ); + + float NdotV = clamp( dot( isect.normal, V ), EPSILON, 1.0 ); + float roughness = isect.materialParams.x; float metallic = isect.materialParams.y; float emissive = isect.materialParams.z; - float shadow = castShadow( isect, aI ); - shadow = mix( 1.0, shadow, 0.8 ); - - float ao = texture( samplerAo, isect.screenUv ).x; - shadow *= ao; - - float decayL = 1.0 / ( aI.lenL * aI.lenL ); - + // calc material stuff vec3 albedo = mix( isect.color * ONE_SUB_DIELECTRIC_SPECULAR, vec3( 0.0 ), metallic ); vec3 f0 = mix( DIELECTRIC_SPECULAR, isect.color, metallic ); - vec3 diffuse = brdfLambert( f0, albedo, aI.dotVH ); - vec3 spec = brdfSpecularGGX( f0, roughness, aI.dotVH, aI.dotNL, aI.dotNV, aI.dotNH ); + float ao = texture( samplerAo, isect.screenUv ).x; - vec3 shade = PI * lightColor * decayL * shadow * aI.dotNL * ( diffuse + spec ); + // begin lighting + vec3 color = vec3( 0.0 ); - vec3 color = shade; + // for each lights + for ( int iLight = 0; iLight < 8; iLight ++ ) { + if ( iLight >= lightCount ) { break; } -#ifdef IS_FIRST_LIGHT + // calc vectors + vec3 L = lightPos[ iLight ] - isect.position; + float lenL = length( L ); + L = normalize( L ); + + vec3 H = normalize( V + L ); + float NdotL = clamp( dot( isect.normal, L ), EPSILON, 1.0 ); + float NdotH = clamp( dot( isect.normal, H ), EPSILON, 1.0 ); + float VdotH = clamp( dot( V, H ), EPSILON, 1.0 ); + + float decayL = 1.0 / ( lenL * lenL ); + + // fetch shadowmap + float shadow = castShadow( iLight, isect, NdotL ); + shadow = mix( 0.5, 1.0, shadow ); + + // do shading + vec3 diffuse = brdfLambert( f0, albedo, VdotH ); + vec3 spec = brdfSpecularGGX( f0, roughness, VdotH, NdotL, NdotV, NdotH ); + + vec3 shade = PI * lightColor[ iLight ] * decayL * ao * shadow * NdotL * ( diffuse + spec ); + + color += shade; + } // cheat the texture seam using noise! vec3 nEnvDiffuse = importanceSampleGGX( vec2( prng( seed ), prng( seed ) * 0.05 ), 2.0, isect.normal ); @@ -209,34 +230,25 @@ vec3 shadePBR( Isect isect, AngularInfo aI ) { color += ao * texEnvDiffuse * albedo; // reflective ibl - vec3 reflEnvReflective = reflect( aI.V, isect.normal ); + vec3 reflEnvReflective = reflect( V, isect.normal ); vec2 uvEnvReflective = vec2( 0.5 + atan( reflEnvReflective.x, -reflEnvReflective.z ) / TAU, 0.5 + atan( reflEnvReflective.y, length( reflEnvReflective.zx ) ) / PI ); - vec2 brdfEnvReflective = texture( samplerIBLLUT, vec2( aI.dotNV, roughness ) ).xy; + vec2 brdfEnvReflective = texture( samplerIBLLUT, vec2( NdotV, roughness ) ).xy; vec3 texEnvReflective = sampleEnvLinear( uvEnvReflective, 3.0 * roughness ).rgb; color += ao * texEnvReflective * ( brdfEnvReflective.x * f0 + brdfEnvReflective.y ); // emissive - color += emissive * aI.dotNV * isect.color; -#endif // IS_FIRST_LIGHT + color += emissive * NdotV * isect.color; return color; } vec3 shadeGradient( Isect isect ) { - vec3 ret; - -#ifdef IS_FIRST_LIGHT float shade = isect.normal.y; - ret = blurpleGradient( 0.5 + 0.5 * shade ); -#else // IS_FIRST_LIGHT - ret = vec3( 0.0 ); -#endif // IS_FIRST_LIGHT - - return ret; + return blurpleGradient( 0.5 + 0.5 * shade ); } // == main procedure =============================================================================== @@ -260,41 +272,27 @@ void main() { vec3 color = vec3( 0.0 ); - AngularInfo aI = genAngularInfo( isect ); - if ( isect.materialId == MTL_NONE ) { // do nothing } else if ( isect.materialId == MTL_UNLIT ) { -#ifdef IS_FIRST_LIGHT color = isect.color; -#endif } else if ( isect.materialId == MTL_PBR ) { - color = shadePBR( isect, aI ); + color = shadePBR( isect ); } else if ( isect.materialId == MTL_GRADIENT ) { color = shadeGradient( isect ); - } else if ( isect.materialId == MTL_IRIDESCENT ) { - isect.color *= mix( - vec3( 1.0 ), - catColor( isect.materialParams.x * aI.dotNV ), - isect.materialParams.y - ); - isect.materialParams = vec3( 0.1, isect.materialParams.z, 0.0 ); - color = shadePBR( isect, aI ); - } - color *= exp( -0.4 * max( aI.lenV - 3.0, 0.0 ) ); + float lenV = length( cameraPos - isect.position ); + color *= exp( -0.4 * max( lenV - 3.0, 0.0 ) ); -#ifdef IS_FIRST_LIGHT // color = 0.5 + 0.5 * isect.normal; // color = vec3( calcDepth( tex0.xyz ) ); // color = vec3( 0.5, 0.9, 0.6 ) * ( 1.0 - texture( samplerAo, isect.screenUv ).xyz ); // color = vec3( 0.5, 0.9, 0.6 ) * ( texture( samplerAo, isect.screenUv ).xyz ); -#endif // xfdA = shadeGradient( isect ); fragColor = vec4( color, 1.0 );