babylon.quarks 0.24.0 → 0.25.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.
@@ -1,2 +1,2 @@
1
- "use strict";var t=require("@babylonjs/core/Buffers/buffer"),e=require("@babylonjs/core/Maths/math.frustum"),i=require("@babylonjs/core/Maths/math.plane"),s=require("@babylonjs/core/Meshes/transformNode"),r=require("@babylonjs/core/Engines/constants"),n=require("@babylonjs/core/Materials/shaderMaterial"),o=require("@babylonjs/core/Materials/Textures/rawTexture"),a=require("@babylonjs/core/Maths/math.vector"),h=require("@babylonjs/core/Meshes/mesh"),l=require("@babylonjs/core/Meshes/mesh.vertexData"),c=require("@babylonjs/core/Engines/shaderStore"),u=require("@babylonjs/core/Materials/effect"),d=require("@babylonjs/core/Materials/shaderLanguage"),p=require("@babylonjs/core/Culling/boundingInfo"),f=require("@babylonjs/core/Maths/math.color"),m=require("@babylonjs/core/scene"),y=require("@babylonjs/core/Materials/Textures/texture"),v=require("@babylonjs/core/Materials/PBR/pbrMaterial"),g=require("@babylonjs/core/Materials/standardMaterial");let x=null;function S(){return null===x?Math.random():x()}function w(){return x??Math.random}function b(t){const e=w();return x=t,e}function z(t){let e=t>>>0||2654435769;return()=>{e=e+1831565813|0;let t=e;return t=Math.imul(t^t>>>15,1|t),t^=t+Math.imul(t^t>>>7,61|t),((t^t>>>14)>>>0)/4294967296}}const M=["00","01","02","03","04","05","06","07","08","09","0a","0b","0c","0d","0e","0f","10","11","12","13","14","15","16","17","18","19","1a","1b","1c","1d","1e","1f","20","21","22","23","24","25","26","27","28","29","2a","2b","2c","2d","2e","2f","30","31","32","33","34","35","36","37","38","39","3a","3b","3c","3d","3e","3f","40","41","42","43","44","45","46","47","48","49","4a","4b","4c","4d","4e","4f","50","51","52","53","54","55","56","57","58","59","5a","5b","5c","5d","5e","5f","60","61","62","63","64","65","66","67","68","69","6a","6b","6c","6d","6e","6f","70","71","72","73","74","75","76","77","78","79","7a","7b","7c","7d","7e","7f","80","81","82","83","84","85","86","87","88","89","8a","8b","8c","8d","8e","8f","90","91","92","93","94","95","96","97","98","99","9a","9b","9c","9d","9e","9f","a0","a1","a2","a3","a4","a5","a6","a7","a8","a9","aa","ab","ac","ad","ae","af","b0","b1","b2","b3","b4","b5","b6","b7","b8","b9","ba","bb","bc","bd","be","bf","c0","c1","c2","c3","c4","c5","c6","c7","c8","c9","ca","cb","cc","cd","ce","cf","d0","d1","d2","d3","d4","d5","d6","d7","d8","d9","da","db","dc","dd","de","df","e0","e1","e2","e3","e4","e5","e6","e7","e8","e9","ea","eb","ec","ed","ee","ef","f0","f1","f2","f3","f4","f5","f6","f7","f8","f9","fa","fb","fc","fd","fe","ff"];let _=1234567;const P=Math.PI/180,T=180/Math.PI;function V(){const t=4294967295*Math.random()|0,e=4294967295*Math.random()|0,i=4294967295*Math.random()|0,s=4294967295*Math.random()|0;return(M[255&t]+M[t>>8&255]+M[t>>16&255]+M[t>>24&255]+"-"+M[255&e]+M[e>>8&255]+"-"+M[e>>16&15|64]+M[e>>24&255]+"-"+M[63&i|128]+M[i>>8&255]+"-"+M[i>>16&255]+M[i>>24&255]+M[255&s]+M[s>>8&255]+M[s>>16&255]+M[s>>24&255]).toLowerCase()}function O(t,e,i){return Math.max(e,Math.min(i,t))}function C(t,e){return(t%e+e)%e}function F(t,e,i,s,r){return s+(t-e)*(r-s)/(i-e)}function B(t,e,i){return t!==e?(i-t)/(e-t):0}function A(t,e,i){return(1-i)*t+i*e}function $(t,e,i,s){return A(t,e,1-Math.exp(-i*s))}function I(t,e=1){return e-Math.abs(C(t,2*e)-e)}function E(t,e,i){return t<=e?0:t>=i?1:(t=(t-e)/(i-e))*t*(3-2*t)}function N(t,e,i){return t<=e?0:t>=i?1:(t=(t-e)/(i-e))*t*t*(t*(6*t-15)+10)}function L(t,e){return t+Math.floor(S()*(e-t+1))}function R(t,e){return t+S()*(e-t)}function D(t){return t*(.5-S())}function U(t){void 0!==t&&(_=t);let e=_+=1831565813;return e=Math.imul(e^e>>>15,1|e),e^=e+Math.imul(e^e>>>7,61|e),((e^e>>>14)>>>0)/4294967296}function q(t){return t*P}function k(t){return t*T}function J(t){return!(t&t-1)&&0!==t}function Q(t){return Math.pow(2,Math.ceil(Math.log(t)/Math.LN2))}function G(t){return Math.pow(2,Math.floor(Math.log(t)/Math.LN2))}function W(t,e,i,s,r){const n=Math.cos,o=Math.sin,a=n(i/2),h=o(i/2),l=n((e+s)/2),c=o((e+s)/2),u=n((e-s)/2),d=o((e-s)/2),p=n((s-e)/2),f=o((s-e)/2);switch(r){case"XYX":t.set(a*c,h*u,h*d,a*l);break;case"YZY":t.set(h*d,a*c,h*u,a*l);break;case"ZXZ":t.set(h*u,h*d,a*c,a*l);break;case"XZX":t.set(a*c,h*f,h*p,a*l);break;case"YXY":t.set(h*p,a*c,h*f,a*l);break;case"ZYZ":t.set(h*f,h*p,a*c,a*l);break;default:console.warn("../math.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: "+r)}}function j(t,e){switch(e.constructor){case Float32Array:return t;case Uint32Array:return t/4294967295;case Uint16Array:return t/65535;case Uint8Array:return t/255;case Int32Array:return Math.max(t/2147483647,-1);case Int16Array:return Math.max(t/32767,-1);case Int8Array:return Math.max(t/127,-1);default:throw new Error("Invalid component type.")}}function Y(t,e){switch(e.constructor){case Float32Array:return t;case Uint32Array:return Math.round(4294967295*t);case Uint16Array:return Math.round(65535*t);case Uint8Array:return Math.round(255*t);case Int32Array:return Math.round(2147483647*t);case Int16Array:return Math.round(32767*t);case Int8Array:return Math.round(127*t);default:throw new Error("Invalid component type.")}}const X={DEG2RAD:P,RAD2DEG:T,generateUUID:V,clamp:O,euclideanModulo:C,mapLinear:F,inverseLerp:B,lerp:A,damp:$,pingpong:I,smoothstep:E,smootherstep:N,randInt:L,randFloat:R,randFloatSpread:D,seededRandom:U,degToRad:q,radToDeg:k,isPowerOfTwo:J,ceilPowerOfTwo:Q,floorPowerOfTwo:G,setQuaternionFromProperEuler:W,normalize:Y,denormalize:j};class Z{constructor(t=0,e=0,i=0,s=1){this._x=t,this._y=e,this._z=i,this._w=s}static slerpFlat(t,e,i,s,r,n,o){let a=i[s+0],h=i[s+1],l=i[s+2],c=i[s+3];const u=r[n+0],d=r[n+1],p=r[n+2],f=r[n+3];if(0===o)return t[e+0]=a,t[e+1]=h,t[e+2]=l,void(t[e+3]=c);if(1===o)return t[e+0]=u,t[e+1]=d,t[e+2]=p,void(t[e+3]=f);if(c!==f||a!==u||h!==d||l!==p){let t=1-o;const e=a*u+h*d+l*p+c*f,i=e>=0?1:-1,s=1-e*e;if(s>Number.EPSILON){const r=Math.sqrt(s),n=Math.atan2(r,e*i);t=Math.sin(t*n)/r,o=Math.sin(o*n)/r}const r=o*i;if(a=a*t+u*r,h=h*t+d*r,l=l*t+p*r,c=c*t+f*r,t===1-o){const t=1/Math.sqrt(a*a+h*h+l*l+c*c);a*=t,h*=t,l*=t,c*=t}}t[e]=a,t[e+1]=h,t[e+2]=l,t[e+3]=c}static multiplyQuaternionsFlat(t,e,i,s,r,n){const o=i[s],a=i[s+1],h=i[s+2],l=i[s+3],c=r[n],u=r[n+1],d=r[n+2],p=r[n+3];return t[e]=o*p+l*c+a*d-h*u,t[e+1]=a*p+l*u+h*c-o*d,t[e+2]=h*p+l*d+o*u-a*c,t[e+3]=l*p-o*c-a*u-h*d,t}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get w(){return this._w}set w(t){this._w=t,this._onChangeCallback()}set(t,e,i,s){return this._x=t,this._y=e,this._z=i,this._w=s,this._onChangeCallback(),this}clone(){return new Z(this._x,this._y,this._z,this._w)}copy(t){return this._x=t.x,this._y=t.y,this._z=t.z,this._w=t.w,this._onChangeCallback(),this}setFromEuler(t,e=!0){const i=t._x,s=t._y,r=t._z,n=t._order,o=Math.cos,a=Math.sin,h=o(i/2),l=o(s/2),c=o(r/2),u=a(i/2),d=a(s/2),p=a(r/2);switch(n){case"XYZ":this._x=u*l*c+h*d*p,this._y=h*d*c-u*l*p,this._z=h*l*p+u*d*c,this._w=h*l*c-u*d*p;break;case"YXZ":this._x=u*l*c+h*d*p,this._y=h*d*c-u*l*p,this._z=h*l*p-u*d*c,this._w=h*l*c+u*d*p;break;case"ZXY":this._x=u*l*c-h*d*p,this._y=h*d*c+u*l*p,this._z=h*l*p+u*d*c,this._w=h*l*c-u*d*p;break;case"ZYX":this._x=u*l*c-h*d*p,this._y=h*d*c+u*l*p,this._z=h*l*p-u*d*c,this._w=h*l*c+u*d*p;break;case"YZX":this._x=u*l*c+h*d*p,this._y=h*d*c+u*l*p,this._z=h*l*p-u*d*c,this._w=h*l*c-u*d*p;break;case"XZY":this._x=u*l*c-h*d*p,this._y=h*d*c-u*l*p,this._z=h*l*p+u*d*c,this._w=h*l*c+u*d*p;break;default:console.warn("../math.Quaternion: .setFromEuler() encountered an unknown order: "+n)}return!0===e&&this._onChangeCallback(),this}setFromAxisAngle(t,e){const i=e/2,s=Math.sin(i);return this._x=t.x*s,this._y=t.y*s,this._z=t.z*s,this._w=Math.cos(i),this._onChangeCallback(),this}setFromRotationMatrix(t){const e=t.elements,i=e[0],s=e[4],r=e[8],n=e[1],o=e[5],a=e[9],h=e[2],l=e[6],c=e[10],u=i+o+c;if(u>0){const t=.5/Math.sqrt(u+1);this._w=.25/t,this._x=(l-a)*t,this._y=(r-h)*t,this._z=(n-s)*t}else if(i>o&&i>c){const t=2*Math.sqrt(1+i-o-c);this._w=(l-a)/t,this._x=.25*t,this._y=(s+n)/t,this._z=(r+h)/t}else if(o>c){const t=2*Math.sqrt(1+o-i-c);this._w=(r-h)/t,this._x=(s+n)/t,this._y=.25*t,this._z=(a+l)/t}else{const t=2*Math.sqrt(1+c-i-o);this._w=(n-s)/t,this._x=(r+h)/t,this._y=(a+l)/t,this._z=.25*t}return this._onChangeCallback(),this}setFromUnitVectors(t,e){let i=t.dot(e)+1;return i<Number.EPSILON?(i=0,Math.abs(t.x)>Math.abs(t.z)?(this._x=-t.y,this._y=t.x,this._z=0,this._w=i):(this._x=0,this._y=-t.z,this._z=t.y,this._w=i)):(this._x=t.y*e.z-t.z*e.y,this._y=t.z*e.x-t.x*e.z,this._z=t.x*e.y-t.y*e.x,this._w=i),this.normalize()}angleTo(t){return 2*Math.acos(Math.abs(O(this.dot(t),-1,1)))}rotateTowards(t,e){const i=this.angleTo(t);if(0===i)return this;const s=Math.min(1,e/i);return this.slerp(t,s),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(t){return this._x*t._x+this._y*t._y+this._z*t._z+this._w*t._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let t=this.length();return 0===t?(this._x=0,this._y=0,this._z=0,this._w=1):(t=1/t,this._x=this._x*t,this._y=this._y*t,this._z=this._z*t,this._w=this._w*t),this._onChangeCallback(),this}multiply(t){return this.multiplyQuaternions(this,t)}premultiply(t){return this.multiplyQuaternions(t,this)}multiplyQuaternions(t,e){const i=t._x,s=t._y,r=t._z,n=t._w,o=e._x,a=e._y,h=e._z,l=e._w;return this._x=i*l+n*o+s*h-r*a,this._y=s*l+n*a+r*o-i*h,this._z=r*l+n*h+i*a-s*o,this._w=n*l-i*o-s*a-r*h,this._onChangeCallback(),this}slerp(t,e){if(0===e)return this;if(1===e)return this.copy(t);const i=this._x,s=this._y,r=this._z,n=this._w;let o=n*t._w+i*t._x+s*t._y+r*t._z;if(o<0?(this._w=-t._w,this._x=-t._x,this._y=-t._y,this._z=-t._z,o=-o):this.copy(t),o>=1)return this._w=n,this._x=i,this._y=s,this._z=r,this;const a=1-o*o;if(a<=Number.EPSILON){const t=1-e;return this._w=t*n+e*this._w,this._x=t*i+e*this._x,this._y=t*s+e*this._y,this._z=t*r+e*this._z,this.normalize(),this}const h=Math.sqrt(a),l=Math.atan2(h,o),c=Math.sin((1-e)*l)/h,u=Math.sin(e*l)/h;return this._w=n*c+this._w*u,this._x=i*c+this._x*u,this._y=s*c+this._y*u,this._z=r*c+this._z*u,this._onChangeCallback(),this}slerpQuaternions(t,e,i){return this.copy(t).slerp(e,i)}random(){const t=2*Math.PI*S(),e=2*Math.PI*S(),i=S(),s=Math.sqrt(1-i),r=Math.sqrt(i);return this.set(s*Math.sin(t),s*Math.cos(t),r*Math.sin(e),r*Math.cos(e))}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._w===this._w}fromArray(t,e=0){return this._x=t[e],this._y=t[e+1],this._z=t[e+2],this._w=t[e+3],this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._w,t}toJSON(){return this.toArray()}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._w}}Z.prototype.isQuaternion=!0;class H{constructor(t=0,e=0,i=0){this.x=t,this.y=e,this.z=i}set(t,e,i){return void 0===i&&(i=this.z),this.x=t,this.y=e,this.z=i,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+t)}}clone(){return new H(this.x,this.y,this.z)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this}multiplyVectors(t,e){return this.x=t.x*e.x,this.y=t.y*e.y,this.z=t.z*e.z,this}applyEuler(t){return this.applyQuaternion(tt.setFromEuler(t))}applyAxisAngle(t,e){return this.applyQuaternion(tt.setFromAxisAngle(t,e))}applyMatrix3(t){const e=this.x,i=this.y,s=this.z,r=t.elements;return this.x=r[0]*e+r[3]*i+r[6]*s,this.y=r[1]*e+r[4]*i+r[7]*s,this.z=r[2]*e+r[5]*i+r[8]*s,this}applyNormalMatrix(t){return this.applyMatrix3(t).normalize()}applyMatrix4(t){const e=this.x,i=this.y,s=this.z,r=t.elements,n=1/(r[3]*e+r[7]*i+r[11]*s+r[15]);return this.x=(r[0]*e+r[4]*i+r[8]*s+r[12])*n,this.y=(r[1]*e+r[5]*i+r[9]*s+r[13])*n,this.z=(r[2]*e+r[6]*i+r[10]*s+r[14])*n,this}applyQuaternion(t){const e=this.x,i=this.y,s=this.z,r=t.x,n=t.y,o=t.z,a=t.w,h=2*(n*s-o*i),l=2*(o*e-r*s),c=2*(r*i-n*e);return this.x=e+a*h+n*c-o*l,this.y=i+a*l+o*h-r*c,this.z=s+a*c+r*l-n*h,this}transformDirection(t){const e=this.x,i=this.y,s=this.z,r=t.elements;return this.x=r[0]*e+r[4]*i+r[8]*s,this.y=r[1]*e+r[5]*i+r[9]*s,this.z=r[2]*e+r[6]*i+r[10]*s,this.normalize()}divide(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this}divideScalar(t){return this.multiplyScalar(1/t)}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this.z=Math.min(this.z,t.z),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this.z=Math.max(this.z,t.z),this}clamp(t,e){return this.x=Math.max(t.x,Math.min(e.x,this.x)),this.y=Math.max(t.y,Math.min(e.y,this.y)),this.z=Math.max(t.z,Math.min(e.z,this.z)),this}clampScalar(t,e){return this.x=Math.max(t,Math.min(e,this.x)),this.y=Math.max(t,Math.min(e,this.y)),this.z=Math.max(t,Math.min(e,this.z)),this}clampLength(t,e){const i=this.length();return this.divideScalar(i||1).multiplyScalar(Math.max(t,Math.min(e,i)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this.z+=(t.z-this.z)*e,this}lerpVectors(t,e,i){return this.x=t.x+(e.x-t.x)*i,this.y=t.y+(e.y-t.y)*i,this.z=t.z+(e.z-t.z)*i,this}cross(t){return this.crossVectors(this,t)}crossVectors(t,e){const i=t.x,s=t.y,r=t.z,n=e.x,o=e.y,a=e.z;return this.x=s*a-r*o,this.y=r*n-i*a,this.z=i*o-s*n,this}projectOnVector(t){const e=t.lengthSq();if(0===e)return this.set(0,0,0);const i=t.dot(this)/e;return this.copy(t).multiplyScalar(i)}projectOnPlane(t){return K.copy(this).projectOnVector(t),this.sub(K)}reflect(t){return this.sub(K.copy(t).multiplyScalar(2*this.dot(t)))}angleTo(t){const e=Math.sqrt(this.lengthSq()*t.lengthSq());if(0===e)return Math.PI/2;const i=this.dot(t)/e;return Math.acos(O(i,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,i=this.y-t.y,s=this.z-t.z;return e*e+i*i+s*s}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)+Math.abs(this.z-t.z)}setFromSphericalCoords(t,e,i){const s=Math.sin(e)*t;return this.x=s*Math.sin(i),this.y=Math.cos(e)*t,this.z=s*Math.cos(i),this}setFromCylindricalCoords(t,e,i){return this.x=t*Math.sin(e),this.y=i,this.z=t*Math.cos(e),this}setFromMatrixPosition(t){const e=t.elements;return this.x=e[12],this.y=e[13],this.z=e[14],this}setFromMatrixScale(t){const e=this.setFromMatrixColumn(t,0).length(),i=this.setFromMatrixColumn(t,1).length(),s=this.setFromMatrixColumn(t,2).length();return this.x=e,this.y=i,this.z=s,this}setFromMatrixColumn(t,e){return this.fromArray(t.elements,4*e)}setFromMatrix3Column(t,e){return this.fromArray(t.elements,3*e)}setFromEuler(t){return this.x=t._x,this.y=t._y,this.z=t._z,this}equals(t){return t.x===this.x&&t.y===this.y&&t.z===this.z}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this.z=t[e+2],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t[e+2]=this.z,t}random(){return this.x=S(),this.y=S(),this.z=S(),this}randomDirection(){const t=S()*Math.PI*2,e=2*S()-1,i=Math.sqrt(1-e*e);return this.x=i*Math.cos(t),this.y=e,this.z=i*Math.sin(t),this}abs(){return this.x=Math.abs(this.x),this.y=Math.abs(this.y),this.z=Math.abs(this.z),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}}H.prototype.isVector3=!0;const K=new H,tt=new Z,et=2e3,it=2001;class st{constructor(t,e,i,s,r,n,o,a,h,l,c,u,d,p,f,m){this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],void 0!==t&&this.set(t,e,i,s,r,n,o,a,h,l,c,u,d,p,f,m)}extractPosition(t){return console.warn("THREE.Matrix4: .extractPosition() has been renamed to .copyPosition()."),this.copyPosition(t)}multiplyToArray(t,e,i){return console.error("THREE.Matrix4: .multiplyToArray() has been removed."),this}setRotationFromQuaternion(t){return this.makeRotationFromQuaternion(t)}set(t,e,i,s,r,n,o,a,h,l,c,u,d,p,f,m){const y=this.elements;return y[0]=t,y[4]=e,y[8]=i,y[12]=s,y[1]=r,y[5]=n,y[9]=o,y[13]=a,y[2]=h,y[6]=l,y[10]=c,y[14]=u,y[3]=d,y[7]=p,y[11]=f,y[15]=m,this}identity(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this}clone(){return(new st).fromArray(this.elements)}copy(t){const e=this.elements,i=t.elements;return e[0]=i[0],e[1]=i[1],e[2]=i[2],e[3]=i[3],e[4]=i[4],e[5]=i[5],e[6]=i[6],e[7]=i[7],e[8]=i[8],e[9]=i[9],e[10]=i[10],e[11]=i[11],e[12]=i[12],e[13]=i[13],e[14]=i[14],e[15]=i[15],this}copyPosition(t){const e=this.elements,i=t.elements;return e[12]=i[12],e[13]=i[13],e[14]=i[14],this}setFromMatrix3(t){const e=t.elements;return this.set(e[0],e[3],e[6],0,e[1],e[4],e[7],0,e[2],e[5],e[8],0,0,0,0,1),this}extractBasis(t,e,i){return t.setFromMatrixColumn(this,0),e.setFromMatrixColumn(this,1),i.setFromMatrixColumn(this,2),this}makeBasis(t,e,i){return this.set(t.x,e.x,i.x,0,t.y,e.y,i.y,0,t.z,e.z,i.z,0,0,0,0,1),this}extractRotation(t){const e=this.elements,i=t.elements,s=1/rt.setFromMatrixColumn(t,0).length(),r=1/rt.setFromMatrixColumn(t,1).length(),n=1/rt.setFromMatrixColumn(t,2).length();return e[0]=i[0]*s,e[1]=i[1]*s,e[2]=i[2]*s,e[3]=0,e[4]=i[4]*r,e[5]=i[5]*r,e[6]=i[6]*r,e[7]=0,e[8]=i[8]*n,e[9]=i[9]*n,e[10]=i[10]*n,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromEuler(t){const e=this.elements,i=t.x,s=t.y,r=t.z,n=Math.cos(i),o=Math.sin(i),a=Math.cos(s),h=Math.sin(s),l=Math.cos(r),c=Math.sin(r);if("XYZ"===t.order){const t=n*l,i=n*c,s=o*l,r=o*c;e[0]=a*l,e[4]=-a*c,e[8]=h,e[1]=i+s*h,e[5]=t-r*h,e[9]=-o*a,e[2]=r-t*h,e[6]=s+i*h,e[10]=n*a}else if("YXZ"===t.order){const t=a*l,i=a*c,s=h*l,r=h*c;e[0]=t+r*o,e[4]=s*o-i,e[8]=n*h,e[1]=n*c,e[5]=n*l,e[9]=-o,e[2]=i*o-s,e[6]=r+t*o,e[10]=n*a}else if("ZXY"===t.order){const t=a*l,i=a*c,s=h*l,r=h*c;e[0]=t-r*o,e[4]=-n*c,e[8]=s+i*o,e[1]=i+s*o,e[5]=n*l,e[9]=r-t*o,e[2]=-n*h,e[6]=o,e[10]=n*a}else if("ZYX"===t.order){const t=n*l,i=n*c,s=o*l,r=o*c;e[0]=a*l,e[4]=s*h-i,e[8]=t*h+r,e[1]=a*c,e[5]=r*h+t,e[9]=i*h-s,e[2]=-h,e[6]=o*a,e[10]=n*a}else if("YZX"===t.order){const t=n*a,i=n*h,s=o*a,r=o*h;e[0]=a*l,e[4]=r-t*c,e[8]=s*c+i,e[1]=c,e[5]=n*l,e[9]=-o*l,e[2]=-h*l,e[6]=i*c+s,e[10]=t-r*c}else if("XZY"===t.order){const t=n*a,i=n*h,s=o*a,r=o*h;e[0]=a*l,e[4]=-c,e[8]=h*l,e[1]=t*c+r,e[5]=n*l,e[9]=i*c-s,e[2]=s*c-i,e[6]=o*l,e[10]=r*c+t}return e[3]=0,e[7]=0,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromQuaternion(t){return this.compose(ot,t,at)}lookAt(t,e,i){const s=this.elements;return ct.subVectors(t,e),0===ct.lengthSq()&&(ct.z=1),ct.normalize(),ht.crossVectors(i,ct),0===ht.lengthSq()&&(1===Math.abs(i.z)?ct.x+=1e-4:ct.z+=1e-4,ct.normalize(),ht.crossVectors(i,ct)),ht.normalize(),lt.crossVectors(ct,ht),s[0]=ht.x,s[4]=lt.x,s[8]=ct.x,s[1]=ht.y,s[5]=lt.y,s[9]=ct.y,s[2]=ht.z,s[6]=lt.z,s[10]=ct.z,this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const i=t.elements,s=e.elements,r=this.elements,n=i[0],o=i[4],a=i[8],h=i[12],l=i[1],c=i[5],u=i[9],d=i[13],p=i[2],f=i[6],m=i[10],y=i[14],v=i[3],g=i[7],x=i[11],S=i[15],w=s[0],b=s[4],z=s[8],M=s[12],_=s[1],P=s[5],T=s[9],V=s[13],O=s[2],C=s[6],F=s[10],B=s[14],A=s[3],$=s[7],I=s[11],E=s[15];return r[0]=n*w+o*_+a*O+h*A,r[4]=n*b+o*P+a*C+h*$,r[8]=n*z+o*T+a*F+h*I,r[12]=n*M+o*V+a*B+h*E,r[1]=l*w+c*_+u*O+d*A,r[5]=l*b+c*P+u*C+d*$,r[9]=l*z+c*T+u*F+d*I,r[13]=l*M+c*V+u*B+d*E,r[2]=p*w+f*_+m*O+y*A,r[6]=p*b+f*P+m*C+y*$,r[10]=p*z+f*T+m*F+y*I,r[14]=p*M+f*V+m*B+y*E,r[3]=v*w+g*_+x*O+S*A,r[7]=v*b+g*P+x*C+S*$,r[11]=v*z+g*T+x*F+S*I,r[15]=v*M+g*V+x*B+S*E,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[4]*=t,e[8]*=t,e[12]*=t,e[1]*=t,e[5]*=t,e[9]*=t,e[13]*=t,e[2]*=t,e[6]*=t,e[10]*=t,e[14]*=t,e[3]*=t,e[7]*=t,e[11]*=t,e[15]*=t,this}determinant(){const t=this.elements,e=t[0],i=t[4],s=t[8],r=t[12],n=t[1],o=t[5],a=t[9],h=t[13],l=t[2],c=t[6],u=t[10],d=t[14];return t[3]*(+r*a*c-s*h*c-r*o*u+i*h*u+s*o*d-i*a*d)+t[7]*(+e*a*d-e*h*u+r*n*u-s*n*d+s*h*l-r*a*l)+t[11]*(+e*h*c-e*o*d-r*n*c+i*n*d+r*o*l-i*h*l)+t[15]*(-s*o*l-e*a*c+e*o*u+s*n*c-i*n*u+i*a*l)}transpose(){const t=this.elements;let e;return e=t[1],t[1]=t[4],t[4]=e,e=t[2],t[2]=t[8],t[8]=e,e=t[6],t[6]=t[9],t[9]=e,e=t[3],t[3]=t[12],t[12]=e,e=t[7],t[7]=t[13],t[13]=e,e=t[11],t[11]=t[14],t[14]=e,this}setPosition(t,e,i){const s=this.elements;return t.isVector3?(s[12]=t.x,s[13]=t.y,s[14]=t.z):(s[12]=t,s[13]=e,s[14]=i),this}invert(){const t=this.elements,e=t[0],i=t[1],s=t[2],r=t[3],n=t[4],o=t[5],a=t[6],h=t[7],l=t[8],c=t[9],u=t[10],d=t[11],p=t[12],f=t[13],m=t[14],y=t[15],v=c*m*h-f*u*h+f*a*d-o*m*d-c*a*y+o*u*y,g=p*u*h-l*m*h-p*a*d+n*m*d+l*a*y-n*u*y,x=l*f*h-p*c*h+p*o*d-n*f*d-l*o*y+n*c*y,S=p*c*a-l*f*a-p*o*u+n*f*u+l*o*m-n*c*m,w=e*v+i*g+s*x+r*S;if(0===w)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);const b=1/w;return t[0]=v*b,t[1]=(f*u*r-c*m*r-f*s*d+i*m*d+c*s*y-i*u*y)*b,t[2]=(o*m*r-f*a*r+f*s*h-i*m*h-o*s*y+i*a*y)*b,t[3]=(c*a*r-o*u*r-c*s*h+i*u*h+o*s*d-i*a*d)*b,t[4]=g*b,t[5]=(l*m*r-p*u*r+p*s*d-e*m*d-l*s*y+e*u*y)*b,t[6]=(p*a*r-n*m*r-p*s*h+e*m*h+n*s*y-e*a*y)*b,t[7]=(n*u*r-l*a*r+l*s*h-e*u*h-n*s*d+e*a*d)*b,t[8]=x*b,t[9]=(p*c*r-l*f*r-p*i*d+e*f*d+l*i*y-e*c*y)*b,t[10]=(n*f*r-p*o*r+p*i*h-e*f*h-n*i*y+e*o*y)*b,t[11]=(l*o*r-n*c*r-l*i*h+e*c*h+n*i*d-e*o*d)*b,t[12]=S*b,t[13]=(l*f*s-p*c*s+p*i*u-e*f*u-l*i*m+e*c*m)*b,t[14]=(p*o*s-n*f*s-p*i*a+e*f*a+n*i*m-e*o*m)*b,t[15]=(n*c*s-l*o*s+l*i*a-e*c*a-n*i*u+e*o*u)*b,this}scale(t){const e=this.elements,i=t.x,s=t.y,r=t.z;return e[0]*=i,e[4]*=s,e[8]*=r,e[1]*=i,e[5]*=s,e[9]*=r,e[2]*=i,e[6]*=s,e[10]*=r,e[3]*=i,e[7]*=s,e[11]*=r,this}getMaxScaleOnAxis(){const t=this.elements,e=t[0]*t[0]+t[1]*t[1]+t[2]*t[2],i=t[4]*t[4]+t[5]*t[5]+t[6]*t[6],s=t[8]*t[8]+t[9]*t[9]+t[10]*t[10];return Math.sqrt(Math.max(e,i,s))}makeTranslation(t,e,i){return t.isVector3?this.set(1,0,0,t.x,0,1,0,t.y,0,0,1,t.z,0,0,0,1):this.set(1,0,0,t,0,1,0,e,0,0,1,i,0,0,0,1),this}makeRotationX(t){const e=Math.cos(t),i=Math.sin(t);return this.set(1,0,0,0,0,e,-i,0,0,i,e,0,0,0,0,1),this}makeRotationY(t){const e=Math.cos(t),i=Math.sin(t);return this.set(e,0,i,0,0,1,0,0,-i,0,e,0,0,0,0,1),this}makeRotationZ(t){const e=Math.cos(t),i=Math.sin(t);return this.set(e,-i,0,0,i,e,0,0,0,0,1,0,0,0,0,1),this}makeRotationAxis(t,e){const i=Math.cos(e),s=Math.sin(e),r=1-i,n=t.x,o=t.y,a=t.z,h=r*n,l=r*o;return this.set(h*n+i,h*o-s*a,h*a+s*o,0,h*o+s*a,l*o+i,l*a-s*n,0,h*a-s*o,l*a+s*n,r*a*a+i,0,0,0,0,1),this}makeScale(t,e,i){return this.set(t,0,0,0,0,e,0,0,0,0,i,0,0,0,0,1),this}makeShear(t,e,i,s,r,n){return this.set(1,i,r,0,t,1,n,0,e,s,1,0,0,0,0,1),this}compose(t,e,i){const s=this.elements,r=e._x,n=e._y,o=e._z,a=e._w,h=r+r,l=n+n,c=o+o,u=r*h,d=r*l,p=r*c,f=n*l,m=n*c,y=o*c,v=a*h,g=a*l,x=a*c,S=i.x,w=i.y,b=i.z;return s[0]=(1-(f+y))*S,s[1]=(d+x)*S,s[2]=(p-g)*S,s[3]=0,s[4]=(d-x)*w,s[5]=(1-(u+y))*w,s[6]=(m+v)*w,s[7]=0,s[8]=(p+g)*b,s[9]=(m-v)*b,s[10]=(1-(u+f))*b,s[11]=0,s[12]=t.x,s[13]=t.y,s[14]=t.z,s[15]=1,this}decompose(t,e,i){const s=this.elements;let r=rt.set(s[0],s[1],s[2]).length();const n=rt.set(s[4],s[5],s[6]).length(),o=rt.set(s[8],s[9],s[10]).length();this.determinant()<0&&(r=-r),t.x=s[12],t.y=s[13],t.z=s[14],nt.copy(this);const a=1/r,h=1/n,l=1/o;return nt.elements[0]*=a,nt.elements[1]*=a,nt.elements[2]*=a,nt.elements[4]*=h,nt.elements[5]*=h,nt.elements[6]*=h,nt.elements[8]*=l,nt.elements[9]*=l,nt.elements[10]*=l,e.setFromRotationMatrix(nt),i.x=r,i.y=n,i.z=o,this}makePerspective(t,e,i,s,r,n,o=2e3){const a=this.elements,h=2*r/(e-t),l=2*r/(i-s),c=(e+t)/(e-t),u=(i+s)/(i-s);let d,p;if(o===et)d=-(n+r)/(n-r),p=-2*n*r/(n-r);else{if(o!==it)throw new Error("Matrix4.makePerspective(): Invalid coordinate system: "+o);d=-n/(n-r),p=-n*r/(n-r)}return a[0]=h,a[4]=0,a[8]=c,a[12]=0,a[1]=0,a[5]=l,a[9]=u,a[13]=0,a[2]=0,a[6]=0,a[10]=d,a[14]=p,a[3]=0,a[7]=0,a[11]=-1,a[15]=0,this}makeOrthographic(t,e,i,s,r,n,o=2e3){const a=this.elements,h=1/(e-t),l=1/(i-s),c=1/(n-r),u=(e+t)*h,d=(i+s)*l;let p,f;if(o===et)p=(n+r)*c,f=-2*c;else{if(o!==it)throw new Error("../math.Matrix4.makeOrthographic(): Invalid coordinate system: "+o);p=r*c,f=-1*c}return a[0]=2*h,a[4]=0,a[8]=0,a[12]=-u,a[1]=0,a[5]=2*l,a[9]=0,a[13]=-d,a[2]=0,a[6]=0,a[10]=f,a[14]=-p,a[3]=0,a[7]=0,a[11]=0,a[15]=1,this}equals(t){const e=this.elements,i=t.elements;for(let t=0;t<16;t++)if(e[t]!==i[t])return!1;return!0}fromArray(t,e=0){for(let i=0;i<16;i++)this.elements[i]=t[i+e];return this}toArray(t=[],e=0){const i=this.elements;return t[e]=i[0],t[e+1]=i[1],t[e+2]=i[2],t[e+3]=i[3],t[e+4]=i[4],t[e+5]=i[5],t[e+6]=i[6],t[e+7]=i[7],t[e+8]=i[8],t[e+9]=i[9],t[e+10]=i[10],t[e+11]=i[11],t[e+12]=i[12],t[e+13]=i[13],t[e+14]=i[14],t[e+15]=i[15],t}}st.prototype.isMatrix4=!0;const rt=new H,nt=new st,ot=new H(0,0,0),at=new H(1,1,1),ht=new H,lt=new H,ct=new H,ut=new st,dt=new Z;class pt{constructor(t=0,e=0,i=0,s=pt.DEFAULT_ORDER){this._x=t,this._y=e,this._z=i,this._order=s}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get order(){return this._order}set order(t){this._order=t,this._onChangeCallback()}set(t,e,i,s=this._order){return this._x=t,this._y=e,this._z=i,this._order=s,this._onChangeCallback(),this}clone(){return new pt(this._x,this._y,this._z,this._order)}copy(t){return this._x=t._x,this._y=t._y,this._z=t._z,this._order=t._order,this._onChangeCallback(),this}setFromRotationMatrix(t,e=this._order,i=!0){const s=t.elements,r=s[0],n=s[4],o=s[8],a=s[1],h=s[5],l=s[9],c=s[2],u=s[6],d=s[10];switch(e){case"XYZ":this._y=Math.asin(O(o,-1,1)),Math.abs(o)<.9999999?(this._x=Math.atan2(-l,d),this._z=Math.atan2(-n,r)):(this._x=Math.atan2(u,h),this._z=0);break;case"YXZ":this._x=Math.asin(-O(l,-1,1)),Math.abs(l)<.9999999?(this._y=Math.atan2(o,d),this._z=Math.atan2(a,h)):(this._y=Math.atan2(-c,r),this._z=0);break;case"ZXY":this._x=Math.asin(O(u,-1,1)),Math.abs(u)<.9999999?(this._y=Math.atan2(-c,d),this._z=Math.atan2(-n,h)):(this._y=0,this._z=Math.atan2(a,r));break;case"ZYX":this._y=Math.asin(-O(c,-1,1)),Math.abs(c)<.9999999?(this._x=Math.atan2(u,d),this._z=Math.atan2(a,r)):(this._x=0,this._z=Math.atan2(-n,h));break;case"YZX":this._z=Math.asin(O(a,-1,1)),Math.abs(a)<.9999999?(this._x=Math.atan2(-l,h),this._y=Math.atan2(-c,r)):(this._x=0,this._y=Math.atan2(o,d));break;case"XZY":this._z=Math.asin(-O(n,-1,1)),Math.abs(n)<.9999999?(this._x=Math.atan2(u,h),this._y=Math.atan2(o,r)):(this._x=Math.atan2(-l,d),this._y=0);break;default:console.warn("../math.Euler: .setFromRotationMatrix() encountered an unknown order: "+e)}return this._order=e,!0===i&&this._onChangeCallback(),this}setFromQuaternion(t,e,i){return ut.makeRotationFromQuaternion(t),this.setFromRotationMatrix(ut,e,i)}setFromVector3(t,e=this._order){return this.set(t.x,t.y,t.z,e)}reorder(t){return dt.setFromEuler(this),this.setFromQuaternion(dt,t)}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._order===this._order}fromArray(t){return this._x=t[0],this._y=t[1],this._z=t[2],void 0!==t[3]&&(this._order=t[3]),this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._order,t}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(t){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._order}}pt.DEFAULT_ORDER="XYZ",pt.prototype.isEuler=!0;class ft{constructor(t,e,i,s,r,n,o,a,h){this.elements=[1,0,0,0,1,0,0,0,1],void 0!==t&&this.set(t,e,i,s,r,n,o,a,h)}set(t,e,i,s,r,n,o,a,h){const l=this.elements;return l[0]=t,l[1]=s,l[2]=o,l[3]=e,l[4]=r,l[5]=a,l[6]=i,l[7]=n,l[8]=h,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(t){const e=this.elements,i=t.elements;return e[0]=i[0],e[1]=i[1],e[2]=i[2],e[3]=i[3],e[4]=i[4],e[5]=i[5],e[6]=i[6],e[7]=i[7],e[8]=i[8],this}extractBasis(t,e,i){return t.setFromMatrix3Column(this,0),e.setFromMatrix3Column(this,1),i.setFromMatrix3Column(this,2),this}setFromMatrix4(t){const e=t.elements;return this.set(e[0],e[4],e[8],e[1],e[5],e[9],e[2],e[6],e[10]),this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const i=t.elements,s=e.elements,r=this.elements,n=i[0],o=i[3],a=i[6],h=i[1],l=i[4],c=i[7],u=i[2],d=i[5],p=i[8],f=s[0],m=s[3],y=s[6],v=s[1],g=s[4],x=s[7],S=s[2],w=s[5],b=s[8];return r[0]=n*f+o*v+a*S,r[3]=n*m+o*g+a*w,r[6]=n*y+o*x+a*b,r[1]=h*f+l*v+c*S,r[4]=h*m+l*g+c*w,r[7]=h*y+l*x+c*b,r[2]=u*f+d*v+p*S,r[5]=u*m+d*g+p*w,r[8]=u*y+d*x+p*b,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[3]*=t,e[6]*=t,e[1]*=t,e[4]*=t,e[7]*=t,e[2]*=t,e[5]*=t,e[8]*=t,this}determinant(){const t=this.elements,e=t[0],i=t[1],s=t[2],r=t[3],n=t[4],o=t[5],a=t[6],h=t[7],l=t[8];return e*n*l-e*o*h-i*r*l+i*o*a+s*r*h-s*n*a}invert(){const t=this.elements,e=t[0],i=t[1],s=t[2],r=t[3],n=t[4],o=t[5],a=t[6],h=t[7],l=t[8],c=l*n-o*h,u=o*a-l*r,d=h*r-n*a,p=e*c+i*u+s*d;if(0===p)return this.set(0,0,0,0,0,0,0,0,0);const f=1/p;return t[0]=c*f,t[1]=(s*h-l*i)*f,t[2]=(o*i-s*n)*f,t[3]=u*f,t[4]=(l*e-s*a)*f,t[5]=(s*r-o*e)*f,t[6]=d*f,t[7]=(i*a-h*e)*f,t[8]=(n*e-i*r)*f,this}transpose(){let t;const e=this.elements;return t=e[1],e[1]=e[3],e[3]=t,t=e[2],e[2]=e[6],e[6]=t,t=e[5],e[5]=e[7],e[7]=t,this}getNormalMatrix(t){return this.setFromMatrix4(t).invert().transpose()}transposeIntoArray(t){const e=this.elements;return t[0]=e[0],t[1]=e[3],t[2]=e[6],t[3]=e[1],t[4]=e[4],t[5]=e[7],t[6]=e[2],t[7]=e[5],t[8]=e[8],this}setUvTransform(t,e,i,s,r,n,o){const a=Math.cos(r),h=Math.sin(r);return this.set(i*a,i*h,-i*(a*n+h*o)+n+t,-s*h,s*a,-s*(-h*n+a*o)+o+e,0,0,1),this}scale(t,e){return this.premultiply(mt.makeScale(t,e)),this}rotate(t){return this.premultiply(mt.makeRotation(-t)),this}translate(t,e){return this.premultiply(mt.makeTranslation(t,e)),this}makeTranslation(t,e){return t.isVector2?this.set(1,0,t.x,0,1,t.y,0,0,1):this.set(1,0,t,0,1,e,0,0,1),this}makeRotation(t){const e=Math.cos(t),i=Math.sin(t);return this.set(e,-i,0,i,e,0,0,0,1),this}makeScale(t,e){return this.set(t,0,0,0,e,0,0,0,1),this}equals(t){const e=this.elements,i=t.elements;for(let t=0;t<9;t++)if(e[t]!==i[t])return!1;return!0}fromArray(t,e=0){for(let i=0;i<9;i++)this.elements[i]=t[i+e];return this}toArray(t=[],e=0){const i=this.elements;return t[e]=i[0],t[e+1]=i[1],t[e+2]=i[2],t[e+3]=i[3],t[e+4]=i[4],t[e+5]=i[5],t[e+6]=i[6],t[e+7]=i[7],t[e+8]=i[8],t}clone(){return(new ft).fromArray(this.elements)}}ft.prototype.isMatrix3=!0;const mt=new ft,yt=new Float32Array(4);class vt extends Z{constructor(t,e){super(),this.data=t,this.offset=e}bind(t,e){this.data=t,this.offset=e}}const gt=vt.prototype;gt.data=yt,gt.offset=0,Object.defineProperties(vt.prototype,{_x:{get(){return this.data[this.offset]},set(t){this.data[this.offset]=t}},_y:{get(){return this.data[this.offset+1]},set(t){this.data[this.offset+1]=t}},_z:{get(){return this.data[this.offset+2]},set(t){this.data[this.offset+2]=t}},_w:{get(){return this.data[this.offset+3]},set(t){this.data[this.offset+3]=t}}});class xt{constructor(t=0,e=0){this.x=t,this.y=e}get width(){return this.x}set width(t){this.x=t}get height(){return this.y}set height(t){this.y=t}set(t,e){return this.x=t,this.y=e,this}setScalar(t){return this.x=t,this.y=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+t)}}clone(){return new xt(this.x,this.y)}copy(t){return this.x=t.x,this.y=t.y,this}add(t){return this.x+=t.x,this.y+=t.y,this}addScalar(t){return this.x+=t,this.y+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this}subScalar(t){return this.x-=t,this.y-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this}multiply(t){return this.x*=t.x,this.y*=t.y,this}multiplyScalar(t){return this.x*=t,this.y*=t,this}divide(t){return this.x/=t.x,this.y/=t.y,this}divideScalar(t){return this.multiplyScalar(1/t)}applyMatrix3(t){const e=this.x,i=this.y,s=t.elements;return this.x=s[0]*e+s[3]*i+s[6],this.y=s[1]*e+s[4]*i+s[7],this}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this}clamp(t,e){return this.x=Math.max(t.x,Math.min(e.x,this.x)),this.y=Math.max(t.y,Math.min(e.y,this.y)),this}clampScalar(t,e){return this.x=Math.max(t,Math.min(e,this.x)),this.y=Math.max(t,Math.min(e,this.y)),this}clampLength(t,e){const i=this.length();return this.divideScalar(i||1).multiplyScalar(Math.max(t,Math.min(e,i)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this}negate(){return this.x=-this.x,this.y=-this.y,this}dot(t){return this.x*t.x+this.y*t.y}cross(t){return this.x*t.y-this.y*t.x}lengthSq(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)}normalize(){return this.divideScalar(this.length()||1)}angle(){return Math.atan2(-this.y,-this.x)+Math.PI}angleTo(t){const e=Math.sqrt(this.lengthSq()*t.lengthSq());if(0===e)return Math.PI/2;const i=this.dot(t)/e;return Math.acos(O(i,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,i=this.y-t.y;return e*e+i*i}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this}lerpVectors(t,e,i){return this.x=t.x+(e.x-t.x)*i,this.y=t.y+(e.y-t.y)*i,this}equals(t){return t.x===this.x&&t.y===this.y}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t}rotateAround(t,e){const i=Math.cos(e),s=Math.sin(e),r=this.x-t.x,n=this.y-t.y;return this.x=r*i-n*s+t.x,this.y=r*s+n*i+t.y,this}random(){return this.x=S(),this.y=S(),this}*[Symbol.iterator](){yield this.x,yield this.y}}xt.isVector2=!0;const St=new Float32Array(3);class wt extends H{constructor(t,e){super(),this.data=t,this.offset=e}bind(t,e){this.data=t,this.offset=e}}const bt=wt.prototype;bt.data=St,bt.offset=0,Object.defineProperties(wt.prototype,{x:{get(){return this.data[this.offset]},set(t){this.data[this.offset]=t}},y:{get(){return this.data[this.offset+1]},set(t){this.data[this.offset+1]=t}},z:{get(){return this.data[this.offset+2]},set(t){this.data[this.offset+2]=t}}});class zt{constructor(t=0,e=0,i=0,s=1){this.x=t,this.y=e,this.z=i,this.w=s}get width(){return this.z}set width(t){this.z=t}get height(){return this.w}set height(t){this.w=t}set(t,e,i,s){return this.x=t,this.y=e,this.z=i,this.w=s,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this.w=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setW(t){return this.w=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;case 3:this.w=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+t)}}clone(){return new zt(this.x,this.y,this.z,this.w)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this.w=t.w,this}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this.w+=t.w,this}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this.w+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this.w=t.w+e.w,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this.w+=t.w*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this.w-=t.w,this}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this.w-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this.w=t.w-e.w,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this.w*=t.w,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this.w*=t,this}applyMatrix4(t){const e=this.x,i=this.y,s=this.z,r=this.w,n=t.elements;return this.x=n[0]*e+n[4]*i+n[8]*s+n[12]*r,this.y=n[1]*e+n[5]*i+n[9]*s+n[13]*r,this.z=n[2]*e+n[6]*i+n[10]*s+n[14]*r,this.w=n[3]*e+n[7]*i+n[11]*s+n[15]*r,this}divideScalar(t){return this.multiplyScalar(1/t)}setAxisAngleFromQuaternion(t){this.w=2*Math.acos(t.w);const e=Math.sqrt(1-t.w*t.w);return e<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=t.x/e,this.y=t.y/e,this.z=t.z/e),this}setAxisAngleFromRotationMatrix(t){let e,i,s,r;const n=.01,o=.1,a=t.elements,h=a[0],l=a[4],c=a[8],u=a[1],d=a[5],p=a[9],f=a[2],m=a[6],y=a[10];if(Math.abs(l-u)<n&&Math.abs(c-f)<n&&Math.abs(p-m)<n){if(Math.abs(l+u)<o&&Math.abs(c+f)<o&&Math.abs(p+m)<o&&Math.abs(h+d+y-3)<o)return this.set(1,0,0,0),this;e=Math.PI;const t=(h+1)/2,a=(d+1)/2,v=(y+1)/2,g=(l+u)/4,x=(c+f)/4,S=(p+m)/4;return t>a&&t>v?t<n?(i=0,s=.707106781,r=.707106781):(i=Math.sqrt(t),s=g/i,r=x/i):a>v?a<n?(i=.707106781,s=0,r=.707106781):(s=Math.sqrt(a),i=g/s,r=S/s):v<n?(i=.707106781,s=.707106781,r=0):(r=Math.sqrt(v),i=x/r,s=S/r),this.set(i,s,r,e),this}let v=Math.sqrt((m-p)*(m-p)+(c-f)*(c-f)+(u-l)*(u-l));return Math.abs(v)<.001&&(v=1),this.x=(m-p)/v,this.y=(c-f)/v,this.z=(u-l)/v,this.w=Math.acos((h+d+y-1)/2),this}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this.z=Math.min(this.z,t.z),this.w=Math.min(this.w,t.w),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this.z=Math.max(this.z,t.z),this.w=Math.max(this.w,t.w),this}clamp(t,e){return this.x=Math.max(t.x,Math.min(e.x,this.x)),this.y=Math.max(t.y,Math.min(e.y,this.y)),this.z=Math.max(t.z,Math.min(e.z,this.z)),this.w=Math.max(t.w,Math.min(e.w,this.w)),this}clampScalar(t,e){return this.x=Math.max(t,Math.min(e,this.x)),this.y=Math.max(t,Math.min(e,this.y)),this.z=Math.max(t,Math.min(e,this.z)),this.w=Math.max(t,Math.min(e,this.w)),this}clampLength(t,e){const i=this.length();return this.divideScalar(i||1).multiplyScalar(Math.max(t,Math.min(e,i)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this.w=Math.floor(this.w),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this.w=Math.ceil(this.w),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this.w=Math.round(this.w),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this.w=Math.trunc(this.w),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this.w=-this.w,this}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z+this.w*t.w}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)}normalize(){return this.divideScalar(this.length()||1)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this.z+=(t.z-this.z)*e,this.w+=(t.w-this.w)*e,this}lerpVectors(t,e,i){return this.x=t.x+(e.x-t.x)*i,this.y=t.y+(e.y-t.y)*i,this.z=t.z+(e.z-t.z)*i,this.w=t.w+(e.w-t.w)*i,this}equals(t){return t.x===this.x&&t.y===this.y&&t.z===this.z&&t.w===this.w}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this.z=t[e+2],this.w=t[e+3],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t[e+2]=this.z,t[e+3]=this.w,t}random(){return this.x=S(),this.y=S(),this.z=S(),this.w=S(),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z,yield this.w}}zt.prototype.isVector4=!0;const Mt=new Float32Array(4);class _t extends zt{constructor(t,e){super(),this.data=t,this.offset=e}bind(t,e){this.data=t,this.offset=e}}const Pt=_t.prototype;let Tt;function Vt(){return Tt}Pt.data=Mt,Pt.offset=0,Object.defineProperties(_t.prototype,{x:{get(){return this.data[this.offset]},set(t){this.data[this.offset]=t}},y:{get(){return this.data[this.offset+1]},set(t){this.data[this.offset+1]=t}},z:{get(){return this.data[this.offset+2]},set(t){this.data[this.offset+2]=t}},w:{get(){return this.data[this.offset+3]},set(t){this.data[this.offset+3]=t}}});class Ot{constructor(t,e){this.resolver=t,this.bounce=e,this.type="ApplyCollision",this.tempV=new H}initialize(t){}update(t,e){this.resolver&&this.resolver.resolve(t.position,this.tempV)&&t.velocity.reflect(this.tempV).multiplyScalar(this.bounce)}frameUpdate(t){}toJSON(){return{type:this.type,bounce:this.bounce}}static fromJSON(t){return new Ot(Vt(),t.bounce)}clone(){return new Ot(this.resolver,this.bounce)}reset(){}}class Ct{constructor(t){this.value=t,this.type="value"}startGen(t){}genValue(t){return this.value}toJSON(){return{type:"ConstantValue",value:this.value}}static fromJSON(t){return new Ct(t.value)}clone(){return new Ct(this.value)}}class Ft{constructor(t,e){this.a=t,this.b=e,this.indexCount=-1,this.type="value"}startGen(t){this.indexCount=t.length,t.push(S())}genValue(t){return-1===this.indexCount&&this.startGen(t),X.lerp(this.a,this.b,t[this.indexCount])}toJSON(){return{type:"IntervalValue",a:this.a,b:this.b}}static fromJSON(t){return new Ft(t.a,t.b)}clone(){return new Ft(this.a,this.b)}}class Bt{constructor(t,e,i,s){this.p=[t,e,i,s]}genValue(t){const e=this.p,i=t*t,s=1-t,r=s*s;return e[0]*r*s+e[1]*r*t*3+e[2]*s*i*3+e[3]*i*t}derivativeCoefficients(t){const e=[];for(let i=t,s=i.length-1;s>0;s--){const t=[];for(let e=0;e<s;e++){const r=s*(i[e+1]-i[e]);t.push(r)}e.push(t),i=t}return e}getSlope(t){const e=this.derivativeCoefficients(this.p)[0],i=1-t,s=i*t*2,r=t*t;return i*i*e[0]+s*e[1]+r*e[2]}controlCurve(t,e){this.p[1]=t/3+this.p[0],this.p[2]=this.p[3]-e/3}hull(t){let e,i=this.p,s=[],r=0,n=0,o=0;const a=[];for(a[r++]=i[0],a[r++]=i[1],a[r++]=i[2],a[r++]=i[3];i.length>1;){for(s=[],n=0,o=i.length-1;n<o;n++)e=t*i[n]+(1-t)*i[n+1],a[r++]=e,s.push(e);i=s}return a}split(t){const e=this.hull(t);return{left:new Bt(e[0],e[4],e[7],e[9]),right:new Bt(e[9],e[8],e[6],e[3]),span:e}}clone(){return new Bt(this.p[0],this.p[1],this.p[2],this.p[3])}toJSON(){return{p0:this.p[0],p1:this.p[1],p2:this.p[2],p3:this.p[3]}}static fromJSON(t){return new Bt(t.p0,t.p1,t.p2,t.p3)}}class At{constructor(){this.functions=new Array}findFunction(t){const e=this.functions,i=e.length-1;if(i<=0)return 0===i&&t>=e[0][1]&&t<=1?0:-1;let s=0,r=i;for(;s+1<r;){const i=s+r>>1;if(t<e[i][1])r=i-1;else{if(!(t>this.getEndX(i)))return i;s=i+1}}for(let i=s;i<=r;i++)if(t>=e[i][1]&&t<=this.getEndX(i))return i;return-1}getStartX(t){return this.functions[t][1]}setStartX(t,e){t>0&&(this.functions[t][1]=e)}getEndX(t){return t+1<this.functions.length?this.functions[t+1][1]:1}setEndX(t,e){t+1<this.functions.length&&(this.functions[t+1][1]=e)}insertFunction(t,e){const i=this.findFunction(t);this.functions.splice(i+1,0,[e,t])}removeFunction(t){return this.functions.splice(t,1)[0][0]}getFunction(t){return this.functions[t][0]}setFunction(t,e){this.functions[t][0]=e}get numOfFunctions(){return this.functions.length}}class $t extends At{constructor(t=[[new Bt(0,1/3,1/3*2,1),0]]){super(),this.table=null,this.tableSignature=null,this.type="function",this.functions=t}refreshTable(){const t=this.functions,e=t.length;if(0===e)return this.table=null,void(this.tableSignature=null);const i=5*e;let s=this.tableSignature,r=null===s||s.length!==i;r&&(s=new Float64Array(i));for(let i=0,n=0;i<e;i++,n+=5){const e=t[i][0].p,o=t[i][1];r||(r=s[n]!==e[0]||s[n+1]!==e[1]||s[n+2]!==e[2]||s[n+3]!==e[3]||s[n+4]!==o),r&&(s[n]=e[0],s[n+1]=e[1],s[n+2]=e[2],s[n+3]=e[3],s[n+4]=o)}if(!r&&null!==this.table)return;this.tableSignature=s;const n=$t.TABLE_SIZE,o=null!==this.table&&this.table.length===n?this.table:new Float32Array(n),a=1/(n-1);for(let t=0;t<n;t++)o[t]=this.genValueExact(t*a);this.table=o}sampledTable(){return this.table}clearTable(){this.table=null,this.tableSignature=null}genValue(t,e=0){const i=this.table;if(null!==i){const t=i.length-1;if(e<=0)return i[0];if(e>=1)return i[t];const s=e*t,r=0|s,n=s-r,o=i[r];return o+(i[r+1]-o)*n}return this.genValueExact(e)}genValueExact(t){const e=this.functions,i=e.length;if(0===i)return 0;const s=this.findFunction(t);if(-1===s)return t<e[0][1]?e[0][0].genValue(0):e[i-1][0].genValue(1);const r=e[s][1],n=(s+1<i?e[s+1][1]:1)-r;return e[s][0].genValue(n>0?(t-r)/n:0)}toSVG(t,e){if(e<1)return"";let i=["M",0,this.functions[0][0].p[0]].join(" ");for(let s=1/e;s<=1;s+=1/e)i=[i,"L",s*t,this.genValue(void 0,s)].join(" ");return i}toJSON(){return{type:"PiecewiseBezier",functions:this.functions.map(([t,e])=>({function:t.toJSON(),start:e}))}}static fromJSON(t){return new $t(t.functions.map(t=>[Bt.fromJSON(t.function),t.start]))}clone(){return new $t(this.functions.map(([t,e])=>[t.clone(),e]))}startGen(t){}}function It(t){switch(t.type){case"ConstantValue":return Ct.fromJSON(t);case"IntervalValue":return Ft.fromJSON(t);case"PiecewiseBezier":return $t.fromJSON(t);default:return new Ct(0)}}$t.TABLE_SIZE=257;class Et{constructor(t,e){this.axis=t,this.angle=e,this.type="rotation"}startGen(t){this.angle.startGen(t)}genValue(t,e,i,s){return e.setFromAxisAngle(this.axis,this.angle.genValue(t,s)*i)}toJSON(){return{type:"AxisAngle",axis:{x:this.axis.x,y:this.axis.y,z:this.axis.z},angle:this.angle.toJSON()}}static fromJSON(t){return new Et(new H(t.axis.x,t.axis.y,t.axis.z),It(t.angle))}clone(){return new Et(this.axis.clone(),this.angle.clone())}}const Nt=t=>({r:t.x,g:t.y,b:t.z,a:t.w}),Lt=t=>new zt(t.r,t.g,t.b,t.a),Rt=(t,e)=>{switch(e){case"Vector3":return new H(t.x,t.y,t.z);case"Vector4":return new zt(t.x,t.y,t.z,t.w);case"Color":return new H(t.r,t.g,t.b);default:return t}},Dt=(t,e)=>{switch(e){case"Vector3":return{x:t.x,y:t.y,z:t.z};case"Vector4":return{x:t.x,y:t.y,z:t.z,w:t.w};case"Color":return{r:t.x,g:t.y,b:t.z};default:return t}};class Ut{constructor(t,e){this.a=t,this.b=e,this.indexCount=-1,this.type="value"}startGen(t){this.indexCount=t.length,t.push(S())}genColor(t,e){return-1===this.indexCount&&this.startGen(t),e.copy(this.a).lerp(this.b,t[this.indexCount])}toJSON(){return{type:"ColorRange",a:Nt(this.a),b:Nt(this.b)}}static fromJSON(t){return new Ut(Lt(t.a),Lt(t.b))}clone(){return new Ut(this.a.clone(),this.b.clone())}}class qt{constructor(t,e){this.subType=e,this.type="function",this.keys=t}findKey(t){const e=this.keys,i=e.length-1;if(i<=0)return 0===i&&t>=e[0][1]&&t<=1?0:-1;if(1===i)return t<e[0][1]||t>1?-1:t<=e[1][1]?0:1;let s=0,r=i;for(;s+1<r;){const i=s+r>>1;if(t<e[i][1])r=i-1;else{if(!(t>this.getEndX(i)))return i;s=i+1}}for(let i=s;i<=r;i++)if(t>=e[i][1]&&t<=this.getEndX(i))return i;return-1}getStartX(t){return this.keys[t][1]}getEndX(t){return t+1<this.keys.length?this.keys[t+1][1]:1}genValue(t,e){const i=this.keys,s=this.findKey(e),r=i.length-1;if("Number"===this.subType){if(-1===s)return i[0][0];if(s>=r)return i[r][0];const t=i[s][1],n=i[s][0],o=i[s+1][1]-t;return(i[s+1][0]-n)*(o>0?(e-t)/o:0)+n}{if(-1===s)return t.copy(i[0][0]);if(s>=r)return t.copy(i[r][0]);const n=i[s][1],o=i[s+1][1]-n;return t.copy(i[s][0]).lerp(i[s+1][0],o>0?(e-n)/o:0)}}toJSON(){return this.keys[0][0].constructor.name,{type:"CLinearFunction",subType:this.subType,keys:this.keys.map(([t,e])=>({value:Dt(t,this.subType),pos:e}))}}static fromJSON(t){return new qt(t.keys.map(e=>[Rt(e.value,t.subType),e.pos]),t.subType)}clone(){return"Number"===this.subType?new qt(this.keys.map(([t,e])=>[t,e]),this.subType):new qt(this.keys.map(([t,e])=>[t.clone(),e]),this.subType)}}const kt=new zt;class Jt{constructor(t=[[new H(0,0,0),0],[new H(1,1,1),0]],e=[[1,0],[1,1]]){this.table=null,this.tableSignature=null,this.type="function",this.color=new qt(t,"Color"),this.alpha=new qt(e,"Number")}refreshTable(){const t=this.color.keys,e=this.alpha.keys,i=4*t.length+2*e.length;let s=this.tableSignature,r=null===s||s.length!==i;r&&(s=new Float64Array(i));let n=0;for(let e=0;e<t.length;e++,n+=4){const i=t[e][0],o=t[e][1];r||(r=s[n]!==i.x||s[n+1]!==i.y||s[n+2]!==i.z||s[n+3]!==o),r&&(s[n]=i.x,s[n+1]=i.y,s[n+2]=i.z,s[n+3]=o)}for(let t=0;t<e.length;t++,n+=2){const i=e[t][0],o=e[t][1];r||(r=s[n]!==i||s[n+1]!==o),r&&(s[n]=i,s[n+1]=o)}if(!r&&null!==this.table)return;this.tableSignature=s;const o=Jt.TABLE_SIZE,a=null!==this.table&&this.table.length===4*o?this.table:new Float32Array(4*o),h=1/(o-1),l=kt;for(let t=0;t<o;t++){this.genColorExact(l,t*h);const e=4*t;a[e]=l.x,a[e+1]=l.y,a[e+2]=l.z,a[e+3]=l.w}this.table=a}sampledTable(){return this.table}clearTable(){this.table=null,this.tableSignature=null}genColor(t,e,i){const s=this.table;if(null!==s){const t=Jt.TABLE_SIZE-1;if(i<=0)return e.x=s[0],e.y=s[1],e.z=s[2],e.w=s[3],e;if(i>=1){const i=4*t;return e.x=s[i],e.y=s[i+1],e.z=s[i+2],e.w=s[i+3],e}const r=i*t,n=0|r,o=r-n,a=4*n,h=a+4;return e.x=s[a]+(s[h]-s[a])*o,e.y=s[a+1]+(s[h+1]-s[a+1])*o,e.z=s[a+2]+(s[h+2]-s[a+2])*o,e.w=s[a+3]+(s[h+3]-s[a+3])*o,e}return this.genColorExact(e,i)}genColorExact(t,e){const i=this.color.keys,s=i.length-1,r=this.color.findKey(e);let n,o,a;if(-1===r||r>=s){const t=i[-1===r?0:s][0];n=t.x,o=t.y,a=t.z}else{const t=i[r][0],s=i[r+1][0],h=i[r][1],l=i[r+1][1]-h,c=l>0?(e-h)/l:0;n=t.x+(s.x-t.x)*c,o=t.y+(s.y-t.y)*c,a=t.z+(s.z-t.z)*c}const h=this.alpha.keys,l=h.length-1,c=this.alpha.findKey(e);let u;if(-1===c||c>=l)u=h[-1===c?0:l][0];else{const t=h[c][1],i=h[c][0],s=h[c+1][1]-t;u=i+(h[c+1][0]-i)*(s>0?(e-t)/s:0)}return t.x=n,t.y=o,t.z=a,t.w=u,t}toJSON(){return{type:"Gradient",color:this.color.toJSON(),alpha:this.alpha.toJSON()}}static fromJSON(t){if(t.functions){const e=t.functions.map(t=>[Ut.fromJSON(t.function).a,t.start]);return t.functions.length>0&&e.push([Ut.fromJSON(t.functions[t.functions.length-1].function).b,1]),new Jt(e.map(t=>[new H(t[0].x,t[0].y,t[0].z),t[1]]),e.map(t=>[t[0].w,t[1]]))}{const e=new Jt;return e.alpha=qt.fromJSON(t.alpha),e.color=qt.fromJSON(t.color),e}}clone(){const t=new Jt;return t.alpha=this.alpha.clone(),t.color=this.color.clone(),t}startGen(t){}}Jt.TABLE_SIZE=257;class Qt{constructor(t,e){this.a=t,this.b=e,this.type="value"}startGen(t){}genColor(t,e){const i=S();return e.copy(this.a).lerp(this.b,i)}toJSON(){return{type:"RandomColor",a:Nt(this.a),b:Nt(this.b)}}static fromJSON(t){return new Qt(Lt(t.a),Lt(t.b))}clone(){return new Qt(this.a.clone(),this.b.clone())}}const Gt=new zt;class Wt{constructor(t,e){this.indexCount=0,this.type="function",this.gradient1=t,this.gradient2=e}startGen(t){this.indexCount=t.length,t.push(S())}genColor(t,e,i){return this.gradient1.genColor(t,e,i),this.gradient2.genColor(t,Gt,i),t&&void 0!==t[this.indexCount]?e.lerp(Gt,t[this.indexCount]):e.lerp(Gt,S()),e}toJSON(){return{type:"RandomColorBetweenGradient",gradient1:this.gradient1.toJSON(),gradient2:this.gradient2.toJSON()}}static fromJSON(t){return new Wt(Jt.fromJSON(t.gradient1),Jt.fromJSON(t.gradient2))}clone(){return new Wt(this.gradient1.clone(),this.gradient2.clone())}}class jt{constructor(t){this.color=t,this.type="value"}startGen(t){}genColor(t,e){return e.copy(this.color)}toJSON(){return{type:"ConstantColor",color:Nt(this.color)}}static fromJSON(t){return new jt(Lt(t.color))}clone(){return new jt(this.color.clone())}}function Yt(t){switch(t.type){case"ConstantColor":return jt.fromJSON(t);case"ColorRange":return Ut.fromJSON(t);case"RandomColor":return Qt.fromJSON(t);case"Gradient":return Jt.fromJSON(t);case"RandomColorBetweenGradient":return Wt.fromJSON(t);default:return new jt(new zt(1,1,1,1))}}class Xt{constructor(t,e,i,s){this.angleX=t,this.angleY=e,this.angleZ=i,this.type="rotation",this.eular=new pt(0,0,0,s)}startGen(t){this.angleX.startGen(t),this.angleY.startGen(t),this.angleZ.startGen(t)}genValue(t,e,i,s){return this.eular.set(this.angleX.genValue(t,s)*i,this.angleY.genValue(t,s)*i,this.angleZ.genValue(t,s)*i),e.setFromEuler(this.eular)}toJSON(){return{type:"Euler",angleX:this.angleX.toJSON(),angleY:this.angleY.toJSON(),angleZ:this.angleZ.toJSON(),eulerOrder:this.eular.order}}static fromJSON(t){return new Xt(It(t.angleX),It(t.angleY),It(t.angleZ),t.eulerOrder)}clone(){return new Xt(this.angleX,this.angleY,this.angleZ,this.eular.order)}}class Zt{constructor(){this.indexCount=0,this.type="rotation"}startGen(t){let e,i,s,r,n,o;this.indexCount=t.length;do{e=2*S()-1,i=2*S()-1,s=e*e+i*i}while(s>1);do{r=2*S()-1,n=2*S()-1,o=r*r+n*n}while(o>1);const a=Math.sqrt((1-s)/o);t.push(e,i,a*r,a*n)}genValue(t,e,i,s){-1===this.indexCount&&this.startGen(t);const r=this.indexCount;return e.set(t[r],t[r+1],t[r+2],t[r+3]),e}toJSON(){return{type:"RandomQuat"}}static fromJSON(t){return new Zt}clone(){return new Zt}}function Ht(t){switch(t.type){case"AxisAngle":return Et.fromJSON(t);case"Euler":return Xt.fromJSON(t);case"RandomQuat":return Zt.fromJSON(t);default:return new Zt}}class Kt{constructor(t,e,i){this.x=t,this.y=e,this.z=i,this.type="vec3function"}startGen(t){this.x.startGen(t),this.y.startGen(t),this.z.startGen(t)}genValue(t,e,i){return e.set(this.x.genValue(t,i),this.y.genValue(t,i),this.z.genValue(t,i))}toJSON(){return{type:"Vector3Function",x:this.x.toJSON(),y:this.y.toJSON(),z:this.z.toJSON()}}static fromJSON(t){return new Kt(It(t.x),It(t.y),It(t.z))}clone(){return new Kt(this.x,this.y,this.z)}}function te(t){return"Vector3Function"===t.type?Kt.fromJSON(t):new Kt(new Ct(0),new Ct(0),new Ct(0))}function ee(t){switch(t.type){case"ConstantValue":case"IntervalValue":case"PiecewiseBezier":return It(t);case"AxisAngle":case"RandomQuat":case"Euler":return Ht(t);case"Vector3Function":return te(t);default:return new Ct(0)}}class ie{constructor(t,e){this.direction=t,this.magnitude=e,this.type="ApplyForce",this.memory={data:[],dataCount:0},this.magnitudeValue=this.magnitude.genValue(this.memory)}initialize(t){}update(t,e){const i=this.magnitudeValue*e,s=this.direction,r=t.velocity;r.x+=s.x*i,r.y+=s.y*i,r.z+=s.z*i}updateAll(t,e,i){const s=this.magnitudeValue*i,r=this.direction.x*s,n=this.direction.y*s,o=this.direction.z*s;for(let i=0;i<e;i++){const e=t[i];if(e.age>=e.life)continue;const s=e.velocity;s.x+=r,s.y+=n,s.z+=o}}frameUpdate(t){this.magnitudeValue=this.magnitude.genValue(this.memory)}toJSON(){return{type:this.type,direction:[this.direction.x,this.direction.y,this.direction.z],magnitude:this.magnitude.toJSON()}}static fromJSON(t){return new ie(new H(t.direction[0],t.direction[1],t.direction[2]),It(t.magnitude??t.force))}clone(){return new ie(this.direction.clone(),this.magnitude.clone())}reset(){}}class se{constructor(t=0,e=0,i=new H){this.scaleX=t,this.scaleY=e,this.position=i,this.locations=[]}transform(t,e){t.x=this.locations[e%this.locations.length].x*this.scaleX+this.position.x,t.y=this.locations[e%this.locations.length].y*this.scaleY+this.position.y,t.z=this.position.z}static fromJSON(t){const e=new se(t.scaleX,t.scaleY,new H(t.position[0],t.position[1],t.position[2]));return e.locations=t.locations.map(t=>new xt(t.x,t.y)),e}clone(){const t=new se(this.scaleX,this.scaleY,this.position.clone());return t.locations=this.locations.map(t=>t.clone()),t}toJSON(){return{scaleX:this.scaleX,scaleY:this.scaleY,position:this.position,locations:this.locations.map(t=>({x:t.x,y:t.y}))}}fromImage(t,e){const i=document.createElement("canvas");i.width=t.width,i.height=t.height;const s=i.getContext("2d");if(!s)return;s.drawImage(t,0,0);const r=s.getImageData(0,0,i.width,i.height,{colorSpace:"srgb"});i.remove(),this.locations.length=0;for(let t=0;t<r.height;t++)for(let i=0;i<r.width;i++)r.data[4*(t*r.width+i)+3]>e&&this.locations.push(new xt(i,r.height-t))}}function re(t){return"TextureSequencer"===t.type?se.fromJSON(t):new se}class ne{constructor(t){this.type="ApplySequences",this.sequencers=[],this.time=0,this.index=0,this.pCount=0,this.tempV=new H,this.delay=t}initialize(t){t.id=this.pCount,t.dst=new H,t.begin=new H,t.inMotion=!1,this.pCount++}reset(){this.time=0,this.index=0,this.pCount=0}update(t,e){const i=this.sequencers[this.index];if(void 0===i)return;const s=t.id*this.delay;this.time>=i[0].a+s&&this.time<=i[0].b+s?(t.inMotion||(t.inMotion=!0,t.begin.copy(t.position),i[1].transform(t.dst,t.id)),t.position.lerpVectors(t.begin,t.dst,ne.BEZIER.genValue((this.time-i[0].a-s)/(i[0].b-i[0].a)))):this.time>i[0].b+s&&(t.inMotion=!1)}frameUpdate(t){for(;this.index+1<this.sequencers.length&&this.time>=this.sequencers[this.index+1][0].a;)this.index++;this.time+=t}appendSequencer(t,e){this.sequencers.push([t,e])}toJSON(){return{type:this.type,delay:this.delay,sequencers:this.sequencers.map(([t,e])=>({range:t.toJSON(),sequencer:e.toJSON()}))}}static fromJSON(t){const e=new ne(t.delay);return t.sequencers.forEach(t=>{e.sequencers.push([It(t.range),re(t.sequencer)])}),e}clone(){const t=new ne(this.delay);return t.sequencers=this.sequencers.map(t=>[t[0].clone(),t[1].clone()]),t}}ne.BEZIER=new Bt(0,0,1,1);class oe{constructor(t){this.angle=t,this.type="ChangeEmitDirection",this._temp=new H,this._q=new Z,this.memory={data:[],dataCount:0}}initialize(t){const e=t.velocity.length();0!=e&&(t.velocity.normalize(),0===t.velocity.x&&0===t.velocity.y?this._temp.set(0,t.velocity.z,0):this._temp.set(-t.velocity.y,t.velocity.x,0),this.angle.startGen(this.memory),this._q.setFromAxisAngle(this._temp.normalize(),this.angle.genValue(this.memory)),this._temp.copy(t.velocity),t.velocity.applyQuaternion(this._q),this._q.setFromAxisAngle(this._temp,S()*Math.PI*2),t.velocity.applyQuaternion(this._q),t.velocity.setLength(e))}update(t,e){}frameUpdate(t){}toJSON(){return{type:this.type,angle:this.angle.toJSON()}}static fromJSON(t){return new oe(It(t.angle))}clone(){return new oe(this.angle)}reset(){}}class ae{constructor(t,e){this.color=t,this.speedRange=e,this.type="ColorBySpeed"}initialize(t){this.color.startGen(t.memory)}update(t,e){const i=(t.startSpeed-this.speedRange.a)/(this.speedRange.b-this.speedRange.a);this.color.genColor(t.memory,t.color,i),t.color.x*=t.startColor.x,t.color.y*=t.startColor.y,t.color.z*=t.startColor.z,t.color.w*=t.startColor.w}frameUpdate(t){}toJSON(){return{type:this.type,color:this.color.toJSON(),speedRange:this.speedRange.toJSON()}}static fromJSON(t){return new ae(Yt(t.color),Ft.fromJSON(t.speedRange))}clone(){return new ae(this.color.clone(),this.speedRange.clone())}reset(){}}class he{constructor(t){this.color=t,this.type="ColorOverLife"}initialize(t){this.color.startGen(t.memory)}update(t,e){const i=t.color,s=t.startColor;this.color.genColor(t.memory,i,t.age/t.life),i.x*=s.x,i.y*=s.y,i.z*=s.z,i.w*=s.w}updateAll(t,e,i){const s=this.color;for(let i=0;i<e;i++){const e=t[i];if(e.age>=e.life)continue;const r=e.color,n=e.startColor;s.genColor(e.memory,r,e.age/e.life),r.x*=n.x,r.y*=n.y,r.z*=n.z,r.w*=n.w}}frameUpdate(t){this.color.refreshTable?.()}toJSON(){return{type:this.type,color:this.color.toJSON()}}static fromJSON(t){return new he(Yt(t.color))}clone(){return new he(this.color.clone())}reset(){}}function le(t,e){return Math.floor(S()*(e-t))+t}const ce=new H(0,1,0),ue=new H(0,0,0),de=new H(1,1,1),pe=new H(0,0,1);var fe;exports.SubParticleEmitMode=void 0,(fe=exports.SubParticleEmitMode||(exports.SubParticleEmitMode={}))[fe.Death=0]="Death",fe[fe.Birth=1]="Birth",fe[fe.Frame=2]="Frame";const me={color:1,size:2,rotation:4,lifetime:8};function ye(t){let e=0;for(const i of t)e|=me[i]??0;return e}class ve{constructor(t,e,i,s=exports.SubParticleEmitMode.Frame,r=1,n=[]){this.particleSystem=t,this.useVelocityAsBasis=e,this.subParticleSystem=i,this.mode=s,this.emitProbability=r,this.inherit=n,this.type="EmitSubParticleSystem",this.q_=new Z,this.v_=new H,this.v2_=new H,this.subEmissions=new Array,this.spareEmissions=new Array;const o=this.target;o&&(o.onlyUsedByOther=!0)}initialize(t){}update(t,e){(this.mode===exports.SubParticleEmitMode.Frame||this.mode===exports.SubParticleEmitMode.Birth&&0===t.age||this.mode===exports.SubParticleEmitMode.Death&&t.age+e>=t.life)&&this.emit(t,e)}get target(){const t=this.subParticleSystem;if(null!==t&&"object"==typeof t)return t.system}emit(t,e){if(!this.target)return;if(S()>this.emitProbability)return;const i=this.spareEmissions.pop(),s=void 0!==i?i:{burstParticleCount:0,burstParticleIndex:0,isBursting:!1,burstIndex:0,burstWaveIndex:0,time:0,waitEmiting:0,matrix:new st,travelDistance:0,particle:void 0,previousWorldPos:void 0};s.burstParticleCount=0,s.burstParticleIndex=0,s.isBursting=!1,s.burstIndex=0,s.burstWaveIndex=0,s.time=0,s.waitEmiting=0,s.travelDistance=0,s.particle=t,s.inherit=ye(this.inherit),s.previousWorldPos=void 0,this.setMatrixFromParticle(s.matrix,t),this.subEmissions.push(s)}frameUpdate(t){const e=this.target;if(e)for(let i=0;i<this.subEmissions.length;i++)if(this.subEmissions[i].time>=e.duration){const t=this.subEmissions[i];t.particle=void 0,this.spareEmissions.push(t),this.subEmissions[i]=this.subEmissions[this.subEmissions.length-1],this.subEmissions.length=this.subEmissions.length-1,i--}else{const s=this.subEmissions[i];s.particle&&s.particle.age<s.particle.life?this.setMatrixFromParticle(s.matrix,s.particle):s.particle=void 0,e.emit(t,s,s.matrix)}else this.subEmissions.length=0}toJSON(){return{type:this.type,subParticleSystem:"string"==typeof this.subParticleSystem?this.subParticleSystem:this.subParticleSystem?this.subParticleSystem.uuid:"",useVelocityAsBasis:this.useVelocityAsBasis,mode:this.mode,emitProbability:this.emitProbability,...this.inherit.length>0?{inherit:this.inherit.slice()}:{}}}static fromJSON(t,e){return new ve(e,t.useVelocityAsBasis,t.subParticleSystem,t.mode,t.emitProbability,ve.validInherit(t.inherit))}clone(){return new ve(this.particleSystem,this.useVelocityAsBasis,this.subParticleSystem,this.mode,this.emitProbability,this.inherit.slice())}reset(){}static validInherit(t){return Array.isArray(t)?t.filter(t=>t in me):[]}setMatrixFromParticle(t,e){let i;if(void 0===e.rotation||this.useVelocityAsBasis)if(0!==e.velocity.x||0!==e.velocity.y||1!==e.velocity.z&&0!==e.velocity.z){this.v_.copy(pe).cross(e.velocity),this.v2_.copy(e.velocity).cross(this.v_);const i=this.v_.length(),s=this.v2_.length();t.set(this.v_.x/i,this.v2_.x/s,e.velocity.x,e.position.x,this.v_.y/i,this.v2_.y/s,e.velocity.y,e.position.y,this.v_.z/i,this.v2_.z/s,e.velocity.z,e.position.z,0,0,0,1)}else t.set(1,0,0,e.position.x,0,1,0,e.position.y,0,0,1,e.position.z,0,0,0,1);else e.rotation instanceof Z?i=e.rotation:(this.q_.setFromAxisAngle(pe,e.rotation),i=this.q_),t.compose(e.position,i,de);this.particleSystem.worldSpace||t.multiplyMatrices(this.particleSystem.emitter.matrixWorld,t)}}class ge{initialize(t,e){this.ps=e,this.x.startGen(t.memory),this.y.startGen(t.memory),this.z.startGen(t.memory)}constructor(t,e,i){this.x=t,this.y=e,this.z=i,this.type="ForceOverLife",this._temp=new H,this._tempScale=new H,this._tempQ=new Z}update(t,e){this._temp.set(this.x.genValue(t.memory,t.age/t.life),this.y.genValue(t.memory,t.age/t.life),this.z.genValue(t.memory,t.age/t.life)),void 0===this.ps||this.ps.worldSpace||this._temp.multiply(this._tempScale).applyQuaternion(this._tempQ),t.velocity.addScaledVector(this._temp,e)}updateAll(t,e,i){const s=this.ps;if(void 0===s)return;const r=this._temp,n=this.x,o=this.y,a=this.z,h=s.worldSpace;for(let s=0;s<e;s++){const e=t[s];if(e.age>=e.life)continue;const l=e.memory,c=e.age/e.life;r.set(n.genValue(l,c),o.genValue(l,c),a.genValue(l,c)),h||r.multiply(this._tempScale).applyQuaternion(this._tempQ),e.velocity.addScaledVector(r,i)}}toJSON(){return{type:this.type,x:this.x.toJSON(),y:this.y.toJSON(),z:this.z.toJSON()}}static fromJSON(t){return new ge(It(t.x),It(t.y),It(t.z))}frameUpdate(t){if(this.ps&&!this.ps.worldSpace){const t=this._temp,e=this._tempQ,i=this._tempScale;this.ps.emitter.matrixWorld.decompose(t,e,i),e.invert(),i.set(1/i.x,1/i.y,1/i.z)}}clone(){return new ge(this.x.clone(),this.y.clone(),this.z.clone())}reset(){}}class xe{constructor(t){this.type="FrameOverLife",this.frame=t}get frame(){return this._frame}set frame(t){this._frame=t}initialize(t){this._frame.startGen(t.memory)}update(t,e){t.uvTile=this.sampleFrame(t,t.age/t.life)}updateAll(t,e,i){for(let i=0;i<e;i++){const e=t[i];e.age>=e.life||(e.uvTile=this.sampleFrame(e,e.age/e.life))}}sampleFrame(t,e){return"function"===this._frame.type?this._frame.genValue(t.memory,e):this._frame.genValue(t.memory)}frameUpdate(t){this._frame.refreshTable?.()}toJSON(){return{type:this.type,frame:this.frame.toJSON()}}static fromJSON(t){return new xe(It(t.frame))}clone(){return new xe(this.frame.clone())}reset(){}}class Se{constructor(t,e){this.center=t,this.magnitude=e,this.type="GravityForce",this.temp=new H}initialize(t){}update(t,e){const i=t.position.distanceToSquared(this.center);0!==i&&(this.temp.copy(this.center).sub(t.position).normalize(),t.velocity.addScaledVector(this.temp,this.magnitude/i*e))}updateAll(t,e,i){const s=this.center.x,r=this.center.y,n=this.center.z,o=this.magnitude*i;for(let i=0;i<e;i++){const e=t[i];if(e.age>=e.life)continue;const a=e.position,h=s-a.x,l=r-a.y,c=n-a.z,u=h*h+l*l+c*c;if(0===u)continue;const d=o/(u*Math.sqrt(u)),p=e.velocity;p.x+=h*d,p.y+=l*d,p.z+=c*d}}frameUpdate(t){}toJSON(){return{type:this.type,center:[this.center.x,this.center.y,this.center.z],magnitude:this.magnitude}}static fromJSON(t){return new Se(new H(t.center[0],t.center[1],t.center[2]),t.magnitude)}clone(){return new Se(this.center.clone(),this.magnitude)}reset(){}}class we{constructor(t=new Ct(1),e="initial"){this.multiplier=t,this.mode=e,this.type="InheritVelocity",this._temp=new H,this._tempPos=new H,this._tempQInv=new Z,this._tempScaleInv=new H(1,1,1)}initialize(t,e){this.ps=e,this.multiplier.startGen(t.memory),"initial"===this.mode&&e.emitterVelocity&&(this._temp.copy(e.emitterVelocity),e.worldSpace||(this.decomposeInverse(e),this._temp.multiply(this._tempScaleInv).applyQuaternion(this._tempQInv)),t.velocity.addScaledVector(this._temp,this.multiplier.genValue(t.memory,0)))}frameUpdate(t){this.ps&&!this.ps.worldSpace&&this.decomposeInverse(this.ps)}update(t,e){"current"===this.mode&&void 0!==this.ps&&this.ps.emitterVelocity&&(this._temp.copy(this.ps.emitterVelocity),this.ps.worldSpace||this._temp.multiply(this._tempScaleInv).applyQuaternion(this._tempQInv),t.position.addScaledVector(this._temp,this.multiplier.genValue(t.memory,t.age/t.life)*e))}decomposeInverse(t){t.emitter.matrixWorld.decompose(this._tempPos,this._tempQInv,this._tempScaleInv),this._tempQInv.invert(),this._tempScaleInv.set(1/this._tempScaleInv.x,1/this._tempScaleInv.y,1/this._tempScaleInv.z)}toJSON(){return{type:this.type,multiplier:this.multiplier.toJSON(),mode:this.mode}}static fromJSON(t){return new we(t.multiplier?It(t.multiplier):new Ct(1),"current"===t.mode?"current":"initial")}clone(){return new we(this.multiplier.clone(),this.mode)}reset(){}}class be{initialize(t){this.speed.startGen(t.memory)}constructor(t,e){this.speed=t,this.dampen=e,this.type="LimitSpeedOverLife"}update(t,e){let i=t.velocity.length(),s=this.speed.genValue(t.memory,t.age/t.life);if(i>s){const r=(i-s)/i;t.velocity.multiplyScalar(1-r*this.dampen*e*20)}}updateAll(t,e,i){const s=this.speed,r=this.dampen*i*20;for(let i=0;i<e;i++){const e=t[i];if(e.age>=e.life)continue;const n=e.velocity,o=n.length(),a=s.genValue(e.memory,e.age/e.life);o>a&&n.multiplyScalar(1-(o-a)/o*r)}}toJSON(){return{type:this.type,speed:this.speed.toJSON(),dampen:this.dampen}}static fromJSON(t){return new be(It(t.speed),t.dampen)}frameUpdate(t){this.speed.refreshTable?.()}clone(){return new be(this.speed.clone(),this.dampen)}reset(){}}class ze{constructor(t=64){this.previousVelocity=ze.EMPTY,this.rotationQuaternion=ze.EMPTY,this.angularVelocityQuaternion=ze.EMPTY,this.memory=new Float64Array(0),this.memoryStride=0,this.capacity=Math.max(1,t),this.position=new Float32Array(3*this.capacity),this.previousPosition=new Float32Array(3*this.capacity),this.previousSize=new Float32Array(3*this.capacity),this.previousColor=new Float32Array(4*this.capacity),this.velocity=new Float32Array(3*this.capacity),this.size=new Float32Array(3*this.capacity),this.startSize=new Float32Array(3*this.capacity),this.color=new Float32Array(4*this.capacity),this.startColor=new Float32Array(4*this.capacity),this.scalars=new Float64Array(this.capacity*ze.SCALAR_STRIDE),this.rotation=new Float32Array(this.capacity),this.angularVelocity=new Float32Array(this.capacity),this.uvTile=new Float32Array(this.capacity),this.startSpeed=new Float32Array(this.capacity),this.flip=new Uint8Array(this.capacity)}ensureCapacity(t){if(t<=this.capacity)return!1;let e=this.capacity;for(;e<t;)e*=2;this.position=ze.grow(this.position,3*e),this.previousPosition=ze.grow(this.previousPosition,3*e);const i=this.previousSize===this.size,s=this.previousColor===this.color;if(i||(this.previousSize=ze.grow(this.previousSize,3*e)),this.previousVelocity.length>0&&(this.previousVelocity=ze.grow(this.previousVelocity,3*e)),this.rotationQuaternion.length>0){const t=this.rotationQuaternion.length;this.rotationQuaternion=ze.grow(this.rotationQuaternion,4*e),this.angularVelocityQuaternion=ze.grow(this.angularVelocityQuaternion,4*e);for(let i=t+3;i<4*e;i+=4)this.rotationQuaternion[i]=1,this.angularVelocityQuaternion[i]=1}if(s||(this.previousColor=ze.grow(this.previousColor,4*e)),this.velocity=ze.grow(this.velocity,3*e),this.size=ze.grow(this.size,3*e),this.startSize=ze.grow(this.startSize,3*e),this.color=ze.grow(this.color,4*e),i&&(this.previousSize=this.size),s&&(this.previousColor=this.color),this.startColor=ze.grow(this.startColor,4*e),this.scalars=ze.growDouble(this.scalars,e*ze.SCALAR_STRIDE),this.memoryStride>0){const t=new Float64Array(e*this.memoryStride);t.fill(NaN),t.set(this.memory),this.memory=t}this.rotation=ze.grow(this.rotation,e),this.angularVelocity=ze.grow(this.angularVelocity,e),this.uvTile=ze.grow(this.uvTile,e),this.startSpeed=ze.grow(this.startSpeed,e);const r=new Uint8Array(e);return r.set(this.flip),this.flip=r,this.capacity=e,!0}keepPreviousVelocity(){return!(this.previousVelocity.length>=3*this.capacity)&&(this.previousVelocity=new Float32Array(3*this.capacity),!0)}recordMemory(t,e){const i=e.length;let s=this.memoryStride;if(i>s||this.memory.length<this.capacity*s){s=Math.max(s,i);const t=new Float64Array(this.capacity*s);t.fill(NaN);const e=this.memoryStride,r=this.memory,n=e>0?r.length/e:0;for(let i=0,o=0,a=0;i<n;i++,o+=e,a+=s)for(let i=0;i<e;i++)t[a+i]=r[o+i];this.memory=t,this.memoryStride=s}const r=t*s;for(let t=0;t<s;t++){const s=t<i?e[t]:void 0;this.memory[r+t]="number"==typeof s?s:NaN}}useSizeSnapshot(t){t?this.previousSize===this.size&&(this.previousSize=new Float32Array(this.size)):this.previousSize=this.size}useColorSnapshot(t){t?this.previousColor===this.color&&(this.previousColor=new Float32Array(this.color)):this.previousColor=this.color}ensureQuaternionColumns(){if(this.rotationQuaternion.length>=4*this.capacity)return!1;this.rotationQuaternion=new Float32Array(4*this.capacity),this.angularVelocityQuaternion=new Float32Array(4*this.capacity);for(let t=3;t<this.rotationQuaternion.length;t+=4)this.rotationQuaternion[t]=1,this.angularVelocityQuaternion[t]=1;return!0}swapRows(t,e){if(t===e)return;const i=3*t,s=3*e;ze.swap3(this.position,i,s),ze.swap3(this.previousPosition,i,s),this.previousSize!==this.size&&ze.swap3(this.previousSize,i,s),this.previousVelocity.length>0&&ze.swap3(this.previousVelocity,i,s),ze.swap3(this.velocity,i,s),ze.swap3(this.size,i,s),ze.swap3(this.startSize,i,s);const r=4*t,n=4*e;ze.swap4(this.color,r,n),this.previousColor!==this.color&&ze.swap4(this.previousColor,r,n),ze.swap4(this.startColor,r,n),this.rotationQuaternion.length>0&&(ze.swap4(this.rotationQuaternion,r,n),ze.swap4(this.angularVelocityQuaternion,r,n)),ze.swap3(this.scalars,t*ze.SCALAR_STRIDE,e*ze.SCALAR_STRIDE);const o=this.memoryStride;if(o>0){const i=this.memory;for(let s=0,r=t*o,n=e*o;s<o;s++,r++,n++){const t=i[r];i[r]=i[n],i[n]=t}}ze.swap1(this.rotation,t,e),ze.swap1(this.angularVelocity,t,e),ze.swap1(this.uvTile,t,e),ze.swap1(this.startSpeed,t,e),ze.swap1(this.flip,t,e)}static swap1(t,e,i){const s=t[e];t[e]=t[i],t[i]=s}static growDouble(t,e){const i=new Float64Array(e);return i.set(t),i}static swap3(t,e,i){let s=t[e];t[e]=t[i],t[i]=s,s=t[e+1],t[e+1]=t[i+1],t[i+1]=s,s=t[e+2],t[e+2]=t[i+2],t[i+2]=s}static swap4(t,e,i){ze.swap3(t,e,i);const s=t[e+3];t[e+3]=t[i+3],t[i+3]=s}static grow(t,e){const i=new Float32Array(e);return i.set(t),i}}ze.EMPTY=new Float32Array(0),ze.SCALAR_STRIDE=3,ze.AGE=0,ze.LIFE=1,ze.SPEED_MODIFIER=2;const Me=.5*(Math.sqrt(3)-1),_e=(3-Math.sqrt(3))/6,Pe=1/3,Te=1/6,Ve=(Math.sqrt(5)-1)/4,Oe=(5-Math.sqrt(5))/20,Ce=new Float32Array([1,1,0,-1,1,0,1,-1,0,-1,-1,0,1,0,1,-1,0,1,1,0,-1,-1,0,-1,0,1,1,0,-1,1,0,1,-1,0,-1,-1]),Fe=new Float32Array([0,1,1,1,0,1,1,-1,0,1,-1,1,0,1,-1,-1,0,-1,1,1,0,-1,1,-1,0,-1,-1,1,0,-1,-1,-1,1,0,1,1,1,0,1,-1,1,0,-1,1,1,0,-1,-1,-1,0,1,1,-1,0,1,-1,-1,0,-1,1,-1,0,-1,-1,1,1,0,1,1,1,0,-1,1,-1,0,1,1,-1,0,-1,-1,1,0,1,-1,1,0,-1,-1,-1,0,1,-1,-1,0,-1,1,1,1,0,1,1,-1,0,1,-1,1,0,1,-1,-1,0,-1,1,1,0,-1,1,-1,0,-1,-1,1,0,-1,-1,-1,0]);class Be{constructor(t=e){const e="function"==typeof t?t:function(t){let e=0,i=0,s=0,r=1;const n=function(){let t=4022871197;return function(e){e=e.toString();for(let i=0;i<e.length;i++){t+=e.charCodeAt(i);let s=.02519603282416938*t;t=s>>>0,s-=t,s*=t,t=s>>>0,s-=t,t+=4294967296*s}return 2.3283064365386963e-10*(t>>>0)}}();e=n(" "),i=n(" "),s=n(" "),e-=n(t),e<0&&(e+=1);i-=n(t),i<0&&(i+=1);s-=n(t),s<0&&(s+=1);return function(){const t=2091639*e+2.3283064365386963e-10*r;return e=i,i=s,s=t-(r=0|t)}}(t);this.p=function(t){const e=new Uint8Array(256);for(let t=0;t<256;t++)e[t]=t;for(let i=0;i<255;i++){const s=i+~~(t()*(256-i)),r=e[i];e[i]=e[s],e[s]=r}return e}(e),this.perm=new Uint8Array(512),this.permMod12=new Uint8Array(512);for(let t=0;t<512;t++)this.perm[t]=this.p[255&t],this.permMod12[t]=this.perm[t]%12}noise2D(t,e){const i=this.permMod12,s=this.perm;let r=0,n=0,o=0;const a=(t+e)*Me,h=Math.floor(t+a),l=Math.floor(e+a),c=(h+l)*_e,u=t-(h-c),d=e-(l-c);let p,f;u>d?(p=1,f=0):(p=0,f=1);const m=u-p+_e,y=d-f+_e,v=u-1+2*_e,g=d-1+2*_e,x=255&h,S=255&l;let w=.5-u*u-d*d;if(w>=0){const t=3*i[x+s[S]];w*=w,r=w*w*(Ce[t]*u+Ce[t+1]*d)}let b=.5-m*m-y*y;if(b>=0){const t=3*i[x+p+s[S+f]];b*=b,n=b*b*(Ce[t]*m+Ce[t+1]*y)}let z=.5-v*v-g*g;if(z>=0){const t=3*i[x+1+s[S+1]];z*=z,o=z*z*(Ce[t]*v+Ce[t+1]*g)}return 70*(r+n+o)}noise3D(t,e,i){const s=this.permMod12,r=this.perm;let n,o,a,h;const l=(t+e+i)*Pe,c=Math.floor(t+l),u=Math.floor(e+l),d=Math.floor(i+l),p=(c+u+d)*Te,f=t-(c-p),m=e-(u-p),y=i-(d-p);let v,g,x,S,w,b;f>=m?m>=y?(v=1,g=0,x=0,S=1,w=1,b=0):f>=y?(v=1,g=0,x=0,S=1,w=0,b=1):(v=0,g=0,x=1,S=1,w=0,b=1):m<y?(v=0,g=0,x=1,S=0,w=1,b=1):f<y?(v=0,g=1,x=0,S=0,w=1,b=1):(v=0,g=1,x=0,S=1,w=1,b=0);const z=f-v+Te,M=m-g+Te,_=y-x+Te,P=f-S+2*Te,T=m-w+2*Te,V=y-b+2*Te,O=f-1+.5,C=m-1+.5,F=y-1+.5,B=255&c,A=255&u,$=255&d;let I=.6-f*f-m*m-y*y;if(I<0)n=0;else{const t=3*s[B+r[A+r[$]]];I*=I,n=I*I*(Ce[t]*f+Ce[t+1]*m+Ce[t+2]*y)}let E=.6-z*z-M*M-_*_;if(E<0)o=0;else{const t=3*s[B+v+r[A+g+r[$+x]]];E*=E,o=E*E*(Ce[t]*z+Ce[t+1]*M+Ce[t+2]*_)}let N=.6-P*P-T*T-V*V;if(N<0)a=0;else{const t=3*s[B+S+r[A+w+r[$+b]]];N*=N,a=N*N*(Ce[t]*P+Ce[t+1]*T+Ce[t+2]*V)}let L=.6-O*O-C*C-F*F;if(L<0)h=0;else{const t=3*s[B+1+r[A+1+r[$+1]]];L*=L,h=L*L*(Ce[t]*O+Ce[t+1]*C+Ce[t+2]*F)}return 32*(n+o+a+h)}noise4D(t,e,i,s){const r=this.perm;let n,o,a,h,l;const c=(t+e+i+s)*Ve,u=Math.floor(t+c),d=Math.floor(e+c),p=Math.floor(i+c),f=Math.floor(s+c),m=(u+d+p+f)*Oe,y=t-(u-m),v=e-(d-m),g=i-(p-m),x=s-(f-m);let S=0,w=0,b=0,z=0;y>v?S++:w++,y>g?S++:b++,y>x?S++:z++,v>g?w++:b++,v>x?w++:z++,g>x?b++:z++;const M=S>=3?1:0,_=w>=3?1:0,P=b>=3?1:0,T=z>=3?1:0,V=S>=2?1:0,O=w>=2?1:0,C=b>=2?1:0,F=z>=2?1:0,B=S>=1?1:0,A=w>=1?1:0,$=b>=1?1:0,I=z>=1?1:0,E=y-M+Oe,N=v-_+Oe,L=g-P+Oe,R=x-T+Oe,D=y-V+2*Oe,U=v-O+2*Oe,q=g-C+2*Oe,k=x-F+2*Oe,J=y-B+3*Oe,Q=v-A+3*Oe,G=g-$+3*Oe,W=x-I+3*Oe,j=y-1+4*Oe,Y=v-1+4*Oe,X=g-1+4*Oe,Z=x-1+4*Oe,H=255&u,K=255&d,tt=255&p,et=255&f;let it=.6-y*y-v*v-g*g-x*x;if(it<0)n=0;else{const t=r[H+r[K+r[tt+r[et]]]]%32*4;it*=it,n=it*it*(Fe[t]*y+Fe[t+1]*v+Fe[t+2]*g+Fe[t+3]*x)}let st=.6-E*E-N*N-L*L-R*R;if(st<0)o=0;else{const t=r[H+M+r[K+_+r[tt+P+r[et+T]]]]%32*4;st*=st,o=st*st*(Fe[t]*E+Fe[t+1]*N+Fe[t+2]*L+Fe[t+3]*R)}let rt=.6-D*D-U*U-q*q-k*k;if(rt<0)a=0;else{const t=r[H+V+r[K+O+r[tt+C+r[et+F]]]]%32*4;rt*=rt,a=rt*rt*(Fe[t]*D+Fe[t+1]*U+Fe[t+2]*q+Fe[t+3]*k)}let nt=.6-J*J-Q*Q-G*G-W*W;if(nt<0)h=0;else{const t=r[H+B+r[K+A+r[tt+$+r[et+I]]]]%32*4;nt*=nt,h=nt*nt*(Fe[t]*J+Fe[t+1]*Q+Fe[t+2]*G+Fe[t+3]*W)}let ot=.6-j*j-Y*Y-X*X-Z*Z;if(ot<0)l=0;else{const t=r[H+1+r[K+1+r[tt+1+r[et+1]]]]%32*4;ot*=ot,l=ot*ot*(Fe[t]*j+Fe[t+1]*Y+Fe[t+2]*X+Fe[t+3]*Z)}return 27*(n+o+a+h+l)}}const Ae=100,$e=new Array(Ae),Ie=new H,Ee=new Z;function Ne(t){let e=$e[t];return void 0===e&&(e=new Be(t),$e[t]=e),e}class Le{constructor(t,e,i=new Ct(1),s=new Ct(0),r=new Ct(0),n){this.frequency=t,this.power=e,this.positionAmount=i,this.rotationAmount=s,this.scrollSpeed=r,this.remap=n,this.type="Noise",this.duration=0,this.scrollOffset=0,this.scrollMemory=[],this._frequency=NaN,this._power=NaN,this._positionAmount=NaN,this._rotationAmount=NaN,this.scrollSpeed.startGen(this.scrollMemory)}sample(t,e,i){const s=t.noise2D(0,e),r=this.remap;return void 0===r?s:r.genValue(i,.5*(s+1))}initialize(t){const e="number"==typeof t.rotation;let i=t._noiseState;if(void 0===i)return i={lastPos:new H,lastRot:0,lastRotQ:e?null:new Z,generatorX:Ne(le(0,Ae)),generatorY:Ne(le(0,Ae)),generatorZ:Ne(le(0,Ae)),generatorW:Ne(le(0,Ae))},void(t._noiseState=i);i.lastPos.set(0,0,0),i.lastRot=0,e?i.lastRotQ=null:null===i.lastRotQ?i.lastRotQ=new Z:i.lastRotQ.set(0,0,0,1),i.generatorX=Ne(le(0,Ae)),i.generatorY=Ne(le(0,Ae)),i.generatorZ=Ne(le(0,Ae)),i.generatorW=Ne(le(0,Ae))}static constantOf(t){return t instanceof Ct?t.value:NaN}update(t,e){const i=t._noiseState;if(void 0===i)return;const s=t.memory,r=t.age/t.life,n=this._frequency,o=n==n?n:this.frequency.genValue(s,r),a=this._power,h=a==a?a:this.power.genValue(s,r),l=this._positionAmount,c=l==l?l:this.positionAmount.genValue(s,r),u=this._rotationAmount,d=u==u?u:this.rotationAmount.genValue(s,r),p=t.age*o+this.scrollOffset;if(c>0){const e=h*c;t.position.sub(i.lastPos),Ie.set(this.sample(i.generatorX,p,s)*e,this.sample(i.generatorY,p,s)*e,this.sample(i.generatorZ,p,s)*e),t.position.add(Ie),i.lastPos.copy(Ie)}if(d>0){const e=h*d;if("number"==typeof t.rotation){const r=this.sample(i.generatorW,p,s)*Math.PI*e;t.rotation=t.rotation-i.lastRot+r,i.lastRot=r}else if(null!==i.lastRotQ){const r=t.rotation;i.lastRotQ.invert(),r.multiply(i.lastRotQ),Ee.set(this.sample(i.generatorX,p,s)*e,this.sample(i.generatorY,p,s)*e,this.sample(i.generatorZ,p,s)*e,this.sample(i.generatorW,p,s)*e).normalize(),r.multiply(Ee),i.lastRotQ.copy(Ee)}}}updateAll(t,e,i){const s=e>0?t[0].store:void 0;if(void 0===s){for(let s=0;s<e;s++){const e=t[s];e.age<e.life&&this.update(e,i)}return}const r=s.position,n=s.rotation,o=s.scalars,a=ze.SCALAR_STRIDE,h=this._frequency,l=this._power,c=this._positionAmount,u=this._rotationAmount;for(let i=0,s=0,d=0;i<e;i++,s+=3,d+=a){const e=o[d],a=o[d+1];if(e>=a)continue;const p=t[i],f=p._noiseState;if(void 0===f)continue;const m=p.memory,y=e/a,v=h==h?h:this.frequency.genValue(m,y),g=l==l?l:this.power.genValue(m,y),x=c==c?c:this.positionAmount.genValue(m,y),S=u==u?u:this.rotationAmount.genValue(m,y),w=e*v+this.scrollOffset;if(x>0){const t=g*x,e=f.lastPos,i=this.sample(f.generatorX,w,m)*t,n=this.sample(f.generatorY,w,m)*t,o=this.sample(f.generatorZ,w,m)*t;r[s]=Math.fround(r[s]-e.x)+i,r[s+1]=Math.fround(r[s+1]-e.y)+n,r[s+2]=Math.fround(r[s+2]-e.z)+o,e.set(i,n,o)}if(S>0){const t=g*S;if("number"==typeof p.rotation){const e=this.sample(f.generatorW,w,m)*Math.PI*t;n[i]=n[i]-f.lastRot+e,f.lastRot=e}else if(null!==f.lastRotQ){const e=p.rotation;f.lastRotQ.invert(),e.multiply(f.lastRotQ),Ee.set(this.sample(f.generatorX,w,m)*t,this.sample(f.generatorY,w,m)*t,this.sample(f.generatorZ,w,m)*t,this.sample(f.generatorW,w,m)*t).normalize(),e.multiply(Ee),f.lastRotQ.copy(Ee)}}}}toJSON(){return{type:this.type,frequency:this.frequency.toJSON(),power:this.power.toJSON(),positionAmount:this.positionAmount.toJSON(),rotationAmount:this.rotationAmount.toJSON(),scrollSpeed:this.scrollSpeed.toJSON(),...void 0!==this.remap?{remap:this.remap.toJSON()}:{}}}frameUpdate(t){this.duration+=t,this.scrollOffset+=this.scrollSpeed.genValue(this.scrollMemory,0)*t,this._frequency=Le.constantOf(this.frequency),this._power=Le.constantOf(this.power),this._positionAmount=Le.constantOf(this.positionAmount),this._rotationAmount=Le.constantOf(this.rotationAmount)}static fromJSON(t){return new Le(It(t.frequency),It(t.power),It(t.positionAmount),It(t.rotationAmount),t.scrollSpeed?It(t.scrollSpeed):new Ct(0),t.remap?It(t.remap):void 0)}clone(){return new Le(this.frequency.clone(),this.power.clone(),this.positionAmount.clone(),this.rotationAmount.clone(),this.scrollSpeed.clone(),this.remap?.clone())}reset(){this.scrollOffset=0}}class Re{constructor(t,e=new H(0,1,0)){this.orbitSpeed=t,this.axis=e,this.type="OrbitOverLife",this.temp=new H,this.rotation=new Z}initialize(t){this.orbitSpeed.startGen(t.memory)}update(t,e){this.temp.copy(t.position).projectOnVector(this.axis),this.rotation.setFromAxisAngle(this.axis,this.orbitSpeed.genValue(t.memory,t.age/t.life)*e),t.position.sub(this.temp),t.position.applyQuaternion(this.rotation),t.position.add(this.temp)}updateAll(t,e,i){const s=this.orbitSpeed,r=this.axis,n=this.temp,o=this.rotation;for(let a=0;a<e;a++){const e=t[a];if(e.age>=e.life)continue;const h=e.position;n.copy(h).projectOnVector(r),o.setFromAxisAngle(r,s.genValue(e.memory,e.age/e.life)*i),h.sub(n),h.applyQuaternion(o),h.add(n)}}frameUpdate(t){}toJSON(){return{type:this.type,orbitSpeed:this.orbitSpeed.toJSON(),axis:[this.axis.x,this.axis.y,this.axis.z]}}static fromJSON(t){return new Re(It(t.orbitSpeed),t.axis?new H(t.axis[0],t.axis[1],t.axis[2]):void 0)}clone(){return new Re(this.orbitSpeed.clone())}reset(){}}class De{constructor(t){this.angularVelocity=t,this.type="Rotation3DOverLife",this.tempQuat=new Z}initialize(t){t.rotation instanceof Z&&(t.angularVelocity=new Z,this.angularVelocity.startGen(t.memory))}update(t,e){if(t.rotation instanceof Z){this.angularVelocity.genValue(t.memory,this.tempQuat,e,t.age/t.life),t.rotation.multiply(this.tempQuat);const i=t.angularVelocity;i instanceof Z&&i.copy(this.tempQuat)}}toJSON(){return{type:this.type,angularVelocity:this.angularVelocity.toJSON()}}static fromJSON(t){return new De(Ht(t.angularVelocity))}frameUpdate(t){}clone(){return new De(this.angularVelocity.clone())}reset(){}}class Ue{constructor(t,e){this.angularVelocity=t,this.speedRange=e,this.type="RotationBySpeed",this.tempQuat=new Z}initialize(t){"number"==typeof t.rotation&&this.angularVelocity.startGen(t.memory)}update(t,e){if("number"==typeof t.rotation){const i=(t.startSpeed-this.speedRange.a)/(this.speedRange.b-this.speedRange.a),s=this.angularVelocity.genValue(t.memory,i);t.rotation+=e*s,t.angularVelocity=s}}toJSON(){return{type:this.type,angularVelocity:this.angularVelocity.toJSON(),speedRange:this.speedRange.toJSON()}}static fromJSON(t){return new Ue(It(t.angularVelocity),Ft.fromJSON(t.speedRange))}frameUpdate(t){}clone(){return new Ue(this.angularVelocity.clone(),this.speedRange.clone())}reset(){}}class qe{constructor(t){this.angularVelocity=t,this.type="RotationOverLife",this.tempQuat=new Z}initialize(t){"number"==typeof t.rotation?this.angularVelocity.startGen(t.memory):t.rotation instanceof Z&&(this.angularVelocity.startGen(t.memory),t.angularVelocity instanceof Z||(t.angularVelocity=new Z))}update(t,e){if("number"==typeof t.rotation){const i=this.angularVelocity.genValue(t.memory,t.age/t.life);t.rotation+=e*i,t.angularVelocity=i}else if(t.rotation instanceof Z){const i=this.angularVelocity.genValue(t.memory,t.age/t.life);this.turnAboutZ(t,t.rotation,i*e)}}updateAll(t,e,i){const s=this.angularVelocity;for(let r=0;r<e;r++){const e=t[r];if(e.age>=e.life)continue;const n=e.rotation;if("number"==typeof n){const t=s.genValue(e.memory,e.age/e.life);e.rotation=n+i*t,e.angularVelocity=t}else if(n instanceof Z){const t=s.genValue(e.memory,e.age/e.life);this.turnAboutZ(e,n,t*i)}}}turnAboutZ(t,e,i){const s=this.tempQuat.setFromAxisAngle(pe,i);e.multiply(s);const r=t.angularVelocity;r instanceof Z&&r.copy(s)}toJSON(){return{type:this.type,angularVelocity:this.angularVelocity.toJSON()}}static fromJSON(t){return new qe(It(t.angularVelocity))}frameUpdate(t){this.angularVelocity.refreshTable?.()}clone(){return new qe(this.angularVelocity.clone())}reset(){}}class ke{initialize(t){this.size.startGen(t.memory)}constructor(t,e){this.size=t,this.speedRange=e,this.type="SizeBySpeed"}update(t){const e=(t.startSpeed-this.speedRange.a)/(this.speedRange.b-this.speedRange.a);this.size instanceof Kt?this.size.genValue(t.memory,t.size,e).multiply(t.startSize):t.size.copy(t.startSize).multiplyScalar(this.size.genValue(t.memory,e))}toJSON(){return{type:this.type,size:this.size.toJSON(),speedRange:this.speedRange.toJSON()}}static fromJSON(t){return new ke(ee(t.size),Ft.fromJSON(t.speedRange))}frameUpdate(t){}clone(){return new ke(this.size.clone(),this.speedRange.clone())}reset(){}}class Je{constructor(t){this.type="SizeOverLife",this._sizeIsVector3=!1,this.size=t}get size(){return this._size}set size(t){this._size=t,this._sizeIsVector3=t instanceof Kt}initialize(t){this._size.startGen(t.memory)}update(t){const e=t.age/t.life;if(this._sizeIsVector3)this._size.genValue(t.memory,t.size,e).multiply(t.startSize);else{const i=this._size.genValue(t.memory,e),s=t.size,r=t.startSize;s.x=r.x*i,s.y=r.y*i,s.z=r.z*i}}updateAll(t,e,i){if(this._sizeIsVector3){const i=this._size;for(let s=0;s<e;s++){const e=t[s];e.age>=e.life||i.genValue(e.memory,e.size,e.age/e.life).multiply(e.startSize)}return}const s=this._size;for(let i=0;i<e;i++){const e=t[i];if(e.age>=e.life)continue;const r=s.genValue(e.memory,e.age/e.life),n=e.size,o=e.startSize;n.x=o.x*r,n.y=o.y*r,n.z=o.z*r}}toJSON(){return{type:this.type,size:this.size.toJSON()}}static fromJSON(t){return new Je(ee(t.size))}frameUpdate(t){this._size.refreshTable?.()}clone(){return new Je(this.size.clone())}reset(){}}class Qe{initialize(t){this.speed.startGen(t.memory)}constructor(t){this.speed=t,this.type="SpeedOverLife"}update(t){t.speedModifier=this.speed.genValue(t.memory,t.age/t.life)}updateAll(t,e,i){const s=this.speed;for(let i=0;i<e;i++){const e=t[i];e.age>=e.life||(e.speedModifier=s.genValue(e.memory,e.age/e.life))}}toJSON(){return{type:this.type,speed:this.speed.toJSON()}}static fromJSON(t){return new Qe(It(t.speed))}frameUpdate(t){this.speed.refreshTable?.()}clone(){return new Qe(this.speed.clone())}reset(){}}class Ge{constructor(t,e,i,s){this.scale=t,this.octaves=e,this.velocityMultiplier=i,this.timeScale=s,this.type="TurbulenceField",this.generator=new Be(S),this.timeOffset=new H,this.temp=new H,this.temp2=new H,this.timeOffset.x=S()/this.scale.x*this.timeScale.x,this.timeOffset.y=S()/this.scale.y*this.timeScale.y,this.timeOffset.z=S()/this.scale.z*this.timeScale.z}initialize(t){}update(t,e){const i=t.position.x/this.scale.x,s=t.position.y/this.scale.y,r=t.position.z/this.scale.z;this.temp.set(0,0,0);let n=1;for(let t=0;t<this.octaves;t++)this.temp2.set(this.generator.noise4D(i*n,s*n,r*n,this.timeOffset.x*n)/n,this.generator.noise4D(i*n,s*n,r*n,this.timeOffset.y*n)/n,this.generator.noise4D(i*n,s*n,r*n,this.timeOffset.z*n)/n),this.temp.add(this.temp2),n*=2;this.temp.multiply(this.velocityMultiplier),t.velocity.addScaledVector(this.temp,e)}updateAll(t,e,i){const s=e>0?t[0].store:void 0;if(void 0===s){for(let s=0;s<e;s++){const e=t[s];e.age<e.life&&this.update(e,i)}return}const r=s.position,n=s.velocity,o=s.scalars,a=ze.SCALAR_STRIDE,h=this.generator,l=this.octaves,c=1/this.scale.x,u=1/this.scale.y,d=1/this.scale.z,p=this.velocityMultiplier.x*i,f=this.velocityMultiplier.y*i,m=this.velocityMultiplier.z*i,y=this.timeOffset.x,v=this.timeOffset.y,g=this.timeOffset.z;for(let t=0,i=0,s=0;t<e;t++,i+=3,s+=a){if(o[s]>=o[s+1])continue;const t=r[i]*c,e=r[i+1]*u,a=r[i+2]*d;let x=0,S=0,w=0,b=1;for(let i=0;i<l;i++){const i=t*b,s=e*b,r=a*b;x+=h.noise4D(i,s,r,y*b)/b,S+=h.noise4D(i,s,r,v*b)/b,w+=h.noise4D(i,s,r,g*b)/b,b*=2}n[i]+=x*p,n[i+1]+=S*f,n[i+2]+=w*m}}toJSON(){return{type:this.type,scale:[this.scale.x,this.scale.y,this.scale.z],octaves:this.octaves,velocityMultiplier:[this.velocityMultiplier.x,this.velocityMultiplier.y,this.velocityMultiplier.z],timeScale:[this.timeScale.x,this.timeScale.y,this.timeScale.z]}}frameUpdate(t){this.timeOffset.x+=t*this.timeScale.x,this.timeOffset.y+=t*this.timeScale.y,this.timeOffset.z+=t*this.timeScale.z}static fromJSON(t){return new Ge(new H(t.scale[0],t.scale[1],t.scale[2]),t.octaves,new H(t.velocityMultiplier[0],t.velocityMultiplier[1],t.velocityMultiplier[2]),new H(t.timeScale[0],t.timeScale[1],t.timeScale[2]))}clone(){return new Ge(this.scale.clone(),this.octaves,this.velocityMultiplier.clone(),this.timeScale.clone())}reset(){}}const We=new H(1,0,0),je=new H(0,1,0),Ye=new H(0,0,1);class Xe{constructor(t=new Ct(0),e=new Ct(0),i=new Ct(0),s=new Ct(0),r=new Ct(0),n=new Ct(0),o="local",a=new Ct(0),h=new H){this.linearX=t,this.linearY=e,this.linearZ=i,this.orbitalX=s,this.orbitalY=r,this.orbitalZ=n,this.space=o,this.radial=a,this.orbitalOffset=h,this.type="VelocityOverLife",this._temp=new H,this._tempEmitterPos=new H,this._tempQ=new Z,this._tempQInv=new Z,this._tempScale=new H(1,1,1),this._tempScaleInv=new H(1,1,1),this._tempRot=new Z,this._axisX=new H(1,0,0),this._axisY=new H(0,1,0),this._axisZ=new H(0,0,1),this._center=new H}initialize(t,e){this.ps=e,this.linearX.startGen(t.memory),this.linearY.startGen(t.memory),this.linearZ.startGen(t.memory),this.orbitalX.startGen(t.memory),this.orbitalY.startGen(t.memory),this.orbitalZ.startGen(t.memory),this.radial.startGen(t.memory)}frameUpdate(t){this.ps&&(this.ps.emitter.matrixWorld.decompose(this._tempEmitterPos,this._tempQ,this._tempScale),this._tempQInv.copy(this._tempQ).invert(),this._tempScaleInv.set(1/this._tempScale.x,1/this._tempScale.y,1/this._tempScale.z),this._axisX.copy(We),this._axisY.copy(je),this._axisZ.copy(Ye),this._center.copy(this.orbitalOffset),this.ps.worldSpace&&(this._axisX.applyQuaternion(this._tempQ),this._axisY.applyQuaternion(this._tempQ),this._axisZ.applyQuaternion(this._tempQ),this._center.multiply(this._tempScale).applyQuaternion(this._tempQ).add(this._tempEmitterPos)))}update(t,e){const i=t.age/t.life;this._temp.set(this.linearX.genValue(t.memory,i),this.linearY.genValue(t.memory,i),this.linearZ.genValue(t.memory,i));const s=void 0!==this.ps&&this.ps.worldSpace;s&&"local"===this.space?this._temp.multiply(this._tempScale).applyQuaternion(this._tempQ):s||"world"!==this.space||this._temp.multiply(this._tempScaleInv).applyQuaternion(this._tempQInv),t.position.addScaledVector(this._temp,e);const r=this.radial.genValue(t.memory,i);if(0!==r){this._temp.copy(t.position).sub(this._center);const i=this._temp.length();i>0&&t.position.addScaledVector(this._temp,r*e/i)}const n=this.orbitalX.genValue(t.memory,i)*e,o=this.orbitalY.genValue(t.memory,i)*e,a=this.orbitalZ.genValue(t.memory,i)*e;0===n&&0===o&&0===a||(t.position.sub(this._center),this.orbit(t.position,this._axisX,n),this.orbit(t.position,this._axisY,o),this.orbit(t.position,this._axisZ,a),t.position.add(this._center))}orbit(t,e,i){0!==i&&(this._tempRot.setFromAxisAngle(e,i),t.applyQuaternion(this._tempRot))}toJSON(){return{type:this.type,linearX:this.linearX.toJSON(),linearY:this.linearY.toJSON(),linearZ:this.linearZ.toJSON(),orbitalX:this.orbitalX.toJSON(),orbitalY:this.orbitalY.toJSON(),orbitalZ:this.orbitalZ.toJSON(),space:this.space,radial:this.radial.toJSON(),orbitalOffset:[this.orbitalOffset.x,this.orbitalOffset.y,this.orbitalOffset.z]}}static fromJSON(t){const e=t=>t?It(t):new Ct(0);return new Xe(e(t.linearX),e(t.linearY),e(t.linearZ),e(t.orbitalX),e(t.orbitalY),e(t.orbitalZ),"world"===t.space?"world":"local",e(t.radial),Array.isArray(t.orbitalOffset)?new H(t.orbitalOffset[0]??0,t.orbitalOffset[1]??0,t.orbitalOffset[2]??0):new H)}clone(){return new Xe(this.linearX.clone(),this.linearY.clone(),this.linearZ.clone(),this.orbitalX.clone(),this.orbitalY.clone(),this.orbitalZ.clone(),this.space,this.radial.clone(),this.orbitalOffset.clone())}reset(){}}class Ze{constructor(t){this.data=t,this.next=null,this.prev=null}hasPrev(){return null!==this.prev}hasNext(){return null!==this.next}}class He{constructor(){this.length=0,this.head=this.tail=null}isEmpty(){return null===this.head}clear(){this.length=0,this.head=this.tail=null}front(){return null===this.head?null:this.head.data}back(){return null===this.tail?null:this.tail.data}dequeue(){if(this.head){const t=this.head.data;return this.head=this.head.next,this.head?this.head.prev=null:this.tail=null,this.length--,t}}pop(){if(this.tail){const t=this.tail.data;return this.tail=this.tail.prev,this.tail?this.tail.next=null:this.head=null,this.length--,t}}queue(t){const e=new Ze(t);this.tail||(this.tail=e),this.head&&(this.head.prev=e,e.next=this.head),this.head=e,this.length++}push(t){const e=new Ze(t);this.head||(this.head=e),this.tail&&(this.tail.next=e,e.prev=this.tail),this.tail=e,this.length++}insertBefore(t,e){const i=new Ze(e);i.next=t,i.prev=t.prev,null!==i.prev&&(i.prev.next=i),i.next.prev=i,t==this.head&&(this.head=i),this.length++}remove(t){if(null===this.head||null===this.tail)return;let e=this.head;for(t===this.head.data&&(this.head=this.head.next),t===this.tail.data&&(this.tail=this.tail.prev);null!==e.next&&e.data!==t;)e=e.next;e.data===t&&(null!==e.prev&&(e.prev.next=e.next),null!==e.next&&(e.next.prev=e.prev),this.length--)}*values(){let t=this.head;for(;null!==t;)yield t.data,t=t.next}}class Ke{get startSpeed(){return this.store.startSpeed[this.storeIndex]}set startSpeed(t){this.store.startSpeed[this.storeIndex]=t}get age(){return this.scalars[this.scalarOffset]}set age(t){this.scalars[this.scalarOffset]=t}get life(){return this.scalars[this.scalarOffset+1]}set life(t){this.scalars[this.scalarOffset+1]=t}get speedModifier(){return this.scalars[this.scalarOffset+2]}set speedModifier(t){this.scalars[this.scalarOffset+2]=t}get angularVelocity(){const t=this.angularVelocityQuaternion;return void 0!==t?t:this.store.angularVelocity[this.storeIndex]}set angularVelocity(t){if("number"==typeof t)this.angularVelocityQuaternion=void 0,this.store.angularVelocity[this.storeIndex]=t;else if(void 0===t)this.angularVelocityQuaternion=void 0,this.store.angularVelocity[this.storeIndex]=0;else{let e=this.angularVelocityQuaternion;void 0===e&&(this.store.ensureQuaternionColumns(),e=new vt(this.store.angularVelocityQuaternion,4*this.storeIndex),this.angularVelocityQuaternion=e),e!==t&&e.copy(t)}}get rotation(){const t=this.rotationQuaternion;return void 0!==t?t:this.store.rotation[this.storeIndex]}set rotation(t){if("number"==typeof t)this.rotationQuaternion=void 0,this.store.rotation[this.storeIndex]=t;else{let e=this.rotationQuaternion;void 0===e&&(this.store.ensureQuaternionColumns(),e=new vt(this.store.rotationQuaternion,4*this.storeIndex),this.rotationQuaternion=e),e!==t&&e.copy(t)}}get uvTile(){return this.store.uvTile[this.storeIndex]}set uvTile(t){this.store.uvTile[this.storeIndex]=t}get flip(){return this.store.flip[this.storeIndex]}set flip(t){this.store.flip[this.storeIndex]=t}constructor(t=new ze(1),e=0){this.rotationQuaternion=void 0,this.angularVelocityQuaternion=void 0,this.memory=[],this.store=t,this.storeIndex=e;const i=3*e,s=4*e;this.position=new wt(t.position,i),this.previousPosition=new wt(t.previousPosition,i),this.previousVelocity=new wt(t.previousVelocity,i),this.velocity=new wt(t.velocity,i),this.size=new wt(t.size,i),this.startSize=new wt(t.startSize,i),this.color=new _t(t.color,s),this.startColor=new _t(t.startColor,s),this.scalars=t.scalars,this.scalarOffset=e*ze.SCALAR_STRIDE,this.size.set(1,1,1),this.startSize.set(1,1,1),this.life=1,this.speedModifier=1}setStoreIndex(t){this.storeIndex=t,this.rebind()}rebind(){const t=this.store,e=3*this.storeIndex,i=4*this.storeIndex;this.position.bind(t.position,e),this.previousPosition.bind(t.previousPosition,e),this.previousVelocity.bind(t.previousVelocity,e),this.velocity.bind(t.velocity,e),this.size.bind(t.size,e),this.startSize.bind(t.startSize,e),this.color.bind(t.color,i),this.startColor.bind(t.startColor,i),this.rotationQuaternion?.bind(t.rotationQuaternion,i),this.angularVelocityQuaternion?.bind(t.angularVelocityQuaternion,i),this.scalars=t.scalars,this.scalarOffset=this.storeIndex*ze.SCALAR_STRIDE}get died(){return this.age>=this.life}reset(){this.memory.length=0}}const ti=new Float32Array(0);class ei{get startSpeed(){return this.store.startSpeed[this.storeIndex]}set startSpeed(t){this.store.startSpeed[this.storeIndex]=t}get age(){return this.scalars[this.scalarOffset]}set age(t){this.scalars[this.scalarOffset]=t}get life(){return this.scalars[this.scalarOffset+1]}set life(t){this.scalars[this.scalarOffset+1]=t}get speedModifier(){return this.scalars[this.scalarOffset+2]}set speedModifier(t){this.scalars[this.scalarOffset+2]=t}get previous(){return this._previous??(this._previous=new He)}set previous(t){this._previous=t}get uvTile(){return this.store.uvTile[this.storeIndex]}set uvTile(t){this.store.uvTile[this.storeIndex]=t}constructor(t=new ze(1),e=0){this.length=100,this._previous=void 0,this.historyPositions=ti,this.historySizes=ti,this.historyBaseSizes=ti,this.headWidthScale=1,this.historyColors=ti,this.historyCapacity=0,this.historyHead=0,this.historyCount=0,this.memory=[],this.store=t,this.storeIndex=e;const i=3*e,s=4*e;this.position=new wt(t.position,i),this.previousPosition=new wt(t.previousPosition,i),this.previousVelocity=new wt(t.previousVelocity,i),this.velocity=new wt(t.velocity,i),this.size=new wt(t.size,i),this.startSize=new wt(t.startSize,i),this.color=new _t(t.color,s),this.startColor=new _t(t.startColor,s),this.scalars=t.scalars,this.scalarOffset=e*ze.SCALAR_STRIDE,this.size.set(1,1,1),this.startSize.set(1,1,1),this.life=1,this.speedModifier=1}setStoreIndex(t){this.storeIndex=t,this.rebind()}rebind(){const t=this.store,e=3*this.storeIndex,i=4*this.storeIndex;this.position.bind(t.position,e),this.previousPosition.bind(t.previousPosition,e),this.previousVelocity.bind(t.previousVelocity,e),this.velocity.bind(t.velocity,e),this.size.bind(t.size,e),this.startSize.bind(t.startSize,e),this.color.bind(t.color,i),this.startColor.bind(t.startColor,i),this.scalars=t.scalars,this.scalarOffset=this.storeIndex*ze.SCALAR_STRIDE}ensureHistoryCapacity(t){this.historyCapacity!==t&&(this.historyCapacity=t,this.historyPositions=new Float32Array(3*t),this.historySizes=new Float32Array(t),this.historyBaseSizes=new Float32Array(t),this.historyColors=new Float32Array(4*t),this.historyHead=0,this.historyCount=0)}resetHistory(){this.historyHead=0,this.historyCount=0}getHistoryIndex(t){const e=this.historyCapacity;return(this.historyHead-this.historyCount+e+t)%e}update(){0===this.historyCapacity&&this.ensureHistoryCapacity(Math.max(1,Math.ceil(this.length)));const t=this.historyCapacity,e=this.store,i=this.storeIndex,s=i*ze.SCALAR_STRIDE;if(e.scalars[s+ze.AGE]>e.scalars[s+ze.LIFE])return void(this.historyCount>0&&this.historyCount--);const r=this.historyHead,n=3*r,o=this.historyPositions,a=e.position,h=3*i;o[n]=a[h],o[n+1]=a[h+1],o[n+2]=a[h+2];const l=e.size[h];this.historyBaseSizes[r]=l,this.historySizes[r]=l*this.headWidthScale;const c=4*r,u=this.historyColors,d=e.color,p=4*i;u[c]=d[p],u[c+1]=d[p+1],u[c+2]=d[p+2],u[c+3]=d[p+3],this.historyHead=(r+1)%t,this.historyCount<t&&this.historyCount++}get died(){return this.age>=this.life}reset(){this.memory.length=0,this.headWidthScale=1,this.resetHistory()}}class ii{initialize(t){this.width.startGen(t.memory)}constructor(t,e=!1){this.width=t,this.absolute=e,this.type="WidthOverLength"}update(t){if(!(t instanceof ei))return;const e=t.memory;t.headWidthScale=this.absolute?1:this.width.genValue(e,0);const i=t.historyCount;if(0===i)return;const s=t.historyCapacity,r=t.historySizes,n=t.historyBaseSizes,o=1/t.length,a=this.absolute;let h=t.getHistoryIndex(0);for(let t=0;t<i;t++){const l=this.width.genValue(e,(i-t)*o);r[h]=a?l:n[h]*l,h++,h===s&&(h=0)}}frameUpdate(t){}toJSON(){return{type:this.type,width:this.width.toJSON(),absolute:this.absolute}}static fromJSON(t){return new ii(It(t.width),t.absolute??!0)}clone(){return new ii(this.width.clone(),this.absolute)}reset(){}}const si={ApplyForce:{type:"ApplyForce",constructor:ie,params:[["direction",["vec3"]],["magnitude",["value"]]],loadJSON:ie.fromJSON},Noise:{type:"Noise",constructor:Le,params:[["frequency",["value"]],["power",["value"]],["positionAmount",["value"]],["rotationAmount",["value"]]],loadJSON:Le.fromJSON},TurbulenceField:{type:"TurbulenceField",constructor:Ge,params:[["scale",["vec3"]],["octaves",["number"]],["velocityMultiplier",["vec3"]],["timeScale",["vec3"]]],loadJSON:Ge.fromJSON},GravityForce:{type:"GravityForce",constructor:Se,params:[["center",["vec3"]],["magnitude",["number"]]],loadJSON:Se.fromJSON},ColorOverLife:{type:"ColorOverLife",constructor:he,params:[["color",["colorFunc"]]],loadJSON:he.fromJSON},RotationOverLife:{type:"RotationOverLife",constructor:qe,params:[["angularVelocity",["value","valueFunc"]]],loadJSON:qe.fromJSON},Rotation3DOverLife:{type:"Rotation3DOverLife",constructor:De,params:[["angularVelocity",["rotationFunc"]]],loadJSON:De.fromJSON},SizeOverLife:{type:"SizeOverLife",constructor:Je,params:[["size",["value","valueFunc","vec3Func"]]],loadJSON:Je.fromJSON},ColorBySpeed:{type:"ColorBySpeed",constructor:ae,params:[["color",["colorFunc"]],["speedRange",["range"]]],loadJSON:ae.fromJSON},RotationBySpeed:{type:"RotationBySpeed",constructor:Ue,params:[["angularVelocity",["value","valueFunc"]],["speedRange",["range"]]],loadJSON:Ue.fromJSON},SizeBySpeed:{type:"SizeBySpeed",constructor:ke,params:[["size",["value","valueFunc","vec3Func"]],["speedRange",["range"]]],loadJSON:ke.fromJSON},SpeedOverLife:{type:"SpeedOverLife",constructor:Qe,params:[["speed",["value","valueFunc"]]],loadJSON:Qe.fromJSON},FrameOverLife:{type:"FrameOverLife",constructor:xe,params:[["frame",["value","valueFunc"]]],loadJSON:xe.fromJSON},ForceOverLife:{type:"ForceOverLife",constructor:ge,params:[["x",["value","valueFunc"]],["y",["value","valueFunc"]],["z",["value","valueFunc"]]],loadJSON:ge.fromJSON},VelocityOverLife:{type:"VelocityOverLife",constructor:Xe,params:[["linearX",["value","valueFunc"]],["linearY",["value","valueFunc"]],["linearZ",["value","valueFunc"]],["orbitalX",["value","valueFunc"]],["orbitalY",["value","valueFunc"]],["orbitalZ",["value","valueFunc"]],["space",["string"]]],loadJSON:Xe.fromJSON},InheritVelocity:{type:"InheritVelocity",constructor:we,params:[["multiplier",["value","valueFunc"]],["mode",["string"]]],loadJSON:we.fromJSON},OrbitOverLife:{type:"OrbitOverLife",constructor:Re,params:[["orbitSpeed",["value","valueFunc"]],["axis",["vec3"]]],loadJSON:Re.fromJSON},WidthOverLength:{type:"WidthOverLength",constructor:ii,params:[["width",["value","valueFunc"]]],loadJSON:ii.fromJSON},ChangeEmitDirection:{type:"ChangeEmitDirection",constructor:oe,params:[["angle",["value"]]],loadJSON:oe.fromJSON},ApplySequences:{type:"ApplySequences",constructor:ne,params:[["delay",["number"]]],loadJSON:ne.fromJSON},EmitSubParticleSystem:{type:"EmitSubParticleSystem",constructor:ve,params:[["particleSystem",["self"]],["useVelocityAsBasis",["boolean"]],["subParticleSystem",["particleSystem"]],["mode",["number"]],["emitProbability",["number"]]],loadJSON:ve.fromJSON},LimitSpeedOverLife:{type:"LimitSpeedOverLife",constructor:be,params:[["speed",["value","valueFunc"]],["dampen",["number"]]],loadJSON:be.fromJSON},ApplyCollision:{type:"ApplyCollision",constructor:Ot,params:[["bounce",["number"]]],loadJSON:Ot.fromJSON}};function ri(t,e){return si[t.type]?si[t.type].loadJSON(t,e):null}const ni={PiecewiseBezier:$t,Vector3Function:Kt,Quaternion:Z,ConstantValue:Ct,Gradient:Jt,Vector4View:_t,AxisAngleGenerator:Et,IntervalValue:Ft,ColorRange:Ut};function oi(t,e){return`const ${t} = ${e};\n const ${t}_tbl = ${t} instanceof deps.PiecewiseBezier ? ${t}.sampledTable() : null;\n const ${t}_last = ${t}_tbl !== null ? ${t}_tbl.length - 1 : 0;\n const ${t}_const = ${t} instanceof deps.ConstantValue;\n const ${t}_cv = ${t}_const ? ${t}.value : 0;\n const ${t}_iv = ${t} instanceof deps.IntervalValue;\n const ${t}_slot = ${t}_iv ? ${t}.indexCount : -1;\n const ${t}_col = ${t}_slot >= 0 && ${t}_slot < ms;\n const ${t}_a = ${t}_iv ? ${t}.a : 0, ${t}_b = ${t}_iv ? ${t}.b : 0;`}function ai(t,e,i){return`let ${e};\n if (${t}_tbl !== null) {\n const tt = ${i};\n if (tt <= 0) ${e} = ${t}_tbl[0];\n else if (tt >= 1) ${e} = ${t}_tbl[${t}_last];\n else {\n const x = tt * ${t}_last;\n const ix = x | 0;\n const v0 = ${t}_tbl[ix];\n ${e} = v0 + (${t}_tbl[ix + 1] - v0) * (x - ix);\n }\n } else if (${t}_const) ${e} = ${t}_cv;\n else if (${t}_iv) {\n // The particle's own sample, from the memory column when it holds it.\n let r = ${t}_col ? mem[row * ms + ${t}_slot] : NaN;\n if (r !== r) r = p.memory[${t}_slot];\n ${e} = (1 - r) * ${t}_a + r * ${t}_b;\n } else ${e} = ${t}.genValue(p.memory, ${i});`}function hi(t,e){return`const ${t} = ${e};\n const ${t}_tbl = ${t} instanceof deps.Gradient ? ${t}.sampledTable() : null;\n const ${t}_last = ${t}_tbl !== null ? ${t}_tbl.length / 4 - 1 : 0;\n const ${t}_cr = ${t} instanceof deps.ColorRange;\n const ${t}_slot = ${t}_cr ? ${t}.indexCount : -1;\n const ${t}_col = ${t}_slot >= 0 && ${t}_slot < ms;\n // Rounded to float32 as copying the colour into the particle does.\n const ${t}_ax = ${t}_cr ? Math.fround(${t}.a.x) : 0, ${t}_ay = ${t}_cr ? Math.fround(${t}.a.y) : 0;\n const ${t}_az = ${t}_cr ? Math.fround(${t}.a.z) : 0, ${t}_aw = ${t}_cr ? Math.fround(${t}.a.w) : 0;\n const ${t}_bx = ${t}_cr ? ${t}.b.x : 0, ${t}_by = ${t}_cr ? ${t}.b.y : 0;\n const ${t}_bz = ${t}_cr ? ${t}.b.z : 0, ${t}_bw = ${t}_cr ? ${t}.b.w : 0;`}function li(t,e){return`if (${t}_tbl !== null) {\n const tt = ${e};\n const tbl = ${t}_tbl;\n let r, g, b, a;\n if (tt <= 0) {\n r = tbl[0]; g = tbl[1]; b = tbl[2]; a = tbl[3];\n } else if (tt >= 1) {\n const o = ${t}_last * 4;\n r = tbl[o]; g = tbl[o + 1]; b = tbl[o + 2]; a = tbl[o + 3];\n } else {\n const x = tt * ${t}_last;\n const ix = x | 0;\n const fr = x - ix;\n const o = ix * 4;\n const nx = o + 4;\n r = tbl[o] + (tbl[nx] - tbl[o]) * fr;\n g = tbl[o + 1] + (tbl[nx + 1] - tbl[o + 1]) * fr;\n b = tbl[o + 2] + (tbl[nx + 2] - tbl[o + 2]) * fr;\n a = tbl[o + 3] + (tbl[nx + 3] - tbl[o + 3]) * fr;\n }\n color[o4] = Math.fround(r) * startColor[o4];\n color[o4 + 1] = Math.fround(g) * startColor[o4 + 1];\n color[o4 + 2] = Math.fround(b) * startColor[o4 + 2];\n color[o4 + 3] = Math.fround(a) * startColor[o4 + 3];\n } else if (${t}_cr) {\n let r = ${t}_col ? mem[row * ms + ${t}_slot] : NaN;\n if (r !== r) r = p.memory[${t}_slot];\n color[o4] = Math.fround(${t}_ax + (${t}_bx - ${t}_ax) * r) * startColor[o4];\n color[o4 + 1] = Math.fround(${t}_ay + (${t}_by - ${t}_ay) * r) * startColor[o4 + 1];\n color[o4 + 2] = Math.fround(${t}_az + (${t}_bz - ${t}_az) * r) * startColor[o4 + 2];\n color[o4 + 3] = Math.fround(${t}_aw + (${t}_bw - ${t}_aw) * r) * startColor[o4 + 3];\n } else {\n ${t}.genColor(p.memory, tmpColor, ${e});\n color[o4] = tmpColor.x * startColor[o4];\n color[o4 + 1] = tmpColor.y * startColor[o4 + 1];\n color[o4 + 2] = tmpColor.z * startColor[o4 + 2];\n color[o4 + 3] = tmpColor.w * startColor[o4 + 3];\n }`}function ci(t,e,i,s,r,n,o){return`{\n const cx = 2 * (${r} * ${i} - ${n} * ${e});\n const cy = 2 * (${n} * ${t} - ${s} * ${i});\n const cz = 2 * (${s} * ${e} - ${r} * ${t});\n const nx = ${t} + ${o} * cx + ${r} * cz - ${n} * cy;\n const ny = ${e} + ${o} * cy + ${n} * cx - ${s} * cz;\n ${i} = ${i} + ${o} * cz + ${s} * cy - ${r} * cx;\n ${t} = nx;\n ${e} = ny;\n }`}function ui(t,e){return`const ${t}_q = ${e};\n const ${t}x = ${t}_q.x, ${t}y = ${t}_q.y, ${t}z = ${t}_q.z, ${t}w = ${t}_q.w;`}function di(t,e){return`const ${t}_v = ${e};\n const ${t}x = ${t}_v.x, ${t}y = ${t}_v.y, ${t}z = ${t}_v.z;`}function pi(t,e,i,s){return`{\n const half = ${t} / 2;\n const sn = Math.sin(half);\n const qx = ${e} * sn, qy = ${i} * sn, qz = ${s} * sn, qw = Math.cos(half);\n ${ci("px","py","pz","qx","qy","qz","qw")}\n px = Math.fround(px); py = Math.fround(py); pz = Math.fround(pz);\n }`}function fi(t,e){switch(t.type){case"ColorOverLife":return{setup:hi(`g${e}`,`behaviors[${e}].color`),body:`{${li(`g${e}`,"t")}}`};case"SizeOverLife":return{setup:`const g${e} = behaviors[${e}].size;\n const vec3_${e} = g${e} instanceof deps.Vector3Function;\n ${oi(`sg${e}`,`g${e}`)}`,body:`if (vec3_${e}) {\n g${e}.genValue(p.memory, p.size, t).multiply(p.startSize);\n } else {\n ${ai(`sg${e}`,"v","t")}\n size[o3] = startSize[o3] * v;\n size[o3 + 1] = startSize[o3 + 1] * v;\n size[o3 + 2] = startSize[o3 + 2] * v;\n }`};case"ApplyForce":return{setup:`const b${e} = behaviors[${e}];\n const f${e} = b${e}.magnitudeValue * delta;\n const dx${e} = b${e}.direction.x * f${e};\n const dy${e} = b${e}.direction.y * f${e};\n const dz${e} = b${e}.direction.z * f${e};`,body:`vel[o3] += dx${e}; vel[o3 + 1] += dy${e}; vel[o3 + 2] += dz${e};`};case"RotationOverLife":return{setup:`${oi(`g${e}`,`behaviors[${e}].angularVelocity`)}\n const rotation_${e} = count > 0 ? particles[0].rotation : undefined;\n const angle_${e} = typeof rotation_${e} === 'number';\n const rq${e} = store.rotationQuaternion, aq${e} = store.angularVelocityQuaternion;\n const quat_${e} = !angle_${e} && rq${e}.length > 0 && rotation_${e} instanceof deps.Quaternion;`,body:`if (angle_${e}) {\n ${ai(`g${e}`,"rate","t")}\n rot[row] += delta * rate;\n angVel[row] = rate;\n } else if (quat_${e}) {\n ${ai(`g${e}`,"rate","t")}\n const half = (rate * delta) / 2;\n const qz = Math.sin(half), qw = Math.cos(half);\n const ax = rq${e}[o4], ay = rq${e}[o4 + 1], az = rq${e}[o4 + 2], aw = rq${e}[o4 + 3];\n rq${e}[o4] = ax * qw + ay * qz;\n rq${e}[o4 + 1] = ay * qw - ax * qz;\n rq${e}[o4 + 2] = az * qw + aw * qz;\n rq${e}[o4 + 3] = aw * qw - az * qz;\n aq${e}[o4] = 0; aq${e}[o4 + 1] = 0; aq${e}[o4 + 2] = qz; aq${e}[o4 + 3] = qw;\n }`};case"FrameOverLife":return{setup:oi(`g${e}`,`behaviors[${e}].frame`),body:`{${ai(`g${e}`,"v","t")} uvTile[row] = v;}`};case"SpeedOverLife":return{setup:oi(`g${e}`,`behaviors[${e}].speed`),body:`{${ai(`g${e}`,"v","t")} scalars[s + 2] = v;}`};case"ForceOverLife":return{setup:`const b${e} = behaviors[${e}];\n ${oi(`gx${e}`,`b${e}.x`)}\n ${oi(`gy${e}`,`b${e}.y`)}\n ${oi(`gz${e}`,`b${e}.z`)}\n const local${e} = b${e}.ps !== undefined && !b${e}.ps.worldSpace;\n ${di(`sc${e}`,`b${e}._tempScale`)}\n ${ui(`q${e}`,`b${e}._tempQ`)}`,body:`{\n ${ai(`gx${e}`,"fx","t")}\n ${ai(`gy${e}`,"fy","t")}\n ${ai(`gz${e}`,"fz","t")}\n if (local${e}) {\n fx *= sc${e}x; fy *= sc${e}y; fz *= sc${e}z;\n ${ci("fx","fy","fz",`q${e}x`,`q${e}y`,`q${e}z`,`q${e}w`)}\n }\n vel[o3] += fx * delta; vel[o3 + 1] += fy * delta; vel[o3 + 2] += fz * delta;}`};case"LimitSpeedOverLife":return{setup:`const b${e} = behaviors[${e}];\n ${oi(`g${e}`,`b${e}.speed`)}\n const dampen${e} = b${e}.dampen * delta * 20;`,body:`{const vx = vel[o3], vy = vel[o3 + 1], vz = vel[o3 + 2];\n const speed = Math.sqrt(vx * vx + vy * vy + vz * vz);\n ${ai(`g${e}`,"limit","t")}\n if (speed > limit) {\n const f = 1 - ((speed - limit) / speed) * dampen${e};\n vel[o3] = vx * f; vel[o3 + 1] = vy * f; vel[o3 + 2] = vz * f;\n }}`};case"GravityForce":return{setup:`const b${e} = behaviors[${e}];\n const cx${e} = b${e}.center.x, cy${e} = b${e}.center.y, cz${e} = b${e}.center.z;\n const gm${e} = b${e}.magnitude * delta;`,body:`{const dx = cx${e} - pos[o3], dy = cy${e} - pos[o3 + 1], dz = cz${e} - pos[o3 + 2];\n const d2 = dx * dx + dy * dy + dz * dz;\n if (d2 > 0) {\n const f = gm${e} / (d2 * Math.sqrt(d2));\n vel[o3] += dx * f; vel[o3 + 1] += dy * f; vel[o3 + 2] += dz * f;\n }}`};case"ColorBySpeed":return{setup:`const b${e} = behaviors[${e}];\n ${hi(`g${e}`,`b${e}.color`)}\n const lo${e} = b${e}.speedRange.a;\n const span${e} = b${e}.speedRange.b - lo${e};`,body:`{const ts = (startSpeed[row] - lo${e}) / span${e};\n ${li(`g${e}`,"ts")}}`};case"SizeBySpeed":return{setup:`const b${e} = behaviors[${e}];\n const g${e} = b${e}.size;\n const lo${e} = b${e}.speedRange.a;\n const span${e} = b${e}.speedRange.b - lo${e};\n const vec3_${e} = g${e} instanceof deps.Vector3Function;\n ${oi(`sg${e}`,`g${e}`)}`,body:`{const ts = (startSpeed[row] - lo${e}) / span${e};\n if (vec3_${e}) {\n g${e}.genValue(p.memory, p.size, ts).multiply(p.startSize);\n } else {\n ${ai(`sg${e}`,"v","ts")}\n size[o3] = startSize[o3] * v;\n size[o3 + 1] = startSize[o3 + 1] * v;\n size[o3 + 2] = startSize[o3 + 2] * v;\n }}`};case"RotationBySpeed":return{setup:`const b${e} = behaviors[${e}];\n ${oi(`g${e}`,`b${e}.angularVelocity`)}\n const lo${e} = b${e}.speedRange.a;\n const span${e} = b${e}.speedRange.b - lo${e};\n const angle_${e} = count > 0 && typeof particles[0].rotation === 'number';`,body:`if (angle_${e}) {\n const ts = (startSpeed[row] - lo${e}) / span${e};\n ${ai(`g${e}`,"rate","ts")}\n rot[row] += delta * rate;\n angVel[row] = rate;\n }`};case"OrbitOverLife":return{setup:`const b${e} = behaviors[${e}];\n ${oi(`g${e}`,`b${e}.orbitSpeed`)}\n ${di(`ax${e}`,`b${e}.axis`)}\n const alen${e} = ax${e}x * ax${e}x + ax${e}y * ax${e}y + ax${e}z * ax${e}z;\n const chalf${e} = (g${e}_cv * delta) / 2;\n const csn${e} = Math.sin(chalf${e});\n const cqx${e} = ax${e}x * csn${e}, cqy${e} = ax${e}y * csn${e}, cqz${e} = ax${e}z * csn${e};\n const cqw${e} = Math.cos(chalf${e});`,body:`{let px = pos[o3], py = pos[o3 + 1], pz = pos[o3 + 2];\n let tx = 0, ty = 0, tz = 0;\n if (alen${e} !== 0) {\n const f = (ax${e}x * px + ax${e}y * py + ax${e}z * pz) / alen${e};\n tx = ax${e}x * f; ty = ax${e}y * f; tz = ax${e}z * f;\n }\n let qx, qy, qz, qw;\n if (g${e}_const) {\n qx = cqx${e}; qy = cqy${e}; qz = cqz${e}; qw = cqw${e};\n } else {\n ${ai(`g${e}`,"sp","t")}\n const half = (sp * delta) / 2;\n const sn = Math.sin(half);\n qx = ax${e}x * sn; qy = ax${e}y * sn; qz = ax${e}z * sn; qw = Math.cos(half);\n }\n px = Math.fround(px - tx); py = Math.fround(py - ty); pz = Math.fround(pz - tz);\n ${ci("px","py","pz","qx","qy","qz","qw")}\n pos[o3] = Math.fround(px) + tx;\n pos[o3 + 1] = Math.fround(py) + ty;\n pos[o3 + 2] = Math.fround(pz) + tz;}`};case"Rotation3DOverLife":return{setup:`const b${e} = behaviors[${e}];\n const g${e} = b${e}.angularVelocity;\n const q${e} = b${e}.tempQuat;\n const rq${e} = store.rotationQuaternion, aq${e} = store.angularVelocityQuaternion;\n const quat_${e} = rq${e}.length > 0 && count > 0 && particles[0].rotation instanceof deps.Quaternion;\n const fixed_${e} = g${e} instanceof deps.AxisAngleGenerator && g${e}.angle instanceof deps.ConstantValue;\n let cqx${e} = 0, cqy${e} = 0, cqz${e} = 0, cqw${e} = 1;\n if (fixed_${e}) {\n g${e}.genValue(undefined, q${e}, delta, 0);\n cqx${e} = q${e}.x; cqy${e} = q${e}.y; cqz${e} = q${e}.z; cqw${e} = q${e}.w;\n }`,body:`if (quat_${e}) {\n let qx, qy, qz, qw;\n if (fixed_${e}) {\n qx = cqx${e}; qy = cqy${e}; qz = cqz${e}; qw = cqw${e};\n } else {\n g${e}.genValue(p.memory, q${e}, delta, t);\n qx = q${e}.x; qy = q${e}.y; qz = q${e}.z; qw = q${e}.w;\n }\n const ax = rq${e}[o4], ay = rq${e}[o4 + 1], az = rq${e}[o4 + 2], aw = rq${e}[o4 + 3];\n rq${e}[o4] = ax * qw + aw * qx + ay * qz - az * qy;\n rq${e}[o4 + 1] = ay * qw + aw * qy + az * qx - ax * qz;\n rq${e}[o4 + 2] = az * qw + aw * qz + ax * qy - ay * qx;\n rq${e}[o4 + 3] = aw * qw - ax * qx - ay * qy - az * qz;\n aq${e}[o4] = qx; aq${e}[o4 + 1] = qy; aq${e}[o4 + 2] = qz; aq${e}[o4 + 3] = qw;\n }`};case"VelocityOverLife":return{setup:`const b${e} = behaviors[${e}];\n ${oi(`lx${e}`,`b${e}.linearX`)}\n ${oi(`ly${e}`,`b${e}.linearY`)}\n ${oi(`lz${e}`,`b${e}.linearZ`)}\n ${oi(`ox${e}`,`b${e}.orbitalX`)}\n ${oi(`oy${e}`,`b${e}.orbitalY`)}\n ${oi(`oz${e}`,`b${e}.orbitalZ`)}\n ${di(`aX${e}`,`b${e}._axisX`)}\n ${di(`aY${e}`,`b${e}._axisY`)}\n ${di(`aZ${e}`,`b${e}._axisZ`)}\n ${di(`pv${e}`,`b${e}._tempEmitterPos`)}\n const world${e} = b${e}.ps !== undefined && b${e}.ps.worldSpace;\n const toWorld${e} = world${e} && b${e}.space === 'local';\n const convert${e} = toWorld${e} || (!world${e} && b${e}.space === 'world');\n ${di(`sc${e}`,`toWorld${e} ? b${e}._tempScale : b${e}._tempScaleInv`)}\n ${ui(`q${e}`,`toWorld${e} ? b${e}._tempQ : b${e}._tempQInv`)}`,body:`{\n ${ai(`lx${e}`,"fx","t")}\n ${ai(`ly${e}`,"fy","t")}\n ${ai(`lz${e}`,"fz","t")}\n if (convert${e}) {\n fx *= sc${e}x; fy *= sc${e}y; fz *= sc${e}z;\n ${ci("fx","fy","fz",`q${e}x`,`q${e}y`,`q${e}z`,`q${e}w`)}\n }\n let px = Math.fround(pos[o3] + fx * delta);\n let py = Math.fround(pos[o3 + 1] + fy * delta);\n let pz = Math.fround(pos[o3 + 2] + fz * delta);\n ${ai(`ox${e}`,"rx","t")}\n ${ai(`oy${e}`,"ry","t")}\n ${ai(`oz${e}`,"rz","t")}\n rx *= delta; ry *= delta; rz *= delta;\n if (rx !== 0 || ry !== 0 || rz !== 0) {\n if (world${e}) {\n px = Math.fround(px - pv${e}x); py = Math.fround(py - pv${e}y); pz = Math.fround(pz - pv${e}z);\n }\n if (rx !== 0) ${pi("rx",`aX${e}x`,`aX${e}y`,`aX${e}z`)}\n if (ry !== 0) ${pi("ry",`aY${e}x`,`aY${e}y`,`aY${e}z`)}\n if (rz !== 0) ${pi("rz",`aZ${e}x`,`aZ${e}y`,`aZ${e}z`)}\n if (world${e}) {\n px = Math.fround(px + pv${e}x); py = Math.fround(py + pv${e}y); pz = Math.fround(pz + pv${e}z);\n }\n }\n pos[o3] = px; pos[o3 + 1] = py; pos[o3 + 2] = pz;}`};case"InheritVelocity":return{setup:`const b${e} = behaviors[${e}];\n const ps${e} = b${e}.ps;\n const ev${e} = b${e}.mode === 'current' && ps${e} !== undefined ? ps${e}.emitterVelocity : undefined;\n const active${e} = ev${e} !== undefined;\n let ivx${e} = 0, ivy${e} = 0, ivz${e} = 0;\n if (active${e}) {\n ivx${e} = ev${e}.x; ivy${e} = ev${e}.y; ivz${e} = ev${e}.z;\n if (!ps${e}.worldSpace) {\n ${di(`sc${e}`,`b${e}._tempScaleInv`)}\n ${ui(`q${e}`,`b${e}._tempQInv`)}\n ivx${e} *= sc${e}x; ivy${e} *= sc${e}y; ivz${e} *= sc${e}z;\n ${ci(`ivx${e}`,`ivy${e}`,`ivz${e}`,`q${e}x`,`q${e}y`,`q${e}z`,`q${e}w`)}\n }\n }\n ${oi(`gm${e}`,`b${e}.multiplier`)}`,body:`if (active${e}) {\n ${ai(`gm${e}`,"m","t")}\n const f = m * delta;\n pos[o3] += ivx${e} * f; pos[o3 + 1] += ivy${e} * f; pos[o3 + 2] += ivz${e} * f;\n }`};default:return null}}const mi=new Map;function yi(t,e,i){const s=mi.get(i);if(void 0!==s)return s??void 0;const r=function(t,e){const i=`\n if (count === 0) return;\n if (store === undefined) {\n store = particles[0].store;\n if (store === undefined) {\n // Particles of some other implementation, without columns: run the behaviors as they are.\n for (const k of [${e.join(", ")}]) {\n const b = behaviors[k];\n for (let i = 0; i < count; i++) {\n const p = particles[i];\n if (p.age < p.life) b.update(p, delta);\n }\n }\n return;\n }\n }\n const pos = store.position, vel = store.velocity;\n const size = store.size, startSize = store.startSize;\n const color = store.color, startColor = store.startColor;\n const scalars = store.scalars;\n const rot = store.rotation, angVel = store.angularVelocity;\n const uvTile = store.uvTile, startSpeed = store.startSpeed;\n const mem = store.memory, ms = store.memoryStride;\n ${t.map(t=>t.setup).join("\n")}\n // The system keeps particles[i] on row i. Anything else (a hand-built\n // list) is caught by its ends and read through each particle's row.\n const mapped = particles[0].storeIndex !== 0 || particles[count - 1].storeIndex !== count - 1;\n for (let i = 0; i < count; i++) {\n const p = particles[i];\n const row = mapped ? p.storeIndex : i;\n const s = row * 3;\n const age = scalars[s], life = scalars[s + 1];\n if (age >= life) continue;\n const t = age / life;\n const o3 = row * 3, o4 = row * 4;\n ${t.map(t=>t.body).join("\n")}\n }`;try{return new Function("deps",`const tmpColor = new deps.Vector4View(new Float32Array(4), 0);\n return function (behaviors, particles, count, delta, store) {${i}};`)(ni)}catch(t){return}}(t,e);return mi.set(i,r??null),r}function vi(t){const e=[];let i=[],s=[],r=[],n=0;const o=()=>{if(0===s.length)return;const t=`${n}:${i.map(t=>t.type).join(",")}`,o=yi(s,r,t);if(void 0!==o)e.push({behaviors:i,run:o});else for(const t of i)e.push({behaviors:[t]});i=[],s=[],r=[]};for(let a=0;a<t.length;a++){const h=t[a],l=fi(h,a);null!==l?(0===s.length&&(n=a),i.push(h),s.push(l),r.push(a)):(o(),e.push({behaviors:[h]}))}return o(),e}var gi,xi;exports.BoxEmitFrom=void 0,(gi=exports.BoxEmitFrom||(exports.BoxEmitFrom={}))[gi.Volume=0]="Volume",gi[gi.Shell=1]="Shell",gi[gi.Edge=2]="Edge";class Si{constructor(t={}){this.type="box",this._point=[0,0,0],this.width=t.width??1,this.height=t.height??1,this.depth=t.depth??1,this.emitFrom=t.emitFrom??exports.BoxEmitFrom.Volume,this.boxThickness=t.boxThickness?[...t.boxThickness]:[0,0,0]}update(t,e){}initialize(t,e){const i=this._point;for(let t=0;t<3;t++)i[t]=2*S()-1;const s=Math.floor(3*S())%3;this.emitFrom===exports.BoxEmitFrom.Shell?i[s]=this.onSurface(s):this.emitFrom===exports.BoxEmitFrom.Edge&&(i[(s+1)%3]=this.onSurface((s+1)%3),i[(s+2)%3]=this.onSurface((s+2)%3)),t.position.set(i[0]*this.width/2,i[1]*this.height/2,i[2]*this.depth/2),t.velocity.set(0,0,t.startSpeed)}onSurface(t){const e=S()<.5?-1:1,i=this.boxThickness[t];return i<=0||S()<.5?e:e*(1-2*i*S())}toJSON(){return{type:"box",width:this.width,height:this.height,depth:this.depth,emitFrom:this.emitFrom,boxThickness:[...this.boxThickness]}}static fromJSON(t){return new Si({width:t.width,height:t.height,depth:t.depth,emitFrom:t.emitFrom,boxThickness:Array.isArray(t.boxThickness)?t.boxThickness:void 0})}clone(){return new Si({width:this.width,height:this.height,depth:this.depth,emitFrom:this.emitFrom,boxThickness:this.boxThickness})}}function wi(t,e,i,s){let r;switch(exports.EmitterMode.Random===t?e=S():exports.EmitterMode.Burst===t&&s.isBursting&&(e=s.burstParticleIndex/s.burstParticleCount),r=i>0?Math.floor(e/i)*i:e,t){case exports.EmitterMode.Loop:r%=1;break;case exports.EmitterMode.PingPong:r=Math.abs(r%2-1)}return r}exports.EmitterMode=void 0,(xi=exports.EmitterMode||(exports.EmitterMode={}))[xi.Random=0]="Random",xi[xi.Loop=1]="Loop",xi[xi.PingPong=2]="PingPong",xi[xi.Burst=3]="Burst";class bi{constructor(t,e,i){this.position=t??new H,this.rotation=e??new Z,this.scale=i??new H(1,1,1)}apply(t){t.position.multiply(this.scale).applyQuaternion(this.rotation).add(this.position);const e=t.velocity,i=e.length();if(0===i)return;e.multiply(this.scale).applyQuaternion(this.rotation);const s=e.length();s>0&&e.multiplyScalar(i/s)}isIdentity(){const{position:t,rotation:e,scale:i}=this;return 0===t.x&&0===t.y&&0===t.z&&0===e.x&&0===e.y&&0===e.z&&1===e.w&&1===i.x&&1===i.y&&1===i.z}toJSON(){const t={},{position:e,rotation:i,scale:s}=this;return 0===e.x&&0===e.y&&0===e.z||(t.position=[e.x,e.y,e.z]),0===i.x&&0===i.y&&0===i.z&&1===i.w||(t.rotation=[i.x,i.y,i.z,i.w]),1===s.x&&1===s.y&&1===s.z||(t.scale=[s.x,s.y,s.z]),t}static fromJSON(t){if(!t)return;const{position:e,rotation:i,scale:s}=t;return new bi(e?new H(e[0],e[1],e[2]):void 0,i?new Z(i[0],i[1],i[2],i[3]):void 0,s?new H(s[0],s[1],s[2]):void 0)}static toShapeJSON(t){return t&&!t.isIdentity()?{transform:t.toJSON()}:{}}clone(){return new bi(this.position.clone(),this.rotation.clone(),this.scale.clone())}}class zi{constructor(t={}){this.type="circle",this.currentValue=0,this.radius=t.radius??10,this.arc=t.arc??2*Math.PI,this.thickness=t.thickness??1,this.mode=t.mode??exports.EmitterMode.Random,this.spread=t.spread??0,this.speed=t.speed??new Ct(1),this.memory=[],this.transform=t.transform}update(t,e){this.currentValue+=this.speed.genValue(this.memory,t.emissionState.time/t.duration)*e}initialize(t,e){const i=wi(this.mode,this.currentValue,this.spread,e),s=X.lerp(1-this.thickness,1,S()),r=i*this.arc;t.position.x=Math.cos(r),t.position.y=Math.sin(r),t.position.z=0,t.velocity.copy(t.position).multiplyScalar(t.startSpeed),t.position.multiplyScalar(this.radius*s),this.transform?.apply(t)}toJSON(){return{type:"circle",radius:this.radius,arc:this.arc,thickness:this.thickness,mode:this.mode,spread:this.spread,speed:this.speed.toJSON(),...bi.toShapeJSON(this.transform)}}static fromJSON(t){return new zi({radius:t.radius,arc:t.arc,thickness:t.thickness,mode:t.mode,speed:t.speed?It(t.speed):void 0,transform:bi.fromJSON(t.transform),spread:t.spread})}clone(){return new zi({radius:this.radius,arc:this.arc,thickness:this.thickness,mode:this.mode,speed:this.speed.clone(),transform:this.transform?.clone(),spread:this.spread})}}class Mi{constructor(t={}){this.type="cone",this.currentValue=0,this.radius=t.radius??10,this.arc=t.arc??2*Math.PI,this.thickness=t.thickness??1,this.angle=t.angle??Math.PI/6,this.mode=t.mode??exports.EmitterMode.Random,this.spread=t.spread??0,this.speed=t.speed??new Ct(1),this.memory=[],this.transform=t.transform}update(t,e){exports.EmitterMode.Random!=this.mode&&(this.currentValue+=this.speed.genValue(this.memory,t.emissionState.time/t.duration)*e)}initialize(t,e){const i=wi(this.mode,this.currentValue,this.spread,e),s=X.lerp(1-this.thickness,1,S()),r=i*this.arc,n=Math.sqrt(s),o=Math.sin(r),a=Math.cos(r);t.position.x=n*a,t.position.y=n*o,t.position.z=0;const h=this.angle*n;t.velocity.set(0,0,Math.cos(h)).addScaledVector(t.position,Math.sin(h)).multiplyScalar(t.startSpeed),t.position.multiplyScalar(this.radius),this.transform?.apply(t)}toJSON(){return{type:"cone",radius:this.radius,arc:this.arc,thickness:this.thickness,angle:this.angle,mode:this.mode,spread:this.spread,speed:this.speed.toJSON(),...bi.toShapeJSON(this.transform)}}static fromJSON(t){return new Mi({radius:t.radius,arc:t.arc,thickness:t.thickness,angle:t.angle,mode:t.mode,speed:t.speed?It(t.speed):void 0,transform:bi.fromJSON(t.transform),spread:t.spread})}clone(){return new Mi({radius:this.radius,arc:this.arc,thickness:this.thickness,angle:this.angle,mode:this.mode,speed:this.speed.clone(),transform:this.transform?.clone(),spread:this.spread})}}class _i{constructor(t={}){this.type="donut",this.currentValue=0,this.radius=t.radius??10,this.arc=t.arc??2*Math.PI,this.thickness=t.thickness??1,this.donutRadius=t.donutRadius??.2*this.radius,this.mode=t.mode??exports.EmitterMode.Random,this.spread=t.spread??0,this.speed=t.speed??new Ct(1),this.memory=[],this.transform=t.transform,this._m1=new st}update(t,e){exports.EmitterMode.Random!=this.mode&&(this.currentValue+=this.speed.genValue(this.memory,t.emissionState.time/t.duration)*e)}initialize(t,e){const i=wi(this.mode,this.currentValue,this.spread,e),s=S(),r=X.lerp(1-this.thickness,1,S()),n=i*this.arc,o=s*Math.PI*2,a=Math.sin(n),h=Math.cos(n);if(t.position.x=this.radius*h,t.position.y=this.radius*a,t.position.z=0,t.velocity.z=this.donutRadius*r*Math.sin(o),t.velocity.x=this.donutRadius*r*Math.cos(o)*h,t.velocity.y=this.donutRadius*r*Math.cos(o)*a,t.position.add(t.velocity),t.velocity.normalize().multiplyScalar(t.startSpeed),t.rotation instanceof Z){const e=t.rotation;0===e.x&&0===e.y&&0===e.z&&1===e.w&&(this._m1.lookAt(ue,t.velocity,ce),t.rotation.setFromRotationMatrix(this._m1))}this.transform?.apply(t)}toJSON(){return{type:"donut",radius:this.radius,arc:this.arc,thickness:this.thickness,donutRadius:this.donutRadius,mode:this.mode,spread:this.spread,speed:this.speed.toJSON(),...bi.toShapeJSON(this.transform)}}static fromJSON(t){return new _i({radius:t.radius,arc:t.arc,thickness:t.thickness,donutRadius:t.donutRadius,mode:t.mode,speed:t.speed?It(t.speed):void 0,transform:bi.fromJSON(t.transform),spread:t.spread})}clone(){return new _i({radius:this.radius,arc:this.arc,thickness:this.thickness,donutRadius:this.donutRadius,mode:this.mode,speed:this.speed.clone(),transform:this.transform?.clone(),spread:this.spread})}}class Pi{constructor(t={}){this.type="edge",this.currentValue=0,this.radius=t.radius??1,this.mode=t.mode??exports.EmitterMode.Random,this.spread=t.spread??0,this.speed=t.speed??new Ct(1),this.memory=[]}update(t,e){exports.EmitterMode.Random!=this.mode&&(this.currentValue+=this.speed.genValue(this.memory,t.emissionState.time/t.duration)*e)}initialize(t,e){const i=wi(this.mode,this.currentValue,this.spread,e);t.position.set((2*i-1)*this.radius,0,0),t.velocity.set(0,t.startSpeed,0)}toJSON(){return{type:"edge",radius:this.radius,mode:this.mode,spread:this.spread,speed:this.speed.toJSON()}}static fromJSON(t){return new Pi({radius:t.radius,mode:t.mode,speed:t.speed?It(t.speed):void 0,spread:t.spread})}clone(){return new Pi({radius:this.radius,mode:this.mode,speed:this.speed.clone(),spread:this.spread})}}class Ti{constructor(t={}){this.type="grid",this.width=t.width??1,this.height=t.height??1,this.column=t.column??10,this.row=t.row??10,this.transform=t.transform}initialize(t){const e=Math.floor(S()*this.row),i=Math.floor(S()*this.column);t.position.x=i*this.width/this.column-this.width/2,t.position.y=e*this.height/this.row-this.height/2,t.position.z=0,t.velocity.set(0,0,t.startSpeed),this.transform?.apply(t)}toJSON(){return{type:"grid",width:this.width,height:this.height,column:this.column,row:this.row,...bi.toShapeJSON(this.transform)}}static fromJSON(t){return new Ti({...t,transform:bi.fromJSON(t.transform)})}clone(){return new Ti({width:this.width,height:this.height,column:this.column,row:this.row,transform:this.transform?.clone()})}update(t,e){}}class Vi{constructor(t={}){this.type="hemisphere",this.currentValue=0,this.radius=t.radius??10,this.arc=t.arc??2*Math.PI,this.thickness=t.thickness??1,this.mode=t.mode??exports.EmitterMode.Random,this.spread=t.spread??0,this.speed=t.speed??new Ct(1),this.memory=[],this.transform=t.transform,this._m1=new st}update(t,e){exports.EmitterMode.Random!=this.mode&&(this.currentValue+=this.speed.genValue(this.memory,t.emissionState.time/t.duration)*e)}initialize(t,e){const i=wi(this.mode,this.currentValue,this.spread,e),s=S(),r=X.lerp(1-this.thickness,1,S()),n=i*this.arc,o=Math.acos(s),a=Math.sin(n),h=Math.cos(n),l=Math.sin(o),c=Math.cos(o);if(t.position.x=l*h,t.position.y=l*a,t.position.z=c,t.velocity.copy(t.position).multiplyScalar(t.startSpeed),t.position.multiplyScalar(this.radius*r),t.rotation instanceof Z){const e=t.rotation;0===e.x&&0===e.y&&0===e.z&&1===e.w&&(this._m1.lookAt(ue,t.position,ce),t.rotation.setFromRotationMatrix(this._m1))}this.transform?.apply(t)}toJSON(){return{type:"hemisphere",radius:this.radius,arc:this.arc,thickness:this.thickness,mode:this.mode,spread:this.spread,speed:this.speed.toJSON(),...bi.toShapeJSON(this.transform)}}static fromJSON(t){return new Vi({radius:t.radius,arc:t.arc,thickness:t.thickness,mode:t.mode,speed:t.speed?It(t.speed):void 0,transform:bi.fromJSON(t.transform),spread:t.spread})}clone(){return new Vi({radius:this.radius,arc:this.arc,thickness:this.thickness,mode:this.mode,speed:this.speed.clone(),transform:this.transform?.clone(),spread:this.spread})}}class Oi{constructor(t){this.type="point",this._m1=new st,this.transform=t}update(t,e){}initialize(t){const e=S(),i=S(),s=e*Math.PI*2,r=Math.acos(2*i-1),n=Math.cbrt(S()),o=Math.sin(s),a=Math.cos(s),h=Math.sin(r),l=Math.cos(r);if(t.velocity.x=n*h*a,t.velocity.y=n*h*o,t.velocity.z=n*l,t.velocity.multiplyScalar(t.startSpeed),t.position.setScalar(0),t.rotation instanceof Z){const e=t.rotation;0===e.x&&0===e.y&&0===e.z&&1===e.w&&(this._m1.lookAt(ue,t.velocity,ce),t.rotation.setFromRotationMatrix(this._m1))}this.transform?.apply(t)}toJSON(){return{type:"point",...bi.toShapeJSON(this.transform)}}static fromJSON(t){return new Oi(bi.fromJSON(t?.transform))}clone(){return new Oi(this.transform?.clone())}}class Ci{constructor(t={}){this.type="sphere",this.currentValue=0,this.radius=t.radius??10,this.arc=t.arc??2*Math.PI,this.thickness=t.thickness??1,this.mode=t.mode??exports.EmitterMode.Random,this.spread=t.spread??0,this.speed=t.speed??new Ct(1),this.memory=[],this.transform=t.transform,this._m1=new st}update(t,e){exports.EmitterMode.Random!=this.mode&&(this.currentValue+=this.speed.genValue(this.memory,t.emissionState.time/t.duration)*e)}initialize(t,e){const i=wi(this.mode,this.currentValue,this.spread,e),s=S(),r=X.lerp(1-this.thickness,1,S()),n=i*this.arc,o=Math.acos(2*s-1),a=Math.sin(n),h=Math.cos(n),l=Math.sin(o),c=Math.cos(o);if(t.position.x=l*h,t.position.y=l*a,t.position.z=c,t.velocity.copy(t.position).multiplyScalar(t.startSpeed),t.position.multiplyScalar(this.radius*r),t.rotation instanceof Z){const e=t.rotation;0===e.x&&0===e.y&&0===e.z&&1===e.w&&(this._m1.lookAt(ue,t.position,ce),t.rotation.setFromRotationMatrix(this._m1))}this.transform?.apply(t)}toJSON(){return{type:"sphere",radius:this.radius,arc:this.arc,thickness:this.thickness,mode:this.mode,spread:this.spread,speed:this.speed.toJSON(),...bi.toShapeJSON(this.transform)}}static fromJSON(t){return new Ci({radius:t.radius,arc:t.arc,thickness:t.thickness,mode:t.mode,speed:t.speed?It(t.speed):void 0,transform:bi.fromJSON(t.transform),spread:t.spread})}clone(){return new Ci({radius:this.radius,arc:this.arc,thickness:this.thickness,mode:this.mode,speed:this.speed.clone(),transform:this.transform?.clone(),spread:this.spread})}}class Fi{constructor(t={}){this.type="rectangle",this.currentValue=0,this.width=t.width??10,this.height=t.height??10,this.thickness=t.thickness??1,this.mode=t.mode??exports.EmitterMode.Random,this.spread=t.spread??0,this.speed=t.speed??new Ct(1),this.memory=[],this.transform=t.transform,this._m1=new st}update(t,e){this.currentValue+=this.speed.genValue(this.memory,t.emissionState.time/t.duration)*e}initialize(t,e){const i=wi(this.mode,this.currentValue,this.spread,e);S();const s=i*(2*(this.width+this.height));let r,n;s<this.width?(r=s-this.width/2,n=-this.height/2):s<this.width+this.height?(r=this.width/2,n=s-this.width-this.height/2):s<2*this.width+this.height?(r=this.width/2-(s-this.width-this.height),n=this.height/2):(r=-this.width/2,n=this.height/2-(s-2*this.width-this.height));const o=S(),a=1-this.thickness*o;if(t.position.x=r*a,t.position.y=n*a,t.position.z=0,t.velocity.x=r,t.velocity.y=n,t.velocity.z=0,t.velocity.normalize().multiplyScalar(t.startSpeed),t.rotation instanceof Z){const e=t.rotation;0===e.x&&0===e.y&&0===e.z&&1===e.w&&(this._m1.lookAt(ue,t.velocity,ce),t.rotation.setFromRotationMatrix(this._m1))}this.transform?.apply(t)}toJSON(){return{type:"rectangle",width:this.width,height:this.height,thickness:this.thickness,mode:this.mode,spread:this.spread,speed:this.speed.toJSON(),...bi.toShapeJSON(this.transform)}}static fromJSON(t){return new Fi({width:t.width,height:t.height,thickness:t.thickness,mode:t.mode,speed:t.speed?It(t.speed):void 0,transform:bi.fromJSON(t.transform),spread:t.spread})}clone(){return new Fi({width:this.width,height:this.height,thickness:this.thickness,mode:this.mode,speed:this.speed.clone(),transform:this.transform?.clone(),spread:this.spread})}}const Bi={box:{type:"box",params:[["width",["number"]],["height",["number"]],["depth",["number"]],["emitFrom",["number"]],["boxThickness",["vec3"]]],constructor:Si,loadJSON:Si.fromJSON},circle:{type:"circle",params:[["radius",["number"]],["arc",["radian"]],["thickness",["number"]],["mode",["emitterMode"]],["spread",["number"]],["speed",["valueFunc","value"]]],constructor:zi,loadJSON:zi.fromJSON},cone:{type:"cone",params:[["radius",["number"]],["arc",["radian"]],["thickness",["number"]],["angle",["radian"]],["mode",["emitterMode"]],["spread",["number"]],["speed",["valueFunc","value"]]],constructor:Mi,loadJSON:Mi.fromJSON},donut:{type:"donut",params:[["radius",["number"]],["arc",["radian"]],["thickness",["number"]],["donutRadius",["number"]],["mode",["emitterMode"]],["spread",["number"]],["speed",["valueFunc","value"]]],constructor:_i,loadJSON:_i.fromJSON},edge:{type:"edge",params:[["radius",["number"]],["mode",["emitterMode"]],["spread",["number"]],["speed",["valueFunc","value"]]],constructor:Pi,loadJSON:Pi.fromJSON},point:{type:"point",params:[],constructor:Oi,loadJSON:Oi.fromJSON},sphere:{type:"sphere",params:[["radius",["number"]],["arc",["radian"]],["thickness",["number"]],["angle",["radian"]],["mode",["emitterMode"]],["spread",["number"]],["speed",["valueFunc","value"]]],constructor:Ci,loadJSON:Ci.fromJSON},hemisphere:{type:"hemisphere",params:[["radius",["number"]],["arc",["radian"]],["thickness",["number"]],["angle",["radian"]],["mode",["emitterMode"]],["spread",["number"]],["speed",["valueFunc","value"]]],constructor:Vi,loadJSON:Vi.fromJSON},grid:{type:"grid",params:[["width",["number"]],["height",["number"]],["rows",["number"]],["column",["number"]]],constructor:Ti,loadJSON:Ti.fromJSON},rectangle:{type:"rectangle",params:[["width",["number"]],["height",["number"]],["thickness",["number"]],["mode",["emitterMode"]],["spread",["number"]],["speed",["valueFunc","value"]]],constructor:Fi,loadJSON:Fi.fromJSON}};function Ai(t,e){return Bi[t.type].loadJSON(t,e)}const $i=[];function Ii(t){if(!$i.find(e=>e.id===t.id)){t.initialize();for(const e of t.emitterShapes)Bi[e.type]||(Bi[e.type]=e);for(const e of t.behaviors)si[e.type]||(si[e.type]=e)}}class Ei{get mesh(){return this._mesh}set mesh(e){if(this._mesh=e,!e)return;const i=e.getVerticesData(t.VertexBuffer.PositionKind),s=e.getIndices();if(!i||!s)return;this._positions=new Float32Array(i),this._indices=new Int32Array(s),this._triangleIndexToArea.length=0;let r=0;const n=s.length/3;this._triangleIndexToArea.push(0);const o=new H,a=new H,h=new H;for(let t=0;t<n;t++){const e=s[3*t],n=s[3*t+1],l=s[3*t+2];o.set(i[3*e],i[3*e+1],i[3*e+2]),a.set(i[3*n],i[3*n+1],i[3*n+2]),h.set(i[3*l],i[3*l+1],i[3*l+2]),a.sub(o),h.sub(o);const c=new H;c.crossVectors(a,h),r+=.5*c.length(),this._triangleIndexToArea.push(r)}}constructor(t,e,i){this.type="mesh_surface",this._triangleIndexToArea=[],this._meshReferenceId=e,this.transform=i,t&&(this.mesh=t)}initialize(t){if(!this._positions||!this._indices)return t.position.set(0,0,0),t.velocity.set(0,0,1).multiplyScalar(t.startSpeed),void this.transform?.apply(t);const e=this._triangleIndexToArea.length-1;let i=0,s=e;const r=S()*this._triangleIndexToArea[e];for(;i+1<s;){const t=Math.floor((i+s)/2);r<this._triangleIndexToArea[t]?s=t:i=t}let n=S(),o=S();n+o>1&&(n=1-n,o=1-o);const a=this._indices[3*i],h=this._indices[3*i+1],l=this._indices[3*i+2],c=this._positions[3*a],u=this._positions[3*a+1],d=this._positions[3*a+2],p=this._positions[3*h]-c,f=this._positions[3*h+1]-u,m=this._positions[3*h+2]-d,y=this._positions[3*l]-c,v=this._positions[3*l+1]-u,g=this._positions[3*l+2]-d;t.position.set(c+p*n+y*o,u+f*n+v*o,d+m*n+g*o);const x=f*g-m*v,w=m*y-p*g,b=p*v-f*y,z=Math.sqrt(x*x+w*w+b*b)||1;t.velocity.set(x/z,w/z,b/z).multiplyScalar(t.startSpeed),this.transform?.apply(t)}toJSON(){return{type:"mesh_surface",mesh:this._mesh?this._mesh.uniqueId?.toString():this._meshReferenceId??"",...bi.toShapeJSON(this.transform)}}static fromJSON(t){return new Ei(void 0,t?.mesh,bi.fromJSON(t?.transform))}clone(){return new Ei(this._mesh,this._meshReferenceId,this.transform?.clone())}update(t,e){}}const Ni={id:"babylon.quarks",initialize:()=>{},emitterShapes:[{type:"mesh_surface",params:[["mesh",["mesh"]]],constructor:Ei,loadJSON:t=>Ei.fromJSON(t)}],behaviors:[]};const Li={};let Ri=!1;function Di(){Ri||(Li.tile_pars_vertex="\n#ifdef UV_TILE\n attribute float uvTile;\n uniform vec2 tileCount;\n\n mat3 makeTileTransform(float tileIndex) {\n float col = mod(tileIndex, tileCount.x);\n float row = (tileCount.y - floor(tileIndex / tileCount.x) - 1.0);\n return mat3(\n 1.0 / tileCount.x, 0.0, 0.0,\n 0.0, 1.0 / tileCount.y, 0.0,\n col / tileCount.x, row / tileCount.y, 1.0\n );\n }\n#else\n mat3 makeTileTransform(float tileIndex) {\n return mat3(1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0);\n }\n#endif\n\n#if defined(USE_UV)\n varying vec2 vUv;\n #ifdef TILE_BLEND\n varying vec2 vUvNext;\n varying float vUvBlend;\n #endif\n#endif\n",Li.tile_vertex="\n#ifdef UV_TILE\n mat3 tileTransform = makeTileTransform(floor(uvTile));\n #ifdef TILE_BLEND\n mat3 nextTileTransform = makeTileTransform(ceil(uvTile));\n vUvBlend = fract(uvTile);\n #endif\n#else\n mat3 tileTransform = makeTileTransform(0.0);\n#endif\n\n#if defined(USE_UV)\n vUv = (tileTransform * vec3(uv, 1.0)).xy;\n #if defined(TILE_BLEND) && defined(UV_TILE)\n vUvNext = (nextTileTransform * vec3(uv, 1.0)).xy;\n #endif\n#endif\n",Li.tile_pars_fragment="\n#if defined(USE_UV)\n varying vec2 vUv;\n #ifdef TILE_BLEND\n varying vec2 vUvNext;\n varying float vUvBlend;\n #endif\n#endif\n",Li.tile_fragment="\n#ifdef USE_MAP\n vec4 texelColor = texture2D(map, vUv);\n #ifdef TILE_BLEND\n texelColor = mix(texelColor, texture2D(map, vUvNext), vUvBlend);\n #endif\n diffuseColor *= texelColor;\n#endif\n",Li.soft_pars_vertex="\n#ifdef SOFT_PARTICLES\n varying vec4 projPosition;\n varying float linearDepth;\n#endif\n",Li.soft_vertex="\n#ifdef SOFT_PARTICLES\n projPosition = gl_Position;\n linearDepth = -mvPosition.z;\n#endif\n",Li.soft_pars_fragment="\n#ifdef SOFT_PARTICLES\n uniform sampler2D depthTexture;\n uniform vec4 projParams;\n uniform vec2 softParams;\n\n varying vec4 projPosition;\n varying float linearDepth;\n\n #define SOFT_NEAR_FADE softParams.x\n #define SOFT_INV_FADE_DISTANCE softParams.y\n\n #define zNear projParams.x\n #define zFar projParams.y\n\n float linearize_depth(float d) {\n return (zFar * zNear) / (zFar - d * (zFar - zNear));\n }\n#endif\n",Li.soft_fragment="\n#ifdef SOFT_PARTICLES\n\n vec2 p2 = projPosition.xy / projPosition.w;\n p2 = 0.5 * p2 + 0.5;\n\n float readDepth = texture2D(depthTexture, p2.xy).r;\n float viewDepth = linearize_depth(readDepth);\n float softParticlesFade = saturate(SOFT_INV_FADE_DISTANCE * ((viewDepth - SOFT_NEAR_FADE) - linearDepth));\n\n gl_FragColor *= softParticlesFade;\n#endif\n",Ri=!0)}const Ui="\n#ifdef FOG\nvarying vec3 vFogDistance;\n#endif\n";function qi(t){return`\n#ifdef FOG\n vFogDistance = ${t};\n#endif\n`}const ki="\n#ifdef FOG\nuniform vec4 vFogInfos;\nuniform vec3 vFogColor;\nvarying vec3 vFogDistance;\n\nfloat quarksFogFactor() {\n float fogCoeff = 1.0;\n float fogStart = vFogInfos.y;\n float fogEnd = vFogInfos.z;\n float fogDensity = vFogInfos.w;\n float fogDistance = length(vFogDistance);\n if (vFogInfos.x == 3.0) {\n fogCoeff = (fogEnd - fogDistance) / (fogEnd - fogStart);\n } else if (vFogInfos.x == 1.0) {\n fogCoeff = exp(-fogDistance * fogDensity);\n } else if (vFogInfos.x == 2.0) {\n fogCoeff = exp(-fogDistance * fogDistance * fogDensity * fogDensity);\n }\n return clamp(fogCoeff, 0.0, 1.0);\n}\n#endif\n";function Ji(t){return`\n#ifdef FOG\n {\n float fogFactor = quarksFogFactor();\n#ifdef FOG_ADDITIVE\n ${t} *= fogFactor;\n#else\n ${t} = mix(vFogColor, ${t}, fogFactor);\n#endif\n }\n#endif\n`}const Qi="\n#ifdef FOG\nvarying vFogDistance: vec3f;\n#endif\n";function Gi(t){return`\n#ifdef FOG\n vertexOutputs.vFogDistance = ${t};\n#endif\n`}const Wi="\n#ifdef FOG\nuniform vFogInfos: vec4f;\nuniform vFogColor: vec3f;\nvarying vFogDistance: vec3f;\n\nfn quarksFog(rgb: vec3f, fogDistanceVector: vec3f) -> vec3f {\n var fogCoeff = 1.0;\n let fogStart = uniforms.vFogInfos.y;\n let fogEnd = uniforms.vFogInfos.z;\n let fogDensity = uniforms.vFogInfos.w;\n let fogDistance = length(fogDistanceVector);\n if (uniforms.vFogInfos.x == 3.0) {\n fogCoeff = (fogEnd - fogDistance) / (fogEnd - fogStart);\n } else if (uniforms.vFogInfos.x == 1.0) {\n fogCoeff = exp(-fogDistance * fogDensity);\n } else if (uniforms.vFogInfos.x == 2.0) {\n fogCoeff = exp(-fogDistance * fogDistance * fogDensity * fogDensity);\n }\n let fogFactor = clamp(fogCoeff, 0.0, 1.0);\n#ifdef FOG_ADDITIVE\n return rgb * fogFactor;\n#else\n return mix(uniforms.vFogColor, rgb, fogFactor);\n#endif\n}\n#endif\n";function ji(t){return`\n#ifdef FOG\n ${t} = vec4f(quarksFog(${t}.rgb, fragmentInputs.vFogDistance), ${t}.a);\n#endif\n`}var Yi=`\nattribute vec3 position;\nattribute vec2 uv;\nattribute vec3 normal;\nattribute vec3 offset;\nattribute vec4 color;\nattribute vec3 size;\nattribute vec4 rotation;\nattribute float uvTile;\n\nuniform mat4 world;\nuniform mat4 view;\nuniform mat4 projection;\n\n#ifdef UV_TILE\nuniform float tileCountX;\nuniform float tileCountY;\n#endif\n\nvarying vec2 vUV;\nvarying vec4 vColor;\nvarying vec3 vNormal;\nvarying vec3 vWorldPos;\n\n#ifdef TILE_BLEND\nvarying vec2 vUV2;\nvarying float vTileBlend;\n#endif\n\n#ifdef SOFT_PARTICLES\nvarying vec4 projPosition;\nvarying float linearDepth;\n#endif\n\nvec3 applyQuaternion(vec3 v, vec4 q) {\n vec3 qVec = q.xyz;\n float qW = q.w;\n vec3 t = 2.0 * cross(qVec, v);\n return v + qW * t + cross(qVec, t);\n}\n\n${Ui}\nvoid main() {\n vec3 scaledPosition = position * size;\n vec3 rotatedPosition = applyQuaternion(scaledPosition, rotation);\n vec3 rotatedNormal = normalize(applyQuaternion(normal, rotation));\n vec3 localPos = rotatedPosition + offset;\n\n vec4 worldPos = world * vec4(localPos, 1.0);\n vec4 viewPos = view * worldPos;\n gl_Position = projection * viewPos;\n${qi("viewPos.xyz")}\n\n vWorldPos = worldPos.xyz;\n vNormal = normalize((world * vec4(rotatedNormal, 0.0)).xyz);\n\n#ifdef SOFT_PARTICLES\n projPosition = gl_Position;\n linearDepth = -viewPos.z;\n#endif\n\n#ifdef UV_TILE\n vec2 tc = vec2(tileCountX, tileCountY);\n float baseTile = floor(uvTile);\n float tileU = mod(baseTile, tc.x) / tc.x;\n float tileV = 1.0 - floor(baseTile / tc.x) / tc.y - 1.0 / tc.y;\n vUV = uv / tc + vec2(tileU, tileV);\n #ifdef TILE_BLEND\n float nextTile = ceil(uvTile);\n float nextU = mod(nextTile, tc.x) / tc.x;\n float nextV = 1.0 - floor(nextTile / tc.x) / tc.y - 1.0 / tc.y;\n vUV2 = uv / tc + vec2(nextU, nextV);\n vTileBlend = fract(uvTile);\n #endif\n#else\n vUV = uv;\n#endif\n\n vColor = color;\n}\n`,Xi=`\nvarying vec2 vUV;\nvarying vec4 vColor;\n\n#ifdef TILE_BLEND\nvarying vec2 vUV2;\nvarying float vTileBlend;\n#endif\n\n#ifdef USE_MAP\nuniform sampler2D map;\n#endif\n\n#ifdef SOFT_PARTICLES\nuniform sampler2D depthTexture;\nuniform vec2 softParams;\nuniform vec4 projParams;\nvarying vec4 projPosition;\nvarying float linearDepth;\n#endif\n\n#ifdef USE_ALPHATEST\nuniform float alphaTest;\n#endif\n\n${ki}\nvoid main() {\n vec4 baseColor = vColor;\n\n#ifdef USE_MAP\n vec4 texColor = texture2D(map, vUV);\n #ifdef TILE_BLEND\n vec4 texColor2 = texture2D(map, vUV2);\n texColor = mix(texColor, texColor2, vTileBlend);\n #endif\n baseColor *= texColor;\n#endif\n\n#ifdef USE_COLOR_AS_ALPHA\n baseColor.a *= (baseColor.r + baseColor.g + baseColor.b) / 3.0;\n#endif\n\n#ifdef USE_ALPHATEST\n if (baseColor.a < alphaTest) discard;\n#else\n if (baseColor.a < 0.01) discard;\n#endif\n\n${Ji("baseColor.rgb")}\n gl_FragColor = baseColor;\n\n#ifdef SOFT_PARTICLES\n vec2 p2 = projPosition.xy / projPosition.w;\n p2 = 0.5 * p2 + 0.5;\n float readDepth = texture2D(depthTexture, p2.xy).r;\n float zNear = projParams.x;\n float zFar = projParams.y;\n float viewDepth = (zFar * zNear) / (zFar - readDepth * (zFar - zNear));\n float fade = clamp(softParams.y * ((viewDepth - softParams.x) - linearDepth), 0.0, 1.0);\n gl_FragColor *= fade;\n#endif\n}\n`,Zi=`\nvarying vec2 vUV;\nvarying vec4 vColor;\nvarying vec3 vNormal;\nvarying vec3 vWorldPos;\n\n#ifndef MESH_UNLIT\nuniform vec3 lightDirection;\nuniform vec3 lightColor;\nuniform vec3 ambientColor;\n#endif\n\n#ifdef TILE_BLEND\nvarying vec2 vUV2;\nvarying float vTileBlend;\n#endif\n\n#ifdef USE_MAP\nuniform sampler2D map;\n#endif\n\n#if defined(USE_ENVMAP_ATLAS) || defined(MESH_RIM)\nuniform vec3 eyePosition;\n#endif\n\n#ifdef MESH_RIM\nuniform vec3 rimColor;\nuniform vec2 rimParams;\n#endif\n\n// One 3×2 atlas (px py pz / nx ny nz). Avoids samplerCube and multi-face\n// sampler bindings that raise GL_INVALID_OPERATION on iOS WebKit.\n#ifdef USE_ENVMAP_ATLAS\nuniform sampler2D envAtlas;\nuniform float reflectionLevel;\n\nvec3 sampleEnvAtlas(vec3 r) {\n vec3 a = abs(r);\n vec2 localUV;\n float cellX;\n float cellY;\n // Atlas layout: +X +Y +Z on row 0, -X -Y -Z on row 1.\n if (a.x >= a.y && a.x >= a.z) {\n cellX = 0.0;\n if (r.x >= 0.0) {\n cellY = 0.0;\n localUV = vec2(-r.z, -r.y) / a.x * 0.5 + 0.5;\n } else {\n cellY = 1.0;\n localUV = vec2(r.z, -r.y) / a.x * 0.5 + 0.5;\n }\n } else if (a.y >= a.z) {\n cellX = 1.0;\n if (r.y >= 0.0) {\n cellY = 0.0;\n localUV = vec2(r.x, r.z) / a.y * 0.5 + 0.5;\n } else {\n cellY = 1.0;\n localUV = vec2(r.x, -r.z) / a.y * 0.5 + 0.5;\n }\n } else {\n cellX = 2.0;\n if (r.z >= 0.0) {\n cellY = 0.0;\n localUV = vec2(r.x, -r.y) / a.z * 0.5 + 0.5;\n } else {\n cellY = 1.0;\n localUV = vec2(-r.x, -r.y) / a.z * 0.5 + 0.5;\n }\n }\n vec2 uv = (vec2(cellX, cellY) + clamp(localUV, 0.0, 1.0)) / vec2(3.0, 2.0);\n return texture2D(envAtlas, uv).rgb;\n}\n#endif\n\n#ifdef SOFT_PARTICLES\nuniform sampler2D depthTexture;\nuniform vec2 softParams;\nuniform vec4 projParams;\nvarying vec4 projPosition;\nvarying float linearDepth;\n#endif\n\n#ifdef USE_ALPHATEST\nuniform float alphaTest;\n#endif\n\n${ki}\nvoid main() {\n vec4 baseColor = vColor;\n\n#ifdef USE_MAP\n vec4 texColor = texture2D(map, vUV);\n #ifdef TILE_BLEND\n vec4 texColor2 = texture2D(map, vUV2);\n texColor = mix(texColor, texColor2, vTileBlend);\n #endif\n baseColor *= texColor;\n#endif\n\n#ifdef USE_ALPHATEST\n if (baseColor.a < alphaTest) discard;\n#else\n if (baseColor.a < 0.01) discard;\n#endif\n\n vec3 N = normalize(vNormal);\n#ifdef MESH_UNLIT\n vec3 color = baseColor.rgb;\n#else\n vec3 L = normalize(-lightDirection);\n float NdotL = max(dot(N, L), 0.0);\n vec3 litColor = ambientColor + lightColor * NdotL;\n\n vec3 color = baseColor.rgb * litColor;\n#endif\n\n#ifdef USE_ENVMAP_ATLAS\n vec3 viewDir = normalize(vWorldPos - eyePosition);\n vec3 reflectionCoords = reflect(viewDir, N);\n color += sampleEnvAtlas(reflectionCoords) * reflectionLevel;\n#endif\n\n#ifdef MESH_RIM\n // Fresnel: strongest where the surface turns away from the camera.\n vec3 V = normalize(eyePosition - vWorldPos);\n float rim = pow(1.0 - abs(dot(N, V)), rimParams.x) * rimParams.y;\n #ifdef MESH_RIM_MIX\n color = mix(color, rimColor, clamp(rim, 0.0, 1.0));\n #else\n color += rimColor * rim;\n #endif\n#endif\n\n${Ji("color")}\n gl_FragColor = vec4(color, baseColor.a);\n\n#ifdef SOFT_PARTICLES\n vec2 p2 = projPosition.xy / projPosition.w;\n p2 = 0.5 * p2 + 0.5;\n float readDepth = texture2D(depthTexture, p2.xy).r;\n float zNear = projParams.x;\n float zFar = projParams.y;\n float viewDepth = (zFar * zNear) / (zFar - readDepth * (zFar - zNear));\n float fade = clamp(softParams.y * ((viewDepth - softParams.x) - linearDepth), 0.0, 1.0);\n gl_FragColor *= fade;\n#endif\n}\n`,Hi=`\n// Per-vertex attributes\nattribute vec3 position;\nattribute vec2 uv;\n\n// Per-instance attributes\nattribute vec3 offset;\nattribute vec4 color;\nattribute vec3 size;\nattribute float rotation;\nattribute float uvTile;\n\n// Uniforms\nuniform mat4 world;\nuniform mat4 view;\nuniform mat4 projection;\nuniform mat4 worldViewProjection;\n\n#ifdef UV_TILE\nuniform float tileCountX;\nuniform float tileCountY;\n#endif\n\n#ifdef PIVOT\n// Quad offset in particle-size units: xy in the quad's plane, z toward the camera.\nuniform vec3 pivot;\n#endif\n\n// Varyings\nvarying vec2 vUV;\nvarying vec4 vColor;\n#ifdef TILE_BLEND\nvarying vec2 vUV2;\nvarying float vTileBlend;\n#endif\n#ifdef SOFT_PARTICLES\nvarying vec4 projPosition;\nvarying float linearDepth;\n#endif\n\n#ifdef SIZE_LIMITS\n// Smallest and largest size a particle may have on screen, as fractions of the viewport height.\nuniform vec2 sizeLimits;\n#endif\n${Ui}\nvoid main() {\n float c = cos(rotation);\n float s = sin(rotation);\n\n#ifdef SIZE_LIMITS\n // The particle's size on screen as a fraction of the viewport height, held\n // between the limits; a perspective projection divides by the view depth.\n vec4 limitCenter = view * world * vec4(offset, 1.0);\n float limitDepth = abs(projection[2][3]) > 0.0 ? abs(limitCenter.z) : 1.0;\n float screenSize = max(abs(size.x), abs(size.y)) * projection[1][1] / (2.0 * limitDepth);\n float sizeScale = screenSize > 0.0 ? clamp(screenSize, sizeLimits.x, sizeLimits.y) / screenSize : 1.0;\n vec3 limitedSize = size * sizeScale;\n#else\n vec3 limitedSize = size;\n#endif\n // A negative size mirrors the quad, which is how flipped particles arrive.\n vec2 alignedPosition = position.xy * limitedSize.xy;\n#ifdef PIVOT\n // The pivot turns with the particle but is not mirrored with it.\n alignedPosition += pivot.xy * abs(limitedSize.xy);\n#endif\n vec2 rotatedPosition;\n rotatedPosition.x = c * alignedPosition.x - s * alignedPosition.y;\n rotatedPosition.y = s * alignedPosition.x + c * alignedPosition.y;\n\n#ifdef HORIZONTAL\n vec4 mvPosition = world * vec4(offset, 1.0);\n mvPosition.x += rotatedPosition.x;\n mvPosition.z -= rotatedPosition.y;\n#ifdef PIVOT\n mvPosition.y += pivot.z * abs(limitedSize.x);\n#endif\n mvPosition = view * mvPosition;\n#elif defined(VERTICAL)\n vec4 mvPosition = world * vec4(offset, 1.0);\n mvPosition.y += rotatedPosition.y;\n mvPosition = view * mvPosition;\n mvPosition.x += rotatedPosition.x;\n#else\n vec4 mvPosition = view * world * vec4(offset, 1.0);\n mvPosition.xy += rotatedPosition;\n#endif\n#ifdef PIVOT\n#ifndef HORIZONTAL\n // Toward the camera along its view axis, whichever way the view space\n // faces: anything in front of the camera has the sign of the far side.\n mvPosition.z -= sign(mvPosition.z) * pivot.z * abs(limitedSize.x);\n#endif\n#endif\n\n gl_Position = projection * mvPosition;\n${qi("mvPosition.xyz")}\n#ifdef SOFT_PARTICLES\n projPosition = gl_Position;\n linearDepth = -mvPosition.z;\n#endif\n\n #ifdef UV_TILE\n vec2 tc = vec2(tileCountX, tileCountY);\n float baseTile = floor(uvTile);\n float tileU = mod(baseTile, tc.x) / tc.x;\n float tileV = 1.0 - floor(baseTile / tc.x) / tc.y - 1.0 / tc.y;\n vUV = uv / tc + vec2(tileU, tileV);\n #ifdef TILE_BLEND\n float nextTile = ceil(uvTile);\n float nextU = mod(nextTile, tc.x) / tc.x;\n float nextV = 1.0 - floor(nextTile / tc.x) / tc.y - 1.0 / tc.y;\n vUV2 = uv / tc + vec2(nextU, nextV);\n vTileBlend = fract(uvTile);\n #endif\n #else\n vUV = uv;\n #endif\n\n vColor = color;\n}\n`,Ki=`\n// Per-vertex attributes\nattribute vec3 position;\nattribute vec2 uv;\n\n// Per-instance attributes\nattribute vec3 offset;\nattribute vec4 color;\nattribute vec3 size;\nattribute float rotation;\nattribute float uvTile;\nattribute vec4 velocity;\n\n// Uniforms\nuniform mat4 world;\nuniform mat4 view;\nuniform mat4 projection;\nuniform float speedFactor;\n\n#ifdef UV_TILE\nuniform float tileCountX;\nuniform float tileCountY;\n#endif\n\n#ifdef PIVOT\n// Streak offset in particle-size units: x from head to tail, y across.\nuniform vec3 pivot;\n#endif\n\n// Varyings\nvarying vec2 vUV;\nvarying vec4 vColor;\n#ifdef TILE_BLEND\nvarying vec2 vUV2;\nvarying float vTileBlend;\n#endif\n#ifdef SOFT_PARTICLES\nvarying vec4 projPosition;\nvarying float linearDepth;\n#endif\n\n#ifdef SIZE_LIMITS\n// Smallest and largest size a particle may have on screen, as fractions of the viewport height.\nuniform vec2 sizeLimits;\n#endif\n${Ui}\nvoid main() {\n float lengthFactor = velocity.w;\n // A flipped particle arrives with a negative size: the streak keeps its\n // extent and mirrors its texture instead (see quadUV below).\n float avgSize = (abs(size.x) + abs(size.y)) * 0.5;\n vec4 mvPosition = view * world * vec4(offset, 1.0);\n#ifdef SIZE_LIMITS\n // The streak's width on screen as a fraction of the viewport height, held\n // between the limits; a perspective projection divides by the view depth.\n float limitDepth = abs(projection[2][3]) > 0.0 ? abs(mvPosition.z) : 1.0;\n float screenSize = avgSize * projection[1][1] / (2.0 * limitDepth);\n if (screenSize > 0.0) {\n avgSize *= clamp(screenSize, sizeLimits.x, sizeLimits.y) / screenSize;\n }\n#endif\n vec3 viewVelocity = mat3(view * world) * velocity.xyz;\n float vlength = length(viewVelocity);\n // Stretch direction is the velocity direction; only a genuinely motionless particle has none.\n // Deriving it via normalize keeps the stretch aligned even when the speed contribution is ~0\n // (e.g. speedFactor 0), instead of collapsing the whole burst onto a fixed screen axis.\n vec3 vdir = vlength > 0.000001 ? viewVelocity / vlength : vec3(0.0, 0.0, 1.0);\n vec3 side = normalize(cross(mvPosition.xyz, vdir));\n mvPosition.xyz += position.y * side * avgSize;\n // Equivalent to viewVelocity * (1.0 + lengthFactor / vlength) for moving particles, but the\n // size-based term (vdir * lengthFactor) survives when the velocity contribution vanishes.\n mvPosition.xyz -= (position.x + 0.5) * (viewVelocity + vdir * lengthFactor) * avgSize;\n#ifdef PIVOT\n // In particle-size units along the quad's own axes: x from head to tail, y across.\n mvPosition.xyz += (pivot.y * side - pivot.x * vdir) * avgSize;\n#endif\n gl_Position = projection * mvPosition;\n${qi("mvPosition.xyz")}\n vec2 quadUV = vec2(size.x < 0.0 ? 1.0 - uv.x : uv.x, size.y < 0.0 ? 1.0 - uv.y : uv.y);\n#ifdef SOFT_PARTICLES\n projPosition = gl_Position;\n linearDepth = -mvPosition.z;\n#endif\n\n #ifdef UV_TILE\n vec2 tc = vec2(tileCountX, tileCountY);\n float baseTile = floor(uvTile);\n float tileU = mod(baseTile, tc.x) / tc.x;\n float tileV = 1.0 - floor(baseTile / tc.x) / tc.y - 1.0 / tc.y;\n vUV = quadUV / tc + vec2(tileU, tileV);\n #ifdef TILE_BLEND\n float nextTile = ceil(uvTile);\n float nextU = mod(nextTile, tc.x) / tc.x;\n float nextV = 1.0 - floor(nextTile / tc.x) / tc.y - 1.0 / tc.y;\n vUV2 = quadUV / tc + vec2(nextU, nextV);\n vTileBlend = fract(uvTile);\n #endif\n #else\n vUV = quadUV;\n #endif\n\n vColor = color;\n}\n`,ts=`\nvarying vec2 vUV;\nvarying vec4 vColor;\n\n#ifdef USE_MAP\nuniform sampler2D map;\n#endif\n\n${ki}\nvoid main() {\n vec4 baseColor = vColor;\n\n#ifdef USE_MAP\n vec4 texColor = texture2D(map, vUV);\n baseColor *= texColor;\n#endif\n\n if (baseColor.a < 0.01) discard;\n\n${Ji("baseColor.rgb")}\n gl_FragColor = baseColor;\n}\n`,es=`\nattribute vec3 position;\nattribute vec3 previous;\nattribute vec3 next;\nattribute float side;\nattribute float width;\nattribute vec2 uv;\nattribute vec4 color;\n\nuniform mat4 view;\nuniform mat4 projection;\nuniform float lineWidth;\nuniform vec2 resolution;\nuniform float sizeAttenuation;\n\nvarying vec2 vUV;\nvarying vec4 vColor;\n\nvec2 fix(vec4 i, float aspect) {\n vec2 res = i.xy / i.w;\n res.x *= aspect;\n return res;\n}\n\n${Ui}\nvoid main() {\n float aspect = resolution.x / resolution.y;\n vec4 finalPosition = projection * view * vec4(position, 1.0);\n vec4 prevPos = projection * view * vec4(previous, 1.0);\n vec4 nextPos = projection * view * vec4(next, 1.0);\n\n vec2 currentP = fix(finalPosition, aspect);\n vec2 prevP = fix(prevPos, aspect);\n vec2 nextP = fix(nextPos, aspect);\n\n float w = lineWidth * width;\n vec2 dir;\n if (distance(nextP, currentP) < 0.0001) {\n dir = normalize(currentP - prevP);\n } else if (distance(prevP, currentP) < 0.0001) {\n dir = normalize(nextP - currentP);\n } else {\n vec2 dir1 = normalize(currentP - prevP);\n vec2 dir2 = normalize(nextP - currentP);\n dir = normalize(dir1 + dir2);\n }\n vec4 normal = vec4(-dir.y, dir.x, 0.0, 1.0);\n normal.xy *= 0.5 * w;\n normal *= projection;\n if (sizeAttenuation == 0.0) {\n normal.xy *= finalPosition.w;\n normal.xy /= (vec4(resolution, 0.0, 1.0) * projection).xy;\n }\n finalPosition.xy += normal.xy * side;\n gl_Position = finalPosition;\n${qi("(view * vec4(position, 1.0)).xyz")}\n vUV = uv;\n vColor = color;\n}\n`;const is=2048,ss=2047;class rs{constructor(t){this.counts=new Uint32Array(is),this.floatView=new Float32Array(1),this.uintView=new Uint32Array(this.floatView.buffer),this.keys=new Uint32Array(t),this.orderA=new Uint32Array(t),this.orderB=new Uint32Array(t)}ensure(t){this.keys.length<t&&(this.keys=new Uint32Array(t),this.orderA=new Uint32Array(t),this.orderB=new Uint32Array(t))}floatKey(t,e){this.floatView[0]=t;const i=this.uintView[0];return e?~i>>>0:i}}var ns=`\nattribute position: vec3f;\nattribute uv: vec2f;\nattribute normal: vec3f;\nattribute offset: vec3f;\nattribute color: vec4f;\nattribute size: vec3f;\nattribute rotation: vec4f;\nattribute uvTile: f32;\n\nuniform world: mat4x4f;\nuniform view: mat4x4f;\nuniform projection: mat4x4f;\n\n#ifdef UV_TILE\nuniform tileCountX: f32;\nuniform tileCountY: f32;\n#endif\n\nvarying vUV: vec2f;\nvarying vColor: vec4f;\nvarying vNormal: vec3f;\nvarying vWorldPos: vec3f;\n\n#ifdef TILE_BLEND\nvarying vUV2: vec2f;\nvarying vTileBlend: f32;\n#endif\n\n#ifdef SOFT_PARTICLES\nvarying projPosition: vec4f;\nvarying linearDepth: f32;\n#endif\n\nfn applyQuaternion(v: vec3f, q: vec4f) -> vec3f {\n let qVec = q.xyz;\n let qW = q.w;\n let t = 2.0 * cross(qVec, v);\n return v + qW * t + cross(qVec, t);\n}\n\n${Qi}\n@vertex\nfn main(input: VertexInputs) -> FragmentInputs {\n let scaledPosition = vertexInputs.position * vertexInputs.size;\n let rotatedPosition = applyQuaternion(scaledPosition, vertexInputs.rotation);\n let rotatedNormal = normalize(applyQuaternion(vertexInputs.normal, vertexInputs.rotation));\n let localPos = rotatedPosition + vertexInputs.offset;\n\n let worldPos = uniforms.world * vec4f(localPos, 1.0);\n let viewPos = uniforms.view * worldPos;\n let clipPosition = uniforms.projection * viewPos;\n vertexOutputs.position = clipPosition;\n${Gi("viewPos.xyz")}\n\n vertexOutputs.vWorldPos = worldPos.xyz;\n vertexOutputs.vNormal = normalize((uniforms.world * vec4f(rotatedNormal, 0.0)).xyz);\n\n#ifdef SOFT_PARTICLES\n vertexOutputs.projPosition = clipPosition;\n vertexOutputs.linearDepth = -viewPos.z;\n#endif\n\n#ifdef UV_TILE\n let tc = vec2f(uniforms.tileCountX, uniforms.tileCountY);\n let baseTile = floor(vertexInputs.uvTile);\n let tileU = (baseTile % tc.x) / tc.x;\n let tileV = 1.0 - floor(baseTile / tc.x) / tc.y - 1.0 / tc.y;\n vertexOutputs.vUV = vertexInputs.uv / tc + vec2f(tileU, tileV);\n #ifdef TILE_BLEND\n let nextTile = ceil(vertexInputs.uvTile);\n let nextU = (nextTile % tc.x) / tc.x;\n let nextV = 1.0 - floor(nextTile / tc.x) / tc.y - 1.0 / tc.y;\n vertexOutputs.vUV2 = vertexInputs.uv / tc + vec2f(nextU, nextV);\n vertexOutputs.vTileBlend = fract(vertexInputs.uvTile);\n #endif\n#else\n vertexOutputs.vUV = vertexInputs.uv;\n#endif\n\n vertexOutputs.vColor = vertexInputs.color;\n}\n`,os=`\nvarying vUV: vec2f;\nvarying vColor: vec4f;\n\n#ifdef TILE_BLEND\nvarying vUV2: vec2f;\nvarying vTileBlend: f32;\n#endif\n\n#ifdef USE_MAP\nvar mapSampler: sampler;\nvar map: texture_2d<f32>;\n#endif\n\n#ifdef SOFT_PARTICLES\nvar depthTextureSampler: sampler;\nvar depthTexture: texture_2d<f32>;\nuniform softParams: vec2f;\nuniform projParams: vec4f;\nvarying projPosition: vec4f;\nvarying linearDepth: f32;\n#endif\n\n#ifdef USE_ALPHATEST\nuniform alphaTest: f32;\n#endif\n\n${Wi}\n@fragment\nfn main(input: FragmentInputs) -> FragmentOutputs {\n var baseColor = fragmentInputs.vColor;\n\n#ifdef USE_MAP\n var texColor = textureSample(map, mapSampler, fragmentInputs.vUV);\n #ifdef TILE_BLEND\n let texColor2 = textureSample(map, mapSampler, fragmentInputs.vUV2);\n texColor = mix(texColor, texColor2, fragmentInputs.vTileBlend);\n #endif\n baseColor *= texColor;\n#endif\n\n#ifdef USE_COLOR_AS_ALPHA\n baseColor.a *= (baseColor.r + baseColor.g + baseColor.b) / 3.0;\n#endif\n\n#ifdef USE_ALPHATEST\n if (baseColor.a < uniforms.alphaTest) { discard; }\n#else\n if (baseColor.a < 0.01) { discard; }\n#endif\n\n#ifdef SOFT_PARTICLES\n var p2 = fragmentInputs.projPosition.xy / fragmentInputs.projPosition.w;\n p2 = 0.5 * p2 + 0.5;\n let readDepth = textureSample(depthTexture, depthTextureSampler, p2).r;\n let zNear = uniforms.projParams.x;\n let zFar = uniforms.projParams.y;\n let viewDepth = (zFar * zNear) / (zFar - readDepth * (zFar - zNear));\n let fade = clamp(uniforms.softParams.y * ((viewDepth - uniforms.softParams.x) - fragmentInputs.linearDepth), 0.0, 1.0);\n baseColor *= fade;\n#endif\n\n${ji("baseColor")}\n fragmentOutputs.color = baseColor;\n}\n`,as=`\nvarying vUV: vec2f;\nvarying vColor: vec4f;\nvarying vNormal: vec3f;\nvarying vWorldPos: vec3f;\n\n#ifndef MESH_UNLIT\nuniform lightDirection: vec3f;\nuniform lightColor: vec3f;\nuniform ambientColor: vec3f;\n#endif\n\n#ifdef TILE_BLEND\nvarying vUV2: vec2f;\nvarying vTileBlend: f32;\n#endif\n\n#ifdef USE_MAP\nvar mapSampler: sampler;\nvar map: texture_2d<f32>;\n#endif\n\n#if defined(USE_ENVMAP_ATLAS) || defined(MESH_RIM)\nuniform eyePosition: vec3f;\n#endif\n\n#ifdef MESH_RIM\nuniform rimColor: vec3f;\nuniform rimParams: vec2f;\n#endif\n\n#ifdef USE_ENVMAP_ATLAS\nvar envAtlasSampler: sampler;\nvar envAtlas: texture_2d<f32>;\nuniform reflectionLevel: f32;\n\nfn sampleEnvAtlas(r: vec3f) -> vec3f {\n let a = abs(r);\n var localUV: vec2f;\n var cellX: f32;\n var cellY: f32;\n if (a.x >= a.y && a.x >= a.z) {\n cellX = 0.0;\n if (r.x >= 0.0) {\n cellY = 0.0;\n localUV = vec2f(-r.z, -r.y) / a.x * 0.5 + 0.5;\n } else {\n cellY = 1.0;\n localUV = vec2f(r.z, -r.y) / a.x * 0.5 + 0.5;\n }\n } else if (a.y >= a.z) {\n cellX = 1.0;\n if (r.y >= 0.0) {\n cellY = 0.0;\n localUV = vec2f(r.x, r.z) / a.y * 0.5 + 0.5;\n } else {\n cellY = 1.0;\n localUV = vec2f(r.x, -r.z) / a.y * 0.5 + 0.5;\n }\n } else {\n cellX = 2.0;\n if (r.z >= 0.0) {\n cellY = 0.0;\n localUV = vec2f(r.x, -r.y) / a.z * 0.5 + 0.5;\n } else {\n cellY = 1.0;\n localUV = vec2f(-r.x, -r.y) / a.z * 0.5 + 0.5;\n }\n }\n let uv = (vec2f(cellX, cellY) + clamp(localUV, vec2f(0.0), vec2f(1.0))) / vec2f(3.0, 2.0);\n return textureSample(envAtlas, envAtlasSampler, uv).rgb;\n}\n#endif\n\n#ifdef SOFT_PARTICLES\nvar depthTextureSampler: sampler;\nvar depthTexture: texture_2d<f32>;\nuniform softParams: vec2f;\nuniform projParams: vec4f;\nvarying projPosition: vec4f;\nvarying linearDepth: f32;\n#endif\n\n#ifdef USE_ALPHATEST\nuniform alphaTest: f32;\n#endif\n\n${Wi}\n@fragment\nfn main(input: FragmentInputs) -> FragmentOutputs {\n var baseColor = fragmentInputs.vColor;\n\n#ifdef USE_MAP\n var texColor = textureSample(map, mapSampler, fragmentInputs.vUV);\n #ifdef TILE_BLEND\n let texColor2 = textureSample(map, mapSampler, fragmentInputs.vUV2);\n texColor = mix(texColor, texColor2, fragmentInputs.vTileBlend);\n #endif\n baseColor *= texColor;\n#endif\n\n#ifdef USE_ALPHATEST\n if (baseColor.a < uniforms.alphaTest) { discard; }\n#else\n if (baseColor.a < 0.01) { discard; }\n#endif\n\n let N = normalize(fragmentInputs.vNormal);\n#ifdef MESH_UNLIT\n var color = baseColor.rgb;\n#else\n let L = normalize(-uniforms.lightDirection);\n let NdotL = max(dot(N, L), 0.0);\n let litColor = uniforms.ambientColor + uniforms.lightColor * NdotL;\n\n var color = baseColor.rgb * litColor;\n#endif\n\n#ifdef USE_ENVMAP_ATLAS\n let viewDir = normalize(fragmentInputs.vWorldPos - uniforms.eyePosition);\n let reflectionCoords = reflect(viewDir, N);\n color += sampleEnvAtlas(reflectionCoords) * uniforms.reflectionLevel;\n#endif\n\n#ifdef MESH_RIM\n // Fresnel: strongest where the surface turns away from the camera.\n let V = normalize(uniforms.eyePosition - fragmentInputs.vWorldPos);\n let rimTerm = pow(1.0 - abs(dot(N, V)), uniforms.rimParams.x) * uniforms.rimParams.y;\n #ifdef MESH_RIM_MIX\n color = mix(color, uniforms.rimColor, clamp(rimTerm, 0.0, 1.0));\n #else\n color += uniforms.rimColor * rimTerm;\n #endif\n#endif\n\n var finalColor = vec4f(color, baseColor.a);\n\n#ifdef SOFT_PARTICLES\n var p2 = fragmentInputs.projPosition.xy / fragmentInputs.projPosition.w;\n p2 = 0.5 * p2 + 0.5;\n let readDepth = textureSample(depthTexture, depthTextureSampler, p2).r;\n let zNear = uniforms.projParams.x;\n let zFar = uniforms.projParams.y;\n let viewDepth = (zFar * zNear) / (zFar - readDepth * (zFar - zNear));\n let fade = clamp(uniforms.softParams.y * ((viewDepth - uniforms.softParams.x) - fragmentInputs.linearDepth), 0.0, 1.0);\n finalColor *= fade;\n#endif\n\n${ji("finalColor")}\n fragmentOutputs.color = finalColor;\n}\n`,hs=`\n// Per-vertex attributes\nattribute position: vec3f;\nattribute uv: vec2f;\n\n// Per-instance attributes\nattribute offset: vec3f;\nattribute color: vec4f;\nattribute size: vec3f;\nattribute rotation: f32;\nattribute uvTile: f32;\n\n// Uniforms\nuniform world: mat4x4f;\nuniform view: mat4x4f;\nuniform projection: mat4x4f;\n\n#ifdef UV_TILE\nuniform tileCountX: f32;\nuniform tileCountY: f32;\n#endif\n\n#ifdef PIVOT\n// Quad offset in particle-size units: xy in the quad's plane, z toward the camera.\nuniform pivot: vec3f;\n#endif\n\n// Varyings\nvarying vUV: vec2f;\nvarying vColor: vec4f;\n#ifdef TILE_BLEND\nvarying vUV2: vec2f;\nvarying vTileBlend: f32;\n#endif\n#ifdef SOFT_PARTICLES\nvarying projPosition: vec4f;\nvarying linearDepth: f32;\n#endif\n\n#ifdef SIZE_LIMITS\n// Smallest and largest size a particle may have on screen, as fractions of the viewport height.\nuniform sizeLimits: vec2f;\n#endif\n${Qi}\n@vertex\nfn main(input: VertexInputs) -> FragmentInputs {\n let c = cos(vertexInputs.rotation);\n let s = sin(vertexInputs.rotation);\n\n#ifdef SIZE_LIMITS\n // The particle's size on screen as a fraction of the viewport height, held\n // between the limits; a perspective projection divides by the view depth.\n let limitCenter = uniforms.view * uniforms.world * vec4f(vertexInputs.offset, 1.0);\n let limitDepth = select(1.0, abs(limitCenter.z), abs(uniforms.projection[2][3]) > 0.0);\n let screenSize = max(abs(vertexInputs.size.x), abs(vertexInputs.size.y)) * uniforms.projection[1][1] / (2.0 * limitDepth);\n let sizeScale = select(1.0, clamp(screenSize, uniforms.sizeLimits.x, uniforms.sizeLimits.y) / screenSize, screenSize > 0.0);\n let limitedSize = vertexInputs.size * sizeScale;\n#else\n let limitedSize = vertexInputs.size;\n#endif\n // A negative size mirrors the quad, which is how flipped particles arrive.\n var alignedPosition = vertexInputs.position.xy * limitedSize.xy;\n#ifdef PIVOT\n // The pivot turns with the particle but is not mirrored with it.\n alignedPosition += uniforms.pivot.xy * abs(limitedSize.xy);\n#endif\n let rotatedPosition = vec2f(\n c * alignedPosition.x - s * alignedPosition.y,\n s * alignedPosition.x + c * alignedPosition.y);\n\n#ifdef HORIZONTAL\n var mvPosition = uniforms.world * vec4f(vertexInputs.offset, 1.0);\n mvPosition.x += rotatedPosition.x;\n mvPosition.z -= rotatedPosition.y;\n#ifdef PIVOT\n mvPosition.y += uniforms.pivot.z * abs(limitedSize.x);\n#endif\n mvPosition = uniforms.view * mvPosition;\n#elif defined(VERTICAL)\n var mvPosition = uniforms.world * vec4f(vertexInputs.offset, 1.0);\n mvPosition.y += rotatedPosition.y;\n mvPosition = uniforms.view * mvPosition;\n mvPosition.x += rotatedPosition.x;\n#else\n var mvPosition = uniforms.view * uniforms.world * vec4f(vertexInputs.offset, 1.0);\n mvPosition.x += rotatedPosition.x;\n mvPosition.y += rotatedPosition.y;\n#endif\n#ifdef PIVOT\n#ifndef HORIZONTAL\n // Toward the camera along its view axis, whichever way the view space\n // faces: anything in front of the camera has the sign of the far side.\n mvPosition.z -= sign(mvPosition.z) * uniforms.pivot.z * abs(limitedSize.x);\n#endif\n#endif\n\n let clipPosition = uniforms.projection * mvPosition;\n vertexOutputs.position = clipPosition;\n${Gi("mvPosition.xyz")}\n#ifdef SOFT_PARTICLES\n vertexOutputs.projPosition = clipPosition;\n vertexOutputs.linearDepth = -mvPosition.z;\n#endif\n\n #ifdef UV_TILE\n let tc = vec2f(uniforms.tileCountX, uniforms.tileCountY);\n let baseTile = floor(vertexInputs.uvTile);\n let tileU = (baseTile % tc.x) / tc.x;\n let tileV = 1.0 - floor(baseTile / tc.x) / tc.y - 1.0 / tc.y;\n vertexOutputs.vUV = vertexInputs.uv / tc + vec2f(tileU, tileV);\n #ifdef TILE_BLEND\n let nextTile = ceil(vertexInputs.uvTile);\n let nextU = (nextTile % tc.x) / tc.x;\n let nextV = 1.0 - floor(nextTile / tc.x) / tc.y - 1.0 / tc.y;\n vertexOutputs.vUV2 = vertexInputs.uv / tc + vec2f(nextU, nextV);\n vertexOutputs.vTileBlend = fract(vertexInputs.uvTile);\n #endif\n #else\n vertexOutputs.vUV = vertexInputs.uv;\n #endif\n\n vertexOutputs.vColor = vertexInputs.color;\n}\n`;function ls(t){return t.isWebGPU?d.ShaderLanguage.WGSL:d.ShaderLanguage.GLSL}function cs(t,e,i,s){if(s===d.ShaderLanguage.WGSL)return c.ShaderStore.ShadersStoreWGSL[t+"VertexShader"]=e.wgsl,void(c.ShaderStore.ShadersStoreWGSL[t+"FragmentShader"]=i.wgsl);u.Effect.ShadersStore[t+"VertexShader"]=e.glsl,u.Effect.ShadersStore[t+"FragmentShader"]=i.glsl}var us,ds=`\n// Per-vertex attributes\nattribute position: vec3f;\nattribute uv: vec2f;\n\n// Per-instance attributes\nattribute offset: vec3f;\nattribute color: vec4f;\nattribute size: vec3f;\nattribute rotation: f32;\nattribute uvTile: f32;\nattribute velocity: vec4f;\n\n// Uniforms\nuniform world: mat4x4f;\nuniform view: mat4x4f;\nuniform projection: mat4x4f;\nuniform speedFactor: f32;\n\n#ifdef UV_TILE\nuniform tileCountX: f32;\nuniform tileCountY: f32;\n#endif\n\n#ifdef PIVOT\n// Streak offset in particle-size units: x from head to tail, y across.\nuniform pivot: vec3f;\n#endif\n\n// Varyings\nvarying vUV: vec2f;\nvarying vColor: vec4f;\n#ifdef TILE_BLEND\nvarying vUV2: vec2f;\nvarying vTileBlend: f32;\n#endif\n#ifdef SOFT_PARTICLES\nvarying projPosition: vec4f;\nvarying linearDepth: f32;\n#endif\n\n#ifdef SIZE_LIMITS\n// Smallest and largest size a particle may have on screen, as fractions of the viewport height.\nuniform sizeLimits: vec2f;\n#endif\n${Qi}\n@vertex\nfn main(input: VertexInputs) -> FragmentInputs {\n let lengthFactor = vertexInputs.velocity.w;\n // A flipped particle arrives with a negative size: the streak keeps its\n // extent and mirrors its texture instead (see quadUV below).\n var avgSize = (abs(vertexInputs.size.x) + abs(vertexInputs.size.y)) * 0.5;\n var mvPosition = uniforms.view * uniforms.world * vec4f(vertexInputs.offset, 1.0);\n#ifdef SIZE_LIMITS\n // The streak's width on screen as a fraction of the viewport height, held\n // between the limits; a perspective projection divides by the view depth.\n let limitDepth = select(1.0, abs(mvPosition.z), abs(uniforms.projection[2][3]) > 0.0);\n let screenSize = avgSize * uniforms.projection[1][1] / (2.0 * limitDepth);\n if (screenSize > 0.0) {\n avgSize *= clamp(screenSize, uniforms.sizeLimits.x, uniforms.sizeLimits.y) / screenSize;\n }\n#endif\n let viewWorld = uniforms.view * uniforms.world;\n let viewWorld3 = mat3x3f(viewWorld[0].xyz, viewWorld[1].xyz, viewWorld[2].xyz);\n let viewVelocity = viewWorld3 * vertexInputs.velocity.xyz;\n let vlength = length(viewVelocity);\n // Stretch direction is the velocity direction; only a genuinely motionless particle has none.\n // Deriving it via normalize keeps the stretch aligned even when the speed contribution is ~0\n // (e.g. speedFactor 0), instead of collapsing the whole burst onto a fixed screen axis.\n var vdir = vec3f(0.0, 0.0, 1.0);\n if (vlength > 0.000001) {\n vdir = viewVelocity / vlength;\n }\n let side = normalize(cross(mvPosition.xyz, vdir));\n let widthOffset = vertexInputs.position.y * side * avgSize;\n // Equivalent to viewVelocity * (1.0 + lengthFactor / vlength) for moving particles, but the\n // size-based term (vdir * lengthFactor) survives when the velocity contribution vanishes.\n let lengthOffset = (vertexInputs.position.x + 0.5) * (viewVelocity + vdir * lengthFactor) * avgSize;\n var stretched = mvPosition.xyz + widthOffset - lengthOffset;\n#ifdef PIVOT\n // In particle-size units along the quad's own axes: x from head to tail, y across.\n stretched += (uniforms.pivot.y * side - uniforms.pivot.x * vdir) * avgSize;\n#endif\n mvPosition.x = stretched.x;\n mvPosition.y = stretched.y;\n mvPosition.z = stretched.z;\n\n let clipPosition = uniforms.projection * mvPosition;\n vertexOutputs.position = clipPosition;\n${Gi("mvPosition.xyz")}\n let quadUV = select(vertexInputs.uv, 1.0 - vertexInputs.uv, vertexInputs.size.xy < vec2f(0.0));\n#ifdef SOFT_PARTICLES\n vertexOutputs.projPosition = clipPosition;\n vertexOutputs.linearDepth = -mvPosition.z;\n#endif\n\n #ifdef UV_TILE\n let tc = vec2f(uniforms.tileCountX, uniforms.tileCountY);\n let baseTile = floor(vertexInputs.uvTile);\n let tileU = (baseTile % tc.x) / tc.x;\n let tileV = 1.0 - floor(baseTile / tc.x) / tc.y - 1.0 / tc.y;\n vertexOutputs.vUV = quadUV / tc + vec2f(tileU, tileV);\n #ifdef TILE_BLEND\n let nextTile = ceil(vertexInputs.uvTile);\n let nextU = (nextTile % tc.x) / tc.x;\n let nextV = 1.0 - floor(nextTile / tc.x) / tc.y - 1.0 / tc.y;\n vertexOutputs.vUV2 = quadUV / tc + vec2f(nextU, nextV);\n vertexOutputs.vTileBlend = fract(vertexInputs.uvTile);\n #endif\n #else\n vertexOutputs.vUV = quadUV;\n #endif\n\n vertexOutputs.vColor = vertexInputs.color;\n}\n`;function ps(){return{direction:new a.Vector3(.4,-1,.6),color:new f.Color3(1,1,1),ambient:new f.Color3(.35,.35,.35)}}function fs(t){if(!t||"object"!=typeof t)return;const e=Array.isArray(t.color)?t.color:[1,1,1],i=(t,e)=>"number"==typeof t&&Number.isFinite(t)?t:e;return{color:[i(e[0],1),i(e[1],1),i(e[2],1)],power:Math.max(.01,i(t.power,2)),strength:Math.max(0,i(t.strength,1)),mode:"mix"===t.mode?"mix":"add"}}function ms(t,e){return t===e||!(!t||!e)&&(t.mode===e.mode&&t.power===e.power&&t.strength===e.strength&&t.color[0]===e.color[0]&&t.color[1]===e.color[1]&&t.color[2]===e.color[2])}exports.RenderMode=void 0,(us=exports.RenderMode||(exports.RenderMode={}))[us.BillBoard=0]="BillBoard",us[us.StretchedBillBoard=1]="StretchedBillBoard",us[us.Mesh=2]="Mesh",us[us.Trail=3]="Trail",us[us.HorizontalBillBoard=4]="HorizontalBillBoard",us[us.VerticalBillBoard=5]="VerticalBillBoard";class ys{constructor(t,e){this.visibleSystems=[],this.boundsMin_=new H,this.boundsMax_=new H,this.scene=e,this.maxParticles=1e3,this.systems=new Set,this.settings={instancingGeometry:t.instancingGeometry,instancingIndices:t.instancingIndices,instancingUVs:t.instancingUVs,instancingNormals:t.instancingNormals,renderMode:t.renderMode,renderOrder:t.renderOrder,uTileCount:t.uTileCount,vTileCount:t.vTileCount,blendTiles:t.blendTiles,softParticles:t.softParticles,softNearFade:t.softNearFade,softFarFade:t.softFarFade,materialBlendMode:t.materialBlendMode,materialTransparent:t.materialTransparent,materialDepthTest:t.materialDepthTest,materialDepthWrite:t.materialDepthWrite,materialAlphaTest:t.materialAlphaTest,texture:t.texture,reflectionTexture:t.reflectionTexture??null,reflectionLevel:t.reflectionLevel??1,reflectionFaces:t.reflectionFaces??null,reflectionAtlas:t.reflectionAtlas??null,pivot:t.pivot?.clone(),sortMode:t.sortMode??"none",minParticleSize:t.minParticleSize??0,maxParticleSize:t.maxParticleSize??1/0,layerMask:t.layerMask,renderingGroupId:t.renderingGroupId??0,applyFog:t.applyFog??!0,lighting:t.lighting,rim:fs(t.rim)},this.mesh=new h.Mesh("vfxBatch",e),this.configureMesh()}configureMesh(){const t=this.mesh;t.alwaysSelectAsActiveMesh=!0,t.doNotSyncBoundingInfo=!0,t.setBoundingInfo(new p.BoundingInfo(a.Vector3.Zero(),a.Vector3.Zero())),t.layerMask=this.settings.layerMask,t.renderingGroupId=this.settings.renderingGroupId,t.alphaIndex=this.settings.renderOrder,t.applyFog=!1}refreshBoundingInfo(){const t=this.boundsMin_,e=this.boundsMax_;let i=1/0,s=1/0,r=1/0,n=-1/0,o=-1/0,a=-1/0,h=!1;const l=this.visibleSystems;for(let c=0;c<l.length;c++){const u=l[c];if(0!==u.particleNum&&"function"==typeof u.getWorldBounds){if(!u.getWorldBounds(t,e))return void(this.mesh.alwaysSelectAsActiveMesh=!0);h=!0,t.x<i&&(i=t.x),t.y<s&&(s=t.y),t.z<r&&(r=t.z),e.x>n&&(n=e.x),e.y>o&&(o=e.y),e.z>a&&(a=e.z)}}if(!h)return;const c=this.mesh.getBoundingInfo(),u=c.minimum,d=c.maximum;u.x===i&&u.y===s&&u.z===r&&d.x===n&&d.y===o&&d.z===a||(u.set(i,s,r),d.set(n,o,a),c.reConstruct(u,d)),this.mesh.alwaysSelectAsActiveMesh=!1}fogDefines(){if(!this.settings.applyFog)return[];return this.settings.materialTransparent&&(this.settings.materialBlendMode===r.Constants.ALPHA_ADD||this.settings.materialBlendMode===r.Constants.ALPHA_ONEONE)?["FOG","FOG_ADDITIVE"]:["FOG"]}bindFog(t){if(!this.settings.applyFog)return;const e=this.scene;t.onBindObservable.add(()=>{const i=t.getEffect();if(!i)return;const s=e.fogEnabled?e.fogMode:m.Scene.FOGMODE_NONE;i.setFloat4("vFogInfos",s,e.fogStart,e.fogEnd,e.fogDensity),i.setColor3("vFogColor",e.fogColor)})}addSystem(t){this.systems.add(t)}removeSystem(t){this.systems.delete(t)}getVisibleSystems(){const t=this.visibleSystems;let e=0;for(const i of this.systems)i.emitter.visible&&!0!==i.culled&&(t[e++]=i);return t.length=e,t}applyDepthTexture(t){const e=this.mesh.material;e&&e instanceof n.ShaderMaterial&&e.setTexture("depthTexture",t)}applyMeshLighting(t){}dispose(){this.mesh.dispose()}}ys.FOG_UNIFORMS=["vFogInfos","vFogColor"];class vs extends ys{static whiteTexture(t){let e=vs.whiteTextureByScene.get(t);return e||(e=o.RawTexture.CreateRGBATexture(new Uint8Array([255,255,255,255]),1,1,t),e.name="quarksMeshWhite",vs.whiteTextureByScene.set(t,e)),e}constructor(t,e){super(t,e),this.shaderMaterial=null,this.fixedLightDirection=new a.Vector3,this.fixedLightColor=new a.Vector3,this.fixedAmbientColor=new a.Vector3,this.gatherScratch=[],this.vector_=new H,this.vector2_=new H,this.vector3_=new H,this.quaternion_=new Z,this.quaternion2_=new Z,this.quaternion3_=new Z,this.quaternion4_=new Z,this.quaternion5_=new Z,this.rotationMat_=new ft,this.rotationMat2_=new ft,this.lastStretchedSpeedFactor=Number.NaN,this.clearedInstanceUploaded=!1,this.storeFixedLighting(ps()),this.maxParticles=1e3,this.setupBuffers(),this.rebuildMaterial()}setupBuffers(){this.mesh.dispose(),this.mesh=new h.Mesh("spriteBatch",this.scene),this.configureMesh();const t=new l.VertexData;t.positions=this.settings.instancingGeometry,t.indices=this.settings.instancingIndices;const e=this.settings.instancingGeometry.length/3,i=this.settings.instancingUVs;i&&i.length>=2*e?t.uvs=i:t.uvs=new Float32Array(2*e),this.settings.instancingNormals&&(t.normals=this.settings.instancingNormals),t.applyToMesh(this.mesh,!1),this.buildExpandableBuffers()}disposeExpandableBuffers(){this.offsetVB?.dispose(),this.colorVB?.dispose(),this.sizeVB?.dispose(),this.uvTileVB?.dispose(),this.rotationVB?.dispose(),this.velocityVB?.dispose(),this.velocityVB=void 0,this.velocityBuffer=void 0}buildExpandableBuffers(){const e=this.scene.getEngine();this.offsetBuffer=new Float32Array(3*this.maxParticles),this.offsetVB=new t.VertexBuffer(e,this.offsetBuffer,"offset",!0,!1,3,!0),this.mesh.setVerticesBuffer(this.offsetVB),this.colorBuffer=new Float32Array(4*this.maxParticles),this.colorVB=new t.VertexBuffer(e,this.colorBuffer,"color",!0,!1,4,!0),this.mesh.setVerticesBuffer(this.colorVB),this.sizeBuffer=new Float32Array(3*this.maxParticles),this.sizeVB=new t.VertexBuffer(e,this.sizeBuffer,"size",!0,!1,3,!0),this.mesh.setVerticesBuffer(this.sizeVB),this.uvTileBuffer=new Float32Array(this.maxParticles),this.uvTileVB=new t.VertexBuffer(e,this.uvTileBuffer,"uvTile",!0,!1,1,!0),this.mesh.setVerticesBuffer(this.uvTileVB),this.settings.renderMode===exports.RenderMode.Mesh?(this.rotationBuffer=new Float32Array(4*this.maxParticles),this.rotationVB=new t.VertexBuffer(e,this.rotationBuffer,"rotation",!0,!1,4,!0)):(this.rotationBuffer=new Float32Array(this.maxParticles),this.rotationVB=new t.VertexBuffer(e,this.rotationBuffer,"rotation",!0,!1,1,!0)),this.mesh.setVerticesBuffer(this.rotationVB),this.settings.renderMode===exports.RenderMode.StretchedBillBoard&&(this.velocityBuffer=new Float32Array(4*this.maxParticles),this.velocityVB=new t.VertexBuffer(e,this.velocityBuffer,"velocity",!0,!1,4,!0),this.mesh.setVerticesBuffer(this.velocityVB)),this.mesh.forcedInstanceCount=0,this.mesh.doNotSyncBoundingInfo=!0}expandBuffers(t){for(;t>=this.maxParticles;)this.maxParticles*=2;this.disposeExpandableBuffers(),this.buildExpandableBuffers(),this.sortScratch=void 0,this.gatherScratch.length=0}sizeLimits(){const{minParticleSize:t,maxParticleSize:e}=this.settings;return vs.takesPivotAndFlip(this.settings.renderMode)?t<=0&&e===1/0?null:new a.Vector2(Math.max(0,t),Math.min(e,1e9)):null}sortInstances(t,e,i){if(t<2)return;const s=this.sortScratch??(this.sortScratch=new rs(this.maxParticles));s.ensure(t);const r=s.keys,n=this.settings.sortMode;if("distance"===n){const e=this.scene.activeCameras?.[0]??this.scene.activeCamera;if(!e)return;const i=e.globalPosition,n=i.x,o=i.y,a=i.z,h=this.offsetBuffer;for(let e=0,i=0;e<t;e++,i+=3){const t=h[i]-n,l=h[i+1]-o,c=h[i+2]-a;r[e]=s.floatKey(t*t+l*l+c*c,!0)}}else{const e="youngestInFront"===n,i=this.visibleSystems;let o=0;for(let t=0;t<i.length;t++){const n=i[t],a=n.particleNum,h=n.store;if(0===a)continue;if(void 0===h){const t=n.particles;for(let i=0;i<a;i++)r[o++]=s.floatKey(t[i].age,e);continue}const l=h.scalars,c=ze.SCALAR_STRIDE;for(let t=0,i=ze.AGE;t<a;t++,i+=c)r[o++]=s.floatKey(l[i],e)}if(o!==t)return}const o=function(t,e){const i=t.keys,s=t.counts;let r=t.orderA,n=t.orderB;for(let t=0;t<e;t++)r[t]=t;for(let t=0;t<32;t+=11){s.fill(0);for(let n=0;n<e;n++)s[i[r[n]]>>>t&ss]++;if(s[i[r[0]]>>>t&ss]===e)continue;let o=0;for(let t=0;t<is;t++){const e=s[t];s[t]=o,o+=e}for(let o=0;o<e;o++){const e=r[o];n[s[i[e]>>>t&ss]++]=e}const a=r;r=n,n=a}return r}(s,t);this.offsetBuffer=this.gatherInto(0,this.offsetBuffer,o,t,3),this.sizeBuffer=this.gatherInto(1,this.sizeBuffer,o,t,3),this.colorBuffer=this.gatherInto(2,this.colorBuffer,o,t,4),this.uvTileBuffer=this.gatherInto(3,this.uvTileBuffer,o,t,1),this.rotationBuffer=this.gatherInto(4,this.rotationBuffer,o,t,e?4:1),i&&this.velocityBuffer&&(this.velocityBuffer=this.gatherInto(5,this.velocityBuffer,o,t,4))}gatherInto(t,e,i,s,r){let n=this.gatherScratch[t];return void 0!==n&&n.length===e.length||(n=new Float32Array(e.length)),function(t,e,i,s,r){if(1===r)for(let r=0;r<s;r++)e[r]=t[i[r]];else if(3===r)for(let r=0,n=0;r<s;r++,n+=3){const s=3*i[r];e[n]=t[s],e[n+1]=t[s+1],e[n+2]=t[s+2]}else if(4===r)for(let r=0,n=0;r<s;r++,n+=4){const s=4*i[r];e[n]=t[s],e[n+1]=t[s+1],e[n+2]=t[s+2],e[n+3]=t[s+3]}else for(let n=0;n<s;n++){const s=i[n]*r,o=n*r;for(let i=0;i<r;i++)e[o+i]=t[s+i]}}(e,n,i,s,r),this.gatherScratch[t]=e,n}rebuildMaterial(){const t=`quarksParticle_${this.settings.renderMode}`;this.lastStretchedSpeedFactor=Number.NaN;const e=this.fogDefines();let i,s;this.settings.renderMode===exports.RenderMode.Mesh?(i={glsl:Yi,wgsl:ns},s={glsl:Zi,wgsl:as}):this.settings.renderMode===exports.RenderMode.StretchedBillBoard?(i={glsl:Ki,wgsl:ds},s={glsl:Xi,wgsl:os}):(i={glsl:Hi,wgsl:hs},s={glsl:Xi,wgsl:os});const o=this.settings.texture??(this.settings.renderMode===exports.RenderMode.Mesh?vs.whiteTexture(this.scene):null);o&&e.push("USE_MAP");const h=this.settings.reflectionAtlas;if(this.settings.renderMode===exports.RenderMode.Mesh&&!!h&&!h.isReady()&&h){const t=h.onLoadObservable;t?.addOnce(()=>{this.rebuildMaterial()})}const l=this.settings.renderMode===exports.RenderMode.Mesh&&!!h&&h.isReady();l&&e.push("USE_ENVMAP_ATLAS"),(this.settings.uTileCount>1||this.settings.vTileCount>1)&&e.push("UV_TILE"),this.settings.blendTiles&&e.push("TILE_BLEND"),this.settings.softParticles&&e.push("SOFT_PARTICLES"),this.settings.materialAlphaTest>0&&e.push("USE_ALPHATEST"),this.settings.renderMode===exports.RenderMode.VerticalBillBoard&&e.push("VERTICAL"),this.settings.renderMode===exports.RenderMode.HorizontalBillBoard&&e.push("HORIZONTAL");const c=vs.takesPivotAndFlip(this.settings.renderMode)?this.settings.pivot:void 0;c&&e.push("PIVOT");const u=this.sizeLimits();u&&e.push("SIZE_LIMITS");const d=this.settings.renderMode===exports.RenderMode.Mesh,p=this.settings.lighting??"fixed",f=d&&"unlit"!==p;d&&!f&&e.push("MESH_UNLIT");const m=d?this.settings.rim:void 0;m&&(e.push("MESH_RIM"),"mix"===m.mode&&e.push("MESH_RIM_MIX"));const y=l||!!m,v=ls(this.scene.getEngine());cs(t,i,s,v);const g=["position","uv","offset","color","size","rotation","uvTile"];this.settings.renderMode===exports.RenderMode.Mesh&&g.push("normal"),this.settings.renderMode===exports.RenderMode.StretchedBillBoard&&g.push("velocity");const x=["world","view","projection","worldView","worldViewProjection",...ys.FOG_UNIFORMS],S=[];(this.settings.uTileCount>1||this.settings.vTileCount>1)&&(x.push("tileCountX"),x.push("tileCountY")),o&&S.push("map"),l&&(S.push("envAtlas"),x.push("reflectionLevel")),y&&x.push("eyePosition"),m&&(x.push("rimColor"),x.push("rimParams")),this.settings.renderMode===exports.RenderMode.StretchedBillBoard&&x.push("speedFactor"),this.settings.softParticles&&(x.push("softParams"),x.push("projParams"),S.push("depthTexture")),this.settings.materialAlphaTest>0&&x.push("alphaTest"),c&&x.push("pivot"),u&&x.push("sizeLimits"),f&&(x.push("lightDirection"),x.push("lightColor"),x.push("ambientColor"));const w=new n.ShaderMaterial(t,this.scene,{vertex:t,fragment:t},{attributes:g,uniforms:x,samplers:S,defines:e,needAlphaBlending:this.settings.materialTransparent,shaderLanguage:v});if(o&&w.setTexture("map",o),l&&h&&(w.setTexture("envAtlas",h),w.setFloat("reflectionLevel",this.settings.reflectionLevel)),m&&(w.setVector3("rimColor",new a.Vector3(m.color[0],m.color[1],m.color[2])),w.setVector2("rimParams",new a.Vector2(m.power,m.strength))),y){const t=new a.Vector3;w.setVector3("eyePosition",t),w.onBindObservable.add(()=>{const e=this.scene.activeCamera;e&&(t.copyFrom(e.globalPosition),w.setVector3("eyePosition",t))})}if((this.settings.uTileCount>1||this.settings.vTileCount>1)&&(w.setFloat("tileCountX",this.settings.uTileCount),w.setFloat("tileCountY",this.settings.vTileCount)),this.settings.renderMode===exports.RenderMode.StretchedBillBoard&&w.setFloat("speedFactor",this.settings.softNearFade>0?this.settings.softNearFade:1),this.settings.softParticles){w.setVector2("softParams",new a.Vector2(this.settings.softNearFade,1/Math.max(this.settings.softFarFade-this.settings.softNearFade,1e-4)));const t=new a.Vector4(0,0,0,0);w.onBindObservable.add(()=>{const e=this.scene.activeCamera;e&&(t.x=e.minZ,t.y=e.maxZ,w.setVector4("projParams",t))})}if(this.settings.materialAlphaTest>0&&w.setFloat("alphaTest",this.settings.materialAlphaTest),c&&w.setVector3("pivot",new a.Vector3(c.x,c.y,c.z)),u&&w.setVector2("sizeLimits",u),f&&(this.writeFixedLighting(w),"scene"===p)){const t=new a.Vector3,e=new a.Vector3,i=new a.Vector3;w.onBindObservable.add(()=>{vs.readSceneLight(this.scene,t,e,i)?(w.setVector3("lightDirection",t),w.setVector3("lightColor",e),w.setVector3("ambientColor",i)):this.writeFixedLighting(w)})}this.bindFog(w),w.backFaceCulling=!1,this.settings.materialTransparent?w.alphaMode=this.settings.materialBlendMode:w.alphaMode=r.Constants.ALPHA_DISABLE,w.needDepthPrePass=this.settings.materialDepthWrite,w.forceDepthWrite=this.settings.materialDepthWrite,w.disableDepthWrite=!this.settings.materialDepthWrite,this.mesh.material=w,this.shaderMaterial=w}applyMeshLighting(t){this.storeFixedLighting(t);const e=this.shaderMaterial;null!==e&&this.settings.renderMode===exports.RenderMode.Mesh&&"unlit"!==this.settings.lighting&&this.writeFixedLighting(e)}storeFixedLighting(t){this.fixedLightDirection.copyFrom(t.direction),this.fixedLightColor.set(t.color.r,t.color.g,t.color.b),this.fixedAmbientColor.set(t.ambient.r,t.ambient.g,t.ambient.b)}writeFixedLighting(t){t.setVector3("lightDirection",this.fixedLightDirection),t.setVector3("lightColor",this.fixedLightColor),t.setVector3("ambientColor",this.fixedAmbientColor)}static readSceneLight(t,e,i,s){const r=t.lights;for(let n=0;n<r.length;n++){const o=r[n],a=o.getClassName();if("DirectionalLight"!==a&&"HemisphericLight"!==a||!o.isEnabled())continue;const h=o.intensity,l=o.diffuse,c=t.ambientColor;i.set(l.r*h,l.g*h,l.b*h),s.set(c.r,c.g,c.b);const u=o.direction;if("DirectionalLight"===a)e.copyFrom(u);else{e.copyFrom(u).scaleInPlace(-1);const t=o.groundColor;t&&(s.x+=t.r*h,s.y+=t.g*h,s.z+=t.b*h)}return!0}return!1}update(){let t=0,e=0;const i=this.settings.renderMode,s=i===exports.RenderMode.Mesh,r=i===exports.RenderMode.StretchedBillBoard,n=vs.takesPivotAndFlip(i),o=this.getVisibleSystems();for(let t=0;t<o.length;t++)e+=o[t].particleNum;e>this.maxParticles&&this.expandBuffers(e);for(let e=0;e<o.length;e++){const i=o[e],a=i.particleNum;if(0===a)continue;const h=i.particles,l=this.quaternion2_,c=this.vector2_,u=this.vector3_,d=i.worldSpace,p=i.emitter.matrixWorld;if(s&&!d)p.decompose(c,l,u);else{const t=p.elements;u.set(Math.sqrt(t[0]*t[0]+t[1]*t[1]+t[2]*t[2]),Math.sqrt(t[4]*t[4]+t[5]*t[5]+t[6]*t[6]),Math.sqrt(t[8]*t[8]+t[9]*t[9]+t[10]*t[10]))}r&&!d&&this.rotationMat_.setFromMatrix4(p);const f=Math.abs(u.x),m=Math.abs(u.y),y=Math.abs(u.z),v=r?i.rendererEmitterSettings:void 0,g=void 0===v||0===v.speedFactor?.001:v.speedFactor,x=v?.lengthFactor??0,S=i.store,w=void 0!==S,b=void 0!==S&&!0!==i.onlyUsedByOther,z=i.simulationResidual??0,M=0===z?0:z/(i.simulationStep??z);w&&(0!==M&&a>0&&S.previousColor!==S.color?vs.continueColor(this.colorBuffer,4*t,S,a,M):this.colorBuffer.set(S.color.subarray(0,4*a),4*t));let _=!1;if(void 0!==S&&d)0!==M&&a>0?vs.extrapolate(this.offsetBuffer,3*t,S,a,M):this.offsetBuffer.set(S.position.subarray(0,3*a),3*t),0!==M&&a>0&&S.previousSize!==S.size?vs.continueVector3(this.sizeBuffer,3*t,S.size,S.previousSize,a,M):this.sizeBuffer.set(S.size.subarray(0,3*a),3*t),_=!0;else if(b&&a>0){const e=3*t,i=e+3*a,s=this.offsetBuffer;0!==M?vs.extrapolate(s,e,S,a,M):s.set(S.position.subarray(0,3*a),e);const r=p.elements,n=r[0],o=r[1],h=r[2],l=r[3],c=r[4],u=r[5],d=r[6],v=r[7],g=r[8],x=r[9],w=r[10],b=r[11],z=r[12],P=r[13],T=r[14],V=r[15];for(let t=e;t<i;t+=3){const e=s[t],i=s[t+1],r=s[t+2],a=1/(l*e+v*i+b*r+V);s[t]=(n*e+c*i+g*r+z)*a,s[t+1]=(o*e+u*i+x*r+P)*a,s[t+2]=(h*e+d*i+w*r+T)*a}const O=this.sizeBuffer;0!==M&&S.previousSize!==S.size?vs.continueVector3(O,e,S.size,S.previousSize,a,M):O.set(S.size.subarray(0,3*a),e);for(let t=e;t<i;t+=3)O[t]*=f,O[t+1]*=m,O[t+2]*=y;_=!0}const P=t;if(b&&!s){const e=S;this.uvTileBuffer.set(e.uvTile.subarray(0,a),P);const i=this.rotationBuffer;if(i.set(e.rotation.subarray(0,a),P),0!==z){const t=e.angularVelocity;for(let e=0;e<a;e++)i[P+e]+=t[e]*z}r&&this.velocityBuffer&&vs.writeVelocities(this.velocityBuffer,4*P,e,a,M,d?null:this.rotationMat_,g,x),t+=a}else if(b&&S.rotationQuaternion.length>0){const e=S;this.uvTileBuffer.set(e.uvTile.subarray(0,a),P),vs.writeQuaternions(this.rotationBuffer,4*P,e,a,M,d?null:l),t+=a}else for(let e=0;e<a;e++,t++){const i=h[e];if(s){let e=i.rotation;const s=i.angularVelocity;let r;if(0!==M&&s instanceof Z&&(e=this.quaternion4_.copy(e).multiply(vs.partialTurn(s,M,this.quaternion5_))),d)r=e;else{let t;t=i.parentMatrix?this.quaternion3_.setFromRotationMatrix(i.parentMatrix):l,r=this.quaternion_,r.copy(t).multiply(e)}const n=4*t;this.rotationBuffer[n]=r.x,this.rotationBuffer[n+1]=r.y,this.rotationBuffer[n+2]=r.z,this.rotationBuffer[n+3]=r.w}else{const e=i.angularVelocity;this.rotationBuffer[t]=i.rotation+("number"==typeof e?e*z:0)}if(!_){const e=i.position,s=i.previousPosition;let r=e.x+(e.x-s.x)*M,n=e.y+(e.y-s.y)*M,o=e.z+(e.z-s.z)*M;if(!d){const t=(i.parentMatrix??p).elements,e=1/(t[3]*r+t[7]*n+t[11]*o+t[15]),s=(t[0]*r+t[4]*n+t[8]*o+t[12])*e,a=(t[1]*r+t[5]*n+t[9]*o+t[13])*e;o=(t[2]*r+t[6]*n+t[10]*o+t[14])*e,r=s,n=a}const a=3*t;this.offsetBuffer[a]=r,this.offsetBuffer[a+1]=n,this.offsetBuffer[a+2]=o;const h=i.size,l=3*t;d||i.parentMatrix?(this.sizeBuffer[l]=h.x,this.sizeBuffer[l+1]=h.y,this.sizeBuffer[l+2]=h.z):(this.sizeBuffer[l]=h.x*f,this.sizeBuffer[l+1]=h.y*m,this.sizeBuffer[l+2]=h.z*y)}if(!w){const e=i.color,s=4*t;this.colorBuffer[s]=e.x,this.colorBuffer[s+1]=e.y,this.colorBuffer[s+2]=e.z,this.colorBuffer[s+3]=e.w}if(this.uvTileBuffer[t]=i.uvTile,r&&this.velocityBuffer){const e=i.velocity,s=i.previousVelocity,r=e.x+(e.x-s.x)*M,n=e.y+(e.y-s.y)*M,o=e.z+(e.z-s.z)*M;let a=this.vector_;a.set(r,n,o),d||(i.parentMatrix?(this.rotationMat2_.setFromMatrix4(i.parentMatrix),a.applyMatrix3(this.rotationMat2_)):a.applyMatrix3(this.rotationMat_));const h=4*t;this.velocityBuffer[h]=a.x*g,this.velocityBuffer[h+1]=a.y*g,this.velocityBuffer[h+2]=a.z*g,this.velocityBuffer[h+3]=x}}n&&void 0!==i.flip&&(void 0!==S?vs.applyFlip(this.sizeBuffer,3*P,S.flip,a):vs.applyFlipFromParticles(this.sizeBuffer,3*P,h,a))}r&&o.length>0&&this.syncStretchedSpeedFactor(o[0]),this.mesh.forcedInstanceCount=t,this.refreshBoundingInfo(),0!==t?(this.clearedInstanceUploaded=!1,"none"!==this.settings.sortMode&&this.sortInstances(t,s,r),this.offsetVB.update(this.offsetBuffer.subarray(0,3*t)),this.sizeVB.update(this.sizeBuffer.subarray(0,3*t)),this.colorVB.update(this.colorBuffer.subarray(0,4*t)),this.uvTileVB.update(this.uvTileBuffer.subarray(0,t)),this.rotationVB.update(this.rotationBuffer.subarray(0,s?4*t:t)),r&&this.velocityVB&&this.velocityBuffer&&this.velocityVB.update(this.velocityBuffer.subarray(0,4*t))):this.clearedInstanceUploaded||(this.uploadClearedInstance(s,r),this.clearedInstanceUploaded=!0)}syncStretchedSpeedFactor(t){const e=this.shaderMaterial;if(null===e)return;const i=t.rendererEmitterSettings.speedFactor??1,s=0===i?.001:i;s!==this.lastStretchedSpeedFactor&&(e.setFloat("speedFactor",s),this.lastStretchedSpeedFactor=s)}static takesPivotAndFlip(t){return t===exports.RenderMode.BillBoard||t===exports.RenderMode.StretchedBillBoard||t===exports.RenderMode.VerticalBillBoard||t===exports.RenderMode.HorizontalBillBoard}static applyFlip(t,e,i,s){for(let r=0,n=e;r<s;r++,n+=3){const e=i[r];0!==e&&(1&e&&(t[n]=-t[n]),2&e&&(t[n+1]=-t[n+1]))}}static applyFlipFromParticles(t,e,i,s){for(let r=0,n=e;r<s;r++,n+=3){const e=i[r].flip;0!==e&&(1&e&&(t[n]=-t[n]),2&e&&(t[n+1]=-t[n+1]))}}static writeQuaternions(t,e,i,s,r,n){const o=i.rotationQuaternion,a=i.angularVelocityQuaternion,h=null!==n,l=h?n.x:0,c=h?n.y:0,u=h?n.z:0,d=h?n.w:1;for(let i=0,n=0,p=e;i<s;i++,n+=4,p+=4){let e=o[n],i=o[n+1],s=o[n+2],f=o[n+3];if(0!==r){const t=a[n]*r,o=a[n+1]*r,h=a[n+2]*r,l=1+(a[n+3]-1)*r,c=1/Math.sqrt(t*t+o*o+h*h+l*l),u=t*c,d=o*c,p=h*c,m=l*c,y=e*m+f*u+i*p-s*d,v=i*m+f*d+s*u-e*p,g=s*m+f*p+e*d-i*u;f=f*m-e*u-i*d-s*p,e=y,i=v,s=g}if(h){const t=l*f+d*e+c*s-u*i,r=c*f+d*i+u*e-l*s,n=u*f+d*s+l*i-c*e;f=d*f-l*e-c*i-u*s,e=t,i=r,s=n}t[p]=e,t[p+1]=i,t[p+2]=s,t[p+3]=f}}static writeVelocities(t,e,i,s,r,n,o,a){const h=i.velocity,l=i.previousVelocity.length>=3*s?i.previousVelocity:h,c=null!==n?n.elements:null;for(let i=0,n=0,u=e;i<s;i++,n+=3,u+=4){let e=h[n],i=h[n+1],s=h[n+2];if(0!==r&&(e+=(e-l[n])*r,i+=(i-l[n+1])*r,s+=(s-l[n+2])*r),null!==c){const t=c[0]*e+c[3]*i+c[6]*s,r=c[1]*e+c[4]*i+c[7]*s;s=c[2]*e+c[5]*i+c[8]*s,e=t,i=r}t[u]=e*o,t[u+1]=i*o,t[u+2]=s*o,t[u+3]=a}}static partialTurn(t,e,i){const s=t.x*e,r=t.y*e,n=t.z*e,o=1+(t.w-1)*e,a=1/Math.sqrt(s*s+r*r+n*n+o*o);return i.x=s*a,i.y=r*a,i.z=n*a,i.w=o*a,i}static continueVector3(t,e,i,s,r,n){for(let o=0,a=0;o<r;o++,a+=3){const r=i[a]+(i[a]-s[a])*n,o=i[a+1]+(i[a+1]-s[a+1])*n,h=i[a+2]+(i[a+2]-s[a+2])*n;t[e+a]=r>0?r:0,t[e+a+1]=o>0?o:0,t[e+a+2]=h>0?h:0}}static continueColor(t,e,i,s,r){const n=i.color,o=i.previousColor;for(let i=0,a=0;i<s;i++,a+=4){const i=n[a]+(n[a]-o[a])*r,s=n[a+1]+(n[a+1]-o[a+1])*r,h=n[a+2]+(n[a+2]-o[a+2])*r,l=n[a+3]+(n[a+3]-o[a+3])*r;t[e+a]=i>0?i:0,t[e+a+1]=s>0?s:0,t[e+a+2]=h>0?h:0,t[e+a+3]=l>0?l:0}}static extrapolate(t,e,i,s,r){const n=i.position,o=i.previousPosition;for(let i=0,a=0;i<s;i++,a+=3){const i=n[a],s=n[a+1],h=n[a+2];t[e+a]=i+(i-o[a])*r,t[e+a+1]=s+(s-o[a+1])*r,t[e+a+2]=h+(h-o[a+2])*r}}uploadClearedInstance(t,e){this.colorBuffer[3]=0,this.sizeBuffer[0]=0,this.sizeBuffer[1]=0,this.sizeBuffer[2]=0,this.colorVB.update(this.colorBuffer.subarray(0,4)),this.sizeVB.update(this.sizeBuffer.subarray(0,3)),this.offsetVB.update(this.offsetBuffer.subarray(0,3)),this.uvTileVB.update(this.uvTileBuffer.subarray(0,1)),t?this.rotationVB.update(this.rotationBuffer.subarray(0,4)):this.rotationVB.update(this.rotationBuffer.subarray(0,1)),e&&this.velocityVB&&this.velocityBuffer&&this.velocityVB.update(this.velocityBuffer.subarray(0,4))}dispose(){this.mesh.material&&this.mesh.material.dispose(),super.dispose()}}vs.whiteTextureByScene=new WeakMap;var gs=`\nvarying vUV: vec2f;\nvarying vColor: vec4f;\n\n#ifdef USE_MAP\nvar mapSampler: sampler;\nvar map: texture_2d<f32>;\n#endif\n\n${Wi}\n@fragment\nfn main(input: FragmentInputs) -> FragmentOutputs {\n var baseColor = fragmentInputs.vColor;\n\n#ifdef USE_MAP\n let texColor = textureSample(map, mapSampler, fragmentInputs.vUV);\n baseColor *= texColor;\n#endif\n\n if (baseColor.a < 0.01) { discard; }\n\n${ji("baseColor")}\n fragmentOutputs.color = baseColor;\n}\n`,xs=`\nattribute position: vec3f;\nattribute previous: vec3f;\nattribute next: vec3f;\nattribute side: f32;\nattribute width: f32;\nattribute uv: vec2f;\nattribute color: vec4f;\n\nuniform view: mat4x4f;\nuniform projection: mat4x4f;\nuniform lineWidth: f32;\nuniform resolution: vec2f;\nuniform sizeAttenuation: f32;\n\nvarying vUV: vec2f;\nvarying vColor: vec4f;\n\nfn fix(i: vec4f, aspect: f32) -> vec2f {\n var res = i.xy / i.w;\n res.x *= aspect;\n return res;\n}\n\n${Qi}\n@vertex\nfn main(input: VertexInputs) -> FragmentInputs {\n let aspect = uniforms.resolution.x / uniforms.resolution.y;\n var finalPosition = uniforms.projection * uniforms.view * vec4f(vertexInputs.position, 1.0);\n let prevPos = uniforms.projection * uniforms.view * vec4f(vertexInputs.previous, 1.0);\n let nextPos = uniforms.projection * uniforms.view * vec4f(vertexInputs.next, 1.0);\n\n let currentP = fix(finalPosition, aspect);\n let prevP = fix(prevPos, aspect);\n let nextP = fix(nextPos, aspect);\n\n let w = uniforms.lineWidth * vertexInputs.width;\n var dir: vec2f;\n if (distance(nextP, currentP) < 0.0001) {\n dir = normalize(currentP - prevP);\n } else if (distance(prevP, currentP) < 0.0001) {\n dir = normalize(nextP - currentP);\n } else {\n let dir1 = normalize(currentP - prevP);\n let dir2 = normalize(nextP - currentP);\n dir = normalize(dir1 + dir2);\n }\n var normal = vec4f(-dir.y, dir.x, 0.0, 1.0);\n normal.x *= 0.5 * w;\n normal.y *= 0.5 * w;\n normal = normal * uniforms.projection;\n if (uniforms.sizeAttenuation == 0.0) {\n let screen = (vec4f(uniforms.resolution, 0.0, 1.0) * uniforms.projection).xy;\n normal.x = normal.x * finalPosition.w / screen.x;\n normal.y = normal.y * finalPosition.w / screen.y;\n }\n finalPosition.x += normal.x * vertexInputs.side;\n finalPosition.y += normal.y * vertexInputs.side;\n\n vertexOutputs.position = finalPosition;\n${Gi("(uniforms.view * vec4f(vertexInputs.position, 1.0)).xyz")}\n vertexOutputs.vUV = vertexInputs.uv;\n vertexOutputs.vColor = vertexInputs.color;\n}\n`;class Ss extends ys{constructor(t,e){super(t,e),this.drawsNothing=!1,this.vector_=new H,this.vector2_=new H,this.vector3_=new H,this.quaternion_=new Z,this.maxParticles=1024,this.setupBuffers(),this.rebuildMaterial()}setupBuffers(){this.mesh.dispose(),this.mesh=new h.Mesh("trailBatch",this.scene),this.configureMesh(),this.buildGeometryBuffers()}buildGeometryBuffers(){this.positionBuffer=new Float32Array(6*this.maxParticles),this.previousBuffer=new Float32Array(6*this.maxParticles),this.nextBuffer=new Float32Array(6*this.maxParticles),this.uvBuffer=new Float32Array(4*this.maxParticles),this.sideBuffer=new Float32Array(2*this.maxParticles),this.widthBuffer=new Float32Array(2*this.maxParticles),this.colorBuffer=new Float32Array(8*this.maxParticles),this.indexBuffer=new Uint32Array(6*this.maxParticles);for(let t=0;t<this.sideBuffer.length;t+=2)this.sideBuffer[t]=1,this.sideBuffer[t+1]=-1;this.positionBuffer[0]=0,this.positionBuffer[1]=0,this.positionBuffer[2]=0,this.positionBuffer[3]=1,this.positionBuffer[4]=0,this.positionBuffer[5]=0,this.positionBuffer[6]=0,this.positionBuffer[7]=1,this.positionBuffer[8]=0,this.positionBuffer[9]=1,this.positionBuffer[10]=1,this.positionBuffer[11]=0,this.indexBuffer[0]=0,this.indexBuffer[1]=1,this.indexBuffer[2]=2,this.indexBuffer[3]=1,this.indexBuffer[4]=3,this.indexBuffer[5]=2,this.mesh.setVerticesData(t.VertexBuffer.PositionKind,this.positionBuffer,!0),this.mesh.setVerticesData(t.VertexBuffer.UVKind,this.uvBuffer,!0),this.mesh.setVerticesData(t.VertexBuffer.ColorKind,this.colorBuffer,!0,4),this.mesh.setIndices(this.indexBuffer,null,!0),this.drawsNothing=!1,this.mesh.subMeshes&&this.mesh.subMeshes.length>0&&(this.mesh.subMeshes[0].indexCount=6);const e=this.scene.getEngine();this.previousVB=new t.VertexBuffer(e,this.previousBuffer,"previous",!0,!1,3,!1),this.nextVB=new t.VertexBuffer(e,this.nextBuffer,"next",!0,!1,3,!1),this.sideVB=new t.VertexBuffer(e,this.sideBuffer,"side",!0,!1,1,!1),this.widthVB=new t.VertexBuffer(e,this.widthBuffer,"width",!0,!1,1,!1),this.mesh.setVerticesBuffer(this.previousVB),this.mesh.setVerticesBuffer(this.nextVB),this.mesh.setVerticesBuffer(this.sideVB),this.mesh.setVerticesBuffer(this.widthVB),this.mesh.subMeshes&&this.adoptMeshBounds()}expandBuffers(t){for(;t>=this.maxParticles;)this.maxParticles*=2;this.previousVB?.dispose(),this.nextVB?.dispose(),this.sideVB?.dispose(),this.widthVB?.dispose(),this.buildGeometryBuffers()}rebuildMaterial(){const t="quarksTrail",e=this.fogDefines();this.settings.texture&&e.push("USE_MAP");const i=ls(this.scene.getEngine());cs(t,{glsl:es,wgsl:xs},{glsl:ts,wgsl:gs},i);const s=["world","view","projection","worldViewProjection","lineWidth","resolution","sizeAttenuation",...ys.FOG_UNIFORMS],o=[];this.settings.texture&&o.push("map");const h=new n.ShaderMaterial(t,this.scene,{vertex:t,fragment:t},{attributes:["position","previous","next","side","width","uv","color"],uniforms:s,samplers:o,defines:e,needAlphaBlending:this.settings.materialTransparent,shaderLanguage:i});this.settings.texture&&h.setTexture("map",this.settings.texture);const l=this.scene.getEngine();h.setFloat("lineWidth",1);const c=new a.Vector2(l.getRenderWidth(),l.getRenderHeight());h.setVector2("resolution",c),h.setFloat("sizeAttenuation",1),h.onBindObservable.add(()=>{const t=this.scene.getEngine(),e=t.getRenderWidth(),i=t.getRenderHeight();c.x===e&&c.y===i||(c.x=e,c.y=i,h.setVector2("resolution",c))}),this.bindFog(h),h.backFaceCulling=!1,this.settings.materialTransparent?h.alphaMode=this.settings.materialBlendMode:h.alphaMode=r.Constants.ALPHA_DISABLE,h.needDepthPrePass=this.settings.materialDepthWrite,h.forceDepthWrite=this.settings.materialDepthWrite,h.disableDepthWrite=!this.settings.materialDepthWrite,this.mesh.material=h}static ensureWorldMatrix(t){const e=t.emitter;!e.computeWorldMatrix||e.isSynchronized&&e.isSynchronized()||e.computeWorldMatrix(!0)}update(){let t=0,e=0,i=0;const s=this.getVisibleSystems();for(let t=0;t<s.length;t++){const e=s[t],r=e.particles;for(let t=0;t<e.particleNum;t++){const e=r[t].historyCount;0!==e&&(i+=2*e+2)}}i>this.maxParticles&&this.expandBuffers(i);for(let i=0;i<s.length;i++){const r=s[i],n=t;Ss.ensureWorldMatrix(r);const o=this.quaternion_,a=this.vector2_,h=this.vector3_,l=r.emitter.matrixWorld;l.decompose(a,o,h);const c=r.particles,u=r.particleNum,d=this.settings.uTileCount,p=this.settings.vTileCount,f=1/d,m=1/p,y=r.worldSpace,v=(Math.abs(h.x)+Math.abs(h.y)+Math.abs(h.z))/3,g=r.rendererEmitterSettings,x=Boolean(g.uvFromHead),S=Boolean(g.colorFromParticle),w=y||Boolean(g.recordWorldSpace),b=g.followLocalOrigin?0:r.simulationResidual??0,z=0===b?0:b/(r.simulationStep??b);for(let i=0;i<u;i++){const s=c[i],r=s.historyCount;if(0===r)continue;const n=s.historyCapacity,o=s.historyPositions,a=s.historySizes,h=S?s.store.color:s.historyColors,u=4*s.storeIndex,d=s.uvTile%p,g=Math.floor(s.uvTile/p+.001),b=(s.parentMatrix??l).elements,M=b[0],_=b[1],P=b[2],T=b[3],V=b[4],O=b[5],C=b[6],F=b[7],B=b[8],A=b[9],$=b[10],I=b[11],E=b[12],N=b[13],L=b[14],R=b[15],D=1/(0!==z?r:Math.max(1,r-1));let U=s.getHistoryIndex(0),q=o[3*U],k=o[3*U+1],J=o[3*U+2];if(!w){const t=1/(T*q+F*k+I*J+R),e=(M*q+V*k+B*J+E)*t,i=(_*q+O*k+A*J+N)*t;J=(P*q+C*k+$*J+L)*t,q=e,k=i}let Q=q,G=k,W=J;for(let i=0;i<r;i++,t+=2){let l=q,c=k,b=J,z=U;if(i+1<r){z=U+1===n?0:U+1;const t=3*z;if(l=o[t],c=o[t+1],b=o[t+2],!w){const t=1/(T*l+F*c+I*b+R),e=(M*l+V*c+B*b+E)*t,i=(_*l+O*c+A*b+N)*t;b=(P*l+C*c+$*b+L)*t,l=e,c=i}}const j=a[U],Y=S?u:4*U,X=h[Y],Z=h[Y+1],H=h[Y+2],K=h[Y+3],tt=3*t;this.positionBuffer[tt]=q,this.positionBuffer[tt+1]=k,this.positionBuffer[tt+2]=J,this.positionBuffer[tt+3]=q,this.positionBuffer[tt+4]=k,this.positionBuffer[tt+5]=J,this.previousBuffer[tt]=Q,this.previousBuffer[tt+1]=G,this.previousBuffer[tt+2]=W,this.previousBuffer[tt+3]=Q,this.previousBuffer[tt+4]=G,this.previousBuffer[tt+5]=W,this.nextBuffer[tt]=l,this.nextBuffer[tt+1]=c,this.nextBuffer[tt+2]=b,this.nextBuffer[tt+3]=l,this.nextBuffer[tt+4]=c,this.nextBuffer[tt+5]=b,y||s.parentMatrix?(this.widthBuffer[t]=j,this.widthBuffer[t+1]=j):(this.widthBuffer[t]=j*v,this.widthBuffer[t+1]=j*v);const et=2*t,it=i*D,st=((x?1-it:it)+d)*f;this.uvBuffer[et]=st,this.uvBuffer[et+1]=(p-g-1)*m,this.uvBuffer[et+2]=st,this.uvBuffer[et+3]=(p-g)*m;const rt=4*t;this.colorBuffer[rt]=X,this.colorBuffer[rt+1]=Z,this.colorBuffer[rt+2]=H,this.colorBuffer[rt+3]=K,this.colorBuffer[rt+4]=X,this.colorBuffer[rt+5]=Z,this.colorBuffer[rt+6]=H,this.colorBuffer[rt+7]=K,i+1<r&&(this.indexBuffer[3*e]=t,this.indexBuffer[3*e+1]=t+1,this.indexBuffer[3*e+2]=t+2,e++,this.indexBuffer[3*e]=t+2,this.indexBuffer[3*e+1]=t+1,this.indexBuffer[3*e+2]=t+3,e++),Q=q,G=k,W=J,q=l,k=c,J=b,U=z}if(0!==z){const i=s.previousPosition,r=s.position;let n=r.x+(r.x-i.x)*z,o=r.y+(r.y-i.y)*z,a=r.z+(r.z-i.z)*z;const h=t-2,l=this.positionBuffer[3*h],c=this.positionBuffer[3*h+1],u=this.positionBuffer[3*h+2];if(!y){const t=1/(T*n+F*o+I*a+R),e=(M*n+V*o+B*a+E)*t,i=(_*n+O*o+A*a+N)*t;a=(P*n+C*o+$*a+L)*t,n=e,o=i}const S=3*t;this.positionBuffer[S]=n,this.positionBuffer[S+1]=o,this.positionBuffer[S+2]=a,this.positionBuffer[S+3]=n,this.positionBuffer[S+4]=o,this.positionBuffer[S+5]=a,this.previousBuffer[S]=l,this.previousBuffer[S+1]=c,this.previousBuffer[S+2]=u,this.previousBuffer[S+3]=l,this.previousBuffer[S+4]=c,this.previousBuffer[S+5]=u,this.nextBuffer[S]=n,this.nextBuffer[S+1]=o,this.nextBuffer[S+2]=a,this.nextBuffer[S+3]=n,this.nextBuffer[S+4]=o,this.nextBuffer[S+5]=a;const w=3*h;this.nextBuffer[w]=n,this.nextBuffer[w+1]=o,this.nextBuffer[w+2]=a,this.nextBuffer[w+3]=n,this.nextBuffer[w+4]=o,this.nextBuffer[w+5]=a;const b=s.size.x;y||s.parentMatrix?(this.widthBuffer[t]=b,this.widthBuffer[t+1]=b):(this.widthBuffer[t]=b*v,this.widthBuffer[t+1]=b*v);const D=2*t,U=((x?0:1)+d)*f;this.uvBuffer[D]=U,this.uvBuffer[D+1]=(p-g-1)*m,this.uvBuffer[D+2]=U,this.uvBuffer[D+3]=(p-g)*m;const q=s.color,k=4*t;this.colorBuffer[k]=q.x,this.colorBuffer[k+1]=q.y,this.colorBuffer[k+2]=q.z,this.colorBuffer[k+3]=q.w,this.colorBuffer[k+4]=q.x,this.colorBuffer[k+5]=q.y,this.colorBuffer[k+6]=q.z,this.colorBuffer[k+7]=q.w,this.indexBuffer[3*e]=h,this.indexBuffer[3*e+1]=h+1,this.indexBuffer[3*e+2]=t,e++,this.indexBuffer[3*e]=t,this.indexBuffer[3*e+1]=h+1,this.indexBuffer[3*e+2]=t+1,e++,t+=2}}this.measureSystemBounds(r,n,t)}this.refreshBoundingInfo(),this.uploadGeometry(t,e)}measureSystemBounds(t,e,i){if(i<=e||"function"!=typeof t.setWorldBounds)return;const s=this.positionBuffer;let r=1/0,n=1/0,o=1/0,a=-1/0,h=-1/0,l=-1/0;for(let t=3*e,c=3*i;t<c;t+=6){const e=s[t],i=s[t+1],c=s[t+2];e<r&&(r=e),e>a&&(a=e),i<n&&(n=i),i>h&&(h=i),c<o&&(o=c),c>l&&(l=c)}const c=this.widthBuffer;let u=0;for(let t=e;t<i;t+=2){const e=c[t];e>u&&(u=e)}t.setWorldBounds(r,n,o,a,h,l,u)}uploadGeometry(e,i){const s=this.mesh.geometry,r=s?.getIndexBuffer();if(e>0&&i>0){this.mesh.updateVerticesData(t.VertexBuffer.PositionKind,this.positionBuffer.subarray(0,3*e)),this.mesh.updateVerticesData(t.VertexBuffer.UVKind,this.uvBuffer.subarray(0,2*e)),r&&this.scene.getEngine().updateDynamicIndexBuffer(r,this.indexBuffer.subarray(0,3*i),0),this.previousVB.update(this.previousBuffer.subarray(0,3*e)),this.nextVB.update(this.nextBuffer.subarray(0,3*e)),this.widthVB.update(this.widthBuffer.subarray(0,e));const s=this.mesh.getVertexBuffer(t.VertexBuffer.ColorKind);s&&s.update(this.colorBuffer.subarray(0,4*e)),this.mesh.subMeshes&&this.mesh.subMeshes.length>0&&(this.mesh.subMeshes[0].indexCount=3*i,this.mesh.subMeshes[0].verticesCount=e),this.drawsNothing=!1}else this.mesh.subMeshes&&this.mesh.subMeshes.length>0&&(this.drawsNothing||(this.indexBuffer.fill(0,0,6),r&&this.scene.getEngine().updateDynamicIndexBuffer(r,this.indexBuffer.subarray(0,6),0),this.drawsNothing=!0),this.mesh.subMeshes[0].indexCount=6,this.mesh.subMeshes[0].verticesCount=1)}adoptMeshBounds(){const t=this.mesh.getBoundingInfo();for(const e of this.mesh.subMeshes)e._boundingInfo=t}dispose(){this.mesh.material&&this.mesh.material.dispose(),super.dispose()}}class ws extends s.TransformNode{constructor(t,e){super(t,e),this.batches=[],this.systemToBatchIndex=new Map,this.depthTexture=null,this.systems=[],this.orderedSystems=[],this.orderedSystemsStale=!0,this.batchEmptyFrames=[],this.adaptivePerformanceState={enabled:!1,targetFrameMs:16.7,minQuality:.35,maxQuality:1,decreaseStep:.08,increaseStep:.02,currentQuality:1,lastFrameCpuMs:0},this.lastAppliedQuality=Number.NaN,this.meshLighting=ps(),this.cullingEnabled=!0,this.catchUpBudgetMs=2,this.simulationBudgetMs=1/0,this.frustumPlanes=[],this.boundsMin=new H,this.boundsMax=new H}collectFrustumPlanes(){const t=this.getScene(),s=this.frustumPlanes,r=t.activeCameras,n=t.activeCamera,o=r&&r.length>0?r:n?[n]:[],a=6*o.length;for(;s.length<a;)s.push(new i.Plane(0,0,0,0));s.length=a;for(let t=0;t<o.length;t++){const i=o[t];i.getViewMatrix(),i.getProjectionMatrix();const r=i.getTransformationMatrix(),n=0===t?s:s.slice(6*t,6*t+6);if(e.Frustum.GetPlanesToRef(r,n),0!==t)for(let e=0;e<6;e++)s[6*t+e]=n[e]}return s}isSystemInView(t,e){const i=this.boundsMin,s=this.boundsMax;if(!t.getWorldBounds(i,s))return!0;for(let t=0;t<e.length;t+=6){let r=!0;for(let n=t;n<t+6;n++){const t=e[n],o=t.normal,a=o.x>=0?s.x:i.x,h=o.y>=0?s.y:i.y,l=o.z>=0?s.z:i.z;if(o.x*a+o.y*h+o.z*l+t.d<0){r=!1;break}}if(r)return!0}return!1}static clamp(t,e,i){return Math.max(e,Math.min(i,t))}static equals(t,e){return t.materialBlendMode===e.materialBlendMode&&t.materialTransparent===e.materialTransparent&&t.materialDepthTest===e.materialDepthTest&&t.materialDepthWrite===e.materialDepthWrite&&t.materialAlphaTest===e.materialAlphaTest&&t.texture===e.texture&&t.reflectionTexture===e.reflectionTexture&&t.reflectionLevel===e.reflectionLevel&&function(t,e){if(t===e)return!0;if(!t||!e||t.length!==e.length)return!1;for(let i=0;i<t.length;i++)if(t[i]!==e[i])return!1;return!0}(t.reflectionFaces,e.reflectionFaces)&&t.reflectionAtlas===e.reflectionAtlas&&t.renderMode===e.renderMode&&t.blendTiles===e.blendTiles&&t.softParticles===e.softParticles&&t.softFarFade===e.softFarFade&&t.softNearFade===e.softNearFade&&t.uTileCount===e.uTileCount&&t.vTileCount===e.vTileCount&&t.instancingGeometry===e.instancingGeometry&&t.renderOrder===e.renderOrder&&t.layerMask===e.layerMask&&t.renderingGroupId===e.renderingGroupId&&t.applyFog===e.applyFog&&function(t,e){return(t?.x??0)===(e?.x??0)&&(t?.y??0)===(e?.y??0)&&(t?.z??0)===(e?.z??0)}(t.pivot,e.pivot)&&t.sortMode===(e.sortMode??"none")&&t.minParticleSize===(e.minParticleSize??0)&&t.maxParticleSize===(e.maxParticleSize??1/0)&&(t.lighting??"fixed")===(e.lighting??"fixed")&&ms(t.rim,e.rim)}addSystem(t){const e=t;e._renderer=this,this.systemToBatchIndex.has(t)||-1!==this.systems.indexOf(t)||(this.systems.push(t),this.orderedSystemsStale=!0),this.adaptivePerformanceState.enabled&&e.setQualityFactor(this.adaptivePerformanceState.currentQuality),this.assignToBatch(e)}assignToBatch(t){const e=t,i=t.getRendererSettings();for(let t=0;t<this.batches.length;t++)if(ws.equals(this.batches[t].settings,i))return this.batches[t].addSystem(e),void this.systemToBatchIndex.set(e,t);let s;const r=this.getScene();switch(i.renderMode){case exports.RenderMode.Trail:s=new Ss(i,r);break;case exports.RenderMode.Mesh:case exports.RenderMode.BillBoard:case exports.RenderMode.VerticalBillBoard:case exports.RenderMode.HorizontalBillBoard:case exports.RenderMode.StretchedBillBoard:s=new vs(i,r);break;default:throw new Error(`Unsupported render mode: ${i.renderMode}`)}s.mesh.parent=this,this.depthTexture&&s.applyDepthTexture(this.depthTexture),s.applyMeshLighting(this.meshLighting),s.addSystem(e),this.batches.push(s),this.batchEmptyFrames.push(0),this.systemToBatchIndex.set(e,this.batches.length-1)}deleteSystem(t){const e=this.removeFromBatch(t),i=this.systems.indexOf(t);-1!==i&&(this.systems.splice(i,1),this.orderedSystemsStale=!0);const s=this.orderedSystems.indexOf(t);return-1!==s&&this.orderedSystems.splice(s,1),e}removeFromBatch(t){const e=this.systemToBatchIndex.get(t);return void 0!==e&&(this.batches[e].removeSystem(t),this.systemToBatchIndex.delete(t),!0)}updateSystem(t){this.removeFromBatch(t),this.addSystem(t)}setDepthTexture(t){this.depthTexture=t;for(const e of this.batches)e.applyDepthTexture(t)}setMeshLighting(t){const e=this.meshLighting;t.direction&&(e.direction=t.direction.clone()),t.color&&(e.color=t.color.clone()),t.ambient&&(e.ambient=t.ambient.clone());for(const t of this.batches)t.applyMeshLighting(e)}getMeshLighting(){const t=this.meshLighting;return{direction:t.direction.clone(),color:t.color.clone(),ambient:t.ambient.clone()}}configureAdaptivePerformance(t={}){const e=this.adaptivePerformanceState,i=ws.clamp(t.minQuality??e.minQuality,.05,1),s=ws.clamp(t.maxQuality??e.maxQuality,i,1);e.targetFrameMs=Math.max(t.targetFrameMs??e.targetFrameMs,.1),e.minQuality=i,e.maxQuality=s,e.decreaseStep=Math.max(t.decreaseStep??e.decreaseStep,.001),e.increaseStep=Math.max(t.increaseStep??e.increaseStep,.001),e.currentQuality=ws.clamp(e.currentQuality,e.minQuality,e.maxQuality),e.enabled=!0,this.lastAppliedQuality=Number.NaN}disableAdaptivePerformance(t=!0){this.adaptivePerformanceState.enabled=!1,t&&(this.adaptivePerformanceState.currentQuality=this.adaptivePerformanceState.maxQuality,this.applyAdaptiveQuality())}getAdaptivePerformanceState(){return{...this.adaptivePerformanceState}}applyAdaptiveQuality(){const t=this.adaptivePerformanceState.currentQuality;if(t!==this.lastAppliedQuality){for(let e=0;e<this.systems.length;e++)this.systems[e].setQualityFactor(t);this.lastAppliedQuality=t}}_invalidateUpdateOrder(){this.orderedSystemsStale=!0}orderSystems(){if(!this.orderedSystemsStale)return this.orderedSystems;const t=[],e=new Set,i=new Set,s=new Set(this.systems),r=n=>{if(!i.has(n)&&!e.has(n)){e.add(n);for(const t of(t=>{const e=[];for(const i of t.behaviors??[]){if("EmitSubParticleSystem"!==i.type)continue;const t=i.subParticleSystem?.system;void 0!==t&&s.has(t)&&e.push(t)}return e})(n))r(t);e.delete(n),i.add(n),t.push(n)}};for(const t of this.systems)r(t);return t.reverse(),this.orderedSystems=t,this.orderedSystemsStale=!1,t}update(t){const e=this.adaptivePerformanceState,i=e.enabled?performance.now():0;e.enabled&&this.applyAdaptiveQuality();const s=this.orderSystems(),r=this.cullingEnabled?this.collectFrustumPlanes():null,n=this.simulationBudgetMs!==1/0||this.catchUpBudgetMs!==1/0?performance.now():0,o=this.simulationBudgetMs===1/0?1/0:n+this.simulationBudgetMs,a=this.catchUpBudgetMs===1/0?1/0:n+this.catchUpBudgetMs;for(let e=0;e<s.length;e++){const i=s[e];i.emitter.visible&&(i.culled=null!==r&&r.length>0&&"always"!==i.cullingMode&&!0!==i.onlyUsedByOther&&!this.isSystemInView(i,r),i.update(t,o,a)),s[e]!==i&&e--}this.refreshBatches(),e.enabled&&(e.lastFrameCpuMs=performance.now()-i,e.lastFrameCpuMs>e.targetFrameMs?e.currentQuality=ws.clamp(e.currentQuality-e.decreaseStep,e.minQuality,e.maxQuality):e.currentQuality=ws.clamp(e.currentQuality+e.increaseStep,e.minQuality,e.maxQuality))}refreshBatches(){const t=this.batchEmptyFrames;for(let e=0;e<this.batches.length;e++){const i=this.batches[e];if(i.systems.size>0){t[e]=0,i.update();continue}const s=(t[e]??0)+1;t[e]=s,1===s?i.update():s>ws.EMPTY_BATCH_GRACE_FRAMES&&(this.removeBatch(e),e--)}}removeBatch(t){this.batches[t].dispose(),this.batches.splice(t,1),this.batchEmptyFrames.splice(t,1);for(const[e,i]of this.systemToBatchIndex)i>t&&this.systemToBatchIndex.set(e,i-1)}getBatchRenderStats(){return this.batches.map((t,e)=>{let i=0;const s=[];for(const e of t.systems){const t=e;i+=t.particleNum,s.push(t.emitter.name)}return{batchIndex:e,renderMode:t.settings.renderMode,instanceCount:t.mesh.forcedInstanceCount??0,particleCount:i,systemNames:s}})}dispose(){for(const t of this.batches)t.dispose();this.batches=[],this.batchEmptyFrames.length=0,this.systems.length=0,this.systemToBatchIndex.clear(),super.dispose()}}ws.EMPTY_BATCH_GRACE_FRAMES=120;const bs=ws;class zs extends s.TransformNode{get matrixWorld(){const t=this.getWorldMatrix(),e=t.updateFlag;if(e===this._matrixWorldFlag)return this._matrixWorld;this._matrixWorldFlag=e;const i=this._matrixWorld.elements,s=t.m;return i[0]=s[0],i[1]=s[1],i[2]=s[2],i[3]=s[3],i[4]=s[4],i[5]=s[5],i[6]=s[6],i[7]=s[7],i[8]=s[8],i[9]=s[9],i[10]=s[10],i[11]=s[11],i[12]=s[12],i[13]=s[13],i[14]=s[14],i[15]=s[15],this._matrixWorld}get visible(){return this.isEnabled()}set visible(t){this.setEnabled(t)}get uuid(){return this.uniqueId.toString()}constructor(t,e){super("particleEmitter",e||void 0),this._matrixWorld=new st,this._matrixWorldFlag=-1,this.system=t}dispose(){super.dispose()}extractFromCache(t){const e=[];for(const i in t){const s=t[i];s&&"object"==typeof s&&delete s.metadata,e.push(s)}return e}clone(t){const e=this.system.clone().emitter;return e.name=t??this.name,e.position.copyFrom(this.position),e.rotation.copyFrom(this.rotation),e.scaling.copyFrom(this.scaling),this.rotationQuaternion&&(e.rotationQuaternion=this.rotationQuaternion.clone()),e.setEnabled(this.isEnabled(!1)),e}toJSON(t,e={}){return{uuid:this._quarksUUID??this.uniqueId.toString(),type:"ParticleEmitter",name:this.name,position:[this.position.x,this.position.y,this.position.z],rotation:[this.rotation.x,this.rotation.y,this.rotation.z],quaternion:this.rotationQuaternion?[this.rotationQuaternion.x,this.rotationQuaternion.y,this.rotationQuaternion.z,this.rotationQuaternion.w]:void 0,scale:[this.scaling.x,this.scaling.y,this.scaling.z],visible:this.isEnabled(),ps:this.system.toJSON(t,e)}}}class Ms{static runOnAllParticleEmitters(t,e){Ms.traverseNode(t,t=>{t instanceof zs&&e(t)})}static addToBatchRenderer(t,e){Ms.runOnAllParticleEmitters(t,t=>{e.addSystem(t.system)})}static play(t){Ms.runOnAllParticleEmitters(t,t=>{t.system.play()})}static stop(t){Ms.runOnAllParticleEmitters(t,t=>{t.system.stop()})}static pause(t){Ms.runOnAllParticleEmitters(t,t=>{t.system.pause()})}static restart(t){Ms.runOnAllParticleEmitters(t,t=>{t.system.restart()})}static setAutoDestroy(t,e){Ms.runOnAllParticleEmitters(t,t=>{t.system.autoDestroy=e})}static endEmit(t){Ms.runOnAllParticleEmitters(t,t=>{t.system.endEmit()})}static isEffectFinished(t){let e=!1,i=!0;return Ms.runOnAllParticleEmitters(t,t=>{e=!0,t.system.isFinished()||(i=!1)}),e&&i}static instantiate(t,e){const i=new Map,r=(t,e,n)=>{let o;if(t instanceof zs)o=t.clone(n),i.set(t,o);else{if(!(t instanceof s.TransformNode))return null;o=new s.TransformNode(n??t.name,t.getScene()),o.position.copyFrom(t.position),o.rotation.copyFrom(t.rotation),o.scaling.copyFrom(t.scaling),t.rotationQuaternion&&(o.rotationQuaternion=t.rotationQuaternion.clone()),o.setEnabled(t.isEnabled(!1))}o.parent=e;for(const e of t.getChildren())r(e,o);return o},n=r(t,null,e);for(const t of i.values())for(const e of t.system.behaviors)if(e instanceof ve){const t=i.get(e.subParticleSystem);void 0!==t&&(e.subParticleSystem=t)}return n}static traverseNode(t,e){e(t);const i=t.getChildren();for(const t of i)Ms.traverseNode(t,e)}}const _s=new WeakMap,Ps=new WeakMap;function Ts(t){if(!t?.isCube)return null;const e=t.files??t._files;return 6===e?.length?e.slice():null}function Vs(t){return _s.get(t)??null}async function Os(t,e){if("undefined"==typeof document||"undefined"==typeof Image)throw new Error("createEnvAtlasFromFaceUrls requires a DOM Image/canvas environment");const i=await Promise.all(t.map(t=>function(t){return new Promise((e,i)=>{const s=new Image;s.crossOrigin="anonymous",s.onload=()=>e(s),s.onerror=()=>i(new Error(`Failed to load env face ${t}`)),s.src=t})}(t))),s=i[0].width||i[0].naturalWidth;if(!s)throw new Error("Env atlas face image has zero size");const r=document.createElement("canvas");r.width=3*s,r.height=2*s;const n=r.getContext("2d");if(!n)throw new Error("Could not create env atlas canvas");for(let t=0;t<6;t++)n.drawImage(i[t],t%3*s,Math.floor(t/3)*s,s,s);const o=new y.Texture(r.toDataURL("image/jpeg",.92),e,{noMipmap:!0,invertY:!1,samplingMode:y.Texture.LINEAR_LINEAR});return o.name="quarksEnvAtlas",o}const Cs={createFromFaceUrls:Os};function Fs(t,e,i){const s=_s.get(t);if(s)return i(s),s;const r=()=>{const s=Ps.get(t);if(s)return void s.then(t=>{t&&i(t)});const r=Ts(t);if(!r)return;const n=Cs.createFromFaceUrls(r,e).then(e=>(_s.set(t,e),Ps.delete(t),i(e),e)).catch(e=>(Ps.delete(t),console.warn("[babylon.quarks] Failed to build env atlas from cubemap faces",e),null));Ps.set(t,n)};if(t.isReady())r();else{const e=t.onLoadObservable;e?e.addOnce(()=>r()):r()}return _s.get(t)??null}class Bs extends g.StandardMaterial{constructor(t,e,i={}){super(t,e),this.isParticleMeshStandardMaterial=!0,Object.assign(this,i)}}class As extends v.PBRMaterial{constructor(t,e,i={}){super(t,e),this.isParticleMeshPhysicsMaterial=!0,Object.assign(this,i)}}function $s(t,e){if(e&&e.length>0)return e;const i=t.length/3,s=new Uint32Array(i);for(let t=0;t<i;t++)s[t]=t;return s}const Is=new H(0,0,1),Es=new Z,Ns=new Z,Ls=new H,Rs=new H,Ds=1/60,Us=new Set(["SizeOverLife","SizeBySpeed"]),qs=new Set(["ColorOverLife","ColorBySpeed"]),ks=new Set(["ApplyForce","Noise","TurbulenceField","GravityForce","RotationOverLife","Rotation3DOverLife","RotationBySpeed","SpeedOverLife","FrameOverLife","ForceOverLife","VelocityOverLife","InheritVelocity","OrbitOverLife","WidthOverLength","ChangeEmitDirection","EmitSubParticleSystem","LimitSpeedOverLife","ApplyCollision"]),Js=new Float32Array([-.5,-.5,0,.5,-.5,0,.5,.5,0,-.5,.5,0]),Qs=new Float32Array([0,0,1,0,1,1,0,1]);const Gs=new Uint32Array([0,1,2,0,2,3]);function Ws(t){const e={};return t?.uvFromHead&&(e.uvFromHead=!0),t?.colorFromParticle&&(e.colorFromParticle=!0),t?.dieWithParticle&&(e.dieWithParticle=!0),t?.recordWorldSpace&&(e.recordWorldSpace=!0),e}class js{set time(t){this.emissionState.time=t}get time(){return this.emissionState.time}get isEmitEnded(){return this.emitEnded}hasPendingEmission(){if(this.looping)return!0;if(this.emitEnded)return!1;if(this.onlyUsedByOther)return!1;const t=this.emissionState;if(t.waitEmiting>0)return!0;if(t.burstIndex<this.emissionBursts.length)return!0;if(this.hasPendingBurstWaves(t))return!0;if(t.time>=this.duration)return!1;const e=t.time/this.duration;return this.emissionOverTime.genValue(this.memory,e)>0||this.emissionOverDistance.genValue(this.memory,e)>0}isFinished(){return!(this.particleNum>0)&&(!!this.onlyUsedByOther||(this.looping?this.emitEnded:!this.hasPendingEmission()))}get layers(){return this.layerMaskProxy}get texture(){return this.rendererSettings.texture}set texture(t){this.rendererSettings.texture=t,this.neededToUpdateRender=!0}get material(){return this.materialRef}set material(t){this.materialRef=t,this.applyMaterialSettings(t)}get uTileCount(){return this.rendererSettings.uTileCount}set uTileCount(t){this.rendererSettings.uTileCount=t,this.neededToUpdateRender=!0}get vTileCount(){return this.rendererSettings.vTileCount}set vTileCount(t){this.rendererSettings.vTileCount=t,this.neededToUpdateRender=!0}get blendTiles(){return this.rendererSettings.blendTiles}set blendTiles(t){this.rendererSettings.blendTiles=t,this.neededToUpdateRender=!0}get softParticles(){return this.rendererSettings.softParticles}set softParticles(t){this.rendererSettings.softParticles=t,this.neededToUpdateRender=!0}get sortMode(){return this.rendererSettings.sortMode}set sortMode(t){this.rendererSettings.sortMode=js.validSortMode(t),this.neededToUpdateRender=!0}get minParticleSize(){return this.rendererSettings.minParticleSize}set minParticleSize(t){this.rendererSettings.minParticleSize=Math.max(0,t),this.neededToUpdateRender=!0}get maxParticleSize(){return this.rendererSettings.maxParticleSize}set maxParticleSize(t){this.rendererSettings.maxParticleSize=t>0?t:1/0,this.neededToUpdateRender=!0}get pivot(){return this.rendererSettings.pivot}set pivot(t){this.rendererSettings.pivot=js.nonZeroPivot(t),this.neededToUpdateRender=!0}get lighting(){return this.rendererSettings.lighting??"fixed"}set lighting(t){this.rendererSettings.lighting=js.validLighting(t),this.neededToUpdateRender=!0}get rim(){return this.rendererSettings.rim}set rim(t){this.rendererSettings.rim=fs(t),this.neededToUpdateRender=!0}static validLighting(t){return"unlit"===t||"scene"===t?t:"fixed"}static validSortMode(t){return"distance"===t||"oldestInFront"===t||"youngestInFront"===t?t:"none"}static validCullingMode(t){return"pause"===t||"pauseAndCatchUp"===t?t:"always"}static nonZeroPivot(t){return!t||0===t.x&&0===t.y&&0===t.z?void 0:t.clone()}static nonZeroFlip(t){return t&&(t.x>0||t.y>0)?t.clone():void 0}get softNearFade(){return this.rendererSettings.softNearFade}set softNearFade(t){this.rendererSettings.softNearFade=t,this.neededToUpdateRender=!0}get softFarFade(){return this.rendererSettings.softFarFade}set softFarFade(t){this.rendererSettings.softFarFade=t,this.neededToUpdateRender=!0}get instancingGeometry(){return this.rendererSettings.instancingGeometry}set instancingGeometry(t){this.restart(),this.particles.length=0,this.rendererSettings.instancingGeometry=t,this.neededToUpdateRender=!0}get blending(){return this.rendererSettings.materialBlendMode}set blending(t){this.rendererSettings.materialBlendMode=t,this.neededToUpdateRender=!0}get renderMode(){return this.rendererSettings.renderMode}set renderMode(t){if(this.rendererSettings.renderMode!==t){let e=!1;switch(this.rendererSettings.renderMode===exports.RenderMode.Trail&&(e=!0),this.rendererSettings.renderMode===exports.RenderMode.Mesh&&(this.startRotation=new Ct(0)),t){case exports.RenderMode.Trail:this.rendererEmitterSettings={startLength:new Ct(30),followLocalOrigin:!1},e=!0;break;case exports.RenderMode.Mesh:this.rendererEmitterSettings={},this.startRotation=new Et(new H(0,1,0),new Ct(0));break;case exports.RenderMode.StretchedBillBoard:this.rendererEmitterSettings={speedFactor:0,lengthFactor:2};break;case exports.RenderMode.BillBoard:case exports.RenderMode.VerticalBillBoard:case exports.RenderMode.HorizontalBillBoard:this.rendererEmitterSettings={}}this.rendererSettings.renderMode=t,e&&(this.restart(),this.particles.length=0),this.neededToUpdateRender=!0}}get renderOrder(){return this.rendererSettings.renderOrder}set renderOrder(t){this.rendererSettings.renderOrder=t,this.neededToUpdateRender=!0}get renderingGroupId(){return this.rendererSettings.renderingGroupId}set renderingGroupId(t){this.rendererSettings.renderingGroupId=t,this.neededToUpdateRender=!0}get applyFog(){return this.rendererSettings.applyFog}set applyFog(t){this.rendererSettings.applyFog=t,this.neededToUpdateRender=!0}get seed(){return this.seedValue}set seed(t){this.seedValue=t,this.rng=void 0===t?void 0:z(t)}constructor(t){if(this.store=new ze(64),this.emitterVelocity=new H,this.finishedEventFired=!1,this.startDelayTimeLeft=0,this.tempEmitterPos=new H,this.temp=new H,this.pathMatrix=new st,this.normalMatrix=new ft,this.memory=[],this.listeners={},this.materialRef=null,this.qualityFactor=1,this.simulationAccumulator=0,this.destroyed=!1,this.fusionSteps=[],this.planChangesSize=!0,this.planChangesColor=!0,this.playbackSpeed=1,this.cullingMode="always",this.alignToDirection=!1,this.culled=!1,this.pendingCatchUp=0,this.boundsMin=new H,this.boundsMax=new H,this.boundsPadding=0,this.boundsValid=!1,this.stepsSinceBounds=0,this.boundsMaxSize=0,this.boundsMaxSpeedSq=0,this.boundsInWorld=!1,this.geometryRadius=1,this.firstTimeUpdate=!0,this.sceneRef=t.scene,this.layerMaskProxy={mask:t.layerMask??268435455},Object.defineProperty(this.layerMaskProxy,"mask",{enumerable:!0,get:()=>this.rendererSettings.layerMask,set:t=>{this.rendererSettings.layerMask=t,this.neededToUpdateRender=!0}}),this.autoDestroy=t.autoDestroy??!1,this.duration=t.duration??1,this.startDelay=t.startDelay??new Ct(0),this.looping=t.looping??!0,this.prewarm=t.prewarm??!1,this.startLife=t.startLife??new Ct(5),this.startSpeed=t.startSpeed??new Ct(0),this.startRotation=t.startRotation??new Ct(0),this.startSize=t.startSize??new Ct(1),this.startColor=t.startColor??new jt(new zt(1,1,1,1)),this.emissionOverTime=t.emissionOverTime??new Ct(10),this.emissionOverDistance=t.emissionOverDistance??new Ct(0),this.emissionBursts=t.emissionBursts??[],this.maxParticles=t.maxParticles,this.onlyUsedByOther=t.onlyUsedByOther??!1,this.emitterShape=t.shape??new Ci,this.behaviors=t.behaviors??[],this.worldSpace=t.worldSpace??!1,this.rendererEmitterSettings=t.rendererEmitterSettings??{},t.renderMode===exports.RenderMode.StretchedBillBoard){const e=this.rendererEmitterSettings;void 0!==t.speedFactor&&(e.speedFactor=t.speedFactor),e.speedFactor=e.speedFactor??0,e.lengthFactor=e.lengthFactor??0}var e;this.rendererSettings={instancingGeometry:t.instancingGeometry??Js,instancingIndices:t.instancingIndices??Gs,instancingUVs:t.instancingUVs??(t.instancingGeometry?(e=t.instancingGeometry,new Float32Array(e.length/3*2)):Qs),instancingNormals:t.instancingNormals,renderMode:t.renderMode??exports.RenderMode.BillBoard,renderOrder:t.renderOrder??0,uTileCount:t.uTileCount??1,vTileCount:t.vTileCount??1,blendTiles:t.blendTiles??!1,softParticles:t.softParticles??!1,softNearFade:t.softNearFade??0,softFarFade:t.softFarFade??0,materialBlendMode:t.blendMode??r.Constants.ALPHA_ADD,materialTransparent:t.transparent??!0,materialDepthTest:t.depthTest??!0,materialDepthWrite:t.depthWrite??!1,materialAlphaTest:t.alphaTest??0,texture:t.texture??null,reflectionTexture:null,reflectionLevel:1,reflectionFaces:null,reflectionAtlas:null,layerMask:t.layerMask??268435455,pivot:js.nonZeroPivot(t.pivot),sortMode:js.validSortMode(t.sortMode),minParticleSize:Math.max(0,t.minParticleSize??0),maxParticleSize:t.maxParticleSize??1/0,renderingGroupId:t.renderingGroupId??0,applyFog:t.applyFog??!0,lighting:js.validLighting(t.lighting),rim:fs(t.rim)},this.flip=js.nonZeroFlip(t.flip),this.playbackSpeed=t.playbackSpeed??1,this.cullingMode=t.cullingMode??"always",this.alignToDirection=!0===t.alignToDirection,this.seed=t.seed,this.rendererSettings.renderMode!==exports.RenderMode.Mesh||this.rendererSettings.instancingNormals||(this.rendererSettings.instancingNormals=js.createFallbackNormals(this.rendererSettings.instancingGeometry)),this.materialRef=t.material??null,this.applyMaterialSettings(this.materialRef,{blendMode:t.blendMode,transparent:t.transparent,depthTest:t.depthTest,depthWrite:t.depthWrite,alphaTest:t.alphaTest,texture:t.texture,layerMask:t.layerMask}),this.neededToUpdateRender=!0,this.particles=[],this.startTileIndex=t.startTileIndex||new Ct(0),this.emitter=new zs(this,t.scene),this.paused=!1,this.particleNum=0,this.emissionState={isBursting:!1,burstParticleIndex:0,burstParticleCount:0,burstIndex:0,burstWaveIndex:0,time:0,waitEmiting:0,travelDistance:0},this.emissionBursts.forEach(t=>t.count.startGen(this.memory)),this.emissionOverDistance.startGen(this.memory),this.startDelay.startGen(this.memory),this.startDelayTimeLeft=this.startDelay.genValue(this.memory,0),this.emitEnded=!1,this.markForDestroy=!1,this.prewarmed=!1}applyMaterialSettings(t,e={}){if(!this.rendererSettings)return;const i=void 0!==e.texture?e.texture:t?.albedoTexture??t?.diffuseTexture??t?.emissiveTexture??t?.opacityTexture??t?.baseTexture??this.rendererSettings.texture??null,s=t?.reflectionTexture??t?.environmentTexture??this.rendererSettings.reflectionTexture??null,r="number"==typeof s?.level?s.level:1,n=e.blendMode??("number"==typeof t?.alphaMode?t.alphaMode:this.rendererSettings.materialBlendMode),o=e.transparent??("function"==typeof t?.needAlphaBlending?t.needAlphaBlending():"number"==typeof t?.alpha?t.alpha<1:this.rendererSettings.materialTransparent),a=e.depthTest??("boolean"==typeof t?.disableDepthTest?!t.disableDepthTest:this.rendererSettings.materialDepthTest),h=e.depthWrite??("boolean"==typeof t?.disableDepthWrite?!t.disableDepthWrite:"boolean"==typeof t?.forceDepthWrite?t.forceDepthWrite:this.rendererSettings.materialDepthWrite),l=e.alphaTest??(()=>{const e=t?.transparencyMode,i=1===e||3===e;return i&&"number"==typeof t?.alphaCutOff?t.alphaCutOff:i&&"number"==typeof t?.alphaCutOffValue?t.alphaCutOffValue:t?0:this.rendererSettings.materialAlphaTest})();this.rendererSettings.texture=i,this.rendererSettings.reflectionTexture=s,this.rendererSettings.reflectionLevel="number"==typeof t?.reflectionLevel?t.reflectionLevel:r;let c=t?.reflectionAtlas??e.reflectionAtlas??this.rendererSettings.reflectionAtlas??null;!c&&s?.isCube&&(c=Vs(s),!c&&this.sceneRef&&(Fs(s,this.sceneRef,e=>{this.rendererSettings.reflectionAtlas!==e&&(this.rendererSettings.reflectionAtlas=e,t&&null==t.reflectionAtlas&&(t.reflectionAtlas=e),this.neededToUpdateRender=!0)}),c=Vs(s))),this.rendererSettings.reflectionAtlas=c,this.rendererSettings.reflectionFaces=6===t?.reflectionFaces?.length?t.reflectionFaces:null,this.rendererSettings.materialBlendMode=n,this.rendererSettings.materialTransparent=o,this.rendererSettings.materialDepthTest=a,this.rendererSettings.materialDepthWrite=h,this.rendererSettings.materialAlphaTest=l,void 0!==e.layerMask&&(this.rendererSettings.layerMask=e.layerMask),this.neededToUpdateRender=!0}pause(){this.paused=!0}play(){this.paused=!1}stop(){this.restart(),this.pause()}setQualityFactor(t){this.qualityFactor=Math.max(.1,Math.min(1,t))}rebindParticles(){const t=this.particles;for(let e=0;e<t.length;e++)t[e].rebind()}growParticlePool(t){const e=this.particles.length;this.store.ensureCapacity(e+1)&&this.rebindParticles(),this.particles.push(t?new ei(this.store,e):new Ke(this.store,e))}spawn(t,e,i){const s=Ls,r=Rs;i.decompose(s,Es,r);const n=this.behaviors,o=n.length,a=this.rendererSettings.renderMode,h=a===exports.RenderMode.Trail,l=!h,c=a===exports.RenderMode.Mesh,u="rotation"===this.startRotation.type,d="vec3function"===this.startSize.type,p=e.time/this.duration,f=h?this.rendererEmitterSettings:void 0,m=Boolean(f?.followLocalOrigin);void 0!==this.maxParticles&&(t=Math.min(t,Math.max(0,this.maxParticles-this.particleNum)));for(let s=0;s<t;s++){e.burstParticleIndex=s,this.particleNum++,this.particles.length<this.particleNum&&this.growParticlePool(h);const t=this.particles[this.particleNum-1];if(t.reset(),t.speedModifier=1,this.finishedEventFired=!1,this.startColor.startGen(t.memory),this.startColor.genColor(t.memory,t.startColor,this.emissionState.time),t.color.copy(t.startColor),this.startSpeed.startGen(t.memory),t.startSpeed=this.startSpeed.genValue(t.memory,p),this.startLife.startGen(t.memory),t.life=this.startLife.genValue(t.memory,p),t.age=0,this.startSize.startGen(t.memory),d)this.startSize.genValue(t.memory,t.startSize,p);else{const e=this.startSize.genValue(t.memory,p);t.startSize.set(e,e,e)}if(this.startTileIndex.startGen(t.memory),t.uvTile=this.startTileIndex.genValue(t.memory),t.size.copy(t.startSize),l){const e=t;if(this.startRotation.startGen(t.memory),c)e.rotation instanceof Z||(e.rotation=Ns),e.angularVelocity instanceof Z&&e.angularVelocity.set(0,0,0,1),u?this.startRotation.genValue(t.memory,e.rotation,1,p):e.rotation.setFromAxisAngle(Is,this.startRotation.genValue(e.memory,p));else{e.rotation=u?0:this.startRotation.genValue(e.memory,p),e.angularVelocity=0;const t=this.flip;e.flip=void 0===t?0:(S()<t.x?1:0)|(S()<t.y?2:0)}}else if(f){const e=t;f.startLength.startGen(e.memory),e.length=f.startLength.genValue(e.memory,p),e.ensureHistoryCapacity(Math.max(1,Math.ceil(e.length))),e.resetHistory()}this.emitterShape.initialize(t,e),this.alignToDirection&&l&&this.alignParticleToDirection(t,c);const a=e.particle,y=e.inherit;if(void 0!==a&&void 0!==y&&0!==y&&this.inheritFromParent(t,a,y,l),h&&m){const e=t;e.localPosition||(e.localPosition=new H),e.localPosition.copy(e.position)}this.worldSpace?(t.position.applyMatrix4(i),t.startSize.multiply(r).abs(),t.size.copy(t.startSize),t.velocity.multiply(r).applyMatrix3(this.normalMatrix),t.rotation&&t.rotation instanceof Z&&t.rotation.multiplyQuaternions(Es,t.rotation)):this.onlyUsedByOther&&(t.parentMatrix=i);for(let e=0;e<o;e++)n[e].initialize(t,this);this.store.recordMemory(t.storeIndex,t.memory)}}alignParticleToDirection(t,e){const i=t.velocity,s=i.x*i.x+i.y*i.y+i.z*i.z;if(0!==s)if(e){const e=t.rotation;Ls.copy(i).divideScalar(Math.sqrt(s)),Es.setFromUnitVectors(Is,Ls),e.multiplyQuaternions(Es,e)}else 0===i.x&&0===i.y||(t.rotation=t.rotation+Math.atan2(-i.x,i.y))}inheritFromParent(t,e,i,s){if(i&me.color&&(t.startColor.multiply(e.color),t.color.copy(t.startColor)),i&me.size&&(t.startSize.multiply(e.size),t.size.copy(t.startSize)),i&me.rotation&&s){const i=t,s=e.rotation;"number"==typeof i.rotation?"number"==typeof s&&(i.rotation+=s):s instanceof Z&&i.rotation.multiplyQuaternions(s,i.rotation)}i&me.lifetime&&e.life>0&&(t.life*=Math.max(0,1-e.age/e.life))}endEmit(){this.emitEnded=!0,this.autoDestroy&&(this.markForDestroy=!0),this.fire({type:"emitEnd",particleSystem:this})}dispose(){this.destroyed||(this.destroyed=!0,this._renderer&&this._renderer.deleteSystem(this),this.emitter.dispose(),this.fire({type:"destroy",particleSystem:this}))}restart(){this.memory.length=0,this.paused=!1,this.particleNum=0,this.boundsValid=!1,this.pendingCatchUp=0,void 0!==this.seedValue&&(this.rng=z(this.seedValue)),this.emissionState.isBursting=!1,this.emissionState.burstIndex=0,this.emissionState.burstWaveIndex=0,this.emissionState.burstWaves=void 0,this.emissionState.time=0,this.emissionState.waitEmiting=0,this.behaviors.forEach(t=>t.reset()),this.emitEnded=!1,this.markForDestroy=!1,this.finishedEventFired=!1,this.prewarmed=!1,this.emissionBursts.forEach(t=>t.count.startGen(this.memory)),this.emissionOverDistance.startGen(this.memory),this.startDelay.startGen(this.memory),this.startDelayTimeLeft=this.startDelay.genValue(this.memory,0),this.previousEmitterPos=void 0,this.emitterVelocity.set(0,0,0),this.simulationAccumulator=0,this.destroyed=!1}update(t,e=1/0,i){if(this.paused)return;if(t*=this.playbackSpeed,this.culled)return void("pauseAndCatchUp"===this.cullingMode&&(this.pendingCatchUp=Math.min(2,this.pendingCatchUp+t)));if(this.pendingCatchUp>0&&this.catchUp(i??performance.now()+js.catchUpBudgetMs),this.firstTimeUpdate&&(this.firstTimeUpdate=!1,this.emitter.computeWorldMatrix(!0)),!this.looping&&this.finishedEventFired&&0===this.particleNum){t>.1&&(t=.1),this.simulationAccumulator+=t;const e=Math.min(8,Math.max(0,Math.round(this.simulationAccumulator/Ds-1e-9)));return void(this.simulationAccumulator-=e*Ds)}if(this.looping&&this.prewarm&&!this.prewarmed){this.prewarmed=!0;for(let t=0;t<60*this.duration;t++)this.update(1/60)}t>.1&&(t=.1),this.neededToUpdateRender&&(this._renderer&&this._renderer.updateSystem(this),this.neededToUpdateRender=!1);const s=this.emitter.matrixWorld.elements;if(this.tempEmitterPos.set(s[12],s[13],s[14]),void 0!==this.previousEmitterPos&&t>0&&this.emitterVelocity.copy(this.tempEmitterPos).sub(this.previousEmitterPos).divideScalar(t),(this.previousEmitterPos??(this.previousEmitterPos=new H)).copy(this.tempEmitterPos),this.startDelayTimeLeft>0&&(!this.prewarm||!this.looping)){if(this.startDelayTimeLeft-=t,this.startDelayTimeLeft>=0)return;t=Math.min(-this.startDelayTimeLeft,.1),this.startDelayTimeLeft=0}this.simulationAccumulator+=t;const r=Math.min(8,Math.max(0,Math.round(this.simulationAccumulator/Ds-1e-9)));for(let t=0;t<r&&(this.simulateStep(Ds),!(e!==1/0&&t+1<r&&performance.now()>=e));t++);this.simulationAccumulator-=r*Ds}catchUp(t){let e=Math.floor(this.pendingCatchUp/Ds);for(this.pendingCatchUp=0;e-- >0&&(this.simulateStep(Ds),!(e>0&&performance.now()>=t)););}storeBounds(t,e,i,s,r,n,o,a,h,l){if(0===t)return void(this.boundsValid=!1);this.stepsSinceBounds=e?0:this.stepsSinceBounds+1,this.boundsMaxSize=h,this.boundsMaxSpeedSq=l;const c=Math.sqrt(l),u=this.rendererSettings.renderMode;let d=c*Ds*(this.stepsSinceBounds+1);if(u===exports.RenderMode.Mesh)d+=h*this.meshGeometryRadius();else if(u===exports.RenderMode.StretchedBillBoard){const t=this.rendererEmitterSettings;d+=h*(1+(t.lengthFactor??0)+c*(t.speedFactor??0))}else{const t=this.rendererSettings.pivot;d+=h*(.75+(void 0===t?0:Math.abs(t.x)+Math.abs(t.y)+Math.abs(t.z)))}this.boundsMin.set(i,s,r),this.boundsMax.set(n,o,a),this.boundsPadding=d,this.boundsInWorld=this.worldSpace,this.boundsValid=!0}meshGeometryRadius(){const t=this.rendererSettings.instancingGeometry;if(t!==this.geometryRadiusFor){let e=0;for(let i=0;i+2<t.length;i+=3){const s=t[i]*t[i]+t[i+1]*t[i+1]+t[i+2]*t[i+2];s>e&&(e=s)}this.geometryRadius=Math.sqrt(e),this.geometryRadiusFor=t}return this.geometryRadius}getWorldBounds(t,e){if(!this.boundsValid)return!1;const i=this.boundsMin,s=this.boundsMax;if(this.boundsInWorld){const r=this.boundsPadding;return t.set(i.x-r,i.y-r,i.z-r),e.set(s.x+r,s.y+r,s.z+r),!0}const r=this.emitter.matrixWorld.elements,n=Math.sqrt(Math.max(r[0]*r[0]+r[1]*r[1]+r[2]*r[2],r[4]*r[4]+r[5]*r[5]+r[6]*r[6],r[8]*r[8]+r[9]*r[9]+r[10]*r[10])),o=this.boundsPadding*n;let a=1/0,h=1/0,l=1/0,c=-1/0,u=-1/0,d=-1/0;for(let t=0;t<8;t++){const e=1&t?s.x:i.x,n=2&t?s.y:i.y,o=4&t?s.z:i.z,p=1/(r[3]*e+r[7]*n+r[11]*o+r[15]),f=(r[0]*e+r[4]*n+r[8]*o+r[12])*p,m=(r[1]*e+r[5]*n+r[9]*o+r[13])*p,y=(r[2]*e+r[6]*n+r[10]*o+r[14])*p;f<a&&(a=f),f>c&&(c=f),m<h&&(h=m),m>u&&(u=m),y<l&&(l=y),y>d&&(d=y)}return t.set(a-o,h-o,l-o),e.set(c+o,u+o,d+o),!0}setWorldBounds(t,e,i,s,r,n,o){this.boundsMin.set(t,e,i),this.boundsMax.set(s,r,n),this.boundsPadding=o,this.boundsInWorld=!0,this.boundsValid=!0}get simulationStep(){return Ds}get simulationResidual(){return this.paused?0:this.simulationAccumulator>Ds?Ds:this.simulationAccumulator<-Ds?-Ds:this.simulationAccumulator}behaviorSteps(){const t=this.behaviors,e=this.fusionPlan;if(void 0!==e&&e.length===t.length){let i=!0;for(let s=0;s<t.length;s++)if(e[s]!==t[s]){i=!1;break}if(i)return this.fusionSteps}this.fusionPlan=t.slice(),this.fusionSteps=vi(t);let i=!1,s=!1;for(let e=0;e<t.length;e++){const r=t[e].type;Us.has(r)?i=!0:qs.has(r)?s=!0:ks.has(r)||(i=!0,s=!0)}return this.planChangesSize=i,this.planChangesColor=s,this.fusionSteps}simulateStep(t){const e=this.rng;if(void 0===e)return void this.stepOnce(t);const i=b(e);try{this.stepOnce(t)}finally{b(i)}}stepOnce(t){this.onlyUsedByOther||this.emit(t,this.emissionState,this.emitter.matrixWorld);const e=this.particles,i=this.behaviors;i.length;const s=this.particleNum,r=this.rendererSettings.renderMode===exports.RenderMode.Trail,n=this.rendererSettings.renderMode===exports.RenderMode.StretchedBillBoard,o=this.store,a=3*s,h=this.behaviorSteps(),l=this.planChangesSize,c=this.planChangesColor;o.useSizeSnapshot(l),o.useColorSnapshot(c),o.previousPosition.set(o.position.subarray(0,a)),l&&o.previousSize.set(o.size.subarray(0,a)),n&&(o.keepPreviousVelocity()&&this.rebindParticles(),o.previousVelocity.set(o.velocity.subarray(0,a))),c&&o.previousColor.set(o.color.subarray(0,4*s)),this.emitterShape.update(this,t);for(let r=0;r<h.length;r++){const n=h[r],o=n.behaviors;for(let e=0;e<o.length;e++)o[e].frameUpdate(t);if(0===s)continue;if(void 0!==n.run){n.run(i,e,s,t,this.store);continue}const a=o[0];if(void 0===a.updateAll)for(let i=0;i<s;i++){const s=e[i];s.age<s.life&&a.update(s,t)}else a.updateAll(e,s,t)}const u=this.hasListeners("particleDied"),d=this.store,p=d.scalars,f=ze.SCALAR_STRIDE;let m=this.particleNum;if(!r){const i=d.position,s=d.velocity,r=d.previousSize,n=d.size,o=d.previousColor,a=d.color,h=l,y=c,v=this.stepsSinceBounds>=4||!this.boundsValid,g=this.boundsMin,x=this.boundsMax;let S=v?1/0:g.x,w=v?1/0:g.y,b=v?1/0:g.z,z=v?-1/0:x.x,M=v?-1/0:x.y,_=v?-1/0:x.z,P=v?0:this.boundsMaxSize,T=v?0:this.boundsMaxSpeedSq;for(let l=0;l<m;l++){const c=l*f;let g=p[c+ze.AGE];const x=3*l,V=v||0===g;if(0===g&&(h&&(r[x]=n[x],r[x+1]=n[x+1],r[x+2]=n[x+2]),y)){const t=4*l;o[t]=a[t],o[t+1]=a[t+1],o[t+2]=a[t+2],o[t+3]=a[t+3]}const O=t*p[c+ze.SPEED_MODIFIER],C=s[x],F=s[x+1],B=s[x+2],A=i[x]+C*O,$=i[x+1]+F*O,I=i[x+2]+B*O;if(i[x]=A,i[x+1]=$,i[x+2]=I,V&&(S=Math.min(S,A),z=Math.max(z,A),w=Math.min(w,$),M=Math.max(M,$),b=Math.min(b,I),_=Math.max(_,I),P=Math.max(P,Math.max(n[x],Math.max(n[x+1],n[x+2])))),T=Math.max(T,C*C+F*F+B*B),g+=t,p[c+ze.AGE]=g,g>=p[c+ze.LIFE]){const t=m-1,i=e[l],s=e[t];e[l]=s,e[t]=i,l!==t&&(d.swapRows(l,t),s.setStoreIndex(l),i.setStoreIndex(t)),m--,l--,u&&this.fire({type:"particleDied",particleSystem:this,particle:i})}}return this.particleNum=m,this.storeBounds(m,v,S,w,b,z,M,_,P,T),void this.notifyFinished()}if(s>0){const t=o.previousSize,e=o.size,i=o.previousColor,r=o.color;for(let n=0,o=0,a=0,h=0;n<s;n++,o+=3,a+=4,h+=f)0===p[h+ze.AGE]&&(l&&(t[o]=e[o],t[o+1]=e[o+1],t[o+2]=e[o+2]),c&&(i[a]=r[a],i[a+1]=r[a+1],i[a+2]=r[a+2],i[a+3]=r[a+3]))}if(this.rendererEmitterSettings.followLocalOrigin){const i=this.emitter.matrixWorld;for(let r=0;r<s;r++){const s=e[r];s.localPosition?(s.position.copy(s.localPosition),s.position.applyMatrix4(s.parentMatrix??i)):s.position.addScaledVector(s.velocity,t*s.speedModifier),s.age+=t}}else{const e=d.position,i=d.velocity;for(let r=0,n=0,o=0;r<s;r++,n+=3,o+=f){const s=t*p[o+ze.SPEED_MODIFIER];e[n]+=i[n]*s,e[n+1]+=i[n+1]*s,e[n+2]+=i[n+2]*s,p[o+ze.AGE]+=t}}{const t=this.rendererEmitterSettings,i=t.dieWithParticle,r=t.recordWorldSpace&&!this.worldSpace,n=this.emitter.matrixWorld;for(let t=0;t<s;t++){const s=e[t];if(i&&s.age>=s.life)s.resetHistory();else if(s.update(),r&&s.age<=s.life){const t=(s.historyHead+s.historyCapacity-1)%s.historyCapacity*3,e=s.historyPositions;Ls.set(e[t],e[t+1],e[t+2]),Ls.applyMatrix4(s.parentMatrix??n),e[t]=Ls.x,e[t+1]=Ls.y,e[t+2]=Ls.z}}}for(let t=0;t<m;t++){const i=e[t],s=t*f;if(p[s+ze.AGE]>=p[s+ze.LIFE]&&0===i.historyCount){const s=m-1,r=e[s];e[t]=r,e[s]=i,t!==s&&(d.swapRows(t,s),r.setStoreIndex(t),i.setStoreIndex(s)),m--,t--,u&&this.fire({type:"particleDied",particleSystem:this,particle:i})}}this.particleNum=m,this.notifyFinished()}notifyFinished(){this.isFinished()&&(this.finishedEventFired||(this.finishedEventFired=!0,this.fire({type:"finished",particleSystem:this})),this.autoDestroy&&(this.markForDestroy=!0,this.dispose()))}static burstWaveCount(t){return t.cycle>=1?Math.floor(t.cycle):1}static burstInterval(t){return t.interval>0?t.interval:0}emitBursts(t,e){const i=this.emissionBursts,s=i.length,r=t.time,n=t.burstWaves??(t.burstWaves=[]);for(;t.burstIndex<s&&i[t.burstIndex].time<=r;)n[t.burstIndex]=0,t.burstIndex++;const o=t.burstIndex;for(let s=0;s<o;s++){const o=i[s],a=js.burstWaveCount(o);let h=n[s]??0;if(h>=a)continue;const l=js.burstInterval(o);for(;h<a;){const i=o.time+h*l;if(h>0&&i>this.duration){h=a;break}if(i>r)break;t.burstWaveIndex=h,this.fireBurstWave(o,t,e),h++}n[s]=h}}fireBurstWave(t,e,i){if(S()>=t.probability)return;const s=t.count.genValue(this.memory,this.time),r=this.qualityFactor,n=r>=.999?s:Math.floor(s*r);e.isBursting=!0,e.burstParticleCount=n,this.spawn(n,e,i),e.isBursting=!1}hasPendingBurstWaves(t){const e=t.burstWaves;if(void 0===e)return!1;const i=this.emissionBursts;for(let s=0;s<t.burstIndex&&s<i.length;s++){const t=i[s],r=e[s]??0;if(r<js.burstWaveCount(t)&&(0===r||t.time+r*js.burstInterval(t)<=this.duration))return!0}return!1}spawnAlongPath(t,e,i,s,r,n,o){const a=this.pathMatrix.copy(i),h=i.elements,l=a.elements,c=h[12],u=h[13],d=h[14];for(let i=1;i<=t;i++){const t=i*n-r,h=t<=0?0:t>=o?1:t/o;l[12]=s.x+(c-s.x)*h,l[13]=s.y+(u-s.y)*h,l[14]=s.z+(d-s.z)*h,this.spawn(1,e,a)}}emit(t,e,i){if(e.time>this.duration)if(this.looping){e.time-=this.duration,e.burstIndex=0,void 0!==e.burstWaves&&(e.burstWaves.length=0);for(let t=0;t<this.behaviors.length;t++)this.behaviors[t].reset()}else this.emitEnded||this.onlyUsedByOther||this.endEmit();this.worldSpace&&this.normalMatrix.getNormalMatrix(i);const s=this.emissionBursts.length,r=this.qualityFactor;s>0&&this.emitBursts(e,i);let n=0,o=0,a=0,h=0;const l=e.previousWorldPos;if(!this.emitEnded){const s=e.time/this.duration;if(e.waitEmiting+=t*this.emissionOverTime.genValue(this.memory,s)*r,void 0!==l){this.temp.set(i.elements[12],i.elements[13],i.elements[14]),h=l.distanceTo(this.temp),a=e.travelDistance,e.travelDistance+=h;const t=this.emissionOverDistance.genValue(this.memory,s)*r;if(e.travelDistance*t>0){const i=Math.floor(e.travelDistance*t);e.travelDistance-=i/t,this.worldSpace&&h>0?(n=i,o=1/t):e.waitEmiting+=i}}}const c=Math.floor(e.waitEmiting);c>0&&(this.spawn(c,e,i),e.waitEmiting-=c),n>0&&this.spawnAlongPath(n,e,i,l,a,o,h),void 0===e.previousWorldPos&&(e.previousWorldPos=new H),e.previousWorldPos.set(i.elements[12],i.elements[13],i.elements[14]),e.time+=t}toJSON(t,e={}){const i=void 0===t||"string"==typeof t?{geometries:{},materials:{},textures:{},images:{},shapes:{},skeletons:{},animations:{},nodes:{}}:t,s=this.ensureGeometryMeta(i),r=this.ensureMaterialMeta(i),n=this.toRendererSettingsJSON();return{version:"3.0",autoDestroy:this.autoDestroy,looping:this.looping,prewarm:this.prewarm,duration:this.duration,startDelay:this.startDelay.toJSON(),shape:this.emitterShape.toJSON(),startLife:this.startLife.toJSON(),startSpeed:this.startSpeed.toJSON(),startRotation:this.startRotation.toJSON(),startSize:this.startSize.toJSON(),startColor:this.startColor.toJSON(),emissionOverTime:this.emissionOverTime.toJSON(),emissionOverDistance:this.emissionOverDistance.toJSON(),emissionBursts:this.emissionBursts.map(t=>({time:t.time,count:t.count.toJSON(),probability:t.probability,interval:t.interval,cycle:t.cycle})),...void 0!==this.maxParticles?{maxParticles:this.maxParticles}:{},onlyUsedByOther:this.onlyUsedByOther,instancingGeometry:s,renderMode:this.renderMode,renderOrder:this.renderOrder,...0!==this.renderingGroupId?{renderingGroupId:this.renderingGroupId}:{},...this.applyFog?{}:{applyFog:!1},...1!==this.playbackSpeed?{playbackSpeed:this.playbackSpeed}:{},..."always"!==this.cullingMode?{cullingMode:this.cullingMode}:{},...void 0!==this.seedValue?{seed:this.seedValue}:{},..."none"!==this.sortMode?{sortMode:this.sortMode}:{},...this.alignToDirection?{alignToDirection:!0}:{},...this.minParticleSize>0?{minParticleSize:this.minParticleSize}:{},...this.maxParticleSize!==1/0?{maxParticleSize:this.maxParticleSize}:{},rendererEmitterSettings:n,material:r,layers:this.rendererSettings.layerMask,startTileIndex:this.startTileIndex.toJSON(),uTileCount:this.rendererSettings.uTileCount,vTileCount:this.rendererSettings.vTileCount,blendTiles:this.rendererSettings.blendTiles,softParticles:this.rendererSettings.softParticles,softFarFade:this.rendererSettings.softFarFade,softNearFade:this.rendererSettings.softNearFade,blending:this.rendererSettings.materialBlendMode,transparent:this.rendererSettings.materialTransparent,depthTest:this.rendererSettings.materialDepthTest,depthWrite:this.rendererSettings.materialDepthWrite,alphaTest:this.rendererSettings.materialAlphaTest,behaviors:this.behaviors.map(t=>t.toJSON()),worldSpace:this.worldSpace,...this.pivot?{pivot:[this.pivot.x,this.pivot.y,this.pivot.z]}:{},...this.flip?{flip:[this.flip.x,this.flip.y]}:{}}}static fromJSON(t,e,i={},s){const n=Ai(t.shape,e);let o;if(t.renderMode===exports.RenderMode.Trail){const e=t.rendererEmitterSettings;o={startLength:void 0!==e?.startLength?It(e.startLength):new Ct(30),followLocalOrigin:e?.followLocalOrigin??!1,...Ws(e)}}else t.renderMode===exports.RenderMode.StretchedBillBoard?(o={...t.rendererEmitterSettings??{}},void 0!==t.speedFactor&&(o.speedFactor=t.speedFactor)):o={};const a=t.material?e.materials?.[t.material]:void 0,h=a?.texture??t.texture,l="string"==typeof h?e.textures?.[h]??null:h??null,c="string"==typeof t.instancingGeometry?e.geometries?.[t.instancingGeometry]:t.instancingGeometry,u=js.resolveGeometryData(c),d=new js({scene:s,autoDestroy:t.autoDestroy,looping:t.looping,prewarm:t.prewarm,duration:t.duration,startDelay:t.startDelay?It(t.startDelay):void 0,shape:n,startLife:It(t.startLife),startSpeed:It(t.startSpeed),startRotation:ee(t.startRotation),startSize:ee(t.startSize),startColor:Yt(t.startColor),emissionOverTime:It(t.emissionOverTime),emissionOverDistance:It(t.emissionOverDistance),emissionBursts:t.emissionBursts?.map(t=>({time:t.time,count:"number"==typeof t.count?new Ct(t.count):It(t.count),probability:t.probability??1,interval:t.interval??.1,cycle:t.cycle??t.cycleCount??1})),maxParticles:"number"==typeof t.maxParticles?t.maxParticles:void 0,onlyUsedByOther:t.onlyUsedByOther,instancingGeometry:u.positions,instancingIndices:u.indices,instancingUVs:u.uvs,instancingNormals:u.normals,renderMode:t.renderMode,rendererEmitterSettings:o,renderOrder:t.renderOrder,renderingGroupId:"number"==typeof t.renderingGroupId?t.renderingGroupId:void 0,applyFog:!1!==t.applyFog,playbackSpeed:"number"==typeof t.playbackSpeed?t.playbackSpeed:void 0,cullingMode:js.validCullingMode(t.cullingMode),seed:"number"==typeof t.seed?t.seed:void 0,sortMode:js.validSortMode(t.sortMode),alignToDirection:!0===t.alignToDirection,minParticleSize:"number"==typeof t.minParticleSize?t.minParticleSize:void 0,maxParticleSize:"number"==typeof t.maxParticleSize?t.maxParticleSize:void 0,texture:l,material:a?.sourceMaterial??a,blendMode:a?.alphaMode??t.blending??r.Constants.ALPHA_ADD,transparent:a?.transparent??t.transparent??!0,depthTest:a?.depthTest??t.depthTest??!0,depthWrite:a?.depthWrite??t.depthWrite??!1,alphaTest:a?.alphaTest??t.alphaTest??0,startTileIndex:"number"==typeof t.startTileIndex?new Ct(t.startTileIndex):It(t.startTileIndex),uTileCount:t.uTileCount,vTileCount:t.vTileCount,blendTiles:t.blendTiles,softParticles:t.softParticles,softFarFade:t.softFarFade,softNearFade:t.softNearFade,behaviors:[],worldSpace:t.worldSpace,layerMask:t.layers,pivot:t.pivot?new H(t.pivot[0]??0,t.pivot[1]??0,t.pivot[2]??0):void 0,flip:t.flip?new xt(t.flip[0]??0,t.flip[1]??0):void 0,lighting:a?.lighting,rim:a?.rim});return d.behaviors=(t.behaviors??[]).map(t=>{const e=ri(t,d);return e&&"EmitSubParticleSystem"===e.type&&(i[t.subParticleSystem]=e),e}).filter(t=>null!==t),d}static nextSerializationId(t){return js.serializationCounter+=1,`${t}_${js.serializationCounter}`}static createFallbackNormals(t){const e=new Float32Array(t.length);for(let t=0;t<e.length;t+=3)e[t]=0,e[t+1]=0,e[t+2]=1;return e}toRendererSettingsJSON(){return this.renderMode===exports.RenderMode.Trail?{startLength:this.rendererEmitterSettings.startLength.toJSON(),followLocalOrigin:this.rendererEmitterSettings.followLocalOrigin,...Ws(this.rendererEmitterSettings)}:this.renderMode===exports.RenderMode.StretchedBillBoard?{speedFactor:this.rendererEmitterSettings.speedFactor,lengthFactor:this.rendererEmitterSettings.lengthFactor}:{}}ensureGeometryMeta(t){const e=js.nextSerializationId("quarks_geometry");return t.geometries[e]={uuid:e,type:"QuarksGeometry",positions:Array.from(this.rendererSettings.instancingGeometry),indices:Array.from(this.rendererSettings.instancingIndices),uvs:this.rendererSettings.instancingUVs?Array.from(this.rendererSettings.instancingUVs):void 0,normals:this.rendererSettings.instancingNormals?Array.from(this.rendererSettings.instancingNormals):void 0},e}ensureMaterialMeta(t){const e=this.rendererSettings.texture;let i;e&&(i=js.nextSerializationId("quarks_texture"),t.textures[i]=e);const s=this.rendererSettings.reflectionAtlas;let r;s instanceof y.Texture&&(r=js.nextSerializationId("quarks_texture"),t.textures[r]=s);const n=js.nextSerializationId("quarks_material");return t.materials[n]={uuid:n,type:"QuarksMaterial",transparent:this.rendererSettings.materialTransparent,alphaMode:this.rendererSettings.materialBlendMode,depthTest:this.rendererSettings.materialDepthTest,depthWrite:this.rendererSettings.materialDepthWrite,alphaTest:this.rendererSettings.materialAlphaTest,texture:i,reflectionAtlas:r,reflectionLevel:this.rendererSettings.reflectionLevel,..."fixed"!==this.lighting?{lighting:this.lighting}:{},...this.rim?{rim:{...this.rim,color:[...this.rim.color]}}:{},sourceMaterial:this.materialRef??void 0},n}static resolveGeometryData(t){if(t?.positions){const e=t.positions instanceof Float32Array?t.positions:new Float32Array(t.positions);return{positions:e,indices:$s(e,t.indices instanceof Uint16Array||t.indices instanceof Uint32Array?t.indices:t.indices?new Uint32Array(t.indices):void 0),uvs:t.uvs?t.uvs instanceof Float32Array?t.uvs:new Float32Array(t.uvs):void 0,normals:t.normals?t.normals instanceof Float32Array?t.normals:new Float32Array(t.normals):void 0}}const e=t?.data??t;if(e?.attributes?.position?.array){const t=new Float32Array(e.attributes.position.array);let i;if(e.index?.array){i=new("Uint16Array"===e.index.type?Uint16Array:Uint32Array)(e.index.array)}return{positions:t,indices:$s(t,i),uvs:e.attributes.uv?.array?new Float32Array(e.attributes.uv.array):void 0,normals:e.attributes.normal?.array?new Float32Array(e.attributes.normal.array):void 0}}return{positions:Js,indices:Gs,uvs:Qs}}addBehavior(t){this.behaviors.push(t),this._renderer?._invalidateUpdateOrder()}getRendererSettings(){return this.rendererSettings}addEventListener(t,e){this.listeners[t]||(this.listeners[t]=[]),this.listeners[t].push(e)}removeAllEventListeners(t){this.listeners[t]&&(this.listeners[t]=[])}removeEventListener(t,e){if(this.listeners[t]){const i=this.listeners[t].indexOf(e);-1!==i&&this.listeners[t].splice(i,1)}}hasListeners(t){const e=this.listeners[t];return void 0!==e&&e.length>0}fire(t){const e=this.listeners[t.type];if(void 0!==e)for(let i=0;i<e.length;i++)e[i](t)}clone(){const t=this.behaviors.map(t=>t.clone());let e;e=this.renderMode===exports.RenderMode.Trail?{startLength:this.rendererEmitterSettings.startLength.clone(),followLocalOrigin:this.rendererEmitterSettings.followLocalOrigin,...Ws(this.rendererEmitterSettings)}:this.renderMode===exports.RenderMode.StretchedBillBoard?{lengthFactor:this.rendererEmitterSettings.lengthFactor,speedFactor:this.rendererEmitterSettings.speedFactor}:{};const i=new js({autoDestroy:this.autoDestroy,looping:this.looping,prewarm:this.prewarm,duration:this.duration,startDelay:this.startDelay.clone(),shape:this.emitterShape.clone(),startLife:this.startLife.clone(),startSpeed:this.startSpeed.clone(),startRotation:this.startRotation.clone(),startSize:this.startSize.clone(),startColor:this.startColor.clone(),emissionOverTime:this.emissionOverTime.clone(),emissionOverDistance:this.emissionOverDistance.clone(),emissionBursts:this.emissionBursts.map(t=>({...t})),maxParticles:this.maxParticles,onlyUsedByOther:this.onlyUsedByOther,instancingGeometry:this.rendererSettings.instancingGeometry,instancingIndices:this.rendererSettings.instancingIndices,instancingUVs:this.rendererSettings.instancingUVs,instancingNormals:this.rendererSettings.instancingNormals,renderMode:this.renderMode,renderOrder:this.renderOrder,renderingGroupId:this.renderingGroupId,applyFog:this.applyFog,playbackSpeed:this.playbackSpeed,cullingMode:this.cullingMode,seed:this.seedValue,sortMode:this.sortMode,alignToDirection:this.alignToDirection,minParticleSize:this.minParticleSize,maxParticleSize:this.maxParticleSize,rendererEmitterSettings:e,material:this.materialRef,texture:this.rendererSettings.texture,startTileIndex:this.startTileIndex,uTileCount:this.rendererSettings.uTileCount,vTileCount:this.rendererSettings.vTileCount,blendTiles:this.rendererSettings.blendTiles,softParticles:this.rendererSettings.softParticles,softFarFade:this.rendererSettings.softFarFade,softNearFade:this.rendererSettings.softNearFade,behaviors:t,worldSpace:this.worldSpace,blendMode:this.rendererSettings.materialBlendMode,transparent:this.rendererSettings.materialTransparent,depthTest:this.rendererSettings.materialDepthTest,depthWrite:this.rendererSettings.materialDepthWrite,alphaTest:this.rendererSettings.materialAlphaTest,layerMask:this.rendererSettings.layerMask,pivot:this.pivot,flip:this.flip,lighting:this.lighting,rim:this.rim,scene:this.emitter.getScene()});for(const e of t)e instanceof ve&&(e.particleSystem=i);return i}}js.serializationCounter=0,js.catchUpBudgetMs=2;class Ys extends s.TransformNode{constructor(t="QuarksPrefab",e){super(t,e),this.type="QuarksPrefab",this.animationData=[],this.isPlaying=!1,this.currentTime=-1e-5,this.timeScale=1,this.duration=0,this._lastUpdateTimeMs=Date.now(),this._tempAnimationJSON=[]}registerBatchedRenderer(t){this._batchedRenderer=t}addParticleSystemAnimation(t,e=0,i=0,s=!1){const r={startTime:e,duration:i>0?i:t.system.duration,type:"ps",loop:s,target:t};return this.animationData.push(r),this.pause(),this.updateDuration(),r}addThreeAnimation(t,e,i=0,s=e?.duration??0,r=!1,n){const o={startTime:i,duration:s>0?s:e?.duration??0,type:"three",loop:r,target:t,clip:e,clipUUID:n??e?.uuid};return this.animationData.push(o),this.updateDuration(),o}removeAnimation(t){this.animationData.splice(t,1),this.updateDuration()}play(){this.isPlaying||(this.isPlaying=!0,this._lastUpdateTimeMs=Date.now())}pause(){this.isPlaying&&(this.isPlaying=!1,this.animationData.forEach(t=>{"ps"===t.type&&t.target instanceof zs?t.target.system.pause():t.clip?.pause?.()}))}stop(){this.pause(),this.currentTime=-1e-5,this.animationData.forEach(t=>{"ps"===t.type&&t.target instanceof zs?t.target.system.stop():t.clip?.stop?.()})}update(t){if(!this.isPlaying)return;const e=Date.now(),i=t??Math.max((e-this._lastUpdateTimeMs)/1e3,0);this._lastUpdateTimeMs=e;const s=this.currentTime;this.currentTime+=i*this.timeScale,this.currentTime>this.duration?this.stop():this.animationData.forEach(t=>{const e=t.startTime,i=t.startTime+t.duration,r=this.currentTime>=e&&this.currentTime<=i,n=s>=e&&s<=i;if(!r||n){if(!r&&n){if(t.loop&&"ps"===t.type&&t.target instanceof zs)return void t.target.system.restart();"ps"===t.type&&t.target instanceof zs?t.target.system.endEmit():t.loop?t.clip?.play?.():t.clip?.stop?.()}}else"ps"===t.type&&t.target instanceof zs?(t.target.system.restart(),this._batchedRenderer&&this._batchedRenderer.addSystem(t.target.system)):t.clip?.play?.()})}setTime(t){const e=this.currentTime;this.currentTime=t,this.animationData.forEach(i=>{const s=i.startTime,r=i.startTime+i.duration,n=this.currentTime>=s&&this.currentTime<r,o=e>=s&&e<r;!n||o?n||!o?n&&"three"===i.type&&i.clip?.setTime?.(Math.max(t-s,0)):"ps"===i.type&&i.target instanceof zs?i.target.system.endEmit():i.clip?.stop?.():"ps"===i.type&&i.target instanceof zs?i.target.system.restart():i.clip?.play?.()})}getDuration(){return this.duration}resolveReferences(t){const e={},i=t=>{t._quarksUUID&&(e[t._quarksUUID]=t),e[t.uniqueId.toString()]=t;const r=t.getChildren();for(const t of r)t instanceof s.TransformNode&&i(t)};i(t),this._tempAnimationJSON.forEach(t=>{const i=e[t.targetUUID];if("ps"===t.type&&i instanceof zs)this.addParticleSystemAnimation(i,t.startTime,t.duration,t.loop);else if("three"===t.type&&i){const e=this.resolveTimelineClip(i,t.clipUUID);this.addThreeAnimation(i,e,t.startTime,t.duration,t.loop,t.clipUUID)}}),this.updateDuration(),this._tempAnimationJSON=[]}toJSON(){return{type:this.type,name:this.name,animationData:this.animationData.map(t=>({startTime:t.startTime,duration:t.duration,type:t.type,targetUUID:t.target._quarksUUID??t.target.uniqueId.toString(),clipUUID:"three"===t.type?t.clipUUID??t.clip?.uuid:void 0,loop:t.loop}))}}static fromJSON(t,e){const i=new Ys(t.name||"QuarksPrefab",e);return Array.isArray(t.animationData)&&(i._tempAnimationJSON=t.animationData.filter(t=>"ps"===t?.type||"three"===t?.type)),i}resolveTimelineClip(t,e){const i=[t.animations,t.animationGroups,t.metadata?.animations,t.metadata?.animationGroups];for(const t of i){if(!Array.isArray(t))continue;if(!e)return t[0];const i=t.find(t=>t?.uuid===e);if(i)return i}}updateDuration(){let t=0;this.animationData.forEach(e=>{const i=e.startTime+e.duration;i>t&&(t=i)}),this.duration=t}}const Xs=new WeakMap,Zs=new WeakMap,Hs=new WeakMap;function Ks(t,e){let i=t.get(e);return void 0===i&&(i=new Map,t.set(e,i)),i}class tr{constructor(t,e={}){this.scene=t,this.options=e}async load(t){const{json:e,baseUrl:i}=await this.fetchEffectDocument(t);return this.loadFromJSON(e,i)}async loadFromJSON(t,e){const i=e??this.options.baseUrl??"";return await this.resolveResources(t,i),this.parse(t,i)}async loadAll(t,e={}){const i=await tr.mapPool(t,e.concurrency,async(i,s)=>{try{return await this.fetchEffectDocument(i)}catch(r){if(!e.continueOnError)throw r;return console.warn(`[QuarksLoader] Failed to fetch effect "${i}" (${s+1}/${t.length}):`,r),null}});return this.loadDocuments(i,e)}async loadFromJSONAll(t,e={}){const i=t.map(t=>{if(null!==t&&"object"==typeof t&&"json"in t){const e=t;return{json:e.json,baseUrl:e.baseUrl??this.options.baseUrl??""}}return{json:t,baseUrl:this.options.baseUrl??""}});return this.loadDocuments(i,e)}async resolveResources(t,e=""){await tr.resolveLinkedResources(t,{baseUrl:e,resolver:this.options.resolver,scene:this.scene})}static async resolveLinkedResources(t,e={}){const i=e.baseUrl??"",s=e.resolver,r=e.scene;await tr.inlineGeometryEntries(t,async t=>{const e=await tr.resolveWith(s,t,"geometry",i);return tr.fetchJsonWith(s,e,r)});const n=Array.isArray(t?.images)?t.images:[];await Promise.all(n.map(async t=>{"string"==typeof t?.url&&t.url&&(t.url=await tr.resolveWith(s,t.url,"image",i))}))}static async resolveExternalGeometries(t,e){await tr.inlineGeometryEntries(t,e)}parse(t,e=""){const i={textures:{},geometries:{},materials:{}};t.geometries&&this.parseGeometries(t.geometries,i),t.images&&this.parseImages(t.images,e,i),t.textures&&this.parseTextures(t.textures,i),t.materials&&this.parseMaterials(t.materials,i);const s=this.parseObject(t.object,i);return this.linkReferences(s),s}parseGeometries(t,e){for(const i of t)if("PlaneGeometry"===i.type){const t=(i.width||1)/2,s=(i.height||1)/2;e.geometries[i.uuid]={positions:new Float32Array([-t,-s,0,t,-s,0,t,s,0,-t,s,0]),indices:new Uint32Array([0,1,2,0,2,3]),uvs:new Float32Array([0,0,1,0,1,1,0,1]),normals:new Float32Array([0,0,1,0,0,1,0,0,1,0,0,1])}}else if("SphereGeometry"===i.type)e.geometries[i.uuid]=this.parseSphereGeometry(i);else if("BufferGeometry"===i.type&&i.data){const t=this.parseBufferGeometry(i.data);e.geometries[i.uuid]=t}else"QuarksGeometry"===i.type&&("string"!=typeof i.url||i.positions||console.warn(`[QuarksLoader] Geometry "${i.url}" is an external file; use load(), loadFromJSON(), or resolveResources() before parse().`),e.geometries[i.uuid]=this.share({positions:new Float32Array(i.positions??[]),indices:i.indices?new Uint32Array(i.indices):new Uint32Array(0),uvs:i.uvs?new Float32Array(i.uvs):void 0,normals:i.normals?new Float32Array(i.normals):void 0}))}share(t){if(!1===this.options.shareResources)return t;const e=Ks(Zs,this.scene),i=function(t){let e=2166136261,i=2654435769;const s=[t.positions,t.indices,t.uvs,t.normals];let r="";for(const t of s){if(void 0===t){r+="-,";continue}const s=new Uint8Array(t.buffer,t.byteOffset,t.byteLength);r+=s.length+",";for(let t=0;t<s.length;t++)e=Math.imul(e^s[t],16777619),i=Math.imul(i^s[t],1540483477)^i>>>15}return`${r}${(e>>>0).toString(16)}${(i>>>0).toString(16)}`}(t),s=e.get(i);return void 0!==s?s:(e.set(i,t),t)}static clearSharedResources(t){Xs.delete(t),Zs.delete(t),Hs.delete(t)}static joinUrl(t,e){return/^(data|blob):/i.test(e)||/^[a-z][a-z0-9+.-]*:\/\//i.test(e)||e.startsWith("/")?e:t+e}parseSphereGeometry(t){const e=t.radius??.5,i=Math.max(3,Math.floor(t.widthSegments??16)),s=Math.max(2,Math.floor(t.heightSegments??8)),r=t.phiStart??0,n=t.phiLength??2*Math.PI,o=t.thetaStart??0,a=t.thetaLength??Math.PI,h=[],l=[],c=[],u=[],d=[];let p=0;for(let t=0;t<=s;t++){const u=[],f=t/s,m=o+f*a;for(let t=0;t<=i;t++){const s=t/i,o=r+s*n,a=-e*Math.cos(o)*Math.sin(m),d=e*Math.cos(m),y=e*Math.sin(o)*Math.sin(m);h.push(a,d,y);const v=Math.hypot(a,d,y)||1;l.push(a/v,d/v,y/v),c.push(s,1-f),u.push(p++)}d.push(u)}const f=o<=0,m=o+a>=Math.PI;for(let t=0;t<s;t++)for(let e=0;e<i;e++){const i=d[t][e+1],r=d[t][e],n=d[t+1][e],o=d[t+1][e+1];0===t&&f||u.push(i,r,o),t===s-1&&m||u.push(r,n,o)}const y=h.length/3>65535?new Uint32Array(u):new Uint16Array(u);return{positions:new Float32Array(h),indices:y,uvs:new Float32Array(c),normals:new Float32Array(l)}}parseBufferGeometry(t){let e,i,s=new Float32Array(0),r=new Uint32Array(0);if(t.interleavedBuffers&&t.arrayBuffers){const r={};for(const[e,i]of Object.entries(t.interleavedBuffers)){const s=t.arrayBuffers[i.buffer];if(s){const t=new Float32Array(Array.isArray(s)?this.int32ArrayToFloat32(s):s);r[e]={data:t,stride:i.stride}}}if(t.attributes){if(t.attributes.position?.isInterleavedBufferAttribute){const e=t.attributes.position,i=r[e.data];i&&(s=this.extractInterleavedAttribute(i.data,i.stride,e.offset,e.itemSize))}if(t.attributes.uv?.isInterleavedBufferAttribute){const i=t.attributes.uv,s=r[i.data];s&&(e=this.extractInterleavedAttribute(s.data,s.stride,i.offset,i.itemSize))}if(t.attributes.normal?.isInterleavedBufferAttribute){const e=t.attributes.normal,s=r[e.data];s&&(i=this.extractInterleavedAttribute(s.data,s.stride,e.offset,e.itemSize))}}}else t.attributes&&(t.attributes.position?.array&&(s=new Float32Array(t.attributes.position.array)),t.attributes.uv?.array&&(e=new Float32Array(t.attributes.uv.array)),t.attributes.normal?.array&&(i=new Float32Array(t.attributes.normal.array)));return t.index&&(r="Uint16Array"===t.index.type?new Uint16Array(t.index.array):new Uint32Array(t.index.array)),r=$s(s,r),{positions:s,indices:r,uvs:e,normals:i}}extractInterleavedAttribute(t,e,i,s){const r=Math.floor(t.length/e),n=new Float32Array(r*s);for(let o=0;o<r;o++)for(let r=0;r<s;r++)n[o*s+r]=t[o*e+i+r];return n}int32ArrayToFloat32(t){const e=new ArrayBuffer(4*t.length),i=new Int32Array(e);for(let e=0;e<t.length;e++)i[e]=t[e];return new Float32Array(e)}async resolveResourceUrl(t,e,i){return tr.resolveWith(this.options.resolver,t,e,i)}async fetchEffectDocument(t){const e=this.options.baseUrl||t.substring(0,t.lastIndexOf("/")+1),i=await this.resolveResourceUrl(t,"effect",e);return{json:await tr.fetchJsonWith(this.options.resolver,i,void 0),baseUrl:e}}async loadDocuments(t,e){const i=t.length;if(0===i)return[];const s=new Array(i),r=new Array(i).fill(!1);let n=0;const o=(t,o)=>{r[t]||(r[t]=!0,s[t]=o,n++,e.onProgress?.(n,i))};await Promise.all(t.map(async(s,r)=>{if(s)try{await this.resolveResources(s.json,s.baseUrl)}catch(s){if(!e.continueOnError)throw s;console.warn(`[QuarksLoader] Failed to resolve resources for effect ${r+1}/${i}:`,s),t[r]=null,o(r,null)}}));for(let s=0;s<i;s++){if(r[s])continue;const n=t[s];if(n)try{o(s,this.parse(n.json,n.baseUrl))}catch(t){if(!e.continueOnError)throw t;console.warn(`[QuarksLoader] Failed to parse effect ${s+1}/${i}:`,t),o(s,null)}else o(s,null)}return s}static async mapPool(t,e,i){if(0===t.length)return[];const s=void 0!==e&&e>0?e:t.length,r=new Array(t.length);let n=0;const o=Math.min(s,t.length);return await Promise.all(Array.from({length:o},()=>(async()=>{for(;n<t.length;){const e=n++;r[e]=await i(t[e],e)}})())),r}static async resolveWith(t,e,i,s){return t?.resolve?t.resolve(e,i,s):tr.joinUrl(s,e)}static fetchJsonWith(t,e,i){const s=async()=>{if(t?.fetchJson)return t.fetchJson(e);const i=await fetch(e);if(!i.ok)throw new Error(`HTTP ${i.status}`);return i.json()};if(!i)return s();const r=Ks(Hs,i),n=`json|${e}`;let o=r.get(n);return void 0===o&&(o=s().catch(t=>{throw r.get(n)===o&&r.delete(n),t}),r.set(n,o)),o}static async inlineGeometryEntries(t,e){const i=Array.isArray(t?.geometries)?t.geometries:[];await Promise.all(i.filter(t=>"string"==typeof t?.url&&!t.positions).map(async t=>{try{const i=await e(t.url);for(const e of["positions","indices","uvs","normals"]){const s=i?.[e];void 0!==s&&(t[e]=Array.isArray(s)?s.slice():s)}delete t.url}catch(e){console.warn(`[QuarksLoader] Could not load geometry "${t.url}":`,e)}}))}parseImages(t,e,i){this._images={};for(const i of t)i.url&&tr.warnIfNotAnImageUrl(i.url),this._images[i.uuid]=i.url?tr.joinUrl(e,i.url):null}static warnIfNotAnImageUrl(t){/^(data|blob):/i.test(t)||/\.(png|jpe?g|webp|gif|bmp|ktx2?|dds|env|basis)(\?|#|$)/i.test(t)||console.warn(`[QuarksLoader] Image "${t}" does not look like an image; its texture will fail to load. This usually means the effect was exported without embedding that texture.`)}parseTextures(t,e){const i=this._images||{};for(const s of t){const t=i[s.image];if(t){const i=void 0===s.invertY||!!s.invertY,r=!!s.noMipmap,n=!1!==this.options.shareResources,o=n?[i,r,s.samplingMode,s.wrap,s.repeat,s.offset,s.rotation].join("|")+"|"+t:"",a=n?Ks(Xs,this.scene):void 0,h=a?.get(o);if(void 0!==h){e.textures[s.uuid]=h;continue}const l=new y.Texture(t,this.scene,{noMipmap:r,invertY:i,samplingMode:"number"==typeof s.samplingMode?s.samplingMode:void 0});Array.isArray(s.wrap)&&(l.wrapU=this.mapWrapMode(s.wrap[0]),l.wrapV=this.mapWrapMode(s.wrap[1]??s.wrap[0])),Array.isArray(s.repeat)&&(l.uScale=s.repeat[0]??1,l.vScale=s.repeat[1]??1),Array.isArray(s.offset)&&(l.uOffset=s.offset[0]??0,l.vOffset=s.offset[1]??0),"number"==typeof s.rotation&&(l.wAng=s.rotation),void 0!==a&&(a.set(o,l),l.onDisposeObservable.addOnce(()=>{a.get(o)===l&&a.delete(o)})),e.textures[s.uuid]=l}else e.textures[s.uuid]=null}}mapWrapMode(t){switch(t){case 1001:return y.Texture.CLAMP_ADDRESSMODE;case 1002:return y.Texture.MIRROR_ADDRESSMODE;default:return y.Texture.WRAP_ADDRESSMODE}}parseMaterials(t,e){for(const i of t){const t={uuid:i.uuid,transparent:i.transparent??!0,blending:i.blending??1,side:i.side??2,depthTest:i.depthTest??!0,depthWrite:i.depthWrite??!1,alphaTest:i.alphaTest??0,texture:null},s=i.map??i.texture;s&&(t.texture=e.textures[s]||null);const n=i.reflectionAtlas;if(n&&(t.reflectionAtlas=e.textures[n]||null),"number"==typeof i.reflectionLevel&&(t.reflectionLevel=i.reflectionLevel),"unlit"!==i.lighting&&"fixed"!==i.lighting&&"scene"!==i.lighting||(t.lighting=i.lighting),i.rim&&"object"==typeof i.rim&&(t.rim=i.rim),"number"==typeof i.alphaMode)t.alphaMode=i.alphaMode;else{const e={1:r.Constants.ALPHA_COMBINE,2:r.Constants.ALPHA_ADD,3:r.Constants.ALPHA_SUBTRACT,4:r.Constants.ALPHA_MULTIPLY};t.alphaMode=e[i.blending]||r.Constants.ALPHA_COMBINE}e.materials[i.uuid]=t}}getGeometry(t,e){if(e)return t.geometries[e]}getMaterial(t,e){if(!e)return;const i=Array.isArray(e)?e[0]:e;return t.materials[i]}createPlaceholderNode(t,e){const i=new s.TransformNode(e||t||"node",this.scene);return i.quarksOriginalType=t,i}createMeshNode(t,e){const i=new h.Mesh(t.name||t.type||"mesh",this.scene),s=this.getGeometry(e,t.geometry);if(s&&s.positions.length>0&&s.indices.length>0){const t=new l.VertexData;t.positions=s.positions,t.indices=s.indices,s.uvs&&s.uvs.length>0&&(t.uvs=s.uvs),s.normals&&s.normals.length>0&&(t.normals=s.normals),t.applyToMesh(i,!0)}const n=this.getMaterial(e,t.material);if(n){const t=new g.StandardMaterial(`quarks_loader_material_${n.uuid}`,this.scene);t.alphaMode=n.alphaMode??r.Constants.ALPHA_COMBINE,t.backFaceCulling=2!==n.side,t.alphaCutOff=n.alphaTest??0,t.disableDepthWrite=!n.depthWrite,n.texture&&(t.diffuseTexture=n.texture,t.opacityTexture=n.texture),i.material=t}return i}parseObject(t,e){let i;switch(t.type){case"QuarksPrefab":i=Ys.fromJSON(t,this.scene);break;case"ParticleEmitter":if(t.ps){i=this.parseParticleSystem(t.ps,e).emitter;break}i=this.createPlaceholderNode(t.type,t.name);break;case"Mesh":case"SkinnedMesh":case"InstancedMesh":case"BatchedMesh":i=this.createMeshNode(t,e);break;case"Scene":case"Group":case"Object3D":case"PerspectiveCamera":case"OrthographicCamera":case"AmbientLight":case"DirectionalLight":case"PointLight":case"RectAreaLight":case"SpotLight":case"HemisphereLight":case"LightProbe":case"LOD":case"Line":case"LineSegments":case"LineLoop":case"PointCloud":case"Points":case"Sprite":case"Bone":i=this.createPlaceholderNode(t.type,t.name);break;default:i=new s.TransformNode(t.name||t.type||"node",this.scene)}if(t.uuid&&(i._quarksUUID=t.uuid),t.name&&(i.name=t.name),t.matrix){const e=a.Matrix.FromArray(t.matrix),s=new a.Vector3(1,1,1),r=a.Quaternion.Identity(),n=new a.Vector3(0,0,0);e.decompose(s,r,n),i.position.copyFrom(n),i.scaling.copyFrom(s),i.rotationQuaternion=r}else t.position&&i.position.set(t.position[0],t.position[1],t.position[2]),t.scale&&i.scaling.set(t.scale[0],t.scale[1],t.scale[2]),t.quaternion?i.rotationQuaternion=new a.Quaternion(t.quaternion[0],t.quaternion[1],t.quaternion[2],t.quaternion[3]):t.rotation&&i.rotation.set(t.rotation[0],t.rotation[1],t.rotation[2]);if(void 0!==t.visible&&i.setEnabled(t.visible),t.children)for(const s of t.children){this.parseObject(s,e).parent=i}return i}parseParticleSystem(t,e){const i=js.fromJSON(t,e,{},this.scene);return i._meshSurfaceReferenceUUID="mesh_surface"===t?.shape?.type?t?.shape?.mesh:void 0,i}linkReferences(t){const e={},i=t=>{t._quarksUUID&&(e[t._quarksUUID]=t);for(const e of t.getChildren())e instanceof s.TransformNode&&i(e)};i(t);const r=i=>{if(i instanceof Ys&&i.resolveReferences(t),i instanceof zs){const t=i.system,s=t._meshSurfaceReferenceUUID;if(s&&"mesh_surface"===t.emitterShape.type){const i=e[s];i instanceof h.Mesh&&(t.emitterShape.mesh=i)}for(let s=0;s<t.behaviors.length;s++)if(t.behaviors[s]instanceof ve){const r=t.behaviors[s],n=r.subParticleSystem;if("string"!=typeof n)continue;const o=e[n];o instanceof zs?(r.subParticleSystem=o,o.system.onlyUsedByOther=!0):(r.subParticleSystem=void 0,""!==n&&console.warn(`[QuarksLoader] Emitter "${i.name}" has a sub emitter targeting "${n}", `+(o?"which is not a particle emitter":"which is not in the effect")+"; that sub emitter is skipped."))}}for(const t of i.getChildren())t instanceof s.TransformNode&&r(t)};r(t)}}Di(),Ii(Ni),exports.ApplyCollision=Ot,exports.ApplyForce=ie,exports.ApplySequences=ne,exports.AxisAngleGenerator=Et,exports.BatchedParticleRenderer=bs,exports.BatchedRenderer=ws,exports.BehaviorFromJSON=ri,exports.BehaviorTypes=si,exports.Bezier=Bt,exports.BoxEmitter=Si,exports.ChangeEmitDirection=oe,exports.CircleEmitter=zi,exports.ColorBySpeed=ae,exports.ColorGeneratorFromJSON=Yt,exports.ColorOverLife=he,exports.ColorRange=Ut,exports.ConeEmitter=Mi,exports.ConstantColor=jt,exports.ConstantValue=Ct,exports.DEG2RAD=P,exports.DonutEmitter=_i,exports.EdgeEmitter=Pi,exports.EffectPool=class{constructor(t,e){this.template=t,this.options=e,this.idle=[],this.playing=new Set,this.systemsOf=new Map,this.disposed=!1,this.onSystemFinished=t=>{const e=t.particleSystem;for(const t of this.playing){const i=this.systemsOf.get(t);if(void 0!==i&&i.includes(e))return void(Ms.isEffectFinished(t)&&this.release(t))}};for(let t=0;t<(e.prewarm??0);t++){const t=this.makeCopy();if(null===t)break;this.idle.push(t)}}get activeCount(){return this.playing.size}get idleCount(){return this.idle.length}acquire(t,e=null){if(this.disposed)return null;const i=this.idle.pop()??this.makeCopy();return null===i?null:(i.parent=e,void 0!==t&&i.position.copyFrom(t),i.setEnabled(!0),this.playing.add(i),Ms.restart(i),Ms.play(i),i)}stop(t){this.playing.has(t)&&Ms.endEmit(t)}release(t){this.playing.delete(t)&&(Ms.stop(t),t.setEnabled(!1),t.parent=null,this.disposed||this.idle.push(t))}dispose(){this.disposed=!0;for(const t of[...this.playing,...this.idle])this.playing.delete(t),this.disposeCopy(t);this.idle.length=0}makeCopy(){if(this.idle.length+this.playing.size>=(this.options.maxSize??1/0))return null;const t=Ms.instantiate(this.template),e=[];return Ms.runOnAllParticleEmitters(t,t=>{const i=t.system;i.autoDestroy=!1,i.addEventListener("finished",this.onSystemFinished),e.push(i)}),this.systemsOf.set(t,e),Ms.addToBatchRenderer(t,this.options.renderer),t.setEnabled(!1),t.parent=null,t}disposeCopy(t){const e=this.systemsOf.get(t)??[];for(const t of e)t.removeEventListener("finished",this.onSystemFinished),this.options.renderer.deleteSystem(t),t.dispose();this.systemsOf.delete(t),t.dispose()}},exports.EmitSubParticleSystem=ve,exports.EmitterFromJSON=Ai,exports.EmitterShapes=Bi,exports.Euler=pt,exports.EulerGenerator=Xt,exports.ForceOverLife=ge,exports.FrameOverLife=xe,exports.GeneratorFromJSON=ee,exports.Gradient=Jt,exports.GravityForce=Se,exports.GridEmitter=Ti,exports.HemisphereEmitter=Vi,exports.InheritVelocity=we,exports.IntervalValue=Ft,exports.LimitSpeedOverLife=be,exports.MathUtils=X,exports.Matrix3=ft,exports.Matrix4=st,exports.MeshSurfaceEmitter=Ei,exports.MeshSurfaceEmitterPlugin=Ni,exports.NodeParticle=class{constructor(){this.position=new H,this.velocity=new H,this.age=0,this.life=1,this.size=new H,this.rotation=0,this.color=new zt(1,1,1,1),this.uvTile=0,this.memory=[]}get died(){return this.age>=this.life}reset(){this.memory.length=0,this.position.set(0,0,0),this.velocity.set(0,0,0),this.age=0,this.life=1,this.size.set(1,1,1),this.rotation=0,this.color.set(1,1,1,1),this.uvTile=0}},exports.Noise=Le,exports.OrbitOverLife=Re,exports.ParticleEmitter=zs,exports.ParticleMeshPhysicsMaterial=As,exports.ParticleMeshStandardMaterial=Bs,exports.ParticleStore=ze,exports.ParticleSystem=js,exports.PiecewiseBezier=$t,exports.PiecewiseFunction=At,exports.Plugins=$i,exports.PointEmitter=Oi,exports.QuarksLoader=tr,exports.QuarksPrefab=Ys,exports.QuarksUtil=Ms,exports.Quaternion=Z,exports.QuaternionView=vt,exports.RAD2DEG=T,exports.RandomColor=Qt,exports.RandomColorBetweenGradient=Wt,exports.RandomQuatGenerator=Zt,exports.RecordState=class{constructor(t,e,i){this.position=t,this.size=e,this.color=i}},exports.RectangleEmitter=Fi,exports.Rotation3DOverLife=De,exports.RotationBySpeed=Ue,exports.RotationGeneratorFromJSON=Ht,exports.RotationOverLife=qe,exports.SequencerFromJSON=re,exports.ShapeTransform=bi,exports.SizeBySpeed=ke,exports.SizeOverLife=Je,exports.SpeedOverLife=Qe,exports.SphereEmitter=Ci,exports.SpriteBatch=vs,exports.SpriteParticle=Ke,exports.SubEmitterInheritMask=me,exports.TextureSequencer=se,exports.TrailBatch=Ss,exports.TrailParticle=ei,exports.TurbulenceField=Ge,exports.VFXBatch=ys,exports.ValueGeneratorFromJSON=It,exports.Vector2=xt,exports.Vector3=H,exports.Vector3Function=Kt,exports.Vector3GeneratorFromJSON=te,exports.Vector3View=wt,exports.Vector4=zt,exports.Vector4View=_t,exports.VelocityOverLife=Xe,exports.WebGLCoordinateSystem=et,exports.WebGPUCoordinateSystem=it,exports.WidthOverLength=ii,exports.cacheEnvAtlas=function(t,e){_s.set(t,e)},exports.ceilPowerOfTwo=Q,exports.clamp=O,exports.createEnvAtlasFromFaceUrls=Os,exports.createSeededRandom=z,exports.cubeFaceUrls=Ts,exports.damp=$,exports.defaultMeshLighting=ps,exports.degToRad=q,exports.denormalize=j,exports.ensureEnvAtlasFromCube=Fs,exports.euclideanModulo=C,exports.floorPowerOfTwo=G,exports.generateUUID=V,exports.getCachedEnvAtlas=Vs,exports.getPhysicsResolver=Vt,exports.getRandomSource=w,exports.getRegisteredShaderChunks=function(){return Li},exports.getShaderChunk=function(t){return Li[t]},exports.getValueFromEmitterMode=wi,exports.inverseLerp=B,exports.isPowerOfTwo=J,exports.lerp=A,exports.loadPlugin=Ii,exports.localParticlePhysicsVertShader=Yi,exports.localParticleVertShader="\n// Per-vertex attributes\nattribute vec3 position;\nattribute vec2 uv;\n\n// Per-instance attributes\nattribute vec3 offset;\nattribute vec4 color;\nattribute vec3 size;\nattribute vec4 rotation;\nattribute float uvTile;\n\n// Uniforms\nuniform mat4 worldViewProjection;\n\n#ifdef UV_TILE\nuniform float tileCountX;\nuniform float tileCountY;\n#endif\n\n// Varyings\nvarying vec2 vUV;\nvarying vec4 vColor;\n\nvec3 applyQuaternion(vec3 v, vec4 q) {\n vec3 qVec = q.xyz;\n float qW = q.w;\n vec3 t = 2.0 * cross(qVec, v);\n return v + qW * t + cross(qVec, t);\n}\n\nvoid main() {\n vec3 rotatedPosition = applyQuaternion(position * size, rotation);\n vec3 worldPos = rotatedPosition + offset;\n\n gl_Position = worldViewProjection * vec4(worldPos, 1.0);\n\n #ifdef UV_TILE\n vec2 tc = vec2(tileCountX, tileCountY);\n float baseTile = floor(uvTile);\n float tileU = mod(baseTile, tc.x) / tc.x;\n float tileV = 1.0 - floor(baseTile / tc.x) / tc.y - 1.0 / tc.y;\n vUV = uv / tc + vec2(tileU, tileV);\n #else\n vUV = uv;\n #endif\n\n vColor = color;\n}\n",exports.mapLinear=F,exports.meshRimEqual=ms,exports.normalize=Y,exports.normalizeMeshRim=fs,exports.particleFragShader=Xi,exports.particlePhysicsFragShader=Zi,exports.particleVertShader=Hi,exports.pingpong=I,exports.planBehaviorFusion=vi,exports.radToDeg=k,exports.randFloat=R,exports.randFloatSpread=D,exports.randInt=L,exports.random=S,exports.registerShaderChunks=Di,exports.seededRandom=U,exports.setPhysicsResolver=function(t){Tt=t},exports.setQuaternionFromProperEuler=W,exports.setRandomSource=b,exports.smootherstep=N,exports.smoothstep=E,exports.stretchedBillboardVertShader=Ki,exports.subEmitterInheritMask=ye,exports.trailFragShader=ts,exports.trailVertShader=es,exports.unloadPlugin=function(t){const e=$i.find(e=>e.id===t);if(e){for(const t of e.emitterShapes)Bi[t.type]&&delete Bi[t.type];for(const t of e.behaviors)si[t.type]&&delete si[t.type]}},exports.withRandomSource=function(t,e){const i=b(t);try{return e()}finally{b(i)}};
1
+ "use strict";var t=require("@babylonjs/core/Buffers/buffer"),e=require("@babylonjs/core/Maths/math.frustum"),i=require("@babylonjs/core/Maths/math.plane"),s=require("@babylonjs/core/Meshes/transformNode"),r=require("@babylonjs/core/Engines/constants"),n=require("@babylonjs/core/Materials/shaderMaterial"),o=require("@babylonjs/core/Materials/Textures/rawTexture"),a=require("@babylonjs/core/Maths/math.vector"),l=require("@babylonjs/core/Meshes/mesh"),h=require("@babylonjs/core/Meshes/mesh.vertexData"),c=require("@babylonjs/core/Engines/shaderStore"),u=require("@babylonjs/core/Materials/effect"),d=require("@babylonjs/core/Materials/shaderLanguage"),f=require("@babylonjs/core/Culling/boundingInfo"),p=require("@babylonjs/core/Maths/math.color"),m=require("@babylonjs/core/scene"),y=require("@babylonjs/core/Materials/Textures/texture"),g=require("@babylonjs/core/Materials/PBR/pbrMaterial"),v=require("@babylonjs/core/Materials/standardMaterial");let x=null;function S(){return null===x?Math.random():x()}function b(){return x??Math.random}function w(t){const e=b();return x=t,e}function M(t){let e=t>>>0||2654435769;return()=>{e=e+1831565813|0;let t=e;return t=Math.imul(t^t>>>15,1|t),t^=t+Math.imul(t^t>>>7,61|t),((t^t>>>14)>>>0)/4294967296}}const z=["00","01","02","03","04","05","06","07","08","09","0a","0b","0c","0d","0e","0f","10","11","12","13","14","15","16","17","18","19","1a","1b","1c","1d","1e","1f","20","21","22","23","24","25","26","27","28","29","2a","2b","2c","2d","2e","2f","30","31","32","33","34","35","36","37","38","39","3a","3b","3c","3d","3e","3f","40","41","42","43","44","45","46","47","48","49","4a","4b","4c","4d","4e","4f","50","51","52","53","54","55","56","57","58","59","5a","5b","5c","5d","5e","5f","60","61","62","63","64","65","66","67","68","69","6a","6b","6c","6d","6e","6f","70","71","72","73","74","75","76","77","78","79","7a","7b","7c","7d","7e","7f","80","81","82","83","84","85","86","87","88","89","8a","8b","8c","8d","8e","8f","90","91","92","93","94","95","96","97","98","99","9a","9b","9c","9d","9e","9f","a0","a1","a2","a3","a4","a5","a6","a7","a8","a9","aa","ab","ac","ad","ae","af","b0","b1","b2","b3","b4","b5","b6","b7","b8","b9","ba","bb","bc","bd","be","bf","c0","c1","c2","c3","c4","c5","c6","c7","c8","c9","ca","cb","cc","cd","ce","cf","d0","d1","d2","d3","d4","d5","d6","d7","d8","d9","da","db","dc","dd","de","df","e0","e1","e2","e3","e4","e5","e6","e7","e8","e9","ea","eb","ec","ed","ee","ef","f0","f1","f2","f3","f4","f5","f6","f7","f8","f9","fa","fb","fc","fd","fe","ff"];let _=1234567;const P=Math.PI/180,T=180/Math.PI;function V(){const t=4294967295*Math.random()|0,e=4294967295*Math.random()|0,i=4294967295*Math.random()|0,s=4294967295*Math.random()|0;return(z[255&t]+z[t>>8&255]+z[t>>16&255]+z[t>>24&255]+"-"+z[255&e]+z[e>>8&255]+"-"+z[e>>16&15|64]+z[e>>24&255]+"-"+z[63&i|128]+z[i>>8&255]+"-"+z[i>>16&255]+z[i>>24&255]+z[255&s]+z[s>>8&255]+z[s>>16&255]+z[s>>24&255]).toLowerCase()}function O(t,e,i){return Math.max(e,Math.min(i,t))}function C(t,e){return(t%e+e)%e}function F(t,e,i,s,r){return s+(t-e)*(r-s)/(i-e)}function A(t,e,i){return t!==e?(i-t)/(e-t):0}function B(t,e,i){return(1-i)*t+i*e}function $(t,e,i,s){return B(t,e,1-Math.exp(-i*s))}function I(t,e=1){return e-Math.abs(C(t,2*e)-e)}function E(t,e,i){return t<=e?0:t>=i?1:(t=(t-e)/(i-e))*t*(3-2*t)}function N(t,e,i){return t<=e?0:t>=i?1:(t=(t-e)/(i-e))*t*t*(t*(6*t-15)+10)}function R(t,e){return t+Math.floor(S()*(e-t+1))}function L(t,e){return t+S()*(e-t)}function D(t){return t*(.5-S())}function U(t){void 0!==t&&(_=t);let e=_+=1831565813;return e=Math.imul(e^e>>>15,1|e),e^=e+Math.imul(e^e>>>7,61|e),((e^e>>>14)>>>0)/4294967296}function q(t){return t*P}function k(t){return t*T}function J(t){return!(t&t-1)&&0!==t}function Q(t){return Math.pow(2,Math.ceil(Math.log(t)/Math.LN2))}function G(t){return Math.pow(2,Math.floor(Math.log(t)/Math.LN2))}function W(t,e,i,s,r){const n=Math.cos,o=Math.sin,a=n(i/2),l=o(i/2),h=n((e+s)/2),c=o((e+s)/2),u=n((e-s)/2),d=o((e-s)/2),f=n((s-e)/2),p=o((s-e)/2);switch(r){case"XYX":t.set(a*c,l*u,l*d,a*h);break;case"YZY":t.set(l*d,a*c,l*u,a*h);break;case"ZXZ":t.set(l*u,l*d,a*c,a*h);break;case"XZX":t.set(a*c,l*p,l*f,a*h);break;case"YXY":t.set(l*f,a*c,l*p,a*h);break;case"ZYZ":t.set(l*p,l*f,a*c,a*h);break;default:console.warn("../math.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: "+r)}}function j(t,e){switch(e.constructor){case Float32Array:return t;case Uint32Array:return t/4294967295;case Uint16Array:return t/65535;case Uint8Array:return t/255;case Int32Array:return Math.max(t/2147483647,-1);case Int16Array:return Math.max(t/32767,-1);case Int8Array:return Math.max(t/127,-1);default:throw new Error("Invalid component type.")}}function Y(t,e){switch(e.constructor){case Float32Array:return t;case Uint32Array:return Math.round(4294967295*t);case Uint16Array:return Math.round(65535*t);case Uint8Array:return Math.round(255*t);case Int32Array:return Math.round(2147483647*t);case Int16Array:return Math.round(32767*t);case Int8Array:return Math.round(127*t);default:throw new Error("Invalid component type.")}}const X={DEG2RAD:P,RAD2DEG:T,generateUUID:V,clamp:O,euclideanModulo:C,mapLinear:F,inverseLerp:A,lerp:B,damp:$,pingpong:I,smoothstep:E,smootherstep:N,randInt:R,randFloat:L,randFloatSpread:D,seededRandom:U,degToRad:q,radToDeg:k,isPowerOfTwo:J,ceilPowerOfTwo:Q,floorPowerOfTwo:G,setQuaternionFromProperEuler:W,normalize:Y,denormalize:j};class Z{constructor(t=0,e=0,i=0,s=1){this._x=t,this._y=e,this._z=i,this._w=s}static slerpFlat(t,e,i,s,r,n,o){let a=i[s+0],l=i[s+1],h=i[s+2],c=i[s+3];const u=r[n+0],d=r[n+1],f=r[n+2],p=r[n+3];if(0===o)return t[e+0]=a,t[e+1]=l,t[e+2]=h,void(t[e+3]=c);if(1===o)return t[e+0]=u,t[e+1]=d,t[e+2]=f,void(t[e+3]=p);if(c!==p||a!==u||l!==d||h!==f){let t=1-o;const e=a*u+l*d+h*f+c*p,i=e>=0?1:-1,s=1-e*e;if(s>Number.EPSILON){const r=Math.sqrt(s),n=Math.atan2(r,e*i);t=Math.sin(t*n)/r,o=Math.sin(o*n)/r}const r=o*i;if(a=a*t+u*r,l=l*t+d*r,h=h*t+f*r,c=c*t+p*r,t===1-o){const t=1/Math.sqrt(a*a+l*l+h*h+c*c);a*=t,l*=t,h*=t,c*=t}}t[e]=a,t[e+1]=l,t[e+2]=h,t[e+3]=c}static multiplyQuaternionsFlat(t,e,i,s,r,n){const o=i[s],a=i[s+1],l=i[s+2],h=i[s+3],c=r[n],u=r[n+1],d=r[n+2],f=r[n+3];return t[e]=o*f+h*c+a*d-l*u,t[e+1]=a*f+h*u+l*c-o*d,t[e+2]=l*f+h*d+o*u-a*c,t[e+3]=h*f-o*c-a*u-l*d,t}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get w(){return this._w}set w(t){this._w=t,this._onChangeCallback()}set(t,e,i,s){return this._x=t,this._y=e,this._z=i,this._w=s,this._onChangeCallback(),this}clone(){return new Z(this._x,this._y,this._z,this._w)}copy(t){return this._x=t.x,this._y=t.y,this._z=t.z,this._w=t.w,this._onChangeCallback(),this}setFromEuler(t,e=!0){const i=t._x,s=t._y,r=t._z,n=t._order,o=Math.cos,a=Math.sin,l=o(i/2),h=o(s/2),c=o(r/2),u=a(i/2),d=a(s/2),f=a(r/2);switch(n){case"XYZ":this._x=u*h*c+l*d*f,this._y=l*d*c-u*h*f,this._z=l*h*f+u*d*c,this._w=l*h*c-u*d*f;break;case"YXZ":this._x=u*h*c+l*d*f,this._y=l*d*c-u*h*f,this._z=l*h*f-u*d*c,this._w=l*h*c+u*d*f;break;case"ZXY":this._x=u*h*c-l*d*f,this._y=l*d*c+u*h*f,this._z=l*h*f+u*d*c,this._w=l*h*c-u*d*f;break;case"ZYX":this._x=u*h*c-l*d*f,this._y=l*d*c+u*h*f,this._z=l*h*f-u*d*c,this._w=l*h*c+u*d*f;break;case"YZX":this._x=u*h*c+l*d*f,this._y=l*d*c+u*h*f,this._z=l*h*f-u*d*c,this._w=l*h*c-u*d*f;break;case"XZY":this._x=u*h*c-l*d*f,this._y=l*d*c-u*h*f,this._z=l*h*f+u*d*c,this._w=l*h*c+u*d*f;break;default:console.warn("../math.Quaternion: .setFromEuler() encountered an unknown order: "+n)}return!0===e&&this._onChangeCallback(),this}setFromAxisAngle(t,e){const i=e/2,s=Math.sin(i);return this._x=t.x*s,this._y=t.y*s,this._z=t.z*s,this._w=Math.cos(i),this._onChangeCallback(),this}setFromRotationMatrix(t){const e=t.elements,i=e[0],s=e[4],r=e[8],n=e[1],o=e[5],a=e[9],l=e[2],h=e[6],c=e[10],u=i+o+c;if(u>0){const t=.5/Math.sqrt(u+1);this._w=.25/t,this._x=(h-a)*t,this._y=(r-l)*t,this._z=(n-s)*t}else if(i>o&&i>c){const t=2*Math.sqrt(1+i-o-c);this._w=(h-a)/t,this._x=.25*t,this._y=(s+n)/t,this._z=(r+l)/t}else if(o>c){const t=2*Math.sqrt(1+o-i-c);this._w=(r-l)/t,this._x=(s+n)/t,this._y=.25*t,this._z=(a+h)/t}else{const t=2*Math.sqrt(1+c-i-o);this._w=(n-s)/t,this._x=(r+l)/t,this._y=(a+h)/t,this._z=.25*t}return this._onChangeCallback(),this}setFromUnitVectors(t,e){let i=t.dot(e)+1;return i<Number.EPSILON?(i=0,Math.abs(t.x)>Math.abs(t.z)?(this._x=-t.y,this._y=t.x,this._z=0,this._w=i):(this._x=0,this._y=-t.z,this._z=t.y,this._w=i)):(this._x=t.y*e.z-t.z*e.y,this._y=t.z*e.x-t.x*e.z,this._z=t.x*e.y-t.y*e.x,this._w=i),this.normalize()}angleTo(t){return 2*Math.acos(Math.abs(O(this.dot(t),-1,1)))}rotateTowards(t,e){const i=this.angleTo(t);if(0===i)return this;const s=Math.min(1,e/i);return this.slerp(t,s),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(t){return this._x*t._x+this._y*t._y+this._z*t._z+this._w*t._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let t=this.length();return 0===t?(this._x=0,this._y=0,this._z=0,this._w=1):(t=1/t,this._x=this._x*t,this._y=this._y*t,this._z=this._z*t,this._w=this._w*t),this._onChangeCallback(),this}multiply(t){return this.multiplyQuaternions(this,t)}premultiply(t){return this.multiplyQuaternions(t,this)}multiplyQuaternions(t,e){const i=t._x,s=t._y,r=t._z,n=t._w,o=e._x,a=e._y,l=e._z,h=e._w;return this._x=i*h+n*o+s*l-r*a,this._y=s*h+n*a+r*o-i*l,this._z=r*h+n*l+i*a-s*o,this._w=n*h-i*o-s*a-r*l,this._onChangeCallback(),this}slerp(t,e){if(0===e)return this;if(1===e)return this.copy(t);const i=this._x,s=this._y,r=this._z,n=this._w;let o=n*t._w+i*t._x+s*t._y+r*t._z;if(o<0?(this._w=-t._w,this._x=-t._x,this._y=-t._y,this._z=-t._z,o=-o):this.copy(t),o>=1)return this._w=n,this._x=i,this._y=s,this._z=r,this;const a=1-o*o;if(a<=Number.EPSILON){const t=1-e;return this._w=t*n+e*this._w,this._x=t*i+e*this._x,this._y=t*s+e*this._y,this._z=t*r+e*this._z,this.normalize(),this}const l=Math.sqrt(a),h=Math.atan2(l,o),c=Math.sin((1-e)*h)/l,u=Math.sin(e*h)/l;return this._w=n*c+this._w*u,this._x=i*c+this._x*u,this._y=s*c+this._y*u,this._z=r*c+this._z*u,this._onChangeCallback(),this}slerpQuaternions(t,e,i){return this.copy(t).slerp(e,i)}random(){const t=2*Math.PI*S(),e=2*Math.PI*S(),i=S(),s=Math.sqrt(1-i),r=Math.sqrt(i);return this.set(s*Math.sin(t),s*Math.cos(t),r*Math.sin(e),r*Math.cos(e))}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._w===this._w}fromArray(t,e=0){return this._x=t[e],this._y=t[e+1],this._z=t[e+2],this._w=t[e+3],this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._w,t}toJSON(){return this.toArray()}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._w}}Z.prototype.isQuaternion=!0;class H{constructor(t=0,e=0,i=0){this.x=t,this.y=e,this.z=i}set(t,e,i){return void 0===i&&(i=this.z),this.x=t,this.y=e,this.z=i,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+t)}}clone(){return new H(this.x,this.y,this.z)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this}multiplyVectors(t,e){return this.x=t.x*e.x,this.y=t.y*e.y,this.z=t.z*e.z,this}applyEuler(t){return this.applyQuaternion(tt.setFromEuler(t))}applyAxisAngle(t,e){return this.applyQuaternion(tt.setFromAxisAngle(t,e))}applyMatrix3(t){const e=this.x,i=this.y,s=this.z,r=t.elements;return this.x=r[0]*e+r[3]*i+r[6]*s,this.y=r[1]*e+r[4]*i+r[7]*s,this.z=r[2]*e+r[5]*i+r[8]*s,this}applyNormalMatrix(t){return this.applyMatrix3(t).normalize()}applyMatrix4(t){const e=this.x,i=this.y,s=this.z,r=t.elements,n=1/(r[3]*e+r[7]*i+r[11]*s+r[15]);return this.x=(r[0]*e+r[4]*i+r[8]*s+r[12])*n,this.y=(r[1]*e+r[5]*i+r[9]*s+r[13])*n,this.z=(r[2]*e+r[6]*i+r[10]*s+r[14])*n,this}applyQuaternion(t){const e=this.x,i=this.y,s=this.z,r=t.x,n=t.y,o=t.z,a=t.w,l=2*(n*s-o*i),h=2*(o*e-r*s),c=2*(r*i-n*e);return this.x=e+a*l+n*c-o*h,this.y=i+a*h+o*l-r*c,this.z=s+a*c+r*h-n*l,this}transformDirection(t){const e=this.x,i=this.y,s=this.z,r=t.elements;return this.x=r[0]*e+r[4]*i+r[8]*s,this.y=r[1]*e+r[5]*i+r[9]*s,this.z=r[2]*e+r[6]*i+r[10]*s,this.normalize()}divide(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this}divideScalar(t){return this.multiplyScalar(1/t)}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this.z=Math.min(this.z,t.z),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this.z=Math.max(this.z,t.z),this}clamp(t,e){return this.x=Math.max(t.x,Math.min(e.x,this.x)),this.y=Math.max(t.y,Math.min(e.y,this.y)),this.z=Math.max(t.z,Math.min(e.z,this.z)),this}clampScalar(t,e){return this.x=Math.max(t,Math.min(e,this.x)),this.y=Math.max(t,Math.min(e,this.y)),this.z=Math.max(t,Math.min(e,this.z)),this}clampLength(t,e){const i=this.length();return this.divideScalar(i||1).multiplyScalar(Math.max(t,Math.min(e,i)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this.z+=(t.z-this.z)*e,this}lerpVectors(t,e,i){return this.x=t.x+(e.x-t.x)*i,this.y=t.y+(e.y-t.y)*i,this.z=t.z+(e.z-t.z)*i,this}cross(t){return this.crossVectors(this,t)}crossVectors(t,e){const i=t.x,s=t.y,r=t.z,n=e.x,o=e.y,a=e.z;return this.x=s*a-r*o,this.y=r*n-i*a,this.z=i*o-s*n,this}projectOnVector(t){const e=t.lengthSq();if(0===e)return this.set(0,0,0);const i=t.dot(this)/e;return this.copy(t).multiplyScalar(i)}projectOnPlane(t){return K.copy(this).projectOnVector(t),this.sub(K)}reflect(t){return this.sub(K.copy(t).multiplyScalar(2*this.dot(t)))}angleTo(t){const e=Math.sqrt(this.lengthSq()*t.lengthSq());if(0===e)return Math.PI/2;const i=this.dot(t)/e;return Math.acos(O(i,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,i=this.y-t.y,s=this.z-t.z;return e*e+i*i+s*s}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)+Math.abs(this.z-t.z)}setFromSphericalCoords(t,e,i){const s=Math.sin(e)*t;return this.x=s*Math.sin(i),this.y=Math.cos(e)*t,this.z=s*Math.cos(i),this}setFromCylindricalCoords(t,e,i){return this.x=t*Math.sin(e),this.y=i,this.z=t*Math.cos(e),this}setFromMatrixPosition(t){const e=t.elements;return this.x=e[12],this.y=e[13],this.z=e[14],this}setFromMatrixScale(t){const e=this.setFromMatrixColumn(t,0).length(),i=this.setFromMatrixColumn(t,1).length(),s=this.setFromMatrixColumn(t,2).length();return this.x=e,this.y=i,this.z=s,this}setFromMatrixColumn(t,e){return this.fromArray(t.elements,4*e)}setFromMatrix3Column(t,e){return this.fromArray(t.elements,3*e)}setFromEuler(t){return this.x=t._x,this.y=t._y,this.z=t._z,this}equals(t){return t.x===this.x&&t.y===this.y&&t.z===this.z}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this.z=t[e+2],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t[e+2]=this.z,t}random(){return this.x=S(),this.y=S(),this.z=S(),this}randomDirection(){const t=S()*Math.PI*2,e=2*S()-1,i=Math.sqrt(1-e*e);return this.x=i*Math.cos(t),this.y=e,this.z=i*Math.sin(t),this}abs(){return this.x=Math.abs(this.x),this.y=Math.abs(this.y),this.z=Math.abs(this.z),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}}H.prototype.isVector3=!0;const K=new H,tt=new Z,et=2e3,it=2001;class st{constructor(t,e,i,s,r,n,o,a,l,h,c,u,d,f,p,m){this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],void 0!==t&&this.set(t,e,i,s,r,n,o,a,l,h,c,u,d,f,p,m)}extractPosition(t){return console.warn("THREE.Matrix4: .extractPosition() has been renamed to .copyPosition()."),this.copyPosition(t)}multiplyToArray(t,e,i){return console.error("THREE.Matrix4: .multiplyToArray() has been removed."),this}setRotationFromQuaternion(t){return this.makeRotationFromQuaternion(t)}set(t,e,i,s,r,n,o,a,l,h,c,u,d,f,p,m){const y=this.elements;return y[0]=t,y[4]=e,y[8]=i,y[12]=s,y[1]=r,y[5]=n,y[9]=o,y[13]=a,y[2]=l,y[6]=h,y[10]=c,y[14]=u,y[3]=d,y[7]=f,y[11]=p,y[15]=m,this}identity(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this}clone(){return(new st).fromArray(this.elements)}copy(t){const e=this.elements,i=t.elements;return e[0]=i[0],e[1]=i[1],e[2]=i[2],e[3]=i[3],e[4]=i[4],e[5]=i[5],e[6]=i[6],e[7]=i[7],e[8]=i[8],e[9]=i[9],e[10]=i[10],e[11]=i[11],e[12]=i[12],e[13]=i[13],e[14]=i[14],e[15]=i[15],this}copyPosition(t){const e=this.elements,i=t.elements;return e[12]=i[12],e[13]=i[13],e[14]=i[14],this}setFromMatrix3(t){const e=t.elements;return this.set(e[0],e[3],e[6],0,e[1],e[4],e[7],0,e[2],e[5],e[8],0,0,0,0,1),this}extractBasis(t,e,i){return t.setFromMatrixColumn(this,0),e.setFromMatrixColumn(this,1),i.setFromMatrixColumn(this,2),this}makeBasis(t,e,i){return this.set(t.x,e.x,i.x,0,t.y,e.y,i.y,0,t.z,e.z,i.z,0,0,0,0,1),this}extractRotation(t){const e=this.elements,i=t.elements,s=1/rt.setFromMatrixColumn(t,0).length(),r=1/rt.setFromMatrixColumn(t,1).length(),n=1/rt.setFromMatrixColumn(t,2).length();return e[0]=i[0]*s,e[1]=i[1]*s,e[2]=i[2]*s,e[3]=0,e[4]=i[4]*r,e[5]=i[5]*r,e[6]=i[6]*r,e[7]=0,e[8]=i[8]*n,e[9]=i[9]*n,e[10]=i[10]*n,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromEuler(t){const e=this.elements,i=t.x,s=t.y,r=t.z,n=Math.cos(i),o=Math.sin(i),a=Math.cos(s),l=Math.sin(s),h=Math.cos(r),c=Math.sin(r);if("XYZ"===t.order){const t=n*h,i=n*c,s=o*h,r=o*c;e[0]=a*h,e[4]=-a*c,e[8]=l,e[1]=i+s*l,e[5]=t-r*l,e[9]=-o*a,e[2]=r-t*l,e[6]=s+i*l,e[10]=n*a}else if("YXZ"===t.order){const t=a*h,i=a*c,s=l*h,r=l*c;e[0]=t+r*o,e[4]=s*o-i,e[8]=n*l,e[1]=n*c,e[5]=n*h,e[9]=-o,e[2]=i*o-s,e[6]=r+t*o,e[10]=n*a}else if("ZXY"===t.order){const t=a*h,i=a*c,s=l*h,r=l*c;e[0]=t-r*o,e[4]=-n*c,e[8]=s+i*o,e[1]=i+s*o,e[5]=n*h,e[9]=r-t*o,e[2]=-n*l,e[6]=o,e[10]=n*a}else if("ZYX"===t.order){const t=n*h,i=n*c,s=o*h,r=o*c;e[0]=a*h,e[4]=s*l-i,e[8]=t*l+r,e[1]=a*c,e[5]=r*l+t,e[9]=i*l-s,e[2]=-l,e[6]=o*a,e[10]=n*a}else if("YZX"===t.order){const t=n*a,i=n*l,s=o*a,r=o*l;e[0]=a*h,e[4]=r-t*c,e[8]=s*c+i,e[1]=c,e[5]=n*h,e[9]=-o*h,e[2]=-l*h,e[6]=i*c+s,e[10]=t-r*c}else if("XZY"===t.order){const t=n*a,i=n*l,s=o*a,r=o*l;e[0]=a*h,e[4]=-c,e[8]=l*h,e[1]=t*c+r,e[5]=n*h,e[9]=i*c-s,e[2]=s*c-i,e[6]=o*h,e[10]=r*c+t}return e[3]=0,e[7]=0,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromQuaternion(t){return this.compose(ot,t,at)}lookAt(t,e,i){const s=this.elements;return ct.subVectors(t,e),0===ct.lengthSq()&&(ct.z=1),ct.normalize(),lt.crossVectors(i,ct),0===lt.lengthSq()&&(1===Math.abs(i.z)?ct.x+=1e-4:ct.z+=1e-4,ct.normalize(),lt.crossVectors(i,ct)),lt.normalize(),ht.crossVectors(ct,lt),s[0]=lt.x,s[4]=ht.x,s[8]=ct.x,s[1]=lt.y,s[5]=ht.y,s[9]=ct.y,s[2]=lt.z,s[6]=ht.z,s[10]=ct.z,this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const i=t.elements,s=e.elements,r=this.elements,n=i[0],o=i[4],a=i[8],l=i[12],h=i[1],c=i[5],u=i[9],d=i[13],f=i[2],p=i[6],m=i[10],y=i[14],g=i[3],v=i[7],x=i[11],S=i[15],b=s[0],w=s[4],M=s[8],z=s[12],_=s[1],P=s[5],T=s[9],V=s[13],O=s[2],C=s[6],F=s[10],A=s[14],B=s[3],$=s[7],I=s[11],E=s[15];return r[0]=n*b+o*_+a*O+l*B,r[4]=n*w+o*P+a*C+l*$,r[8]=n*M+o*T+a*F+l*I,r[12]=n*z+o*V+a*A+l*E,r[1]=h*b+c*_+u*O+d*B,r[5]=h*w+c*P+u*C+d*$,r[9]=h*M+c*T+u*F+d*I,r[13]=h*z+c*V+u*A+d*E,r[2]=f*b+p*_+m*O+y*B,r[6]=f*w+p*P+m*C+y*$,r[10]=f*M+p*T+m*F+y*I,r[14]=f*z+p*V+m*A+y*E,r[3]=g*b+v*_+x*O+S*B,r[7]=g*w+v*P+x*C+S*$,r[11]=g*M+v*T+x*F+S*I,r[15]=g*z+v*V+x*A+S*E,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[4]*=t,e[8]*=t,e[12]*=t,e[1]*=t,e[5]*=t,e[9]*=t,e[13]*=t,e[2]*=t,e[6]*=t,e[10]*=t,e[14]*=t,e[3]*=t,e[7]*=t,e[11]*=t,e[15]*=t,this}determinant(){const t=this.elements,e=t[0],i=t[4],s=t[8],r=t[12],n=t[1],o=t[5],a=t[9],l=t[13],h=t[2],c=t[6],u=t[10],d=t[14];return t[3]*(+r*a*c-s*l*c-r*o*u+i*l*u+s*o*d-i*a*d)+t[7]*(+e*a*d-e*l*u+r*n*u-s*n*d+s*l*h-r*a*h)+t[11]*(+e*l*c-e*o*d-r*n*c+i*n*d+r*o*h-i*l*h)+t[15]*(-s*o*h-e*a*c+e*o*u+s*n*c-i*n*u+i*a*h)}transpose(){const t=this.elements;let e;return e=t[1],t[1]=t[4],t[4]=e,e=t[2],t[2]=t[8],t[8]=e,e=t[6],t[6]=t[9],t[9]=e,e=t[3],t[3]=t[12],t[12]=e,e=t[7],t[7]=t[13],t[13]=e,e=t[11],t[11]=t[14],t[14]=e,this}setPosition(t,e,i){const s=this.elements;return t.isVector3?(s[12]=t.x,s[13]=t.y,s[14]=t.z):(s[12]=t,s[13]=e,s[14]=i),this}invert(){const t=this.elements,e=t[0],i=t[1],s=t[2],r=t[3],n=t[4],o=t[5],a=t[6],l=t[7],h=t[8],c=t[9],u=t[10],d=t[11],f=t[12],p=t[13],m=t[14],y=t[15],g=c*m*l-p*u*l+p*a*d-o*m*d-c*a*y+o*u*y,v=f*u*l-h*m*l-f*a*d+n*m*d+h*a*y-n*u*y,x=h*p*l-f*c*l+f*o*d-n*p*d-h*o*y+n*c*y,S=f*c*a-h*p*a-f*o*u+n*p*u+h*o*m-n*c*m,b=e*g+i*v+s*x+r*S;if(0===b)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);const w=1/b;return t[0]=g*w,t[1]=(p*u*r-c*m*r-p*s*d+i*m*d+c*s*y-i*u*y)*w,t[2]=(o*m*r-p*a*r+p*s*l-i*m*l-o*s*y+i*a*y)*w,t[3]=(c*a*r-o*u*r-c*s*l+i*u*l+o*s*d-i*a*d)*w,t[4]=v*w,t[5]=(h*m*r-f*u*r+f*s*d-e*m*d-h*s*y+e*u*y)*w,t[6]=(f*a*r-n*m*r-f*s*l+e*m*l+n*s*y-e*a*y)*w,t[7]=(n*u*r-h*a*r+h*s*l-e*u*l-n*s*d+e*a*d)*w,t[8]=x*w,t[9]=(f*c*r-h*p*r-f*i*d+e*p*d+h*i*y-e*c*y)*w,t[10]=(n*p*r-f*o*r+f*i*l-e*p*l-n*i*y+e*o*y)*w,t[11]=(h*o*r-n*c*r-h*i*l+e*c*l+n*i*d-e*o*d)*w,t[12]=S*w,t[13]=(h*p*s-f*c*s+f*i*u-e*p*u-h*i*m+e*c*m)*w,t[14]=(f*o*s-n*p*s-f*i*a+e*p*a+n*i*m-e*o*m)*w,t[15]=(n*c*s-h*o*s+h*i*a-e*c*a-n*i*u+e*o*u)*w,this}scale(t){const e=this.elements,i=t.x,s=t.y,r=t.z;return e[0]*=i,e[4]*=s,e[8]*=r,e[1]*=i,e[5]*=s,e[9]*=r,e[2]*=i,e[6]*=s,e[10]*=r,e[3]*=i,e[7]*=s,e[11]*=r,this}getMaxScaleOnAxis(){const t=this.elements,e=t[0]*t[0]+t[1]*t[1]+t[2]*t[2],i=t[4]*t[4]+t[5]*t[5]+t[6]*t[6],s=t[8]*t[8]+t[9]*t[9]+t[10]*t[10];return Math.sqrt(Math.max(e,i,s))}makeTranslation(t,e,i){return t.isVector3?this.set(1,0,0,t.x,0,1,0,t.y,0,0,1,t.z,0,0,0,1):this.set(1,0,0,t,0,1,0,e,0,0,1,i,0,0,0,1),this}makeRotationX(t){const e=Math.cos(t),i=Math.sin(t);return this.set(1,0,0,0,0,e,-i,0,0,i,e,0,0,0,0,1),this}makeRotationY(t){const e=Math.cos(t),i=Math.sin(t);return this.set(e,0,i,0,0,1,0,0,-i,0,e,0,0,0,0,1),this}makeRotationZ(t){const e=Math.cos(t),i=Math.sin(t);return this.set(e,-i,0,0,i,e,0,0,0,0,1,0,0,0,0,1),this}makeRotationAxis(t,e){const i=Math.cos(e),s=Math.sin(e),r=1-i,n=t.x,o=t.y,a=t.z,l=r*n,h=r*o;return this.set(l*n+i,l*o-s*a,l*a+s*o,0,l*o+s*a,h*o+i,h*a-s*n,0,l*a-s*o,h*a+s*n,r*a*a+i,0,0,0,0,1),this}makeScale(t,e,i){return this.set(t,0,0,0,0,e,0,0,0,0,i,0,0,0,0,1),this}makeShear(t,e,i,s,r,n){return this.set(1,i,r,0,t,1,n,0,e,s,1,0,0,0,0,1),this}compose(t,e,i){const s=this.elements,r=e._x,n=e._y,o=e._z,a=e._w,l=r+r,h=n+n,c=o+o,u=r*l,d=r*h,f=r*c,p=n*h,m=n*c,y=o*c,g=a*l,v=a*h,x=a*c,S=i.x,b=i.y,w=i.z;return s[0]=(1-(p+y))*S,s[1]=(d+x)*S,s[2]=(f-v)*S,s[3]=0,s[4]=(d-x)*b,s[5]=(1-(u+y))*b,s[6]=(m+g)*b,s[7]=0,s[8]=(f+v)*w,s[9]=(m-g)*w,s[10]=(1-(u+p))*w,s[11]=0,s[12]=t.x,s[13]=t.y,s[14]=t.z,s[15]=1,this}decompose(t,e,i){const s=this.elements;let r=rt.set(s[0],s[1],s[2]).length();const n=rt.set(s[4],s[5],s[6]).length(),o=rt.set(s[8],s[9],s[10]).length();this.determinant()<0&&(r=-r),t.x=s[12],t.y=s[13],t.z=s[14],nt.copy(this);const a=1/r,l=1/n,h=1/o;return nt.elements[0]*=a,nt.elements[1]*=a,nt.elements[2]*=a,nt.elements[4]*=l,nt.elements[5]*=l,nt.elements[6]*=l,nt.elements[8]*=h,nt.elements[9]*=h,nt.elements[10]*=h,e.setFromRotationMatrix(nt),i.x=r,i.y=n,i.z=o,this}makePerspective(t,e,i,s,r,n,o=2e3){const a=this.elements,l=2*r/(e-t),h=2*r/(i-s),c=(e+t)/(e-t),u=(i+s)/(i-s);let d,f;if(o===et)d=-(n+r)/(n-r),f=-2*n*r/(n-r);else{if(o!==it)throw new Error("Matrix4.makePerspective(): Invalid coordinate system: "+o);d=-n/(n-r),f=-n*r/(n-r)}return a[0]=l,a[4]=0,a[8]=c,a[12]=0,a[1]=0,a[5]=h,a[9]=u,a[13]=0,a[2]=0,a[6]=0,a[10]=d,a[14]=f,a[3]=0,a[7]=0,a[11]=-1,a[15]=0,this}makeOrthographic(t,e,i,s,r,n,o=2e3){const a=this.elements,l=1/(e-t),h=1/(i-s),c=1/(n-r),u=(e+t)*l,d=(i+s)*h;let f,p;if(o===et)f=(n+r)*c,p=-2*c;else{if(o!==it)throw new Error("../math.Matrix4.makeOrthographic(): Invalid coordinate system: "+o);f=r*c,p=-1*c}return a[0]=2*l,a[4]=0,a[8]=0,a[12]=-u,a[1]=0,a[5]=2*h,a[9]=0,a[13]=-d,a[2]=0,a[6]=0,a[10]=p,a[14]=-f,a[3]=0,a[7]=0,a[11]=0,a[15]=1,this}equals(t){const e=this.elements,i=t.elements;for(let t=0;t<16;t++)if(e[t]!==i[t])return!1;return!0}fromArray(t,e=0){for(let i=0;i<16;i++)this.elements[i]=t[i+e];return this}toArray(t=[],e=0){const i=this.elements;return t[e]=i[0],t[e+1]=i[1],t[e+2]=i[2],t[e+3]=i[3],t[e+4]=i[4],t[e+5]=i[5],t[e+6]=i[6],t[e+7]=i[7],t[e+8]=i[8],t[e+9]=i[9],t[e+10]=i[10],t[e+11]=i[11],t[e+12]=i[12],t[e+13]=i[13],t[e+14]=i[14],t[e+15]=i[15],t}}st.prototype.isMatrix4=!0;const rt=new H,nt=new st,ot=new H(0,0,0),at=new H(1,1,1),lt=new H,ht=new H,ct=new H,ut=new st,dt=new Z;class ft{constructor(t=0,e=0,i=0,s=ft.DEFAULT_ORDER){this._x=t,this._y=e,this._z=i,this._order=s}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get order(){return this._order}set order(t){this._order=t,this._onChangeCallback()}set(t,e,i,s=this._order){return this._x=t,this._y=e,this._z=i,this._order=s,this._onChangeCallback(),this}clone(){return new ft(this._x,this._y,this._z,this._order)}copy(t){return this._x=t._x,this._y=t._y,this._z=t._z,this._order=t._order,this._onChangeCallback(),this}setFromRotationMatrix(t,e=this._order,i=!0){const s=t.elements,r=s[0],n=s[4],o=s[8],a=s[1],l=s[5],h=s[9],c=s[2],u=s[6],d=s[10];switch(e){case"XYZ":this._y=Math.asin(O(o,-1,1)),Math.abs(o)<.9999999?(this._x=Math.atan2(-h,d),this._z=Math.atan2(-n,r)):(this._x=Math.atan2(u,l),this._z=0);break;case"YXZ":this._x=Math.asin(-O(h,-1,1)),Math.abs(h)<.9999999?(this._y=Math.atan2(o,d),this._z=Math.atan2(a,l)):(this._y=Math.atan2(-c,r),this._z=0);break;case"ZXY":this._x=Math.asin(O(u,-1,1)),Math.abs(u)<.9999999?(this._y=Math.atan2(-c,d),this._z=Math.atan2(-n,l)):(this._y=0,this._z=Math.atan2(a,r));break;case"ZYX":this._y=Math.asin(-O(c,-1,1)),Math.abs(c)<.9999999?(this._x=Math.atan2(u,d),this._z=Math.atan2(a,r)):(this._x=0,this._z=Math.atan2(-n,l));break;case"YZX":this._z=Math.asin(O(a,-1,1)),Math.abs(a)<.9999999?(this._x=Math.atan2(-h,l),this._y=Math.atan2(-c,r)):(this._x=0,this._y=Math.atan2(o,d));break;case"XZY":this._z=Math.asin(-O(n,-1,1)),Math.abs(n)<.9999999?(this._x=Math.atan2(u,l),this._y=Math.atan2(o,r)):(this._x=Math.atan2(-h,d),this._y=0);break;default:console.warn("../math.Euler: .setFromRotationMatrix() encountered an unknown order: "+e)}return this._order=e,!0===i&&this._onChangeCallback(),this}setFromQuaternion(t,e,i){return ut.makeRotationFromQuaternion(t),this.setFromRotationMatrix(ut,e,i)}setFromVector3(t,e=this._order){return this.set(t.x,t.y,t.z,e)}reorder(t){return dt.setFromEuler(this),this.setFromQuaternion(dt,t)}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._order===this._order}fromArray(t){return this._x=t[0],this._y=t[1],this._z=t[2],void 0!==t[3]&&(this._order=t[3]),this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._order,t}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(t){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._order}}ft.DEFAULT_ORDER="XYZ",ft.prototype.isEuler=!0;class pt{constructor(t,e,i,s,r,n,o,a,l){this.elements=[1,0,0,0,1,0,0,0,1],void 0!==t&&this.set(t,e,i,s,r,n,o,a,l)}set(t,e,i,s,r,n,o,a,l){const h=this.elements;return h[0]=t,h[1]=s,h[2]=o,h[3]=e,h[4]=r,h[5]=a,h[6]=i,h[7]=n,h[8]=l,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(t){const e=this.elements,i=t.elements;return e[0]=i[0],e[1]=i[1],e[2]=i[2],e[3]=i[3],e[4]=i[4],e[5]=i[5],e[6]=i[6],e[7]=i[7],e[8]=i[8],this}extractBasis(t,e,i){return t.setFromMatrix3Column(this,0),e.setFromMatrix3Column(this,1),i.setFromMatrix3Column(this,2),this}setFromMatrix4(t){const e=t.elements;return this.set(e[0],e[4],e[8],e[1],e[5],e[9],e[2],e[6],e[10]),this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const i=t.elements,s=e.elements,r=this.elements,n=i[0],o=i[3],a=i[6],l=i[1],h=i[4],c=i[7],u=i[2],d=i[5],f=i[8],p=s[0],m=s[3],y=s[6],g=s[1],v=s[4],x=s[7],S=s[2],b=s[5],w=s[8];return r[0]=n*p+o*g+a*S,r[3]=n*m+o*v+a*b,r[6]=n*y+o*x+a*w,r[1]=l*p+h*g+c*S,r[4]=l*m+h*v+c*b,r[7]=l*y+h*x+c*w,r[2]=u*p+d*g+f*S,r[5]=u*m+d*v+f*b,r[8]=u*y+d*x+f*w,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[3]*=t,e[6]*=t,e[1]*=t,e[4]*=t,e[7]*=t,e[2]*=t,e[5]*=t,e[8]*=t,this}determinant(){const t=this.elements,e=t[0],i=t[1],s=t[2],r=t[3],n=t[4],o=t[5],a=t[6],l=t[7],h=t[8];return e*n*h-e*o*l-i*r*h+i*o*a+s*r*l-s*n*a}invert(){const t=this.elements,e=t[0],i=t[1],s=t[2],r=t[3],n=t[4],o=t[5],a=t[6],l=t[7],h=t[8],c=h*n-o*l,u=o*a-h*r,d=l*r-n*a,f=e*c+i*u+s*d;if(0===f)return this.set(0,0,0,0,0,0,0,0,0);const p=1/f;return t[0]=c*p,t[1]=(s*l-h*i)*p,t[2]=(o*i-s*n)*p,t[3]=u*p,t[4]=(h*e-s*a)*p,t[5]=(s*r-o*e)*p,t[6]=d*p,t[7]=(i*a-l*e)*p,t[8]=(n*e-i*r)*p,this}transpose(){let t;const e=this.elements;return t=e[1],e[1]=e[3],e[3]=t,t=e[2],e[2]=e[6],e[6]=t,t=e[5],e[5]=e[7],e[7]=t,this}getNormalMatrix(t){return this.setFromMatrix4(t).invert().transpose()}transposeIntoArray(t){const e=this.elements;return t[0]=e[0],t[1]=e[3],t[2]=e[6],t[3]=e[1],t[4]=e[4],t[5]=e[7],t[6]=e[2],t[7]=e[5],t[8]=e[8],this}setUvTransform(t,e,i,s,r,n,o){const a=Math.cos(r),l=Math.sin(r);return this.set(i*a,i*l,-i*(a*n+l*o)+n+t,-s*l,s*a,-s*(-l*n+a*o)+o+e,0,0,1),this}scale(t,e){return this.premultiply(mt.makeScale(t,e)),this}rotate(t){return this.premultiply(mt.makeRotation(-t)),this}translate(t,e){return this.premultiply(mt.makeTranslation(t,e)),this}makeTranslation(t,e){return t.isVector2?this.set(1,0,t.x,0,1,t.y,0,0,1):this.set(1,0,t,0,1,e,0,0,1),this}makeRotation(t){const e=Math.cos(t),i=Math.sin(t);return this.set(e,-i,0,i,e,0,0,0,1),this}makeScale(t,e){return this.set(t,0,0,0,e,0,0,0,1),this}equals(t){const e=this.elements,i=t.elements;for(let t=0;t<9;t++)if(e[t]!==i[t])return!1;return!0}fromArray(t,e=0){for(let i=0;i<9;i++)this.elements[i]=t[i+e];return this}toArray(t=[],e=0){const i=this.elements;return t[e]=i[0],t[e+1]=i[1],t[e+2]=i[2],t[e+3]=i[3],t[e+4]=i[4],t[e+5]=i[5],t[e+6]=i[6],t[e+7]=i[7],t[e+8]=i[8],t}clone(){return(new pt).fromArray(this.elements)}}pt.prototype.isMatrix3=!0;const mt=new pt,yt=new Float32Array(4);class gt extends Z{constructor(t,e){super(),this.data=t,this.offset=e}bind(t,e){this.data=t,this.offset=e}}const vt=gt.prototype;vt.data=yt,vt.offset=0,Object.defineProperties(gt.prototype,{_x:{get(){return this.data[this.offset]},set(t){this.data[this.offset]=t}},_y:{get(){return this.data[this.offset+1]},set(t){this.data[this.offset+1]=t}},_z:{get(){return this.data[this.offset+2]},set(t){this.data[this.offset+2]=t}},_w:{get(){return this.data[this.offset+3]},set(t){this.data[this.offset+3]=t}}});class xt{constructor(t=0,e=0){this.x=t,this.y=e}get width(){return this.x}set width(t){this.x=t}get height(){return this.y}set height(t){this.y=t}set(t,e){return this.x=t,this.y=e,this}setScalar(t){return this.x=t,this.y=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+t)}}clone(){return new xt(this.x,this.y)}copy(t){return this.x=t.x,this.y=t.y,this}add(t){return this.x+=t.x,this.y+=t.y,this}addScalar(t){return this.x+=t,this.y+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this}subScalar(t){return this.x-=t,this.y-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this}multiply(t){return this.x*=t.x,this.y*=t.y,this}multiplyScalar(t){return this.x*=t,this.y*=t,this}divide(t){return this.x/=t.x,this.y/=t.y,this}divideScalar(t){return this.multiplyScalar(1/t)}applyMatrix3(t){const e=this.x,i=this.y,s=t.elements;return this.x=s[0]*e+s[3]*i+s[6],this.y=s[1]*e+s[4]*i+s[7],this}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this}clamp(t,e){return this.x=Math.max(t.x,Math.min(e.x,this.x)),this.y=Math.max(t.y,Math.min(e.y,this.y)),this}clampScalar(t,e){return this.x=Math.max(t,Math.min(e,this.x)),this.y=Math.max(t,Math.min(e,this.y)),this}clampLength(t,e){const i=this.length();return this.divideScalar(i||1).multiplyScalar(Math.max(t,Math.min(e,i)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this}negate(){return this.x=-this.x,this.y=-this.y,this}dot(t){return this.x*t.x+this.y*t.y}cross(t){return this.x*t.y-this.y*t.x}lengthSq(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)}normalize(){return this.divideScalar(this.length()||1)}angle(){return Math.atan2(-this.y,-this.x)+Math.PI}angleTo(t){const e=Math.sqrt(this.lengthSq()*t.lengthSq());if(0===e)return Math.PI/2;const i=this.dot(t)/e;return Math.acos(O(i,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,i=this.y-t.y;return e*e+i*i}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this}lerpVectors(t,e,i){return this.x=t.x+(e.x-t.x)*i,this.y=t.y+(e.y-t.y)*i,this}equals(t){return t.x===this.x&&t.y===this.y}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t}rotateAround(t,e){const i=Math.cos(e),s=Math.sin(e),r=this.x-t.x,n=this.y-t.y;return this.x=r*i-n*s+t.x,this.y=r*s+n*i+t.y,this}random(){return this.x=S(),this.y=S(),this}*[Symbol.iterator](){yield this.x,yield this.y}}xt.isVector2=!0;const St=new Float32Array(3);class bt extends H{constructor(t,e){super(),this.data=t,this.offset=e}bind(t,e){this.data=t,this.offset=e}}const wt=bt.prototype;wt.data=St,wt.offset=0,Object.defineProperties(bt.prototype,{x:{get(){return this.data[this.offset]},set(t){this.data[this.offset]=t}},y:{get(){return this.data[this.offset+1]},set(t){this.data[this.offset+1]=t}},z:{get(){return this.data[this.offset+2]},set(t){this.data[this.offset+2]=t}}});class Mt{constructor(t=0,e=0,i=0,s=1){this.x=t,this.y=e,this.z=i,this.w=s}get width(){return this.z}set width(t){this.z=t}get height(){return this.w}set height(t){this.w=t}set(t,e,i,s){return this.x=t,this.y=e,this.z=i,this.w=s,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this.w=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setW(t){return this.w=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;case 3:this.w=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+t)}}clone(){return new Mt(this.x,this.y,this.z,this.w)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this.w=t.w,this}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this.w+=t.w,this}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this.w+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this.w=t.w+e.w,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this.w+=t.w*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this.w-=t.w,this}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this.w-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this.w=t.w-e.w,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this.w*=t.w,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this.w*=t,this}applyMatrix4(t){const e=this.x,i=this.y,s=this.z,r=this.w,n=t.elements;return this.x=n[0]*e+n[4]*i+n[8]*s+n[12]*r,this.y=n[1]*e+n[5]*i+n[9]*s+n[13]*r,this.z=n[2]*e+n[6]*i+n[10]*s+n[14]*r,this.w=n[3]*e+n[7]*i+n[11]*s+n[15]*r,this}divideScalar(t){return this.multiplyScalar(1/t)}setAxisAngleFromQuaternion(t){this.w=2*Math.acos(t.w);const e=Math.sqrt(1-t.w*t.w);return e<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=t.x/e,this.y=t.y/e,this.z=t.z/e),this}setAxisAngleFromRotationMatrix(t){let e,i,s,r;const n=.01,o=.1,a=t.elements,l=a[0],h=a[4],c=a[8],u=a[1],d=a[5],f=a[9],p=a[2],m=a[6],y=a[10];if(Math.abs(h-u)<n&&Math.abs(c-p)<n&&Math.abs(f-m)<n){if(Math.abs(h+u)<o&&Math.abs(c+p)<o&&Math.abs(f+m)<o&&Math.abs(l+d+y-3)<o)return this.set(1,0,0,0),this;e=Math.PI;const t=(l+1)/2,a=(d+1)/2,g=(y+1)/2,v=(h+u)/4,x=(c+p)/4,S=(f+m)/4;return t>a&&t>g?t<n?(i=0,s=.707106781,r=.707106781):(i=Math.sqrt(t),s=v/i,r=x/i):a>g?a<n?(i=.707106781,s=0,r=.707106781):(s=Math.sqrt(a),i=v/s,r=S/s):g<n?(i=.707106781,s=.707106781,r=0):(r=Math.sqrt(g),i=x/r,s=S/r),this.set(i,s,r,e),this}let g=Math.sqrt((m-f)*(m-f)+(c-p)*(c-p)+(u-h)*(u-h));return Math.abs(g)<.001&&(g=1),this.x=(m-f)/g,this.y=(c-p)/g,this.z=(u-h)/g,this.w=Math.acos((l+d+y-1)/2),this}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this.z=Math.min(this.z,t.z),this.w=Math.min(this.w,t.w),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this.z=Math.max(this.z,t.z),this.w=Math.max(this.w,t.w),this}clamp(t,e){return this.x=Math.max(t.x,Math.min(e.x,this.x)),this.y=Math.max(t.y,Math.min(e.y,this.y)),this.z=Math.max(t.z,Math.min(e.z,this.z)),this.w=Math.max(t.w,Math.min(e.w,this.w)),this}clampScalar(t,e){return this.x=Math.max(t,Math.min(e,this.x)),this.y=Math.max(t,Math.min(e,this.y)),this.z=Math.max(t,Math.min(e,this.z)),this.w=Math.max(t,Math.min(e,this.w)),this}clampLength(t,e){const i=this.length();return this.divideScalar(i||1).multiplyScalar(Math.max(t,Math.min(e,i)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this.w=Math.floor(this.w),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this.w=Math.ceil(this.w),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this.w=Math.round(this.w),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this.w=Math.trunc(this.w),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this.w=-this.w,this}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z+this.w*t.w}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)}normalize(){return this.divideScalar(this.length()||1)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this.z+=(t.z-this.z)*e,this.w+=(t.w-this.w)*e,this}lerpVectors(t,e,i){return this.x=t.x+(e.x-t.x)*i,this.y=t.y+(e.y-t.y)*i,this.z=t.z+(e.z-t.z)*i,this.w=t.w+(e.w-t.w)*i,this}equals(t){return t.x===this.x&&t.y===this.y&&t.z===this.z&&t.w===this.w}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this.z=t[e+2],this.w=t[e+3],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t[e+2]=this.z,t[e+3]=this.w,t}random(){return this.x=S(),this.y=S(),this.z=S(),this.w=S(),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z,yield this.w}}Mt.prototype.isVector4=!0;const zt=new Float32Array(4);class _t extends Mt{constructor(t,e){super(),this.data=t,this.offset=e}bind(t,e){this.data=t,this.offset=e}}const Pt=_t.prototype;let Tt;function Vt(){return Tt}Pt.data=zt,Pt.offset=0,Object.defineProperties(_t.prototype,{x:{get(){return this.data[this.offset]},set(t){this.data[this.offset]=t}},y:{get(){return this.data[this.offset+1]},set(t){this.data[this.offset+1]=t}},z:{get(){return this.data[this.offset+2]},set(t){this.data[this.offset+2]=t}},w:{get(){return this.data[this.offset+3]},set(t){this.data[this.offset+3]=t}}});class Ot{constructor(t,e){this.resolver=t,this.bounce=e,this.type="ApplyCollision",this.tempV=new H}initialize(t){}update(t,e){this.resolver&&this.resolver.resolve(t.position,this.tempV)&&t.velocity.reflect(this.tempV).multiplyScalar(this.bounce)}frameUpdate(t){}toJSON(){return{type:this.type,bounce:this.bounce}}static fromJSON(t){return new Ot(Vt(),t.bounce)}clone(){return new Ot(this.resolver,this.bounce)}reset(){}}class Ct{constructor(t){this.value=t,this.type="value"}startGen(t){}genValue(t){return this.value}toJSON(){return{type:"ConstantValue",value:this.value}}static fromJSON(t){return new Ct(t.value)}clone(){return new Ct(this.value)}}class Ft{constructor(t,e){this.a=t,this.b=e,this.indexCount=-1,this.type="value"}startGen(t){this.indexCount=t.length,t.push(S())}genValue(t){return-1===this.indexCount&&this.startGen(t),X.lerp(this.a,this.b,t[this.indexCount])}toJSON(){return{type:"IntervalValue",a:this.a,b:this.b}}static fromJSON(t){return new Ft(t.a,t.b)}clone(){return new Ft(this.a,this.b)}}class At{constructor(t,e,i,s){this.p=[t,e,i,s]}genValue(t){const e=this.p,i=t*t,s=1-t,r=s*s;return e[0]*r*s+e[1]*r*t*3+e[2]*s*i*3+e[3]*i*t}derivativeCoefficients(t){const e=[];for(let i=t,s=i.length-1;s>0;s--){const t=[];for(let e=0;e<s;e++){const r=s*(i[e+1]-i[e]);t.push(r)}e.push(t),i=t}return e}getSlope(t){const e=this.derivativeCoefficients(this.p)[0],i=1-t,s=i*t*2,r=t*t;return i*i*e[0]+s*e[1]+r*e[2]}controlCurve(t,e){this.p[1]=t/3+this.p[0],this.p[2]=this.p[3]-e/3}hull(t){let e,i=this.p,s=[],r=0,n=0,o=0;const a=[];for(a[r++]=i[0],a[r++]=i[1],a[r++]=i[2],a[r++]=i[3];i.length>1;){for(s=[],n=0,o=i.length-1;n<o;n++)e=t*i[n]+(1-t)*i[n+1],a[r++]=e,s.push(e);i=s}return a}split(t){const e=this.hull(t);return{left:new At(e[0],e[4],e[7],e[9]),right:new At(e[9],e[8],e[6],e[3]),span:e}}clone(){return new At(this.p[0],this.p[1],this.p[2],this.p[3])}toJSON(){return{p0:this.p[0],p1:this.p[1],p2:this.p[2],p3:this.p[3]}}static fromJSON(t){return new At(t.p0,t.p1,t.p2,t.p3)}}class Bt{constructor(){this.functions=new Array}findFunction(t){const e=this.functions,i=e.length-1;if(i<=0)return 0===i&&t>=e[0][1]&&t<=1?0:-1;let s=0,r=i;for(;s+1<r;){const i=s+r>>1;if(t<e[i][1])r=i-1;else{if(!(t>this.getEndX(i)))return i;s=i+1}}for(let i=s;i<=r;i++)if(t>=e[i][1]&&t<=this.getEndX(i))return i;return-1}getStartX(t){return this.functions[t][1]}setStartX(t,e){t>0&&(this.functions[t][1]=e)}getEndX(t){return t+1<this.functions.length?this.functions[t+1][1]:1}setEndX(t,e){t+1<this.functions.length&&(this.functions[t+1][1]=e)}insertFunction(t,e){const i=this.findFunction(t);this.functions.splice(i+1,0,[e,t])}removeFunction(t){return this.functions.splice(t,1)[0][0]}getFunction(t){return this.functions[t][0]}setFunction(t,e){this.functions[t][0]=e}get numOfFunctions(){return this.functions.length}}class $t extends Bt{constructor(t=[[new At(0,1/3,1/3*2,1),0]]){super(),this.table=null,this.tableSignature=null,this.type="function",this.functions=t}refreshTable(){const t=this.functions,e=t.length;if(0===e)return this.table=null,void(this.tableSignature=null);const i=5*e;let s=this.tableSignature,r=null===s||s.length!==i;r&&(s=new Float64Array(i));for(let i=0,n=0;i<e;i++,n+=5){const e=t[i][0].p,o=t[i][1];r||(r=s[n]!==e[0]||s[n+1]!==e[1]||s[n+2]!==e[2]||s[n+3]!==e[3]||s[n+4]!==o),r&&(s[n]=e[0],s[n+1]=e[1],s[n+2]=e[2],s[n+3]=e[3],s[n+4]=o)}if(!r&&null!==this.table)return;this.tableSignature=s;const n=$t.TABLE_SIZE,o=null!==this.table&&this.table.length===n?this.table:new Float32Array(n),a=1/(n-1);for(let t=0;t<n;t++)o[t]=this.genValueExact(t*a);this.table=o}sampledTable(){return this.table}clearTable(){this.table=null,this.tableSignature=null}genValue(t,e=0){const i=this.table;if(null!==i){const t=i.length-1;if(e<=0)return i[0];if(e>=1)return i[t];const s=e*t,r=0|s,n=s-r,o=i[r];return o+(i[r+1]-o)*n}return this.genValueExact(e)}genValueExact(t){const e=this.functions,i=e.length;if(0===i)return 0;const s=this.findFunction(t);if(-1===s)return t<e[0][1]?e[0][0].genValue(0):e[i-1][0].genValue(1);const r=e[s][1],n=(s+1<i?e[s+1][1]:1)-r;return e[s][0].genValue(n>0?(t-r)/n:0)}toSVG(t,e){if(e<1)return"";let i=["M",0,this.functions[0][0].p[0]].join(" ");for(let s=1/e;s<=1;s+=1/e)i=[i,"L",s*t,this.genValue(void 0,s)].join(" ");return i}toJSON(){return{type:"PiecewiseBezier",functions:this.functions.map(([t,e])=>({function:t.toJSON(),start:e}))}}static fromJSON(t){return new $t(t.functions.map(t=>[At.fromJSON(t.function),t.start]))}clone(){return new $t(this.functions.map(([t,e])=>[t.clone(),e]))}startGen(t){}}function It(t){switch(t.type){case"ConstantValue":return Ct.fromJSON(t);case"IntervalValue":return Ft.fromJSON(t);case"PiecewiseBezier":return $t.fromJSON(t);default:return new Ct(0)}}$t.TABLE_SIZE=257;class Et{constructor(t,e){this.axis=t,this.angle=e,this.type="rotation"}startGen(t){this.angle.startGen(t)}genValue(t,e,i,s){return e.setFromAxisAngle(this.axis,this.angle.genValue(t,s)*i)}toJSON(){return{type:"AxisAngle",axis:{x:this.axis.x,y:this.axis.y,z:this.axis.z},angle:this.angle.toJSON()}}static fromJSON(t){return new Et(new H(t.axis.x,t.axis.y,t.axis.z),It(t.angle))}clone(){return new Et(this.axis.clone(),this.angle.clone())}}const Nt=t=>({r:t.x,g:t.y,b:t.z,a:t.w}),Rt=t=>new Mt(t.r,t.g,t.b,t.a),Lt=(t,e)=>{switch(e){case"Vector3":return new H(t.x,t.y,t.z);case"Vector4":return new Mt(t.x,t.y,t.z,t.w);case"Color":return new H(t.r,t.g,t.b);default:return t}},Dt=(t,e)=>{switch(e){case"Vector3":return{x:t.x,y:t.y,z:t.z};case"Vector4":return{x:t.x,y:t.y,z:t.z,w:t.w};case"Color":return{r:t.x,g:t.y,b:t.z};default:return t}};class Ut{constructor(t,e){this.a=t,this.b=e,this.indexCount=-1,this.type="value"}startGen(t){this.indexCount=t.length,t.push(S())}genColor(t,e){return-1===this.indexCount&&this.startGen(t),e.copy(this.a).lerp(this.b,t[this.indexCount])}toJSON(){return{type:"ColorRange",a:Nt(this.a),b:Nt(this.b)}}static fromJSON(t){return new Ut(Rt(t.a),Rt(t.b))}clone(){return new Ut(this.a.clone(),this.b.clone())}}class qt{constructor(t,e){this.subType=e,this.type="function",this.keys=t}findKey(t){const e=this.keys,i=e.length-1;if(i<=0)return 0===i&&t>=e[0][1]&&t<=1?0:-1;if(1===i)return t<e[0][1]||t>1?-1:t<=e[1][1]?0:1;let s=0,r=i;for(;s+1<r;){const i=s+r>>1;if(t<e[i][1])r=i-1;else{if(!(t>this.getEndX(i)))return i;s=i+1}}for(let i=s;i<=r;i++)if(t>=e[i][1]&&t<=this.getEndX(i))return i;return-1}getStartX(t){return this.keys[t][1]}getEndX(t){return t+1<this.keys.length?this.keys[t+1][1]:1}genValue(t,e){const i=this.keys,s=this.findKey(e),r=i.length-1;if("Number"===this.subType){if(-1===s)return i[0][0];if(s>=r)return i[r][0];const t=i[s][1],n=i[s][0],o=i[s+1][1]-t;return(i[s+1][0]-n)*(o>0?(e-t)/o:0)+n}{if(-1===s)return t.copy(i[0][0]);if(s>=r)return t.copy(i[r][0]);const n=i[s][1],o=i[s+1][1]-n;return t.copy(i[s][0]).lerp(i[s+1][0],o>0?(e-n)/o:0)}}toJSON(){return this.keys[0][0].constructor.name,{type:"CLinearFunction",subType:this.subType,keys:this.keys.map(([t,e])=>({value:Dt(t,this.subType),pos:e}))}}static fromJSON(t){return new qt(t.keys.map(e=>[Lt(e.value,t.subType),e.pos]),t.subType)}clone(){return"Number"===this.subType?new qt(this.keys.map(([t,e])=>[t,e]),this.subType):new qt(this.keys.map(([t,e])=>[t.clone(),e]),this.subType)}}const kt=new Mt;class Jt{constructor(t=[[new H(0,0,0),0],[new H(1,1,1),0]],e=[[1,0],[1,1]]){this.table=null,this.tableSignature=null,this.type="function",this.color=new qt(t,"Color"),this.alpha=new qt(e,"Number")}refreshTable(){const t=this.color.keys,e=this.alpha.keys,i=4*t.length+2*e.length;let s=this.tableSignature,r=null===s||s.length!==i;r&&(s=new Float64Array(i));let n=0;for(let e=0;e<t.length;e++,n+=4){const i=t[e][0],o=t[e][1];r||(r=s[n]!==i.x||s[n+1]!==i.y||s[n+2]!==i.z||s[n+3]!==o),r&&(s[n]=i.x,s[n+1]=i.y,s[n+2]=i.z,s[n+3]=o)}for(let t=0;t<e.length;t++,n+=2){const i=e[t][0],o=e[t][1];r||(r=s[n]!==i||s[n+1]!==o),r&&(s[n]=i,s[n+1]=o)}if(!r&&null!==this.table)return;this.tableSignature=s;const o=Jt.TABLE_SIZE,a=null!==this.table&&this.table.length===4*o?this.table:new Float32Array(4*o),l=1/(o-1),h=kt;for(let t=0;t<o;t++){this.genColorExact(h,t*l);const e=4*t;a[e]=h.x,a[e+1]=h.y,a[e+2]=h.z,a[e+3]=h.w}this.table=a}sampledTable(){return this.table}clearTable(){this.table=null,this.tableSignature=null}genColor(t,e,i){const s=this.table;if(null!==s){const t=Jt.TABLE_SIZE-1;if(i<=0)return e.x=s[0],e.y=s[1],e.z=s[2],e.w=s[3],e;if(i>=1){const i=4*t;return e.x=s[i],e.y=s[i+1],e.z=s[i+2],e.w=s[i+3],e}const r=i*t,n=0|r,o=r-n,a=4*n,l=a+4;return e.x=s[a]+(s[l]-s[a])*o,e.y=s[a+1]+(s[l+1]-s[a+1])*o,e.z=s[a+2]+(s[l+2]-s[a+2])*o,e.w=s[a+3]+(s[l+3]-s[a+3])*o,e}return this.genColorExact(e,i)}genColorExact(t,e){const i=this.color.keys,s=i.length-1,r=this.color.findKey(e);let n,o,a;if(-1===r||r>=s){const t=i[-1===r?0:s][0];n=t.x,o=t.y,a=t.z}else{const t=i[r][0],s=i[r+1][0],l=i[r][1],h=i[r+1][1]-l,c=h>0?(e-l)/h:0;n=t.x+(s.x-t.x)*c,o=t.y+(s.y-t.y)*c,a=t.z+(s.z-t.z)*c}const l=this.alpha.keys,h=l.length-1,c=this.alpha.findKey(e);let u;if(-1===c||c>=h)u=l[-1===c?0:h][0];else{const t=l[c][1],i=l[c][0],s=l[c+1][1]-t;u=i+(l[c+1][0]-i)*(s>0?(e-t)/s:0)}return t.x=n,t.y=o,t.z=a,t.w=u,t}toJSON(){return{type:"Gradient",color:this.color.toJSON(),alpha:this.alpha.toJSON()}}static fromJSON(t){if(t.functions){const e=t.functions.map(t=>[Ut.fromJSON(t.function).a,t.start]);return t.functions.length>0&&e.push([Ut.fromJSON(t.functions[t.functions.length-1].function).b,1]),new Jt(e.map(t=>[new H(t[0].x,t[0].y,t[0].z),t[1]]),e.map(t=>[t[0].w,t[1]]))}{const e=new Jt;return e.alpha=qt.fromJSON(t.alpha),e.color=qt.fromJSON(t.color),e}}clone(){const t=new Jt;return t.alpha=this.alpha.clone(),t.color=this.color.clone(),t}startGen(t){}}Jt.TABLE_SIZE=257;class Qt{constructor(t,e){this.a=t,this.b=e,this.type="value"}startGen(t){}genColor(t,e){const i=S();return e.copy(this.a).lerp(this.b,i)}toJSON(){return{type:"RandomColor",a:Nt(this.a),b:Nt(this.b)}}static fromJSON(t){return new Qt(Rt(t.a),Rt(t.b))}clone(){return new Qt(this.a.clone(),this.b.clone())}}const Gt=new Mt;class Wt{constructor(t,e){this.indexCount=0,this.type="function",this.gradient1=t,this.gradient2=e}startGen(t){this.indexCount=t.length,t.push(S())}genColor(t,e,i){return this.gradient1.genColor(t,e,i),this.gradient2.genColor(t,Gt,i),t&&void 0!==t[this.indexCount]?e.lerp(Gt,t[this.indexCount]):e.lerp(Gt,S()),e}toJSON(){return{type:"RandomColorBetweenGradient",gradient1:this.gradient1.toJSON(),gradient2:this.gradient2.toJSON()}}static fromJSON(t){return new Wt(Jt.fromJSON(t.gradient1),Jt.fromJSON(t.gradient2))}clone(){return new Wt(this.gradient1.clone(),this.gradient2.clone())}}class jt{constructor(t){this.color=t,this.type="value"}startGen(t){}genColor(t,e){return e.copy(this.color)}toJSON(){return{type:"ConstantColor",color:Nt(this.color)}}static fromJSON(t){return new jt(Rt(t.color))}clone(){return new jt(this.color.clone())}}function Yt(t){switch(t.type){case"ConstantColor":return jt.fromJSON(t);case"ColorRange":return Ut.fromJSON(t);case"RandomColor":return Qt.fromJSON(t);case"Gradient":return Jt.fromJSON(t);case"RandomColorBetweenGradient":return Wt.fromJSON(t);default:return new jt(new Mt(1,1,1,1))}}class Xt{constructor(t,e,i,s){this.angleX=t,this.angleY=e,this.angleZ=i,this.type="rotation",this.eular=new ft(0,0,0,s)}startGen(t){this.angleX.startGen(t),this.angleY.startGen(t),this.angleZ.startGen(t)}genValue(t,e,i,s){return this.eular.set(this.angleX.genValue(t,s)*i,this.angleY.genValue(t,s)*i,this.angleZ.genValue(t,s)*i),e.setFromEuler(this.eular)}toJSON(){return{type:"Euler",angleX:this.angleX.toJSON(),angleY:this.angleY.toJSON(),angleZ:this.angleZ.toJSON(),eulerOrder:this.eular.order}}static fromJSON(t){return new Xt(It(t.angleX),It(t.angleY),It(t.angleZ),t.eulerOrder)}clone(){return new Xt(this.angleX,this.angleY,this.angleZ,this.eular.order)}}class Zt{constructor(){this.indexCount=0,this.type="rotation"}startGen(t){let e,i,s,r,n,o;this.indexCount=t.length;do{e=2*S()-1,i=2*S()-1,s=e*e+i*i}while(s>1);do{r=2*S()-1,n=2*S()-1,o=r*r+n*n}while(o>1);const a=Math.sqrt((1-s)/o);t.push(e,i,a*r,a*n)}genValue(t,e,i,s){-1===this.indexCount&&this.startGen(t);const r=this.indexCount;return e.set(t[r],t[r+1],t[r+2],t[r+3]),e}toJSON(){return{type:"RandomQuat"}}static fromJSON(t){return new Zt}clone(){return new Zt}}function Ht(t){switch(t.type){case"AxisAngle":return Et.fromJSON(t);case"Euler":return Xt.fromJSON(t);case"RandomQuat":return Zt.fromJSON(t);default:return new Zt}}class Kt{constructor(t,e,i){this.x=t,this.y=e,this.z=i,this.type="vec3function"}startGen(t){this.x.startGen(t),this.y.startGen(t),this.z.startGen(t)}genValue(t,e,i){return e.set(this.x.genValue(t,i),this.y.genValue(t,i),this.z.genValue(t,i))}toJSON(){return{type:"Vector3Function",x:this.x.toJSON(),y:this.y.toJSON(),z:this.z.toJSON()}}static fromJSON(t){return new Kt(It(t.x),It(t.y),It(t.z))}clone(){return new Kt(this.x,this.y,this.z)}}function te(t){return"Vector3Function"===t.type?Kt.fromJSON(t):new Kt(new Ct(0),new Ct(0),new Ct(0))}function ee(t){switch(t.type){case"ConstantValue":case"IntervalValue":case"PiecewiseBezier":return It(t);case"AxisAngle":case"RandomQuat":case"Euler":return Ht(t);case"Vector3Function":return te(t);default:return new Ct(0)}}class ie{constructor(t,e){this.direction=t,this.magnitude=e,this.type="ApplyForce",this.memory={data:[],dataCount:0},this.magnitudeValue=this.magnitude.genValue(this.memory)}initialize(t){}update(t,e){const i=this.magnitudeValue*e,s=this.direction,r=t.velocity;r.x+=s.x*i,r.y+=s.y*i,r.z+=s.z*i}updateAll(t,e,i){const s=this.magnitudeValue*i,r=this.direction.x*s,n=this.direction.y*s,o=this.direction.z*s;for(let i=0;i<e;i++){const e=t[i];if(e.age>=e.life)continue;const s=e.velocity;s.x+=r,s.y+=n,s.z+=o}}frameUpdate(t){this.magnitudeValue=this.magnitude.genValue(this.memory)}toJSON(){return{type:this.type,direction:[this.direction.x,this.direction.y,this.direction.z],magnitude:this.magnitude.toJSON()}}static fromJSON(t){return new ie(new H(t.direction[0],t.direction[1],t.direction[2]),It(t.magnitude??t.force))}clone(){return new ie(this.direction.clone(),this.magnitude.clone())}reset(){}}class se{constructor(t=0,e=0,i=new H){this.scaleX=t,this.scaleY=e,this.position=i,this.locations=[]}transform(t,e){t.x=this.locations[e%this.locations.length].x*this.scaleX+this.position.x,t.y=this.locations[e%this.locations.length].y*this.scaleY+this.position.y,t.z=this.position.z}static fromJSON(t){const e=new se(t.scaleX,t.scaleY,new H(t.position[0],t.position[1],t.position[2]));return e.locations=t.locations.map(t=>new xt(t.x,t.y)),e}clone(){const t=new se(this.scaleX,this.scaleY,this.position.clone());return t.locations=this.locations.map(t=>t.clone()),t}toJSON(){return{scaleX:this.scaleX,scaleY:this.scaleY,position:this.position,locations:this.locations.map(t=>({x:t.x,y:t.y}))}}fromImage(t,e){const i=document.createElement("canvas");i.width=t.width,i.height=t.height;const s=i.getContext("2d");if(!s)return;s.drawImage(t,0,0);const r=s.getImageData(0,0,i.width,i.height,{colorSpace:"srgb"});i.remove(),this.locations.length=0;for(let t=0;t<r.height;t++)for(let i=0;i<r.width;i++)r.data[4*(t*r.width+i)+3]>e&&this.locations.push(new xt(i,r.height-t))}}function re(t){return"TextureSequencer"===t.type?se.fromJSON(t):new se}class ne{constructor(t){this.type="ApplySequences",this.sequencers=[],this.time=0,this.index=0,this.pCount=0,this.tempV=new H,this.delay=t}initialize(t){t.id=this.pCount,t.dst=new H,t.begin=new H,t.inMotion=!1,this.pCount++}reset(){this.time=0,this.index=0,this.pCount=0}update(t,e){const i=this.sequencers[this.index];if(void 0===i)return;const s=t.id*this.delay;this.time>=i[0].a+s&&this.time<=i[0].b+s?(t.inMotion||(t.inMotion=!0,t.begin.copy(t.position),i[1].transform(t.dst,t.id)),t.position.lerpVectors(t.begin,t.dst,ne.BEZIER.genValue((this.time-i[0].a-s)/(i[0].b-i[0].a)))):this.time>i[0].b+s&&(t.inMotion=!1)}frameUpdate(t){for(;this.index+1<this.sequencers.length&&this.time>=this.sequencers[this.index+1][0].a;)this.index++;this.time+=t}appendSequencer(t,e){this.sequencers.push([t,e])}toJSON(){return{type:this.type,delay:this.delay,sequencers:this.sequencers.map(([t,e])=>({range:t.toJSON(),sequencer:e.toJSON()}))}}static fromJSON(t){const e=new ne(t.delay);return t.sequencers.forEach(t=>{e.sequencers.push([It(t.range),re(t.sequencer)])}),e}clone(){const t=new ne(this.delay);return t.sequencers=this.sequencers.map(t=>[t[0].clone(),t[1].clone()]),t}}ne.BEZIER=new At(0,0,1,1);class oe{constructor(t){this.angle=t,this.type="ChangeEmitDirection",this._temp=new H,this._q=new Z,this.memory={data:[],dataCount:0}}initialize(t){const e=t.velocity.length();0!=e&&(t.velocity.normalize(),0===t.velocity.x&&0===t.velocity.y?this._temp.set(0,t.velocity.z,0):this._temp.set(-t.velocity.y,t.velocity.x,0),this.angle.startGen(this.memory),this._q.setFromAxisAngle(this._temp.normalize(),this.angle.genValue(this.memory)),this._temp.copy(t.velocity),t.velocity.applyQuaternion(this._q),this._q.setFromAxisAngle(this._temp,S()*Math.PI*2),t.velocity.applyQuaternion(this._q),t.velocity.setLength(e))}update(t,e){}frameUpdate(t){}toJSON(){return{type:this.type,angle:this.angle.toJSON()}}static fromJSON(t){return new oe(It(t.angle))}clone(){return new oe(this.angle)}reset(){}}class ae{constructor(t,e){this.color=t,this.speedRange=e,this.type="ColorBySpeed"}initialize(t){this.color.startGen(t.memory)}update(t,e){const i=(t.startSpeed-this.speedRange.a)/(this.speedRange.b-this.speedRange.a);this.color.genColor(t.memory,t.color,i),t.color.x*=t.startColor.x,t.color.y*=t.startColor.y,t.color.z*=t.startColor.z,t.color.w*=t.startColor.w}frameUpdate(t){}toJSON(){return{type:this.type,color:this.color.toJSON(),speedRange:this.speedRange.toJSON()}}static fromJSON(t){return new ae(Yt(t.color),Ft.fromJSON(t.speedRange))}clone(){return new ae(this.color.clone(),this.speedRange.clone())}reset(){}}class le{constructor(t){this.color=t,this.type="ColorOverLife"}initialize(t){this.color.startGen(t.memory)}update(t,e){const i=t.color,s=t.startColor;this.color.genColor(t.memory,i,t.age/t.life),i.x*=s.x,i.y*=s.y,i.z*=s.z,i.w*=s.w}updateAll(t,e,i){const s=this.color;for(let i=0;i<e;i++){const e=t[i];if(e.age>=e.life)continue;const r=e.color,n=e.startColor;s.genColor(e.memory,r,e.age/e.life),r.x*=n.x,r.y*=n.y,r.z*=n.z,r.w*=n.w}}frameUpdate(t){this.color.refreshTable?.()}toJSON(){return{type:this.type,color:this.color.toJSON()}}static fromJSON(t){return new le(Yt(t.color))}clone(){return new le(this.color.clone())}reset(){}}function he(t,e){return Math.floor(S()*(e-t))+t}const ce=new H(0,1,0),ue=new H(0,0,0),de=new H(1,1,1),fe=new H(0,0,1);var pe;exports.SubParticleEmitMode=void 0,(pe=exports.SubParticleEmitMode||(exports.SubParticleEmitMode={}))[pe.Death=0]="Death",pe[pe.Birth=1]="Birth",pe[pe.Frame=2]="Frame";const me={color:1,size:2,rotation:4,lifetime:8};function ye(t){let e=0;for(const i of t)e|=me[i]??0;return e}class ge{constructor(t,e,i,s=exports.SubParticleEmitMode.Frame,r=1,n=[]){this.particleSystem=t,this.useVelocityAsBasis=e,this.subParticleSystem=i,this.mode=s,this.emitProbability=r,this.inherit=n,this.type="EmitSubParticleSystem",this.q_=new Z,this.v_=new H,this.v2_=new H,this.subEmissions=new Array,this.spareEmissions=new Array;const o=this.target;o&&(o.onlyUsedByOther=!0)}initialize(t){}update(t,e){(this.mode===exports.SubParticleEmitMode.Frame||this.mode===exports.SubParticleEmitMode.Birth&&0===t.age||this.mode===exports.SubParticleEmitMode.Death&&t.age+e>=t.life)&&this.emit(t,e)}get target(){const t=this.subParticleSystem;if(null!==t&&"object"==typeof t)return t.system}emit(t,e){if(!this.target)return;if(S()>this.emitProbability)return;const i=this.spareEmissions.pop(),s=void 0!==i?i:{burstParticleCount:0,burstParticleIndex:0,isBursting:!1,burstIndex:0,burstWaveIndex:0,time:0,waitEmiting:0,matrix:new st,travelDistance:0,particle:void 0,previousWorldPos:void 0};s.burstParticleCount=0,s.burstParticleIndex=0,s.isBursting=!1,s.burstIndex=0,s.burstWaveIndex=0,s.time=0,s.waitEmiting=0,s.travelDistance=0,s.particle=t,s.inherit=ye(this.inherit),s.previousWorldPos=void 0,this.setMatrixFromParticle(s.matrix,t),this.subEmissions.push(s)}frameUpdate(t){const e=this.target;if(e)for(let i=0;i<this.subEmissions.length;i++)if(this.subEmissions[i].time>=e.duration){const t=this.subEmissions[i];t.particle=void 0,this.spareEmissions.push(t),this.subEmissions[i]=this.subEmissions[this.subEmissions.length-1],this.subEmissions.length=this.subEmissions.length-1,i--}else{const s=this.subEmissions[i];s.particle&&s.particle.age<s.particle.life?this.setMatrixFromParticle(s.matrix,s.particle):s.particle=void 0,e.emit(t,s,s.matrix)}else this.subEmissions.length=0}toJSON(){return{type:this.type,subParticleSystem:"string"==typeof this.subParticleSystem?this.subParticleSystem:this.subParticleSystem?this.subParticleSystem.uuid:"",useVelocityAsBasis:this.useVelocityAsBasis,mode:this.mode,emitProbability:this.emitProbability,...this.inherit.length>0?{inherit:this.inherit.slice()}:{}}}static fromJSON(t,e){return new ge(e,t.useVelocityAsBasis,t.subParticleSystem,t.mode,t.emitProbability,ge.validInherit(t.inherit))}clone(){return new ge(this.particleSystem,this.useVelocityAsBasis,this.subParticleSystem,this.mode,this.emitProbability,this.inherit.slice())}reset(){}static validInherit(t){return Array.isArray(t)?t.filter(t=>t in me):[]}setMatrixFromParticle(t,e){let i;if(void 0===e.rotation||this.useVelocityAsBasis)if(0!==e.velocity.x||0!==e.velocity.y||1!==e.velocity.z&&0!==e.velocity.z){this.v_.copy(fe).cross(e.velocity),this.v2_.copy(e.velocity).cross(this.v_);const i=this.v_.length(),s=this.v2_.length();t.set(this.v_.x/i,this.v2_.x/s,e.velocity.x,e.position.x,this.v_.y/i,this.v2_.y/s,e.velocity.y,e.position.y,this.v_.z/i,this.v2_.z/s,e.velocity.z,e.position.z,0,0,0,1)}else t.set(1,0,0,e.position.x,0,1,0,e.position.y,0,0,1,e.position.z,0,0,0,1);else e.rotation instanceof Z?i=e.rotation:(this.q_.setFromAxisAngle(fe,e.rotation),i=this.q_),t.compose(e.position,i,de);this.particleSystem.worldSpace||t.multiplyMatrices(this.particleSystem.emitter.matrixWorld,t)}}class ve{initialize(t,e){this.ps=e,this.x.startGen(t.memory),this.y.startGen(t.memory),this.z.startGen(t.memory)}constructor(t,e,i){this.x=t,this.y=e,this.z=i,this.type="ForceOverLife",this._temp=new H,this._tempScale=new H,this._tempQ=new Z}update(t,e){this._temp.set(this.x.genValue(t.memory,t.age/t.life),this.y.genValue(t.memory,t.age/t.life),this.z.genValue(t.memory,t.age/t.life)),void 0===this.ps||this.ps.worldSpace?t.velocity.addScaledVector(this._temp,e*(this.ps?.motionScale??1)):(this._temp.multiply(this._tempScale).applyQuaternion(this._tempQ),t.velocity.addScaledVector(this._temp,e))}updateAll(t,e,i){const s=this.ps;if(void 0===s)return;const r=this._temp,n=this.x,o=this.y,a=this.z,l=s.worldSpace,h=l?i*(s.motionScale??1):i;for(let i=0;i<e;i++){const e=t[i];if(e.age>=e.life)continue;const s=e.memory,c=e.age/e.life;r.set(n.genValue(s,c),o.genValue(s,c),a.genValue(s,c)),l||r.multiply(this._tempScale).applyQuaternion(this._tempQ),e.velocity.addScaledVector(r,h)}}toJSON(){return{type:this.type,x:this.x.toJSON(),y:this.y.toJSON(),z:this.z.toJSON()}}static fromJSON(t){return new ve(It(t.x),It(t.y),It(t.z))}frameUpdate(t){if(this.ps&&!this.ps.worldSpace){const t=this._temp,e=this._tempQ,i=this._tempScale;this.ps.emitter.matrixWorld.decompose(t,e,i),e.invert(),i.set(1/i.x,1/i.y,1/i.z)}}clone(){return new ve(this.x.clone(),this.y.clone(),this.z.clone())}reset(){}}class xe{constructor(t,e={}){this.type="FrameOverLife",this.frame=t,this.fps=e.fps??0,this.cycles=e.cycles??1,this.frameCount=e.frameCount??0,this.loop=e.loop??!0,this.startFrame=e.startFrame}get frame(){return this._frame}set frame(t){this._frame=t}isPlain(){return!(this.fps>0)&&1===this.cycles&&void 0===this.startFrame}initialize(t){this._frame.startGen(t.memory),this.startFrame?.startGen(t.memory)}update(t,e){t.uvTile=this.frameAt(t,t.age,t.age/t.life)}updateAll(t,e,i){for(let i=0;i<e;i++){const e=t[i];e.age>=e.life||(e.uvTile=this.frameAt(e,e.age,e.age/e.life))}}frameAt(t,e,i){if(this.fps>0){const s=this.sampleFrame(t,i),r=this.frameCount;let n=Math.floor(e*this.fps)+this.offset(t);return r>0&&(n=this.loop?xe.wrap(n,r):Math.min(n,r-1)),s+n}let s;if(1!==this.cycles&&this.cycles>0){const e=i*this.cycles;s=this.sampleFrame(t,i>=1?1:e-Math.floor(e))}else s=this.sampleFrame(t,i);return void 0!==this.startFrame&&(s+=this.offset(t),this.frameCount>0&&(s=xe.wrap(s,this.frameCount))),s}offset(t){return void 0!==this.startFrame?Math.floor(this.startFrame.genValue(t.memory)):0}static wrap(t,e){return(t%e+e)%e}sampleFrame(t,e){return"function"===this._frame.type?this._frame.genValue(t.memory,e):this._frame.genValue(t.memory)}frameUpdate(t){this._frame.refreshTable?.()}toJSON(){return{type:this.type,frame:this.frame.toJSON(),...this.fps>0?{fps:this.fps}:{},...1!==this.cycles?{cycles:this.cycles}:{},...this.frameCount>0?{frameCount:this.frameCount}:{},...this.loop?{}:{loop:!1},...void 0!==this.startFrame?{startFrame:this.startFrame.toJSON()}:{}}}static fromJSON(t){return new xe(It(t.frame),{fps:"number"==typeof t.fps?t.fps:void 0,cycles:"number"==typeof t.cycles?t.cycles:void 0,frameCount:"number"==typeof t.frameCount?t.frameCount:void 0,loop:"boolean"==typeof t.loop?t.loop:void 0,startFrame:void 0!==t.startFrame?It(t.startFrame):void 0})}clone(){return new xe(this.frame.clone(),{fps:this.fps,cycles:this.cycles,frameCount:this.frameCount,loop:this.loop,startFrame:this.startFrame?.clone()})}reset(){}}class Se{constructor(t,e){this.center=t,this.magnitude=e,this.type="GravityForce",this.temp=new H}initialize(t){}update(t,e){const i=t.position.distanceToSquared(this.center);0!==i&&(this.temp.copy(this.center).sub(t.position).normalize(),t.velocity.addScaledVector(this.temp,this.magnitude/i*e))}updateAll(t,e,i){const s=this.center.x,r=this.center.y,n=this.center.z,o=this.magnitude*i;for(let i=0;i<e;i++){const e=t[i];if(e.age>=e.life)continue;const a=e.position,l=s-a.x,h=r-a.y,c=n-a.z,u=l*l+h*h+c*c;if(0===u)continue;const d=o/(u*Math.sqrt(u)),f=e.velocity;f.x+=l*d,f.y+=h*d,f.z+=c*d}}frameUpdate(t){}toJSON(){return{type:this.type,center:[this.center.x,this.center.y,this.center.z],magnitude:this.magnitude}}static fromJSON(t){return new Se(new H(t.center[0],t.center[1],t.center[2]),t.magnitude)}clone(){return new Se(this.center.clone(),this.magnitude)}reset(){}}class be{constructor(t=new Ct(1),e="initial"){this.multiplier=t,this.mode=e,this.type="InheritVelocity",this._temp=new H,this._tempPos=new H,this._tempQInv=new Z,this._tempScaleInv=new H(1,1,1)}initialize(t,e){this.ps=e,this.multiplier.startGen(t.memory),"initial"===this.mode&&e.emitterVelocity&&(this._temp.copy(e.emitterVelocity),e.worldSpace||(this.decomposeInverse(e),this._temp.multiply(this._tempScaleInv).applyQuaternion(this._tempQInv)),t.velocity.addScaledVector(this._temp,this.multiplier.genValue(t.memory,0)))}frameUpdate(t){this.ps&&!this.ps.worldSpace&&this.decomposeInverse(this.ps)}update(t,e){"current"===this.mode&&void 0!==this.ps&&this.ps.emitterVelocity&&(this._temp.copy(this.ps.emitterVelocity),this.ps.worldSpace||this._temp.multiply(this._tempScaleInv).applyQuaternion(this._tempQInv),t.position.addScaledVector(this._temp,this.multiplier.genValue(t.memory,t.age/t.life)*e))}decomposeInverse(t){t.emitter.matrixWorld.decompose(this._tempPos,this._tempQInv,this._tempScaleInv),this._tempQInv.invert(),this._tempScaleInv.set(1/this._tempScaleInv.x,1/this._tempScaleInv.y,1/this._tempScaleInv.z)}toJSON(){return{type:this.type,multiplier:this.multiplier.toJSON(),mode:this.mode}}static fromJSON(t){return new be(t.multiplier?It(t.multiplier):new Ct(1),"current"===t.mode?"current":"initial")}clone(){return new be(this.multiplier.clone(),this.mode)}reset(){}}class we{initialize(t,e){void 0!==e&&(this.ps=e),this.speed.startGen(t.memory)}motionScale(){const t=this.ps;return void 0!==t&&t.worldSpace?t.motionScale??1:1}constructor(t,e){this.speed=t,this.dampen=e,this.type="LimitSpeedOverLife"}update(t,e){let i=t.velocity.length(),s=this.speed.genValue(t.memory,t.age/t.life)*this.motionScale();if(i>s){const r=(i-s)/i;t.velocity.multiplyScalar(1-r*this.dampen*e*20)}}updateAll(t,e,i){const s=this.speed,r=this.dampen*i*20,n=this.motionScale();for(let i=0;i<e;i++){const e=t[i];if(e.age>=e.life)continue;const o=e.velocity,a=o.length(),l=s.genValue(e.memory,e.age/e.life)*n;a>l&&o.multiplyScalar(1-(a-l)/a*r)}}toJSON(){return{type:this.type,speed:this.speed.toJSON(),dampen:this.dampen}}static fromJSON(t){return new we(It(t.speed),t.dampen)}frameUpdate(t){this.speed.refreshTable?.()}clone(){return new we(this.speed.clone(),this.dampen)}reset(){}}class Me{constructor(t=64){this.previousVelocity=Me.EMPTY,this.rotationQuaternion=Me.EMPTY,this.angularVelocityQuaternion=Me.EMPTY,this.memory=new Float64Array(0),this.memoryStride=0,this.capacity=Math.max(1,t),this.position=new Float32Array(3*this.capacity),this.previousPosition=new Float32Array(3*this.capacity),this.previousSize=new Float32Array(3*this.capacity),this.previousColor=new Float32Array(4*this.capacity),this.velocity=new Float32Array(3*this.capacity),this.size=new Float32Array(3*this.capacity),this.startSize=new Float32Array(3*this.capacity),this.color=new Float32Array(4*this.capacity),this.startColor=new Float32Array(4*this.capacity),this.scalars=new Float64Array(this.capacity*Me.SCALAR_STRIDE),this.rotation=new Float32Array(this.capacity),this.angularVelocity=new Float32Array(this.capacity),this.uvTile=new Float32Array(this.capacity),this.startSpeed=new Float32Array(this.capacity),this.flip=new Uint8Array(this.capacity)}ensureCapacity(t){if(t<=this.capacity)return!1;let e=this.capacity;for(;e<t;)e*=2;this.position=Me.grow(this.position,3*e),this.previousPosition=Me.grow(this.previousPosition,3*e);const i=this.previousSize===this.size,s=this.previousColor===this.color;if(i||(this.previousSize=Me.grow(this.previousSize,3*e)),this.previousVelocity.length>0&&(this.previousVelocity=Me.grow(this.previousVelocity,3*e)),this.rotationQuaternion.length>0){const t=this.rotationQuaternion.length;this.rotationQuaternion=Me.grow(this.rotationQuaternion,4*e),this.angularVelocityQuaternion=Me.grow(this.angularVelocityQuaternion,4*e);for(let i=t+3;i<4*e;i+=4)this.rotationQuaternion[i]=1,this.angularVelocityQuaternion[i]=1}if(s||(this.previousColor=Me.grow(this.previousColor,4*e)),this.velocity=Me.grow(this.velocity,3*e),this.size=Me.grow(this.size,3*e),this.startSize=Me.grow(this.startSize,3*e),this.color=Me.grow(this.color,4*e),i&&(this.previousSize=this.size),s&&(this.previousColor=this.color),this.startColor=Me.grow(this.startColor,4*e),this.scalars=Me.growDouble(this.scalars,e*Me.SCALAR_STRIDE),this.memoryStride>0){const t=new Float64Array(e*this.memoryStride);t.fill(NaN),t.set(this.memory),this.memory=t}this.rotation=Me.grow(this.rotation,e),this.angularVelocity=Me.grow(this.angularVelocity,e),this.uvTile=Me.grow(this.uvTile,e),this.startSpeed=Me.grow(this.startSpeed,e);const r=new Uint8Array(e);return r.set(this.flip),this.flip=r,this.capacity=e,!0}keepPreviousVelocity(){return!(this.previousVelocity.length>=3*this.capacity)&&(this.previousVelocity=new Float32Array(3*this.capacity),!0)}recordMemory(t,e){const i=e.length;let s=this.memoryStride;if(i>s||this.memory.length<this.capacity*s){s=Math.max(s,i);const t=new Float64Array(this.capacity*s);t.fill(NaN);const e=this.memoryStride,r=this.memory,n=e>0?r.length/e:0;for(let i=0,o=0,a=0;i<n;i++,o+=e,a+=s)for(let i=0;i<e;i++)t[a+i]=r[o+i];this.memory=t,this.memoryStride=s}const r=t*s;for(let t=0;t<s;t++){const s=t<i?e[t]:void 0;this.memory[r+t]="number"==typeof s?s:NaN}}useSizeSnapshot(t){t?this.previousSize===this.size&&(this.previousSize=new Float32Array(this.size)):this.previousSize=this.size}useColorSnapshot(t){t?this.previousColor===this.color&&(this.previousColor=new Float32Array(this.color)):this.previousColor=this.color}ensureQuaternionColumns(){if(this.rotationQuaternion.length>=4*this.capacity)return!1;this.rotationQuaternion=new Float32Array(4*this.capacity),this.angularVelocityQuaternion=new Float32Array(4*this.capacity);for(let t=3;t<this.rotationQuaternion.length;t+=4)this.rotationQuaternion[t]=1,this.angularVelocityQuaternion[t]=1;return!0}swapRows(t,e){if(t===e)return;const i=3*t,s=3*e;Me.swap3(this.position,i,s),Me.swap3(this.previousPosition,i,s),this.previousSize!==this.size&&Me.swap3(this.previousSize,i,s),this.previousVelocity.length>0&&Me.swap3(this.previousVelocity,i,s),Me.swap3(this.velocity,i,s),Me.swap3(this.size,i,s),Me.swap3(this.startSize,i,s);const r=4*t,n=4*e;Me.swap4(this.color,r,n),this.previousColor!==this.color&&Me.swap4(this.previousColor,r,n),Me.swap4(this.startColor,r,n),this.rotationQuaternion.length>0&&(Me.swap4(this.rotationQuaternion,r,n),Me.swap4(this.angularVelocityQuaternion,r,n)),Me.swap3(this.scalars,t*Me.SCALAR_STRIDE,e*Me.SCALAR_STRIDE);const o=this.memoryStride;if(o>0){const i=this.memory;for(let s=0,r=t*o,n=e*o;s<o;s++,r++,n++){const t=i[r];i[r]=i[n],i[n]=t}}Me.swap1(this.rotation,t,e),Me.swap1(this.angularVelocity,t,e),Me.swap1(this.uvTile,t,e),Me.swap1(this.startSpeed,t,e),Me.swap1(this.flip,t,e)}static swap1(t,e,i){const s=t[e];t[e]=t[i],t[i]=s}static growDouble(t,e){const i=new Float64Array(e);return i.set(t),i}static swap3(t,e,i){let s=t[e];t[e]=t[i],t[i]=s,s=t[e+1],t[e+1]=t[i+1],t[i+1]=s,s=t[e+2],t[e+2]=t[i+2],t[i+2]=s}static swap4(t,e,i){Me.swap3(t,e,i);const s=t[e+3];t[e+3]=t[i+3],t[i+3]=s}static grow(t,e){const i=new Float32Array(e);return i.set(t),i}}Me.EMPTY=new Float32Array(0),Me.SCALAR_STRIDE=3,Me.AGE=0,Me.LIFE=1,Me.SPEED_MODIFIER=2;const ze=.5*(Math.sqrt(3)-1),_e=(3-Math.sqrt(3))/6,Pe=1/3,Te=1/6,Ve=(Math.sqrt(5)-1)/4,Oe=(5-Math.sqrt(5))/20,Ce=new Float32Array([1,1,0,-1,1,0,1,-1,0,-1,-1,0,1,0,1,-1,0,1,1,0,-1,-1,0,-1,0,1,1,0,-1,1,0,1,-1,0,-1,-1]),Fe=new Float32Array([0,1,1,1,0,1,1,-1,0,1,-1,1,0,1,-1,-1,0,-1,1,1,0,-1,1,-1,0,-1,-1,1,0,-1,-1,-1,1,0,1,1,1,0,1,-1,1,0,-1,1,1,0,-1,-1,-1,0,1,1,-1,0,1,-1,-1,0,-1,1,-1,0,-1,-1,1,1,0,1,1,1,0,-1,1,-1,0,1,1,-1,0,-1,-1,1,0,1,-1,1,0,-1,-1,-1,0,1,-1,-1,0,-1,1,1,1,0,1,1,-1,0,1,-1,1,0,1,-1,-1,0,-1,1,1,0,-1,1,-1,0,-1,-1,1,0,-1,-1,-1,0]);class Ae{constructor(t=e){const e="function"==typeof t?t:function(t){let e=0,i=0,s=0,r=1;const n=function(){let t=4022871197;return function(e){e=e.toString();for(let i=0;i<e.length;i++){t+=e.charCodeAt(i);let s=.02519603282416938*t;t=s>>>0,s-=t,s*=t,t=s>>>0,s-=t,t+=4294967296*s}return 2.3283064365386963e-10*(t>>>0)}}();e=n(" "),i=n(" "),s=n(" "),e-=n(t),e<0&&(e+=1);i-=n(t),i<0&&(i+=1);s-=n(t),s<0&&(s+=1);return function(){const t=2091639*e+2.3283064365386963e-10*r;return e=i,i=s,s=t-(r=0|t)}}(t);this.p=function(t){const e=new Uint8Array(256);for(let t=0;t<256;t++)e[t]=t;for(let i=0;i<255;i++){const s=i+~~(t()*(256-i)),r=e[i];e[i]=e[s],e[s]=r}return e}(e),this.perm=new Uint8Array(512),this.permMod12=new Uint8Array(512);for(let t=0;t<512;t++)this.perm[t]=this.p[255&t],this.permMod12[t]=this.perm[t]%12}noise2D(t,e){const i=this.permMod12,s=this.perm;let r=0,n=0,o=0;const a=(t+e)*ze,l=Math.floor(t+a),h=Math.floor(e+a),c=(l+h)*_e,u=t-(l-c),d=e-(h-c);let f,p;u>d?(f=1,p=0):(f=0,p=1);const m=u-f+_e,y=d-p+_e,g=u-1+2*_e,v=d-1+2*_e,x=255&l,S=255&h;let b=.5-u*u-d*d;if(b>=0){const t=3*i[x+s[S]];b*=b,r=b*b*(Ce[t]*u+Ce[t+1]*d)}let w=.5-m*m-y*y;if(w>=0){const t=3*i[x+f+s[S+p]];w*=w,n=w*w*(Ce[t]*m+Ce[t+1]*y)}let M=.5-g*g-v*v;if(M>=0){const t=3*i[x+1+s[S+1]];M*=M,o=M*M*(Ce[t]*g+Ce[t+1]*v)}return 70*(r+n+o)}noise3D(t,e,i){const s=this.permMod12,r=this.perm;let n,o,a,l;const h=(t+e+i)*Pe,c=Math.floor(t+h),u=Math.floor(e+h),d=Math.floor(i+h),f=(c+u+d)*Te,p=t-(c-f),m=e-(u-f),y=i-(d-f);let g,v,x,S,b,w;p>=m?m>=y?(g=1,v=0,x=0,S=1,b=1,w=0):p>=y?(g=1,v=0,x=0,S=1,b=0,w=1):(g=0,v=0,x=1,S=1,b=0,w=1):m<y?(g=0,v=0,x=1,S=0,b=1,w=1):p<y?(g=0,v=1,x=0,S=0,b=1,w=1):(g=0,v=1,x=0,S=1,b=1,w=0);const M=p-g+Te,z=m-v+Te,_=y-x+Te,P=p-S+2*Te,T=m-b+2*Te,V=y-w+2*Te,O=p-1+.5,C=m-1+.5,F=y-1+.5,A=255&c,B=255&u,$=255&d;let I=.6-p*p-m*m-y*y;if(I<0)n=0;else{const t=3*s[A+r[B+r[$]]];I*=I,n=I*I*(Ce[t]*p+Ce[t+1]*m+Ce[t+2]*y)}let E=.6-M*M-z*z-_*_;if(E<0)o=0;else{const t=3*s[A+g+r[B+v+r[$+x]]];E*=E,o=E*E*(Ce[t]*M+Ce[t+1]*z+Ce[t+2]*_)}let N=.6-P*P-T*T-V*V;if(N<0)a=0;else{const t=3*s[A+S+r[B+b+r[$+w]]];N*=N,a=N*N*(Ce[t]*P+Ce[t+1]*T+Ce[t+2]*V)}let R=.6-O*O-C*C-F*F;if(R<0)l=0;else{const t=3*s[A+1+r[B+1+r[$+1]]];R*=R,l=R*R*(Ce[t]*O+Ce[t+1]*C+Ce[t+2]*F)}return 32*(n+o+a+l)}noise4D(t,e,i,s){const r=this.perm;let n,o,a,l,h;const c=(t+e+i+s)*Ve,u=Math.floor(t+c),d=Math.floor(e+c),f=Math.floor(i+c),p=Math.floor(s+c),m=(u+d+f+p)*Oe,y=t-(u-m),g=e-(d-m),v=i-(f-m),x=s-(p-m);let S=0,b=0,w=0,M=0;y>g?S++:b++,y>v?S++:w++,y>x?S++:M++,g>v?b++:w++,g>x?b++:M++,v>x?w++:M++;const z=S>=3?1:0,_=b>=3?1:0,P=w>=3?1:0,T=M>=3?1:0,V=S>=2?1:0,O=b>=2?1:0,C=w>=2?1:0,F=M>=2?1:0,A=S>=1?1:0,B=b>=1?1:0,$=w>=1?1:0,I=M>=1?1:0,E=y-z+Oe,N=g-_+Oe,R=v-P+Oe,L=x-T+Oe,D=y-V+2*Oe,U=g-O+2*Oe,q=v-C+2*Oe,k=x-F+2*Oe,J=y-A+3*Oe,Q=g-B+3*Oe,G=v-$+3*Oe,W=x-I+3*Oe,j=y-1+4*Oe,Y=g-1+4*Oe,X=v-1+4*Oe,Z=x-1+4*Oe,H=255&u,K=255&d,tt=255&f,et=255&p;let it=.6-y*y-g*g-v*v-x*x;if(it<0)n=0;else{const t=r[H+r[K+r[tt+r[et]]]]%32*4;it*=it,n=it*it*(Fe[t]*y+Fe[t+1]*g+Fe[t+2]*v+Fe[t+3]*x)}let st=.6-E*E-N*N-R*R-L*L;if(st<0)o=0;else{const t=r[H+z+r[K+_+r[tt+P+r[et+T]]]]%32*4;st*=st,o=st*st*(Fe[t]*E+Fe[t+1]*N+Fe[t+2]*R+Fe[t+3]*L)}let rt=.6-D*D-U*U-q*q-k*k;if(rt<0)a=0;else{const t=r[H+V+r[K+O+r[tt+C+r[et+F]]]]%32*4;rt*=rt,a=rt*rt*(Fe[t]*D+Fe[t+1]*U+Fe[t+2]*q+Fe[t+3]*k)}let nt=.6-J*J-Q*Q-G*G-W*W;if(nt<0)l=0;else{const t=r[H+A+r[K+B+r[tt+$+r[et+I]]]]%32*4;nt*=nt,l=nt*nt*(Fe[t]*J+Fe[t+1]*Q+Fe[t+2]*G+Fe[t+3]*W)}let ot=.6-j*j-Y*Y-X*X-Z*Z;if(ot<0)h=0;else{const t=r[H+1+r[K+1+r[tt+1+r[et+1]]]]%32*4;ot*=ot,h=ot*ot*(Fe[t]*j+Fe[t+1]*Y+Fe[t+2]*X+Fe[t+3]*Z)}return 27*(n+o+a+l+h)}}const Be=100,$e=new Array(Be),Ie=new H,Ee=new Z;function Ne(t){let e=$e[t];return void 0===e&&(e=new Ae(t),$e[t]=e),e}class Re{constructor(t,e,i=new Ct(1),s=new Ct(0),r=new Ct(0),n){this.frequency=t,this.power=e,this.positionAmount=i,this.rotationAmount=s,this.scrollSpeed=r,this.remap=n,this.type="Noise",this.duration=0,this.scrollOffset=0,this.scrollMemory=[],this._frequency=NaN,this._power=NaN,this._positionAmount=NaN,this._rotationAmount=NaN,this.scrollSpeed.startGen(this.scrollMemory)}sample(t,e,i){const s=t.noise2D(0,e),r=this.remap;return void 0===r?s:r.genValue(i,.5*(s+1))}initialize(t){const e="number"==typeof t.rotation;let i=t._noiseState;if(void 0===i)return i={lastPos:new H,lastRot:0,lastRotQ:e?null:new Z,generatorX:Ne(he(0,Be)),generatorY:Ne(he(0,Be)),generatorZ:Ne(he(0,Be)),generatorW:Ne(he(0,Be))},void(t._noiseState=i);i.lastPos.set(0,0,0),i.lastRot=0,e?i.lastRotQ=null:null===i.lastRotQ?i.lastRotQ=new Z:i.lastRotQ.set(0,0,0,1),i.generatorX=Ne(he(0,Be)),i.generatorY=Ne(he(0,Be)),i.generatorZ=Ne(he(0,Be)),i.generatorW=Ne(he(0,Be))}static constantOf(t){return t instanceof Ct?t.value:NaN}update(t,e){const i=t._noiseState;if(void 0===i)return;const s=t.memory,r=t.age/t.life,n=this._frequency,o=n==n?n:this.frequency.genValue(s,r),a=this._power,l=a==a?a:this.power.genValue(s,r),h=this._positionAmount,c=h==h?h:this.positionAmount.genValue(s,r),u=this._rotationAmount,d=u==u?u:this.rotationAmount.genValue(s,r),f=t.age*o+this.scrollOffset;if(c>0){const e=l*c;t.position.sub(i.lastPos),Ie.set(this.sample(i.generatorX,f,s)*e,this.sample(i.generatorY,f,s)*e,this.sample(i.generatorZ,f,s)*e),t.position.add(Ie),i.lastPos.copy(Ie)}if(d>0){const e=l*d;if("number"==typeof t.rotation){const r=this.sample(i.generatorW,f,s)*Math.PI*e;t.rotation=t.rotation-i.lastRot+r,i.lastRot=r}else if(null!==i.lastRotQ){const r=t.rotation;i.lastRotQ.invert(),r.multiply(i.lastRotQ),Ee.set(this.sample(i.generatorX,f,s)*e,this.sample(i.generatorY,f,s)*e,this.sample(i.generatorZ,f,s)*e,this.sample(i.generatorW,f,s)*e).normalize(),r.multiply(Ee),i.lastRotQ.copy(Ee)}}}updateAll(t,e,i){const s=e>0?t[0].store:void 0;if(void 0===s){for(let s=0;s<e;s++){const e=t[s];e.age<e.life&&this.update(e,i)}return}const r=s.position,n=s.rotation,o=s.scalars,a=Me.SCALAR_STRIDE,l=this._frequency,h=this._power,c=this._positionAmount,u=this._rotationAmount;for(let i=0,s=0,d=0;i<e;i++,s+=3,d+=a){const e=o[d],a=o[d+1];if(e>=a)continue;const f=t[i],p=f._noiseState;if(void 0===p)continue;const m=f.memory,y=e/a,g=l==l?l:this.frequency.genValue(m,y),v=h==h?h:this.power.genValue(m,y),x=c==c?c:this.positionAmount.genValue(m,y),S=u==u?u:this.rotationAmount.genValue(m,y),b=e*g+this.scrollOffset;if(x>0){const t=v*x,e=p.lastPos,i=this.sample(p.generatorX,b,m)*t,n=this.sample(p.generatorY,b,m)*t,o=this.sample(p.generatorZ,b,m)*t;r[s]=Math.fround(r[s]-e.x)+i,r[s+1]=Math.fround(r[s+1]-e.y)+n,r[s+2]=Math.fround(r[s+2]-e.z)+o,e.set(i,n,o)}if(S>0){const t=v*S;if("number"==typeof f.rotation){const e=this.sample(p.generatorW,b,m)*Math.PI*t;n[i]=n[i]-p.lastRot+e,p.lastRot=e}else if(null!==p.lastRotQ){const e=f.rotation;p.lastRotQ.invert(),e.multiply(p.lastRotQ),Ee.set(this.sample(p.generatorX,b,m)*t,this.sample(p.generatorY,b,m)*t,this.sample(p.generatorZ,b,m)*t,this.sample(p.generatorW,b,m)*t).normalize(),e.multiply(Ee),p.lastRotQ.copy(Ee)}}}}toJSON(){return{type:this.type,frequency:this.frequency.toJSON(),power:this.power.toJSON(),positionAmount:this.positionAmount.toJSON(),rotationAmount:this.rotationAmount.toJSON(),scrollSpeed:this.scrollSpeed.toJSON(),...void 0!==this.remap?{remap:this.remap.toJSON()}:{}}}frameUpdate(t){this.duration+=t,this.scrollOffset+=this.scrollSpeed.genValue(this.scrollMemory,0)*t,this._frequency=Re.constantOf(this.frequency),this._power=Re.constantOf(this.power),this._positionAmount=Re.constantOf(this.positionAmount),this._rotationAmount=Re.constantOf(this.rotationAmount)}static fromJSON(t){return new Re(It(t.frequency),It(t.power),It(t.positionAmount),It(t.rotationAmount),t.scrollSpeed?It(t.scrollSpeed):new Ct(0),t.remap?It(t.remap):void 0)}clone(){return new Re(this.frequency.clone(),this.power.clone(),this.positionAmount.clone(),this.rotationAmount.clone(),this.scrollSpeed.clone(),this.remap?.clone())}reset(){this.scrollOffset=0}}class Le{constructor(t,e=new H(0,1,0)){this.orbitSpeed=t,this.axis=e,this.type="OrbitOverLife",this.temp=new H,this.rotation=new Z}initialize(t){this.orbitSpeed.startGen(t.memory)}update(t,e){this.temp.copy(t.position).projectOnVector(this.axis),this.rotation.setFromAxisAngle(this.axis,this.orbitSpeed.genValue(t.memory,t.age/t.life)*e),t.position.sub(this.temp),t.position.applyQuaternion(this.rotation),t.position.add(this.temp)}updateAll(t,e,i){const s=this.orbitSpeed,r=this.axis,n=this.temp,o=this.rotation;for(let a=0;a<e;a++){const e=t[a];if(e.age>=e.life)continue;const l=e.position;n.copy(l).projectOnVector(r),o.setFromAxisAngle(r,s.genValue(e.memory,e.age/e.life)*i),l.sub(n),l.applyQuaternion(o),l.add(n)}}frameUpdate(t){}toJSON(){return{type:this.type,orbitSpeed:this.orbitSpeed.toJSON(),axis:[this.axis.x,this.axis.y,this.axis.z]}}static fromJSON(t){return new Le(It(t.orbitSpeed),t.axis?new H(t.axis[0],t.axis[1],t.axis[2]):void 0)}clone(){return new Le(this.orbitSpeed.clone())}reset(){}}class De{constructor(t){this.angularVelocity=t,this.type="Rotation3DOverLife",this.tempQuat=new Z}initialize(t){t.rotation instanceof Z&&(t.angularVelocity=new Z,this.angularVelocity.startGen(t.memory))}update(t,e){if(t.rotation instanceof Z){this.angularVelocity.genValue(t.memory,this.tempQuat,e,t.age/t.life),t.rotation.multiply(this.tempQuat);const i=t.angularVelocity;i instanceof Z&&i.copy(this.tempQuat)}}toJSON(){return{type:this.type,angularVelocity:this.angularVelocity.toJSON()}}static fromJSON(t){return new De(Ht(t.angularVelocity))}frameUpdate(t){}clone(){return new De(this.angularVelocity.clone())}reset(){}}class Ue{constructor(t,e){this.angularVelocity=t,this.speedRange=e,this.type="RotationBySpeed",this.tempQuat=new Z}initialize(t){"number"==typeof t.rotation&&this.angularVelocity.startGen(t.memory)}update(t,e){if("number"==typeof t.rotation){const i=(t.startSpeed-this.speedRange.a)/(this.speedRange.b-this.speedRange.a),s=this.angularVelocity.genValue(t.memory,i);t.rotation+=e*s,t.angularVelocity=s}}toJSON(){return{type:this.type,angularVelocity:this.angularVelocity.toJSON(),speedRange:this.speedRange.toJSON()}}static fromJSON(t){return new Ue(It(t.angularVelocity),Ft.fromJSON(t.speedRange))}frameUpdate(t){}clone(){return new Ue(this.angularVelocity.clone(),this.speedRange.clone())}reset(){}}class qe{constructor(t){this.angularVelocity=t,this.type="RotationOverLife",this.tempQuat=new Z}initialize(t){"number"==typeof t.rotation?this.angularVelocity.startGen(t.memory):t.rotation instanceof Z&&(this.angularVelocity.startGen(t.memory),t.angularVelocity instanceof Z||(t.angularVelocity=new Z))}update(t,e){if("number"==typeof t.rotation){const i=this.angularVelocity.genValue(t.memory,t.age/t.life);t.rotation+=e*i,t.angularVelocity=i}else if(t.rotation instanceof Z){const i=this.angularVelocity.genValue(t.memory,t.age/t.life);this.turnAboutZ(t,t.rotation,i*e)}}updateAll(t,e,i){const s=this.angularVelocity;for(let r=0;r<e;r++){const e=t[r];if(e.age>=e.life)continue;const n=e.rotation;if("number"==typeof n){const t=s.genValue(e.memory,e.age/e.life);e.rotation=n+i*t,e.angularVelocity=t}else if(n instanceof Z){const t=s.genValue(e.memory,e.age/e.life);this.turnAboutZ(e,n,t*i)}}}turnAboutZ(t,e,i){const s=this.tempQuat.setFromAxisAngle(fe,i);e.multiply(s);const r=t.angularVelocity;r instanceof Z&&r.copy(s)}toJSON(){return{type:this.type,angularVelocity:this.angularVelocity.toJSON()}}static fromJSON(t){return new qe(It(t.angularVelocity))}frameUpdate(t){this.angularVelocity.refreshTable?.()}clone(){return new qe(this.angularVelocity.clone())}reset(){}}class ke{initialize(t){this.size.startGen(t.memory)}constructor(t,e){this.size=t,this.speedRange=e,this.type="SizeBySpeed"}update(t){const e=(t.startSpeed-this.speedRange.a)/(this.speedRange.b-this.speedRange.a);this.size instanceof Kt?this.size.genValue(t.memory,t.size,e).multiply(t.startSize):t.size.copy(t.startSize).multiplyScalar(this.size.genValue(t.memory,e))}toJSON(){return{type:this.type,size:this.size.toJSON(),speedRange:this.speedRange.toJSON()}}static fromJSON(t){return new ke(ee(t.size),Ft.fromJSON(t.speedRange))}frameUpdate(t){}clone(){return new ke(this.size.clone(),this.speedRange.clone())}reset(){}}class Je{constructor(t){this.type="SizeOverLife",this._sizeIsVector3=!1,this.size=t}get size(){return this._size}set size(t){this._size=t,this._sizeIsVector3=t instanceof Kt}initialize(t){this._size.startGen(t.memory)}update(t){const e=t.age/t.life;if(this._sizeIsVector3)this._size.genValue(t.memory,t.size,e).multiply(t.startSize);else{const i=this._size.genValue(t.memory,e),s=t.size,r=t.startSize;s.x=r.x*i,s.y=r.y*i,s.z=r.z*i}}updateAll(t,e,i){if(this._sizeIsVector3){const i=this._size;for(let s=0;s<e;s++){const e=t[s];e.age>=e.life||i.genValue(e.memory,e.size,e.age/e.life).multiply(e.startSize)}return}const s=this._size;for(let i=0;i<e;i++){const e=t[i];if(e.age>=e.life)continue;const r=s.genValue(e.memory,e.age/e.life),n=e.size,o=e.startSize;n.x=o.x*r,n.y=o.y*r,n.z=o.z*r}}toJSON(){return{type:this.type,size:this.size.toJSON()}}static fromJSON(t){return new Je(ee(t.size))}frameUpdate(t){this._size.refreshTable?.()}clone(){return new Je(this.size.clone())}reset(){}}class Qe{initialize(t){this.speed.startGen(t.memory)}constructor(t){this.speed=t,this.type="SpeedOverLife"}update(t){t.speedModifier=this.speed.genValue(t.memory,t.age/t.life)}updateAll(t,e,i){const s=this.speed;for(let i=0;i<e;i++){const e=t[i];e.age>=e.life||(e.speedModifier=s.genValue(e.memory,e.age/e.life))}}toJSON(){return{type:this.type,speed:this.speed.toJSON()}}static fromJSON(t){return new Qe(It(t.speed))}frameUpdate(t){this.speed.refreshTable?.()}clone(){return new Qe(this.speed.clone())}reset(){}}class Ge{constructor(t,e,i,s){this.scale=t,this.octaves=e,this.velocityMultiplier=i,this.timeScale=s,this.type="TurbulenceField",this.generator=new Ae(S),this.timeOffset=new H,this.temp=new H,this.temp2=new H,this.timeOffset.x=S()/this.scale.x*this.timeScale.x,this.timeOffset.y=S()/this.scale.y*this.timeScale.y,this.timeOffset.z=S()/this.scale.z*this.timeScale.z}initialize(t){}update(t,e){const i=t.position.x/this.scale.x,s=t.position.y/this.scale.y,r=t.position.z/this.scale.z;this.temp.set(0,0,0);let n=1;for(let t=0;t<this.octaves;t++)this.temp2.set(this.generator.noise4D(i*n,s*n,r*n,this.timeOffset.x*n)/n,this.generator.noise4D(i*n,s*n,r*n,this.timeOffset.y*n)/n,this.generator.noise4D(i*n,s*n,r*n,this.timeOffset.z*n)/n),this.temp.add(this.temp2),n*=2;this.temp.multiply(this.velocityMultiplier),t.velocity.addScaledVector(this.temp,e)}updateAll(t,e,i){const s=e>0?t[0].store:void 0;if(void 0===s){for(let s=0;s<e;s++){const e=t[s];e.age<e.life&&this.update(e,i)}return}const r=s.position,n=s.velocity,o=s.scalars,a=Me.SCALAR_STRIDE,l=this.generator,h=this.octaves,c=1/this.scale.x,u=1/this.scale.y,d=1/this.scale.z,f=this.velocityMultiplier.x*i,p=this.velocityMultiplier.y*i,m=this.velocityMultiplier.z*i,y=this.timeOffset.x,g=this.timeOffset.y,v=this.timeOffset.z;for(let t=0,i=0,s=0;t<e;t++,i+=3,s+=a){if(o[s]>=o[s+1])continue;const t=r[i]*c,e=r[i+1]*u,a=r[i+2]*d;let x=0,S=0,b=0,w=1;for(let i=0;i<h;i++){const i=t*w,s=e*w,r=a*w;x+=l.noise4D(i,s,r,y*w)/w,S+=l.noise4D(i,s,r,g*w)/w,b+=l.noise4D(i,s,r,v*w)/w,w*=2}n[i]+=x*f,n[i+1]+=S*p,n[i+2]+=b*m}}toJSON(){return{type:this.type,scale:[this.scale.x,this.scale.y,this.scale.z],octaves:this.octaves,velocityMultiplier:[this.velocityMultiplier.x,this.velocityMultiplier.y,this.velocityMultiplier.z],timeScale:[this.timeScale.x,this.timeScale.y,this.timeScale.z]}}frameUpdate(t){this.timeOffset.x+=t*this.timeScale.x,this.timeOffset.y+=t*this.timeScale.y,this.timeOffset.z+=t*this.timeScale.z}static fromJSON(t){return new Ge(new H(t.scale[0],t.scale[1],t.scale[2]),t.octaves,new H(t.velocityMultiplier[0],t.velocityMultiplier[1],t.velocityMultiplier[2]),new H(t.timeScale[0],t.timeScale[1],t.timeScale[2]))}clone(){return new Ge(this.scale.clone(),this.octaves,this.velocityMultiplier.clone(),this.timeScale.clone())}reset(){}}const We=new H(1,0,0),je=new H(0,1,0),Ye=new H(0,0,1);class Xe{constructor(t=new Ct(0),e=new Ct(0),i=new Ct(0),s=new Ct(0),r=new Ct(0),n=new Ct(0),o="local",a=new Ct(0),l=new H){this.linearX=t,this.linearY=e,this.linearZ=i,this.orbitalX=s,this.orbitalY=r,this.orbitalZ=n,this.space=o,this.radial=a,this.orbitalOffset=l,this.type="VelocityOverLife",this._temp=new H,this._tempEmitterPos=new H,this._tempQ=new Z,this._tempQInv=new Z,this._tempScale=new H(1,1,1),this._tempScaleInv=new H(1,1,1),this._tempRot=new Z,this._axisX=new H(1,0,0),this._axisY=new H(0,1,0),this._axisZ=new H(0,0,1),this._center=new H}initialize(t,e){this.ps=e,this.linearX.startGen(t.memory),this.linearY.startGen(t.memory),this.linearZ.startGen(t.memory),this.orbitalX.startGen(t.memory),this.orbitalY.startGen(t.memory),this.orbitalZ.startGen(t.memory),this.radial.startGen(t.memory)}frameUpdate(t){this.ps&&(this.ps.emitter.matrixWorld.decompose(this._tempEmitterPos,this._tempQ,this._tempScale),this._tempQInv.copy(this._tempQ).invert(),this._tempScaleInv.set(1/this._tempScale.x,1/this._tempScale.y,1/this._tempScale.z),this._axisX.copy(We),this._axisY.copy(je),this._axisZ.copy(Ye),this._center.copy(this.orbitalOffset),this.ps.worldSpace&&(this._axisX.applyQuaternion(this._tempQ),this._axisY.applyQuaternion(this._tempQ),this._axisZ.applyQuaternion(this._tempQ),this._center.multiply(this._tempScale).applyQuaternion(this._tempQ).add(this._tempEmitterPos)))}update(t,e){const i=t.age/t.life;this._temp.set(this.linearX.genValue(t.memory,i),this.linearY.genValue(t.memory,i),this.linearZ.genValue(t.memory,i));const s=void 0!==this.ps&&this.ps.worldSpace;s&&"local"===this.space?this._temp.multiply(this._tempScale).applyQuaternion(this._tempQ):s||"world"!==this.space||this._temp.multiply(this._tempScaleInv).applyQuaternion(this._tempQInv),t.position.addScaledVector(this._temp,e);const r=this.radial.genValue(t.memory,i);if(0!==r){this._temp.copy(t.position).sub(this._center);const i=this._temp.length();i>0&&t.position.addScaledVector(this._temp,r*e/i)}const n=this.orbitalX.genValue(t.memory,i)*e,o=this.orbitalY.genValue(t.memory,i)*e,a=this.orbitalZ.genValue(t.memory,i)*e;0===n&&0===o&&0===a||(t.position.sub(this._center),this.orbit(t.position,this._axisX,n),this.orbit(t.position,this._axisY,o),this.orbit(t.position,this._axisZ,a),t.position.add(this._center))}orbit(t,e,i){0!==i&&(this._tempRot.setFromAxisAngle(e,i),t.applyQuaternion(this._tempRot))}toJSON(){return{type:this.type,linearX:this.linearX.toJSON(),linearY:this.linearY.toJSON(),linearZ:this.linearZ.toJSON(),orbitalX:this.orbitalX.toJSON(),orbitalY:this.orbitalY.toJSON(),orbitalZ:this.orbitalZ.toJSON(),space:this.space,radial:this.radial.toJSON(),orbitalOffset:[this.orbitalOffset.x,this.orbitalOffset.y,this.orbitalOffset.z]}}static fromJSON(t){const e=t=>t?It(t):new Ct(0);return new Xe(e(t.linearX),e(t.linearY),e(t.linearZ),e(t.orbitalX),e(t.orbitalY),e(t.orbitalZ),"world"===t.space?"world":"local",e(t.radial),Array.isArray(t.orbitalOffset)?new H(t.orbitalOffset[0]??0,t.orbitalOffset[1]??0,t.orbitalOffset[2]??0):new H)}clone(){return new Xe(this.linearX.clone(),this.linearY.clone(),this.linearZ.clone(),this.orbitalX.clone(),this.orbitalY.clone(),this.orbitalZ.clone(),this.space,this.radial.clone(),this.orbitalOffset.clone())}reset(){}}class Ze{constructor(t){this.data=t,this.next=null,this.prev=null}hasPrev(){return null!==this.prev}hasNext(){return null!==this.next}}class He{constructor(){this.length=0,this.head=this.tail=null}isEmpty(){return null===this.head}clear(){this.length=0,this.head=this.tail=null}front(){return null===this.head?null:this.head.data}back(){return null===this.tail?null:this.tail.data}dequeue(){if(this.head){const t=this.head.data;return this.head=this.head.next,this.head?this.head.prev=null:this.tail=null,this.length--,t}}pop(){if(this.tail){const t=this.tail.data;return this.tail=this.tail.prev,this.tail?this.tail.next=null:this.head=null,this.length--,t}}queue(t){const e=new Ze(t);this.tail||(this.tail=e),this.head&&(this.head.prev=e,e.next=this.head),this.head=e,this.length++}push(t){const e=new Ze(t);this.head||(this.head=e),this.tail&&(this.tail.next=e,e.prev=this.tail),this.tail=e,this.length++}insertBefore(t,e){const i=new Ze(e);i.next=t,i.prev=t.prev,null!==i.prev&&(i.prev.next=i),i.next.prev=i,t==this.head&&(this.head=i),this.length++}remove(t){if(null===this.head||null===this.tail)return;let e=this.head;for(t===this.head.data&&(this.head=this.head.next),t===this.tail.data&&(this.tail=this.tail.prev);null!==e.next&&e.data!==t;)e=e.next;e.data===t&&(null!==e.prev&&(e.prev.next=e.next),null!==e.next&&(e.next.prev=e.prev),this.length--)}*values(){let t=this.head;for(;null!==t;)yield t.data,t=t.next}}class Ke{get startSpeed(){return this.store.startSpeed[this.storeIndex]}set startSpeed(t){this.store.startSpeed[this.storeIndex]=t}get age(){return this.scalars[this.scalarOffset]}set age(t){this.scalars[this.scalarOffset]=t}get life(){return this.scalars[this.scalarOffset+1]}set life(t){this.scalars[this.scalarOffset+1]=t}get speedModifier(){return this.scalars[this.scalarOffset+2]}set speedModifier(t){this.scalars[this.scalarOffset+2]=t}get angularVelocity(){const t=this.angularVelocityQuaternion;return void 0!==t?t:this.store.angularVelocity[this.storeIndex]}set angularVelocity(t){if("number"==typeof t)this.angularVelocityQuaternion=void 0,this.store.angularVelocity[this.storeIndex]=t;else if(void 0===t)this.angularVelocityQuaternion=void 0,this.store.angularVelocity[this.storeIndex]=0;else{let e=this.angularVelocityQuaternion;void 0===e&&(this.store.ensureQuaternionColumns(),e=new gt(this.store.angularVelocityQuaternion,4*this.storeIndex),this.angularVelocityQuaternion=e),e!==t&&e.copy(t)}}get rotation(){const t=this.rotationQuaternion;return void 0!==t?t:this.store.rotation[this.storeIndex]}set rotation(t){if("number"==typeof t)this.rotationQuaternion=void 0,this.store.rotation[this.storeIndex]=t;else{let e=this.rotationQuaternion;void 0===e&&(this.store.ensureQuaternionColumns(),e=new gt(this.store.rotationQuaternion,4*this.storeIndex),this.rotationQuaternion=e),e!==t&&e.copy(t)}}get uvTile(){return this.store.uvTile[this.storeIndex]}set uvTile(t){this.store.uvTile[this.storeIndex]=t}get flip(){return this.store.flip[this.storeIndex]}set flip(t){this.store.flip[this.storeIndex]=t}constructor(t=new Me(1),e=0){this.rotationQuaternion=void 0,this.angularVelocityQuaternion=void 0,this.memory=[],this.store=t,this.storeIndex=e;const i=3*e,s=4*e;this.position=new bt(t.position,i),this.previousPosition=new bt(t.previousPosition,i),this.previousVelocity=new bt(t.previousVelocity,i),this.velocity=new bt(t.velocity,i),this.size=new bt(t.size,i),this.startSize=new bt(t.startSize,i),this.color=new _t(t.color,s),this.startColor=new _t(t.startColor,s),this.scalars=t.scalars,this.scalarOffset=e*Me.SCALAR_STRIDE,this.size.set(1,1,1),this.startSize.set(1,1,1),this.life=1,this.speedModifier=1}setStoreIndex(t){this.storeIndex=t,this.rebind()}rebind(){const t=this.store,e=3*this.storeIndex,i=4*this.storeIndex;this.position.bind(t.position,e),this.previousPosition.bind(t.previousPosition,e),this.previousVelocity.bind(t.previousVelocity,e),this.velocity.bind(t.velocity,e),this.size.bind(t.size,e),this.startSize.bind(t.startSize,e),this.color.bind(t.color,i),this.startColor.bind(t.startColor,i),this.rotationQuaternion?.bind(t.rotationQuaternion,i),this.angularVelocityQuaternion?.bind(t.angularVelocityQuaternion,i),this.scalars=t.scalars,this.scalarOffset=this.storeIndex*Me.SCALAR_STRIDE}get died(){return this.age>=this.life}reset(){this.memory.length=0}}const ti=new Float32Array(0);class ei{get startSpeed(){return this.store.startSpeed[this.storeIndex]}set startSpeed(t){this.store.startSpeed[this.storeIndex]=t}get age(){return this.scalars[this.scalarOffset]}set age(t){this.scalars[this.scalarOffset]=t}get life(){return this.scalars[this.scalarOffset+1]}set life(t){this.scalars[this.scalarOffset+1]=t}get speedModifier(){return this.scalars[this.scalarOffset+2]}set speedModifier(t){this.scalars[this.scalarOffset+2]=t}get previous(){return this._previous??(this._previous=new He)}set previous(t){this._previous=t}get uvTile(){return this.store.uvTile[this.storeIndex]}set uvTile(t){this.store.uvTile[this.storeIndex]=t}constructor(t=new Me(1),e=0){this.length=100,this._previous=void 0,this.historyPositions=ti,this.historySizes=ti,this.historyBaseSizes=ti,this.headWidthScale=1,this.historyColors=ti,this.historyCapacity=0,this.historyHead=0,this.historyCount=0,this.memory=[],this.store=t,this.storeIndex=e;const i=3*e,s=4*e;this.position=new bt(t.position,i),this.previousPosition=new bt(t.previousPosition,i),this.previousVelocity=new bt(t.previousVelocity,i),this.velocity=new bt(t.velocity,i),this.size=new bt(t.size,i),this.startSize=new bt(t.startSize,i),this.color=new _t(t.color,s),this.startColor=new _t(t.startColor,s),this.scalars=t.scalars,this.scalarOffset=e*Me.SCALAR_STRIDE,this.size.set(1,1,1),this.startSize.set(1,1,1),this.life=1,this.speedModifier=1}setStoreIndex(t){this.storeIndex=t,this.rebind()}rebind(){const t=this.store,e=3*this.storeIndex,i=4*this.storeIndex;this.position.bind(t.position,e),this.previousPosition.bind(t.previousPosition,e),this.previousVelocity.bind(t.previousVelocity,e),this.velocity.bind(t.velocity,e),this.size.bind(t.size,e),this.startSize.bind(t.startSize,e),this.color.bind(t.color,i),this.startColor.bind(t.startColor,i),this.scalars=t.scalars,this.scalarOffset=this.storeIndex*Me.SCALAR_STRIDE}ensureHistoryCapacity(t){this.historyCapacity!==t&&(this.historyCapacity=t,this.historyPositions=new Float32Array(3*t),this.historySizes=new Float32Array(t),this.historyBaseSizes=new Float32Array(t),this.historyColors=new Float32Array(4*t),this.historyHead=0,this.historyCount=0)}resetHistory(){this.historyHead=0,this.historyCount=0}getHistoryIndex(t){const e=this.historyCapacity;return(this.historyHead-this.historyCount+e+t)%e}update(){0===this.historyCapacity&&this.ensureHistoryCapacity(Math.max(1,Math.ceil(this.length)));const t=this.historyCapacity,e=this.store,i=this.storeIndex,s=i*Me.SCALAR_STRIDE;if(e.scalars[s+Me.AGE]>e.scalars[s+Me.LIFE])return void(this.historyCount>0&&this.historyCount--);const r=this.historyHead,n=3*r,o=this.historyPositions,a=e.position,l=3*i;o[n]=a[l],o[n+1]=a[l+1],o[n+2]=a[l+2];const h=e.size[l];this.historyBaseSizes[r]=h,this.historySizes[r]=h*this.headWidthScale;const c=4*r,u=this.historyColors,d=e.color,f=4*i;u[c]=d[f],u[c+1]=d[f+1],u[c+2]=d[f+2],u[c+3]=d[f+3],this.historyHead=(r+1)%t,this.historyCount<t&&this.historyCount++}get died(){return this.age>=this.life}reset(){this.memory.length=0,this.headWidthScale=1,this.resetHistory()}}class ii{initialize(t){this.width.startGen(t.memory)}constructor(t,e=!1){this.width=t,this.absolute=e,this.type="WidthOverLength"}update(t){if(!(t instanceof ei))return;const e=t.memory;t.headWidthScale=this.absolute?1:this.width.genValue(e,0);const i=t.historyCount;if(0===i)return;const s=t.historyCapacity,r=t.historySizes,n=t.historyBaseSizes,o=1/t.length,a=this.absolute;let l=t.getHistoryIndex(0);for(let t=0;t<i;t++){const h=this.width.genValue(e,(i-t)*o);r[l]=a?h:n[l]*h,l++,l===s&&(l=0)}}frameUpdate(t){}toJSON(){return{type:this.type,width:this.width.toJSON(),absolute:this.absolute}}static fromJSON(t){return new ii(It(t.width),t.absolute??!0)}clone(){return new ii(this.width.clone(),this.absolute)}reset(){}}const si={ApplyForce:{type:"ApplyForce",constructor:ie,params:[["direction",["vec3"]],["magnitude",["value"]]],loadJSON:ie.fromJSON},Noise:{type:"Noise",constructor:Re,params:[["frequency",["value"]],["power",["value"]],["positionAmount",["value"]],["rotationAmount",["value"]]],loadJSON:Re.fromJSON},TurbulenceField:{type:"TurbulenceField",constructor:Ge,params:[["scale",["vec3"]],["octaves",["number"]],["velocityMultiplier",["vec3"]],["timeScale",["vec3"]]],loadJSON:Ge.fromJSON},GravityForce:{type:"GravityForce",constructor:Se,params:[["center",["vec3"]],["magnitude",["number"]]],loadJSON:Se.fromJSON},ColorOverLife:{type:"ColorOverLife",constructor:le,params:[["color",["colorFunc"]]],loadJSON:le.fromJSON},RotationOverLife:{type:"RotationOverLife",constructor:qe,params:[["angularVelocity",["value","valueFunc"]]],loadJSON:qe.fromJSON},Rotation3DOverLife:{type:"Rotation3DOverLife",constructor:De,params:[["angularVelocity",["rotationFunc"]]],loadJSON:De.fromJSON},SizeOverLife:{type:"SizeOverLife",constructor:Je,params:[["size",["value","valueFunc","vec3Func"]]],loadJSON:Je.fromJSON},ColorBySpeed:{type:"ColorBySpeed",constructor:ae,params:[["color",["colorFunc"]],["speedRange",["range"]]],loadJSON:ae.fromJSON},RotationBySpeed:{type:"RotationBySpeed",constructor:Ue,params:[["angularVelocity",["value","valueFunc"]],["speedRange",["range"]]],loadJSON:Ue.fromJSON},SizeBySpeed:{type:"SizeBySpeed",constructor:ke,params:[["size",["value","valueFunc","vec3Func"]],["speedRange",["range"]]],loadJSON:ke.fromJSON},SpeedOverLife:{type:"SpeedOverLife",constructor:Qe,params:[["speed",["value","valueFunc"]]],loadJSON:Qe.fromJSON},FrameOverLife:{type:"FrameOverLife",constructor:xe,params:[["frame",["value","valueFunc"]]],loadJSON:xe.fromJSON},ForceOverLife:{type:"ForceOverLife",constructor:ve,params:[["x",["value","valueFunc"]],["y",["value","valueFunc"]],["z",["value","valueFunc"]]],loadJSON:ve.fromJSON},VelocityOverLife:{type:"VelocityOverLife",constructor:Xe,params:[["linearX",["value","valueFunc"]],["linearY",["value","valueFunc"]],["linearZ",["value","valueFunc"]],["orbitalX",["value","valueFunc"]],["orbitalY",["value","valueFunc"]],["orbitalZ",["value","valueFunc"]],["space",["string"]]],loadJSON:Xe.fromJSON},InheritVelocity:{type:"InheritVelocity",constructor:be,params:[["multiplier",["value","valueFunc"]],["mode",["string"]]],loadJSON:be.fromJSON},OrbitOverLife:{type:"OrbitOverLife",constructor:Le,params:[["orbitSpeed",["value","valueFunc"]],["axis",["vec3"]]],loadJSON:Le.fromJSON},WidthOverLength:{type:"WidthOverLength",constructor:ii,params:[["width",["value","valueFunc"]]],loadJSON:ii.fromJSON},ChangeEmitDirection:{type:"ChangeEmitDirection",constructor:oe,params:[["angle",["value"]]],loadJSON:oe.fromJSON},ApplySequences:{type:"ApplySequences",constructor:ne,params:[["delay",["number"]]],loadJSON:ne.fromJSON},EmitSubParticleSystem:{type:"EmitSubParticleSystem",constructor:ge,params:[["particleSystem",["self"]],["useVelocityAsBasis",["boolean"]],["subParticleSystem",["particleSystem"]],["mode",["number"]],["emitProbability",["number"]]],loadJSON:ge.fromJSON},LimitSpeedOverLife:{type:"LimitSpeedOverLife",constructor:we,params:[["speed",["value","valueFunc"]],["dampen",["number"]]],loadJSON:we.fromJSON},ApplyCollision:{type:"ApplyCollision",constructor:Ot,params:[["bounce",["number"]]],loadJSON:Ot.fromJSON}};function ri(t,e){return si[t.type]?si[t.type].loadJSON(t,e):null}const ni={PiecewiseBezier:$t,Vector3Function:Kt,Quaternion:Z,ConstantValue:Ct,Gradient:Jt,Vector4View:_t,AxisAngleGenerator:Et,IntervalValue:Ft,ColorRange:Ut};function oi(t,e){return`const ${t} = ${e};\n const ${t}_tbl = ${t} instanceof deps.PiecewiseBezier ? ${t}.sampledTable() : null;\n const ${t}_last = ${t}_tbl !== null ? ${t}_tbl.length - 1 : 0;\n const ${t}_const = ${t} instanceof deps.ConstantValue;\n const ${t}_cv = ${t}_const ? ${t}.value : 0;\n const ${t}_iv = ${t} instanceof deps.IntervalValue;\n const ${t}_slot = ${t}_iv ? ${t}.indexCount : -1;\n const ${t}_col = ${t}_slot >= 0 && ${t}_slot < ms;\n const ${t}_a = ${t}_iv ? ${t}.a : 0, ${t}_b = ${t}_iv ? ${t}.b : 0;`}function ai(t,e,i){return`let ${e};\n if (${t}_tbl !== null) {\n const tt = ${i};\n if (tt <= 0) ${e} = ${t}_tbl[0];\n else if (tt >= 1) ${e} = ${t}_tbl[${t}_last];\n else {\n const x = tt * ${t}_last;\n const ix = x | 0;\n const v0 = ${t}_tbl[ix];\n ${e} = v0 + (${t}_tbl[ix + 1] - v0) * (x - ix);\n }\n } else if (${t}_const) ${e} = ${t}_cv;\n else if (${t}_iv) {\n // The particle's own sample, from the memory column when it holds it.\n let r = ${t}_col ? mem[row * ms + ${t}_slot] : NaN;\n if (r !== r) r = p.memory[${t}_slot];\n ${e} = (1 - r) * ${t}_a + r * ${t}_b;\n } else ${e} = ${t}.genValue(p.memory, ${i});`}function li(t,e){return`const ${t} = ${e};\n const ${t}_tbl = ${t} instanceof deps.Gradient ? ${t}.sampledTable() : null;\n const ${t}_last = ${t}_tbl !== null ? ${t}_tbl.length / 4 - 1 : 0;\n const ${t}_cr = ${t} instanceof deps.ColorRange;\n const ${t}_slot = ${t}_cr ? ${t}.indexCount : -1;\n const ${t}_col = ${t}_slot >= 0 && ${t}_slot < ms;\n // Rounded to float32 as copying the colour into the particle does.\n const ${t}_ax = ${t}_cr ? Math.fround(${t}.a.x) : 0, ${t}_ay = ${t}_cr ? Math.fround(${t}.a.y) : 0;\n const ${t}_az = ${t}_cr ? Math.fround(${t}.a.z) : 0, ${t}_aw = ${t}_cr ? Math.fround(${t}.a.w) : 0;\n const ${t}_bx = ${t}_cr ? ${t}.b.x : 0, ${t}_by = ${t}_cr ? ${t}.b.y : 0;\n const ${t}_bz = ${t}_cr ? ${t}.b.z : 0, ${t}_bw = ${t}_cr ? ${t}.b.w : 0;`}function hi(t,e){return`if (${t}_tbl !== null) {\n const tt = ${e};\n const tbl = ${t}_tbl;\n let r, g, b, a;\n if (tt <= 0) {\n r = tbl[0]; g = tbl[1]; b = tbl[2]; a = tbl[3];\n } else if (tt >= 1) {\n const o = ${t}_last * 4;\n r = tbl[o]; g = tbl[o + 1]; b = tbl[o + 2]; a = tbl[o + 3];\n } else {\n const x = tt * ${t}_last;\n const ix = x | 0;\n const fr = x - ix;\n const o = ix * 4;\n const nx = o + 4;\n r = tbl[o] + (tbl[nx] - tbl[o]) * fr;\n g = tbl[o + 1] + (tbl[nx + 1] - tbl[o + 1]) * fr;\n b = tbl[o + 2] + (tbl[nx + 2] - tbl[o + 2]) * fr;\n a = tbl[o + 3] + (tbl[nx + 3] - tbl[o + 3]) * fr;\n }\n color[o4] = Math.fround(r) * startColor[o4];\n color[o4 + 1] = Math.fround(g) * startColor[o4 + 1];\n color[o4 + 2] = Math.fround(b) * startColor[o4 + 2];\n color[o4 + 3] = Math.fround(a) * startColor[o4 + 3];\n } else if (${t}_cr) {\n let r = ${t}_col ? mem[row * ms + ${t}_slot] : NaN;\n if (r !== r) r = p.memory[${t}_slot];\n color[o4] = Math.fround(${t}_ax + (${t}_bx - ${t}_ax) * r) * startColor[o4];\n color[o4 + 1] = Math.fround(${t}_ay + (${t}_by - ${t}_ay) * r) * startColor[o4 + 1];\n color[o4 + 2] = Math.fround(${t}_az + (${t}_bz - ${t}_az) * r) * startColor[o4 + 2];\n color[o4 + 3] = Math.fround(${t}_aw + (${t}_bw - ${t}_aw) * r) * startColor[o4 + 3];\n } else {\n ${t}.genColor(p.memory, tmpColor, ${e});\n color[o4] = tmpColor.x * startColor[o4];\n color[o4 + 1] = tmpColor.y * startColor[o4 + 1];\n color[o4 + 2] = tmpColor.z * startColor[o4 + 2];\n color[o4 + 3] = tmpColor.w * startColor[o4 + 3];\n }`}function ci(t,e,i,s,r,n,o){return`{\n const cx = 2 * (${r} * ${i} - ${n} * ${e});\n const cy = 2 * (${n} * ${t} - ${s} * ${i});\n const cz = 2 * (${s} * ${e} - ${r} * ${t});\n const nx = ${t} + ${o} * cx + ${r} * cz - ${n} * cy;\n const ny = ${e} + ${o} * cy + ${n} * cx - ${s} * cz;\n ${i} = ${i} + ${o} * cz + ${s} * cy - ${r} * cx;\n ${t} = nx;\n ${e} = ny;\n }`}function ui(t,e){return`const ${t}_q = ${e};\n const ${t}x = ${t}_q.x, ${t}y = ${t}_q.y, ${t}z = ${t}_q.z, ${t}w = ${t}_q.w;`}function di(t,e){return`const ${t}_v = ${e};\n const ${t}x = ${t}_v.x, ${t}y = ${t}_v.y, ${t}z = ${t}_v.z;`}function fi(t,e,i,s){return`{\n const half = ${t} / 2;\n const sn = Math.sin(half);\n const qx = ${e} * sn, qy = ${i} * sn, qz = ${s} * sn, qw = Math.cos(half);\n ${ci("px","py","pz","qx","qy","qz","qw")}\n px = Math.fround(px); py = Math.fround(py); pz = Math.fround(pz);\n }`}function pi(t,e){switch(t.type){case"ColorOverLife":return{setup:li(`g${e}`,`behaviors[${e}].color`),body:`{${hi(`g${e}`,"t")}}`};case"SizeOverLife":return{setup:`const g${e} = behaviors[${e}].size;\n const vec3_${e} = g${e} instanceof deps.Vector3Function;\n ${oi(`sg${e}`,`g${e}`)}`,body:`if (vec3_${e}) {\n g${e}.genValue(p.memory, p.size, t).multiply(p.startSize);\n } else {\n ${ai(`sg${e}`,"v","t")}\n size[o3] = startSize[o3] * v;\n size[o3 + 1] = startSize[o3 + 1] * v;\n size[o3 + 2] = startSize[o3 + 2] * v;\n }`};case"ApplyForce":return{setup:`const b${e} = behaviors[${e}];\n const f${e} = b${e}.magnitudeValue * delta;\n const dx${e} = b${e}.direction.x * f${e};\n const dy${e} = b${e}.direction.y * f${e};\n const dz${e} = b${e}.direction.z * f${e};`,body:`vel[o3] += dx${e}; vel[o3 + 1] += dy${e}; vel[o3 + 2] += dz${e};`};case"RotationOverLife":return{setup:`${oi(`g${e}`,`behaviors[${e}].angularVelocity`)}\n const rotation_${e} = count > 0 ? particles[0].rotation : undefined;\n const angle_${e} = typeof rotation_${e} === 'number';\n const rq${e} = store.rotationQuaternion, aq${e} = store.angularVelocityQuaternion;\n const quat_${e} = !angle_${e} && rq${e}.length > 0 && rotation_${e} instanceof deps.Quaternion;`,body:`if (angle_${e}) {\n ${ai(`g${e}`,"rate","t")}\n rot[row] += delta * rate;\n angVel[row] = rate;\n } else if (quat_${e}) {\n ${ai(`g${e}`,"rate","t")}\n const half = (rate * delta) / 2;\n const qz = Math.sin(half), qw = Math.cos(half);\n const ax = rq${e}[o4], ay = rq${e}[o4 + 1], az = rq${e}[o4 + 2], aw = rq${e}[o4 + 3];\n rq${e}[o4] = ax * qw + ay * qz;\n rq${e}[o4 + 1] = ay * qw - ax * qz;\n rq${e}[o4 + 2] = az * qw + aw * qz;\n rq${e}[o4 + 3] = aw * qw - az * qz;\n aq${e}[o4] = 0; aq${e}[o4 + 1] = 0; aq${e}[o4 + 2] = qz; aq${e}[o4 + 3] = qw;\n }`};case"FrameOverLife":return{setup:`${oi(`g${e}`,`behaviors[${e}].frame`)}\n const b${e} = behaviors[${e}];\n const plain${e} = typeof b${e}.isPlain !== 'function' || b${e}.isPlain();`,body:`if (plain${e}) {${ai(`g${e}`,"v","t")} uvTile[row] = v;}\n else uvTile[row] = b${e}.frameAt(p, age, t);`};case"SpeedOverLife":return{setup:oi(`g${e}`,`behaviors[${e}].speed`),body:`{${ai(`g${e}`,"v","t")} scalars[s + 2] = v;}`};case"ForceOverLife":return{setup:`const b${e} = behaviors[${e}];\n ${oi(`gx${e}`,`b${e}.x`)}\n ${oi(`gy${e}`,`b${e}.y`)}\n ${oi(`gz${e}`,`b${e}.z`)}\n const local${e} = b${e}.ps !== undefined && !b${e}.ps.worldSpace;\n const ms${e} = !local${e} && b${e}.ps !== undefined ? (b${e}.ps.motionScale ?? 1) : 1;\n ${di(`sc${e}`,`b${e}._tempScale`)}\n ${ui(`q${e}`,`b${e}._tempQ`)}`,body:`{\n ${ai(`gx${e}`,"fx","t")}\n ${ai(`gy${e}`,"fy","t")}\n ${ai(`gz${e}`,"fz","t")}\n if (local${e}) {\n fx *= sc${e}x; fy *= sc${e}y; fz *= sc${e}z;\n ${ci("fx","fy","fz",`q${e}x`,`q${e}y`,`q${e}z`,`q${e}w`)}\n } else if (ms${e} !== 1) {\n fx *= ms${e}; fy *= ms${e}; fz *= ms${e};\n }\n vel[o3] += fx * delta; vel[o3 + 1] += fy * delta; vel[o3 + 2] += fz * delta;}`};case"LimitSpeedOverLife":return{setup:`const b${e} = behaviors[${e}];\n ${oi(`g${e}`,`b${e}.speed`)}\n const dampen${e} = b${e}.dampen * delta * 20;\n const ms${e} = typeof b${e}.motionScale === 'function' ? b${e}.motionScale() : 1;`,body:`{const vx = vel[o3], vy = vel[o3 + 1], vz = vel[o3 + 2];\n const speed = Math.sqrt(vx * vx + vy * vy + vz * vz);\n ${ai(`g${e}`,"limitBase","t")}\n const limit = limitBase * ms${e};\n if (speed > limit) {\n const f = 1 - ((speed - limit) / speed) * dampen${e};\n vel[o3] = vx * f; vel[o3 + 1] = vy * f; vel[o3 + 2] = vz * f;\n }}`};case"GravityForce":return{setup:`const b${e} = behaviors[${e}];\n const cx${e} = b${e}.center.x, cy${e} = b${e}.center.y, cz${e} = b${e}.center.z;\n const gm${e} = b${e}.magnitude * delta;`,body:`{const dx = cx${e} - pos[o3], dy = cy${e} - pos[o3 + 1], dz = cz${e} - pos[o3 + 2];\n const d2 = dx * dx + dy * dy + dz * dz;\n if (d2 > 0) {\n const f = gm${e} / (d2 * Math.sqrt(d2));\n vel[o3] += dx * f; vel[o3 + 1] += dy * f; vel[o3 + 2] += dz * f;\n }}`};case"ColorBySpeed":return{setup:`const b${e} = behaviors[${e}];\n ${li(`g${e}`,`b${e}.color`)}\n const lo${e} = b${e}.speedRange.a;\n const span${e} = b${e}.speedRange.b - lo${e};`,body:`{const ts = (startSpeed[row] - lo${e}) / span${e};\n ${hi(`g${e}`,"ts")}}`};case"SizeBySpeed":return{setup:`const b${e} = behaviors[${e}];\n const g${e} = b${e}.size;\n const lo${e} = b${e}.speedRange.a;\n const span${e} = b${e}.speedRange.b - lo${e};\n const vec3_${e} = g${e} instanceof deps.Vector3Function;\n ${oi(`sg${e}`,`g${e}`)}`,body:`{const ts = (startSpeed[row] - lo${e}) / span${e};\n if (vec3_${e}) {\n g${e}.genValue(p.memory, p.size, ts).multiply(p.startSize);\n } else {\n ${ai(`sg${e}`,"v","ts")}\n size[o3] = startSize[o3] * v;\n size[o3 + 1] = startSize[o3 + 1] * v;\n size[o3 + 2] = startSize[o3 + 2] * v;\n }}`};case"RotationBySpeed":return{setup:`const b${e} = behaviors[${e}];\n ${oi(`g${e}`,`b${e}.angularVelocity`)}\n const lo${e} = b${e}.speedRange.a;\n const span${e} = b${e}.speedRange.b - lo${e};\n const angle_${e} = count > 0 && typeof particles[0].rotation === 'number';`,body:`if (angle_${e}) {\n const ts = (startSpeed[row] - lo${e}) / span${e};\n ${ai(`g${e}`,"rate","ts")}\n rot[row] += delta * rate;\n angVel[row] = rate;\n }`};case"OrbitOverLife":return{setup:`const b${e} = behaviors[${e}];\n ${oi(`g${e}`,`b${e}.orbitSpeed`)}\n ${di(`ax${e}`,`b${e}.axis`)}\n const alen${e} = ax${e}x * ax${e}x + ax${e}y * ax${e}y + ax${e}z * ax${e}z;\n const chalf${e} = (g${e}_cv * delta) / 2;\n const csn${e} = Math.sin(chalf${e});\n const cqx${e} = ax${e}x * csn${e}, cqy${e} = ax${e}y * csn${e}, cqz${e} = ax${e}z * csn${e};\n const cqw${e} = Math.cos(chalf${e});`,body:`{let px = pos[o3], py = pos[o3 + 1], pz = pos[o3 + 2];\n let tx = 0, ty = 0, tz = 0;\n if (alen${e} !== 0) {\n const f = (ax${e}x * px + ax${e}y * py + ax${e}z * pz) / alen${e};\n tx = ax${e}x * f; ty = ax${e}y * f; tz = ax${e}z * f;\n }\n let qx, qy, qz, qw;\n if (g${e}_const) {\n qx = cqx${e}; qy = cqy${e}; qz = cqz${e}; qw = cqw${e};\n } else {\n ${ai(`g${e}`,"sp","t")}\n const half = (sp * delta) / 2;\n const sn = Math.sin(half);\n qx = ax${e}x * sn; qy = ax${e}y * sn; qz = ax${e}z * sn; qw = Math.cos(half);\n }\n px = Math.fround(px - tx); py = Math.fround(py - ty); pz = Math.fround(pz - tz);\n ${ci("px","py","pz","qx","qy","qz","qw")}\n pos[o3] = Math.fround(px) + tx;\n pos[o3 + 1] = Math.fround(py) + ty;\n pos[o3 + 2] = Math.fround(pz) + tz;}`};case"Rotation3DOverLife":return{setup:`const b${e} = behaviors[${e}];\n const g${e} = b${e}.angularVelocity;\n const q${e} = b${e}.tempQuat;\n const rq${e} = store.rotationQuaternion, aq${e} = store.angularVelocityQuaternion;\n const quat_${e} = rq${e}.length > 0 && count > 0 && particles[0].rotation instanceof deps.Quaternion;\n const fixed_${e} = g${e} instanceof deps.AxisAngleGenerator && g${e}.angle instanceof deps.ConstantValue;\n let cqx${e} = 0, cqy${e} = 0, cqz${e} = 0, cqw${e} = 1;\n if (fixed_${e}) {\n g${e}.genValue(undefined, q${e}, delta, 0);\n cqx${e} = q${e}.x; cqy${e} = q${e}.y; cqz${e} = q${e}.z; cqw${e} = q${e}.w;\n }`,body:`if (quat_${e}) {\n let qx, qy, qz, qw;\n if (fixed_${e}) {\n qx = cqx${e}; qy = cqy${e}; qz = cqz${e}; qw = cqw${e};\n } else {\n g${e}.genValue(p.memory, q${e}, delta, t);\n qx = q${e}.x; qy = q${e}.y; qz = q${e}.z; qw = q${e}.w;\n }\n const ax = rq${e}[o4], ay = rq${e}[o4 + 1], az = rq${e}[o4 + 2], aw = rq${e}[o4 + 3];\n rq${e}[o4] = ax * qw + aw * qx + ay * qz - az * qy;\n rq${e}[o4 + 1] = ay * qw + aw * qy + az * qx - ax * qz;\n rq${e}[o4 + 2] = az * qw + aw * qz + ax * qy - ay * qx;\n rq${e}[o4 + 3] = aw * qw - ax * qx - ay * qy - az * qz;\n aq${e}[o4] = qx; aq${e}[o4 + 1] = qy; aq${e}[o4 + 2] = qz; aq${e}[o4 + 3] = qw;\n }`};case"VelocityOverLife":return{setup:`const b${e} = behaviors[${e}];\n ${oi(`lx${e}`,`b${e}.linearX`)}\n ${oi(`ly${e}`,`b${e}.linearY`)}\n ${oi(`lz${e}`,`b${e}.linearZ`)}\n ${oi(`ox${e}`,`b${e}.orbitalX`)}\n ${oi(`oy${e}`,`b${e}.orbitalY`)}\n ${oi(`oz${e}`,`b${e}.orbitalZ`)}\n ${di(`aX${e}`,`b${e}._axisX`)}\n ${di(`aY${e}`,`b${e}._axisY`)}\n ${di(`aZ${e}`,`b${e}._axisZ`)}\n ${di(`pv${e}`,`b${e}._tempEmitterPos`)}\n const world${e} = b${e}.ps !== undefined && b${e}.ps.worldSpace;\n const toWorld${e} = world${e} && b${e}.space === 'local';\n const convert${e} = toWorld${e} || (!world${e} && b${e}.space === 'world');\n ${di(`sc${e}`,`toWorld${e} ? b${e}._tempScale : b${e}._tempScaleInv`)}\n ${ui(`q${e}`,`toWorld${e} ? b${e}._tempQ : b${e}._tempQInv`)}`,body:`{\n ${ai(`lx${e}`,"fx","t")}\n ${ai(`ly${e}`,"fy","t")}\n ${ai(`lz${e}`,"fz","t")}\n if (convert${e}) {\n fx *= sc${e}x; fy *= sc${e}y; fz *= sc${e}z;\n ${ci("fx","fy","fz",`q${e}x`,`q${e}y`,`q${e}z`,`q${e}w`)}\n }\n let px = Math.fround(pos[o3] + fx * delta);\n let py = Math.fround(pos[o3 + 1] + fy * delta);\n let pz = Math.fround(pos[o3 + 2] + fz * delta);\n ${ai(`ox${e}`,"rx","t")}\n ${ai(`oy${e}`,"ry","t")}\n ${ai(`oz${e}`,"rz","t")}\n rx *= delta; ry *= delta; rz *= delta;\n if (rx !== 0 || ry !== 0 || rz !== 0) {\n if (world${e}) {\n px = Math.fround(px - pv${e}x); py = Math.fround(py - pv${e}y); pz = Math.fround(pz - pv${e}z);\n }\n if (rx !== 0) ${fi("rx",`aX${e}x`,`aX${e}y`,`aX${e}z`)}\n if (ry !== 0) ${fi("ry",`aY${e}x`,`aY${e}y`,`aY${e}z`)}\n if (rz !== 0) ${fi("rz",`aZ${e}x`,`aZ${e}y`,`aZ${e}z`)}\n if (world${e}) {\n px = Math.fround(px + pv${e}x); py = Math.fround(py + pv${e}y); pz = Math.fround(pz + pv${e}z);\n }\n }\n pos[o3] = px; pos[o3 + 1] = py; pos[o3 + 2] = pz;}`};case"InheritVelocity":return{setup:`const b${e} = behaviors[${e}];\n const ps${e} = b${e}.ps;\n const ev${e} = b${e}.mode === 'current' && ps${e} !== undefined ? ps${e}.emitterVelocity : undefined;\n const active${e} = ev${e} !== undefined;\n let ivx${e} = 0, ivy${e} = 0, ivz${e} = 0;\n if (active${e}) {\n ivx${e} = ev${e}.x; ivy${e} = ev${e}.y; ivz${e} = ev${e}.z;\n if (!ps${e}.worldSpace) {\n ${di(`sc${e}`,`b${e}._tempScaleInv`)}\n ${ui(`q${e}`,`b${e}._tempQInv`)}\n ivx${e} *= sc${e}x; ivy${e} *= sc${e}y; ivz${e} *= sc${e}z;\n ${ci(`ivx${e}`,`ivy${e}`,`ivz${e}`,`q${e}x`,`q${e}y`,`q${e}z`,`q${e}w`)}\n }\n }\n ${oi(`gm${e}`,`b${e}.multiplier`)}`,body:`if (active${e}) {\n ${ai(`gm${e}`,"m","t")}\n const f = m * delta;\n pos[o3] += ivx${e} * f; pos[o3 + 1] += ivy${e} * f; pos[o3 + 2] += ivz${e} * f;\n }`};default:return null}}const mi=new Map;function yi(t,e,i){const s=mi.get(i);if(void 0!==s)return s??void 0;const r=function(t,e){const i=`\n if (count === 0) return;\n if (store === undefined) {\n store = particles[0].store;\n if (store === undefined) {\n // Particles of some other implementation, without columns: run the behaviors as they are.\n for (const k of [${e.join(", ")}]) {\n const b = behaviors[k];\n for (let i = 0; i < count; i++) {\n const p = particles[i];\n if (p.age < p.life) b.update(p, delta);\n }\n }\n return;\n }\n }\n const pos = store.position, vel = store.velocity;\n const size = store.size, startSize = store.startSize;\n const color = store.color, startColor = store.startColor;\n const scalars = store.scalars;\n const rot = store.rotation, angVel = store.angularVelocity;\n const uvTile = store.uvTile, startSpeed = store.startSpeed;\n const mem = store.memory, ms = store.memoryStride;\n ${t.map(t=>t.setup).join("\n")}\n // The system keeps particles[i] on row i. Anything else (a hand-built\n // list) is caught by its ends and read through each particle's row.\n const mapped = particles[0].storeIndex !== 0 || particles[count - 1].storeIndex !== count - 1;\n for (let i = 0; i < count; i++) {\n const p = particles[i];\n const row = mapped ? p.storeIndex : i;\n const s = row * 3;\n const age = scalars[s], life = scalars[s + 1];\n if (age >= life) continue;\n const t = age / life;\n const o3 = row * 3, o4 = row * 4;\n ${t.map(t=>t.body).join("\n")}\n }`;try{return new Function("deps",`const tmpColor = new deps.Vector4View(new Float32Array(4), 0);\n return function (behaviors, particles, count, delta, store) {${i}};`)(ni)}catch(t){return}}(t,e);return mi.set(i,r??null),r}function gi(t){const e=[];let i=[],s=[],r=[],n=0;const o=()=>{if(0===s.length)return;const t=`${n}:${i.map(t=>t.type).join(",")}`,o=yi(s,r,t);if(void 0!==o)e.push({behaviors:i,run:o});else for(const t of i)e.push({behaviors:[t]});i=[],s=[],r=[]};for(let a=0;a<t.length;a++){const l=t[a],h=pi(l,a);null!==h?(0===s.length&&(n=a),i.push(l),s.push(h),r.push(a)):(o(),e.push({behaviors:[l]}))}return o(),e}var vi,xi;exports.BoxEmitFrom=void 0,(vi=exports.BoxEmitFrom||(exports.BoxEmitFrom={}))[vi.Volume=0]="Volume",vi[vi.Shell=1]="Shell",vi[vi.Edge=2]="Edge";class Si{constructor(t={}){this.type="box",this._point=[0,0,0],this.width=t.width??1,this.height=t.height??1,this.depth=t.depth??1,this.emitFrom=t.emitFrom??exports.BoxEmitFrom.Volume,this.boxThickness=t.boxThickness?[...t.boxThickness]:[0,0,0]}update(t,e){}initialize(t,e){const i=this._point;for(let t=0;t<3;t++)i[t]=2*S()-1;const s=Math.floor(3*S())%3;this.emitFrom===exports.BoxEmitFrom.Shell?i[s]=this.onSurface(s):this.emitFrom===exports.BoxEmitFrom.Edge&&(i[(s+1)%3]=this.onSurface((s+1)%3),i[(s+2)%3]=this.onSurface((s+2)%3)),t.position.set(i[0]*this.width/2,i[1]*this.height/2,i[2]*this.depth/2),t.velocity.set(0,0,t.startSpeed)}onSurface(t){const e=S()<.5?-1:1,i=this.boxThickness[t];return i<=0||S()<.5?e:e*(1-2*i*S())}toJSON(){return{type:"box",width:this.width,height:this.height,depth:this.depth,emitFrom:this.emitFrom,boxThickness:[...this.boxThickness]}}static fromJSON(t){return new Si({width:t.width,height:t.height,depth:t.depth,emitFrom:t.emitFrom,boxThickness:Array.isArray(t.boxThickness)?t.boxThickness:void 0})}clone(){return new Si({width:this.width,height:this.height,depth:this.depth,emitFrom:this.emitFrom,boxThickness:this.boxThickness})}}function bi(t,e,i,s){let r;switch(exports.EmitterMode.Random===t?e=S():exports.EmitterMode.Burst===t&&s.isBursting&&(e=s.burstParticleIndex/s.burstParticleCount),r=i>0?Math.floor(e/i)*i:e,t){case exports.EmitterMode.Loop:r%=1;break;case exports.EmitterMode.PingPong:r=Math.abs(r%2-1)}return r}exports.EmitterMode=void 0,(xi=exports.EmitterMode||(exports.EmitterMode={}))[xi.Random=0]="Random",xi[xi.Loop=1]="Loop",xi[xi.PingPong=2]="PingPong",xi[xi.Burst=3]="Burst";class wi{constructor(t,e,i){this.position=t??new H,this.rotation=e??new Z,this.scale=i??new H(1,1,1)}apply(t){t.position.multiply(this.scale).applyQuaternion(this.rotation).add(this.position);const e=t.velocity,i=e.length();if(0===i)return;e.multiply(this.scale).applyQuaternion(this.rotation);const s=e.length();s>0&&e.multiplyScalar(i/s)}isIdentity(){const{position:t,rotation:e,scale:i}=this;return 0===t.x&&0===t.y&&0===t.z&&0===e.x&&0===e.y&&0===e.z&&1===e.w&&1===i.x&&1===i.y&&1===i.z}toJSON(){const t={},{position:e,rotation:i,scale:s}=this;return 0===e.x&&0===e.y&&0===e.z||(t.position=[e.x,e.y,e.z]),0===i.x&&0===i.y&&0===i.z&&1===i.w||(t.rotation=[i.x,i.y,i.z,i.w]),1===s.x&&1===s.y&&1===s.z||(t.scale=[s.x,s.y,s.z]),t}static fromJSON(t){if(!t)return;const{position:e,rotation:i,scale:s}=t;return new wi(e?new H(e[0],e[1],e[2]):void 0,i?new Z(i[0],i[1],i[2],i[3]):void 0,s?new H(s[0],s[1],s[2]):void 0)}static toShapeJSON(t){return t&&!t.isIdentity()?{transform:t.toJSON()}:{}}clone(){return new wi(this.position.clone(),this.rotation.clone(),this.scale.clone())}}class Mi{constructor(t={}){this.type="circle",this.currentValue=0,this.radius=t.radius??10,this.arc=t.arc??2*Math.PI,this.thickness=t.thickness??1,this.mode=t.mode??exports.EmitterMode.Random,this.spread=t.spread??0,this.speed=t.speed??new Ct(1),this.memory=[],this.transform=t.transform}update(t,e){this.currentValue+=this.speed.genValue(this.memory,t.emissionState.time/t.duration)*e}initialize(t,e){const i=bi(this.mode,this.currentValue,this.spread,e),s=X.lerp(1-this.thickness,1,S()),r=i*this.arc;t.position.x=Math.cos(r),t.position.y=Math.sin(r),t.position.z=0,t.velocity.copy(t.position).multiplyScalar(t.startSpeed),t.position.multiplyScalar(this.radius*s),this.transform?.apply(t)}toJSON(){return{type:"circle",radius:this.radius,arc:this.arc,thickness:this.thickness,mode:this.mode,spread:this.spread,speed:this.speed.toJSON(),...wi.toShapeJSON(this.transform)}}static fromJSON(t){return new Mi({radius:t.radius,arc:t.arc,thickness:t.thickness,mode:t.mode,speed:t.speed?It(t.speed):void 0,transform:wi.fromJSON(t.transform),spread:t.spread})}clone(){return new Mi({radius:this.radius,arc:this.arc,thickness:this.thickness,mode:this.mode,speed:this.speed.clone(),transform:this.transform?.clone(),spread:this.spread})}}class zi{constructor(t={}){this.type="cone",this.currentValue=0,this.radius=t.radius??10,this.arc=t.arc??2*Math.PI,this.thickness=t.thickness??1,this.angle=t.angle??Math.PI/6,this.mode=t.mode??exports.EmitterMode.Random,this.spread=t.spread??0,this.speed=t.speed??new Ct(1),this.memory=[],this.transform=t.transform}update(t,e){exports.EmitterMode.Random!=this.mode&&(this.currentValue+=this.speed.genValue(this.memory,t.emissionState.time/t.duration)*e)}initialize(t,e){const i=bi(this.mode,this.currentValue,this.spread,e),s=X.lerp(1-this.thickness,1,S()),r=i*this.arc,n=Math.sqrt(s),o=Math.sin(r),a=Math.cos(r);t.position.x=n*a,t.position.y=n*o,t.position.z=0;const l=this.angle*n;t.velocity.set(0,0,Math.cos(l)).addScaledVector(t.position,Math.sin(l)).multiplyScalar(t.startSpeed),t.position.multiplyScalar(this.radius),this.transform?.apply(t)}toJSON(){return{type:"cone",radius:this.radius,arc:this.arc,thickness:this.thickness,angle:this.angle,mode:this.mode,spread:this.spread,speed:this.speed.toJSON(),...wi.toShapeJSON(this.transform)}}static fromJSON(t){return new zi({radius:t.radius,arc:t.arc,thickness:t.thickness,angle:t.angle,mode:t.mode,speed:t.speed?It(t.speed):void 0,transform:wi.fromJSON(t.transform),spread:t.spread})}clone(){return new zi({radius:this.radius,arc:this.arc,thickness:this.thickness,angle:this.angle,mode:this.mode,speed:this.speed.clone(),transform:this.transform?.clone(),spread:this.spread})}}class _i{constructor(t={}){this.type="donut",this.currentValue=0,this.radius=t.radius??10,this.arc=t.arc??2*Math.PI,this.thickness=t.thickness??1,this.donutRadius=t.donutRadius??.2*this.radius,this.mode=t.mode??exports.EmitterMode.Random,this.spread=t.spread??0,this.speed=t.speed??new Ct(1),this.memory=[],this.transform=t.transform,this._m1=new st}update(t,e){exports.EmitterMode.Random!=this.mode&&(this.currentValue+=this.speed.genValue(this.memory,t.emissionState.time/t.duration)*e)}initialize(t,e){const i=bi(this.mode,this.currentValue,this.spread,e),s=S(),r=X.lerp(1-this.thickness,1,S()),n=i*this.arc,o=s*Math.PI*2,a=Math.sin(n),l=Math.cos(n);if(t.position.x=this.radius*l,t.position.y=this.radius*a,t.position.z=0,t.velocity.z=this.donutRadius*r*Math.sin(o),t.velocity.x=this.donutRadius*r*Math.cos(o)*l,t.velocity.y=this.donutRadius*r*Math.cos(o)*a,t.position.add(t.velocity),t.velocity.normalize().multiplyScalar(t.startSpeed),t.rotation instanceof Z){const e=t.rotation;0===e.x&&0===e.y&&0===e.z&&1===e.w&&(this._m1.lookAt(ue,t.velocity,ce),t.rotation.setFromRotationMatrix(this._m1))}this.transform?.apply(t)}toJSON(){return{type:"donut",radius:this.radius,arc:this.arc,thickness:this.thickness,donutRadius:this.donutRadius,mode:this.mode,spread:this.spread,speed:this.speed.toJSON(),...wi.toShapeJSON(this.transform)}}static fromJSON(t){return new _i({radius:t.radius,arc:t.arc,thickness:t.thickness,donutRadius:t.donutRadius,mode:t.mode,speed:t.speed?It(t.speed):void 0,transform:wi.fromJSON(t.transform),spread:t.spread})}clone(){return new _i({radius:this.radius,arc:this.arc,thickness:this.thickness,donutRadius:this.donutRadius,mode:this.mode,speed:this.speed.clone(),transform:this.transform?.clone(),spread:this.spread})}}class Pi{constructor(t={}){this.type="edge",this.currentValue=0,this.radius=t.radius??1,this.mode=t.mode??exports.EmitterMode.Random,this.spread=t.spread??0,this.speed=t.speed??new Ct(1),this.memory=[]}update(t,e){exports.EmitterMode.Random!=this.mode&&(this.currentValue+=this.speed.genValue(this.memory,t.emissionState.time/t.duration)*e)}initialize(t,e){const i=bi(this.mode,this.currentValue,this.spread,e);t.position.set((2*i-1)*this.radius,0,0),t.velocity.set(0,t.startSpeed,0)}toJSON(){return{type:"edge",radius:this.radius,mode:this.mode,spread:this.spread,speed:this.speed.toJSON()}}static fromJSON(t){return new Pi({radius:t.radius,mode:t.mode,speed:t.speed?It(t.speed):void 0,spread:t.spread})}clone(){return new Pi({radius:this.radius,mode:this.mode,speed:this.speed.clone(),spread:this.spread})}}class Ti{constructor(t={}){this.type="grid",this.width=t.width??1,this.height=t.height??1,this.column=t.column??10,this.row=t.row??10,this.transform=t.transform}initialize(t){const e=Math.floor(S()*this.row),i=Math.floor(S()*this.column);t.position.x=i*this.width/this.column-this.width/2,t.position.y=e*this.height/this.row-this.height/2,t.position.z=0,t.velocity.set(0,0,t.startSpeed),this.transform?.apply(t)}toJSON(){return{type:"grid",width:this.width,height:this.height,column:this.column,row:this.row,...wi.toShapeJSON(this.transform)}}static fromJSON(t){return new Ti({...t,transform:wi.fromJSON(t.transform)})}clone(){return new Ti({width:this.width,height:this.height,column:this.column,row:this.row,transform:this.transform?.clone()})}update(t,e){}}class Vi{constructor(t={}){this.type="hemisphere",this.currentValue=0,this.radius=t.radius??10,this.arc=t.arc??2*Math.PI,this.thickness=t.thickness??1,this.mode=t.mode??exports.EmitterMode.Random,this.spread=t.spread??0,this.speed=t.speed??new Ct(1),this.memory=[],this.transform=t.transform,this._m1=new st}update(t,e){exports.EmitterMode.Random!=this.mode&&(this.currentValue+=this.speed.genValue(this.memory,t.emissionState.time/t.duration)*e)}initialize(t,e){const i=bi(this.mode,this.currentValue,this.spread,e),s=S(),r=X.lerp(1-this.thickness,1,S()),n=i*this.arc,o=Math.acos(s),a=Math.sin(n),l=Math.cos(n),h=Math.sin(o),c=Math.cos(o);if(t.position.x=h*l,t.position.y=h*a,t.position.z=c,t.velocity.copy(t.position).multiplyScalar(t.startSpeed),t.position.multiplyScalar(this.radius*r),t.rotation instanceof Z){const e=t.rotation;0===e.x&&0===e.y&&0===e.z&&1===e.w&&(this._m1.lookAt(ue,t.position,ce),t.rotation.setFromRotationMatrix(this._m1))}this.transform?.apply(t)}toJSON(){return{type:"hemisphere",radius:this.radius,arc:this.arc,thickness:this.thickness,mode:this.mode,spread:this.spread,speed:this.speed.toJSON(),...wi.toShapeJSON(this.transform)}}static fromJSON(t){return new Vi({radius:t.radius,arc:t.arc,thickness:t.thickness,mode:t.mode,speed:t.speed?It(t.speed):void 0,transform:wi.fromJSON(t.transform),spread:t.spread})}clone(){return new Vi({radius:this.radius,arc:this.arc,thickness:this.thickness,mode:this.mode,speed:this.speed.clone(),transform:this.transform?.clone(),spread:this.spread})}}class Oi{constructor(t){this.type="point",this._m1=new st,this.transform=t}update(t,e){}initialize(t){const e=S(),i=S(),s=e*Math.PI*2,r=Math.acos(2*i-1),n=Math.cbrt(S()),o=Math.sin(s),a=Math.cos(s),l=Math.sin(r),h=Math.cos(r);if(t.velocity.x=n*l*a,t.velocity.y=n*l*o,t.velocity.z=n*h,t.velocity.multiplyScalar(t.startSpeed),t.position.setScalar(0),t.rotation instanceof Z){const e=t.rotation;0===e.x&&0===e.y&&0===e.z&&1===e.w&&(this._m1.lookAt(ue,t.velocity,ce),t.rotation.setFromRotationMatrix(this._m1))}this.transform?.apply(t)}toJSON(){return{type:"point",...wi.toShapeJSON(this.transform)}}static fromJSON(t){return new Oi(wi.fromJSON(t?.transform))}clone(){return new Oi(this.transform?.clone())}}class Ci{constructor(t={}){this.type="sphere",this.currentValue=0,this.radius=t.radius??10,this.arc=t.arc??2*Math.PI,this.thickness=t.thickness??1,this.mode=t.mode??exports.EmitterMode.Random,this.spread=t.spread??0,this.speed=t.speed??new Ct(1),this.memory=[],this.transform=t.transform,this._m1=new st}update(t,e){exports.EmitterMode.Random!=this.mode&&(this.currentValue+=this.speed.genValue(this.memory,t.emissionState.time/t.duration)*e)}initialize(t,e){const i=bi(this.mode,this.currentValue,this.spread,e),s=S(),r=X.lerp(1-this.thickness,1,S()),n=i*this.arc,o=Math.acos(2*s-1),a=Math.sin(n),l=Math.cos(n),h=Math.sin(o),c=Math.cos(o);if(t.position.x=h*l,t.position.y=h*a,t.position.z=c,t.velocity.copy(t.position).multiplyScalar(t.startSpeed),t.position.multiplyScalar(this.radius*r),t.rotation instanceof Z){const e=t.rotation;0===e.x&&0===e.y&&0===e.z&&1===e.w&&(this._m1.lookAt(ue,t.position,ce),t.rotation.setFromRotationMatrix(this._m1))}this.transform?.apply(t)}toJSON(){return{type:"sphere",radius:this.radius,arc:this.arc,thickness:this.thickness,mode:this.mode,spread:this.spread,speed:this.speed.toJSON(),...wi.toShapeJSON(this.transform)}}static fromJSON(t){return new Ci({radius:t.radius,arc:t.arc,thickness:t.thickness,mode:t.mode,speed:t.speed?It(t.speed):void 0,transform:wi.fromJSON(t.transform),spread:t.spread})}clone(){return new Ci({radius:this.radius,arc:this.arc,thickness:this.thickness,mode:this.mode,speed:this.speed.clone(),transform:this.transform?.clone(),spread:this.spread})}}class Fi{constructor(t={}){this.type="rectangle",this.currentValue=0,this.width=t.width??10,this.height=t.height??10,this.thickness=t.thickness??1,this.mode=t.mode??exports.EmitterMode.Random,this.spread=t.spread??0,this.speed=t.speed??new Ct(1),this.memory=[],this.transform=t.transform,this._m1=new st}update(t,e){this.currentValue+=this.speed.genValue(this.memory,t.emissionState.time/t.duration)*e}initialize(t,e){const i=bi(this.mode,this.currentValue,this.spread,e);S();const s=i*(2*(this.width+this.height));let r,n;s<this.width?(r=s-this.width/2,n=-this.height/2):s<this.width+this.height?(r=this.width/2,n=s-this.width-this.height/2):s<2*this.width+this.height?(r=this.width/2-(s-this.width-this.height),n=this.height/2):(r=-this.width/2,n=this.height/2-(s-2*this.width-this.height));const o=S(),a=1-this.thickness*o;if(t.position.x=r*a,t.position.y=n*a,t.position.z=0,t.velocity.x=r,t.velocity.y=n,t.velocity.z=0,t.velocity.normalize().multiplyScalar(t.startSpeed),t.rotation instanceof Z){const e=t.rotation;0===e.x&&0===e.y&&0===e.z&&1===e.w&&(this._m1.lookAt(ue,t.velocity,ce),t.rotation.setFromRotationMatrix(this._m1))}this.transform?.apply(t)}toJSON(){return{type:"rectangle",width:this.width,height:this.height,thickness:this.thickness,mode:this.mode,spread:this.spread,speed:this.speed.toJSON(),...wi.toShapeJSON(this.transform)}}static fromJSON(t){return new Fi({width:t.width,height:t.height,thickness:t.thickness,mode:t.mode,speed:t.speed?It(t.speed):void 0,transform:wi.fromJSON(t.transform),spread:t.spread})}clone(){return new Fi({width:this.width,height:this.height,thickness:this.thickness,mode:this.mode,speed:this.speed.clone(),transform:this.transform?.clone(),spread:this.spread})}}const Ai={box:{type:"box",params:[["width",["number"]],["height",["number"]],["depth",["number"]],["emitFrom",["number"]],["boxThickness",["vec3"]]],constructor:Si,loadJSON:Si.fromJSON},circle:{type:"circle",params:[["radius",["number"]],["arc",["radian"]],["thickness",["number"]],["mode",["emitterMode"]],["spread",["number"]],["speed",["valueFunc","value"]]],constructor:Mi,loadJSON:Mi.fromJSON},cone:{type:"cone",params:[["radius",["number"]],["arc",["radian"]],["thickness",["number"]],["angle",["radian"]],["mode",["emitterMode"]],["spread",["number"]],["speed",["valueFunc","value"]]],constructor:zi,loadJSON:zi.fromJSON},donut:{type:"donut",params:[["radius",["number"]],["arc",["radian"]],["thickness",["number"]],["donutRadius",["number"]],["mode",["emitterMode"]],["spread",["number"]],["speed",["valueFunc","value"]]],constructor:_i,loadJSON:_i.fromJSON},edge:{type:"edge",params:[["radius",["number"]],["mode",["emitterMode"]],["spread",["number"]],["speed",["valueFunc","value"]]],constructor:Pi,loadJSON:Pi.fromJSON},point:{type:"point",params:[],constructor:Oi,loadJSON:Oi.fromJSON},sphere:{type:"sphere",params:[["radius",["number"]],["arc",["radian"]],["thickness",["number"]],["angle",["radian"]],["mode",["emitterMode"]],["spread",["number"]],["speed",["valueFunc","value"]]],constructor:Ci,loadJSON:Ci.fromJSON},hemisphere:{type:"hemisphere",params:[["radius",["number"]],["arc",["radian"]],["thickness",["number"]],["angle",["radian"]],["mode",["emitterMode"]],["spread",["number"]],["speed",["valueFunc","value"]]],constructor:Vi,loadJSON:Vi.fromJSON},grid:{type:"grid",params:[["width",["number"]],["height",["number"]],["rows",["number"]],["column",["number"]]],constructor:Ti,loadJSON:Ti.fromJSON},rectangle:{type:"rectangle",params:[["width",["number"]],["height",["number"]],["thickness",["number"]],["mode",["emitterMode"]],["spread",["number"]],["speed",["valueFunc","value"]]],constructor:Fi,loadJSON:Fi.fromJSON}};function Bi(t,e){return Ai[t.type].loadJSON(t,e)}const $i=[];function Ii(t){if(!$i.find(e=>e.id===t.id)){t.initialize();for(const e of t.emitterShapes)Ai[e.type]||(Ai[e.type]=e);for(const e of t.behaviors)si[e.type]||(si[e.type]=e)}}class Ei{get mesh(){return this._mesh}set mesh(e){if(this._mesh=e,!e)return;const i=e.getVerticesData(t.VertexBuffer.PositionKind),s=e.getIndices();if(!i||!s)return;this._positions=new Float32Array(i),this._indices=new Int32Array(s),this._triangleIndexToArea.length=0;let r=0;const n=s.length/3;this._triangleIndexToArea.push(0);const o=new H,a=new H,l=new H;for(let t=0;t<n;t++){const e=s[3*t],n=s[3*t+1],h=s[3*t+2];o.set(i[3*e],i[3*e+1],i[3*e+2]),a.set(i[3*n],i[3*n+1],i[3*n+2]),l.set(i[3*h],i[3*h+1],i[3*h+2]),a.sub(o),l.sub(o);const c=new H;c.crossVectors(a,l),r+=.5*c.length(),this._triangleIndexToArea.push(r)}}constructor(t,e,i){this.type="mesh_surface",this._triangleIndexToArea=[],this._meshReferenceId=e,this.transform=i,t&&(this.mesh=t)}initialize(t){if(!this._positions||!this._indices)return t.position.set(0,0,0),t.velocity.set(0,0,1).multiplyScalar(t.startSpeed),void this.transform?.apply(t);const e=this._triangleIndexToArea.length-1;let i=0,s=e;const r=S()*this._triangleIndexToArea[e];for(;i+1<s;){const t=Math.floor((i+s)/2);r<this._triangleIndexToArea[t]?s=t:i=t}let n=S(),o=S();n+o>1&&(n=1-n,o=1-o);const a=this._indices[3*i],l=this._indices[3*i+1],h=this._indices[3*i+2],c=this._positions[3*a],u=this._positions[3*a+1],d=this._positions[3*a+2],f=this._positions[3*l]-c,p=this._positions[3*l+1]-u,m=this._positions[3*l+2]-d,y=this._positions[3*h]-c,g=this._positions[3*h+1]-u,v=this._positions[3*h+2]-d;t.position.set(c+f*n+y*o,u+p*n+g*o,d+m*n+v*o);const x=p*v-m*g,b=m*y-f*v,w=f*g-p*y,M=Math.sqrt(x*x+b*b+w*w)||1;t.velocity.set(x/M,b/M,w/M).multiplyScalar(t.startSpeed),this.transform?.apply(t)}toJSON(){return{type:"mesh_surface",mesh:this._mesh?this._mesh.uniqueId?.toString():this._meshReferenceId??"",...wi.toShapeJSON(this.transform)}}static fromJSON(t){return new Ei(void 0,t?.mesh,wi.fromJSON(t?.transform))}clone(){return new Ei(this._mesh,this._meshReferenceId,this.transform?.clone())}update(t,e){}}const Ni={id:"babylon.quarks",initialize:()=>{},emitterShapes:[{type:"mesh_surface",params:[["mesh",["mesh"]]],constructor:Ei,loadJSON:t=>Ei.fromJSON(t)}],behaviors:[]};const Ri={};let Li=!1;function Di(){Li||(Ri.tile_pars_vertex="\n#ifdef UV_TILE\n attribute float uvTile;\n uniform vec2 tileCount;\n\n mat3 makeTileTransform(float tileIndex) {\n float col = mod(tileIndex, tileCount.x);\n float row = (tileCount.y - floor(tileIndex / tileCount.x) - 1.0);\n return mat3(\n 1.0 / tileCount.x, 0.0, 0.0,\n 0.0, 1.0 / tileCount.y, 0.0,\n col / tileCount.x, row / tileCount.y, 1.0\n );\n }\n#else\n mat3 makeTileTransform(float tileIndex) {\n return mat3(1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0);\n }\n#endif\n\n#if defined(USE_UV)\n varying vec2 vUv;\n #ifdef TILE_BLEND\n varying vec2 vUvNext;\n varying float vUvBlend;\n #endif\n#endif\n",Ri.tile_vertex="\n#ifdef UV_TILE\n mat3 tileTransform = makeTileTransform(floor(uvTile));\n #ifdef TILE_BLEND\n mat3 nextTileTransform = makeTileTransform(ceil(uvTile));\n vUvBlend = fract(uvTile);\n #endif\n#else\n mat3 tileTransform = makeTileTransform(0.0);\n#endif\n\n#if defined(USE_UV)\n vUv = (tileTransform * vec3(uv, 1.0)).xy;\n #if defined(TILE_BLEND) && defined(UV_TILE)\n vUvNext = (nextTileTransform * vec3(uv, 1.0)).xy;\n #endif\n#endif\n",Ri.tile_pars_fragment="\n#if defined(USE_UV)\n varying vec2 vUv;\n #ifdef TILE_BLEND\n varying vec2 vUvNext;\n varying float vUvBlend;\n #endif\n#endif\n",Ri.tile_fragment="\n#ifdef USE_MAP\n vec4 texelColor = texture2D(map, vUv);\n #ifdef TILE_BLEND\n texelColor = mix(texelColor, texture2D(map, vUvNext), vUvBlend);\n #endif\n diffuseColor *= texelColor;\n#endif\n",Ri.soft_pars_vertex="\n#ifdef SOFT_PARTICLES\n varying vec4 projPosition;\n varying float linearDepth;\n#endif\n",Ri.soft_vertex="\n#ifdef SOFT_PARTICLES\n projPosition = gl_Position;\n linearDepth = -mvPosition.z;\n#endif\n",Ri.soft_pars_fragment="\n#ifdef SOFT_PARTICLES\n uniform sampler2D depthTexture;\n uniform vec4 projParams;\n uniform vec2 softParams;\n\n varying vec4 projPosition;\n varying float linearDepth;\n\n #define SOFT_NEAR_FADE softParams.x\n #define SOFT_INV_FADE_DISTANCE softParams.y\n\n #define zNear projParams.x\n #define zFar projParams.y\n\n float linearize_depth(float d) {\n return (zFar * zNear) / (zFar - d * (zFar - zNear));\n }\n#endif\n",Ri.soft_fragment="\n#ifdef SOFT_PARTICLES\n\n vec2 p2 = projPosition.xy / projPosition.w;\n p2 = 0.5 * p2 + 0.5;\n\n float readDepth = texture2D(depthTexture, p2.xy).r;\n float viewDepth = linearize_depth(readDepth);\n float softParticlesFade = saturate(SOFT_INV_FADE_DISTANCE * ((viewDepth - SOFT_NEAR_FADE) - linearDepth));\n\n gl_FragColor *= softParticlesFade;\n#endif\n",Li=!0)}const Ui="\n#ifdef FOG\nvarying vec3 vFogDistance;\n#endif\n";function qi(t){return`\n#ifdef FOG\n vFogDistance = ${t};\n#endif\n`}const ki="\n#ifdef FOG\nuniform vec4 vFogInfos;\nuniform vec3 vFogColor;\nvarying vec3 vFogDistance;\n\nfloat quarksFogFactor() {\n float fogCoeff = 1.0;\n float fogStart = vFogInfos.y;\n float fogEnd = vFogInfos.z;\n float fogDensity = vFogInfos.w;\n float fogDistance = length(vFogDistance);\n if (vFogInfos.x == 3.0) {\n fogCoeff = (fogEnd - fogDistance) / (fogEnd - fogStart);\n } else if (vFogInfos.x == 1.0) {\n fogCoeff = exp(-fogDistance * fogDensity);\n } else if (vFogInfos.x == 2.0) {\n fogCoeff = exp(-fogDistance * fogDistance * fogDensity * fogDensity);\n }\n return clamp(fogCoeff, 0.0, 1.0);\n}\n#endif\n";function Ji(t){return`\n#ifdef FOG\n {\n float fogFactor = quarksFogFactor();\n#ifdef FOG_ADDITIVE\n ${t} *= fogFactor;\n#else\n ${t} = mix(vFogColor, ${t}, fogFactor);\n#endif\n }\n#endif\n`}const Qi="\n#ifdef FOG\nvarying vFogDistance: vec3f;\n#endif\n";function Gi(t){return`\n#ifdef FOG\n vertexOutputs.vFogDistance = ${t};\n#endif\n`}const Wi="\n#ifdef FOG\nuniform vFogInfos: vec4f;\nuniform vFogColor: vec3f;\nvarying vFogDistance: vec3f;\n\nfn quarksFog(rgb: vec3f, fogDistanceVector: vec3f) -> vec3f {\n var fogCoeff = 1.0;\n let fogStart = uniforms.vFogInfos.y;\n let fogEnd = uniforms.vFogInfos.z;\n let fogDensity = uniforms.vFogInfos.w;\n let fogDistance = length(fogDistanceVector);\n if (uniforms.vFogInfos.x == 3.0) {\n fogCoeff = (fogEnd - fogDistance) / (fogEnd - fogStart);\n } else if (uniforms.vFogInfos.x == 1.0) {\n fogCoeff = exp(-fogDistance * fogDensity);\n } else if (uniforms.vFogInfos.x == 2.0) {\n fogCoeff = exp(-fogDistance * fogDistance * fogDensity * fogDensity);\n }\n let fogFactor = clamp(fogCoeff, 0.0, 1.0);\n#ifdef FOG_ADDITIVE\n return rgb * fogFactor;\n#else\n return mix(uniforms.vFogColor, rgb, fogFactor);\n#endif\n}\n#endif\n";function ji(t){return`\n#ifdef FOG\n ${t} = vec4f(quarksFog(${t}.rgb, fragmentInputs.vFogDistance), ${t}.a);\n#endif\n`}var Yi=`\nattribute vec3 position;\nattribute vec2 uv;\nattribute vec3 normal;\nattribute vec3 offset;\nattribute vec4 color;\nattribute vec3 size;\nattribute vec4 rotation;\nattribute float uvTile;\n\nuniform mat4 world;\nuniform mat4 view;\nuniform mat4 projection;\n\n#ifdef UV_TILE\nuniform float tileCountX;\nuniform float tileCountY;\n#endif\n\nvarying vec2 vUV;\nvarying vec4 vColor;\nvarying vec3 vNormal;\nvarying vec3 vWorldPos;\n\n#ifdef TILE_BLEND\nvarying vec2 vUV2;\nvarying float vTileBlend;\n#endif\n\n#ifdef SOFT_PARTICLES\nvarying vec4 projPosition;\nvarying float linearDepth;\n#endif\n\nvec3 applyQuaternion(vec3 v, vec4 q) {\n vec3 qVec = q.xyz;\n float qW = q.w;\n vec3 t = 2.0 * cross(qVec, v);\n return v + qW * t + cross(qVec, t);\n}\n\n${Ui}\nvoid main() {\n vec3 scaledPosition = position * size;\n vec3 rotatedPosition = applyQuaternion(scaledPosition, rotation);\n vec3 rotatedNormal = normalize(applyQuaternion(normal, rotation));\n vec3 localPos = rotatedPosition + offset;\n\n vec4 worldPos = world * vec4(localPos, 1.0);\n vec4 viewPos = view * worldPos;\n gl_Position = projection * viewPos;\n${qi("viewPos.xyz")}\n\n vWorldPos = worldPos.xyz;\n vNormal = normalize((world * vec4(rotatedNormal, 0.0)).xyz);\n\n#ifdef SOFT_PARTICLES\n projPosition = gl_Position;\n linearDepth = -viewPos.z;\n#endif\n\n#ifdef UV_TILE\n vec2 tc = vec2(tileCountX, tileCountY);\n float baseTile = floor(uvTile);\n float tileU = mod(baseTile, tc.x) / tc.x;\n float tileV = 1.0 - floor(baseTile / tc.x) / tc.y - 1.0 / tc.y;\n vUV = uv / tc + vec2(tileU, tileV);\n #ifdef TILE_BLEND\n float nextTile = ceil(uvTile);\n float nextU = mod(nextTile, tc.x) / tc.x;\n float nextV = 1.0 - floor(nextTile / tc.x) / tc.y - 1.0 / tc.y;\n vUV2 = uv / tc + vec2(nextU, nextV);\n vTileBlend = fract(uvTile);\n #endif\n#else\n vUV = uv;\n#endif\n\n vColor = color;\n}\n`;const Xi="\n#ifdef UV_SCROLL\nuniform vec2 uvScrollOffset;\n#endif\n#ifdef GRADIENT_MAP\nuniform sampler2D gradientMap;\nuniform vec2 gradientMapRange;\n#endif\n#ifdef EROSION\nuniform vec4 erosionParams;\nuniform vec3 erosionEdgeColor;\n#ifdef EROSION_MASK\nuniform sampler2D erosionMask;\n#endif\n\nvec4 quarksErode(vec4 color, float level, float mask) {\n float softness = erosionParams.x;\n float edgeWidth = erosionParams.y;\n // At level 1 the cut sits below the lowest mask value by the soft band\n // and the edge band, so nothing is cut and no edge shows; at level 0 above\n // the highest. The edge then grows in as the cut rises, rather than popping.\n float cut = mix(-(softness + edgeWidth), 1.0, 1.0 - level);\n float visible = smoothstep(cut, cut + softness, mask);\n if (edgeWidth > 0.0) {\n float edge = 1.0 - smoothstep(cut + softness, cut + softness + edgeWidth, mask);\n color.rgb += erosionEdgeColor * edge;\n }\n color.a *= visible;\n return color;\n}\n#endif\n";function Zi(t){return`\n vec4 baseColor = vColor;\n#ifdef UV_SCROLL\n vec2 mapUV = vUV + uvScrollOffset;\n#else\n vec2 mapUV = vUV;\n#endif\n#ifdef EROSION\n float erosionLevel = baseColor.a;\n baseColor.a = 1.0;\n float erosionMaskValue = 1.0;\n#endif\n#ifdef USE_MAP\n vec4 texColor = texture2D(map, mapUV);\n ${t?"#ifdef TILE_BLEND\n #ifdef UV_SCROLL\n vec4 texColor2 = texture2D(map, vUV2 + uvScrollOffset);\n #else\n vec4 texColor2 = texture2D(map, vUV2);\n #endif\n texColor = mix(texColor, texColor2, vTileBlend);\n #endif":""}\n #ifdef GRADIENT_MAP\n vec4 ramp = texture2D(gradientMap, vec2(mix(gradientMapRange.x, gradientMapRange.y, clamp(texColor.r, 0.0, 1.0)), 0.5));\n texColor = vec4(ramp.rgb, ramp.a * texColor.a);\n #endif\n #ifdef EROSION\n erosionMaskValue = texColor.a;\n #endif\n baseColor *= texColor;\n#endif\n#ifdef EROSION\n #ifdef EROSION_MASK\n erosionMaskValue = texture2D(erosionMask, vUV + erosionParams.zw).r;\n #endif\n baseColor = quarksErode(baseColor, erosionLevel, erosionMaskValue);\n#endif\n`}const Hi="\n#ifdef UV_SCROLL\nuniform uvScrollOffset: vec2f;\n#endif\n#ifdef GRADIENT_MAP\nvar gradientMapSampler: sampler;\nvar gradientMap: texture_2d<f32>;\nuniform gradientMapRange: vec2f;\n#endif\n#ifdef EROSION\nuniform erosionParams: vec4f;\nuniform erosionEdgeColor: vec3f;\n#ifdef EROSION_MASK\nvar erosionMaskSampler: sampler;\nvar erosionMask: texture_2d<f32>;\n#endif\n\nfn quarksErode(colorIn: vec4f, level: f32, mask: f32) -> vec4f {\n var color = colorIn;\n let softness = uniforms.erosionParams.x;\n let edgeWidth = uniforms.erosionParams.y;\n let cut = mix(-(softness + edgeWidth), 1.0, 1.0 - level);\n let visible = smoothstep(cut, cut + softness, mask);\n if (edgeWidth > 0.0) {\n let edge = 1.0 - smoothstep(cut + softness, cut + softness + edgeWidth, mask);\n color = vec4f(color.rgb + uniforms.erosionEdgeColor * edge, color.a);\n }\n color.a *= visible;\n return color;\n}\n#endif\n";function Ki(t){return`\n var baseColor = fragmentInputs.vColor;\n#ifdef UV_SCROLL\n let mapUV = fragmentInputs.vUV + uniforms.uvScrollOffset;\n#else\n let mapUV = fragmentInputs.vUV;\n#endif\n#ifdef EROSION\n let erosionLevel = baseColor.a;\n baseColor.a = 1.0;\n var erosionMaskValue = 1.0;\n#endif\n#ifdef USE_MAP\n var texColor = textureSample(map, mapSampler, mapUV);\n ${t?"#ifdef TILE_BLEND\n #ifdef UV_SCROLL\n let texColor2 = textureSample(map, mapSampler, fragmentInputs.vUV2 + uniforms.uvScrollOffset);\n #else\n let texColor2 = textureSample(map, mapSampler, fragmentInputs.vUV2);\n #endif\n texColor = mix(texColor, texColor2, fragmentInputs.vTileBlend);\n #endif":""}\n #ifdef GRADIENT_MAP\n let ramp = textureSample(gradientMap, gradientMapSampler, vec2f(mix(uniforms.gradientMapRange.x, uniforms.gradientMapRange.y, clamp(texColor.r, 0.0, 1.0)), 0.5));\n texColor = vec4f(ramp.rgb, ramp.a * texColor.a);\n #endif\n #ifdef EROSION\n erosionMaskValue = texColor.a;\n #endif\n baseColor *= texColor;\n#endif\n#ifdef EROSION\n #ifdef EROSION_MASK\n erosionMaskValue = textureSample(erosionMask, erosionMaskSampler, fragmentInputs.vUV + uniforms.erosionParams.zw).r;\n #endif\n baseColor = quarksErode(baseColor, erosionLevel, erosionMaskValue);\n#endif\n`}var ts=`\nvarying vec2 vUV;\nvarying vec4 vColor;\n\n#ifdef TILE_BLEND\nvarying vec2 vUV2;\nvarying float vTileBlend;\n#endif\n\n#ifdef USE_MAP\nuniform sampler2D map;\n#endif\n\n#ifdef SOFT_PARTICLES\nuniform sampler2D depthTexture;\nuniform vec2 softParams;\nuniform vec4 projParams;\nvarying vec4 projPosition;\nvarying float linearDepth;\n#endif\n\n#ifdef USE_ALPHATEST\nuniform float alphaTest;\n#endif\n\n${ki}\n${Xi}\nvoid main() {\n${Zi(!0)}\n#ifdef USE_COLOR_AS_ALPHA\n baseColor.a *= (baseColor.r + baseColor.g + baseColor.b) / 3.0;\n#endif\n\n#ifdef USE_ALPHATEST\n if (baseColor.a < alphaTest) discard;\n#else\n if (baseColor.a < 0.01) discard;\n#endif\n\n${Ji("baseColor.rgb")}\n gl_FragColor = baseColor;\n\n#ifdef SOFT_PARTICLES\n vec2 p2 = projPosition.xy / projPosition.w;\n p2 = 0.5 * p2 + 0.5;\n float readDepth = texture2D(depthTexture, p2.xy).r;\n float zNear = projParams.x;\n float zFar = projParams.y;\n float viewDepth = (zFar * zNear) / (zFar - readDepth * (zFar - zNear));\n float fade = clamp(softParams.y * ((viewDepth - softParams.x) - linearDepth), 0.0, 1.0);\n gl_FragColor *= fade;\n#endif\n}\n`,es=`\nvarying vec2 vUV;\nvarying vec4 vColor;\nvarying vec3 vNormal;\nvarying vec3 vWorldPos;\n\n#ifndef MESH_UNLIT\nuniform vec3 lightDirection;\nuniform vec3 lightColor;\nuniform vec3 ambientColor;\n#endif\n\n#ifdef TILE_BLEND\nvarying vec2 vUV2;\nvarying float vTileBlend;\n#endif\n\n#ifdef USE_MAP\nuniform sampler2D map;\n#endif\n\n#if defined(USE_ENVMAP_ATLAS) || defined(MESH_RIM)\nuniform vec3 eyePosition;\n#endif\n\n#ifdef MESH_RIM\nuniform vec3 rimColor;\nuniform vec2 rimParams;\n#endif\n\n// One 3×2 atlas (px py pz / nx ny nz). Avoids samplerCube and multi-face\n// sampler bindings that raise GL_INVALID_OPERATION on iOS WebKit.\n#ifdef USE_ENVMAP_ATLAS\nuniform sampler2D envAtlas;\nuniform float reflectionLevel;\n\nvec3 sampleEnvAtlas(vec3 r) {\n vec3 a = abs(r);\n vec2 localUV;\n float cellX;\n float cellY;\n // Atlas layout: +X +Y +Z on row 0, -X -Y -Z on row 1.\n if (a.x >= a.y && a.x >= a.z) {\n cellX = 0.0;\n if (r.x >= 0.0) {\n cellY = 0.0;\n localUV = vec2(-r.z, -r.y) / a.x * 0.5 + 0.5;\n } else {\n cellY = 1.0;\n localUV = vec2(r.z, -r.y) / a.x * 0.5 + 0.5;\n }\n } else if (a.y >= a.z) {\n cellX = 1.0;\n if (r.y >= 0.0) {\n cellY = 0.0;\n localUV = vec2(r.x, r.z) / a.y * 0.5 + 0.5;\n } else {\n cellY = 1.0;\n localUV = vec2(r.x, -r.z) / a.y * 0.5 + 0.5;\n }\n } else {\n cellX = 2.0;\n if (r.z >= 0.0) {\n cellY = 0.0;\n localUV = vec2(r.x, -r.y) / a.z * 0.5 + 0.5;\n } else {\n cellY = 1.0;\n localUV = vec2(-r.x, -r.y) / a.z * 0.5 + 0.5;\n }\n }\n vec2 uv = (vec2(cellX, cellY) + clamp(localUV, 0.0, 1.0)) / vec2(3.0, 2.0);\n return texture2D(envAtlas, uv).rgb;\n}\n#endif\n\n#ifdef SOFT_PARTICLES\nuniform sampler2D depthTexture;\nuniform vec2 softParams;\nuniform vec4 projParams;\nvarying vec4 projPosition;\nvarying float linearDepth;\n#endif\n\n#ifdef USE_ALPHATEST\nuniform float alphaTest;\n#endif\n\n${ki}\n${Xi}\nvoid main() {\n${Zi(!0)}\n#ifdef USE_ALPHATEST\n if (baseColor.a < alphaTest) discard;\n#else\n if (baseColor.a < 0.01) discard;\n#endif\n\n vec3 N = normalize(vNormal);\n#ifdef MESH_UNLIT\n vec3 color = baseColor.rgb;\n#else\n vec3 L = normalize(-lightDirection);\n float NdotL = max(dot(N, L), 0.0);\n vec3 litColor = ambientColor + lightColor * NdotL;\n\n vec3 color = baseColor.rgb * litColor;\n#endif\n\n#ifdef USE_ENVMAP_ATLAS\n vec3 viewDir = normalize(vWorldPos - eyePosition);\n vec3 reflectionCoords = reflect(viewDir, N);\n color += sampleEnvAtlas(reflectionCoords) * reflectionLevel;\n#endif\n\n#ifdef MESH_RIM\n // Fresnel: strongest where the surface turns away from the camera.\n vec3 V = normalize(eyePosition - vWorldPos);\n float rim = pow(1.0 - abs(dot(N, V)), rimParams.x) * rimParams.y;\n #ifdef MESH_RIM_MIX\n color = mix(color, rimColor, clamp(rim, 0.0, 1.0));\n #else\n color += rimColor * rim;\n #endif\n#endif\n\n${Ji("color")}\n gl_FragColor = vec4(color, baseColor.a);\n\n#ifdef SOFT_PARTICLES\n vec2 p2 = projPosition.xy / projPosition.w;\n p2 = 0.5 * p2 + 0.5;\n float readDepth = texture2D(depthTexture, p2.xy).r;\n float zNear = projParams.x;\n float zFar = projParams.y;\n float viewDepth = (zFar * zNear) / (zFar - readDepth * (zFar - zNear));\n float fade = clamp(softParams.y * ((viewDepth - softParams.x) - linearDepth), 0.0, 1.0);\n gl_FragColor *= fade;\n#endif\n}\n`,is=`\n// Per-vertex attributes\nattribute vec3 position;\nattribute vec2 uv;\n\n// Per-instance attributes\nattribute vec3 offset;\nattribute vec4 color;\nattribute vec3 size;\nattribute float rotation;\nattribute float uvTile;\n\n// Uniforms\nuniform mat4 world;\nuniform mat4 view;\nuniform mat4 projection;\nuniform mat4 worldViewProjection;\n\n#ifdef UV_TILE\nuniform float tileCountX;\nuniform float tileCountY;\n#endif\n\n#ifdef PIVOT\n// Quad offset in particle-size units: xy in the quad's plane, z toward the camera.\nuniform vec3 pivot;\n#endif\n\n// Varyings\nvarying vec2 vUV;\nvarying vec4 vColor;\n#ifdef TILE_BLEND\nvarying vec2 vUV2;\nvarying float vTileBlend;\n#endif\n#ifdef SOFT_PARTICLES\nvarying vec4 projPosition;\nvarying float linearDepth;\n#endif\n\n#ifdef SIZE_LIMITS\n// Smallest and largest size a particle may have on screen, as fractions of the viewport height.\nuniform vec2 sizeLimits;\n#endif\n${Ui}\nvoid main() {\n float c = cos(rotation);\n float s = sin(rotation);\n\n#ifdef SIZE_LIMITS\n // The particle's size on screen as a fraction of the viewport height, held\n // between the limits; a perspective projection divides by the view depth.\n vec4 limitCenter = view * world * vec4(offset, 1.0);\n float limitDepth = abs(projection[2][3]) > 0.0 ? abs(limitCenter.z) : 1.0;\n float screenSize = max(abs(size.x), abs(size.y)) * projection[1][1] / (2.0 * limitDepth);\n float sizeScale = screenSize > 0.0 ? clamp(screenSize, sizeLimits.x, sizeLimits.y) / screenSize : 1.0;\n vec3 limitedSize = size * sizeScale;\n#else\n vec3 limitedSize = size;\n#endif\n // A negative size mirrors the quad, which is how flipped particles arrive.\n vec2 alignedPosition = position.xy * limitedSize.xy;\n#ifdef PIVOT\n // The pivot turns with the particle but is not mirrored with it.\n alignedPosition += pivot.xy * abs(limitedSize.xy);\n#endif\n vec2 rotatedPosition;\n rotatedPosition.x = c * alignedPosition.x - s * alignedPosition.y;\n rotatedPosition.y = s * alignedPosition.x + c * alignedPosition.y;\n\n#ifdef HORIZONTAL\n vec4 mvPosition = world * vec4(offset, 1.0);\n mvPosition.x += rotatedPosition.x;\n mvPosition.z -= rotatedPosition.y;\n#ifdef PIVOT\n mvPosition.y += pivot.z * abs(limitedSize.x);\n#endif\n mvPosition = view * mvPosition;\n#elif defined(VERTICAL)\n vec4 mvPosition = world * vec4(offset, 1.0);\n mvPosition.y += rotatedPosition.y;\n mvPosition = view * mvPosition;\n mvPosition.x += rotatedPosition.x;\n#else\n vec4 mvPosition = view * world * vec4(offset, 1.0);\n mvPosition.xy += rotatedPosition;\n#endif\n#ifdef PIVOT\n#ifndef HORIZONTAL\n // Toward the camera along its view axis, whichever way the view space\n // faces: anything in front of the camera has the sign of the far side.\n mvPosition.z -= sign(mvPosition.z) * pivot.z * abs(limitedSize.x);\n#endif\n#endif\n\n gl_Position = projection * mvPosition;\n${qi("mvPosition.xyz")}\n#ifdef SOFT_PARTICLES\n projPosition = gl_Position;\n linearDepth = -mvPosition.z;\n#endif\n\n #ifdef UV_TILE\n vec2 tc = vec2(tileCountX, tileCountY);\n float baseTile = floor(uvTile);\n float tileU = mod(baseTile, tc.x) / tc.x;\n float tileV = 1.0 - floor(baseTile / tc.x) / tc.y - 1.0 / tc.y;\n vUV = uv / tc + vec2(tileU, tileV);\n #ifdef TILE_BLEND\n float nextTile = ceil(uvTile);\n float nextU = mod(nextTile, tc.x) / tc.x;\n float nextV = 1.0 - floor(nextTile / tc.x) / tc.y - 1.0 / tc.y;\n vUV2 = uv / tc + vec2(nextU, nextV);\n vTileBlend = fract(uvTile);\n #endif\n #else\n vUV = uv;\n #endif\n\n vColor = color;\n}\n`,ss=`\n// Per-vertex attributes\nattribute vec3 position;\nattribute vec2 uv;\n\n// Per-instance attributes\nattribute vec3 offset;\nattribute vec4 color;\nattribute vec3 size;\nattribute float rotation;\nattribute float uvTile;\nattribute vec4 velocity;\n\n// Uniforms\nuniform mat4 world;\nuniform mat4 view;\nuniform mat4 projection;\nuniform float speedFactor;\n\n#ifdef UV_TILE\nuniform float tileCountX;\nuniform float tileCountY;\n#endif\n\n#ifdef PIVOT\n// Streak offset in particle-size units: x from head to tail, y across.\nuniform vec3 pivot;\n#endif\n\n// Varyings\nvarying vec2 vUV;\nvarying vec4 vColor;\n#ifdef TILE_BLEND\nvarying vec2 vUV2;\nvarying float vTileBlend;\n#endif\n#ifdef SOFT_PARTICLES\nvarying vec4 projPosition;\nvarying float linearDepth;\n#endif\n\n#ifdef SIZE_LIMITS\n// Smallest and largest size a particle may have on screen, as fractions of the viewport height.\nuniform vec2 sizeLimits;\n#endif\n${Ui}\nvoid main() {\n float lengthFactor = velocity.w;\n // A flipped particle arrives with a negative size: the streak keeps its\n // extent and mirrors its texture instead (see quadUV below).\n float avgSize = (abs(size.x) + abs(size.y)) * 0.5;\n vec4 mvPosition = view * world * vec4(offset, 1.0);\n#ifdef SIZE_LIMITS\n // The streak's width on screen as a fraction of the viewport height, held\n // between the limits; a perspective projection divides by the view depth.\n float limitDepth = abs(projection[2][3]) > 0.0 ? abs(mvPosition.z) : 1.0;\n float screenSize = avgSize * projection[1][1] / (2.0 * limitDepth);\n if (screenSize > 0.0) {\n avgSize *= clamp(screenSize, sizeLimits.x, sizeLimits.y) / screenSize;\n }\n#endif\n vec3 viewVelocity = mat3(view * world) * velocity.xyz;\n float vlength = length(viewVelocity);\n // Stretch direction is the velocity direction; only a genuinely motionless particle has none.\n // Deriving it via normalize keeps the stretch aligned even when the speed contribution is ~0\n // (e.g. speedFactor 0), instead of collapsing the whole burst onto a fixed screen axis.\n vec3 vdir = vlength > 0.000001 ? viewVelocity / vlength : vec3(0.0, 0.0, 1.0);\n#ifdef BEAM\n // Seen straight along its length a beam has no side to face; any will do.\n vec3 sideRaw = cross(mvPosition.xyz, vdir);\n vec3 side = dot(sideRaw, sideRaw) > 1e-12 ? normalize(sideRaw) : vec3(1.0, 0.0, 0.0);\n#else\n vec3 side = normalize(cross(mvPosition.xyz, vdir));\n#endif\n mvPosition.xyz += position.y * side * avgSize;\n#ifdef BEAM\n // The vector runs from the particle to the beam's end: the quad spans it\n // exactly, U from the particle (0) to the end (1), as wide as the size.\n mvPosition.xyz += (position.x + 0.5) * viewVelocity;\n#else\n // Equivalent to viewVelocity * (1.0 + lengthFactor / vlength) for moving particles, but the\n // size-based term (vdir * lengthFactor) survives when the velocity contribution vanishes.\n mvPosition.xyz -= (position.x + 0.5) * (viewVelocity + vdir * lengthFactor) * avgSize;\n#endif\n#ifdef PIVOT\n // In particle-size units along the quad's own axes: x from head to tail, y across.\n mvPosition.xyz += (pivot.y * side - pivot.x * vdir) * avgSize;\n#endif\n gl_Position = projection * mvPosition;\n${qi("mvPosition.xyz")}\n vec2 quadUV = vec2(size.x < 0.0 ? 1.0 - uv.x : uv.x, size.y < 0.0 ? 1.0 - uv.y : uv.y);\n#ifdef SOFT_PARTICLES\n projPosition = gl_Position;\n linearDepth = -mvPosition.z;\n#endif\n\n #ifdef UV_TILE\n vec2 tc = vec2(tileCountX, tileCountY);\n float baseTile = floor(uvTile);\n float tileU = mod(baseTile, tc.x) / tc.x;\n float tileV = 1.0 - floor(baseTile / tc.x) / tc.y - 1.0 / tc.y;\n vUV = quadUV / tc + vec2(tileU, tileV);\n #ifdef TILE_BLEND\n float nextTile = ceil(uvTile);\n float nextU = mod(nextTile, tc.x) / tc.x;\n float nextV = 1.0 - floor(nextTile / tc.x) / tc.y - 1.0 / tc.y;\n vUV2 = quadUV / tc + vec2(nextU, nextV);\n vTileBlend = fract(uvTile);\n #endif\n #else\n vUV = quadUV;\n #endif\n\n vColor = color;\n}\n`,rs=`\nvarying vec2 vUV;\nvarying vec4 vColor;\n\n#ifdef USE_MAP\nuniform sampler2D map;\n#endif\n\n${ki}\n${Xi}\nvoid main() {\n${Zi(!1)}\n if (baseColor.a < 0.01) discard;\n\n${Ji("baseColor.rgb")}\n gl_FragColor = baseColor;\n}\n`,ns=`\nattribute vec3 position;\nattribute vec3 previous;\nattribute vec3 next;\nattribute float side;\nattribute float width;\nattribute vec2 uv;\nattribute vec4 color;\n\nuniform mat4 view;\nuniform mat4 projection;\nuniform float lineWidth;\nuniform vec2 resolution;\nuniform float sizeAttenuation;\n\nvarying vec2 vUV;\nvarying vec4 vColor;\n\nvec2 fix(vec4 i, float aspect) {\n vec2 res = i.xy / i.w;\n res.x *= aspect;\n return res;\n}\n\n${Ui}\nvoid main() {\n float aspect = resolution.x / resolution.y;\n vec4 finalPosition = projection * view * vec4(position, 1.0);\n vec4 prevPos = projection * view * vec4(previous, 1.0);\n vec4 nextPos = projection * view * vec4(next, 1.0);\n\n vec2 currentP = fix(finalPosition, aspect);\n vec2 prevP = fix(prevPos, aspect);\n vec2 nextP = fix(nextPos, aspect);\n\n float w = lineWidth * width;\n vec2 dir;\n if (distance(nextP, currentP) < 0.0001) {\n dir = normalize(currentP - prevP);\n } else if (distance(prevP, currentP) < 0.0001) {\n dir = normalize(nextP - currentP);\n } else {\n vec2 dir1 = normalize(currentP - prevP);\n vec2 dir2 = normalize(nextP - currentP);\n dir = normalize(dir1 + dir2);\n }\n vec4 normal = vec4(-dir.y, dir.x, 0.0, 1.0);\n normal.xy *= 0.5 * w;\n normal *= projection;\n if (sizeAttenuation == 0.0) {\n normal.xy *= finalPosition.w;\n normal.xy /= (vec4(resolution, 0.0, 1.0) * projection).xy;\n }\n finalPosition.xy += normal.xy * side;\n gl_Position = finalPosition;\n${qi("(view * vec4(position, 1.0)).xyz")}\n vUV = uv;\n vColor = color;\n}\n`;const os=2048,as=2047;class ls{constructor(t){this.counts=new Uint32Array(os),this.floatView=new Float32Array(1),this.uintView=new Uint32Array(this.floatView.buffer),this.keys=new Uint32Array(t),this.orderA=new Uint32Array(t),this.orderB=new Uint32Array(t)}ensure(t){this.keys.length<t&&(this.keys=new Uint32Array(t),this.orderA=new Uint32Array(t),this.orderB=new Uint32Array(t))}floatKey(t,e){this.floatView[0]=t;const i=this.uintView[0];return e?~i>>>0:i}}var hs=`\nattribute position: vec3f;\nattribute uv: vec2f;\nattribute normal: vec3f;\nattribute offset: vec3f;\nattribute color: vec4f;\nattribute size: vec3f;\nattribute rotation: vec4f;\nattribute uvTile: f32;\n\nuniform world: mat4x4f;\nuniform view: mat4x4f;\nuniform projection: mat4x4f;\n\n#ifdef UV_TILE\nuniform tileCountX: f32;\nuniform tileCountY: f32;\n#endif\n\nvarying vUV: vec2f;\nvarying vColor: vec4f;\nvarying vNormal: vec3f;\nvarying vWorldPos: vec3f;\n\n#ifdef TILE_BLEND\nvarying vUV2: vec2f;\nvarying vTileBlend: f32;\n#endif\n\n#ifdef SOFT_PARTICLES\nvarying projPosition: vec4f;\nvarying linearDepth: f32;\n#endif\n\nfn applyQuaternion(v: vec3f, q: vec4f) -> vec3f {\n let qVec = q.xyz;\n let qW = q.w;\n let t = 2.0 * cross(qVec, v);\n return v + qW * t + cross(qVec, t);\n}\n\n${Qi}\n@vertex\nfn main(input: VertexInputs) -> FragmentInputs {\n let scaledPosition = vertexInputs.position * vertexInputs.size;\n let rotatedPosition = applyQuaternion(scaledPosition, vertexInputs.rotation);\n let rotatedNormal = normalize(applyQuaternion(vertexInputs.normal, vertexInputs.rotation));\n let localPos = rotatedPosition + vertexInputs.offset;\n\n let worldPos = uniforms.world * vec4f(localPos, 1.0);\n let viewPos = uniforms.view * worldPos;\n let clipPosition = uniforms.projection * viewPos;\n vertexOutputs.position = clipPosition;\n${Gi("viewPos.xyz")}\n\n vertexOutputs.vWorldPos = worldPos.xyz;\n vertexOutputs.vNormal = normalize((uniforms.world * vec4f(rotatedNormal, 0.0)).xyz);\n\n#ifdef SOFT_PARTICLES\n vertexOutputs.projPosition = clipPosition;\n vertexOutputs.linearDepth = -viewPos.z;\n#endif\n\n#ifdef UV_TILE\n let tc = vec2f(uniforms.tileCountX, uniforms.tileCountY);\n let baseTile = floor(vertexInputs.uvTile);\n let tileU = (baseTile % tc.x) / tc.x;\n let tileV = 1.0 - floor(baseTile / tc.x) / tc.y - 1.0 / tc.y;\n vertexOutputs.vUV = vertexInputs.uv / tc + vec2f(tileU, tileV);\n #ifdef TILE_BLEND\n let nextTile = ceil(vertexInputs.uvTile);\n let nextU = (nextTile % tc.x) / tc.x;\n let nextV = 1.0 - floor(nextTile / tc.x) / tc.y - 1.0 / tc.y;\n vertexOutputs.vUV2 = vertexInputs.uv / tc + vec2f(nextU, nextV);\n vertexOutputs.vTileBlend = fract(vertexInputs.uvTile);\n #endif\n#else\n vertexOutputs.vUV = vertexInputs.uv;\n#endif\n\n vertexOutputs.vColor = vertexInputs.color;\n}\n`,cs=`\nvarying vUV: vec2f;\nvarying vColor: vec4f;\n\n#ifdef TILE_BLEND\nvarying vUV2: vec2f;\nvarying vTileBlend: f32;\n#endif\n\n#ifdef USE_MAP\nvar mapSampler: sampler;\nvar map: texture_2d<f32>;\n#endif\n\n#ifdef SOFT_PARTICLES\nvar depthTextureSampler: sampler;\nvar depthTexture: texture_2d<f32>;\nuniform softParams: vec2f;\nuniform projParams: vec4f;\nvarying projPosition: vec4f;\nvarying linearDepth: f32;\n#endif\n\n#ifdef USE_ALPHATEST\nuniform alphaTest: f32;\n#endif\n\n${Wi}\n${Hi}\n@fragment\nfn main(input: FragmentInputs) -> FragmentOutputs {\n${Ki(!0)}\n#ifdef USE_COLOR_AS_ALPHA\n baseColor.a *= (baseColor.r + baseColor.g + baseColor.b) / 3.0;\n#endif\n\n#ifdef USE_ALPHATEST\n if (baseColor.a < uniforms.alphaTest) { discard; }\n#else\n if (baseColor.a < 0.01) { discard; }\n#endif\n\n#ifdef SOFT_PARTICLES\n var p2 = fragmentInputs.projPosition.xy / fragmentInputs.projPosition.w;\n p2 = 0.5 * p2 + 0.5;\n let readDepth = textureSample(depthTexture, depthTextureSampler, p2).r;\n let zNear = uniforms.projParams.x;\n let zFar = uniforms.projParams.y;\n let viewDepth = (zFar * zNear) / (zFar - readDepth * (zFar - zNear));\n let fade = clamp(uniforms.softParams.y * ((viewDepth - uniforms.softParams.x) - fragmentInputs.linearDepth), 0.0, 1.0);\n baseColor *= fade;\n#endif\n\n${ji("baseColor")}\n fragmentOutputs.color = baseColor;\n}\n`,us=`\nvarying vUV: vec2f;\nvarying vColor: vec4f;\nvarying vNormal: vec3f;\nvarying vWorldPos: vec3f;\n\n#ifndef MESH_UNLIT\nuniform lightDirection: vec3f;\nuniform lightColor: vec3f;\nuniform ambientColor: vec3f;\n#endif\n\n#ifdef TILE_BLEND\nvarying vUV2: vec2f;\nvarying vTileBlend: f32;\n#endif\n\n#ifdef USE_MAP\nvar mapSampler: sampler;\nvar map: texture_2d<f32>;\n#endif\n\n#if defined(USE_ENVMAP_ATLAS) || defined(MESH_RIM)\nuniform eyePosition: vec3f;\n#endif\n\n#ifdef MESH_RIM\nuniform rimColor: vec3f;\nuniform rimParams: vec2f;\n#endif\n\n#ifdef USE_ENVMAP_ATLAS\nvar envAtlasSampler: sampler;\nvar envAtlas: texture_2d<f32>;\nuniform reflectionLevel: f32;\n\nfn sampleEnvAtlas(r: vec3f) -> vec3f {\n let a = abs(r);\n var localUV: vec2f;\n var cellX: f32;\n var cellY: f32;\n if (a.x >= a.y && a.x >= a.z) {\n cellX = 0.0;\n if (r.x >= 0.0) {\n cellY = 0.0;\n localUV = vec2f(-r.z, -r.y) / a.x * 0.5 + 0.5;\n } else {\n cellY = 1.0;\n localUV = vec2f(r.z, -r.y) / a.x * 0.5 + 0.5;\n }\n } else if (a.y >= a.z) {\n cellX = 1.0;\n if (r.y >= 0.0) {\n cellY = 0.0;\n localUV = vec2f(r.x, r.z) / a.y * 0.5 + 0.5;\n } else {\n cellY = 1.0;\n localUV = vec2f(r.x, -r.z) / a.y * 0.5 + 0.5;\n }\n } else {\n cellX = 2.0;\n if (r.z >= 0.0) {\n cellY = 0.0;\n localUV = vec2f(r.x, -r.y) / a.z * 0.5 + 0.5;\n } else {\n cellY = 1.0;\n localUV = vec2f(-r.x, -r.y) / a.z * 0.5 + 0.5;\n }\n }\n let uv = (vec2f(cellX, cellY) + clamp(localUV, vec2f(0.0), vec2f(1.0))) / vec2f(3.0, 2.0);\n return textureSample(envAtlas, envAtlasSampler, uv).rgb;\n}\n#endif\n\n#ifdef SOFT_PARTICLES\nvar depthTextureSampler: sampler;\nvar depthTexture: texture_2d<f32>;\nuniform softParams: vec2f;\nuniform projParams: vec4f;\nvarying projPosition: vec4f;\nvarying linearDepth: f32;\n#endif\n\n#ifdef USE_ALPHATEST\nuniform alphaTest: f32;\n#endif\n\n${Wi}\n${Hi}\n@fragment\nfn main(input: FragmentInputs) -> FragmentOutputs {\n${Ki(!0)}\n#ifdef USE_ALPHATEST\n if (baseColor.a < uniforms.alphaTest) { discard; }\n#else\n if (baseColor.a < 0.01) { discard; }\n#endif\n\n let N = normalize(fragmentInputs.vNormal);\n#ifdef MESH_UNLIT\n var color = baseColor.rgb;\n#else\n let L = normalize(-uniforms.lightDirection);\n let NdotL = max(dot(N, L), 0.0);\n let litColor = uniforms.ambientColor + uniforms.lightColor * NdotL;\n\n var color = baseColor.rgb * litColor;\n#endif\n\n#ifdef USE_ENVMAP_ATLAS\n let viewDir = normalize(fragmentInputs.vWorldPos - uniforms.eyePosition);\n let reflectionCoords = reflect(viewDir, N);\n color += sampleEnvAtlas(reflectionCoords) * uniforms.reflectionLevel;\n#endif\n\n#ifdef MESH_RIM\n // Fresnel: strongest where the surface turns away from the camera.\n let V = normalize(uniforms.eyePosition - fragmentInputs.vWorldPos);\n let rimTerm = pow(1.0 - abs(dot(N, V)), uniforms.rimParams.x) * uniforms.rimParams.y;\n #ifdef MESH_RIM_MIX\n color = mix(color, uniforms.rimColor, clamp(rimTerm, 0.0, 1.0));\n #else\n color += uniforms.rimColor * rimTerm;\n #endif\n#endif\n\n var finalColor = vec4f(color, baseColor.a);\n\n#ifdef SOFT_PARTICLES\n var p2 = fragmentInputs.projPosition.xy / fragmentInputs.projPosition.w;\n p2 = 0.5 * p2 + 0.5;\n let readDepth = textureSample(depthTexture, depthTextureSampler, p2).r;\n let zNear = uniforms.projParams.x;\n let zFar = uniforms.projParams.y;\n let viewDepth = (zFar * zNear) / (zFar - readDepth * (zFar - zNear));\n let fade = clamp(uniforms.softParams.y * ((viewDepth - uniforms.softParams.x) - fragmentInputs.linearDepth), 0.0, 1.0);\n finalColor *= fade;\n#endif\n\n${ji("finalColor")}\n fragmentOutputs.color = finalColor;\n}\n`,ds=`\n// Per-vertex attributes\nattribute position: vec3f;\nattribute uv: vec2f;\n\n// Per-instance attributes\nattribute offset: vec3f;\nattribute color: vec4f;\nattribute size: vec3f;\nattribute rotation: f32;\nattribute uvTile: f32;\n\n// Uniforms\nuniform world: mat4x4f;\nuniform view: mat4x4f;\nuniform projection: mat4x4f;\n\n#ifdef UV_TILE\nuniform tileCountX: f32;\nuniform tileCountY: f32;\n#endif\n\n#ifdef PIVOT\n// Quad offset in particle-size units: xy in the quad's plane, z toward the camera.\nuniform pivot: vec3f;\n#endif\n\n// Varyings\nvarying vUV: vec2f;\nvarying vColor: vec4f;\n#ifdef TILE_BLEND\nvarying vUV2: vec2f;\nvarying vTileBlend: f32;\n#endif\n#ifdef SOFT_PARTICLES\nvarying projPosition: vec4f;\nvarying linearDepth: f32;\n#endif\n\n#ifdef SIZE_LIMITS\n// Smallest and largest size a particle may have on screen, as fractions of the viewport height.\nuniform sizeLimits: vec2f;\n#endif\n${Qi}\n@vertex\nfn main(input: VertexInputs) -> FragmentInputs {\n let c = cos(vertexInputs.rotation);\n let s = sin(vertexInputs.rotation);\n\n#ifdef SIZE_LIMITS\n // The particle's size on screen as a fraction of the viewport height, held\n // between the limits; a perspective projection divides by the view depth.\n let limitCenter = uniforms.view * uniforms.world * vec4f(vertexInputs.offset, 1.0);\n let limitDepth = select(1.0, abs(limitCenter.z), abs(uniforms.projection[2][3]) > 0.0);\n let screenSize = max(abs(vertexInputs.size.x), abs(vertexInputs.size.y)) * uniforms.projection[1][1] / (2.0 * limitDepth);\n let sizeScale = select(1.0, clamp(screenSize, uniforms.sizeLimits.x, uniforms.sizeLimits.y) / screenSize, screenSize > 0.0);\n let limitedSize = vertexInputs.size * sizeScale;\n#else\n let limitedSize = vertexInputs.size;\n#endif\n // A negative size mirrors the quad, which is how flipped particles arrive.\n var alignedPosition = vertexInputs.position.xy * limitedSize.xy;\n#ifdef PIVOT\n // The pivot turns with the particle but is not mirrored with it.\n alignedPosition += uniforms.pivot.xy * abs(limitedSize.xy);\n#endif\n let rotatedPosition = vec2f(\n c * alignedPosition.x - s * alignedPosition.y,\n s * alignedPosition.x + c * alignedPosition.y);\n\n#ifdef HORIZONTAL\n var mvPosition = uniforms.world * vec4f(vertexInputs.offset, 1.0);\n mvPosition.x += rotatedPosition.x;\n mvPosition.z -= rotatedPosition.y;\n#ifdef PIVOT\n mvPosition.y += uniforms.pivot.z * abs(limitedSize.x);\n#endif\n mvPosition = uniforms.view * mvPosition;\n#elif defined(VERTICAL)\n var mvPosition = uniforms.world * vec4f(vertexInputs.offset, 1.0);\n mvPosition.y += rotatedPosition.y;\n mvPosition = uniforms.view * mvPosition;\n mvPosition.x += rotatedPosition.x;\n#else\n var mvPosition = uniforms.view * uniforms.world * vec4f(vertexInputs.offset, 1.0);\n mvPosition.x += rotatedPosition.x;\n mvPosition.y += rotatedPosition.y;\n#endif\n#ifdef PIVOT\n#ifndef HORIZONTAL\n // Toward the camera along its view axis, whichever way the view space\n // faces: anything in front of the camera has the sign of the far side.\n mvPosition.z -= sign(mvPosition.z) * uniforms.pivot.z * abs(limitedSize.x);\n#endif\n#endif\n\n let clipPosition = uniforms.projection * mvPosition;\n vertexOutputs.position = clipPosition;\n${Gi("mvPosition.xyz")}\n#ifdef SOFT_PARTICLES\n vertexOutputs.projPosition = clipPosition;\n vertexOutputs.linearDepth = -mvPosition.z;\n#endif\n\n #ifdef UV_TILE\n let tc = vec2f(uniforms.tileCountX, uniforms.tileCountY);\n let baseTile = floor(vertexInputs.uvTile);\n let tileU = (baseTile % tc.x) / tc.x;\n let tileV = 1.0 - floor(baseTile / tc.x) / tc.y - 1.0 / tc.y;\n vertexOutputs.vUV = vertexInputs.uv / tc + vec2f(tileU, tileV);\n #ifdef TILE_BLEND\n let nextTile = ceil(vertexInputs.uvTile);\n let nextU = (nextTile % tc.x) / tc.x;\n let nextV = 1.0 - floor(nextTile / tc.x) / tc.y - 1.0 / tc.y;\n vertexOutputs.vUV2 = vertexInputs.uv / tc + vec2f(nextU, nextV);\n vertexOutputs.vTileBlend = fract(vertexInputs.uvTile);\n #endif\n #else\n vertexOutputs.vUV = vertexInputs.uv;\n #endif\n\n vertexOutputs.vColor = vertexInputs.color;\n}\n`;function fs(t){return t.isWebGPU?d.ShaderLanguage.WGSL:d.ShaderLanguage.GLSL}function ps(t,e,i,s){if(s===d.ShaderLanguage.WGSL)return c.ShaderStore.ShadersStoreWGSL[t+"VertexShader"]=e.wgsl,void(c.ShaderStore.ShadersStoreWGSL[t+"FragmentShader"]=i.wgsl);u.Effect.ShadersStore[t+"VertexShader"]=e.glsl,u.Effect.ShadersStore[t+"FragmentShader"]=i.glsl}var ms,ys=`\n// Per-vertex attributes\nattribute position: vec3f;\nattribute uv: vec2f;\n\n// Per-instance attributes\nattribute offset: vec3f;\nattribute color: vec4f;\nattribute size: vec3f;\nattribute rotation: f32;\nattribute uvTile: f32;\nattribute velocity: vec4f;\n\n// Uniforms\nuniform world: mat4x4f;\nuniform view: mat4x4f;\nuniform projection: mat4x4f;\nuniform speedFactor: f32;\n\n#ifdef UV_TILE\nuniform tileCountX: f32;\nuniform tileCountY: f32;\n#endif\n\n#ifdef PIVOT\n// Streak offset in particle-size units: x from head to tail, y across.\nuniform pivot: vec3f;\n#endif\n\n// Varyings\nvarying vUV: vec2f;\nvarying vColor: vec4f;\n#ifdef TILE_BLEND\nvarying vUV2: vec2f;\nvarying vTileBlend: f32;\n#endif\n#ifdef SOFT_PARTICLES\nvarying projPosition: vec4f;\nvarying linearDepth: f32;\n#endif\n\n#ifdef SIZE_LIMITS\n// Smallest and largest size a particle may have on screen, as fractions of the viewport height.\nuniform sizeLimits: vec2f;\n#endif\n${Qi}\n@vertex\nfn main(input: VertexInputs) -> FragmentInputs {\n let lengthFactor = vertexInputs.velocity.w;\n // A flipped particle arrives with a negative size: the streak keeps its\n // extent and mirrors its texture instead (see quadUV below).\n var avgSize = (abs(vertexInputs.size.x) + abs(vertexInputs.size.y)) * 0.5;\n var mvPosition = uniforms.view * uniforms.world * vec4f(vertexInputs.offset, 1.0);\n#ifdef SIZE_LIMITS\n // The streak's width on screen as a fraction of the viewport height, held\n // between the limits; a perspective projection divides by the view depth.\n let limitDepth = select(1.0, abs(mvPosition.z), abs(uniforms.projection[2][3]) > 0.0);\n let screenSize = avgSize * uniforms.projection[1][1] / (2.0 * limitDepth);\n if (screenSize > 0.0) {\n avgSize *= clamp(screenSize, uniforms.sizeLimits.x, uniforms.sizeLimits.y) / screenSize;\n }\n#endif\n let viewWorld = uniforms.view * uniforms.world;\n let viewWorld3 = mat3x3f(viewWorld[0].xyz, viewWorld[1].xyz, viewWorld[2].xyz);\n let viewVelocity = viewWorld3 * vertexInputs.velocity.xyz;\n let vlength = length(viewVelocity);\n // Stretch direction is the velocity direction; only a genuinely motionless particle has none.\n // Deriving it via normalize keeps the stretch aligned even when the speed contribution is ~0\n // (e.g. speedFactor 0), instead of collapsing the whole burst onto a fixed screen axis.\n var vdir = vec3f(0.0, 0.0, 1.0);\n if (vlength > 0.000001) {\n vdir = viewVelocity / vlength;\n }\n#ifdef BEAM\n // Seen straight along its length a beam has no side to face; any will do.\n let sideRaw = cross(mvPosition.xyz, vdir);\n var side = vec3f(1.0, 0.0, 0.0);\n if (dot(sideRaw, sideRaw) > 1e-12) {\n side = normalize(sideRaw);\n }\n#else\n let side = normalize(cross(mvPosition.xyz, vdir));\n#endif\n let widthOffset = vertexInputs.position.y * side * avgSize;\n // Equivalent to viewVelocity * (1.0 + lengthFactor / vlength) for moving particles, but the\n // size-based term (vdir * lengthFactor) survives when the velocity contribution vanishes.\n#ifdef BEAM\n // The vector runs from the particle to the beam's end: the quad spans it\n // exactly, U from the particle (0) to the end (1), as wide as the size.\n var stretched = mvPosition.xyz + widthOffset + (vertexInputs.position.x + 0.5) * viewVelocity;\n#else\n let lengthOffset = (vertexInputs.position.x + 0.5) * (viewVelocity + vdir * lengthFactor) * avgSize;\n var stretched = mvPosition.xyz + widthOffset - lengthOffset;\n#endif\n#ifdef PIVOT\n // In particle-size units along the quad's own axes: x from head to tail, y across.\n stretched += (uniforms.pivot.y * side - uniforms.pivot.x * vdir) * avgSize;\n#endif\n mvPosition.x = stretched.x;\n mvPosition.y = stretched.y;\n mvPosition.z = stretched.z;\n\n let clipPosition = uniforms.projection * mvPosition;\n vertexOutputs.position = clipPosition;\n${Gi("mvPosition.xyz")}\n let quadUV = select(vertexInputs.uv, 1.0 - vertexInputs.uv, vertexInputs.size.xy < vec2f(0.0));\n#ifdef SOFT_PARTICLES\n vertexOutputs.projPosition = clipPosition;\n vertexOutputs.linearDepth = -mvPosition.z;\n#endif\n\n #ifdef UV_TILE\n let tc = vec2f(uniforms.tileCountX, uniforms.tileCountY);\n let baseTile = floor(vertexInputs.uvTile);\n let tileU = (baseTile % tc.x) / tc.x;\n let tileV = 1.0 - floor(baseTile / tc.x) / tc.y - 1.0 / tc.y;\n vertexOutputs.vUV = quadUV / tc + vec2f(tileU, tileV);\n #ifdef TILE_BLEND\n let nextTile = ceil(vertexInputs.uvTile);\n let nextU = (nextTile % tc.x) / tc.x;\n let nextV = 1.0 - floor(nextTile / tc.x) / tc.y - 1.0 / tc.y;\n vertexOutputs.vUV2 = quadUV / tc + vec2f(nextU, nextV);\n vertexOutputs.vTileBlend = fract(vertexInputs.uvTile);\n #endif\n #else\n vertexOutputs.vUV = quadUV;\n #endif\n\n vertexOutputs.vColor = vertexInputs.color;\n}\n`;function gs(){return{direction:new a.Vector3(.4,-1,.6),color:new p.Color3(1,1,1),ambient:new p.Color3(.35,.35,.35)}}function vs(t){if(!t||"object"!=typeof t)return;const e=Array.isArray(t.color)?t.color:[1,1,1],i=(t,e)=>"number"==typeof t&&Number.isFinite(t)?t:e;return{color:[i(e[0],1),i(e[1],1),i(e[2],1)],power:Math.max(.01,i(t.power,2)),strength:Math.max(0,i(t.strength,1)),mode:"mix"===t.mode?"mix":"add"}}function xs(t,e){return t===e||!(!t||!e)&&(t.mode===e.mode&&t.power===e.power&&t.strength===e.strength&&t.color[0]===e.color[0]&&t.color[1]===e.color[1]&&t.color[2]===e.color[2])}function Ss(t){if(!t||"object"!=typeof t)return;const e=(t,e)=>"number"==typeof t&&Number.isFinite(t)?t:e,i=Array.isArray(t.edgeColor)?t.edgeColor:[1,1,1],s=Array.isArray(t.maskScroll)?t.maskScroll:[0,0];return{mask:t.mask??null,softness:Math.max(1e-4,e(t.softness,.05)),edgeWidth:Math.max(0,e(t.edgeWidth,0)),edgeColor:[e(i[0],1),e(i[1],1),e(i[2],1)],maskScroll:[e(s[0],0),e(s[1],0)]}}function bs(t,e){return t===e||!(!t||!e)&&(t.mask===e.mask&&t.softness===e.softness&&t.edgeWidth===e.edgeWidth&&t.edgeColor[0]===e.edgeColor[0]&&t.edgeColor[1]===e.edgeColor[1]&&t.edgeColor[2]===e.edgeColor[2]&&t.maskScroll[0]===e.maskScroll[0]&&t.maskScroll[1]===e.maskScroll[1])}function ws(t){if(!t||"object"!=typeof t)return;const e=Number.isFinite(t[0])?t[0]:0,i=Number.isFinite(t[1])?t[1]:0;return 0===e&&0===i?void 0:[e,i]}function Ms(t,e){return t===e||!!t&&!!e&&t[0]===e[0]&&t[1]===e[1]}exports.RenderMode=void 0,(ms=exports.RenderMode||(exports.RenderMode={}))[ms.BillBoard=0]="BillBoard",ms[ms.StretchedBillBoard=1]="StretchedBillBoard",ms[ms.Mesh=2]="Mesh",ms[ms.Trail=3]="Trail",ms[ms.HorizontalBillBoard=4]="HorizontalBillBoard",ms[ms.VerticalBillBoard=5]="VerticalBillBoard",ms[ms.Beam=6]="Beam";class zs{constructor(t,e){this.visibleSystems=[],this.boundsMin_=new H,this.boundsMax_=new H,this.time=0,this.scene=e,this.maxParticles=1e3,this.systems=new Set,this.settings={instancingGeometry:t.instancingGeometry,instancingIndices:t.instancingIndices,instancingUVs:t.instancingUVs,instancingNormals:t.instancingNormals,renderMode:t.renderMode,renderOrder:t.renderOrder,uTileCount:t.uTileCount,vTileCount:t.vTileCount,blendTiles:t.blendTiles,softParticles:t.softParticles,softNearFade:t.softNearFade,softFarFade:t.softFarFade,materialBlendMode:t.materialBlendMode,materialTransparent:t.materialTransparent,materialDepthTest:t.materialDepthTest,materialDepthWrite:t.materialDepthWrite,materialAlphaTest:t.materialAlphaTest,texture:t.texture,reflectionTexture:t.reflectionTexture??null,reflectionLevel:t.reflectionLevel??1,reflectionFaces:t.reflectionFaces??null,reflectionAtlas:t.reflectionAtlas??null,pivot:t.pivot?.clone(),sortMode:t.sortMode??"none",minParticleSize:t.minParticleSize??0,maxParticleSize:t.maxParticleSize??1/0,layerMask:t.layerMask,renderingGroupId:t.renderingGroupId??0,applyFog:t.applyFog??!0,lighting:t.lighting,rim:vs(t.rim),uvScroll:ws(t.uvScroll),gradientMap:t.gradientMap??null,erosion:Ss(t.erosion)},this.mesh=new l.Mesh("vfxBatch",e),this.configureMesh()}configureMesh(){const t=this.mesh;t.alwaysSelectAsActiveMesh=!0,t.doNotSyncBoundingInfo=!0,t.setBoundingInfo(new f.BoundingInfo(a.Vector3.Zero(),a.Vector3.Zero())),t.layerMask=this.settings.layerMask,t.renderingGroupId=this.settings.renderingGroupId,t.alphaIndex=this.settings.renderOrder,t.applyFog=!1}refreshBoundingInfo(){const t=this.boundsMin_,e=this.boundsMax_;let i=1/0,s=1/0,r=1/0,n=-1/0,o=-1/0,a=-1/0,l=!1;const h=this.visibleSystems;for(let c=0;c<h.length;c++){const u=h[c];if(0!==u.particleNum&&"function"==typeof u.getWorldBounds){if(!u.getWorldBounds(t,e))return void(this.mesh.alwaysSelectAsActiveMesh=!0);l=!0,t.x<i&&(i=t.x),t.y<s&&(s=t.y),t.z<r&&(r=t.z),e.x>n&&(n=e.x),e.y>o&&(o=e.y),e.z>a&&(a=e.z)}}if(!l)return;const c=this.mesh.getBoundingInfo(),u=c.minimum,d=c.maximum;u.x===i&&u.y===s&&u.z===r&&d.x===n&&d.y===o&&d.z===a||(u.set(i,s,r),d.set(n,o,a),c.reConstruct(u,d)),this.mesh.alwaysSelectAsActiveMesh=!1}fogDefines(){if(!this.settings.applyFog)return[];return this.settings.materialTransparent&&(this.settings.materialBlendMode===r.Constants.ALPHA_ADD||this.settings.materialBlendMode===r.Constants.ALPHA_ONEONE)?["FOG","FOG_ADDITIVE"]:["FOG"]}bindFog(t){if(!this.settings.applyFog)return;const e=this.scene;t.onBindObservable.add(()=>{const i=t.getEffect();if(!i)return;const s=e.fogEnabled?e.fogMode:m.Scene.FOGMODE_NONE;i.setFloat4("vFogInfos",s,e.fogStart,e.fogEnd,e.fogDensity),i.setColor3("vFogColor",e.fogColor)})}surfaceDefines(){const t=[];this.settings.uvScroll&&t.push("UV_SCROLL"),this.settings.gradientMap&&t.push("GRADIENT_MAP");const e=this.settings.erosion;return e&&(t.push("EROSION"),e.mask&&t.push("EROSION_MASK")),t}surfaceUniforms(t,e){this.settings.uvScroll&&t.push("uvScrollOffset"),this.settings.gradientMap&&(e.push("gradientMap"),t.push("gradientMapRange"));const i=this.settings.erosion;i&&(t.push("erosionParams","erosionEdgeColor"),i.mask&&e.push("erosionMask"))}bindSurface(t){const{uvScroll:e,gradientMap:i,erosion:s}=this.settings;if(i&&t.setTexture("gradientMap",i),s&&(s.mask&&t.setTexture("erosionMask",s.mask),t.setVector3("erosionEdgeColor",new a.Vector3(s.edgeColor[0],s.edgeColor[1],s.edgeColor[2]))),!e&&!s&&!i)return;const r=t=>t-Math.floor(t),n=new a.Vector2,o=new a.Vector4,l=new a.Vector2(0,1),h=()=>{const a=this.time,h=t.getEffect();if(e&&(n.set(r(e[0]*a),r(e[1]*a)),t.setVector2("uvScrollOffset",n),h?.setVector2("uvScrollOffset",n)),s&&(o.set(s.softness,s.edgeWidth,r(s.maskScroll[0]*a),r(s.maskScroll[1]*a)),t.setVector4("erosionParams",o),h?.setVector4("erosionParams",o)),i){const e=i.getSize().width,s=e>0?.5/e:0;l.set(s,1-s),t.setVector2("gradientMapRange",l),h?.setVector2("gradientMapRange",l)}};h(),t.onBindObservable.add(h)}addSystem(t){this.systems.add(t)}removeSystem(t){this.systems.delete(t)}getVisibleSystems(){const t=this.visibleSystems;let e=0;for(const i of this.systems)i.emitter.visible&&!0!==i.culled&&(t[e++]=i);return t.length=e,t}applyDepthTexture(t){const e=this.mesh.material;e&&e instanceof n.ShaderMaterial&&e.setTexture("depthTexture",t)}applyMeshLighting(t){}dispose(){this.mesh.dispose()}}zs.FOG_UNIFORMS=["vFogInfos","vFogColor"];class _s extends zs{static whiteTexture(t){let e=_s.whiteTextureByScene.get(t);return e||(e=o.RawTexture.CreateRGBATexture(new Uint8Array([255,255,255,255]),1,1,t),e.name="quarksMeshWhite",_s.whiteTextureByScene.set(t,e)),e}constructor(t,e){super(t,e),this.shaderMaterial=null,this.fixedLightDirection=new a.Vector3,this.fixedLightColor=new a.Vector3,this.fixedAmbientColor=new a.Vector3,this.gatherScratch=[],this.vector_=new H,this.vector2_=new H,this.vector3_=new H,this.quaternion_=new Z,this.quaternion2_=new Z,this.quaternion3_=new Z,this.quaternion4_=new Z,this.quaternion5_=new Z,this.rotationMat_=new pt,this.rotationMat2_=new pt,this.lastStretchedSpeedFactor=Number.NaN,this.clearedInstanceUploaded=!1,this.beamEnd_=new H,this.storeFixedLighting(gs()),this.maxParticles=1e3,this.setupBuffers(),this.rebuildMaterial()}setupBuffers(){this.mesh.dispose(),this.mesh=new l.Mesh("spriteBatch",this.scene),this.configureMesh();const t=new h.VertexData;t.positions=this.settings.instancingGeometry,t.indices=this.settings.instancingIndices;const e=this.settings.instancingGeometry.length/3,i=this.settings.instancingUVs;i&&i.length>=2*e?t.uvs=i:t.uvs=new Float32Array(2*e),this.settings.instancingNormals&&(t.normals=this.settings.instancingNormals),t.applyToMesh(this.mesh,!1),this.buildExpandableBuffers()}disposeExpandableBuffers(){this.offsetVB?.dispose(),this.colorVB?.dispose(),this.sizeVB?.dispose(),this.uvTileVB?.dispose(),this.rotationVB?.dispose(),this.velocityVB?.dispose(),this.velocityVB=void 0,this.velocityBuffer=void 0}buildExpandableBuffers(){const e=this.scene.getEngine();this.offsetBuffer=new Float32Array(3*this.maxParticles),this.offsetVB=new t.VertexBuffer(e,this.offsetBuffer,"offset",!0,!1,3,!0),this.mesh.setVerticesBuffer(this.offsetVB),this.colorBuffer=new Float32Array(4*this.maxParticles),this.colorVB=new t.VertexBuffer(e,this.colorBuffer,"color",!0,!1,4,!0),this.mesh.setVerticesBuffer(this.colorVB),this.sizeBuffer=new Float32Array(3*this.maxParticles),this.sizeVB=new t.VertexBuffer(e,this.sizeBuffer,"size",!0,!1,3,!0),this.mesh.setVerticesBuffer(this.sizeVB),this.uvTileBuffer=new Float32Array(this.maxParticles),this.uvTileVB=new t.VertexBuffer(e,this.uvTileBuffer,"uvTile",!0,!1,1,!0),this.mesh.setVerticesBuffer(this.uvTileVB),this.settings.renderMode===exports.RenderMode.Mesh?(this.rotationBuffer=new Float32Array(4*this.maxParticles),this.rotationVB=new t.VertexBuffer(e,this.rotationBuffer,"rotation",!0,!1,4,!0)):(this.rotationBuffer=new Float32Array(this.maxParticles),this.rotationVB=new t.VertexBuffer(e,this.rotationBuffer,"rotation",!0,!1,1,!0)),this.mesh.setVerticesBuffer(this.rotationVB),_s.drawsAlongVelocity(this.settings.renderMode)&&(this.velocityBuffer=new Float32Array(4*this.maxParticles),this.velocityVB=new t.VertexBuffer(e,this.velocityBuffer,"velocity",!0,!1,4,!0),this.mesh.setVerticesBuffer(this.velocityVB)),this.mesh.forcedInstanceCount=0,this.mesh.doNotSyncBoundingInfo=!0}expandBuffers(t){for(;t>=this.maxParticles;)this.maxParticles*=2;this.disposeExpandableBuffers(),this.buildExpandableBuffers(),this.sortScratch=void 0,this.gatherScratch.length=0}sizeLimits(){const{minParticleSize:t,maxParticleSize:e}=this.settings;return _s.takesPivotAndFlip(this.settings.renderMode)?t<=0&&e===1/0?null:new a.Vector2(Math.max(0,t),Math.min(e,1e9)):null}sortInstances(t,e,i){if(t<2)return;const s=this.sortScratch??(this.sortScratch=new ls(this.maxParticles));s.ensure(t);const r=s.keys,n=this.settings.sortMode;if("distance"===n){const e=this.scene.activeCameras?.[0]??this.scene.activeCamera;if(!e)return;const i=e.globalPosition,n=i.x,o=i.y,a=i.z,l=this.offsetBuffer;for(let e=0,i=0;e<t;e++,i+=3){const t=l[i]-n,h=l[i+1]-o,c=l[i+2]-a;r[e]=s.floatKey(t*t+h*h+c*c,!0)}}else{const e="youngestInFront"===n,i=this.visibleSystems;let o=0;for(let t=0;t<i.length;t++){const n=i[t],a=n.particleNum,l=n.store;if(0===a)continue;if(void 0===l){const t=n.particles;for(let i=0;i<a;i++)r[o++]=s.floatKey(t[i].age,e);continue}const h=l.scalars,c=Me.SCALAR_STRIDE;for(let t=0,i=Me.AGE;t<a;t++,i+=c)r[o++]=s.floatKey(h[i],e)}if(o!==t)return}const o=function(t,e){const i=t.keys,s=t.counts;let r=t.orderA,n=t.orderB;for(let t=0;t<e;t++)r[t]=t;for(let t=0;t<32;t+=11){s.fill(0);for(let n=0;n<e;n++)s[i[r[n]]>>>t&as]++;if(s[i[r[0]]>>>t&as]===e)continue;let o=0;for(let t=0;t<os;t++){const e=s[t];s[t]=o,o+=e}for(let o=0;o<e;o++){const e=r[o];n[s[i[e]>>>t&as]++]=e}const a=r;r=n,n=a}return r}(s,t);this.offsetBuffer=this.gatherInto(0,this.offsetBuffer,o,t,3),this.sizeBuffer=this.gatherInto(1,this.sizeBuffer,o,t,3),this.colorBuffer=this.gatherInto(2,this.colorBuffer,o,t,4),this.uvTileBuffer=this.gatherInto(3,this.uvTileBuffer,o,t,1),this.rotationBuffer=this.gatherInto(4,this.rotationBuffer,o,t,e?4:1),i&&this.velocityBuffer&&(this.velocityBuffer=this.gatherInto(5,this.velocityBuffer,o,t,4))}gatherInto(t,e,i,s,r){let n=this.gatherScratch[t];return void 0!==n&&n.length===e.length||(n=new Float32Array(e.length)),function(t,e,i,s,r){if(1===r)for(let r=0;r<s;r++)e[r]=t[i[r]];else if(3===r)for(let r=0,n=0;r<s;r++,n+=3){const s=3*i[r];e[n]=t[s],e[n+1]=t[s+1],e[n+2]=t[s+2]}else if(4===r)for(let r=0,n=0;r<s;r++,n+=4){const s=4*i[r];e[n]=t[s],e[n+1]=t[s+1],e[n+2]=t[s+2],e[n+3]=t[s+3]}else for(let n=0;n<s;n++){const s=i[n]*r,o=n*r;for(let i=0;i<r;i++)e[o+i]=t[s+i]}}(e,n,i,s,r),this.gatherScratch[t]=e,n}rebuildMaterial(){const t=`quarksParticle_${this.settings.renderMode}`;this.lastStretchedSpeedFactor=Number.NaN;const e=this.fogDefines();let i,s;this.settings.renderMode===exports.RenderMode.Mesh?(i={glsl:Yi,wgsl:hs},s={glsl:es,wgsl:us}):_s.drawsAlongVelocity(this.settings.renderMode)?(i={glsl:ss,wgsl:ys},s={glsl:ts,wgsl:cs}):(i={glsl:is,wgsl:ds},s={glsl:ts,wgsl:cs});const o=this.settings.texture??(this.settings.renderMode===exports.RenderMode.Mesh?_s.whiteTexture(this.scene):null);o&&e.push("USE_MAP");const l=this.settings.reflectionAtlas;if(this.settings.renderMode===exports.RenderMode.Mesh&&!!l&&!l.isReady()&&l){const t=l.onLoadObservable;t?.addOnce(()=>{this.rebuildMaterial()})}const h=this.settings.renderMode===exports.RenderMode.Mesh&&!!l&&l.isReady();h&&e.push("USE_ENVMAP_ATLAS"),(this.settings.uTileCount>1||this.settings.vTileCount>1)&&e.push("UV_TILE"),this.settings.blendTiles&&e.push("TILE_BLEND"),this.settings.softParticles&&e.push("SOFT_PARTICLES"),this.settings.materialAlphaTest>0&&e.push("USE_ALPHATEST"),this.settings.renderMode===exports.RenderMode.VerticalBillBoard&&e.push("VERTICAL"),this.settings.renderMode===exports.RenderMode.HorizontalBillBoard&&e.push("HORIZONTAL"),this.settings.renderMode===exports.RenderMode.Beam&&e.push("BEAM");const c=_s.takesPivotAndFlip(this.settings.renderMode)?this.settings.pivot:void 0;c&&e.push("PIVOT");const u=this.sizeLimits();u&&e.push("SIZE_LIMITS");const d=this.settings.renderMode===exports.RenderMode.Mesh,f=this.settings.lighting??"fixed",p=d&&"unlit"!==f;d&&!p&&e.push("MESH_UNLIT");const m=d?this.settings.rim:void 0;m&&(e.push("MESH_RIM"),"mix"===m.mode&&e.push("MESH_RIM_MIX"));const y=h||!!m;e.push(...this.surfaceDefines());const g=fs(this.scene.getEngine());ps(t,i,s,g);const v=["position","uv","offset","color","size","rotation","uvTile"];this.settings.renderMode===exports.RenderMode.Mesh&&v.push("normal"),_s.drawsAlongVelocity(this.settings.renderMode)&&v.push("velocity");const x=["world","view","projection","worldView","worldViewProjection",...zs.FOG_UNIFORMS],S=[];(this.settings.uTileCount>1||this.settings.vTileCount>1)&&(x.push("tileCountX"),x.push("tileCountY")),o&&S.push("map"),h&&(S.push("envAtlas"),x.push("reflectionLevel")),y&&x.push("eyePosition"),m&&(x.push("rimColor"),x.push("rimParams")),this.surfaceUniforms(x,S),_s.drawsAlongVelocity(this.settings.renderMode)&&x.push("speedFactor"),this.settings.softParticles&&(x.push("softParams"),x.push("projParams"),S.push("depthTexture")),this.settings.materialAlphaTest>0&&x.push("alphaTest"),c&&x.push("pivot"),u&&x.push("sizeLimits"),p&&(x.push("lightDirection"),x.push("lightColor"),x.push("ambientColor"));const b=new n.ShaderMaterial(t,this.scene,{vertex:t,fragment:t},{attributes:v,uniforms:x,samplers:S,defines:e,needAlphaBlending:this.settings.materialTransparent,shaderLanguage:g});if(o&&b.setTexture("map",o),h&&l&&(b.setTexture("envAtlas",l),b.setFloat("reflectionLevel",this.settings.reflectionLevel)),m&&(b.setVector3("rimColor",new a.Vector3(m.color[0],m.color[1],m.color[2])),b.setVector2("rimParams",new a.Vector2(m.power,m.strength))),y){const t=new a.Vector3;b.setVector3("eyePosition",t),b.onBindObservable.add(()=>{const e=this.scene.activeCamera;e&&(t.copyFrom(e.globalPosition),b.setVector3("eyePosition",t))})}if((this.settings.uTileCount>1||this.settings.vTileCount>1)&&(b.setFloat("tileCountX",this.settings.uTileCount),b.setFloat("tileCountY",this.settings.vTileCount)),_s.drawsAlongVelocity(this.settings.renderMode)&&b.setFloat("speedFactor",this.settings.softNearFade>0?this.settings.softNearFade:1),this.settings.softParticles){b.setVector2("softParams",new a.Vector2(this.settings.softNearFade,1/Math.max(this.settings.softFarFade-this.settings.softNearFade,1e-4)));const t=new a.Vector4(0,0,0,0);b.onBindObservable.add(()=>{const e=this.scene.activeCamera;e&&(t.x=e.minZ,t.y=e.maxZ,b.setVector4("projParams",t))})}if(this.settings.materialAlphaTest>0&&b.setFloat("alphaTest",this.settings.materialAlphaTest),c&&b.setVector3("pivot",new a.Vector3(c.x,c.y,c.z)),u&&b.setVector2("sizeLimits",u),p&&(this.writeFixedLighting(b),"scene"===f)){const t=new a.Vector3,e=new a.Vector3,i=new a.Vector3;b.onBindObservable.add(()=>{_s.readSceneLight(this.scene,t,e,i)?(b.setVector3("lightDirection",t),b.setVector3("lightColor",e),b.setVector3("ambientColor",i)):this.writeFixedLighting(b)})}this.bindFog(b),this.bindSurface(b),b.backFaceCulling=!1,this.settings.materialTransparent?b.alphaMode=this.settings.materialBlendMode:b.alphaMode=r.Constants.ALPHA_DISABLE,b.needDepthPrePass=this.settings.materialDepthWrite,b.forceDepthWrite=this.settings.materialDepthWrite,b.disableDepthWrite=!this.settings.materialDepthWrite,this.mesh.material=b,this.shaderMaterial=b}applyMeshLighting(t){this.storeFixedLighting(t);const e=this.shaderMaterial;null!==e&&this.settings.renderMode===exports.RenderMode.Mesh&&"unlit"!==this.settings.lighting&&this.writeFixedLighting(e)}storeFixedLighting(t){this.fixedLightDirection.copyFrom(t.direction),this.fixedLightColor.set(t.color.r,t.color.g,t.color.b),this.fixedAmbientColor.set(t.ambient.r,t.ambient.g,t.ambient.b)}writeFixedLighting(t){t.setVector3("lightDirection",this.fixedLightDirection),t.setVector3("lightColor",this.fixedLightColor),t.setVector3("ambientColor",this.fixedAmbientColor)}static readSceneLight(t,e,i,s){const r=t.lights;for(let n=0;n<r.length;n++){const o=r[n],a=o.getClassName();if("DirectionalLight"!==a&&"HemisphericLight"!==a||!o.isEnabled())continue;const l=o.intensity,h=o.diffuse,c=t.ambientColor;i.set(h.r*l,h.g*l,h.b*l),s.set(c.r,c.g,c.b);const u=o.direction;if("DirectionalLight"===a)e.copyFrom(u);else{e.copyFrom(u).scaleInPlace(-1);const t=o.groundColor;t&&(s.x+=t.r*l,s.y+=t.g*l,s.z+=t.b*l)}return!0}return!1}update(){let t=0,e=0;const i=this.settings.renderMode,s=i===exports.RenderMode.Mesh,r=i===exports.RenderMode.StretchedBillBoard,n=i===exports.RenderMode.Beam,o=r||n,a=_s.takesPivotAndFlip(i),l=this.getVisibleSystems();for(let t=0;t<l.length;t++)e+=l[t].particleNum;e>this.maxParticles&&this.expandBuffers(e);for(let e=0;e<l.length;e++){const i=l[e],o=i.particleNum;if(0===o)continue;const h=i.particles,c=this.quaternion2_,u=this.vector2_,d=this.vector3_,f=i.worldSpace,p=i.emitter.matrixWorld;if(s&&!f)p.decompose(u,c,d);else{const t=p.elements;d.set(Math.sqrt(t[0]*t[0]+t[1]*t[1]+t[2]*t[2]),Math.sqrt(t[4]*t[4]+t[5]*t[5]+t[6]*t[6]),Math.sqrt(t[8]*t[8]+t[9]*t[9]+t[10]*t[10]))}r&&!f&&this.rotationMat_.setFromMatrix4(p);const m=Math.abs(d.x),y=Math.abs(d.y),g=Math.abs(d.z),v=r?i.rendererEmitterSettings:void 0,x=void 0===v||0===v.speedFactor?.001:v.speedFactor,S=v?.lengthFactor??0,b=i.store,w=void 0!==b,M=void 0!==b&&!0!==i.onlyUsedByOther,z=i.simulationResidual??0,_=0===z?0:z/(i.simulationStep??z);w&&(0!==_&&o>0&&b.previousColor!==b.color?_s.continueColor(this.colorBuffer,4*t,b,o,_):this.colorBuffer.set(b.color.subarray(0,4*o),4*t));let P=!1;if(void 0!==b&&f)0!==_&&o>0?_s.extrapolate(this.offsetBuffer,3*t,b,o,_):this.offsetBuffer.set(b.position.subarray(0,3*o),3*t),0!==_&&o>0&&b.previousSize!==b.size?_s.continueVector3(this.sizeBuffer,3*t,b.size,b.previousSize,o,_):this.sizeBuffer.set(b.size.subarray(0,3*o),3*t),P=!0;else if(M&&o>0){const e=3*t,i=e+3*o,s=this.offsetBuffer;0!==_?_s.extrapolate(s,e,b,o,_):s.set(b.position.subarray(0,3*o),e);const r=p.elements,n=r[0],a=r[1],l=r[2],h=r[3],c=r[4],u=r[5],d=r[6],f=r[7],v=r[8],x=r[9],S=r[10],w=r[11],M=r[12],z=r[13],T=r[14],V=r[15];for(let t=e;t<i;t+=3){const e=s[t],i=s[t+1],r=s[t+2],o=1/(h*e+f*i+w*r+V);s[t]=(n*e+c*i+v*r+M)*o,s[t+1]=(a*e+u*i+x*r+z)*o,s[t+2]=(l*e+d*i+S*r+T)*o}const O=this.sizeBuffer;0!==_&&b.previousSize!==b.size?_s.continueVector3(O,e,b.size,b.previousSize,o,_):O.set(b.size.subarray(0,3*o),e);for(let t=e;t<i;t+=3)O[t]*=m,O[t+1]*=y,O[t+2]*=g;P=!0}const T=t;if(M&&!s){const e=b;this.uvTileBuffer.set(e.uvTile.subarray(0,o),T);const i=this.rotationBuffer;if(i.set(e.rotation.subarray(0,o),T),0!==z){const t=e.angularVelocity;for(let e=0;e<o;e++)i[T+e]+=t[e]*z}r&&this.velocityBuffer&&_s.writeVelocities(this.velocityBuffer,4*T,e,o,_,f?null:this.rotationMat_,x,S),t+=o}else if(M&&b.rotationQuaternion.length>0){const e=b;this.uvTileBuffer.set(e.uvTile.subarray(0,o),T),_s.writeQuaternions(this.rotationBuffer,4*T,e,o,_,f?null:c),t+=o}else for(let e=0;e<o;e++,t++){const i=h[e];if(s){let e=i.rotation;const s=i.angularVelocity;let r;if(0!==_&&s instanceof Z&&(e=this.quaternion4_.copy(e).multiply(_s.partialTurn(s,_,this.quaternion5_))),f)r=e;else{let t;t=i.parentMatrix?this.quaternion3_.setFromRotationMatrix(i.parentMatrix):c,r=this.quaternion_,r.copy(t).multiply(e)}const n=4*t;this.rotationBuffer[n]=r.x,this.rotationBuffer[n+1]=r.y,this.rotationBuffer[n+2]=r.z,this.rotationBuffer[n+3]=r.w}else{const e=i.angularVelocity;this.rotationBuffer[t]=i.rotation+("number"==typeof e?e*z:0)}if(!P){const e=i.position,s=i.previousPosition;let r=e.x+(e.x-s.x)*_,n=e.y+(e.y-s.y)*_,o=e.z+(e.z-s.z)*_;if(!f){const t=(i.parentMatrix??p).elements,e=1/(t[3]*r+t[7]*n+t[11]*o+t[15]),s=(t[0]*r+t[4]*n+t[8]*o+t[12])*e,a=(t[1]*r+t[5]*n+t[9]*o+t[13])*e;o=(t[2]*r+t[6]*n+t[10]*o+t[14])*e,r=s,n=a}const a=3*t;this.offsetBuffer[a]=r,this.offsetBuffer[a+1]=n,this.offsetBuffer[a+2]=o;const l=i.size,h=3*t;f||i.parentMatrix?(this.sizeBuffer[h]=l.x,this.sizeBuffer[h+1]=l.y,this.sizeBuffer[h+2]=l.z):(this.sizeBuffer[h]=l.x*m,this.sizeBuffer[h+1]=l.y*y,this.sizeBuffer[h+2]=l.z*g)}if(!w){const e=i.color,s=4*t;this.colorBuffer[s]=e.x,this.colorBuffer[s+1]=e.y,this.colorBuffer[s+2]=e.z,this.colorBuffer[s+3]=e.w}if(this.uvTileBuffer[t]=i.uvTile,r&&this.velocityBuffer){const e=i.velocity,s=i.previousVelocity,r=e.x+(e.x-s.x)*_,n=e.y+(e.y-s.y)*_,o=e.z+(e.z-s.z)*_;let a=this.vector_;a.set(r,n,o),f||(i.parentMatrix?(this.rotationMat2_.setFromMatrix4(i.parentMatrix),a.applyMatrix3(this.rotationMat2_)):a.applyMatrix3(this.rotationMat_));const l=4*t;this.velocityBuffer[l]=a.x*x,this.velocityBuffer[l+1]=a.y*x,this.velocityBuffer[l+2]=a.z*x,this.velocityBuffer[l+3]=S}}a&&void 0!==i.flip&&(void 0!==b?_s.applyFlip(this.sizeBuffer,3*T,b.flip,o):_s.applyFlipFromParticles(this.sizeBuffer,3*T,h,o)),n&&this.velocityBuffer&&this.writeBeams(i,T,t-T)}r&&l.length>0&&this.syncStretchedSpeedFactor(l[0]),this.mesh.forcedInstanceCount=t,this.refreshBoundingInfo(),0!==t?(this.clearedInstanceUploaded=!1,"none"!==this.settings.sortMode&&this.sortInstances(t,s,o),this.offsetVB.update(this.offsetBuffer.subarray(0,3*t)),this.sizeVB.update(this.sizeBuffer.subarray(0,3*t)),this.colorVB.update(this.colorBuffer.subarray(0,4*t)),this.uvTileVB.update(this.uvTileBuffer.subarray(0,t)),this.rotationVB.update(this.rotationBuffer.subarray(0,s?4*t:t)),o&&this.velocityVB&&this.velocityBuffer&&this.velocityVB.update(this.velocityBuffer.subarray(0,4*t))):this.clearedInstanceUploaded||(this.uploadClearedInstance(s,o),this.clearedInstanceUploaded=!0)}syncStretchedSpeedFactor(t){const e=this.shaderMaterial;if(null===e)return;const i=t.rendererEmitterSettings.speedFactor??1,s=0===i?.001:i;s!==this.lastStretchedSpeedFactor&&(e.setFloat("speedFactor",s),this.lastStretchedSpeedFactor=s)}static drawsAlongVelocity(t){return t===exports.RenderMode.StretchedBillBoard||t===exports.RenderMode.Beam}writeBeams(t,e,i){const s=this.velocityBuffer,r=this.offsetBuffer,n=this.beamEnd_,o="function"==typeof t.getBeamEnd&&t.getBeamEnd(n);for(let t=e;t<e+i;t++){const e=3*t,i=4*t;s[i]=o?n.x-r[e]:0,s[i+1]=o?n.y-r[e+1]:0,s[i+2]=o?n.z-r[e+2]:0,s[i+3]=0}}static takesPivotAndFlip(t){return t===exports.RenderMode.BillBoard||t===exports.RenderMode.StretchedBillBoard||t===exports.RenderMode.VerticalBillBoard||t===exports.RenderMode.HorizontalBillBoard}static applyFlip(t,e,i,s){for(let r=0,n=e;r<s;r++,n+=3){const e=i[r];0!==e&&(1&e&&(t[n]=-t[n]),2&e&&(t[n+1]=-t[n+1]))}}static applyFlipFromParticles(t,e,i,s){for(let r=0,n=e;r<s;r++,n+=3){const e=i[r].flip;0!==e&&(1&e&&(t[n]=-t[n]),2&e&&(t[n+1]=-t[n+1]))}}static writeQuaternions(t,e,i,s,r,n){const o=i.rotationQuaternion,a=i.angularVelocityQuaternion,l=null!==n,h=l?n.x:0,c=l?n.y:0,u=l?n.z:0,d=l?n.w:1;for(let i=0,n=0,f=e;i<s;i++,n+=4,f+=4){let e=o[n],i=o[n+1],s=o[n+2],p=o[n+3];if(0!==r){const t=a[n]*r,o=a[n+1]*r,l=a[n+2]*r,h=1+(a[n+3]-1)*r,c=1/Math.sqrt(t*t+o*o+l*l+h*h),u=t*c,d=o*c,f=l*c,m=h*c,y=e*m+p*u+i*f-s*d,g=i*m+p*d+s*u-e*f,v=s*m+p*f+e*d-i*u;p=p*m-e*u-i*d-s*f,e=y,i=g,s=v}if(l){const t=h*p+d*e+c*s-u*i,r=c*p+d*i+u*e-h*s,n=u*p+d*s+h*i-c*e;p=d*p-h*e-c*i-u*s,e=t,i=r,s=n}t[f]=e,t[f+1]=i,t[f+2]=s,t[f+3]=p}}static writeVelocities(t,e,i,s,r,n,o,a){const l=i.velocity,h=i.previousVelocity.length>=3*s?i.previousVelocity:l,c=null!==n?n.elements:null;for(let i=0,n=0,u=e;i<s;i++,n+=3,u+=4){let e=l[n],i=l[n+1],s=l[n+2];if(0!==r&&(e+=(e-h[n])*r,i+=(i-h[n+1])*r,s+=(s-h[n+2])*r),null!==c){const t=c[0]*e+c[3]*i+c[6]*s,r=c[1]*e+c[4]*i+c[7]*s;s=c[2]*e+c[5]*i+c[8]*s,e=t,i=r}t[u]=e*o,t[u+1]=i*o,t[u+2]=s*o,t[u+3]=a}}static partialTurn(t,e,i){const s=t.x*e,r=t.y*e,n=t.z*e,o=1+(t.w-1)*e,a=1/Math.sqrt(s*s+r*r+n*n+o*o);return i.x=s*a,i.y=r*a,i.z=n*a,i.w=o*a,i}static continueVector3(t,e,i,s,r,n){for(let o=0,a=0;o<r;o++,a+=3){const r=i[a]+(i[a]-s[a])*n,o=i[a+1]+(i[a+1]-s[a+1])*n,l=i[a+2]+(i[a+2]-s[a+2])*n;t[e+a]=r>0?r:0,t[e+a+1]=o>0?o:0,t[e+a+2]=l>0?l:0}}static continueColor(t,e,i,s,r){const n=i.color,o=i.previousColor;for(let i=0,a=0;i<s;i++,a+=4){const i=n[a]+(n[a]-o[a])*r,s=n[a+1]+(n[a+1]-o[a+1])*r,l=n[a+2]+(n[a+2]-o[a+2])*r,h=n[a+3]+(n[a+3]-o[a+3])*r;t[e+a]=i>0?i:0,t[e+a+1]=s>0?s:0,t[e+a+2]=l>0?l:0,t[e+a+3]=h>0?h:0}}static extrapolate(t,e,i,s,r){const n=i.position,o=i.previousPosition;for(let i=0,a=0;i<s;i++,a+=3){const i=n[a],s=n[a+1],l=n[a+2];t[e+a]=i+(i-o[a])*r,t[e+a+1]=s+(s-o[a+1])*r,t[e+a+2]=l+(l-o[a+2])*r}}uploadClearedInstance(t,e){this.colorBuffer[3]=0,this.sizeBuffer[0]=0,this.sizeBuffer[1]=0,this.sizeBuffer[2]=0,this.colorVB.update(this.colorBuffer.subarray(0,4)),this.sizeVB.update(this.sizeBuffer.subarray(0,3)),this.offsetVB.update(this.offsetBuffer.subarray(0,3)),this.uvTileVB.update(this.uvTileBuffer.subarray(0,1)),t?this.rotationVB.update(this.rotationBuffer.subarray(0,4)):this.rotationVB.update(this.rotationBuffer.subarray(0,1)),e&&this.velocityVB&&this.velocityBuffer&&this.velocityVB.update(this.velocityBuffer.subarray(0,4))}dispose(){this.mesh.material&&this.mesh.material.dispose(),super.dispose()}}_s.whiteTextureByScene=new WeakMap;var Ps=`\nvarying vUV: vec2f;\nvarying vColor: vec4f;\n\n#ifdef USE_MAP\nvar mapSampler: sampler;\nvar map: texture_2d<f32>;\n#endif\n\n${Wi}\n${Hi}\n@fragment\nfn main(input: FragmentInputs) -> FragmentOutputs {\n${Ki(!1)}\n if (baseColor.a < 0.01) { discard; }\n\n${ji("baseColor")}\n fragmentOutputs.color = baseColor;\n}\n`,Ts=`\nattribute position: vec3f;\nattribute previous: vec3f;\nattribute next: vec3f;\nattribute side: f32;\nattribute width: f32;\nattribute uv: vec2f;\nattribute color: vec4f;\n\nuniform view: mat4x4f;\nuniform projection: mat4x4f;\nuniform lineWidth: f32;\nuniform resolution: vec2f;\nuniform sizeAttenuation: f32;\n\nvarying vUV: vec2f;\nvarying vColor: vec4f;\n\nfn fix(i: vec4f, aspect: f32) -> vec2f {\n var res = i.xy / i.w;\n res.x *= aspect;\n return res;\n}\n\n${Qi}\n@vertex\nfn main(input: VertexInputs) -> FragmentInputs {\n let aspect = uniforms.resolution.x / uniforms.resolution.y;\n var finalPosition = uniforms.projection * uniforms.view * vec4f(vertexInputs.position, 1.0);\n let prevPos = uniforms.projection * uniforms.view * vec4f(vertexInputs.previous, 1.0);\n let nextPos = uniforms.projection * uniforms.view * vec4f(vertexInputs.next, 1.0);\n\n let currentP = fix(finalPosition, aspect);\n let prevP = fix(prevPos, aspect);\n let nextP = fix(nextPos, aspect);\n\n let w = uniforms.lineWidth * vertexInputs.width;\n var dir: vec2f;\n if (distance(nextP, currentP) < 0.0001) {\n dir = normalize(currentP - prevP);\n } else if (distance(prevP, currentP) < 0.0001) {\n dir = normalize(nextP - currentP);\n } else {\n let dir1 = normalize(currentP - prevP);\n let dir2 = normalize(nextP - currentP);\n dir = normalize(dir1 + dir2);\n }\n var normal = vec4f(-dir.y, dir.x, 0.0, 1.0);\n normal.x *= 0.5 * w;\n normal.y *= 0.5 * w;\n normal = normal * uniforms.projection;\n if (uniforms.sizeAttenuation == 0.0) {\n let screen = (vec4f(uniforms.resolution, 0.0, 1.0) * uniforms.projection).xy;\n normal.x = normal.x * finalPosition.w / screen.x;\n normal.y = normal.y * finalPosition.w / screen.y;\n }\n finalPosition.x += normal.x * vertexInputs.side;\n finalPosition.y += normal.y * vertexInputs.side;\n\n vertexOutputs.position = finalPosition;\n${Gi("(uniforms.view * vec4f(vertexInputs.position, 1.0)).xyz")}\n vertexOutputs.vUV = vertexInputs.uv;\n vertexOutputs.vColor = vertexInputs.color;\n}\n`;class Vs extends zs{constructor(t,e){super(t,e),this.drawsNothing=!1,this.vector_=new H,this.vector2_=new H,this.vector3_=new H,this.quaternion_=new Z,this.maxParticles=1024,this.setupBuffers(),this.rebuildMaterial()}setupBuffers(){this.mesh.dispose(),this.mesh=new l.Mesh("trailBatch",this.scene),this.configureMesh(),this.buildGeometryBuffers()}buildGeometryBuffers(){this.positionBuffer=new Float32Array(6*this.maxParticles),this.previousBuffer=new Float32Array(6*this.maxParticles),this.nextBuffer=new Float32Array(6*this.maxParticles),this.uvBuffer=new Float32Array(4*this.maxParticles),this.sideBuffer=new Float32Array(2*this.maxParticles),this.widthBuffer=new Float32Array(2*this.maxParticles),this.colorBuffer=new Float32Array(8*this.maxParticles),this.indexBuffer=new Uint32Array(6*this.maxParticles);for(let t=0;t<this.sideBuffer.length;t+=2)this.sideBuffer[t]=1,this.sideBuffer[t+1]=-1;this.positionBuffer[0]=0,this.positionBuffer[1]=0,this.positionBuffer[2]=0,this.positionBuffer[3]=1,this.positionBuffer[4]=0,this.positionBuffer[5]=0,this.positionBuffer[6]=0,this.positionBuffer[7]=1,this.positionBuffer[8]=0,this.positionBuffer[9]=1,this.positionBuffer[10]=1,this.positionBuffer[11]=0,this.indexBuffer[0]=0,this.indexBuffer[1]=1,this.indexBuffer[2]=2,this.indexBuffer[3]=1,this.indexBuffer[4]=3,this.indexBuffer[5]=2,this.mesh.setVerticesData(t.VertexBuffer.PositionKind,this.positionBuffer,!0),this.mesh.setVerticesData(t.VertexBuffer.UVKind,this.uvBuffer,!0),this.mesh.setVerticesData(t.VertexBuffer.ColorKind,this.colorBuffer,!0,4),this.mesh.setIndices(this.indexBuffer,null,!0),this.drawsNothing=!1,this.mesh.subMeshes&&this.mesh.subMeshes.length>0&&(this.mesh.subMeshes[0].indexCount=6);const e=this.scene.getEngine();this.previousVB=new t.VertexBuffer(e,this.previousBuffer,"previous",!0,!1,3,!1),this.nextVB=new t.VertexBuffer(e,this.nextBuffer,"next",!0,!1,3,!1),this.sideVB=new t.VertexBuffer(e,this.sideBuffer,"side",!0,!1,1,!1),this.widthVB=new t.VertexBuffer(e,this.widthBuffer,"width",!0,!1,1,!1),this.mesh.setVerticesBuffer(this.previousVB),this.mesh.setVerticesBuffer(this.nextVB),this.mesh.setVerticesBuffer(this.sideVB),this.mesh.setVerticesBuffer(this.widthVB),this.mesh.subMeshes&&this.adoptMeshBounds()}expandBuffers(t){for(;t>=this.maxParticles;)this.maxParticles*=2;this.previousVB?.dispose(),this.nextVB?.dispose(),this.sideVB?.dispose(),this.widthVB?.dispose(),this.buildGeometryBuffers()}rebuildMaterial(){const t="quarksTrail",e=this.fogDefines();this.settings.texture&&e.push("USE_MAP"),e.push(...this.surfaceDefines());const i=fs(this.scene.getEngine());ps(t,{glsl:ns,wgsl:Ts},{glsl:rs,wgsl:Ps},i);const s=["world","view","projection","worldViewProjection","lineWidth","resolution","sizeAttenuation",...zs.FOG_UNIFORMS],o=[];this.settings.texture&&o.push("map"),this.surfaceUniforms(s,o);const l=new n.ShaderMaterial(t,this.scene,{vertex:t,fragment:t},{attributes:["position","previous","next","side","width","uv","color"],uniforms:s,samplers:o,defines:e,needAlphaBlending:this.settings.materialTransparent,shaderLanguage:i});this.settings.texture&&l.setTexture("map",this.settings.texture);const h=this.scene.getEngine();l.setFloat("lineWidth",1);const c=new a.Vector2(h.getRenderWidth(),h.getRenderHeight());l.setVector2("resolution",c),l.setFloat("sizeAttenuation",1),l.onBindObservable.add(()=>{const t=this.scene.getEngine(),e=t.getRenderWidth(),i=t.getRenderHeight();c.x===e&&c.y===i||(c.x=e,c.y=i,l.setVector2("resolution",c))}),this.bindFog(l),this.bindSurface(l),l.backFaceCulling=!1,this.settings.materialTransparent?l.alphaMode=this.settings.materialBlendMode:l.alphaMode=r.Constants.ALPHA_DISABLE,l.needDepthPrePass=this.settings.materialDepthWrite,l.forceDepthWrite=this.settings.materialDepthWrite,l.disableDepthWrite=!this.settings.materialDepthWrite,this.mesh.material=l}static ensureWorldMatrix(t){const e=t.emitter;!e.computeWorldMatrix||e.isSynchronized&&e.isSynchronized()||e.computeWorldMatrix(!0)}update(){let t=0,e=0,i=0;const s=this.getVisibleSystems();for(let t=0;t<s.length;t++){const e=s[t],r=e.particles;for(let t=0;t<e.particleNum;t++){const e=r[t].historyCount;0!==e&&(i+=2*e+2)}}i>this.maxParticles&&this.expandBuffers(i);for(let i=0;i<s.length;i++){const r=s[i],n=t;Vs.ensureWorldMatrix(r);const o=this.quaternion_,a=this.vector2_,l=this.vector3_,h=r.emitter.matrixWorld;h.decompose(a,o,l);const c=r.particles,u=r.particleNum,d=this.settings.uTileCount,f=this.settings.vTileCount,p=1/d,m=1/f,y=r.worldSpace,g=(Math.abs(l.x)+Math.abs(l.y)+Math.abs(l.z))/3,v=r.rendererEmitterSettings,x=Boolean(v.uvFromHead),S=Boolean(v.colorFromParticle),b=y||Boolean(v.recordWorldSpace),w=v.followLocalOrigin?0:r.simulationResidual??0,M=0===w?0:w/(r.simulationStep??w);for(let i=0;i<u;i++){const s=c[i],r=s.historyCount;if(0===r)continue;const n=s.historyCapacity,o=s.historyPositions,a=s.historySizes,l=S?s.store.color:s.historyColors,u=4*s.storeIndex,d=s.uvTile%f,v=Math.floor(s.uvTile/f+.001),w=(s.parentMatrix??h).elements,z=w[0],_=w[1],P=w[2],T=w[3],V=w[4],O=w[5],C=w[6],F=w[7],A=w[8],B=w[9],$=w[10],I=w[11],E=w[12],N=w[13],R=w[14],L=w[15],D=1/(0!==M?r:Math.max(1,r-1));let U=s.getHistoryIndex(0),q=o[3*U],k=o[3*U+1],J=o[3*U+2];if(!b){const t=1/(T*q+F*k+I*J+L),e=(z*q+V*k+A*J+E)*t,i=(_*q+O*k+B*J+N)*t;J=(P*q+C*k+$*J+R)*t,q=e,k=i}let Q=q,G=k,W=J;for(let i=0;i<r;i++,t+=2){let h=q,c=k,w=J,M=U;if(i+1<r){M=U+1===n?0:U+1;const t=3*M;if(h=o[t],c=o[t+1],w=o[t+2],!b){const t=1/(T*h+F*c+I*w+L),e=(z*h+V*c+A*w+E)*t,i=(_*h+O*c+B*w+N)*t;w=(P*h+C*c+$*w+R)*t,h=e,c=i}}const j=a[U],Y=S?u:4*U,X=l[Y],Z=l[Y+1],H=l[Y+2],K=l[Y+3],tt=3*t;this.positionBuffer[tt]=q,this.positionBuffer[tt+1]=k,this.positionBuffer[tt+2]=J,this.positionBuffer[tt+3]=q,this.positionBuffer[tt+4]=k,this.positionBuffer[tt+5]=J,this.previousBuffer[tt]=Q,this.previousBuffer[tt+1]=G,this.previousBuffer[tt+2]=W,this.previousBuffer[tt+3]=Q,this.previousBuffer[tt+4]=G,this.previousBuffer[tt+5]=W,this.nextBuffer[tt]=h,this.nextBuffer[tt+1]=c,this.nextBuffer[tt+2]=w,this.nextBuffer[tt+3]=h,this.nextBuffer[tt+4]=c,this.nextBuffer[tt+5]=w,y||s.parentMatrix?(this.widthBuffer[t]=j,this.widthBuffer[t+1]=j):(this.widthBuffer[t]=j*g,this.widthBuffer[t+1]=j*g);const et=2*t,it=i*D,st=((x?1-it:it)+d)*p;this.uvBuffer[et]=st,this.uvBuffer[et+1]=(f-v-1)*m,this.uvBuffer[et+2]=st,this.uvBuffer[et+3]=(f-v)*m;const rt=4*t;this.colorBuffer[rt]=X,this.colorBuffer[rt+1]=Z,this.colorBuffer[rt+2]=H,this.colorBuffer[rt+3]=K,this.colorBuffer[rt+4]=X,this.colorBuffer[rt+5]=Z,this.colorBuffer[rt+6]=H,this.colorBuffer[rt+7]=K,i+1<r&&(this.indexBuffer[3*e]=t,this.indexBuffer[3*e+1]=t+1,this.indexBuffer[3*e+2]=t+2,e++,this.indexBuffer[3*e]=t+2,this.indexBuffer[3*e+1]=t+1,this.indexBuffer[3*e+2]=t+3,e++),Q=q,G=k,W=J,q=h,k=c,J=w,U=M}if(0!==M){const i=s.previousPosition,r=s.position;let n=r.x+(r.x-i.x)*M,o=r.y+(r.y-i.y)*M,a=r.z+(r.z-i.z)*M;const l=t-2,h=this.positionBuffer[3*l],c=this.positionBuffer[3*l+1],u=this.positionBuffer[3*l+2];if(!y){const t=1/(T*n+F*o+I*a+L),e=(z*n+V*o+A*a+E)*t,i=(_*n+O*o+B*a+N)*t;a=(P*n+C*o+$*a+R)*t,n=e,o=i}const S=3*t;this.positionBuffer[S]=n,this.positionBuffer[S+1]=o,this.positionBuffer[S+2]=a,this.positionBuffer[S+3]=n,this.positionBuffer[S+4]=o,this.positionBuffer[S+5]=a,this.previousBuffer[S]=h,this.previousBuffer[S+1]=c,this.previousBuffer[S+2]=u,this.previousBuffer[S+3]=h,this.previousBuffer[S+4]=c,this.previousBuffer[S+5]=u,this.nextBuffer[S]=n,this.nextBuffer[S+1]=o,this.nextBuffer[S+2]=a,this.nextBuffer[S+3]=n,this.nextBuffer[S+4]=o,this.nextBuffer[S+5]=a;const b=3*l;this.nextBuffer[b]=n,this.nextBuffer[b+1]=o,this.nextBuffer[b+2]=a,this.nextBuffer[b+3]=n,this.nextBuffer[b+4]=o,this.nextBuffer[b+5]=a;const w=s.size.x;y||s.parentMatrix?(this.widthBuffer[t]=w,this.widthBuffer[t+1]=w):(this.widthBuffer[t]=w*g,this.widthBuffer[t+1]=w*g);const D=2*t,U=((x?0:1)+d)*p;this.uvBuffer[D]=U,this.uvBuffer[D+1]=(f-v-1)*m,this.uvBuffer[D+2]=U,this.uvBuffer[D+3]=(f-v)*m;const q=s.color,k=4*t;this.colorBuffer[k]=q.x,this.colorBuffer[k+1]=q.y,this.colorBuffer[k+2]=q.z,this.colorBuffer[k+3]=q.w,this.colorBuffer[k+4]=q.x,this.colorBuffer[k+5]=q.y,this.colorBuffer[k+6]=q.z,this.colorBuffer[k+7]=q.w,this.indexBuffer[3*e]=l,this.indexBuffer[3*e+1]=l+1,this.indexBuffer[3*e+2]=t,e++,this.indexBuffer[3*e]=t,this.indexBuffer[3*e+1]=l+1,this.indexBuffer[3*e+2]=t+1,e++,t+=2}}this.measureSystemBounds(r,n,t)}this.refreshBoundingInfo(),this.uploadGeometry(t,e)}measureSystemBounds(t,e,i){if(i<=e||"function"!=typeof t.setWorldBounds)return;const s=this.positionBuffer;let r=1/0,n=1/0,o=1/0,a=-1/0,l=-1/0,h=-1/0;for(let t=3*e,c=3*i;t<c;t+=6){const e=s[t],i=s[t+1],c=s[t+2];e<r&&(r=e),e>a&&(a=e),i<n&&(n=i),i>l&&(l=i),c<o&&(o=c),c>h&&(h=c)}const c=this.widthBuffer;let u=0;for(let t=e;t<i;t+=2){const e=c[t];e>u&&(u=e)}t.setWorldBounds(r,n,o,a,l,h,u)}uploadGeometry(e,i){const s=this.mesh.geometry,r=s?.getIndexBuffer();if(e>0&&i>0){this.mesh.updateVerticesData(t.VertexBuffer.PositionKind,this.positionBuffer.subarray(0,3*e)),this.mesh.updateVerticesData(t.VertexBuffer.UVKind,this.uvBuffer.subarray(0,2*e)),r&&this.scene.getEngine().updateDynamicIndexBuffer(r,this.indexBuffer.subarray(0,3*i),0),this.previousVB.update(this.previousBuffer.subarray(0,3*e)),this.nextVB.update(this.nextBuffer.subarray(0,3*e)),this.widthVB.update(this.widthBuffer.subarray(0,e));const s=this.mesh.getVertexBuffer(t.VertexBuffer.ColorKind);s&&s.update(this.colorBuffer.subarray(0,4*e)),this.mesh.subMeshes&&this.mesh.subMeshes.length>0&&(this.mesh.subMeshes[0].indexCount=3*i,this.mesh.subMeshes[0].verticesCount=e),this.drawsNothing=!1}else this.mesh.subMeshes&&this.mesh.subMeshes.length>0&&(this.drawsNothing||(this.indexBuffer.fill(0,0,6),r&&this.scene.getEngine().updateDynamicIndexBuffer(r,this.indexBuffer.subarray(0,6),0),this.drawsNothing=!0),this.mesh.subMeshes[0].indexCount=6,this.mesh.subMeshes[0].verticesCount=1)}adoptMeshBounds(){const t=this.mesh.getBoundingInfo();for(const e of this.mesh.subMeshes)e._boundingInfo=t}dispose(){this.mesh.material&&this.mesh.material.dispose(),super.dispose()}}class Os extends s.TransformNode{constructor(t,e){super(t,e),this.batches=[],this.elapsed=0,this.systemToBatchIndex=new Map,this.depthTexture=null,this.systems=[],this.orderedSystems=[],this.orderedSystemsStale=!0,this.batchEmptyFrames=[],this.adaptivePerformanceState={enabled:!1,targetFrameMs:16.7,minQuality:.35,maxQuality:1,decreaseStep:.08,increaseStep:.02,currentQuality:1,lastFrameCpuMs:0},this.lastAppliedQuality=Number.NaN,this.meshLighting=gs(),this.cullingEnabled=!0,this.catchUpBudgetMs=2,this.simulationBudgetMs=1/0,this.frustumPlanes=[],this.boundsMin=new H,this.boundsMax=new H}collectFrustumPlanes(){const t=this.getScene(),s=this.frustumPlanes,r=t.activeCameras,n=t.activeCamera,o=r&&r.length>0?r:n?[n]:[],a=6*o.length;for(;s.length<a;)s.push(new i.Plane(0,0,0,0));s.length=a;for(let t=0;t<o.length;t++){const i=o[t];i.getViewMatrix(),i.getProjectionMatrix();const r=i.getTransformationMatrix(),n=0===t?s:s.slice(6*t,6*t+6);if(e.Frustum.GetPlanesToRef(r,n),0!==t)for(let e=0;e<6;e++)s[6*t+e]=n[e]}return s}isSystemInView(t,e){const i=this.boundsMin,s=this.boundsMax;if(!t.getWorldBounds(i,s))return!0;for(let t=0;t<e.length;t+=6){let r=!0;for(let n=t;n<t+6;n++){const t=e[n],o=t.normal,a=o.x>=0?s.x:i.x,l=o.y>=0?s.y:i.y,h=o.z>=0?s.z:i.z;if(o.x*a+o.y*l+o.z*h+t.d<0){r=!1;break}}if(r)return!0}return!1}static clamp(t,e,i){return Math.max(e,Math.min(i,t))}static equals(t,e){return t.materialBlendMode===e.materialBlendMode&&t.materialTransparent===e.materialTransparent&&t.materialDepthTest===e.materialDepthTest&&t.materialDepthWrite===e.materialDepthWrite&&t.materialAlphaTest===e.materialAlphaTest&&t.texture===e.texture&&t.reflectionTexture===e.reflectionTexture&&t.reflectionLevel===e.reflectionLevel&&function(t,e){if(t===e)return!0;if(!t||!e||t.length!==e.length)return!1;for(let i=0;i<t.length;i++)if(t[i]!==e[i])return!1;return!0}(t.reflectionFaces,e.reflectionFaces)&&t.reflectionAtlas===e.reflectionAtlas&&t.renderMode===e.renderMode&&t.blendTiles===e.blendTiles&&t.softParticles===e.softParticles&&t.softFarFade===e.softFarFade&&t.softNearFade===e.softNearFade&&t.uTileCount===e.uTileCount&&t.vTileCount===e.vTileCount&&t.instancingGeometry===e.instancingGeometry&&t.renderOrder===e.renderOrder&&t.layerMask===e.layerMask&&t.renderingGroupId===e.renderingGroupId&&t.applyFog===e.applyFog&&function(t,e){return(t?.x??0)===(e?.x??0)&&(t?.y??0)===(e?.y??0)&&(t?.z??0)===(e?.z??0)}(t.pivot,e.pivot)&&t.sortMode===(e.sortMode??"none")&&t.minParticleSize===(e.minParticleSize??0)&&t.maxParticleSize===(e.maxParticleSize??1/0)&&(t.lighting??"fixed")===(e.lighting??"fixed")&&xs(t.rim,e.rim)&&Ms(t.uvScroll,e.uvScroll)&&t.gradientMap===(e.gradientMap??null)&&bs(t.erosion,e.erosion)}addSystem(t){const e=t;e._renderer=this,this.systemToBatchIndex.has(t)||-1!==this.systems.indexOf(t)||(this.systems.push(t),this.orderedSystemsStale=!0),this.adaptivePerformanceState.enabled&&e.setQualityFactor(this.adaptivePerformanceState.currentQuality),this.assignToBatch(e)}assignToBatch(t){const e=t,i=t.getRendererSettings();for(let t=0;t<this.batches.length;t++)if(Os.equals(this.batches[t].settings,i))return this.batches[t].addSystem(e),void this.systemToBatchIndex.set(e,t);let s;const r=this.getScene();switch(i.renderMode){case exports.RenderMode.Trail:s=new Vs(i,r);break;case exports.RenderMode.Mesh:case exports.RenderMode.BillBoard:case exports.RenderMode.VerticalBillBoard:case exports.RenderMode.HorizontalBillBoard:case exports.RenderMode.StretchedBillBoard:case exports.RenderMode.Beam:s=new _s(i,r);break;default:throw new Error(`Unsupported render mode: ${i.renderMode}`)}s.mesh.parent=this,this.depthTexture&&s.applyDepthTexture(this.depthTexture),s.applyMeshLighting(this.meshLighting),s.addSystem(e),this.batches.push(s),this.batchEmptyFrames.push(0),this.systemToBatchIndex.set(e,this.batches.length-1)}deleteSystem(t){const e=this.removeFromBatch(t),i=this.systems.indexOf(t);-1!==i&&(this.systems.splice(i,1),this.orderedSystemsStale=!0);const s=this.orderedSystems.indexOf(t);return-1!==s&&this.orderedSystems.splice(s,1),e}removeFromBatch(t){const e=this.systemToBatchIndex.get(t);return void 0!==e&&(this.batches[e].removeSystem(t),this.systemToBatchIndex.delete(t),!0)}updateSystem(t){this.removeFromBatch(t),this.addSystem(t)}setDepthTexture(t){this.depthTexture=t;for(const e of this.batches)e.applyDepthTexture(t)}setMeshLighting(t){const e=this.meshLighting;t.direction&&(e.direction=t.direction.clone()),t.color&&(e.color=t.color.clone()),t.ambient&&(e.ambient=t.ambient.clone());for(const t of this.batches)t.applyMeshLighting(e)}getMeshLighting(){const t=this.meshLighting;return{direction:t.direction.clone(),color:t.color.clone(),ambient:t.ambient.clone()}}configureAdaptivePerformance(t={}){const e=this.adaptivePerformanceState,i=Os.clamp(t.minQuality??e.minQuality,.05,1),s=Os.clamp(t.maxQuality??e.maxQuality,i,1);e.targetFrameMs=Math.max(t.targetFrameMs??e.targetFrameMs,.1),e.minQuality=i,e.maxQuality=s,e.decreaseStep=Math.max(t.decreaseStep??e.decreaseStep,.001),e.increaseStep=Math.max(t.increaseStep??e.increaseStep,.001),e.currentQuality=Os.clamp(e.currentQuality,e.minQuality,e.maxQuality),e.enabled=!0,this.lastAppliedQuality=Number.NaN}disableAdaptivePerformance(t=!0){this.adaptivePerformanceState.enabled=!1,t&&(this.adaptivePerformanceState.currentQuality=this.adaptivePerformanceState.maxQuality,this.applyAdaptiveQuality())}getAdaptivePerformanceState(){return{...this.adaptivePerformanceState}}applyAdaptiveQuality(){const t=this.adaptivePerformanceState.currentQuality;if(t!==this.lastAppliedQuality){for(let e=0;e<this.systems.length;e++)this.systems[e].setQualityFactor(t);this.lastAppliedQuality=t}}_invalidateUpdateOrder(){this.orderedSystemsStale=!0}orderSystems(){if(!this.orderedSystemsStale)return this.orderedSystems;const t=[],e=new Set,i=new Set,s=new Set(this.systems),r=n=>{if(!i.has(n)&&!e.has(n)){e.add(n);for(const t of(t=>{const e=[];for(const i of t.behaviors??[]){if("EmitSubParticleSystem"!==i.type)continue;const t=i.subParticleSystem?.system;void 0!==t&&s.has(t)&&e.push(t)}return e})(n))r(t);e.delete(n),i.add(n),t.push(n)}};for(const t of this.systems)r(t);return t.reverse(),this.orderedSystems=t,this.orderedSystemsStale=!1,t}update(t){this.elapsed+=t;const e=this.adaptivePerformanceState,i=e.enabled?performance.now():0;e.enabled&&this.applyAdaptiveQuality();const s=this.orderSystems(),r=this.cullingEnabled?this.collectFrustumPlanes():null,n=this.simulationBudgetMs!==1/0||this.catchUpBudgetMs!==1/0?performance.now():0,o=this.simulationBudgetMs===1/0?1/0:n+this.simulationBudgetMs,a=this.catchUpBudgetMs===1/0?1/0:n+this.catchUpBudgetMs;for(let e=0;e<s.length;e++){const i=s[e];i.emitter.visible&&(i.culled=null!==r&&r.length>0&&"always"!==i.cullingMode&&!0!==i.onlyUsedByOther&&!this.isSystemInView(i,r),i.update(t,o,a)),s[e]!==i&&e--}this.refreshBatches(),e.enabled&&(e.lastFrameCpuMs=performance.now()-i,e.lastFrameCpuMs>e.targetFrameMs?e.currentQuality=Os.clamp(e.currentQuality-e.decreaseStep,e.minQuality,e.maxQuality):e.currentQuality=Os.clamp(e.currentQuality+e.increaseStep,e.minQuality,e.maxQuality))}refreshBatches(){const t=this.batchEmptyFrames;for(let e=0;e<this.batches.length;e++){const i=this.batches[e];if(i.time=this.elapsed,i.systems.size>0){t[e]=0,i.update();continue}const s=(t[e]??0)+1;t[e]=s,1===s?i.update():s>Os.EMPTY_BATCH_GRACE_FRAMES&&(this.removeBatch(e),e--)}}removeBatch(t){this.batches[t].dispose(),this.batches.splice(t,1),this.batchEmptyFrames.splice(t,1);for(const[e,i]of this.systemToBatchIndex)i>t&&this.systemToBatchIndex.set(e,i-1)}getBatchRenderStats(){return this.batches.map((t,e)=>{let i=0;const s=[];for(const e of t.systems){const t=e;i+=t.particleNum,s.push(t.emitter.name)}return{batchIndex:e,renderMode:t.settings.renderMode,instanceCount:t.mesh.forcedInstanceCount??0,particleCount:i,systemNames:s}})}dispose(){for(const t of this.batches)t.dispose();this.batches=[],this.batchEmptyFrames.length=0,this.systems.length=0,this.systemToBatchIndex.clear(),super.dispose()}}Os.EMPTY_BATCH_GRACE_FRAMES=120;const Cs=Os;class Fs extends s.TransformNode{get matrixWorld(){const t=this.getWorldMatrix(),e=t.updateFlag;if(e===this._matrixWorldFlag)return this._matrixWorld;this._matrixWorldFlag=e;const i=this._matrixWorld.elements,s=t.m;return i[0]=s[0],i[1]=s[1],i[2]=s[2],i[3]=s[3],i[4]=s[4],i[5]=s[5],i[6]=s[6],i[7]=s[7],i[8]=s[8],i[9]=s[9],i[10]=s[10],i[11]=s[11],i[12]=s[12],i[13]=s[13],i[14]=s[14],i[15]=s[15],this._matrixWorld}get visible(){return this.isEnabled()}set visible(t){this.setEnabled(t)}get uuid(){return this.uniqueId.toString()}constructor(t,e){super("particleEmitter",e||void 0),this._matrixWorld=new st,this._matrixWorldFlag=-1,this.system=t}dispose(){super.dispose()}extractFromCache(t){const e=[];for(const i in t){const s=t[i];s&&"object"==typeof s&&delete s.metadata,e.push(s)}return e}clone(t){const e=this.system.clone().emitter;return e.name=t??this.name,e.position.copyFrom(this.position),e.rotation.copyFrom(this.rotation),e.scaling.copyFrom(this.scaling),this.rotationQuaternion&&(e.rotationQuaternion=this.rotationQuaternion.clone()),e.setEnabled(this.isEnabled(!1)),e}toJSON(t,e={}){return{uuid:this._quarksUUID??this.uniqueId.toString(),type:"ParticleEmitter",name:this.name,position:[this.position.x,this.position.y,this.position.z],rotation:[this.rotation.x,this.rotation.y,this.rotation.z],quaternion:this.rotationQuaternion?[this.rotationQuaternion.x,this.rotationQuaternion.y,this.rotationQuaternion.z,this.rotationQuaternion.w]:void 0,scale:[this.scaling.x,this.scaling.y,this.scaling.z],visible:this.isEnabled(),ps:this.system.toJSON(t,e)}}}class As{static runOnAllParticleEmitters(t,e){As.traverseNode(t,t=>{t instanceof Fs&&e(t)})}static addToBatchRenderer(t,e){As.runOnAllParticleEmitters(t,t=>{e.addSystem(t.system)})}static play(t){As.runOnAllParticleEmitters(t,t=>{t.system.play()})}static stop(t){As.runOnAllParticleEmitters(t,t=>{t.system.stop()})}static pause(t){As.runOnAllParticleEmitters(t,t=>{t.system.pause()})}static restart(t){As.runOnAllParticleEmitters(t,t=>{t.system.restart()})}static setAutoDestroy(t,e){As.runOnAllParticleEmitters(t,t=>{t.system.autoDestroy=e})}static endEmit(t){As.runOnAllParticleEmitters(t,t=>{t.system.endEmit()})}static isEffectFinished(t){let e=!1,i=!0;return As.runOnAllParticleEmitters(t,t=>{e=!0,t.system.isFinished()||(i=!1)}),e&&i}static instantiate(t,e){const i=new Map,r=(t,e,n)=>{let o;if(t instanceof Fs)o=t.clone(n),i.set(t,o);else{if(!(t instanceof s.TransformNode))return null;o=new s.TransformNode(n??t.name,t.getScene()),o.position.copyFrom(t.position),o.rotation.copyFrom(t.rotation),o.scaling.copyFrom(t.scaling),t.rotationQuaternion&&(o.rotationQuaternion=t.rotationQuaternion.clone()),o.setEnabled(t.isEnabled(!1))}o.parent=e;for(const e of t.getChildren())r(e,o);return o},n=r(t,null,e);for(const t of i.values())for(const e of t.system.behaviors)if(e instanceof ge){const t=i.get(e.subParticleSystem);void 0!==t&&(e.subParticleSystem=t)}return n}static getDuration(t){const e=[];As.runOnAllParticleEmitters(t,t=>{e.push(t.system)});const i=new Map;for(let t=0;t<e.length;t++){const s=e[t];for(const t of s.behaviors){if(!(t instanceof ge))continue;const r=t.subParticleSystem?.system;if(void 0!==r&&"object"==typeof r){e.includes(r)||e.push(r);const t=i.get(r)??[];t.push(s),i.set(r,t)}}}const s=new Map,r=t=>{const e=s.get(t);if(void 0!==e)return e;s.set(t,1/0);const n=t.playbackSpeed,o=As.maxOf(t.startLife)/n;let a;if(n>0)if(t.onlyUsedByOther){a=0;for(const e of i.get(t)??[])a=Math.max(a,r(e));a+=t.duration/n+o}else a=t.looping?1/0:(As.maxOf(t.startDelay,0)+t.duration)/n+o;else a=1/0;return s.set(t,a),a};let n=0;for(const t of e)n=Math.max(n,r(t));return n}static maxOf(t,e){if(t instanceof Ct)return t.value;if(t instanceof Ft)return Math.max(t.a,t.b);let i=-1/0;for(let s=0;s<=32;s++){const r=[];t.startGen(r);const n="function"===t.type?t.genValue(r,e??s/32):t.genValue(r);i=Math.max(i,n)}return i}static traverseNode(t,e){e(t);const i=t.getChildren();for(const t of i)As.traverseNode(t,e)}}const Bs=new WeakMap,$s=new WeakMap;function Is(t){if(!t?.isCube)return null;const e=t.files??t._files;return 6===e?.length?e.slice():null}function Es(t){return Bs.get(t)??null}async function Ns(t,e){if("undefined"==typeof document||"undefined"==typeof Image)throw new Error("createEnvAtlasFromFaceUrls requires a DOM Image/canvas environment");const i=await Promise.all(t.map(t=>function(t){return new Promise((e,i)=>{const s=new Image;s.crossOrigin="anonymous",s.onload=()=>e(s),s.onerror=()=>i(new Error(`Failed to load env face ${t}`)),s.src=t})}(t))),s=i[0].width||i[0].naturalWidth;if(!s)throw new Error("Env atlas face image has zero size");const r=document.createElement("canvas");r.width=3*s,r.height=2*s;const n=r.getContext("2d");if(!n)throw new Error("Could not create env atlas canvas");for(let t=0;t<6;t++)n.drawImage(i[t],t%3*s,Math.floor(t/3)*s,s,s);const o=new y.Texture(r.toDataURL("image/jpeg",.92),e,{noMipmap:!0,invertY:!1,samplingMode:y.Texture.LINEAR_LINEAR});return o.name="quarksEnvAtlas",o}const Rs={createFromFaceUrls:Ns};function Ls(t,e,i){const s=Bs.get(t);if(s)return i(s),s;const r=()=>{const s=$s.get(t);if(s)return void s.then(t=>{t&&i(t)});const r=Is(t);if(!r)return;const n=Rs.createFromFaceUrls(r,e).then(e=>(Bs.set(t,e),$s.delete(t),i(e),e)).catch(e=>($s.delete(t),console.warn("[babylon.quarks] Failed to build env atlas from cubemap faces",e),null));$s.set(t,n)};if(t.isReady())r();else{const e=t.onLoadObservable;e?e.addOnce(()=>r()):r()}return Bs.get(t)??null}class Ds extends v.StandardMaterial{constructor(t,e,i={}){super(t,e),this.isParticleMeshStandardMaterial=!0,Object.assign(this,i)}}class Us extends g.PBRMaterial{constructor(t,e,i={}){super(t,e),this.isParticleMeshPhysicsMaterial=!0,Object.assign(this,i)}}function qs(t,e){if(e&&e.length>0)return e;const i=t.length/3,s=new Uint32Array(i);for(let t=0;t<i;t++)s[t]=t;return s}const ks=new H(0,0,1),Js=new Z,Qs=new Z,Gs=new H,Ws=new H,js=1/60,Ys=new Set(["SizeOverLife","SizeBySpeed"]),Xs=new Set(["ColorOverLife","ColorBySpeed"]),Zs=new Set(["ApplyForce","Noise","TurbulenceField","GravityForce","RotationOverLife","Rotation3DOverLife","RotationBySpeed","SpeedOverLife","FrameOverLife","ForceOverLife","VelocityOverLife","InheritVelocity","OrbitOverLife","WidthOverLength","ChangeEmitDirection","EmitSubParticleSystem","LimitSpeedOverLife","ApplyCollision"]),Hs=new Float32Array([-.5,-.5,0,.5,-.5,0,.5,.5,0,-.5,.5,0]),Ks=new Float32Array([0,0,1,0,1,1,0,1]);const tr=new Uint32Array([0,1,2,0,2,3]);function er(t){const e={};return t?.uvFromHead&&(e.uvFromHead=!0),t?.colorFromParticle&&(e.colorFromParticle=!0),t?.dieWithParticle&&(e.dieWithParticle=!0),t?.recordWorldSpace&&(e.recordWorldSpace=!0),e}class ir{set time(t){this.emissionState.time=t}get time(){return this.emissionState.time}get isEmitEnded(){return this.emitEnded}hasPendingEmission(){if(this.looping)return!0;if(this.emitEnded)return!1;if(this.onlyUsedByOther)return!1;const t=this.emissionState;if(t.waitEmiting>0)return!0;if(t.burstIndex<this.emissionBursts.length)return!0;if(this.hasPendingBurstWaves(t))return!0;if(t.time>=this.duration)return!1;const e=t.time/this.duration;return this.emissionOverTime.genValue(this.memory,e)>0||this.emissionOverDistance.genValue(this.memory,e)>0}isFinished(){return!(this.particleNum>0)&&(!!this.onlyUsedByOther||(this.looping?this.emitEnded:!this.hasPendingEmission()))}get layers(){return this.layerMaskProxy}get texture(){return this.rendererSettings.texture}set texture(t){this.rendererSettings.texture=t,this.neededToUpdateRender=!0}get material(){return this.materialRef}set material(t){this.materialRef=t,this.applyMaterialSettings(t)}get uTileCount(){return this.rendererSettings.uTileCount}set uTileCount(t){this.rendererSettings.uTileCount=t,this.neededToUpdateRender=!0}get vTileCount(){return this.rendererSettings.vTileCount}set vTileCount(t){this.rendererSettings.vTileCount=t,this.neededToUpdateRender=!0}get blendTiles(){return this.rendererSettings.blendTiles}set blendTiles(t){this.rendererSettings.blendTiles=t,this.neededToUpdateRender=!0}get softParticles(){return this.rendererSettings.softParticles}set softParticles(t){this.rendererSettings.softParticles=t,this.neededToUpdateRender=!0}get sortMode(){return this.rendererSettings.sortMode}set sortMode(t){this.rendererSettings.sortMode=ir.validSortMode(t),this.neededToUpdateRender=!0}get minParticleSize(){return this.rendererSettings.minParticleSize}set minParticleSize(t){this.rendererSettings.minParticleSize=Math.max(0,t),this.neededToUpdateRender=!0}get maxParticleSize(){return this.rendererSettings.maxParticleSize}set maxParticleSize(t){this.rendererSettings.maxParticleSize=t>0?t:1/0,this.neededToUpdateRender=!0}get pivot(){return this.rendererSettings.pivot}set pivot(t){this.rendererSettings.pivot=ir.nonZeroPivot(t),this.neededToUpdateRender=!0}get lighting(){return this.rendererSettings.lighting??"fixed"}set lighting(t){this.rendererSettings.lighting=ir.validLighting(t),this.neededToUpdateRender=!0}get rim(){return this.rendererSettings.rim}set rim(t){this.rendererSettings.rim=vs(t),this.neededToUpdateRender=!0}get uvScroll(){return this.rendererSettings.uvScroll}set uvScroll(t){this.rendererSettings.uvScroll=ws(t),this.neededToUpdateRender=!0}get gradientMap(){return this.rendererSettings.gradientMap??null}set gradientMap(t){this.rendererSettings.gradientMap=t??null,this.neededToUpdateRender=!0}get erosion(){return this.rendererSettings.erosion}set erosion(t){this.rendererSettings.erosion=Ss(t),this.neededToUpdateRender=!0}measureMotionScale(){if("hierarchy"!==this.scalingMode||!this.worldSpace)return this.hierarchyScale.set(1,1,1),1;const t=this.emitter.matrixWorld.elements,e=Math.sqrt(t[0]*t[0]+t[1]*t[1]+t[2]*t[2]),i=Math.sqrt(t[4]*t[4]+t[5]*t[5]+t[6]*t[6]),s=Math.sqrt(t[8]*t[8]+t[9]*t[9]+t[10]*t[10]);return this.hierarchyScale.set(e,i,s),(e+i+s)/3}static validLighting(t){return"unlit"===t||"scene"===t?t:"fixed"}static validSortMode(t){return"distance"===t||"oldestInFront"===t||"youngestInFront"===t?t:"none"}static validCullingMode(t){return"pause"===t||"pauseAndCatchUp"===t?t:"always"}static nonZeroPivot(t){return!t||0===t.x&&0===t.y&&0===t.z?void 0:t.clone()}static nonZeroFlip(t){return t&&(t.x>0||t.y>0)?t.clone():void 0}get softNearFade(){return this.rendererSettings.softNearFade}set softNearFade(t){this.rendererSettings.softNearFade=t,this.neededToUpdateRender=!0}get softFarFade(){return this.rendererSettings.softFarFade}set softFarFade(t){this.rendererSettings.softFarFade=t,this.neededToUpdateRender=!0}get instancingGeometry(){return this.rendererSettings.instancingGeometry}set instancingGeometry(t){this.restart(),this.particles.length=0,this.rendererSettings.instancingGeometry=t,this.neededToUpdateRender=!0}get blending(){return this.rendererSettings.materialBlendMode}set blending(t){this.rendererSettings.materialBlendMode=t,this.neededToUpdateRender=!0}get renderMode(){return this.rendererSettings.renderMode}set renderMode(t){if(this.rendererSettings.renderMode!==t){let e=!1;switch(this.rendererSettings.renderMode===exports.RenderMode.Trail&&(e=!0),this.rendererSettings.renderMode===exports.RenderMode.Mesh&&(this.startRotation=new Ct(0)),t){case exports.RenderMode.Trail:this.rendererEmitterSettings={startLength:new Ct(30),followLocalOrigin:!1},e=!0;break;case exports.RenderMode.Mesh:this.rendererEmitterSettings={},this.startRotation=new Et(new H(0,1,0),new Ct(0));break;case exports.RenderMode.StretchedBillBoard:this.rendererEmitterSettings={speedFactor:0,lengthFactor:2};break;case exports.RenderMode.BillBoard:case exports.RenderMode.VerticalBillBoard:case exports.RenderMode.HorizontalBillBoard:case exports.RenderMode.Beam:this.rendererEmitterSettings={}}this.rendererSettings.renderMode=t,e&&(this.restart(),this.particles.length=0),this.neededToUpdateRender=!0}}get renderOrder(){return this.rendererSettings.renderOrder}set renderOrder(t){this.rendererSettings.renderOrder=t,this.neededToUpdateRender=!0}get renderingGroupId(){return this.rendererSettings.renderingGroupId}set renderingGroupId(t){this.rendererSettings.renderingGroupId=t,this.neededToUpdateRender=!0}get applyFog(){return this.rendererSettings.applyFog}set applyFog(t){this.rendererSettings.applyFog=t,this.neededToUpdateRender=!0}get seed(){return this.seedValue}set seed(t){this.seedValue=t,this.rng=void 0===t?void 0:M(t)}constructor(t){if(this.store=new Me(64),this.emitterVelocity=new H,this.finishedEventFired=!1,this.startDelayTimeLeft=0,this.tempEmitterPos=new H,this.temp=new H,this.pathMatrix=new st,this.normalMatrix=new pt,this.memory=[],this.listeners={},this.materialRef=null,this.qualityFactor=1,this.simulationAccumulator=0,this.destroyed=!1,this.fusionSteps=[],this.planChangesSize=!0,this.planChangesColor=!0,this.hierarchyScale=new H(1,1,1),this.playbackSpeed=1,this.emissionMultiplier=1,this.cullingMode="always",this.scalingMode="shape",this.motionScale=1,this.alignToDirection=!1,this.culled=!1,this.pendingCatchUp=0,this.boundsMin=new H,this.boundsMax=new H,this.boundsPadding=0,this.boundsValid=!1,this.stepsSinceBounds=0,this.boundsMaxSize=0,this.boundsMaxSpeedSq=0,this.boundsInWorld=!1,this.geometryRadius=1,this.firstTimeUpdate=!0,this.beamEndScratch=new H,this.sceneRef=t.scene,this.layerMaskProxy={mask:t.layerMask??268435455},Object.defineProperty(this.layerMaskProxy,"mask",{enumerable:!0,get:()=>this.rendererSettings.layerMask,set:t=>{this.rendererSettings.layerMask=t,this.neededToUpdateRender=!0}}),this.autoDestroy=t.autoDestroy??!1,this.duration=t.duration??1,this.startDelay=t.startDelay??new Ct(0),this.looping=t.looping??!0,this.prewarm=t.prewarm??!1,this.startLife=t.startLife??new Ct(5),this.startSpeed=t.startSpeed??new Ct(0),this.startRotation=t.startRotation??new Ct(0),this.startSize=t.startSize??new Ct(1),this.startColor=t.startColor??new jt(new Mt(1,1,1,1)),this.emissionOverTime=t.emissionOverTime??new Ct(10),this.emissionOverDistance=t.emissionOverDistance??new Ct(0),this.emissionBursts=t.emissionBursts??[],this.maxParticles=t.maxParticles,this.onlyUsedByOther=t.onlyUsedByOther??!1,this.emitterShape=t.shape??new Ci,this.behaviors=t.behaviors??[],this.worldSpace=t.worldSpace??!1,this.rendererEmitterSettings=t.rendererEmitterSettings??{},t.renderMode===exports.RenderMode.StretchedBillBoard){const e=this.rendererEmitterSettings;void 0!==t.speedFactor&&(e.speedFactor=t.speedFactor),e.speedFactor=e.speedFactor??0,e.lengthFactor=e.lengthFactor??0}var e;this.rendererSettings={instancingGeometry:t.instancingGeometry??Hs,instancingIndices:t.instancingIndices??tr,instancingUVs:t.instancingUVs??(t.instancingGeometry?(e=t.instancingGeometry,new Float32Array(e.length/3*2)):Ks),instancingNormals:t.instancingNormals,renderMode:t.renderMode??exports.RenderMode.BillBoard,renderOrder:t.renderOrder??0,uTileCount:t.uTileCount??1,vTileCount:t.vTileCount??1,blendTiles:t.blendTiles??!1,softParticles:t.softParticles??!1,softNearFade:t.softNearFade??0,softFarFade:t.softFarFade??0,materialBlendMode:t.blendMode??r.Constants.ALPHA_ADD,materialTransparent:t.transparent??!0,materialDepthTest:t.depthTest??!0,materialDepthWrite:t.depthWrite??!1,materialAlphaTest:t.alphaTest??0,texture:t.texture??null,reflectionTexture:null,reflectionLevel:1,reflectionFaces:null,reflectionAtlas:null,layerMask:t.layerMask??268435455,pivot:ir.nonZeroPivot(t.pivot),sortMode:ir.validSortMode(t.sortMode),minParticleSize:Math.max(0,t.minParticleSize??0),maxParticleSize:t.maxParticleSize??1/0,renderingGroupId:t.renderingGroupId??0,applyFog:t.applyFog??!0,lighting:ir.validLighting(t.lighting),rim:vs(t.rim),uvScroll:ws(t.uvScroll),gradientMap:t.gradientMap??null,erosion:Ss(t.erosion)},this.flip=ir.nonZeroFlip(t.flip),this.playbackSpeed=t.playbackSpeed??1,this.cullingMode=t.cullingMode??"always",this.scalingMode="hierarchy"===t.scalingMode?"hierarchy":"shape",this.alignToDirection=!0===t.alignToDirection,this.seed=t.seed,this.rendererSettings.renderMode!==exports.RenderMode.Mesh||this.rendererSettings.instancingNormals||(this.rendererSettings.instancingNormals=ir.createFallbackNormals(this.rendererSettings.instancingGeometry)),this.materialRef=t.material??null,this.applyMaterialSettings(this.materialRef,{blendMode:t.blendMode,transparent:t.transparent,depthTest:t.depthTest,depthWrite:t.depthWrite,alphaTest:t.alphaTest,texture:t.texture,layerMask:t.layerMask}),this.neededToUpdateRender=!0,this.particles=[],this.startTileIndex=t.startTileIndex||new Ct(0),this.emitter=new Fs(this,t.scene),this.paused=!1,this.particleNum=0,this.emissionState={isBursting:!1,burstParticleIndex:0,burstParticleCount:0,burstIndex:0,burstWaveIndex:0,time:0,waitEmiting:0,travelDistance:0},this.emissionBursts.forEach(t=>t.count.startGen(this.memory)),this.emissionOverDistance.startGen(this.memory),this.startDelay.startGen(this.memory),this.startDelayTimeLeft=this.startDelay.genValue(this.memory,0),this.emitEnded=!1,this.markForDestroy=!1,this.prewarmed=!1}applyMaterialSettings(t,e={}){if(!this.rendererSettings)return;const i=void 0!==e.texture?e.texture:t?.albedoTexture??t?.diffuseTexture??t?.emissiveTexture??t?.opacityTexture??t?.baseTexture??this.rendererSettings.texture??null,s=t?.reflectionTexture??t?.environmentTexture??this.rendererSettings.reflectionTexture??null,r="number"==typeof s?.level?s.level:1,n=e.blendMode??("number"==typeof t?.alphaMode?t.alphaMode:this.rendererSettings.materialBlendMode),o=e.transparent??("function"==typeof t?.needAlphaBlending?t.needAlphaBlending():"number"==typeof t?.alpha?t.alpha<1:this.rendererSettings.materialTransparent),a=e.depthTest??("boolean"==typeof t?.disableDepthTest?!t.disableDepthTest:this.rendererSettings.materialDepthTest),l=e.depthWrite??("boolean"==typeof t?.disableDepthWrite?!t.disableDepthWrite:"boolean"==typeof t?.forceDepthWrite?t.forceDepthWrite:this.rendererSettings.materialDepthWrite),h=e.alphaTest??(()=>{const e=t?.transparencyMode,i=1===e||3===e;return i&&"number"==typeof t?.alphaCutOff?t.alphaCutOff:i&&"number"==typeof t?.alphaCutOffValue?t.alphaCutOffValue:t?0:this.rendererSettings.materialAlphaTest})();this.rendererSettings.texture=i,this.rendererSettings.reflectionTexture=s,this.rendererSettings.reflectionLevel="number"==typeof t?.reflectionLevel?t.reflectionLevel:r;let c=t?.reflectionAtlas??e.reflectionAtlas??this.rendererSettings.reflectionAtlas??null;!c&&s?.isCube&&(c=Es(s),!c&&this.sceneRef&&(Ls(s,this.sceneRef,e=>{this.rendererSettings.reflectionAtlas!==e&&(this.rendererSettings.reflectionAtlas=e,t&&null==t.reflectionAtlas&&(t.reflectionAtlas=e),this.neededToUpdateRender=!0)}),c=Es(s))),this.rendererSettings.reflectionAtlas=c,this.rendererSettings.reflectionFaces=6===t?.reflectionFaces?.length?t.reflectionFaces:null,this.rendererSettings.materialBlendMode=n,this.rendererSettings.materialTransparent=o,this.rendererSettings.materialDepthTest=a,this.rendererSettings.materialDepthWrite=l,this.rendererSettings.materialAlphaTest=h,void 0!==e.layerMask&&(this.rendererSettings.layerMask=e.layerMask),this.neededToUpdateRender=!0}pause(){this.paused=!0}play(){this.paused=!1}stop(){this.restart(),this.pause()}setQualityFactor(t){this.qualityFactor=Math.max(.1,Math.min(1,t))}emissionFactor(){const t=this.emissionMultiplier;return t>=0?this.qualityFactor*t:this.qualityFactor}rebindParticles(){const t=this.particles;for(let e=0;e<t.length;e++)t[e].rebind()}growParticlePool(t){const e=this.particles.length;this.store.ensureCapacity(e+1)&&this.rebindParticles(),this.particles.push(t?new ei(this.store,e):new Ke(this.store,e))}spawn(t,e,i){const s=Gs,r=Ws;i.decompose(s,Js,r);const n=this.behaviors,o=n.length,a=this.rendererSettings.renderMode,l=a===exports.RenderMode.Trail,h=!l,c=a===exports.RenderMode.Mesh,u="rotation"===this.startRotation.type,d="vec3function"===this.startSize.type,f=e.time/this.duration,p=l?this.rendererEmitterSettings:void 0,m=Boolean(p?.followLocalOrigin);void 0!==this.maxParticles&&(t=Math.min(t,Math.max(0,this.maxParticles-this.particleNum)));for(let s=0;s<t;s++){e.burstParticleIndex=s,this.particleNum++,this.particles.length<this.particleNum&&this.growParticlePool(l);const t=this.particles[this.particleNum-1];if(t.reset(),t.speedModifier=1,this.finishedEventFired=!1,this.startColor.startGen(t.memory),this.startColor.genColor(t.memory,t.startColor,this.emissionState.time),t.color.copy(t.startColor),this.startSpeed.startGen(t.memory),t.startSpeed=this.startSpeed.genValue(t.memory,f),this.startLife.startGen(t.memory),t.life=this.startLife.genValue(t.memory,f),t.age=0,this.startSize.startGen(t.memory),d)this.startSize.genValue(t.memory,t.startSize,f);else{const e=this.startSize.genValue(t.memory,f);t.startSize.set(e,e,e)}if(this.startTileIndex.startGen(t.memory),t.uvTile=this.startTileIndex.genValue(t.memory),t.size.copy(t.startSize),h){const e=t;if(this.startRotation.startGen(t.memory),c)e.rotation instanceof Z||(e.rotation=Qs),e.angularVelocity instanceof Z&&e.angularVelocity.set(0,0,0,1),u?this.startRotation.genValue(t.memory,e.rotation,1,f):e.rotation.setFromAxisAngle(ks,this.startRotation.genValue(e.memory,f));else{e.rotation=u?0:this.startRotation.genValue(e.memory,f),e.angularVelocity=0;const t=this.flip;e.flip=void 0===t?0:(S()<t.x?1:0)|(S()<t.y?2:0)}}else if(p){const e=t;p.startLength.startGen(e.memory),e.length=p.startLength.genValue(e.memory,f),e.ensureHistoryCapacity(Math.max(1,Math.ceil(e.length))),e.resetHistory()}this.emitterShape.initialize(t,e),this.alignToDirection&&h&&this.alignParticleToDirection(t,c);const a=e.particle,y=e.inherit;if(void 0!==a&&void 0!==y&&0!==y&&this.inheritFromParent(t,a,y,h),l&&m){const e=t;e.localPosition||(e.localPosition=new H),e.localPosition.copy(e.position)}this.worldSpace?(t.position.applyMatrix4(i),t.startSize.multiply(r).abs(),t.size.copy(t.startSize),"hierarchy"===this.scalingMode?t.velocity.multiply(this.hierarchyScale).applyQuaternion(Js):t.velocity.multiply(r).applyMatrix3(this.normalMatrix),t.rotation&&t.rotation instanceof Z&&t.rotation.multiplyQuaternions(Js,t.rotation)):this.onlyUsedByOther&&(t.parentMatrix=i);for(let e=0;e<o;e++)n[e].initialize(t,this);this.store.recordMemory(t.storeIndex,t.memory)}}alignParticleToDirection(t,e){const i=t.velocity,s=i.x*i.x+i.y*i.y+i.z*i.z;if(0!==s)if(e){const e=t.rotation;Gs.copy(i).divideScalar(Math.sqrt(s)),Js.setFromUnitVectors(ks,Gs),e.multiplyQuaternions(Js,e)}else 0===i.x&&0===i.y||(t.rotation=t.rotation+Math.atan2(-i.x,i.y))}inheritFromParent(t,e,i,s){if(i&me.color&&(t.startColor.multiply(e.color),t.color.copy(t.startColor)),i&me.size&&(t.startSize.multiply(e.size),t.size.copy(t.startSize)),i&me.rotation&&s){const i=t,s=e.rotation;"number"==typeof i.rotation?"number"==typeof s&&(i.rotation+=s):s instanceof Z&&i.rotation.multiplyQuaternions(s,i.rotation)}i&me.lifetime&&e.life>0&&(t.life*=Math.max(0,1-e.age/e.life))}endEmit(){this.emitEnded=!0,this.autoDestroy&&(this.markForDestroy=!0),this.fire({type:"emitEnd",particleSystem:this})}dispose(){this.destroyed||(this.destroyed=!0,this._renderer&&this._renderer.deleteSystem(this),this.emitter.dispose(),this.fire({type:"destroy",particleSystem:this}))}restart(){this.memory.length=0,this.paused=!1,this.particleNum=0,this.boundsValid=!1,this.pendingCatchUp=0,void 0!==this.seedValue&&(this.rng=M(this.seedValue)),this.emissionState.isBursting=!1,this.emissionState.burstIndex=0,this.emissionState.burstWaveIndex=0,this.emissionState.burstWaves=void 0,this.emissionState.time=0,this.emissionState.waitEmiting=0,this.behaviors.forEach(t=>t.reset()),this.emitEnded=!1,this.markForDestroy=!1,this.finishedEventFired=!1,this.prewarmed=!1,this.emissionBursts.forEach(t=>t.count.startGen(this.memory)),this.emissionOverDistance.startGen(this.memory),this.startDelay.startGen(this.memory),this.startDelayTimeLeft=this.startDelay.genValue(this.memory,0),this.previousEmitterPos=void 0,this.emitterVelocity.set(0,0,0),this.simulationAccumulator=0,this.destroyed=!1}update(t,e=1/0,i){if(this.paused)return;if(t*=this.playbackSpeed,this.culled)return void("pauseAndCatchUp"===this.cullingMode&&(this.pendingCatchUp=Math.min(2,this.pendingCatchUp+t)));if(this.pendingCatchUp>0&&this.catchUp(i??performance.now()+ir.catchUpBudgetMs),this.firstTimeUpdate&&(this.firstTimeUpdate=!1,this.emitter.computeWorldMatrix(!0)),!this.looping&&this.finishedEventFired&&0===this.particleNum){t>.1&&(t=.1),this.simulationAccumulator+=t;const e=Math.min(8,Math.max(0,Math.round(this.simulationAccumulator/js-1e-9)));return void(this.simulationAccumulator-=e*js)}if(this.looping&&this.prewarm&&!this.prewarmed){this.prewarmed=!0;for(let t=0;t<60*this.duration;t++)this.update(1/60)}t>.1&&(t=.1),this.neededToUpdateRender&&(this._renderer&&this._renderer.updateSystem(this),this.neededToUpdateRender=!1);const s=this.emitter.matrixWorld.elements;if(this.tempEmitterPos.set(s[12],s[13],s[14]),void 0!==this.previousEmitterPos&&t>0&&this.emitterVelocity.copy(this.tempEmitterPos).sub(this.previousEmitterPos).divideScalar(t),(this.previousEmitterPos??(this.previousEmitterPos=new H)).copy(this.tempEmitterPos),this.startDelayTimeLeft>0&&(!this.prewarm||!this.looping)){if(this.startDelayTimeLeft-=t,this.startDelayTimeLeft>=0)return;t=Math.min(-this.startDelayTimeLeft,.1),this.startDelayTimeLeft=0}this.simulationAccumulator+=t;const r=Math.min(8,Math.max(0,Math.round(this.simulationAccumulator/js-1e-9)));for(let t=0;t<r&&(this.simulateStep(js),!(e!==1/0&&t+1<r&&performance.now()>=e));t++);this.simulationAccumulator-=r*js}catchUp(t){let e=Math.floor(this.pendingCatchUp/js);for(this.pendingCatchUp=0;e-- >0&&(this.simulateStep(js),!(e>0&&performance.now()>=t)););}storeBounds(t,e,i,s,r,n,o,a,l,h){if(0===t)return void(this.boundsValid=!1);this.stepsSinceBounds=e?0:this.stepsSinceBounds+1,this.boundsMaxSize=l,this.boundsMaxSpeedSq=h;const c=Math.sqrt(h),u=this.rendererSettings.renderMode;let d=c*js*(this.stepsSinceBounds+1);if(u===exports.RenderMode.Mesh)d+=l*this.meshGeometryRadius();else if(u===exports.RenderMode.StretchedBillBoard){const t=this.rendererEmitterSettings;d+=l*(1+(t.lengthFactor??0)+c*(t.speedFactor??0))}else{const t=this.rendererSettings.pivot;d+=l*(.75+(void 0===t?0:Math.abs(t.x)+Math.abs(t.y)+Math.abs(t.z)))}this.boundsMin.set(i,s,r),this.boundsMax.set(n,o,a),this.boundsPadding=d,this.boundsInWorld=this.worldSpace,this.boundsValid=!0}meshGeometryRadius(){const t=this.rendererSettings.instancingGeometry;if(t!==this.geometryRadiusFor){let e=0;for(let i=0;i+2<t.length;i+=3){const s=t[i]*t[i]+t[i+1]*t[i+1]+t[i+2]*t[i+2];s>e&&(e=s)}this.geometryRadius=Math.sqrt(e),this.geometryRadiusFor=t}return this.geometryRadius}getWorldBounds(t,e){if(!this.measureWorldBounds(t,e))return!1;if(this.rendererSettings.renderMode===exports.RenderMode.Beam){const i=this.beamEndScratch;if(!this.getBeamEnd(i))return!0;const s=this.boundsInWorld?this.boundsPadding:this.boundsPadding*this.emitterMaxScale();t.set(Math.min(t.x,i.x-s),Math.min(t.y,i.y-s),Math.min(t.z,i.z-s)),e.set(Math.max(e.x,i.x+s),Math.max(e.y,i.y+s),Math.max(e.z,i.z+s))}return!0}getBeamEnd(t){const e=this.beamEnd;if(void 0===e)return!1;const i=e;if("function"==typeof i.getAbsolutePosition){const e=i.getAbsolutePosition();t.set(e.x,e.y,e.z)}else{const i=e;t.set(i.x,i.y,i.z)}return!0}emitterMaxScale(){const t=this.emitter.matrixWorld.elements;return Math.sqrt(Math.max(t[0]*t[0]+t[1]*t[1]+t[2]*t[2],t[4]*t[4]+t[5]*t[5]+t[6]*t[6],t[8]*t[8]+t[9]*t[9]+t[10]*t[10]))}measureWorldBounds(t,e){if(!this.boundsValid)return!1;const i=this.boundsMin,s=this.boundsMax;if(this.boundsInWorld){const r=this.boundsPadding;return t.set(i.x-r,i.y-r,i.z-r),e.set(s.x+r,s.y+r,s.z+r),!0}const r=this.emitter.matrixWorld.elements,n=Math.sqrt(Math.max(r[0]*r[0]+r[1]*r[1]+r[2]*r[2],r[4]*r[4]+r[5]*r[5]+r[6]*r[6],r[8]*r[8]+r[9]*r[9]+r[10]*r[10])),o=this.boundsPadding*n;let a=1/0,l=1/0,h=1/0,c=-1/0,u=-1/0,d=-1/0;for(let t=0;t<8;t++){const e=1&t?s.x:i.x,n=2&t?s.y:i.y,o=4&t?s.z:i.z,f=1/(r[3]*e+r[7]*n+r[11]*o+r[15]),p=(r[0]*e+r[4]*n+r[8]*o+r[12])*f,m=(r[1]*e+r[5]*n+r[9]*o+r[13])*f,y=(r[2]*e+r[6]*n+r[10]*o+r[14])*f;p<a&&(a=p),p>c&&(c=p),m<l&&(l=m),m>u&&(u=m),y<h&&(h=y),y>d&&(d=y)}return t.set(a-o,l-o,h-o),e.set(c+o,u+o,d+o),!0}setWorldBounds(t,e,i,s,r,n,o){this.boundsMin.set(t,e,i),this.boundsMax.set(s,r,n),this.boundsPadding=o,this.boundsInWorld=!0,this.boundsValid=!0}get simulationStep(){return js}get simulationResidual(){return this.paused?0:this.simulationAccumulator>js?js:this.simulationAccumulator<-js?-js:this.simulationAccumulator}behaviorSteps(){const t=this.behaviors,e=this.fusionPlan;if(void 0!==e&&e.length===t.length){let i=!0;for(let s=0;s<t.length;s++)if(e[s]!==t[s]){i=!1;break}if(i)return this.fusionSteps}this.fusionPlan=t.slice(),this.fusionSteps=gi(t);let i=!1,s=!1;for(let e=0;e<t.length;e++){const r=t[e].type;Ys.has(r)?i=!0:Xs.has(r)?s=!0:Zs.has(r)||(i=!0,s=!0)}return this.planChangesSize=i,this.planChangesColor=s,this.fusionSteps}simulateStep(t){const e=this.rng;if(void 0===e)return void this.stepOnce(t);const i=w(e);try{this.stepOnce(t)}finally{w(i)}}stepOnce(t){this.motionScale=this.measureMotionScale(),this.onlyUsedByOther||this.emit(t,this.emissionState,this.emitter.matrixWorld);const e=this.particles,i=this.behaviors;i.length;const s=this.particleNum,r=this.rendererSettings.renderMode===exports.RenderMode.Trail,n=this.rendererSettings.renderMode===exports.RenderMode.StretchedBillBoard,o=this.store,a=3*s,l=this.behaviorSteps(),h=this.planChangesSize,c=this.planChangesColor;o.useSizeSnapshot(h),o.useColorSnapshot(c),o.previousPosition.set(o.position.subarray(0,a)),h&&o.previousSize.set(o.size.subarray(0,a)),n&&(o.keepPreviousVelocity()&&this.rebindParticles(),o.previousVelocity.set(o.velocity.subarray(0,a))),c&&o.previousColor.set(o.color.subarray(0,4*s)),this.emitterShape.update(this,t);for(let r=0;r<l.length;r++){const n=l[r],o=n.behaviors;for(let e=0;e<o.length;e++)o[e].frameUpdate(t);if(0===s)continue;if(void 0!==n.run){n.run(i,e,s,t,this.store);continue}const a=o[0];if(void 0===a.updateAll)for(let i=0;i<s;i++){const s=e[i];s.age<s.life&&a.update(s,t)}else a.updateAll(e,s,t)}const u=this.hasListeners("particleDied"),d=this.store,f=d.scalars,p=Me.SCALAR_STRIDE;let m=this.particleNum;if(!r){const i=d.position,s=d.velocity,r=d.previousSize,n=d.size,o=d.previousColor,a=d.color,l=h,y=c,g=this.stepsSinceBounds>=4||!this.boundsValid,v=this.boundsMin,x=this.boundsMax;let S=g?1/0:v.x,b=g?1/0:v.y,w=g?1/0:v.z,M=g?-1/0:x.x,z=g?-1/0:x.y,_=g?-1/0:x.z,P=g?0:this.boundsMaxSize,T=g?0:this.boundsMaxSpeedSq;for(let h=0;h<m;h++){const c=h*p;let v=f[c+Me.AGE];const x=3*h,V=g||0===v;if(0===v&&(l&&(r[x]=n[x],r[x+1]=n[x+1],r[x+2]=n[x+2]),y)){const t=4*h;o[t]=a[t],o[t+1]=a[t+1],o[t+2]=a[t+2],o[t+3]=a[t+3]}const O=t*f[c+Me.SPEED_MODIFIER],C=s[x],F=s[x+1],A=s[x+2],B=i[x]+C*O,$=i[x+1]+F*O,I=i[x+2]+A*O;if(i[x]=B,i[x+1]=$,i[x+2]=I,V&&(S=Math.min(S,B),M=Math.max(M,B),b=Math.min(b,$),z=Math.max(z,$),w=Math.min(w,I),_=Math.max(_,I),P=Math.max(P,Math.max(n[x],Math.max(n[x+1],n[x+2])))),T=Math.max(T,C*C+F*F+A*A),v+=t,f[c+Me.AGE]=v,v>=f[c+Me.LIFE]){const t=m-1,i=e[h],s=e[t];e[h]=s,e[t]=i,h!==t&&(d.swapRows(h,t),s.setStoreIndex(h),i.setStoreIndex(t)),m--,h--,u&&this.fire({type:"particleDied",particleSystem:this,particle:i})}}return this.particleNum=m,this.storeBounds(m,g,S,b,w,M,z,_,P,T),void this.notifyFinished()}if(s>0){const t=o.previousSize,e=o.size,i=o.previousColor,r=o.color;for(let n=0,o=0,a=0,l=0;n<s;n++,o+=3,a+=4,l+=p)0===f[l+Me.AGE]&&(h&&(t[o]=e[o],t[o+1]=e[o+1],t[o+2]=e[o+2]),c&&(i[a]=r[a],i[a+1]=r[a+1],i[a+2]=r[a+2],i[a+3]=r[a+3]))}if(this.rendererEmitterSettings.followLocalOrigin){const i=this.emitter.matrixWorld;for(let r=0;r<s;r++){const s=e[r];s.localPosition?(s.position.copy(s.localPosition),s.position.applyMatrix4(s.parentMatrix??i)):s.position.addScaledVector(s.velocity,t*s.speedModifier),s.age+=t}}else{const e=d.position,i=d.velocity;for(let r=0,n=0,o=0;r<s;r++,n+=3,o+=p){const s=t*f[o+Me.SPEED_MODIFIER];e[n]+=i[n]*s,e[n+1]+=i[n+1]*s,e[n+2]+=i[n+2]*s,f[o+Me.AGE]+=t}}{const t=this.rendererEmitterSettings,i=t.dieWithParticle,r=t.recordWorldSpace&&!this.worldSpace,n=this.emitter.matrixWorld;for(let t=0;t<s;t++){const s=e[t];if(i&&s.age>=s.life)s.resetHistory();else if(s.update(),r&&s.age<=s.life){const t=(s.historyHead+s.historyCapacity-1)%s.historyCapacity*3,e=s.historyPositions;Gs.set(e[t],e[t+1],e[t+2]),Gs.applyMatrix4(s.parentMatrix??n),e[t]=Gs.x,e[t+1]=Gs.y,e[t+2]=Gs.z}}}for(let t=0;t<m;t++){const i=e[t],s=t*p;if(f[s+Me.AGE]>=f[s+Me.LIFE]&&0===i.historyCount){const s=m-1,r=e[s];e[t]=r,e[s]=i,t!==s&&(d.swapRows(t,s),r.setStoreIndex(t),i.setStoreIndex(s)),m--,t--,u&&this.fire({type:"particleDied",particleSystem:this,particle:i})}}this.particleNum=m,this.notifyFinished()}notifyFinished(){this.isFinished()&&(this.finishedEventFired||(this.finishedEventFired=!0,this.fire({type:"finished",particleSystem:this})),this.autoDestroy&&(this.markForDestroy=!0,this.dispose()))}static burstWaveCount(t){return t.cycle>=1?Math.floor(t.cycle):1}static burstInterval(t){return t.interval>0?t.interval:0}emitBursts(t,e){const i=this.emissionBursts,s=i.length,r=t.time,n=t.burstWaves??(t.burstWaves=[]);for(;t.burstIndex<s&&i[t.burstIndex].time<=r;)n[t.burstIndex]=0,t.burstIndex++;const o=t.burstIndex;for(let s=0;s<o;s++){const o=i[s],a=ir.burstWaveCount(o);let l=n[s]??0;if(l>=a)continue;const h=ir.burstInterval(o);for(;l<a;){const i=o.time+l*h;if(l>0&&i>this.duration){l=a;break}if(i>r)break;t.burstWaveIndex=l,this.fireBurstWave(o,t,e),l++}n[s]=l}}fireBurstWave(t,e,i){if(S()>=t.probability)return;const s=t.count.genValue(this.memory,this.time),r=this.emissionFactor(),n=Math.abs(r-1)<.001?s:Math.floor(s*r+S());e.isBursting=!0,e.burstParticleCount=n,this.spawn(n,e,i),e.isBursting=!1}hasPendingBurstWaves(t){const e=t.burstWaves;if(void 0===e)return!1;const i=this.emissionBursts;for(let s=0;s<t.burstIndex&&s<i.length;s++){const t=i[s],r=e[s]??0;if(r<ir.burstWaveCount(t)&&(0===r||t.time+r*ir.burstInterval(t)<=this.duration))return!0}return!1}spawnAlongPath(t,e,i,s,r,n,o){const a=this.pathMatrix.copy(i),l=i.elements,h=a.elements,c=l[12],u=l[13],d=l[14];for(let i=1;i<=t;i++){const t=i*n-r,l=t<=0?0:t>=o?1:t/o;h[12]=s.x+(c-s.x)*l,h[13]=s.y+(u-s.y)*l,h[14]=s.z+(d-s.z)*l,this.spawn(1,e,a)}}emit(t,e,i){const s=this.emitEnded&&e===this.emissionState;if(e.time>this.duration)if(this.looping){e.time-=this.duration,e.burstIndex=0,void 0!==e.burstWaves&&(e.burstWaves.length=0);for(let t=0;t<this.behaviors.length;t++)this.behaviors[t].reset()}else this.emitEnded||this.onlyUsedByOther||this.endEmit();this.worldSpace&&this.normalMatrix.getNormalMatrix(i);const r=this.emissionBursts.length,n=this.emissionFactor();r>0&&!s&&this.emitBursts(e,i);let o=0,a=0,l=0,h=0;const c=e.previousWorldPos;if(!this.emitEnded){const s=e.time/this.duration;if(e.waitEmiting+=t*this.emissionOverTime.genValue(this.memory,s)*n,void 0!==c){this.temp.set(i.elements[12],i.elements[13],i.elements[14]),h=c.distanceTo(this.temp),l=e.travelDistance,e.travelDistance+=h;const t=this.emissionOverDistance.genValue(this.memory,s)*n;if(e.travelDistance*t>0){const i=Math.floor(e.travelDistance*t);e.travelDistance-=i/t,this.worldSpace&&h>0?(o=i,a=1/t):e.waitEmiting+=i}}}const u=Math.floor(e.waitEmiting);u>0&&(this.spawn(u,e,i),e.waitEmiting-=u),o>0&&this.spawnAlongPath(o,e,i,c,l,a,h),void 0===e.previousWorldPos&&(e.previousWorldPos=new H),e.previousWorldPos.set(i.elements[12],i.elements[13],i.elements[14]),e.time+=t}toJSON(t,e={}){const i=void 0===t||"string"==typeof t?{geometries:{},materials:{},textures:{},images:{},shapes:{},skeletons:{},animations:{},nodes:{}}:t,s=this.ensureGeometryMeta(i),r=this.ensureMaterialMeta(i),n=this.toRendererSettingsJSON();return{version:"3.0",autoDestroy:this.autoDestroy,looping:this.looping,prewarm:this.prewarm,duration:this.duration,startDelay:this.startDelay.toJSON(),shape:this.emitterShape.toJSON(),startLife:this.startLife.toJSON(),startSpeed:this.startSpeed.toJSON(),startRotation:this.startRotation.toJSON(),startSize:this.startSize.toJSON(),startColor:this.startColor.toJSON(),emissionOverTime:this.emissionOverTime.toJSON(),emissionOverDistance:this.emissionOverDistance.toJSON(),emissionBursts:this.emissionBursts.map(t=>({time:t.time,count:t.count.toJSON(),probability:t.probability,interval:t.interval,cycle:t.cycle})),...void 0!==this.maxParticles?{maxParticles:this.maxParticles}:{},onlyUsedByOther:this.onlyUsedByOther,instancingGeometry:s,renderMode:this.renderMode,renderOrder:this.renderOrder,...0!==this.renderingGroupId?{renderingGroupId:this.renderingGroupId}:{},...this.applyFog?{}:{applyFog:!1},...1!==this.playbackSpeed?{playbackSpeed:this.playbackSpeed}:{},..."always"!==this.cullingMode?{cullingMode:this.cullingMode}:{},..."shape"!==this.scalingMode?{scalingMode:this.scalingMode}:{},...void 0!==this.seedValue?{seed:this.seedValue}:{},..."none"!==this.sortMode?{sortMode:this.sortMode}:{},...this.alignToDirection?{alignToDirection:!0}:{},...this.minParticleSize>0?{minParticleSize:this.minParticleSize}:{},...this.maxParticleSize!==1/0?{maxParticleSize:this.maxParticleSize}:{},rendererEmitterSettings:n,material:r,layers:this.rendererSettings.layerMask,startTileIndex:this.startTileIndex.toJSON(),uTileCount:this.rendererSettings.uTileCount,vTileCount:this.rendererSettings.vTileCount,blendTiles:this.rendererSettings.blendTiles,softParticles:this.rendererSettings.softParticles,softFarFade:this.rendererSettings.softFarFade,softNearFade:this.rendererSettings.softNearFade,blending:this.rendererSettings.materialBlendMode,transparent:this.rendererSettings.materialTransparent,depthTest:this.rendererSettings.materialDepthTest,depthWrite:this.rendererSettings.materialDepthWrite,alphaTest:this.rendererSettings.materialAlphaTest,behaviors:this.behaviors.map(t=>t.toJSON()),worldSpace:this.worldSpace,...this.pivot?{pivot:[this.pivot.x,this.pivot.y,this.pivot.z]}:{},...this.flip?{flip:[this.flip.x,this.flip.y]}:{}}}static fromJSON(t,e,i={},s){const n=Bi(t.shape,e);let o;if(t.renderMode===exports.RenderMode.Trail){const e=t.rendererEmitterSettings;o={startLength:void 0!==e?.startLength?It(e.startLength):new Ct(30),followLocalOrigin:e?.followLocalOrigin??!1,...er(e)}}else t.renderMode===exports.RenderMode.StretchedBillBoard?(o={...t.rendererEmitterSettings??{}},void 0!==t.speedFactor&&(o.speedFactor=t.speedFactor)):o={};const a=t.material?e.materials?.[t.material]:void 0,l=a?.texture??t.texture,h="string"==typeof l?e.textures?.[l]??null:l??null,c=t=>"string"==typeof t?e.textures?.[t]??null:t??null,u=a?.erosion,d="string"==typeof t.instancingGeometry?e.geometries?.[t.instancingGeometry]:t.instancingGeometry,f=ir.resolveGeometryData(d),p=new ir({scene:s,autoDestroy:t.autoDestroy,looping:t.looping,prewarm:t.prewarm,duration:t.duration,startDelay:t.startDelay?It(t.startDelay):void 0,shape:n,startLife:It(t.startLife),startSpeed:It(t.startSpeed),startRotation:ee(t.startRotation),startSize:ee(t.startSize),startColor:Yt(t.startColor),emissionOverTime:It(t.emissionOverTime),emissionOverDistance:It(t.emissionOverDistance),emissionBursts:t.emissionBursts?.map(t=>({time:t.time,count:"number"==typeof t.count?new Ct(t.count):It(t.count),probability:t.probability??1,interval:t.interval??.1,cycle:t.cycle??t.cycleCount??1})),maxParticles:"number"==typeof t.maxParticles?t.maxParticles:void 0,onlyUsedByOther:t.onlyUsedByOther,instancingGeometry:f.positions,instancingIndices:f.indices,instancingUVs:f.uvs,instancingNormals:f.normals,renderMode:t.renderMode,rendererEmitterSettings:o,renderOrder:t.renderOrder,renderingGroupId:"number"==typeof t.renderingGroupId?t.renderingGroupId:void 0,applyFog:!1!==t.applyFog,playbackSpeed:"number"==typeof t.playbackSpeed?t.playbackSpeed:void 0,cullingMode:ir.validCullingMode(t.cullingMode),scalingMode:"hierarchy"===t.scalingMode?"hierarchy":"shape",seed:"number"==typeof t.seed?t.seed:void 0,sortMode:ir.validSortMode(t.sortMode),alignToDirection:!0===t.alignToDirection,minParticleSize:"number"==typeof t.minParticleSize?t.minParticleSize:void 0,maxParticleSize:"number"==typeof t.maxParticleSize?t.maxParticleSize:void 0,texture:h,material:a?.sourceMaterial??a,blendMode:a?.alphaMode??t.blending??r.Constants.ALPHA_ADD,transparent:a?.transparent??t.transparent??!0,depthTest:a?.depthTest??t.depthTest??!0,depthWrite:a?.depthWrite??t.depthWrite??!1,alphaTest:a?.alphaTest??t.alphaTest??0,startTileIndex:"number"==typeof t.startTileIndex?new Ct(t.startTileIndex):It(t.startTileIndex),uTileCount:t.uTileCount,vTileCount:t.vTileCount,blendTiles:t.blendTiles,softParticles:t.softParticles,softFarFade:t.softFarFade,softNearFade:t.softNearFade,behaviors:[],worldSpace:t.worldSpace,layerMask:t.layers,pivot:t.pivot?new H(t.pivot[0]??0,t.pivot[1]??0,t.pivot[2]??0):void 0,flip:t.flip?new xt(t.flip[0]??0,t.flip[1]??0):void 0,lighting:a?.lighting,rim:a?.rim,uvScroll:a?.uvScroll,gradientMap:c(a?.gradientMap),erosion:u&&"object"==typeof u?{...u,mask:c(u.mask)}:void 0});return p.behaviors=(t.behaviors??[]).map(t=>{const e=ri(t,p);return e&&"EmitSubParticleSystem"===e.type&&(i[t.subParticleSystem]=e),e}).filter(t=>null!==t),p}static nextSerializationId(t){return ir.serializationCounter+=1,`${t}_${ir.serializationCounter}`}static createFallbackNormals(t){const e=new Float32Array(t.length);for(let t=0;t<e.length;t+=3)e[t]=0,e[t+1]=0,e[t+2]=1;return e}toRendererSettingsJSON(){return this.renderMode===exports.RenderMode.Trail?{startLength:this.rendererEmitterSettings.startLength.toJSON(),followLocalOrigin:this.rendererEmitterSettings.followLocalOrigin,...er(this.rendererEmitterSettings)}:this.renderMode===exports.RenderMode.StretchedBillBoard?{speedFactor:this.rendererEmitterSettings.speedFactor,lengthFactor:this.rendererEmitterSettings.lengthFactor}:{}}ensureGeometryMeta(t){const e=ir.nextSerializationId("quarks_geometry");return t.geometries[e]={uuid:e,type:"QuarksGeometry",positions:Array.from(this.rendererSettings.instancingGeometry),indices:Array.from(this.rendererSettings.instancingIndices),uvs:this.rendererSettings.instancingUVs?Array.from(this.rendererSettings.instancingUVs):void 0,normals:this.rendererSettings.instancingNormals?Array.from(this.rendererSettings.instancingNormals):void 0},e}ensureMaterialMeta(t){const e=this.rendererSettings.texture;let i;e&&(i=ir.nextSerializationId("quarks_texture"),t.textures[i]=e);const s=this.rendererSettings.reflectionAtlas;let r;s instanceof y.Texture&&(r=ir.nextSerializationId("quarks_texture"),t.textures[r]=s);const n=e=>{if(!(e instanceof y.Texture))return;const i=ir.nextSerializationId("quarks_texture");return t.textures[i]=e,i},o=this.erosion,a=ir.nextSerializationId("quarks_material");return t.materials[a]={uuid:a,type:"QuarksMaterial",transparent:this.rendererSettings.materialTransparent,alphaMode:this.rendererSettings.materialBlendMode,depthTest:this.rendererSettings.materialDepthTest,depthWrite:this.rendererSettings.materialDepthWrite,alphaTest:this.rendererSettings.materialAlphaTest,texture:i,reflectionAtlas:r,reflectionLevel:this.rendererSettings.reflectionLevel,..."fixed"!==this.lighting?{lighting:this.lighting}:{},...this.rim?{rim:{...this.rim,color:[...this.rim.color]}}:{},...this.uvScroll?{uvScroll:[...this.uvScroll]}:{},...this.gradientMap?{gradientMap:n(this.gradientMap)}:{},...o?{erosion:{mask:n(o.mask),softness:o.softness,edgeWidth:o.edgeWidth,edgeColor:[...o.edgeColor],maskScroll:[...o.maskScroll]}}:{},sourceMaterial:this.materialRef??void 0},a}static resolveGeometryData(t){if(t?.positions){const e=t.positions instanceof Float32Array?t.positions:new Float32Array(t.positions);return{positions:e,indices:qs(e,t.indices instanceof Uint16Array||t.indices instanceof Uint32Array?t.indices:t.indices?new Uint32Array(t.indices):void 0),uvs:t.uvs?t.uvs instanceof Float32Array?t.uvs:new Float32Array(t.uvs):void 0,normals:t.normals?t.normals instanceof Float32Array?t.normals:new Float32Array(t.normals):void 0}}const e=t?.data??t;if(e?.attributes?.position?.array){const t=new Float32Array(e.attributes.position.array);let i;if(e.index?.array){i=new("Uint16Array"===e.index.type?Uint16Array:Uint32Array)(e.index.array)}return{positions:t,indices:qs(t,i),uvs:e.attributes.uv?.array?new Float32Array(e.attributes.uv.array):void 0,normals:e.attributes.normal?.array?new Float32Array(e.attributes.normal.array):void 0}}return{positions:Hs,indices:tr,uvs:Ks}}addBehavior(t){this.behaviors.push(t),this._renderer?._invalidateUpdateOrder()}getRendererSettings(){return this.rendererSettings}addEventListener(t,e){this.listeners[t]||(this.listeners[t]=[]),this.listeners[t].push(e)}removeAllEventListeners(t){this.listeners[t]&&(this.listeners[t]=[])}removeEventListener(t,e){if(this.listeners[t]){const i=this.listeners[t].indexOf(e);-1!==i&&this.listeners[t].splice(i,1)}}hasListeners(t){const e=this.listeners[t];return void 0!==e&&e.length>0}fire(t){const e=this.listeners[t.type];if(void 0!==e)for(let i=0;i<e.length;i++)e[i](t)}clone(){const t=this.behaviors.map(t=>t.clone());let e;e=this.renderMode===exports.RenderMode.Trail?{startLength:this.rendererEmitterSettings.startLength.clone(),followLocalOrigin:this.rendererEmitterSettings.followLocalOrigin,...er(this.rendererEmitterSettings)}:this.renderMode===exports.RenderMode.StretchedBillBoard?{lengthFactor:this.rendererEmitterSettings.lengthFactor,speedFactor:this.rendererEmitterSettings.speedFactor}:{};const i=new ir({autoDestroy:this.autoDestroy,looping:this.looping,prewarm:this.prewarm,duration:this.duration,startDelay:this.startDelay.clone(),shape:this.emitterShape.clone(),startLife:this.startLife.clone(),startSpeed:this.startSpeed.clone(),startRotation:this.startRotation.clone(),startSize:this.startSize.clone(),startColor:this.startColor.clone(),emissionOverTime:this.emissionOverTime.clone(),emissionOverDistance:this.emissionOverDistance.clone(),emissionBursts:this.emissionBursts.map(t=>({...t})),maxParticles:this.maxParticles,onlyUsedByOther:this.onlyUsedByOther,instancingGeometry:this.rendererSettings.instancingGeometry,instancingIndices:this.rendererSettings.instancingIndices,instancingUVs:this.rendererSettings.instancingUVs,instancingNormals:this.rendererSettings.instancingNormals,renderMode:this.renderMode,renderOrder:this.renderOrder,renderingGroupId:this.renderingGroupId,applyFog:this.applyFog,playbackSpeed:this.playbackSpeed,cullingMode:this.cullingMode,scalingMode:this.scalingMode,seed:this.seedValue,sortMode:this.sortMode,alignToDirection:this.alignToDirection,minParticleSize:this.minParticleSize,maxParticleSize:this.maxParticleSize,rendererEmitterSettings:e,material:this.materialRef,texture:this.rendererSettings.texture,startTileIndex:this.startTileIndex,uTileCount:this.rendererSettings.uTileCount,vTileCount:this.rendererSettings.vTileCount,blendTiles:this.rendererSettings.blendTiles,softParticles:this.rendererSettings.softParticles,softFarFade:this.rendererSettings.softFarFade,softNearFade:this.rendererSettings.softNearFade,behaviors:t,worldSpace:this.worldSpace,blendMode:this.rendererSettings.materialBlendMode,transparent:this.rendererSettings.materialTransparent,depthTest:this.rendererSettings.materialDepthTest,depthWrite:this.rendererSettings.materialDepthWrite,alphaTest:this.rendererSettings.materialAlphaTest,layerMask:this.rendererSettings.layerMask,pivot:this.pivot,flip:this.flip,lighting:this.lighting,rim:this.rim,uvScroll:this.uvScroll,gradientMap:this.gradientMap,erosion:this.erosion,scene:this.emitter.getScene()});for(const e of t)e instanceof ge&&(e.particleSystem=i);return i}}ir.serializationCounter=0,ir.catchUpBudgetMs=2;class sr extends s.TransformNode{constructor(t="QuarksPrefab",e){super(t,e),this.type="QuarksPrefab",this.animationData=[],this.isPlaying=!1,this.currentTime=-1e-5,this.timeScale=1,this.duration=0,this._lastUpdateTimeMs=Date.now(),this._tempAnimationJSON=[]}registerBatchedRenderer(t){this._batchedRenderer=t}addParticleSystemAnimation(t,e=0,i=0,s=!1){const r={startTime:e,duration:i>0?i:t.system.duration,type:"ps",loop:s,target:t};return this.animationData.push(r),this.pause(),this.updateDuration(),r}addThreeAnimation(t,e,i=0,s=e?.duration??0,r=!1,n){const o={startTime:i,duration:s>0?s:e?.duration??0,type:"three",loop:r,target:t,clip:e,clipUUID:n??e?.uuid};return this.animationData.push(o),this.updateDuration(),o}removeAnimation(t){this.animationData.splice(t,1),this.updateDuration()}play(){this.isPlaying||(this.isPlaying=!0,this._lastUpdateTimeMs=Date.now())}pause(){this.isPlaying&&(this.isPlaying=!1,this.animationData.forEach(t=>{"ps"===t.type&&t.target instanceof Fs?t.target.system.pause():t.clip?.pause?.()}))}stop(){this.pause(),this.currentTime=-1e-5,this.animationData.forEach(t=>{"ps"===t.type&&t.target instanceof Fs?t.target.system.stop():t.clip?.stop?.()})}update(t){if(!this.isPlaying)return;const e=Date.now(),i=t??Math.max((e-this._lastUpdateTimeMs)/1e3,0);this._lastUpdateTimeMs=e;const s=this.currentTime;this.currentTime+=i*this.timeScale,this.currentTime>this.duration?this.stop():this.animationData.forEach(t=>{const e=t.startTime,i=t.startTime+t.duration,r=this.currentTime>=e&&this.currentTime<=i,n=s>=e&&s<=i;if(!r||n){if(!r&&n){if(t.loop&&"ps"===t.type&&t.target instanceof Fs)return void t.target.system.restart();"ps"===t.type&&t.target instanceof Fs?t.target.system.endEmit():t.loop?t.clip?.play?.():t.clip?.stop?.()}}else"ps"===t.type&&t.target instanceof Fs?(t.target.system.restart(),this._batchedRenderer&&this._batchedRenderer.addSystem(t.target.system)):t.clip?.play?.()})}setTime(t){const e=this.currentTime;this.currentTime=t,this.animationData.forEach(i=>{const s=i.startTime,r=i.startTime+i.duration,n=this.currentTime>=s&&this.currentTime<r,o=e>=s&&e<r;!n||o?n||!o?n&&"three"===i.type&&i.clip?.setTime?.(Math.max(t-s,0)):"ps"===i.type&&i.target instanceof Fs?i.target.system.endEmit():i.clip?.stop?.():"ps"===i.type&&i.target instanceof Fs?i.target.system.restart():i.clip?.play?.()})}getDuration(){return this.duration}resolveReferences(t){const e={},i=t=>{t._quarksUUID&&(e[t._quarksUUID]=t),e[t.uniqueId.toString()]=t;const r=t.getChildren();for(const t of r)t instanceof s.TransformNode&&i(t)};i(t),this._tempAnimationJSON.forEach(t=>{const i=e[t.targetUUID];if("ps"===t.type&&i instanceof Fs)this.addParticleSystemAnimation(i,t.startTime,t.duration,t.loop);else if("three"===t.type&&i){const e=this.resolveTimelineClip(i,t.clipUUID);this.addThreeAnimation(i,e,t.startTime,t.duration,t.loop,t.clipUUID)}}),this.updateDuration(),this._tempAnimationJSON=[]}toJSON(){return{type:this.type,name:this.name,animationData:this.animationData.map(t=>({startTime:t.startTime,duration:t.duration,type:t.type,targetUUID:t.target._quarksUUID??t.target.uniqueId.toString(),clipUUID:"three"===t.type?t.clipUUID??t.clip?.uuid:void 0,loop:t.loop}))}}static fromJSON(t,e){const i=new sr(t.name||"QuarksPrefab",e);return Array.isArray(t.animationData)&&(i._tempAnimationJSON=t.animationData.filter(t=>"ps"===t?.type||"three"===t?.type)),i}resolveTimelineClip(t,e){const i=[t.animations,t.animationGroups,t.metadata?.animations,t.metadata?.animationGroups];for(const t of i){if(!Array.isArray(t))continue;if(!e)return t[0];const i=t.find(t=>t?.uuid===e);if(i)return i}}updateDuration(){let t=0;this.animationData.forEach(e=>{const i=e.startTime+e.duration;i>t&&(t=i)}),this.duration=t}}const rr=new WeakMap,nr=new WeakMap,or=new WeakMap;function ar(t,e){let i=t.get(e);return void 0===i&&(i=new Map,t.set(e,i)),i}class lr{constructor(t,e={}){this.scene=t,this.options=e}async load(t){const{json:e,baseUrl:i}=await this.fetchEffectDocument(t);return this.loadFromJSON(e,i)}async loadFromJSON(t,e){const i=e??this.options.baseUrl??"";return await this.resolveResources(t,i),this.parse(t,i)}async loadAll(t,e={}){const i=await lr.mapPool(t,e.concurrency,async(i,s)=>{try{return await this.fetchEffectDocument(i)}catch(r){if(!e.continueOnError)throw r;return console.warn(`[QuarksLoader] Failed to fetch effect "${i}" (${s+1}/${t.length}):`,r),null}});return this.loadDocuments(i,e)}async loadFromJSONAll(t,e={}){const i=t.map(t=>{if(null!==t&&"object"==typeof t&&"json"in t){const e=t;return{json:e.json,baseUrl:e.baseUrl??this.options.baseUrl??""}}return{json:t,baseUrl:this.options.baseUrl??""}});return this.loadDocuments(i,e)}async resolveResources(t,e=""){await lr.resolveLinkedResources(t,{baseUrl:e,resolver:this.options.resolver,scene:this.scene})}static async resolveLinkedResources(t,e={}){const i=e.baseUrl??"",s=e.resolver,r=e.scene;await lr.inlineGeometryEntries(t,async t=>{const e=await lr.resolveWith(s,t,"geometry",i);return lr.fetchJsonWith(s,e,r)});const n=Array.isArray(t?.images)?t.images:[];await Promise.all(n.map(async t=>{"string"==typeof t?.url&&t.url&&(t.url=await lr.resolveWith(s,t.url,"image",i))}))}static async resolveExternalGeometries(t,e){await lr.inlineGeometryEntries(t,e)}parse(t,e=""){const i={textures:{},geometries:{},materials:{}};t.geometries&&this.parseGeometries(t.geometries,i),t.images&&this.parseImages(t.images,e,i),t.textures&&this.parseTextures(t.textures,i),t.materials&&this.parseMaterials(t.materials,i);const s=this.parseObject(t.object,i);return this.linkReferences(s),s}parseGeometries(t,e){for(const i of t)if("PlaneGeometry"===i.type){const t=(i.width||1)/2,s=(i.height||1)/2;e.geometries[i.uuid]={positions:new Float32Array([-t,-s,0,t,-s,0,t,s,0,-t,s,0]),indices:new Uint32Array([0,1,2,0,2,3]),uvs:new Float32Array([0,0,1,0,1,1,0,1]),normals:new Float32Array([0,0,1,0,0,1,0,0,1,0,0,1])}}else if("SphereGeometry"===i.type)e.geometries[i.uuid]=this.parseSphereGeometry(i);else if("BufferGeometry"===i.type&&i.data){const t=this.parseBufferGeometry(i.data);e.geometries[i.uuid]=t}else"QuarksGeometry"===i.type&&("string"!=typeof i.url||i.positions||console.warn(`[QuarksLoader] Geometry "${i.url}" is an external file; use load(), loadFromJSON(), or resolveResources() before parse().`),e.geometries[i.uuid]=this.share({positions:new Float32Array(i.positions??[]),indices:i.indices?new Uint32Array(i.indices):new Uint32Array(0),uvs:i.uvs?new Float32Array(i.uvs):void 0,normals:i.normals?new Float32Array(i.normals):void 0}))}share(t){if(!1===this.options.shareResources)return t;const e=ar(nr,this.scene),i=function(t){let e=2166136261,i=2654435769;const s=[t.positions,t.indices,t.uvs,t.normals];let r="";for(const t of s){if(void 0===t){r+="-,";continue}const s=new Uint8Array(t.buffer,t.byteOffset,t.byteLength);r+=s.length+",";for(let t=0;t<s.length;t++)e=Math.imul(e^s[t],16777619),i=Math.imul(i^s[t],1540483477)^i>>>15}return`${r}${(e>>>0).toString(16)}${(i>>>0).toString(16)}`}(t),s=e.get(i);return void 0!==s?s:(e.set(i,t),t)}static clearSharedResources(t){rr.delete(t),nr.delete(t),or.delete(t)}static joinUrl(t,e){return/^(data|blob):/i.test(e)||/^[a-z][a-z0-9+.-]*:\/\//i.test(e)||e.startsWith("/")?e:t+e}parseSphereGeometry(t){const e=t.radius??.5,i=Math.max(3,Math.floor(t.widthSegments??16)),s=Math.max(2,Math.floor(t.heightSegments??8)),r=t.phiStart??0,n=t.phiLength??2*Math.PI,o=t.thetaStart??0,a=t.thetaLength??Math.PI,l=[],h=[],c=[],u=[],d=[];let f=0;for(let t=0;t<=s;t++){const u=[],p=t/s,m=o+p*a;for(let t=0;t<=i;t++){const s=t/i,o=r+s*n,a=-e*Math.cos(o)*Math.sin(m),d=e*Math.cos(m),y=e*Math.sin(o)*Math.sin(m);l.push(a,d,y);const g=Math.hypot(a,d,y)||1;h.push(a/g,d/g,y/g),c.push(s,1-p),u.push(f++)}d.push(u)}const p=o<=0,m=o+a>=Math.PI;for(let t=0;t<s;t++)for(let e=0;e<i;e++){const i=d[t][e+1],r=d[t][e],n=d[t+1][e],o=d[t+1][e+1];0===t&&p||u.push(i,r,o),t===s-1&&m||u.push(r,n,o)}const y=l.length/3>65535?new Uint32Array(u):new Uint16Array(u);return{positions:new Float32Array(l),indices:y,uvs:new Float32Array(c),normals:new Float32Array(h)}}parseBufferGeometry(t){let e,i,s=new Float32Array(0),r=new Uint32Array(0);if(t.interleavedBuffers&&t.arrayBuffers){const r={};for(const[e,i]of Object.entries(t.interleavedBuffers)){const s=t.arrayBuffers[i.buffer];if(s){const t=new Float32Array(Array.isArray(s)?this.int32ArrayToFloat32(s):s);r[e]={data:t,stride:i.stride}}}if(t.attributes){if(t.attributes.position?.isInterleavedBufferAttribute){const e=t.attributes.position,i=r[e.data];i&&(s=this.extractInterleavedAttribute(i.data,i.stride,e.offset,e.itemSize))}if(t.attributes.uv?.isInterleavedBufferAttribute){const i=t.attributes.uv,s=r[i.data];s&&(e=this.extractInterleavedAttribute(s.data,s.stride,i.offset,i.itemSize))}if(t.attributes.normal?.isInterleavedBufferAttribute){const e=t.attributes.normal,s=r[e.data];s&&(i=this.extractInterleavedAttribute(s.data,s.stride,e.offset,e.itemSize))}}}else t.attributes&&(t.attributes.position?.array&&(s=new Float32Array(t.attributes.position.array)),t.attributes.uv?.array&&(e=new Float32Array(t.attributes.uv.array)),t.attributes.normal?.array&&(i=new Float32Array(t.attributes.normal.array)));return t.index&&(r="Uint16Array"===t.index.type?new Uint16Array(t.index.array):new Uint32Array(t.index.array)),r=qs(s,r),{positions:s,indices:r,uvs:e,normals:i}}extractInterleavedAttribute(t,e,i,s){const r=Math.floor(t.length/e),n=new Float32Array(r*s);for(let o=0;o<r;o++)for(let r=0;r<s;r++)n[o*s+r]=t[o*e+i+r];return n}int32ArrayToFloat32(t){const e=new ArrayBuffer(4*t.length),i=new Int32Array(e);for(let e=0;e<t.length;e++)i[e]=t[e];return new Float32Array(e)}async resolveResourceUrl(t,e,i){return lr.resolveWith(this.options.resolver,t,e,i)}async fetchEffectDocument(t){const e=this.options.baseUrl||t.substring(0,t.lastIndexOf("/")+1),i=await this.resolveResourceUrl(t,"effect",e);return{json:await lr.fetchJsonWith(this.options.resolver,i,void 0),baseUrl:e}}async loadDocuments(t,e){const i=t.length;if(0===i)return[];const s=new Array(i),r=new Array(i).fill(!1);let n=0;const o=(t,o)=>{r[t]||(r[t]=!0,s[t]=o,n++,e.onProgress?.(n,i))};await Promise.all(t.map(async(s,r)=>{if(s)try{await this.resolveResources(s.json,s.baseUrl)}catch(s){if(!e.continueOnError)throw s;console.warn(`[QuarksLoader] Failed to resolve resources for effect ${r+1}/${i}:`,s),t[r]=null,o(r,null)}}));for(let s=0;s<i;s++){if(r[s])continue;const n=t[s];if(n)try{o(s,this.parse(n.json,n.baseUrl))}catch(t){if(!e.continueOnError)throw t;console.warn(`[QuarksLoader] Failed to parse effect ${s+1}/${i}:`,t),o(s,null)}else o(s,null)}return s}static async mapPool(t,e,i){if(0===t.length)return[];const s=void 0!==e&&e>0?e:t.length,r=new Array(t.length);let n=0;const o=Math.min(s,t.length);return await Promise.all(Array.from({length:o},()=>(async()=>{for(;n<t.length;){const e=n++;r[e]=await i(t[e],e)}})())),r}static async resolveWith(t,e,i,s){return t?.resolve?t.resolve(e,i,s):lr.joinUrl(s,e)}static fetchJsonWith(t,e,i){const s=async()=>{if(t?.fetchJson)return t.fetchJson(e);const i=await fetch(e);if(!i.ok)throw new Error(`HTTP ${i.status}`);return i.json()};if(!i)return s();const r=ar(or,i),n=`json|${e}`;let o=r.get(n);return void 0===o&&(o=s().catch(t=>{throw r.get(n)===o&&r.delete(n),t}),r.set(n,o)),o}static async inlineGeometryEntries(t,e){const i=Array.isArray(t?.geometries)?t.geometries:[];await Promise.all(i.filter(t=>"string"==typeof t?.url&&!t.positions).map(async t=>{try{const i=await e(t.url);for(const e of["positions","indices","uvs","normals"]){const s=i?.[e];void 0!==s&&(t[e]=Array.isArray(s)?s.slice():s)}delete t.url}catch(e){console.warn(`[QuarksLoader] Could not load geometry "${t.url}":`,e)}}))}parseImages(t,e,i){this._images={};for(const i of t)i.url&&lr.warnIfNotAnImageUrl(i.url),this._images[i.uuid]=i.url?lr.joinUrl(e,i.url):null}static warnIfNotAnImageUrl(t){/^(data|blob):/i.test(t)||/\.(png|jpe?g|webp|gif|bmp|ktx2?|dds|env|basis)(\?|#|$)/i.test(t)||console.warn(`[QuarksLoader] Image "${t}" does not look like an image; its texture will fail to load. This usually means the effect was exported without embedding that texture.`)}parseTextures(t,e){const i=this._images||{};for(const s of t){const t=i[s.image];if(t){const i=void 0===s.invertY||!!s.invertY,r=!!s.noMipmap,n=!1!==this.options.shareResources,o=n?[i,r,s.samplingMode,s.wrap,s.repeat,s.offset,s.rotation].join("|")+"|"+t:"",a=n?ar(rr,this.scene):void 0,l=a?.get(o);if(void 0!==l){e.textures[s.uuid]=l;continue}const h=new y.Texture(t,this.scene,{noMipmap:r,invertY:i,samplingMode:"number"==typeof s.samplingMode?s.samplingMode:void 0});Array.isArray(s.wrap)&&(h.wrapU=this.mapWrapMode(s.wrap[0]),h.wrapV=this.mapWrapMode(s.wrap[1]??s.wrap[0])),Array.isArray(s.repeat)&&(h.uScale=s.repeat[0]??1,h.vScale=s.repeat[1]??1),Array.isArray(s.offset)&&(h.uOffset=s.offset[0]??0,h.vOffset=s.offset[1]??0),"number"==typeof s.rotation&&(h.wAng=s.rotation),void 0!==a&&(a.set(o,h),h.onDisposeObservable.addOnce(()=>{a.get(o)===h&&a.delete(o)})),e.textures[s.uuid]=h}else e.textures[s.uuid]=null}}mapWrapMode(t){switch(t){case 1001:return y.Texture.CLAMP_ADDRESSMODE;case 1002:return y.Texture.MIRROR_ADDRESSMODE;default:return y.Texture.WRAP_ADDRESSMODE}}parseMaterials(t,e){for(const i of t){const t={uuid:i.uuid,transparent:i.transparent??!0,blending:i.blending??1,side:i.side??2,depthTest:i.depthTest??!0,depthWrite:i.depthWrite??!1,alphaTest:i.alphaTest??0,texture:null},s=i.map??i.texture;s&&(t.texture=e.textures[s]||null);const n=i.reflectionAtlas;if(n&&(t.reflectionAtlas=e.textures[n]||null),"number"==typeof i.reflectionLevel&&(t.reflectionLevel=i.reflectionLevel),"unlit"!==i.lighting&&"fixed"!==i.lighting&&"scene"!==i.lighting||(t.lighting=i.lighting),i.rim&&"object"==typeof i.rim&&(t.rim=i.rim),Array.isArray(i.uvScroll)&&(t.uvScroll=i.uvScroll),i.gradientMap&&(t.gradientMap=e.textures[i.gradientMap]||null),i.erosion&&"object"==typeof i.erosion&&(t.erosion={...i.erosion,mask:i.erosion.mask&&e.textures[i.erosion.mask]||null}),"number"==typeof i.alphaMode)t.alphaMode=i.alphaMode;else{const e={1:r.Constants.ALPHA_COMBINE,2:r.Constants.ALPHA_ADD,3:r.Constants.ALPHA_SUBTRACT,4:r.Constants.ALPHA_MULTIPLY};t.alphaMode=e[i.blending]||r.Constants.ALPHA_COMBINE}e.materials[i.uuid]=t}}getGeometry(t,e){if(e)return t.geometries[e]}getMaterial(t,e){if(!e)return;const i=Array.isArray(e)?e[0]:e;return t.materials[i]}createPlaceholderNode(t,e){const i=new s.TransformNode(e||t||"node",this.scene);return i.quarksOriginalType=t,i}createMeshNode(t,e){const i=new l.Mesh(t.name||t.type||"mesh",this.scene),s=this.getGeometry(e,t.geometry);if(s&&s.positions.length>0&&s.indices.length>0){const t=new h.VertexData;t.positions=s.positions,t.indices=s.indices,s.uvs&&s.uvs.length>0&&(t.uvs=s.uvs),s.normals&&s.normals.length>0&&(t.normals=s.normals),t.applyToMesh(i,!0)}const n=this.getMaterial(e,t.material);if(n){const t=new v.StandardMaterial(`quarks_loader_material_${n.uuid}`,this.scene);t.alphaMode=n.alphaMode??r.Constants.ALPHA_COMBINE,t.backFaceCulling=2!==n.side,t.alphaCutOff=n.alphaTest??0,t.disableDepthWrite=!n.depthWrite,n.texture&&(t.diffuseTexture=n.texture,t.opacityTexture=n.texture),i.material=t}return i}parseObject(t,e){let i;switch(t.type){case"QuarksPrefab":i=sr.fromJSON(t,this.scene);break;case"ParticleEmitter":if(t.ps){i=this.parseParticleSystem(t.ps,e).emitter;break}i=this.createPlaceholderNode(t.type,t.name);break;case"Mesh":case"SkinnedMesh":case"InstancedMesh":case"BatchedMesh":i=this.createMeshNode(t,e);break;case"Scene":case"Group":case"Object3D":case"PerspectiveCamera":case"OrthographicCamera":case"AmbientLight":case"DirectionalLight":case"PointLight":case"RectAreaLight":case"SpotLight":case"HemisphereLight":case"LightProbe":case"LOD":case"Line":case"LineSegments":case"LineLoop":case"PointCloud":case"Points":case"Sprite":case"Bone":i=this.createPlaceholderNode(t.type,t.name);break;default:i=new s.TransformNode(t.name||t.type||"node",this.scene)}if(t.uuid&&(i._quarksUUID=t.uuid),t.name&&(i.name=t.name),t.matrix){const e=a.Matrix.FromArray(t.matrix),s=new a.Vector3(1,1,1),r=a.Quaternion.Identity(),n=new a.Vector3(0,0,0);e.decompose(s,r,n),i.position.copyFrom(n),i.scaling.copyFrom(s),i.rotationQuaternion=r}else t.position&&i.position.set(t.position[0],t.position[1],t.position[2]),t.scale&&i.scaling.set(t.scale[0],t.scale[1],t.scale[2]),t.quaternion?i.rotationQuaternion=new a.Quaternion(t.quaternion[0],t.quaternion[1],t.quaternion[2],t.quaternion[3]):t.rotation&&i.rotation.set(t.rotation[0],t.rotation[1],t.rotation[2]);if(void 0!==t.visible&&i.setEnabled(t.visible),t.children)for(const s of t.children){this.parseObject(s,e).parent=i}return i}parseParticleSystem(t,e){const i=ir.fromJSON(t,e,{},this.scene);return i._meshSurfaceReferenceUUID="mesh_surface"===t?.shape?.type?t?.shape?.mesh:void 0,i}linkReferences(t){const e={},i=t=>{t._quarksUUID&&(e[t._quarksUUID]=t);for(const e of t.getChildren())e instanceof s.TransformNode&&i(e)};i(t);const r=i=>{if(i instanceof sr&&i.resolveReferences(t),i instanceof Fs){const t=i.system,s=t._meshSurfaceReferenceUUID;if(s&&"mesh_surface"===t.emitterShape.type){const i=e[s];i instanceof l.Mesh&&(t.emitterShape.mesh=i)}for(let s=0;s<t.behaviors.length;s++)if(t.behaviors[s]instanceof ge){const r=t.behaviors[s],n=r.subParticleSystem;if("string"!=typeof n)continue;const o=e[n];o instanceof Fs?(r.subParticleSystem=o,o.system.onlyUsedByOther=!0):(r.subParticleSystem=void 0,""!==n&&console.warn(`[QuarksLoader] Emitter "${i.name}" has a sub emitter targeting "${n}", `+(o?"which is not a particle emitter":"which is not in the effect")+"; that sub emitter is skipped."))}}for(const t of i.getChildren())t instanceof s.TransformNode&&r(t)};r(t)}}Di(),Ii(Ni),exports.ApplyCollision=Ot,exports.ApplyForce=ie,exports.ApplySequences=ne,exports.AxisAngleGenerator=Et,exports.BatchedParticleRenderer=Cs,exports.BatchedRenderer=Os,exports.BehaviorFromJSON=ri,exports.BehaviorTypes=si,exports.Bezier=At,exports.BoxEmitter=Si,exports.ChangeEmitDirection=oe,exports.CircleEmitter=Mi,exports.ColorBySpeed=ae,exports.ColorGeneratorFromJSON=Yt,exports.ColorOverLife=le,exports.ColorRange=Ut,exports.ConeEmitter=zi,exports.ConstantColor=jt,exports.ConstantValue=Ct,exports.DEG2RAD=P,exports.DonutEmitter=_i,exports.EdgeEmitter=Pi,exports.EffectPool=class{constructor(t,e){this.template=t,this.options=e,this.idle=[],this.playing=new Set,this.systemsOf=new Map,this.disposed=!1,this.onSystemFinished=t=>{const e=t.particleSystem;for(const t of this.playing){const i=this.systemsOf.get(t);if(void 0!==i&&i.includes(e))return void(As.isEffectFinished(t)&&this.release(t))}};for(let t=0;t<(e.prewarm??0);t++){const t=this.makeCopy();if(null===t)break;this.idle.push(t)}}get activeCount(){return this.playing.size}get idleCount(){return this.idle.length}acquire(t,e=null){if(this.disposed)return null;const i=this.idle.pop()??this.makeCopy();return null===i?null:(i.parent=e,void 0!==t&&i.position.copyFrom(t),i.setEnabled(!0),this.playing.add(i),As.restart(i),As.play(i),i)}stop(t){this.playing.has(t)&&As.endEmit(t)}release(t){this.playing.delete(t)&&(As.stop(t),t.setEnabled(!1),t.parent=null,this.disposed||this.idle.push(t))}dispose(){this.disposed=!0;for(const t of[...this.playing,...this.idle])this.playing.delete(t),this.disposeCopy(t);this.idle.length=0}makeCopy(){if(this.idle.length+this.playing.size>=(this.options.maxSize??1/0))return null;const t=As.instantiate(this.template),e=[];return As.runOnAllParticleEmitters(t,t=>{const i=t.system;i.autoDestroy=!1,i.addEventListener("finished",this.onSystemFinished),e.push(i)}),this.systemsOf.set(t,e),As.addToBatchRenderer(t,this.options.renderer),t.setEnabled(!1),t.parent=null,t}disposeCopy(t){const e=this.systemsOf.get(t)??[];for(const t of e)t.removeEventListener("finished",this.onSystemFinished),this.options.renderer.deleteSystem(t),t.dispose();this.systemsOf.delete(t),t.dispose()}},exports.EmitSubParticleSystem=ge,exports.EmitterFromJSON=Bi,exports.EmitterShapes=Ai,exports.Euler=ft,exports.EulerGenerator=Xt,exports.ForceOverLife=ve,exports.FrameOverLife=xe,exports.GeneratorFromJSON=ee,exports.Gradient=Jt,exports.GravityForce=Se,exports.GridEmitter=Ti,exports.HemisphereEmitter=Vi,exports.InheritVelocity=be,exports.IntervalValue=Ft,exports.LimitSpeedOverLife=we,exports.MathUtils=X,exports.Matrix3=pt,exports.Matrix4=st,exports.MeshSurfaceEmitter=Ei,exports.MeshSurfaceEmitterPlugin=Ni,exports.NodeParticle=class{constructor(){this.position=new H,this.velocity=new H,this.age=0,this.life=1,this.size=new H,this.rotation=0,this.color=new Mt(1,1,1,1),this.uvTile=0,this.memory=[]}get died(){return this.age>=this.life}reset(){this.memory.length=0,this.position.set(0,0,0),this.velocity.set(0,0,0),this.age=0,this.life=1,this.size.set(1,1,1),this.rotation=0,this.color.set(1,1,1,1),this.uvTile=0}},exports.Noise=Re,exports.OrbitOverLife=Le,exports.ParticleEmitter=Fs,exports.ParticleMeshPhysicsMaterial=Us,exports.ParticleMeshStandardMaterial=Ds,exports.ParticleStore=Me,exports.ParticleSystem=ir,exports.PiecewiseBezier=$t,exports.PiecewiseFunction=Bt,exports.Plugins=$i,exports.PointEmitter=Oi,exports.QuarksLoader=lr,exports.QuarksPrefab=sr,exports.QuarksUtil=As,exports.Quaternion=Z,exports.QuaternionView=gt,exports.RAD2DEG=T,exports.RandomColor=Qt,exports.RandomColorBetweenGradient=Wt,exports.RandomQuatGenerator=Zt,exports.RecordState=class{constructor(t,e,i){this.position=t,this.size=e,this.color=i}},exports.RectangleEmitter=Fi,exports.Rotation3DOverLife=De,exports.RotationBySpeed=Ue,exports.RotationGeneratorFromJSON=Ht,exports.RotationOverLife=qe,exports.SequencerFromJSON=re,exports.ShapeTransform=wi,exports.SizeBySpeed=ke,exports.SizeOverLife=Je,exports.SpeedOverLife=Qe,exports.SphereEmitter=Ci,exports.SpriteBatch=_s,exports.SpriteParticle=Ke,exports.SubEmitterInheritMask=me,exports.TextureSequencer=se,exports.TrailBatch=Vs,exports.TrailParticle=ei,exports.TurbulenceField=Ge,exports.VFXBatch=zs,exports.ValueGeneratorFromJSON=It,exports.Vector2=xt,exports.Vector3=H,exports.Vector3Function=Kt,exports.Vector3GeneratorFromJSON=te,exports.Vector3View=bt,exports.Vector4=Mt,exports.Vector4View=_t,exports.VelocityOverLife=Xe,exports.WebGLCoordinateSystem=et,exports.WebGPUCoordinateSystem=it,exports.WidthOverLength=ii,exports.cacheEnvAtlas=function(t,e){Bs.set(t,e)},exports.ceilPowerOfTwo=Q,exports.clamp=O,exports.createEnvAtlasFromFaceUrls=Ns,exports.createSeededRandom=M,exports.cubeFaceUrls=Is,exports.damp=$,exports.defaultMeshLighting=gs,exports.degToRad=q,exports.denormalize=j,exports.ensureEnvAtlasFromCube=Ls,exports.erosionEqual=bs,exports.euclideanModulo=C,exports.floorPowerOfTwo=G,exports.generateUUID=V,exports.getCachedEnvAtlas=Es,exports.getPhysicsResolver=Vt,exports.getRandomSource=b,exports.getRegisteredShaderChunks=function(){return Ri},exports.getShaderChunk=function(t){return Ri[t]},exports.getValueFromEmitterMode=bi,exports.inverseLerp=A,exports.isPowerOfTwo=J,exports.lerp=B,exports.loadPlugin=Ii,exports.localParticlePhysicsVertShader=Yi,exports.localParticleVertShader="\n// Per-vertex attributes\nattribute vec3 position;\nattribute vec2 uv;\n\n// Per-instance attributes\nattribute vec3 offset;\nattribute vec4 color;\nattribute vec3 size;\nattribute vec4 rotation;\nattribute float uvTile;\n\n// Uniforms\nuniform mat4 worldViewProjection;\n\n#ifdef UV_TILE\nuniform float tileCountX;\nuniform float tileCountY;\n#endif\n\n// Varyings\nvarying vec2 vUV;\nvarying vec4 vColor;\n\nvec3 applyQuaternion(vec3 v, vec4 q) {\n vec3 qVec = q.xyz;\n float qW = q.w;\n vec3 t = 2.0 * cross(qVec, v);\n return v + qW * t + cross(qVec, t);\n}\n\nvoid main() {\n vec3 rotatedPosition = applyQuaternion(position * size, rotation);\n vec3 worldPos = rotatedPosition + offset;\n\n gl_Position = worldViewProjection * vec4(worldPos, 1.0);\n\n #ifdef UV_TILE\n vec2 tc = vec2(tileCountX, tileCountY);\n float baseTile = floor(uvTile);\n float tileU = mod(baseTile, tc.x) / tc.x;\n float tileV = 1.0 - floor(baseTile / tc.x) / tc.y - 1.0 / tc.y;\n vUV = uv / tc + vec2(tileU, tileV);\n #else\n vUV = uv;\n #endif\n\n vColor = color;\n}\n",exports.mapLinear=F,exports.meshRimEqual=xs,exports.normalize=Y,exports.normalizeErosion=Ss,exports.normalizeMeshRim=vs,exports.normalizeUVScroll=ws,exports.particleFragShader=ts,exports.particlePhysicsFragShader=es,exports.particleVertShader=is,exports.pingpong=I,exports.planBehaviorFusion=gi,exports.radToDeg=k,exports.randFloat=L,exports.randFloatSpread=D,exports.randInt=R,exports.random=S,exports.registerShaderChunks=Di,exports.seededRandom=U,exports.setPhysicsResolver=function(t){Tt=t},exports.setQuaternionFromProperEuler=W,exports.setRandomSource=w,exports.smootherstep=N,exports.smoothstep=E,exports.stretchedBillboardVertShader=ss,exports.subEmitterInheritMask=ye,exports.trailFragShader=rs,exports.trailVertShader=ns,exports.unloadPlugin=function(t){const e=$i.find(e=>e.id===t);if(e){for(const t of e.emitterShapes)Ai[t.type]&&delete Ai[t.type];for(const t of e.behaviors)si[t.type]&&delete si[t.type]}},exports.uvScrollEqual=Ms,exports.withRandomSource=function(t,e){const i=w(t);try{return e()}finally{w(i)}};
2
2
  //# sourceMappingURL=babylon.quarks.cjs.map