@polarfront-lab/ionian 1.1.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ionian.iife.js +1 -6
- package/dist/ionian.iife.js.map +1 -1
- package/dist/ionian.js +160 -2012
- package/dist/ionian.js.map +1 -1
- package/package.json +1 -3
package/dist/ionian.iife.js
CHANGED
|
@@ -1,7 +1,2 @@
|
|
|
1
|
-
var ionian=function(e,t,i){"use strict";var s=Object.defineProperty,r=(e,t,i)=>((e,t,i)=>t in e?s(e,t,{enumerable:!0,configurable:!0,writable:!0,value:i}):e[t]=i)(e,"symbol"!=typeof t?t+"":t,i),n="undefined"!=typeof document?document.currentScript:null;function o(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e)for(const i in e)if("default"!==i){const s=Object.getOwnPropertyDescriptor(e,i);Object.defineProperty(t,i,s.get?s:{enumerable:!0,get:()=>e[i]})}return t.default=e,Object.freeze(t)}const a=o(t),c=e=>e;class u{constructor(){var e;r(this,"emitter",{all:e=e||new Map,on:function(t,i){var s=e.get(t);s?s.push(i):e.set(t,[i])},off:function(t,i){var s=e.get(t);s&&(i?s.splice(s.indexOf(i)>>>0,1):e.set(t,[]))},emit:function(t,i){var s=e.get(t);s&&s.slice().map((function(e){e(i)})),(s=e.get("*"))&&s.slice().map((function(e){e(t,i)}))}})}emit(e,t){this.emitter.emit(e,t)}off(e,t){this.emitter.off(e,t)}on(e,t){this.emitter.on(e,t)}once(e,t){this.emitter.on(e,(i=>{this.emitter.off(e,t),t(i)}))}dispose(){this.emitter.all.clear()}}
|
|
2
|
-
/**
|
|
3
|
-
* @license
|
|
4
|
-
* Copyright 2019 Google LLC
|
|
5
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
6
|
-
*/const h=Symbol("Comlink.proxy"),l=Symbol("Comlink.endpoint"),d=Symbol("Comlink.releaseProxy"),m=Symbol("Comlink.finalizer"),p=Symbol("Comlink.thrown"),g=e=>"object"==typeof e&&null!==e||"function"==typeof e,v=new Map([["proxy",{canHandle:e=>g(e)&&e[h],serialize(e){const{port1:t,port2:i}=new MessageChannel;return f(e,t),[i,[i]]},deserialize:e=>(e.start(),x(e))}],["throw",{canHandle:e=>g(e)&&p in e,serialize({value:e}){let t;return t=e instanceof Error?{isError:!0,value:{message:e.message,name:e.name,stack:e.stack}}:{isError:!1,value:e},[t,[]]},deserialize(e){if(e.isError)throw Object.assign(new Error(e.value.message),e.value);throw e.value}}]]);function f(e,t=globalThis,i=["*"]){t.addEventListener("message",(function s(r){if(!r||!r.data)return;if(!function(e,t){for(const i of e){if(t===i||"*"===i)return!0;if(i instanceof RegExp&&i.test(t))return!0}return!1}(i,r.origin))return void console.warn(`Invalid origin '${r.origin}' for comlink proxy`);const{id:n,type:o,path:a}=Object.assign({path:[]},r.data),c=(r.data.argumentList||[]).map(D);let u;try{const t=a.slice(0,-1).reduce(((e,t)=>e[t]),e),i=a.reduce(((e,t)=>e[t]),e);switch(o){case"GET":u=i;break;case"SET":t[a.slice(-1)[0]]=D(r.data.value),u=!0;break;case"APPLY":u=i.apply(t,c);break;case"CONSTRUCT":u=function(e){return Object.assign(e,{[h]:!0})}(new i(...c));break;case"ENDPOINT":{const{port1:t,port2:i}=new MessageChannel;f(e,i),u=function(e,t){return R.set(e,t),e}(t,[t])}break;case"RELEASE":u=void 0;break;default:return}}catch(l){u={value:l,[p]:0}}Promise.resolve(u).catch((e=>({value:e,[p]:0}))).then((i=>{const[r,a]=P(i);t.postMessage(Object.assign(Object.assign({},r),{id:n}),a),"RELEASE"===o&&(t.removeEventListener("message",s),y(t),m in e&&"function"==typeof e[m]&&e[m]())})).catch((e=>{const[i,s]=P({value:new TypeError("Unserializable return value"),[p]:0});t.postMessage(Object.assign(Object.assign({},i),{id:n}),s)}))})),t.start&&t.start()}function y(e){(function(e){return"MessagePort"===e.constructor.name})(e)&&e.close()}function x(e,t){const i=new Map;return e.addEventListener("message",(function(e){const{data:t}=e;if(!t||!t.id)return;const s=i.get(t.id);if(s)try{s(t)}finally{i.delete(t.id)}})),b(e,i,[],t)}function T(e){if(e)throw new Error("Proxy has been released and is not useable")}function _(e){return I(e,new Map,{type:"RELEASE"}).then((()=>{y(e)}))}const M=new WeakMap,w="FinalizationRegistry"in globalThis&&new FinalizationRegistry((e=>{const t=(M.get(e)||0)-1;M.set(e,t),0===t&&_(e)}));function b(e,t,i=[],s=function(){}){let r=!1;const n=new Proxy(s,{get(s,o){if(T(r),o===d)return()=>{!function(e){w&&w.unregister(e)}(n),_(e),t.clear(),r=!0};if("then"===o){if(0===i.length)return{then:()=>n};const s=I(e,t,{type:"GET",path:i.map((e=>e.toString()))}).then(D);return s.then.bind(s)}return b(e,t,[...i,o])},set(s,n,o){T(r);const[a,c]=P(o);return I(e,t,{type:"SET",path:[...i,n].map((e=>e.toString())),value:a},c).then(D)},apply(s,n,o){T(r);const a=i[i.length-1];if(a===l)return I(e,t,{type:"ENDPOINT"}).then(D);if("bind"===a)return b(e,t,i.slice(0,-1));const[c,u]=S(o);return I(e,t,{type:"APPLY",path:i.map((e=>e.toString())),argumentList:c},u).then(D)},construct(s,n){T(r);const[o,a]=S(n);return I(e,t,{type:"CONSTRUCT",path:i.map((e=>e.toString())),argumentList:o},a).then(D)}});return function(e,t){const i=(M.get(t)||0)+1;M.set(t,i),w&&w.register(e,t,e)}(n,e),n}function S(e){const t=e.map(P);return[t.map((e=>e[0])),(i=t.map((e=>e[1])),Array.prototype.concat.apply([],i))];var i}const R=new WeakMap;function P(e){for(const[t,i]of v)if(i.canHandle(e)){const[s,r]=i.serialize(e);return[{type:"HANDLER",name:t,value:s},r]}return[{type:"RAW",value:e},R.get(e)||[]]}function D(e){switch(e.type){case"HANDLER":return v.get(e.name).deserialize(e.value);case"RAW":return e.value}}function I(e,t,i,s){return new Promise((r=>{const n=new Array(4).fill(0).map((()=>Math.floor(Math.random()*Number.MAX_SAFE_INTEGER).toString(16))).join("-");t.set(n,r),e.start&&e.start(),e.postMessage(Object.assign({id:n},i),s)}))}function C(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var E,z,G,A,F,V,O,L,N,B,j,k,U,K,W,Z,X,Y,q,J,H,Q,$,ee,te,ie,se,re,ne,oe,ae,ce,ue,he={exports:{}};function le(){if(E)return he.exports;E=1;var e,t="object"==typeof Reflect?Reflect:null,i=t&&"function"==typeof t.apply?t.apply:function(e,t,i){return Function.prototype.apply.call(e,t,i)};e=t&&"function"==typeof t.ownKeys?t.ownKeys:Object.getOwnPropertySymbols?function(e){return Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e))}:function(e){return Object.getOwnPropertyNames(e)};var s=Number.isNaN||function(e){return e!=e};function r(){r.init.call(this)}he.exports=r,he.exports.once=function(e,t){return new Promise((function(i,s){function r(i){e.removeListener(t,n),s(i)}function n(){"function"==typeof e.removeListener&&e.removeListener("error",r),i([].slice.call(arguments))}p(e,t,n,{once:!0}),"error"!==t&&function(e,t,i){"function"==typeof e.on&&p(e,"error",t,i)}(e,r,{once:!0})}))},r.EventEmitter=r,r.prototype._events=void 0,r.prototype._eventsCount=0,r.prototype._maxListeners=void 0;var n=10;function o(e){if("function"!=typeof e)throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof e)}function a(e){return void 0===e._maxListeners?r.defaultMaxListeners:e._maxListeners}function c(e,t,i,s){var r,n,c,u;if(o(i),void 0===(n=e._events)?(n=e._events=Object.create(null),e._eventsCount=0):(void 0!==n.newListener&&(e.emit("newListener",t,i.listener?i.listener:i),n=e._events),c=n[t]),void 0===c)c=n[t]=i,++e._eventsCount;else if("function"==typeof c?c=n[t]=s?[i,c]:[c,i]:s?c.unshift(i):c.push(i),(r=a(e))>0&&c.length>r&&!c.warned){c.warned=!0;var h=new Error("Possible EventEmitter memory leak detected. "+c.length+" "+String(t)+" listeners added. Use emitter.setMaxListeners() to increase limit");h.name="MaxListenersExceededWarning",h.emitter=e,h.type=t,h.count=c.length,u=h,console&&console.warn&&console.warn(u)}return e}function u(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,0===arguments.length?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function h(e,t,i){var s={fired:!1,wrapFn:void 0,target:e,type:t,listener:i},r=u.bind(s);return r.listener=i,s.wrapFn=r,r}function l(e,t,i){var s=e._events;if(void 0===s)return[];var r=s[t];return void 0===r?[]:"function"==typeof r?i?[r.listener||r]:[r]:i?function(e){for(var t=new Array(e.length),i=0;i<t.length;++i)t[i]=e[i].listener||e[i];return t}(r):m(r,r.length)}function d(e){var t=this._events;if(void 0!==t){var i=t[e];if("function"==typeof i)return 1;if(void 0!==i)return i.length}return 0}function m(e,t){for(var i=new Array(t),s=0;s<t;++s)i[s]=e[s];return i}function p(e,t,i,s){if("function"==typeof e.on)s.once?e.once(t,i):e.on(t,i);else{if("function"!=typeof e.addEventListener)throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type '+typeof e);e.addEventListener(t,(function r(n){s.once&&e.removeEventListener(t,r),i(n)}))}}return Object.defineProperty(r,"defaultMaxListeners",{enumerable:!0,get:function(){return n},set:function(e){if("number"!=typeof e||e<0||s(e))throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+e+".");n=e}}),r.init=function(){void 0!==this._events&&this._events!==Object.getPrototypeOf(this)._events||(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},r.prototype.setMaxListeners=function(e){if("number"!=typeof e||e<0||s(e))throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received '+e+".");return this._maxListeners=e,this},r.prototype.getMaxListeners=function(){return a(this)},r.prototype.emit=function(e){for(var t=[],s=1;s<arguments.length;s++)t.push(arguments[s]);var r="error"===e,n=this._events;if(void 0!==n)r=r&&void 0===n.error;else if(!r)return!1;if(r){var o;if(t.length>0&&(o=t[0]),o instanceof Error)throw o;var a=new Error("Unhandled error."+(o?" ("+o.message+")":""));throw a.context=o,a}var c=n[e];if(void 0===c)return!1;if("function"==typeof c)i(c,this,t);else{var u=c.length,h=m(c,u);for(s=0;s<u;++s)i(h[s],this,t)}return!0},r.prototype.addListener=function(e,t){return c(this,e,t,!1)},r.prototype.on=r.prototype.addListener,r.prototype.prependListener=function(e,t){return c(this,e,t,!0)},r.prototype.once=function(e,t){return o(t),this.on(e,h(this,e,t)),this},r.prototype.prependOnceListener=function(e,t){return o(t),this.prependListener(e,h(this,e,t)),this},r.prototype.removeListener=function(e,t){var i,s,r,n,a;if(o(t),void 0===(s=this._events))return this;if(void 0===(i=s[e]))return this;if(i===t||i.listener===t)0==--this._eventsCount?this._events=Object.create(null):(delete s[e],s.removeListener&&this.emit("removeListener",e,i.listener||t));else if("function"!=typeof i){for(r=-1,n=i.length-1;n>=0;n--)if(i[n]===t||i[n].listener===t){a=i[n].listener,r=n;break}if(r<0)return this;0===r?i.shift():function(e,t){for(;t+1<e.length;t++)e[t]=e[t+1];e.pop()}(i,r),1===i.length&&(s[e]=i[0]),void 0!==s.removeListener&&this.emit("removeListener",e,a||t)}return this},r.prototype.off=r.prototype.removeListener,r.prototype.removeAllListeners=function(e){var t,i,s;if(void 0===(i=this._events))return this;if(void 0===i.removeListener)return 0===arguments.length?(this._events=Object.create(null),this._eventsCount=0):void 0!==i[e]&&(0==--this._eventsCount?this._events=Object.create(null):delete i[e]),this;if(0===arguments.length){var r,n=Object.keys(i);for(s=0;s<n.length;++s)"removeListener"!==(r=n[s])&&this.removeAllListeners(r);return this.removeAllListeners("removeListener"),this._events=Object.create(null),this._eventsCount=0,this}if("function"==typeof(t=i[e]))this.removeListener(e,t);else if(void 0!==t)for(s=t.length-1;s>=0;s--)this.removeListener(e,t[s]);return this},r.prototype.listeners=function(e){return l(this,e,!0)},r.prototype.rawListeners=function(e){return l(this,e,!1)},r.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):d.call(e,t)},r.prototype.listenerCount=d,r.prototype.eventNames=function(){return this._eventsCount>0?e(this._events):[]},he.exports}function de(){if(O)return V;O=1;const e=F?A:(F=1,A=class{constructor(){this.fifo=!0,this.priorityRange=1,this.testOnBorrow=!1,this.testOnReturn=!1,this.autostart=!0,this.evictionRunIntervalMillis=0,this.numTestsPerEvictionRun=3,this.softIdleTimeoutMillis=-1,this.idleTimeoutMillis=3e4,this.acquireTimeoutMillis=null,this.destroyTimeoutMillis=null,this.maxWaitingClients=null,this.min=null,this.max=null,this.Promise=Promise}});return V=class{constructor(t){const i=new e;t=t||{},this.fifo="boolean"==typeof t.fifo?t.fifo:i.fifo,this.priorityRange=t.priorityRange||i.priorityRange,this.testOnBorrow="boolean"==typeof t.testOnBorrow?t.testOnBorrow:i.testOnBorrow,this.testOnReturn="boolean"==typeof t.testOnReturn?t.testOnReturn:i.testOnReturn,this.autostart="boolean"==typeof t.autostart?t.autostart:i.autostart,t.acquireTimeoutMillis&&(this.acquireTimeoutMillis=parseInt(t.acquireTimeoutMillis,10)),t.destroyTimeoutMillis&&(this.destroyTimeoutMillis=parseInt(t.destroyTimeoutMillis,10)),void 0!==t.maxWaitingClients&&(this.maxWaitingClients=parseInt(t.maxWaitingClients,10)),this.max=parseInt(t.max,10),this.min=parseInt(t.min,10),this.max=Math.max(isNaN(this.max)?1:this.max,1),this.min=Math.min(isNaN(this.min)?0:this.min,this.max),this.evictionRunIntervalMillis=t.evictionRunIntervalMillis||i.evictionRunIntervalMillis,this.numTestsPerEvictionRun=t.numTestsPerEvictionRun||i.numTestsPerEvictionRun,this.softIdleTimeoutMillis=t.softIdleTimeoutMillis||i.softIdleTimeoutMillis,this.idleTimeoutMillis=t.idleTimeoutMillis||i.idleTimeoutMillis,this.Promise=null!=t.Promise?t.Promise:i.Promise}}}function me(){if(N)return L;N=1;class e{constructor(t){this._state=e.PENDING,this._resolve=void 0,this._reject=void 0,this._promise=new t(((e,t)=>{this._resolve=e,this._reject=t}))}get state(){return this._state}get promise(){return this._promise}reject(t){this._state===e.PENDING&&(this._state=e.REJECTED,this._reject(t))}resolve(t){this._state===e.PENDING&&(this._state=e.FULFILLED,this._resolve(t))}}return e.PENDING="PENDING",e.FULFILLED="FULFILLED",e.REJECTED="REJECTED",L=e}function pe(){if(U)return k;U=1;const e=me(),t=function(){if(j)return B;j=1;class e extends Error{constructor(e){super(e),this.name=this.constructor.name,this.message=e,"function"==typeof Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error(e).stack}}return B={TimeoutError:class extends e{constructor(e){super(e)}}}}();class i extends e{constructor(e,t){super(t),this._creationTimestamp=Date.now(),this._timeout=null,void 0!==e&&this.setTimeout(e)}setTimeout(e){if(this._state!==i.PENDING)return;const t=parseInt(e,10);if(isNaN(t)||t<=0)throw new Error("delay must be a positive int");const s=Date.now()-this._creationTimestamp;var r,n;this._timeout&&this.removeTimeout(),this._timeout=setTimeout((r=this._fireTimeout,n=this,function(){return r.apply(n,arguments)}),Math.max(t-s,0))}removeTimeout(){this._timeout&&clearTimeout(this._timeout),this._timeout=null}_fireTimeout(){this.reject(new t.TimeoutError("ResourceRequest timed out"))}reject(e){this.removeTimeout(),super.reject(e)}resolve(e){this.removeTimeout(),super.resolve(e)}}return k=i}function ge(){if(q)return Y;q=1;const e=X?Z:(X=1,Z={ALLOCATED:"ALLOCATED",IDLE:"IDLE",INVALID:"INVALID",RETURNING:"RETURNING",VALIDATION:"VALIDATION"});return Y=class{constructor(t){this.creationTime=Date.now(),this.lastReturnTime=null,this.lastBorrowTime=null,this.lastIdleTime=null,this.obj=t,this.state=e.IDLE}allocate(){this.lastBorrowTime=Date.now(),this.state=e.ALLOCATED}deallocate(){this.lastReturnTime=Date.now(),this.state=e.IDLE}invalidate(){this.state=e.INVALID}test(){this.state=e.VALIDATION}idle(){this.lastIdleTime=Date.now(),this.state=e.IDLE}returning(){this.state=e.RETURNING}}}function ve(){if(H)return J;H=1;return J=class{evict(e,t,i){const s=Date.now()-t.lastIdleTime;return e.softIdleTimeoutMillis>0&&e.softIdleTimeoutMillis<s&&e.min<i||e.idleTimeoutMillis<s}}}function fe(){if($)return Q;$=1;return Q=class{constructor(){this.head=null,this.tail=null,this.length=0}insertBeginning(e){null===this.head?(this.head=e,this.tail=e,e.prev=null,e.next=null,this.length++):this.insertBefore(this.head,e)}insertEnd(e){null===this.tail?this.insertBeginning(e):this.insertAfter(this.tail,e)}insertAfter(e,t){t.prev=e,t.next=e.next,null===e.next?this.tail=t:e.next.prev=t,e.next=t,this.length++}insertBefore(e,t){t.prev=e.prev,t.next=e,null===e.prev?this.head=t:e.prev.next=t,e.prev=t,this.length++}remove(e){null===e.prev?this.head=e.next:e.prev.next=e.next,null===e.next?this.tail=e.prev:e.next.prev=e.prev,e.prev=null,e.next=null,this.length--}static createNode(e){return{prev:null,next:null,data:e}}}}function ye(){if(se)return ie;se=1;const e=te?ee:(te=1,ee=class{constructor(e,t){this._list=e,this._direction=!0===t?"prev":"next",this._startPosition=!0===t?"tail":"head",this._started=!1,this._cursor=null,this._done=!1}_start(){this._cursor=this._list[this._startPosition],this._started=!0}_advanceCursor(){if(!1===this._started)return this._started=!0,void(this._cursor=this._list[this._startPosition]);this._cursor=this._cursor[this._direction]}reset(){this._done=!1,this._started=!1,this._cursor=null}remove(){if(!1===this._started||!0===this._done||this._isCursorDetached())return!1;this._list.remove(this._cursor)}next(){return!0===this._done?{done:!0}:(this._advanceCursor(),null===this._cursor||this._isCursorDetached()?(this._done=!0,{done:!0}):{value:this._cursor,done:!1})}_isCursorDetached(){return null===this._cursor.prev&&null===this._cursor.next&&this._list.tail!==this._cursor&&this._list.head!==this._cursor}});return ie=class extends e{next(){const e=super.next();return e.value&&(e.value=e.value.data),e}}}function xe(){if(ne)return re;ne=1;const e=fe(),t=ye();class i{constructor(){this._list=new e}shift(){if(0===this.length)return;const e=this._list.head;return this._list.remove(e),e.data}unshift(t){const i=e.createNode(t);this._list.insertBeginning(i)}push(t){const i=e.createNode(t);this._list.insertEnd(i)}pop(){if(0===this.length)return;const e=this._list.tail;return this._list.remove(e),e.data}[Symbol.iterator](){return new t(this._list)}iterator(){return new t(this._list)}reverseIterator(){return new t(this._list,!0)}get head(){if(0===this.length)return;return this._list.head.data}get tail(){if(0===this.length)return;return this._list.tail.data}get length(){return this._list.length}}return re=i}function Te(){if(ue)return ce;ue=1;const e=function(){if(ae)return oe;ae=1;const e=fe(),t=xe();return oe=class extends t{push(t){const i=e.createNode(t);t.promise.catch(this._createTimeoutRejectionHandler(i)),this._list.insertEnd(i)}_createTimeoutRejectionHandler(e){return t=>{"TimeoutError"===t.name&&this._list.remove(e)}}}}();return ce=class{constructor(t){this._size=Math.max(0|+t,1),this._slots=[];for(let i=0;i<this._size;i++)this._slots.push(new e)}get length(){let e=0;for(let t=0,i=this._slots.length;t<i;t++)e+=this._slots[t].length;return e}enqueue(e,t){(t=t&&0|+t||0)&&(t<0||t>=this._size)&&(t=this._size-1),this._slots[t].push(e)}dequeue(){for(let e=0,t=this._slots.length;e<t;e+=1)if(this._slots[e].length)return this._slots[e].shift()}get head(){for(let e=0,t=this._slots.length;e<t;e+=1)if(this._slots[e].length>0)return this._slots[e].head}get tail(){for(let e=this._slots.length-1;e>=0;e--)if(this._slots[e].length>0)return this._slots[e].tail}}}var _e,Me,we,be,Se,Re={};function Pe(){if(we)return Me;we=1;const e=le().EventEmitter,t=G?z:(G=1,z=function(e){if("function"!=typeof e.create)throw new TypeError("factory.create must be a function");if("function"!=typeof e.destroy)throw new TypeError("factory.destroy must be a function");if(void 0!==e.validate&&"function"!=typeof e.validate)throw new TypeError("factory.validate must be a function")}),i=de(),s=pe(),r=function(){if(W)return K;W=1;const e=me();return K=class extends e{constructor(e,t){super(t),this._creationTimestamp=Date.now(),this.pooledResource=e}reject(){}}}(),n=ge();ve(),xe();const o=me();Te(),ye();const a=function(){if(_e)return Re;function e(){}return _e=1,Re.reflector=function(t){return t.then(e,e)},Re}().reflector;return Me=class extends e{constructor(e,s,r,n,o){super(),t(n),this._config=new i(o),this._Promise=this._config.Promise,this._factory=n,this._draining=!1,this._started=!1,this._waitingClientsQueue=new r(this._config.priorityRange),this._factoryCreateOperations=new Set,this._factoryDestroyOperations=new Set,this._availableObjects=new s,this._testOnBorrowResources=new Set,this._testOnReturnResources=new Set,this._validationOperations=new Set,this._allObjects=new Set,this._resourceLoans=new Map,this._evictionIterator=this._availableObjects.iterator(),this._evictor=new e,this._scheduledEviction=null,!0===this._config.autostart&&this.start()}_destroy(e){e.invalidate(),this._allObjects.delete(e);const t=this._factory.destroy(e.obj),i=this._config.destroyTimeoutMillis?this._Promise.resolve(this._applyDestroyTimeout(t)):this._Promise.resolve(t);this._trackOperation(i,this._factoryDestroyOperations).catch((e=>{this.emit("factoryDestroyError",e)})),this._ensureMinimum()}_applyDestroyTimeout(e){const t=new this._Promise(((e,t)=>{setTimeout((()=>{t(new Error("destroy timed out"))}),this._config.destroyTimeoutMillis).unref()}));return this._Promise.race([t,e])}_testOnBorrow(){if(this._availableObjects.length<1)return!1;const e=this._availableObjects.shift();e.test(),this._testOnBorrowResources.add(e);const t=this._factory.validate(e.obj),i=this._Promise.resolve(t);return this._trackOperation(i,this._validationOperations).then((t=>{if(this._testOnBorrowResources.delete(e),!1===t)return e.invalidate(),this._destroy(e),void this._dispense();this._dispatchPooledResourceToNextWaitingClient(e)})),!0}_dispatchResource(){if(this._availableObjects.length<1)return!1;const e=this._availableObjects.shift();return this._dispatchPooledResourceToNextWaitingClient(e),!1}_dispense(){const e=this._waitingClientsQueue.length;if(e<1)return;const t=e-this._potentiallyAllocableResourceCount,i=Math.min(this.spareResourceCapacity,t);for(let s=0;i>s;s++)this._createResource();if(!0===this._config.testOnBorrow){const t=e-this._testOnBorrowResources.size,i=Math.min(this._availableObjects.length,t);for(let e=0;i>e;e++)this._testOnBorrow()}if(!1===this._config.testOnBorrow){const t=Math.min(this._availableObjects.length,e);for(let e=0;t>e;e++)this._dispatchResource()}}_dispatchPooledResourceToNextWaitingClient(e){const t=this._waitingClientsQueue.dequeue();if(void 0===t||t.state!==o.PENDING)return this._addPooledResourceToAvailableObjects(e),!1;const i=new r(e,this._Promise);return this._resourceLoans.set(e.obj,i),e.allocate(),t.resolve(e.obj),!0}_trackOperation(e,t){return t.add(e),e.then((i=>(t.delete(e),this._Promise.resolve(i))),(i=>(t.delete(e),this._Promise.reject(i))))}_createResource(){const e=this._factory.create(),t=this._Promise.resolve(e).then((e=>{const t=new n(e);this._allObjects.add(t),this._addPooledResourceToAvailableObjects(t)}));this._trackOperation(t,this._factoryCreateOperations).then((()=>(this._dispense(),null))).catch((e=>{this.emit("factoryCreateError",e),this._dispense()}))}_ensureMinimum(){if(!0===this._draining)return;const e=this._config.min-this._count;for(let t=0;t<e;t++)this._createResource()}_evict(){const e=Math.min(this._config.numTestsPerEvictionRun,this._availableObjects.length),t={softIdleTimeoutMillis:this._config.softIdleTimeoutMillis,idleTimeoutMillis:this._config.idleTimeoutMillis,min:this._config.min};for(let i=0;i<e;){const e=this._evictionIterator.next();if(!0===e.done&&this._availableObjects.length<1)return void this._evictionIterator.reset();if(!0===e.done&&this._availableObjects.length>0){this._evictionIterator.reset();continue}const s=e.value;i++,!0===this._evictor.evict(t,s,this._availableObjects.length)&&(this._evictionIterator.remove(),this._destroy(s))}}_scheduleEvictorRun(){this._config.evictionRunIntervalMillis>0&&(this._scheduledEviction=setTimeout((()=>{this._evict(),this._scheduleEvictorRun()}),this._config.evictionRunIntervalMillis).unref())}_descheduleEvictorRun(){this._scheduledEviction&&clearTimeout(this._scheduledEviction),this._scheduledEviction=null}start(){!0!==this._draining&&!0!==this._started&&(this._started=!0,this._scheduleEvictorRun(),this._ensureMinimum())}acquire(e){if(!1===this._started&&!1===this._config.autostart&&this.start(),this._draining)return this._Promise.reject(new Error("pool is draining and cannot accept work"));if(this.spareResourceCapacity<1&&this._availableObjects.length<1&&void 0!==this._config.maxWaitingClients&&this._waitingClientsQueue.length>=this._config.maxWaitingClients)return this._Promise.reject(new Error("max waitingClients count exceeded"));const t=new s(this._config.acquireTimeoutMillis,this._Promise);return this._waitingClientsQueue.enqueue(t,e),this._dispense(),t.promise}use(e,t){return this.acquire(t).then((t=>e(t).then((e=>(this.release(t),e)),(e=>{throw this.destroy(t),e}))))}isBorrowedResource(e){return this._resourceLoans.has(e)}release(e){const t=this._resourceLoans.get(e);if(void 0===t)return this._Promise.reject(new Error("Resource not currently part of this pool"));this._resourceLoans.delete(e),t.resolve();const i=t.pooledResource;return i.deallocate(),this._addPooledResourceToAvailableObjects(i),this._dispense(),this._Promise.resolve()}destroy(e){const t=this._resourceLoans.get(e);if(void 0===t)return this._Promise.reject(new Error("Resource not currently part of this pool"));this._resourceLoans.delete(e),t.resolve();const i=t.pooledResource;return i.deallocate(),this._destroy(i),this._dispense(),this._Promise.resolve()}_addPooledResourceToAvailableObjects(e){e.idle(),!0===this._config.fifo?this._availableObjects.push(e):this._availableObjects.unshift(e)}drain(){return this._draining=!0,this.__allResourceRequestsSettled().then((()=>this.__allResourcesReturned())).then((()=>{this._descheduleEvictorRun()}))}__allResourceRequestsSettled(){return this._waitingClientsQueue.length>0?a(this._waitingClientsQueue.tail.promise):this._Promise.resolve()}__allResourcesReturned(){const e=Array.from(this._resourceLoans.values()).map((e=>e.promise)).map(a);return this._Promise.all(e)}clear(){const e=Array.from(this._factoryCreateOperations).map(a);return this._Promise.all(e).then((()=>{for(const t of this._availableObjects)this._destroy(t);const e=Array.from(this._factoryDestroyOperations).map(a);return a(this._Promise.all(e))}))}ready(){return new this._Promise((e=>{const t=()=>{this.available>=this.min?e():setTimeout(t,100)};t()}))}get _potentiallyAllocableResourceCount(){return this._availableObjects.length+this._testOnBorrowResources.size+this._testOnReturnResources.size+this._factoryCreateOperations.size}get _count(){return this._allObjects.size+this._factoryCreateOperations.size}get spareResourceCapacity(){return this._config.max-(this._allObjects.size+this._factoryCreateOperations.size)}get size(){return this._count}get available(){return this._availableObjects.length}get borrowed(){return this._resourceLoans.size}get pending(){return this._waitingClientsQueue.length}get max(){return this._config.max}get min(){return this._config.min}}}const De={create:async()=>{const e=new URL("data:video/mp2t;base64,aW1wb3J0IHsgTWVzaERhdGEgfSBmcm9tICdAL2xpYi90eXBlcyc7CmltcG9ydCAqIGFzIENvbWxpbmsgZnJvbSAnY29tbGluayc7CmltcG9ydCAqIGFzIFRIUkVFIGZyb20gJ3RocmVlJzsKaW1wb3J0IHsgTWVzaFN1cmZhY2VTYW1wbGVyIH0gZnJvbSAndGhyZWUvZXhhbXBsZXMvanNtL21hdGgvTWVzaFN1cmZhY2VTYW1wbGVyLmpzJzsKCmV4cG9ydCBpbnRlcmZhY2UgTWVzaFNhbXBsZXJBUEkgewogIHNhbXBsZU1lc2g6IChtZXNoRGF0YTogTWVzaERhdGEsIHNpemU6IG51bWJlcikgPT4gUHJvbWlzZTxGbG9hdDMyQXJyYXk+Owp9Cgpjb25zdCBhcGkgPSB7CiAgc2FtcGxlTWVzaDogKG1lc2hEYXRhOiBNZXNoRGF0YSwgc2l6ZTogbnVtYmVyKTogRmxvYXQzMkFycmF5ID0+IHsKICAgIGNvbnN0IGdlb21ldHJ5ID0gbmV3IFRIUkVFLkJ1ZmZlckdlb21ldHJ5KCk7CiAgICBnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoJ3Bvc2l0aW9uJywgbmV3IFRIUkVFLkJ1ZmZlckF0dHJpYnV0ZShuZXcgRmxvYXQzMkFycmF5KG1lc2hEYXRhLnBvc2l0aW9uKSwgMykpOwogICAgaWYgKG1lc2hEYXRhLm5vcm1hbCkgewogICAgICBnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoJ25vcm1hbCcsIG5ldyBUSFJFRS5CdWZmZXJBdHRyaWJ1dGUobmV3IEZsb2F0MzJBcnJheShtZXNoRGF0YS5ub3JtYWwpLCAzKSk7CiAgICB9CiAgICBjb25zdCBtYXRlcmlhbCA9IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCgpOwogICAgY29uc3QgbWVzaCA9IG5ldyBUSFJFRS5NZXNoKGdlb21ldHJ5LCBtYXRlcmlhbCk7CiAgICBtZXNoLnNjYWxlLnNldChtZXNoRGF0YS5zY2FsZS54LCBtZXNoRGF0YS5zY2FsZS55LCBtZXNoRGF0YS5zY2FsZS56KTsKCiAgICBjb25zdCBzYW1wbGVyID0gbmV3IE1lc2hTdXJmYWNlU2FtcGxlcihtZXNoKS5idWlsZCgpOwogICAgY29uc3QgZGF0YSA9IG5ldyBGbG9hdDMyQXJyYXkoc2l6ZSAqIHNpemUgKiA0KTsKICAgIGNvbnN0IHBvc2l0aW9uID0gbmV3IFRIUkVFLlZlY3RvcjMoKTsKCiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNpemU7IGkrKykgewogICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHNpemU7IGorKykgewogICAgICAgIGNvbnN0IGluZGV4ID0gaSAqIHNpemUgKyBqOwogICAgICAgIHNhbXBsZXIuc2FtcGxlKHBvc2l0aW9uKTsKICAgICAgICBkYXRhWzQgKiBpbmRleF0gPSBwb3NpdGlvbi54ICogbWVzaERhdGEuc2NhbGUueDsKICAgICAgICBkYXRhWzQgKiBpbmRleCArIDFdID0gcG9zaXRpb24ueSAqIG1lc2hEYXRhLnNjYWxlLnk7CiAgICAgICAgZGF0YVs0ICogaW5kZXggKyAyXSA9IHBvc2l0aW9uLnogKiBtZXNoRGF0YS5zY2FsZS56OwogICAgICAgIGRhdGFbNCAqIGluZGV4ICsgM10gPSAoTWF0aC5yYW5kb20oKSAtIDAuNSkgKiAwLjAxOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIGRhdGE7CiAgfSwKfTsKCkNvbWxpbmsuZXhwb3NlKGFwaSk7Cg==",n&&"SCRIPT"===n.tagName.toUpperCase()&&n.src||new URL("ionian.iife.js",document.baseURI).href);return x(new Worker(e,{type:"module"}))},destroy:async e=>e[d]()},Ie=C(function(){if(Se)return be;Se=1;const e=Pe(),t=xe(),i=Te(),s=ve();return be={Pool:e,Deque:t,PriorityQueue:i,DefaultEvictor:s,createPool:function(r,n){return new e(s,t,i,r,n)}}}()).createPool(De,{max:navigator.hardwareConcurrency||4,min:2});function Ce(e,t){const i=new a.DataTexture(e,t,t,a.RGBAFormat,a.FloatType);return i.needsUpdate=!0,i}function Ee(e){e.geometry.dispose(),e.material instanceof a.Material?e.material.dispose():e.material.forEach((e=>e.dispose()))}function ze(e,t,i){return e=Math.min(e,i),e=Math.max(e,t)}class Ge{constructor(e,t){r(this,"textureSize"),r(this,"dataTextures"),r(this,"eventEmitter"),this.eventEmitter=e,this.textureSize=t,this.dataTextures=new Map,this.updateServiceState("ready")}setTextureSize(e){this.textureSize!==e&&(this.textureSize=e,this.dataTextures.forEach((e=>e.dispose())),this.dataTextures.clear())}async getDataTexture(e){const t=this.dataTextures.get(e.name);if(t)return t;const i={position:(s=e).geometry.attributes.position.array,normal:null==(r=s.geometry.attributes.normal)?void 0:r.array,scale:{x:s.scale.x,y:s.scale.y,z:s.scale.z}};var s,r;const n=await Ie.acquire();try{const t=Ce(await n.sampleMesh(i,this.textureSize),this.textureSize);return t.name=e.name,t}finally{await Ie.release(n)}}async dispose(){this.dataTextures.clear(),this.updateServiceState("disposed")}updateServiceState(e){this.eventEmitter.emit("serviceStateUpdated",{type:"data-texture",state:e})}}class Ae{constructor(e){r(this,"size"),r(this,"mesh"),r(this,"matcapMaterial"),r(this,"fallbackMaterial"),r(this,"fallbackGeometry"),r(this,"materials"),r(this,"geometries"),r(this,"uvRefsCache"),r(this,"previousScale"),this.size=e,this.materials=new Map,this.geometries=new Map,this.uvRefsCache=new Map,this.previousScale={x:1,y:1,z:1},this.matcapMaterial=new a.ShaderMaterial({uniforms:{uTime:{value:0},uProgress:{value:0},uTexture:{value:null},uVelocity:{value:null},uSourceMatcap:{value:null},uTargetMatcap:{value:null}},vertexShader:"\nvarying vec2 vUv;\nuniform sampler2D uTexture;\nuniform sampler2D uVelocity;\nuniform float uTime;\nvarying vec3 vNormal;\nattribute vec2 uvRef;\nvarying vec3 vViewPosition;\n\nvec3 rotate3D(vec3 v, vec3 vel) {\n vec3 pos = v;\n vec3 up = vec3(0, 1, 0);\n vec3 axis = normalize(cross(up, vel));\n float angle = acos(dot(up, normalize(vel)));\n pos = pos * cos(angle) + cross(axis, pos) * sin(angle) + axis * dot(axis, pos) * (1. - cos(angle));\n return pos;\n}\n\nvoid main() {\n vUv = uv;\n vNormal = normal;\n\n vec4 color = texture2D(uTexture, uvRef);\n vec4 velocity = texture2D(uVelocity, uvRef);\n vec3 pos = color.xyz;// apply the texture to the vertex distribution.\n\n vec3 localPosition = position.xyz;\n if (length (velocity.xyz) < 0.0001) {\n velocity.xyz = vec3(0.0, 0.0001, 0.0001);\n }\n localPosition.y *= max(1.0, length(velocity.xyz) * 1000.0);\n localPosition = rotate3D(localPosition, velocity.xyz);\n vNormal = rotate3D(normal, velocity.xyz);\n\n mat4 instanceMat = instanceMatrix;\n instanceMat[3].xyz = pos.xyz;\n\n // unlike the traditional mvMatrix * position, we need to additional multiplication with the instance matrix.\n vec4 modelViewPosition = modelViewMatrix * instanceMat * vec4(localPosition, 1.0);\n\n vViewPosition = - modelViewPosition.xyz;\n\n gl_Position = projectionMatrix * modelViewPosition;\n}\n",fragmentShader:"\nvarying vec2 vUv;\nuniform sampler2D uTexture;\n\nuniform sampler2D uSourceMatcap;\nuniform sampler2D uTargetMatcap;\n\nuniform float uProgress;\nvarying vec3 vNormal;\nvarying vec3 vViewPosition;\nvoid main() {\n vec3 viewDir = normalize( vViewPosition );\n vec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\n vec3 y = cross( viewDir, x );\n vec2 uv = vec2( dot( x, vNormal ), dot( y, vNormal ) ) * 0.495 + 0.5; // 0.495 to remove artifacts caused by undersized matcap disks\n\n vec4 sourceMatcap = texture2D( uSourceMatcap, uv );\n vec4 targetMatcap = texture2D( uTargetMatcap, uv );\n\n vec4 matcap = mix(sourceMatcap, targetMatcap, uProgress);\n gl_FragColor = matcap;\n}\n"}),this.fallbackMaterial=new a.MeshBasicMaterial({color:16777215}),this.fallbackGeometry=new a.BoxGeometry(.001,.001,.001),this.mesh=this.createInstancedMesh(e,this.fallbackGeometry,this.fallbackMaterial)}getMesh(){return this.mesh}update(e){const t=this.mesh.material;(t instanceof a.ShaderMaterial||t instanceof a.RawShaderMaterial)&&(t.uniforms.uTime.value=e)}setOriginMatcap(e){this.matcapMaterial.uniforms.uSourceMatcap.value=e}setDestinationMatcap(e){this.matcapMaterial.uniforms.uTargetMatcap.value=e}setProgress(e){e=Math.max(0,e),e=Math.min(1,e),this.matcapMaterial.uniforms.uProgress.value=e}setGeometrySize(e){this.mesh.geometry.scale(1/this.previousScale.x,1/this.previousScale.y,1/this.previousScale.z),this.mesh.geometry.scale(e.x,e.y,e.z),this.previousScale=e}useMatcapMaterial(){this.mesh.material=this.matcapMaterial}useMaterial(e){const t=this.materials.get(e);t&&(this.mesh.material=t)}useGeometry(e){const t=this.geometries.get(e);t&&(this.mesh.geometry=t)}updateVelocityTexture(e){this.matcapMaterial.uniforms.uVelocity.value=e}updatePositionTexture(e){this.matcapMaterial.uniforms.uTexture.value=e}resize(e){if(this.size===e)return{current:this.mesh,previous:this.mesh};this.size=e;const t=this.mesh;return this.mesh=this.createInstancedMesh(e,t.geometry,t.material),{current:this.mesh,previous:t}}dispose(){this.mesh.dispose(),this.geometries.forEach((e=>e.dispose())),this.materials.forEach((e=>e.dispose())),this.uvRefsCache.clear(),this.geometries.clear(),this.materials.clear()}registerGeometry(e,t){const i=this.geometries.get(e);if(i&&i===t)return;const s=this.getUVRefs(this.size);t.setAttribute("uvRef",s),this.geometries.set(e,t),this.mesh.geometry===i&&(this.mesh.geometry=t),null==i||i.dispose()}registerMaterial(e,t){const i=this.materials.get(e);i&&i===t||(this.mesh.material===i&&(this.mesh.material=t),this.materials.set(e,t),null==i||i.dispose())}getUVRefs(e){const t=this.uvRefsCache.get(e);if(t)return t;const i=new Float32Array(e*e*2);for(let r=0;r<e;r++)for(let t=0;t<e;t++){const s=r*e+t;i[2*s]=t/(e-1),i[2*s+1]=r/(e-1)}const s=new a.InstancedBufferAttribute(i,2);return this.uvRefsCache.set(e,s),s}createInstancedMesh(e,t,i){(t=t||this.fallbackGeometry).setAttribute("uvRef",this.getUVRefs(e));const s=e*e;return new a.InstancedMesh(t,i,s)}}class Fe{constructor(e,t,i,s){r(this,"raycaster",new a.Raycaster),r(this,"mousePosition",new a.Vector2),r(this,"camera"),r(this,"originGeometry"),r(this,"destinationGeometry"),r(this,"progress",0),r(this,"intersectionMesh",new a.Mesh),r(this,"geometryNeedsUpdate"),r(this,"eventEmitter"),r(this,"blendedGeometry"),r(this,"intersection"),r(this,"lastKnownOriginMeshID"),r(this,"lastKnownDestinationMeshID"),this.camera=t,this.originGeometry=i,this.eventEmitter=e,this.destinationGeometry=s,this.geometryNeedsUpdate=!0}getIntersectionMesh(){return this.intersectionMesh}setCamera(e){this.camera=e}setOriginGeometry(e){this.lastKnownOriginMeshID!==e.uuid&&(this.originGeometry&&this.originGeometry.dispose(),this.lastKnownOriginMeshID=e.uuid,this.originGeometry=e.geometry.clone(),this.originGeometry.applyMatrix4(e.matrixWorld),this.geometryNeedsUpdate=!0)}setDestinationGeometry(e){this.lastKnownDestinationMeshID!==e.uuid&&(this.destinationGeometry&&this.destinationGeometry.dispose(),this.lastKnownDestinationMeshID=e.uuid,this.destinationGeometry=e.geometry.clone(),this.destinationGeometry.applyMatrix4(e.matrixWorld),this.geometryNeedsUpdate=!0)}setProgress(e){this.progress=e,this.geometryNeedsUpdate=!0}setMousePosition(e){e&&this.mousePosition.copy(e)}calculate(e){if(this.updateIntersectionMesh(e),this.camera)return this.geometryNeedsUpdate&&(this.geometryNeedsUpdate=!1,this.blendedGeometry=this.getBlendedGeometry()),this.blendedGeometry?this.intersection=this.getFirstIntersection(this.camera,e):this.intersection=void 0,this.intersection?this.eventEmitter.emit("interactionPositionUpdated",{position:this.intersection}):this.eventEmitter.emit("interactionPositionUpdated",{position:{x:0,y:0,z:0,w:0}}),this.intersection}dispose(){var e;null==(e=this.blendedGeometry)||e.dispose(),this.intersectionMesh.geometry.dispose()}updateIntersectionMesh(e){this.blendedGeometry&&this.blendedGeometry.uuid!==this.intersectionMesh.geometry.uuid&&(this.intersectionMesh.geometry.dispose(),this.intersectionMesh.geometry=this.blendedGeometry),this.intersectionMesh.matrix.copy(e.matrixWorld),this.intersectionMesh.matrixWorld.copy(e.matrixWorld),this.intersectionMesh.matrixAutoUpdate=!1,this.intersectionMesh.updateMatrixWorld(!0)}getFirstIntersection(e,t){this.raycaster.setFromCamera(this.mousePosition,e);const i=this.raycaster.intersectObject(this.intersectionMesh,!1)[0];if(i){const e=i.point.clone(),s=t.worldToLocal(e);return new a.Vector4(s.x,s.y,s.z,1)}}getBlendedGeometry(){return 0===this.progress?this.originGeometry:1===this.progress?this.destinationGeometry:this.originGeometry&&this.destinationGeometry?this.originGeometry===this.destinationGeometry?this.originGeometry:this.blendGeometry(this.originGeometry,this.destinationGeometry,this.progress):void 0}blendGeometry(e,t,i){const s=new a.BufferGeometry,r=e.attributes.position.array,n=t.attributes.position.array,o=new Float32Array(r.length);for(let c=0;c<r.length;c+=3){const e=new a.Vector3(r[c],r[c+1],r[c+2]),t=new a.Vector3(n[c],n[c+1],n[c+2]),s=(new a.Vector3).lerpVectors(e,t,i);o[c]=s.x,o[c+1]=s.y,o[c+2]=s.z}return s.setAttribute("position",new a.BufferAttribute(o,3)),e.attributes.normal&&s.setAttribute("normal",e.attributes.normal.clone()),e.attributes.uv&&s.setAttribute("uv",e.attributes.uv.clone()),e.index&&s.setIndex(e.index.clone()),s}}const Ve=new t.OrthographicCamera(-1,1,1,-1,0,1);class Oe extends t.BufferGeometry{constructor(){super(),this.setAttribute("position",new t.Float32BufferAttribute([-1,3,0,-1,-1,0,3,-1,0],3)),this.setAttribute("uv",new t.Float32BufferAttribute([0,2,0,0,2,0],2))}}const Le=new Oe;class Ne{constructor(e){this._mesh=new t.Mesh(Le,e)}dispose(){this._mesh.geometry.dispose()}render(e){e.render(this._mesh,Ve)}get material(){return this._mesh.material}set material(e){this._mesh.material=e}}class Be{constructor(e,i,s){this.variables=[],this.currentTextureIndex=0;let r=t.FloatType;const n={passThruTexture:{value:null}},o=u("uniform sampler2D passThruTexture;\n\nvoid main() {\n\n\tvec2 uv = gl_FragCoord.xy / resolution.xy;\n\n\tgl_FragColor = texture2D( passThruTexture, uv );\n\n}\n",n),a=new Ne(o);function c(t){t.defines.resolution="vec2( "+e.toFixed(1)+", "+i.toFixed(1)+" )"}function u(e,i){i=i||{};const s=new t.ShaderMaterial({name:"GPUComputationShader",uniforms:i,vertexShader:"void main()\t{\n\n\tgl_Position = vec4( position, 1.0 );\n\n}\n",fragmentShader:e});return c(s),s}this.setDataType=function(e){return r=e,this},this.addVariable=function(e,i,s){const r={name:e,initialValueTexture:s,material:this.createShaderMaterial(i),dependencies:null,renderTargets:[],wrapS:null,wrapT:null,minFilter:t.NearestFilter,magFilter:t.NearestFilter};return this.variables.push(r),r},this.setVariableDependencies=function(e,t){e.dependencies=t},this.init=function(){if(0===s.capabilities.maxVertexTextures)return"No support for vertex shader textures.";for(let t=0;t<this.variables.length;t++){const s=this.variables[t];s.renderTargets[0]=this.createRenderTarget(e,i,s.wrapS,s.wrapT,s.minFilter,s.magFilter),s.renderTargets[1]=this.createRenderTarget(e,i,s.wrapS,s.wrapT,s.minFilter,s.magFilter),this.renderTexture(s.initialValueTexture,s.renderTargets[0]),this.renderTexture(s.initialValueTexture,s.renderTargets[1]);const r=s.material,n=r.uniforms;if(null!==s.dependencies)for(let e=0;e<s.dependencies.length;e++){const t=s.dependencies[e];if(t.name!==s.name){let e=!1;for(let i=0;i<this.variables.length;i++)if(t.name===this.variables[i].name){e=!0;break}if(!e)return"Variable dependency not found. Variable="+s.name+", dependency="+t.name}n[t.name]={value:null},r.fragmentShader="\nuniform sampler2D "+t.name+";\n"+r.fragmentShader}}return this.currentTextureIndex=0,null},this.compute=function(){const e=this.currentTextureIndex,t=0===this.currentTextureIndex?1:0;for(let i=0,s=this.variables.length;i<s;i++){const s=this.variables[i];if(null!==s.dependencies){const t=s.material.uniforms;for(let i=0,r=s.dependencies.length;i<r;i++){const r=s.dependencies[i];t[r.name].value=r.renderTargets[e].texture}}this.doRenderTarget(s.material,s.renderTargets[t])}this.currentTextureIndex=t},this.getCurrentRenderTarget=function(e){return e.renderTargets[this.currentTextureIndex]},this.getAlternateRenderTarget=function(e){return e.renderTargets[0===this.currentTextureIndex?1:0]},this.dispose=function(){a.dispose();const e=this.variables;for(let t=0;t<e.length;t++){const i=e[t];i.initialValueTexture&&i.initialValueTexture.dispose();const s=i.renderTargets;for(let e=0;e<s.length;e++){s[e].dispose()}}},this.addResolutionDefine=c,this.createShaderMaterial=u,this.createRenderTarget=function(s,n,o,a,c,u){s=s||e,n=n||i,o=o||t.ClampToEdgeWrapping,a=a||t.ClampToEdgeWrapping,c=c||t.NearestFilter,u=u||t.NearestFilter;return new t.WebGLRenderTarget(s,n,{wrapS:o,wrapT:a,minFilter:c,magFilter:u,format:t.RGBAFormat,type:r,depthBuffer:!1})},this.createTexture=function(){const s=new Float32Array(e*i*4),r=new t.DataTexture(s,e,i,t.RGBAFormat,t.FloatType);return r.needsUpdate=!0,r},this.renderTexture=function(e,t){n.passThruTexture.value=e,this.doRenderTarget(o,t),n.passThruTexture.value=null},this.doRenderTarget=function(e,t){const i=s.getRenderTarget(),r=s.xr.enabled,n=s.shadowMap.autoUpdate;s.xr.enabled=!1,s.shadowMap.autoUpdate=!1,a.material=e,s.setRenderTarget(t),a.render(s),a.material=o,s.xr.enabled=r,s.shadowMap.autoUpdate=n,s.setRenderTarget(i)}}}class je{constructor(e,t,i){r(this,"gpuComputationRenderer"),r(this,"webGLRenderer"),r(this,"positionDataTexture"),r(this,"velocityDataTexture"),r(this,"mixPositionsVar"),r(this,"velocityVar"),r(this,"positionVar"),r(this,"interactionPosition"),r(this,"lastKnownPositionDataTexture"),r(this,"lastKnownVelocityDataTexture"),r(this,"lastKnownMixProgress"),r(this,"initialDataTexture"),this.initialDataTexture=i??function(e){const t=new Float32Array(e*e*4);for(let i=0;i<e;i++)for(let s=0;s<e;s++){const r=i*e+s;let n=Math.random()*Math.PI*2,o=Math.acos(2*Math.random()-1),a=Math.sin(o)*Math.cos(n),c=Math.sin(o)*Math.sin(n),u=Math.cos(o);t[4*r]=a,t[4*r+1]=c,t[4*r+2]=u,t[4*r+3]=.01*(Math.random()-.5)}return Ce(t,e)}(e),this.positionDataTexture=this.initialDataTexture,this.webGLRenderer=t,this.gpuComputationRenderer=new Be(e,e,this.webGLRenderer),this.lastKnownMixProgress=0,t.capabilities.isWebGL2||this.gpuComputationRenderer.setDataType(a.HalfFloatType),this.velocityDataTexture=function(e){return Ce(new Float32Array(4*e*e),e)}(e),this.interactionPosition=new a.Vector4(0,0,0,0),this.mixPositionsVar=this.gpuComputationRenderer.addVariable("uMixedPosition","\nuniform sampler2D uPositionA;\nuniform sampler2D uPositionB;\nuniform float uProgress;\n\nvoid main() {\n vec2 uv = gl_FragCoord.xy / resolution.xy;\n vec3 positionA = texture2D(uPositionA, uv).xyz;\n vec3 positionB = texture2D(uPositionB, uv).xyz;\n vec3 mixedPosition = mix(positionA, positionB, uProgress);\n gl_FragColor = vec4(mixedPosition, 1.0);\n}\n",this.positionDataTexture),this.velocityVar=this.gpuComputationRenderer.addVariable("uCurrentVelocity","\nuniform float uProgress;\nuniform vec4 uInteractionPosition;\nuniform float uTime;\nuniform float uTractionForce;\nuniform float uMaxRepelDistance;\n\nfloat rand(vec2 co) {\n return fract(sin(dot(co, vec2(12.9898, 78.233))) * 43758.5453);\n}\n\nvoid main() {\n vec2 uv = gl_FragCoord.xy / resolution.xy;\n float offset = rand(uv);\n\n vec3 position = texture2D(uCurrentPosition, uv).xyz;\n vec3 velocity = texture2D(uCurrentVelocity, uv).xyz;\n vec3 mixedPosition = texture2D(uMixedPosition, uv).xyz;\n\n velocity *= 0.9;\n\n // particle traction\n vec3 direction = normalize(mixedPosition - position); // direction vector\n float dist = length ( mixedPosition - position ); // distance from where it was supposed to be, and currently are.\n if (dist > 0.01) {\n position += direction * 0.1 * uTractionForce; // uTractionForce defaults to 0.1\n }\n\n // mouse repel force\n float pointerDistance = distance(position, uInteractionPosition.xyz);\n float mouseRepelModifier = clamp(uMaxRepelDistance - pointerDistance, 0.0, 1.0);\n float normalizedDistance = pointerDistance / uMaxRepelDistance;\n float repulsionStrength = (1.0 - normalizedDistance) * uInteractionPosition.w;\n direction = normalize(position - uInteractionPosition.xyz);\n velocity += (direction * 0.01 * repulsionStrength) * mouseRepelModifier;\n\n float lifespan = 20.0;\n float age = mod(uTime + lifespan * offset, lifespan);\n\n if (age < 0.1) {\n position.xyz = mixedPosition;\n }\n\n gl_FragColor = vec4(velocity, 1.0);\n}\n",this.velocityDataTexture),this.positionVar=this.gpuComputationRenderer.addVariable("uCurrentPosition","\nuniform float uProgress;\nuniform vec4 uInteractionPosition;\nuniform float uTime;\nuniform float uTractionForce;\n\nfloat rand(vec2 co) {\n return fract(sin(dot(co, vec2(12.9898, 78.233))) * 43758.5453);\n}\n\nvoid main() {\n\n // in GPGPU, we calculate the uv on each fragment shader, not using the static varying passed over from the v shader.\n vec2 uv = gl_FragCoord.xy / resolution.xy;\n float offset = rand(uv);\n\n vec3 position = texture2D(uCurrentPosition, uv).xyz;\n vec3 velocity = texture2D(uCurrentVelocity, uv).xyz;\n vec3 mixedPosition = texture2D(uMixedPosition, uv).xyz;\n\n // particle attraction to original position.\n vec3 direction = normalize(mixedPosition - position); // direction vector\n float dist = length ( mixedPosition - position ); // distance from where it was supposed to be, and currently are.\n\n if (dist > 0.01) {\n position = mix(position, mixedPosition, 0.1 * uTractionForce); // 0.1 ~ 0.001 (faster, slower)\n }\n\n position += velocity;\n gl_FragColor = vec4(position, 1.0);\n}\n",this.positionDataTexture),this.mixPositionsVar.material.uniforms.uProgress={value:0},this.mixPositionsVar.material.uniforms.uPositionA={value:this.initialDataTexture},this.mixPositionsVar.material.uniforms.uPositionB={value:this.initialDataTexture},this.velocityVar.material.uniforms.uTime={value:0},this.velocityVar.material.uniforms.uInteractionPosition={value:this.interactionPosition},this.velocityVar.material.uniforms.uCurrentPosition={value:this.positionDataTexture},this.velocityVar.material.uniforms.uTractionForce={value:.1},this.velocityVar.material.uniforms.uMaxRepelDistance={value:.3},this.positionVar.material.uniforms.uTime={value:0},this.positionVar.material.uniforms.uProgress={value:0},this.positionVar.material.uniforms.uTractionForce={value:.1},this.positionVar.material.uniforms.uInteractionPosition={value:this.interactionPosition},this.positionVar.material.uniforms.uCurrentPosition={value:this.positionDataTexture},this.gpuComputationRenderer.setVariableDependencies(this.positionVar,[this.velocityVar,this.positionVar,this.mixPositionsVar]),this.gpuComputationRenderer.setVariableDependencies(this.velocityVar,[this.velocityVar,this.positionVar,this.mixPositionsVar]);const s=this.gpuComputationRenderer.init();if(s)throw new Error("failed to initialize SimulationRenderer: "+s);this.lastKnownVelocityDataTexture=this.getVelocityTexture(),this.lastKnownPositionDataTexture=this.getPositionTexture()}setMorphSourceDataTexture(e){this.mixPositionsVar.material.uniforms.uPositionA.value=e}setMorphDestinationDataTexture(e){this.mixPositionsVar.material.uniforms.uPositionB.value=e}setMaxRepelDistance(e){this.velocityVar.material.uniforms.uMaxRepelDistance.value=e}setProgress(e){this.lastKnownMixProgress=ze(e,0,1),this.mixPositionsVar.material.uniforms.uProgress.value=this.lastKnownMixProgress}setVelocityTractionForce(e){this.velocityVar.material.uniforms.uTractionForce.value=e}setPositionalTractionForce(e){this.positionVar.material.uniforms.uTractionForce.value=e}setInteractionPosition(e){this.interactionPosition.copy(e)}dispose(){this.mixPositionsVar.renderTargets.forEach((e=>e.dispose())),this.positionVar.renderTargets.forEach((e=>e.dispose())),this.velocityVar.renderTargets.forEach((e=>e.dispose())),this.positionDataTexture.dispose(),this.velocityDataTexture.dispose(),this.gpuComputationRenderer.dispose()}compute(e){this.velocityVar.material.uniforms.uTime.value=e,this.positionVar.material.uniforms.uTime.value=e,this.gpuComputationRenderer.compute()}getVelocityTexture(){return this.lastKnownVelocityDataTexture=this.gpuComputationRenderer.getCurrentRenderTarget(this.velocityVar).texture,this.lastKnownVelocityDataTexture}getPositionTexture(){return this.lastKnownPositionDataTexture=this.gpuComputationRenderer.getCurrentRenderTarget(this.positionVar).texture,this.lastKnownPositionDataTexture}}class ke{constructor(e,t,i){r(this,"state"),r(this,"textureSize"),r(this,"dataTextureTransitionProgress"),r(this,"velocityTractionForce"),r(this,"positionalTractionForce"),r(this,"simulationRenderer"),r(this,"webGLRenderer"),r(this,"eventEmitter"),r(this,"lastKnownVelocityDataTexture"),r(this,"lastKnownPositionDataTexture"),this.eventEmitter=e,this.webGLRenderer=i,this.textureSize=t,this.dataTextureTransitionProgress=0,this.velocityTractionForce=.1,this.positionalTractionForce=.1,this.updateServiceState("initializing"),this.simulationRenderer=new je(this.textureSize,this.webGLRenderer),this.lastKnownVelocityDataTexture=this.simulationRenderer.getVelocityTexture(),this.lastKnownPositionDataTexture=this.simulationRenderer.getPositionTexture(),this.updateServiceState("ready")}setTextureSize(e){this.updateServiceState("initializing"),this.simulationRenderer.dispose(),this.textureSize=e,this.simulationRenderer=new je(e,this.webGLRenderer),this.updateServiceState("ready")}setOriginDataTexture(e){this.textureSize!==e.textureSize?this.eventEmitter.emit("invalidRequest",{message:`Texture size mismatch: ${e.textureSize} vs ${this.textureSize}`}):this.simulationRenderer.setMorphSourceDataTexture(e.dataTexture)}setDestinationDataTexture(e){this.textureSize!==e.textureSize?this.eventEmitter.emit("invalidRequest",{message:`Texture size mismatch: ${e.textureSize} vs ${this.textureSize}`}):this.simulationRenderer.setMorphDestinationDataTexture(e.dataTexture)}setDataTextureTransitionProgress(e){this.dataTextureTransitionProgress=e,this.simulationRenderer.setProgress(this.dataTextureTransitionProgress)}setVelocityTractionForce(e){this.velocityTractionForce=e,this.simulationRenderer.setVelocityTractionForce(this.velocityTractionForce)}setPositionalTractionForce(e){this.positionalTractionForce=e,this.simulationRenderer.setPositionalTractionForce(this.positionalTractionForce)}compute(e){this.simulationRenderer.compute(e)}getVelocityTexture(){return"ready"===this.state&&(this.lastKnownVelocityDataTexture=this.simulationRenderer.getVelocityTexture()),this.lastKnownVelocityDataTexture}getPositionTexture(){return"ready"===this.state&&(this.lastKnownPositionDataTexture=this.simulationRenderer.getPositionTexture()),this.lastKnownPositionDataTexture}dispose(){this.updateServiceState("disposed"),this.simulationRenderer.dispose(),this.lastKnownVelocityDataTexture.dispose(),this.lastKnownPositionDataTexture.dispose()}updateServiceState(e){this.state=e,this.eventEmitter.emit("serviceStateUpdated",{type:"simulation",state:e})}setInteractionPosition(e){this.simulationRenderer.setInteractionPosition(e)}setMaxRepelDistance(e){this.simulationRenderer.setMaxRepelDistance(e)}}class Ue{constructor(){r(this,"execStatus",new Map)}get(e){const t=this.execStatus.get(e);return t||(this.execStatus.set(e,"idle"),"idle")}set(e,t){this.execStatus.set(e,t)}}class Ke{constructor(e){r(this,"eventEmitter"),r(this,"transitions",new Map),r(this,"execStatus"),r(this,"ongoingTransitions",new Map),this.eventEmitter=e,this.execStatus=new Ue,this.eventEmitter.on("transitionCancelled",this.handleTransitionCancelledEvent.bind(this))}enqueue(e,t,i={}){const s={...t,...i,cancelled:!1,duration:.001*t.duration};this.getQueue(e).push(s)}compute(e){this.transitions.forEach(((t,i)=>{var s;if(t.length&&!this.ongoingTransitions.has(i)){const r=t.shift();r&&(this.ongoingTransitions.set(i,{...r,startTime:e}),null==(s=r.onTransitionBegin)||s.call(r))}})),this.ongoingTransitions.forEach(((t,i)=>{var s,r,n;if(t.cancelled)return null==(s=t.onTransitionCancelled)||s.call(t),void this.ongoingTransitions.delete(i);const{startTime:o,duration:a,easing:c}=t,u=e-o,h=ze(c(Math.min(1,u/a)),0,1);this.emitTransitionProgress(i,h),null==(r=t.onTransitionProgress)||r.call(t,h),h>=1&&(this.emitTransitionFinished(i),null==(n=t.onTransitionFinished)||n.call(t),this.ongoingTransitions.delete(i))}))}getQueue(e){const t=this.transitions.get(e);return t||(this.transitions.set(e,[]),this.transitions.get(e)??[])}handleTransitionCancelledEvent({type:e}){var t;const i=this.getQueue(e);for(;i.length;)i.pop();const s=this.ongoingTransitions.get(e);s&&(s.cancelled=!0,null==(t=s.onTransitionCancelled)||t.call(s))}emitTransitionProgress(e,t){this.eventEmitter.emit("transitionProgressed",{type:e,progress:t})}emitTransitionFinished(e){this.eventEmitter.emit("transitionFinished",{type:e})}}class We{constructor(e){r(this,"serviceState","created"),r(this,"eventEmitter"),r(this,"meshes",new Map),r(this,"textures",new Map),r(this,"gltfLoader",new i.GLTFLoader),r(this,"textureLoader",new a.TextureLoader),r(this,"dracoLoader",new i.DRACOLoader),r(this,"solidColorTexture",new a.DataTexture(new Uint8Array([127,127,127,255]),1,1,a.RGBAFormat)),this.eventEmitter=e,this.dracoLoader.setDecoderPath("https://www.gstatic.com/draco/versioned/decoders/1.5.7/"),this.gltfLoader.setDRACOLoader(this.dracoLoader),this.updateServiceState("ready")}register(e,t){if(t.name=e,t instanceof a.Mesh){const i=this.meshes.get(e);i&&Ee(i),this.meshes.set(e,t)}else{const i=this.textures.get(e);i&&i.dispose(),this.textures.set(e,t)}this.eventEmitter.emit("assetRegistered",{id:e})}setSolidColor(e){this.changeColor(e)}getSolidColorTexture(){return this.solidColorTexture}getMesh(e){return this.meshes.get(e)??null}getMatcap(e){const t=this.textures.get(e);return t||this.eventEmitter.emit("invalidRequest",{message:`texture with id "${e}" not found. using solid color texture instead...`}),t??this.solidColorTexture}getMeshIDs(){return Array.from(this.meshes.keys())}getTextureIDs(){return Array.from(this.textures.keys())}getMeshes(){return Array.from(this.meshes.values())}getTextures(){return Array.from(this.textures.values())}async loadMeshAsync(e,t,i={}){const s=await this.gltfLoader.loadAsync(t);try{if(i.meshName){const t=s.scene.getObjectByName(i.meshName);return this.register(e,t),t}{const t=s.scene.children[0];return this.register(e,t),t}}catch(r){return this.eventEmitter.emit("invalidRequest",{message:`failed to load mesh: ${e}. ${r}`}),null}}async loadTextureAsync(e,t){try{const i=await this.textureLoader.loadAsync(t);return this.register(e,i),i}catch(i){return this.eventEmitter.emit("invalidRequest",{message:`failed to load texture: ${e}. ${i}`}),null}}dispose(){this.updateServiceState("disposed"),this.meshes.forEach((e=>Ee(e))),this.meshes.clear(),this.textures.forEach((e=>e.dispose())),this.textures.clear()}changeColor(e){const t=new a.Color(e);this.solidColorTexture=new a.DataTexture(new Uint8Array([t.r,t.g,t.b,255]),1,1,a.RGBAFormat),this.solidColorTexture.needsUpdate=!0}updateServiceState(e){this.serviceState=e,this.eventEmitter.emit("serviceStateUpdated",{type:"asset",state:e})}}return e.ParticlesEngine=class{constructor(e){r(this,"simulationRendererService"),r(this,"eventEmitter"),r(this,"renderer"),r(this,"scene"),r(this,"serviceStates"),r(this,"assetService"),r(this,"dataTextureManager"),r(this,"instancedMeshManager"),r(this,"transitionService"),r(this,"engineState"),r(this,"intersectionService"),this.eventEmitter=new u,this.serviceStates=this.initialServiceStates(),this.eventEmitter.on("serviceStateUpdated",this.handleServiceStateUpdated.bind(this)),this.scene=e.scene,this.renderer=e.renderer,this.engineState=this.initialEngineState(e.textureSize),this.assetService=new We(this.eventEmitter),this.transitionService=new Ke(this.eventEmitter),this.dataTextureManager=new Ge(this.eventEmitter,e.textureSize),this.simulationRendererService=new ke(this.eventEmitter,e.textureSize,this.renderer),this.instancedMeshManager=new Ae(e.textureSize),this.instancedMeshManager.useMatcapMaterial(),this.scene.add(this.instancedMeshManager.getMesh()),this.intersectionService=new Fe(this.eventEmitter,e.camera),this.eventEmitter.on("transitionProgressed",this.handleTransitionProgress.bind(this)),this.eventEmitter.on("interactionPositionUpdated",this.handleInteractionPositionUpdated.bind(this))}render(e){this.intersectionService.calculate(this.instancedMeshManager.getMesh()),this.transitionService.compute(e),this.simulationRendererService.compute(e),this.instancedMeshManager.update(e),this.instancedMeshManager.updateVelocityTexture(this.simulationRendererService.getVelocityTexture()),this.instancedMeshManager.updatePositionTexture(this.simulationRendererService.getPositionTexture())}setOriginDataTexture(e,t=!1){t&&this.eventEmitter.emit("transitionCancelled",{type:"data-texture"});const i=this.assetService.getMesh(e);i?this.dataTextureManager.getDataTexture(i).then((t=>{this.engineState.originMeshID=e,this.simulationRendererService.setOriginDataTexture({dataTexture:t,textureSize:this.engineState.textureSize}),this.intersectionService.setOriginGeometry(i)})):this.eventEmitter.emit("invalidRequest",{message:`Mesh with id "${e}" does not exist`})}setDestinationDataTexture(e,t=!1){t&&this.eventEmitter.emit("transitionCancelled",{type:"data-texture"});const i=this.assetService.getMesh(e);i?this.dataTextureManager.getDataTexture(i).then((t=>{this.engineState.destinationMeshID=e,this.simulationRendererService.setDestinationDataTexture({dataTexture:t,textureSize:this.engineState.textureSize}),this.intersectionService.setDestinationGeometry(i)})):this.eventEmitter.emit("invalidRequest",{message:`Mesh with id "${e}" does not exist`})}setDataTextureTransitionProgress(e,t=!1){t&&this.eventEmitter.emit("transitionCancelled",{type:"data-texture"}),this.engineState.dataTextureTransitionProgress=e,this.simulationRendererService.setDataTextureTransitionProgress(e),this.intersectionService.setProgress(e)}setOriginMatcap(e,t=!1){t&&this.eventEmitter.emit("transitionCancelled",{type:"matcap"}),this.engineState.originMatcapID=e,this.instancedMeshManager.setOriginMatcap(this.assetService.getMatcap(e))}setDestinationMatcap(e,t=!1){t&&this.eventEmitter.emit("transitionCancelled",{type:"matcap"}),this.engineState.destinationMatcapID=e,this.instancedMeshManager.setDestinationMatcap(this.assetService.getMatcap(e))}setMatcapProgress(e,t=!1){t&&this.eventEmitter.emit("transitionCancelled",{type:"matcap"}),this.engineState.matcapTransitionProgress=e,this.instancedMeshManager.setProgress(e)}async setTextureSize(e){this.engineState.textureSize=e,this.dataTextureManager.setTextureSize(e),this.simulationRendererService.setTextureSize(e),this.instancedMeshManager.resize(e);const t=this.assetService.getMesh(this.engineState.originMeshID);if(!t)return void this.eventEmitter.emit("invalidRequest",{message:`Mesh with id "${this.engineState.originMeshID}" does not exist`});const i=this.assetService.getMesh(this.engineState.destinationMeshID);i?(this.dataTextureManager.getDataTexture(t).then((t=>this.simulationRendererService.setOriginDataTexture({dataTexture:t,textureSize:e}))),this.dataTextureManager.getDataTexture(i).then((t=>this.simulationRendererService.setDestinationDataTexture({dataTexture:t,textureSize:e}))),this.simulationRendererService.setDataTextureTransitionProgress(this.engineState.dataTextureTransitionProgress),this.simulationRendererService.setVelocityTractionForce(this.engineState.velocityTractionForce),this.simulationRendererService.setPositionalTractionForce(this.engineState.positionalTractionForce),this.instancedMeshManager.setOriginMatcap(this.assetService.getMatcap(this.engineState.originMatcapID)),this.instancedMeshManager.setDestinationMatcap(this.assetService.getMatcap(this.engineState.destinationMatcapID)),this.instancedMeshManager.setProgress(this.engineState.matcapTransitionProgress),this.instancedMeshManager.setGeometrySize(this.engineState.instanceGeometryScale)):this.eventEmitter.emit("invalidRequest",{message:`Mesh with id "${this.engineState.destinationMeshID}" does not exist`})}registerMesh(e,t){this.assetService.register(e,t)}registerMatcap(e,t){this.assetService.register(e,t)}async fetchAndRegisterMesh(e,t){return await this.assetService.loadMeshAsync(e,t)}async fetchAndRegisterMatcap(e,t){return await this.assetService.loadTextureAsync(e,t)}setPointerPosition(e){this.engineState.pointerPosition=e,this.intersectionService.setMousePosition(e)}setGeometrySize(e){this.engineState.instanceGeometryScale=e,this.instancedMeshManager.setGeometrySize(e)}setVelocityTractionForce(e){this.engineState.velocityTractionForce=e,this.simulationRendererService.setVelocityTractionForce(e)}setPositionalTractionForce(e){this.engineState.positionalTractionForce=e,this.simulationRendererService.setPositionalTractionForce(e)}setMaxRepelDistance(e){this.engineState.maxRepelDistance=e,this.simulationRendererService.setMaxRepelDistance(e)}scheduleMeshTransition(e,t,i=c,s=1e3,r=!1){this.transitionService.enqueue("data-texture",{easing:i,duration:s},{onTransitionBegin:()=>{this.setOriginDataTexture(e,r),this.setDestinationDataTexture(t,r),this.setDataTextureTransitionProgress(0)}})}scheduleMatcapTransition(e,t,i=c,s=1e3,r=!1){this.transitionService.enqueue("matcap",{easing:i,duration:s},{onTransitionBegin:()=>{this.setOriginMatcap(e,r),this.setDestinationMatcap(t,r),this.setMatcapProgress(0)}})}handleServiceStateUpdated({type:e,state:t}){this.serviceStates[e]=t}getObject(){return this.instancedMeshManager.getMesh()}getMeshIDs(){return this.assetService.getMeshIDs()}getMatcapIDs(){return this.assetService.getTextureIDs()}dispose(){this.scene.remove(this.instancedMeshManager.getMesh()),this.simulationRendererService.dispose(),this.instancedMeshManager.dispose(),this.intersectionService.dispose(),this.assetService.dispose(),this.dataTextureManager.dispose()}initialEngineState(e){return{textureSize:e,originMeshID:"",destinationMeshID:"",dataTextureTransitionProgress:0,originMatcapID:"",destinationMatcapID:"",matcapTransitionProgress:0,velocityTractionForce:.1,positionalTractionForce:.1,maxRepelDistance:.3,pointerPosition:{x:0,y:0},instanceGeometryScale:{x:1,y:1,z:1}}}initialServiceStates(){return{"data-texture":"created","instanced-mesh":"created",matcap:"created",simulation:"created",asset:"created"}}handleTransitionProgress({type:e,progress:t}){switch(e){case"data-texture":this.setDataTextureTransitionProgress(t);break;case"matcap":this.setMatcapProgress(t)}}handleInteractionPositionUpdated({position:e}){this.simulationRendererService.setInteractionPosition(e)}},Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),e}({},THREE,three-stdlib);
|
|
1
|
+
var ionian=function(e,t,i){"use strict";var s=Object.defineProperty,r=(e,t,i)=>((e,t,i)=>t in e?s(e,t,{enumerable:!0,configurable:!0,writable:!0,value:i}):e[t]=i)(e,"symbol"!=typeof t?t+"":t,i);function n(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e)for(const i in e)if("default"!==i){const s=Object.getOwnPropertyDescriptor(e,i);Object.defineProperty(t,i,s.get?s:{enumerable:!0,get:()=>e[i]})}return t.default=e,Object.freeze(t)}const a=n(t),o=e=>e;class u{constructor(){var e;r(this,"emitter",{all:e=e||new Map,on:function(t,i){var s=e.get(t);s?s.push(i):e.set(t,[i])},off:function(t,i){var s=e.get(t);s&&(i?s.splice(s.indexOf(i)>>>0,1):e.set(t,[]))},emit:function(t,i){var s=e.get(t);s&&s.slice().map((function(e){e(i)})),(s=e.get("*"))&&s.slice().map((function(e){e(t,i)}))}})}emit(e,t){this.emitter.emit(e,t)}off(e,t){this.emitter.off(e,t)}on(e,t){this.emitter.on(e,t)}once(e,t){this.emitter.on(e,(i=>{this.emitter.off(e,t),t(i)}))}dispose(){this.emitter.all.clear()}}function c(e,t){const i=new a.DataTexture(e,t,t,a.RGBAFormat,a.FloatType);return i.needsUpdate=!0,i}function h(e){e.geometry.dispose(),e.material instanceof a.Material?e.material.dispose():e.material.forEach((e=>e.dispose()))}function l(e,t,i){return e=Math.min(e,i),e=Math.max(e,t)}const d=new t.Triangle,m=new t.Vector3,g=new t.Vector2,p=new t.Vector2,v=new t.Vector2;class x{constructor(e){this.geometry=e.geometry,this.randomFunction=Math.random,this.indexAttribute=this.geometry.index,this.positionAttribute=this.geometry.getAttribute("position"),this.normalAttribute=this.geometry.getAttribute("normal"),this.colorAttribute=this.geometry.getAttribute("color"),this.uvAttribute=this.geometry.getAttribute("uv"),this.weightAttribute=null,this.distribution=null}setWeightAttribute(e){return this.weightAttribute=e?this.geometry.getAttribute(e):null,this}build(){const e=this.indexAttribute,t=this.positionAttribute,i=this.weightAttribute,s=e?e.count/3:t.count/3,r=new Float32Array(s);for(let o=0;o<s;o++){let s=1,n=3*o,a=3*o+1,u=3*o+2;e&&(n=e.getX(n),a=e.getX(a),u=e.getX(u)),i&&(s=i.getX(n)+i.getX(a)+i.getX(u)),d.a.fromBufferAttribute(t,n),d.b.fromBufferAttribute(t,a),d.c.fromBufferAttribute(t,u),s*=d.getArea(),r[o]=s}const n=new Float32Array(s);let a=0;for(let o=0;o<s;o++)a+=r[o],n[o]=a;return this.distribution=n,this}setRandomGenerator(e){return this.randomFunction=e,this}sample(e,t,i,s){const r=this.sampleFaceIndex();return this.sampleFace(r,e,t,i,s)}sampleFaceIndex(){const e=this.distribution[this.distribution.length-1];return this.binarySearch(this.randomFunction()*e)}binarySearch(e){const t=this.distribution;let i=0,s=t.length-1,r=-1;for(;i<=s;){const n=Math.ceil((i+s)/2);if(0===n||t[n-1]<=e&&t[n]>e){r=n;break}e<t[n]?s=n-1:i=n+1}return r}sampleFace(e,t,i,s,r){let n=this.randomFunction(),a=this.randomFunction();n+a>1&&(n=1-n,a=1-a);const o=this.indexAttribute;let u=3*e,c=3*e+1,h=3*e+2;return o&&(u=o.getX(u),c=o.getX(c),h=o.getX(h)),d.a.fromBufferAttribute(this.positionAttribute,u),d.b.fromBufferAttribute(this.positionAttribute,c),d.c.fromBufferAttribute(this.positionAttribute,h),t.set(0,0,0).addScaledVector(d.a,n).addScaledVector(d.b,a).addScaledVector(d.c,1-(n+a)),void 0!==i&&(void 0!==this.normalAttribute?(d.a.fromBufferAttribute(this.normalAttribute,u),d.b.fromBufferAttribute(this.normalAttribute,c),d.c.fromBufferAttribute(this.normalAttribute,h),i.set(0,0,0).addScaledVector(d.a,n).addScaledVector(d.b,a).addScaledVector(d.c,1-(n+a)).normalize()):d.getNormal(i)),void 0!==s&&void 0!==this.colorAttribute&&(d.a.fromBufferAttribute(this.colorAttribute,u),d.b.fromBufferAttribute(this.colorAttribute,c),d.c.fromBufferAttribute(this.colorAttribute,h),m.set(0,0,0).addScaledVector(d.a,n).addScaledVector(d.b,a).addScaledVector(d.c,1-(n+a)),s.r=m.x,s.g=m.y,s.b=m.z),void 0!==r&&void 0!==this.uvAttribute&&(g.fromBufferAttribute(this.uvAttribute,u),p.fromBufferAttribute(this.uvAttribute,c),v.fromBufferAttribute(this.uvAttribute,h),r.set(0,0).addScaledVector(g,n).addScaledVector(p,a).addScaledVector(v,1-(n+a))),this}}class f{constructor(e,t){r(this,"textureSize"),r(this,"dataTextures"),r(this,"eventEmitter"),this.eventEmitter=e,this.textureSize=t,this.dataTextures=new Map,this.updateServiceState("ready")}setTextureSize(e){this.textureSize!==e&&(this.textureSize=e,this.dataTextures.forEach((e=>e.dispose())),this.dataTextures.clear())}async getDataTexture(e){const t=this.dataTextures.get(e.name);if(t)return t;var i,s;const r=function(e,t){const i=new a.BufferGeometry;i.setAttribute("position",new a.BufferAttribute(new Float32Array(e.position),3)),e.normal&&i.setAttribute("normal",new a.BufferAttribute(new Float32Array(e.normal),3));const s=new a.MeshBasicMaterial,r=new a.Mesh(i,s);r.scale.set(e.scale.x,e.scale.y,e.scale.z);const n=new x(r).build(),o=new Float32Array(t*t*4),u=new a.Vector3;for(let a=0;a<t;a++)for(let i=0;i<t;i++){const s=a*t+i;n.sample(u),o[4*s]=u.x*e.scale.x,o[4*s+1]=u.y*e.scale.y,o[4*s+2]=u.z*e.scale.z,o[4*s+3]=.01*(Math.random()-.5)}return o}({position:(i=e).geometry.attributes.position.array,normal:null==(s=i.geometry.attributes.normal)?void 0:s.array,scale:{x:i.scale.x,y:i.scale.y,z:i.scale.z}},this.textureSize),n=c(r,this.textureSize);return n.name=e.name,n}async dispose(){this.dataTextures.clear(),this.updateServiceState("disposed")}updateServiceState(e){this.eventEmitter.emit("serviceStateUpdated",{type:"data-texture",state:e})}}class y{constructor(e){r(this,"size"),r(this,"mesh"),r(this,"matcapMaterial"),r(this,"fallbackMaterial"),r(this,"fallbackGeometry"),r(this,"materials"),r(this,"geometries"),r(this,"uvRefsCache"),r(this,"previousScale"),this.size=e,this.materials=new Map,this.geometries=new Map,this.uvRefsCache=new Map,this.previousScale={x:1,y:1,z:1},this.matcapMaterial=new a.ShaderMaterial({uniforms:{uTime:{value:0},uProgress:{value:0},uTexture:{value:null},uVelocity:{value:null},uSourceMatcap:{value:null},uTargetMatcap:{value:null}},vertexShader:"\nvarying vec2 vUv;\nuniform sampler2D uTexture;\nuniform sampler2D uVelocity;\nuniform float uTime;\nvarying vec3 vNormal;\nattribute vec2 uvRef;\nvarying vec3 vViewPosition;\n\nvec3 rotate3D(vec3 v, vec3 vel) {\n vec3 pos = v;\n vec3 up = vec3(0, 1, 0);\n vec3 axis = normalize(cross(up, vel));\n float angle = acos(dot(up, normalize(vel)));\n pos = pos * cos(angle) + cross(axis, pos) * sin(angle) + axis * dot(axis, pos) * (1. - cos(angle));\n return pos;\n}\n\nvoid main() {\n vUv = uv;\n vNormal = normal;\n\n vec4 color = texture2D(uTexture, uvRef);\n vec4 velocity = texture2D(uVelocity, uvRef);\n vec3 pos = color.xyz;// apply the texture to the vertex distribution.\n\n vec3 localPosition = position.xyz;\n if (length (velocity.xyz) < 0.0001) {\n velocity.xyz = vec3(0.0, 0.0001, 0.0001);\n }\n localPosition.y *= max(1.0, length(velocity.xyz) * 1000.0);\n localPosition = rotate3D(localPosition, velocity.xyz);\n vNormal = rotate3D(normal, velocity.xyz);\n\n mat4 instanceMat = instanceMatrix;\n instanceMat[3].xyz = pos.xyz;\n\n // unlike the traditional mvMatrix * position, we need to additional multiplication with the instance matrix.\n vec4 modelViewPosition = modelViewMatrix * instanceMat * vec4(localPosition, 1.0);\n\n vViewPosition = - modelViewPosition.xyz;\n\n gl_Position = projectionMatrix * modelViewPosition;\n}\n",fragmentShader:"\nvarying vec2 vUv;\nuniform sampler2D uTexture;\n\nuniform sampler2D uSourceMatcap;\nuniform sampler2D uTargetMatcap;\n\nuniform float uProgress;\nvarying vec3 vNormal;\nvarying vec3 vViewPosition;\nvoid main() {\n vec3 viewDir = normalize( vViewPosition );\n vec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\n vec3 y = cross( viewDir, x );\n vec2 uv = vec2( dot( x, vNormal ), dot( y, vNormal ) ) * 0.495 + 0.5; // 0.495 to remove artifacts caused by undersized matcap disks\n\n vec4 sourceMatcap = texture2D( uSourceMatcap, uv );\n vec4 targetMatcap = texture2D( uTargetMatcap, uv );\n\n vec4 matcap = mix(sourceMatcap, targetMatcap, uProgress);\n gl_FragColor = matcap;\n}\n"}),this.fallbackMaterial=new a.MeshBasicMaterial({color:16777215}),this.fallbackGeometry=new a.BoxGeometry(.001,.001,.001),this.mesh=this.createInstancedMesh(e,this.fallbackGeometry,this.fallbackMaterial)}getMesh(){return this.mesh}update(e){const t=this.mesh.material;(t instanceof a.ShaderMaterial||t instanceof a.RawShaderMaterial)&&(t.uniforms.uTime.value=e)}setOriginMatcap(e){this.matcapMaterial.uniforms.uSourceMatcap.value=e}setDestinationMatcap(e){this.matcapMaterial.uniforms.uTargetMatcap.value=e}setProgress(e){e=Math.max(0,e),e=Math.min(1,e),this.matcapMaterial.uniforms.uProgress.value=e}setGeometrySize(e){this.mesh.geometry.scale(1/this.previousScale.x,1/this.previousScale.y,1/this.previousScale.z),this.mesh.geometry.scale(e.x,e.y,e.z),this.previousScale=e}useMatcapMaterial(){this.mesh.material=this.matcapMaterial}useMaterial(e){const t=this.materials.get(e);t&&(this.mesh.material=t)}useGeometry(e){const t=this.geometries.get(e);t&&(this.mesh.geometry=t)}updateVelocityTexture(e){this.matcapMaterial.uniforms.uVelocity.value=e}updatePositionTexture(e){this.matcapMaterial.uniforms.uTexture.value=e}resize(e){if(this.size===e)return{current:this.mesh,previous:this.mesh};this.size=e;const t=this.mesh;return this.mesh=this.createInstancedMesh(e,t.geometry,t.material),{current:this.mesh,previous:t}}dispose(){this.mesh.dispose(),this.geometries.forEach((e=>e.dispose())),this.materials.forEach((e=>e.dispose())),this.uvRefsCache.clear(),this.geometries.clear(),this.materials.clear()}registerGeometry(e,t){const i=this.geometries.get(e);if(i&&i===t)return;const s=this.getUVRefs(this.size);t.setAttribute("uvRef",s),this.geometries.set(e,t),this.mesh.geometry===i&&(this.mesh.geometry=t),null==i||i.dispose()}registerMaterial(e,t){const i=this.materials.get(e);i&&i===t||(this.mesh.material===i&&(this.mesh.material=t),this.materials.set(e,t),null==i||i.dispose())}getUVRefs(e){const t=this.uvRefsCache.get(e);if(t)return t;const i=new Float32Array(e*e*2);for(let r=0;r<e;r++)for(let t=0;t<e;t++){const s=r*e+t;i[2*s]=t/(e-1),i[2*s+1]=r/(e-1)}const s=new a.InstancedBufferAttribute(i,2);return this.uvRefsCache.set(e,s),s}createInstancedMesh(e,t,i){(t=t||this.fallbackGeometry).setAttribute("uvRef",this.getUVRefs(e));const s=e*e;return new a.InstancedMesh(t,i,s)}}class T{constructor(e,t,i,s){r(this,"raycaster",new a.Raycaster),r(this,"mousePosition",new a.Vector2),r(this,"camera"),r(this,"originGeometry"),r(this,"destinationGeometry"),r(this,"progress",0),r(this,"intersectionMesh",new a.Mesh),r(this,"geometryNeedsUpdate"),r(this,"eventEmitter"),r(this,"blendedGeometry"),r(this,"intersection"),r(this,"lastKnownOriginMeshID"),r(this,"lastKnownDestinationMeshID"),this.camera=t,this.originGeometry=i,this.eventEmitter=e,this.destinationGeometry=s,this.geometryNeedsUpdate=!0}getIntersectionMesh(){return this.intersectionMesh}setCamera(e){this.camera=e}setOriginGeometry(e){this.lastKnownOriginMeshID!==e.uuid&&(this.originGeometry&&this.originGeometry.dispose(),this.lastKnownOriginMeshID=e.uuid,this.originGeometry=e.geometry.clone(),this.originGeometry.applyMatrix4(e.matrixWorld),this.geometryNeedsUpdate=!0)}setDestinationGeometry(e){this.lastKnownDestinationMeshID!==e.uuid&&(this.destinationGeometry&&this.destinationGeometry.dispose(),this.lastKnownDestinationMeshID=e.uuid,this.destinationGeometry=e.geometry.clone(),this.destinationGeometry.applyMatrix4(e.matrixWorld),this.geometryNeedsUpdate=!0)}setProgress(e){this.progress=e,this.geometryNeedsUpdate=!0}setMousePosition(e){e&&this.mousePosition.copy(e)}calculate(e){if(this.updateIntersectionMesh(e),this.camera)return this.geometryNeedsUpdate&&(this.geometryNeedsUpdate=!1,this.blendedGeometry=this.getBlendedGeometry()),this.blendedGeometry?this.intersection=this.getFirstIntersection(this.camera,e):this.intersection=void 0,this.intersection?this.eventEmitter.emit("interactionPositionUpdated",{position:this.intersection}):this.eventEmitter.emit("interactionPositionUpdated",{position:{x:0,y:0,z:0,w:0}}),this.intersection}dispose(){var e;null==(e=this.blendedGeometry)||e.dispose(),this.intersectionMesh.geometry.dispose()}updateIntersectionMesh(e){this.blendedGeometry&&this.blendedGeometry.uuid!==this.intersectionMesh.geometry.uuid&&(this.intersectionMesh.geometry.dispose(),this.intersectionMesh.geometry=this.blendedGeometry),this.intersectionMesh.matrix.copy(e.matrixWorld),this.intersectionMesh.matrixWorld.copy(e.matrixWorld),this.intersectionMesh.matrixAutoUpdate=!1,this.intersectionMesh.updateMatrixWorld(!0)}getFirstIntersection(e,t){this.raycaster.setFromCamera(this.mousePosition,e);const i=this.raycaster.intersectObject(this.intersectionMesh,!1)[0];if(i){const e=i.point.clone(),s=t.worldToLocal(e);return new a.Vector4(s.x,s.y,s.z,1)}}getBlendedGeometry(){return 0===this.progress?this.originGeometry:1===this.progress?this.destinationGeometry:this.originGeometry&&this.destinationGeometry?this.originGeometry===this.destinationGeometry?this.originGeometry:this.blendGeometry(this.originGeometry,this.destinationGeometry,this.progress):void 0}blendGeometry(e,t,i){const s=new a.BufferGeometry,r=e.attributes.position.array,n=t.attributes.position.array,o=new Float32Array(r.length);for(let u=0;u<r.length;u+=3){const e=new a.Vector3(r[u],r[u+1],r[u+2]),t=new a.Vector3(n[u],n[u+1],n[u+2]),s=(new a.Vector3).lerpVectors(e,t,i);o[u]=s.x,o[u+1]=s.y,o[u+2]=s.z}return s.setAttribute("position",new a.BufferAttribute(o,3)),e.attributes.normal&&s.setAttribute("normal",e.attributes.normal.clone()),e.attributes.uv&&s.setAttribute("uv",e.attributes.uv.clone()),e.index&&s.setIndex(e.index.clone()),s}}const M=new t.OrthographicCamera(-1,1,1,-1,0,1);class S extends t.BufferGeometry{constructor(){super(),this.setAttribute("position",new t.Float32BufferAttribute([-1,3,0,-1,-1,0,3,-1,0],3)),this.setAttribute("uv",new t.Float32BufferAttribute([0,2,0,0,2,0],2))}}const w=new S;class b{constructor(e){this._mesh=new t.Mesh(w,e)}dispose(){this._mesh.geometry.dispose()}render(e){e.render(this._mesh,M)}get material(){return this._mesh.material}set material(e){this._mesh.material=e}}class D{constructor(e,i,s){this.variables=[],this.currentTextureIndex=0;let r=t.FloatType;const n={passThruTexture:{value:null}},a=c("uniform sampler2D passThruTexture;\n\nvoid main() {\n\n\tvec2 uv = gl_FragCoord.xy / resolution.xy;\n\n\tgl_FragColor = texture2D( passThruTexture, uv );\n\n}\n",n),o=new b(a);function u(t){t.defines.resolution="vec2( "+e.toFixed(1)+", "+i.toFixed(1)+" )"}function c(e,i){i=i||{};const s=new t.ShaderMaterial({name:"GPUComputationShader",uniforms:i,vertexShader:"void main()\t{\n\n\tgl_Position = vec4( position, 1.0 );\n\n}\n",fragmentShader:e});return u(s),s}this.setDataType=function(e){return r=e,this},this.addVariable=function(e,i,s){const r={name:e,initialValueTexture:s,material:this.createShaderMaterial(i),dependencies:null,renderTargets:[],wrapS:null,wrapT:null,minFilter:t.NearestFilter,magFilter:t.NearestFilter};return this.variables.push(r),r},this.setVariableDependencies=function(e,t){e.dependencies=t},this.init=function(){if(0===s.capabilities.maxVertexTextures)return"No support for vertex shader textures.";for(let t=0;t<this.variables.length;t++){const s=this.variables[t];s.renderTargets[0]=this.createRenderTarget(e,i,s.wrapS,s.wrapT,s.minFilter,s.magFilter),s.renderTargets[1]=this.createRenderTarget(e,i,s.wrapS,s.wrapT,s.minFilter,s.magFilter),this.renderTexture(s.initialValueTexture,s.renderTargets[0]),this.renderTexture(s.initialValueTexture,s.renderTargets[1]);const r=s.material,n=r.uniforms;if(null!==s.dependencies)for(let e=0;e<s.dependencies.length;e++){const t=s.dependencies[e];if(t.name!==s.name){let e=!1;for(let i=0;i<this.variables.length;i++)if(t.name===this.variables[i].name){e=!0;break}if(!e)return"Variable dependency not found. Variable="+s.name+", dependency="+t.name}n[t.name]={value:null},r.fragmentShader="\nuniform sampler2D "+t.name+";\n"+r.fragmentShader}}return this.currentTextureIndex=0,null},this.compute=function(){const e=this.currentTextureIndex,t=0===this.currentTextureIndex?1:0;for(let i=0,s=this.variables.length;i<s;i++){const s=this.variables[i];if(null!==s.dependencies){const t=s.material.uniforms;for(let i=0,r=s.dependencies.length;i<r;i++){const r=s.dependencies[i];t[r.name].value=r.renderTargets[e].texture}}this.doRenderTarget(s.material,s.renderTargets[t])}this.currentTextureIndex=t},this.getCurrentRenderTarget=function(e){return e.renderTargets[this.currentTextureIndex]},this.getAlternateRenderTarget=function(e){return e.renderTargets[0===this.currentTextureIndex?1:0]},this.dispose=function(){o.dispose();const e=this.variables;for(let t=0;t<e.length;t++){const i=e[t];i.initialValueTexture&&i.initialValueTexture.dispose();const s=i.renderTargets;for(let e=0;e<s.length;e++){s[e].dispose()}}},this.addResolutionDefine=u,this.createShaderMaterial=c,this.createRenderTarget=function(s,n,a,o,u,c){s=s||e,n=n||i,a=a||t.ClampToEdgeWrapping,o=o||t.ClampToEdgeWrapping,u=u||t.NearestFilter,c=c||t.NearestFilter;return new t.WebGLRenderTarget(s,n,{wrapS:a,wrapT:o,minFilter:u,magFilter:c,format:t.RGBAFormat,type:r,depthBuffer:!1})},this.createTexture=function(){const s=new Float32Array(e*i*4),r=new t.DataTexture(s,e,i,t.RGBAFormat,t.FloatType);return r.needsUpdate=!0,r},this.renderTexture=function(e,t){n.passThruTexture.value=e,this.doRenderTarget(a,t),n.passThruTexture.value=null},this.doRenderTarget=function(e,t){const i=s.getRenderTarget(),r=s.xr.enabled,n=s.shadowMap.autoUpdate;s.xr.enabled=!1,s.shadowMap.autoUpdate=!1,o.material=e,s.setRenderTarget(t),o.render(s),o.material=a,s.xr.enabled=r,s.shadowMap.autoUpdate=n,s.setRenderTarget(i)}}}class P{constructor(e,t,i){r(this,"gpuComputationRenderer"),r(this,"webGLRenderer"),r(this,"positionDataTexture"),r(this,"velocityDataTexture"),r(this,"mixPositionsVar"),r(this,"velocityVar"),r(this,"positionVar"),r(this,"interactionPosition"),r(this,"lastKnownPositionDataTexture"),r(this,"lastKnownVelocityDataTexture"),r(this,"lastKnownMixProgress"),r(this,"initialDataTexture"),this.initialDataTexture=i??function(e){const t=new Float32Array(e*e*4);for(let i=0;i<e;i++)for(let s=0;s<e;s++){const r=i*e+s;let n=Math.random()*Math.PI*2,a=Math.acos(2*Math.random()-1),o=Math.sin(a)*Math.cos(n),u=Math.sin(a)*Math.sin(n),c=Math.cos(a);t[4*r]=o,t[4*r+1]=u,t[4*r+2]=c,t[4*r+3]=.01*(Math.random()-.5)}return c(t,e)}(e),this.positionDataTexture=this.initialDataTexture,this.webGLRenderer=t,this.gpuComputationRenderer=new D(e,e,this.webGLRenderer),this.lastKnownMixProgress=0,t.capabilities.isWebGL2||this.gpuComputationRenderer.setDataType(a.HalfFloatType),this.velocityDataTexture=function(e){return c(new Float32Array(4*e*e),e)}(e),this.interactionPosition=new a.Vector4(0,0,0,0),this.mixPositionsVar=this.gpuComputationRenderer.addVariable("uMixedPosition","\nuniform sampler2D uPositionA;\nuniform sampler2D uPositionB;\nuniform float uProgress;\n\nvoid main() {\n vec2 uv = gl_FragCoord.xy / resolution.xy;\n vec3 positionA = texture2D(uPositionA, uv).xyz;\n vec3 positionB = texture2D(uPositionB, uv).xyz;\n vec3 mixedPosition = mix(positionA, positionB, uProgress);\n gl_FragColor = vec4(mixedPosition, 1.0);\n}\n",this.positionDataTexture),this.velocityVar=this.gpuComputationRenderer.addVariable("uCurrentVelocity","\nuniform float uProgress;\nuniform vec4 uInteractionPosition;\nuniform float uTime;\nuniform float uTractionForce;\nuniform float uMaxRepelDistance;\n\nfloat rand(vec2 co) {\n return fract(sin(dot(co, vec2(12.9898, 78.233))) * 43758.5453);\n}\n\nvoid main() {\n vec2 uv = gl_FragCoord.xy / resolution.xy;\n float offset = rand(uv);\n\n vec3 position = texture2D(uCurrentPosition, uv).xyz;\n vec3 velocity = texture2D(uCurrentVelocity, uv).xyz;\n vec3 mixedPosition = texture2D(uMixedPosition, uv).xyz;\n\n velocity *= 0.9;\n\n // particle traction\n vec3 direction = normalize(mixedPosition - position); // direction vector\n float dist = length ( mixedPosition - position ); // distance from where it was supposed to be, and currently are.\n if (dist > 0.01) {\n position += direction * 0.1 * uTractionForce; // uTractionForce defaults to 0.1\n }\n\n // mouse repel force\n float pointerDistance = distance(position, uInteractionPosition.xyz);\n float mouseRepelModifier = clamp(uMaxRepelDistance - pointerDistance, 0.0, 1.0);\n float normalizedDistance = pointerDistance / uMaxRepelDistance;\n float repulsionStrength = (1.0 - normalizedDistance) * uInteractionPosition.w;\n direction = normalize(position - uInteractionPosition.xyz);\n velocity += (direction * 0.01 * repulsionStrength) * mouseRepelModifier;\n\n float lifespan = 20.0;\n float age = mod(uTime + lifespan * offset, lifespan);\n\n if (age < 0.1) {\n position.xyz = mixedPosition;\n }\n\n gl_FragColor = vec4(velocity, 1.0);\n}\n",this.velocityDataTexture),this.positionVar=this.gpuComputationRenderer.addVariable("uCurrentPosition","\nuniform float uProgress;\nuniform vec4 uInteractionPosition;\nuniform float uTime;\nuniform float uTractionForce;\n\nfloat rand(vec2 co) {\n return fract(sin(dot(co, vec2(12.9898, 78.233))) * 43758.5453);\n}\n\nvoid main() {\n\n // in GPGPU, we calculate the uv on each fragment shader, not using the static varying passed over from the v shader.\n vec2 uv = gl_FragCoord.xy / resolution.xy;\n float offset = rand(uv);\n\n vec3 position = texture2D(uCurrentPosition, uv).xyz;\n vec3 velocity = texture2D(uCurrentVelocity, uv).xyz;\n vec3 mixedPosition = texture2D(uMixedPosition, uv).xyz;\n\n // particle attraction to original position.\n vec3 direction = normalize(mixedPosition - position); // direction vector\n float dist = length ( mixedPosition - position ); // distance from where it was supposed to be, and currently are.\n\n if (dist > 0.01) {\n position = mix(position, mixedPosition, 0.1 * uTractionForce); // 0.1 ~ 0.001 (faster, slower)\n }\n\n position += velocity;\n gl_FragColor = vec4(position, 1.0);\n}\n",this.positionDataTexture),this.mixPositionsVar.material.uniforms.uProgress={value:0},this.mixPositionsVar.material.uniforms.uPositionA={value:this.initialDataTexture},this.mixPositionsVar.material.uniforms.uPositionB={value:this.initialDataTexture},this.velocityVar.material.uniforms.uTime={value:0},this.velocityVar.material.uniforms.uInteractionPosition={value:this.interactionPosition},this.velocityVar.material.uniforms.uCurrentPosition={value:this.positionDataTexture},this.velocityVar.material.uniforms.uTractionForce={value:.1},this.velocityVar.material.uniforms.uMaxRepelDistance={value:.3},this.positionVar.material.uniforms.uTime={value:0},this.positionVar.material.uniforms.uProgress={value:0},this.positionVar.material.uniforms.uTractionForce={value:.1},this.positionVar.material.uniforms.uInteractionPosition={value:this.interactionPosition},this.positionVar.material.uniforms.uCurrentPosition={value:this.positionDataTexture},this.gpuComputationRenderer.setVariableDependencies(this.positionVar,[this.velocityVar,this.positionVar,this.mixPositionsVar]),this.gpuComputationRenderer.setVariableDependencies(this.velocityVar,[this.velocityVar,this.positionVar,this.mixPositionsVar]);const s=this.gpuComputationRenderer.init();if(s)throw new Error("failed to initialize SimulationRenderer: "+s);this.lastKnownVelocityDataTexture=this.getVelocityTexture(),this.lastKnownPositionDataTexture=this.getPositionTexture()}setMorphSourceDataTexture(e){this.mixPositionsVar.material.uniforms.uPositionA.value=e}setMorphDestinationDataTexture(e){this.mixPositionsVar.material.uniforms.uPositionB.value=e}setMaxRepelDistance(e){this.velocityVar.material.uniforms.uMaxRepelDistance.value=e}setProgress(e){this.lastKnownMixProgress=l(e,0,1),this.mixPositionsVar.material.uniforms.uProgress.value=this.lastKnownMixProgress}setVelocityTractionForce(e){this.velocityVar.material.uniforms.uTractionForce.value=e}setPositionalTractionForce(e){this.positionVar.material.uniforms.uTractionForce.value=e}setInteractionPosition(e){this.interactionPosition.copy(e)}dispose(){this.mixPositionsVar.renderTargets.forEach((e=>e.dispose())),this.positionVar.renderTargets.forEach((e=>e.dispose())),this.velocityVar.renderTargets.forEach((e=>e.dispose())),this.positionDataTexture.dispose(),this.velocityDataTexture.dispose(),this.gpuComputationRenderer.dispose()}compute(e){this.velocityVar.material.uniforms.uTime.value=e,this.positionVar.material.uniforms.uTime.value=e,this.gpuComputationRenderer.compute()}getVelocityTexture(){return this.lastKnownVelocityDataTexture=this.gpuComputationRenderer.getCurrentRenderTarget(this.velocityVar).texture,this.lastKnownVelocityDataTexture}getPositionTexture(){return this.lastKnownPositionDataTexture=this.gpuComputationRenderer.getCurrentRenderTarget(this.positionVar).texture,this.lastKnownPositionDataTexture}}class R{constructor(e,t,i){r(this,"state"),r(this,"textureSize"),r(this,"dataTextureTransitionProgress"),r(this,"velocityTractionForce"),r(this,"positionalTractionForce"),r(this,"simulationRenderer"),r(this,"webGLRenderer"),r(this,"eventEmitter"),r(this,"lastKnownVelocityDataTexture"),r(this,"lastKnownPositionDataTexture"),this.eventEmitter=e,this.webGLRenderer=i,this.textureSize=t,this.dataTextureTransitionProgress=0,this.velocityTractionForce=.1,this.positionalTractionForce=.1,this.updateServiceState("initializing"),this.simulationRenderer=new P(this.textureSize,this.webGLRenderer),this.lastKnownVelocityDataTexture=this.simulationRenderer.getVelocityTexture(),this.lastKnownPositionDataTexture=this.simulationRenderer.getPositionTexture(),this.updateServiceState("ready")}setTextureSize(e){this.updateServiceState("initializing"),this.simulationRenderer.dispose(),this.textureSize=e,this.simulationRenderer=new P(e,this.webGLRenderer),this.updateServiceState("ready")}setOriginDataTexture(e){this.textureSize!==e.textureSize?this.eventEmitter.emit("invalidRequest",{message:`Texture size mismatch: ${e.textureSize} vs ${this.textureSize}`}):this.simulationRenderer.setMorphSourceDataTexture(e.dataTexture)}setDestinationDataTexture(e){this.textureSize!==e.textureSize?this.eventEmitter.emit("invalidRequest",{message:`Texture size mismatch: ${e.textureSize} vs ${this.textureSize}`}):this.simulationRenderer.setMorphDestinationDataTexture(e.dataTexture)}setDataTextureTransitionProgress(e){this.dataTextureTransitionProgress=e,this.simulationRenderer.setProgress(this.dataTextureTransitionProgress)}setVelocityTractionForce(e){this.velocityTractionForce=e,this.simulationRenderer.setVelocityTractionForce(this.velocityTractionForce)}setPositionalTractionForce(e){this.positionalTractionForce=e,this.simulationRenderer.setPositionalTractionForce(this.positionalTractionForce)}compute(e){this.simulationRenderer.compute(e)}getVelocityTexture(){return"ready"===this.state&&(this.lastKnownVelocityDataTexture=this.simulationRenderer.getVelocityTexture()),this.lastKnownVelocityDataTexture}getPositionTexture(){return"ready"===this.state&&(this.lastKnownPositionDataTexture=this.simulationRenderer.getPositionTexture()),this.lastKnownPositionDataTexture}dispose(){this.updateServiceState("disposed"),this.simulationRenderer.dispose(),this.lastKnownVelocityDataTexture.dispose(),this.lastKnownPositionDataTexture.dispose()}updateServiceState(e){this.state=e,this.eventEmitter.emit("serviceStateUpdated",{type:"simulation",state:e})}setInteractionPosition(e){this.simulationRenderer.setInteractionPosition(e)}setMaxRepelDistance(e){this.simulationRenderer.setMaxRepelDistance(e)}}class V{constructor(){r(this,"execStatus",new Map)}get(e){const t=this.execStatus.get(e);return t||(this.execStatus.set(e,"idle"),"idle")}set(e,t){this.execStatus.set(e,t)}}class A{constructor(e){r(this,"eventEmitter"),r(this,"transitions",new Map),r(this,"execStatus"),r(this,"ongoingTransitions",new Map),this.eventEmitter=e,this.execStatus=new V,this.eventEmitter.on("transitionCancelled",this.handleTransitionCancelledEvent.bind(this))}enqueue(e,t,i={}){const s={...t,...i,cancelled:!1,duration:.001*t.duration};this.getQueue(e).push(s)}compute(e){this.transitions.forEach(((t,i)=>{var s;if(t.length&&!this.ongoingTransitions.has(i)){const r=t.shift();r&&(this.ongoingTransitions.set(i,{...r,startTime:e}),null==(s=r.onTransitionBegin)||s.call(r))}})),this.ongoingTransitions.forEach(((t,i)=>{var s,r,n;if(t.cancelled)return null==(s=t.onTransitionCancelled)||s.call(t),void this.ongoingTransitions.delete(i);const{startTime:a,duration:o,easing:u}=t,c=e-a,h=l(u(Math.min(1,c/o)),0,1);this.emitTransitionProgress(i,h),null==(r=t.onTransitionProgress)||r.call(t,h),h>=1&&(this.emitTransitionFinished(i),null==(n=t.onTransitionFinished)||n.call(t),this.ongoingTransitions.delete(i))}))}getQueue(e){const t=this.transitions.get(e);return t||(this.transitions.set(e,[]),this.transitions.get(e)??[])}handleTransitionCancelledEvent({type:e}){var t;const i=this.getQueue(e);for(;i.length;)i.pop();const s=this.ongoingTransitions.get(e);s&&(s.cancelled=!0,null==(t=s.onTransitionCancelled)||t.call(s))}emitTransitionProgress(e,t){this.eventEmitter.emit("transitionProgressed",{type:e,progress:t})}emitTransitionFinished(e){this.eventEmitter.emit("transitionFinished",{type:e})}}class z{constructor(e){r(this,"serviceState","created"),r(this,"eventEmitter"),r(this,"meshes",new Map),r(this,"textures",new Map),r(this,"gltfLoader",new i.GLTFLoader),r(this,"textureLoader",new a.TextureLoader),r(this,"dracoLoader",new i.DRACOLoader),r(this,"solidColorTexture",new a.DataTexture(new Uint8Array([127,127,127,255]),1,1,a.RGBAFormat)),this.eventEmitter=e,this.dracoLoader.setDecoderPath("https://www.gstatic.com/draco/versioned/decoders/1.5.7/"),this.gltfLoader.setDRACOLoader(this.dracoLoader),this.updateServiceState("ready")}register(e,t){if(t.name=e,t instanceof a.Mesh){const i=this.meshes.get(e);i&&h(i),this.meshes.set(e,t)}else{const i=this.textures.get(e);i&&i.dispose(),this.textures.set(e,t)}this.eventEmitter.emit("assetRegistered",{id:e})}setSolidColor(e){this.changeColor(e)}getSolidColorTexture(){return this.solidColorTexture}getMesh(e){return this.meshes.get(e)??null}getMatcap(e){const t=this.textures.get(e);return t||this.eventEmitter.emit("invalidRequest",{message:`texture with id "${e}" not found. using solid color texture instead...`}),t??this.solidColorTexture}getMeshIDs(){return Array.from(this.meshes.keys())}getTextureIDs(){return Array.from(this.textures.keys())}getMeshes(){return Array.from(this.meshes.values())}getTextures(){return Array.from(this.textures.values())}async loadMeshAsync(e,t,i={}){const s=await this.gltfLoader.loadAsync(t);try{if(i.meshName){const t=s.scene.getObjectByName(i.meshName);return this.register(e,t),t}{const t=s.scene.children[0];return this.register(e,t),t}}catch(r){return this.eventEmitter.emit("invalidRequest",{message:`failed to load mesh: ${e}. ${r}`}),null}}async loadTextureAsync(e,t){try{const i=await this.textureLoader.loadAsync(t);return this.register(e,i),i}catch(i){return this.eventEmitter.emit("invalidRequest",{message:`failed to load texture: ${e}. ${i}`}),null}}dispose(){this.updateServiceState("disposed"),this.meshes.forEach((e=>h(e))),this.meshes.clear(),this.textures.forEach((e=>e.dispose())),this.textures.clear()}changeColor(e){const t=new a.Color(e);this.solidColorTexture=new a.DataTexture(new Uint8Array([t.r,t.g,t.b,255]),1,1,a.RGBAFormat),this.solidColorTexture.needsUpdate=!0}updateServiceState(e){this.serviceState=e,this.eventEmitter.emit("serviceStateUpdated",{type:"asset",state:e})}}return e.ParticlesEngine=class{constructor(e){r(this,"simulationRendererService"),r(this,"eventEmitter"),r(this,"renderer"),r(this,"scene"),r(this,"serviceStates"),r(this,"assetService"),r(this,"dataTextureManager"),r(this,"instancedMeshManager"),r(this,"transitionService"),r(this,"engineState"),r(this,"intersectionService"),this.eventEmitter=new u,this.serviceStates=this.initialServiceStates(),this.eventEmitter.on("serviceStateUpdated",this.handleServiceStateUpdated.bind(this)),this.scene=e.scene,this.renderer=e.renderer,this.engineState=this.initialEngineState(e.textureSize),this.assetService=new z(this.eventEmitter),this.transitionService=new A(this.eventEmitter),this.dataTextureManager=new f(this.eventEmitter,e.textureSize),this.simulationRendererService=new R(this.eventEmitter,e.textureSize,this.renderer),this.instancedMeshManager=new y(e.textureSize),this.instancedMeshManager.useMatcapMaterial(),this.scene.add(this.instancedMeshManager.getMesh()),this.intersectionService=new T(this.eventEmitter,e.camera),this.eventEmitter.on("transitionProgressed",this.handleTransitionProgress.bind(this)),this.eventEmitter.on("interactionPositionUpdated",this.handleInteractionPositionUpdated.bind(this))}render(e){this.intersectionService.calculate(this.instancedMeshManager.getMesh()),this.transitionService.compute(e),this.simulationRendererService.compute(e),this.instancedMeshManager.update(e),this.instancedMeshManager.updateVelocityTexture(this.simulationRendererService.getVelocityTexture()),this.instancedMeshManager.updatePositionTexture(this.simulationRendererService.getPositionTexture())}setOriginDataTexture(e,t=!1){t&&this.eventEmitter.emit("transitionCancelled",{type:"data-texture"});const i=this.assetService.getMesh(e);i?this.dataTextureManager.getDataTexture(i).then((t=>{this.engineState.originMeshID=e,this.simulationRendererService.setOriginDataTexture({dataTexture:t,textureSize:this.engineState.textureSize}),this.intersectionService.setOriginGeometry(i)})):this.eventEmitter.emit("invalidRequest",{message:`Mesh with id "${e}" does not exist`})}setDestinationDataTexture(e,t=!1){t&&this.eventEmitter.emit("transitionCancelled",{type:"data-texture"});const i=this.assetService.getMesh(e);i?this.dataTextureManager.getDataTexture(i).then((t=>{this.engineState.destinationMeshID=e,this.simulationRendererService.setDestinationDataTexture({dataTexture:t,textureSize:this.engineState.textureSize}),this.intersectionService.setDestinationGeometry(i)})):this.eventEmitter.emit("invalidRequest",{message:`Mesh with id "${e}" does not exist`})}setDataTextureTransitionProgress(e,t=!1){t&&this.eventEmitter.emit("transitionCancelled",{type:"data-texture"}),this.engineState.dataTextureTransitionProgress=e,this.simulationRendererService.setDataTextureTransitionProgress(e),this.intersectionService.setProgress(e)}setOriginMatcap(e,t=!1){t&&this.eventEmitter.emit("transitionCancelled",{type:"matcap"}),this.engineState.originMatcapID=e,this.instancedMeshManager.setOriginMatcap(this.assetService.getMatcap(e))}setDestinationMatcap(e,t=!1){t&&this.eventEmitter.emit("transitionCancelled",{type:"matcap"}),this.engineState.destinationMatcapID=e,this.instancedMeshManager.setDestinationMatcap(this.assetService.getMatcap(e))}setMatcapProgress(e,t=!1){t&&this.eventEmitter.emit("transitionCancelled",{type:"matcap"}),this.engineState.matcapTransitionProgress=e,this.instancedMeshManager.setProgress(e)}async setTextureSize(e){this.engineState.textureSize=e,this.dataTextureManager.setTextureSize(e),this.simulationRendererService.setTextureSize(e),this.instancedMeshManager.resize(e);const t=this.assetService.getMesh(this.engineState.originMeshID);if(!t)return void this.eventEmitter.emit("invalidRequest",{message:`Mesh with id "${this.engineState.originMeshID}" does not exist`});const i=this.assetService.getMesh(this.engineState.destinationMeshID);i?(this.dataTextureManager.getDataTexture(t).then((t=>this.simulationRendererService.setOriginDataTexture({dataTexture:t,textureSize:e}))),this.dataTextureManager.getDataTexture(i).then((t=>this.simulationRendererService.setDestinationDataTexture({dataTexture:t,textureSize:e}))),this.simulationRendererService.setDataTextureTransitionProgress(this.engineState.dataTextureTransitionProgress),this.simulationRendererService.setVelocityTractionForce(this.engineState.velocityTractionForce),this.simulationRendererService.setPositionalTractionForce(this.engineState.positionalTractionForce),this.instancedMeshManager.setOriginMatcap(this.assetService.getMatcap(this.engineState.originMatcapID)),this.instancedMeshManager.setDestinationMatcap(this.assetService.getMatcap(this.engineState.destinationMatcapID)),this.instancedMeshManager.setProgress(this.engineState.matcapTransitionProgress),this.instancedMeshManager.setGeometrySize(this.engineState.instanceGeometryScale)):this.eventEmitter.emit("invalidRequest",{message:`Mesh with id "${this.engineState.destinationMeshID}" does not exist`})}registerMesh(e,t){this.assetService.register(e,t)}registerMatcap(e,t){this.assetService.register(e,t)}async fetchAndRegisterMesh(e,t){return await this.assetService.loadMeshAsync(e,t)}async fetchAndRegisterMatcap(e,t){return await this.assetService.loadTextureAsync(e,t)}setPointerPosition(e){this.engineState.pointerPosition=e,this.intersectionService.setMousePosition(e)}setGeometrySize(e){this.engineState.instanceGeometryScale=e,this.instancedMeshManager.setGeometrySize(e)}setVelocityTractionForce(e){this.engineState.velocityTractionForce=e,this.simulationRendererService.setVelocityTractionForce(e)}setPositionalTractionForce(e){this.engineState.positionalTractionForce=e,this.simulationRendererService.setPositionalTractionForce(e)}setMaxRepelDistance(e){this.engineState.maxRepelDistance=e,this.simulationRendererService.setMaxRepelDistance(e)}scheduleMeshTransition(e,t,i=o,s=1e3,r=!1){this.transitionService.enqueue("data-texture",{easing:i,duration:s},{onTransitionBegin:()=>{this.setOriginDataTexture(e,r),this.setDestinationDataTexture(t,r),this.setDataTextureTransitionProgress(0)}})}scheduleMatcapTransition(e,t,i=o,s=1e3,r=!1){this.transitionService.enqueue("matcap",{easing:i,duration:s},{onTransitionBegin:()=>{this.setOriginMatcap(e,r),this.setDestinationMatcap(t,r),this.setMatcapProgress(0)}})}handleServiceStateUpdated({type:e,state:t}){this.serviceStates[e]=t}getObject(){return this.instancedMeshManager.getMesh()}getMeshIDs(){return this.assetService.getMeshIDs()}getMatcapIDs(){return this.assetService.getTextureIDs()}dispose(){this.scene.remove(this.instancedMeshManager.getMesh()),this.simulationRendererService.dispose(),this.instancedMeshManager.dispose(),this.intersectionService.dispose(),this.assetService.dispose(),this.dataTextureManager.dispose()}initialEngineState(e){return{textureSize:e,originMeshID:"",destinationMeshID:"",dataTextureTransitionProgress:0,originMatcapID:"",destinationMatcapID:"",matcapTransitionProgress:0,velocityTractionForce:.1,positionalTractionForce:.1,maxRepelDistance:.3,pointerPosition:{x:0,y:0},instanceGeometryScale:{x:1,y:1,z:1}}}initialServiceStates(){return{"data-texture":"created","instanced-mesh":"created",matcap:"created",simulation:"created",asset:"created"}}handleTransitionProgress({type:e,progress:t}){switch(e){case"data-texture":this.setDataTextureTransitionProgress(t);break;case"matcap":this.setMatcapProgress(t)}}handleInteractionPositionUpdated({position:e}){this.simulationRendererService.setInteractionPosition(e)}},Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),e}({},THREE,three-stdlib);
|
|
7
2
|
//# sourceMappingURL=ionian.iife.js.map
|