From b5664da35059b2ac2db154ce9914e972a2ab8f3f Mon Sep 17 00:00:00 2001 From: FMS-Cat Date: Sun, 28 Mar 2021 02:18:22 +0900 Subject: [PATCH] feature: ifs piston --- src/automaton-fxs/fxDefinitions.ts | 6 +- src/automaton-fxs/gravity.ts | 39 ++++++ src/automaton.json | 2 +- src/entities/GPUParticles.ts | 4 +- src/entities/IFSPiston.ts | 73 +++++++++++ src/entities/IFSPistons.ts | 87 +++++++++++++ src/geometries/genCube.ts | 20 ++- src/heck/Material.ts | 2 +- src/heck/components/Mesh.ts | 8 +- src/main.ts | 3 +- src/shaders/ifs-piston.frag | 196 +++++++++++++++++++++++++++++ src/shaders/wobbleball.frag | 14 ++- src/utils/quatFromUnitVectors.ts | 21 ++++ 13 files changed, 454 insertions(+), 21 deletions(-) create mode 100644 src/automaton-fxs/gravity.ts create mode 100644 src/entities/IFSPiston.ts create mode 100644 src/entities/IFSPistons.ts create mode 100644 src/shaders/ifs-piston.frag create mode 100644 src/utils/quatFromUnitVectors.ts diff --git a/src/automaton-fxs/fxDefinitions.ts b/src/automaton-fxs/fxDefinitions.ts index a3b7679..e237fec 100644 --- a/src/automaton-fxs/fxDefinitions.ts +++ b/src/automaton-fxs/fxDefinitions.ts @@ -1,3 +1,4 @@ +import { gravity } from './gravity'; import { hermitePatch } from './hermitePatch'; import { repeat } from './repeat'; import { sine } from './sine'; @@ -5,9 +6,10 @@ import { transpose } from './transpose'; // quotes! prevent fx names from being mangled const fxDefinitions = { - 'sine': sine, - 'repeat': repeat, + 'gravity': gravity, 'hermitePatch': hermitePatch, + 'repeat': repeat, + 'sine': sine, 'transpose': transpose, }; diff --git a/src/automaton-fxs/gravity.ts b/src/automaton-fxs/gravity.ts new file mode 100644 index 0000000..286bdd7 --- /dev/null +++ b/src/automaton-fxs/gravity.ts @@ -0,0 +1,39 @@ +import type { FxDefinition } from '@fms-cat/automaton'; + +export const gravity: FxDefinition = { + func( context ) { + const dt = context.deltaTime; + const v = context.value; + + if ( context.init ) { + context.state.pos = v; + if ( context.params.preserve ) { + const dv = v - context.getValue( context.time - dt ); + context.state.vel = dv / dt; + } else { + context.state.vel = 0.0; + } + } + + const a = Math.sign( v - context.state.pos ) * context.params.a; + context.state.vel += a * dt; + context.state.pos += context.state.vel * dt; + + if ( Math.sign( a ) !== Math.sign( v - context.state.pos ) ) { + context.state.vel *= -context.params.e; + context.state.pos = v + context.params.e * ( v - context.state.pos ); + } + + return context.state.pos; + } +}; + +if ( process.env.DEV ) { + gravity.name = 'Gravity'; + gravity.description = 'Accelerate and bounce the curve.'; + gravity.params = { + a: { name: 'Acceleration', type: 'float', default: 9.8 }, + e: { name: 'Restitution', type: 'float', default: 0.5, min: 0.0 }, + preserve: { name: 'Preserve Velocity', type: 'boolean', default: false } + }; +} diff --git a/src/automaton.json b/src/automaton.json index e799d01..65433f0 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]]}],"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}]}],["Rings/active",{"items":[{},{"time":42.666666666666664,"length":42.666666666666664}]}],["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}]}],["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":[{}]}],["FlickyParticles/active",{"items":[{},{"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.666666666666664,"length":4,"value":5,"curve":22,"amp":-2},{"time":37.33333333333333,"length":4,"value":10,"curve":23,"offset":-0.009374586224097481,"speed":0.333922345475263,"amp":-3},{"time":42.666666666666664,"value":5},{"time":48,"value":3},{"time":53.33333333333333,"value":5},{"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,"curve":23,"speed":0.2499999999999999,"amp":0.30000000000000004},{"time":37.33333333333333},{"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,"curve":23,"speed":0.2499999999999999,"amp":0.30000000000000004},{"time":37.33333333333333},{"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}]}]],"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.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":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.666666666666664,"length":4,"value":5,"curve":22,"amp":-2},{"time":37.33333333333333,"length":4,"value":10,"curve":23,"offset":-0.009374586224097481,"speed":0.333922345475263,"amp":-3},{"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,"curve":23,"speed":0.2499999999999999,"amp":0.30000000000000004},{"time":37.33333333333333},{"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,"curve":23,"speed":0.2499999999999999,"amp":0.30000000000000004},{"time":37.33333333333333},{"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/GPUParticles.ts b/src/entities/GPUParticles.ts index fb6440d..8e09a5a 100644 --- a/src/entities/GPUParticles.ts +++ b/src/entities/GPUParticles.ts @@ -2,7 +2,7 @@ import { BufferRenderTarget, BufferRenderTargetOptions } from '../heck/BufferRen import { Entity } from '../heck/Entity'; import { Geometry } from '../heck/Geometry'; import { Lambda } from '../heck/components/Lambda'; -import { Material, MaterialMap, MaterialTag } from '../heck/Material'; +import { Material, MaterialMap } from '../heck/Material'; import { Mesh } from '../heck/components/Mesh'; import { Quad } from '../heck/components/Quad'; import { Swap } from '@fms-cat/experimental'; @@ -12,7 +12,7 @@ import { objectValuesMap } from '../utils/objectEntriesMap'; export interface GPUParticlesOptions { materialCompute: Material; geometryRender: Geometry; - materialsRender: Partial>; + materialsRender: MaterialMap; computeWidth: number; computeHeight: number; computeNumBuffers: number; diff --git a/src/entities/IFSPiston.ts b/src/entities/IFSPiston.ts new file mode 100644 index 0000000..8cb53bd --- /dev/null +++ b/src/entities/IFSPiston.ts @@ -0,0 +1,73 @@ +import { Entity } from '../heck/Entity'; +import { Geometry } from '../heck/Geometry'; +import { Lambda } from '../heck/components/Lambda'; +import { MaterialMap } from '../heck/Material'; +import { Mesh, MeshCull } from '../heck/components/Mesh'; +import { Quaternion, Vector3 } from '@fms-cat/experimental'; +import { auto } from '../globals/automaton'; +import { objectValuesMap } from '../utils/objectEntriesMap'; + +interface IFSPistonOptions { + group: number; + geometry: Geometry; + materials: MaterialMap; +} + +export class IFSPiston extends Entity { + public constructor( { group, geometry, materials }: IFSPistonOptions ) { + super(); + + const entityCube = new Entity(); + entityCube.transform.position = new Vector3( [ 0.0, 10.0, 0.0 ] ); + this.children.push( entityCube ); + + // -- animation -------------------------------------------------------------------------------- + const up = new Vector3( [ 0, 1, 0 ] ); + + auto( `IFSPistons/group${ group }/rot`, ( { value } ) => { + entityCube.transform.rotation = Quaternion.fromAxisAngle( up, 4.0 * Math.PI * value ); + } ); + + // -- updater ---------------------------------------------------------------------------------- + entityCube.components.push( new Lambda( { + onDraw: ( event ) => { + objectValuesMap( materials, ( material ) => { + if ( material == null ) { return; } + + material.addUniform( + 'ifsSeed', + '1f', + auto( `IFSPistons/group${ group }/rot` ) + 60.0 * group, + ); + + material.addUniform( + 'cameraNearFar', + '2f', + event.camera.near, + event.camera.far + ); + + material.addUniformMatrixVector( + 'inversePVM', + 'Matrix4fv', + event.projectionMatrix + .multiply( event.viewMatrix ) + .multiply( event.globalTransform.matrix ) + .inverse! + .elements + ); + } ); + }, + name: process.env.DEV && 'IFSPiston/updater', + } ) ); + + // -- mesh ------------------------------------------------------------------------------------- + const mesh = new Mesh( { + geometry, + materials, + name: process.env.DEV && 'IFSPiston/mesh', + } ); + mesh.cull = MeshCull.None; + entityCube.components.push( mesh ); + } +} diff --git a/src/entities/IFSPistons.ts b/src/entities/IFSPistons.ts new file mode 100644 index 0000000..753a952 --- /dev/null +++ b/src/entities/IFSPistons.ts @@ -0,0 +1,87 @@ +import { Entity } from '../heck/Entity'; +import { Geometry } from '../heck/Geometry'; +import { IFSPiston } from './IFSPiston'; +import { Material } from '../heck/Material'; +import { Vector3 } from '@fms-cat/experimental'; +import { auto } from '../globals/automaton'; +import { dummyRenderTarget, dummyRenderTargetFourDrawBuffers } from '../globals/dummyRenderTarget'; +import { genCube } from '../geometries/genCube'; +import { objectValuesMap } from '../utils/objectEntriesMap'; +import { quatFromUnitVectors } from '../utils/quatFromUnitVectors'; +import ifsPistonFrag from '../shaders/ifs-piston.frag'; +import raymarchObjectVert from '../shaders/raymarch-object.vert'; + +export class IFSPistons extends Entity { + public constructor() { + super(); + + // -- geometry --------------------------------------------------------------------------------- + const cube = genCube( { dimension: [ 1.1, 10.1, 1.1 ] } ); + + const geometry = new Geometry(); + + geometry.vao.bindVertexbuffer( cube.position, 0, 3 ); + geometry.vao.bindIndexbuffer( cube.index ); + + geometry.count = cube.count; + geometry.mode = cube.mode; + geometry.indexType = cube.indexType; + + // -- materials -------------------------------------------------------------------------------- + const deferred = new Material( + raymarchObjectVert, + ifsPistonFrag, + { + defines: [ 'DEFERRED 1' ], + initOptions: { geometry, target: dummyRenderTargetFourDrawBuffers }, + }, + ); + + const depth = new Material( + raymarchObjectVert, + ifsPistonFrag, + { + defines: [ 'SHADOW 1' ], + initOptions: { geometry, target: dummyRenderTarget } + }, + ); + + const materials = { deferred, depth }; + + if ( process.env.DEV ) { + if ( module.hot ) { + module.hot.accept( '../shaders/ifs-piston.frag', () => { + deferred.replaceShader( raymarchObjectVert, ifsPistonFrag ); + depth.replaceShader( raymarchObjectVert, ifsPistonFrag ); + } ); + } + } + + objectValuesMap( materials, ( material ) => { + material.addUniform( 'range', '4f', -1.0, -1.0, 1.0, 1.0 ); + } ); + + // -- children pistons ------------------------------------------------------------------------- + const up = new Vector3( [ 0, 1, 0 ] ); + + ( [ + [ new Vector3( [ 1, 1, 0 ] ).normalized, 0 ], + [ new Vector3( [ -1, -1, 0 ] ).normalized, 0 ], + [ new Vector3( [ -1, 1, 0 ] ).normalized, 1 ], + [ new Vector3( [ 1, -1, 0 ] ).normalized, 1 ], + ] as [ Vector3, number ][] ).map( ( [ v, group ] ) => { + const piston = new IFSPiston( { group, geometry, materials } ); + + piston.transform.position = v.scale( 1.5 ); + piston.transform.rotation = quatFromUnitVectors( up, v ); + + auto( `IFSPistons/group${ group }/pos`, ( { value } ) => { + piston.transform.position = v.scale( value ); + } ); + + this.children.push( piston ); + + return piston; + } ); + } +} diff --git a/src/geometries/genCube.ts b/src/geometries/genCube.ts index c9224d1..6d631d9 100644 --- a/src/geometries/genCube.ts +++ b/src/geometries/genCube.ts @@ -10,7 +10,11 @@ interface ResultGenCube { indexType: GLenum; } -export function genCube(): ResultGenCube { +export function genCube( options?: { + dimension?: [ number, number, number ] +} ): ResultGenCube { + const dimension = options?.dimension ?? [ 1, 1, 1 ]; + const pos: number[] = []; const nor: number[] = []; const ind: number[] = []; @@ -29,7 +33,7 @@ export function genCube(): ResultGenCube { ]; for ( let i = 0; i < 6; i ++ ) { - const func = ( v: number[] ): number[] => { + const rotate = ( v: number[] ): number[] => { const vt: number[] = []; if ( i < 4 ) { @@ -47,8 +51,16 @@ export function genCube(): ResultGenCube { return vt; }; - pos.push( ...p.map( func ).flat() ); - nor.push( ...n.map( func ).flat() ); + const scale = ( v: number[] ): number[] => { + return [ + v[ 0 ] * dimension[ 0 ], + v[ 1 ] * dimension[ 1 ], + v[ 2 ] * dimension[ 2 ], + ]; + }; + + pos.push( ...p.map( rotate ).map( scale ).flat() ); + nor.push( ...n.map( rotate ).flat() ); ind.push( ...[ 0, 1, 3, 0, 3, 2 ].map( ( v ) => v + 4 * i ) ); } diff --git a/src/heck/Material.ts b/src/heck/Material.ts index 0b677d8..633fcda 100644 --- a/src/heck/Material.ts +++ b/src/heck/Material.ts @@ -10,7 +10,7 @@ export type MaterialTag = | 'forward' | 'depth'; -export type MaterialMap = { [ tag in T ]: Material }; +export type MaterialMap = { [ tag in MaterialTag ]?: Material }; export interface MaterialInitOptions { target: RenderTarget; diff --git a/src/heck/components/Mesh.ts b/src/heck/components/Mesh.ts index 255cc4f..af9d6f3 100644 --- a/src/heck/components/Mesh.ts +++ b/src/heck/components/Mesh.ts @@ -1,6 +1,6 @@ import { Component, ComponentDrawEvent, ComponentOptions } from './Component'; import { Geometry } from '../Geometry'; -import { MaterialMap, MaterialTag } from '../Material'; +import { MaterialMap } from '../Material'; import { glCat } from '../../globals/canvas'; export enum MeshCull { @@ -18,12 +18,12 @@ const meshCullMap = { export interface MeshOptions extends ComponentOptions { geometry: Geometry; - materials: Partial>; + materials: MaterialMap; } export class Mesh extends Component { public geometry: Geometry; - public materials: Partial>; + public materials: MaterialMap; public cull: MeshCull = MeshCull.Back; @@ -64,7 +64,7 @@ export class Mesh extends Component { program.uniform( 'cameraPos', '3f', ...event.cameraTransform.position.elements ); program.uniform( 'cameraNearFar', '2f', event.camera.near, event.camera.far ); - program.uniformMatrixVector( 'normalMatrix', 'Matrix4fv', event.globalTransform.matrix.inverse!.transpose.elements ); + program.uniformMatrixVector( 'normalMatrix', 'Matrix4fv', event.globalTransform.matrix.inverse!.elements, true ); program.uniformMatrixVector( 'modelMatrix', 'Matrix4fv', event.globalTransform.matrix.elements ); program.uniformMatrixVector( 'viewMatrix', 'Matrix4fv', event.viewMatrix.elements ); program.uniformMatrixVector( 'projectionMatrix', 'Matrix4fv', event.projectionMatrix.elements ); diff --git a/src/main.ts b/src/main.ts index 800ffcd..1d67712 100644 --- a/src/main.ts +++ b/src/main.ts @@ -6,6 +6,7 @@ import { canvas } from './globals/canvas'; import { dog } from './scene'; import { getCheckboxActive, getDivCanvasContainer } from './globals/dom'; import { music } from './globals/music'; +import type { AutomatonWithGUI } from '@fms-cat/automaton-with-gui'; // == dom ========================================================================================== document.body.style.margin = '0'; @@ -54,7 +55,7 @@ if ( process.env.DEV ) { music.isPlaying = false; checkboxActive.checked = false; } else if ( event.key === ' ' ) { - music.isPlaying = !music.isPlaying; + ( automaton as AutomatonWithGUI ).togglePlay(); } else if ( event.key === 'ArrowLeft' ) { music.time -= 480.0 / MUSIC_BPM; automaton.reset(); diff --git a/src/shaders/ifs-piston.frag b/src/shaders/ifs-piston.frag new file mode 100644 index 0000000..afe225a --- /dev/null +++ b/src/shaders/ifs-piston.frag @@ -0,0 +1,196 @@ +#version 300 es + +precision highp float; + +#define fs(i) (fract(sin((i)*114.514)*1919.810)) +#define saturate(x) clamp(x,0.,1.) +#define linearstep(a,b,x) saturate(((x)-(a))/((b)-(a))) + +const int MARCH_ITER = 90; +const 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; + +#ifdef DEFERRED + layout (location = 0) out vec4 fragPosition; + layout (location = 1) out vec4 fragNormal; + layout (location = 2) out vec4 fragColor; + layout (location = 3) out vec4 fragWTF; +#endif + +in vec4 vPosition; + +#ifdef SHADOW + out vec4 fragColor; +#endif + +uniform float deformAmp; +uniform float deformFreq; +uniform float deformTime; +uniform float time; +uniform float ifsSeed; +uniform vec2 resolution; +uniform vec2 cameraNearFar; +uniform vec3 cameraPos; +uniform mat4 normalMatrix; +uniform mat4 modelMatrix; +uniform mat4 viewMatrix; +uniform mat4 projectionMatrix; +uniform mat4 inversePVM; +uniform sampler2D samplerRandom; +uniform sampler2D samplerRandomStatic; +uniform sampler2D samplerCapture; + +vec3 divideByW( vec4 v ) { + return v.xyz / v.w; +} + +// https://www.iquilezles.org/www/articles/smin/smin.htm +float smin( float a, float b, float k ) { + float h = max( k - abs( a - b ), 0.0 ) / k; + return min( a, b ) - h * h * h * k * ( 1.0 / 6.0 ); +} + +mat2 rot2d( float t ) { + float c = cos( t ); + float s = sin( t ); + return mat2( c, -s, s, c ); +} + +#pragma glslify: orthBasis = require( ./modules/orthBasis ); +#pragma glslify: cyclicNoise = require( ./modules/cyclicNoise ); + +vec3 ifs( vec3 p, vec3 r, vec3 t ) { + vec3 s = t; + mat3 bas = orthBasis( r ); + + for ( int i = 0; i < 6; i ++ ) { + p = abs( p ) - abs( s ) * pow( 1.7, -float( i ) ); + + s = bas * s; + + p.xy = p.x < p.y ? p.yx : p.xy; + p.yz = p.y < p.z ? p.zy : p.yz; + } + + return p; +} + +float box( vec3 p, vec3 s ) { + vec3 d = abs( p ) - s; + return min( 0.0, max( d.x, max( d.y, d.z ) ) ) + length( max( vec3( 0.0 ), d ) ); +} + +vec4 map( vec3 p ) { + p.y += 10.0; + + float d1, d2; + + { + float clampbox = box( p - 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 ) ), + fs( vec3( 4.7, 2.2, 8.3 ) + floor( ifsSeed + 1.0 ) ), + fract( ifsSeed ) + ); + vec3 t = 0.1 * vec3( 3.0, 2.3, 3.5 ); + vec3 pt = ifs( p, r, t ); + + pt = mod( pt - 0.1, 0.2 ) - 0.1; + + d1 = max( box( pt, vec3( 0.02 ) ), clampbox ); + } + + { + float clampbox = box( p - 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 ) ), + fs( vec3( 5.3, 1.1, 2.9 ) + floor( ifsSeed + 1.0 ) ), + fract( ifsSeed ) + ); + vec3 t = 0.2 * vec3( 3.0, 2.3, 3.5 ); + vec3 pt = ifs( p, r, t ); + + pt = mod( pt - 0.1, 0.2 ) - 0.1; + + d2 = max( box( pt, vec3( 0.07 ) ), clampbox ); + } + + return d1 < d2 ? vec4( d1, 1, 0, 0 ) : vec4( d2, 2, 0, 0 ); +} + +vec3 normalFunc( vec3 p, float dd ) { + vec2 d = vec2( 0.0, dd ); + return normalize( vec3( + map( p + d.yxx ).x - map( p - d.yxx ).x, + map( p + d.xyx ).x - map( p - d.xyx ).x, + map( p + d.xxy ).x - map( p - d.xxy ).x + ) ); +} + +void main() { + vec2 p = ( gl_FragCoord.xy * 2.0 - resolution ) / resolution.y; + + vec3 rayOri = divideByW( inversePVM * vec4( p, 0.0, 1.0 ) ); + vec3 farPos = divideByW( inversePVM * vec4( p, 1.0, 1.0 ) ); + vec3 rayDir = normalize( farPos - rayOri ); + float rayLen = length( vPosition.xyz - cameraPos ); + vec3 rayPos = rayOri + rayDir * rayLen; + vec4 isect; + + for ( int i = 0; i < MARCH_ITER; i ++ ) { + isect = map( rayPos ); + rayLen += 0.5 * isect.x; + rayPos = rayOri + rayDir * rayLen; + + if ( abs( isect.x ) < 1E-3 ) { break; } + if ( rayLen > cameraNearFar.y ) { break; } + } + + if ( 0.01 < isect.x ) { + discard; + } + + vec3 modelNormal = ( normalMatrix * vec4( normalFunc( rayPos, 1E-3 ), 1.0 ) ).xyz; + + vec4 modelPos = modelMatrix * vec4( rayPos, 1.0 ); + vec4 projPos = projectionMatrix * viewMatrix * modelPos; // terrible + float depth = projPos.z / projPos.w; + gl_FragDepth = 0.5 + 0.5 * depth; + + #ifdef DEFERRED + fragPosition = vec4( modelPos.xyz, depth ); + fragNormal = vec4( modelNormal, 1.0 ); + + if ( isect.y == 2.0 ) { + vec3 noise = cyclicNoise( 6.0 * rayPos ); + vec3 noiseDetail = cyclicNoise( vec3( 38.0, 1.0, 1.0 ) * ( orthBasis( vec3( 1 ) ) * rayPos ) ); + float roughness = ( + 0.6 + + 0.1 * noise.x + + 0.2 * smoothstep( -0.2, 0.4, noise.y ) * ( 0.8 + 0.2 * sin( 17.0 * noiseDetail.x ) ) + ); + + fragColor = vec4( vec3( 0.4 ), 1.0 ); + fragWTF = vec4( vec3( roughness, 0.9, 0.0 ), MTL_PBR ); + } else if ( isect.y == 1.0 ) { + fragColor = vec4( vec3( 1.0 ), 1.0 ); + fragWTF = vec4( vec3( 0.3, 0.1, 0.0 ), MTL_PBR ); + } + + #endif + + #ifdef SHADOW + float shadowDepth = linearstep( + cameraNearFar.x, + cameraNearFar.y, + length( cameraPos - rayPos ) + ); + fragColor = vec4( shadowDepth, shadowDepth * shadowDepth, shadowDepth, 1.0 ); + #endif +} diff --git a/src/shaders/wobbleball.frag b/src/shaders/wobbleball.frag index b9d6520..0d18331 100644 --- a/src/shaders/wobbleball.frag +++ b/src/shaders/wobbleball.frag @@ -34,6 +34,8 @@ uniform float time; uniform vec2 resolution; uniform vec2 cameraNearFar; uniform vec3 cameraPos; +uniform mat4 normalMatrix; +uniform mat4 modelMatrix; uniform mat4 viewMatrix; uniform mat4 projectionMatrix; uniform mat4 inversePVM; @@ -130,17 +132,17 @@ void main() { discard; } - vec3 normal = normalFunc( rayPos, 1E-2 ); - vec4 color = vec4( 0.4, 0.7, 0.9, 1.0 ); + vec3 modelNormal = ( normalMatrix * vec4( normalFunc( rayPos, 1E-2 ), 1.0 ) ).xyz; - vec4 projPos = projectionMatrix * viewMatrix * vec4( rayPos, 1.0 ); // terrible + vec4 modelPos = modelMatrix * vec4( rayPos, 1.0 ); + vec4 projPos = projectionMatrix * viewMatrix * modelPos; // terrible float depth = projPos.z / projPos.w; gl_FragDepth = 0.5 + 0.5 * depth; #ifdef DEFERRED - fragPosition = vec4( rayPos, depth ); - fragNormal = vec4( normal, 1.0 ); - fragColor = color; + 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 ); #endif diff --git a/src/utils/quatFromUnitVectors.ts b/src/utils/quatFromUnitVectors.ts new file mode 100644 index 0000000..73ac1ed --- /dev/null +++ b/src/utils/quatFromUnitVectors.ts @@ -0,0 +1,21 @@ +import { Quaternion, Vector3 } from '@fms-cat/experimental'; + +// https://github.com/mrdoob/three.js/blob/94f043c4e105eb73236529231388402da2b07cba/src/math/Quaternion.js#L362 +export function quatFromUnitVectors( a: Vector3, b: Vector3 ): Quaternion { + const r = a.dot( b ) + 1.0; + + if ( r < 1E-4 ) { + if ( Math.abs( a.x ) > Math.abs( a.z ) ) { + return new Quaternion( [ -a.y, a.x, 0.0, r ] ).normalized; + } else { + return new Quaternion( [ 0.0, -a.z, a.y, r ] ).normalized; + } + } else { + return new Quaternion( [ + a.y * b.z - a.z * b.y, + a.z * b.x - a.x * b.z, + a.x * b.y - a.y * b.x, + r, + ] ).normalized; + } +}