babylon.quarks 0.26.0 → 0.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +769 -8
- package/README.md +10 -8
- package/dist/babylon.quarks.cjs +1 -1
- package/dist/babylon.quarks.cjs.map +1 -1
- package/dist/babylon.quarks.esm.js +1 -1
- package/dist/babylon.quarks.esm.js.map +1 -1
- package/dist/babylon.quarks.umd.min.js +1 -1
- package/dist/babylon.quarks.umd.min.js.map +1 -1
- package/dist/types/index.d.cts +6683 -0
- package/dist/types/index.d.ts +1959 -588
- package/package.json +12 -6
- package/src/BatchedRenderer.ts +204 -101
- package/src/EffectPool.ts +4 -1
- package/src/MeshSurfaceEmitter.ts +29 -4
- package/src/ParticleEmitter.ts +45 -15
- package/src/ParticleSystem.ts +909 -2061
- package/src/QuarksLoader.ts +421 -67
- package/src/QuarksPrefab.ts +91 -4
- package/src/QuarksSerializer.ts +484 -0
- package/src/QuarksUtil.ts +15 -0
- package/src/SpriteBatch.ts +106 -246
- package/src/TrailBatch.ts +533 -342
- package/src/VFXBatch.ts +236 -136
- package/src/batchKey.ts +237 -0
- package/src/effectResources.ts +79 -0
- package/src/envAtlas.ts +119 -17
- package/src/index.ts +32 -33
- package/src/nodeId.ts +13 -0
- package/src/shaderProgram.ts +325 -0
- package/src/shaderVariants.ts +225 -0
- package/src/shaders/chunks/fog.ts +4 -2
- package/src/shaders/chunks/sheet.ts +111 -0
- package/src/shaders/chunks/soft.ts +84 -0
- package/src/shaders/chunks/surface.ts +10 -0
- package/src/shaders/local_particle_physics_vert.glsl.ts +14 -28
- package/src/shaders/local_particle_physics_vert.wgsl.ts +16 -29
- package/src/shaders/particle_frag.glsl.ts +3 -22
- package/src/shaders/particle_frag.wgsl.ts +3 -23
- package/src/shaders/particle_physics_frag.glsl.ts +12 -25
- package/src/shaders/particle_physics_frag.wgsl.ts +12 -26
- package/src/shaders/particle_vert.glsl.ts +5 -27
- package/src/shaders/particle_vert.wgsl.ts +5 -26
- package/src/shaders/stretched_bb_particle_vert.glsl.ts +7 -33
- package/src/shaders/stretched_bb_particle_vert.wgsl.ts +7 -33
- package/src/shaders/trail_frag.glsl.ts +11 -1
- package/src/shaders/trail_frag.wgsl.ts +11 -0
- package/src/shaders/trail_vert.glsl.ts +45 -36
- package/src/shaders/trail_vert.wgsl.ts +46 -40
- package/src/softDepth.ts +136 -0
- package/src/system/BehaviorPlan.ts +85 -0
- package/src/system/BoundsTracker.ts +181 -0
- package/src/system/EmissionController.ts +360 -0
- package/src/system/EventDispatcher.ts +44 -0
- package/src/system/ParticleSpawner.ts +274 -0
- package/src/system/SimulationClock.ts +130 -0
- package/src/system/geometry.ts +111 -0
- package/src/system/integrate.ts +428 -0
- package/src/system/materialResolve.ts +116 -0
- package/src/system/normalize.ts +95 -0
- package/src/system/serialization.ts +401 -0
- package/src/system/settingsSchema.ts +317 -0
- package/src/system/types.ts +410 -0
- package/src/textureSource.ts +30 -0
- package/src/trailSettings.ts +51 -0
- package/src/BatchedParticleRenderer.ts +0 -3
- package/src/materials/ParticleMaterials.ts +0 -23
- package/src/materials/index.ts +0 -1
- package/src/shaders/chunks/index.ts +0 -1
- package/src/shaders/chunks/register-shader-chunks.ts +0 -32
- package/src/shaders/chunks/soft_fragment.glsl.ts +0 -13
- package/src/shaders/chunks/soft_pars_fragment.glsl.ts +0 -20
- package/src/shaders/chunks/soft_pars_vertex.glsl.ts +0 -6
- package/src/shaders/chunks/soft_vertex.glsl.ts +0 -6
- package/src/shaders/chunks/tile_fragment.glsl.ts +0 -9
- package/src/shaders/chunks/tile_pars_fragment.glsl.ts +0 -9
- package/src/shaders/chunks/tile_pars_vertex.glsl.ts +0 -28
- package/src/shaders/chunks/tile_vertex.glsl.ts +0 -18
- package/src/shaders/index.ts +0 -9
- package/src/shaders/local_particle_vert.glsl.ts +0 -50
package/dist/babylon.quarks.cjs
CHANGED
|
@@ -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"),n=require("@babylonjs/core/Engines/constants"),r=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"),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 V=Math.PI/180,T=180/Math.PI;function P(){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 A(t,e){return(t%e+e)%e}function C(t,e,i,s,n){return s+(t-e)*(n-s)/(i-e)}function F(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(A(t,2*e)-e)}function U(t,e,i){return t<=e?0:t>=i?1:(t=(t-e)/(i-e))*t*(3-2*t)}function E(t,e,i){return t<=e?0:t>=i?1:(t=(t-e)/(i-e))*t*t*(t*(6*t-15)+10)}function N(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 L(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*V}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,n){const r=Math.cos,o=Math.sin,a=r(i/2),h=o(i/2),l=r((e+s)/2),c=o((e+s)/2),u=r((e-s)/2),d=o((e-s)/2),f=r((s-e)/2),p=o((s-e)/2);switch(n){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*p,h*f,a*l);break;case"YXY":t.set(h*f,a*c,h*p,a*l);break;case"ZYZ":t.set(h*p,h*f,a*c,a*l);break;default:console.warn("../math.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: "+n)}}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:V,RAD2DEG:T,generateUUID:P,clamp:O,euclideanModulo:A,mapLinear:C,inverseLerp:F,lerp:B,damp:$,pingpong:I,smoothstep:U,smootherstep:E,randInt:N,randFloat:R,randFloatSpread:D,seededRandom:L,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,n,r,o){let a=i[s+0],h=i[s+1],l=i[s+2],c=i[s+3];const u=n[r+0],d=n[r+1],f=n[r+2],p=n[r+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]=f,void(t[e+3]=p);if(c!==p||a!==u||h!==d||l!==f){let t=1-o;const e=a*u+h*d+l*f+c*p,i=e>=0?1:-1,s=1-e*e;if(s>Number.EPSILON){const n=Math.sqrt(s),r=Math.atan2(n,e*i);t=Math.sin(t*r)/n,o=Math.sin(o*r)/n}const n=o*i;if(a=a*t+u*n,h=h*t+d*n,l=l*t+f*n,c=c*t+p*n,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,n,r){const o=i[s],a=i[s+1],h=i[s+2],l=i[s+3],c=n[r],u=n[r+1],d=n[r+2],f=n[r+3];return t[e]=o*f+l*c+a*d-h*u,t[e+1]=a*f+l*u+h*c-o*d,t[e+2]=h*f+l*d+o*u-a*c,t[e+3]=l*f-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,n=t._z,r=t._order,o=Math.cos,a=Math.sin,h=o(i/2),l=o(s/2),c=o(n/2),u=a(i/2),d=a(s/2),f=a(n/2);switch(r){case"XYZ":this._x=u*l*c+h*d*f,this._y=h*d*c-u*l*f,this._z=h*l*f+u*d*c,this._w=h*l*c-u*d*f;break;case"YXZ":this._x=u*l*c+h*d*f,this._y=h*d*c-u*l*f,this._z=h*l*f-u*d*c,this._w=h*l*c+u*d*f;break;case"ZXY":this._x=u*l*c-h*d*f,this._y=h*d*c+u*l*f,this._z=h*l*f+u*d*c,this._w=h*l*c-u*d*f;break;case"ZYX":this._x=u*l*c-h*d*f,this._y=h*d*c+u*l*f,this._z=h*l*f-u*d*c,this._w=h*l*c+u*d*f;break;case"YZX":this._x=u*l*c+h*d*f,this._y=h*d*c+u*l*f,this._z=h*l*f-u*d*c,this._w=h*l*c-u*d*f;break;case"XZY":this._x=u*l*c-h*d*f,this._y=h*d*c-u*l*f,this._z=h*l*f+u*d*c,this._w=h*l*c+u*d*f;break;default:console.warn("../math.Quaternion: .setFromEuler() encountered an unknown order: "+r)}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],n=e[8],r=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=(n-h)*t,this._z=(r-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+r)/t,this._z=(n+h)/t}else if(o>c){const t=2*Math.sqrt(1+o-i-c);this._w=(n-h)/t,this._x=(s+r)/t,this._y=.25*t,this._z=(a+l)/t}else{const t=2*Math.sqrt(1+c-i-o);this._w=(r-s)/t,this._x=(n+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,n=t._z,r=t._w,o=e._x,a=e._y,h=e._z,l=e._w;return this._x=i*l+r*o+s*h-n*a,this._y=s*l+r*a+n*o-i*h,this._z=n*l+r*h+i*a-s*o,this._w=r*l-i*o-s*a-n*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,n=this._z,r=this._w;let o=r*t._w+i*t._x+s*t._y+n*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=r,this._x=i,this._y=s,this._z=n,this;const a=1-o*o;if(a<=Number.EPSILON){const t=1-e;return this._w=t*r+e*this._w,this._x=t*i+e*this._x,this._y=t*s+e*this._y,this._z=t*n+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=r*c+this._w*u,this._x=i*c+this._x*u,this._y=s*c+this._y*u,this._z=n*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),n=Math.sqrt(i);return this.set(s*Math.sin(t),s*Math.cos(t),n*Math.sin(e),n*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,n=t.elements;return this.x=n[0]*e+n[3]*i+n[6]*s,this.y=n[1]*e+n[4]*i+n[7]*s,this.z=n[2]*e+n[5]*i+n[8]*s,this}applyNormalMatrix(t){return this.applyMatrix3(t).normalize()}applyMatrix4(t){const e=this.x,i=this.y,s=this.z,n=t.elements,r=1/(n[3]*e+n[7]*i+n[11]*s+n[15]);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}applyQuaternion(t){const e=this.x,i=this.y,s=this.z,n=t.x,r=t.y,o=t.z,a=t.w,h=2*(r*s-o*i),l=2*(o*e-n*s),c=2*(n*i-r*e);return this.x=e+a*h+r*c-o*l,this.y=i+a*l+o*h-n*c,this.z=s+a*c+n*l-r*h,this}transformDirection(t){const e=this.x,i=this.y,s=this.z,n=t.elements;return this.x=n[0]*e+n[4]*i+n[8]*s,this.y=n[1]*e+n[5]*i+n[9]*s,this.z=n[2]*e+n[6]*i+n[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,n=t.z,r=e.x,o=e.y,a=e.z;return this.x=s*a-n*o,this.y=n*r-i*a,this.z=i*o-s*r,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,n,r,o,a,h,l,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,n,r,o,a,h,l,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,n,r,o,a,h,l,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]=n,y[5]=r,y[9]=o,y[13]=a,y[2]=h,y[6]=l,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/nt.setFromMatrixColumn(t,0).length(),n=1/nt.setFromMatrixColumn(t,1).length(),r=1/nt.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]*n,e[5]=i[5]*n,e[6]=i[6]*n,e[7]=0,e[8]=i[8]*r,e[9]=i[9]*r,e[10]=i[10]*r,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,n=t.z,r=Math.cos(i),o=Math.sin(i),a=Math.cos(s),h=Math.sin(s),l=Math.cos(n),c=Math.sin(n);if("XYZ"===t.order){const t=r*l,i=r*c,s=o*l,n=o*c;e[0]=a*l,e[4]=-a*c,e[8]=h,e[1]=i+s*h,e[5]=t-n*h,e[9]=-o*a,e[2]=n-t*h,e[6]=s+i*h,e[10]=r*a}else if("YXZ"===t.order){const t=a*l,i=a*c,s=h*l,n=h*c;e[0]=t+n*o,e[4]=s*o-i,e[8]=r*h,e[1]=r*c,e[5]=r*l,e[9]=-o,e[2]=i*o-s,e[6]=n+t*o,e[10]=r*a}else if("ZXY"===t.order){const t=a*l,i=a*c,s=h*l,n=h*c;e[0]=t-n*o,e[4]=-r*c,e[8]=s+i*o,e[1]=i+s*o,e[5]=r*l,e[9]=n-t*o,e[2]=-r*h,e[6]=o,e[10]=r*a}else if("ZYX"===t.order){const t=r*l,i=r*c,s=o*l,n=o*c;e[0]=a*l,e[4]=s*h-i,e[8]=t*h+n,e[1]=a*c,e[5]=n*h+t,e[9]=i*h-s,e[2]=-h,e[6]=o*a,e[10]=r*a}else if("YZX"===t.order){const t=r*a,i=r*h,s=o*a,n=o*h;e[0]=a*l,e[4]=n-t*c,e[8]=s*c+i,e[1]=c,e[5]=r*l,e[9]=-o*l,e[2]=-h*l,e[6]=i*c+s,e[10]=t-n*c}else if("XZY"===t.order){const t=r*a,i=r*h,s=o*a,n=o*h;e[0]=a*l,e[4]=-c,e[8]=h*l,e[1]=t*c+n,e[5]=r*l,e[9]=i*c-s,e[2]=s*c-i,e[6]=o*l,e[10]=n*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,n=this.elements,r=i[0],o=i[4],a=i[8],h=i[12],l=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],V=s[5],T=s[9],P=s[13],O=s[2],A=s[6],C=s[10],F=s[14],B=s[3],$=s[7],I=s[11],U=s[15];return n[0]=r*b+o*_+a*O+h*B,n[4]=r*w+o*V+a*A+h*$,n[8]=r*M+o*T+a*C+h*I,n[12]=r*z+o*P+a*F+h*U,n[1]=l*b+c*_+u*O+d*B,n[5]=l*w+c*V+u*A+d*$,n[9]=l*M+c*T+u*C+d*I,n[13]=l*z+c*P+u*F+d*U,n[2]=f*b+p*_+m*O+y*B,n[6]=f*w+p*V+m*A+y*$,n[10]=f*M+p*T+m*C+y*I,n[14]=f*z+p*P+m*F+y*U,n[3]=g*b+v*_+x*O+S*B,n[7]=g*w+v*V+x*A+S*$,n[11]=g*M+v*T+x*C+S*I,n[15]=g*z+v*P+x*F+S*U,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],n=t[12],r=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]*(+n*a*c-s*h*c-n*o*u+i*h*u+s*o*d-i*a*d)+t[7]*(+e*a*d-e*h*u+n*r*u-s*r*d+s*h*l-n*a*l)+t[11]*(+e*h*c-e*o*d-n*r*c+i*r*d+n*o*l-i*h*l)+t[15]*(-s*o*l-e*a*c+e*o*u+s*r*c-i*r*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],n=t[3],r=t[4],o=t[5],a=t[6],h=t[7],l=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*h-p*u*h+p*a*d-o*m*d-c*a*y+o*u*y,v=f*u*h-l*m*h-f*a*d+r*m*d+l*a*y-r*u*y,x=l*p*h-f*c*h+f*o*d-r*p*d-l*o*y+r*c*y,S=f*c*a-l*p*a-f*o*u+r*p*u+l*o*m-r*c*m,b=e*g+i*v+s*x+n*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*n-c*m*n-p*s*d+i*m*d+c*s*y-i*u*y)*w,t[2]=(o*m*n-p*a*n+p*s*h-i*m*h-o*s*y+i*a*y)*w,t[3]=(c*a*n-o*u*n-c*s*h+i*u*h+o*s*d-i*a*d)*w,t[4]=v*w,t[5]=(l*m*n-f*u*n+f*s*d-e*m*d-l*s*y+e*u*y)*w,t[6]=(f*a*n-r*m*n-f*s*h+e*m*h+r*s*y-e*a*y)*w,t[7]=(r*u*n-l*a*n+l*s*h-e*u*h-r*s*d+e*a*d)*w,t[8]=x*w,t[9]=(f*c*n-l*p*n-f*i*d+e*p*d+l*i*y-e*c*y)*w,t[10]=(r*p*n-f*o*n+f*i*h-e*p*h-r*i*y+e*o*y)*w,t[11]=(l*o*n-r*c*n-l*i*h+e*c*h+r*i*d-e*o*d)*w,t[12]=S*w,t[13]=(l*p*s-f*c*s+f*i*u-e*p*u-l*i*m+e*c*m)*w,t[14]=(f*o*s-r*p*s-f*i*a+e*p*a+r*i*m-e*o*m)*w,t[15]=(r*c*s-l*o*s+l*i*a-e*c*a-r*i*u+e*o*u)*w,this}scale(t){const e=this.elements,i=t.x,s=t.y,n=t.z;return e[0]*=i,e[4]*=s,e[8]*=n,e[1]*=i,e[5]*=s,e[9]*=n,e[2]*=i,e[6]*=s,e[10]*=n,e[3]*=i,e[7]*=s,e[11]*=n,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),n=1-i,r=t.x,o=t.y,a=t.z,h=n*r,l=n*o;return this.set(h*r+i,h*o-s*a,h*a+s*o,0,h*o+s*a,l*o+i,l*a-s*r,0,h*a-s*o,l*a+s*r,n*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,n,r){return this.set(1,i,n,0,t,1,r,0,e,s,1,0,0,0,0,1),this}compose(t,e,i){const s=this.elements,n=e._x,r=e._y,o=e._z,a=e._w,h=n+n,l=r+r,c=o+o,u=n*h,d=n*l,f=n*c,p=r*l,m=r*c,y=o*c,g=a*h,v=a*l,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 n=nt.set(s[0],s[1],s[2]).length();const r=nt.set(s[4],s[5],s[6]).length(),o=nt.set(s[8],s[9],s[10]).length();this.determinant()<0&&(n=-n),t.x=s[12],t.y=s[13],t.z=s[14],rt.copy(this);const a=1/n,h=1/r,l=1/o;return rt.elements[0]*=a,rt.elements[1]*=a,rt.elements[2]*=a,rt.elements[4]*=h,rt.elements[5]*=h,rt.elements[6]*=h,rt.elements[8]*=l,rt.elements[9]*=l,rt.elements[10]*=l,e.setFromRotationMatrix(rt),i.x=n,i.y=r,i.z=o,this}makePerspective(t,e,i,s,n,r,o=2e3){const a=this.elements,h=2*n/(e-t),l=2*n/(i-s),c=(e+t)/(e-t),u=(i+s)/(i-s);let d,f;if(o===et)d=-(r+n)/(r-n),f=-2*r*n/(r-n);else{if(o!==it)throw new Error("Matrix4.makePerspective(): Invalid coordinate system: "+o);d=-r/(r-n),f=-r*n/(r-n)}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]=f,a[3]=0,a[7]=0,a[11]=-1,a[15]=0,this}makeOrthographic(t,e,i,s,n,r,o=2e3){const a=this.elements,h=1/(e-t),l=1/(i-s),c=1/(r-n),u=(e+t)*h,d=(i+s)*l;let f,p;if(o===et)f=(r+n)*c,p=-2*c;else{if(o!==it)throw new Error("../math.Matrix4.makeOrthographic(): Invalid coordinate system: "+o);f=n*c,p=-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]=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 nt=new H,rt=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 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,n=s[0],r=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(-r,n)):(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,n),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(-r,h)):(this._y=0,this._z=Math.atan2(a,n));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,n)):(this._x=0,this._z=Math.atan2(-r,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,n)):(this._x=0,this._y=Math.atan2(o,d));break;case"XZY":this._z=Math.asin(-O(r,-1,1)),Math.abs(r)<.9999999?(this._x=Math.atan2(u,h),this._y=Math.atan2(o,n)):(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}}ft.DEFAULT_ORDER="XYZ",ft.prototype.isEuler=!0;class pt{constructor(t,e,i,s,n,r,o,a,h){this.elements=[1,0,0,0,1,0,0,0,1],void 0!==t&&this.set(t,e,i,s,n,r,o,a,h)}set(t,e,i,s,n,r,o,a,h){const l=this.elements;return l[0]=t,l[1]=s,l[2]=o,l[3]=e,l[4]=n,l[5]=a,l[6]=i,l[7]=r,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,n=this.elements,r=i[0],o=i[3],a=i[6],h=i[1],l=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 n[0]=r*p+o*g+a*S,n[3]=r*m+o*v+a*b,n[6]=r*y+o*x+a*w,n[1]=h*p+l*g+c*S,n[4]=h*m+l*v+c*b,n[7]=h*y+l*x+c*w,n[2]=u*p+d*g+f*S,n[5]=u*m+d*v+f*b,n[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],n=t[3],r=t[4],o=t[5],a=t[6],h=t[7],l=t[8];return e*r*l-e*o*h-i*n*l+i*o*a+s*n*h-s*r*a}invert(){const t=this.elements,e=t[0],i=t[1],s=t[2],n=t[3],r=t[4],o=t[5],a=t[6],h=t[7],l=t[8],c=l*r-o*h,u=o*a-l*n,d=h*n-r*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*h-l*i)*p,t[2]=(o*i-s*r)*p,t[3]=u*p,t[4]=(l*e-s*a)*p,t[5]=(s*n-o*e)*p,t[6]=d*p,t[7]=(i*a-h*e)*p,t[8]=(r*e-i*n)*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,n,r,o){const a=Math.cos(n),h=Math.sin(n);return this.set(i*a,i*h,-i*(a*r+h*o)+r+t,-s*h,s*a,-s*(-h*r+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),n=this.x-t.x,r=this.y-t.y;return this.x=n*i-r*s+t.x,this.y=n*s+r*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,n=this.w,r=t.elements;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.w=r[3]*e+r[7]*i+r[11]*s+r[15]*n,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,n;const r=.01,o=.1,a=t.elements,h=a[0],l=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(l-u)<r&&Math.abs(c-p)<r&&Math.abs(f-m)<r){if(Math.abs(l+u)<o&&Math.abs(c+p)<o&&Math.abs(f+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,g=(y+1)/2,v=(l+u)/4,x=(c+p)/4,S=(f+m)/4;return t>a&&t>g?t<r?(i=0,s=.707106781,n=.707106781):(i=Math.sqrt(t),s=v/i,n=x/i):a>g?a<r?(i=.707106781,s=0,n=.707106781):(s=Math.sqrt(a),i=v/s,n=S/s):g<r?(i=.707106781,s=.707106781,n=0):(n=Math.sqrt(g),i=x/n,s=S/n),this.set(i,s,n,e),this}let g=Math.sqrt((m-f)*(m-f)+(c-p)*(c-p)+(u-l)*(u-l));return Math.abs(g)<.001&&(g=1),this.x=(m-f)/g,this.y=(c-p)/g,this.z=(u-l)/g,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}}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 Vt=_t.prototype;let Tt;function Pt(){return Tt}Vt.data=zt,Vt.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(Pt(),t.bounce)}clone(){return new Ot(this.resolver,this.bounce)}reset(){}}class At{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 At(t.value)}clone(){return new At(this.value)}}class Ct{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 Ct(t.a,t.b)}clone(){return new Ct(this.a,this.b)}}class Ft{constructor(t,e,i,s){this.p=[t,e,i,s]}genValue(t){const e=this.p,i=t*t,s=1-t,n=s*s;return e[0]*n*s+e[1]*n*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 n=s*(i[e+1]-i[e]);t.push(n)}e.push(t),i=t}return e}getSlope(t){const e=this.derivativeCoefficients(this.p)[0],i=1-t,s=i*t*2,n=t*t;return i*i*e[0]+s*e[1]+n*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=[],n=0,r=0,o=0;const a=[];for(a[n++]=i[0],a[n++]=i[1],a[n++]=i[2],a[n++]=i[3];i.length>1;){for(s=[],r=0,o=i.length-1;r<o;r++)e=t*i[r]+(1-t)*i[r+1],a[n++]=e,s.push(e);i=s}return a}split(t){const e=this.hull(t);return{left:new Ft(e[0],e[4],e[7],e[9]),right:new Ft(e[9],e[8],e[6],e[3]),span:e}}clone(){return new Ft(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 Ft(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,n=i;for(;s+1<n;){const i=s+n>>1;if(t<e[i][1])n=i-1;else{if(!(t>this.getEndX(i)))return i;s=i+1}}for(let i=s;i<=n;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 Ft(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,n=null===s||s.length!==i;n&&(s=new Float64Array(i));for(let i=0,r=0;i<e;i++,r+=5){const e=t[i][0].p,o=t[i][1];n||(n=s[r]!==e[0]||s[r+1]!==e[1]||s[r+2]!==e[2]||s[r+3]!==e[3]||s[r+4]!==o),n&&(s[r]=e[0],s[r+1]=e[1],s[r+2]=e[2],s[r+3]=e[3],s[r+4]=o)}if(!n&&null!==this.table)return;this.tableSignature=s;const r=$t.TABLE_SIZE,o=null!==this.table&&this.table.length===r?this.table:new Float32Array(r),a=1/(r-1);for(let t=0;t<r;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,n=0|s,r=s-n,o=i[n];return o+(i[n+1]-o)*r}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 n=e[s][1],r=(s+1<i?e[s+1][1]:1)-n;return e[s][0].genValue(r>0?(t-n)/r: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=>[Ft.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 At.fromJSON(t);case"IntervalValue":return Ct.fromJSON(t);case"PiecewiseBezier":return $t.fromJSON(t);default:return new At(0)}}$t.TABLE_SIZE=257;class Ut{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 Ut(new H(t.axis.x,t.axis.y,t.axis.z),It(t.angle))}clone(){return new Ut(this.axis.clone(),this.angle.clone())}}const Et=t=>({r:t.x,g:t.y,b:t.z,a:t.w}),Nt=t=>new Mt(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 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 Lt{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:Et(this.a),b:Et(this.b)}}static fromJSON(t){return new Lt(Nt(t.a),Nt(t.b))}clone(){return new Lt(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,n=i;for(;s+1<n;){const i=s+n>>1;if(t<e[i][1])n=i-1;else{if(!(t>this.getEndX(i)))return i;s=i+1}}for(let i=s;i<=n;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),n=i.length-1;if("Number"===this.subType){if(-1===s)return i[0][0];if(s>=n)return i[n][0];const t=i[s][1],r=i[s][0],o=i[s+1][1]-t;return(i[s+1][0]-r)*(o>0?(e-t)/o:0)+r}{if(-1===s)return t.copy(i[0][0]);if(s>=n)return t.copy(i[n][0]);const r=i[s][1],o=i[s+1][1]-r;return t.copy(i[s][0]).lerp(i[s+1][0],o>0?(e-r)/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 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,n=null===s||s.length!==i;n&&(s=new Float64Array(i));let r=0;for(let e=0;e<t.length;e++,r+=4){const i=t[e][0],o=t[e][1];n||(n=s[r]!==i.x||s[r+1]!==i.y||s[r+2]!==i.z||s[r+3]!==o),n&&(s[r]=i.x,s[r+1]=i.y,s[r+2]=i.z,s[r+3]=o)}for(let t=0;t<e.length;t++,r+=2){const i=e[t][0],o=e[t][1];n||(n=s[r]!==i||s[r+1]!==o),n&&(s[r]=i,s[r+1]=o)}if(!n&&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 n=i*t,r=0|n,o=n-r,a=4*r,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,n=this.color.findKey(e);let r,o,a;if(-1===n||n>=s){const t=i[-1===n?0:s][0];r=t.x,o=t.y,a=t.z}else{const t=i[n][0],s=i[n+1][0],h=i[n][1],l=i[n+1][1]-h,c=l>0?(e-h)/l:0;r=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=r,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=>[Lt.fromJSON(t.function).a,t.start]);return t.functions.length>0&&e.push([Lt.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:Et(this.a),b:Et(this.b)}}static fromJSON(t){return new Qt(Nt(t.a),Nt(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:Et(this.color)}}static fromJSON(t){return new jt(Nt(t.color))}clone(){return new jt(this.color.clone())}}function Yt(t){switch(t.type){case"ConstantColor":return jt.fromJSON(t);case"ColorRange":return Lt.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,n,r,o;this.indexCount=t.length;do{e=2*S()-1,i=2*S()-1,s=e*e+i*i}while(s>1);do{n=2*S()-1,r=2*S()-1,o=n*n+r*r}while(o>1);const a=Math.sqrt((1-s)/o);t.push(e,i,a*n,a*r)}genValue(t,e,i,s){-1===this.indexCount&&this.startGen(t);const n=this.indexCount;return e.set(t[n],t[n+1],t[n+2],t[n+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 Ut.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 At(0),new At(0),new At(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 At(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,n=t.velocity;n.x+=s.x*i,n.y+=s.y*i,n.z+=s.z*i}updateAll(t,e,i){const s=this.magnitudeValue*i,n=this.direction.x*s,r=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+=n,s.y+=r,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 n=s.getImageData(0,0,i.width,i.height,{colorSpace:"srgb"});i.remove(),this.locations.length=0;for(let t=0;t<n.height;t++)for(let i=0;i<n.width;i++)n.data[4*(t*n.width+i)+3]>e&&this.locations.push(new xt(i,n.height-t))}}function ne(t){return"TextureSequencer"===t.type?se.fromJSON(t):new se}class re{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,re.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 re(t.delay);return t.sequencers.forEach(t=>{e.sequencers.push([It(t.range),ne(t.sequencer)])}),e}clone(){const t=new re(this.delay);return t.sequencers=this.sequencers.map(t=>[t[0].clone(),t[1].clone()]),t}}re.BEZIER=new Ft(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),Ct.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 n=e.color,r=e.startColor;s.genColor(e.memory,n,e.age/e.life),n.x*=r.x,n.y*=r.y,n.z*=r.z,n.w*=r.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),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,n=1,r=[]){this.particleSystem=t,this.useVelocityAsBasis=e,this.subParticleSystem=i,this.mode=s,this.emitProbability=n,this.inherit=r,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 n=this._temp,r=this.x,o=this.y,a=this.z,h=s.worldSpace,l=h?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;n.set(r.genValue(s,c),o.genValue(s,c),a.genValue(s,c)),h||n.multiply(this._tempScale).applyQuaternion(this._tempQ),e.velocity.addScaledVector(n,l)}}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.salt=new Ct(0,1),this.frame=t,this.fps=e.fps??0,this.cycles=e.cycles??1,this.frameCount=e.frameCount??0,this.loop=e.loop??!0,this.random=e.random??!1,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),this.salt.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),n=this.frameCount;let r=Math.floor(e*this.fps)+this.offset(t);return this.random&&n>0?s+Math.floor(xe.hash(r,this.saltOf(t))*n):(n>0&&(r=this.loop?xe.wrap(r,n):Math.min(r,n-1)),s+r)}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}saltOf(t){const e=t.memory[this.salt.indexCount];return"number"==typeof e?e:0}static hash(t,e){const i=43758.5453*Math.sin(12.9898*t+7833.233*e);return Math.min(i-Math.floor(i),.999999)}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},...this.random?{random:!0}:{},...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,random:!0===t.random,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,random:this.random,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,n=this.center.y,r=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=n-a.y,c=r-a.z,u=h*h+l*l+c*c;if(0===u)continue;const d=o/(u*Math.sqrt(u)),f=e.velocity;f.x+=h*d,f.y+=l*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 At(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 At(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 n=(i-s)/i;t.velocity.multiplyScalar(1-n*this.dampen*e*20)}}updateAll(t,e,i){const s=this.speed,n=this.dampen*i*20,r=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(),h=s.genValue(e.memory,e.age/e.life)*r;a>h&&o.multiplyScalar(1-(a-h)/a*n)}}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 n=new Uint8Array(e);return n.set(this.flip),this.flip=n,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,n=this.memory,r=e>0?n.length/e:0;for(let i=0,o=0,a=0;i<r;i++,o+=e,a+=s)for(let i=0;i<e;i++)t[a+i]=n[o+i];this.memory=t,this.memoryStride=s}const n=t*s;for(let t=0;t<s;t++){const s=t<i?e[t]:void 0;this.memory[n+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 n=4*t,r=4*e;Me.swap4(this.color,n,r),this.previousColor!==this.color&&Me.swap4(this.previousColor,n,r),Me.swap4(this.startColor,n,r),this.rotationQuaternion.length>0&&(Me.swap4(this.rotationQuaternion,n,r),Me.swap4(this.angularVelocityQuaternion,n,r)),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,n=t*o,r=e*o;s<o;s++,n++,r++){const t=i[n];i[n]=i[r],i[r]=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,Ve=1/3,Te=1/6,Pe=(Math.sqrt(5)-1)/4,Oe=(5-Math.sqrt(5))/20,Ae=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]),Ce=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 Fe{constructor(t=e){const e="function"==typeof t?t:function(t){let e=0,i=0,s=0,n=1;const r=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=r(" "),i=r(" "),s=r(" "),e-=r(t),e<0&&(e+=1);i-=r(t),i<0&&(i+=1);s-=r(t),s<0&&(s+=1);return function(){const t=2091639*e+2.3283064365386963e-10*n;return e=i,i=s,s=t-(n=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)),n=e[i];e[i]=e[s],e[s]=n}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 n=0,r=0,o=0;const a=(t+e)*ze,h=Math.floor(t+a),l=Math.floor(e+a),c=(h+l)*_e,u=t-(h-c),d=e-(l-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&h,S=255&l;let b=.5-u*u-d*d;if(b>=0){const t=3*i[x+s[S]];b*=b,n=b*b*(Ae[t]*u+Ae[t+1]*d)}let w=.5-m*m-y*y;if(w>=0){const t=3*i[x+f+s[S+p]];w*=w,r=w*w*(Ae[t]*m+Ae[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*(Ae[t]*g+Ae[t+1]*v)}return 70*(n+r+o)}noise3D(t,e,i){const s=this.permMod12,n=this.perm;let r,o,a,h;const l=(t+e+i)*Ve,c=Math.floor(t+l),u=Math.floor(e+l),d=Math.floor(i+l),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,V=p-S+2*Te,T=m-b+2*Te,P=y-w+2*Te,O=p-1+.5,A=m-1+.5,C=y-1+.5,F=255&c,B=255&u,$=255&d;let I=.6-p*p-m*m-y*y;if(I<0)r=0;else{const t=3*s[F+n[B+n[$]]];I*=I,r=I*I*(Ae[t]*p+Ae[t+1]*m+Ae[t+2]*y)}let U=.6-M*M-z*z-_*_;if(U<0)o=0;else{const t=3*s[F+g+n[B+v+n[$+x]]];U*=U,o=U*U*(Ae[t]*M+Ae[t+1]*z+Ae[t+2]*_)}let E=.6-V*V-T*T-P*P;if(E<0)a=0;else{const t=3*s[F+S+n[B+b+n[$+w]]];E*=E,a=E*E*(Ae[t]*V+Ae[t+1]*T+Ae[t+2]*P)}let N=.6-O*O-A*A-C*C;if(N<0)h=0;else{const t=3*s[F+1+n[B+1+n[$+1]]];N*=N,h=N*N*(Ae[t]*O+Ae[t+1]*A+Ae[t+2]*C)}return 32*(r+o+a+h)}noise4D(t,e,i,s){const n=this.perm;let r,o,a,h,l;const c=(t+e+i+s)*Pe,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,V=w>=3?1:0,T=M>=3?1:0,P=S>=2?1:0,O=b>=2?1:0,A=w>=2?1:0,C=M>=2?1:0,F=S>=1?1:0,B=b>=1?1:0,$=w>=1?1:0,I=M>=1?1:0,U=y-z+Oe,E=g-_+Oe,N=v-V+Oe,R=x-T+Oe,D=y-P+2*Oe,L=g-O+2*Oe,q=v-A+2*Oe,k=x-C+2*Oe,J=y-F+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)r=0;else{const t=n[H+n[K+n[tt+n[et]]]]%32*4;it*=it,r=it*it*(Ce[t]*y+Ce[t+1]*g+Ce[t+2]*v+Ce[t+3]*x)}let st=.6-U*U-E*E-N*N-R*R;if(st<0)o=0;else{const t=n[H+z+n[K+_+n[tt+V+n[et+T]]]]%32*4;st*=st,o=st*st*(Ce[t]*U+Ce[t+1]*E+Ce[t+2]*N+Ce[t+3]*R)}let nt=.6-D*D-L*L-q*q-k*k;if(nt<0)a=0;else{const t=n[H+P+n[K+O+n[tt+A+n[et+C]]]]%32*4;nt*=nt,a=nt*nt*(Ce[t]*D+Ce[t+1]*L+Ce[t+2]*q+Ce[t+3]*k)}let rt=.6-J*J-Q*Q-G*G-W*W;if(rt<0)h=0;else{const t=n[H+F+n[K+B+n[tt+$+n[et+I]]]]%32*4;rt*=rt,h=rt*rt*(Ce[t]*J+Ce[t+1]*Q+Ce[t+2]*G+Ce[t+3]*W)}let ot=.6-j*j-Y*Y-X*X-Z*Z;if(ot<0)l=0;else{const t=n[H+1+n[K+1+n[tt+1+n[et+1]]]]%32*4;ot*=ot,l=ot*ot*(Ce[t]*j+Ce[t+1]*Y+Ce[t+2]*X+Ce[t+3]*Z)}return 27*(r+o+a+h+l)}}const Be=100,$e=new Array(Be),Ie=new H,Ue=new Z;function Ee(t){let e=$e[t];return void 0===e&&(e=new Fe(t),$e[t]=e),e}class Ne{constructor(t,e,i=new At(1),s=new At(0),n=new At(0),r){this.frequency=t,this.power=e,this.positionAmount=i,this.rotationAmount=s,this.scrollSpeed=n,this.remap=r,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),n=this.remap;return void 0===n?s:n.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:Ee(le(0,Be)),generatorY:Ee(le(0,Be)),generatorZ:Ee(le(0,Be)),generatorW:Ee(le(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=Ee(le(0,Be)),i.generatorY=Ee(le(0,Be)),i.generatorZ=Ee(le(0,Be)),i.generatorW=Ee(le(0,Be))}static constantOf(t){return t instanceof At?t.value:NaN}update(t,e){const i=t._noiseState;if(void 0===i)return;const s=t.memory,n=t.age/t.life,r=this._frequency,o=r==r?r:this.frequency.genValue(s,n),a=this._power,h=a==a?a:this.power.genValue(s,n),l=this._positionAmount,c=l==l?l:this.positionAmount.genValue(s,n),u=this._rotationAmount,d=u==u?u:this.rotationAmount.genValue(s,n),f=t.age*o+this.scrollOffset;if(c>0){const e=h*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=h*d;if("number"==typeof t.rotation){const n=this.sample(i.generatorW,f,s)*Math.PI*e;t.rotation=t.rotation-i.lastRot+n,i.lastRot=n}else if(null!==i.lastRotQ){const n=t.rotation;i.lastRotQ.invert(),n.multiply(i.lastRotQ),Ue.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(),n.multiply(Ue),i.lastRotQ.copy(Ue)}}}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 n=s.position,r=s.rotation,o=s.scalars,a=Me.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 f=t[i],p=f._noiseState;if(void 0===p)continue;const m=f.memory,y=e/a,g=h==h?h:this.frequency.genValue(m,y),v=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),b=e*g+this.scrollOffset;if(x>0){const t=v*x,e=p.lastPos,i=this.sample(p.generatorX,b,m)*t,r=this.sample(p.generatorY,b,m)*t,o=this.sample(p.generatorZ,b,m)*t;n[s]=Math.fround(n[s]-e.x)+i,n[s+1]=Math.fround(n[s+1]-e.y)+r,n[s+2]=Math.fround(n[s+2]-e.z)+o,e.set(i,r,o)}if(S>0){const t=v*S;if("number"==typeof f.rotation){const e=this.sample(p.generatorW,b,m)*Math.PI*t;r[i]=r[i]-p.lastRot+e,p.lastRot=e}else if(null!==p.lastRotQ){const e=f.rotation;p.lastRotQ.invert(),e.multiply(p.lastRotQ),Ue.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(Ue),p.lastRotQ.copy(Ue)}}}}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=Ne.constantOf(this.frequency),this._power=Ne.constantOf(this.power),this._positionAmount=Ne.constantOf(this.positionAmount),this._rotationAmount=Ne.constantOf(this.rotationAmount)}static fromJSON(t){return new Ne(It(t.frequency),It(t.power),It(t.positionAmount),It(t.rotationAmount),t.scrollSpeed?It(t.scrollSpeed):new At(0),t.remap?It(t.remap):void 0)}clone(){return new Ne(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,n=this.axis,r=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;r.copy(h).projectOnVector(n),o.setFromAxisAngle(n,s.genValue(e.memory,e.age/e.life)*i),h.sub(r),h.applyQuaternion(o),h.add(r)}}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 Le{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 Le(It(t.angularVelocity),Ct.fromJSON(t.speedRange))}frameUpdate(t){}clone(){return new Le(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 n=0;n<e;n++){const e=t[n];if(e.age>=e.life)continue;const r=e.rotation;if("number"==typeof r){const t=s.genValue(e.memory,e.age/e.life);e.rotation=r+i*t,e.angularVelocity=t}else if(r instanceof Z){const t=s.genValue(e.memory,e.age/e.life);this.turnAboutZ(e,r,t*i)}}}turnAboutZ(t,e,i){const s=this.tempQuat.setFromAxisAngle(fe,i);e.multiply(s);const n=t.angularVelocity;n instanceof Z&&n.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),Ct.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,n=t.startSize;s.x=n.x*i,s.y=n.y*i,s.z=n.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 n=s.genValue(e.memory,e.age/e.life),r=e.size,o=e.startSize;r.x=o.x*n,r.y=o.y*n,r.z=o.z*n}}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 Fe(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,n=t.position.z/this.scale.z;this.temp.set(0,0,0);let r=1;for(let t=0;t<this.octaves;t++)this.temp2.set(this.generator.noise4D(i*r,s*r,n*r,this.timeOffset.x*r)/r,this.generator.noise4D(i*r,s*r,n*r,this.timeOffset.y*r)/r,this.generator.noise4D(i*r,s*r,n*r,this.timeOffset.z*r)/r),this.temp.add(this.temp2),r*=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 n=s.position,r=s.velocity,o=s.scalars,a=Me.SCALAR_STRIDE,h=this.generator,l=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=n[i]*c,e=n[i+1]*u,a=n[i+2]*d;let x=0,S=0,b=0,w=1;for(let i=0;i<l;i++){const i=t*w,s=e*w,n=a*w;x+=h.noise4D(i,s,n,y*w)/w,S+=h.noise4D(i,s,n,g*w)/w,b+=h.noise4D(i,s,n,v*w)/w,w*=2}r[i]+=x*f,r[i+1]+=S*p,r[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 At(0),e=new At(0),i=new At(0),s=new At(0),n=new At(0),r=new At(0),o="local",a=new At(0),h=new H){this.linearX=t,this.linearY=e,this.linearZ=i,this.orbitalX=s,this.orbitalY=n,this.orbitalZ=r,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 n=this.radial.genValue(t.memory,i);if(0!==n){this._temp.copy(t.position).sub(this._center);const i=this._temp.length();i>0&&t.position.addScaledVector(this._temp,n*e/i)}const r=this.orbitalX.genValue(t.memory,i)*e,o=this.orbitalY.genValue(t.memory,i)*e,a=this.orbitalZ.genValue(t.memory,i)*e;0===r&&0===o&&0===a||(t.position.sub(this._center),this.orbit(t.position,this._axisX,r),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 At(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.historySides=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.historySides.length>0&&(this.historySides=new Float32Array(3*t)),this.historyHead=0,this.historyCount=0)}ensureSideHistory(){this.historySides.length!==3*this.historyCapacity&&(this.historySides=new Float32Array(3*this.historyCapacity))}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 n=this.historyHead,r=3*n,o=this.historyPositions,a=e.position,h=3*i;o[r]=a[h],o[r+1]=a[h+1],o[r+2]=a[h+2];const l=e.size[h];this.historyBaseSizes[n]=l,this.historySizes[n]=l*this.headWidthScale;const c=4*n,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=(n+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,n=t.historySizes,r=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);n[h]=a?l:r[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:Ne,params:[["frequency",["value"]],["power",["value"]],["positionAmount",["value"]],["rotationAmount",["value"]]],loadJSON:Ne.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:Le,params:[["angularVelocity",["value","valueFunc"]],["speedRange",["range"]]],loadJSON:Le.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: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:re,params:[["delay",["number"]]],loadJSON:re.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 ni(t,e){return si[t.type]?si[t.type].loadJSON(t,e):null}const ri={PiecewiseBezier:$t,Vector3Function:Kt,Quaternion:Z,ConstantValue:At,Gradient:Jt,Vector4View:_t,AxisAngleGenerator:Ut,IntervalValue:Ct,ColorRange:Lt};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,n,r,o){return`{\n const cx = 2 * (${n} * ${i} - ${r} * ${e});\n const cy = 2 * (${r} * ${t} - ${s} * ${i});\n const cz = 2 * (${s} * ${e} - ${n} * ${t});\n const nx = ${t} + ${o} * cx + ${n} * cz - ${r} * cy;\n const ny = ${e} + ${o} * cy + ${r} * cx - ${s} * cz;\n ${i} = ${i} + ${o} * cz + ${s} * cy - ${n} * 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: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`)}\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 ${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) ${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 n=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}};`)(ri)}catch(t){return}}(t,e);return mi.set(i,n??null),n}function gi(t){const e=[];let i=[],s=[],n=[],r=0;const o=()=>{if(0===s.length)return;const t=`${r}:${i.map(t=>t.type).join(",")}`,o=yi(s,n,t);if(void 0!==o)e.push({behaviors:i,run:o});else for(const t of i)e.push({behaviors:[t]});i=[],s=[],n=[]};for(let a=0;a<t.length;a++){const h=t[a],l=pi(h,a);null!==l?(0===s.length&&(r=a),i.push(h),s.push(l),n.push(a)):(o(),e.push({behaviors:[h]}))}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 n;switch(exports.EmitterMode.Random===t?e=S():exports.EmitterMode.Burst===t&&s.isBursting&&(e=s.burstParticleIndex/s.burstParticleCount),n=i>0?Math.floor(e/i)*i:e,t){case exports.EmitterMode.Loop:n%=1;break;case exports.EmitterMode.PingPong:n=Math.abs(n%2-1)}return n}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 At(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()),n=i*this.arc;t.position.x=Math.cos(n),t.position.y=Math.sin(n),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 At(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()),n=i*this.arc,r=Math.sqrt(s),o=Math.sin(n),a=Math.cos(n);t.position.x=r*a,t.position.y=r*o,t.position.z=0;const h=this.angle*r;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(),...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 At(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(),n=X.lerp(1-this.thickness,1,S()),r=i*this.arc,o=s*Math.PI*2,a=Math.sin(r),h=Math.cos(r);if(t.position.x=this.radius*h,t.position.y=this.radius*a,t.position.z=0,t.velocity.z=this.donutRadius*n*Math.sin(o),t.velocity.x=this.donutRadius*n*Math.cos(o)*h,t.velocity.y=this.donutRadius*n*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 Vi{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 At(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 Vi({radius:t.radius,mode:t.mode,speed:t.speed?It(t.speed):void 0,spread:t.spread})}clone(){return new Vi({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 Pi{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 At(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(),n=X.lerp(1-this.thickness,1,S()),r=i*this.arc,o=Math.acos(s),a=Math.sin(r),h=Math.cos(r),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*n),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 Pi({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 Pi({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,n=Math.acos(2*i-1),r=Math.cbrt(S()),o=Math.sin(s),a=Math.cos(s),h=Math.sin(n),l=Math.cos(n);if(t.velocity.x=r*h*a,t.velocity.y=r*h*o,t.velocity.z=r*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",...wi.toShapeJSON(this.transform)}}static fromJSON(t){return new Oi(wi.fromJSON(t?.transform))}clone(){return new Oi(this.transform?.clone())}}class Ai{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 At(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(),n=X.lerp(1-this.thickness,1,S()),r=i*this.arc,o=Math.acos(2*s-1),a=Math.sin(r),h=Math.cos(r),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*n),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 Ai({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 Ai({radius:this.radius,arc:this.arc,thickness:this.thickness,mode:this.mode,speed:this.speed.clone(),transform:this.transform?.clone(),spread:this.spread})}}class Ci{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 At(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 n,r;s<this.width?(n=s-this.width/2,r=-this.height/2):s<this.width+this.height?(n=this.width/2,r=s-this.width-this.height/2):s<2*this.width+this.height?(n=this.width/2-(s-this.width-this.height),r=this.height/2):(n=-this.width/2,r=this.height/2-(s-2*this.width-this.height));const o=S(),a=1-this.thickness*o;if(t.position.x=n*a,t.position.y=r*a,t.position.z=0,t.velocity.x=n,t.velocity.y=r,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 Ci({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 Ci({width:this.width,height:this.height,thickness:this.thickness,mode:this.mode,speed:this.speed.clone(),transform:this.transform?.clone(),spread:this.spread})}}const Fi={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:Vi,loadJSON:Vi.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:Ai,loadJSON:Ai.fromJSON},hemisphere:{type:"hemisphere",params:[["radius",["number"]],["arc",["radian"]],["thickness",["number"]],["angle",["radian"]],["mode",["emitterMode"]],["spread",["number"]],["speed",["valueFunc","value"]]],constructor:Pi,loadJSON:Pi.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:Ci,loadJSON:Ci.fromJSON}};function Bi(t,e){return Fi[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)Fi[e.type]||(Fi[e.type]=e);for(const e of t.behaviors)si[e.type]||(si[e.type]=e)}}class Ui{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 n=0;const r=s.length/3;this._triangleIndexToArea.push(0);const o=new H,a=new H,h=new H;for(let t=0;t<r;t++){const e=s[3*t],r=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*r],i[3*r+1],i[3*r+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),n+=.5*c.length(),this._triangleIndexToArea.push(n)}}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 n=S()*this._triangleIndexToArea[e];for(;i+1<s;){const t=Math.floor((i+s)/2);n<this._triangleIndexToArea[t]?s=t:i=t}let r=S(),o=S();r+o>1&&(r=1-r,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],f=this._positions[3*h]-c,p=this._positions[3*h+1]-u,m=this._positions[3*h+2]-d,y=this._positions[3*l]-c,g=this._positions[3*l+1]-u,v=this._positions[3*l+2]-d;t.position.set(c+f*r+y*o,u+p*r+g*o,d+m*r+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 Ui(void 0,t?.mesh,wi.fromJSON(t?.transform))}clone(){return new Ui(this._mesh,this._meshReferenceId,this.transform?.clone())}update(t,e){}}const Ei={id:"babylon.quarks",initialize:()=>{},emitterShapes:[{type:"mesh_surface",params:[["mesh",["mesh"]]],constructor:Ui,loadJSON:t=>Ui.fromJSON(t)}],behaviors:[]};const Ni={};let Ri=!1;function Di(){Ri||(Ni.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",Ni.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",Ni.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",Ni.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",Ni.soft_pars_vertex="\n#ifdef SOFT_PARTICLES\n varying vec4 projPosition;\n varying float linearDepth;\n#endif\n",Ni.soft_vertex="\n#ifdef SOFT_PARTICLES\n projPosition = gl_Position;\n linearDepth = -mvPosition.z;\n#endif\n",Ni.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",Ni.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 Li="\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;\n#ifdef UV1\n#ifdef MESH_UV2\n// The mesh's second UV set.\nattribute vec2 uv2;\n#endif\n// UV channel 1: the mesh's second UV set, or its first when it has none.\nvarying vec2 vUV1;\n#endif\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${Li}\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#ifdef UV1\n#ifdef MESH_UV2\n vUV1 = uv2;\n#else\n vUV1 = uv;\n#endif\n#endif\n vColor = color;\n}\n`;const Xi="\n#ifdef MAP_TRANSFORM\nuniform vec4 mapTransform;\n#endif\n#ifdef UV_DISTORTION\nuniform sampler2D distortionMap;\nuniform vec4 distortionTransform;\nuniform float distortionStrength;\n#endif\n#ifdef GRADIENT_MAP\nuniform sampler2D gradientMap;\nuniform vec2 gradientMapRange;\nuniform vec4 gradientMapChannel;\n#endif\n#ifdef EROSION\nuniform vec2 erosionParams;\nuniform vec3 erosionEdgeColor;\n#ifdef EROSION_MASK\nuniform sampler2D erosionMask;\nuniform vec4 erosionMaskTransform;\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#if defined(MAP_TRANSFORM) && defined(MAP_UV1)\n vec2 mapUV = vUV1 * mapTransform.xy + mapTransform.zw;\n#elif defined(MAP_TRANSFORM)\n vec2 mapUV = vUV * mapTransform.xy + mapTransform.zw;\n#else\n vec2 mapUV = vUV;\n#endif\n#ifdef UV_DISTORTION\n #ifdef UV_DISTORTION_UV1\n vec2 distortionUV = vUV1;\n #else\n vec2 distortionUV = vUV;\n #endif\n vec2 distortion = (texture2D(distortionMap, distortionUV * distortionTransform.xy + distortionTransform.zw).rg - 0.5) * 2.0 * distortionStrength;\n mapUV += distortion;\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 #if defined(MAP_TRANSFORM) && defined(MAP_UV1)\n vec2 mapUV2 = mapUV;\n #else\n #ifdef MAP_TRANSFORM\n vec2 mapUV2 = vUV2 * mapTransform.xy + mapTransform.zw;\n #else\n vec2 mapUV2 = vUV2;\n #endif\n #ifdef UV_DISTORTION\n mapUV2 += distortion;\n #endif\n #endif\n vec4 texColor2 = texture2D(map, mapUV2);\n texColor = mix(texColor, texColor2, vTileBlend);\n #endif":""}\n #ifdef GRADIENT_MAP\n float rampAt = clamp(dot(texColor, gradientMapChannel), 0.0, 1.0);\n vec4 ramp = texture2D(gradientMap, vec2(mix(gradientMapRange.x, gradientMapRange.y, rampAt), 0.5));\n texColor = vec4(ramp.rgb, ramp.a * mix(texColor.a, 1.0, gradientMapChannel.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 #ifdef EROSION_MASK_UV1\n vec2 erosionUV = vUV1;\n #else\n vec2 erosionUV = vUV;\n #endif\n erosionMaskValue = texture2D(erosionMask, erosionUV * erosionMaskTransform.xy + erosionMaskTransform.zw).r;\n #endif\n baseColor = quarksErode(baseColor, erosionLevel, erosionMaskValue);\n#endif\n`}const Hi="\n#ifdef MAP_TRANSFORM\nuniform mapTransform: vec4f;\n#endif\n#ifdef UV_DISTORTION\nvar distortionMapSampler: sampler;\nvar distortionMap: texture_2d<f32>;\nuniform distortionTransform: vec4f;\nuniform distortionStrength: f32;\n#endif\n#ifdef GRADIENT_MAP\nvar gradientMapSampler: sampler;\nvar gradientMap: texture_2d<f32>;\nuniform gradientMapRange: vec2f;\nuniform gradientMapChannel: vec4f;\n#endif\n#ifdef EROSION\nuniform erosionParams: vec2f;\nuniform erosionEdgeColor: vec3f;\n#ifdef EROSION_MASK\nvar erosionMaskSampler: sampler;\nvar erosionMask: texture_2d<f32>;\nuniform erosionMaskTransform: vec4f;\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#if defined(MAP_TRANSFORM) && defined(MAP_UV1)\n var mapUV = fragmentInputs.vUV1 * uniforms.mapTransform.xy + uniforms.mapTransform.zw;\n#elif defined(MAP_TRANSFORM)\n var mapUV = fragmentInputs.vUV * uniforms.mapTransform.xy + uniforms.mapTransform.zw;\n#else\n var mapUV = fragmentInputs.vUV;\n#endif\n#ifdef UV_DISTORTION\n #ifdef UV_DISTORTION_UV1\n let distortionUV = fragmentInputs.vUV1;\n #else\n let distortionUV = fragmentInputs.vUV;\n #endif\n let distortion = (textureSample(distortionMap, distortionMapSampler, distortionUV * uniforms.distortionTransform.xy + uniforms.distortionTransform.zw).rg - 0.5) * 2.0 * uniforms.distortionStrength;\n mapUV += distortion;\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 #if defined(MAP_TRANSFORM) && defined(MAP_UV1)\n let mapUV2 = mapUV;\n #else\n #ifdef MAP_TRANSFORM\n var mapUV2 = fragmentInputs.vUV2 * uniforms.mapTransform.xy + uniforms.mapTransform.zw;\n #else\n var mapUV2 = fragmentInputs.vUV2;\n #endif\n #ifdef UV_DISTORTION\n mapUV2 += distortion;\n #endif\n #endif\n let texColor2 = textureSample(map, mapSampler, mapUV2);\n texColor = mix(texColor, texColor2, fragmentInputs.vTileBlend);\n #endif":""}\n #ifdef GRADIENT_MAP\n let rampAt = clamp(dot(texColor, uniforms.gradientMapChannel), 0.0, 1.0);\n let ramp = textureSample(gradientMap, gradientMapSampler, vec2f(mix(uniforms.gradientMapRange.x, uniforms.gradientMapRange.y, rampAt), 0.5));\n texColor = vec4f(ramp.rgb, ramp.a * mix(texColor.a, 1.0, uniforms.gradientMapChannel.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 #ifdef EROSION_MASK_UV1\n let erosionUV = fragmentInputs.vUV1;\n #else\n let erosionUV = fragmentInputs.vUV;\n #endif\n erosionMaskValue = textureSample(erosionMask, erosionMaskSampler, erosionUV * uniforms.erosionMaskTransform.xy + uniforms.erosionMaskTransform.zw).r;\n #endif\n baseColor = quarksErode(baseColor, erosionLevel, erosionMaskValue);\n#endif\n`}var ts=`\nvarying vec2 vUV;\nvarying vec4 vColor;\n#ifdef UV1\nvarying vec2 vUV1;\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#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;\n#ifdef UV1\nvarying vec2 vUV1;\n#endif\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 edgeTerm = pow(1.0 - abs(dot(N, V)), rimParams.x);\n #if defined(MESH_RIM_FADE)\n // Faces turned to the camera fade by the strength; edges stay.\n baseColor.a *= clamp(1.0 - rimParams.y * (1.0 - edgeTerm), 0.0, 1.0);\n #elif defined(MESH_RIM_MIX)\n color = mix(color, rimColor, clamp(edgeTerm * rimParams.y, 0.0, 1.0));\n #else\n color += rimColor * edgeTerm * rimParams.y;\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 UV1\n// The particle's own UV, never moved by the sheet (UV channel 1).\nvarying vec2 vUV1;\n#endif\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${Li}\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#ifdef UV1\n vUV1 = uv;\n#endif\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 UV1\n// The particle's own UV, never moved by the sheet (UV channel 1).\nvarying vec2 vUV1;\n#endif\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\n${Li}\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 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#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 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#ifdef UV1\n vUV1 = quadUV;\n#endif\n vColor = color;\n}\n`,ns=`\nvarying vec2 vUV;\nvarying vec4 vColor;\n#ifdef UV1\nvarying vec2 vUV1;\n#endif\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`,rs=`\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#ifdef UV1\n// Along the trail and across it, without the sheet's cell (UV channel 1).\nattribute vec2 uv2;\nvarying vec2 vUV1;\n#endif\n\nvec2 fix(vec4 i, float aspect) {\n vec2 res = i.xy / i.w;\n res.x *= aspect;\n return res;\n}\n\n${Li}\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#ifdef UV1\n vUV1 = uv2;\n#endif\n vColor = color;\n}\n`;const os=2048,as=2047;class hs{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 ls=`\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;\n#ifdef UV1\n#ifdef MESH_UV2\n// The mesh's second UV set.\nattribute uv2: vec2f;\n#endif\n// UV channel 1: the mesh's second UV set, or its first when it has none.\nvarying vUV1: vec2f;\n#endif\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#ifdef UV1\n#ifdef MESH_UV2\n vertexOutputs.vUV1 = vertexInputs.uv2;\n#else\n vertexOutputs.vUV1 = vertexInputs.uv;\n#endif\n#endif\n vertexOutputs.vColor = vertexInputs.color;\n}\n`,cs=`\nvarying vUV: vec2f;\nvarying vColor: vec4f;\n#ifdef UV1\nvarying vUV1: vec2f;\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#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;\n#ifdef UV1\nvarying vUV1: vec2f;\n#endif\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 edgeTerm = pow(1.0 - abs(dot(N, V)), uniforms.rimParams.x);\n #if defined(MESH_RIM_FADE)\n // Faces turned to the camera fade by the strength; edges stay.\n baseColor.a *= clamp(1.0 - uniforms.rimParams.y * (1.0 - edgeTerm), 0.0, 1.0);\n #elif defined(MESH_RIM_MIX)\n color = mix(color, uniforms.rimColor, clamp(edgeTerm * uniforms.rimParams.y, 0.0, 1.0));\n #else\n color += uniforms.rimColor * edgeTerm * uniforms.rimParams.y;\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 UV1\n// The particle's own UV, never moved by the sheet (UV channel 1).\nvarying vUV1: vec2f;\n#endif\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#ifdef UV1\n vertexOutputs.vUV1 = vertexInputs.uv;\n#endif\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 UV1\n// The particle's own UV, never moved by the sheet (UV channel 1).\nvarying vUV1: vec2f;\n#endif\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\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 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#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 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#ifdef UV1\n vertexOutputs.vUV1 = quadUV;\n#endif\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||"fade"===t.mode?t.mode:"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,e={}){const i=t&&"object"==typeof t?t:{},s=(t,e)=>"number"==typeof t&&Number.isFinite(t)?t:e,n=(t,e)=>Array.isArray(t)?[s(t[0],e[0]),s(t[1],e[1])]:[e[0],e[1]];return{channel:1===(i.channel??e.channel)?1:0,tiling:n(i.tiling,e.tiling??[1,1]),offset:n(i.offset,e.offset??[0,0]),scroll:n(i.scroll,e.scroll??[0,0])}}function bs(t,e){return t===e||t.channel===e.channel&&t.tiling[0]===e.tiling[0]&&t.tiling[1]===e.tiling[1]&&t.offset[0]===e.offset[0]&&t.offset[1]===e.offset[1]&&t.scroll[0]===e.scroll[0]&&t.scroll[1]===e.scroll[1]}function ws(t,e={}){const i=Ss(void 0,e),s={};return t.channel!==i.channel&&(s.channel=t.channel),t.tiling[0]===i.tiling[0]&&t.tiling[1]===i.tiling[1]||(s.tiling=[...t.tiling]),t.offset[0]===i.offset[0]&&t.offset[1]===i.offset[1]||(s.offset=[...t.offset]),t.scroll[0]===i.scroll[0]&&t.scroll[1]===i.scroll[1]||(s.scroll=[...t.scroll]),Object.keys(s).length>0?s:void 0}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";const Ms={r:[1,0,0,0],g:[0,1,0,0],b:[0,0,1,0],a:[0,0,0,1],luminance:[.2126,.7152,.0722,0]};function zs(t){if(!t||"object"!=typeof t||!t.ramp)return;const e=t.channel;return{ramp:t.ramp,channel:void 0!==e&&e in Ms?e:"r"}}function _s(t,e){return t===e||!!t&&!!e&&t.ramp===e.ramp&&t.channel===e.channel}function Vs(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];return{mask:t.mask??null,maskUV:Ss(t.maskUV),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)]}}function Ts(t,e){return t===e||!(!t||!e)&&(t.mask===e.mask&&bs(t.maskUV,e.maskUV)&&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])}const Ps={scroll:[0,.5]};function Os(t){if(!t||"object"!=typeof t||!t.map)return;const e=t.strength;return{map:t.map,mapUV:Ss(t.mapUV,Ps),strength:Math.max(0,"number"==typeof e&&Number.isFinite(e)?e:.05)}}function As(t,e){return t===e||!(!t||!e)&&(t.map===e.map&&t.strength===e.strength&&bs(t.mapUV,e.mapUV))}function Cs(t){if(!t||"object"!=typeof t)return;const e=Ss(t);return void 0===ws(e)?void 0:e}function Fs(t,e){return t===e||!!t&&!!e&&bs(t,e)}function Bs(t){const{mapUV:e,uvDistortion:i,erosion:s}=t;return 1===e?.channel||1===i?.mapUV.channel||!!s?.mask&&1===s.maskUV.channel}class $s{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,instancingUVs2:t.instancingUVs2,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),mapUV:Cs(t.mapUV),uvDistortion:Os(t.uvDistortion),gradientMap:zs(t.gradientMap),erosion:Vs(t.erosion)},this.mesh=new h.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,n=1/0,r=-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<n&&(n=t.z),e.x>r&&(r=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===n&&d.x===r&&d.y===o&&d.z===a||(u.set(i,s,n),d.set(r,o,a),c.reConstruct(u,d)),this.mesh.alwaysSelectAsActiveMesh=!1}fogDefines(){if(!this.settings.applyFog)return[];return this.settings.materialTransparent&&(this.settings.materialBlendMode===n.Constants.ALPHA_ADD||this.settings.materialBlendMode===n.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)})}usesUV1(){return Bs(this.settings)}surfaceDefines(){const t=[],{mapUV:e,uvDistortion:i,gradientMap:s,erosion:n}=this.settings;return this.usesUV1()&&t.push("UV1"),e&&(t.push("MAP_TRANSFORM"),1===e.channel&&t.push("MAP_UV1")),i&&(t.push("UV_DISTORTION"),1===i.mapUV.channel&&t.push("UV_DISTORTION_UV1")),s&&t.push("GRADIENT_MAP"),n&&(t.push("EROSION"),n.mask&&(t.push("EROSION_MASK"),1===n.maskUV.channel&&t.push("EROSION_MASK_UV1"))),t}surfaceUniforms(t,e){const{mapUV:i,uvDistortion:s,gradientMap:n,erosion:r}=this.settings;i&&t.push("mapTransform"),s&&(e.push("distortionMap"),t.push("distortionTransform","distortionStrength")),n&&(e.push("gradientMap"),t.push("gradientMapRange","gradientMapChannel")),r&&(t.push("erosionParams","erosionEdgeColor"),r.mask&&(e.push("erosionMask"),t.push("erosionMaskTransform")))}bindSurface(t){const{mapUV:e,uvDistortion:i,gradientMap:s,erosion:n}=this.settings;if(i?.map&&(t.setTexture("distortionMap",i.map),t.setFloat("distortionStrength",i.strength)),s?.ramp){t.setTexture("gradientMap",s.ramp);const[e,i,n,r]=Ms[s.channel];t.setVector4("gradientMapChannel",new a.Vector4(e,i,n,r))}if(n&&(n.mask&&t.setTexture("erosionMask",n.mask),t.setVector2("erosionParams",new a.Vector2(n.softness,n.edgeWidth)),t.setVector3("erosionEdgeColor",new a.Vector3(n.edgeColor[0],n.edgeColor[1],n.edgeColor[2]))),!(e||i||n?.mask||s))return;const r=t=>t-2*Math.floor(t/2),o=new a.Vector4,h=new a.Vector4,l=new a.Vector4,c=new a.Vector2(0,1),u=(t,e,i)=>i.set(t.tiling[0],t.tiling[1],t.offset[0]+r(t.scroll[0]*e),t.offset[1]+r(t.scroll[1]*e)),d=()=>{const r=this.time,a=t.getEffect();if(e&&(u(e,r,o),t.setVector4("mapTransform",o),a?.setVector4("mapTransform",o)),i&&(u(i.mapUV,r,h),t.setVector4("distortionTransform",h),a?.setVector4("distortionTransform",h)),n?.mask&&(u(n.maskUV,r,l),t.setVector4("erosionMaskTransform",l),a?.setVector4("erosionMaskTransform",l)),s?.ramp){const e=s.ramp.getSize().width,i=e>0?.5/e:0;c.set(i,1-i),t.setVector2("gradientMapRange",c),a?.setVector2("gradientMapRange",c)}};d(),t.onBindObservable.add(d)}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 r.ShaderMaterial&&e.setTexture("depthTexture",t)}applyMeshLighting(t){}dispose(){this.mesh.dispose()}}$s.FOG_UNIFORMS=["vFogInfos","vFogColor"];class Is extends $s{static whiteTexture(t){let e=Is.whiteTextureByScene.get(t);return e||(e=o.RawTexture.CreateRGBATexture(new Uint8Array([255,255,255,255]),1,1,t),e.name="quarksMeshWhite",Is.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.warnedUV2=!1,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 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.meshUV2()&&(t.uvs2=this.settings.instancingUVs2),this.settings.instancingNormals&&(t.normals=this.settings.instancingNormals),t.applyToMesh(this.mesh,!1),this.buildExpandableBuffers()}meshUV2(){const t=this.settings.instancingUVs2;if(this.settings.renderMode!==exports.RenderMode.Mesh||!t||!this.usesUV1())return!1;const e=this.settings.instancingGeometry.length/3*2;return t.length===e||(this.warnedUV2||(this.warnedUV2=!0,console.warn(`[babylon.quarks] instancingUVs2 has ${t.length} values for ${e/2} vertices (two per vertex expected); UV channel 1 reads the first UV set instead.`)),!1)}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),Is.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 Is.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 hs(this.maxParticles));s.ensure(t);const n=s.keys,r=this.settings.sortMode;if("distance"===r){const e=this.scene.activeCameras?.[0]??this.scene.activeCamera;if(!e)return;const i=e.globalPosition,r=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]-r,l=h[i+1]-o,c=h[i+2]-a;n[e]=s.floatKey(t*t+l*l+c*c,!0)}}else{const e="youngestInFront"===r,i=this.visibleSystems;let o=0;for(let t=0;t<i.length;t++){const r=i[t],a=r.particleNum,h=r.store;if(0===a)continue;if(void 0===h){const t=r.particles;for(let i=0;i<a;i++)n[o++]=s.floatKey(t[i].age,e);continue}const l=h.scalars,c=Me.SCALAR_STRIDE;for(let t=0,i=Me.AGE;t<a;t++,i+=c)n[o++]=s.floatKey(l[i],e)}if(o!==t)return}const o=function(t,e){const i=t.keys,s=t.counts;let n=t.orderA,r=t.orderB;for(let t=0;t<e;t++)n[t]=t;for(let t=0;t<32;t+=11){s.fill(0);for(let r=0;r<e;r++)s[i[n[r]]>>>t&as]++;if(s[i[n[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=n[o];r[s[i[e]>>>t&as]++]=e}const a=n;n=r,r=a}return n}(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,n){let r=this.gatherScratch[t];return void 0!==r&&r.length===e.length||(r=new Float32Array(e.length)),function(t,e,i,s,n){if(1===n)for(let n=0;n<s;n++)e[n]=t[i[n]];else if(3===n)for(let n=0,r=0;n<s;n++,r+=3){const s=3*i[n];e[r]=t[s],e[r+1]=t[s+1],e[r+2]=t[s+2]}else if(4===n)for(let n=0,r=0;n<s;n++,r+=4){const s=4*i[n];e[r]=t[s],e[r+1]=t[s+1],e[r+2]=t[s+2],e[r+3]=t[s+3]}else for(let r=0;r<s;r++){const s=i[r]*n,o=r*n;for(let i=0;i<n;i++)e[o+i]=t[s+i]}}(e,r,i,s,n),this.gatherScratch[t]=e,r}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:ls},s={glsl:es,wgsl:us}):Is.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?Is.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"),this.settings.renderMode===exports.RenderMode.Beam&&e.push("BEAM");const c=Is.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"),"fade"===m.mode?e.push("MESH_RIM_FADE"):"mix"===m.mode&&e.push("MESH_RIM_MIX"));const y=l||!!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"),this.usesUV1()&&this.meshUV2()&&(e.push("MESH_UV2"),v.push("uv2")),Is.drawsAlongVelocity(this.settings.renderMode)&&v.push("velocity");const x=["world","view","projection","worldView","worldViewProjection",...$s.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.surfaceUniforms(x,S),Is.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 r.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),l&&h&&(b.setTexture("envAtlas",h),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)),Is.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(()=>{Is.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=n.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 n=t.lights;for(let r=0;r<n.length;r++){const o=n[r],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,n=i===exports.RenderMode.StretchedBillBoard,r=i===exports.RenderMode.Beam,o=n||r,a=Is.takesPivotAndFlip(i),h=this.getVisibleSystems();for(let t=0;t<h.length;t++)e+=h[t].particleNum;e>this.maxParticles&&this.expandBuffers(e);for(let e=0;e<h.length;e++){const i=h[e],o=i.particleNum;if(0===o)continue;const l=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]))}n&&!f&&this.rotationMat_.setFromMatrix4(p);const m=Math.abs(d.x),y=Math.abs(d.y),g=Math.abs(d.z),v=n?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?Is.continueColor(this.colorBuffer,4*t,b,o,_):this.colorBuffer.set(b.color.subarray(0,4*o),4*t));let V=!1;if(void 0!==b&&f)0!==_&&o>0?Is.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?Is.continueVector3(this.sizeBuffer,3*t,b.size,b.previousSize,o,_):this.sizeBuffer.set(b.size.subarray(0,3*o),3*t),V=!0;else if(M&&o>0){const e=3*t,i=e+3*o,s=this.offsetBuffer;0!==_?Is.extrapolate(s,e,b,o,_):s.set(b.position.subarray(0,3*o),e);const n=p.elements,r=n[0],a=n[1],h=n[2],l=n[3],c=n[4],u=n[5],d=n[6],f=n[7],v=n[8],x=n[9],S=n[10],w=n[11],M=n[12],z=n[13],T=n[14],P=n[15];for(let t=e;t<i;t+=3){const e=s[t],i=s[t+1],n=s[t+2],o=1/(l*e+f*i+w*n+P);s[t]=(r*e+c*i+v*n+M)*o,s[t+1]=(a*e+u*i+x*n+z)*o,s[t+2]=(h*e+d*i+S*n+T)*o}const O=this.sizeBuffer;0!==_&&b.previousSize!==b.size?Is.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;V=!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}n&&this.velocityBuffer&&Is.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),Is.writeQuaternions(this.rotationBuffer,4*T,e,o,_,f?null:c),t+=o}else for(let e=0;e<o;e++,t++){const i=l[e];if(s){let e=i.rotation;const s=i.angularVelocity;let n;if(0!==_&&s instanceof Z&&(e=this.quaternion4_.copy(e).multiply(Is.partialTurn(s,_,this.quaternion5_))),f)n=e;else{let t;t=i.parentMatrix?this.quaternion3_.setFromRotationMatrix(i.parentMatrix):c,n=this.quaternion_,n.copy(t).multiply(e)}const r=4*t;this.rotationBuffer[r]=n.x,this.rotationBuffer[r+1]=n.y,this.rotationBuffer[r+2]=n.z,this.rotationBuffer[r+3]=n.w}else{const e=i.angularVelocity;this.rotationBuffer[t]=i.rotation+("number"==typeof e?e*z:0)}if(!V){const e=i.position,s=i.previousPosition;let n=e.x+(e.x-s.x)*_,r=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]*n+t[7]*r+t[11]*o+t[15]),s=(t[0]*n+t[4]*r+t[8]*o+t[12])*e,a=(t[1]*n+t[5]*r+t[9]*o+t[13])*e;o=(t[2]*n+t[6]*r+t[10]*o+t[14])*e,n=s,r=a}const a=3*t;this.offsetBuffer[a]=n,this.offsetBuffer[a+1]=r,this.offsetBuffer[a+2]=o;const h=i.size,l=3*t;f||i.parentMatrix?(this.sizeBuffer[l]=h.x,this.sizeBuffer[l+1]=h.y,this.sizeBuffer[l+2]=h.z):(this.sizeBuffer[l]=h.x*m,this.sizeBuffer[l+1]=h.y*y,this.sizeBuffer[l+2]=h.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,n&&this.velocityBuffer){const e=i.velocity,s=i.previousVelocity,n=e.x+(e.x-s.x)*_,r=e.y+(e.y-s.y)*_,o=e.z+(e.z-s.z)*_;let a=this.vector_;a.set(n,r,o),f||(i.parentMatrix?(this.rotationMat2_.setFromMatrix4(i.parentMatrix),a.applyMatrix3(this.rotationMat2_)):a.applyMatrix3(this.rotationMat_));const h=4*t;this.velocityBuffer[h]=a.x*x,this.velocityBuffer[h+1]=a.y*x,this.velocityBuffer[h+2]=a.z*x,this.velocityBuffer[h+3]=S}}const P=i.tint;void 0!==P&&t>T&&Is.applyTint(this.colorBuffer,4*T,t-T,P),a&&void 0!==i.flip&&(void 0!==b?Is.applyFlip(this.sizeBuffer,3*T,b.flip,o):Is.applyFlipFromParticles(this.sizeBuffer,3*T,l,o)),r&&this.velocityBuffer&&this.writeBeams(i,T,t-T)}n&&h.length>0&&this.syncStretchedSpeedFactor(h[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,n=this.offsetBuffer,r=this.beamEnd_,o="function"==typeof t.getBeamEnd&&t.getBeamEnd(r);for(let t=e;t<e+i;t++){const e=3*t,i=4*t;s[i]=o?r.x-n[e]:0,s[i+1]=o?r.y-n[e+1]:0,s[i+2]=o?r.z-n[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 applyTint(t,e,i,s){for(let n=0,r=e;n<i;n++,r+=4)t[r]*=s.x,t[r+1]*=s.y,t[r+2]*=s.z,t[r+3]*=s.w}static applyFlip(t,e,i,s){for(let n=0,r=e;n<s;n++,r+=3){const e=i[n];0!==e&&(1&e&&(t[r]=-t[r]),2&e&&(t[r+1]=-t[r+1]))}}static applyFlipFromParticles(t,e,i,s){for(let n=0,r=e;n<s;n++,r+=3){const e=i[n].flip;0!==e&&(1&e&&(t[r]=-t[r]),2&e&&(t[r+1]=-t[r+1]))}}static writeQuaternions(t,e,i,s,n,r){const o=i.rotationQuaternion,a=i.angularVelocityQuaternion,h=null!==r,l=h?r.x:0,c=h?r.y:0,u=h?r.z:0,d=h?r.w:1;for(let i=0,r=0,f=e;i<s;i++,r+=4,f+=4){let e=o[r],i=o[r+1],s=o[r+2],p=o[r+3];if(0!==n){const t=a[r]*n,o=a[r+1]*n,h=a[r+2]*n,l=1+(a[r+3]-1)*n,c=1/Math.sqrt(t*t+o*o+h*h+l*l),u=t*c,d=o*c,f=h*c,m=l*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(h){const t=l*p+d*e+c*s-u*i,n=c*p+d*i+u*e-l*s,r=u*p+d*s+l*i-c*e;p=d*p-l*e-c*i-u*s,e=t,i=n,s=r}t[f]=e,t[f+1]=i,t[f+2]=s,t[f+3]=p}}static writeVelocities(t,e,i,s,n,r,o,a){const h=i.velocity,l=i.previousVelocity.length>=3*s?i.previousVelocity:h,c=null!==r?r.elements:null;for(let i=0,r=0,u=e;i<s;i++,r+=3,u+=4){let e=h[r],i=h[r+1],s=h[r+2];if(0!==n&&(e+=(e-l[r])*n,i+=(i-l[r+1])*n,s+=(s-l[r+2])*n),null!==c){const t=c[0]*e+c[3]*i+c[6]*s,n=c[1]*e+c[4]*i+c[7]*s;s=c[2]*e+c[5]*i+c[8]*s,e=t,i=n}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,n=t.y*e,r=t.z*e,o=1+(t.w-1)*e,a=1/Math.sqrt(s*s+n*n+r*r+o*o);return i.x=s*a,i.y=n*a,i.z=r*a,i.w=o*a,i}static continueVector3(t,e,i,s,n,r){for(let o=0,a=0;o<n;o++,a+=3){const n=i[a]+(i[a]-s[a])*r,o=i[a+1]+(i[a+1]-s[a+1])*r,h=i[a+2]+(i[a+2]-s[a+2])*r;t[e+a]=n>0?n:0,t[e+a+1]=o>0?o:0,t[e+a+2]=h>0?h:0}}static continueColor(t,e,i,s,n){const r=i.color,o=i.previousColor;for(let i=0,a=0;i<s;i++,a+=4){const i=r[a]+(r[a]-o[a])*n,s=r[a+1]+(r[a+1]-o[a+1])*n,h=r[a+2]+(r[a+2]-o[a+2])*n,l=r[a+3]+(r[a+3]-o[a+3])*n;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,n){const r=i.position,o=i.previousPosition;for(let i=0,a=0;i<s;i++,a+=3){const i=r[a],s=r[a+1],h=r[a+2];t[e+a]=i+(i-o[a])*n,t[e+a+1]=s+(s-o[a+1])*n,t[e+a+2]=h+(h-o[a+2])*n}}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()}}Is.whiteTextureByScene=new WeakMap;var Us=`\nvarying vUV: vec2f;\nvarying vColor: vec4f;\n#ifdef UV1\nvarying vUV1: vec2f;\n#endif\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`,Es=`\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#ifdef UV1\n// Along the trail and across it, without the sheet's cell (UV channel 1).\nattribute uv2: vec2f;\nvarying vUV1: vec2f;\n#endif\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#ifdef UV1\n vertexOutputs.vUV1 = vertexInputs.uv2;\n#endif\n vertexOutputs.vColor = vertexInputs.color;\n}\n`;class Ns extends $s{constructor(t,e){super(t,e),this.uv1Buffer=null,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.uv1Buffer=this.usesUV1()?new Float32Array(4*this.maxParticles):null,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.uv1Buffer&&this.mesh.setVerticesData(t.VertexBuffer.UV2Kind,this.uv1Buffer,!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:rs,wgsl:Es},{glsl:ns,wgsl:Us},i);const s=["position","previous","next","side","width","uv","color"];this.uv1Buffer&&s.push("uv2");const o=["world","view","projection","worldViewProjection","lineWidth","resolution","sizeAttenuation",...$s.FOG_UNIFORMS],h=[];this.settings.texture&&h.push("map"),this.surfaceUniforms(o,h);const l=new r.ShaderMaterial(t,this.scene,{vertex:t,fragment:t},{attributes:s,uniforms:o,samplers:h,defines:e,needAlphaBlending:this.settings.materialTransparent,shaderLanguage:i});this.settings.texture&&l.setTexture("map",this.settings.texture);const c=this.scene.getEngine();l.setFloat("lineWidth",1);const u=new a.Vector2(c.getRenderWidth(),c.getRenderHeight());l.setVector2("resolution",u),l.setFloat("sizeAttenuation",1),l.onBindObservable.add(()=>{const t=this.scene.getEngine(),e=t.getRenderWidth(),i=t.getRenderHeight();u.x===e&&u.y===i||(u.x=e,u.y=i,l.setVector2("resolution",u))}),this.bindFog(l),this.bindSurface(l),l.backFaceCulling=!1,this.settings.materialTransparent?l.alphaMode=this.settings.materialBlendMode:l.alphaMode=n.Constants.ALPHA_DISABLE,l.needDepthPrePass=this.settings.materialDepthWrite,l.forceDepthWrite=this.settings.materialDepthWrite,l.disableDepthWrite=!this.settings.materialDepthWrite,this.mesh.material=l}writeSweptPair(t,e,i,s,n,r,o,a){const h=this.positionBuffer;h[t]=e+n*a,h[t+1]=i+r*a,h[t+2]=s+o*a,h[t+3]=e-n*a,h[t+4]=i-r*a,h[t+5]=s-o*a}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],n=e.particles;for(let t=0;t<e.particleNum;t++){const e=n[t].historyCount;0!==e&&(i+=2*e+2)}}i>this.maxParticles&&this.expandBuffers(i);for(let i=0;i<s.length;i++){const n=s[i],r=t;Ns.ensureWorldMatrix(n);const o=this.quaternion_,a=this.vector2_,h=this.vector3_,l=n.emitter.matrixWorld;l.decompose(a,o,h);const c=n.particles,u=n.particleNum,d=this.settings.uTileCount,f=this.settings.vTileCount,p=1/d,m=1/f,y=n.worldSpace,g=(Math.abs(h.x)+Math.abs(h.y)+Math.abs(h.z))/3,v=n.rendererEmitterSettings,x=Boolean(v.uvFromHead),S=this.uv1Buffer,b=Boolean(v.colorFromParticle),w=y||Boolean(v.recordWorldSpace),M=v.sideAxis,z=v.followLocalOrigin?0:n.simulationResidual??0,_=0===z?0:z/(n.simulationStep??z);for(let i=0;i<u;i++){const s=c[i],n=s.historyCount;if(0===n)continue;const r=s.historyCapacity,o=s.historyPositions,a=s.historySizes,h=s.historySides,u=void 0!==M&&h.length===3*r,d=b?s.store.color:s.historyColors,v=4*s.storeIndex,z=s.uvTile%f,V=Math.floor(s.uvTile/f+.001),T=(s.parentMatrix??l).elements,P=T[0],O=T[1],A=T[2],C=T[3],F=T[4],B=T[5],$=T[6],I=T[7],U=T[8],E=T[9],N=T[10],R=T[11],D=T[12],L=T[13],q=T[14],k=T[15],J=1/(0!==_?n:Math.max(1,n-1));let Q=s.getHistoryIndex(0),G=o[3*Q],W=o[3*Q+1],j=o[3*Q+2];if(!w){const t=1/(C*G+I*W+R*j+k),e=(P*G+F*W+U*j+D)*t,i=(O*G+B*W+E*j+L)*t;j=(A*G+$*W+N*j+q)*t,G=e,W=i}let Y=G,X=W,Z=j;for(let i=0;i<n;i++,t+=2){let l=G,c=W,M=j,_=Q;if(i+1<n){_=Q+1===r?0:Q+1;const t=3*_;if(l=o[t],c=o[t+1],M=o[t+2],!w){const t=1/(C*l+I*c+R*M+k),e=(P*l+F*c+U*M+D)*t,i=(O*l+B*c+E*M+L)*t;M=(A*l+$*c+N*M+q)*t,l=e,c=i}}const T=a[Q],H=b?v:4*Q,K=d[H],tt=d[H+1],et=d[H+2],it=d[H+3],st=3*t;if(u){const t=3*Q;let e=h[t],i=h[t+1],s=h[t+2];if(!w){const t=P*e+F*i+U*s,n=O*e+B*i+E*s;s=A*e+$*i+N*s,e=t,i=n}this.writeSweptPair(st,G,W,j,e,i,s,.5*T)}else this.positionBuffer[st]=G,this.positionBuffer[st+1]=W,this.positionBuffer[st+2]=j,this.positionBuffer[st+3]=G,this.positionBuffer[st+4]=W,this.positionBuffer[st+5]=j;this.previousBuffer[st]=Y,this.previousBuffer[st+1]=X,this.previousBuffer[st+2]=Z,this.previousBuffer[st+3]=Y,this.previousBuffer[st+4]=X,this.previousBuffer[st+5]=Z,this.nextBuffer[st]=l,this.nextBuffer[st+1]=c,this.nextBuffer[st+2]=M,this.nextBuffer[st+3]=l,this.nextBuffer[st+4]=c,this.nextBuffer[st+5]=M,u?(this.widthBuffer[t]=0,this.widthBuffer[t+1]=0):y||s.parentMatrix?(this.widthBuffer[t]=T,this.widthBuffer[t+1]=T):(this.widthBuffer[t]=T*g,this.widthBuffer[t+1]=T*g);const nt=2*t,rt=i*J,ot=((x?1-rt:rt)+z)*p;if(this.uvBuffer[nt]=ot,this.uvBuffer[nt+1]=(f-V-1)*m,this.uvBuffer[nt+2]=ot,this.uvBuffer[nt+3]=(f-V)*m,S){const t=x?1-rt:rt;S[nt]=t,S[nt+1]=0,S[nt+2]=t,S[nt+3]=1}const at=4*t;this.colorBuffer[at]=K,this.colorBuffer[at+1]=tt,this.colorBuffer[at+2]=et,this.colorBuffer[at+3]=it,this.colorBuffer[at+4]=K,this.colorBuffer[at+5]=tt,this.colorBuffer[at+6]=et,this.colorBuffer[at+7]=it,i+1<n&&(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++),Y=G,X=W,Z=j,G=l,W=c,j=M,Q=_}if(0!==_){const i=s.previousPosition,n=s.position;let r=n.x+(n.x-i.x)*_,o=n.y+(n.y-i.y)*_,a=n.z+(n.z-i.z)*_;const h=t-2,l=.5*(this.positionBuffer[3*h]+this.positionBuffer[3*h+3]),c=.5*(this.positionBuffer[3*h+1]+this.positionBuffer[3*h+4]),d=.5*(this.positionBuffer[3*h+2]+this.positionBuffer[3*h+5]);if(!y){const t=1/(C*r+I*o+R*a+k),e=(P*r+F*o+U*a+D)*t,i=(O*r+B*o+E*a+L)*t;a=(A*r+$*o+N*a+q)*t,r=e,o=i}const v=3*t,b=s.size.x;if(u){const t=M.x,e=M.y,i=M.z;this.writeSweptPair(v,r,o,a,P*t+F*e+U*i,O*t+B*e+E*i,A*t+$*e+N*i,.5*b)}else this.positionBuffer[v]=r,this.positionBuffer[v+1]=o,this.positionBuffer[v+2]=a,this.positionBuffer[v+3]=r,this.positionBuffer[v+4]=o,this.positionBuffer[v+5]=a;this.previousBuffer[v]=l,this.previousBuffer[v+1]=c,this.previousBuffer[v+2]=d,this.previousBuffer[v+3]=l,this.previousBuffer[v+4]=c,this.previousBuffer[v+5]=d,this.nextBuffer[v]=r,this.nextBuffer[v+1]=o,this.nextBuffer[v+2]=a,this.nextBuffer[v+3]=r,this.nextBuffer[v+4]=o,this.nextBuffer[v+5]=a;const w=3*h;this.nextBuffer[w]=r,this.nextBuffer[w+1]=o,this.nextBuffer[w+2]=a,this.nextBuffer[w+3]=r,this.nextBuffer[w+4]=o,this.nextBuffer[w+5]=a,u?(this.widthBuffer[t]=0,this.widthBuffer[t+1]=0):y||s.parentMatrix?(this.widthBuffer[t]=b,this.widthBuffer[t+1]=b):(this.widthBuffer[t]=b*g,this.widthBuffer[t+1]=b*g);const T=2*t,J=((x?0:1)+z)*p;if(this.uvBuffer[T]=J,this.uvBuffer[T+1]=(f-V-1)*m,this.uvBuffer[T+2]=J,this.uvBuffer[T+3]=(f-V)*m,S){const t=x?0:1;S[T]=t,S[T+1]=0,S[T+2]=t,S[T+3]=1}const Q=s.color,G=4*t;this.colorBuffer[G]=Q.x,this.colorBuffer[G+1]=Q.y,this.colorBuffer[G+2]=Q.z,this.colorBuffer[G+3]=Q.w,this.colorBuffer[G+4]=Q.x,this.colorBuffer[G+5]=Q.y,this.colorBuffer[G+6]=Q.z,this.colorBuffer[G+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}}const V=n.tint;if(void 0!==V){const e=this.colorBuffer;for(let i=4*r,s=4*t;i<s;i+=4)e[i]*=V.x,e[i+1]*=V.y,e[i+2]*=V.z,e[i+3]*=V.w}this.measureSystemBounds(n,r,t)}this.refreshBoundingInfo(),this.uploadGeometry(t,e)}measureSystemBounds(t,e,i){if(i<=e||"function"!=typeof t.setWorldBounds)return;const s=this.positionBuffer;let n=1/0,r=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+=3){const e=s[t],i=s[t+1],c=s[t+2];e<n&&(n=e),e>a&&(a=e),i<r&&(r=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(n,r,o,a,h,l,u)}uploadGeometry(e,i){const s=this.mesh.geometry,n=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)),this.uv1Buffer&&this.mesh.updateVerticesData(t.VertexBuffer.UV2Kind,this.uv1Buffer.subarray(0,2*e)),n&&this.scene.getEngine().updateDynamicIndexBuffer(n,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),n&&this.scene.getEngine().updateDynamicIndexBuffer(n,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 Rs 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,n=t.activeCameras,r=t.activeCamera,o=n&&n.length>0?n:r?[r]:[],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 n=i.getTransformationMatrix(),r=0===t?s:s.slice(6*t,6*t+6);if(e.Frustum.GetPlanesToRef(n,r),0!==t)for(let e=0;e<6;e++)s[6*t+e]=r[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 n=!0;for(let r=t;r<t+6;r++){const t=e[r],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){n=!1;break}}if(n)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.renderMode===exports.RenderMode.Trail||t.instancingUVs===e.instancingUVs)&&(t.renderMode!==exports.RenderMode.Mesh||t.instancingNormals===e.instancingNormals)&&(t.renderMode!==exports.RenderMode.Mesh||!Bs(t)||t.instancingUVs2===e.instancingUVs2)&&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)&&Fs(t.mapUV,e.mapUV)&&As(t.uvDistortion,e.uvDistortion)&&_s(t.gradientMap,e.gradientMap)&&Ts(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(Rs.equals(this.batches[t].settings,i))return this.batches[t].addSystem(e),void this.systemToBatchIndex.set(e,t);let s;const n=this.getScene();switch(i.renderMode){case exports.RenderMode.Trail:s=new Ns(i,n);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 Is(i,n);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=Rs.clamp(t.minQuality??e.minQuality,.05,1),s=Rs.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=Rs.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),n=r=>{if(!i.has(r)&&!e.has(r)){e.add(r);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})(r))n(t);e.delete(r),i.add(r),t.push(r)}};for(const t of this.systems)n(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(),n=this.cullingEnabled?this.collectFrustumPlanes():null,r=this.simulationBudgetMs!==1/0||this.catchUpBudgetMs!==1/0?performance.now():0,o=this.simulationBudgetMs===1/0?1/0:r+this.simulationBudgetMs,a=this.catchUpBudgetMs===1/0?1/0:r+this.catchUpBudgetMs;for(let e=0;e<s.length;e++){const i=s[e];i.emitter.visible&&(i.culled=null!==n&&n.length>0&&"always"!==i.cullingMode&&!0!==i.onlyUsedByOther&&!this.isSystemInView(i,n),i.update(t,o,a)),s[e]!==i&&e--}this.refreshBatches(),e.enabled&&(e.lastFrameCpuMs=performance.now()-i,e.lastFrameCpuMs>e.targetFrameMs?e.currentQuality=Rs.clamp(e.currentQuality-e.decreaseStep,e.minQuality,e.maxQuality):e.currentQuality=Rs.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>Rs.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()}}Rs.EMPTY_BATCH_GRACE_FRAMES=120;const Ds=Rs;class Ls 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 qs{static runOnAllParticleEmitters(t,e){qs.traverseNode(t,t=>{t instanceof Ls&&e(t)})}static addToBatchRenderer(t,e){qs.runOnAllParticleEmitters(t,t=>{e.addSystem(t.system)})}static play(t){qs.runOnAllParticleEmitters(t,t=>{t.system.play()})}static stop(t){qs.runOnAllParticleEmitters(t,t=>{t.system.stop()})}static pause(t){qs.runOnAllParticleEmitters(t,t=>{t.system.pause()})}static restart(t){qs.runOnAllParticleEmitters(t,t=>{t.system.restart()})}static setAutoDestroy(t,e){qs.runOnAllParticleEmitters(t,t=>{t.system.autoDestroy=e})}static endEmit(t){qs.runOnAllParticleEmitters(t,t=>{t.system.endEmit()})}static isEffectFinished(t){let e=!1,i=!0;return qs.runOnAllParticleEmitters(t,t=>{e=!0,t.system.isFinished()||(i=!1)}),e&&i}static instantiate(t,e){const i=new Map,n=(t,e,r)=>{let o;if(t instanceof Ls)o=t.clone(r),i.set(t,o);else{if(!(t instanceof s.TransformNode))return null;o=new s.TransformNode(r??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())n(e,o);return o},r=n(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 r}static getDuration(t){const e=[];qs.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 n=t.subParticleSystem?.system;if(void 0!==n&&"object"==typeof n){e.includes(n)||e.push(n);const t=i.get(n)??[];t.push(s),i.set(n,t)}}}const s=new Map,n=t=>{const e=s.get(t);if(void 0!==e)return e;s.set(t,1/0);const r=t.playbackSpeed,o=qs.maxOf(t.startLife)/r;let a;if(r>0)if(t.onlyUsedByOther){a=0;for(const e of i.get(t)??[])a=Math.max(a,n(e));a+=t.duration/r+o}else a=t.looping?1/0:(qs.maxOf(t.startDelay,0)+t.duration)/r+o;else a=1/0;return s.set(t,a),a};let r=0;for(const t of e)r=Math.max(r,n(t));return r}static maxOf(t,e){if(t instanceof At)return t.value;if(t instanceof Ct)return Math.max(t.a,t.b);let i=-1/0;for(let s=0;s<=32;s++){const n=[];t.startGen(n);const r="function"===t.type?t.genValue(n,e??s/32):t.genValue(n);i=Math.max(i,r)}return i}static traverseNode(t,e){e(t);const i=t.getChildren();for(const t of i)qs.traverseNode(t,e)}}const ks=new WeakMap,Js=new WeakMap;function Qs(t){if(!t?.isCube)return null;const e=t.files??t._files;return 6===e?.length?e.slice():null}function Gs(t){return ks.get(t)??null}async function Ws(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 n=document.createElement("canvas");n.width=3*s,n.height=2*s;const r=n.getContext("2d");if(!r)throw new Error("Could not create env atlas canvas");for(let t=0;t<6;t++)r.drawImage(i[t],t%3*s,Math.floor(t/3)*s,s,s);const o=new y.Texture(n.toDataURL("image/jpeg",.92),e,{noMipmap:!0,invertY:!1,samplingMode:y.Texture.LINEAR_LINEAR});return o.name="quarksEnvAtlas",o}const js={createFromFaceUrls:Ws};function Ys(t,e,i){const s=ks.get(t);if(s)return i(s),s;const n=()=>{const s=Js.get(t);if(s)return void s.then(t=>{t&&i(t)});const n=Qs(t);if(!n)return;const r=js.createFromFaceUrls(n,e).then(e=>(ks.set(t,e),Js.delete(t),i(e),e)).catch(e=>(Js.delete(t),console.warn("[babylon.quarks] Failed to build env atlas from cubemap faces",e),null));Js.set(t,r)};if(t.isReady())n();else{const e=t.onLoadObservable;e?e.addOnce(()=>n()):n()}return ks.get(t)??null}class Xs extends v.StandardMaterial{constructor(t,e,i={}){super(t,e),this.isParticleMeshStandardMaterial=!0,Object.assign(this,i)}}class Zs extends g.PBRMaterial{constructor(t,e,i={}){super(t,e),this.isParticleMeshPhysicsMaterial=!0,Object.assign(this,i)}}function Hs(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),tn=new Z,en=new Z,sn=new H,nn=new H,rn=1/60,on=new Set(["SizeOverLife","SizeBySpeed"]),an=new Set(["ColorOverLife","ColorBySpeed"]),hn=new Set(["ApplyForce","Noise","TurbulenceField","GravityForce","RotationOverLife","Rotation3DOverLife","RotationBySpeed","SpeedOverLife","FrameOverLife","ForceOverLife","VelocityOverLife","InheritVelocity","OrbitOverLife","WidthOverLength","ChangeEmitDirection","EmitSubParticleSystem","LimitSpeedOverLife","ApplyCollision"]),ln=new Float32Array([-.5,-.5,0,.5,-.5,0,.5,.5,0,-.5,.5,0]),cn=new Float32Array([0,0,1,0,1,1,0,1]),un=new WeakMap,dn=new WeakMap;function fn(t){let e=un.get(t);return void 0!==e&&e.length===t.length/3*2||(e=new Float32Array(t.length/3*2),un.set(t,e)),e}const pn=new Uint32Array([0,1,2,0,2,3]);function mn(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}function yn(t){const e=t?.sideAxis;return e?{sideAxis:[e.x,e.y,e.z]}:{}}function gn(t){if(Array.isArray(t))return{sideAxis:new H(Number(t[0])||0,Number(t[1])||0,Number(t[2])||0)};if(t&&"object"==typeof t){const e=t;return{sideAxis:new H(e.x??0,e.y??0,e.z??0)}}return{}}class vn{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=vn.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=vn.nonZeroPivot(t),this.neededToUpdateRender=!0}get lighting(){return this.rendererSettings.lighting??"fixed"}set lighting(t){this.rendererSettings.lighting=vn.validLighting(t),this.neededToUpdateRender=!0}get rim(){return this.rendererSettings.rim}set rim(t){this.rendererSettings.rim=vs(t),this.neededToUpdateRender=!0}get mapUV(){return this.rendererSettings.mapUV}set mapUV(t){this.rendererSettings.mapUV=Cs(t),this.neededToUpdateRender=!0}get gradientMap(){return this.rendererSettings.gradientMap}set gradientMap(t){this.rendererSettings.gradientMap=zs(t),this.neededToUpdateRender=!0}get erosion(){return this.rendererSettings.erosion}set erosion(t){this.rendererSettings.erosion=Vs(t),this.neededToUpdateRender=!0}get uvDistortion(){return this.rendererSettings.uvDistortion}set uvDistortion(t){this.rendererSettings.uvDistortion=Os(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;const e=this.rendererSettings,i=t.length/3*2,s=e.instancingGeometry;e.instancingGeometry=t,e.instancingUVs?.length===i&&e.instancingUVs!==un.get(s)||(e.instancingUVs=fn(t)),!e.instancingNormals||e.instancingNormals.length===t.length&&e.instancingNormals!==dn.get(s)||(e.instancingNormals=vn.createFallbackNormals(t)),e.instancingUVs2&&e.instancingUVs2.length!==i&&(e.instancingUVs2=void 0),this.neededToUpdateRender=!0}get instancingUVs(){return this.rendererSettings.instancingUVs??fn(this.rendererSettings.instancingGeometry)}set instancingUVs(t){this.rendererSettings.instancingUVs=t,this.neededToUpdateRender=!0}get instancingUVs2(){return this.rendererSettings.instancingUVs2}set instancingUVs2(t){this.rendererSettings.instancingUVs2=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 At(0)),t){case exports.RenderMode.Trail:this.rendererEmitterSettings={startLength:new At(30),followLocalOrigin:!1},e=!0;break;case exports.RenderMode.Mesh:this.rendererEmitterSettings={},this.startRotation=new Ut(new H(0,1,0),new At(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 At(0),this.looping=t.looping??!0,this.prewarm=t.prewarm??!1,this.startLife=t.startLife??new At(5),this.startSpeed=t.startSpeed??new At(0),this.startRotation=t.startRotation??new At(0),this.startSize=t.startSize??new At(1),this.startColor=t.startColor??new jt(new Mt(1,1,1,1)),this.emissionOverTime=t.emissionOverTime??new At(10),this.emissionOverDistance=t.emissionOverDistance??new At(0),this.emissionBursts=t.emissionBursts??[],this.maxParticles=t.maxParticles,this.onlyUsedByOther=t.onlyUsedByOther??!1,this.emitterShape=t.shape??new Ai,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}this.rendererSettings={instancingGeometry:t.instancingGeometry??ln,instancingIndices:t.instancingIndices??pn,instancingUVs:t.instancingUVs??(t.instancingGeometry?fn(t.instancingGeometry):cn),instancingUVs2:t.instancingUVs2,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??n.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:vn.nonZeroPivot(t.pivot),sortMode:vn.validSortMode(t.sortMode),minParticleSize:Math.max(0,t.minParticleSize??0),maxParticleSize:t.maxParticleSize??1/0,renderingGroupId:t.renderingGroupId??0,applyFog:t.applyFog??!0,lighting:vn.validLighting(t.lighting),rim:vs(t.rim),mapUV:Cs(t.mapUV),gradientMap:zs(t.gradientMap),erosion:Vs(t.erosion),uvDistortion:Os(t.uvDistortion)},this.flip=vn.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=vn.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 At(0),this.emitter=new Ls(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,n="number"==typeof s?.level?s.level:1,r=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:n;let c=t?.reflectionAtlas??e.reflectionAtlas??this.rendererSettings.reflectionAtlas??null;!c&&s?.isCube&&(c=Gs(s),!c&&this.sceneRef&&(Ys(s,this.sceneRef,e=>{this.rendererSettings.reflectionAtlas!==e&&(this.rendererSettings.reflectionAtlas=e,t&&null==t.reflectionAtlas&&(t.reflectionAtlas=e),this.neededToUpdateRender=!0)}),c=Gs(s))),this.rendererSettings.reflectionAtlas=c,this.rendererSettings.reflectionFaces=6===t?.reflectionFaces?.length?t.reflectionFaces:null,this.rendererSettings.materialBlendMode=r,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))}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=sn,n=nn;i.decompose(s,tn,n);const r=this.behaviors,o=r.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,f=e.time/this.duration,p=h?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(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,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),l){const e=t;if(this.startRotation.startGen(t.memory),c)e.rotation instanceof Z||(e.rotation=en),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&&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(n).abs(),t.size.copy(t.startSize),"hierarchy"===this.scalingMode?t.velocity.multiply(this.hierarchyScale).applyQuaternion(tn):t.velocity.multiply(n).applyMatrix3(this.normalMatrix),t.rotation&&t.rotation instanceof Z&&t.rotation.multiplyQuaternions(tn,t.rotation)):this.onlyUsedByOther&&(t.parentMatrix=i);for(let e=0;e<o;e++)r[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;sn.copy(i).divideScalar(Math.sqrt(s)),tn.setFromUnitVectors(Ks,sn),e.multiplyQuaternions(tn,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()+vn.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/rn-1e-9)));return void(this.simulationAccumulator-=e*rn)}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 n=Math.min(8,Math.max(0,Math.round(this.simulationAccumulator/rn-1e-9)));for(let t=0;t<n&&(this.simulateStep(rn),!(e!==1/0&&t+1<n&&performance.now()>=e));t++);this.simulationAccumulator-=n*rn}catchUp(t){let e=Math.floor(this.pendingCatchUp/rn);for(this.pendingCatchUp=0;e-- >0&&(this.simulateStep(rn),!(e>0&&performance.now()>=t)););}storeBounds(t,e,i,s,n,r,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*rn*(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,n),this.boundsMax.set(r,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 n=this.boundsPadding;return t.set(i.x-n,i.y-n,i.z-n),e.set(s.x+n,s.y+n,s.z+n),!0}const n=this.emitter.matrixWorld.elements,r=Math.sqrt(Math.max(n[0]*n[0]+n[1]*n[1]+n[2]*n[2],n[4]*n[4]+n[5]*n[5]+n[6]*n[6],n[8]*n[8]+n[9]*n[9]+n[10]*n[10])),o=this.boundsPadding*r;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,r=2&t?s.y:i.y,o=4&t?s.z:i.z,f=1/(n[3]*e+n[7]*r+n[11]*o+n[15]),p=(n[0]*e+n[4]*r+n[8]*o+n[12])*f,m=(n[1]*e+n[5]*r+n[9]*o+n[13])*f,y=(n[2]*e+n[6]*r+n[10]*o+n[14])*f;p<a&&(a=p),p>c&&(c=p),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,n,r,o){this.boundsMin.set(t,e,i),this.boundsMax.set(s,n,r),this.boundsPadding=o,this.boundsInWorld=!0,this.boundsValid=!0}get simulationStep(){return rn}get simulationResidual(){return this.paused?0:this.simulationAccumulator>rn?rn:this.simulationAccumulator<-rn?-rn: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 n=t[e].type;on.has(n)?i=!0:an.has(n)?s=!0:hn.has(n)||(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,n=this.rendererSettings.renderMode===exports.RenderMode.Trail,r=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)),r&&(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 n=0;n<h.length;n++){const r=h[n],o=r.behaviors;for(let e=0;e<o.length;e++)o[e].frameUpdate(t);if(0===s)continue;if(void 0!==r.run){r.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(!n){const i=d.position,s=d.velocity,n=d.previousSize,r=d.size,o=d.previousColor,a=d.color,h=l,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,V=g?0:this.boundsMaxSize,T=g?0:this.boundsMaxSpeedSq;for(let l=0;l<m;l++){const c=l*p;let v=f[c+Me.AGE];const x=3*l,P=g||0===v;if(0===v&&(h&&(n[x]=r[x],n[x+1]=r[x+1],n[x+2]=r[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*f[c+Me.SPEED_MODIFIER],A=s[x],C=s[x+1],F=s[x+2],B=i[x]+A*O,$=i[x+1]+C*O,I=i[x+2]+F*O;if(i[x]=B,i[x+1]=$,i[x+2]=I,P&&(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),V=Math.max(V,Math.max(r[x],Math.max(r[x+1],r[x+2])))),T=Math.max(T,A*A+C*C+F*F),v+=t,f[c+Me.AGE]=v,v>=f[c+Me.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,g,S,b,w,M,z,_,V,T),void this.notifyFinished()}if(s>0){const t=o.previousSize,e=o.size,i=o.previousColor,n=o.color;for(let r=0,o=0,a=0,h=0;r<s;r++,o+=3,a+=4,h+=p)0===f[h+Me.AGE]&&(l&&(t[o]=e[o],t[o+1]=e[o+1],t[o+2]=e[o+2]),c&&(i[a]=n[a],i[a+1]=n[a+1],i[a+2]=n[a+2],i[a+3]=n[a+3]))}if(this.rendererEmitterSettings.followLocalOrigin){const i=this.emitter.matrixWorld;for(let n=0;n<s;n++){const s=e[n];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 n=0,r=0,o=0;n<s;n++,r+=3,o+=p){const s=t*f[o+Me.SPEED_MODIFIER];e[r]+=i[r]*s,e[r+1]+=i[r+1]*s,e[r+2]+=i[r+2]*s,f[o+Me.AGE]+=t}}{const t=this.rendererEmitterSettings,i=t.dieWithParticle,n=t.recordWorldSpace&&!this.worldSpace,r=this.emitter.matrixWorld,o=t.sideAxis,a=this.worldSpace||Boolean(t.recordWorldSpace);for(let t=0;t<s;t++){const s=e[t];if(i&&s.age>=s.life)s.resetHistory();else{if(s.update(),n&&s.age<=s.life){const t=(s.historyHead+s.historyCapacity-1)%s.historyCapacity*3,e=s.historyPositions;sn.set(e[t],e[t+1],e[t+2]),sn.applyMatrix4(s.parentMatrix??r),e[t]=sn.x,e[t+1]=sn.y,e[t+2]=sn.z}if(o&&s.age<=s.life){s.ensureSideHistory();const t=(s.historyHead+s.historyCapacity-1)%s.historyCapacity*3,e=s.historySides;let i=o.x,n=o.y,h=o.z;if(a){const t=(s.parentMatrix??r).elements,e=t[0]*i+t[4]*n+t[8]*h,o=t[1]*i+t[5]*n+t[9]*h;h=t[2]*i+t[6]*n+t[10]*h,i=e,n=o}e[t]=i,e[t+1]=n,e[t+2]=h}}}}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,n=e[s];e[t]=n,e[s]=i,t!==s&&(d.swapRows(t,s),n.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,n=t.time,r=t.burstWaves??(t.burstWaves=[]);for(;t.burstIndex<s&&i[t.burstIndex].time<=n;)r[t.burstIndex]=0,t.burstIndex++;const o=t.burstIndex;for(let s=0;s<o;s++){const o=i[s],a=vn.burstWaveCount(o);let h=r[s]??0;if(h>=a)continue;const l=vn.burstInterval(o);for(;h<a;){const i=o.time+h*l;if(h>0&&i>this.duration){h=a;break}if(i>n)break;t.burstWaveIndex=h,this.fireBurstWave(o,t,e),h++}r[s]=h}}fireBurstWave(t,e,i){if(S()>=t.probability)return;const s=t.count.genValue(this.memory,this.time),n=this.emissionFactor(),r=Math.abs(n-1)<.001?s:Math.floor(s*n+S());e.isBursting=!0,e.burstParticleCount=r,this.spawn(r,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],n=e[s]??0;if(n<vn.burstWaveCount(t)&&(0===n||t.time+n*vn.burstInterval(t)<=this.duration))return!0}return!1}spawnAlongPath(t,e,i,s,n,r,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*r-n,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){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 n=this.emissionBursts.length,r=this.emissionFactor();n>0&&!s&&this.emitBursts(e,i);let o=0,a=0,h=0,l=0;const c=e.previousWorldPos;if(!this.emitEnded){const s=e.time/this.duration;if(e.waitEmiting+=t*this.emissionOverTime.genValue(this.memory,s)*r,void 0!==c){this.temp.set(i.elements[12],i.elements[13],i.elements[14]),l=c.distanceTo(this.temp),h=e.travelDistance,e.travelDistance+=l;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&&l>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,h,a,l),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),n=this.ensureMaterialMeta(i),r=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:r,material:n,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 r=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 At(30),followLocalOrigin:e?.followLocalOrigin??!1,...mn(e),...gn(e?.sideAxis)}}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=t=>"string"==typeof t?e.textures?.[t]??null:t??null,u=a?.erosion,d=a?.gradientMap,f=a?.uvDistortion,p="string"==typeof t.instancingGeometry?e.geometries?.[t.instancingGeometry]:t.instancingGeometry,m=vn.resolveGeometryData(p),y=new vn({scene:s,autoDestroy:t.autoDestroy,looping:t.looping,prewarm:t.prewarm,duration:t.duration,startDelay:t.startDelay?It(t.startDelay):void 0,shape:r,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 At(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:m.positions,instancingIndices:m.indices,instancingUVs:m.uvs,instancingUVs2:m.uvs2,instancingNormals:m.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:vn.validCullingMode(t.cullingMode),scalingMode:"hierarchy"===t.scalingMode?"hierarchy":"shape",seed:"number"==typeof t.seed?t.seed:void 0,sortMode:vn.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??n.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 At(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,mapUV:a?.mapUV,gradientMap:d&&"object"==typeof d?{...d,ramp:c(d.ramp)}:void 0,erosion:u&&"object"==typeof u?{...u,mask:c(u.mask)}:void 0,uvDistortion:f&&"object"==typeof f?{...f,map:c(f.map)}:void 0});return y.behaviors=(t.behaviors??[]).map(t=>{const e=ni(t,y);return e&&"EmitSubParticleSystem"===e.type&&(i[t.subParticleSystem]=e),e}).filter(t=>null!==t),y}static nextSerializationId(t){return vn.serializationCounter+=1,`${t}_${vn.serializationCounter}`}static createFallbackNormals(t){let e=dn.get(t);if(!e){e=new Float32Array(t.length);for(let t=2;t<e.length;t+=3)e[t]=1;dn.set(t,e)}return e}toRendererSettingsJSON(){return this.renderMode===exports.RenderMode.Trail?{startLength:this.rendererEmitterSettings.startLength.toJSON(),followLocalOrigin:this.rendererEmitterSettings.followLocalOrigin,...mn(this.rendererEmitterSettings),...yn(this.rendererEmitterSettings)}:this.renderMode===exports.RenderMode.StretchedBillBoard?{speedFactor:this.rendererEmitterSettings.speedFactor,lengthFactor:this.rendererEmitterSettings.lengthFactor}:{}}ensureGeometryMeta(t){const e=vn.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,...this.rendererSettings.instancingUVs2?{uvs2:Array.from(this.rendererSettings.instancingUVs2)}:{},normals:this.rendererSettings.instancingNormals?Array.from(this.rendererSettings.instancingNormals):void 0},e}ensureMaterialMeta(t){const e=this.rendererSettings.texture;let i;e&&(i=vn.nextSerializationId("quarks_texture"),t.textures[i]=e);const s=this.rendererSettings.reflectionAtlas;let n;s instanceof y.Texture&&(n=vn.nextSerializationId("quarks_texture"),t.textures[n]=s);const r=e=>{if(!(e instanceof y.Texture))return;const i=vn.nextSerializationId("quarks_texture");return t.textures[i]=e,i},o=this.erosion,a=this.uvDistortion,h=this.gradientMap,l=(t,e)=>void 0!==e?{[t]:e}:{},c=vn.nextSerializationId("quarks_material");return t.materials[c]={uuid:c,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:n,reflectionLevel:this.rendererSettings.reflectionLevel,..."fixed"!==this.lighting?{lighting:this.lighting}:{},...this.rim?{rim:{...this.rim,color:[...this.rim.color]}}:{},...l("mapUV",this.mapUV?ws(this.mapUV):void 0),...h?{gradientMap:{ramp:r(h.ramp),..."r"!==h.channel?{channel:h.channel}:{}}}:{},...o?{erosion:{mask:r(o.mask),...l("maskUV",ws(o.maskUV)),softness:o.softness,edgeWidth:o.edgeWidth,edgeColor:[...o.edgeColor]}}:{},...a?{uvDistortion:{map:r(a.map),...l("mapUV",ws(a.mapUV,Ps)),strength:a.strength}}:{},sourceMaterial:this.materialRef??void 0},c}static resolveGeometryData(t){if(t?.positions){const e=t.positions instanceof Float32Array?t.positions:new Float32Array(t.positions);return{positions:e,indices:Hs(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,uvs2:t.uvs2?t.uvs2 instanceof Float32Array?t.uvs2:new Float32Array(t.uvs2):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:Hs(t,i),uvs:e.attributes.uv?.array?new Float32Array(e.attributes.uv.array):void 0,uvs2:(e.attributes.uv1??e.attributes.uv2)?.array?new Float32Array((e.attributes.uv1??e.attributes.uv2).array):void 0,normals:e.attributes.normal?.array?new Float32Array(e.attributes.normal.array):void 0}}return{positions:ln,indices:pn,uvs:cn}}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,...mn(this.rendererEmitterSettings),...this.rendererEmitterSettings.sideAxis?{sideAxis:this.rendererEmitterSettings.sideAxis.clone()}:{}}:this.renderMode===exports.RenderMode.StretchedBillBoard?{lengthFactor:this.rendererEmitterSettings.lengthFactor,speedFactor:this.rendererEmitterSettings.speedFactor}:{};const i=new vn({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,instancingUVs2:this.rendererSettings.instancingUVs2,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,mapUV:this.mapUV,gradientMap:this.gradientMap,erosion:this.erosion,uvDistortion:this.uvDistortion,scene:this.emitter.getScene()});for(const e of t)e instanceof ge&&(e.particleSystem=i);return this.tint&&(i.tint=this.tint.clone()),i}}vn.serializationCounter=0,vn.catchUpBudgetMs=2;class xn 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 n={startTime:e,duration:i>0?i:t.system.duration,type:"ps",loop:s,target:t};return this.animationData.push(n),this.pause(),this.updateDuration(),n}addThreeAnimation(t,e,i=0,s=e?.duration??0,n=!1,r){const o={startTime:i,duration:s>0?s:e?.duration??0,type:"three",loop:n,target:t,clip:e,clipUUID:r??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 Ls?t.target.system.pause():t.clip?.pause?.()}))}stop(){this.pause(),this.currentTime=-1e-5,this.animationData.forEach(t=>{"ps"===t.type&&t.target instanceof Ls?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,n=this.currentTime>=e&&this.currentTime<=i,r=s>=e&&s<=i;if(!n||r){if(!n&&r){if(t.loop&&"ps"===t.type&&t.target instanceof Ls)return void t.target.system.restart();"ps"===t.type&&t.target instanceof Ls?t.target.system.endEmit():t.loop?t.clip?.play?.():t.clip?.stop?.()}}else"ps"===t.type&&t.target instanceof Ls?(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,n=i.startTime+i.duration,r=this.currentTime>=s&&this.currentTime<n,o=e>=s&&e<n;!r||o?r||!o?r&&"three"===i.type&&i.clip?.setTime?.(Math.max(t-s,0)):"ps"===i.type&&i.target instanceof Ls?i.target.system.endEmit():i.clip?.stop?.():"ps"===i.type&&i.target instanceof Ls?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 n=t.getChildren();for(const t of n)t instanceof s.TransformNode&&i(t)};i(t),this._tempAnimationJSON.forEach(t=>{const i=e[t.targetUUID];if("ps"===t.type&&i instanceof Ls)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 xn(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 Sn=new WeakMap,bn=new WeakMap,wn=new WeakMap;function Mn(t,e){let i=t.get(e);return void 0===i&&(i=new Map,t.set(e,i)),i}class zn{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 zn.mapPool(t,e.concurrency,async(i,s)=>{try{return await this.fetchEffectDocument(i)}catch(n){if(!e.continueOnError)throw n;return console.warn(`[QuarksLoader] Failed to fetch effect "${i}" (${s+1}/${t.length}):`,n),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 zn.resolveLinkedResources(t,{baseUrl:e,resolver:this.options.resolver,scene:this.scene})}static async resolveLinkedResources(t,e={}){const i=e.baseUrl??"",s=e.resolver,n=e.scene;await zn.inlineGeometryEntries(t,async t=>{const e=await zn.resolveWith(s,t,"geometry",i);return zn.fetchJsonWith(s,e,n)});const r=Array.isArray(t?.images)?t.images:[];await Promise.all(r.map(async t=>{"string"==typeof t?.url&&t.url&&(t.url=await zn.resolveWith(s,t.url,"image",i))}))}static async resolveExternalGeometries(t,e){await zn.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,uvs2:i.uvs2?new Float32Array(i.uvs2):void 0,normals:i.normals?new Float32Array(i.normals):void 0}))}share(t){if(!1===this.options.shareResources)return t;const e=Mn(bn,this.scene),i=function(t){let e=2166136261,i=2654435769;const s=[t.positions,t.indices,t.uvs,t.uvs2,t.normals];let n="";for(const t of s){if(void 0===t){n+="-,";continue}const s=new Uint8Array(t.buffer,t.byteOffset,t.byteLength);n+=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`${n}${(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){Sn.delete(t),bn.delete(t),wn.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)),n=t.phiStart??0,r=t.phiLength??2*Math.PI,o=t.thetaStart??0,a=t.thetaLength??Math.PI,h=[],l=[],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=n+s*r,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 g=Math.hypot(a,d,y)||1;l.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],n=d[t][e],r=d[t+1][e],o=d[t+1][e+1];0===t&&p||u.push(i,n,o),t===s-1&&m||u.push(n,r,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,n=new Float32Array(0),r=new Uint32Array(0);const o=t.attributes?.uv1??t.attributes?.uv2;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&&(n=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(o?.isInterleavedBufferAttribute){const t=r[o.data];t&&(i=this.extractInterleavedAttribute(t.data,t.stride,o.offset,o.itemSize))}if(t.attributes.normal?.isInterleavedBufferAttribute){const e=t.attributes.normal,i=r[e.data];i&&(s=this.extractInterleavedAttribute(i.data,i.stride,e.offset,e.itemSize))}}}else t.attributes&&(t.attributes.position?.array&&(n=new Float32Array(t.attributes.position.array)),t.attributes.uv?.array&&(e=new Float32Array(t.attributes.uv.array)),o?.array&&(i=new Float32Array(o.array)),t.attributes.normal?.array&&(s=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=Hs(n,r),{positions:n,indices:r,uvs:e,uvs2:i,normals:s}}extractInterleavedAttribute(t,e,i,s){const n=Math.floor(t.length/e),r=new Float32Array(n*s);for(let o=0;o<n;o++)for(let n=0;n<s;n++)r[o*s+n]=t[o*e+i+n];return r}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 zn.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 zn.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),n=new Array(i).fill(!1);let r=0;const o=(t,o)=>{n[t]||(n[t]=!0,s[t]=o,r++,e.onProgress?.(r,i))};await Promise.all(t.map(async(s,n)=>{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 ${n+1}/${i}:`,s),t[n]=null,o(n,null)}}));for(let s=0;s<i;s++){if(n[s])continue;const r=t[s];if(r)try{o(s,this.parse(r.json,r.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,n=new Array(t.length);let r=0;const o=Math.min(s,t.length);return await Promise.all(Array.from({length:o},()=>(async()=>{for(;r<t.length;){const e=r++;n[e]=await i(t[e],e)}})())),n}static async resolveWith(t,e,i,s){return t?.resolve?t.resolve(e,i,s):zn.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 n=Mn(wn,i),r=`json|${e}`;let o=n.get(r);return void 0===o&&(o=s().catch(t=>{throw n.get(r)===o&&n.delete(r),t}),n.set(r,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","uvs2","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&&zn.warnIfNotAnImageUrl(i.url),this._images[i.uuid]=i.url?zn.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,n=!!s.noMipmap,r=!1!==this.options.shareResources,o=r?[i,n,s.samplingMode,s.wrap,s.repeat,s.offset,s.rotation].join("|")+"|"+t:"",a=r?Mn(Sn,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:n,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 r=i.reflectionAtlas;if(r&&(t.reflectionAtlas=e.textures[r]||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),i.mapUV&&"object"==typeof i.mapUV&&(t.mapUV=i.mapUV),i.gradientMap&&"object"==typeof i.gradientMap&&(t.gradientMap={...i.gradientMap,ramp:i.gradientMap.ramp&&e.textures[i.gradientMap.ramp]||null}),i.erosion&&"object"==typeof i.erosion&&(t.erosion={...i.erosion,mask:i.erosion.mask&&e.textures[i.erosion.mask]||null}),i.uvDistortion&&"object"==typeof i.uvDistortion&&(t.uvDistortion={...i.uvDistortion,map:i.uvDistortion.map&&e.textures[i.uvDistortion.map]||null}),"number"==typeof i.alphaMode)t.alphaMode=i.alphaMode;else{const e={1:n.Constants.ALPHA_COMBINE,2:n.Constants.ALPHA_ADD,3:n.Constants.ALPHA_SUBTRACT,4:n.Constants.ALPHA_MULTIPLY};t.alphaMode=e[i.blending]||n.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.uvs2&&s.uvs2.length>0&&(t.uvs2=s.uvs2),s.normals&&s.normals.length>0&&(t.normals=s.normals),t.applyToMesh(i,!0)}const r=this.getMaterial(e,t.material);if(r){const t=new v.StandardMaterial(`quarks_loader_material_${r.uuid}`,this.scene);t.alphaMode=r.alphaMode??n.Constants.ALPHA_COMBINE,t.backFaceCulling=2!==r.side,t.alphaCutOff=r.alphaTest??0,t.disableDepthWrite=!r.depthWrite,r.texture&&(t.diffuseTexture=r.texture,t.opacityTexture=r.texture),i.material=t}return i}parseObject(t,e){let i;switch(t.type){case"QuarksPrefab":i=xn.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),n=a.Quaternion.Identity(),r=new a.Vector3(0,0,0);e.decompose(s,n,r),i.position.copyFrom(r),i.scaling.copyFrom(s),i.rotationQuaternion=n}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=vn.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 n=i=>{if(i instanceof xn&&i.resolveReferences(t),i instanceof Ls){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 ge){const n=t.behaviors[s],r=n.subParticleSystem;if("string"!=typeof r)continue;const o=e[r];o instanceof Ls?(n.subParticleSystem=o,o.system.onlyUsedByOther=!0):(n.subParticleSystem=void 0,""!==r&&console.warn(`[QuarksLoader] Emitter "${i.name}" has a sub emitter targeting "${r}", `+(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&&n(t)};n(t)}}Di(),Ii(Ei),exports.ApplyCollision=Ot,exports.ApplyForce=ie,exports.ApplySequences=re,exports.AxisAngleGenerator=Ut,exports.BatchedParticleRenderer=Ds,exports.BatchedRenderer=Rs,exports.BehaviorFromJSON=ni,exports.BehaviorTypes=si,exports.Bezier=Ft,exports.BoxEmitter=Si,exports.ChangeEmitDirection=oe,exports.CircleEmitter=Mi,exports.ColorBySpeed=ae,exports.ColorGeneratorFromJSON=Yt,exports.ColorOverLife=he,exports.ColorRange=Lt,exports.ConeEmitter=zi,exports.ConstantColor=jt,exports.ConstantValue=At,exports.DEG2RAD=V,exports.DonutEmitter=_i,exports.EdgeEmitter=Vi,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(qs.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),qs.restart(i),qs.play(i),i)}stop(t){this.playing.has(t)&&qs.endEmit(t)}release(t){this.playing.delete(t)&&(qs.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=qs.instantiate(this.template),e=[];return qs.runOnAllParticleEmitters(t,t=>{const i=t.system;i.autoDestroy=!1,i.addEventListener("finished",this.onSystemFinished),e.push(i)}),this.systemsOf.set(t,e),qs.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=Fi,exports.Euler=ft,exports.EulerGenerator=Xt,exports.ForceOverLife=ve,exports.FrameOverLife=xe,exports.GRADIENT_MAP_WEIGHTS=Ms,exports.GeneratorFromJSON=ee,exports.Gradient=Jt,exports.GravityForce=Se,exports.GridEmitter=Ti,exports.HemisphereEmitter=Pi,exports.InheritVelocity=be,exports.IntervalValue=Ct,exports.LimitSpeedOverLife=we,exports.MathUtils=X,exports.Matrix3=pt,exports.Matrix4=st,exports.MeshSurfaceEmitter=Ui,exports.MeshSurfaceEmitterPlugin=Ei,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=Ne,exports.OrbitOverLife=Re,exports.ParticleEmitter=Ls,exports.ParticleMeshPhysicsMaterial=Zs,exports.ParticleMeshStandardMaterial=Xs,exports.ParticleStore=Me,exports.ParticleSystem=vn,exports.PiecewiseBezier=$t,exports.PiecewiseFunction=Bt,exports.Plugins=$i,exports.PointEmitter=Oi,exports.QuarksLoader=zn,exports.QuarksPrefab=xn,exports.QuarksUtil=qs,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=Ci,exports.Rotation3DOverLife=De,exports.RotationBySpeed=Le,exports.RotationGeneratorFromJSON=Ht,exports.RotationOverLife=qe,exports.SequencerFromJSON=ne,exports.ShapeTransform=wi,exports.SizeBySpeed=ke,exports.SizeOverLife=Je,exports.SpeedOverLife=Qe,exports.SphereEmitter=Ai,exports.SpriteBatch=Is,exports.SpriteParticle=Ke,exports.SubEmitterInheritMask=me,exports.TextureSequencer=se,exports.TrailBatch=Ns,exports.TrailParticle=ei,exports.TurbulenceField=Ge,exports.UV_DISTORTION_DEFAULT_UV=Ps,exports.VFXBatch=$s,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){ks.set(t,e)},exports.ceilPowerOfTwo=Q,exports.clamp=O,exports.createEnvAtlasFromFaceUrls=Ws,exports.createSeededRandom=M,exports.cubeFaceUrls=Qs,exports.damp=$,exports.defaultMeshLighting=gs,exports.degToRad=q,exports.denormalize=j,exports.ensureEnvAtlasFromCube=Ys,exports.erosionEqual=Ts,exports.euclideanModulo=A,exports.floorPowerOfTwo=G,exports.generateUUID=P,exports.getCachedEnvAtlas=Gs,exports.getPhysicsResolver=Pt,exports.getRandomSource=b,exports.getRegisteredShaderChunks=function(){return Ni},exports.getShaderChunk=function(t){return Ni[t]},exports.getValueFromEmitterMode=bi,exports.gradientMapEqual=_s,exports.inverseLerp=F,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=C,exports.mapUVEqual=Fs,exports.meshRimEqual=xs,exports.normalize=Y,exports.normalizeErosion=Vs,exports.normalizeGradientMap=zs,exports.normalizeMapUV=Cs,exports.normalizeMeshRim=vs,exports.normalizeTextureUV=Ss,exports.normalizeUVDistortion=Os,exports.particleFragShader=ts,exports.particlePhysicsFragShader=es,exports.particleVertShader=is,exports.pingpong=I,exports.planBehaviorFusion=gi,exports.radToDeg=k,exports.randFloat=R,exports.randFloatSpread=D,exports.randInt=N,exports.random=S,exports.readsUV1=Bs,exports.registerShaderChunks=Di,exports.seededRandom=L,exports.setPhysicsResolver=function(t){Tt=t},exports.setQuaternionFromProperEuler=W,exports.setRandomSource=w,exports.smootherstep=E,exports.smoothstep=U,exports.stretchedBillboardVertShader=ss,exports.subEmitterInheritMask=ye,exports.textureUVEqual=bs,exports.textureUVToJSON=ws,exports.trailFragShader=ns,exports.trailVertShader=rs,exports.unloadPlugin=function(t){const e=$i.find(e=>e.id===t);if(e){for(const t of e.emitterShapes)Fi[t.type]&&delete Fi[t.type];for(const t of e.behaviors)si[t.type]&&delete si[t.type]}},exports.uvDistortionEqual=As,exports.withRandomSource=function(t,e){const i=w(t);try{return e()}finally{w(i)}};
|
|
1
|
+
"use strict";var t=require("@babylonjs/core/Buffers/buffer.js"),e=require("@babylonjs/core/Misc/guid.js"),s=require("@babylonjs/core/Maths/math.frustum.js"),i=require("@babylonjs/core/Maths/math.plane.js"),n=require("@babylonjs/core/Meshes/transformNode.js"),r=require("@babylonjs/core/Engines/constants.js"),o=require("@babylonjs/core/Culling/boundingInfo.js"),a=require("@babylonjs/core/Materials/Textures/baseTexture.js"),h=require("@babylonjs/core/Materials/shaderMaterial.js"),l=require("@babylonjs/core/Maths/math.color.js"),c=require("@babylonjs/core/Maths/math.vector.js"),u=require("@babylonjs/core/Meshes/mesh.js"),d=require("@babylonjs/core/scene.js"),f=require("@babylonjs/core/Cameras/camera.js"),p=require("@babylonjs/core/Materials/Textures/rawTexture.js"),m=require("@babylonjs/core/Meshes/mesh.vertexData.js"),y=require("@babylonjs/core/Engines/shaderStore.js"),g=require("@babylonjs/core/Materials/effect.js"),v=require("@babylonjs/core/Materials/shaderLanguage.js"),x=require("@babylonjs/core/Materials/Textures/texture.js"),S=require("@babylonjs/core/Materials/standardMaterial.js"),w=require("@babylonjs/core/Meshes/instancedMesh.js");let b=null;function M(){return null===b?Math.random():b()}function z(){return b??Math.random}function _(t){const e=z();return b=t,e}function V(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 A=["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 T=1234567;const O=Math.PI/180,$=180/Math.PI;function P(){const t=4294967295*Math.random()|0,e=4294967295*Math.random()|0,s=4294967295*Math.random()|0,i=4294967295*Math.random()|0;return(A[255&t]+A[t>>8&255]+A[t>>16&255]+A[t>>24&255]+"-"+A[255&e]+A[e>>8&255]+"-"+A[e>>16&15|64]+A[e>>24&255]+"-"+A[63&s|128]+A[s>>8&255]+"-"+A[s>>16&255]+A[s>>24&255]+A[255&i]+A[i>>8&255]+A[i>>16&255]+A[i>>24&255]).toLowerCase()}function C(t,e,s){return Math.max(e,Math.min(s,t))}function E(t,e){return(t%e+e)%e}function F(t,e,s,i,n){return i+(t-e)*(n-i)/(s-e)}function B(t,e,s){return t!==e?(s-t)/(e-t):0}function I(t,e,s){return(1-s)*t+s*e}function U(t,e,s,i){return I(t,e,1-Math.exp(-s*i))}function N(t,e=1){return e-Math.abs(E(t,2*e)-e)}function R(t,e,s){return t<=e?0:t>=s?1:(t=(t-e)/(s-e))*t*(3-2*t)}function D(t,e,s){return t<=e?0:t>=s?1:(t=(t-e)/(s-e))*t*t*(t*(6*t-15)+10)}function k(t,e){return t+Math.floor(M()*(e-t+1))}function L(t,e){return t+M()*(e-t)}function q(t){return t*(.5-M())}function J(t){void 0!==t&&(T=t);let e=T+=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 W(t){return t*O}function G(t){return t*$}function Q(t){return!(t&t-1)&&0!==t}function j(t){return Math.pow(2,Math.ceil(Math.log(t)/Math.LN2))}function H(t){return Math.pow(2,Math.floor(Math.log(t)/Math.LN2))}function Y(t,e,s,i,n){const r=Math.cos,o=Math.sin,a=r(s/2),h=o(s/2),l=r((e+i)/2),c=o((e+i)/2),u=r((e-i)/2),d=o((e-i)/2),f=r((i-e)/2),p=o((i-e)/2);switch(n){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*p,h*f,a*l);break;case"YXY":t.set(h*f,a*c,h*p,a*l);break;case"ZYZ":t.set(h*p,h*f,a*c,a*l);break;default:console.warn("../math.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: "+n)}}function X(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 Z(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 K={DEG2RAD:O,RAD2DEG:$,generateUUID:P,clamp:C,euclideanModulo:E,mapLinear:F,inverseLerp:B,lerp:I,damp:U,pingpong:N,smoothstep:R,smootherstep:D,randInt:k,randFloat:L,randFloatSpread:q,seededRandom:J,degToRad:W,radToDeg:G,isPowerOfTwo:Q,ceilPowerOfTwo:j,floorPowerOfTwo:H,setQuaternionFromProperEuler:Y,normalize:Z,denormalize:X};class tt{constructor(t=0,e=0,s=0,i=1){this._x=t,this._y=e,this._z=s,this._w=i}static slerpFlat(t,e,s,i,n,r,o){let a=s[i+0],h=s[i+1],l=s[i+2],c=s[i+3];const u=n[r+0],d=n[r+1],f=n[r+2],p=n[r+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]=f,void(t[e+3]=p);if(c!==p||a!==u||h!==d||l!==f){let t=1-o;const e=a*u+h*d+l*f+c*p,s=e>=0?1:-1,i=1-e*e;if(i>Number.EPSILON){const n=Math.sqrt(i),r=Math.atan2(n,e*s);t=Math.sin(t*r)/n,o=Math.sin(o*r)/n}const n=o*s;if(a=a*t+u*n,h=h*t+d*n,l=l*t+f*n,c=c*t+p*n,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,s,i,n,r){const o=s[i],a=s[i+1],h=s[i+2],l=s[i+3],c=n[r],u=n[r+1],d=n[r+2],f=n[r+3];return t[e]=o*f+l*c+a*d-h*u,t[e+1]=a*f+l*u+h*c-o*d,t[e+2]=h*f+l*d+o*u-a*c,t[e+3]=l*f-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,s,i){return this._x=t,this._y=e,this._z=s,this._w=i,this._onChangeCallback(),this}clone(){return new tt(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 s=t._x,i=t._y,n=t._z,r=t._order,o=Math.cos,a=Math.sin,h=o(s/2),l=o(i/2),c=o(n/2),u=a(s/2),d=a(i/2),f=a(n/2);switch(r){case"XYZ":this._x=u*l*c+h*d*f,this._y=h*d*c-u*l*f,this._z=h*l*f+u*d*c,this._w=h*l*c-u*d*f;break;case"YXZ":this._x=u*l*c+h*d*f,this._y=h*d*c-u*l*f,this._z=h*l*f-u*d*c,this._w=h*l*c+u*d*f;break;case"ZXY":this._x=u*l*c-h*d*f,this._y=h*d*c+u*l*f,this._z=h*l*f+u*d*c,this._w=h*l*c-u*d*f;break;case"ZYX":this._x=u*l*c-h*d*f,this._y=h*d*c+u*l*f,this._z=h*l*f-u*d*c,this._w=h*l*c+u*d*f;break;case"YZX":this._x=u*l*c+h*d*f,this._y=h*d*c+u*l*f,this._z=h*l*f-u*d*c,this._w=h*l*c-u*d*f;break;case"XZY":this._x=u*l*c-h*d*f,this._y=h*d*c-u*l*f,this._z=h*l*f+u*d*c,this._w=h*l*c+u*d*f;break;default:console.warn("../math.Quaternion: .setFromEuler() encountered an unknown order: "+r)}return!0===e&&this._onChangeCallback(),this}setFromAxisAngle(t,e){const s=e/2,i=Math.sin(s);return this._x=t.x*i,this._y=t.y*i,this._z=t.z*i,this._w=Math.cos(s),this._onChangeCallback(),this}setFromRotationMatrix(t){const e=t.elements,s=e[0],i=e[4],n=e[8],r=e[1],o=e[5],a=e[9],h=e[2],l=e[6],c=e[10],u=s+o+c;if(u>0){const t=.5/Math.sqrt(u+1);this._w=.25/t,this._x=(l-a)*t,this._y=(n-h)*t,this._z=(r-i)*t}else if(s>o&&s>c){const t=2*Math.sqrt(1+s-o-c);this._w=(l-a)/t,this._x=.25*t,this._y=(i+r)/t,this._z=(n+h)/t}else if(o>c){const t=2*Math.sqrt(1+o-s-c);this._w=(n-h)/t,this._x=(i+r)/t,this._y=.25*t,this._z=(a+l)/t}else{const t=2*Math.sqrt(1+c-s-o);this._w=(r-i)/t,this._x=(n+h)/t,this._y=(a+l)/t,this._z=.25*t}return this._onChangeCallback(),this}setFromUnitVectors(t,e){let s=t.dot(e)+1;return s<Number.EPSILON?(s=0,Math.abs(t.x)>Math.abs(t.z)?(this._x=-t.y,this._y=t.x,this._z=0,this._w=s):(this._x=0,this._y=-t.z,this._z=t.y,this._w=s)):(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=s),this.normalize()}angleTo(t){return 2*Math.acos(Math.abs(C(this.dot(t),-1,1)))}rotateTowards(t,e){const s=this.angleTo(t);if(0===s)return this;const i=Math.min(1,e/s);return this.slerp(t,i),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 s=t._x,i=t._y,n=t._z,r=t._w,o=e._x,a=e._y,h=e._z,l=e._w;return this._x=s*l+r*o+i*h-n*a,this._y=i*l+r*a+n*o-s*h,this._z=n*l+r*h+s*a-i*o,this._w=r*l-s*o-i*a-n*h,this._onChangeCallback(),this}slerp(t,e){if(0===e)return this;if(1===e)return this.copy(t);const s=this._x,i=this._y,n=this._z,r=this._w;let o=r*t._w+s*t._x+i*t._y+n*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=r,this._x=s,this._y=i,this._z=n,this;const a=1-o*o;if(a<=Number.EPSILON){const t=1-e;return this._w=t*r+e*this._w,this._x=t*s+e*this._x,this._y=t*i+e*this._y,this._z=t*n+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=r*c+this._w*u,this._x=s*c+this._x*u,this._y=i*c+this._y*u,this._z=n*c+this._z*u,this._onChangeCallback(),this}slerpQuaternions(t,e,s){return this.copy(t).slerp(e,s)}random(){const t=2*Math.PI*M(),e=2*Math.PI*M(),s=M(),i=Math.sqrt(1-s),n=Math.sqrt(s);return this.set(i*Math.sin(t),i*Math.cos(t),n*Math.sin(e),n*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}}tt.prototype.isQuaternion=!0;class et{constructor(t=0,e=0,s=0){this.x=t,this.y=e,this.z=s}set(t,e,s){return void 0===s&&(s=this.z),this.x=t,this.y=e,this.z=s,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 et(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(it.setFromEuler(t))}applyAxisAngle(t,e){return this.applyQuaternion(it.setFromAxisAngle(t,e))}applyMatrix3(t){const e=this.x,s=this.y,i=this.z,n=t.elements;return this.x=n[0]*e+n[3]*s+n[6]*i,this.y=n[1]*e+n[4]*s+n[7]*i,this.z=n[2]*e+n[5]*s+n[8]*i,this}applyNormalMatrix(t){return this.applyMatrix3(t).normalize()}applyMatrix4(t){const e=this.x,s=this.y,i=this.z,n=t.elements,r=1/(n[3]*e+n[7]*s+n[11]*i+n[15]);return this.x=(n[0]*e+n[4]*s+n[8]*i+n[12])*r,this.y=(n[1]*e+n[5]*s+n[9]*i+n[13])*r,this.z=(n[2]*e+n[6]*s+n[10]*i+n[14])*r,this}applyQuaternion(t){const e=this.x,s=this.y,i=this.z,n=t.x,r=t.y,o=t.z,a=t.w,h=2*(r*i-o*s),l=2*(o*e-n*i),c=2*(n*s-r*e);return this.x=e+a*h+r*c-o*l,this.y=s+a*l+o*h-n*c,this.z=i+a*c+n*l-r*h,this}transformDirection(t){const e=this.x,s=this.y,i=this.z,n=t.elements;return this.x=n[0]*e+n[4]*s+n[8]*i,this.y=n[1]*e+n[5]*s+n[9]*i,this.z=n[2]*e+n[6]*s+n[10]*i,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 s=this.length();return this.divideScalar(s||1).multiplyScalar(Math.max(t,Math.min(e,s)))}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,s){return this.x=t.x+(e.x-t.x)*s,this.y=t.y+(e.y-t.y)*s,this.z=t.z+(e.z-t.z)*s,this}cross(t){return this.crossVectors(this,t)}crossVectors(t,e){const s=t.x,i=t.y,n=t.z,r=e.x,o=e.y,a=e.z;return this.x=i*a-n*o,this.y=n*r-s*a,this.z=s*o-i*r,this}projectOnVector(t){const e=t.lengthSq();if(0===e)return this.set(0,0,0);const s=t.dot(this)/e;return this.copy(t).multiplyScalar(s)}projectOnPlane(t){return st.copy(this).projectOnVector(t),this.sub(st)}reflect(t){return this.sub(st.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 s=this.dot(t)/e;return Math.acos(C(s,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,s=this.y-t.y,i=this.z-t.z;return e*e+s*s+i*i}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)+Math.abs(this.z-t.z)}setFromSphericalCoords(t,e,s){const i=Math.sin(e)*t;return this.x=i*Math.sin(s),this.y=Math.cos(e)*t,this.z=i*Math.cos(s),this}setFromCylindricalCoords(t,e,s){return this.x=t*Math.sin(e),this.y=s,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(),s=this.setFromMatrixColumn(t,1).length(),i=this.setFromMatrixColumn(t,2).length();return this.x=e,this.y=s,this.z=i,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=M(),this.y=M(),this.z=M(),this}randomDirection(){const t=M()*Math.PI*2,e=2*M()-1,s=Math.sqrt(1-e*e);return this.x=s*Math.cos(t),this.y=e,this.z=s*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}}et.prototype.isVector3=!0;const st=new et,it=new tt,nt=2e3,rt=2001;class ot{constructor(t,e,s,i,n,r,o,a,h,l,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,s,i,n,r,o,a,h,l,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,s){return console.error("THREE.Matrix4: .multiplyToArray() has been removed."),this}setRotationFromQuaternion(t){return this.makeRotationFromQuaternion(t)}set(t,e,s,i,n,r,o,a,h,l,c,u,d,f,p,m){const y=this.elements;return y[0]=t,y[4]=e,y[8]=s,y[12]=i,y[1]=n,y[5]=r,y[9]=o,y[13]=a,y[2]=h,y[6]=l,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 ot).fromArray(this.elements)}copy(t){const e=this.elements,s=t.elements;return e[0]=s[0],e[1]=s[1],e[2]=s[2],e[3]=s[3],e[4]=s[4],e[5]=s[5],e[6]=s[6],e[7]=s[7],e[8]=s[8],e[9]=s[9],e[10]=s[10],e[11]=s[11],e[12]=s[12],e[13]=s[13],e[14]=s[14],e[15]=s[15],this}copyPosition(t){const e=this.elements,s=t.elements;return e[12]=s[12],e[13]=s[13],e[14]=s[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,s){return t.setFromMatrixColumn(this,0),e.setFromMatrixColumn(this,1),s.setFromMatrixColumn(this,2),this}makeBasis(t,e,s){return this.set(t.x,e.x,s.x,0,t.y,e.y,s.y,0,t.z,e.z,s.z,0,0,0,0,1),this}extractRotation(t){const e=this.elements,s=t.elements,i=1/at.setFromMatrixColumn(t,0).length(),n=1/at.setFromMatrixColumn(t,1).length(),r=1/at.setFromMatrixColumn(t,2).length();return e[0]=s[0]*i,e[1]=s[1]*i,e[2]=s[2]*i,e[3]=0,e[4]=s[4]*n,e[5]=s[5]*n,e[6]=s[6]*n,e[7]=0,e[8]=s[8]*r,e[9]=s[9]*r,e[10]=s[10]*r,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromEuler(t){const e=this.elements,s=t.x,i=t.y,n=t.z,r=Math.cos(s),o=Math.sin(s),a=Math.cos(i),h=Math.sin(i),l=Math.cos(n),c=Math.sin(n);if("XYZ"===t.order){const t=r*l,s=r*c,i=o*l,n=o*c;e[0]=a*l,e[4]=-a*c,e[8]=h,e[1]=s+i*h,e[5]=t-n*h,e[9]=-o*a,e[2]=n-t*h,e[6]=i+s*h,e[10]=r*a}else if("YXZ"===t.order){const t=a*l,s=a*c,i=h*l,n=h*c;e[0]=t+n*o,e[4]=i*o-s,e[8]=r*h,e[1]=r*c,e[5]=r*l,e[9]=-o,e[2]=s*o-i,e[6]=n+t*o,e[10]=r*a}else if("ZXY"===t.order){const t=a*l,s=a*c,i=h*l,n=h*c;e[0]=t-n*o,e[4]=-r*c,e[8]=i+s*o,e[1]=s+i*o,e[5]=r*l,e[9]=n-t*o,e[2]=-r*h,e[6]=o,e[10]=r*a}else if("ZYX"===t.order){const t=r*l,s=r*c,i=o*l,n=o*c;e[0]=a*l,e[4]=i*h-s,e[8]=t*h+n,e[1]=a*c,e[5]=n*h+t,e[9]=s*h-i,e[2]=-h,e[6]=o*a,e[10]=r*a}else if("YZX"===t.order){const t=r*a,s=r*h,i=o*a,n=o*h;e[0]=a*l,e[4]=n-t*c,e[8]=i*c+s,e[1]=c,e[5]=r*l,e[9]=-o*l,e[2]=-h*l,e[6]=s*c+i,e[10]=t-n*c}else if("XZY"===t.order){const t=r*a,s=r*h,i=o*a,n=o*h;e[0]=a*l,e[4]=-c,e[8]=h*l,e[1]=t*c+n,e[5]=r*l,e[9]=s*c-i,e[2]=i*c-s,e[6]=o*l,e[10]=n*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(lt,t,ct)}lookAt(t,e,s){const i=this.elements;return ft.subVectors(t,e),0===ft.lengthSq()&&(ft.z=1),ft.normalize(),ut.crossVectors(s,ft),0===ut.lengthSq()&&(1===Math.abs(s.z)?ft.x+=1e-4:ft.z+=1e-4,ft.normalize(),ut.crossVectors(s,ft)),ut.normalize(),dt.crossVectors(ft,ut),i[0]=ut.x,i[4]=dt.x,i[8]=ft.x,i[1]=ut.y,i[5]=dt.y,i[9]=ft.y,i[2]=ut.z,i[6]=dt.z,i[10]=ft.z,this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const s=t.elements,i=e.elements,n=this.elements,r=s[0],o=s[4],a=s[8],h=s[12],l=s[1],c=s[5],u=s[9],d=s[13],f=s[2],p=s[6],m=s[10],y=s[14],g=s[3],v=s[7],x=s[11],S=s[15],w=i[0],b=i[4],M=i[8],z=i[12],_=i[1],V=i[5],A=i[9],T=i[13],O=i[2],$=i[6],P=i[10],C=i[14],E=i[3],F=i[7],B=i[11],I=i[15];return n[0]=r*w+o*_+a*O+h*E,n[4]=r*b+o*V+a*$+h*F,n[8]=r*M+o*A+a*P+h*B,n[12]=r*z+o*T+a*C+h*I,n[1]=l*w+c*_+u*O+d*E,n[5]=l*b+c*V+u*$+d*F,n[9]=l*M+c*A+u*P+d*B,n[13]=l*z+c*T+u*C+d*I,n[2]=f*w+p*_+m*O+y*E,n[6]=f*b+p*V+m*$+y*F,n[10]=f*M+p*A+m*P+y*B,n[14]=f*z+p*T+m*C+y*I,n[3]=g*w+v*_+x*O+S*E,n[7]=g*b+v*V+x*$+S*F,n[11]=g*M+v*A+x*P+S*B,n[15]=g*z+v*T+x*C+S*I,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],s=t[4],i=t[8],n=t[12],r=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]*(+n*a*c-i*h*c-n*o*u+s*h*u+i*o*d-s*a*d)+t[7]*(+e*a*d-e*h*u+n*r*u-i*r*d+i*h*l-n*a*l)+t[11]*(+e*h*c-e*o*d-n*r*c+s*r*d+n*o*l-s*h*l)+t[15]*(-i*o*l-e*a*c+e*o*u+i*r*c-s*r*u+s*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,s){const i=this.elements;return t.isVector3?(i[12]=t.x,i[13]=t.y,i[14]=t.z):(i[12]=t,i[13]=e,i[14]=s),this}invert(){const t=this.elements,e=t[0],s=t[1],i=t[2],n=t[3],r=t[4],o=t[5],a=t[6],h=t[7],l=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*h-p*u*h+p*a*d-o*m*d-c*a*y+o*u*y,v=f*u*h-l*m*h-f*a*d+r*m*d+l*a*y-r*u*y,x=l*p*h-f*c*h+f*o*d-r*p*d-l*o*y+r*c*y,S=f*c*a-l*p*a-f*o*u+r*p*u+l*o*m-r*c*m,w=e*g+s*v+i*x+n*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]=g*b,t[1]=(p*u*n-c*m*n-p*i*d+s*m*d+c*i*y-s*u*y)*b,t[2]=(o*m*n-p*a*n+p*i*h-s*m*h-o*i*y+s*a*y)*b,t[3]=(c*a*n-o*u*n-c*i*h+s*u*h+o*i*d-s*a*d)*b,t[4]=v*b,t[5]=(l*m*n-f*u*n+f*i*d-e*m*d-l*i*y+e*u*y)*b,t[6]=(f*a*n-r*m*n-f*i*h+e*m*h+r*i*y-e*a*y)*b,t[7]=(r*u*n-l*a*n+l*i*h-e*u*h-r*i*d+e*a*d)*b,t[8]=x*b,t[9]=(f*c*n-l*p*n-f*s*d+e*p*d+l*s*y-e*c*y)*b,t[10]=(r*p*n-f*o*n+f*s*h-e*p*h-r*s*y+e*o*y)*b,t[11]=(l*o*n-r*c*n-l*s*h+e*c*h+r*s*d-e*o*d)*b,t[12]=S*b,t[13]=(l*p*i-f*c*i+f*s*u-e*p*u-l*s*m+e*c*m)*b,t[14]=(f*o*i-r*p*i-f*s*a+e*p*a+r*s*m-e*o*m)*b,t[15]=(r*c*i-l*o*i+l*s*a-e*c*a-r*s*u+e*o*u)*b,this}scale(t){const e=this.elements,s=t.x,i=t.y,n=t.z;return e[0]*=s,e[4]*=i,e[8]*=n,e[1]*=s,e[5]*=i,e[9]*=n,e[2]*=s,e[6]*=i,e[10]*=n,e[3]*=s,e[7]*=i,e[11]*=n,this}getMaxScaleOnAxis(){const t=this.elements,e=t[0]*t[0]+t[1]*t[1]+t[2]*t[2],s=t[4]*t[4]+t[5]*t[5]+t[6]*t[6],i=t[8]*t[8]+t[9]*t[9]+t[10]*t[10];return Math.sqrt(Math.max(e,s,i))}makeTranslation(t,e,s){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,s,0,0,0,1),this}makeRotationX(t){const e=Math.cos(t),s=Math.sin(t);return this.set(1,0,0,0,0,e,-s,0,0,s,e,0,0,0,0,1),this}makeRotationY(t){const e=Math.cos(t),s=Math.sin(t);return this.set(e,0,s,0,0,1,0,0,-s,0,e,0,0,0,0,1),this}makeRotationZ(t){const e=Math.cos(t),s=Math.sin(t);return this.set(e,-s,0,0,s,e,0,0,0,0,1,0,0,0,0,1),this}makeRotationAxis(t,e){const s=Math.cos(e),i=Math.sin(e),n=1-s,r=t.x,o=t.y,a=t.z,h=n*r,l=n*o;return this.set(h*r+s,h*o-i*a,h*a+i*o,0,h*o+i*a,l*o+s,l*a-i*r,0,h*a-i*o,l*a+i*r,n*a*a+s,0,0,0,0,1),this}makeScale(t,e,s){return this.set(t,0,0,0,0,e,0,0,0,0,s,0,0,0,0,1),this}makeShear(t,e,s,i,n,r){return this.set(1,s,n,0,t,1,r,0,e,i,1,0,0,0,0,1),this}compose(t,e,s){const i=this.elements,n=e._x,r=e._y,o=e._z,a=e._w,h=n+n,l=r+r,c=o+o,u=n*h,d=n*l,f=n*c,p=r*l,m=r*c,y=o*c,g=a*h,v=a*l,x=a*c,S=s.x,w=s.y,b=s.z;return i[0]=(1-(p+y))*S,i[1]=(d+x)*S,i[2]=(f-v)*S,i[3]=0,i[4]=(d-x)*w,i[5]=(1-(u+y))*w,i[6]=(m+g)*w,i[7]=0,i[8]=(f+v)*b,i[9]=(m-g)*b,i[10]=(1-(u+p))*b,i[11]=0,i[12]=t.x,i[13]=t.y,i[14]=t.z,i[15]=1,this}decompose(t,e,s){const i=this.elements;let n=at.set(i[0],i[1],i[2]).length();const r=at.set(i[4],i[5],i[6]).length(),o=at.set(i[8],i[9],i[10]).length();this.determinant()<0&&(n=-n),t.x=i[12],t.y=i[13],t.z=i[14],ht.copy(this);const a=1/n,h=1/r,l=1/o;return ht.elements[0]*=a,ht.elements[1]*=a,ht.elements[2]*=a,ht.elements[4]*=h,ht.elements[5]*=h,ht.elements[6]*=h,ht.elements[8]*=l,ht.elements[9]*=l,ht.elements[10]*=l,e.setFromRotationMatrix(ht),s.x=n,s.y=r,s.z=o,this}makePerspective(t,e,s,i,n,r,o=2e3){const a=this.elements,h=2*n/(e-t),l=2*n/(s-i),c=(e+t)/(e-t),u=(s+i)/(s-i);let d,f;if(o===nt)d=-(r+n)/(r-n),f=-2*r*n/(r-n);else{if(o!==rt)throw new Error("Matrix4.makePerspective(): Invalid coordinate system: "+o);d=-r/(r-n),f=-r*n/(r-n)}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]=f,a[3]=0,a[7]=0,a[11]=-1,a[15]=0,this}makeOrthographic(t,e,s,i,n,r,o=2e3){const a=this.elements,h=1/(e-t),l=1/(s-i),c=1/(r-n),u=(e+t)*h,d=(s+i)*l;let f,p;if(o===nt)f=(r+n)*c,p=-2*c;else{if(o!==rt)throw new Error("../math.Matrix4.makeOrthographic(): Invalid coordinate system: "+o);f=n*c,p=-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]=p,a[14]=-f,a[3]=0,a[7]=0,a[11]=0,a[15]=1,this}equals(t){const e=this.elements,s=t.elements;for(let t=0;t<16;t++)if(e[t]!==s[t])return!1;return!0}fromArray(t,e=0){for(let s=0;s<16;s++)this.elements[s]=t[s+e];return this}toArray(t=[],e=0){const s=this.elements;return t[e]=s[0],t[e+1]=s[1],t[e+2]=s[2],t[e+3]=s[3],t[e+4]=s[4],t[e+5]=s[5],t[e+6]=s[6],t[e+7]=s[7],t[e+8]=s[8],t[e+9]=s[9],t[e+10]=s[10],t[e+11]=s[11],t[e+12]=s[12],t[e+13]=s[13],t[e+14]=s[14],t[e+15]=s[15],t}}ot.prototype.isMatrix4=!0;const at=new et,ht=new ot,lt=new et(0,0,0),ct=new et(1,1,1),ut=new et,dt=new et,ft=new et,pt=new ot,mt=new tt;class yt{constructor(t=0,e=0,s=0,i=yt.DEFAULT_ORDER){this._x=t,this._y=e,this._z=s,this._order=i}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,s,i=this._order){return this._x=t,this._y=e,this._z=s,this._order=i,this._onChangeCallback(),this}clone(){return new yt(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,s=!0){const i=t.elements,n=i[0],r=i[4],o=i[8],a=i[1],h=i[5],l=i[9],c=i[2],u=i[6],d=i[10];switch(e){case"XYZ":this._y=Math.asin(C(o,-1,1)),Math.abs(o)<.9999999?(this._x=Math.atan2(-l,d),this._z=Math.atan2(-r,n)):(this._x=Math.atan2(u,h),this._z=0);break;case"YXZ":this._x=Math.asin(-C(l,-1,1)),Math.abs(l)<.9999999?(this._y=Math.atan2(o,d),this._z=Math.atan2(a,h)):(this._y=Math.atan2(-c,n),this._z=0);break;case"ZXY":this._x=Math.asin(C(u,-1,1)),Math.abs(u)<.9999999?(this._y=Math.atan2(-c,d),this._z=Math.atan2(-r,h)):(this._y=0,this._z=Math.atan2(a,n));break;case"ZYX":this._y=Math.asin(-C(c,-1,1)),Math.abs(c)<.9999999?(this._x=Math.atan2(u,d),this._z=Math.atan2(a,n)):(this._x=0,this._z=Math.atan2(-r,h));break;case"YZX":this._z=Math.asin(C(a,-1,1)),Math.abs(a)<.9999999?(this._x=Math.atan2(-l,h),this._y=Math.atan2(-c,n)):(this._x=0,this._y=Math.atan2(o,d));break;case"XZY":this._z=Math.asin(-C(r,-1,1)),Math.abs(r)<.9999999?(this._x=Math.atan2(u,h),this._y=Math.atan2(o,n)):(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===s&&this._onChangeCallback(),this}setFromQuaternion(t,e,s){return pt.makeRotationFromQuaternion(t),this.setFromRotationMatrix(pt,e,s)}setFromVector3(t,e=this._order){return this.set(t.x,t.y,t.z,e)}reorder(t){return mt.setFromEuler(this),this.setFromQuaternion(mt,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}}yt.DEFAULT_ORDER="XYZ",yt.prototype.isEuler=!0;class gt{constructor(t,e,s,i,n,r,o,a,h){this.elements=[1,0,0,0,1,0,0,0,1],void 0!==t&&this.set(t,e,s,i,n,r,o,a,h)}set(t,e,s,i,n,r,o,a,h){const l=this.elements;return l[0]=t,l[1]=i,l[2]=o,l[3]=e,l[4]=n,l[5]=a,l[6]=s,l[7]=r,l[8]=h,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(t){const e=this.elements,s=t.elements;return e[0]=s[0],e[1]=s[1],e[2]=s[2],e[3]=s[3],e[4]=s[4],e[5]=s[5],e[6]=s[6],e[7]=s[7],e[8]=s[8],this}extractBasis(t,e,s){return t.setFromMatrix3Column(this,0),e.setFromMatrix3Column(this,1),s.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 s=t.elements,i=e.elements,n=this.elements,r=s[0],o=s[3],a=s[6],h=s[1],l=s[4],c=s[7],u=s[2],d=s[5],f=s[8],p=i[0],m=i[3],y=i[6],g=i[1],v=i[4],x=i[7],S=i[2],w=i[5],b=i[8];return n[0]=r*p+o*g+a*S,n[3]=r*m+o*v+a*w,n[6]=r*y+o*x+a*b,n[1]=h*p+l*g+c*S,n[4]=h*m+l*v+c*w,n[7]=h*y+l*x+c*b,n[2]=u*p+d*g+f*S,n[5]=u*m+d*v+f*w,n[8]=u*y+d*x+f*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],s=t[1],i=t[2],n=t[3],r=t[4],o=t[5],a=t[6],h=t[7],l=t[8];return e*r*l-e*o*h-s*n*l+s*o*a+i*n*h-i*r*a}invert(){const t=this.elements,e=t[0],s=t[1],i=t[2],n=t[3],r=t[4],o=t[5],a=t[6],h=t[7],l=t[8],c=l*r-o*h,u=o*a-l*n,d=h*n-r*a,f=e*c+s*u+i*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]=(i*h-l*s)*p,t[2]=(o*s-i*r)*p,t[3]=u*p,t[4]=(l*e-i*a)*p,t[5]=(i*n-o*e)*p,t[6]=d*p,t[7]=(s*a-h*e)*p,t[8]=(r*e-s*n)*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,s,i,n,r,o){const a=Math.cos(n),h=Math.sin(n);return this.set(s*a,s*h,-s*(a*r+h*o)+r+t,-i*h,i*a,-i*(-h*r+a*o)+o+e,0,0,1),this}scale(t,e){return this.premultiply(vt.makeScale(t,e)),this}rotate(t){return this.premultiply(vt.makeRotation(-t)),this}translate(t,e){return this.premultiply(vt.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),s=Math.sin(t);return this.set(e,-s,0,s,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,s=t.elements;for(let t=0;t<9;t++)if(e[t]!==s[t])return!1;return!0}fromArray(t,e=0){for(let s=0;s<9;s++)this.elements[s]=t[s+e];return this}toArray(t=[],e=0){const s=this.elements;return t[e]=s[0],t[e+1]=s[1],t[e+2]=s[2],t[e+3]=s[3],t[e+4]=s[4],t[e+5]=s[5],t[e+6]=s[6],t[e+7]=s[7],t[e+8]=s[8],t}clone(){return(new gt).fromArray(this.elements)}}gt.prototype.isMatrix3=!0;const vt=new gt,xt=new Float32Array(4);class St extends tt{constructor(t,e){super(),this.data=t,this.offset=e}bind(t,e){this.data=t,this.offset=e}}const wt=St.prototype;wt.data=xt,wt.offset=0,Object.defineProperties(St.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 bt{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 bt(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,s=this.y,i=t.elements;return this.x=i[0]*e+i[3]*s+i[6],this.y=i[1]*e+i[4]*s+i[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 s=this.length();return this.divideScalar(s||1).multiplyScalar(Math.max(t,Math.min(e,s)))}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 s=this.dot(t)/e;return Math.acos(C(s,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,s=this.y-t.y;return e*e+s*s}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,s){return this.x=t.x+(e.x-t.x)*s,this.y=t.y+(e.y-t.y)*s,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 s=Math.cos(e),i=Math.sin(e),n=this.x-t.x,r=this.y-t.y;return this.x=n*s-r*i+t.x,this.y=n*i+r*s+t.y,this}random(){return this.x=M(),this.y=M(),this}*[Symbol.iterator](){yield this.x,yield this.y}}bt.isVector2=!0;const Mt=new Float32Array(3);class zt extends et{constructor(t,e){super(),this.data=t,this.offset=e}bind(t,e){this.data=t,this.offset=e}}const _t=zt.prototype;_t.data=Mt,_t.offset=0,Object.defineProperties(zt.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 Vt{constructor(t=0,e=0,s=0,i=1){this.x=t,this.y=e,this.z=s,this.w=i}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,s,i){return this.x=t,this.y=e,this.z=s,this.w=i,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 Vt(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,s=this.y,i=this.z,n=this.w,r=t.elements;return this.x=r[0]*e+r[4]*s+r[8]*i+r[12]*n,this.y=r[1]*e+r[5]*s+r[9]*i+r[13]*n,this.z=r[2]*e+r[6]*s+r[10]*i+r[14]*n,this.w=r[3]*e+r[7]*s+r[11]*i+r[15]*n,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,s,i,n;const r=.01,o=.1,a=t.elements,h=a[0],l=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(l-u)<r&&Math.abs(c-p)<r&&Math.abs(f-m)<r){if(Math.abs(l+u)<o&&Math.abs(c+p)<o&&Math.abs(f+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,g=(y+1)/2,v=(l+u)/4,x=(c+p)/4,S=(f+m)/4;return t>a&&t>g?t<r?(s=0,i=.707106781,n=.707106781):(s=Math.sqrt(t),i=v/s,n=x/s):a>g?a<r?(s=.707106781,i=0,n=.707106781):(i=Math.sqrt(a),s=v/i,n=S/i):g<r?(s=.707106781,i=.707106781,n=0):(n=Math.sqrt(g),s=x/n,i=S/n),this.set(s,i,n,e),this}let g=Math.sqrt((m-f)*(m-f)+(c-p)*(c-p)+(u-l)*(u-l));return Math.abs(g)<.001&&(g=1),this.x=(m-f)/g,this.y=(c-p)/g,this.z=(u-l)/g,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 s=this.length();return this.divideScalar(s||1).multiplyScalar(Math.max(t,Math.min(e,s)))}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,s){return this.x=t.x+(e.x-t.x)*s,this.y=t.y+(e.y-t.y)*s,this.z=t.z+(e.z-t.z)*s,this.w=t.w+(e.w-t.w)*s,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=M(),this.y=M(),this.z=M(),this.w=M(),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z,yield this.w}}Vt.prototype.isVector4=!0;const At=new Float32Array(4);class Tt extends Vt{constructor(t,e){super(),this.data=t,this.offset=e}bind(t,e){this.data=t,this.offset=e}}const Ot=Tt.prototype;let $t;Ot.data=At,Ot.offset=0,Object.defineProperties(Tt.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 Pt{constructor(t,e){this.resolver=t,this.bounce=e,this.type="ApplyCollision",this.tempV=new et}initialize(t){}update(t,e){const s=this.resolver??$t;void 0!==s&&s.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 Pt(void 0,"number"==typeof t.bounce?t.bounce:1)}clone(){return new Pt(this.resolver,this.bounce)}reset(){}}const Ct=t=>({r:t.x,g:t.y,b:t.z,a:t.w}),Et=t=>new Vt(t.r,t.g,t.b,t.a),Ft=(t,e)=>{switch(e){case"Vector3":return new et(t.x,t.y,t.z);case"Vector4":return new Vt(t.x,t.y,t.z,t.w);case"Color":return new et(t.r,t.g,t.b);default:return t}},Bt=(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}},It=t=>{console.warn(`[quarks] ${t}`)},Ut=(t,e)=>Array.isArray(t)?new et(t[0]??e.x,t[1]??e.y,t[2]??e.z):e,Nt=(t,e)=>{const s=e?.type;return null==e?`Missing ${t}`:void 0===s?`${t[0].toUpperCase()}${t.slice(1)} without a type`:`Unknown ${t} ${JSON.stringify(s)}`};class Rt{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 Rt(t.value)}clone(){return new Rt(this.value)}}class Dt{constructor(t,e){this.a=t,this.b=e,this.indexCount=-1,this.type="value"}startGen(t){this.indexCount=t.length,t.push(M())}genValue(t){return-1===this.indexCount&&this.startGen(t),K.lerp(this.a,this.b,t[this.indexCount])}toJSON(){return{type:"IntervalValue",a:this.a,b:this.b}}static fromJSON(t){return new Dt(t.a,t.b)}clone(){return new Dt(this.a,this.b)}}class kt{constructor(t,e,s,i){this.p=[t,e,s,i]}genValue(t){const e=this.p,s=t*t,i=1-t,n=i*i;return e[0]*n*i+e[1]*n*t*3+e[2]*i*s*3+e[3]*s*t}derivativeCoefficients(t){const e=[];for(let s=t,i=s.length-1;i>0;i--){const t=[];for(let e=0;e<i;e++){const n=i*(s[e+1]-s[e]);t.push(n)}e.push(t),s=t}return e}getSlope(t){const e=this.derivativeCoefficients(this.p)[0],s=1-t,i=s*t*2,n=t*t;return s*s*e[0]+i*e[1]+n*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,s=this.p,i=[],n=0,r=0,o=0;const a=[];for(a[n++]=s[0],a[n++]=s[1],a[n++]=s[2],a[n++]=s[3];s.length>1;){for(i=[],r=0,o=s.length-1;r<o;r++)e=t*s[r]+(1-t)*s[r+1],a[n++]=e,i.push(e);s=i}return a}split(t){const e=this.hull(t);return{left:new kt(e[0],e[4],e[7],e[9]),right:new kt(e[9],e[8],e[6],e[3]),span:e}}clone(){return new kt(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 kt(t.p0,t.p1,t.p2,t.p3)}}class Lt{constructor(){this.functions=new Array}findFunction(t){const e=this.functions,s=e.length-1;if(s<=0)return 0===s&&t>=e[0][1]&&t<=1?0:-1;let i=0,n=s;for(;i+1<n;){const s=i+n>>1;if(t<e[s][1])n=s-1;else{if(!(t>this.getEndX(s)))return s;i=s+1}}for(let s=i;s<=n;s++)if(t>=e[s][1]&&t<=this.getEndX(s))return s;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 s=this.findFunction(t);this.functions.splice(s+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 qt extends Lt{constructor(t=[[new kt(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 s=5*e;let i=this.tableSignature,n=null===i||i.length!==s;n&&(i=new Float64Array(s));for(let s=0,r=0;s<e;s++,r+=5){const e=t[s][0].p,o=t[s][1];n||(n=i[r]!==e[0]||i[r+1]!==e[1]||i[r+2]!==e[2]||i[r+3]!==e[3]||i[r+4]!==o),n&&(i[r]=e[0],i[r+1]=e[1],i[r+2]=e[2],i[r+3]=e[3],i[r+4]=o)}if(!n&&null!==this.table)return;this.tableSignature=i;const r=qt.TABLE_SIZE,o=null!==this.table&&this.table.length===r?this.table:new Float32Array(r),a=1/(r-1);for(let t=0;t<r;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 s=this.table;if(null!==s){const t=s.length-1;if(e<=0)return s[0];if(e>=1)return s[t];const i=e*t,n=0|i,r=i-n,o=s[n];return o+(s[n+1]-o)*r}return this.genValueExact(e)}genValueExact(t){const e=this.functions,s=e.length;if(0===s)return 0;const i=this.findFunction(t);if(-1===i)return t<e[0][1]?e[0][0].genValue(0):e[s-1][0].genValue(1);const n=e[i][1],r=(i+1<s?e[i+1][1]:1)-n;return e[i][0].genValue(r>0?(t-n)/r:0)}toSVG(t,e){if(e<1)return"";let s=["M",0,this.functions[0][0].p[0]].join(" ");for(let i=1/e;i<=1;i+=1/e)s=[s,"L",i*t,this.genValue(void 0,i)].join(" ");return s}toJSON(){return{type:"PiecewiseBezier",functions:this.functions.map(([t,e])=>({function:t.toJSON(),start:e}))}}static fromJSON(t){return new qt(t.functions.map(t=>[kt.fromJSON(t.function),t.start]))}clone(){return new qt(this.functions.map(([t,e])=>[t.clone(),e]))}startGen(t){}}function Jt(t){switch(t?.type){case"ConstantValue":return Rt.fromJSON(t);case"IntervalValue":return Dt.fromJSON(t);case"PiecewiseBezier":return qt.fromJSON(t);default:return It(`${Nt("value generator",t)}; using 0.`),new Rt(0)}}qt.TABLE_SIZE=257;class Wt{constructor(t,e){this.axis=t,this.angle=e,this.type="rotation"}startGen(t){this.angle.startGen(t)}genValue(t,e,s,i){return e.setFromAxisAngle(this.axis,this.angle.genValue(t,i)*s)}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 Wt(new et(t.axis.x,t.axis.y,t.axis.z),Jt(t.angle))}clone(){return new Wt(this.axis.clone(),this.angle.clone())}}class Gt{constructor(t,e){this.a=t,this.b=e,this.indexCount=-1,this.type="value"}startGen(t){this.indexCount=t.length,t.push(M())}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:Ct(this.a),b:Ct(this.b)}}static fromJSON(t){return new Gt(Et(t.a),Et(t.b))}clone(){return new Gt(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,s=e.length-1;if(s<0||t<e[0][1])return-1;if(t>=e[s][1])return s;if(1===s)return 0;let i=0,n=s;for(;i+1<n;){const s=i+n>>1;if(t<e[s][1])n=s-1;else{if(!(t>this.getEndX(s)))return s;i=s+1}}for(let s=i;s<=n;s++)if(t>=e[s][1]&&t<=this.getEndX(s))return s;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 s=this.keys,i=this.findKey(e),n=s.length-1;if("Number"===this.subType){if(-1===i)return s[0][0];if(i>=n)return s[n][0];const t=s[i][1],r=s[i][0],o=s[i+1][1]-t;return(s[i+1][0]-r)*(o>0?(e-t)/o:0)+r}{if(-1===i)return t.copy(s[0][0]);if(i>=n)return t.copy(s[n][0]);const r=s[i][1],o=s[i+1][1]-r;return t.copy(s[i][0]).lerp(s[i+1][0],o>0?(e-r)/o:0)}}toJSON(){return{type:"CLinearFunction",subType:this.subType,keys:this.keys.map(([t,e])=>({value:Bt(t,this.subType),pos:e}))}}static fromJSON(t){return new Qt(t.keys.map(e=>[Ft(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 jt=new Vt;class Ht{constructor(t=[[new et(0,0,0),0],[new et(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,s=4*t.length+2*e.length;let i=this.tableSignature,n=null===i||i.length!==s;n&&(i=new Float64Array(s));let r=0;for(let e=0;e<t.length;e++,r+=4){const s=t[e][0],o=t[e][1];n||(n=i[r]!==s.x||i[r+1]!==s.y||i[r+2]!==s.z||i[r+3]!==o),n&&(i[r]=s.x,i[r+1]=s.y,i[r+2]=s.z,i[r+3]=o)}for(let t=0;t<e.length;t++,r+=2){const s=e[t][0],o=e[t][1];n||(n=i[r]!==s||i[r+1]!==o),n&&(i[r]=s,i[r+1]=o)}if(!n&&null!==this.table)return;this.tableSignature=i;const o=Ht.TABLE_SIZE,a=null!==this.table&&this.table.length===4*o?this.table:new Float32Array(4*o),h=1/(o-1),l=jt;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,s){const i=this.table;if(null!==i){const t=Ht.TABLE_SIZE-1;if(s<=0)return e.x=i[0],e.y=i[1],e.z=i[2],e.w=i[3],e;if(s>=1){const s=4*t;return e.x=i[s],e.y=i[s+1],e.z=i[s+2],e.w=i[s+3],e}const n=s*t,r=0|n,o=n-r,a=4*r,h=a+4;return e.x=i[a]+(i[h]-i[a])*o,e.y=i[a+1]+(i[h+1]-i[a+1])*o,e.z=i[a+2]+(i[h+2]-i[a+2])*o,e.w=i[a+3]+(i[h+3]-i[a+3])*o,e}return this.genColorExact(e,s)}genColorExact(t,e){const s=this.color.keys,i=s.length-1,n=this.color.findKey(e);let r,o,a;if(-1===n||n>=i){const t=s[-1===n?0:i][0];r=t.x,o=t.y,a=t.z}else{const t=s[n][0],i=s[n+1][0],h=s[n][1],l=s[n+1][1]-h,c=l>0?(e-h)/l:0;r=t.x+(i.x-t.x)*c,o=t.y+(i.y-t.y)*c,a=t.z+(i.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],s=h[c][0],i=h[c+1][1]-t;u=s+(h[c+1][0]-s)*(i>0?(e-t)/i:0)}return t.x=r,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=>[Gt.fromJSON(t.function).a,t.start]);return t.functions.length>0&&e.push([Gt.fromJSON(t.functions[t.functions.length-1].function).b,1]),new Ht(e.map(t=>[new et(t[0].x,t[0].y,t[0].z),t[1]]),e.map(t=>[t[0].w,t[1]]))}{const e=new Ht;return e.alpha=Qt.fromJSON(t.alpha),e.color=Qt.fromJSON(t.color),e}}clone(){const t=new Ht;return t.alpha=this.alpha.clone(),t.color=this.color.clone(),t}startGen(t){}}Ht.TABLE_SIZE=257;class Yt{constructor(t,e){this.a=t,this.b=e,this.type="value"}startGen(t){}genColor(t,e){const s=M();return e.copy(this.a).lerp(this.b,s)}toJSON(){return{type:"RandomColor",a:Ct(this.a),b:Ct(this.b)}}static fromJSON(t){return new Yt(Et(t.a),Et(t.b))}clone(){return new Yt(this.a.clone(),this.b.clone())}}const Xt=new Vt;class Zt{constructor(t,e){this.indexCount=0,this.type="function",this.gradient1=t,this.gradient2=e}startGen(t){this.indexCount=t.length,t.push(M())}genColor(t,e,s){return this.gradient1.genColor(t,e,s),this.gradient2.genColor(t,Xt,s),t&&void 0!==t[this.indexCount]?e.lerp(Xt,t[this.indexCount]):e.lerp(Xt,M()),e}toJSON(){return{type:"RandomColorBetweenGradient",gradient1:this.gradient1.toJSON(),gradient2:this.gradient2.toJSON()}}static fromJSON(t){return new Zt(Ht.fromJSON(t.gradient1),Ht.fromJSON(t.gradient2))}clone(){return new Zt(this.gradient1.clone(),this.gradient2.clone())}}class Kt{constructor(t){this.color=t,this.type="value"}startGen(t){}genColor(t,e){return e.copy(this.color)}toJSON(){return{type:"ConstantColor",color:Ct(this.color)}}static fromJSON(t){return new Kt(Et(t.color))}clone(){return new Kt(this.color.clone())}}function te(t){switch(t?.type){case"ConstantColor":return Kt.fromJSON(t);case"ColorRange":return Gt.fromJSON(t);case"RandomColor":return Yt.fromJSON(t);case"Gradient":return Ht.fromJSON(t);case"RandomColorBetweenGradient":return Zt.fromJSON(t);default:return It(`${Nt("colour generator",t)}; using white.`),new Kt(new Vt(1,1,1,1))}}class ee{constructor(t,e,s,i){this.angleX=t,this.angleY=e,this.angleZ=s,this.type="rotation",this.eular=new yt(0,0,0,i)}startGen(t){this.angleX.startGen(t),this.angleY.startGen(t),this.angleZ.startGen(t)}genValue(t,e,s,i){return this.eular.set(this.angleX.genValue(t,i)*s,this.angleY.genValue(t,i)*s,this.angleZ.genValue(t,i)*s),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 ee(Jt(t.angleX),Jt(t.angleY),Jt(t.angleZ),t.eulerOrder)}clone(){return new ee(this.angleX.clone(),this.angleY.clone(),this.angleZ.clone(),this.eular.order)}}class se{constructor(){this.indexCount=0,this.type="rotation"}startGen(t){let e,s,i,n,r,o;this.indexCount=t.length;do{e=2*M()-1,s=2*M()-1,i=e*e+s*s}while(i>1);do{n=2*M()-1,r=2*M()-1,o=n*n+r*r}while(o>1);const a=Math.sqrt((1-i)/o);t.push(e,s,a*n,a*r)}genValue(t,e,s,i){-1===this.indexCount&&this.startGen(t);const n=this.indexCount;return e.set(t[n],t[n+1],t[n+2],t[n+3]),e}toJSON(){return{type:"RandomQuat"}}static fromJSON(t){return new se}clone(){return new se}}function ie(t){switch(t?.type){case"AxisAngle":return Wt.fromJSON(t);case"Euler":return ee.fromJSON(t);case"RandomQuat":return se.fromJSON(t);default:return It(`${Nt("rotation generator",t)}; using a random rotation.`),new se}}class ne{constructor(t,e,s){this.x=t,this.y=e,this.z=s,this.type="vec3function"}startGen(t){this.x.startGen(t),this.y.startGen(t),this.z.startGen(t)}genValue(t,e,s){return e.set(this.x.genValue(t,s),this.y.genValue(t,s),this.z.genValue(t,s))}toJSON(){return{type:"Vector3Function",x:this.x.toJSON(),y:this.y.toJSON(),z:this.z.toJSON()}}static fromJSON(t){return new ne(Jt(t.x),Jt(t.y),Jt(t.z))}clone(){return new ne(this.x.clone(),this.y.clone(),this.z.clone())}}function re(t){return"Vector3Function"===t?.type?ne.fromJSON(t):(It(`${Nt("vector generator",t)}; using a zero vector.`),new ne(new Rt(0),new Rt(0),new Rt(0)))}function oe(t){switch(t?.type){case"ConstantValue":case"IntervalValue":case"PiecewiseBezier":return Jt(t);case"AxisAngle":case"RandomQuat":case"Euler":return ie(t);case"Vector3Function":return re(t);default:return It(`${Nt("generator",t)}; using 0.`),new Rt(0)}}function ae(t,e){return"world"===t||"local"===t?t:e}function he(t){return 0===t?0:1/t}class le{constructor(){this.position=new et,this.quaternion=new tt,this.scale=new et(1,1,1),this.quaternionInverse=new tt,this.scaleInverse=new et(1,1,1)}refresh(t){t.emitter.matrixWorld.decompose(this.position,this.quaternion,this.scale),this.quaternionInverse.copy(this.quaternion).invert(),this.scaleInverse.set(he(this.scale.x),he(this.scale.y),he(this.scale.z))}toSimulation(t,e,s){return s&&"local"===e?t.multiply(this.scale).applyQuaternion(this.quaternion):s||"world"!==e||t.applyQuaternion(this.quaternionInverse).multiply(this.scaleInverse),t}pointToSimulation(t,e,s){return s&&"local"===e?t.multiply(this.scale).applyQuaternion(this.quaternion).add(this.position):s||"world"!==e||t.sub(this.position).applyQuaternion(this.quaternionInverse).multiply(this.scaleInverse),t}}class ce{constructor(t,e,s="world"){this.direction=t,this.magnitude=e,this.space=s,this.type="ApplyForce",this._frame=new le,this._direction=new et,this._direction.copy(t)}initialize(t,e){this.ps=e,this.magnitude.startGen(t.memory)}_step(t){const e=this.ps;return(void 0===e||e.worldSpace)&&"world"===this.space?t*(e?.motionScale??1):t}update(t,e){const s=this.magnitude.genValue(t.memory)*this._step(e),i=this._direction,n=t.velocity;n.x+=i.x*s,n.y+=i.y*s,n.z+=i.z*s}updateAll(t,e,s){const i=this.magnitude,n=this._direction,r=this._step(s),o=i instanceof Rt,a=o?i.value*r:0;for(let s=0;s<e;s++){const e=t[s];if(e.age>=e.life)continue;const h=o?a:i.genValue(e.memory)*r,l=e.velocity;l.x+=n.x*h,l.y+=n.y*h,l.z+=n.z*h}}frameUpdate(t){this._direction.copy(this.direction),void 0!==this.ps&&this.ps.worldSpace!==("world"===this.space)&&(this._frame.refresh(this.ps),this._frame.toSimulation(this._direction,this.space,this.ps.worldSpace))}toJSON(){return{type:this.type,direction:[this.direction.x,this.direction.y,this.direction.z],magnitude:this.magnitude.toJSON(),..."world"!==this.space?{space:this.space}:{}}}static fromJSON(t){return new ce(Ut(t.direction,new et(0,0,0)),Jt(t.magnitude??t.force),ae(t.space,"world"))}clone(){return new ce(this.direction.clone(),this.magnitude.clone(),this.space)}reset(){}}class ue{constructor(t=0,e=0,s=new et){this.scaleX=t,this.scaleY=e,this.position=s,this.locations=[]}transform(t,e){const s=this.locations.length;if(0===s)return;const i=this.locations[e%s];t.x=i.x*this.scaleX+this.position.x,t.y=i.y*this.scaleY+this.position.y,t.z=this.position.z}static fromJSON(t){const e=t.position,s=Array.isArray(e)?new et(e[0],e[1],e[2]):new et(e?.x??0,e?.y??0,e?.z??0),i=new ue(t.scaleX??0,t.scaleY??0,s);return i.locations=(t.locations??[]).map(t=>new bt(t.x,t.y)),i}clone(){const t=new ue(this.scaleX,this.scaleY,this.position.clone());return t.locations=this.locations.map(t=>t.clone()),t}toJSON(){return{type:"TextureSequencer",scaleX:this.scaleX,scaleY:this.scaleY,position:[this.position.x,this.position.y,this.position.z],locations:this.locations.map(t=>({x:t.x,y:t.y}))}}fromImage(t,e){const s=document.createElement("canvas");s.width=t.width,s.height=t.height;const i=s.getContext("2d");if(!i)return;i.drawImage(t,0,0);const n=i.getImageData(0,0,s.width,s.height,{colorSpace:"srgb"});s.remove(),this.locations.length=0;for(let t=0;t<n.height;t++)for(let s=0;s<n.width;s++)n.data[4*(t*n.width+s)+3]>e&&this.locations.push(new bt(s,n.height-t))}}function de(t){switch(t?.type){case void 0:return null==t?void It(`${Nt("sequencer",t)}; skipping it.`):ue.fromJSON(t);case"TextureSequencer":return ue.fromJSON(t);default:return void It(`${Nt("sequencer",t)}; skipping it.`)}}class fe{constructor(t){this.type="ApplySequences",this.sequencers=[],this.time=0,this.index=0,this.pCount=0,this.tempV=new et,this.delay=t}initialize(t){t.id=this.pCount,t.dst=new et,t.begin=new et,t.inMotion=!1,this.pCount++}reset(){this.time=0,this.index=0,this.pCount=0}update(t,e){const s=this.sequencers[this.index];if(void 0===s)return;const i=t.id*this.delay;this.time>=s[0].a+i&&this.time<=s[0].b+i?(t.inMotion||(t.inMotion=!0,t.begin.copy(t.position),s[1].transform(t.dst,t.id)),t.position.lerpVectors(t.begin,t.dst,fe.BEZIER.genValue((this.time-s[0].a-i)/(s[0].b-s[0].a)))):this.time>s[0].b+i&&(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 fe("number"==typeof t.delay?t.delay:0);return(Array.isArray(t.sequencers)?t.sequencers:[]).forEach(t=>{const s=de(t.sequencer);void 0!==s&&e.sequencers.push([Jt(t.range),s])}),e}clone(){const t=new fe(this.delay);return t.sequencers=this.sequencers.map(t=>[t[0].clone(),t[1].clone()]),t}}fe.BEZIER=new kt(0,0,1,1);class pe{constructor(t){this.angle=t,this.type="ChangeEmitDirection",this._temp=new et,this._q=new tt,this.memory=[]}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.memory.length=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,M()*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 pe(Jt(t.angle))}clone(){return new pe(this.angle.clone())}reset(){this.memory.length=0}}function me(t,e){const s=t.velocity.length()*t.speedModifier,i=e.b-e.a;if(0===i)return s>=e.a?1:0;const n=(s-e.a)/i;return n<0?0:n>1?1:n}class ye{constructor(t,e){this.color=t,this.speedRange=e,this.type="ColorBySpeed"}initialize(t){this.color.startGen(t.memory)}update(t,e){const s=me(t,this.speedRange);this.color.genColor(t.memory,t.color,s),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 ye(te(t.color),t.speedRange?Dt.fromJSON(t.speedRange):new Dt(0,1))}clone(){return new ye(this.color.clone(),this.speedRange.clone())}reset(){}}class ge{constructor(t){this.color=t,this.type="ColorOverLife"}initialize(t){this.color.startGen(t.memory)}update(t,e){const s=t.color,i=t.startColor;this.color.genColor(t.memory,s,t.age/t.life),s.x*=i.x,s.y*=i.y,s.z*=i.z,s.w*=i.w}updateAll(t,e,s){const i=this.color;for(let s=0;s<e;s++){const e=t[s];if(e.age>=e.life)continue;const n=e.color,r=e.startColor;i.genColor(e.memory,n,e.age/e.life),n.x*=r.x,n.y*=r.y,n.z*=r.z,n.w*=r.w}}frameUpdate(t){this.color.refreshTable?.()}toJSON(){return{type:this.type,color:this.color.toJSON()}}static fromJSON(t){return new ge(te(t.color))}clone(){return new ge(this.color.clone())}reset(){}}class ve{constructor(t=64){this.previousVelocity=ve.EMPTY,this.rotationQuaternion=ve.EMPTY,this.angularVelocityQuaternion=ve.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*ve.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=ve.grow(this.position,3*e),this.previousPosition=ve.grow(this.previousPosition,3*e);const s=this.previousSize===this.size,i=this.previousColor===this.color;if(s||(this.previousSize=ve.grow(this.previousSize,3*e)),this.previousVelocity.length>0&&(this.previousVelocity=ve.grow(this.previousVelocity,3*e)),this.rotationQuaternion.length>0){const t=this.rotationQuaternion.length;this.rotationQuaternion=ve.grow(this.rotationQuaternion,4*e),this.angularVelocityQuaternion=ve.grow(this.angularVelocityQuaternion,4*e);for(let s=t+3;s<4*e;s+=4)this.rotationQuaternion[s]=1,this.angularVelocityQuaternion[s]=1}if(i||(this.previousColor=ve.grow(this.previousColor,4*e)),this.velocity=ve.grow(this.velocity,3*e),this.size=ve.grow(this.size,3*e),this.startSize=ve.grow(this.startSize,3*e),this.color=ve.grow(this.color,4*e),s&&(this.previousSize=this.size),i&&(this.previousColor=this.color),this.startColor=ve.grow(this.startColor,4*e),this.scalars=ve.growDouble(this.scalars,e*ve.SCALAR_STRIDE),this.memoryStride>0){const t=new Float64Array(e*this.memoryStride);t.fill(NaN),t.set(this.memory),this.memory=t}this.rotation=ve.grow(this.rotation,e),this.angularVelocity=ve.grow(this.angularVelocity,e),this.uvTile=ve.grow(this.uvTile,e),this.startSpeed=ve.grow(this.startSpeed,e);const n=new Uint8Array(e);return n.set(this.flip),this.flip=n,this.capacity=e,!0}keepPreviousVelocity(){return!(this.previousVelocity.length>=3*this.capacity)&&(this.previousVelocity=new Float32Array(3*this.capacity),!0)}recordMemory(t,e){const s=e.length;let i=this.memoryStride;if(s>i||this.memory.length<this.capacity*i){i=Math.max(i,s);const t=new Float64Array(this.capacity*i);t.fill(NaN);const e=this.memoryStride,n=this.memory,r=e>0?n.length/e:0;for(let s=0,o=0,a=0;s<r;s++,o+=e,a+=i)for(let s=0;s<e;s++)t[a+s]=n[o+s];this.memory=t,this.memoryStride=i}const n=t*i;for(let t=0;t<i;t++){const i=t<s?e[t]:void 0;this.memory[n+t]="number"==typeof i?i: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 s=3*t,i=3*e;ve.swap3(this.position,s,i),ve.swap3(this.previousPosition,s,i),this.previousSize!==this.size&&ve.swap3(this.previousSize,s,i),this.previousVelocity.length>0&&ve.swap3(this.previousVelocity,s,i),ve.swap3(this.velocity,s,i),ve.swap3(this.size,s,i),ve.swap3(this.startSize,s,i);const n=4*t,r=4*e;ve.swap4(this.color,n,r),this.previousColor!==this.color&&ve.swap4(this.previousColor,n,r),ve.swap4(this.startColor,n,r),this.rotationQuaternion.length>0&&(ve.swap4(this.rotationQuaternion,n,r),ve.swap4(this.angularVelocityQuaternion,n,r)),ve.swap3(this.scalars,t*ve.SCALAR_STRIDE,e*ve.SCALAR_STRIDE);const o=this.memoryStride;if(o>0){const s=this.memory;for(let i=0,n=t*o,r=e*o;i<o;i++,n++,r++){const t=s[n];s[n]=s[r],s[r]=t}}ve.swap1(this.rotation,t,e),ve.swap1(this.angularVelocity,t,e),ve.swap1(this.uvTile,t,e),ve.swap1(this.startSpeed,t,e),ve.swap1(this.flip,t,e)}static swap1(t,e,s){const i=t[e];t[e]=t[s],t[s]=i}static growDouble(t,e){const s=new Float64Array(e);return s.set(t),s}static swap3(t,e,s){let i=t[e];t[e]=t[s],t[s]=i,i=t[e+1],t[e+1]=t[s+1],t[s+1]=i,i=t[e+2],t[e+2]=t[s+2],t[s+2]=i}static swap4(t,e,s){ve.swap3(t,e,s);const i=t[e+3];t[e+3]=t[s+3],t[s+3]=i}static grow(t,e){const s=new Float32Array(e);return s.set(t),s}}ve.EMPTY=new Float32Array(0),ve.SCALAR_STRIDE=3,ve.AGE=0,ve.LIFE=1,ve.SPEED_MODIFIER=2;class xe{constructor(t){this.data=t,this.next=null,this.prev=null}hasPrev(){return null!==this.prev}hasNext(){return null!==this.next}}class Se{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 xe(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 xe(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 s=new xe(e);s.next=t,s.prev=t.prev,null!==s.prev&&(s.prev.next=s),s.next.prev=s,t==this.head&&(this.head=s),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 we{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 St(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 St(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 ve(1),e=0){this.rotationQuaternion=void 0,this.angularVelocityQuaternion=void 0,this.memory=[],this.store=t,this.storeIndex=e;const s=3*e,i=4*e;this.position=new zt(t.position,s),this.previousPosition=new zt(t.previousPosition,s),this.previousVelocity=new zt(t.previousVelocity,s),this.velocity=new zt(t.velocity,s),this.size=new zt(t.size,s),this.startSize=new zt(t.startSize,s),this.color=new Tt(t.color,i),this.startColor=new Tt(t.startColor,i),this.scalars=t.scalars,this.scalarOffset=e*ve.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,s=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,s),this.startColor.bind(t.startColor,s),this.rotationQuaternion?.bind(t.rotationQuaternion,s),this.angularVelocityQuaternion?.bind(t.angularVelocityQuaternion,s),this.scalars=t.scalars,this.scalarOffset=this.storeIndex*ve.SCALAR_STRIDE}get died(){return this.age>=this.life}reset(){this.memory.length=0}}const be=new Float32Array(0);class Me{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 Se)}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 ve(1),e=0){this.length=30,this._previous=void 0,this.historyPositions=be,this.historySizes=be,this.historyBaseSizes=be,this.headWidthScale=1,this.historyColors=be,this.historySides=be,this.historyAges=be,this.historyDistances=be,this.historyCapacity=0,this.historyHead=0,this.historyCount=0,this.memory=[],this.store=t,this.storeIndex=e;const s=3*e,i=4*e;this.position=new zt(t.position,s),this.previousPosition=new zt(t.previousPosition,s),this.previousVelocity=new zt(t.previousVelocity,s),this.velocity=new zt(t.velocity,s),this.size=new zt(t.size,s),this.startSize=new zt(t.startSize,s),this.color=new Tt(t.color,i),this.startColor=new Tt(t.startColor,i),this.scalars=t.scalars,this.scalarOffset=e*ve.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,s=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,s),this.startColor.bind(t.startColor,s),this.scalars=t.scalars,this.scalarOffset=this.storeIndex*ve.SCALAR_STRIDE}ensureHistoryCapacity(t){this.historyCapacity!==t&&(this.historyCapacity=t,this.historySizes.length<t&&(this.historyPositions=new Float32Array(3*t),this.historySizes=new Float32Array(t),this.historyBaseSizes=new Float32Array(t),this.historyColors=new Float32Array(4*t),this.historyAges=new Float32Array(t),this.historyDistances=new Float32Array(t),this.historySides.length>0&&(this.historySides=new Float32Array(3*t))),this.historyHead=0,this.historyCount=0)}ensureSideHistory(){this.historySides.length<3*this.historyCapacity&&(this.historySides=new Float32Array(3*this.historyCapacity))}resetHistory(){this.historyHead=0,this.historyCount=0}getHistoryIndex(t){const e=this.historyCapacity;return(this.historyHead-this.historyCount+e+t)%e}update(t=!1,e=!0){0===this.historyCapacity&&this.ensureHistoryCapacity(Math.max(1,Math.ceil(this.length)));const s=this.historyCapacity,i=this.store,n=this.storeIndex,r=n*ve.SCALAR_STRIDE,o=i.scalars[r+ve.AGE];if(o>=i.scalars[r+ve.LIFE])return void this.dropOldest();const a=t&&this.historyCount>0,h=a?(this.historyHead+s-1)%s:this.historyHead,l=3*h,c=this.historyPositions,u=i.position,d=3*n;c[l]=u[d],c[l+1]=u[d+1],c[l+2]=u[d+2];const f=i.size[d];this.historyBaseSizes[h]=f,this.historySizes[h]=f*this.headWidthScale;const p=4*h,m=this.historyColors,y=i.color,g=4*n;m[p]=y[g],m[p+1]=y[g+1],m[p+2]=y[g+2],m[p+3]=y[g+3],this.historyAges[h]=o,a||(this.historyHead=(h+1)%s,this.historyCount<s&&this.historyCount++),e&&this.measureHeadDistance()}measureHeadDistance(){const t=this.historyCount;if(0===t)return;const e=this.historyCapacity,s=(this.historyHead+e-1)%e;if(1===t)return void(this.historyDistances[s]=0);const i=(s+e-1)%e,n=this.historyPositions,r=n[3*s]-n[3*i],o=n[3*s+1]-n[3*i+1],a=n[3*s+2]-n[3*i+2];this.historyDistances[s]=this.historyDistances[i]+Math.sqrt(r*r+o*o+a*a)}dropOldest(){this.historyCount>0&&this.historyCount--}get died(){return this.age>=this.life}reset(){this.memory.length=0,this.headWidthScale=1,this.resetHistory()}}function ze(t,e){return Math.floor(M()*(e-t))+t}const _e=new et(0,1,0),Ve=new et(0,0,0),Ae=new et(1,1,1),Te=new et(0,0,1),Oe=1e-6;var $e;exports.SubParticleEmitMode=void 0,($e=exports.SubParticleEmitMode||(exports.SubParticleEmitMode={}))[$e.Death=0]="Death",$e[$e.Birth=1]="Birth",$e[$e.Frame=2]="Frame";const Pe={color:1,size:2,rotation:4,lifetime:8};function Ce(t){let e=0;for(const s of t)e|=Pe[s]??0;return e}class Ee{constructor(t,e,s,i=exports.SubParticleEmitMode.Frame,n=1,r=[]){this.particleSystem=t,this.useVelocityAsBasis=e,this.subParticleSystem=s,this.mode=i,this.emitProbability=n,this.inherit=r,this.type="EmitSubParticleSystem",this.q_=new tt,this.v_=new et,this.v2_=new et,this.v3_=new et,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;const e=t.system;return e?.isDisposed?void 0:e}emit(t,e){if(!this.target)return;if(M()>this.emitProbability)return;const s=this.spareEmissions.pop(),i=void 0!==s?s:{burstParticleCount:0,burstParticleIndex:0,isBursting:!1,burstIndex:0,burstWaveIndex:0,time:0,waitEmiting:0,matrix:new ot,travelDistance:0,particle:void 0,serial:void 0,previousWorldPos:void 0};i.burstParticleCount=0,i.burstParticleIndex=0,i.isBursting=!1,i.burstIndex=0,i.burstWaveIndex=0,i.time=0,i.waitEmiting=0,i.travelDistance=0,this.mode===exports.SubParticleEmitMode.Death?(i.particle=Ee.copyInto(i.ghost??(i.ghost=new we),t),i.serial=void 0):(i.particle=t,i.serial=t.serial),i.inherit=Ce(this.inherit),this.mode===exports.SubParticleEmitMode.Death&&(i.inherit&=~Pe.lifetime),i.previousWorldPos=void 0,this.setMatrixFromParticle(i.matrix,t),this.subEmissions.push(i)}frameUpdate(t){const e=this.target;if(e)for(let s=0;s<this.subEmissions.length;s++)if(this.subEmissions[s].time>=e.duration){const t=this.subEmissions[s];t.particle=void 0,t.matrix=new ot,this.spareEmissions.push(t),this.subEmissions[s]=this.subEmissions[this.subEmissions.length-1],this.subEmissions.length=this.subEmissions.length-1,s--}else{const i=this.subEmissions[s],n=i.particle;void 0!==n&&n===i.ghost||(void 0!==n&&n.age<n.life&&n.serial===i.serial?this.setMatrixFromParticle(i.matrix,n):i.particle=void 0),e.emit(t,i,i.matrix)}else this.clearEmissions()}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 Ee(e,t.useVelocityAsBasis,t.subParticleSystem,t.mode,t.emitProbability,Ee.validInherit(t.inherit))}clone(){return new Ee(this.particleSystem,this.useVelocityAsBasis,this.subParticleSystem,this.mode,this.emitProbability,this.inherit.slice())}reset(){}clearEmissions(){for(const t of this.subEmissions)t.particle=void 0,this.spareEmissions.push(t);this.subEmissions.length=0}static copyInto(t,e){return t.position.copy(e.position),t.velocity.copy(e.velocity),t.color.copy(e.color),t.size.copy(e.size),t.rotation=e.rotation??0,t.age=e.age,t.life=e.life,t}static validInherit(t){return Array.isArray(t)?t.filter(t=>t in Pe):[]}setMatrixFromParticle(t,e){let s;if(void 0===e.rotation||this.useVelocityAsBasis){const s=e.position,i=this.v3_.copy(e.velocity),n=i.length(),r=this.v_,o=this.v2_;if(n<Oe)r.set(1,0,0),o.set(0,1,0),i.set(0,0,1);else if(i.divideScalar(n),Math.abs(i.x)<Oe&&Math.abs(i.y)<Oe){const t=i.z>0?1:-1;r.set(1,0,0),o.set(0,t,0),i.set(0,0,t)}else r.copy(Te).cross(i).normalize(),o.copy(i).cross(r);t.set(r.x,o.x,i.x,s.x,r.y,o.y,i.y,s.y,r.z,o.z,i.z,s.z,0,0,0,1)}else e.rotation instanceof tt?s=e.rotation:(this.q_.setFromAxisAngle(Te,e.rotation),s=this.q_),t.compose(e.position,s,Ae);this.particleSystem.worldSpace||t.multiplyMatrices(this.particleSystem.emitter.matrixWorld,t)}}class Fe{initialize(t,e){this.ps=e,this.x.startGen(t.memory),this.y.startGen(t.memory),this.z.startGen(t.memory)}constructor(t,e,s,i="world"){this.x=t,this.y=e,this.z=s,this.space=i,this.type="ForceOverLife",this._temp=new et,this._frame=new le}_step(t){const e=this.ps;return(void 0===e||e.worldSpace)&&"world"===this.space?t*(e?.motionScale??1):t}update(t,e){const s=t.age/t.life;this._temp.set(this.x.genValue(t.memory,s),this.y.genValue(t.memory,s),this.z.genValue(t.memory,s));const i=void 0===this.ps||this.ps.worldSpace;this._frame.toSimulation(this._temp,this.space,i),t.velocity.addScaledVector(this._temp,this._step(e))}updateAll(t,e,s){const i=this._temp,n=this.x,r=this.y,o=this.z,a=this._frame,h=this.space,l=void 0===this.ps||this.ps.worldSpace,c=l!==("world"===h),u=this._step(s);for(let s=0;s<e;s++){const e=t[s];if(e.age>=e.life)continue;const d=e.memory,f=e.age/e.life;i.set(n.genValue(d,f),r.genValue(d,f),o.genValue(d,f)),c&&a.toSimulation(i,h,l),e.velocity.addScaledVector(i,u)}}toJSON(){return{type:this.type,x:this.x.toJSON(),y:this.y.toJSON(),z:this.z.toJSON(),..."world"!==this.space?{space:this.space}:{}}}static fromJSON(t){return new Fe(Jt(t.x),Jt(t.y),Jt(t.z),ae(t.space,"world"))}frameUpdate(t){void 0!==this.ps&&this.ps.worldSpace!==("world"===this.space)&&this._frame.refresh(this.ps)}clone(){return new Fe(this.x.clone(),this.y.clone(),this.z.clone(),this.space)}reset(){}}class Be{constructor(t,e={}){this.type="FrameOverLife",this.salt=new Dt(0,1),this.frame=t,this.fps=e.fps??0,this.cycles=e.cycles??1,this.frameCount=e.frameCount??0,this.loop=e.loop??!0,this.random=e.random??!1,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),this.salt.startGen(t.memory)}update(t,e){t.uvTile=this.frameAt(t,t.age,t.age/t.life)}updateAll(t,e,s){for(let s=0;s<e;s++){const e=t[s];e.age>=e.life||(e.uvTile=this.frameAt(e,e.age,e.age/e.life))}}frameAt(t,e,s){if(this.fps>0){const i=this.sampleFrame(t,s),n=this.frameCount;let r=Math.floor(e*this.fps)+this.offset(t);return this.random&&n>0?i+Math.floor(Be.hash(r,this.saltOf(t))*n):(n>0&&(r=this.loop?Be.wrap(r,n):Math.min(r,n-1)),i+r)}let i;if(1!==this.cycles&&this.cycles>0){const e=s*this.cycles;i=this.sampleFrame(t,s>=1?1:e-Math.floor(e))}else i=this.sampleFrame(t,s);return void 0!==this.startFrame&&(i+=this.offset(t),this.frameCount>0&&(i=Be.wrap(i,this.frameCount))),i}offset(t){return void 0!==this.startFrame?Math.floor(this.startFrame.genValue(t.memory)):0}saltOf(t){const e=t.memory[this.salt.indexCount];return"number"==typeof e?e:0}static hash(t,e){const s=43758.5453*Math.sin(12.9898*t+7833.233*e);return Math.min(s-Math.floor(s),.999999)}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},...this.random?{random:!0}:{},...void 0!==this.startFrame?{startFrame:this.startFrame.toJSON()}:{}}}static fromJSON(t){return new Be(Jt(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,random:!0===t.random,startFrame:void 0!==t.startFrame?Jt(t.startFrame):void 0})}clone(){return new Be(this.frame.clone(),{fps:this.fps,cycles:this.cycles,frameCount:this.frameCount,loop:this.loop,random:this.random,startFrame:this.startFrame?.clone()})}reset(){}}class Ie{constructor(t,e){this.center=t,this.magnitude=e,this.type="GravityForce",this.temp=new et}initialize(t){}update(t,e){const s=t.position.distanceToSquared(this.center);0!==s&&(this.temp.copy(this.center).sub(t.position).normalize(),t.velocity.addScaledVector(this.temp,this.magnitude/s*e))}updateAll(t,e,s){const i=this.center.x,n=this.center.y,r=this.center.z,o=this.magnitude*s;for(let s=0;s<e;s++){const e=t[s];if(e.age>=e.life)continue;const a=e.position,h=i-a.x,l=n-a.y,c=r-a.z,u=h*h+l*l+c*c;if(0===u)continue;const d=o/(u*Math.sqrt(u)),f=e.velocity;f.x+=h*d,f.y+=l*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 Ie(Ut(t.center,new et(0,0,0)),"number"==typeof t.magnitude?t.magnitude:0)}clone(){return new Ie(this.center.clone(),this.magnitude)}reset(){}}class Ue{constructor(t=new Rt(1),e="initial"){this.multiplier=t,this.mode=e,this.type="InheritVelocity",this._temp=new et,this._tempPos=new et,this._tempQInv=new tt,this._tempScaleInv=new et(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 Ue(t.multiplier?Jt(t.multiplier):new Rt(1),"current"===t.mode?"current":"initial")}clone(){return new Ue(this.multiplier.clone(),this.mode)}reset(){}}class Ne{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"}dampenStep(t){const e=this.dampen>1?1:this.dampen>0?this.dampen:0;return 1-Math.pow(1-e/3,60*t)}update(t,e){const s=t.velocity.length(),i=this.speed.genValue(t.memory,t.age/t.life)*this.motionScale();if(s>i){const n=(s-i)/s;t.velocity.multiplyScalar(1-n*this.dampenStep(e))}}updateAll(t,e,s){const i=this.speed,n=this.dampenStep(s),r=this.motionScale();for(let s=0;s<e;s++){const e=t[s];if(e.age>=e.life)continue;const o=e.velocity,a=o.length(),h=i.genValue(e.memory,e.age/e.life)*r;a>h&&o.multiplyScalar(1-(a-h)/a*n)}}toJSON(){return{type:this.type,speed:this.speed.toJSON(),dampen:this.dampen}}static fromJSON(t){return new Ne(Jt(t.speed),"number"==typeof t.dampen?t.dampen:1)}frameUpdate(t){this.speed.refreshTable?.()}clone(){return new Ne(this.speed.clone(),this.dampen)}reset(){}}const Re=.5*(Math.sqrt(3)-1),De=(3-Math.sqrt(3))/6,ke=1/3,Le=1/6,qe=(Math.sqrt(5)-1)/4,Je=(5-Math.sqrt(5))/20,We=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]),Ge=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 Qe{constructor(t=e){const e="function"==typeof t?t:function(t){let e=0,s=0,i=0,n=1;const r=function(){let t=4022871197;return function(e){e=e.toString();for(let s=0;s<e.length;s++){t+=e.charCodeAt(s);let i=.02519603282416938*t;t=i>>>0,i-=t,i*=t,t=i>>>0,i-=t,t+=4294967296*i}return 2.3283064365386963e-10*(t>>>0)}}();e=r(" "),s=r(" "),i=r(" "),e-=r(t),e<0&&(e+=1);s-=r(t),s<0&&(s+=1);i-=r(t),i<0&&(i+=1);return function(){const t=2091639*e+2.3283064365386963e-10*n;return e=s,s=i,i=t-(n=0|t)}}(t);this.p=function(t){const e=new Uint8Array(256);for(let t=0;t<256;t++)e[t]=t;for(let s=0;s<255;s++){const i=s+~~(t()*(256-s)),n=e[s];e[s]=e[i],e[i]=n}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 s=this.permMod12,i=this.perm;let n=0,r=0,o=0;const a=(t+e)*Re,h=Math.floor(t+a),l=Math.floor(e+a),c=(h+l)*De,u=t-(h-c),d=e-(l-c);let f,p;u>d?(f=1,p=0):(f=0,p=1);const m=u-f+De,y=d-p+De,g=u-1+2*De,v=d-1+2*De,x=255&h,S=255&l;let w=.5-u*u-d*d;if(w>=0){const t=3*s[x+i[S]];w*=w,n=w*w*(We[t]*u+We[t+1]*d)}let b=.5-m*m-y*y;if(b>=0){const t=3*s[x+f+i[S+p]];b*=b,r=b*b*(We[t]*m+We[t+1]*y)}let M=.5-g*g-v*v;if(M>=0){const t=3*s[x+1+i[S+1]];M*=M,o=M*M*(We[t]*g+We[t+1]*v)}return 70*(n+r+o)}noise3D(t,e,s){const i=this.permMod12,n=this.perm;let r,o,a,h;const l=(t+e+s)*ke,c=Math.floor(t+l),u=Math.floor(e+l),d=Math.floor(s+l),f=(c+u+d)*Le,p=t-(c-f),m=e-(u-f),y=s-(d-f);let g,v,x,S,w,b;p>=m?m>=y?(g=1,v=0,x=0,S=1,w=1,b=0):p>=y?(g=1,v=0,x=0,S=1,w=0,b=1):(g=0,v=0,x=1,S=1,w=0,b=1):m<y?(g=0,v=0,x=1,S=0,w=1,b=1):p<y?(g=0,v=1,x=0,S=0,w=1,b=1):(g=0,v=1,x=0,S=1,w=1,b=0);const M=p-g+Le,z=m-v+Le,_=y-x+Le,V=p-S+2*Le,A=m-w+2*Le,T=y-b+2*Le,O=p-1+.5,$=m-1+.5,P=y-1+.5,C=255&c,E=255&u,F=255&d;let B=.6-p*p-m*m-y*y;if(B<0)r=0;else{const t=3*i[C+n[E+n[F]]];B*=B,r=B*B*(We[t]*p+We[t+1]*m+We[t+2]*y)}let I=.6-M*M-z*z-_*_;if(I<0)o=0;else{const t=3*i[C+g+n[E+v+n[F+x]]];I*=I,o=I*I*(We[t]*M+We[t+1]*z+We[t+2]*_)}let U=.6-V*V-A*A-T*T;if(U<0)a=0;else{const t=3*i[C+S+n[E+w+n[F+b]]];U*=U,a=U*U*(We[t]*V+We[t+1]*A+We[t+2]*T)}let N=.6-O*O-$*$-P*P;if(N<0)h=0;else{const t=3*i[C+1+n[E+1+n[F+1]]];N*=N,h=N*N*(We[t]*O+We[t+1]*$+We[t+2]*P)}return 32*(r+o+a+h)}noise4D(t,e,s,i){const n=this.perm;let r,o,a,h,l;const c=(t+e+s+i)*qe,u=Math.floor(t+c),d=Math.floor(e+c),f=Math.floor(s+c),p=Math.floor(i+c),m=(u+d+f+p)*Je,y=t-(u-m),g=e-(d-m),v=s-(f-m),x=i-(p-m);let S=0,w=0,b=0,M=0;y>g?S++:w++,y>v?S++:b++,y>x?S++:M++,g>v?w++:b++,g>x?w++:M++,v>x?b++:M++;const z=S>=3?1:0,_=w>=3?1:0,V=b>=3?1:0,A=M>=3?1:0,T=S>=2?1:0,O=w>=2?1:0,$=b>=2?1:0,P=M>=2?1:0,C=S>=1?1:0,E=w>=1?1:0,F=b>=1?1:0,B=M>=1?1:0,I=y-z+Je,U=g-_+Je,N=v-V+Je,R=x-A+Je,D=y-T+2*Je,k=g-O+2*Je,L=v-$+2*Je,q=x-P+2*Je,J=y-C+3*Je,W=g-E+3*Je,G=v-F+3*Je,Q=x-B+3*Je,j=y-1+4*Je,H=g-1+4*Je,Y=v-1+4*Je,X=x-1+4*Je,Z=255&u,K=255&d,tt=255&f,et=255&p;let st=.6-y*y-g*g-v*v-x*x;if(st<0)r=0;else{const t=n[Z+n[K+n[tt+n[et]]]]%32*4;st*=st,r=st*st*(Ge[t]*y+Ge[t+1]*g+Ge[t+2]*v+Ge[t+3]*x)}let it=.6-I*I-U*U-N*N-R*R;if(it<0)o=0;else{const t=n[Z+z+n[K+_+n[tt+V+n[et+A]]]]%32*4;it*=it,o=it*it*(Ge[t]*I+Ge[t+1]*U+Ge[t+2]*N+Ge[t+3]*R)}let nt=.6-D*D-k*k-L*L-q*q;if(nt<0)a=0;else{const t=n[Z+T+n[K+O+n[tt+$+n[et+P]]]]%32*4;nt*=nt,a=nt*nt*(Ge[t]*D+Ge[t+1]*k+Ge[t+2]*L+Ge[t+3]*q)}let rt=.6-J*J-W*W-G*G-Q*Q;if(rt<0)h=0;else{const t=n[Z+C+n[K+E+n[tt+F+n[et+B]]]]%32*4;rt*=rt,h=rt*rt*(Ge[t]*J+Ge[t+1]*W+Ge[t+2]*G+Ge[t+3]*Q)}let ot=.6-j*j-H*H-Y*Y-X*X;if(ot<0)l=0;else{const t=n[Z+1+n[K+1+n[tt+1+n[et+1]]]]%32*4;ot*=ot,l=ot*ot*(Ge[t]*j+Ge[t+1]*H+Ge[t+2]*Y+Ge[t+3]*X)}return 27*(r+o+a+h+l)}}const je=100,He=new Array(je),Ye=new et,Xe=new tt;function Ze(t){let e=He[t];return void 0===e&&(e=new Qe(t),He[t]=e),e}class Ke{constructor(t,e,s=new Rt(1),i=new Rt(0),n=new Rt(0),r){this.frequency=t,this.power=e,this.positionAmount=s,this.rotationAmount=i,this.scrollSpeed=n,this.remap=r,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,s){const i=t.noise2D(0,e),n=this.remap;return void 0===n?i:n.genValue(s,.5*(i+1))}initialize(t){const e="number"==typeof t.rotation;let s=t._noiseState;if(void 0===s)return s={lastPos:new et,lastRot:0,lastRotQ:e?null:new tt,generatorX:Ze(ze(0,je)),generatorY:Ze(ze(0,je)),generatorZ:Ze(ze(0,je)),generatorW:Ze(ze(0,je))},void(t._noiseState=s);s.lastPos.set(0,0,0),s.lastRot=0,e?s.lastRotQ=null:null===s.lastRotQ?s.lastRotQ=new tt:s.lastRotQ.set(0,0,0,1),s.generatorX=Ze(ze(0,je)),s.generatorY=Ze(ze(0,je)),s.generatorZ=Ze(ze(0,je)),s.generatorW=Ze(ze(0,je))}static constantOf(t){return t instanceof Rt?t.value:NaN}rotateByNoise(t,e,s,i,n){const r=e.lastRotQ;t.multiply(r.invert()),Ye.set(this.sample(e.generatorX,s,n),this.sample(e.generatorY,s,n),this.sample(e.generatorZ,s,n));const o=Ye.length();o>0?(Ye.multiplyScalar(1/o),Xe.setFromAxisAngle(Ye,this.sample(e.generatorW,s,n)*Math.PI*i)):Xe.set(0,0,0,1),t.multiply(Xe),r.copy(Xe)}update(t,e){const s=t._noiseState;if(void 0===s)return;const i=t.memory,n=t.age/t.life,r=this._frequency,o=r==r?r:this.frequency.genValue(i,n),a=this._power,h=a==a?a:this.power.genValue(i,n),l=this._positionAmount,c=l==l?l:this.positionAmount.genValue(i,n),u=this._rotationAmount,d=u==u?u:this.rotationAmount.genValue(i,n),f=t.age*o+this.scrollOffset;if(c>0){const e=h*c;t.position.sub(s.lastPos),Ye.set(this.sample(s.generatorX,f,i)*e,this.sample(s.generatorY,f,i)*e,this.sample(s.generatorZ,f,i)*e),t.position.add(Ye),s.lastPos.copy(Ye)}if(d>0){const e=h*d;if("number"==typeof t.rotation){const n=this.sample(s.generatorW,f,i)*Math.PI*e;t.rotation=t.rotation-s.lastRot+n,s.lastRot=n}else null!==s.lastRotQ&&this.rotateByNoise(t.rotation,s,f,e,i)}}updateAll(t,e,s){const i=e>0?t[0].store:void 0;if(void 0===i){for(let i=0;i<e;i++){const e=t[i];e.age<e.life&&this.update(e,s)}return}const n=i.position,r=i.rotation,o=i.scalars,a=ve.SCALAR_STRIDE,h=this._frequency,l=this._power,c=this._positionAmount,u=this._rotationAmount;for(let s=0,i=0,d=0;s<e;s++,i+=3,d+=a){const e=o[d],a=o[d+1];if(e>=a)continue;const f=t[s],p=f._noiseState;if(void 0===p)continue;const m=f.memory,y=e/a,g=h==h?h:this.frequency.genValue(m,y),v=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*g+this.scrollOffset;if(x>0){const t=v*x,e=p.lastPos,s=this.sample(p.generatorX,w,m)*t,r=this.sample(p.generatorY,w,m)*t,o=this.sample(p.generatorZ,w,m)*t;n[i]=Math.fround(n[i]-e.x)+s,n[i+1]=Math.fround(n[i+1]-e.y)+r,n[i+2]=Math.fround(n[i+2]-e.z)+o,e.set(s,r,o)}if(S>0){const t=v*S;if("number"==typeof f.rotation){const e=this.sample(p.generatorW,w,m)*Math.PI*t;r[s]=r[s]-p.lastRot+e,p.lastRot=e}else null!==p.lastRotQ&&this.rotateByNoise(f.rotation,p,w,t,m)}}}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=Ke.constantOf(this.frequency),this._power=Ke.constantOf(this.power),this._positionAmount=Ke.constantOf(this.positionAmount),this._rotationAmount=Ke.constantOf(this.rotationAmount)}static fromJSON(t){return new Ke(Jt(t.frequency),Jt(t.power),t.positionAmount?Jt(t.positionAmount):void 0,t.rotationAmount?Jt(t.rotationAmount):void 0,t.scrollSpeed?Jt(t.scrollSpeed):new Rt(0),t.remap?Jt(t.remap):void 0)}clone(){return new Ke(this.frequency.clone(),this.power.clone(),this.positionAmount.clone(),this.rotationAmount.clone(),this.scrollSpeed.clone(),this.remap?.clone())}reset(){this.scrollOffset=0}}class ts{constructor(t,e=new et(0,1,0),s="local"){this.orbitSpeed=t,this.axis=e,this.space=s,this.type="OrbitOverLife",this.temp=new et,this._frame=new le,this._axis=new et(0,1,0),this._center=new et,this.rotation=new tt,this.refreshAxis()}initialize(t,e){this.ps=e,this.orbitSpeed.startGen(t.memory)}refreshAxis(){const t=this._axis.copy(this.axis),e=this._center.set(0,0,0);if(void 0!==this.ps){const s=this.ps.worldSpace;this._frame.toSimulation(t,this.space,s),this._frame.pointToSimulation(e,this.space,s)}const s=t.length();s>0?t.multiplyScalar(1/s):t.set(0,0,0)}converts(){return void 0!==this.ps&&this.ps.worldSpace!==("world"===this.space)}update(t,e){const s=this._axis;if(0===s.x&&0===s.y&&0===s.z)return;const i=t.position;i.sub(this._center),this.temp.copy(i).projectOnVector(s),this.rotation.setFromAxisAngle(s,this.orbitSpeed.genValue(t.memory,t.age/t.life)*e),i.sub(this.temp),i.applyQuaternion(this.rotation),i.add(this.temp),i.add(this._center)}updateAll(t,e,s){const i=this._axis;if(0===i.x&&0===i.y&&0===i.z)return;const n=this.orbitSpeed,r=this._center,o=this.temp,a=this.rotation;for(let h=0;h<e;h++){const e=t[h];if(e.age>=e.life)continue;const l=e.position;l.sub(r),o.copy(l).projectOnVector(i),a.setFromAxisAngle(i,n.genValue(e.memory,e.age/e.life)*s),l.sub(o),l.applyQuaternion(a),l.add(o),l.add(r)}}frameUpdate(t){this.converts()&&this._frame.refresh(this.ps),this.refreshAxis()}toJSON(){return{type:this.type,orbitSpeed:this.orbitSpeed.toJSON(),axis:[this.axis.x,this.axis.y,this.axis.z],..."local"!==this.space?{space:this.space}:{}}}static fromJSON(t){return new ts(Jt(t.orbitSpeed),t.axis?new et(t.axis[0],t.axis[1],t.axis[2]):void 0,ae(t.space,"local"))}clone(){return new ts(this.orbitSpeed.clone(),this.axis.clone(),this.space)}reset(){}}class es{constructor(t){this.angularVelocity=t,this.type="Rotation3DOverLife",this.tempQuat=new tt}initialize(t){t.rotation instanceof tt&&(t.angularVelocity=new tt,this.angularVelocity.startGen(t.memory))}update(t,e){if(t.rotation instanceof tt){this.angularVelocity.genValue(t.memory,this.tempQuat,e,t.age/t.life),t.rotation.multiply(this.tempQuat);const s=t.angularVelocity;s instanceof tt&&s.copy(this.tempQuat)}}toJSON(){return{type:this.type,angularVelocity:this.angularVelocity.toJSON()}}static fromJSON(t){return new es(ie(t.angularVelocity))}frameUpdate(t){}clone(){return new es(this.angularVelocity.clone())}reset(){}}class ss{constructor(t,e){this.angularVelocity=t,this.speedRange=e,this.type="RotationBySpeed",this.tempQuat=new tt}initialize(t){"number"==typeof t.rotation&&this.angularVelocity.startGen(t.memory)}update(t,e){if("number"==typeof t.rotation){const s=me(t,this.speedRange),i=this.angularVelocity.genValue(t.memory,s);t.rotation+=e*i,t.angularVelocity=i}}toJSON(){return{type:this.type,angularVelocity:this.angularVelocity.toJSON(),speedRange:this.speedRange.toJSON()}}static fromJSON(t){return new ss(Jt(t.angularVelocity),t.speedRange?Dt.fromJSON(t.speedRange):new Dt(0,1))}frameUpdate(t){}clone(){return new ss(this.angularVelocity.clone(),this.speedRange.clone())}reset(){}}class is{constructor(t){this.angularVelocity=t,this.type="RotationOverLife",this.tempQuat=new tt}initialize(t){"number"==typeof t.rotation?this.angularVelocity.startGen(t.memory):t.rotation instanceof tt&&(this.angularVelocity.startGen(t.memory),t.angularVelocity instanceof tt||(t.angularVelocity=new tt))}update(t,e){if("number"==typeof t.rotation){const s=this.angularVelocity.genValue(t.memory,t.age/t.life);t.rotation+=e*s,t.angularVelocity=s}else if(t.rotation instanceof tt){const s=this.angularVelocity.genValue(t.memory,t.age/t.life);this.turnAboutZ(t,t.rotation,s*e)}}updateAll(t,e,s){const i=this.angularVelocity;for(let n=0;n<e;n++){const e=t[n];if(e.age>=e.life)continue;const r=e.rotation;if("number"==typeof r){const t=i.genValue(e.memory,e.age/e.life);e.rotation=r+s*t,e.angularVelocity=t}else if(r instanceof tt){const t=i.genValue(e.memory,e.age/e.life);this.turnAboutZ(e,r,t*s)}}}turnAboutZ(t,e,s){const i=this.tempQuat.setFromAxisAngle(Te,s);e.multiply(i);const n=t.angularVelocity;n instanceof tt&&n.copy(i)}toJSON(){return{type:this.type,angularVelocity:this.angularVelocity.toJSON()}}static fromJSON(t){return new is(Jt(t.angularVelocity))}frameUpdate(t){this.angularVelocity.refreshTable?.()}clone(){return new is(this.angularVelocity.clone())}reset(){}}class ns{initialize(t){this.size.startGen(t.memory)}constructor(t,e){this.size=t,this.speedRange=e,this.type="SizeBySpeed"}update(t){const e=me(t,this.speedRange);this.size instanceof ne?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 ns(oe(t.size),t.speedRange?Dt.fromJSON(t.speedRange):new Dt(0,1))}frameUpdate(t){}clone(){return new ns(this.size.clone(),this.speedRange.clone())}reset(){}}class rs{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 ne}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 s=this._size.genValue(t.memory,e),i=t.size,n=t.startSize;i.x=n.x*s,i.y=n.y*s,i.z=n.z*s}}updateAll(t,e,s){if(this._sizeIsVector3){const s=this._size;for(let i=0;i<e;i++){const e=t[i];e.age>=e.life||s.genValue(e.memory,e.size,e.age/e.life).multiply(e.startSize)}return}const i=this._size;for(let s=0;s<e;s++){const e=t[s];if(e.age>=e.life)continue;const n=i.genValue(e.memory,e.age/e.life),r=e.size,o=e.startSize;r.x=o.x*n,r.y=o.y*n,r.z=o.z*n}}toJSON(){return{type:this.type,size:this.size.toJSON()}}static fromJSON(t){return new rs(oe(t.size))}frameUpdate(t){this._size.refreshTable?.()}clone(){return new rs(this.size.clone())}reset(){}}class os{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,s){const i=this.speed;for(let s=0;s<e;s++){const e=t[s];e.age>=e.life||(e.speedModifier=i.genValue(e.memory,e.age/e.life))}}toJSON(){return{type:this.type,speed:this.speed.toJSON()}}static fromJSON(t){return new os(Jt(t.speed))}frameUpdate(t){this.speed.refreshTable?.()}clone(){return new os(this.speed.clone())}reset(){}}function as(t){return 0===t?0:1/t}class hs{constructor(t,e,s,i,n=0){this.scale=t,this.octaves=e,this.velocityMultiplier=s,this.timeScale=i,this.seed=n,this.type="TurbulenceField",this.timeOffset=new et,this.initialOffset=new et,this.temp=new et,this.temp2=new et;const r=V(n);this.generator=new Qe(r),this.initialOffset.set(r()*as(t.x)*i.x,r()*as(t.y)*i.y,r()*as(t.z)*i.z),this.timeOffset.copy(this.initialOffset)}initialize(t){}update(t,e){const s=t.position.x*as(this.scale.x),i=t.position.y*as(this.scale.y),n=t.position.z*as(this.scale.z);this.temp.set(0,0,0);let r=1;for(let t=0;t<this.octaves;t++)this.temp2.set(this.generator.noise4D(s*r,i*r,n*r,this.timeOffset.x*r)/r,this.generator.noise4D(s*r,i*r,n*r,this.timeOffset.y*r)/r,this.generator.noise4D(s*r,i*r,n*r,this.timeOffset.z*r)/r),this.temp.add(this.temp2),r*=2;this.temp.multiply(this.velocityMultiplier),t.velocity.addScaledVector(this.temp,e)}updateAll(t,e,s){const i=e>0?t[0].store:void 0;if(void 0===i){for(let i=0;i<e;i++){const e=t[i];e.age<e.life&&this.update(e,s)}return}const n=i.position,r=i.velocity,o=i.scalars,a=ve.SCALAR_STRIDE,h=this.generator,l=this.octaves,c=as(this.scale.x),u=as(this.scale.y),d=as(this.scale.z),f=this.velocityMultiplier.x*s,p=this.velocityMultiplier.y*s,m=this.velocityMultiplier.z*s,y=this.timeOffset.x,g=this.timeOffset.y,v=this.timeOffset.z;for(let t=0,s=0,i=0;t<e;t++,s+=3,i+=a){if(o[i]>=o[i+1])continue;const t=n[s]*c,e=n[s+1]*u,a=n[s+2]*d;let x=0,S=0,w=0,b=1;for(let s=0;s<l;s++){const s=t*b,i=e*b,n=a*b;x+=h.noise4D(s,i,n,y*b)/b,S+=h.noise4D(s,i,n,g*b)/b,w+=h.noise4D(s,i,n,v*b)/b,b*=2}r[s]+=x*f,r[s+1]+=S*p,r[s+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],...0!==this.seed?{seed:this.seed}:{}}}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 hs(Ut(t.scale,new et(1,1,1)),"number"==typeof t.octaves?t.octaves:1,Ut(t.velocityMultiplier,new et(1,1,1)),Ut(t.timeScale,new et(1,1,1)),"number"==typeof t.seed?t.seed:0)}clone(){return new hs(this.scale.clone(),this.octaves,this.velocityMultiplier.clone(),this.timeScale.clone(),this.seed)}reset(){this.timeOffset.copy(this.initialOffset)}}const ls=new et(1,0,0),cs=new et(0,1,0),us=new et(0,0,1);class ds{constructor(t=new Rt(0),e=new Rt(0),s=new Rt(0),i=new Rt(0),n=new Rt(0),r=new Rt(0),o="local",a=new Rt(0),h=new et){this.linearX=t,this.linearY=e,this.linearZ=s,this.orbitalX=i,this.orbitalY=n,this.orbitalZ=r,this.space=o,this.radial=a,this.orbitalOffset=h,this.type="VelocityOverLife",this._temp=new et,this._tempEmitterPos=new et,this._tempQ=new tt,this._tempQInv=new tt,this._tempScale=new et(1,1,1),this._tempScaleInv=new et(1,1,1),this._tempRot=new tt,this._axisX=new et(1,0,0),this._axisY=new et(0,1,0),this._axisZ=new et(0,0,1),this._center=new et}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(ls),this._axisY.copy(cs),this._axisZ.copy(us),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 s=t.age/t.life;this._temp.set(this.linearX.genValue(t.memory,s),this.linearY.genValue(t.memory,s),this.linearZ.genValue(t.memory,s));const i=void 0!==this.ps&&this.ps.worldSpace;i&&"local"===this.space?this._temp.multiply(this._tempScale).applyQuaternion(this._tempQ):i||"world"!==this.space||this._temp.multiply(this._tempScaleInv).applyQuaternion(this._tempQInv),t.position.addScaledVector(this._temp,e);const n=this.radial.genValue(t.memory,s);if(0!==n){this._temp.copy(t.position).sub(this._center);const s=this._temp.length();s>0&&t.position.addScaledVector(this._temp,n*e/s)}const r=this.orbitalX.genValue(t.memory,s)*e,o=this.orbitalY.genValue(t.memory,s)*e,a=this.orbitalZ.genValue(t.memory,s)*e;0===r&&0===o&&0===a||(t.position.sub(this._center),this.orbit(t.position,this._axisX,r),this.orbit(t.position,this._axisY,o),this.orbit(t.position,this._axisZ,a),t.position.add(this._center))}orbit(t,e,s){0!==s&&(this._tempRot.setFromAxisAngle(e,s),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?Jt(t):new Rt(0);return new ds(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 et(t.orbitalOffset[0]??0,t.orbitalOffset[1]??0,t.orbitalOffset[2]??0):new et)}clone(){return new ds(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 fs{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 Me))return;const e=t.memory;t.headWidthScale=this.absolute?1:this.width.genValue(e,0);const s=t.historyCount;if(0===s)return;const i=t.historyCapacity,n=t.historySizes,r=t.historyBaseSizes,o=1/s,a=this.absolute;let h=t.getHistoryIndex(0);for(let t=0;t<s;t++){const l=this.width.genValue(e,(s-t)*o);n[h]=a?l:r[h]*l,h++,h===i&&(h=0)}}frameUpdate(t){}toJSON(){return{type:this.type,width:this.width.toJSON(),absolute:this.absolute}}static fromJSON(t){return new fs(Jt(t.width),t.absolute??!0)}clone(){return new fs(this.width.clone(),this.absolute)}reset(){}}const ps={ApplyForce:{type:"ApplyForce",constructor:ce,params:[["direction",["vec3"]],["magnitude",["value"]],["space",["string"]]],loadJSON:ce.fromJSON},Noise:{type:"Noise",constructor:Ke,params:[["frequency",["value"]],["power",["value"]],["positionAmount",["value"]],["rotationAmount",["value"]],["scrollSpeed",["value"]],["remap",["valueFunc"]]],loadJSON:Ke.fromJSON},TurbulenceField:{type:"TurbulenceField",constructor:hs,params:[["scale",["vec3"]],["octaves",["number"]],["velocityMultiplier",["vec3"]],["timeScale",["vec3"]],["seed",["number"]]],loadJSON:hs.fromJSON},GravityForce:{type:"GravityForce",constructor:Ie,params:[["center",["vec3"]],["magnitude",["number"]]],loadJSON:Ie.fromJSON},ColorOverLife:{type:"ColorOverLife",constructor:ge,params:[["color",["colorFunc"]]],loadJSON:ge.fromJSON},RotationOverLife:{type:"RotationOverLife",constructor:is,params:[["angularVelocity",["value","valueFunc"]]],loadJSON:is.fromJSON},Rotation3DOverLife:{type:"Rotation3DOverLife",constructor:es,params:[["angularVelocity",["rotationFunc"]]],loadJSON:es.fromJSON},SizeOverLife:{type:"SizeOverLife",constructor:rs,params:[["size",["value","valueFunc","vec3Func"]]],loadJSON:rs.fromJSON},ColorBySpeed:{type:"ColorBySpeed",constructor:ye,params:[["color",["colorFunc"]],["speedRange",["range"]]],loadJSON:ye.fromJSON},RotationBySpeed:{type:"RotationBySpeed",constructor:ss,params:[["angularVelocity",["value","valueFunc"]],["speedRange",["range"]]],loadJSON:ss.fromJSON},SizeBySpeed:{type:"SizeBySpeed",constructor:ns,params:[["size",["value","valueFunc","vec3Func"]],["speedRange",["range"]]],loadJSON:ns.fromJSON},SpeedOverLife:{type:"SpeedOverLife",constructor:os,params:[["speed",["value","valueFunc"]]],loadJSON:os.fromJSON},FrameOverLife:{type:"FrameOverLife",constructor:Be,params:[["frame",["value","valueFunc"]],["fps",["number"]],["cycles",["number"]],["frameCount",["number"]],["loop",["boolean"]],["random",["boolean"]],["startFrame",["value"]]],loadJSON:Be.fromJSON},ForceOverLife:{type:"ForceOverLife",constructor:Fe,params:[["x",["value","valueFunc"]],["y",["value","valueFunc"]],["z",["value","valueFunc"]],["space",["string"]]],loadJSON:Fe.fromJSON},VelocityOverLife:{type:"VelocityOverLife",constructor:ds,params:[["linearX",["value","valueFunc"]],["linearY",["value","valueFunc"]],["linearZ",["value","valueFunc"]],["orbitalX",["value","valueFunc"]],["orbitalY",["value","valueFunc"]],["orbitalZ",["value","valueFunc"]],["space",["string"]],["radial",["value","valueFunc"]],["orbitalOffset",["vec3"]]],loadJSON:ds.fromJSON},InheritVelocity:{type:"InheritVelocity",constructor:Ue,params:[["multiplier",["value","valueFunc"]],["mode",["string"]]],loadJSON:Ue.fromJSON},OrbitOverLife:{type:"OrbitOverLife",constructor:ts,params:[["orbitSpeed",["value","valueFunc"]],["axis",["vec3"]],["space",["string"]]],loadJSON:ts.fromJSON},WidthOverLength:{type:"WidthOverLength",constructor:fs,params:[["width",["value","valueFunc"]],["absolute",["boolean"]]],loadJSON:fs.fromJSON},ChangeEmitDirection:{type:"ChangeEmitDirection",constructor:pe,params:[["angle",["value"]]],loadJSON:pe.fromJSON},ApplySequences:{type:"ApplySequences",constructor:fe,params:[["delay",["number"]]],loadJSON:fe.fromJSON},EmitSubParticleSystem:{type:"EmitSubParticleSystem",constructor:Ee,params:[["particleSystem",["self"]],["useVelocityAsBasis",["boolean"]],["subParticleSystem",["particleSystem"]],["mode",["number"]],["emitProbability",["number"]]],loadJSON:Ee.fromJSON},LimitSpeedOverLife:{type:"LimitSpeedOverLife",constructor:Ne,params:[["speed",["value","valueFunc"]],["dampen",["number"]]],loadJSON:Ne.fromJSON},ApplyCollision:{type:"ApplyCollision",constructor:Pt,params:[["bounce",["number"]]],loadJSON:Pt.fromJSON}};function ms(t,e){const s=t?ps[t.type]:void 0;return s?s.loadJSON(t,e):(It(`${Nt("behavior",t)}; it is skipped.`),null)}const ys={PiecewiseBezier:qt,Vector3Function:ne,Quaternion:tt,ConstantValue:Rt,Gradient:Ht,Vector4View:Tt,AxisAngleGenerator:Wt,IntervalValue:Dt,ColorRange:Gt};function gs(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 vs(t){return`const vx = vel[o3], vy = vel[o3 + 1], vz = vel[o3 + 2];\n const speed = Math.sqrt(vx * vx + vy * vy + vz * vz) * scalars[s + 2];\n let ts = span${t} === 0 ? (speed >= lo${t} ? 1 : 0) : (speed - lo${t}) / span${t};\n ts = ts < 0 ? 0 : ts > 1 ? 1 : ts;`}function xs(t,e,s){return`let ${e};\n if (${t}_tbl !== null) {\n const tt = ${s};\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, ${s});`}function Ss(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 ws(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 bs(t,e,s,i,n,r,o){return`{\n const cx = 2 * (${n} * ${s} - ${r} * ${e});\n const cy = 2 * (${r} * ${t} - ${i} * ${s});\n const cz = 2 * (${i} * ${e} - ${n} * ${t});\n const nx = ${t} + ${o} * cx + ${n} * cz - ${r} * cy;\n const ny = ${e} + ${o} * cy + ${r} * cx - ${i} * cz;\n ${s} = ${s} + ${o} * cz + ${i} * cy - ${n} * cx;\n ${t} = nx;\n ${e} = ny;\n }`}function Ms(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 zs(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 _s(t,e,s,i){return`{\n const half = ${t} / 2;\n const sn = Math.sin(half);\n const qx = ${e} * sn, qy = ${s} * sn, qz = ${i} * sn, qw = Math.cos(half);\n ${bs("px","py","pz","qx","qy","qz","qw")}\n px = Math.fround(px); py = Math.fround(py); pz = Math.fround(pz);\n }`}function Vs(t,e){switch(t.type){case"ColorOverLife":return{setup:Ss(`g${e}`,`behaviors[${e}].color`),body:`{${ws(`g${e}`,"t")}}`};case"SizeOverLife":return{setup:`const g${e} = behaviors[${e}].size;\n const vec3_${e} = g${e} instanceof deps.Vector3Function;\n ${gs(`sg${e}`,`g${e}`)}`,body:`if (vec3_${e}) {\n g${e}.genValue(p.memory, p.size, t).multiply(p.startSize);\n } else {\n ${xs(`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 d${e} = b${e}._direction;\n const dx${e} = d${e}.x, dy${e} = d${e}.y, dz${e} = d${e}.z;\n const step${e} = b${e}._step(delta);\n ${gs(`g${e}`,`b${e}.magnitude`)}`,body:`{\n ${xs(`g${e}`,"m","t")}\n const s = m * step${e};\n vel[o3] += dx${e} * s; vel[o3 + 1] += dy${e} * s; vel[o3 + 2] += dz${e} * s;\n }`};case"RotationOverLife":return{setup:`${gs(`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 ${xs(`g${e}`,"rate","t")}\n rot[row] += delta * rate;\n angVel[row] = rate;\n } else if (quat_${e}) {\n ${xs(`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:`${gs(`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}) {${xs(`g${e}`,"v","t")} uvTile[row] = v;}\n else uvTile[row] = b${e}.frameAt(p, age, t);`};case"SpeedOverLife":return{setup:gs(`g${e}`,`behaviors[${e}].speed`),body:`{${xs(`g${e}`,"v","t")} scalars[s + 2] = v;}`};case"ForceOverLife":return{setup:`const b${e} = behaviors[${e}];\n ${gs(`gx${e}`,`b${e}.x`)}\n ${gs(`gy${e}`,`b${e}.y`)}\n ${gs(`gz${e}`,`b${e}.z`)}\n const world${e} = b${e}.ps === undefined || b${e}.ps.worldSpace;\n const toWorld${e} = world${e} && b${e}.space === 'local';\n const toLocal${e} = !world${e} && b${e}.space === 'world';\n const step${e} = b${e}._step(delta);\n const fr${e} = b${e}._frame;\n ${zs(`sc${e}`,`toWorld${e} ? fr${e}.scale : fr${e}.scaleInverse`)}\n ${Ms(`q${e}`,`toWorld${e} ? fr${e}.quaternion : fr${e}.quaternionInverse`)}`,body:`{\n ${xs(`gx${e}`,"fx","t")}\n ${xs(`gy${e}`,"fy","t")}\n ${xs(`gz${e}`,"fz","t")}\n if (toWorld${e}) {\n fx *= sc${e}x; fy *= sc${e}y; fz *= sc${e}z;\n ${bs("fx","fy","fz",`q${e}x`,`q${e}y`,`q${e}z`,`q${e}w`)}\n } else if (toLocal${e}) {\n ${bs("fx","fy","fz",`q${e}x`,`q${e}y`,`q${e}z`,`q${e}w`)}\n fx *= sc${e}x; fy *= sc${e}y; fz *= sc${e}z;\n }\n vel[o3] += fx * step${e}; vel[o3 + 1] += fy * step${e}; vel[o3 + 2] += fz * step${e};}`};case"LimitSpeedOverLife":return{setup:`const b${e} = behaviors[${e}];\n ${gs(`g${e}`,`b${e}.speed`)}\n const dampen${e} = b${e}.dampenStep(delta);\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 ${xs(`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 ${Ss(`g${e}`,`b${e}.color`)}\n const lo${e} = b${e}.speedRange.a;\n const span${e} = b${e}.speedRange.b - lo${e};`,body:`{${vs(e)}\n ${ws(`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 ${gs(`sg${e}`,`g${e}`)}`,body:`{${vs(e)}\n if (vec3_${e}) {\n g${e}.genValue(p.memory, p.size, ts).multiply(p.startSize);\n } else {\n ${xs(`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 ${gs(`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 ${vs(e)}\n ${xs(`g${e}`,"rate","ts")}\n rot[row] += delta * rate;\n angVel[row] = rate;\n }`};case"OrbitOverLife":return{setup:`const b${e} = behaviors[${e}];\n ${gs(`g${e}`,`b${e}.orbitSpeed`)}\n ${zs(`ax${e}`,`b${e}._axis`)}\n ${zs(`c${e}`,`b${e}._center`)}\n const alen${e} = ax${e}x * ax${e}x + ax${e}y * ax${e}y + ax${e}z * ax${e}z;\n const orbit${e} = alen${e} !== 0;\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:`if (orbit${e}) {\n let px = Math.fround(pos[o3] - c${e}x), py = Math.fround(pos[o3 + 1] - c${e}y), pz = Math.fround(pos[o3 + 2] - c${e}z);\n // Divided by the squared length as projectOnVector does, so the bits match.\n const f = (ax${e}x * px + ax${e}y * py + ax${e}z * pz) / alen${e};\n const tx = ax${e}x * f, ty = ax${e}y * f, tz = ax${e}z * f;\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 ${xs(`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 ${bs("px","py","pz","qx","qy","qz","qw")}\n px = Math.fround(Math.fround(px) + tx); py = Math.fround(Math.fround(py) + ty); pz = Math.fround(Math.fround(pz) + tz);\n pos[o3] = px + c${e}x;\n pos[o3 + 1] = py + c${e}y;\n pos[o3 + 2] = pz + c${e}z;}`};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 ${gs(`lx${e}`,`b${e}.linearX`)}\n ${gs(`ly${e}`,`b${e}.linearY`)}\n ${gs(`lz${e}`,`b${e}.linearZ`)}\n ${gs(`ox${e}`,`b${e}.orbitalX`)}\n ${gs(`oy${e}`,`b${e}.orbitalY`)}\n ${gs(`oz${e}`,`b${e}.orbitalZ`)}\n ${zs(`aX${e}`,`b${e}._axisX`)}\n ${zs(`aY${e}`,`b${e}._axisY`)}\n ${zs(`aZ${e}`,`b${e}._axisZ`)}\n ${gs(`rd${e}`,`b${e}.radial`)}\n ${zs(`ce${e}`,`b${e}._center`)}\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 ${zs(`sc${e}`,`toWorld${e} ? b${e}._tempScale : b${e}._tempScaleInv`)}\n ${Ms(`q${e}`,`toWorld${e} ? b${e}._tempQ : b${e}._tempQInv`)}`,body:`{\n ${xs(`lx${e}`,"fx","t")}\n ${xs(`ly${e}`,"fy","t")}\n ${xs(`lz${e}`,"fz","t")}\n if (convert${e}) {\n fx *= sc${e}x; fy *= sc${e}y; fz *= sc${e}z;\n ${bs("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 ${xs(`rd${e}`,"radial","t")}\n if (radial !== 0) {\n // Away from the centre, along the line through the particle.\n const dx = px - ce${e}x, dy = py - ce${e}y, dz = pz - ce${e}z;\n const length = Math.sqrt(dx * dx + dy * dy + dz * dz);\n if (length > 0) {\n const f = (radial * delta) / length;\n px = Math.fround(px + dx * f); py = Math.fround(py + dy * f); pz = Math.fround(pz + dz * f);\n }\n }\n ${xs(`ox${e}`,"rx","t")}\n ${xs(`oy${e}`,"ry","t")}\n ${xs(`oz${e}`,"rz","t")}\n rx *= delta; ry *= delta; rz *= delta;\n if (rx !== 0 || ry !== 0 || rz !== 0) {\n px = Math.fround(px - ce${e}x); py = Math.fround(py - ce${e}y); pz = Math.fround(pz - ce${e}z);\n if (rx !== 0) ${_s("rx",`aX${e}x`,`aX${e}y`,`aX${e}z`)}\n if (ry !== 0) ${_s("ry",`aY${e}x`,`aY${e}y`,`aY${e}z`)}\n if (rz !== 0) ${_s("rz",`aZ${e}x`,`aZ${e}y`,`aZ${e}z`)}\n px = Math.fround(px + ce${e}x); py = Math.fround(py + ce${e}y); pz = Math.fround(pz + ce${e}z);\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 ${zs(`sc${e}`,`b${e}._tempScaleInv`)}\n ${Ms(`q${e}`,`b${e}._tempQInv`)}\n ivx${e} *= sc${e}x; ivy${e} *= sc${e}y; ivz${e} *= sc${e}z;\n ${bs(`ivx${e}`,`ivy${e}`,`ivz${e}`,`q${e}x`,`q${e}y`,`q${e}z`,`q${e}w`)}\n }\n }\n ${gs(`gm${e}`,`b${e}.multiplier`)}`,body:`if (active${e}) {\n ${xs(`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 As=new Map;function Ts(t,e,s){const i=As.get(s);if(void 0!==i)return i??void 0;const n=function(t,e){const s=`\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) {${s}};`)(ys)}catch(t){return}}(t,e);return As.set(s,n??null),n}function Os(t){const e=[];let s=[],i=[],n=[],r=0;const o=()=>{if(0===i.length)return;const t=`${r}:${s.map(t=>t.type).join(",")}`,o=Ts(i,n,t);if(void 0!==o)e.push({behaviors:s,run:o});else for(const t of s)e.push({behaviors:[t]});s=[],i=[],n=[]};for(let a=0;a<t.length;a++){const h=t[a],l=Vs(h,a);null!==l?(0===i.length&&(r=a),s.push(h),i.push(l),n.push(a)):(o(),e.push({behaviors:[h]}))}return o(),e}class $s{constructor(t,e,s){this.position=t??new et,this.rotation=e??new tt,this.scale=s??new et(1,1,1)}apply(t){t.position.multiply(this.scale).applyQuaternion(this.rotation).add(this.position);const e=t.velocity,s=e.length();if(0===s)return;e.multiply(this.scale).applyQuaternion(this.rotation);const i=e.length();i>0&&e.multiplyScalar(s/i)}isIdentity(){const{position:t,rotation:e,scale:s}=this;return 0===t.x&&0===t.y&&0===t.z&&0===e.x&&0===e.y&&0===e.z&&1===e.w&&1===s.x&&1===s.y&&1===s.z}toJSON(){const t={},{position:e,rotation:s,scale:i}=this;return 0===e.x&&0===e.y&&0===e.z||(t.position=[e.x,e.y,e.z]),0===s.x&&0===s.y&&0===s.z&&1===s.w||(t.rotation=[s.x,s.y,s.z,s.w]),1===i.x&&1===i.y&&1===i.z||(t.scale=[i.x,i.y,i.z]),t}static fromJSON(t){if(!t)return;const{position:e,rotation:s,scale:i}=t;return new $s(e?new et(e[0],e[1],e[2]):void 0,s?new tt(s[0],s[1],s[2],s[3]):void 0,i?new et(i[0],i[1],i[2]):void 0)}static toShapeJSON(t){return t&&!t.isIdentity()?{transform:t.toJSON()}:{}}clone(){return new $s(this.position.clone(),this.rotation.clone(),this.scale.clone())}}var Ps,Cs;exports.BoxEmitFrom=void 0,(Ps=exports.BoxEmitFrom||(exports.BoxEmitFrom={}))[Ps.Volume=0]="Volume",Ps[Ps.Shell=1]="Shell",Ps[Ps.Edge=2]="Edge";class Es{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],this.transform=t.transform}update(t,e){}initialize(t,e){const s=this._point;for(let t=0;t<3;t++)s[t]=2*M()-1;const i=Math.floor(3*M())%3;this.emitFrom===exports.BoxEmitFrom.Shell?s[i]=this.onSurface(i):this.emitFrom===exports.BoxEmitFrom.Edge&&(s[(i+1)%3]=this.onSurface((i+1)%3),s[(i+2)%3]=this.onSurface((i+2)%3)),t.position.set(s[0]*this.width/2,s[1]*this.height/2,s[2]*this.depth/2),t.velocity.set(0,0,t.startSpeed),this.transform?.apply(t)}onSurface(t){const e=M()<.5?-1:1,s=this.boxThickness[t];return s<=0||M()<.5?e:e*(1-2*s*M())}toJSON(){return{type:"box",width:this.width,height:this.height,depth:this.depth,emitFrom:this.emitFrom,boxThickness:[...this.boxThickness],...$s.toShapeJSON(this.transform)}}static fromJSON(t){return new Es({width:t.width,height:t.height,depth:t.depth,emitFrom:t.emitFrom,boxThickness:Array.isArray(t.boxThickness)?t.boxThickness:void 0,transform:$s.fromJSON(t.transform)})}clone(){return new Es({width:this.width,height:this.height,depth:this.depth,emitFrom:this.emitFrom,boxThickness:this.boxThickness,transform:this.transform?.clone()})}}function Fs(t,e,s,i){let n;switch(t){case exports.EmitterMode.Loop:n=e-Math.floor(e);break;case exports.EmitterMode.PingPong:{const t=e-2*Math.floor(e/2);n=1-Math.abs(t-1);break}case exports.EmitterMode.Burst:n=i.isBursting&&i.burstParticleCount>0?i.burstParticleIndex/i.burstParticleCount:M();break;default:n=M()}return s>0&&(n=Math.floor(n/s)*s),n}exports.EmitterMode=void 0,(Cs=exports.EmitterMode||(exports.EmitterMode={}))[Cs.Random=0]="Random",Cs[Cs.Loop=1]="Loop",Cs[Cs.PingPong=2]="PingPong",Cs[Cs.Burst=3]="Burst";class Bs{reset(){this.currentValue=0,this.memory.length=0}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 Rt(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 s=Fs(this.mode,this.currentValue,this.spread,e),i=K.lerp(1-this.thickness,1,M()),n=s*this.arc;t.position.x=Math.cos(n),t.position.y=Math.sin(n),t.position.z=0,t.velocity.copy(t.position).multiplyScalar(t.startSpeed),t.position.multiplyScalar(this.radius*i),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(),...$s.toShapeJSON(this.transform)}}static fromJSON(t){return new Bs({radius:t.radius,arc:t.arc,thickness:t.thickness,mode:t.mode,speed:t.speed?Jt(t.speed):void 0,transform:$s.fromJSON(t.transform),spread:t.spread})}clone(){return new Bs({radius:this.radius,arc:this.arc,thickness:this.thickness,mode:this.mode,speed:this.speed.clone(),transform:this.transform?.clone(),spread:this.spread})}}class Is{reset(){this.currentValue=0,this.memory.length=0}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 Rt(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 s=Fs(this.mode,this.currentValue,this.spread,e),i=1-K.clamp(this.thickness,0,1),n=Math.sqrt(K.lerp(i*i,1,M())),r=s*this.arc,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(),...$s.toShapeJSON(this.transform)}}static fromJSON(t){return new Is({radius:t.radius,arc:t.arc,thickness:t.thickness,angle:t.angle,mode:t.mode,speed:t.speed?Jt(t.speed):void 0,transform:$s.fromJSON(t.transform),spread:t.spread})}clone(){return new Is({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 Us{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 Rt(1),this.memory=[],this.transform=t.transform,this._m1=new ot}reset(){this.currentValue=0,this.memory.length=0}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 s=Fs(this.mode,this.currentValue,this.spread,e),i=M(),n=K.lerp(1-this.thickness,1,M()),r=s*this.arc,o=i*Math.PI*2,a=Math.sin(r),h=Math.cos(r);if(t.position.x=this.radius*h,t.position.y=this.radius*a,t.position.z=0,t.velocity.z=this.donutRadius*n*Math.sin(o),t.velocity.x=this.donutRadius*n*Math.cos(o)*h,t.velocity.y=this.donutRadius*n*Math.cos(o)*a,t.position.add(t.velocity),t.velocity.normalize().multiplyScalar(t.startSpeed),t.rotation instanceof tt){const e=t.rotation;0===e.x&&0===e.y&&0===e.z&&1===e.w&&(this._m1.lookAt(Ve,t.velocity,_e),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(),...$s.toShapeJSON(this.transform)}}static fromJSON(t){return new Us({radius:t.radius,arc:t.arc,thickness:t.thickness,donutRadius:t.donutRadius,mode:t.mode,speed:t.speed?Jt(t.speed):void 0,transform:$s.fromJSON(t.transform),spread:t.spread})}clone(){return new Us({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 Ns{reset(){this.currentValue=0,this.memory.length=0}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 Rt(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 s=Fs(this.mode,this.currentValue,this.spread,e);t.position.set((2*s-1)*this.radius,0,0),t.velocity.set(0,t.startSpeed,0),this.transform?.apply(t)}toJSON(){return{type:"edge",radius:this.radius,mode:this.mode,spread:this.spread,speed:this.speed.toJSON(),...$s.toShapeJSON(this.transform)}}static fromJSON(t){return new Ns({radius:t.radius,mode:t.mode,speed:t.speed?Jt(t.speed):void 0,spread:t.spread,transform:$s.fromJSON(t.transform)})}clone(){return new Ns({radius:this.radius,mode:this.mode,speed:this.speed.clone(),spread:this.spread,transform:this.transform?.clone()})}}class Rs{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(M()*this.row),s=Math.floor(M()*this.column);t.position.x=s*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,...$s.toShapeJSON(this.transform)}}static fromJSON(t){return new Rs({...t,transform:$s.fromJSON(t.transform)})}clone(){return new Rs({width:this.width,height:this.height,column:this.column,row:this.row,transform:this.transform?.clone()})}update(t,e){}}class Ds{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 Rt(1),this.memory=[],this.transform=t.transform,this._m1=new ot}reset(){this.currentValue=0,this.memory.length=0}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 s=Fs(this.mode,this.currentValue,this.spread,e),i=M(),n=K.lerp(1-this.thickness,1,M()),r=s*this.arc,o=Math.acos(i),a=Math.sin(r),h=Math.cos(r),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*n),t.rotation instanceof tt){const e=t.rotation;0===e.x&&0===e.y&&0===e.z&&1===e.w&&(this._m1.lookAt(Ve,t.position,_e),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(),...$s.toShapeJSON(this.transform)}}static fromJSON(t){return new Ds({radius:t.radius,arc:t.arc,thickness:t.thickness,mode:t.mode,speed:t.speed?Jt(t.speed):void 0,transform:$s.fromJSON(t.transform),spread:t.spread})}clone(){return new Ds({radius:this.radius,arc:this.arc,thickness:this.thickness,mode:this.mode,speed:this.speed.clone(),transform:this.transform?.clone(),spread:this.spread})}}class ks{constructor(t){this.type="point",this._m1=new ot,this.transform=t}update(t,e){}initialize(t){const e=M(),s=M(),i=e*Math.PI*2,n=2*s-1,r=Math.sqrt(Math.max(0,1-n*n));if(t.velocity.x=r*Math.cos(i),t.velocity.y=r*Math.sin(i),t.velocity.z=n,t.velocity.multiplyScalar(t.startSpeed),t.position.setScalar(0),t.rotation instanceof tt){const e=t.rotation;0===e.x&&0===e.y&&0===e.z&&1===e.w&&(this._m1.lookAt(Ve,t.velocity,_e),t.rotation.setFromRotationMatrix(this._m1))}this.transform?.apply(t)}toJSON(){return{type:"point",...$s.toShapeJSON(this.transform)}}static fromJSON(t){return new ks($s.fromJSON(t?.transform))}clone(){return new ks(this.transform?.clone())}}class Ls{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 Rt(1),this.memory=[],this.transform=t.transform,this._m1=new ot}reset(){this.currentValue=0,this.memory.length=0}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 s=Fs(this.mode,this.currentValue,this.spread,e),i=M(),n=K.lerp(1-this.thickness,1,M()),r=s*this.arc,o=Math.acos(2*i-1),a=Math.sin(r),h=Math.cos(r),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*n),t.rotation instanceof tt){const e=t.rotation;0===e.x&&0===e.y&&0===e.z&&1===e.w&&(this._m1.lookAt(Ve,t.position,_e),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(),...$s.toShapeJSON(this.transform)}}static fromJSON(t){return new Ls({radius:t.radius,arc:t.arc,thickness:t.thickness,mode:t.mode,speed:t.speed?Jt(t.speed):void 0,transform:$s.fromJSON(t.transform),spread:t.spread})}clone(){return new Ls({radius:this.radius,arc:this.arc,thickness:this.thickness,mode:this.mode,speed:this.speed.clone(),transform:this.transform?.clone(),spread:this.spread})}}class qs{reset(){this.currentValue=0,this.memory.length=0}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 Rt(1),this.memory=[],this.transform=t.transform,this._m1=new ot}update(t,e){this.currentValue+=this.speed.genValue(this.memory,t.emissionState.time/t.duration)*e}initialize(t,e){const s=Fs(this.mode,this.currentValue,this.spread,e);M();const i=s*(2*(this.width+this.height));let n,r;i<this.width?(n=i-this.width/2,r=-this.height/2):i<this.width+this.height?(n=this.width/2,r=i-this.width-this.height/2):i<2*this.width+this.height?(n=this.width/2-(i-this.width-this.height),r=this.height/2):(n=-this.width/2,r=this.height/2-(i-2*this.width-this.height));const o=M(),a=1-this.thickness*o;if(t.position.x=n*a,t.position.y=r*a,t.position.z=0,t.velocity.x=n,t.velocity.y=r,t.velocity.z=0,t.velocity.normalize().multiplyScalar(t.startSpeed),t.rotation instanceof tt){const e=t.rotation;0===e.x&&0===e.y&&0===e.z&&1===e.w&&(this._m1.lookAt(Ve,t.velocity,_e),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(),...$s.toShapeJSON(this.transform)}}static fromJSON(t){return new qs({width:t.width,height:t.height,thickness:t.thickness,mode:t.mode,speed:t.speed?Jt(t.speed):void 0,transform:$s.fromJSON(t.transform),spread:t.spread})}clone(){return new qs({width:this.width,height:this.height,thickness:this.thickness,mode:this.mode,speed:this.speed.clone(),transform:this.transform?.clone(),spread:this.spread})}}const Js={box:{type:"box",params:[["width",["number"]],["height",["number"]],["depth",["number"]],["emitFrom",["number"]],["boxThickness",["vec3"]]],constructor:Es,loadJSON:Es.fromJSON},circle:{type:"circle",params:[["radius",["number"]],["arc",["radian"]],["thickness",["number"]],["mode",["emitterMode"]],["spread",["number"]],["speed",["valueFunc","value"]]],constructor:Bs,loadJSON:Bs.fromJSON},cone:{type:"cone",params:[["radius",["number"]],["arc",["radian"]],["thickness",["number"]],["angle",["radian"]],["mode",["emitterMode"]],["spread",["number"]],["speed",["valueFunc","value"]]],constructor:Is,loadJSON:Is.fromJSON},donut:{type:"donut",params:[["radius",["number"]],["arc",["radian"]],["thickness",["number"]],["donutRadius",["number"]],["mode",["emitterMode"]],["spread",["number"]],["speed",["valueFunc","value"]]],constructor:Us,loadJSON:Us.fromJSON},edge:{type:"edge",params:[["radius",["number"]],["mode",["emitterMode"]],["spread",["number"]],["speed",["valueFunc","value"]]],constructor:Ns,loadJSON:Ns.fromJSON},point:{type:"point",params:[],constructor:ks,loadJSON:ks.fromJSON},sphere:{type:"sphere",params:[["radius",["number"]],["arc",["radian"]],["thickness",["number"]],["angle",["radian"]],["mode",["emitterMode"]],["spread",["number"]],["speed",["valueFunc","value"]]],constructor:Ls,loadJSON:Ls.fromJSON},hemisphere:{type:"hemisphere",params:[["radius",["number"]],["arc",["radian"]],["thickness",["number"]],["angle",["radian"]],["mode",["emitterMode"]],["spread",["number"]],["speed",["valueFunc","value"]]],constructor:Ds,loadJSON:Ds.fromJSON},grid:{type:"grid",params:[["width",["number"]],["height",["number"]],["rows",["number"]],["column",["number"]]],constructor:Rs,loadJSON:Rs.fromJSON},rectangle:{type:"rectangle",params:[["width",["number"]],["height",["number"]],["thickness",["number"]],["mode",["emitterMode"]],["spread",["number"]],["speed",["valueFunc","value"]]],constructor:qs,loadJSON:qs.fromJSON}};function Ws(t,e){const s=t?Js[t.type]:void 0;return s?s.loadJSON(t,e):(It(`${Nt("emitter shape",t)}; using a point emitter.`),new ks)}const Gs=[];function Qs(t){if(!Gs.find(e=>e.id===t.id)){t.initialize(),Gs.push(t);for(const e of t.emitterShapes)Js[e.type]||(Js[e.type]=e);for(const e of t.behaviors)ps[e.type]||(ps[e.type]=e)}}function js(t){const s=t;return s._quarksUUID??(s._quarksUUID=e.RandomGUID())}class Hs{get mesh(){return this._mesh}set mesh(e){if(this._mesh=e,this._positions=void 0,this._indices=void 0,this._triangleIndexToArea.length=0,!e)return;const s=e.getVerticesData(t.VertexBuffer.PositionKind),i=e.getIndices();if(!s||!i)return;this._positions=new Float32Array(s),this._indices=new Int32Array(i),this._triangleIndexToArea.length=0;let n=0;const r=i.length/3;this._triangleIndexToArea.push(0);const o=new et,a=new et,h=new et;for(let t=0;t<r;t++){const e=i[3*t],r=i[3*t+1],l=i[3*t+2];o.set(s[3*e],s[3*e+1],s[3*e+2]),a.set(s[3*r],s[3*r+1],s[3*r+2]),h.set(s[3*l],s[3*l+1],s[3*l+2]),a.sub(o),h.sub(o);const c=new et;c.crossVectors(a,h),n+=.5*c.length(),this._triangleIndexToArea.push(n)}}constructor(t,e,s){this.type="mesh_surface",this._triangleIndexToArea=[],this._meshReferenceId=e,this.transform=s,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 s=0,i=e;const n=M()*this._triangleIndexToArea[e];for(;s+1<i;){const t=Math.floor((s+i)/2);n<this._triangleIndexToArea[t]?i=t:s=t}let r=M(),o=M();r+o>1&&(r=1-r,o=1-o);const a=this._indices[3*s],h=this._indices[3*s+1],l=this._indices[3*s+2],c=this._positions[3*a],u=this._positions[3*a+1],d=this._positions[3*a+2],f=this._positions[3*h]-c,p=this._positions[3*h+1]-u,m=this._positions[3*h+2]-d,y=this._positions[3*l]-c,g=this._positions[3*l+1]-u,v=this._positions[3*l+2]-d;t.position.set(c+f*r+y*o,u+p*r+g*o,d+m*r+v*o);const x=p*v-m*g,S=m*y-f*v,w=f*g-p*y,b=Math.sqrt(x*x+S*S+w*w)||1;t.velocity.set(x/b,S/b,w/b).multiplyScalar(t.startSpeed),this.transform?.apply(t)}toJSON(){return{type:"mesh_surface",mesh:this._mesh?js(this._mesh):this._meshReferenceId??"",...$s.toShapeJSON(this.transform)}}static fromJSON(t){return new Hs(void 0,t?.mesh,$s.fromJSON(t?.transform))}clone(){return new Hs(this._mesh,this._meshReferenceId,this.transform?.clone())}update(t,e){}}const Ys={id:"babylon.quarks",initialize:()=>{},emitterShapes:[{type:"mesh_surface",params:[["mesh",["mesh"]]],constructor:Hs,loadJSON:t=>Hs.fromJSON(t)}],behaviors:[]};function Xs(t){return"unlit"===t||"scene"===t?t:"fixed"}function Zs(t){return"distance"===t||"oldestInFront"===t||"youngestInFront"===t?t:"none"}function Ks(t){return"pause"===t||"pauseAndCatchUp"===t?t:"always"}function ti(t){return!t||0===t.x&&0===t.y&&0===t.z?void 0:t.clone()}function ei(t){return"number"==typeof t&&t>0?Math.min(t,1):0}function si(t){return"number"==typeof t&&Number.isFinite(t)&&t>=1?Math.floor(t):1}function ii(t,e){return"number"==typeof t&&Number.isFinite(t)&&t>=0?t:e}function ni(t){const e=t.count,s="number"==typeof t.time&&Number.isFinite(t.time)&&t.time>0?t.time:0,i="number"==typeof t.cycle&&Number.isFinite(t.cycle)&&t.cycle>=1?t.cycle:1,n="number"==typeof t.interval&&Number.isFinite(t.interval)?Math.max(0,t.interval):.1,r="number"==typeof t.probability&&Number.isFinite(t.probability)?Math.min(1,Math.max(0,t.probability)):1;return{time:s,count:"number"==typeof e?new Rt(e):null!=e?e:new Rt(0),cycle:i,interval:n,probability:r}}function ri(t){return(t??[]).map(ni).sort((t,e)=>t.time-e.time)}function oi(t,e={}){const s=function(t,e){if(s=t,"function"==typeof s?.getDepthMap){const s=t,i=s._storeCameraSpaceZ?"viewZ":s._storeNonLinearDepth?"nonLinear":"linear";return{texture:t.getDepthMap(),encoding:e.encoding??i,packed:e.packed??t.isPacked}}var s;return{texture:t,encoding:e.encoding??"linear",packed:e.packed??!1}}(t,e);if(s.packed&&"viewZ"===s.encoding)throw new Error("[babylon.quarks] A packed view-Z depth cannot be decoded; use a float depth texture");return s}function ai(t,e,s){if("viewZ"===e)return s.set(1,0,0,1);const i=t.getEngine(),n=i.useReverseDepthBuffer,r=i.isNDCHalfZRange,o=t.getProjectionMatrix().m,a=o[10],h=o[11],l=o[14],c=o[15];if("linear"===e){let e,i;t.mode===f.Camera.ORTHOGRAPHIC_CAMERA?(e=!n&&r?0:1,i=n&&r?0:1):(e=n&&r?t.minZ:r?0:t.minZ,i=n&&r?0:t.maxZ);const o=n?-1:1,h=e+i;return s.set(o*h/a,(-o*e-l)/a,0,1)}const u=r?1:2,d=r?0:-1;return s.set(-u*c,l-d*c,u*h,d*h-a)}var hi;function li(){return{direction:new c.Vector3(.4,-1,.6),color:new l.Color3(1,1,1),ambient:new l.Color3(.35,.35,.35)}}function ci(t){if(!t||"object"!=typeof t)return;const e=Array.isArray(t.color)?t.color:[1,1,1],s=(t,e)=>"number"==typeof t&&Number.isFinite(t)?t:e;return{color:[s(e[0],1),s(e[1],1),s(e[2],1)],power:Math.max(.01,s(t.power,2)),strength:Math.max(0,s(t.strength,1)),mode:"mix"===t.mode||"fade"===t.mode?t.mode:"add"}}function ui(t,e={}){const s=t&&"object"==typeof t?t:{},i=(t,e)=>"number"==typeof t&&Number.isFinite(t)?t:e,n=(t,e)=>Array.isArray(t)?[i(t[0],e[0]),i(t[1],e[1])]:[e[0],e[1]];return{channel:1===(s.channel??e.channel)?1:0,tiling:n(s.tiling,e.tiling??[1,1]),offset:n(s.offset,e.offset??[0,0]),scroll:n(s.scroll,e.scroll??[0,0])}}function di(t,e){return t===e||t.channel===e.channel&&t.tiling[0]===e.tiling[0]&&t.tiling[1]===e.tiling[1]&&t.offset[0]===e.offset[0]&&t.offset[1]===e.offset[1]&&t.scroll[0]===e.scroll[0]&&t.scroll[1]===e.scroll[1]}function fi(t,e={}){const s=ui(void 0,e),i={};return t.channel!==s.channel&&(i.channel=t.channel),t.tiling[0]===s.tiling[0]&&t.tiling[1]===s.tiling[1]||(i.tiling=[...t.tiling]),t.offset[0]===s.offset[0]&&t.offset[1]===s.offset[1]||(i.offset=[...t.offset]),t.scroll[0]===s.scroll[0]&&t.scroll[1]===s.scroll[1]||(i.scroll=[...t.scroll]),Object.keys(i).length>0?i:void 0}exports.RenderMode=void 0,(hi=exports.RenderMode||(exports.RenderMode={}))[hi.BillBoard=0]="BillBoard",hi[hi.StretchedBillBoard=1]="StretchedBillBoard",hi[hi.Mesh=2]="Mesh",hi[hi.Trail=3]="Trail",hi[hi.HorizontalBillBoard=4]="HorizontalBillBoard",hi[hi.VerticalBillBoard=5]="VerticalBillBoard",hi[hi.Beam=6]="Beam";const pi={r:[1,0,0,0],g:[0,1,0,0],b:[0,0,1,0],a:[0,0,0,1],luminance:[.2126,.7152,.0722,0]};function mi(t){if(!t||"object"!=typeof t||!t.ramp)return;const e=t.channel;return{ramp:t.ramp,channel:void 0!==e&&e in pi?e:"r"}}const yi=.05;function gi(t){if(!t||"object"!=typeof t)return;const e=(t,e)=>"number"==typeof t&&Number.isFinite(t)?t:e,s=Array.isArray(t.edgeColor)?t.edgeColor:[1,1,1];return{mask:t.mask??null,maskUV:ui(t.maskUV),softness:Math.max(1e-4,e(t.softness,yi)),edgeWidth:Math.max(0,e(t.edgeWidth,0)),edgeColor:[e(s[0],1),e(s[1],1),e(s[2],1)]}}const vi={scroll:[0,.5]},xi=.05;function Si(t){if(!t||"object"!=typeof t||!t.map)return;const e=t.strength;return{map:t.map,mapUV:ui(t.mapUV,vi),strength:Math.max(0,"number"==typeof e&&Number.isFinite(e)?e:xi)}}function wi(t){if(!t||"object"!=typeof t)return;const e=ui(t);return void 0===fi(e)?void 0:e}function bi(t){const{mapUV:e,uvDistortion:s,erosion:i}=t;return 1===e?.channel||1===s?.mapUV.channel||!!i?.mask&&1===i.maskUV.channel}class Mi{constructor(t,e,s=null){this.visibleSystems=[],this.boundsMin_=new et,this.boundsMax_=new et,this.time=0,this.scene=e,this.depth=s,this.maxParticles=1e3,this.systems=new Set,this.settings=Oi(t),this.mesh=new u.Mesh("vfxBatch",e),this.configureMesh()}configureMesh(){const t=this.mesh;t.alwaysSelectAsActiveMesh=!0,t.doNotSyncBoundingInfo=!0,t.setBoundingInfo(new o.BoundingInfo(c.Vector3.Zero(),c.Vector3.Zero())),t.layerMask=this.settings.layerMask,t.renderingGroupId=this.settings.renderingGroupId,t.alphaIndex=this.settings.renderOrder,t.applyFog=!1,t.isPickable=!1,t.checkCollisions=!1,t.doNotSerialize=!0}refreshBoundingInfo(){const t=this.boundsMin_,e=this.boundsMax_;let s=1/0,i=1/0,n=1/0,r=-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<s&&(s=t.x),t.y<i&&(i=t.y),t.z<n&&(n=t.z),e.x>r&&(r=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===s&&u.y===i&&u.z===n&&d.x===r&&d.y===o&&d.z===a||(u.set(s,i,n),d.set(r,o,a),c.reConstruct(u,d)),this.mesh.alwaysSelectAsActiveMesh=!1}static writeBound(t,e){e(t);const s=t.getEffect();s?.isReady()&&e(s)}bindFog(t){if(!this.settings.applyFog)return;const e=this.scene;t.onBindObservable.add(()=>{const s=t.getEffect();if(!s)return;const i=e.fogEnabled?e.fogMode:d.Scene.FOGMODE_NONE;s.setFloat4("vFogInfos",i,e.fogStart,e.fogEnd,e.fogDensity),s.setColor3("vFogColor",e.fogColor)})}usesUV1(){return bi(this.settings)}bindSurface(t){const{mapUV:e,uvDistortion:s,gradientMap:i,erosion:n}=this.settings;if(s?.map&&t.setTexture("distortionMap",s.map),i?.ramp&&t.setTexture("gradientMap",i.ramp),n?.mask&&t.setTexture("erosionMask",n.mask),this.writeSurfaceParams(t),!(e||s||n?.mask||i))return;const r=t=>t-2*Math.floor(t/2),o=new c.Vector4,a=new c.Vector4,h=new c.Vector4,l=new c.Vector2(0,1),u=(t,e,s)=>s.set(t.tiling[0],t.tiling[1],t.offset[0]+r(t.scroll[0]*e),t.offset[1]+r(t.scroll[1]*e)),d=()=>{const e=this.time,s=t.getEffect(),{mapUV:i,uvDistortion:n,gradientMap:r,erosion:c}=this.settings;if(i&&(u(i,e,o),t.setVector4("mapTransform",o),s?.setVector4("mapTransform",o)),n&&(u(n.mapUV,e,a),t.setVector4("distortionTransform",a),s?.setVector4("distortionTransform",a)),c?.mask&&(u(c.maskUV,e,h),t.setVector4("erosionMaskTransform",h),s?.setVector4("erosionMaskTransform",h)),r?.ramp){const e=r.ramp.getSize().width,i=e>0?.5/e:0;l.set(i,1-i),t.setVector2("gradientMapRange",l),s?.setVector2("gradientMapRange",l)}};d(),t.onBindObservable.add(d)}writeSurfaceParams(t){const{uvDistortion:e,gradientMap:s,erosion:i}=this.settings;if(e?.map&&t.setFloat("distortionStrength",e.strength),s?.ramp){const[e,i,n,r]=pi[s.channel];t.setVector4("gradientMapChannel",new c.Vector4(e,i,n,r))}i&&(t.setVector2("erosionParams",new c.Vector2(i.softness,i.edgeWidth)),t.setVector3("erosionEdgeColor",new c.Vector3(i.edgeColor[0],i.edgeColor[1],i.edgeColor[2])))}applyLiveSettings(t){Object.assign(this.settings,t);const e=this.mesh.material;e instanceof h.ShaderMaterial&&this.writeLiveUniforms(e)}writeLiveUniforms(t){this.writeSoftParams(t),this.writeSurfaceParams(t)}addSystem(t){this.systems.add(t)}removeSystem(t){this.systems.delete(t)}getVisibleSystems(){const t=this.visibleSystems;let e=0;for(const s of this.systems)s.emitter.visible&&!0!==s.culled&&(t[e++]=s);return t.length=e,t}applyDepthTexture(t){t instanceof a.BaseTexture&&(t={texture:t,encoding:"linear",packed:!1});const e=this.depth;if(this.depth=t,!this.settings.softParticles)return;if(!e!=!t||e?.packed!==t?.packed)return void this.rebuildMaterial();const s=this.mesh.material;t&&s instanceof h.ShaderMaterial&&s.setTexture("depthTexture",t.texture)}bindSoft(t){if(this.writeSoftParams(t),this.drawsSoft()){t.setTexture("depthTexture",this.depth.texture);const e=new c.Vector4(1,0,0,1);t.onBindObservable.add(()=>{const s=this.scene.activeCamera;s&&this.depth&&(ai(s,this.depth.encoding,e),Mi.writeBound(t,t=>t.setVector4("projParams",e)))})}}writeSoftParams(t){this.drawsSoft()&&t.setVector2("softParams",new c.Vector2(this.settings.softNearFade,1/Math.max(this.settings.softFarFade-this.settings.softNearFade,1e-4))),this.settings.materialAlphaTest>0&&t.setFloat("alphaTest",this.settings.materialAlphaTest)}drawsSoft(){return this.settings.softParticles&&null!==this.depth}applyMeshLighting(t){}dispose(){this.mesh.dispose()}}const zi=new Float32Array(0),_i=new Uint16Array(0);function Vi(t){return t===exports.RenderMode.BillBoard||t===exports.RenderMode.StretchedBillBoard||t===exports.RenderMode.VerticalBillBoard||t===exports.RenderMode.HorizontalBillBoard}function Ai(t){return t.uTileCount>1||t.vTileCount>1}function Ti(t){return t.minParticleSize>0||t.maxParticleSize!==1/0}function Oi(t){const e=t.renderMode,s=e===exports.RenderMode.Mesh,i=e===exports.RenderMode.Trail,n=Vi(e),o=t.softParticles,a=t.materialTransparent,h=t.pivot,l=wi(t.mapUV),c=Si(t.uvDistortion),u=mi(t.gradientMap),d=gi(t.erosion),f=si(t.uTileCount),p=si(t.vTileCount);var m;return{renderMode:e,instancingGeometry:i?zi:t.instancingGeometry,instancingIndices:i?_i:t.instancingIndices,instancingUVs:i?void 0:t.instancingUVs,instancingUVs2:s&&bi({mapUV:l,uvDistortion:c,erosion:d})?t.instancingUVs2:void 0,instancingNormals:s?t.instancingNormals:void 0,renderOrder:t.renderOrder,uTileCount:f,vTileCount:p,blendTiles:!i&&t.blendTiles&&Ai({uTileCount:f,vTileCount:p}),softParticles:o,softNearFade:o?ii(t.softNearFade,0):0,softFarFade:o?ii(t.softFarFade,1):0,materialBlendMode:a?t.materialBlendMode:r.Constants.ALPHA_DISABLE,materialTransparent:a,materialDepthTest:t.materialDepthTest,materialDepthWrite:t.materialDepthWrite,materialAlphaTest:t.materialAlphaTest>0?t.materialAlphaTest:0,texture:t.texture,reflectionTexture:s?t.reflectionTexture??null:null,reflectionLevel:s?t.reflectionLevel??1:1,reflectionAtlas:s?t.reflectionAtlas??null:null,layerMask:t.layerMask,renderingGroupId:t.renderingGroupId??0,applyFog:t.applyFog??!0,pivot:n&&h&&(0!==h.x||0!==h.y||0!==h.z)?h.clone():void 0,sortMode:t.sortMode??"none",minParticleSize:n?Math.max(0,t.minParticleSize??0):0,maxParticleSize:n?(m=t.maxParticleSize,void 0!==m&&m>0?m:1/0):1/0,lighting:s?t.lighting??"fixed":"fixed",rim:s?ci(t.rim):void 0,mapUV:l,uvDistortion:c,gradientMap:u,erosion:d}}function $i(t,e){return t.renderMode===e.renderMode&&t.instancingGeometry===e.instancingGeometry&&t.instancingIndices===e.instancingIndices&&t.instancingUVs===e.instancingUVs&&t.instancingUVs2===e.instancingUVs2&&t.instancingNormals===e.instancingNormals&&t.texture===e.texture&&t.reflectionTexture===e.reflectionTexture&&t.reflectionAtlas===e.reflectionAtlas&&t.lighting===e.lighting&&t.rim?.mode===e.rim?.mode&&t.uTileCount===e.uTileCount&&t.vTileCount===e.vTileCount&&t.blendTiles===e.blendTiles&&t.softParticles===e.softParticles&&t.materialBlendMode===e.materialBlendMode&&t.materialTransparent===e.materialTransparent&&t.materialDepthTest===e.materialDepthTest&&t.materialDepthWrite===e.materialDepthWrite&&t.materialAlphaTest>0==e.materialAlphaTest>0&&t.layerMask===e.layerMask&&t.renderingGroupId===e.renderingGroupId&&t.renderOrder===e.renderOrder&&t.applyFog===e.applyFog&&t.sortMode===e.sortMode&&!t.pivot==!e.pivot&&Ti(t)===Ti(e)&&t.mapUV?.channel===e.mapUV?.channel&&t.uvDistortion?.map===e.uvDistortion?.map&&t.uvDistortion?.mapUV.channel===e.uvDistortion?.mapUV.channel&&!t.gradientMap==!e.gradientMap&&t.gradientMap?.ramp===e.gradientMap?.ramp&&!t.erosion==!e.erosion&&t.erosion?.mask===e.erosion?.mask&&t.erosion?.maskUV.channel===e.erosion?.maskUV.channel}function Pi(t,e){return t.softNearFade===e.softNearFade&&t.softFarFade===e.softFarFade&&t.materialAlphaTest===e.materialAlphaTest&&t.reflectionLevel===e.reflectionLevel&&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.minParticleSize===e.minParticleSize&&t.maxParticleSize===e.maxParticleSize&&function(t,e){if(!t||!e)return!t==!e;return t.power===e.power&&t.strength===e.strength&&Ei(t.color,e.color)}(t.rim,e.rim)&&Fi(t.mapUV,e.mapUV)&&t.uvDistortion?.strength===e.uvDistortion?.strength&&Fi(t.uvDistortion?.mapUV,e.uvDistortion?.mapUV)&&t.gradientMap?.channel===e.gradientMap?.channel&&t.erosion?.softness===e.erosion?.softness&&t.erosion?.edgeWidth===e.erosion?.edgeWidth&&Ei(t.erosion?.edgeColor,e.erosion?.edgeColor)&&Fi(t.erosion?.maskUV,e.erosion?.maskUV)}function Ci(t,e){return $i(t,e)&&Pi(t,e)}function Ei(t,e){return t&&e?t[0]===e[0]&&t[1]===e[1]&&t[2]===e[2]:!t==!e}function Fi(t,e){return t&&e?t.tiling[0]===e.tiling[0]&&t.tiling[1]===e.tiling[1]&&t.offset[0]===e.offset[0]&&t.offset[1]===e.offset[1]&&t.scroll[0]===e.scroll[0]&&t.scroll[1]===e.scroll[1]:!t==!e}const Bi=2048,Ii=2047;class Ui{constructor(t){this.counts=new Uint32Array(Bi),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 s=this.uintView[0];return e?~s>>>0:s}}const Ni="\n#ifdef FOG\nvarying vec3 vFogDistance;\n#endif\n";function Ri(t){return`\n#ifdef FOG\n vFogDistance = ${t};\n#endif\n`}const Di="\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 // A zero-width band is a cut at its distance, not a division by zero.\n fogCoeff = (fogEnd - fogDistance) / max(fogEnd - fogStart, 1e-6);\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 ki(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 Li="\n#ifdef FOG\nvarying vFogDistance: vec3f;\n#endif\n";function qi(t){return`\n#ifdef FOG\n vertexOutputs.vFogDistance = ${t};\n#endif\n`}const Ji="\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 // A zero-width band is a cut at its distance, not a division by zero.\n fogCoeff = (fogEnd - fogDistance) / max(fogEnd - fogStart, 1e-6);\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 Wi(t){return`\n#ifdef FOG\n ${t} = vec4f(quarksFog(${t}.rgb, fragmentInputs.vFogDistance), ${t}.a);\n#endif\n`}function Gi(t,e,s){const i=e*s,n=Qi(Math.floor(t),i);return{column:Qi(n,e),row:Math.floor(n/e)}}function Qi(t,e){return t-e*Math.floor(t/e)}const ji="\n#ifdef UV_TILE\nuniform float tileCountX;\nuniform float tileCountY;\n#endif\n#ifdef TILE_BLEND\nvarying vec2 vUV2;\nvarying float vTileBlend;\n#endif\n";function Hi(t){return`\n#ifdef UV_TILE\n {\n vec2 tc = vec2(tileCountX, tileCountY);\n float tileTotal = tc.x * tc.y;\n float baseTile = mod(floor(uvTile), tileTotal);\n vec2 tileUV = vec2(mod(baseTile, tc.x), tc.y - 1.0 - floor(baseTile / tc.x)) / tc;\n vUV = ${t} / tc + tileUV;\n#ifdef TILE_BLEND\n float nextTile = mod(baseTile + 1.0, tileTotal);\n vec2 nextUV = vec2(mod(nextTile, tc.x), tc.y - 1.0 - floor(nextTile / tc.x)) / tc;\n vUV2 = ${t} / tc + nextUV;\n vTileBlend = fract(uvTile);\n#endif\n }\n#else\n vUV = ${t};\n#endif\n`}const Yi="\n#ifdef UV_TILE\nuniform tileCountX: f32;\nuniform tileCountY: f32;\n\n// A floored modulo, as GLSL's mod: never negative for a positive divisor.\nfn quarksWrap(value: f32, divisor: f32) -> f32 {\n return value - divisor * floor(value / divisor);\n}\n#endif\n#ifdef TILE_BLEND\nvarying vUV2: vec2f;\nvarying vTileBlend: f32;\n#endif\n";function Xi(t){return`\n#ifdef UV_TILE\n {\n let tc = vec2f(uniforms.tileCountX, uniforms.tileCountY);\n let tileTotal = tc.x * tc.y;\n let baseTile = quarksWrap(floor(vertexInputs.uvTile), tileTotal);\n let tileUV = vec2f(quarksWrap(baseTile, tc.x), tc.y - 1.0 - floor(baseTile / tc.x)) / tc;\n vertexOutputs.vUV = ${t} / tc + tileUV;\n#ifdef TILE_BLEND\n let nextTile = quarksWrap(baseTile + 1.0, tileTotal);\n let nextUV = vec2f(quarksWrap(nextTile, tc.x), tc.y - 1.0 - floor(nextTile / tc.x)) / tc;\n vertexOutputs.vUV2 = ${t} / tc + nextUV;\n vertexOutputs.vTileBlend = fract(vertexInputs.uvTile);\n#endif\n }\n#else\n vertexOutputs.vUV = ${t};\n#endif\n`}var Zi=`\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${ji}\n\nvarying vec2 vUV;\nvarying vec4 vColor;\n#ifdef UV1\n#ifdef MESH_UV2\n// The mesh's second UV set.\nattribute vec2 uv2;\n#endif\n// UV channel 1: the mesh's second UV set, or its first when it has none.\nvarying vec2 vUV1;\n#endif\nvarying vec3 vNormal;\nvarying vec3 vWorldPos;\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${Ni}\nvoid main() {\n vec3 scaledPosition = position * size;\n vec3 rotatedPosition = applyQuaternion(scaledPosition, rotation);\n // A normal scales by the inverse of the size, so a stretched mesh keeps its normals\n // perpendicular; a flat size counts as a sliver rather than dividing by zero.\n vec3 safeSize = vec3(\n abs(size.x) > 1e-6 ? size.x : 1e-6,\n abs(size.y) > 1e-6 ? size.y : 1e-6,\n abs(size.z) > 1e-6 ? size.z : 1e-6);\n // A mirrored size (an odd number of negative components) turns the winding inside out, so the\n // normal is turned with it and the fragment's front-face test agrees with the geometry.\n vec3 rotatedNormal = normalize(applyQuaternion(normal / safeSize, rotation)) * sign(safeSize.x * safeSize.y * safeSize.z);\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${Ri("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 // View depth is +z ahead of a left-handed camera and -z ahead of a right-handed one.\n linearDepth = abs(viewPos.z);\n#endif\n\n${Hi("uv")}\n\n#ifdef UV1\n#ifdef MESH_UV2\n vUV1 = uv2;\n#else\n vUV1 = uv;\n#endif\n#endif\n vColor = color;\n}\n`,Ki=`\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${Yi}\n\nvarying vUV: vec2f;\nvarying vColor: vec4f;\n#ifdef UV1\n#ifdef MESH_UV2\n// The mesh's second UV set.\nattribute uv2: vec2f;\n#endif\n// UV channel 1: the mesh's second UV set, or its first when it has none.\nvarying vUV1: vec2f;\n#endif\nvarying vNormal: vec3f;\nvarying vWorldPos: vec3f;\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${Li}\n@vertex\nfn main(input: VertexInputs) -> FragmentInputs {\n let size = vertexInputs.size;\n let scaledPosition = vertexInputs.position * size;\n let rotatedPosition = applyQuaternion(scaledPosition, vertexInputs.rotation);\n // A normal scales by the inverse of the size, so a stretched mesh keeps its normals\n // perpendicular; a flat size counts as a sliver rather than dividing by zero.\n let safeSize = vec3f(\n select(1e-6, size.x, abs(size.x) > 1e-6),\n select(1e-6, size.y, abs(size.y) > 1e-6),\n select(1e-6, size.z, abs(size.z) > 1e-6));\n // A mirrored size (an odd number of negative components) turns the winding inside out, so the\n // normal is turned with it and the fragment's front-face test agrees with the geometry.\n let rotatedNormal = normalize(applyQuaternion(vertexInputs.normal / safeSize, vertexInputs.rotation)) * sign(safeSize.x * safeSize.y * safeSize.z);\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${qi("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 // View depth is +z ahead of a left-handed camera and -z ahead of a right-handed one.\n vertexOutputs.linearDepth = abs(viewPos.z);\n#endif\n\n${Xi("vertexInputs.uv")}\n\n#ifdef UV1\n#ifdef MESH_UV2\n vertexOutputs.vUV1 = vertexInputs.uv2;\n#else\n vertexOutputs.vUV1 = vertexInputs.uv;\n#endif\n#endif\n vertexOutputs.vColor = vertexInputs.color;\n}\n`;const tn="\n#ifdef SOFT_PARTICLES\nuniform sampler2D depthTexture;\nuniform vec2 softParams;\nuniform vec4 projParams;\nvarying vec4 projPosition;\nvarying float linearDepth;\n\nfloat quarksSceneDepth(vec4 texel) {\n#ifdef SOFT_DEPTH_PACKED\n float d = dot(texel, vec4(1.0 / (255.0 * 255.0 * 255.0), 1.0 / (255.0 * 255.0), 1.0 / 255.0, 1.0));\n#else\n float d = texel.r;\n#endif\n float denominator = projParams.z * d + projParams.w;\n float depth = abs(denominator) > 1e-8 ? abs((projParams.x * d + projParams.y) / denominator) : 0.0;\n // Nothing drawn there reads as infinitely far.\n return depth > 0.0 ? depth : 1e30;\n}\n#endif\n";function en(t){return`\n#ifdef SOFT_PARTICLES\n {\n vec2 softUV = 0.5 * (projPosition.xy / projPosition.w) + 0.5;\n float sceneDepth = quarksSceneDepth(texture2D(depthTexture, softUV));\n ${t} *= clamp(softParams.y * ((sceneDepth - softParams.x) - linearDepth), 0.0, 1.0);\n }\n#endif\n`}const sn="\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\nfn quarksSceneDepth(texel: vec4f) -> f32 {\n#ifdef SOFT_DEPTH_PACKED\n let d = dot(texel, vec4f(1.0 / (255.0 * 255.0 * 255.0), 1.0 / (255.0 * 255.0), 1.0 / 255.0, 1.0));\n#else\n let d = texel.r;\n#endif\n let denominator = uniforms.projParams.z * d + uniforms.projParams.w;\n let depth = select(0.0, abs((uniforms.projParams.x * d + uniforms.projParams.y) / denominator), abs(denominator) > 1e-8);\n // Nothing drawn there reads as infinitely far.\n return select(1e30, depth, depth > 0.0);\n}\n#endif\n";function nn(t){return`\n#ifdef SOFT_PARTICLES\n {\n let softUV = 0.5 * (fragmentInputs.projPosition.xy / fragmentInputs.projPosition.w) + 0.5;\n let sceneDepth = quarksSceneDepth(textureSample(depthTexture, depthTextureSampler, softUV));\n ${t} *= clamp(uniforms.softParams.y * ((sceneDepth - uniforms.softParams.x) - fragmentInputs.linearDepth), 0.0, 1.0);\n }\n#endif\n`}const rn="\n#ifdef MAP_TRANSFORM\nuniform vec4 mapTransform;\n#endif\n#ifdef UV_DISTORTION\nuniform sampler2D distortionMap;\nuniform vec4 distortionTransform;\nuniform float distortionStrength;\n#endif\n#ifdef GRADIENT_MAP\nuniform sampler2D gradientMap;\nuniform vec2 gradientMapRange;\nuniform vec4 gradientMapChannel;\n#endif\n#ifdef EROSION\nuniform vec2 erosionParams;\nuniform vec3 erosionEdgeColor;\n#ifdef EROSION_MASK\nuniform sampler2D erosionMask;\nuniform vec4 erosionMaskTransform;\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 on(t){return`\n vec4 baseColor = vColor;\n#if defined(MAP_TRANSFORM) && defined(MAP_UV1)\n vec2 mapUV = vUV1 * mapTransform.xy + mapTransform.zw;\n#elif defined(MAP_TRANSFORM)\n vec2 mapUV = vUV * mapTransform.xy + mapTransform.zw;\n#else\n vec2 mapUV = vUV;\n#endif\n#ifdef UV_DISTORTION\n #ifdef UV_DISTORTION_UV1\n vec2 distortionUV = vUV1;\n #else\n vec2 distortionUV = vUV;\n #endif\n vec2 distortion = (texture2D(distortionMap, distortionUV * distortionTransform.xy + distortionTransform.zw).rg - 0.5) * 2.0 * distortionStrength;\n mapUV += distortion;\n#endif\n#ifdef EROSION\n float erosionLevel = baseColor.a;\n baseColor.a = 1.0;\n float erosionMaskValue = 1.0;\n#endif\n#if defined(USE_MAP) || defined(GRADIENT_MAP)\n#ifdef USE_MAP\n vec4 texColor = texture2D(map, mapUV);\n ${t?"#ifdef TILE_BLEND\n #if defined(MAP_TRANSFORM) && defined(MAP_UV1)\n vec2 mapUV2 = mapUV;\n #else\n #ifdef MAP_TRANSFORM\n vec2 mapUV2 = vUV2 * mapTransform.xy + mapTransform.zw;\n #else\n vec2 mapUV2 = vUV2;\n #endif\n #ifdef UV_DISTORTION\n mapUV2 += distortion;\n #endif\n #endif\n vec4 texColor2 = texture2D(map, mapUV2);\n texColor = mix(texColor, texColor2, vTileBlend);\n #endif":""}\n#else\n // No map: the ramp is looked up at white, its far end.\n vec4 texColor = vec4(1.0);\n#endif\n #ifdef GRADIENT_MAP\n float rampAt = clamp(dot(texColor, gradientMapChannel), 0.0, 1.0);\n vec4 ramp = texture2D(gradientMap, vec2(mix(gradientMapRange.x, gradientMapRange.y, rampAt), 0.5));\n texColor = vec4(ramp.rgb, ramp.a * mix(texColor.a, 1.0, gradientMapChannel.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 #ifdef EROSION_MASK_UV1\n vec2 erosionUV = vUV1;\n #else\n vec2 erosionUV = vUV;\n #endif\n erosionMaskValue = texture2D(erosionMask, erosionUV * erosionMaskTransform.xy + erosionMaskTransform.zw).r;\n #endif\n baseColor = quarksErode(baseColor, erosionLevel, erosionMaskValue);\n#endif\n`}const an="\n#ifdef MAP_TRANSFORM\nuniform mapTransform: vec4f;\n#endif\n#ifdef UV_DISTORTION\nvar distortionMapSampler: sampler;\nvar distortionMap: texture_2d<f32>;\nuniform distortionTransform: vec4f;\nuniform distortionStrength: f32;\n#endif\n#ifdef GRADIENT_MAP\nvar gradientMapSampler: sampler;\nvar gradientMap: texture_2d<f32>;\nuniform gradientMapRange: vec2f;\nuniform gradientMapChannel: vec4f;\n#endif\n#ifdef EROSION\nuniform erosionParams: vec2f;\nuniform erosionEdgeColor: vec3f;\n#ifdef EROSION_MASK\nvar erosionMaskSampler: sampler;\nvar erosionMask: texture_2d<f32>;\nuniform erosionMaskTransform: vec4f;\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 hn(t){return`\n var baseColor = fragmentInputs.vColor;\n#if defined(MAP_TRANSFORM) && defined(MAP_UV1)\n var mapUV = fragmentInputs.vUV1 * uniforms.mapTransform.xy + uniforms.mapTransform.zw;\n#elif defined(MAP_TRANSFORM)\n var mapUV = fragmentInputs.vUV * uniforms.mapTransform.xy + uniforms.mapTransform.zw;\n#else\n var mapUV = fragmentInputs.vUV;\n#endif\n#ifdef UV_DISTORTION\n #ifdef UV_DISTORTION_UV1\n let distortionUV = fragmentInputs.vUV1;\n #else\n let distortionUV = fragmentInputs.vUV;\n #endif\n let distortion = (textureSample(distortionMap, distortionMapSampler, distortionUV * uniforms.distortionTransform.xy + uniforms.distortionTransform.zw).rg - 0.5) * 2.0 * uniforms.distortionStrength;\n mapUV += distortion;\n#endif\n#ifdef EROSION\n let erosionLevel = baseColor.a;\n baseColor.a = 1.0;\n var erosionMaskValue = 1.0;\n#endif\n#if defined(USE_MAP) || defined(GRADIENT_MAP)\n#ifdef USE_MAP\n var texColor = textureSample(map, mapSampler, mapUV);\n ${t?"#ifdef TILE_BLEND\n #if defined(MAP_TRANSFORM) && defined(MAP_UV1)\n let mapUV2 = mapUV;\n #else\n #ifdef MAP_TRANSFORM\n var mapUV2 = fragmentInputs.vUV2 * uniforms.mapTransform.xy + uniforms.mapTransform.zw;\n #else\n var mapUV2 = fragmentInputs.vUV2;\n #endif\n #ifdef UV_DISTORTION\n mapUV2 += distortion;\n #endif\n #endif\n let texColor2 = textureSample(map, mapSampler, mapUV2);\n texColor = mix(texColor, texColor2, fragmentInputs.vTileBlend);\n #endif":""}\n#else\n // No map: the ramp is looked up at white, its far end.\n var texColor = vec4f(1.0);\n#endif\n #ifdef GRADIENT_MAP\n let rampAt = clamp(dot(texColor, uniforms.gradientMapChannel), 0.0, 1.0);\n let ramp = textureSample(gradientMap, gradientMapSampler, vec2f(mix(uniforms.gradientMapRange.x, uniforms.gradientMapRange.y, rampAt), 0.5));\n texColor = vec4f(ramp.rgb, ramp.a * mix(texColor.a, 1.0, uniforms.gradientMapChannel.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 #ifdef EROSION_MASK_UV1\n let erosionUV = fragmentInputs.vUV1;\n #else\n let erosionUV = fragmentInputs.vUV;\n #endif\n erosionMaskValue = textureSample(erosionMask, erosionMaskSampler, erosionUV * uniforms.erosionMaskTransform.xy + uniforms.erosionMaskTransform.zw).r;\n #endif\n baseColor = quarksErode(baseColor, erosionLevel, erosionMaskValue);\n#endif\n`}var ln=`\nvarying vec2 vUV;\nvarying vec4 vColor;\n#ifdef UV1\nvarying vec2 vUV1;\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\n#ifdef USE_ALPHATEST\nuniform float alphaTest;\n#endif\n\n${Di}\n${tn}\n${rn}\nvoid main() {\n${on(!0)}\n#ifdef USE_ALPHATEST\n if (baseColor.a < alphaTest) discard;\n#else\n if (baseColor.a < 0.01) discard;\n#endif\n\n${ki("baseColor.rgb")}\n gl_FragColor = baseColor;\n${en("gl_FragColor")}\n}\n`,cn=`\nvarying vUV: vec2f;\nvarying vColor: vec4f;\n#ifdef UV1\nvarying vUV1: vec2f;\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\n#ifdef USE_ALPHATEST\nuniform alphaTest: f32;\n#endif\n\n${Ji}\n${sn}\n${an}\n@fragment\nfn main(input: FragmentInputs) -> FragmentOutputs {\n${hn(!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${Wi("baseColor")}\n${nn("baseColor")}\n fragmentOutputs.color = baseColor;\n}\n`,un=`\nvarying vec2 vUV;\nvarying vec4 vColor;\n#ifdef UV1\nvarying vec2 vUV1;\n#endif\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\n#ifdef USE_ALPHATEST\nuniform float alphaTest;\n#endif\n\n${Di}\n${tn}\n${rn}\nvoid main() {\n${on(!0)}\n // A back face lights, reflects and rims as the face the camera sees.\n vec3 N = normalize(vNormal) * (gl_FrontFacing ? 1.0 : -1.0);\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 edgeTerm = pow(1.0 - abs(dot(N, V)), rimParams.x);\n #if defined(MESH_RIM_FADE)\n // Faces turned to the camera fade by the strength; edges stay.\n baseColor.a *= clamp(1.0 - rimParams.y * (1.0 - edgeTerm), 0.0, 1.0);\n #elif defined(MESH_RIM_MIX)\n color = mix(color, rimColor, clamp(edgeTerm * rimParams.y, 0.0, 1.0));\n #else\n color += rimColor * edgeTerm * rimParams.y;\n #endif\n#endif\n\n // After the rim, so a fade that empties a face can discard it.\n#ifdef USE_ALPHATEST\n if (baseColor.a < alphaTest) discard;\n#else\n if (baseColor.a < 0.01) discard;\n#endif\n\n${ki("color")}\n gl_FragColor = vec4(color, baseColor.a);\n${en("gl_FragColor")}\n}\n`,dn=`\nvarying vUV: vec2f;\nvarying vColor: vec4f;\n#ifdef UV1\nvarying vUV1: vec2f;\n#endif\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\n#ifdef USE_ALPHATEST\nuniform alphaTest: f32;\n#endif\n\n${Ji}\n${sn}\n${an}\n@fragment\nfn main(input: FragmentInputs) -> FragmentOutputs {\n${hn(!0)}\n // A back face lights, reflects and rims as the face the camera sees.\n let N = normalize(fragmentInputs.vNormal) * select(-1.0, 1.0, fragmentInputs.frontFacing);\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 edgeTerm = pow(1.0 - abs(dot(N, V)), uniforms.rimParams.x);\n #if defined(MESH_RIM_FADE)\n // Faces turned to the camera fade by the strength; edges stay.\n baseColor.a *= clamp(1.0 - uniforms.rimParams.y * (1.0 - edgeTerm), 0.0, 1.0);\n #elif defined(MESH_RIM_MIX)\n color = mix(color, uniforms.rimColor, clamp(edgeTerm * uniforms.rimParams.y, 0.0, 1.0));\n #else\n color += uniforms.rimColor * edgeTerm * uniforms.rimParams.y;\n #endif\n#endif\n\n // After the rim, so a fade that empties a face can discard it.\n#ifdef USE_ALPHATEST\n if (baseColor.a < uniforms.alphaTest) { discard; }\n#else\n if (baseColor.a < 0.01) { discard; }\n#endif\n\n var finalColor = vec4f(color, baseColor.a);\n\n${Wi("finalColor")}\n${nn("finalColor")}\n fragmentOutputs.color = finalColor;\n}\n`,fn=`\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;\n${ji}\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 UV1\n// The particle's own UV, never moved by the sheet (UV channel 1).\nvarying vec2 vUV1;\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${Ni}\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${Ri("mvPosition.xyz")}\n#ifdef SOFT_PARTICLES\n projPosition = gl_Position;\n // View depth is +z ahead of a left-handed camera and -z ahead of a right-handed one.\n linearDepth = abs(mvPosition.z);\n#endif\n\n${Hi("uv")}\n\n#ifdef UV1\n vUV1 = uv;\n#endif\n vColor = color;\n}\n`,pn=`\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${Yi}\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 UV1\n// The particle's own UV, never moved by the sheet (UV channel 1).\nvarying vUV1: vec2f;\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${Li}\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${qi("mvPosition.xyz")}\n#ifdef SOFT_PARTICLES\n vertexOutputs.projPosition = clipPosition;\n // View depth is +z ahead of a left-handed camera and -z ahead of a right-handed one.\n vertexOutputs.linearDepth = abs(mvPosition.z);\n#endif\n\n${Xi("vertexInputs.uv")}\n\n#ifdef UV1\n vertexOutputs.vUV1 = vertexInputs.uv;\n#endif\n vertexOutputs.vColor = vertexInputs.color;\n}\n`,mn=`\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;\n${ji}\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 UV1\n// The particle's own UV, never moved by the sheet (UV channel 1).\nvarying vec2 vUV1;\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\n${Ni}\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 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. a speed factor of 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 // Seen straight along its length a streak 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#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 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${Ri("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 // View depth is +z ahead of a left-handed camera and -z ahead of a right-handed one.\n linearDepth = abs(mvPosition.z);\n#endif\n\n${Hi("quadUV")}\n\n#ifdef UV1\n vUV1 = quadUV;\n#endif\n vColor = color;\n}\n`,yn=`\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;\n${Yi}\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 UV1\n// The particle's own UV, never moved by the sheet (UV channel 1).\nvarying vUV1: vec2f;\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\n${Li}\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 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. a speed factor of 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 // Seen straight along its length a streak 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#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 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${qi("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 // View depth is +z ahead of a left-handed camera and -z ahead of a right-handed one.\n vertexOutputs.linearDepth = abs(mvPosition.z);\n#endif\n\n${Xi("quadUV")}\n\n#ifdef UV1\n vertexOutputs.vUV1 = quadUV;\n#endif\n vertexOutputs.vColor = vertexInputs.color;\n}\n`,gn=`\nvarying vec2 vUV;\nvarying vec4 vColor;\n#ifdef UV1\nvarying vec2 vUV1;\n#endif\n\n#ifdef USE_MAP\nuniform sampler2D map;\n#endif\n\n#ifdef USE_ALPHATEST\nuniform float alphaTest;\n#endif\n\n${Di}\n${tn}\n${rn}\nvoid main() {\n${on(!1)}\n#ifdef USE_ALPHATEST\n if (baseColor.a < alphaTest) discard;\n#else\n if (baseColor.a < 0.01) discard;\n#endif\n\n${ki("baseColor.rgb")}\n gl_FragColor = baseColor;\n${en("gl_FragColor")}}\n`,vn=`\nvarying vUV: vec2f;\nvarying vColor: vec4f;\n#ifdef UV1\nvarying vUV1: vec2f;\n#endif\n\n#ifdef USE_MAP\nvar mapSampler: sampler;\nvar map: texture_2d<f32>;\n#endif\n\n#ifdef USE_ALPHATEST\nuniform alphaTest: f32;\n#endif\n\n${Ji}\n${sn}\n${an}\n@fragment\nfn main(input: FragmentInputs) -> FragmentOutputs {\n${hn(!1)}\n#ifdef USE_ALPHATEST\n if (baseColor.a < uniforms.alphaTest) { discard; }\n#else\n if (baseColor.a < 0.01) { discard; }\n#endif\n\n${Wi("baseColor")}\n${nn("baseColor")}\n fragmentOutputs.color = baseColor;\n}\n`,xn=`\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;\n\nvarying vec2 vUV;\nvarying vec4 vColor;\n#ifdef UV1\n// Along the trail and across it, without the sheet's cell (UV channel 1).\nattribute vec2 uv2;\nvarying vec2 vUV1;\n#endif\n\n#ifdef SOFT_PARTICLES\nvarying vec4 projPosition;\nvarying float linearDepth;\n#endif\n\n// The unit tangent of a segment, or zero for a segment of no length.\nvec3 trailDirection(vec3 d) {\n float l = dot(d, d);\n return l > 1e-12 ? d * inversesqrt(l) : vec3(0.0);\n}\n\n// The direction a ribbon point is widened along, in view space: across the trail's tangent and\n// the line of sight, as Unity's View alignment and Niagara's ribbon facing do. Stays finite at\n// repeated points, at a hairpin and for a segment pointing at the camera.\nvec3 trailSide(vec3 previousPoint, vec3 point, vec3 nextPoint) {\n vec3 incoming = trailDirection(point - previousPoint);\n vec3 outgoing = trailDirection(nextPoint - point);\n vec3 tangent = incoming + outgoing;\n if (dot(tangent, tangent) < 1e-6) {\n // A hairpin turns the two directions against each other: face the way it now goes.\n tangent = dot(outgoing, outgoing) > 0.0 ? outgoing : incoming;\n }\n // The line of sight: to the point for a perspective camera, the view axis for an orthographic one.\n vec3 sight = projection[3][3] > 0.5 ? vec3(0.0, 0.0, 1.0) : point;\n vec3 side = cross(tangent, sight);\n if (dot(side, side) < 1e-12) {\n side = cross(tangent, vec3(0.0, 0.0, 1.0));\n }\n if (dot(side, side) < 1e-12) {\n side = vec3(1.0, 0.0, 0.0);\n }\n return normalize(side);\n}\n\n${Ni}\nvoid main() {\n vec3 point = (view * vec4(position, 1.0)).xyz;\n // A swept trail lays its vertices out on the CPU and gives them no width.\n if (width > 0.0) {\n vec3 previousPoint = (view * vec4(previous, 1.0)).xyz;\n vec3 nextPoint = (view * vec4(next, 1.0)).xyz;\n point += trailSide(previousPoint, point, nextPoint) * (0.5 * width * side);\n }\n gl_Position = projection * vec4(point, 1.0);\n${Ri("point")}\n#ifdef SOFT_PARTICLES\n projPosition = gl_Position;\n // View depth is +z ahead of a left-handed camera and -z ahead of a right-handed one.\n linearDepth = abs(point.z);\n#endif\n vUV = uv;\n#ifdef UV1\n vUV1 = uv2;\n#endif\n vColor = color;\n}\n`,Sn=`\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;\n\nvarying vUV: vec2f;\nvarying vColor: vec4f;\n#ifdef UV1\n// Along the trail and across it, without the sheet's cell (UV channel 1).\nattribute uv2: vec2f;\nvarying vUV1: vec2f;\n#endif\n\n#ifdef SOFT_PARTICLES\nvarying projPosition: vec4f;\nvarying linearDepth: f32;\n#endif\n\n// The unit tangent of a segment, or zero for a segment of no length.\nfn trailDirection(d: vec3f) -> vec3f {\n let l = dot(d, d);\n return select(vec3f(0.0), d * inverseSqrt(max(l, 1e-24)), l > 1e-12);\n}\n\n// The direction a ribbon point is widened along, in view space: across the trail's tangent and\n// the line of sight, as Unity's View alignment and Niagara's ribbon facing do. Stays finite at\n// repeated points, at a hairpin and for a segment pointing at the camera.\nfn trailSide(previousPoint: vec3f, point: vec3f, nextPoint: vec3f) -> vec3f {\n let incoming = trailDirection(point - previousPoint);\n let outgoing = trailDirection(nextPoint - point);\n var tangent = incoming + outgoing;\n if (dot(tangent, tangent) < 1e-6) {\n // A hairpin turns the two directions against each other: face the way it now goes.\n tangent = select(incoming, outgoing, dot(outgoing, outgoing) > 0.0);\n }\n // The line of sight: to the point for a perspective camera, the view axis for an orthographic one.\n let sight = select(point, vec3f(0.0, 0.0, 1.0), uniforms.projection[3][3] > 0.5);\n var side = cross(tangent, sight);\n if (dot(side, side) < 1e-12) {\n side = cross(tangent, vec3f(0.0, 0.0, 1.0));\n }\n if (dot(side, side) < 1e-12) {\n side = vec3f(1.0, 0.0, 0.0);\n }\n return normalize(side);\n}\n\n${Li}\n@vertex\nfn main(input: VertexInputs) -> FragmentInputs {\n var point = (uniforms.view * vec4f(vertexInputs.position, 1.0)).xyz;\n // A swept trail lays its vertices out on the CPU and gives them no width.\n if (vertexInputs.width > 0.0) {\n let previousPoint = (uniforms.view * vec4f(vertexInputs.previous, 1.0)).xyz;\n let nextPoint = (uniforms.view * vec4f(vertexInputs.next, 1.0)).xyz;\n point += trailSide(previousPoint, point, nextPoint) * (0.5 * vertexInputs.width * vertexInputs.side);\n }\n let clipPosition = uniforms.projection * vec4f(point, 1.0);\n vertexOutputs.position = clipPosition;\n${qi("point")}\n#ifdef SOFT_PARTICLES\n vertexOutputs.projPosition = clipPosition;\n // View depth is +z ahead of a left-handed camera and -z ahead of a right-handed one.\n vertexOutputs.linearDepth = abs(point.z);\n#endif\n vertexOutputs.vUV = vertexInputs.uv;\n#ifdef UV1\n vertexOutputs.vUV1 = vertexInputs.uv2;\n#endif\n vertexOutputs.vColor = vertexInputs.color;\n}\n`;const wn=["position","uv","offset","color","size","rotation","uvTile"],bn=["position","previous","next","side","width","uv","color"],Mn=["vFogInfos","vFogColor"];function zn(t){return t===exports.RenderMode.StretchedBillBoard||t===exports.RenderMode.Beam}function _n(t,e){return t.renderMode===exports.RenderMode.Trail?function(t,e){const s=Vn(t),i=[...bn],n=["view","projection",...Mn],r=[];null!==t.texture&&(s.push("USE_MAP"),r.push("map"));Tn(t,s,n,r),An(t,e,s,n,r),bi(t)&&i.push("uv2");return{name:"quarksTrail",vertex:{glsl:xn,wgsl:Sn},fragment:{glsl:gn,wgsl:vn},defines:s,attributes:i,uniforms:n,samplers:r}}(t,e):function(t,e){const s=t.renderMode,i=s===exports.RenderMode.Mesh,n=`quarksParticle_${s}`;let r,o;i?(r={glsl:Zi,wgsl:Ki},o={glsl:un,wgsl:dn}):zn(s)?(r={glsl:mn,wgsl:yn},o={glsl:ln,wgsl:cn}):(r={glsl:fn,wgsl:pn},o={glsl:ln,wgsl:cn});const a=Vn(t),h=[...wn],l=["world","view","projection",...Mn],c=[];(function(t){return null!==t.texture||t.renderMode===exports.RenderMode.Mesh})(t)&&(a.push("USE_MAP"),c.push("map"));const u=i&&null!==t.reflectionAtlas&&e.envAtlasReady;u&&(a.push("USE_ENVMAP_ATLAS"),c.push("envAtlas"),l.push("reflectionLevel"));Ai(t)&&(a.push("UV_TILE"),l.push("tileCountX","tileCountY"),t.blendTiles&&a.push("TILE_BLEND"));An(t,e,a,l,c),s===exports.RenderMode.VerticalBillBoard&&a.push("VERTICAL");s===exports.RenderMode.HorizontalBillBoard&&a.push("HORIZONTAL");s===exports.RenderMode.Beam&&a.push("BEAM");Vi(s)&&(t.pivot&&(a.push("PIVOT"),l.push("pivot")),Ti(t)&&(a.push("SIZE_LIMITS"),l.push("sizeLimits")));const d=i&&"unlit"!==(t.lighting??"fixed");i&&!d&&a.push("MESH_UNLIT");d&&l.push("lightDirection","lightColor","ambientColor");const f=i?t.rim:void 0;f&&(a.push("MESH_RIM"),"fade"===f.mode?a.push("MESH_RIM_FADE"):"mix"===f.mode&&a.push("MESH_RIM_MIX"),l.push("rimColor","rimParams"));(u||f)&&l.push("eyePosition");Tn(t,a,l,c),i&&(h.push("normal"),bi(t)&&e.meshUV2&&(a.push("MESH_UV2"),h.push("uv2")));zn(s)&&h.push("velocity");return{name:n,vertex:r,fragment:o,defines:a,attributes:h,uniforms:l,samplers:c}}(t,e)}function Vn(t){return t.applyFog?function(t){return t.materialTransparent&&(t.materialBlendMode===r.Constants.ALPHA_ADD||t.materialBlendMode===r.Constants.ALPHA_ONEONE)}(t)?["FOG","FOG_ADDITIVE"]:["FOG"]:[]}function An(t,e,s,i,n){t.softParticles&&null!==e.depth&&(s.push("SOFT_PARTICLES"),e.depth.packed&&s.push("SOFT_DEPTH_PACKED"),i.push("softParams","projParams"),n.push("depthTexture")),t.materialAlphaTest>0&&(s.push("USE_ALPHATEST"),i.push("alphaTest"))}function Tn(t,e,s,i){const{mapUV:n,uvDistortion:r,gradientMap:o,erosion:a}=t;bi(t)&&e.push("UV1"),n&&(e.push("MAP_TRANSFORM"),1===n.channel&&e.push("MAP_UV1"),s.push("mapTransform")),r&&(e.push("UV_DISTORTION"),1===r.mapUV.channel&&e.push("UV_DISTORTION_UV1"),i.push("distortionMap"),s.push("distortionTransform","distortionStrength")),o&&(e.push("GRADIENT_MAP"),i.push("gradientMap"),s.push("gradientMapRange","gradientMapChannel")),a&&(e.push("EROSION"),s.push("erosionParams","erosionEdgeColor"),a.mask&&(e.push("EROSION_MASK"),1===a.maskUV.channel&&e.push("EROSION_MASK_UV1"),i.push("erosionMask"),s.push("erosionMaskTransform")))}function On(t){return t.isWebGPU?v.ShaderLanguage.WGSL:v.ShaderLanguage.GLSL}function $n(t,e,s,i){if(i===v.ShaderLanguage.WGSL)return y.ShaderStore.ShadersStoreWGSL[t+"VertexShader"]=e.wgsl,void(y.ShaderStore.ShadersStoreWGSL[t+"FragmentShader"]=s.wgsl);g.Effect.ShadersStore[t+"VertexShader"]=e.glsl,g.Effect.ShadersStore[t+"FragmentShader"]=s.glsl}class Pn extends Mi{static whiteTexture(t){let e=Pn.whiteTextureByScene.get(t);return e||(e=p.RawTexture.CreateRGBATexture(new Uint8Array([255,255,255,255]),1,1,t),e.name="quarksMeshWhite",Pn.whiteTextureByScene.set(t,e)),e}constructor(t,e,s=null){super(t,e,s),this.shaderMaterial=null,this.cancelAtlasRebuild=null,this.disposed=!1,this.fixedLightDirection=new c.Vector3,this.fixedLightColor=new c.Vector3,this.fixedAmbientColor=new c.Vector3,this.warnedUV2=!1,this.gatherScratch=[],this.vector_=new et,this.vector2_=new et,this.vector3_=new et,this.quaternion_=new tt,this.quaternion2_=new tt,this.quaternion3_=new tt,this.quaternion4_=new tt,this.quaternion5_=new tt,this.rotationMat_=new gt,this.rotationMat2_=new gt,this.clearedInstanceUploaded=!1,this.beamEnd_=new et,this.storeFixedLighting(li()),this.maxParticles=1e3,this.setupBuffers(),this.rebuildMaterial()}setupBuffers(){this.mesh.dispose(),this.mesh=new u.Mesh("spriteBatch",this.scene),this.configureMesh();const t=new m.VertexData;t.positions=this.settings.instancingGeometry,t.indices=this.settings.instancingIndices;const e=this.settings.instancingGeometry.length/3,s=this.settings.instancingUVs;s&&s.length>=2*e?t.uvs=s:t.uvs=new Float32Array(2*e),this.meshUV2()&&(t.uvs2=this.settings.instancingUVs2),this.settings.instancingNormals&&(t.normals=this.settings.instancingNormals),t.applyToMesh(this.mesh,!1),this.buildExpandableBuffers()}meshUV2(){const t=this.settings.instancingUVs2;if(this.settings.renderMode!==exports.RenderMode.Mesh||!t||!this.usesUV1())return!1;const e=this.settings.instancingGeometry.length/3*2;return t.length===e||(this.warnedUV2||(this.warnedUV2=!0,console.warn(`[babylon.quarks] instancingUVs2 has ${t.length} values for ${e/2} vertices (two per vertex expected); UV channel 1 reads the first UV set instead.`)),!1)}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),zn(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 Vi(this.settings.renderMode)&&Ti(this.settings)?new c.Vector2(Math.max(0,t),Math.min(e,1e9)):null}sortInstances(t,e,s){if(t<2)return;const i=this.sortScratch??(this.sortScratch=new Ui(this.maxParticles));i.ensure(t);const n=i.keys,r=this.settings.sortMode;if("distance"===r){const e=this.scene.activeCameras?.[0]??this.scene.activeCamera;if(!e)return;const s=e.globalPosition,r=s.x,o=s.y,a=s.z,h=this.offsetBuffer;for(let e=0,s=0;e<t;e++,s+=3){const t=h[s]-r,l=h[s+1]-o,c=h[s+2]-a;n[e]=i.floatKey(t*t+l*l+c*c,!0)}}else{const e="youngestInFront"===r,s=this.visibleSystems;let o=0;for(let t=0;t<s.length;t++){const r=s[t],a=r.particleNum,h=r.store;if(0===a)continue;if(void 0===h){const t=r.particles;for(let s=0;s<a;s++)n[o++]=i.floatKey(t[s].age,e);continue}const l=h.scalars,c=ve.SCALAR_STRIDE;for(let t=0,s=ve.AGE;t<a;t++,s+=c)n[o++]=i.floatKey(l[s],e)}if(o!==t)return}const o=function(t,e){const s=t.keys,i=t.counts;let n=t.orderA,r=t.orderB;for(let t=0;t<e;t++)n[t]=t;for(let t=0;t<32;t+=11){i.fill(0);for(let r=0;r<e;r++)i[s[n[r]]>>>t&Ii]++;if(i[s[n[0]]>>>t&Ii]===e)continue;let o=0;for(let t=0;t<Bi;t++){const e=i[t];i[t]=o,o+=e}for(let o=0;o<e;o++){const e=n[o];r[i[s[e]>>>t&Ii]++]=e}const a=n;n=r,r=a}return n}(i,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),s&&this.velocityBuffer&&(this.velocityBuffer=this.gatherInto(5,this.velocityBuffer,o,t,4))}gatherInto(t,e,s,i,n){let r=this.gatherScratch[t];return void 0!==r&&r.length===e.length||(r=new Float32Array(e.length)),function(t,e,s,i,n){if(1===n)for(let n=0;n<i;n++)e[n]=t[s[n]];else if(3===n)for(let n=0,r=0;n<i;n++,r+=3){const i=3*s[n];e[r]=t[i],e[r+1]=t[i+1],e[r+2]=t[i+2]}else if(4===n)for(let n=0,r=0;n<i;n++,r+=4){const i=4*s[n];e[r]=t[i],e[r+1]=t[i+1],e[r+2]=t[i+2],e[r+3]=t[i+3]}else for(let r=0;r<i;r++){const i=s[r]*n,o=r*n;for(let s=0;s<n;s++)e[o+s]=t[i+s]}}(e,r,s,i,n),this.gatherScratch[t]=e,r}rebuildMaterial(){const t=this.settings.renderMode===exports.RenderMode.Mesh,e=this.settings.texture??(t?Pn.whiteTexture(this.scene):null),s=this.settings.reflectionAtlas,i=t&&!!s&&!s.isReady();if(this.cancelAtlasRebuild?.(),this.cancelAtlasRebuild=null,i&&s){const t=s.onLoadObservable;if(t){const e=t.addOnce(()=>{this.cancelAtlasRebuild=null,this.disposed||this.rebuildMaterial()});this.cancelAtlasRebuild=()=>t.remove(e)}}const n=this.usesEnvAtlas(),o=_n(this.settings,{depth:this.depth,envAtlasReady:n,meshUV2:this.meshUV2()}),{defines:a,attributes:l,uniforms:u,samplers:d}=o,f=o.name,p=this.settings.lighting??"fixed",m=t&&"unlit"!==p,y=t?this.settings.rim:void 0,g=n||!!y,v=On(this.scene.getEngine());$n(f,o.vertex,o.fragment,v);const x=new h.ShaderMaterial(f,this.scene,{vertex:f,fragment:f},{attributes:l,uniforms:u,samplers:d,defines:a,needAlphaBlending:this.settings.materialTransparent,shaderLanguage:v});if(e&&x.setTexture("map",e),n&&s&&x.setTexture("envAtlas",s),g){const t=new c.Vector3;x.setVector3("eyePosition",t),x.onBindObservable.add(()=>{const e=this.scene.activeCamera;e&&(t.copyFrom(e.globalPosition),Mi.writeBound(x,e=>e.setVector3("eyePosition",t)))})}if(Ai(this.settings)&&(x.setFloat("tileCountX",this.settings.uTileCount),x.setFloat("tileCountY",this.settings.vTileCount)),this.bindSoft(x),this.writeSpriteParams(x,n),m&&(this.writeFixedLighting(x),"scene"===p)){const t=new c.Vector3,e=new c.Vector3,s=new c.Vector3;x.onBindObservable.add(()=>{const i=Pn.readSceneLight(this.scene,t,e,s);Mi.writeBound(x,n=>i?n.setVector3("lightDirection",t).setVector3("lightColor",e).setVector3("ambientColor",s):this.writeFixedLighting(n))})}this.bindFog(x),this.bindSurface(x),x.backFaceCulling=!1,this.settings.materialTransparent?x.alphaMode=this.settings.materialBlendMode:x.alphaMode=r.Constants.ALPHA_DISABLE,x.needDepthPrePass=this.settings.materialDepthWrite&&this.settings.materialTransparent,x.forceDepthWrite=this.settings.materialDepthWrite,x.disableDepthWrite=!this.settings.materialDepthWrite,x.depthFunction=this.settings.materialDepthTest?0:r.Constants.ALWAYS,this.shaderMaterial?.dispose(!1,!1),this.mesh.material=x,this.shaderMaterial=x}writeSpriteParams(t,e){e&&t.setFloat("reflectionLevel",this.settings.reflectionLevel);const s=this.settings.renderMode===exports.RenderMode.Mesh?this.settings.rim:void 0;s&&(t.setVector3("rimColor",new c.Vector3(s.color[0],s.color[1],s.color[2])),t.setVector2("rimParams",new c.Vector2(s.power,s.strength)));const i=Vi(this.settings.renderMode)?this.settings.pivot:void 0;i&&t.setVector3("pivot",new c.Vector3(i.x,i.y,i.z));const n=this.sizeLimits();n&&t.setVector2("sizeLimits",n)}writeLiveUniforms(t){super.writeLiveUniforms(t),this.writeSpriteParams(t,this.usesEnvAtlas())}usesEnvAtlas(){const t=this.settings.reflectionAtlas;return this.settings.renderMode===exports.RenderMode.Mesh&&!!t&&t.isReady()}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,s,i){const n=t.lights;for(let r=0;r<n.length;r++){const o=n[r],a=o.getClassName();if("DirectionalLight"!==a&&"HemisphericLight"!==a||!o.isEnabled())continue;const h=o.intensity,l=o.diffuse,c=t.ambientColor;s.set(l.r*h,l.g*h,l.b*h),i.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&&(i.x+=t.r*h,i.y+=t.g*h,i.z+=t.b*h)}return!0}return!1}update(){let t=0,e=0;const s=this.settings.renderMode,i=s===exports.RenderMode.Mesh,n=s===exports.RenderMode.StretchedBillBoard,r=s===exports.RenderMode.Beam,o=n||r,a=Vi(s),h=this.getVisibleSystems();for(let t=0;t<h.length;t++)e+=h[t].particleNum;e>this.maxParticles&&this.expandBuffers(e);for(let e=0;e<h.length;e++){const s=h[e],o=s.particleNum;if(0===o)continue;const l=s.particles,c=this.quaternion2_,u=this.vector2_,d=this.vector3_,f=s.worldSpace,p=s.emitter.matrixWorld;if(i&&!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]))}n&&!f&&this.rotationMat_.setFromMatrix4(p);const m=Math.abs(d.x),y=Math.abs(d.y),g=Math.abs(d.z),v=n?s.rendererEmitterSettings:void 0,x=void 0===v||0===v.speedFactor?.001:v.speedFactor,S=v?.lengthFactor??0,w=s.store,b=void 0!==w,M=void 0!==w&&!0!==s.onlyUsedByOther,z=s.simulationResidual??0,_=0===z?0:z/(s.simulationStep??z);b&&(0!==_&&o>0&&w.previousColor!==w.color?Pn.continueColor(this.colorBuffer,4*t,w,o,_):this.colorBuffer.set(w.color.subarray(0,4*o),4*t));let V=!1;if(void 0!==w&&f)0!==_&&o>0?Pn.extrapolate(this.offsetBuffer,3*t,w,o,_):this.offsetBuffer.set(w.position.subarray(0,3*o),3*t),0!==_&&o>0&&w.previousSize!==w.size?Pn.continueVector3(this.sizeBuffer,3*t,w.size,w.previousSize,o,_):this.sizeBuffer.set(w.size.subarray(0,3*o),3*t),V=!0;else if(M&&o>0){const e=3*t,s=e+3*o,i=this.offsetBuffer;0!==_?Pn.extrapolate(i,e,w,o,_):i.set(w.position.subarray(0,3*o),e);const n=p.elements,r=n[0],a=n[1],h=n[2],l=n[3],c=n[4],u=n[5],d=n[6],f=n[7],v=n[8],x=n[9],S=n[10],b=n[11],M=n[12],z=n[13],A=n[14],T=n[15];for(let t=e;t<s;t+=3){const e=i[t],s=i[t+1],n=i[t+2],o=1/(l*e+f*s+b*n+T);i[t]=(r*e+c*s+v*n+M)*o,i[t+1]=(a*e+u*s+x*n+z)*o,i[t+2]=(h*e+d*s+S*n+A)*o}const O=this.sizeBuffer;0!==_&&w.previousSize!==w.size?Pn.continueVector3(O,e,w.size,w.previousSize,o,_):O.set(w.size.subarray(0,3*o),e);for(let t=e;t<s;t+=3)O[t]*=m,O[t+1]*=y,O[t+2]*=g;V=!0}const A=t;if(M&&!i){const e=w;this.uvTileBuffer.set(e.uvTile.subarray(0,o),A);const s=this.rotationBuffer;if(s.set(e.rotation.subarray(0,o),A),0!==z){const t=e.angularVelocity;for(let e=0;e<o;e++)s[A+e]+=t[e]*z}n&&this.velocityBuffer&&Pn.writeVelocities(this.velocityBuffer,4*A,e,o,_,f?null:this.rotationMat_,x,S),t+=o}else if(M&&w.rotationQuaternion.length>0){const e=w;this.uvTileBuffer.set(e.uvTile.subarray(0,o),A),Pn.writeQuaternions(this.rotationBuffer,4*A,e,o,_,f?null:c),t+=o}else for(let e=0;e<o;e++,t++){const s=l[e];if(i){let e=s.rotation;const i=s.angularVelocity;let n;if(0!==_&&i instanceof tt&&(e=this.quaternion4_.copy(e).multiply(Pn.partialTurn(i,_,this.quaternion5_))),f)n=e;else{let t;t=s.parentMatrix?this.quaternion3_.setFromRotationMatrix(s.parentMatrix):c,n=this.quaternion_,n.copy(t).multiply(e)}const r=4*t;this.rotationBuffer[r]=n.x,this.rotationBuffer[r+1]=n.y,this.rotationBuffer[r+2]=n.z,this.rotationBuffer[r+3]=n.w}else{const e=s.angularVelocity;this.rotationBuffer[t]=s.rotation+("number"==typeof e?e*z:0)}if(!V){const e=s.position,i=s.previousPosition;let n=e.x+(e.x-i.x)*_,r=e.y+(e.y-i.y)*_,o=e.z+(e.z-i.z)*_;if(!f){const t=(s.parentMatrix??p).elements,e=1/(t[3]*n+t[7]*r+t[11]*o+t[15]),i=(t[0]*n+t[4]*r+t[8]*o+t[12])*e,a=(t[1]*n+t[5]*r+t[9]*o+t[13])*e;o=(t[2]*n+t[6]*r+t[10]*o+t[14])*e,n=i,r=a}const a=3*t;this.offsetBuffer[a]=n,this.offsetBuffer[a+1]=r,this.offsetBuffer[a+2]=o;const h=s.size,l=3*t;f||s.parentMatrix?(this.sizeBuffer[l]=h.x,this.sizeBuffer[l+1]=h.y,this.sizeBuffer[l+2]=h.z):(this.sizeBuffer[l]=h.x*m,this.sizeBuffer[l+1]=h.y*y,this.sizeBuffer[l+2]=h.z*g)}if(!b){const e=s.color,i=4*t;this.colorBuffer[i]=e.x,this.colorBuffer[i+1]=e.y,this.colorBuffer[i+2]=e.z,this.colorBuffer[i+3]=e.w}if(this.uvTileBuffer[t]=s.uvTile,n&&this.velocityBuffer){const e=s.velocity,i=s.previousVelocity,n=e.x+(e.x-i.x)*_,r=e.y+(e.y-i.y)*_,o=e.z+(e.z-i.z)*_,a=this.vector_;a.set(n,r,o),f||(s.parentMatrix?(this.rotationMat2_.setFromMatrix4(s.parentMatrix),a.applyMatrix3(this.rotationMat2_)):a.applyMatrix3(this.rotationMat_));const h=4*t;this.velocityBuffer[h]=a.x*x,this.velocityBuffer[h+1]=a.y*x,this.velocityBuffer[h+2]=a.z*x,this.velocityBuffer[h+3]=S}}const T=s.tint;void 0!==T&&t>A&&Pn.applyTint(this.colorBuffer,4*A,t-A,T),a&&void 0!==s.flip&&(void 0!==w?Pn.applyFlip(this.sizeBuffer,3*A,w.flip,o):Pn.applyFlipFromParticles(this.sizeBuffer,3*A,l,o)),r&&this.velocityBuffer&&this.writeBeams(s,A,t-A)}this.mesh.forcedInstanceCount=t,this.refreshBoundingInfo(),0!==t?(this.clearedInstanceUploaded=!1,"none"!==this.settings.sortMode&&this.sortInstances(t,i,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,i?4*t:t)),o&&this.velocityVB&&this.velocityBuffer&&this.velocityVB.update(this.velocityBuffer.subarray(0,4*t))):this.clearedInstanceUploaded||(this.uploadClearedInstance(i,o),this.clearedInstanceUploaded=!0)}writeBeams(t,e,s){const i=this.velocityBuffer,n=this.offsetBuffer,r=this.beamEnd_,o="function"==typeof t.getBeamEnd&&t.getBeamEnd(r);for(let t=e;t<e+s;t++){const e=3*t,s=4*t;i[s]=o?r.x-n[e]:0,i[s+1]=o?r.y-n[e+1]:0,i[s+2]=o?r.z-n[e+2]:0,i[s+3]=0}}static applyTint(t,e,s,i){for(let n=0,r=e;n<s;n++,r+=4)t[r]*=i.x,t[r+1]*=i.y,t[r+2]*=i.z,t[r+3]*=i.w}static applyFlip(t,e,s,i){for(let n=0,r=e;n<i;n++,r+=3){const e=s[n];0!==e&&(1&e&&(t[r]=-t[r]),2&e&&(t[r+1]=-t[r+1]))}}static applyFlipFromParticles(t,e,s,i){for(let n=0,r=e;n<i;n++,r+=3){const e=s[n].flip;0!==e&&(1&e&&(t[r]=-t[r]),2&e&&(t[r+1]=-t[r+1]))}}static writeQuaternions(t,e,s,i,n,r){const o=s.rotationQuaternion,a=s.angularVelocityQuaternion,h=null!==r,l=h?r.x:0,c=h?r.y:0,u=h?r.z:0,d=h?r.w:1;for(let s=0,r=0,f=e;s<i;s++,r+=4,f+=4){let e=o[r],s=o[r+1],i=o[r+2],p=o[r+3];if(0!==n){const t=a[r]*n,o=a[r+1]*n,h=a[r+2]*n,l=1+(a[r+3]-1)*n,c=1/Math.sqrt(t*t+o*o+h*h+l*l),u=t*c,d=o*c,f=h*c,m=l*c,y=e*m+p*u+s*f-i*d,g=s*m+p*d+i*u-e*f,v=i*m+p*f+e*d-s*u;p=p*m-e*u-s*d-i*f,e=y,s=g,i=v}if(h){const t=l*p+d*e+c*i-u*s,n=c*p+d*s+u*e-l*i,r=u*p+d*i+l*s-c*e;p=d*p-l*e-c*s-u*i,e=t,s=n,i=r}t[f]=e,t[f+1]=s,t[f+2]=i,t[f+3]=p}}static writeVelocities(t,e,s,i,n,r,o,a){const h=s.velocity,l=s.previousVelocity.length>=3*i?s.previousVelocity:h,c=null!==r?r.elements:null;for(let s=0,r=0,u=e;s<i;s++,r+=3,u+=4){let e=h[r],s=h[r+1],i=h[r+2];if(0!==n&&(e+=(e-l[r])*n,s+=(s-l[r+1])*n,i+=(i-l[r+2])*n),null!==c){const t=c[0]*e+c[3]*s+c[6]*i,n=c[1]*e+c[4]*s+c[7]*i;i=c[2]*e+c[5]*s+c[8]*i,e=t,s=n}t[u]=e*o,t[u+1]=s*o,t[u+2]=i*o,t[u+3]=a}}static partialTurn(t,e,s){const i=t.x*e,n=t.y*e,r=t.z*e,o=1+(t.w-1)*e,a=1/Math.sqrt(i*i+n*n+r*r+o*o);return s.x=i*a,s.y=n*a,s.z=r*a,s.w=o*a,s}static continueVector3(t,e,s,i,n,r){for(let o=0,a=0;o<n;o++,a+=3){const n=s[a]+(s[a]-i[a])*r,o=s[a+1]+(s[a+1]-i[a+1])*r,h=s[a+2]+(s[a+2]-i[a+2])*r;t[e+a]=n>0?n:0,t[e+a+1]=o>0?o:0,t[e+a+2]=h>0?h:0}}static continueColor(t,e,s,i,n){const r=s.color,o=s.previousColor;for(let s=0,a=0;s<i;s++,a+=4){const s=r[a]+(r[a]-o[a])*n,i=r[a+1]+(r[a+1]-o[a+1])*n,h=r[a+2]+(r[a+2]-o[a+2])*n,l=r[a+3]+(r[a+3]-o[a+3])*n;t[e+a]=s>0?s:0,t[e+a+1]=i>0?i:0,t[e+a+2]=h>0?h:0,t[e+a+3]=l>0?l:0}}static extrapolate(t,e,s,i,n){const r=s.position,o=s.previousPosition;for(let s=0,a=0;s<i;s++,a+=3){const s=r[a],i=r[a+1],h=r[a+2];t[e+a]=s+(s-o[a])*n,t[e+a+1]=i+(i-o[a+1])*n,t[e+a+2]=h+(h-o[a+2])*n}}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.disposed=!0,this.cancelAtlasRebuild?.(),this.cancelAtlasRebuild=null,this.mesh.material&&this.mesh.material.dispose(),super.dispose()}}Pn.whiteTextureByScene=new WeakMap;function Cn(t){const e=Math.round(Number(t?.tessellation)||0);return Math.min(16,Math.max(0,e))}function En(t){const e=Number(t?.curveTension)||0;return Math.min(1,Math.max(0,e))}const Fn=["stretch","tile","distributePerSegment","repeatPerSegment"];function Bn(t){const e=t?.textureMode;return void 0!==e&&Fn.includes(e)?e:"stretch"}function In(t){const e=Number(t?.textureScale);return Number.isFinite(e)&&e>0?e:1}function Un(t){const e=Number(t?.minVertexDistance);return Number.isFinite(e)&&e>0?e:0}function Nn(t){const e=Number(t?.lifetime);return Number.isFinite(e)&&e>0?e:1/0}class Rn{constructor(){this.position=new Float32Array(0),this.side=new Float32Array(0),this.size=new Float32Array(0),this.color=new Float32Array(0),this.distance=new Float32Array(0)}reserve(t){if(t>this.size.length){const e=Math.max(t,2*this.size.length,64);this.position=new Float32Array(3*e),this.side=new Float32Array(3*e),this.size=new Float32Array(e),this.color=new Float32Array(4*e),this.distance=new Float32Array(e)}return this}writePoint(t,e,s,i,n){const r=3*t;if(n){const t=1/(n[3]*e+n[7]*s+n[11]*i+n[15]);this.position[r]=(n[0]*e+n[4]*s+n[8]*i+n[12])*t,this.position[r+1]=(n[1]*e+n[5]*s+n[9]*i+n[13])*t,this.position[r+2]=(n[2]*e+n[6]*s+n[10]*i+n[14])*t}else this.position[r]=e,this.position[r+1]=s,this.position[r+2]=i}writeSide(t,e,s,i,n){const r=3*t;n?(this.side[r]=n[0]*e+n[4]*s+n[8]*i,this.side[r+1]=n[1]*e+n[5]*s+n[9]*i,this.side[r+2]=n[2]*e+n[6]*s+n[10]*i):(this.side[r]=e,this.side[r+1]=s,this.side[r+2]=i)}writeColor(t,e,s,i,n){const r=4*t;this.color[r]=e,this.color[r+1]=s,this.color[r+2]=i,this.color[r+3]=n}}function Dn(t,e,s){return Math.sqrt(Math.sqrt((t[s]-t[e])**2+(t[s+1]-t[e+1])**2+(t[s+2]-t[e+2])**2))}class kn extends Mi{constructor(t,e,s=null){super(t,e,s),this.uv1Buffer=null,this.drawsNothing=!1,this.vector2_=new et,this.vector3_=new et,this.quaternion_=new tt,this.samples_=new Rn,this.curve_=new Rn,this.cutScratch_=new Rn,this.maxParticles=1024,this.setupBuffers(),this.rebuildMaterial()}setupBuffers(){this.mesh.dispose(),this.mesh=new u.Mesh("trailBatch",this.scene),this.configureMesh(),this.buildGeometryBuffers()}buildGeometryBuffers(){const e=this.maxParticles;this.positionBuffer=new Float32Array(3*e),this.previousBuffer=new Float32Array(3*e),this.nextBuffer=new Float32Array(3*e),this.uvBuffer=new Float32Array(2*e),this.uv1Buffer=this.usesUV1()?new Float32Array(2*e):null,this.sideBuffer=new Float32Array(e),this.widthBuffer=new Float32Array(e),this.colorBuffer=new Float32Array(4*e),this.indexBuffer=new Uint32Array(3*e);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.uv1Buffer&&this.mesh.setVerticesData(t.VertexBuffer.UV2Kind,this.uv1Buffer,!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 s=this.scene.getEngine();this.previousVB=new t.VertexBuffer(s,this.previousBuffer,"previous",!0,!1,3,!1),this.nextVB=new t.VertexBuffer(s,this.nextBuffer,"next",!0,!1,3,!1),this.sideVB=new t.VertexBuffer(s,this.sideBuffer,"side",!0,!1,1,!1),this.widthVB=new t.VertexBuffer(s,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=_n(this.settings,{depth:this.depth,envAtlasReady:!1,meshUV2:!1}),{defines:e,attributes:s,uniforms:i,samplers:n}=t,o=t.name,a=On(this.scene.getEngine());$n(o,t.vertex,t.fragment,a);const l=new h.ShaderMaterial(o,this.scene,{vertex:o,fragment:o},{attributes:s,uniforms:i,samplers:n,defines:e,needAlphaBlending:this.settings.materialTransparent,shaderLanguage:a});this.settings.texture&&l.setTexture("map",this.settings.texture),this.bindFog(l),this.bindSoft(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&&this.settings.materialTransparent,l.forceDepthWrite=this.settings.materialDepthWrite,l.disableDepthWrite=!this.settings.materialDepthWrite,l.depthFunction=this.settings.materialDepthTest?0:r.Constants.ALWAYS,this.mesh.material?.dispose(!1,!1),this.mesh.material=l}trailSamples(t){return this.samples_.reserve(t)}cutLastSegment(t,e,s,i,n){const r=e-1-s,o=this.cutScratch_.reserve(s+1);o.position.set(t.position.subarray(3*r,3*e)),o.side.set(t.side.subarray(3*r,3*e)),o.size.set(t.size.subarray(r,e)),o.color.set(t.color.subarray(4*r,4*e)),o.distance.set(t.distance.subarray(r,e));for(let e=1;e<=s;e++){const a=i*e,h=Math.min(s-1,Math.floor(a)),l=a-h,c=r+e;for(let e=0;e<3;e++)t.position[3*c+e]=o.position[3*h+e]*(1-l)+o.position[3*h+3+e]*l,n&&(t.side[3*c+e]=o.side[3*h+e]*(1-l)+o.side[3*h+3+e]*l);t.size[c]=o.size[h]*(1-l)+o.size[h+1]*l,t.distance[c]=o.distance[h]*(1-l)+o.distance[h+1]*l;for(let e=0;e<4;e++)t.color[4*c+e]=o.color[4*h+e]*(1-l)+o.color[4*h+4+e]*l}}tessellate(t,e,s,i,n,r){const o=this.curve_.reserve((s-1)*(i+1)+1),a=t.position,h=t.side,l=o.position,c=o.side,u=1-n;let d=0;for(let n=0;n+1<s;n++){const s=3*n,f=s+3;let p=0,m=0,y=0,g=0,v=0,x=0,S=s,w=f;if(n+1<e){S=3*(n>0?n-1:n),w=3*(n+2<e?n+2:n+1);const t=Dn(a,s,f);if(t>1e-6){const e=Dn(a,S,s),i=Dn(a,f,w);y=u,g=u,e>1e-6&&(p=u*t/e,m=-u*t/(e+t)),i>1e-6&&(v=-u*t/(t+i),x=u*t/i)}}const b=0===p&&0===m&&0===y&&0===g&&0===v&&0===x,M=r?Math.sqrt(h[s]*h[s]+h[s+1]*h[s+1]+h[s+2]*h[s+2]):0,z=r?Math.sqrt(h[f]*h[f]+h[f+1]*h[f+1]+h[f+2]*h[f+2]):0;for(let e=0;e<=i;e++,d++){const u=e/(i+1),_=u*u,V=_*u,A=b?1-u:2*V-3*_+1,T=V-2*_+u,O=b?u:-2*V+3*_,$=V-_,P=3*d;for(let t=0;t<3;t++){const e=a[s+t],i=a[f+t],n=p*(e-a[S+t])+m*(i-a[S+t])+y*(i-e),r=g*(i-e)+v*(a[w+t]-e)+x*(a[w+t]-i);l[P+t]=A*e+T*n+O*i+$*r}if(r){let t=0,e=0,i=0;for(let n=0;n<3;n++){const r=h[s+n],o=h[f+n],a=A*r+T*(p*(r-h[S+n])+m*(o-h[S+n])+y*(o-r))+O*o+$*(g*(o-r)+v*(h[w+n]-r)+x*(h[w+n]-o));0===n?t=a:1===n?e=a:i=a}let n=Math.sqrt(t*t+e*e+i*i);if(n<=1e-6*Math.max(M,z,1e-6)){const r=u<.5?s:f;t=h[r],e=h[r+1],i=h[r+2],n=u<.5?M:z}const r=n>0?(M+(z-M)*u)/n:0;c[P]=t*r,c[P+1]=e*r,c[P+2]=i*r}o.size[d]=t.size[n]+(t.size[n+1]-t.size[n])*u,o.distance[d]=t.distance[n]+(t.distance[n+1]-t.distance[n])*u;const C=4*n,E=4*d;for(let e=0;e<4;e++)o.color[E+e]=t.color[C+e]+(t.color[C+4+e]-t.color[C+e])*u}}const f=3*(s-1),p=3*d;for(let t=0;t<3;t++)l[p+t]=a[f+t],c[p+t]=h[f+t];o.size[d]=t.size[s-1],o.distance[d]=t.distance[s-1];for(let e=0;e<4;e++)o.color[4*d+e]=t.color[4*(s-1)+e];return o}writeSweptPair(t,e,s,i,n,r,o,a){const h=this.positionBuffer;h[t]=e+n*a,h[t+1]=s+r*a,h[t+2]=i+o*a,h[t+3]=e-n*a,h[t+4]=s-r*a,h[t+5]=i-o*a}static ensureWorldMatrix(t){const e=t.emitter;!e.computeWorldMatrix||e.isSynchronized&&e.isSynchronized()||e.computeWorldMatrix(!0)}update(){let t=0,e=0,s=0;const i=this.getVisibleSystems();for(let t=0;t<i.length;t++){const e=i[t],n=e.particles,r=Cn(e.rendererEmitterSettings);for(let t=0;t<e.particleNum;t++){const e=n[t].historyCount;0!==e&&(s+=2*(e*(r+1)+1))}}s>this.maxParticles&&this.expandBuffers(s);for(let s=0;s<i.length;s++){const n=i[s],r=t;kn.ensureWorldMatrix(n);const o=this.quaternion_,a=this.vector2_,h=this.vector3_,l=n.emitter.matrixWorld;l.decompose(a,o,h);const c=n.particles,u=n.particleNum,d=this.settings.uTileCount,f=this.settings.vTileCount,p=1/d,m=1/f,y=n.worldSpace,g=(Math.abs(h.x)+Math.abs(h.y)+Math.abs(h.z))/3,v=n.rendererEmitterSettings,x=Boolean(v.uvFromHead),S=this.uv1Buffer,w=Boolean(v.colorFromParticle),b=y||Boolean(v.recordWorldSpace),M=v.sideAxis,z=v.followLocalOrigin?0:n.simulationResidual??0,_=0===z?0:z/(n.simulationStep??z),V=Math.abs(_)<1e-4?0:_,A=Cn(v),T=En(v),O=Bn(v),$="stretch"===O?0:"tile"===O?1:"repeatPerSegment"===O?3:2,P=In(v),C=Un(v)>0;for(let s=0;s<u;s++){const i=c[s],n=i.historyCount;if(0===n)continue;const r=i.historyCapacity,o=i.historyPositions,a=i.historySizes,h=i.historyDistances,u=i.historySides,v=void 0!==M&&u.length>=3*r,z=w?i.store.color:i.historyColors,_=4*i.storeIndex,{column:O,row:E}=Gi(i.uvTile,d,f),F=(i.parentMatrix??l).elements,B=y||i.parentMatrix?1:g,I=b||i.parentMatrix?1:g,U=i.age<i.life,N=U&&V>0,R=n+(N?1:0),D=this.trailSamples(R);let k=i.getHistoryIndex(0);for(let t=0;t<n;t++){const e=o;if(D.writePoint(t,e[3*k],e[3*k+1],e[3*k+2],b?null:F),v){const e=u;D.writeSide(t,e[3*k],e[3*k+1],e[3*k+2],b?null:F)}D.size[t]=a[k],D.distance[t]=h[k];const s=w?_:4*k;D.writeColor(t,z[s],z[s+1],z[s+2],z[s+3]),k=k+1===r?0:k+1}if(N){const t=i.previousPosition,e=i.position,s=n;let r=e.x+(e.x-t.x)*V,a=e.y+(e.y-t.y)*V,h=e.z+(e.z-t.z)*V;if(D.writePoint(s,r,a,h,y?null:F),b&&!y){const t=1/(F[3]*r+F[7]*a+F[11]*h+F[15]),e=(F[0]*r+F[4]*a+F[8]*h+F[12])*t,s=(F[1]*r+F[5]*a+F[9]*h+F[13])*t;h=(F[2]*r+F[6]*a+F[10]*h+F[14])*t,r=e,a=s}const l=3*i.getHistoryIndex(n-1),c=r-o[l],u=a-o[l+1],d=h-o[l+2];D.distance[s]=D.distance[s-1]+Math.sqrt(c*c+u*u+d*d),v&&D.writeSide(s,M.x,M.y,M.z,F),D.size[s]=D.size[s-1];const f=i.color;D.writeColor(s,f.x,f.y,f.z,f.w)}const L=A>0?this.tessellate(D,n,R,A,T,v):D,q=A>0?(R-1)*(A+1)+1:R,J=A+1,W=U&&V<0&&n>1;let G=1+V;if(W&&C){const t=L.distance,e=t[q-1]-t[q-1-J];if(e>1e-9){const t=i.previousPosition,s=i.position;let n=s.x-t.x,r=s.y-t.y,o=s.z-t.z;if(b&&!y){const t=F[0]*n+F[4]*r+F[8]*o,e=F[1]*n+F[5]*r+F[9]*o;o=F[2]*n+F[6]*r+F[10]*o,n=t,r=e}const a=Math.sqrt(n*n+r*r+o*o);G=1+V*Math.min(1,a/e)}}W&&this.cutLastSegment(L,q,J,G,v);const Q=n-1+(N?V:W?G-1:0),j=1/Math.max(.001,Q),H=(R-2)*J,Y=L.position,X=L.distance,Z=X[0],K=X[q-1],tt=0===$&&K-Z>1e-6,et=1/Math.max(1e-6,K-Z),st=I*P,it=Math.floor(Z*st),nt=(f-E-1)*m,rt=(f-E)*m;for(let s=0;s<q;s++,t+=2){const i=3*s,r=s>0?i-3:i,o=s+1<q?i+3:i,a=Y[i],h=Y[i+1],l=Y[i+2],c=L.size[s],u=3*t;if(v){const e=L.side;this.writeSweptPair(u,a,h,l,e[i],e[i+1],e[i+2],.5*c),this.widthBuffer[t]=0,this.widthBuffer[t+1]=0}else this.positionBuffer[u]=a,this.positionBuffer[u+1]=h,this.positionBuffer[u+2]=l,this.positionBuffer[u+3]=a,this.positionBuffer[u+4]=h,this.positionBuffer[u+5]=l,this.widthBuffer[t]=c*B,this.widthBuffer[t+1]=c*B;this.previousBuffer[u]=Y[r],this.previousBuffer[u+1]=Y[r+1],this.previousBuffer[u+2]=Y[r+2],this.previousBuffer[u+3]=Y[r],this.previousBuffer[u+4]=Y[r+1],this.previousBuffer[u+5]=Y[r+2],this.nextBuffer[u]=Y[o],this.nextBuffer[u+1]=Y[o+1],this.nextBuffer[u+2]=Y[o+2],this.nextBuffer[u+3]=Y[o],this.nextBuffer[u+4]=Y[o+1],this.nextBuffer[u+5]=Y[o+2];const d=2*t;let f;if(tt){const t=(X[s]-Z)*et;f=(x?1-t:t)*P}else if(1===$)f=x?(K-X[s])*st:X[s]*st-it;else{let t=s/J;if(s>H&&(N||W)){const e=(s-H)/J;t=N?n-1+V*e:n-2+G*e}if(3!==$){const e=Math.min(1,t*j);f=(x?1-e:e)*P}else f=(x?Q-t:t)*P}const m=(f+O)*p;this.uvBuffer[d]=m,this.uvBuffer[d+1]=nt,this.uvBuffer[d+2]=m,this.uvBuffer[d+3]=rt,S&&(S[d]=f,S[d+1]=0,S[d+2]=f,S[d+3]=1);const y=L.color,g=4*s,w=4*t;this.colorBuffer[w]=y[g],this.colorBuffer[w+1]=y[g+1],this.colorBuffer[w+2]=y[g+2],this.colorBuffer[w+3]=y[g+3],this.colorBuffer[w+4]=y[g],this.colorBuffer[w+5]=y[g+1],this.colorBuffer[w+6]=y[g+2],this.colorBuffer[w+7]=y[g+3],s+1<q&&(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++)}}const E=n.tint;if(void 0!==E){const e=this.colorBuffer;for(let s=4*r,i=4*t;s<i;s+=4)e[s]*=E.x,e[s+1]*=E.y,e[s+2]*=E.z,e[s+3]*=E.w}this.measureSystemBounds(n,r,t)}this.refreshBoundingInfo(),this.uploadGeometry(t,e)}measureSystemBounds(t,e,s){if(s<=e||"function"!=typeof t.setWorldBounds)return;const i=this.positionBuffer;let n=1/0,r=1/0,o=1/0,a=-1/0,h=-1/0,l=-1/0;for(let t=3*e,c=3*s;t<c;t+=3){const e=i[t],s=i[t+1],c=i[t+2];e<n&&(n=e),e>a&&(a=e),s<r&&(r=s),s>h&&(h=s),c<o&&(o=c),c>l&&(l=c)}const c=this.widthBuffer;let u=0;for(let t=e;t<s;t+=2){const e=c[t];e>u&&(u=e)}t.setWorldBounds(n,r,o,a,h,l,u)}uploadGeometry(e,s){const i=this.mesh.geometry,n=i?.getIndexBuffer();if(e>0&&s>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)),this.uv1Buffer&&this.mesh.updateVerticesData(t.VertexBuffer.UV2Kind,this.uv1Buffer.subarray(0,2*e)),n&&this.scene.getEngine().updateDynamicIndexBuffer(n,this.indexBuffer.subarray(0,3*s),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 i=this.mesh.getVertexBuffer(t.VertexBuffer.ColorKind);i&&i.update(this.colorBuffer.subarray(0,4*e)),this.mesh.subMeshes&&this.mesh.subMeshes.length>0&&(this.mesh.subMeshes[0].indexCount=3*s,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),n&&this.scene.getEngine().updateDynamicIndexBuffer(n,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 Ln extends n.TransformNode{constructor(t,e){super(t,e),this.warnedAboutTransform=!1,this.batches=[],this.elapsed=0,this.systemToBatchIndex=new Map,this.depth=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=li(),this.cullingEnabled=!0,this.catchUpBudgetMs=2,this.simulationBudgetMs=1/0,this.frustumPlanes=[],this.boundsMin=new et,this.boundsMax=new et}collectFrustumPlanes(){const t=this.getScene(),e=this.frustumPlanes,n=t.activeCameras,r=t.activeCamera,o=n&&n.length>0?n:r?[r]:[],a=6*o.length;for(;e.length<a;)e.push(new i.Plane(0,0,0,0));e.length=a;for(let t=0;t<o.length;t++){const i=o[t];i.getViewMatrix(),i.getProjectionMatrix();const n=i.getTransformationMatrix(),r=0===t?e:e.slice(6*t,6*t+6);if(s.Frustum.GetPlanesToRef(n,r),0!==t)for(let s=0;s<6;s++)e[6*t+s]=r[s]}return e}isSystemInView(t,e){const s=this.boundsMin,i=this.boundsMax;if(!t.getWorldBounds(s,i))return!0;for(let t=0;t<e.length;t+=6){let n=!0;for(let r=t;r<t+6;r++){const t=e[r],o=t.normal,a=o.x>=0?i.x:s.x,h=o.y>=0?i.y:s.y,l=o.z>=0?i.z:s.z;if(o.x*a+o.y*h+o.z*l+t.d<0){n=!1;break}}if(n)return!0}return!1}static clamp(t,e,s){return Math.max(e,Math.min(s,t))}addSystem(t){if(this.isDisposed())throw new Error("BatchedRenderer.addSystem: the renderer has been disposed");const e=t,s=e._renderer;void 0!==s&&s!==this&&s.deleteSystem(t),e._renderer=this,this.removeFromBatch(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,s=t.getRendererSettings(),i=Oi(s);for(let t=0;t<this.batches.length;t++)if(Ci(this.batches[t].settings,i))return this.batches[t].addSystem(e),void this.systemToBatchIndex.set(e,t);let n;const r=this.getScene();switch(s.renderMode){case exports.RenderMode.Trail:n=new kn(s,r,this.depth);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:n=new Pn(s,r,this.depth);break;default:throw new Error(`Unsupported render mode: ${s.renderMode}`)}n.mesh.parent=this,n.applyMeshLighting(this.meshLighting),n.addSystem(e),this.batches.push(n),this.batchEmptyFrames.push(0),this.systemToBatchIndex.set(e,this.batches.length-1)}deleteSystem(t){const e=this.removeFromBatch(t),s=this.systems.indexOf(t);-1!==s&&(this.systems.splice(s,1),this.orderedSystemsStale=!0);const i=this.orderedSystems.indexOf(t);return-1!==i&&this.orderedSystems.splice(i,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){const e=this.systemToBatchIndex.get(t);if(void 0!==e){const s=this.batches[e],i=Oi(t.getRendererSettings());if(1===s.systems.size&&$i(s.settings,i)&&!this.batches.some(t=>t!==s&&Ci(t.settings,i)))return void s.applyLiveSettings(i)}this.removeFromBatch(t),this.addSystem(t)}setDepthTexture(t,e={}){this.depth=t?oi(t,e):null;for(const t of this.batches)t.applyDepthTexture(this.depth)}get depthTexture(){return this.depth?.texture??null}set depthTexture(t){this.setDepthTexture(t)}get depthEncoding(){return this.depth?.encoding??null}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,s=Ln.clamp(t.minQuality??e.minQuality,.05,1),i=Ln.clamp(t.maxQuality??e.maxQuality,s,1);e.targetFrameMs=Math.max(t.targetFrameMs??e.targetFrameMs,.1),e.minQuality=s,e.maxQuality=i,e.decreaseStep=Math.max(t.decreaseStep??e.decreaseStep,.001),e.increaseStep=Math.max(t.increaseStep??e.increaseStep,.001),e.currentQuality=Ln.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,s=new Set,i=new Set(this.systems),n=r=>{if(!s.has(r)&&!e.has(r)){e.add(r);for(const t of(t=>{const e=[];for(const s of t.behaviors??[]){if("EmitSubParticleSystem"!==s.type)continue;const t=s.subParticleSystem?.system;void 0!==t&&i.has(t)&&e.push(t)}return e})(r))n(t);e.delete(r),s.add(r),t.push(r)}};for(const t of this.systems)n(t);return t.reverse(),this.orderedSystems=t,this.orderedSystemsStale=!1,t}update(t){this.elapsed+=t,this.warnedAboutTransform||this.getWorldMatrix().isIdentity()||(this.warnedAboutTransform=!0,console.warn(`[babylon.quarks] BatchedRenderer "${this.name}" is transformed; particles are placed in the world by their emitters, so the renderer's own transform moves them again. Keep the renderer at the origin.`));const e=this.adaptivePerformanceState,s=e.enabled?performance.now():0;e.enabled&&this.applyAdaptiveQuality();const i=this.orderSystems(),n=this.cullingEnabled?this.collectFrustumPlanes():null,r=this.simulationBudgetMs!==1/0||this.catchUpBudgetMs!==1/0?performance.now():0,o=this.simulationBudgetMs===1/0?1/0:r+this.simulationBudgetMs,a=this.catchUpBudgetMs===1/0?1/0:r+this.catchUpBudgetMs;for(let e=0;e<i.length;e++){const s=i[e];s.emitter.visible&&(s.culled=null!==n&&n.length>0&&"always"!==s.cullingMode&&!0!==s.onlyUsedByOther&&!this.isSystemInView(s,n),s.update(t,o,a)),i[e]!==s&&e--}this.refreshBatches(),e.enabled&&(e.lastFrameCpuMs=performance.now()-s,e.lastFrameCpuMs>e.targetFrameMs?e.currentQuality=Ln.clamp(e.currentQuality-e.decreaseStep,e.minQuality,e.maxQuality):e.currentQuality=Ln.clamp(e.currentQuality+e.increaseStep,e.minQuality,e.maxQuality))}refreshBatches(){const t=this.batchEmptyFrames;for(let e=0;e<this.batches.length;e++){const s=this.batches[e];if(s.time=this.elapsed,s.systems.size>0){t[e]=0,s.update();continue}const i=(t[e]??0)+1;t[e]=i,1===i?s.update():i>Ln.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,s]of this.systemToBatchIndex)s>t&&this.systemToBatchIndex.set(e,s-1)}getBatchRenderStats(){return this.batches.map((t,e)=>{let s=0;const i=[];for(const e of t.systems){const t=e;s+=t.particleNum,i.push(t.emitter.name)}return{batchIndex:e,renderMode:t.settings.renderMode,instanceCount:t.mesh.forcedInstanceCount??0,particleCount:s,systemNames:i}})}dispose(){for(const t of this.batches)t.dispose();this.batches=[],this.batchEmptyFrames.length=0;for(const t of this.systems)t._renderer===this&&(t._renderer=void 0);this.systems.length=0,this.orderedSystems=[],this.orderedSystemsStale=!0,this.systemToBatchIndex.clear(),super.dispose()}}Ln.EMPTY_BATCH_GRACE_FRAMES=120;const qn=new WeakMap,Jn=new WeakMap;function Wn(t,e,s){if(qn.has(t))return;const i={textures:new Set(e),materials:s};for(const t of i.textures)Jn.set(t,(Jn.get(t)??0)+1);qn.set(t,i),t.onDisposeObservable.addOnce(()=>Gn(t))}function Gn(t){const e=qn.get(t);if(void 0!==e){qn.delete(t);for(const t of e.materials)t.dispose();for(const t of e.textures){const e=(Jn.get(t)??1)-1;e>0?Jn.set(t,e):(Jn.delete(t),t.dispose())}}}function Qn(t){t.dispose(),Gn(t)}let jn=0;class Hn extends n.TransformNode{get matrixWorld(){const t=this.getWorldMatrix(),e=t.updateFlag;if(e===this._matrixWorldFlag)return this._matrixWorld;this._matrixWorldFlag=e;const s=this._matrixWorld.elements,i=t.m;return s[0]=i[0],s[1]=i[1],s[2]=i[2],s[3]=i[3],s[4]=i[4],s[5]=i[5],s[6]=i[6],s[7]=i[7],s[8]=i[8],s[9]=i[9],s[10]=i[10],s[11]=i[11],s[12]=i[12],s[13]=i[13],s[14]=i[14],s[15]=i[15],this._matrixWorld}get visible(){return this.isEnabled()}set visible(t){this.setEnabled(t)}get uuid(){return js(this)}constructor(t,e){super("particleEmitter",e||void 0),this._matrixWorld=new ot,this._matrixWorldFlag=-1,this.system=t}dispose(t,e=!1){this.isDisposed()||(super.dispose(t,e),jn>0||this.system.dispose?.())}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:js(this),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 Yn{static runOnAllParticleEmitters(t,e){Yn.traverseNode(t,t=>{t instanceof Hn&&e(t)})}static addToBatchRenderer(t,e){Yn.runOnAllParticleEmitters(t,t=>{e.addSystem(t.system)})}static play(t){Yn.runOnAllParticleEmitters(t,t=>{t.system.play()})}static stop(t){Yn.runOnAllParticleEmitters(t,t=>{t.system.stop()})}static pause(t){Yn.runOnAllParticleEmitters(t,t=>{t.system.pause()})}static restart(t){Yn.runOnAllParticleEmitters(t,t=>{t.system.restart()})}static setAutoDestroy(t,e){Yn.runOnAllParticleEmitters(t,t=>{t.system.autoDestroy=e})}static endEmit(t){Yn.runOnAllParticleEmitters(t,t=>{t.system.endEmit()})}static isEffectFinished(t){let e=!1,s=!0;return Yn.runOnAllParticleEmitters(t,t=>{e=!0,t.system.isFinished()||(s=!1)}),e&&s}static instantiate(t,e){const s=new Map,i=(t,e,r)=>{let o;if(t instanceof Hn)o=t.clone(r),s.set(t,o);else{if(!(t instanceof n.TransformNode))return null;o=new n.TransformNode(r??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())i(e,o);return o},r=i(t,null,e);!function(t,e){for(let s=t;null!==s;s=s.parent){const t=qn.get(s);if(void 0!==t)return void Wn(e,t.textures,[])}}(t,r);for(const t of s.values())for(const e of t.system.behaviors)if(e instanceof Ee){const t=s.get(e.subParticleSystem);void 0!==t&&(e.subParticleSystem=t)}return r}static getDuration(t){const e=[];Yn.runOnAllParticleEmitters(t,t=>{e.push(t.system)});const s=new Map;for(let t=0;t<e.length;t++){const i=e[t];for(const t of i.behaviors){if(!(t instanceof Ee))continue;const n=t.subParticleSystem?.system;if(void 0!==n&&"object"==typeof n){e.includes(n)||e.push(n);const t=s.get(n)??[];t.push(i),s.set(n,t)}}}const i=new Map,n=t=>{const e=i.get(t);if(void 0!==e)return e;i.set(t,1/0);const r=t.playbackSpeed,o=Yn.maxOf(t.startLife)/r;let a;if(r>0)if(t.onlyUsedByOther){a=0;for(const e of s.get(t)??[])a=Math.max(a,n(e));a+=t.duration/r+o}else a=t.looping?1/0:(Yn.maxOf(t.startDelay,0)+t.duration)/r+o;else a=1/0;return i.set(t,a),a};let r=0;for(const t of e)r=Math.max(r,n(t));return r}static maxOf(t,e){if(t instanceof Rt)return t.value;if(t instanceof Dt)return Math.max(t.a,t.b);let s=-1/0;for(let i=0;i<=32;i++){const n=[];t.startGen(n);const r="function"===t.type?t.genValue(n,e??i/32):t.genValue(n);s=Math.max(s,r)}return s}static traverseNode(t,e){e(t);const s=t.getChildren();for(const t of s)Yn.traverseNode(t,e)}}const Xn=new WeakMap,Zn=new WeakMap,Kn=new WeakSet,tr=new WeakSet,er=new WeakSet;function sr(t){if(!t?.isCube)return null;const e=t.files??t._files;return 6===e?.length?e.slice():null}function ir(t){return t.getScene?.()??null}function nr(t,e=ir(t)){return e&&Xn.get(t)?.get(e)||null}function rr(t,e){const s=Xn.get(t);if(s)for(const[t,i]of[...s])e&&t!==e||(s.delete(t),Kn.has(i)&&i.dispose())}function or(t,e,s){let i=Xn.get(t);i||(i=new Map,Xn.set(t,i)),i.set(e,s),!tr.has(s)&&s.onDisposeObservable&&(tr.add(s),s.onDisposeObservable.addOnce(()=>{Xn.get(t)?.get(e)===s&&Xn.get(t).delete(e)})),!er.has(t)&&t.onDisposeObservable&&(er.add(t),t.onDisposeObservable.addOnce(()=>{er.delete(t),rr(t)}))}async function ar(t,e){if("undefined"==typeof document||"undefined"==typeof Image)throw new Error("createEnvAtlasFromFaceUrls requires a DOM Image/canvas environment");const s=await Promise.all(t.map(t=>function(t){return new Promise((e,s)=>{const i=new Image;i.crossOrigin="anonymous",i.onload=()=>e(i),i.onerror=()=>s(new Error(`Failed to load env face ${t}`)),i.src=t})}(t))),i=s[0].width||s[0].naturalWidth;if(!i)throw new Error("Env atlas face image has zero size");const n=document.createElement("canvas");n.width=3*i,n.height=2*i;const r=n.getContext("2d");if(!r)throw new Error("Could not create env atlas canvas");for(let t=0;t<6;t++)r.drawImage(s[t],t%3*i,Math.floor(t/3)*i,i,i);const o=new x.Texture(n.toDataURL("image/jpeg",.92),e,{noMipmap:!0,invertY:!1,samplingMode:x.Texture.LINEAR_LINEAR});return o.name="quarksEnvAtlas",o}const hr={createFromFaceUrls:ar};function lr(t,e,s){const i=nr(t,e);if(i)return s(i),i;let n=Zn.get(t);n||(n=new Map,Zn.set(t,n));const r=n,o=()=>{const i=r.get(e);if(i)return void i.then(t=>{t&&s(t)});const n=sr(t);if(!n)return;let o=!1;const a=t.onDisposeObservable?.addOnce(()=>o=!0),h=()=>{r.delete(e),a&&t.onDisposeObservable.remove(a)},l=hr.createFromFaceUrls(n,e).then(i=>(h(),o||e.isDisposed?(i.dispose(),null):(Kn.add(i),or(t,e,i),s(i),i))).catch(t=>(h(),console.warn("[babylon.quarks] Failed to build env atlas from cubemap faces",t),null));r.set(e,l)};if(t.isReady())o();else{const e=t.onLoadObservable;e?e.addOnce(()=>o()):o()}return nr(t,e)}function cr(t,e){if(e&&e.length>0)return e;const s=t.length/3,i=new Uint32Array(s);for(let t=0;t<s;t++)i[t]=t;return i}const ur=new Set(["SizeOverLife","SizeBySpeed"]),dr=new Set(["ColorOverLife","ColorBySpeed"]),fr=new Set(["ApplyForce","Noise","TurbulenceField","GravityForce","RotationOverLife","Rotation3DOverLife","RotationBySpeed","SpeedOverLife","FrameOverLife","ForceOverLife","VelocityOverLife","InheritVelocity","OrbitOverLife","WidthOverLength","ChangeEmitDirection","EmitSubParticleSystem","LimitSpeedOverLife","ApplyCollision"]);class pr{constructor(){this.fusionSteps=[],this.changesSize=!0,this.changesColor=!0}steps(t){const e=this.plan;if(void 0!==e&&e.length===t.length){let s=!0;for(let i=0;i<t.length;i++)if(e[i]!==t[i]){s=!1;break}if(s)return this.fusionSteps}this.plan=t.slice(),this.fusionSteps=Os(t);let s=!1,i=!1;for(let e=0;e<t.length;e++){const n=t[e].type;ur.has(n)?s=!0:dr.has(n)?i=!0:fr.has(n)||(s=!0,i=!0)}return this.changesSize=s,this.changesColor=i,this.fusionSteps}}function mr(t){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]))}class yr{constructor(){this.min=new et,this.max=new et,this.padding=0,this.valid=!1,this.stepsSince=0,this.maxSize=0,this.maxSpeedSq=0,this.inWorld=!1,this.geometryRadius=1}get due(){return this.stepsSince>=4||!this.valid}store(t,e,s,i,n,r,o,a,h,l,c,u,d,f){if(0===t)return void(this.valid=!1);this.stepsSince=e?0:this.stepsSince+1,this.maxSize=h,this.maxSpeedSq=l;const p=Math.sqrt(l),m=c.renderMode;let y=p*f*(this.stepsSince+1);if(m===exports.RenderMode.Mesh)y+=h*this.meshGeometryRadius(c.instancingGeometry);else if(m===exports.RenderMode.StretchedBillBoard){const t=u;y+=h*(1+(t.lengthFactor??0)+p*(t.speedFactor??0))}else{const t=c.pivot;y+=h*(.75+(void 0===t?0:Math.abs(t.x)+Math.abs(t.y)+Math.abs(t.z)))}this.min.set(s,i,n),this.max.set(r,o,a),this.padding=y,this.inWorld=d,this.valid=!0}setWorld(t,e,s,i,n,r,o){this.min.set(t,e,s),this.max.set(i,n,r),this.padding=o,this.inWorld=!0,this.valid=!0}worldPadding(t){return this.inWorld?this.padding:this.padding*mr(t.matrixWorld.elements)}toWorld(t,e,s){if(!this.valid)return!1;const i=this.min,n=this.max;if(this.inWorld){const s=this.padding;return t.set(i.x-s,i.y-s,i.z-s),e.set(n.x+s,n.y+s,n.z+s),!0}const r=s.matrixWorld.elements,o=this.padding*mr(r);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?n.x:i.x,s=2&t?n.y:i.y,o=4&t?n.z:i.z,f=1/(r[3]*e+r[7]*s+r[11]*o+r[15]),p=(r[0]*e+r[4]*s+r[8]*o+r[12])*f,m=(r[1]*e+r[5]*s+r[9]*o+r[13])*f,y=(r[2]*e+r[6]*s+r[10]*o+r[14])*f;p<a&&(a=p),p>c&&(c=p),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}meshGeometryRadius(t){if(t!==this.geometryRadiusFor){let e=0;for(let s=0;s+2<t.length;s+=3){const i=t[s]*t[s]+t[s+1]*t[s+1]+t[s+2]*t[s+2];i>e&&(e=i)}this.geometryRadius=Math.sqrt(e),this.geometryRadiusFor=t}return this.geometryRadius}}function gr(t){return t.cycle>=1?Math.floor(t.cycle):1}function vr(t){return t.interval>0?t.interval:0}class xr{constructor(t,e){this.system=t,this.spawner=e,this.memory=[],this.pathMatrix=new ot,this.temp=new et}rollGenerators(){const t=this.system,e=this.memory;t.emissionBursts.forEach(t=>t.count.startGen(e)),t.emissionOverDistance.startGen(e),t.startDelay.startGen(e);const s=t.startDelay.genValue(e,0);return t.emissionOverTime.startGen(e),s}hasPendingEmission(){const t=this.system;if(t.isEmitEnded)return!1;if(t.looping)return!0;if(t.onlyUsedByOther)return!1;const e=t.emissionState;if(e.waitEmiting>0)return!0;if(e.burstIndex<t.emissionBursts.length)return!0;if(this.hasPendingBurstWaves(e))return!0;if(e.time>=t.duration)return!1;const s=e.time/t.duration;return this.emitsFrom(t.emissionOverTime,s)||this.emitsFrom(t.emissionOverDistance,s)}emitsFrom(t,e){if(t.genValue(this.memory,e)>0)return!0;if("function"!==t.type)return!1;if(t instanceof qt){for(let s=0;s<t.functions.length;s++)if(t.getEndX(s)>e&&t.functions[s][0].p.some(t=>t>0))return!0;return!1}for(let s=1;s<=64;s++)if(t.genValue(this.memory,e+(1-e)*s/64)>0)return!0;return!1}hasPendingBurstWaves(t){const e=t.burstWaves;if(void 0===e)return!1;const s=this.system.emissionBursts,i=this.system.duration;for(let n=0;n<t.burstIndex&&n<s.length;n++){const t=s[n],r=e[n]??0;if(r<gr(t)&&(0===r||t.time+r*vr(t)<=i))return!0}return!1}emit(t,e,s){const i=this.system;if(i.isDisposed)return;const n=i.duration,r=i.isEmitEnded&&e===i.emissionState;if(e.time>n)if(i.looping){e.time-=n,e.burstIndex=0,void 0!==e.burstWaves&&(e.burstWaves.length=0);const t=i.behaviors;for(let e=0;e<t.length;e++)t[e].reset()}else i.isEmitEnded||i.onlyUsedByOther||i.endEmit();i.worldSpace&&this.spawner.normalMatrix.getNormalMatrix(s);const o=i.emissionFactor();i.emissionBursts.length>0&&!r&&this.emitBursts(e,s);let a=0,h=0,l=0,c=0;const u=e.previousWorldPos;if(!i.isEmitEnded){const r=e.time/n;if(e.waitEmiting+=t*i.emissionOverTime.genValue(this.memory,r)*o,void 0!==u){this.temp.set(s.elements[12],s.elements[13],s.elements[14]),c=u.distanceTo(this.temp);const t=i.emissionOverDistance.genValue(this.memory,r)*o;if(t>0){l=e.travelDistance,e.travelDistance+=c;const s=Math.floor(e.travelDistance*t);s>0&&(e.travelDistance-=s/t,i.worldSpace&&c>0?(a=s,h=1/t):e.waitEmiting+=s)}else e.travelDistance=0}}const d=Math.floor(e.waitEmiting);d>0&&(this.spawner.spawn(d,e,s),e.waitEmiting-=d),a>0&&this.spawnAlongPath(a,e,s,u,l,h,c),void 0===e.previousWorldPos&&(e.previousWorldPos=new et),e.previousWorldPos.set(s.elements[12],s.elements[13],s.elements[14]),e.time+=t}emitBursts(t,e){const s=this.system.emissionBursts,i=this.system.duration,n=s.length,r=t.time,o=t.burstWaves??(t.burstWaves=[]);for(;t.burstIndex<n&&s[t.burstIndex].time<=r;)o[t.burstIndex]=0,t.burstIndex++;const a=t.burstIndex;for(let n=0;n<a;n++){const a=s[n],h=gr(a);let l=o[n]??0;if(l>=h)continue;const c=vr(a);for(;l<h;){const s=a.time+l*c;if(l>0&&s>i){l=h;break}if(s>r)break;t.burstWaveIndex=l,this.fireBurstWave(a,t,e),l++}o[n]=l}}fireBurstWave(t,e,s){if(M()>=t.probability)return;const i=t.count.genValue(this.memory,e.time/this.system.duration),n=this.system.emissionFactor(),r=Math.abs(n-1)<.001?i:Math.floor(i*n+M());e.isBursting=!0,e.burstParticleCount=r,this.spawner.spawn(r,e,s),e.isBursting=!1}spawnAlongPath(t,e,s,i,n,r,o){const a=this.pathMatrix.copy(s),h=s.elements,l=a.elements,c=h[12],u=h[13],d=h[14];for(let s=1;s<=t;s++){const t=s*r-n,h=t<=0?0:t>=o?1:t/o;l[12]=i.x+(c-i.x)*h,l[13]=i.y+(u-i.y)*h,l[14]=i.z+(d-i.z)*h,this.spawner.spawn(1,e,a)}}}class Sr{constructor(){this.listeners={}}add(t,e){this.listeners[t]||(this.listeners[t]=[]),this.listeners[t].push(e)}removeAll(t){this.listeners[t]&&(this.listeners[t]=[])}remove(t,e){if(this.listeners[t]){const s=this.listeners[t].indexOf(e);-1!==s&&this.listeners[t].splice(s,1)}}has(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 s=0;s<e.length;s++)e[s](t)}}const wr=new Float32Array([-.5,-.5,0,.5,-.5,0,.5,.5,0,-.5,.5,0]),br=new Float32Array([0,0,1,0,1,1,0,1]),Mr=new Uint32Array([0,1,2,0,2,3]),zr=new WeakMap,_r=new WeakMap;function Vr(t){let e=zr.get(t);return void 0!==e&&e.length===t.length/3*2||(e=new Float32Array(t.length/3*2),zr.set(t,e)),e}function Ar(t){let e=_r.get(t);if(!e){e=new Float32Array(t.length);for(let t=2;t<e.length;t+=3)e[t]=1;_r.set(t,e)}return e}const Tr=1/60;class Or{constructor(){this.accumulator=0,this.pendingCatchUp=0,this.delayLeft=0}reset(){this.accumulator=0,this.pendingCatchUp=0}setStartDelay(t){this.delayLeft=t>0?t:0}get delaying(){return this.delayLeft>0}static frameSeconds(t,e){if(!(t>0))return 0;return(t>.1?.1:t)*e}consumeStartDelay(t){if(this.delayLeft<=0)return t;if(this.delayLeft-=t,this.delayLeft>=0)return 0;const e=Math.min(-this.delayLeft,.1);return this.delayLeft=0,e}accrue(t,e=1){this.accumulator+=t;const s=e>1?Math.ceil(8*e):8,i=Math.min(s,Math.max(0,Math.round(this.accumulator/Tr-1e-9)));return this.accumulator-=i*Tr,i}get residual(){return this.accumulator>Tr?Tr:this.accumulator<-Tr?-Tr:this.accumulator}deferCatchUp(t){this.pendingCatchUp=Math.min(2,this.pendingCatchUp+t)}get owesCatchUp(){return this.pendingCatchUp>0}takeCatchUpSteps(){const t=Math.floor(this.pendingCatchUp/Tr);return this.pendingCatchUp=0,t}}const $r=new et;function Pr(t,e,s,i){const n=t[s],r=t[i];return t[s]=r,t[i]=n,s!==i&&(e.swapRows(s,i),r.setStoreIndex(s),n.setStoreIndex(i)),n}function Cr(t){return t?.getScene()?t:null}const Er=new et(0,0,1),Fr=new tt,Br=new tt,Ir=new et,Ur=new et;class Nr{constructor(t){this.system=t,this.normalMatrix=new gt}rebind(){const t=this.system.particles;for(let e=0;e<t.length;e++)t[e].rebind()}grow(t){const e=this.system,s=e.particles.length;e.store.ensureCapacity(s+1)&&this.rebind(),e.particles.push(t?new Me(e.store,s):new we(e.store,s))}spawn(t,e,s){const i=this.system,n=Ir,r=Ur;s.decompose(n,Br,r);const o=i.behaviors,a=o.length,h=i.rendererSettings.renderMode,l=h===exports.RenderMode.Trail,c=!l,u=h===exports.RenderMode.Mesh,d=i.startRotation,f=i.startSize,p="rotation"===d.type,m="vec3function"===f.type,y=e.time/i.duration,g=l?i.rendererEmitterSettings:void 0,v=Boolean(g?.followLocalOrigin),x=i.worldSpace,S="hierarchy"===i.scalingMode,w=i.particles;void 0!==i.maxParticles&&(t=Math.min(t,Math.max(0,i.maxParticles-i.particleNum)));for(let n=0;n<t;n++){e.burstParticleIndex=n,i.particleNum++,w.length<i.particleNum&&this.grow(l);const t=w[i.particleNum-1];if(t.reset(),t.serial=(t.serial??0)+1,t.speedModifier=1,i.finishedEventFired=!1,i.startColor.startGen(t.memory),i.startColor.genColor(t.memory,t.startColor,y),t.color.copy(t.startColor),i.startSpeed.startGen(t.memory),t.startSpeed=i.startSpeed.genValue(t.memory,y),i.startLife.startGen(t.memory),t.life=i.startLife.genValue(t.memory,y),t.age=0,f.startGen(t.memory),m)f.genValue(t.memory,t.startSize,y);else{const e=f.genValue(t.memory,y);t.startSize.set(e,e,e)}if(i.startTileIndex.startGen(t.memory),t.uvTile=i.startTileIndex.genValue(t.memory),t.size.copy(t.startSize),c){const e=t;if(d.startGen(t.memory),u)e.rotation instanceof tt||(e.rotation=Fr),e.angularVelocity instanceof tt&&e.angularVelocity.set(0,0,0,1),p?d.genValue(t.memory,e.rotation,1,y):e.rotation.setFromAxisAngle(Er,d.genValue(e.memory,y));else{e.rotation=p?0:d.genValue(e.memory,y),e.angularVelocity=0;const t=i.flip;e.flip=void 0===t?0:(M()<t.x?1:0)|(M()<t.y?2:0)}}else if(g){const e=t;g.startLength.startGen(e.memory),e.length=g.startLength.genValue(e.memory,y),e.ensureHistoryCapacity(Math.max(1,Math.ceil(e.length))),e.resetHistory()}i.emitterShape.initialize(t,e),i.alignToDirection&&c&&Rr(t,u);const h=e.particle,b=e.inherit;if(void 0!==h&&void 0!==b&&0!==b&&Dr(t,h,b,c),l&&v){const e=t;e.localPosition||(e.localPosition=new et),e.localPosition.copy(e.position)}x?(t.position.applyMatrix4(s),t.startSize.multiply(r).abs(),t.size.copy(t.startSize),S?t.velocity.multiply(i.hierarchyScale).applyQuaternion(Br):t.velocity.multiply(r).applyMatrix3(this.normalMatrix),t.rotation&&t.rotation instanceof tt&&t.rotation.multiplyQuaternions(Br,t.rotation)):i.onlyUsedByOther&&(t.parentMatrix=s);for(let e=0;e<a;e++)o[e].initialize(t,i);i.store.recordMemory(t.storeIndex,t.memory)}}}function Rr(t,e){const s=t.velocity,i=s.x*s.x+s.y*s.y+s.z*s.z;if(0!==i)if(e){const e=t.rotation;Ir.copy(s).divideScalar(Math.sqrt(i)),Br.setFromUnitVectors(Er,Ir),e.multiplyQuaternions(Br,e)}else 0===s.x&&0===s.y||(t.rotation=t.rotation+Math.atan2(-s.x,s.y))}function Dr(t,e,s,i){if(s&Pe.color&&(t.startColor.multiply(e.color),t.color.copy(t.startColor)),s&Pe.size&&(t.startSize.multiply(e.size),t.size.copy(t.startSize)),s&Pe.rotation&&i){const s=t,i=e.rotation;"number"==typeof s.rotation?"number"==typeof i&&(s.rotation+=i):i instanceof tt&&s.rotation.multiplyQuaternions(i,s.rotation)}s&Pe.lifetime&&e.life>0&&(t.life*=Math.max(0,1-e.age/e.life))}function kr(t,e,s,i,n={}){return{param:t,json:n.json,get:e,isDefault:t=>t===s,toJSON:t=>t,fromJSON:i,clone:t=>t}}function Lr(t){return"number"==typeof t?t:void 0}function qr(t){return"number"==typeof t?si(t):void 0}function Jr(t){return"number"==typeof t&&Number.isFinite(t)&&t>=0?t:void 0}function Wr(t){return"number"==typeof t?0!==t:"boolean"==typeof t?t:void 0}function Gr(t,e,s,i,n=!0){const r=JSON.stringify(s().toJSON());return{param:t,always:n,get:e,isDefault:t=>JSON.stringify(t.toJSON())===r,toJSON:t=>t.toJSON(),fromJSON:t=>"number"==typeof t?new Rt(t):i(t),clone:t=>t.clone()}}function Qr(t){const e=t;if(void 0!==e)return void 0===e.z?[e.x,e.y]:[e.x,e.y,e.z]}const jr=[kr("autoDestroy",t=>t.autoDestroy,!1,Wr),kr("looping",t=>t.looping,!0,Wr),kr("prewarm",t=>t.prewarm,!1,Wr),kr("prewarmTime",t=>t.prewarmTime,0,Lr),kr("duration",t=>t.duration,1,Lr),Gr("startDelay",t=>t.startDelay,()=>new Rt(0),Jt,!1),Gr("startLife",t=>t.startLife,()=>new Rt(5),Jt),Gr("startSpeed",t=>t.startSpeed,()=>new Rt(0),Jt),Gr("startRotation",t=>t.startRotation,()=>new Rt(0),t=>oe(t)),Gr("startSize",t=>t.startSize,()=>new Rt(1),t=>oe(t)),Gr("startColor",t=>t.startColor,()=>new Kt(new Vt(1,1,1,1)),t=>te(t)),Gr("emissionOverTime",t=>t.emissionOverTime,()=>new Rt(10),Jt),Gr("emissionOverDistance",t=>t.emissionOverDistance,()=>new Rt(0),Jt),{param:"emissionBursts",get:t=>t.emissionBursts,isDefault:t=>0===t.length,toJSON:t=>t.map(t=>({time:t.time,count:t.count.toJSON(),probability:t.probability,interval:t.interval,cycle:t.cycle})),fromJSON:t=>Array.isArray(t)?ri(t.map(t=>({time:t.time,count:"number"==typeof t.count?new Rt(t.count):Jt(t.count),probability:t.probability,interval:t.interval,cycle:t.cycle??t.cycleCount}))):void 0,clone:t=>t.map(t=>({...t,count:t.count.clone()}))},kr("maxParticles",t=>t.maxParticles,void 0,Lr),kr("onlyUsedByOther",t=>t.onlyUsedByOther,!1,Wr),kr("renderMode",t=>t.renderMode,exports.RenderMode.BillBoard,Lr),kr("renderOrder",t=>t.renderOrder,0,Lr),kr("renderingGroupId",t=>t.renderingGroupId,0,Lr),kr("applyFog",t=>t.applyFog,!0,t=>!1!==t),kr("playbackSpeed",t=>t.playbackSpeed,1,Lr),kr("cullingMode",t=>t.cullingMode,"always",Ks),kr("scalingMode",t=>t.scalingMode,"shape",t=>"hierarchy"===t?"hierarchy":"shape"),kr("seed",t=>t.seed,void 0,Lr),kr("sortMode",t=>t.sortMode,"none",Zs),kr("alignToDirection",t=>t.alignToDirection,!1,t=>!0===t),kr("minParticleSize",t=>t.minParticleSize,0,Lr),kr("maxParticleSize",t=>t.maxParticleSize,1/0,Lr),kr("layerMask",t=>t.layers.mask,268435455,Lr,{json:"layers"}),Gr("startTileIndex",t=>t.startTileIndex,()=>new Rt(0),Jt),kr("uTileCount",t=>t.uTileCount,1,qr),kr("vTileCount",t=>t.vTileCount,1,qr),kr("blendTiles",t=>t.blendTiles,!1,Wr),kr("softParticles",t=>t.softParticles,!1,Wr),kr("softFarFade",t=>t.softFarFade,1,Jr),kr("softNearFade",t=>t.softNearFade,0,Jr),kr("blendMode",t=>t.blending,r.Constants.ALPHA_ADD,Lr,{json:"blending"}),kr("transparent",t=>t.transparent,!0,Wr),kr("depthTest",t=>t.depthTest,!0,Wr),kr("depthWrite",t=>t.depthWrite,!1,Wr),kr("alphaTest",t=>t.alphaTest,0,Lr),kr("worldSpace",t=>t.worldSpace,!1,Wr),{param:"pivot",get:t=>t.pivot,isDefault:t=>void 0===t,toJSON:Qr,fromJSON:t=>Array.isArray(t)?new et(t[0]??0,t[1]??0,t[2]??0):void 0,clone:t=>t?.clone()},{param:"flip",get:t=>t.flip,isDefault:t=>void 0===t,toJSON:Qr,fromJSON:t=>Array.isArray(t)?new bt(t[0]??0,t[1]??0):void 0,clone:t=>t?.clone()}];function Hr(t){return t.json??t.param}function Yr(t){const e={};for(const s of jr){const i=s.get(t);!s.always&&s.isDefault(i)||(e[Hr(s)]=s.toJSON(i))}return e}function Xr(t){const e={};for(const s of jr)e[s.param]=s.clone(s.get(t));return e}const Zr=new WeakMap,Kr=new WeakMap,to=new WeakMap;function eo(t,e){const s=(Zr.get(t)??0)+1;return Zr.set(t,s),`${e}_${s}`}function so(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}function io(t){const e={},s=Cn(t),i=En(t);return s>0&&(e.tessellation=s),i>0&&(e.curveTension=i),e}function no(t){const e={},s=Bn(t),i=In(t),n=Un(t),r=Nn(t);return"stretch"!==s&&(e.textureMode=s),1!==i&&(e.textureScale=i),n>0&&(e.minVertexDistance=n),r!==1/0&&(e.lifetime=r),e}function ro(t){return t?.followLocalOrigin?{followLocalOrigin:!0}:{}}function oo(t){const e=t?.sideAxis;return e?{sideAxis:[e.x,e.y,e.z]}:{}}function ao(t){if(null==t)return{};let e,s,i;Array.isArray(t)?[e,s,i]=t:"object"==typeof t&&({x:e,y:s,z:i}=t);const n=t=>"number"==typeof t?t:"string"==typeof t&&""!==t.trim()?Number(t):NaN,[r,o,a]=[n(e),n(s),n(i)];return Number.isFinite(r)&&Number.isFinite(o)&&Number.isFinite(a)&&r*r+o*o+a*a>0?{sideAxis:new et(r,o,a)}:(console.warn(`[quarks] sideAxis ${JSON.stringify(t)} is not a direction and is ignored`),{})}function ho(t,e){const s=void 0===e||"string"==typeof e?{geometries:{},materials:{},textures:{},images:{},shapes:{},skeletons:{},animations:{},nodes:{}}:e,i=function(t,e){const s=t.rendererSettings,i=[s.instancingGeometry,s.instancingIndices,s.instancingUVs,s.instancingUVs2,s.instancingNormals];let n=Kr.get(e);void 0===n&&(n=[],Kr.set(e,n));const r=n.find(t=>t.arrays.every((t,e)=>t===i[e]));if(void 0!==r)return r.uuid;const o=eo(e,"quarks_geometry");return n.push({arrays:i,uuid:o}),e.geometries[o]={uuid:o,type:"QuarksGeometry",positions:Array.from(t.rendererSettings.instancingGeometry),indices:Array.from(t.rendererSettings.instancingIndices),uvs:t.rendererSettings.instancingUVs?Array.from(t.rendererSettings.instancingUVs):void 0,...t.rendererSettings.instancingUVs2?{uvs2:Array.from(t.rendererSettings.instancingUVs2)}:{},normals:t.rendererSettings.instancingNormals?Array.from(t.rendererSettings.instancingNormals):void 0},o}(t,s),n=function(t,e){let s=to.get(e);void 0===s&&(s=new Map,to.set(e,s));const i=s,n=(t,s=!1,n="texture")=>{if(!(t instanceof x.Texture||s&&t))return void(t&&console.warn(`[quarks] ${n} is not a url-backed Texture and is not written to the file`));let r=i.get(t);return void 0===r&&(r=eo(e,"quarks_texture"),i.set(t,r),e.textures[r]=t),r},r=n(t.rendererSettings.texture,!0),o=n(t.rendererSettings.reflectionAtlas),a=t.erosion,h=t.uvDistortion,l=t.gradientMap,c=(t,e)=>void 0!==e?{[t]:e}:{},u=eo(e,"quarks_material");return e.materials[u]={uuid:u,type:"QuarksMaterial",transparent:t.rendererSettings.materialTransparent,alphaMode:t.rendererSettings.materialBlendMode,depthTest:t.rendererSettings.materialDepthTest,depthWrite:t.rendererSettings.materialDepthWrite,alphaTest:t.rendererSettings.materialAlphaTest,texture:r,reflectionAtlas:o,reflectionLevel:t.rendererSettings.reflectionLevel,..."fixed"!==t.lighting?{lighting:t.lighting}:{},...t.rim?{rim:{...t.rim,color:[...t.rim.color]}}:{},...c("mapUV",t.mapUV?fi(t.mapUV):void 0),...l?{gradientMap:{ramp:n(l.ramp,!1,"gradientMap.ramp"),..."r"!==l.channel?{channel:l.channel}:{}}}:{},...a?{erosion:{...c("mask",n(a.mask,!1,"erosion.mask")),...c("maskUV",fi(a.maskUV)),...a.softness!==yi?{softness:a.softness}:{},...0!==a.edgeWidth?{edgeWidth:a.edgeWidth}:{},...a.edgeColor.some(t=>1!==t)?{edgeColor:[...a.edgeColor]}:{}}}:{},...h?{uvDistortion:{map:n(h.map,!1,"uvDistortion.map"),...c("mapUV",fi(h.mapUV,vi)),...h.strength!==xi?{strength:h.strength}:{}}}:{},sourceMaterial:t.material??void 0},u}(t,s),r=function(t){if(t.renderMode===exports.RenderMode.Trail){const e=t.rendererEmitterSettings;return{startLength:e.startLength.toJSON(),...ro(e),...so(e),...io(e),...no(e),...oo(e)}}if(t.renderMode===exports.RenderMode.StretchedBillBoard)return{speedFactor:t.rendererEmitterSettings.speedFactor,lengthFactor:t.rendererEmitterSettings.lengthFactor};return{}}(t);return{version:"3.0",shape:t.emitterShape.toJSON(),...Yr(t),instancingGeometry:i,...Object.keys(r).length>0?{rendererEmitterSettings:r}:{},material:n,behaviors:t.behaviors.map(t=>t.toJSON())}}function lo(t,e,s){const i=t.shape?Ws(t.shape,e):void 0;let n;if(t.renderMode===exports.RenderMode.Trail){const e=t.rendererEmitterSettings;n={startLength:void 0!==e?.startLength?Jt(e.startLength):new Rt(30),followLocalOrigin:Boolean(e?.followLocalOrigin),...so(e),...io(e),...no(e),...ao(e?.sideAxis)}}else t.renderMode===exports.RenderMode.StretchedBillBoard?(n={...t.rendererEmitterSettings??{}},void 0!==t.speedFactor&&(n.speedFactor=t.speedFactor)):n={};const o=t.material?e.materials?.[t.material]:void 0,a=o?.texture??t.texture,h="string"==typeof a?e.textures?.[a]??null:a??null,l=t=>"string"==typeof t?e.textures?.[t]??null:t??null,c=o?.erosion,u=o?.gradientMap,d=o?.uvDistortion,f=function(t){if(t?.positions){const e=t.positions instanceof Float32Array?t.positions:new Float32Array(t.positions);return{positions:e,indices:cr(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,uvs2:t.uvs2?t.uvs2 instanceof Float32Array?t.uvs2:new Float32Array(t.uvs2):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 s;return e.index?.array&&(s=new("Uint16Array"===e.index.type?Uint16Array:Uint32Array)(e.index.array)),{positions:t,indices:cr(t,s),uvs:e.attributes.uv?.array?new Float32Array(e.attributes.uv.array):void 0,uvs2:(e.attributes.uv1??e.attributes.uv2)?.array?new Float32Array((e.attributes.uv1??e.attributes.uv2).array):void 0,normals:e.attributes.normal?.array?new Float32Array(e.attributes.normal.array):void 0}}return{positions:wr,indices:Mr,uvs:br}}("string"==typeof t.instancingGeometry?e.geometries?.[t.instancingGeometry]:t.instancingGeometry),p=function(t){const e={},s=t;for(const t of jr){const i=s[Hr(t)];if(null==i)continue;const n=t.fromJSON(i);void 0!==n&&(e[t.param]=n)}return e}(t);return{...p,scene:s,shape:i,instancingGeometry:f.positions,instancingIndices:f.indices,instancingUVs:f.uvs,instancingUVs2:f.uvs2,instancingNormals:f.normals,rendererEmitterSettings:n,texture:h,material:o?.sourceMaterial??o,blendMode:o?.alphaMode??p.blendMode??r.Constants.ALPHA_ADD,transparent:o?.transparent??p.transparent??!0,depthTest:o?.depthTest??p.depthTest??!0,depthWrite:o?.depthWrite??p.depthWrite??!1,alphaTest:o?.alphaTest??p.alphaTest??0,behaviors:[],lighting:o?.lighting,rim:o?.rim,mapUV:o?.mapUV,gradientMap:u&&"object"==typeof u?{...u,ramp:l(u.ramp)}:void 0,erosion:c&&"object"==typeof c?{...c,mask:l(c.mask)}:void 0,uvDistortion:d&&"object"==typeof d?{...d,map:l(d.map)}:void 0}}const co=new et,uo=new tt,fo=new et,po=new et,mo=new tt,yo=new et,go=new et,vo=new tt,xo=new et;class So{get prewarmTime(){return this.prewarmTimeValue}set prewarmTime(t){this.prewarmTimeValue=t>0?t:0}get duration(){return this.durationValue}set duration(t){this.durationValue=t>Tr?t:Tr}set time(t){const e=this.duration;let s=Number.isFinite(t)&&t>0?t:0;s>=e&&(s=this.looping?s%e:e);const i=this.emissionState;i.time=s,i.isBursting=!1,i.burstIndex=0,i.burstWaveIndex=0,i.burstWaves=void 0,this.markBurstsBefore(s)}get time(){return this.emissionState.time}get isEmitEnded(){return this.emitEnded}hasPendingEmission(){return this.emission.hasPendingEmission()}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=si(t),this.neededToUpdateRender=!0}get vTileCount(){return this.rendererSettings.vTileCount}set vTileCount(t){this.rendererSettings.vTileCount=si(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??"none"}set sortMode(t){this.rendererSettings.sortMode=Zs(t),this.neededToUpdateRender=!0}get minParticleSize(){return this.rendererSettings.minParticleSize??0}set minParticleSize(t){this.rendererSettings.minParticleSize=Math.max(0,t),this.neededToUpdateRender=!0}get maxParticleSize(){return this.rendererSettings.maxParticleSize??1/0}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=ti(t),this.neededToUpdateRender=!0}get lighting(){return this.rendererSettings.lighting??"fixed"}set lighting(t){this.rendererSettings.lighting=Xs(t),this.neededToUpdateRender=!0}get rim(){return this.rendererSettings.rim}set rim(t){this.rendererSettings.rim=ci(t),this.neededToUpdateRender=!0}get mapUV(){return this.rendererSettings.mapUV}set mapUV(t){this.rendererSettings.mapUV=wi(t),this.neededToUpdateRender=!0}get gradientMap(){return this.rendererSettings.gradientMap}set gradientMap(t){this.rendererSettings.gradientMap=mi(t),this.neededToUpdateRender=!0}get erosion(){return this.rendererSettings.erosion}set erosion(t){this.rendererSettings.erosion=gi(t),this.neededToUpdateRender=!0}get uvDistortion(){return this.rendererSettings.uvDistortion}set uvDistortion(t){this.rendererSettings.uvDistortion=Si(t),this.neededToUpdateRender=!0}measureMotionScale(t){if("hierarchy"!==this.scalingMode||!this.worldSpace)return this.hierarchyScale.set(1,1,1),1;const e=t.elements,s=Math.sqrt(e[0]*e[0]+e[1]*e[1]+e[2]*e[2]),i=Math.sqrt(e[4]*e[4]+e[5]*e[5]+e[6]*e[6]),n=Math.sqrt(e[8]*e[8]+e[9]*e[9]+e[10]*e[10]);return this.hierarchyScale.set(s,i,n),(s+i+n)/3}get softNearFade(){return this.rendererSettings.softNearFade}set softNearFade(t){this.rendererSettings.softNearFade=ii(t,0),this.neededToUpdateRender=!0}get softFarFade(){return this.rendererSettings.softFarFade}set softFarFade(t){this.rendererSettings.softFarFade=ii(t,1),this.neededToUpdateRender=!0}get instancingGeometry(){return this.rendererSettings.instancingGeometry}set instancingGeometry(t){this.restartKeepingPause();const e=this.rendererSettings,s=t.length/3*2,i=e.instancingGeometry;var n,r;e.instancingGeometry=t,t.length===i.length&&function(t,e){for(let s=0;s<t.length;s++)if(t[s]>=e)return!1;return!0}(e.instancingIndices,t.length/3)||(e.instancingIndices=cr(t)),e.instancingUVs?.length===s&&(n=e.instancingUVs,r=i,void 0===n||n!==zr.get(r))||(e.instancingUVs=Vr(t)),e.instancingNormals&&(e.instancingNormals.length!==t.length||function(t,e){return void 0!==t&&t===_r.get(e)}(e.instancingNormals,i))&&(e.instancingNormals=Ar(t)),e.instancingUVs2&&e.instancingUVs2.length!==s&&(e.instancingUVs2=void 0),this.ensureMeshNormals(),this.neededToUpdateRender=!0}ensureMeshNormals(){const t=this.rendererSettings;t.renderMode!==exports.RenderMode.Mesh||t.instancingNormals||(t.instancingNormals=Ar(t.instancingGeometry))}restartKeepingPause(){const t=this.paused;this.restart(),this.particles.length=0,this.paused=t}get instancingIndices(){return this.rendererSettings.instancingIndices}set instancingIndices(t){this.rendererSettings.instancingIndices=t,this.neededToUpdateRender=!0}get instancingUVs(){return this.rendererSettings.instancingUVs??Vr(this.rendererSettings.instancingGeometry)}set instancingUVs(t){this.rendererSettings.instancingUVs=t,this.neededToUpdateRender=!0}get instancingUVs2(){return this.rendererSettings.instancingUVs2}set instancingUVs2(t){this.rendererSettings.instancingUVs2=t,this.neededToUpdateRender=!0}get blending(){return this.rendererSettings.materialBlendMode}set blending(t){this.rendererSettings.materialBlendMode=t,this.neededToUpdateRender=!0}get transparent(){return this.rendererSettings.materialTransparent}set transparent(t){this.rendererSettings.materialTransparent=t,this.neededToUpdateRender=!0}get depthTest(){return this.rendererSettings.materialDepthTest}set depthTest(t){this.rendererSettings.materialDepthTest=t,this.neededToUpdateRender=!0}get depthWrite(){return this.rendererSettings.materialDepthWrite}set depthWrite(t){this.rendererSettings.materialDepthWrite=t,this.neededToUpdateRender=!0}get alphaTest(){return this.rendererSettings.materialAlphaTest}set alphaTest(t){this.rendererSettings.materialAlphaTest=ei(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 Rt(0)),t){case exports.RenderMode.Trail:this.rendererEmitterSettings={startLength:new Rt(30),followLocalOrigin:!1},e=!0;break;case exports.RenderMode.Mesh:this.rendererEmitterSettings={},this.startRotation=new Wt(new et(0,1,0),new Rt(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.restartKeepingPause(),this.ensureMeshNormals(),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 playbackSpeed(){return this.playbackSpeedValue}set playbackSpeed(t){this.playbackSpeedValue=t>0&&t<1/0?t:0}get emissionMultiplier(){return this.emissionMultiplierValue}set emissionMultiplier(t){this.emissionMultiplierValue=Number.isFinite(t)&&t>=0?t:0}get seed(){return this.seedValue}set seed(t){this.seedValue=t,this.rng=void 0===t?void 0:V(t),void 0!==this.emissionState&&0===this.emissionState.time&&0===this.particleNum&&(this.emission.memory.length=0,this.initSystemGenerators())}constructor(t){var e,s;if(this.prewarmTimeValue=0,this.durationValue=1,this.store=new ve(64),this.emitterVelocity=new et,this.finishedEventFired=!1,this.clock=new Or,this.tempEmitterPos=new et,this.stepMatrix=new ot,this.spawner=new Nr(this),this.emission=new xr(this,this.spawner),this.events=new Sr,this.materialRef=null,this.qualityFactor=1,this.destroyed=!1,this.behaviorPlan=new pr,this.hierarchyScale=new et(1,1,1),this.playbackSpeedValue=1,this.emissionMultiplierValue=1,this.cullingMode="always",this.scalingMode="shape",this.motionScale=1,this.alignToDirection=!1,this.culled=!1,this.bounds=new yr,this.firstTimeUpdate=!0,this.beamEndScratch=new et,this.rebindParticles=()=>this.spawner.rebind(),this.fireParticleDied=t=>{this.events.fire({type:"particleDied",particleSystem:this,particle:t})},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 Rt(0),this.looping=t.looping??!0,this.prewarm=t.prewarm??!1,this.prewarmTime=t.prewarmTime??0,this.startLife=t.startLife??new Rt(5),this.startSpeed=t.startSpeed??new Rt(0),this.startRotation=t.startRotation??new Rt(0),this.startSize=t.startSize??new Rt(1),this.startColor=t.startColor??new Kt(new Vt(1,1,1,1)),this.emissionOverTime=t.emissionOverTime??new Rt(10),this.emissionOverDistance=t.emissionOverDistance??new Rt(0),this.emissionBursts=ri(t.emissionBursts),this.maxParticles="number"==typeof(e=t.maxParticles)&&e>=0&&e<1/0?Math.floor(e):void 0,this.onlyUsedByOther=t.onlyUsedByOther??!1,this.emitterShape=t.shape??new Ls,this.behaviors=t.behaviors??[],this.worldSpace=t.worldSpace??!1,this.rendererEmitterSettings=t.rendererEmitterSettings??{},t.renderMode===exports.RenderMode.Trail){const t={...this.rendererEmitterSettings};this.rendererEmitterSettings=t,t.startLength=t.startLength??new Rt(30),t.followLocalOrigin=t.followLocalOrigin??!1}if(t.renderMode===exports.RenderMode.StretchedBillBoard){const e={...this.rendererEmitterSettings};this.rendererEmitterSettings=e,void 0!==t.speedFactor&&(e.speedFactor=t.speedFactor),e.speedFactor=e.speedFactor??0,e.lengthFactor=e.lengthFactor??0}this.rendererSettings={instancingGeometry:t.instancingGeometry??wr,instancingIndices:t.instancingIndices??Mr,instancingUVs:t.instancingUVs??(t.instancingGeometry?Vr(t.instancingGeometry):br),instancingUVs2:t.instancingUVs2,instancingNormals:t.instancingNormals,renderMode:t.renderMode??exports.RenderMode.BillBoard,renderOrder:t.renderOrder??0,uTileCount:si(t.uTileCount),vTileCount:si(t.vTileCount),blendTiles:t.blendTiles??!1,softParticles:t.softParticles??!1,softNearFade:ii(t.softNearFade,0),softFarFade:ii(t.softFarFade,1),materialBlendMode:t.blendMode??r.Constants.ALPHA_ADD,materialTransparent:t.transparent??!0,materialDepthTest:t.depthTest??!0,materialDepthWrite:t.depthWrite??!1,materialAlphaTest:ei(t.alphaTest),texture:t.texture??null,reflectionTexture:null,reflectionLevel:1,reflectionAtlas:null,layerMask:t.layerMask??268435455,pivot:ti(t.pivot),sortMode:Zs(t.sortMode),minParticleSize:Math.max(0,t.minParticleSize??0),maxParticleSize:t.maxParticleSize??1/0,renderingGroupId:t.renderingGroupId??0,applyFog:t.applyFog??!0,lighting:Xs(t.lighting),rim:ci(t.rim),mapUV:wi(t.mapUV),gradientMap:mi(t.gradientMap),erosion:gi(t.erosion),uvDistortion:Si(t.uvDistortion)},this.flip=(s=t.flip)&&(s.x>0||s.y>0)?s.clone():void 0,this.playbackSpeed=t.playbackSpeed??1,this.cullingMode=Ks(t.cullingMode),this.scalingMode="hierarchy"===t.scalingMode?"hierarchy":"shape",this.alignToDirection=!0===t.alignToDirection,this.seed=t.seed,this.ensureMeshNormals(),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 Rt(0),this.emitter=new Hn(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.initSystemGenerators(),this.emitEnded=!1,this.prewarmed=!1}watchEnvAtlas(t,e){t?.onDisposeObservable.addOnce(()=>{if(this.destroyed||this.rendererSettings.reflectionAtlas!==t)return;this.rendererSettings.reflectionAtlas=null,e?.reflectionAtlas===t&&(e.reflectionAtlas=null),this.neededToUpdateRender=!0;const s=this.rendererSettings.reflectionTexture;s?.isCube&&s.getScene()&&this.sceneRef&&lr(s,this.sceneRef,t=>{this.destroyed||this.rendererSettings.reflectionTexture!==s||(this.rendererSettings.reflectionAtlas=t,e&&null==e.reflectionAtlas&&(e.reflectionAtlas=t),this.watchEnvAtlas(t,e),this.neededToUpdateRender=!0)})})}applyMaterialSettings(t,e={}){if(!this.rendererSettings)return;const s=function(t,e,s){const i=void 0!==e.texture?e.texture:t?.albedoTexture??t?.diffuseTexture??t?.emissiveTexture??t?.opacityTexture??t?.baseTexture??s.texture??null,n=t?.reflectionTexture??t?.environmentTexture??s.reflectionTexture??null,r="number"==typeof n?.level?n.level:1,o=e.blendMode??("number"==typeof t?.alphaMode?t.alphaMode:s.materialBlendMode),a=e.transparent??("function"==typeof t?.needAlphaBlending?t.needAlphaBlending():"number"==typeof t?.alpha?t.alpha<1:s.materialTransparent),h=e.depthTest??("boolean"==typeof t?.disableDepthTest?!t.disableDepthTest:s.materialDepthTest),l=e.depthWrite??("boolean"==typeof t?.disableDepthWrite?!t.disableDepthWrite:"boolean"==typeof t?.forceDepthWrite?t.forceDepthWrite:s.materialDepthWrite),c=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:s.materialAlphaTest})();return{texture:i,reflectionTexture:n,reflectionLevel:"number"==typeof t?.reflectionLevel?t.reflectionLevel:r,reflectionAtlas:Cr(t?.reflectionAtlas)??Cr(e.reflectionAtlas)??Cr(s.reflectionAtlas),blendMode:o,transparent:a,depthTest:h,depthWrite:l,alphaTest:c}}(t,e,this.rendererSettings);this.rendererSettings.texture=s.texture,this.rendererSettings.reflectionTexture=s.reflectionTexture,this.rendererSettings.reflectionLevel=s.reflectionLevel;let i=s.reflectionAtlas;const n=s.reflectionTexture;!i&&n?.isCube&&(i=nr(n,this.sceneRef),!i&&this.sceneRef&&(lr(n,this.sceneRef,e=>{this.rendererSettings.reflectionAtlas!==e&&(this.rendererSettings.reflectionAtlas=e,t&&!Cr(t.reflectionAtlas)&&(t.reflectionAtlas=e),this.watchEnvAtlas(e,t),this.neededToUpdateRender=!0)}),i=nr(n,this.sceneRef))),this.rendererSettings.reflectionAtlas=i,this.watchEnvAtlas(i,t),this.rendererSettings.materialBlendMode=s.blendMode,this.rendererSettings.materialTransparent=s.transparent,this.rendererSettings.materialDepthTest=s.depthTest,this.rendererSettings.materialDepthWrite=s.depthWrite,this.rendererSettings.materialAlphaTest=ei(s.alphaTest),void 0!==e.layerMask&&(this.rendererSettings.layerMask=e.layerMask),this.neededToUpdateRender=!0}pause(){this.paused=!0}play(){this.paused=!1,this.previousEmitterMatrix=void 0}stop(){this.restart(),this.pause()}clear(){this.particleNum=0,this.bounds.valid=!1;for(const t of this.behaviors)t instanceof Ee&&t.clearEmissions()}clearTrails(){if(this.rendererSettings.renderMode===exports.RenderMode.Trail)for(let t=0;t<this.particleNum;t++)this.particles[t].resetHistory()}setQualityFactor(t){this.qualityFactor=Math.max(.1,Math.min(1,t))}emissionFactor(){return this.qualityFactor*this.emissionMultiplierValue}endEmit(){this.emitEnded=!0,this.events.fire({type:"emitEnd",particleSystem:this})}get isDisposed(){return this.destroyed}dispose(){this.destroyed||(this.destroyed=!0,this.particleNum=0,this._renderer&&this._renderer.deleteSystem(this),function(t){jn++;try{t.dispose()}finally{jn--}}(this.emitter),this.events.fire({type:"destroy",particleSystem:this}))}initSystemGenerators(){const t=this.rng,e=void 0===t?void 0:_(t);try{this.clock.setStartDelay(this.emission.rollGenerators())}finally{void 0!==t&&_(e??null)}}restart(){this.destroyed||(this.emission.memory.length=0,this.paused=!1,this.particleNum=0,this.bounds.valid=!1,this.clock.reset(),void 0!==this.seedValue&&(this.rng=V(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.emissionState.travelDistance=0,this.emissionState.previousWorldPos=void 0,this.emissionState.burstParticleIndex=0,this.emissionState.burstParticleCount=0,this.emissionBursts.forEach(t=>Object.assign(t,ni(t))),this.emissionBursts.sort((t,e)=>t.time-e.time),this.behaviors.forEach(t=>{t.reset(),t instanceof Ee&&t.clearEmissions()}),this.emitterShape.reset?.(),this.emitEnded=!1,this.finishedEventFired=!1,this.prewarmed=!1,this.initSystemGenerators(),this.previousEmitterPos=void 0,this.previousEmitterMatrix=void 0,this.emitterVelocity.set(0,0,0))}update(t,e=1/0,s){if(this.paused||this.destroyed)return;const i=this.playbackSpeed;if(t=Or.frameSeconds(t,i),this.culled)return"pauseAndCatchUp"===this.cullingMode&&this.clock.deferCatchUp(t),void(this.previousEmitterMatrix=void 0);if(this.clock.owesCatchUp){if(this.catchUp(s??performance.now()+So.catchUpBudgetMs),this.paused||this.destroyed)return;(this.previousEmitterMatrix??(this.previousEmitterMatrix=new ot)).copy(this.emitter.matrixWorld)}if(this.firstTimeUpdate&&(this.firstTimeUpdate=!1,this.emitter.computeWorldMatrix(!0)),!this.looping&&this.finishedEventFired&&0===this.particleNum)return void this.clock.accrue(t,i);if(this.looping&&this.prewarm&&!this.prewarmed&&(this.runPrewarm(),this.paused||this.destroyed))return;this.neededToUpdateRender&&(this._renderer&&this._renderer.updateSystem(this),this.neededToUpdateRender=!1);const n=this.emitter.matrixWorld.elements;if(this.tempEmitterPos.set(n[12],n[13],n[14]),void 0!==this.previousEmitterPos&&t>0&&this.emitterVelocity.copy(this.tempEmitterPos).sub(this.previousEmitterPos).divideScalar(t),(this.previousEmitterPos??(this.previousEmitterPos=new et)).copy(this.tempEmitterPos),this.clock.delaying&&(!this.prewarm||!this.looping)&&0===(t=this.clock.consumeStartDelay(t)))return;const r=this.clock.accrue(t,i);if(0===r)return;const o=this.emitter.matrixWorld,a=this.previousEmitterMatrix,h=r>1&&void 0!==a&&!a.equals(o);h&&(a.decompose(co,uo,fo),o.decompose(po,mo,yo));let l=o;for(let t=0;t<r;t++){if(h&&t+1<r){const e=(t+1)/r;go.copy(co).lerp(po,e),vo.copy(uo).slerp(mo,e),xo.copy(fo).lerp(yo,e),l=this.stepMatrix.compose(go,vo,xo)}else l=o;if(this.simulateStep(Tr,l),this.paused||this.destroyed)break;if(e!==1/0&&t+1<r&&performance.now()>=e)break}this.destroyed||(this.previousEmitterMatrix??(this.previousEmitterMatrix=new ot)).copy(l)}catchUp(t){let e=this.clock.takeCatchUpSteps();for(;e-- >0&&(this.simulateStep(Tr),!this.paused&&!this.destroyed)&&!(e>0&&performance.now()>=t););}markBurstsBefore(t){const e=this.emissionState,s=this.emissionBursts,i=e.burstWaves??(e.burstWaves=[]);for(;e.burstIndex<s.length&&s[e.burstIndex].time<t;){const n=s[e.burstIndex],r=gr(n),o=vr(n);let a=0;if(o>0)for(;a<r&&n.time+a*o<t;)a++;else a=r;i[e.burstIndex]=a,e.burstIndex++}}runPrewarm(){this.prewarmed=!0;const t=this.prewarmTime>0?this.prewarmTime:this.duration,e=Math.min(this.duration,t,Math.max(0,So.maxPrewarmSeconds)),s=Math.round(e/Tr);if(e<this.duration){const t=this.emissionState;t.time=this.duration-s*Tr,this.markBurstsBefore(t.time)}for(let t=0;t<s;t++)if(this.simulateStep(Tr),this.paused||this.destroyed)return}getWorldBounds(t,e){if(!this.bounds.toWorld(t,e,this.emitter))return!1;if(this.rendererSettings.renderMode===exports.RenderMode.Beam){const s=this.beamEndScratch;if(!this.getBeamEnd(s))return!0;const i=this.bounds.worldPadding(this.emitter);t.set(Math.min(t.x,s.x-i),Math.min(t.y,s.y-i),Math.min(t.z,s.z-i)),e.set(Math.max(e.x,s.x+i),Math.max(e.y,s.y+i),Math.max(e.z,s.z+i))}return!0}getBeamEnd(t){const e=this.beamEnd;if(void 0===e)return!1;const s=e;if("function"==typeof s.getAbsolutePosition){const e=s.getAbsolutePosition();t.set(e.x,e.y,e.z)}else{const s=e;t.set(s.x,s.y,s.z)}return!0}setWorldBounds(t,e,s,i,n,r,o){this.bounds.setWorld(t,e,s,i,n,r,o)}get simulationStep(){return Tr}get simulationResidual(){return this.paused?0:this.clock.residual}simulateStep(t,e=this.emitter.matrixWorld){const s=this.rng;if(void 0===s)return void this.stepOnce(t,e);const i=_(s);try{this.stepOnce(t,e)}finally{_(i)}}stepOnce(t,e){if(this.destroyed)return;this.motionScale=this.measureMotionScale(e),this.onlyUsedByOther||this.emission.emit(t,this.emissionState,e);const s=this.particles,i=this.behaviors,n=this.particleNum,r=this.store,o=this.rendererSettings.renderMode,a=o===exports.RenderMode.Trail,h=this.behaviorPlan.steps(i),l=this.behaviorPlan.changesSize,c=this.behaviorPlan.changesColor;!function(t,e,s,i,n,r){const o=3*e;t.useSizeSnapshot(s),t.useColorSnapshot(i),t.previousPosition.set(t.position.subarray(0,o)),s&&t.previousSize.set(t.size.subarray(0,o)),n&&(t.keepPreviousVelocity()&&r(),t.previousVelocity.set(t.velocity.subarray(0,o))),i&&t.previousColor.set(t.color.subarray(0,4*e))}(r,n,l,c,o===exports.RenderMode.StretchedBillBoard,this.rebindParticles),this.emitterShape.update(this,t),function(t,e,s,i,n,r){for(let o=0;o<t.length;o++){const a=t[o],h=a.behaviors;for(let t=0;t<h.length;t++)h[t].frameUpdate(n);if(0===i)continue;if(void 0!==a.run){a.run(e,s,i,n,r);continue}const l=h[0];if(void 0===l.updateAll)for(let t=0;t<i;t++){const e=s[t];e.age<e.life&&l.update(e,n)}else l.updateAll(s,i,n)}}(h,i,s,n,t,r);const u=this.events.has("particleDied")?this.fireParticleDied:void 0;let d=this.particleNum;if(a){const i=this.rendererEmitterSettings;!function(t,e,s,i){const n=t.scalars,r=ve.SCALAR_STRIDE,o=t.previousSize,a=t.size,h=t.previousColor,l=t.color;for(let t=0,c=0,u=0,d=0;t<e;t++,c+=3,u+=4,d+=r)0===n[d+ve.AGE]&&(s&&(o[c]=a[c],o[c+1]=a[c+1],o[c+2]=a[c+2]),i&&(h[u]=l[u],h[u+1]=l[u+1],h[u+2]=l[u+2],h[u+3]=l[u+3]))}(r,n,l,c),function(t,e,s,i,n,r){if(n){for(let s=0;s<i;s++){const i=e[s];i.localPosition?(i.position.copy(i.localPosition),i.position.applyMatrix4(i.parentMatrix??r)):i.position.addScaledVector(i.velocity,t*i.speedModifier),i.age+=t}return}const o=s.scalars,a=ve.SCALAR_STRIDE,h=s.position,l=s.velocity;for(let e=0,s=0,n=0;e<i;e++,s+=3,n+=a){const e=t*o[n+ve.SPEED_MODIFIER];h[s]+=l[s]*e,h[s+1]+=l[s+1]*e,h[s+2]+=l[s+2]*e,o[n+ve.AGE]+=t}}(t,s,r,n,Boolean(i.followLocalOrigin),e),function(t,e,s,i,n){const r=s.dieWithParticle,o=s.recordWorldSpace&&!i,a=s.sideAxis,h=i||Boolean(s.recordWorldSpace),l=Un(s),c=Nn(s);for(let s=0;s<e;s++){const e=t[s],i=e.age<e.life;if(r&&!i){e.resetHistory();continue}let u=!1;if(l>0&&i&&e.historyCount>1){const t=e.historyDistances,s=e.historyCount;u=t[e.getHistoryIndex(s-1)]-t[e.getHistoryIndex(s-2)]<l}if(e.update(u,!o),o&&i){const t=(e.historyHead+e.historyCapacity-1)%e.historyCapacity*3,s=e.historyPositions;$r.set(s[t],s[t+1],s[t+2]),$r.applyMatrix4(e.parentMatrix??n),s[t]=$r.x,s[t+1]=$r.y,s[t+2]=$r.z,e.measureHeadDistance()}if(c!==1/0){const t=e.historyAges,s=e.age;for(;e.historyCount>0&&s-t[e.getHistoryIndex(0)]>c;)e.dropOldest()}if(a&&i){e.ensureSideHistory();const t=(e.historyHead+e.historyCapacity-1)%e.historyCapacity*3,s=e.historySides;let i=a.x,r=a.y,o=a.z;if(h){const t=(e.parentMatrix??n).elements,s=t[0]*i+t[4]*r+t[8]*o,a=t[1]*i+t[5]*r+t[9]*o;o=t[2]*i+t[6]*r+t[10]*o,i=s,r=a}s[t]=i,s[t+1]=r,s[t+2]=o}}}(s,n,i,this.worldSpace,e),d=function(t,e,s,i){const n=e.scalars,r=ve.SCALAR_STRIDE;for(let o=0;o<s;o++){const a=t[o],h=o*r;n[h+ve.AGE]>=n[h+ve.LIFE]&&0===a.historyCount&&(Pr(t,e,o,s-1),s--,o--,void 0!==i&&i(a))}return s}(s,r,d,u)}else d=function(t,e,s,i,n,r,o,a,h){const l=s.scalars,c=ve.SCALAR_STRIDE,u=s.position,d=s.velocity,f=s.previousSize,p=s.size,m=s.previousColor,y=s.color,g=o.due,v=o.min,x=o.max;let S=g?1/0:v.x,w=g?1/0:v.y,b=g?1/0:v.z,M=g?-1/0:x.x,z=g?-1/0:x.y,_=g?-1/0:x.z,V=g?0:o.maxSize,A=g?0:o.maxSpeedSq;for(let o=0;o<i;o++){const a=o*c;let v=l[a+ve.AGE];const x=3*o,T=g||0===v;if(0===v&&(n&&(f[x]=p[x],f[x+1]=p[x+1],f[x+2]=p[x+2]),r)){const t=4*o;m[t]=y[t],m[t+1]=y[t+1],m[t+2]=y[t+2],m[t+3]=y[t+3]}const O=t*l[a+ve.SPEED_MODIFIER],$=d[x],P=d[x+1],C=d[x+2],E=u[x]+$*O,F=u[x+1]+P*O,B=u[x+2]+C*O;if(u[x]=E,u[x+1]=F,u[x+2]=B,T&&(S=Math.min(S,E),M=Math.max(M,E),w=Math.min(w,F),z=Math.max(z,F),b=Math.min(b,B),_=Math.max(_,B),V=Math.max(V,Math.max(p[x],Math.max(p[x+1],p[x+2])))),A=Math.max(A,$*$+P*P+C*C),v+=t,l[a+ve.AGE]=v,v>=l[a+ve.LIFE]){const t=Pr(e,s,o,i-1);i--,o--,void 0!==h&&h(t)}}return o.store(i,g,S,w,b,M,z,_,V,A,a.rendererSettings,a.rendererEmitterSettings,a.worldSpace,Tr),i}(t,s,r,d,l,c,this.bounds,this,u);this.particleNum=this.destroyed?0:d,this.notifyFinished()}notifyFinished(){this.isFinished()&&(this.finishedEventFired||(this.finishedEventFired=!0,this.events.fire({type:"finished",particleSystem:this})),this.autoDestroy&&this.dispose())}emit(t,e,s){this.emission.emit(t,e,s)}toJSON(t,e={}){return ho(this,t)}static fromJSON(t,e,s={},i){const n=new So(lo(t,e,i));return n.behaviors=(t.behaviors??[]).map(t=>{const e=ms(t,n);return e&&"EmitSubParticleSystem"===e.type&&(s[t.subParticleSystem]=e),e}).filter(t=>null!==t),n}addBehavior(t){this.behaviors.push(t),this._renderer?._invalidateUpdateOrder()}getRendererSettings(){return this.rendererSettings}addEventListener(t,e){this.events.add(t,e)}removeAllEventListeners(t){this.events.removeAll(t)}removeEventListener(t,e){this.events.remove(t,e)}clone(){const t=this.behaviors.map(t=>t.clone());let e;if(this.renderMode===exports.RenderMode.Trail){const t=this.rendererEmitterSettings;e={startLength:t.startLength.clone(),followLocalOrigin:Boolean(t.followLocalOrigin),...so(t),...io(t),...no(t),...t.sideAxis?{sideAxis:t.sideAxis.clone()}:{}}}else e=this.renderMode===exports.RenderMode.StretchedBillBoard?{lengthFactor:this.rendererEmitterSettings.lengthFactor,speedFactor:this.rendererEmitterSettings.speedFactor}:{};const s=new So({...Xr(this),shape:this.emitterShape.clone(),instancingGeometry:this.rendererSettings.instancingGeometry,instancingIndices:this.rendererSettings.instancingIndices,instancingUVs:this.rendererSettings.instancingUVs,instancingUVs2:this.rendererSettings.instancingUVs2,instancingNormals:this.rendererSettings.instancingNormals,rendererEmitterSettings:e,material:this.materialRef,texture:this.rendererSettings.texture,behaviors:t,lighting:this.lighting,rim:this.rim,mapUV:this.mapUV,gradientMap:this.gradientMap,erosion:this.erosion,uvDistortion:this.uvDistortion,scene:this.emitter.getScene()});for(const e of t)e instanceof Ee&&(e.particleSystem=s);this.tint&&(s.tint=this.tint.clone()),s.emissionMultiplier=this.emissionMultiplier;const i=this.beamEnd;return i&&(s.beamEnd="function"==typeof i.getAbsolutePosition?i:{x:i.x,y:i.y,z:i.z}),s}}So.catchUpBudgetMs=2,So.maxPrewarmSeconds=10;class wo extends n.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,s=0,i=!1){const n={startTime:e,duration:s>0?s:t.system.duration,type:"ps",loop:i,target:t};return this.animationData.push(n),this.pause(),this.updateDuration(),n}addThreeAnimation(t,e,s=0,i=e?.duration??0,n=!1,r){const o={startTime:s,duration:i>0?i:e?.duration??0,type:"three",loop:n,target:t,clip:e,clipUUID:r??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(),this.animationData.forEach(t=>{this.currentTime>=t.startTime&&this.currentTime<=t.startTime+t.duration&&("ps"===t.type&&t.target instanceof Hn?t.target.system.play():t.clip?.play?.())}))}pause(){this.isPlaying&&(this.isPlaying=!1,this.animationData.forEach(t=>{"ps"===t.type&&t.target instanceof Hn?t.target.system.pause():t.clip?.pause?.()}))}stop(){this.pause(),this.currentTime=-1e-5,this.animationData.forEach(t=>{"ps"===t.type&&t.target instanceof Hn?t.target.system.stop():t.clip?.stop?.()})}update(t){if(!this.isPlaying)return;const e=Date.now(),s=t??Math.max((e-this._lastUpdateTimeMs)/1e3,0);this._lastUpdateTimeMs=e;const i=this.currentTime;this.currentTime+=s*this.timeScale,this.currentTime>this.duration?this.stop():this.animationData.forEach(t=>{const e=t.startTime,s=t.startTime+t.duration,n=this.currentTime>=e&&this.currentTime<=s,r=i>=e&&i<=s;if(!n||r){if(!n&&r){if(t.loop&&"ps"===t.type&&t.target instanceof Hn)return void t.target.system.restart();"ps"===t.type&&t.target instanceof Hn?t.target.system.endEmit():t.loop?t.clip?.play?.():t.clip?.stop?.()}}else"ps"===t.type&&t.target instanceof Hn?(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(s=>{const i=s.startTime,n=s.startTime+s.duration,r=this.currentTime>=i&&this.currentTime<n,o=e>=i&&e<n;!r||o?r||!o?r&&"three"===s.type&&s.clip?.setTime?.(Math.max(t-i,0)):"ps"===s.type&&s.target instanceof Hn?s.target.system.endEmit():s.clip?.stop?.():"ps"===s.type&&s.target instanceof Hn?s.target.system.restart():s.clip?.play?.()})}getDuration(){return this.duration}resolveReferences(t){const e={},s=t=>{var i;const r=t._quarksUUID;r?e[r]=t:e[i=t.uniqueId.toString()]??(e[i]=t);const o=t.getChildren();for(const t of o)t instanceof n.TransformNode&&s(t)};s(t),this._tempAnimationJSON.forEach(t=>{const s=e[t.targetUUID];if("ps"===t.type&&s instanceof Hn)this.addParticleSystemAnimation(s,t.startTime,t.duration,t.loop);else if("three"===t.type&&s){const e=this.resolveTimelineClip(s,t.clipUUID);this.addThreeAnimation(s,e,t.startTime,t.duration,t.loop,t.clipUUID)}}),this.updateDuration(),this._tempAnimationJSON=[]}toJSON(){return{type:this.type,name:this.name,...1!==this.timeScale?{timeScale:this.timeScale}:{},animationData:this.animationData.map(t=>({startTime:t.startTime,duration:t.duration,type:t.type,targetUUID:js(t.target),clipUUID:"three"===t.type?t.clipUUID??t.clip?.uuid:void 0,loop:t.loop}))}}static fromJSON(t,e){const s=new wo(t.name||"QuarksPrefab",e);return"number"==typeof t.timeScale&&(s.timeScale=t.timeScale),Array.isArray(t.animationData)&&(s._tempAnimationJSON=t.animationData.filter(t=>"ps"===t?.type||"three"===t?.type)),s}resolveTimelineClip(t,e){const s=[t.animations,t.animationGroups,t.metadata?.animations,t.metadata?.animationGroups];for(const t of s){if(!Array.isArray(t))continue;if(!e)return t[0];const s=t.find(t=>t?.uuid===e);if(s)return s}}updateDuration(){let t=0;this.animationData.forEach(e=>{const s=e.startTime+e.duration;s>t&&(t=s)}),this.duration=t}}const bo=new WeakMap;function Mo(t,e,s){bo.set(t,{source:e,loaded:s})}function zo(t){const e=bo.get(t);return void 0!==e&&t.url===e.loaded?e.source:void 0}const _o={[x.Texture.WRAP_ADDRESSMODE]:1e3,[x.Texture.CLAMP_ADDRESSMODE]:1001,[x.Texture.MIRROR_ADDRESSMODE]:1002};function Vo(t){return!!t&&(!/^blob:/i.test(t)&&(!/^data:/i.test(t)||t.includes(",")))}function Ao(t){const e=t.rotationQuaternion??c.Quaternion.FromEulerVector(t.rotation);return Array.from(c.Matrix.Compose(t.scaling,e,t.position).asArray())}class To{constructor(t){this.options=t,this.meta={geometries:{},materials:{},textures:{}},this.meshGeometries=new Map,this.geometryIds=new Map,this.meshMaterials=[],this.meshMaterialIds=new Map,this.extraTextures=new Map,this.nextId=0}warnDanglingLinks(t){const e=new Set,s=[],i=t=>{e.add(t.uuid),s.push(t),t.children?.forEach(i)};i(t);for(const t of s)for(const[s,i]of Oo(t))""===i||e.has(i)||this.warn(`"${t.name}" has ${s} on node "${i}", which is not in what is written; it loads without that link.`)}warn(t){(this.options.onWarning??(t=>console.warn(`[quarks] ${t}`)))(t)}node(t){const e=t.getChildren(t=>t instanceof n.TransformNode,!0).filter(t=>!1!==this.options.filter?.(t)).map(t=>this.node(t)),s={uuid:js(t),type:"Group",name:t.name,matrix:Ao(t)};if(t.isEnabled(!1)||(s.visible=!1),t instanceof u.Mesh&&!t.isVisible&&(s.isVisible=!1),t instanceof Hn)s.type="ParticleEmitter",s.ps=t.system.toJSON(this.meta);else if(t instanceof wo){const{type:e,name:i,...n}=t.toJSON();Object.assign(s,n),s.type="QuarksPrefab"}else t instanceof u.Mesh?(s.type="Mesh",s.geometry=this.meshGeometry(t),s.material=this.meshMaterial(t)):t instanceof w.InstancedMesh&&this.warn(`"${t.name}" is an instance of "${t.sourceMesh.name}"; it is written as a group.`);return e.length>0&&(s.children=e),s}id(t){return this.nextId+=1,`${t}_${this.nextId}`}meshGeometry(e){const s=e.geometry?this.geometryIds.get(e.geometry):void 0;if(void 0!==s)return s;const i=e.getVerticesData(t.VertexBuffer.PositionKind);if(!i||0===i.length)return void this.warn(`Mesh "${e.name}" has no vertices; it is written without geometry.`);const n=e.getIndices(),r=cr(i instanceof Float32Array?i:new Float32Array(i),n&&n.length>0?Uint32Array.from(n):void 0),o=t=>{const s=e.getVerticesData(t);return s?Array.from(s):void 0},a={uuid:this.id("quarks_mesh_geometry"),type:"QuarksGeometry",positions:Array.from(i),indices:Array.from(r)},h=o(t.VertexBuffer.UVKind),l=o(t.VertexBuffer.UV2Kind),c=o(t.VertexBuffer.NormalKind);return h&&(a.uvs=h),l&&(a.uvs2=l),c&&(a.normals=c),this.meshGeometries.set(a.uuid,a),e.geometry&&this.geometryIds.set(e.geometry,a.uuid),a.uuid}meshMaterial(t){const e=t.material;if(!e)return;if(!(e instanceof S.StandardMaterial))return void this.warn(`Mesh "${t.name}" has a ${e.getClassName()}; only a StandardMaterial's blend, culling and diffuse texture are written, so it loads without a material.`);let s=this.meshMaterialIds.get(e);if(void 0!==s)return s;s=this.id("quarks_mesh_material"),this.meshMaterialIds.set(e,s);const i=1===e.diffuseColor.r&&1===e.diffuseColor.g&&1===e.diffuseColor.b,n=0===e.emissiveColor.r&&0===e.emissiveColor.g&&0===e.emissiveColor.b;1===e.alpha&&i&&n||this.warn(`Mesh "${t.name}": its material's alpha and colours are not written; it loads opaque white.`);const o={uuid:s,type:"MeshBasicMaterial"};return e.alphaMode!==r.Constants.ALPHA_COMBINE&&(o.alphaMode=e.alphaMode),e.backFaceCulling&&(o.side=0),0!==e.alphaCutOff&&(o.alphaTest=e.alphaCutOff),e.disableDepthWrite||(o.depthWrite=!0),this.meshMaterials.push({json:o,map:e.diffuseTexture}),s}texture(t){for(const[e,s]of Object.entries(this.meta.textures))if(s===t)return e;let e=this.extraTextures.get(t);return void 0===e&&(e=this.id("quarks_mesh_texture"),this.extraTextures.set(t,e)),e}finish(t){const e=this.meshMaterials.map(({json:t,map:e})=>e?{...t,map:this.texture(e)}:t);this.warnDanglingLinks(t);const s=[],i=new Map,n=[],r=[...Object.entries(this.meta.textures),...[...this.extraTextures].map(([t,e])=>[e,t])];for(const[t,e]of r){if(null===e)continue;const r={uuid:t},o=e instanceof x.Texture?this.options.imageUrl?this.options.imageUrl(e):zo(e)??e.url:null;if(Vo(o)){let t=i.get(o);void 0===t&&(t=`quarks_image_${i.size+1}`,i.set(o,t),s.push({uuid:t,url:o})),r.image=t}else this.warn(`Texture "${e.name}" has no url a file can point at (made in code, a blob: url, or an image embedded in a glTF); it is written without its image and loads as no texture. Give it a file url or a data: URI before saving.`);e instanceof x.Texture&&Object.assign(r,$o(e)),n.push(r)}const o=Object.values(this.meta.materials).map(t=>{const{sourceMaterial:e,...s}=t;return s});return{metadata:{version:4.5,type:"Object3D",generator:this.options.generator??"babylon.quarks",quarksFormat:1},geometries:[...Object.values(this.meta.geometries),...this.meshGeometries.values()],materials:[...o,...e],textures:n,images:s,object:t}}}function*Oo(t){const e=t.ps;for(const t of e?.behaviors??[])"EmitSubParticleSystem"===t.type&&"string"==typeof t.subParticleSystem&&(yield["a sub emitter",t.subParticleSystem]);"mesh_surface"===e?.shape?.type&&"string"==typeof e.shape.mesh&&(yield["a mesh surface shape",e.shape.mesh]);for(const e of t.animationData??[])"string"==typeof e.targetUUID&&(yield["a prefab animation",e.targetUUID])}function $o(t){const e={};return t.invertY||(e.invertY=!1),t.noMipmap&&(e.noMipmap=!0),t.samplingMode!==r.Constants.TEXTURE_TRILINEAR_SAMPLINGMODE&&(e.samplingMode=t.samplingMode),t.wrapU===x.Texture.WRAP_ADDRESSMODE&&t.wrapV===x.Texture.WRAP_ADDRESSMODE||(e.wrap=[_o[t.wrapU]??1e3,_o[t.wrapV]??1e3]),1===t.uScale&&1===t.vScale||(e.repeat=[t.uScale,t.vScale]),0===t.uOffset&&0===t.vOffset||(e.offset=[t.uOffset,t.vOffset]),0!==t.wAng&&(e.rotation=t.wAng),e}const Po=new WeakMap,Co=new WeakMap,Eo=new WeakMap;function Fo(t,e){let s=t.get(e);return void 0===s&&(s=new Map,t.set(e,s)),s}const Bo=new WeakMap,Io=new WeakMap;class Uo extends Error{constructor(t){super(t),this.name="QuarksFormatError"}}function No(t){if(null===t||"object"!=typeof t)return t;const e={...t};return Array.isArray(t.images)&&(e.images=t.images.map(t=>{if(!t||"object"!=typeof t)return t;const e={...t};if(Bo.get(t)===e.url&&"string"==typeof e.url){Bo.set(e,e.url);const s=Io.get(t);void 0!==s&&Io.set(e,s)}return e})),Array.isArray(t.geometries)&&(e.geometries=t.geometries.map(t=>t&&"object"==typeof t?{...t}:t)),e}const Ro=new WeakMap,Do=t=>t.reason??new Error("[QuarksLoader] The load was aborted."),ko=()=>new Error("[QuarksLoader] The scene was disposed while the effect loaded.");function Lo(t,e){if(e?.aborted)throw Do(e);if(t.isDisposed)throw ko()}function qo(t,e,s){return Lo(e,s),new Promise((i,n)=>{const r=()=>n(Do(s));s?.addEventListener("abort",r,{once:!0});const o=e.onDisposeObservable.addOnce(()=>n(ko()));t.then(i,n).finally(()=>{s?.removeEventListener("abort",r),e.onDisposeObservable.remove(o)})})}class Jo{constructor(t,e={}){this.scene=t,this.options=e}async load(t,e={}){const{json:s,baseUrl:i}=await qo(this.fetchEffectDocument(t,e.signal),this.scene,e.signal);return this.loadFromJSON(s,i,e)}async loadFromJSON(t,e,s={}){const i=s.signal;Lo(this.scene,i);const n=e??this.options.baseUrl??"";t=No(t),await qo(this.resolveResources(t,n),this.scene,i);const r=this.parseDocument(t,"");return await this.finishLoad(r,i),r.root}static disposeEffect(t){Qn(t)}async finishLoad(t,e){try{if(this.options.waitForTextures){for(const e of t.textures)e.delayLoadState===r.Constants.DELAYLOADSTATE_NOTLOADED&&e.delayLoad();await qo(Promise.all(t.textures.map(t=>Ro.get(t))),this.scene,e)}Lo(this.scene,e)}catch(e){throw this.scene.isDisposed||Qn(t.root),e}}async loadAll(t,e={}){Lo(this.scene,e.signal);const s=Jo.mapPool(t,e.concurrency,async(s,i)=>{Lo(this.scene,e.signal);try{return await this.fetchEffectDocument(s,e.signal)}catch(n){if(!e.continueOnError||e.signal?.aborted||this.scene.isDisposed)throw n;return console.warn(`[QuarksLoader] Failed to fetch effect "${s}" (${i+1}/${t.length}):`,n),null}}),i=await qo(s,this.scene,e.signal);return this.loadDocuments(i,e)}async loadFromJSONAll(t,e={}){const s=t.map(t=>{if(null!==t&&"object"==typeof t&&"json"in t){const e=t;return{json:No(e.json),baseUrl:e.baseUrl??this.options.baseUrl??""}}return{json:No(t),baseUrl:this.options.baseUrl??""}});return this.loadDocuments(s,e)}async resolveResources(t,e=""){await Jo.resolveLinkedResources(t,{baseUrl:e,resolver:this.options.resolver,scene:this.scene,onResourceError:this.options.onResourceError})}static async resolveLinkedResources(t,e={}){const s=e.baseUrl??"",i=e.resolver,n=e.scene;await Jo.inlineGeometryEntries(t,async t=>{const e=await Jo.resolveWith(i,t,"geometry",s);return Jo.fetchJsonWith(i,e,n)},e.onResourceError);const r=Array.isArray(t?.images)?t.images:[];await Promise.all(r.map(async t=>{if("string"!=typeof t?.url||!t.url)return;if(Bo.get(t)===t.url)return;const e=t.url;t.url=await Jo.resolveWith(i,t.url,"image",s),Bo.set(t,t.url),/^(data|blob):/i.test(t.url)||Io.set(t,e)}))}static async resolveExternalGeometries(t,e){await Jo.inlineGeometryEntries(t,e)}parse(t,e=""){return this.parseDocument(t,e).root}parseDocument(t,e){if(null===t||"object"!=typeof t||null===t.object||"object"!=typeof t.object)throw new Uo('[QuarksLoader] Not an effect document: it has no "object" to load.');const s=t.metadata?.quarksFormat;"number"==typeof s&&s>1&&console.warn(`[QuarksLoader] This effect was written in format ${s}, newer than the 1 this version of babylon.quarks reads; settings it does not know are left out.`);const i={ownedMaterials:[],images:{},imageSources:{},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 n=this.parseObject(t.object,i);this.linkReferences(n);const r=[...new Set(Object.values(i.textures).filter(t=>null!==t))];return Wn(n,r,i.ownedMaterials),{root:n,textures:r}}parseGeometries(t,e){for(const s of t)if("PlaneGeometry"===s.type){const t=(s.width||1)/2,i=(s.height||1)/2;e.geometries[s.uuid]={positions:new Float32Array([-t,-i,0,t,-i,0,t,i,0,-t,i,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"===s.type)e.geometries[s.uuid]=this.parseSphereGeometry(s);else if("BufferGeometry"===s.type&&s.data){const t=this.parseBufferGeometry(s.data);e.geometries[s.uuid]=t}else"QuarksGeometry"===s.type&&("string"!=typeof s.url||s.positions||console.warn(`[QuarksLoader] Geometry "${s.url}" is an external file; use load(), loadFromJSON(), or resolveResources() before parse().`),e.geometries[s.uuid]=this.share({positions:new Float32Array(s.positions??[]),indices:s.indices?new Uint32Array(s.indices):new Uint32Array(0),uvs:s.uvs?new Float32Array(s.uvs):void 0,uvs2:s.uvs2?new Float32Array(s.uvs2):void 0,normals:s.normals?new Float32Array(s.normals):void 0}))}share(t){if(!1===this.options.shareResources)return t;const e=Fo(Co,this.scene),s=function(t){let e=2166136261,s=2654435769;const i=[t.positions,t.indices,t.uvs,t.uvs2,t.normals];let n="";for(const t of i){if(void 0===t){n+="-,";continue}const i=new Uint8Array(t.buffer,t.byteOffset,t.byteLength);n+=i.length+",";for(let t=0;t<i.length;t++)e=Math.imul(e^i[t],16777619),s=Math.imul(s^i[t],1540483477)^s>>>15}return`${n}${(e>>>0).toString(16)}${(s>>>0).toString(16)}`}(t),i=e.get(s);return void 0!==i?i:(e.set(s,t),t)}static clearSharedResources(t){Po.delete(t),Co.delete(t),Eo.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,s=Math.max(3,Math.floor(t.widthSegments??16)),i=Math.max(2,Math.floor(t.heightSegments??8)),n=t.phiStart??0,r=t.phiLength??2*Math.PI,o=t.thetaStart??0,a=t.thetaLength??Math.PI,h=[],l=[],c=[],u=[],d=[];let f=0;for(let t=0;t<=i;t++){const u=[],p=t/i,m=o+p*a;for(let t=0;t<=s;t++){const i=t/s,o=n+i*r,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 g=Math.hypot(a,d,y)||1;l.push(a/g,d/g,y/g),c.push(i,1-p),u.push(f++)}d.push(u)}const p=o<=0,m=o+a>=Math.PI;for(let t=0;t<i;t++)for(let e=0;e<s;e++){const s=d[t][e+1],n=d[t][e],r=d[t+1][e],o=d[t+1][e+1];0===t&&p||u.push(s,n,o),t===i-1&&m||u.push(n,r,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,s,i,n=new Float32Array(0),r=new Uint32Array(0);const o=t.attributes?.uv1??t.attributes?.uv2;if(t.interleavedBuffers&&t.arrayBuffers){const r={};for(const[e,s]of Object.entries(t.interleavedBuffers)){const i=t.arrayBuffers[s.buffer];if(i){const t=new Float32Array(Array.isArray(i)?this.int32ArrayToFloat32(i):i);r[e]={data:t,stride:s.stride}}}if(t.attributes){if(t.attributes.position?.isInterleavedBufferAttribute){const e=t.attributes.position,s=r[e.data];s&&(n=this.extractInterleavedAttribute(s.data,s.stride,e.offset,e.itemSize))}if(t.attributes.uv?.isInterleavedBufferAttribute){const s=t.attributes.uv,i=r[s.data];i&&(e=this.extractInterleavedAttribute(i.data,i.stride,s.offset,s.itemSize))}if(o?.isInterleavedBufferAttribute){const t=r[o.data];t&&(s=this.extractInterleavedAttribute(t.data,t.stride,o.offset,o.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&&(n=new Float32Array(t.attributes.position.array)),t.attributes.uv?.array&&(e=new Float32Array(t.attributes.uv.array)),o?.array&&(s=new Float32Array(o.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=cr(n,r),{positions:n,indices:r,uvs:e,uvs2:s,normals:i}}extractInterleavedAttribute(t,e,s,i){const n=Math.floor(t.length/e),r=new Float32Array(n*i);for(let o=0;o<n;o++)for(let n=0;n<i;n++)r[o*i+n]=t[o*e+s+n];return r}int32ArrayToFloat32(t){const e=new ArrayBuffer(4*t.length),s=new Int32Array(e);for(let e=0;e<t.length;e++)s[e]=t[e];return new Float32Array(e)}async resolveResourceUrl(t,e,s){return Jo.resolveWith(this.options.resolver,t,e,s)}async fetchEffectDocument(t,e){const s=this.options.baseUrl||t.substring(0,t.lastIndexOf("/")+1),i=await this.resolveResourceUrl(t,"effect",s);return{json:await Jo.fetchJsonWith(this.options.resolver,i,void 0,e),baseUrl:s}}async loadDocuments(t,e){if(0===t.length)return[];Lo(this.scene,e.signal);const s=new AbortController,i=()=>s.abort(Do(e.signal));e.signal?.addEventListener("abort",i,{once:!0});try{return await this.loadResolvedDocuments(t,e,s)}finally{e.signal?.removeEventListener("abort",i)}}async loadResolvedDocuments(t,e,s){const i=t.length,n=s.signal,r=new Array(i).fill(null),o=new Array(i).fill(!1);let a=0;const h=(t,s)=>{o[t]||n.aborted||(o[t]=!0,r[t]=s,a++,e.onProgress?.(a,i))};await qo(Promise.all(t.map(async(s,n)=>{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 ${n+1}/${i}:`,s),t[n]=null,h(n,null)}})),this.scene,n);const l=[],c=[];try{for(let s=0;s<i;s++){if(o[s])continue;const r=t[s];if(!r){h(s,null);continue}let a;try{a=this.parseDocument(r.json,"")}catch(t){if(!e.continueOnError)throw t;console.warn(`[QuarksLoader] Failed to parse effect ${s+1}/${i}:`,t),h(s,null);continue}l.push(a),c.push(this.finishLoad(a,n).then(()=>h(s,a.root)))}await Promise.all(c)}catch(t){throw n.aborted||s.abort(t),Promise.allSettled(c),this.scene.isDisposed||l.forEach(t=>Qn(t.root)),t}return r}static async mapPool(t,e,s){if(0===t.length)return[];const i=void 0!==e&&e>0?e:t.length,n=new Array(t.length);let r=0;const o=Math.min(i,t.length);return await Promise.all(Array.from({length:o},()=>(async()=>{for(;r<t.length;){const e=r++;n[e]=await s(t[e],e)}})())),n}static async resolveWith(t,e,s,i){return t?.resolve?t.resolve(e,s,i):Jo.joinUrl(i,e)}static fetchJsonWith(t,e,s,i){const n=async()=>{if(t?.fetchJson)return i?t.fetchJson(e,{signal:i}):t.fetchJson(e);const s=await(i?fetch(e,{signal:i}):fetch(e));if(!s.ok)throw new Error(`HTTP ${s.status}`);return s.json()};if(!s)return n();const r=Fo(Eo,s),o=`json|${e}`;let a=r.get(o);return void 0===a&&(a=n().catch(t=>{throw r.get(o)===a&&r.delete(o),t}),r.set(o,a)),a}static async inlineGeometryEntries(t,e,s=Jo.warnResourceError){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 s=await e(t.url);for(const e of["positions","indices","uvs","uvs2","normals"]){const i=s?.[e];void 0!==i&&(t[e]=Array.isArray(i)?i.slice():i)}delete t.url}catch(e){s("geometry",t.url,e)}}))}static warnResourceError(t,e,s){console.warn(`[QuarksLoader] Could not load ${t} "${e}":`,s)}reportResourceError(t,e,s){(this.options.onResourceError??Jo.warnResourceError)(t,e,s)}parseImages(t,e,s){for(const i of t){i.url&&Jo.warnIfNotAnImageUrl(i.url),s.images[i.uuid]=i.url?Jo.joinUrl(e,i.url):null;const t=Io.get(i)??i.url;t&&!/^(data|blob):/i.test(t)&&(s.imageSources[i.uuid]=t)}}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){for(const s of t){const t=e.images[s.image];if(t){const i=void 0===s.invertY||!!s.invertY,n=!!s.noMipmap,r=!1!==this.options.shareResources,o=r?[i,n,s.samplingMode,s.wrap,s.repeat,s.offset,s.rotation].join("|")+"|"+t:"",a=r?Fo(Po,this.scene):void 0,h=a?.get(o);if(void 0!==h){e.textures[s.uuid]=h;continue}let l;const c=new Promise(t=>l=t);let u,d=!1;const f={noMipmap:n,invertY:i,samplingMode:"number"==typeof s.samplingMode?s.samplingMode:void 0,onLoad:()=>l(),onError:(e,s)=>{d=!0,void 0!==a&&a.get(o)===u&&a.delete(o),this.reportResourceError("image",t,s??e),l()}};try{u=new x.Texture(t,this.scene,f)}catch{e.textures[s.uuid]=null;continue}Ro.set(u,c);const p=e.imageSources[s.image];void 0!==p&&Mo(u,p,t),u.onDisposeObservable.addOnce(()=>l()),Array.isArray(s.wrap)&&(u.wrapU=this.mapWrapMode(s.wrap[0]),u.wrapV=this.mapWrapMode(s.wrap[1]??s.wrap[0])),Array.isArray(s.repeat)&&(u.uScale=s.repeat[0]??1,u.vScale=s.repeat[1]??1),Array.isArray(s.offset)&&(u.uOffset=s.offset[0]??0,u.vOffset=s.offset[1]??0),"number"==typeof s.rotation&&(u.wAng=s.rotation),void 0===a||d||(a.set(o,u),u.onDisposeObservable.addOnce(()=>{a.get(o)===u&&a.delete(o)})),e.textures[s.uuid]=u}else e.textures[s.uuid]=null}}mapWrapMode(t){switch(t){case 1001:return x.Texture.CLAMP_ADDRESSMODE;case 1002:return x.Texture.MIRROR_ADDRESSMODE;default:return x.Texture.WRAP_ADDRESSMODE}}parseMaterials(t,e){for(const s of t){const t={uuid:s.uuid,transparent:s.transparent??!0,blending:s.blending??1,side:s.side??2,depthTest:s.depthTest??!0,depthWrite:s.depthWrite??!1,alphaTest:s.alphaTest??0,texture:null},i=s.map??s.texture;i&&(t.texture=e.textures[i]||null);const n=s.reflectionAtlas;if(n&&(t.reflectionAtlas=e.textures[n]||null),"number"==typeof s.reflectionLevel&&(t.reflectionLevel=s.reflectionLevel),"unlit"!==s.lighting&&"fixed"!==s.lighting&&"scene"!==s.lighting||(t.lighting=s.lighting),s.rim&&"object"==typeof s.rim&&(t.rim=s.rim),s.mapUV&&"object"==typeof s.mapUV&&(t.mapUV=s.mapUV),s.gradientMap&&"object"==typeof s.gradientMap&&(t.gradientMap={...s.gradientMap,ramp:s.gradientMap.ramp&&e.textures[s.gradientMap.ramp]||null}),s.erosion&&"object"==typeof s.erosion&&(t.erosion={...s.erosion,mask:s.erosion.mask&&e.textures[s.erosion.mask]||null}),s.uvDistortion&&"object"==typeof s.uvDistortion&&(t.uvDistortion={...s.uvDistortion,map:s.uvDistortion.map&&e.textures[s.uvDistortion.map]||null}),"number"==typeof s.alphaMode)t.alphaMode=s.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[s.blending]||r.Constants.ALPHA_COMBINE}e.materials[s.uuid]=t}}getGeometry(t,e){if(e)return t.geometries[e]}getMaterial(t,e){if(!e)return;const s=Array.isArray(e)?e[0]:e;return t.materials[s]}createPlaceholderNode(t,e){const s=new n.TransformNode(e||t||"node",this.scene);return s.quarksOriginalType=t,s}createMeshNode(t,e){const s=new u.Mesh(t.name||t.type||"mesh",this.scene),i=this.getGeometry(e,t.geometry);if(i&&i.positions.length>0&&i.indices.length>0){const t=new m.VertexData;t.positions=i.positions,t.indices=i.indices,i.uvs&&i.uvs.length>0&&(t.uvs=i.uvs),i.uvs2&&i.uvs2.length>0&&(t.uvs2=i.uvs2),i.normals&&i.normals.length>0&&(t.normals=i.normals),t.applyToMesh(s,!0)}const n=this.getMaterial(e,t.material);if(n){const t=new S.StandardMaterial(`quarks_loader_material_${n.uuid}`,this.scene);e.ownedMaterials.push(t),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),s.material=t}return s}parseObject(t,e){let s;switch(t.type){case"QuarksPrefab":s=wo.fromJSON(t,this.scene);break;case"ParticleEmitter":if(t.ps){s=this.parseParticleSystem(t.ps,e).emitter;break}s=this.createPlaceholderNode(t.type,t.name);break;case"Mesh":case"SkinnedMesh":case"InstancedMesh":case"BatchedMesh":s=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":s=this.createPlaceholderNode(t.type,t.name);break;default:s=new n.TransformNode(t.name||t.type||"node",this.scene)}if(t.uuid&&(s._quarksUUID=t.uuid),t.name&&(s.name=t.name),t.matrix){const e=c.Matrix.FromArray(t.matrix),i=new c.Vector3(1,1,1),n=c.Quaternion.Identity(),r=new c.Vector3(0,0,0);e.decompose(i,n,r),s.position.copyFrom(r),s.scaling.copyFrom(i),s.rotationQuaternion=n}else t.position&&s.position.set(t.position[0],t.position[1],t.position[2]),t.scale&&s.scaling.set(t.scale[0],t.scale[1],t.scale[2]),t.quaternion?s.rotationQuaternion=new c.Quaternion(t.quaternion[0],t.quaternion[1],t.quaternion[2],t.quaternion[3]):t.rotation&&s.rotation.set(t.rotation[0],t.rotation[1],t.rotation[2]);if(void 0!==t.visible&&s.setEnabled(t.visible),!1===t.isVisible&&s instanceof u.Mesh&&(s.isVisible=!1),t.children)for(const i of t.children){this.parseObject(i,e).parent=s}return s}parseParticleSystem(t,e){const s=So.fromJSON(t,e,{},this.scene);return s._meshSurfaceReferenceUUID="mesh_surface"===t?.shape?.type?t?.shape?.mesh:void 0,s}linkReferences(t){const e={},s=t=>{t._quarksUUID&&(e[t._quarksUUID]=t);for(const e of t.getChildren())e instanceof n.TransformNode&&s(e)};s(t);const i=s=>{if(s instanceof wo&&s.resolveReferences(t),s instanceof Hn){const t=s.system,i=t._meshSurfaceReferenceUUID;if(i&&"mesh_surface"===t.emitterShape.type){const n=e[i];n instanceof u.Mesh?t.emitterShape.mesh=n:console.warn(`[QuarksLoader] Emitter "${s.name}" has a mesh surface shape on "${i}", `+(n?"which is not a mesh":"which is not in the effect")+"; it emits nothing until a mesh is set.")}for(let i=0;i<t.behaviors.length;i++)if(t.behaviors[i]instanceof Ee){const n=t.behaviors[i],r=n.subParticleSystem;if("string"!=typeof r)continue;const o=e[r];o instanceof Hn?(n.subParticleSystem=o,o.system.onlyUsedByOther=!0):(n.subParticleSystem=void 0,""!==r&&console.warn(`[QuarksLoader] Emitter "${s.name}" has a sub emitter targeting "${r}", `+(o?"which is not a particle emitter":"which is not in the effect")+"; that sub emitter is skipped."))}}for(const t of s.getChildren())t instanceof n.TransformNode&&i(t)};i(t)}}const Wo={};const Go={name:""},Qo=[{name:"billboard",settings:{renderMode:exports.RenderMode.BillBoard}},{name:"vertical billboard",settings:{renderMode:exports.RenderMode.VerticalBillBoard}},{name:"horizontal billboard",settings:{renderMode:exports.RenderMode.HorizontalBillBoard}},{name:"stretched",settings:{renderMode:exports.RenderMode.StretchedBillBoard}},{name:"beam",settings:{renderMode:exports.RenderMode.Beam}},{name:"mesh",settings:{renderMode:exports.RenderMode.Mesh}},{name:"mesh scene lit",settings:{renderMode:exports.RenderMode.Mesh,lighting:"scene"}},{name:"mesh unlit",settings:{renderMode:exports.RenderMode.Mesh,lighting:"unlit"}},{name:"mesh rim",settings:{renderMode:exports.RenderMode.Mesh,rim:ci({mode:"add"})}},{name:"mesh unlit rim mix",settings:{renderMode:exports.RenderMode.Mesh,lighting:"unlit",rim:ci({mode:"mix"})}},{name:"mesh unlit rim fade",settings:{renderMode:exports.RenderMode.Mesh,lighting:"unlit",rim:ci({mode:"fade"})}},{name:"mesh reflecting",settings:{renderMode:exports.RenderMode.Mesh,reflectionAtlas:Wo},context:{envAtlasReady:!0}},{name:"mesh unlit reflecting rim fade",settings:{renderMode:exports.RenderMode.Mesh,lighting:"unlit",reflectionAtlas:Wo,rim:ci({mode:"fade"})},context:{envAtlasReady:!0}},{name:"trail",settings:{renderMode:exports.RenderMode.Trail}}],jo=[Go,{name:"pivot",settings:{pivot:new et(.5,0,0)}},{name:"size limits",settings:{minParticleSize:.01}},{name:"pivot size limits",settings:{pivot:new et(0,.5,.5),maxParticleSize:.5}}],Ho=[Go,{name:"sheet",settings:{uTileCount:4,vTileCount:2}},{name:"sheet blend",settings:{uTileCount:4,vTileCount:2,blendTiles:!0}}],Yo=[Go,{name:"map",settings:{texture:Wo}}],Xo=[Go,{name:"soft",settings:{softParticles:!0},context:{depth:{packed:!1}}},{name:"soft packed",settings:{softParticles:!0},context:{depth:{packed:!0}}}],Zo=[Go,{name:"alpha test",settings:{materialAlphaTest:.5}}],Ko=[Go,{name:"fog",settings:{applyFog:!0}},{name:"fog additive",settings:{applyFog:!0,materialBlendMode:r.Constants.ALPHA_ADD}}],ta=(()=>{const t=wi({tiling:[2,2]}),e=wi({channel:1,tiling:[2,2]}),s=Si({map:Wo}),i=Si({map:Wo,mapUV:{channel:1}}),n=mi({ramp:Wo}),r=gi({}),o=gi({mask:Wo}),a=gi({mask:Wo,maskUV:{channel:1}});return[{name:"map transform",settings:{mapUV:t}},{name:"map transform uv1",settings:{mapUV:e}},{name:"gradient map",settings:{gradientMap:n}},{name:"erosion",settings:{erosion:r}},{name:"erosion mask",settings:{erosion:o}},{name:"erosion mask uv1",settings:{erosion:a}},{name:"distortion",settings:{uvDistortion:s}},{name:"distortion uv1",settings:{uvDistortion:i}},{name:"map transform distortion gradient erosion mask",settings:{mapUV:t,uvDistortion:s,gradientMap:n,erosion:o}},{name:"map transform uv1 distortion gradient erosion",settings:{mapUV:e,uvDistortion:s,gradientMap:n,erosion:r}},{name:"every effect on uv1",settings:{mapUV:e,uvDistortion:i,gradientMap:n,erosion:a}}]})(),ea=["billboard","stretched","beam","mesh","mesh unlit","mesh unlit rim mix","mesh reflecting","trail"],sa={name:"uv2",context:{meshUV2:!0}},ia={name:"soft packed alpha test fog additive",settings:{softParticles:!0,materialAlphaTest:.5,applyFog:!0,materialBlendMode:r.Constants.ALPHA_ADD},context:{depth:{packed:!0}}};Qs(Ys),exports.ApplyCollision=Pt,exports.ApplyForce=ce,exports.ApplySequences=fe,exports.AxisAngleGenerator=Wt,exports.BatchedRenderer=Ln,exports.BehaviorFromJSON=ms,exports.BehaviorTypes=ps,exports.Bezier=kt,exports.BoxEmitter=Es,exports.ChangeEmitDirection=pe,exports.CircleEmitter=Bs,exports.ColorBySpeed=ye,exports.ColorGeneratorFromJSON=te,exports.ColorOverLife=ge,exports.ColorRange=Gt,exports.ConeEmitter=Is,exports.ConstantColor=Kt,exports.ConstantValue=Rt,exports.DEG2RAD=O,exports.DonutEmitter=Us,exports.EROSION_DEFAULT_SOFTNESS=yi,exports.EdgeEmitter=Ns,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 s=this.systemsOf.get(t);if(void 0!==s&&s.includes(e))return void(Yn.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 s=this.idle.pop()??this.makeCopy();return null===s?null:(s.parent=e,void 0!==t&&s.position.copyFrom(t),s.setEnabled(!0),this.playing.add(s),Yn.restart(s),Yn.play(s),s)}stop(t){this.playing.has(t)&&Yn.endEmit(t)}release(t){this.playing.delete(t)&&(Yn.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=Yn.instantiate(this.template),e=[];return Yn.runOnAllParticleEmitters(t,t=>{const s=t.system;s.autoDestroy=!1,s.addEventListener("finished",this.onSystemFinished),e.push(s)}),this.systemsOf.set(t,e),Yn.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),Qn(t)}},exports.EmitSubParticleSystem=Ee,exports.EmitterFrame=le,exports.EmitterFromJSON=Ws,exports.EmitterShapes=Js,exports.Euler=yt,exports.EulerGenerator=ee,exports.ForceOverLife=Fe,exports.FrameOverLife=Be,exports.GRADIENT_MAP_WEIGHTS=pi,exports.GeneratorFromJSON=oe,exports.Gradient=Ht,exports.GravityForce=Ie,exports.GridEmitter=Rs,exports.HemisphereEmitter=Ds,exports.InheritVelocity=Ue,exports.IntervalValue=Dt,exports.LimitSpeedOverLife=Ne,exports.MAX_TRAIL_TESSELLATION=16,exports.MathUtils=K,exports.Matrix3=gt,exports.Matrix4=ot,exports.MeshSurfaceEmitter=Hs,exports.MeshSurfaceEmitterPlugin=Ys,exports.NodeParticle=class{constructor(){this.position=new et,this.velocity=new et,this.age=0,this.life=1,this.size=new et,this.rotation=0,this.color=new Vt(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=Ke,exports.OrbitOverLife=ts,exports.ParticleEmitter=Hn,exports.ParticleStore=ve,exports.ParticleSystem=So,exports.PiecewiseBezier=qt,exports.PiecewiseFunction=Lt,exports.Plugins=Gs,exports.PointEmitter=ks,exports.QUARKS_FORMAT_VERSION=1,exports.QuarksFormatError=Uo,exports.QuarksLoader=Jo,exports.QuarksPrefab=wo,exports.QuarksUtil=Yn,exports.Quaternion=tt,exports.QuaternionView=St,exports.RAD2DEG=$,exports.RandomColor=Yt,exports.RandomColorBetweenGradient=Zt,exports.RandomQuatGenerator=se,exports.RecordState=class{constructor(t,e,s){this.position=t,this.size=e,this.color=s}},exports.RectangleEmitter=qs,exports.Rotation3DOverLife=es,exports.RotationBySpeed=ss,exports.RotationGeneratorFromJSON=ie,exports.RotationOverLife=is,exports.SequencerFromJSON=de,exports.ShapeTransform=$s,exports.SizeBySpeed=ns,exports.SizeOverLife=rs,exports.SpeedOverLife=os,exports.SphereEmitter=Ls,exports.SpriteParticle=we,exports.SubEmitterInheritMask=Pe,exports.TextureSequencer=ue,exports.TrailParticle=Me,exports.TurbulenceField=hs,exports.UV_DISTORTION_DEFAULT_STRENGTH=xi,exports.UV_DISTORTION_DEFAULT_UV=vi,exports.VFXBatch=Mi,exports.ValueGeneratorFromJSON=Jt,exports.Vector2=bt,exports.Vector3=et,exports.Vector3Function=ne,exports.Vector3GeneratorFromJSON=re,exports.Vector3View=zt,exports.Vector4=Vt,exports.Vector4View=Tt,exports.VelocityOverLife=ds,exports.WebGLCoordinateSystem=nt,exports.WebGPUCoordinateSystem=rt,exports.WidthOverLength=fs,exports.cacheEnvAtlas=function(t,e){const s=ir(e)??ir(t);s?or(t,s,e):console.warn("[babylon.quarks] cacheEnvAtlas: neither the atlas nor the cube has a scene; not cached")},exports.ceilPowerOfTwo=j,exports.clamp=C,exports.createEnvAtlasFromFaceUrls=ar,exports.createSeededRandom=V,exports.cubeFaceUrls=sr,exports.damp=U,exports.decodeSoftDepth=function(t,e){const s=e.z*t+e.w,i=Math.abs(s)>1e-8?Math.abs((e.x*t+e.y)/s):0;return i>0?i:1e30},exports.defaultMeshLighting=li,exports.degToRad=W,exports.denormalize=X,exports.disposeEnvAtlas=rr,exports.ensureEnvAtlasFromCube=lr,exports.erosionEqual=function(t,e){return t===e||!(!t||!e)&&(t.mask===e.mask&&di(t.maskUV,e.maskUV)&&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])},exports.euclideanModulo=E,exports.floorPowerOfTwo=H,exports.generateUUID=P,exports.getCachedEnvAtlas=nr,exports.getPhysicsResolver=function(){return $t},exports.getRandomSource=z,exports.getValueFromEmitterMode=Fs,exports.gradientMapEqual=function(t,e){return t===e||!!t&&!!e&&t.ramp===e.ramp&&t.channel===e.channel},exports.inverseLerp=B,exports.isPowerOfTwo=Q,exports.lerp=I,exports.loadPlugin=Qs,exports.mapLinear=F,exports.mapUVEqual=function(t,e){return t===e||!!t&&!!e&&di(t,e)},exports.meshRimEqual=function(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.normalize=Z,exports.normalizeErosion=gi,exports.normalizeGradientMap=mi,exports.normalizeMapUV=wi,exports.normalizeMeshRim=ci,exports.normalizeTextureUV=ui,exports.normalizeUVDistortion=Si,exports.pingpong=N,exports.planBehaviorFusion=Os,exports.quarksNodeId=js,exports.radToDeg=G,exports.randFloat=L,exports.randFloatSpread=q,exports.randInt=k,exports.random=M,exports.readBehaviorSpace=ae,exports.readsUV1=bi,exports.seededRandom=J,exports.serializeEffect=function(t,e={}){const s=new To(e);let i;if(Array.isArray(t)){const n=e.name??"effect";i={uuid:`${n}-root`,type:"Group",name:n,matrix:c.Matrix.Identity().asArray().slice(),children:t.map(t=>s.node(t))}}else i=s.node(t);return s.finish(i)},exports.setPhysicsResolver=function(t){$t=t},exports.setQuaternionFromProperEuler=Y,exports.setRandomSource=_,exports.shaderProgram=_n,exports.shaderVariants=function(){const t=new Set,e=[],s=s=>{const i={renderMode:n=exports.RenderMode.BillBoard,texture:null,reflectionAtlas:null,uTileCount:1,vTileCount:1,blendTiles:!1,softParticles:!1,materialAlphaTest:0,materialTransparent:!0,materialBlendMode:r.Constants.ALPHA_COMBINE,applyFog:!1,pivot:void 0,minParticleSize:0,maxParticleSize:1/0,lighting:n===exports.RenderMode.Mesh?"fixed":void 0,rim:void 0,mapUV:void 0,uvDistortion:void 0,gradientMap:void 0,erosion:void 0};var n;const o={depth:null,envAtlasReady:!1,meshUV2:!1};for(const t of s)Object.assign(i,t.settings),Object.assign(o,t.context);const a=_n(i,o),h=a.name+" "+a.defines.join(",");if(t.has(h))return;t.add(h);const l=s.map(t=>t.name).filter(t=>""!==t);e.push({name:`${l.join(", ")} [${a.defines.join(",")||"none"}]`,program:a})};for(const t of Qo)for(const e of jo)for(const i of Ho)for(const n of Yo)for(const r of Xo)for(const o of Zo)for(const a of Ko)s([t,e,i,n,r,o,a]);for(const t of Qo.filter(t=>ea.includes(t.name)))for(const e of t.settings?.renderMode===exports.RenderMode.Mesh?[Go,sa]:[Go])for(const i of ta)for(const n of Yo)for(const r of[Go,Ho[2]])for(const o of[Go,ia])s([t,e,i,n,r,o]);return e},exports.smootherstep=D,exports.smoothstep=R,exports.softDepthParams=ai,exports.speedFraction=me,exports.subEmitterInheritMask=Ce,exports.textureSourceUrl=zo,exports.textureUVEqual=di,exports.textureUVToJSON=fi,exports.trailCurveTension=En,exports.trailLifetime=Nn,exports.trailMinVertexDistance=Un,exports.trailTessellation=Cn,exports.trailTextureMode=Bn,exports.trailTextureScale=In,exports.unloadPlugin=function(t){const e=Gs.findIndex(e=>e.id===t);if(e<0)return;const s=Gs[e];Gs.splice(e,1);for(const t of s.emitterShapes)Js[t.type]===t&&delete Js[t.type];for(const t of s.behaviors)ps[t.type]===t&&delete ps[t.type]},exports.uvDistortionEqual=function(t,e){return t===e||!(!t||!e)&&(t.map===e.map&&t.strength===e.strength&&di(t.mapUV,e.mapUV))},exports.withRandomSource=function(t,e){const s=_(t);try{return e()}finally{_(s)}};
|
|
2
2
|
//# sourceMappingURL=babylon.quarks.cjs.map
|