@polarfront-lab/ionian 1.0.6 → 1.1.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/index.d.ts +15 -19
- package/dist/ionian.iife.js +2 -2
- package/dist/ionian.iife.js.map +1 -1
- package/dist/ionian.js +220 -143
- package/dist/ionian.js.map +1 -1
- package/package.json +12 -33
- package/dist/ionian.umd.cjs +0 -7
- package/dist/ionian.umd.cjs.map +0 -1
package/package.json
CHANGED
|
@@ -1,35 +1,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@polarfront-lab/ionian",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "ThreeJS Collection Set",
|
|
5
|
-
"main": "
|
|
6
|
-
"
|
|
7
|
-
"types": "./dist/index.d.ts",
|
|
5
|
+
"main": "dist/ionian.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
8
7
|
"files": [
|
|
9
8
|
"dist"
|
|
10
9
|
],
|
|
11
|
-
"exports": {
|
|
12
|
-
".": {
|
|
13
|
-
"import": {
|
|
14
|
-
"types": "./dist/index.d.ts",
|
|
15
|
-
"default": "./dist/ionian.js"
|
|
16
|
-
},
|
|
17
|
-
"require": {
|
|
18
|
-
"types": "./dist/index.d.ts",
|
|
19
|
-
"default": "./dist/ionian.umd.cjs"
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
},
|
|
23
10
|
"type": "module",
|
|
24
11
|
"scripts": {
|
|
25
12
|
"dev": "tsc && vite --watch",
|
|
26
13
|
"start": "vite --host --open",
|
|
27
14
|
"build": "tsc && vite build",
|
|
28
15
|
"build:types": "dts-bundle-generator --config ./dts-bundle-generator.config.ts",
|
|
29
|
-
"test": "jest",
|
|
30
16
|
"prepare": "husky",
|
|
31
17
|
"lint:scripts": "eslint ./src --ext .ts",
|
|
32
|
-
"fmt": "prettier --write --list-different
|
|
18
|
+
"fmt": "prettier --write --list-different ./src/**/*.{ts,tsx}"
|
|
33
19
|
},
|
|
34
20
|
"release": "semantic-release",
|
|
35
21
|
"publishConfig": {
|
|
@@ -56,7 +42,7 @@
|
|
|
56
42
|
"generic-pool": "^3.9.0",
|
|
57
43
|
"mitt": "^3.0.1",
|
|
58
44
|
"three": "^0.173.0",
|
|
59
|
-
"three-stdlib": "^2.35.
|
|
45
|
+
"three-stdlib": "^2.35.14"
|
|
60
46
|
},
|
|
61
47
|
"devDependencies": {
|
|
62
48
|
"@commitlint/cli": "^19.7.1",
|
|
@@ -69,29 +55,22 @@
|
|
|
69
55
|
"@semantic-release/git": "^10.0.1",
|
|
70
56
|
"@semantic-release/github": "^11.0.1",
|
|
71
57
|
"@semantic-release/release-notes-generator": "^14.0.3",
|
|
72
|
-
"@types/
|
|
73
|
-
"@types/
|
|
58
|
+
"@types/node": "^22.13.5",
|
|
59
|
+
"@types/stats.js": "^0.17.3",
|
|
74
60
|
"@types/three": "^0.173.0",
|
|
61
|
+
"@typescript-eslint/eslint-plugin": "^8.24.1",
|
|
75
62
|
"dts-bundle-generator": "^9.5.1",
|
|
76
|
-
"eslint": "^9.
|
|
63
|
+
"eslint": "^9.21.0",
|
|
77
64
|
"eslint-config-prettier": "^10.0.1",
|
|
78
65
|
"eslint-plugin-prettier": "^5.2.3",
|
|
79
66
|
"husky": "^9.1.7",
|
|
80
|
-
"
|
|
67
|
+
"lil-gui": "^0.20.0",
|
|
68
|
+
"stats.js": "^0.17.0",
|
|
81
69
|
"terser": "^5.39.0",
|
|
82
|
-
"ts-jest": "^29.2.5",
|
|
83
70
|
"ts-node": "^10.9.2",
|
|
84
71
|
"typescript": "^5.7.3",
|
|
85
|
-
"vite": "^6.1.
|
|
72
|
+
"vite": "^6.1.1",
|
|
86
73
|
"vite-plugin-dts": "^4.5.0",
|
|
87
74
|
"vite-plugin-node-polyfills": "^0.23.0"
|
|
88
|
-
},
|
|
89
|
-
"pnpm": {
|
|
90
|
-
"ignoredBuiltDependencies": [
|
|
91
|
-
"esbuild"
|
|
92
|
-
],
|
|
93
|
-
"onlyBuiltDependencies": [
|
|
94
|
-
"esbuild"
|
|
95
|
-
]
|
|
96
75
|
}
|
|
97
76
|
}
|
package/dist/ionian.umd.cjs
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("three")):"function"==typeof define&&define.amd?define(["exports","three"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).ionian={},e.THREE)}(this,(function(e,t){"use strict";var i=Object.defineProperty,s=(e,t,s)=>((e,t,s)=>t in e?i(e,t,{enumerable:!0,configurable:!0,writable:!0,value:s}):e[t]=s)(e,"symbol"!=typeof t?t+"":t,s),n="undefined"!=typeof document?document.currentScript:null;function r(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 o=r(t),a=e=>e;class c{constructor(){var e;s(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 u=Symbol("Comlink.proxy"),h=Symbol("Comlink.endpoint"),l=Symbol("Comlink.releaseProxy"),d=Symbol("Comlink.finalizer"),m=Symbol("Comlink.thrown"),p=e=>"object"==typeof e&&null!==e||"function"==typeof e,g=new Map([["proxy",{canHandle:e=>p(e)&&e[u],serialize(e){const{port1:t,port2:i}=new MessageChannel;return v(e,t),[i,[i]]},deserialize:e=>(e.start(),y(e))}],["throw",{canHandle:e=>p(e)&&m 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 v(e,t=globalThis,i=["*"]){t.addEventListener("message",(function s(n){if(!n||!n.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,n.origin))return void console.warn(`Invalid origin '${n.origin}' for comlink proxy`);const{id:r,type:o,path:a}=Object.assign({path:[]},n.data),c=(n.data.argumentList||[]).map(P);let h;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":h=i;break;case"SET":t[a.slice(-1)[0]]=P(n.data.value),h=!0;break;case"APPLY":h=i.apply(t,c);break;case"CONSTRUCT":h=function(e){return Object.assign(e,{[u]:!0})}(new i(...c));break;case"ENDPOINT":{const{port1:t,port2:i}=new MessageChannel;v(e,i),h=function(e,t){return S.set(e,t),e}(t,[t])}break;case"RELEASE":h=void 0;break;default:return}}catch(l){h={value:l,[m]:0}}Promise.resolve(h).catch((e=>({value:e,[m]:0}))).then((i=>{const[n,a]=R(i);t.postMessage(Object.assign(Object.assign({},n),{id:r}),a),"RELEASE"===o&&(t.removeEventListener("message",s),f(t),d in e&&"function"==typeof e[d]&&e[d]())})).catch((e=>{const[i,s]=R({value:new TypeError("Unserializable return value"),[m]:0});t.postMessage(Object.assign(Object.assign({},i),{id:r}),s)}))})),t.start&&t.start()}function f(e){(function(e){return"MessagePort"===e.constructor.name})(e)&&e.close()}function y(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)}})),M(e,i,[],t)}function x(e){if(e)throw new Error("Proxy has been released and is not useable")}function T(e){return D(e,new Map,{type:"RELEASE"}).then((()=>{f(e)}))}const _=new WeakMap,w="FinalizationRegistry"in globalThis&&new FinalizationRegistry((e=>{const t=(_.get(e)||0)-1;_.set(e,t),0===t&&T(e)}));function M(e,t,i=[],s=function(){}){let n=!1;const r=new Proxy(s,{get(s,o){if(x(n),o===l)return()=>{!function(e){w&&w.unregister(e)}(r),T(e),t.clear(),n=!0};if("then"===o){if(0===i.length)return{then:()=>r};const s=D(e,t,{type:"GET",path:i.map((e=>e.toString()))}).then(P);return s.then.bind(s)}return M(e,t,[...i,o])},set(s,r,o){x(n);const[a,c]=R(o);return D(e,t,{type:"SET",path:[...i,r].map((e=>e.toString())),value:a},c).then(P)},apply(s,r,o){x(n);const a=i[i.length-1];if(a===h)return D(e,t,{type:"ENDPOINT"}).then(P);if("bind"===a)return M(e,t,i.slice(0,-1));const[c,u]=b(o);return D(e,t,{type:"APPLY",path:i.map((e=>e.toString())),argumentList:c},u).then(P)},construct(s,r){x(n);const[o,a]=b(r);return D(e,t,{type:"CONSTRUCT",path:i.map((e=>e.toString())),argumentList:o},a).then(P)}});return function(e,t){const i=(_.get(t)||0)+1;_.set(t,i),w&&w.register(e,t,e)}(r,e),r}function b(e){const t=e.map(R);return[t.map((e=>e[0])),(i=t.map((e=>e[1])),Array.prototype.concat.apply([],i))];var i}const S=new WeakMap;function R(e){for(const[t,i]of g)if(i.canHandle(e)){const[s,n]=i.serialize(e);return[{type:"HANDLER",name:t,value:s},n]}return[{type:"RAW",value:e},S.get(e)||[]]}function P(e){switch(e.type){case"HANDLER":return g.get(e.name).deserialize(e.value);case"RAW":return e.value}}function D(e,t,i,s){return new Promise((n=>{const r=new Array(4).fill(0).map((()=>Math.floor(Math.random()*Number.MAX_SAFE_INTEGER).toString(16))).join("-");t.set(r,n),e.start&&e.start(),e.postMessage(Object.assign({id:r},i),s)}))}function E(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var I,C,V,G,z,O,A,F,L,N,j,B,U,k,K,X,W,Z,Y,q,Q,J,H,$,ee,te,ie,se,ne,re,oe,ae,ce,ue={exports:{}};function he(){if(I)return ue.exports;I=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 n(){n.init.call(this)}ue.exports=n,ue.exports.once=function(e,t){return new Promise((function(i,s){function n(i){e.removeListener(t,r),s(i)}function r(){"function"==typeof e.removeListener&&e.removeListener("error",n),i([].slice.call(arguments))}p(e,t,r,{once:!0}),"error"!==t&&function(e,t,i){"function"==typeof e.on&&p(e,"error",t,i)}(e,n,{once:!0})}))},n.EventEmitter=n,n.prototype._events=void 0,n.prototype._eventsCount=0,n.prototype._maxListeners=void 0;var r=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?n.defaultMaxListeners:e._maxListeners}function c(e,t,i,s){var n,r,c,u;if(o(i),void 0===(r=e._events)?(r=e._events=Object.create(null),e._eventsCount=0):(void 0!==r.newListener&&(e.emit("newListener",t,i.listener?i.listener:i),r=e._events),c=r[t]),void 0===c)c=r[t]=i,++e._eventsCount;else if("function"==typeof c?c=r[t]=s?[i,c]:[c,i]:s?c.unshift(i):c.push(i),(n=a(e))>0&&c.length>n&&!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},n=u.bind(s);return n.listener=i,s.wrapFn=n,n}function l(e,t,i){var s=e._events;if(void 0===s)return[];var n=s[t];return void 0===n?[]:"function"==typeof n?i?[n.listener||n]:[n]: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}(n):m(n,n.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 n(r){s.once&&e.removeEventListener(t,n),i(r)}))}}return Object.defineProperty(n,"defaultMaxListeners",{enumerable:!0,get:function(){return r},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+".");r=e}}),n.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},n.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},n.prototype.getMaxListeners=function(){return a(this)},n.prototype.emit=function(e){for(var t=[],s=1;s<arguments.length;s++)t.push(arguments[s]);var n="error"===e,r=this._events;if(void 0!==r)n=n&&void 0===r.error;else if(!n)return!1;if(n){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=r[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},n.prototype.addListener=function(e,t){return c(this,e,t,!1)},n.prototype.on=n.prototype.addListener,n.prototype.prependListener=function(e,t){return c(this,e,t,!0)},n.prototype.once=function(e,t){return o(t),this.on(e,h(this,e,t)),this},n.prototype.prependOnceListener=function(e,t){return o(t),this.prependListener(e,h(this,e,t)),this},n.prototype.removeListener=function(e,t){var i,s,n,r,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(n=-1,r=i.length-1;r>=0;r--)if(i[r]===t||i[r].listener===t){a=i[r].listener,n=r;break}if(n<0)return this;0===n?i.shift():function(e,t){for(;t+1<e.length;t++)e[t]=e[t+1];e.pop()}(i,n),1===i.length&&(s[e]=i[0]),void 0!==s.removeListener&&this.emit("removeListener",e,a||t)}return this},n.prototype.off=n.prototype.removeListener,n.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 n,r=Object.keys(i);for(s=0;s<r.length;++s)"removeListener"!==(n=r[s])&&this.removeAllListeners(n);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},n.prototype.listeners=function(e){return l(this,e,!0)},n.prototype.rawListeners=function(e){return l(this,e,!1)},n.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):d.call(e,t)},n.prototype.listenerCount=d,n.prototype.eventNames=function(){return this._eventsCount>0?e(this._events):[]},ue.exports}function le(){if(A)return O;A=1;const e=z?G:(z=1,G=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 O=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 de(){if(L)return F;L=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",F=e}function me(){if(U)return B;U=1;const e=de(),t=function(){if(j)return N;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 N={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 n,r;this._timeout&&this.removeTimeout(),this._timeout=setTimeout((n=this._fireTimeout,r=this,function(){return n.apply(r,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 B=i}function pe(){if(Y)return Z;Y=1;const e=W?X:(W=1,X={ALLOCATED:"ALLOCATED",IDLE:"IDLE",INVALID:"INVALID",RETURNING:"RETURNING",VALIDATION:"VALIDATION"});return Z=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 ge(){if(Q)return q;Q=1;return q=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 ve(){if(H)return J;H=1;return J=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 fe(){if(ie)return te;ie=1;const e=ee?$:(ee=1,$=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 te=class extends e{next(){const e=super.next();return e.value&&(e.value=e.value.data),e}}}function ye(){if(ne)return se;ne=1;const e=ve(),t=fe();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 se=i}function xe(){if(ce)return ae;ce=1;const e=function(){if(oe)return re;oe=1;const e=ve(),t=ye();return re=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 ae=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 Te,_e,we,Me,be,Se={};function Re(){if(we)return _e;we=1;const e=he().EventEmitter,t=V?C:(V=1,C=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=le(),s=me(),n=function(){if(K)return k;K=1;const e=de();return k=class extends e{constructor(e,t){super(t),this._creationTimestamp=Date.now(),this.pooledResource=e}reject(){}}}(),r=pe();ge(),ye();const o=de();xe(),fe();const a=function(){if(Te)return Se;function e(){}return Te=1,Se.reflector=function(t){return t.then(e,e)},Se}().reflector;return _e=class extends e{constructor(e,s,n,r,o){super(),t(r),this._config=new i(o),this._Promise=this._config.Promise,this._factory=r,this._draining=!1,this._started=!1,this._waitingClientsQueue=new n(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 n(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 r(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 Pe={create:async()=>{const e=new URL("data:video/mp2t;base64,aW1wb3J0IHsgTWVzaERhdGEgfSBmcm9tICdAL3R5cGVzJzsKaW1wb3J0ICogYXMgQ29tbGluayBmcm9tICdjb21saW5rJzsKaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnOwppbXBvcnQgeyBNZXNoU3VyZmFjZVNhbXBsZXIgfSBmcm9tICd0aHJlZS9leGFtcGxlcy9qc20vbWF0aC9NZXNoU3VyZmFjZVNhbXBsZXIuanMnOwoKZXhwb3J0IGludGVyZmFjZSBNZXNoU2FtcGxlckFQSSB7CiAgc2FtcGxlTWVzaDogKG1lc2hEYXRhOiBNZXNoRGF0YSwgc2l6ZTogbnVtYmVyKSA9PiBQcm9taXNlPEZsb2F0MzJBcnJheT47Cn0KCmNvbnN0IGFwaSA9IHsKICBzYW1wbGVNZXNoOiAobWVzaERhdGE6IE1lc2hEYXRhLCBzaXplOiBudW1iZXIpOiBGbG9hdDMyQXJyYXkgPT4gewogICAgY29uc3QgZ2VvbWV0cnkgPSBuZXcgVEhSRUUuQnVmZmVyR2VvbWV0cnkoKTsKICAgIGdlb21ldHJ5LnNldEF0dHJpYnV0ZSgncG9zaXRpb24nLCBuZXcgVEhSRUUuQnVmZmVyQXR0cmlidXRlKG5ldyBGbG9hdDMyQXJyYXkobWVzaERhdGEucG9zaXRpb24pLCAzKSk7CiAgICBpZiAobWVzaERhdGEubm9ybWFsKSB7CiAgICAgIGdlb21ldHJ5LnNldEF0dHJpYnV0ZSgnbm9ybWFsJywgbmV3IFRIUkVFLkJ1ZmZlckF0dHJpYnV0ZShuZXcgRmxvYXQzMkFycmF5KG1lc2hEYXRhLm5vcm1hbCksIDMpKTsKICAgIH0KICAgIGNvbnN0IG1hdGVyaWFsID0gbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKCk7CiAgICBjb25zdCBtZXNoID0gbmV3IFRIUkVFLk1lc2goZ2VvbWV0cnksIG1hdGVyaWFsKTsKICAgIG1lc2guc2NhbGUuc2V0KG1lc2hEYXRhLnNjYWxlLngsIG1lc2hEYXRhLnNjYWxlLnksIG1lc2hEYXRhLnNjYWxlLnopOwoKICAgIGNvbnN0IHNhbXBsZXIgPSBuZXcgTWVzaFN1cmZhY2VTYW1wbGVyKG1lc2gpLmJ1aWxkKCk7CiAgICBjb25zdCBkYXRhID0gbmV3IEZsb2F0MzJBcnJheShzaXplICogc2l6ZSAqIDQpOwogICAgY29uc3QgcG9zaXRpb24gPSBuZXcgVEhSRUUuVmVjdG9yMygpOwoKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc2l6ZTsgaisrKSB7CiAgICAgICAgY29uc3QgaW5kZXggPSBpICogc2l6ZSArIGo7CiAgICAgICAgc2FtcGxlci5zYW1wbGUocG9zaXRpb24pOwogICAgICAgIGRhdGFbNCAqIGluZGV4XSA9IHBvc2l0aW9uLnggKiBtZXNoRGF0YS5zY2FsZS54OwogICAgICAgIGRhdGFbNCAqIGluZGV4ICsgMV0gPSBwb3NpdGlvbi55ICogbWVzaERhdGEuc2NhbGUueTsKICAgICAgICBkYXRhWzQgKiBpbmRleCArIDJdID0gcG9zaXRpb24ueiAqIG1lc2hEYXRhLnNjYWxlLno7CiAgICAgICAgZGF0YVs0ICogaW5kZXggKyAzXSA9IChNYXRoLnJhbmRvbSgpIC0gMC41KSAqIDAuMDE7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gZGF0YTsKICB9LAp9OwoKQ29tbGluay5leHBvc2UoYXBpKTsK","undefined"==typeof document&&"undefined"==typeof location?require("url").pathToFileURL(__filename).href:"undefined"==typeof document?location.href:n&&"SCRIPT"===n.tagName.toUpperCase()&&n.src||new URL("ionian.umd.cjs",document.baseURI).href);return y(new Worker(e,{type:"module"}))},destroy:async e=>e[l]()},De=E(function(){if(be)return Me;be=1;const e=Re(),t=ye(),i=xe(),s=ge();return Me={Pool:e,Deque:t,PriorityQueue:i,DefaultEvictor:s,createPool:function(n,r){return new e(s,t,i,n,r)}}}()).createPool(Pe,{max:navigator.hardwareConcurrency||4,min:2});function Ee(e,t){const i=new o.DataTexture(e,t,t,o.RGBAFormat,o.FloatType);return i.needsUpdate=!0,i}function Ie(e,t,i){return e=Math.min(e,i),e=Math.max(e,t)}class Ce{constructor(e,t,i){s(this,"textureSize"),s(this,"meshes"),s(this,"dataTextures"),s(this,"eventEmitter"),this.eventEmitter=e,this.textureSize=t,this.meshes=function(e){const t=new Map;return e&&(Array.isArray(e)?e.forEach((({id:e,item:i})=>t.set(e,i))):t.set(e.id,e.item)),t}(i),this.dataTextures=new Map,this.updateServiceState("ready")}async register(e,t){this.meshes.set(e,t)}setTextureSize(e){this.textureSize!==e&&(this.textureSize=e,this.dataTextures.forEach((e=>e.dispose())),this.dataTextures.clear())}getMesh(e){return this.meshes.get(e)}async getDataTexture(e){return await this.prepareMesh(e)}async prepareMesh(e){if(!this.meshes.has(e))throw new Error(`Mesh with id "${e}" does not exist.`);const t=this.dataTextures.get(e);if(t)return t;const i=function(e){var t;return{position:e.geometry.attributes.position.array,normal:null==(t=e.geometry.attributes.normal)?void 0:t.array,scale:{x:e.scale.x,y:e.scale.y,z:e.scale.z}}}(this.meshes.get(e)),s=await De.acquire();try{const t=Ee(await s.sampleMesh(i,this.textureSize),this.textureSize);return t.name=e,t}finally{await De.release(s)}}async dispose(){this.meshes.clear(),this.dataTextures.clear(),this.updateServiceState("disposed")}updateServiceState(e){this.eventEmitter.emit("serviceStateUpdated",{type:"data-texture",state:e})}}class Ve{constructor(e){s(this,"size"),s(this,"mesh"),s(this,"matcapMaterial"),s(this,"fallbackMaterial"),s(this,"fallbackGeometry"),s(this,"materials"),s(this,"geometries"),s(this,"uvRefsCache"),s(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 o.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 o.MeshBasicMaterial({color:16777215}),this.fallbackGeometry=new o.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 o.ShaderMaterial||t instanceof o.RawShaderMaterial)&&(t.uniforms.uTime.value=e)}setOriginMatcap(e){console.log("set source matcap",e),this.matcapMaterial.uniforms.uSourceMatcap.value=e}setDestinationMatcap(e){console.log("set target matcap",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(){console.log("Using matcap material"),this.mesh.material=this.matcapMaterial}useMaterial(e){const t=this.materials.get(e);t?this.mesh.material=t:console.warn(`material with id "${e}" not found`)}useGeometry(e){const t=this.geometries.get(e);t?this.mesh.geometry=t:console.warn(`geometry with id "${e}" not found`)}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){if(i===t)return;console.log(`geometry with id "${e}" already exists. replacing...`)}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);if(i){if(i===t)return;console.log(`material with id "${e}" already exists. replacing...`)}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 n=0;n<e;n++)for(let t=0;t<e;t++){const s=n*e+t;i[2*s]=t/(e-1),i[2*s+1]=n/(e-1)}const s=new o.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 o.InstancedMesh(t,i,s)}}class Ge{constructor(e,t,i,n){s(this,"raycaster",new o.Raycaster),s(this,"mousePosition",new o.Vector2),s(this,"mouseEntered",!1),s(this,"mousePositionChanged",!1),s(this,"camera"),s(this,"originGeometry"),s(this,"destinationGeometry"),s(this,"progress",0),s(this,"intersectionMesh",new o.Mesh),s(this,"geometryNeedsUpdate"),s(this,"eventEmitter"),s(this,"blendedGeometry"),s(this,"intersection"),s(this,"lastKnownOriginMeshID"),s(this,"lastKnownDestinationMeshID"),this.camera=t,this.originGeometry=i,this.eventEmitter=e,this.destinationGeometry=n,this.geometryNeedsUpdate=!0}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.equals(e)||(this.mousePosition.copy(e),this.mousePositionChanged=!0),this.mouseEntered=!0):(this.mouseEntered=!1,this.mousePositionChanged=!1)}calculate(){if(this.camera&&this.mouseEntered)return this.geometryNeedsUpdate&&(this.geometryNeedsUpdate=!1,this.blendedGeometry=this.getBlendedGeometry(),this.mousePositionChanged=!0),this.mousePositionChanged&&(this.mousePositionChanged=!1,this.blendedGeometry?this.intersection=this.getFirstIntersection(this.blendedGeometry,this.camera):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()}getFirstIntersection(e,t){this.raycaster.setFromCamera(this.mousePosition,t),this.intersectionMesh.geometry=e;const i=this.raycaster.intersectObject(this.intersectionMesh,!1)[0];if(i)return new o.Vector4(i.point.x,i.point.y,i.point.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 o.BufferGeometry,n=e.attributes.position.array,r=t.attributes.position.array,a=new Float32Array(n.length);for(let c=0;c<n.length;c+=3){const e=new o.Vector3(n[c],n[c+1],n[c+2]),t=new o.Vector3(r[c],r[c+1],r[c+2]),s=(new o.Vector3).lerpVectors(e,t,i);a[c]=s.x,a[c+1]=s.y,a[c+2]=s.z}return s.setAttribute("position",new o.BufferAttribute(a,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}}class ze{constructor(e,t){s(this,"matcaps",new Map),s(this,"eventEmitter"),s(this,"fallbackMatcap",new o.DataTexture(new Uint8Array([127,127,127,255]),1,1,o.RGBAFormat)),this.eventEmitter=e,t&&t.forEach((({id:e,item:t})=>this.setMatcap(e,t))),this.updateServiceState("ready")}getMatcap(e){const t=this.matcaps.get(e);return t||(this.eventEmitter.emit("invalidRequest",{message:`invalid matcap request: ${e}`}),this.fallbackMatcap)}setMatcap(e,t){const i=this.matcaps.get(e);i!==t&&(this.matcaps.set(e,t),i?(this.eventEmitter.emit("matcapReplaced",{id:e}),i.dispose()):this.eventEmitter.emit("matcapRegistered",{id:e}))}dispose(){this.updateServiceState("disposed"),this.matcaps.forEach((e=>e.dispose())),this.matcaps.clear()}updateServiceState(e){this.eventEmitter.emit("serviceStateUpdated",{type:"matcap",state:e})}}const Oe=new t.OrthographicCamera(-1,1,1,-1,0,1);class Ae 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 Fe=new Ae;class Le{constructor(e){this._mesh=new t.Mesh(Fe,e)}dispose(){this._mesh.geometry.dispose()}render(e){e.render(this._mesh,Oe)}get material(){return this._mesh.material}set material(e){this._mesh.material=e}}class Ne{constructor(e,i,s){this.variables=[],this.currentTextureIndex=0;let n=t.FloatType;const r={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",r),a=new Le(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 n=e,this},this.addVariable=function(e,i,s){const n={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(n),n},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 n=s.material,r=n.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}r[t.name]={value:null},n.fragmentShader="\nuniform sampler2D "+t.name+";\n"+n.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,n=s.dependencies.length;i<n;i++){const n=s.dependencies[i];t[n.name].value=n.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,r,o,a,c,u){s=s||e,r=r||i,o=o||t.ClampToEdgeWrapping,a=a||t.ClampToEdgeWrapping,c=c||t.NearestFilter,u=u||t.NearestFilter;return new t.WebGLRenderTarget(s,r,{wrapS:o,wrapT:a,minFilter:c,magFilter:u,format:t.RGBAFormat,type:n,depthBuffer:!1})},this.createTexture=function(){const s=new Float32Array(e*i*4),n=new t.DataTexture(s,e,i,t.RGBAFormat,t.FloatType);return n.needsUpdate=!0,n},this.renderTexture=function(e,t){r.passThruTexture.value=e,this.doRenderTarget(o,t),r.passThruTexture.value=null},this.doRenderTarget=function(e,t){const i=s.getRenderTarget(),n=s.xr.enabled,r=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=n,s.shadowMap.autoUpdate=r,s.setRenderTarget(i)}}}class je{constructor(e,t,i){s(this,"gpuComputationRenderer"),s(this,"webGLRenderer"),s(this,"positionDataTexture"),s(this,"velocityDataTexture"),s(this,"mixPositionsVar"),s(this,"velocityVar"),s(this,"positionVar"),s(this,"interactionPosition"),s(this,"lastKnownPositionDataTexture"),s(this,"lastKnownVelocityDataTexture"),s(this,"lastKnownMixProgress"),s(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 n=i*e+s;let r=Math.random()*Math.PI*2,o=Math.acos(2*Math.random()-1),a=Math.sin(o)*Math.cos(r),c=Math.sin(o)*Math.sin(r),u=Math.cos(o);t[4*n]=a,t[4*n+1]=c,t[4*n+2]=u,t[4*n+3]=.01*(Math.random()-.5)}return Ee(t,e)}(e),this.positionDataTexture=this.initialDataTexture,this.webGLRenderer=t,this.gpuComputationRenderer=new Ne(e,e,this.webGLRenderer),this.lastKnownMixProgress=0,t.capabilities.isWebGL2||this.gpuComputationRenderer.setDataType(o.HalfFloatType),this.velocityDataTexture=function(e){return Ee(new Float32Array(4*e*e),e)}(e),this.interactionPosition=new o.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 n=this.gpuComputationRenderer.init();if(n)throw new Error("failed to initialize SimulationRenderer: "+n);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=Ie(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 Be{constructor(e,t,i){s(this,"state"),s(this,"textureSize"),s(this,"dataTextureTransitionProgress"),s(this,"velocityTractionForce"),s(this,"positionalTractionForce"),s(this,"simulationRenderer"),s(this,"webGLRenderer"),s(this,"eventEmitter"),s(this,"lastKnownVelocityDataTexture"),s(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(){s(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){s(this,"eventEmitter"),s(this,"transitions",new Map),s(this,"execStatus"),s(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 n=t.shift();n&&(this.ongoingTransitions.set(i,{...n,startTime:e}),null==(s=n.onTransitionBegin)||s.call(n))}})),this.ongoingTransitions.forEach(((t,i)=>{var s,n,r;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=Ie(c(Math.min(1,u/a)),0,1);this.emitTransitionProgress(i,h),null==(n=t.onTransitionProgress)||n.call(t,h),h>=1&&(this.emitTransitionFinished(i),null==(r=t.onTransitionFinished)||r.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})}}e.ParticlesEngine=class{constructor(e){s(this,"simulationRendererService"),s(this,"eventEmitter"),s(this,"renderer"),s(this,"scene"),s(this,"serviceStates"),s(this,"dataTextureManager"),s(this,"matcapService"),s(this,"instancedMeshManager"),s(this,"transitionService"),s(this,"engineState"),s(this,"intersectionService"),this.eventEmitter=new c,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.transitionService=new ke(this.eventEmitter),this.dataTextureManager=new Ce(this.eventEmitter,e.textureSize,e.meshes),this.matcapService=new ze(this.eventEmitter,e.matcaps),this.simulationRendererService=new Be(this.eventEmitter,e.textureSize,this.renderer),this.instancedMeshManager=new Ve(e.textureSize),this.instancedMeshManager.useMatcapMaterial(),this.scene.add(this.instancedMeshManager.getMesh()),this.intersectionService=new Ge(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.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"}),this.dataTextureManager.getDataTexture(e).then((t=>{this.engineState.originMeshID=e,this.simulationRendererService.setOriginDataTexture({dataTexture:t,textureSize:this.engineState.textureSize}),this.intersectionService.setOriginGeometry(this.dataTextureManager.getMesh(e))}))}setDestinationDataTexture(e,t=!1){t&&this.eventEmitter.emit("transitionCancelled",{type:"data-texture"}),this.dataTextureManager.getDataTexture(e).then((t=>{this.engineState.destinationMeshID=e,this.simulationRendererService.setDestinationDataTexture({dataTexture:t,textureSize:this.engineState.textureSize}),this.intersectionService.setDestinationGeometry(this.dataTextureManager.getMesh(e))}))}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.matcapService.getMatcap(e))}setDestinationMatcap(e,t=!1){t&&this.eventEmitter.emit("transitionCancelled",{type:"matcap"}),this.engineState.destinationMatcapID=e,this.instancedMeshManager.setDestinationMatcap(this.matcapService.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),this.dataTextureManager.getDataTexture(this.engineState.originMeshID).then((t=>this.simulationRendererService.setOriginDataTexture({dataTexture:t,textureSize:e}))),this.dataTextureManager.getDataTexture(this.engineState.destinationMeshID).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.matcapService.getMatcap(this.engineState.originMatcapID)),this.instancedMeshManager.setDestinationMatcap(this.matcapService.getMatcap(this.engineState.destinationMatcapID)),this.instancedMeshManager.setProgress(this.engineState.matcapTransitionProgress),this.instancedMeshManager.setGeometrySize(this.engineState.instanceGeometryScale)}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=a,s=1e3,n=!1){this.transitionService.enqueue("data-texture",{easing:i,duration:s},{onTransitionBegin:()=>{this.setOriginDataTexture(e,n),this.setDestinationDataTexture(t,n),this.setDataTextureTransitionProgress(0)}})}scheduleMatcapTransition(e,t,i=a,s=1e3,n=!1){this.transitionService.enqueue("matcap",{easing:i,duration:s},{onTransitionBegin:()=>{this.setOriginMatcap(e,n),this.setDestinationMatcap(t,n),this.setMatcapProgress(0)}})}handleServiceStateUpdated({type:e,state:t}){console.log("service state updated",e,t),this.serviceStates[e]=t}dispose(){this.scene.remove(this.instancedMeshManager.getMesh()),this.matcapService.dispose(),this.simulationRendererService.dispose(),this.instancedMeshManager.dispose(),this.intersectionService.dispose(),this.dataTextureManager.dispose().then((()=>console.log("engine disposed")))}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"}}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"})}));
|
|
7
|
-
//# sourceMappingURL=ionian.umd.cjs.map
|