babylon.quarks 0.27.0 → 0.28.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.
Files changed (52) hide show
  1. package/CHANGELOG.md +425 -0
  2. package/README.md +3 -1
  3. package/dist/babylon.quarks.cjs +1 -1
  4. package/dist/babylon.quarks.cjs.map +1 -1
  5. package/dist/babylon.quarks.esm.js +1 -1
  6. package/dist/babylon.quarks.esm.js.map +1 -1
  7. package/dist/babylon.quarks.umd.min.js +1 -1
  8. package/dist/babylon.quarks.umd.min.js.map +1 -1
  9. package/dist/types/index.d.cts +4256 -831
  10. package/dist/types/index.d.ts +4256 -831
  11. package/package.json +7 -2
  12. package/src/BatchedRenderer.ts +93 -78
  13. package/src/EffectPool.ts +91 -12
  14. package/src/MeshSurfaceEmitter.ts +24 -13
  15. package/src/ParticleEmitter.ts +31 -3
  16. package/src/ParticleSystem.ts +92 -25
  17. package/src/QuarksLoader.ts +289 -171
  18. package/src/QuarksPrefab.ts +301 -94
  19. package/src/QuarksSerializer.ts +43 -15
  20. package/src/QuarksUtil.ts +64 -9
  21. package/src/SpriteBatch.ts +21 -6
  22. package/src/TrailBatch.ts +12 -6
  23. package/src/VFXBatch.ts +70 -528
  24. package/src/batchKey.ts +4 -2
  25. package/src/batchSettings.ts +546 -0
  26. package/src/effectDocumentJSON.ts +261 -0
  27. package/src/effectResources.ts +21 -24
  28. package/src/envAtlas.ts +8 -2
  29. package/src/geometryUtil.ts +1 -1
  30. package/src/index.ts +39 -4
  31. package/src/nodeId.ts +25 -2
  32. package/src/shaderProgram.ts +110 -16
  33. package/src/shaderVariants.ts +24 -4
  34. package/src/shaders/chunks/blend.ts +31 -0
  35. package/src/shaders/chunks/fog.ts +8 -3
  36. package/src/shaders/chunks/soft.ts +6 -5
  37. package/src/shaders/chunks/surface.ts +2 -2
  38. package/src/shaders/particle_frag.glsl.ts +3 -1
  39. package/src/shaders/particle_frag.wgsl.ts +2 -0
  40. package/src/shaders/particle_physics_frag.glsl.ts +5 -2
  41. package/src/shaders/particle_physics_frag.wgsl.ts +2 -0
  42. package/src/shaders/trail_frag.glsl.ts +4 -1
  43. package/src/shaders/trail_frag.wgsl.ts +2 -0
  44. package/src/system/EmissionController.ts +2 -4
  45. package/src/system/EventDispatcher.ts +26 -10
  46. package/src/system/geometry.ts +22 -29
  47. package/src/system/materialResolve.ts +56 -7
  48. package/src/system/normalize.ts +6 -1
  49. package/src/system/serialization.ts +54 -33
  50. package/src/system/settingsSchema.ts +32 -10
  51. package/src/system/types.ts +67 -28
  52. package/src/trailSettings.ts +9 -6
@@ -1,2 +1,2 @@
1
- !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("@babylonjs/core/Buffers/buffer"),require("@babylonjs/core/Misc/guid"),require("@babylonjs/core/Maths/math.frustum"),require("@babylonjs/core/Maths/math.plane"),require("@babylonjs/core/Meshes/transformNode"),require("@babylonjs/core/Engines/constants"),require("@babylonjs/core/Culling/boundingInfo"),require("@babylonjs/core/Materials/Textures/baseTexture"),require("@babylonjs/core/Materials/shaderMaterial"),require("@babylonjs/core/Maths/math.color"),require("@babylonjs/core/Maths/math.vector"),require("@babylonjs/core/Meshes/mesh"),require("@babylonjs/core/scene"),require("@babylonjs/core/Cameras/camera"),require("@babylonjs/core/Materials/Textures/rawTexture"),require("@babylonjs/core/Meshes/mesh.vertexData"),require("@babylonjs/core/Engines/shaderStore"),require("@babylonjs/core/Materials/effect"),require("@babylonjs/core/Materials/shaderLanguage"),require("@babylonjs/core/Materials/Textures/texture"),require("@babylonjs/core/Materials/standardMaterial"),require("@babylonjs/core/Meshes/instancedMesh")):"function"==typeof define&&define.amd?define(["exports","@babylonjs/core/Buffers/buffer","@babylonjs/core/Misc/guid","@babylonjs/core/Maths/math.frustum","@babylonjs/core/Maths/math.plane","@babylonjs/core/Meshes/transformNode","@babylonjs/core/Engines/constants","@babylonjs/core/Culling/boundingInfo","@babylonjs/core/Materials/Textures/baseTexture","@babylonjs/core/Materials/shaderMaterial","@babylonjs/core/Maths/math.color","@babylonjs/core/Maths/math.vector","@babylonjs/core/Meshes/mesh","@babylonjs/core/scene","@babylonjs/core/Cameras/camera","@babylonjs/core/Materials/Textures/rawTexture","@babylonjs/core/Meshes/mesh.vertexData","@babylonjs/core/Engines/shaderStore","@babylonjs/core/Materials/effect","@babylonjs/core/Materials/shaderLanguage","@babylonjs/core/Materials/Textures/texture","@babylonjs/core/Materials/standardMaterial","@babylonjs/core/Meshes/instancedMesh"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).BabylonQuarks={},t.BABYLON,t.BABYLON,t.BABYLON,t.BABYLON,t.BABYLON,t.BABYLON,t.BABYLON,t.BABYLON,t.BABYLON,t.BABYLON,t.BABYLON,t.BABYLON,t.BABYLON,t.BABYLON,t.BABYLON,t.BABYLON,t.BABYLON,t.BABYLON,t.BABYLON,t.BABYLON,t.BABYLON,t.BABYLON)}(this,function(t,e,i,s,n,r,o,a,h,l,c,u,d,f,m,p,y,g,v,x,S,b,w){"use strict";let M=null;function z(){return null===M?Math.random():M()}function _(){return M??Math.random}function V(t){const e=_();return M=t,e}function A(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 T=["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 O=1234567;const $=Math.PI/180,P=180/Math.PI;function C(){const t=4294967295*Math.random()|0,e=4294967295*Math.random()|0,i=4294967295*Math.random()|0,s=4294967295*Math.random()|0;return(T[255&t]+T[t>>8&255]+T[t>>16&255]+T[t>>24&255]+"-"+T[255&e]+T[e>>8&255]+"-"+T[e>>16&15|64]+T[e>>24&255]+"-"+T[63&i|128]+T[i>>8&255]+"-"+T[i>>16&255]+T[i>>24&255]+T[255&s]+T[s>>8&255]+T[s>>16&255]+T[s>>24&255]).toLowerCase()}function B(t,e,i){return Math.max(e,Math.min(i,t))}function E(t,e){return(t%e+e)%e}function F(t,e,i,s,n){return s+(t-e)*(n-s)/(i-e)}function I(t,e,i){return t!==e?(i-t)/(e-t):0}function N(t,e,i){return(1-i)*t+i*e}function U(t,e,i,s){return N(t,e,1-Math.exp(-i*s))}function R(t,e=1){return e-Math.abs(E(t,2*e)-e)}function D(t,e,i){return t<=e?0:t>=i?1:(t=(t-e)/(i-e))*t*(3-2*t)}function k(t,e,i){return t<=e?0:t>=i?1:(t=(t-e)/(i-e))*t*t*(t*(6*t-15)+10)}function L(t,e){return t+Math.floor(z()*(e-t+1))}function q(t,e){return t+z()*(e-t)}function J(t){return t*(.5-z())}function W(t){void 0!==t&&(O=t);let e=O+=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 G(t){return t*$}function Q(t){return t*P}function j(t){return!(t&t-1)&&0!==t}function Y(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 X(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),m=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*m,h*f,a*l);break;case"YXY":t.set(h*f,a*c,h*m,a*l);break;case"ZYZ":t.set(h*m,h*f,a*c,a*l);break;default:console.warn("../math.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: "+n)}}function Z(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 K(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 tt={DEG2RAD:$,RAD2DEG:P,generateUUID:C,clamp:B,euclideanModulo:E,mapLinear:F,inverseLerp:I,lerp:N,damp:U,pingpong:R,smoothstep:D,smootherstep:k,randInt:L,randFloat:q,randFloatSpread:J,seededRandom:W,degToRad:G,radToDeg:Q,isPowerOfTwo:j,ceilPowerOfTwo:Y,floorPowerOfTwo:H,setQuaternionFromProperEuler:X,normalize:K,denormalize:Z};class et{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],m=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]=m);if(c!==m||a!==u||h!==d||l!==f){let t=1-o;const e=a*u+h*d+l*f+c*m,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+m*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 et(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(B(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*z(),e=2*Math.PI*z(),i=z(),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}}et.prototype.isQuaternion=!0;class it{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 it(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(nt.setFromEuler(t))}applyAxisAngle(t,e){return this.applyQuaternion(nt.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 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 i=this.dot(t)/e;return Math.acos(B(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=z(),this.y=z(),this.z=z(),this}randomDirection(){const t=z()*Math.PI*2,e=2*z()-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}}it.prototype.isVector3=!0;const st=new it,nt=new et,rt=2e3,ot=2001;class at{constructor(t,e,i,s,n,r,o,a,h,l,c,u,d,f,m,p){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,m,p)}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,m,p){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]=m,y[15]=p,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 at).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/ht.setFromMatrixColumn(t,0).length(),n=1/ht.setFromMatrixColumn(t,1).length(),r=1/ht.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(ct,t,ut)}lookAt(t,e,i){const s=this.elements;return mt.subVectors(t,e),0===mt.lengthSq()&&(mt.z=1),mt.normalize(),dt.crossVectors(i,mt),0===dt.lengthSq()&&(1===Math.abs(i.z)?mt.x+=1e-4:mt.z+=1e-4,mt.normalize(),dt.crossVectors(i,mt)),dt.normalize(),ft.crossVectors(mt,dt),s[0]=dt.x,s[4]=ft.x,s[8]=mt.x,s[1]=dt.y,s[5]=ft.y,s[9]=mt.y,s[2]=dt.z,s[6]=ft.z,s[10]=mt.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],m=i[6],p=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],A=s[9],T=s[13],O=s[2],$=s[6],P=s[10],C=s[14],B=s[3],E=s[7],F=s[11],I=s[15];return n[0]=r*b+o*_+a*O+h*B,n[4]=r*w+o*V+a*$+h*E,n[8]=r*M+o*A+a*P+h*F,n[12]=r*z+o*T+a*C+h*I,n[1]=l*b+c*_+u*O+d*B,n[5]=l*w+c*V+u*$+d*E,n[9]=l*M+c*A+u*P+d*F,n[13]=l*z+c*T+u*C+d*I,n[2]=f*b+m*_+p*O+y*B,n[6]=f*w+m*V+p*$+y*E,n[10]=f*M+m*A+p*P+y*F,n[14]=f*z+m*T+p*C+y*I,n[3]=g*b+v*_+x*O+S*B,n[7]=g*w+v*V+x*$+S*E,n[11]=g*M+v*A+x*P+S*F,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],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],m=t[13],p=t[14],y=t[15],g=c*p*h-m*u*h+m*a*d-o*p*d-c*a*y+o*u*y,v=f*u*h-l*p*h-f*a*d+r*p*d+l*a*y-r*u*y,x=l*m*h-f*c*h+f*o*d-r*m*d-l*o*y+r*c*y,S=f*c*a-l*m*a-f*o*u+r*m*u+l*o*p-r*c*p,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]=(m*u*n-c*p*n-m*s*d+i*p*d+c*s*y-i*u*y)*w,t[2]=(o*p*n-m*a*n+m*s*h-i*p*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*p*n-f*u*n+f*s*d-e*p*d-l*s*y+e*u*y)*w,t[6]=(f*a*n-r*p*n-f*s*h+e*p*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*m*n-f*i*d+e*m*d+l*i*y-e*c*y)*w,t[10]=(r*m*n-f*o*n+f*i*h-e*m*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*m*s-f*c*s+f*i*u-e*m*u-l*i*p+e*c*p)*w,t[14]=(f*o*s-r*m*s-f*i*a+e*m*a+r*i*p-e*o*p)*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,m=r*l,p=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-(m+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]=(p+g)*b,s[7]=0,s[8]=(f+v)*w,s[9]=(p-g)*w,s[10]=(1-(u+m))*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=ht.set(s[0],s[1],s[2]).length();const r=ht.set(s[4],s[5],s[6]).length(),o=ht.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],lt.copy(this);const a=1/n,h=1/r,l=1/o;return lt.elements[0]*=a,lt.elements[1]*=a,lt.elements[2]*=a,lt.elements[4]*=h,lt.elements[5]*=h,lt.elements[6]*=h,lt.elements[8]*=l,lt.elements[9]*=l,lt.elements[10]*=l,e.setFromRotationMatrix(lt),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===rt)d=-(r+n)/(r-n),f=-2*r*n/(r-n);else{if(o!==ot)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,m;if(o===rt)f=(r+n)*c,m=-2*c;else{if(o!==ot)throw new Error("../math.Matrix4.makeOrthographic(): Invalid coordinate system: "+o);f=n*c,m=-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]=m,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}}at.prototype.isMatrix4=!0;const ht=new it,lt=new at,ct=new it(0,0,0),ut=new it(1,1,1),dt=new it,ft=new it,mt=new it,pt=new at,yt=new et;class gt{constructor(t=0,e=0,i=0,s=gt.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 gt(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(B(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(-B(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(B(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(-B(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(B(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(-B(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 pt.makeRotationFromQuaternion(t),this.setFromRotationMatrix(pt,e,i)}setFromVector3(t,e=this._order){return this.set(t.x,t.y,t.z,e)}reorder(t){return yt.setFromEuler(this),this.setFromQuaternion(yt,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}}gt.DEFAULT_ORDER="XYZ",gt.prototype.isEuler=!0;class vt{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],m=s[0],p=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*m+o*g+a*S,n[3]=r*p+o*v+a*b,n[6]=r*y+o*x+a*w,n[1]=h*m+l*g+c*S,n[4]=h*p+l*v+c*b,n[7]=h*y+l*x+c*w,n[2]=u*m+d*g+f*S,n[5]=u*p+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 m=1/f;return t[0]=c*m,t[1]=(s*h-l*i)*m,t[2]=(o*i-s*r)*m,t[3]=u*m,t[4]=(l*e-s*a)*m,t[5]=(s*n-o*e)*m,t[6]=d*m,t[7]=(i*a-h*e)*m,t[8]=(r*e-i*n)*m,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(xt.makeScale(t,e)),this}rotate(t){return this.premultiply(xt.makeRotation(-t)),this}translate(t,e){return this.premultiply(xt.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 vt).fromArray(this.elements)}}vt.prototype.isMatrix3=!0;const xt=new vt,St=new Float32Array(4);class bt extends et{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}},_w:{get(){return this.data[this.offset+3]},set(t){this.data[this.offset+3]=t}}});class Mt{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 Mt(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(B(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=z(),this.y=z(),this}*[Symbol.iterator](){yield this.x,yield this.y}}Mt.isVector2=!0;const zt=new Float32Array(3);class _t extends it{constructor(t,e){super(),this.data=t,this.offset=e}bind(t,e){this.data=t,this.offset=e}}const Vt=_t.prototype;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}}});class At{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 At(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],m=a[2],p=a[6],y=a[10];if(Math.abs(l-u)<r&&Math.abs(c-m)<r&&Math.abs(f-p)<r){if(Math.abs(l+u)<o&&Math.abs(c+m)<o&&Math.abs(f+p)<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+m)/4,S=(f+p)/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((p-f)*(p-f)+(c-m)*(c-m)+(u-l)*(u-l));return Math.abs(g)<.001&&(g=1),this.x=(p-f)/g,this.y=(c-m)/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=z(),this.y=z(),this.z=z(),this.w=z(),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z,yield this.w}}At.prototype.isVector4=!0;const Tt=new Float32Array(4);class Ot extends At{constructor(t,e){super(),this.data=t,this.offset=e}bind(t,e){this.data=t,this.offset=e}}const $t=Ot.prototype;let Pt;$t.data=Tt,$t.offset=0,Object.defineProperties(Ot.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 Ct{constructor(t,e){this.resolver=t,this.bounce=e,this.type="ApplyCollision",this.tempV=new it}initialize(t){}update(t,e){const i=this.resolver??Pt;void 0!==i&&i.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 Ct(void 0,"number"==typeof t.bounce?t.bounce:1)}clone(){return new Ct(this.resolver,this.bounce)}reset(){}}const Bt=t=>({r:t.x,g:t.y,b:t.z,a:t.w}),Et=t=>new At(t.r,t.g,t.b,t.a),Ft=(t,e)=>{switch(e){case"Vector3":return new it(t.x,t.y,t.z);case"Vector4":return new At(t.x,t.y,t.z,t.w);case"Color":return new it(t.r,t.g,t.b);default:return t}},It=(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}},Nt=t=>{console.warn(`[quarks] ${t}`)},Ut=(t,e)=>Array.isArray(t)?new it(t[0]??e.x,t[1]??e.y,t[2]??e.z):e,Rt=(t,e)=>{const i=e?.type;return null==e?`Missing ${t}`:void 0===i?`${t[0].toUpperCase()}${t.slice(1)} without a type`:`Unknown ${t} ${JSON.stringify(i)}`};class Dt{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 Dt(t.value)}clone(){return new Dt(this.value)}}class kt{constructor(t,e){this.a=t,this.b=e,this.indexCount=-1,this.type="value"}startGen(t){this.indexCount=t.length,t.push(z())}genValue(t){return-1===this.indexCount&&this.startGen(t),tt.lerp(this.a,this.b,t[this.indexCount])}toJSON(){return{type:"IntervalValue",a:this.a,b:this.b}}static fromJSON(t){return new kt(t.a,t.b)}clone(){return new kt(this.a,this.b)}}class Lt{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 Lt(e[0],e[4],e[7],e[9]),right:new Lt(e[9],e[8],e[6],e[3]),span:e}}clone(){return new Lt(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 Lt(t.p0,t.p1,t.p2,t.p3)}}class qt{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 Jt extends qt{constructor(t=[[new Lt(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=Jt.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 Jt(t.functions.map(t=>[Lt.fromJSON(t.function),t.start]))}clone(){return new Jt(this.functions.map(([t,e])=>[t.clone(),e]))}startGen(t){}}function Wt(t){switch(t?.type){case"ConstantValue":return Dt.fromJSON(t);case"IntervalValue":return kt.fromJSON(t);case"PiecewiseBezier":return Jt.fromJSON(t);default:return Nt(`${Rt("value generator",t)}; using 0.`),new Dt(0)}}Jt.TABLE_SIZE=257;class Gt{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 Gt(new it(t.axis.x,t.axis.y,t.axis.z),Wt(t.angle))}clone(){return new Gt(this.axis.clone(),this.angle.clone())}}class Qt{constructor(t,e){this.a=t,this.b=e,this.indexCount=-1,this.type="value"}startGen(t){this.indexCount=t.length,t.push(z())}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:Bt(this.a),b:Bt(this.b)}}static fromJSON(t){return new Qt(Et(t.a),Et(t.b))}clone(){return new Qt(this.a.clone(),this.b.clone())}}class jt{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||t<e[0][1])return-1;if(t>=e[i][1])return i;if(1===i)return 0;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{type:"CLinearFunction",subType:this.subType,keys:this.keys.map(([t,e])=>({value:It(t,this.subType),pos:e}))}}static fromJSON(t){return new jt(t.keys.map(e=>[Ft(e.value,t.subType),e.pos]),t.subType)}clone(){return"Number"===this.subType?new jt(this.keys.map(([t,e])=>[t,e]),this.subType):new jt(this.keys.map(([t,e])=>[t.clone(),e]),this.subType)}}const Yt=new At;class Ht{constructor(t=[[new it(0,0,0),0],[new it(1,1,1),0]],e=[[1,0],[1,1]]){this.table=null,this.tableSignature=null,this.type="function",this.color=new jt(t,"Color"),this.alpha=new jt(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=Ht.TABLE_SIZE,a=null!==this.table&&this.table.length===4*o?this.table:new Float32Array(4*o),h=1/(o-1),l=Yt;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=Ht.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=>[Qt.fromJSON(t.function).a,t.start]);return t.functions.length>0&&e.push([Qt.fromJSON(t.functions[t.functions.length-1].function).b,1]),new Ht(e.map(t=>[new it(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=jt.fromJSON(t.alpha),e.color=jt.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 Xt{constructor(t,e){this.a=t,this.b=e,this.type="value"}startGen(t){}genColor(t,e){const i=z();return e.copy(this.a).lerp(this.b,i)}toJSON(){return{type:"RandomColor",a:Bt(this.a),b:Bt(this.b)}}static fromJSON(t){return new Xt(Et(t.a),Et(t.b))}clone(){return new Xt(this.a.clone(),this.b.clone())}}const Zt=new At;class Kt{constructor(t,e){this.indexCount=0,this.type="function",this.gradient1=t,this.gradient2=e}startGen(t){this.indexCount=t.length,t.push(z())}genColor(t,e,i){return this.gradient1.genColor(t,e,i),this.gradient2.genColor(t,Zt,i),t&&void 0!==t[this.indexCount]?e.lerp(Zt,t[this.indexCount]):e.lerp(Zt,z()),e}toJSON(){return{type:"RandomColorBetweenGradient",gradient1:this.gradient1.toJSON(),gradient2:this.gradient2.toJSON()}}static fromJSON(t){return new Kt(Ht.fromJSON(t.gradient1),Ht.fromJSON(t.gradient2))}clone(){return new Kt(this.gradient1.clone(),this.gradient2.clone())}}class te{constructor(t){this.color=t,this.type="value"}startGen(t){}genColor(t,e){return e.copy(this.color)}toJSON(){return{type:"ConstantColor",color:Bt(this.color)}}static fromJSON(t){return new te(Et(t.color))}clone(){return new te(this.color.clone())}}function ee(t){switch(t?.type){case"ConstantColor":return te.fromJSON(t);case"ColorRange":return Qt.fromJSON(t);case"RandomColor":return Xt.fromJSON(t);case"Gradient":return Ht.fromJSON(t);case"RandomColorBetweenGradient":return Kt.fromJSON(t);default:return Nt(`${Rt("colour generator",t)}; using white.`),new te(new At(1,1,1,1))}}class ie{constructor(t,e,i,s){this.angleX=t,this.angleY=e,this.angleZ=i,this.type="rotation",this.eular=new gt(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 ie(Wt(t.angleX),Wt(t.angleY),Wt(t.angleZ),t.eulerOrder)}clone(){return new ie(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,i,s,n,r,o;this.indexCount=t.length;do{e=2*z()-1,i=2*z()-1,s=e*e+i*i}while(s>1);do{n=2*z()-1,r=2*z()-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 se}clone(){return new se}}function ne(t){switch(t?.type){case"AxisAngle":return Gt.fromJSON(t);case"Euler":return ie.fromJSON(t);case"RandomQuat":return se.fromJSON(t);default:return Nt(`${Rt("rotation generator",t)}; using a random rotation.`),new se}}class re{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 re(Wt(t.x),Wt(t.y),Wt(t.z))}clone(){return new re(this.x.clone(),this.y.clone(),this.z.clone())}}function oe(t){return"Vector3Function"===t?.type?re.fromJSON(t):(Nt(`${Rt("vector generator",t)}; using a zero vector.`),new re(new Dt(0),new Dt(0),new Dt(0)))}function ae(t){switch(t?.type){case"ConstantValue":case"IntervalValue":case"PiecewiseBezier":return Wt(t);case"AxisAngle":case"RandomQuat":case"Euler":return ne(t);case"Vector3Function":return oe(t);default:return Nt(`${Rt("generator",t)}; using 0.`),new Dt(0)}}function he(t,e){return"world"===t||"local"===t?t:e}function le(t){return 0===t?0:1/t}class ce{constructor(){this.position=new it,this.quaternion=new et,this.scale=new it(1,1,1),this.quaternionInverse=new et,this.scaleInverse=new it(1,1,1)}refresh(t){t.emitter.matrixWorld.decompose(this.position,this.quaternion,this.scale),this.quaternionInverse.copy(this.quaternion).invert(),this.scaleInverse.set(le(this.scale.x),le(this.scale.y),le(this.scale.z))}toSimulation(t,e,i){return i&&"local"===e?t.multiply(this.scale).applyQuaternion(this.quaternion):i||"world"!==e||t.applyQuaternion(this.quaternionInverse).multiply(this.scaleInverse),t}pointToSimulation(t,e,i){return i&&"local"===e?t.multiply(this.scale).applyQuaternion(this.quaternion).add(this.position):i||"world"!==e||t.sub(this.position).applyQuaternion(this.quaternionInverse).multiply(this.scaleInverse),t}}class ue{constructor(t,e,i="world"){this.direction=t,this.magnitude=e,this.space=i,this.type="ApplyForce",this._frame=new ce,this._direction=new it,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 i=this.magnitude.genValue(t.memory)*this._step(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.magnitude,n=this._direction,r=this._step(i),o=s instanceof Dt,a=o?s.value*r:0;for(let i=0;i<e;i++){const e=t[i];if(e.age>=e.life)continue;const h=o?a:s.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 ue(Ut(t.direction,new it(0,0,0)),Wt(t.magnitude??t.force),he(t.space,"world"))}clone(){return new ue(this.direction.clone(),this.magnitude.clone(),this.space)}reset(){}}class de{constructor(t=0,e=0,i=new it){this.scaleX=t,this.scaleY=e,this.position=i,this.locations=[]}transform(t,e){const i=this.locations.length;if(0===i)return;const s=this.locations[e%i];t.x=s.x*this.scaleX+this.position.x,t.y=s.y*this.scaleY+this.position.y,t.z=this.position.z}static fromJSON(t){const e=t.position,i=Array.isArray(e)?new it(e[0],e[1],e[2]):new it(e?.x??0,e?.y??0,e?.z??0),s=new de(t.scaleX??0,t.scaleY??0,i);return s.locations=(t.locations??[]).map(t=>new Mt(t.x,t.y)),s}clone(){const t=new de(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 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 Mt(i,n.height-t))}}function fe(t){switch(t?.type){case void 0:return null==t?void Nt(`${Rt("sequencer",t)}; skipping it.`):de.fromJSON(t);case"TextureSequencer":return de.fromJSON(t);default:return void Nt(`${Rt("sequencer",t)}; skipping it.`)}}class me{constructor(t){this.type="ApplySequences",this.sequencers=[],this.time=0,this.index=0,this.pCount=0,this.tempV=new it,this.delay=t}initialize(t){t.id=this.pCount,t.dst=new it,t.begin=new it,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,me.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 me("number"==typeof t.delay?t.delay:0);return(Array.isArray(t.sequencers)?t.sequencers:[]).forEach(t=>{const i=fe(t.sequencer);void 0!==i&&e.sequencers.push([Wt(t.range),i])}),e}clone(){const t=new me(this.delay);return t.sequencers=this.sequencers.map(t=>[t[0].clone(),t[1].clone()]),t}}me.BEZIER=new Lt(0,0,1,1);class pe{constructor(t){this.angle=t,this.type="ChangeEmitDirection",this._temp=new it,this._q=new et,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,z()*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(Wt(t.angle))}clone(){return new pe(this.angle.clone())}reset(){this.memory.length=0}}function ye(t,e){const i=t.velocity.length()*t.speedModifier,s=e.b-e.a;if(0===s)return i>=e.a?1:0;const n=(i-e.a)/s;return n<0?0:n>1?1:n}class ge{constructor(t,e){this.color=t,this.speedRange=e,this.type="ColorBySpeed"}initialize(t){this.color.startGen(t.memory)}update(t,e){const i=ye(t,this.speedRange);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 ge(ee(t.color),t.speedRange?kt.fromJSON(t.speedRange):new kt(0,1))}clone(){return new ge(this.color.clone(),this.speedRange.clone())}reset(){}}class ve{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 ve(ee(t.color))}clone(){return new ve(this.color.clone())}reset(){}}class xe{constructor(t=64){this.previousVelocity=xe.EMPTY,this.rotationQuaternion=xe.EMPTY,this.angularVelocityQuaternion=xe.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*xe.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=xe.grow(this.position,3*e),this.previousPosition=xe.grow(this.previousPosition,3*e);const i=this.previousSize===this.size,s=this.previousColor===this.color;if(i||(this.previousSize=xe.grow(this.previousSize,3*e)),this.previousVelocity.length>0&&(this.previousVelocity=xe.grow(this.previousVelocity,3*e)),this.rotationQuaternion.length>0){const t=this.rotationQuaternion.length;this.rotationQuaternion=xe.grow(this.rotationQuaternion,4*e),this.angularVelocityQuaternion=xe.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=xe.grow(this.previousColor,4*e)),this.velocity=xe.grow(this.velocity,3*e),this.size=xe.grow(this.size,3*e),this.startSize=xe.grow(this.startSize,3*e),this.color=xe.grow(this.color,4*e),i&&(this.previousSize=this.size),s&&(this.previousColor=this.color),this.startColor=xe.grow(this.startColor,4*e),this.scalars=xe.growDouble(this.scalars,e*xe.SCALAR_STRIDE),this.memoryStride>0){const t=new Float64Array(e*this.memoryStride);t.fill(NaN),t.set(this.memory),this.memory=t}this.rotation=xe.grow(this.rotation,e),this.angularVelocity=xe.grow(this.angularVelocity,e),this.uvTile=xe.grow(this.uvTile,e),this.startSpeed=xe.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;xe.swap3(this.position,i,s),xe.swap3(this.previousPosition,i,s),this.previousSize!==this.size&&xe.swap3(this.previousSize,i,s),this.previousVelocity.length>0&&xe.swap3(this.previousVelocity,i,s),xe.swap3(this.velocity,i,s),xe.swap3(this.size,i,s),xe.swap3(this.startSize,i,s);const n=4*t,r=4*e;xe.swap4(this.color,n,r),this.previousColor!==this.color&&xe.swap4(this.previousColor,n,r),xe.swap4(this.startColor,n,r),this.rotationQuaternion.length>0&&(xe.swap4(this.rotationQuaternion,n,r),xe.swap4(this.angularVelocityQuaternion,n,r)),xe.swap3(this.scalars,t*xe.SCALAR_STRIDE,e*xe.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}}xe.swap1(this.rotation,t,e),xe.swap1(this.angularVelocity,t,e),xe.swap1(this.uvTile,t,e),xe.swap1(this.startSpeed,t,e),xe.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){xe.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}}xe.EMPTY=new Float32Array(0),xe.SCALAR_STRIDE=3,xe.AGE=0,xe.LIFE=1,xe.SPEED_MODIFIER=2;class Se{constructor(t){this.data=t,this.next=null,this.prev=null}hasPrev(){return null!==this.prev}hasNext(){return null!==this.next}}class be{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 Se(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 Se(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 Se(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 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 bt(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 bt(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 xe(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 _t(t.position,i),this.previousPosition=new _t(t.previousPosition,i),this.previousVelocity=new _t(t.previousVelocity,i),this.velocity=new _t(t.velocity,i),this.size=new _t(t.size,i),this.startSize=new _t(t.startSize,i),this.color=new Ot(t.color,s),this.startColor=new Ot(t.startColor,s),this.scalars=t.scalars,this.scalarOffset=e*xe.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*xe.SCALAR_STRIDE}get died(){return this.age>=this.life}reset(){this.memory.length=0}}const Me=new Float32Array(0);class ze{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 be)}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 xe(1),e=0){this.length=30,this._previous=void 0,this.historyPositions=Me,this.historySizes=Me,this.historyBaseSizes=Me,this.headWidthScale=1,this.historyColors=Me,this.historySides=Me,this.historyAges=Me,this.historyDistances=Me,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 _t(t.position,i),this.previousPosition=new _t(t.previousPosition,i),this.previousVelocity=new _t(t.previousVelocity,i),this.velocity=new _t(t.velocity,i),this.size=new _t(t.size,i),this.startSize=new _t(t.startSize,i),this.color=new Ot(t.color,s),this.startColor=new Ot(t.startColor,s),this.scalars=t.scalars,this.scalarOffset=e*xe.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*xe.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 i=this.historyCapacity,s=this.store,n=this.storeIndex,r=n*xe.SCALAR_STRIDE,o=s.scalars[r+xe.AGE];if(o>=s.scalars[r+xe.LIFE])return void this.dropOldest();const a=t&&this.historyCount>0,h=a?(this.historyHead+i-1)%i:this.historyHead,l=3*h,c=this.historyPositions,u=s.position,d=3*n;c[l]=u[d],c[l+1]=u[d+1],c[l+2]=u[d+2];const f=s.size[d];this.historyBaseSizes[h]=f,this.historySizes[h]=f*this.headWidthScale;const m=4*h,p=this.historyColors,y=s.color,g=4*n;p[m]=y[g],p[m+1]=y[g+1],p[m+2]=y[g+2],p[m+3]=y[g+3],this.historyAges[h]=o,a||(this.historyHead=(h+1)%i,this.historyCount<i&&this.historyCount++),e&&this.measureHeadDistance()}measureHeadDistance(){const t=this.historyCount;if(0===t)return;const e=this.historyCapacity,i=(this.historyHead+e-1)%e;if(1===t)return void(this.historyDistances[i]=0);const s=(i+e-1)%e,n=this.historyPositions,r=n[3*i]-n[3*s],o=n[3*i+1]-n[3*s+1],a=n[3*i+2]-n[3*s+2];this.historyDistances[i]=this.historyDistances[s]+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 _e(t,e){return Math.floor(z()*(e-t))+t}const Ve=new it(0,1,0),Ae=new it(0,0,0),Te=new it(1,1,1),Oe=new it(0,0,1),$e=1e-6;var Pe;t.SubParticleEmitMode=void 0,(Pe=t.SubParticleEmitMode||(t.SubParticleEmitMode={}))[Pe.Death=0]="Death",Pe[Pe.Birth=1]="Birth",Pe[Pe.Frame=2]="Frame";const Ce={color:1,size:2,rotation:4,lifetime:8};function Be(t){let e=0;for(const i of t)e|=Ce[i]??0;return e}class Ee{constructor(e,i,s,n=t.SubParticleEmitMode.Frame,r=1,o=[]){this.particleSystem=e,this.useVelocityAsBasis=i,this.subParticleSystem=s,this.mode=n,this.emitProbability=r,this.inherit=o,this.type="EmitSubParticleSystem",this.q_=new et,this.v_=new it,this.v2_=new it,this.v3_=new it,this.subEmissions=new Array,this.spareEmissions=new Array;const a=this.target;a&&(a.onlyUsedByOther=!0)}initialize(t){}update(e,i){(this.mode===t.SubParticleEmitMode.Frame||this.mode===t.SubParticleEmitMode.Birth&&0===e.age||this.mode===t.SubParticleEmitMode.Death&&e.age+i>=e.life)&&this.emit(e,i)}get target(){const t=this.subParticleSystem;if(null===t||"object"!=typeof t)return;const e=t.system;return e?.isDisposed?void 0:e}emit(e,i){if(!this.target)return;if(z()>this.emitProbability)return;const s=this.spareEmissions.pop(),n=void 0!==s?s:{burstParticleCount:0,burstParticleIndex:0,isBursting:!1,burstIndex:0,burstWaveIndex:0,time:0,waitEmiting:0,matrix:new at,travelDistance:0,particle:void 0,serial:void 0,previousWorldPos:void 0};n.burstParticleCount=0,n.burstParticleIndex=0,n.isBursting=!1,n.burstIndex=0,n.burstWaveIndex=0,n.time=0,n.waitEmiting=0,n.travelDistance=0,this.mode===t.SubParticleEmitMode.Death?(n.particle=Ee.copyInto(n.ghost??(n.ghost=new we),e),n.serial=void 0):(n.particle=e,n.serial=e.serial),n.inherit=Be(this.inherit),this.mode===t.SubParticleEmitMode.Death&&(n.inherit&=~Ce.lifetime),n.previousWorldPos=void 0,this.setMatrixFromParticle(n.matrix,e),this.subEmissions.push(n)}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,t.matrix=new at,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],n=s.particle;void 0!==n&&n===s.ghost||(void 0!==n&&n.age<n.life&&n.serial===s.serial?this.setMatrixFromParticle(s.matrix,n):s.particle=void 0),e.emit(t,s,s.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 Ce):[]}setMatrixFromParticle(t,e){let i;if(void 0===e.rotation||this.useVelocityAsBasis){const i=e.position,s=this.v3_.copy(e.velocity),n=s.length(),r=this.v_,o=this.v2_;if(n<$e)r.set(1,0,0),o.set(0,1,0),s.set(0,0,1);else if(s.divideScalar(n),Math.abs(s.x)<$e&&Math.abs(s.y)<$e){const t=s.z>0?1:-1;r.set(1,0,0),o.set(0,t,0),s.set(0,0,t)}else r.copy(Oe).cross(s).normalize(),o.copy(s).cross(r);t.set(r.x,o.x,s.x,i.x,r.y,o.y,s.y,i.y,r.z,o.z,s.z,i.z,0,0,0,1)}else e.rotation instanceof et?i=e.rotation:(this.q_.setFromAxisAngle(Oe,e.rotation),i=this.q_),t.compose(e.position,i,Te);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,i,s="world"){this.x=t,this.y=e,this.z=i,this.space=s,this.type="ForceOverLife",this._temp=new it,this._frame=new ce}_step(t){const e=this.ps;return(void 0===e||e.worldSpace)&&"world"===this.space?t*(e?.motionScale??1):t}update(t,e){const i=t.age/t.life;this._temp.set(this.x.genValue(t.memory,i),this.y.genValue(t.memory,i),this.z.genValue(t.memory,i));const s=void 0===this.ps||this.ps.worldSpace;this._frame.toSimulation(this._temp,this.space,s),t.velocity.addScaledVector(this._temp,this._step(e))}updateAll(t,e,i){const s=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(i);for(let i=0;i<e;i++){const e=t[i];if(e.age>=e.life)continue;const d=e.memory,f=e.age/e.life;s.set(n.genValue(d,f),r.genValue(d,f),o.genValue(d,f)),c&&a.toSimulation(s,h,l),e.velocity.addScaledVector(s,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(Wt(t.x),Wt(t.y),Wt(t.z),he(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 Ie{constructor(t,e={}){this.type="FrameOverLife",this.salt=new kt(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(Ie.hash(r,this.saltOf(t))*n):(n>0&&(r=this.loop?Ie.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=Ie.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 Ie(Wt(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?Wt(t.startFrame):void 0})}clone(){return new Ie(this.frame.clone(),{fps:this.fps,cycles:this.cycles,frameCount:this.frameCount,loop:this.loop,random:this.random,startFrame:this.startFrame?.clone()})}reset(){}}class Ne{constructor(t,e){this.center=t,this.magnitude=e,this.type="GravityForce",this.temp=new it}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 Ne(Ut(t.center,new it(0,0,0)),"number"==typeof t.magnitude?t.magnitude:0)}clone(){return new Ne(this.center.clone(),this.magnitude)}reset(){}}class Ue{constructor(t=new Dt(1),e="initial"){this.multiplier=t,this.mode=e,this.type="InheritVelocity",this._temp=new it,this._tempPos=new it,this._tempQInv=new et,this._tempScaleInv=new it(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?Wt(t.multiplier):new Dt(1),"current"===t.mode?"current":"initial")}clone(){return new Ue(this.multiplier.clone(),this.mode)}reset(){}}class Re{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 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.dampenStep(e))}}updateAll(t,e,i){const s=this.speed,n=this.dampenStep(i),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 Re(Wt(t.speed),"number"==typeof t.dampen?t.dampen:1)}frameUpdate(t){this.speed.refreshTable?.()}clone(){return new Re(this.speed.clone(),this.dampen)}reset(){}}const De=.5*(Math.sqrt(3)-1),ke=(3-Math.sqrt(3))/6,Le=1/3,qe=1/6,Je=(Math.sqrt(5)-1)/4,We=(5-Math.sqrt(5))/20,Ge=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]),Qe=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 je{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)*De,h=Math.floor(t+a),l=Math.floor(e+a),c=(h+l)*ke,u=t-(h-c),d=e-(l-c);let f,m;u>d?(f=1,m=0):(f=0,m=1);const p=u-f+ke,y=d-m+ke,g=u-1+2*ke,v=d-1+2*ke,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*(Ge[t]*u+Ge[t+1]*d)}let w=.5-p*p-y*y;if(w>=0){const t=3*i[x+f+s[S+m]];w*=w,r=w*w*(Ge[t]*p+Ge[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*(Ge[t]*g+Ge[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)*Le,c=Math.floor(t+l),u=Math.floor(e+l),d=Math.floor(i+l),f=(c+u+d)*qe,m=t-(c-f),p=e-(u-f),y=i-(d-f);let g,v,x,S,b,w;m>=p?p>=y?(g=1,v=0,x=0,S=1,b=1,w=0):m>=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):p<y?(g=0,v=0,x=1,S=0,b=1,w=1):m<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=m-g+qe,z=p-v+qe,_=y-x+qe,V=m-S+2*qe,A=p-b+2*qe,T=y-w+2*qe,O=m-1+.5,$=p-1+.5,P=y-1+.5,C=255&c,B=255&u,E=255&d;let F=.6-m*m-p*p-y*y;if(F<0)r=0;else{const t=3*s[C+n[B+n[E]]];F*=F,r=F*F*(Ge[t]*m+Ge[t+1]*p+Ge[t+2]*y)}let I=.6-M*M-z*z-_*_;if(I<0)o=0;else{const t=3*s[C+g+n[B+v+n[E+x]]];I*=I,o=I*I*(Ge[t]*M+Ge[t+1]*z+Ge[t+2]*_)}let N=.6-V*V-A*A-T*T;if(N<0)a=0;else{const t=3*s[C+S+n[B+b+n[E+w]]];N*=N,a=N*N*(Ge[t]*V+Ge[t+1]*A+Ge[t+2]*T)}let U=.6-O*O-$*$-P*P;if(U<0)h=0;else{const t=3*s[C+1+n[B+1+n[E+1]]];U*=U,h=U*U*(Ge[t]*O+Ge[t+1]*$+Ge[t+2]*P)}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)*Je,u=Math.floor(t+c),d=Math.floor(e+c),f=Math.floor(i+c),m=Math.floor(s+c),p=(u+d+f+m)*We,y=t-(u-p),g=e-(d-p),v=i-(f-p),x=s-(m-p);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,A=M>=3?1:0,T=S>=2?1:0,O=b>=2?1:0,$=w>=2?1:0,P=M>=2?1:0,C=S>=1?1:0,B=b>=1?1:0,E=w>=1?1:0,F=M>=1?1:0,I=y-z+We,N=g-_+We,U=v-V+We,R=x-A+We,D=y-T+2*We,k=g-O+2*We,L=v-$+2*We,q=x-P+2*We,J=y-C+3*We,W=g-B+3*We,G=v-E+3*We,Q=x-F+3*We,j=y-1+4*We,Y=g-1+4*We,H=v-1+4*We,X=x-1+4*We,Z=255&u,K=255&d,tt=255&f,et=255&m;let it=.6-y*y-g*g-v*v-x*x;if(it<0)r=0;else{const t=n[Z+n[K+n[tt+n[et]]]]%32*4;it*=it,r=it*it*(Qe[t]*y+Qe[t+1]*g+Qe[t+2]*v+Qe[t+3]*x)}let st=.6-I*I-N*N-U*U-R*R;if(st<0)o=0;else{const t=n[Z+z+n[K+_+n[tt+V+n[et+A]]]]%32*4;st*=st,o=st*st*(Qe[t]*I+Qe[t+1]*N+Qe[t+2]*U+Qe[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*(Qe[t]*D+Qe[t+1]*k+Qe[t+2]*L+Qe[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+B+n[tt+E+n[et+F]]]]%32*4;rt*=rt,h=rt*rt*(Qe[t]*J+Qe[t+1]*W+Qe[t+2]*G+Qe[t+3]*Q)}let ot=.6-j*j-Y*Y-H*H-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*(Qe[t]*j+Qe[t+1]*Y+Qe[t+2]*H+Qe[t+3]*X)}return 27*(r+o+a+h+l)}}const Ye=100,He=new Array(Ye),Xe=new it,Ze=new et;function Ke(t){let e=He[t];return void 0===e&&(e=new je(t),He[t]=e),e}class ti{constructor(t,e,i=new Dt(1),s=new Dt(0),n=new Dt(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 it,lastRot:0,lastRotQ:e?null:new et,generatorX:Ke(_e(0,Ye)),generatorY:Ke(_e(0,Ye)),generatorZ:Ke(_e(0,Ye)),generatorW:Ke(_e(0,Ye))},void(t._noiseState=i);i.lastPos.set(0,0,0),i.lastRot=0,e?i.lastRotQ=null:null===i.lastRotQ?i.lastRotQ=new et:i.lastRotQ.set(0,0,0,1),i.generatorX=Ke(_e(0,Ye)),i.generatorY=Ke(_e(0,Ye)),i.generatorZ=Ke(_e(0,Ye)),i.generatorW=Ke(_e(0,Ye))}static constantOf(t){return t instanceof Dt?t.value:NaN}rotateByNoise(t,e,i,s,n){const r=e.lastRotQ;t.multiply(r.invert()),Xe.set(this.sample(e.generatorX,i,n),this.sample(e.generatorY,i,n),this.sample(e.generatorZ,i,n));const o=Xe.length();o>0?(Xe.multiplyScalar(1/o),Ze.setFromAxisAngle(Xe,this.sample(e.generatorW,i,n)*Math.PI*s)):Ze.set(0,0,0,1),t.multiply(Ze),r.copy(Ze)}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),Xe.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(Xe),i.lastPos.copy(Xe)}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 null!==i.lastRotQ&&this.rotateByNoise(t.rotation,i,f,e,s)}}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=xe.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],m=f._noiseState;if(void 0===m)continue;const p=f.memory,y=e/a,g=h==h?h:this.frequency.genValue(p,y),v=l==l?l:this.power.genValue(p,y),x=c==c?c:this.positionAmount.genValue(p,y),S=u==u?u:this.rotationAmount.genValue(p,y),b=e*g+this.scrollOffset;if(x>0){const t=v*x,e=m.lastPos,i=this.sample(m.generatorX,b,p)*t,r=this.sample(m.generatorY,b,p)*t,o=this.sample(m.generatorZ,b,p)*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(m.generatorW,b,p)*Math.PI*t;r[i]=r[i]-m.lastRot+e,m.lastRot=e}else null!==m.lastRotQ&&this.rotateByNoise(f.rotation,m,b,t,p)}}}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=ti.constantOf(this.frequency),this._power=ti.constantOf(this.power),this._positionAmount=ti.constantOf(this.positionAmount),this._rotationAmount=ti.constantOf(this.rotationAmount)}static fromJSON(t){return new ti(Wt(t.frequency),Wt(t.power),t.positionAmount?Wt(t.positionAmount):void 0,t.rotationAmount?Wt(t.rotationAmount):void 0,t.scrollSpeed?Wt(t.scrollSpeed):new Dt(0),t.remap?Wt(t.remap):void 0)}clone(){return new ti(this.frequency.clone(),this.power.clone(),this.positionAmount.clone(),this.rotationAmount.clone(),this.scrollSpeed.clone(),this.remap?.clone())}reset(){this.scrollOffset=0}}class ei{constructor(t,e=new it(0,1,0),i="local"){this.orbitSpeed=t,this.axis=e,this.space=i,this.type="OrbitOverLife",this.temp=new it,this._frame=new ce,this._axis=new it(0,1,0),this._center=new it,this.rotation=new et,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 i=this.ps.worldSpace;this._frame.toSimulation(t,this.space,i),this._frame.pointToSimulation(e,this.space,i)}const i=t.length();i>0?t.multiplyScalar(1/i):t.set(0,0,0)}converts(){return void 0!==this.ps&&this.ps.worldSpace!==("world"===this.space)}update(t,e){const i=this._axis;if(0===i.x&&0===i.y&&0===i.z)return;const s=t.position;s.sub(this._center),this.temp.copy(s).projectOnVector(i),this.rotation.setFromAxisAngle(i,this.orbitSpeed.genValue(t.memory,t.age/t.life)*e),s.sub(this.temp),s.applyQuaternion(this.rotation),s.add(this.temp),s.add(this._center)}updateAll(t,e,i){const s=this._axis;if(0===s.x&&0===s.y&&0===s.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(s),a.setFromAxisAngle(s,n.genValue(e.memory,e.age/e.life)*i),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 ei(Wt(t.orbitSpeed),t.axis?new it(t.axis[0],t.axis[1],t.axis[2]):void 0,he(t.space,"local"))}clone(){return new ei(this.orbitSpeed.clone(),this.axis.clone(),this.space)}reset(){}}class ii{constructor(t){this.angularVelocity=t,this.type="Rotation3DOverLife",this.tempQuat=new et}initialize(t){t.rotation instanceof et&&(t.angularVelocity=new et,this.angularVelocity.startGen(t.memory))}update(t,e){if(t.rotation instanceof et){this.angularVelocity.genValue(t.memory,this.tempQuat,e,t.age/t.life),t.rotation.multiply(this.tempQuat);const i=t.angularVelocity;i instanceof et&&i.copy(this.tempQuat)}}toJSON(){return{type:this.type,angularVelocity:this.angularVelocity.toJSON()}}static fromJSON(t){return new ii(ne(t.angularVelocity))}frameUpdate(t){}clone(){return new ii(this.angularVelocity.clone())}reset(){}}class si{constructor(t,e){this.angularVelocity=t,this.speedRange=e,this.type="RotationBySpeed",this.tempQuat=new et}initialize(t){"number"==typeof t.rotation&&this.angularVelocity.startGen(t.memory)}update(t,e){if("number"==typeof t.rotation){const i=ye(t,this.speedRange),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 si(Wt(t.angularVelocity),t.speedRange?kt.fromJSON(t.speedRange):new kt(0,1))}frameUpdate(t){}clone(){return new si(this.angularVelocity.clone(),this.speedRange.clone())}reset(){}}class ni{constructor(t){this.angularVelocity=t,this.type="RotationOverLife",this.tempQuat=new et}initialize(t){"number"==typeof t.rotation?this.angularVelocity.startGen(t.memory):t.rotation instanceof et&&(this.angularVelocity.startGen(t.memory),t.angularVelocity instanceof et||(t.angularVelocity=new et))}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 et){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 et){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(Oe,i);e.multiply(s);const n=t.angularVelocity;n instanceof et&&n.copy(s)}toJSON(){return{type:this.type,angularVelocity:this.angularVelocity.toJSON()}}static fromJSON(t){return new ni(Wt(t.angularVelocity))}frameUpdate(t){this.angularVelocity.refreshTable?.()}clone(){return new ni(this.angularVelocity.clone())}reset(){}}class ri{initialize(t){this.size.startGen(t.memory)}constructor(t,e){this.size=t,this.speedRange=e,this.type="SizeBySpeed"}update(t){const e=ye(t,this.speedRange);this.size instanceof re?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 ri(ae(t.size),t.speedRange?kt.fromJSON(t.speedRange):new kt(0,1))}frameUpdate(t){}clone(){return new ri(this.size.clone(),this.speedRange.clone())}reset(){}}class oi{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 re}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 oi(ae(t.size))}frameUpdate(t){this._size.refreshTable?.()}clone(){return new oi(this.size.clone())}reset(){}}class ai{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 ai(Wt(t.speed))}frameUpdate(t){this.speed.refreshTable?.()}clone(){return new ai(this.speed.clone())}reset(){}}function hi(t){return 0===t?0:1/t}class li{constructor(t,e,i,s,n=0){this.scale=t,this.octaves=e,this.velocityMultiplier=i,this.timeScale=s,this.seed=n,this.type="TurbulenceField",this.timeOffset=new it,this.initialOffset=new it,this.temp=new it,this.temp2=new it;const r=A(n);this.generator=new je(r),this.initialOffset.set(r()*hi(t.x)*s.x,r()*hi(t.y)*s.y,r()*hi(t.z)*s.z),this.timeOffset.copy(this.initialOffset)}initialize(t){}update(t,e){const i=t.position.x*hi(this.scale.x),s=t.position.y*hi(this.scale.y),n=t.position.z*hi(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=xe.SCALAR_STRIDE,h=this.generator,l=this.octaves,c=hi(this.scale.x),u=hi(this.scale.y),d=hi(this.scale.z),f=this.velocityMultiplier.x*i,m=this.velocityMultiplier.y*i,p=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*m,r[i+2]+=b*p}}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 li(Ut(t.scale,new it(1,1,1)),"number"==typeof t.octaves?t.octaves:1,Ut(t.velocityMultiplier,new it(1,1,1)),Ut(t.timeScale,new it(1,1,1)),"number"==typeof t.seed?t.seed:0)}clone(){return new li(this.scale.clone(),this.octaves,this.velocityMultiplier.clone(),this.timeScale.clone(),this.seed)}reset(){this.timeOffset.copy(this.initialOffset)}}const ci=new it(1,0,0),ui=new it(0,1,0),di=new it(0,0,1);class fi{constructor(t=new Dt(0),e=new Dt(0),i=new Dt(0),s=new Dt(0),n=new Dt(0),r=new Dt(0),o="local",a=new Dt(0),h=new it){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 it,this._tempEmitterPos=new it,this._tempQ=new et,this._tempQInv=new et,this._tempScale=new it(1,1,1),this._tempScaleInv=new it(1,1,1),this._tempRot=new et,this._axisX=new it(1,0,0),this._axisY=new it(0,1,0),this._axisZ=new it(0,0,1),this._center=new it}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(ci),this._axisY.copy(ui),this._axisZ.copy(di),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?Wt(t):new Dt(0);return new fi(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 it(t.orbitalOffset[0]??0,t.orbitalOffset[1]??0,t.orbitalOffset[2]??0):new it)}clone(){return new fi(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 mi{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 ze))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/i,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 mi(Wt(t.width),t.absolute??!0)}clone(){return new mi(this.width.clone(),this.absolute)}reset(){}}const pi={ApplyForce:{type:"ApplyForce",constructor:ue,params:[["direction",["vec3"]],["magnitude",["value"]],["space",["string"]]],loadJSON:ue.fromJSON},Noise:{type:"Noise",constructor:ti,params:[["frequency",["value"]],["power",["value"]],["positionAmount",["value"]],["rotationAmount",["value"]],["scrollSpeed",["value"]],["remap",["valueFunc"]]],loadJSON:ti.fromJSON},TurbulenceField:{type:"TurbulenceField",constructor:li,params:[["scale",["vec3"]],["octaves",["number"]],["velocityMultiplier",["vec3"]],["timeScale",["vec3"]],["seed",["number"]]],loadJSON:li.fromJSON},GravityForce:{type:"GravityForce",constructor:Ne,params:[["center",["vec3"]],["magnitude",["number"]]],loadJSON:Ne.fromJSON},ColorOverLife:{type:"ColorOverLife",constructor:ve,params:[["color",["colorFunc"]]],loadJSON:ve.fromJSON},RotationOverLife:{type:"RotationOverLife",constructor:ni,params:[["angularVelocity",["value","valueFunc"]]],loadJSON:ni.fromJSON},Rotation3DOverLife:{type:"Rotation3DOverLife",constructor:ii,params:[["angularVelocity",["rotationFunc"]]],loadJSON:ii.fromJSON},SizeOverLife:{type:"SizeOverLife",constructor:oi,params:[["size",["value","valueFunc","vec3Func"]]],loadJSON:oi.fromJSON},ColorBySpeed:{type:"ColorBySpeed",constructor:ge,params:[["color",["colorFunc"]],["speedRange",["range"]]],loadJSON:ge.fromJSON},RotationBySpeed:{type:"RotationBySpeed",constructor:si,params:[["angularVelocity",["value","valueFunc"]],["speedRange",["range"]]],loadJSON:si.fromJSON},SizeBySpeed:{type:"SizeBySpeed",constructor:ri,params:[["size",["value","valueFunc","vec3Func"]],["speedRange",["range"]]],loadJSON:ri.fromJSON},SpeedOverLife:{type:"SpeedOverLife",constructor:ai,params:[["speed",["value","valueFunc"]]],loadJSON:ai.fromJSON},FrameOverLife:{type:"FrameOverLife",constructor:Ie,params:[["frame",["value","valueFunc"]],["fps",["number"]],["cycles",["number"]],["frameCount",["number"]],["loop",["boolean"]],["random",["boolean"]],["startFrame",["value"]]],loadJSON:Ie.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:fi,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:fi.fromJSON},InheritVelocity:{type:"InheritVelocity",constructor:Ue,params:[["multiplier",["value","valueFunc"]],["mode",["string"]]],loadJSON:Ue.fromJSON},OrbitOverLife:{type:"OrbitOverLife",constructor:ei,params:[["orbitSpeed",["value","valueFunc"]],["axis",["vec3"]],["space",["string"]]],loadJSON:ei.fromJSON},WidthOverLength:{type:"WidthOverLength",constructor:mi,params:[["width",["value","valueFunc"]],["absolute",["boolean"]]],loadJSON:mi.fromJSON},ChangeEmitDirection:{type:"ChangeEmitDirection",constructor:pe,params:[["angle",["value"]]],loadJSON:pe.fromJSON},ApplySequences:{type:"ApplySequences",constructor:me,params:[["delay",["number"]]],loadJSON:me.fromJSON},EmitSubParticleSystem:{type:"EmitSubParticleSystem",constructor:Ee,params:[["particleSystem",["self"]],["useVelocityAsBasis",["boolean"]],["subParticleSystem",["particleSystem"]],["mode",["number"]],["emitProbability",["number"]]],loadJSON:Ee.fromJSON},LimitSpeedOverLife:{type:"LimitSpeedOverLife",constructor:Re,params:[["speed",["value","valueFunc"]],["dampen",["number"]]],loadJSON:Re.fromJSON},ApplyCollision:{type:"ApplyCollision",constructor:Ct,params:[["bounce",["number"]]],loadJSON:Ct.fromJSON}};function yi(t,e){const i=t?pi[t.type]:void 0;return i?i.loadJSON(t,e):(Nt(`${Rt("behavior",t)}; it is skipped.`),null)}const gi={PiecewiseBezier:Jt,Vector3Function:re,Quaternion:et,ConstantValue:Dt,Gradient:Ht,Vector4View:Ot,AxisAngleGenerator:Gt,IntervalValue:kt,ColorRange:Qt};function vi(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 xi(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 Si(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 bi(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 wi(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 Mi(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 zi(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 _i(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 Vi(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 ${Mi("px","py","pz","qx","qy","qz","qw")}\n px = Math.fround(px); py = Math.fround(py); pz = Math.fround(pz);\n }`}function Ai(t,e){switch(t.type){case"ColorOverLife":return{setup:bi(`g${e}`,`behaviors[${e}].color`),body:`{${wi(`g${e}`,"t")}}`};case"SizeOverLife":return{setup:`const g${e} = behaviors[${e}].size;\n const vec3_${e} = g${e} instanceof deps.Vector3Function;\n ${vi(`sg${e}`,`g${e}`)}`,body:`if (vec3_${e}) {\n g${e}.genValue(p.memory, p.size, t).multiply(p.startSize);\n } else {\n ${Si(`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 ${vi(`g${e}`,`b${e}.magnitude`)}`,body:`{\n ${Si(`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:`${vi(`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 ${Si(`g${e}`,"rate","t")}\n rot[row] += delta * rate;\n angVel[row] = rate;\n } else if (quat_${e}) {\n ${Si(`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:`${vi(`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}) {${Si(`g${e}`,"v","t")} uvTile[row] = v;}\n else uvTile[row] = b${e}.frameAt(p, age, t);`};case"SpeedOverLife":return{setup:vi(`g${e}`,`behaviors[${e}].speed`),body:`{${Si(`g${e}`,"v","t")} scalars[s + 2] = v;}`};case"ForceOverLife":return{setup:`const b${e} = behaviors[${e}];\n ${vi(`gx${e}`,`b${e}.x`)}\n ${vi(`gy${e}`,`b${e}.y`)}\n ${vi(`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 ${_i(`sc${e}`,`toWorld${e} ? fr${e}.scale : fr${e}.scaleInverse`)}\n ${zi(`q${e}`,`toWorld${e} ? fr${e}.quaternion : fr${e}.quaternionInverse`)}`,body:`{\n ${Si(`gx${e}`,"fx","t")}\n ${Si(`gy${e}`,"fy","t")}\n ${Si(`gz${e}`,"fz","t")}\n if (toWorld${e}) {\n fx *= sc${e}x; fy *= sc${e}y; fz *= sc${e}z;\n ${Mi("fx","fy","fz",`q${e}x`,`q${e}y`,`q${e}z`,`q${e}w`)}\n } else if (toLocal${e}) {\n ${Mi("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 ${vi(`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 ${Si(`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 ${bi(`g${e}`,`b${e}.color`)}\n const lo${e} = b${e}.speedRange.a;\n const span${e} = b${e}.speedRange.b - lo${e};`,body:`{${xi(e)}\n ${wi(`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 ${vi(`sg${e}`,`g${e}`)}`,body:`{${xi(e)}\n if (vec3_${e}) {\n g${e}.genValue(p.memory, p.size, ts).multiply(p.startSize);\n } else {\n ${Si(`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 ${vi(`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 ${xi(e)}\n ${Si(`g${e}`,"rate","ts")}\n rot[row] += delta * rate;\n angVel[row] = rate;\n }`};case"OrbitOverLife":return{setup:`const b${e} = behaviors[${e}];\n ${vi(`g${e}`,`b${e}.orbitSpeed`)}\n ${_i(`ax${e}`,`b${e}._axis`)}\n ${_i(`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 ${Si(`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 ${Mi("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 ${vi(`lx${e}`,`b${e}.linearX`)}\n ${vi(`ly${e}`,`b${e}.linearY`)}\n ${vi(`lz${e}`,`b${e}.linearZ`)}\n ${vi(`ox${e}`,`b${e}.orbitalX`)}\n ${vi(`oy${e}`,`b${e}.orbitalY`)}\n ${vi(`oz${e}`,`b${e}.orbitalZ`)}\n ${_i(`aX${e}`,`b${e}._axisX`)}\n ${_i(`aY${e}`,`b${e}._axisY`)}\n ${_i(`aZ${e}`,`b${e}._axisZ`)}\n ${vi(`rd${e}`,`b${e}.radial`)}\n ${_i(`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 ${_i(`sc${e}`,`toWorld${e} ? b${e}._tempScale : b${e}._tempScaleInv`)}\n ${zi(`q${e}`,`toWorld${e} ? b${e}._tempQ : b${e}._tempQInv`)}`,body:`{\n ${Si(`lx${e}`,"fx","t")}\n ${Si(`ly${e}`,"fy","t")}\n ${Si(`lz${e}`,"fz","t")}\n if (convert${e}) {\n fx *= sc${e}x; fy *= sc${e}y; fz *= sc${e}z;\n ${Mi("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 ${Si(`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 ${Si(`ox${e}`,"rx","t")}\n ${Si(`oy${e}`,"ry","t")}\n ${Si(`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) ${Vi("rx",`aX${e}x`,`aX${e}y`,`aX${e}z`)}\n if (ry !== 0) ${Vi("ry",`aY${e}x`,`aY${e}y`,`aY${e}z`)}\n if (rz !== 0) ${Vi("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 ${_i(`sc${e}`,`b${e}._tempScaleInv`)}\n ${zi(`q${e}`,`b${e}._tempQInv`)}\n ivx${e} *= sc${e}x; ivy${e} *= sc${e}y; ivz${e} *= sc${e}z;\n ${Mi(`ivx${e}`,`ivy${e}`,`ivz${e}`,`q${e}x`,`q${e}y`,`q${e}z`,`q${e}w`)}\n }\n }\n ${vi(`gm${e}`,`b${e}.multiplier`)}`,body:`if (active${e}) {\n ${Si(`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 Ti=new Map;function Oi(t,e,i){const s=Ti.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}};`)(gi)}catch(t){return}}(t,e);return Ti.set(i,n??null),n}function $i(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=Oi(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=Ai(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}class Pi{constructor(t,e,i){this.position=t??new it,this.rotation=e??new et,this.scale=i??new it(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 Pi(e?new it(e[0],e[1],e[2]):void 0,i?new et(i[0],i[1],i[2],i[3]):void 0,s?new it(s[0],s[1],s[2]):void 0)}static toShapeJSON(t){return t&&!t.isIdentity()?{transform:t.toJSON()}:{}}clone(){return new Pi(this.position.clone(),this.rotation.clone(),this.scale.clone())}}var Ci,Bi;t.BoxEmitFrom=void 0,(Ci=t.BoxEmitFrom||(t.BoxEmitFrom={}))[Ci.Volume=0]="Volume",Ci[Ci.Shell=1]="Shell",Ci[Ci.Edge=2]="Edge";class Ei{constructor(e={}){this.type="box",this._point=[0,0,0],this.width=e.width??1,this.height=e.height??1,this.depth=e.depth??1,this.emitFrom=e.emitFrom??t.BoxEmitFrom.Volume,this.boxThickness=e.boxThickness?[...e.boxThickness]:[0,0,0],this.transform=e.transform}update(t,e){}initialize(e,i){const s=this._point;for(let t=0;t<3;t++)s[t]=2*z()-1;const n=Math.floor(3*z())%3;this.emitFrom===t.BoxEmitFrom.Shell?s[n]=this.onSurface(n):this.emitFrom===t.BoxEmitFrom.Edge&&(s[(n+1)%3]=this.onSurface((n+1)%3),s[(n+2)%3]=this.onSurface((n+2)%3)),e.position.set(s[0]*this.width/2,s[1]*this.height/2,s[2]*this.depth/2),e.velocity.set(0,0,e.startSpeed),this.transform?.apply(e)}onSurface(t){const e=z()<.5?-1:1,i=this.boxThickness[t];return i<=0||z()<.5?e:e*(1-2*i*z())}toJSON(){return{type:"box",width:this.width,height:this.height,depth:this.depth,emitFrom:this.emitFrom,boxThickness:[...this.boxThickness],...Pi.toShapeJSON(this.transform)}}static fromJSON(t){return new Ei({width:t.width,height:t.height,depth:t.depth,emitFrom:t.emitFrom,boxThickness:Array.isArray(t.boxThickness)?t.boxThickness:void 0,transform:Pi.fromJSON(t.transform)})}clone(){return new Ei({width:this.width,height:this.height,depth:this.depth,emitFrom:this.emitFrom,boxThickness:this.boxThickness,transform:this.transform?.clone()})}}function Fi(e,i,s,n){let r;switch(e){case t.EmitterMode.Loop:r=i-Math.floor(i);break;case t.EmitterMode.PingPong:{const t=i-2*Math.floor(i/2);r=1-Math.abs(t-1);break}case t.EmitterMode.Burst:r=n.isBursting&&n.burstParticleCount>0?n.burstParticleIndex/n.burstParticleCount:z();break;default:r=z()}return s>0&&(r=Math.floor(r/s)*s),r}t.EmitterMode=void 0,(Bi=t.EmitterMode||(t.EmitterMode={}))[Bi.Random=0]="Random",Bi[Bi.Loop=1]="Loop",Bi[Bi.PingPong=2]="PingPong",Bi[Bi.Burst=3]="Burst";class Ii{reset(){this.currentValue=0,this.memory.length=0}constructor(e={}){this.type="circle",this.currentValue=0,this.radius=e.radius??10,this.arc=e.arc??2*Math.PI,this.thickness=e.thickness??1,this.mode=e.mode??t.EmitterMode.Random,this.spread=e.spread??0,this.speed=e.speed??new Dt(1),this.memory=[],this.transform=e.transform}update(t,e){this.currentValue+=this.speed.genValue(this.memory,t.emissionState.time/t.duration)*e}initialize(t,e){const i=Fi(this.mode,this.currentValue,this.spread,e),s=tt.lerp(1-this.thickness,1,z()),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(),...Pi.toShapeJSON(this.transform)}}static fromJSON(t){return new Ii({radius:t.radius,arc:t.arc,thickness:t.thickness,mode:t.mode,speed:t.speed?Wt(t.speed):void 0,transform:Pi.fromJSON(t.transform),spread:t.spread})}clone(){return new Ii({radius:this.radius,arc:this.arc,thickness:this.thickness,mode:this.mode,speed:this.speed.clone(),transform:this.transform?.clone(),spread:this.spread})}}class Ni{reset(){this.currentValue=0,this.memory.length=0}constructor(e={}){this.type="cone",this.currentValue=0,this.radius=e.radius??10,this.arc=e.arc??2*Math.PI,this.thickness=e.thickness??1,this.angle=e.angle??Math.PI/6,this.mode=e.mode??t.EmitterMode.Random,this.spread=e.spread??0,this.speed=e.speed??new Dt(1),this.memory=[],this.transform=e.transform}update(e,i){t.EmitterMode.Random!=this.mode&&(this.currentValue+=this.speed.genValue(this.memory,e.emissionState.time/e.duration)*i)}initialize(t,e){const i=Fi(this.mode,this.currentValue,this.spread,e),s=1-tt.clamp(this.thickness,0,1),n=Math.sqrt(tt.lerp(s*s,1,z())),r=i*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(),...Pi.toShapeJSON(this.transform)}}static fromJSON(t){return new Ni({radius:t.radius,arc:t.arc,thickness:t.thickness,angle:t.angle,mode:t.mode,speed:t.speed?Wt(t.speed):void 0,transform:Pi.fromJSON(t.transform),spread:t.spread})}clone(){return new Ni({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 Ui{constructor(e={}){this.type="donut",this.currentValue=0,this.radius=e.radius??10,this.arc=e.arc??2*Math.PI,this.thickness=e.thickness??1,this.donutRadius=e.donutRadius??.2*this.radius,this.mode=e.mode??t.EmitterMode.Random,this.spread=e.spread??0,this.speed=e.speed??new Dt(1),this.memory=[],this.transform=e.transform,this._m1=new at}reset(){this.currentValue=0,this.memory.length=0}update(e,i){t.EmitterMode.Random!=this.mode&&(this.currentValue+=this.speed.genValue(this.memory,e.emissionState.time/e.duration)*i)}initialize(t,e){const i=Fi(this.mode,this.currentValue,this.spread,e),s=z(),n=tt.lerp(1-this.thickness,1,z()),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 et){const e=t.rotation;0===e.x&&0===e.y&&0===e.z&&1===e.w&&(this._m1.lookAt(Ae,t.velocity,Ve),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(),...Pi.toShapeJSON(this.transform)}}static fromJSON(t){return new Ui({radius:t.radius,arc:t.arc,thickness:t.thickness,donutRadius:t.donutRadius,mode:t.mode,speed:t.speed?Wt(t.speed):void 0,transform:Pi.fromJSON(t.transform),spread:t.spread})}clone(){return new Ui({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 Ri{reset(){this.currentValue=0,this.memory.length=0}constructor(e={}){this.type="edge",this.currentValue=0,this.radius=e.radius??1,this.mode=e.mode??t.EmitterMode.Random,this.spread=e.spread??0,this.speed=e.speed??new Dt(1),this.memory=[],this.transform=e.transform}update(e,i){t.EmitterMode.Random!=this.mode&&(this.currentValue+=this.speed.genValue(this.memory,e.emissionState.time/e.duration)*i)}initialize(t,e){const i=Fi(this.mode,this.currentValue,this.spread,e);t.position.set((2*i-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(),...Pi.toShapeJSON(this.transform)}}static fromJSON(t){return new Ri({radius:t.radius,mode:t.mode,speed:t.speed?Wt(t.speed):void 0,spread:t.spread,transform:Pi.fromJSON(t.transform)})}clone(){return new Ri({radius:this.radius,mode:this.mode,speed:this.speed.clone(),spread:this.spread,transform:this.transform?.clone()})}}class Di{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(z()*this.row),i=Math.floor(z()*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,...Pi.toShapeJSON(this.transform)}}static fromJSON(t){return new Di({...t,transform:Pi.fromJSON(t.transform)})}clone(){return new Di({width:this.width,height:this.height,column:this.column,row:this.row,transform:this.transform?.clone()})}update(t,e){}}class ki{constructor(e={}){this.type="hemisphere",this.currentValue=0,this.radius=e.radius??10,this.arc=e.arc??2*Math.PI,this.thickness=e.thickness??1,this.mode=e.mode??t.EmitterMode.Random,this.spread=e.spread??0,this.speed=e.speed??new Dt(1),this.memory=[],this.transform=e.transform,this._m1=new at}reset(){this.currentValue=0,this.memory.length=0}update(e,i){t.EmitterMode.Random!=this.mode&&(this.currentValue+=this.speed.genValue(this.memory,e.emissionState.time/e.duration)*i)}initialize(t,e){const i=Fi(this.mode,this.currentValue,this.spread,e),s=z(),n=tt.lerp(1-this.thickness,1,z()),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 et){const e=t.rotation;0===e.x&&0===e.y&&0===e.z&&1===e.w&&(this._m1.lookAt(Ae,t.position,Ve),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(),...Pi.toShapeJSON(this.transform)}}static fromJSON(t){return new ki({radius:t.radius,arc:t.arc,thickness:t.thickness,mode:t.mode,speed:t.speed?Wt(t.speed):void 0,transform:Pi.fromJSON(t.transform),spread:t.spread})}clone(){return new ki({radius:this.radius,arc:this.arc,thickness:this.thickness,mode:this.mode,speed:this.speed.clone(),transform:this.transform?.clone(),spread:this.spread})}}class Li{constructor(t){this.type="point",this._m1=new at,this.transform=t}update(t,e){}initialize(t){const e=z(),i=z(),s=e*Math.PI*2,n=2*i-1,r=Math.sqrt(Math.max(0,1-n*n));if(t.velocity.x=r*Math.cos(s),t.velocity.y=r*Math.sin(s),t.velocity.z=n,t.velocity.multiplyScalar(t.startSpeed),t.position.setScalar(0),t.rotation instanceof et){const e=t.rotation;0===e.x&&0===e.y&&0===e.z&&1===e.w&&(this._m1.lookAt(Ae,t.velocity,Ve),t.rotation.setFromRotationMatrix(this._m1))}this.transform?.apply(t)}toJSON(){return{type:"point",...Pi.toShapeJSON(this.transform)}}static fromJSON(t){return new Li(Pi.fromJSON(t?.transform))}clone(){return new Li(this.transform?.clone())}}class qi{constructor(e={}){this.type="sphere",this.currentValue=0,this.radius=e.radius??10,this.arc=e.arc??2*Math.PI,this.thickness=e.thickness??1,this.mode=e.mode??t.EmitterMode.Random,this.spread=e.spread??0,this.speed=e.speed??new Dt(1),this.memory=[],this.transform=e.transform,this._m1=new at}reset(){this.currentValue=0,this.memory.length=0}update(e,i){t.EmitterMode.Random!=this.mode&&(this.currentValue+=this.speed.genValue(this.memory,e.emissionState.time/e.duration)*i)}initialize(t,e){const i=Fi(this.mode,this.currentValue,this.spread,e),s=z(),n=tt.lerp(1-this.thickness,1,z()),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 et){const e=t.rotation;0===e.x&&0===e.y&&0===e.z&&1===e.w&&(this._m1.lookAt(Ae,t.position,Ve),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(),...Pi.toShapeJSON(this.transform)}}static fromJSON(t){return new qi({radius:t.radius,arc:t.arc,thickness:t.thickness,mode:t.mode,speed:t.speed?Wt(t.speed):void 0,transform:Pi.fromJSON(t.transform),spread:t.spread})}clone(){return new qi({radius:this.radius,arc:this.arc,thickness:this.thickness,mode:this.mode,speed:this.speed.clone(),transform:this.transform?.clone(),spread:this.spread})}}class Ji{reset(){this.currentValue=0,this.memory.length=0}constructor(e={}){this.type="rectangle",this.currentValue=0,this.width=e.width??10,this.height=e.height??10,this.thickness=e.thickness??1,this.mode=e.mode??t.EmitterMode.Random,this.spread=e.spread??0,this.speed=e.speed??new Dt(1),this.memory=[],this.transform=e.transform,this._m1=new at}update(t,e){this.currentValue+=this.speed.genValue(this.memory,t.emissionState.time/t.duration)*e}initialize(t,e){const i=Fi(this.mode,this.currentValue,this.spread,e);z();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=z(),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 et){const e=t.rotation;0===e.x&&0===e.y&&0===e.z&&1===e.w&&(this._m1.lookAt(Ae,t.velocity,Ve),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(),...Pi.toShapeJSON(this.transform)}}static fromJSON(t){return new Ji({width:t.width,height:t.height,thickness:t.thickness,mode:t.mode,speed:t.speed?Wt(t.speed):void 0,transform:Pi.fromJSON(t.transform),spread:t.spread})}clone(){return new Ji({width:this.width,height:this.height,thickness:this.thickness,mode:this.mode,speed:this.speed.clone(),transform:this.transform?.clone(),spread:this.spread})}}const Wi={box:{type:"box",params:[["width",["number"]],["height",["number"]],["depth",["number"]],["emitFrom",["number"]],["boxThickness",["vec3"]]],constructor:Ei,loadJSON:Ei.fromJSON},circle:{type:"circle",params:[["radius",["number"]],["arc",["radian"]],["thickness",["number"]],["mode",["emitterMode"]],["spread",["number"]],["speed",["valueFunc","value"]]],constructor:Ii,loadJSON:Ii.fromJSON},cone:{type:"cone",params:[["radius",["number"]],["arc",["radian"]],["thickness",["number"]],["angle",["radian"]],["mode",["emitterMode"]],["spread",["number"]],["speed",["valueFunc","value"]]],constructor:Ni,loadJSON:Ni.fromJSON},donut:{type:"donut",params:[["radius",["number"]],["arc",["radian"]],["thickness",["number"]],["donutRadius",["number"]],["mode",["emitterMode"]],["spread",["number"]],["speed",["valueFunc","value"]]],constructor:Ui,loadJSON:Ui.fromJSON},edge:{type:"edge",params:[["radius",["number"]],["mode",["emitterMode"]],["spread",["number"]],["speed",["valueFunc","value"]]],constructor:Ri,loadJSON:Ri.fromJSON},point:{type:"point",params:[],constructor:Li,loadJSON:Li.fromJSON},sphere:{type:"sphere",params:[["radius",["number"]],["arc",["radian"]],["thickness",["number"]],["angle",["radian"]],["mode",["emitterMode"]],["spread",["number"]],["speed",["valueFunc","value"]]],constructor:qi,loadJSON:qi.fromJSON},hemisphere:{type:"hemisphere",params:[["radius",["number"]],["arc",["radian"]],["thickness",["number"]],["angle",["radian"]],["mode",["emitterMode"]],["spread",["number"]],["speed",["valueFunc","value"]]],constructor:ki,loadJSON:ki.fromJSON},grid:{type:"grid",params:[["width",["number"]],["height",["number"]],["rows",["number"]],["column",["number"]]],constructor:Di,loadJSON:Di.fromJSON},rectangle:{type:"rectangle",params:[["width",["number"]],["height",["number"]],["thickness",["number"]],["mode",["emitterMode"]],["spread",["number"]],["speed",["valueFunc","value"]]],constructor:Ji,loadJSON:Ji.fromJSON}};function Gi(t,e){const i=t?Wi[t.type]:void 0;return i?i.loadJSON(t,e):(Nt(`${Rt("emitter shape",t)}; using a point emitter.`),new Li)}const Qi=[];function ji(t){if(!Qi.find(e=>e.id===t.id)){t.initialize(),Qi.push(t);for(const e of t.emitterShapes)Wi[e.type]||(Wi[e.type]=e);for(const e of t.behaviors)pi[e.type]||(pi[e.type]=e)}}function Yi(t){const e=t;return e._quarksUUID??(e._quarksUUID=i.RandomGUID())}class Hi{get mesh(){return this._mesh}set mesh(t){if(this._mesh=t,this._positions=void 0,this._indices=void 0,this._triangleIndexToArea.length=0,!t)return;const i=t.getVerticesData(e.VertexBuffer.PositionKind),s=t.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 it,a=new it,h=new it;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 it;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=z()*this._triangleIndexToArea[e];for(;i+1<s;){const t=Math.floor((i+s)/2);n<this._triangleIndexToArea[t]?s=t:i=t}let r=z(),o=z();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,m=this._positions[3*h+1]-u,p=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+m*r+g*o,d+p*r+v*o);const x=m*v-p*g,S=p*y-f*v,b=f*g-m*y,w=Math.sqrt(x*x+S*S+b*b)||1;t.velocity.set(x/w,S/w,b/w).multiplyScalar(t.startSpeed),this.transform?.apply(t)}toJSON(){return{type:"mesh_surface",mesh:this._mesh?Yi(this._mesh):this._meshReferenceId??"",...Pi.toShapeJSON(this.transform)}}static fromJSON(t){return new Hi(void 0,t?.mesh,Pi.fromJSON(t?.transform))}clone(){return new Hi(this._mesh,this._meshReferenceId,this.transform?.clone())}update(t,e){}}const Xi={id:"babylon.quarks",initialize:()=>{},emitterShapes:[{type:"mesh_surface",params:[["mesh",["mesh"]]],constructor:Hi,loadJSON:t=>Hi.fromJSON(t)}],behaviors:[]};function Zi(t){return"unlit"===t||"scene"===t?t:"fixed"}function Ki(t){return"distance"===t||"oldestInFront"===t||"youngestInFront"===t?t:"none"}function ts(t){return"pause"===t||"pauseAndCatchUp"===t?t:"always"}function es(t){return!t||0===t.x&&0===t.y&&0===t.z?void 0:t.clone()}function is(t){return"number"==typeof t&&t>0?Math.min(t,1):0}function ss(t){return"number"==typeof t&&Number.isFinite(t)&&t>=1?Math.floor(t):1}function ns(t,e){return"number"==typeof t&&Number.isFinite(t)&&t>=0?t:e}function rs(t){const e=t.count,i="number"==typeof t.time&&Number.isFinite(t.time)&&t.time>0?t.time:0,s="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:i,count:"number"==typeof e?new Dt(e):null!=e?e:new Dt(0),cycle:s,interval:n,probability:r}}function os(t){return(t??[]).map(rs).sort((t,e)=>t.time-e.time)}function as(t,e={}){const i=function(t,e){if(i=t,"function"==typeof i?.getDepthMap){const i=t,s=i._storeCameraSpaceZ?"viewZ":i._storeNonLinearDepth?"nonLinear":"linear";return{texture:t.getDepthMap(),encoding:e.encoding??s,packed:e.packed??t.isPacked}}var i;return{texture:t,encoding:e.encoding??"linear",packed:e.packed??!1}}(t,e);if(i.packed&&"viewZ"===i.encoding)throw new Error("[babylon.quarks] A packed view-Z depth cannot be decoded; use a float depth texture");return i}function hs(t,e,i){if("viewZ"===e)return i.set(1,0,0,1);const s=t.getEngine(),n=s.useReverseDepthBuffer,r=s.isNDCHalfZRange,o=t.getProjectionMatrix().m,a=o[10],h=o[11],l=o[14],c=o[15];if("linear"===e){let e,s;t.mode===m.Camera.ORTHOGRAPHIC_CAMERA?(e=!n&&r?0:1,s=n&&r?0:1):(e=n&&r?t.minZ:r?0:t.minZ,s=n&&r?0:t.maxZ);const o=n?-1:1,h=e+s;return i.set(o*h/a,(-o*e-l)/a,0,1)}const u=r?1:2,d=r?0:-1;return i.set(-u*c,l-d*c,u*h,d*h-a)}var ls;function cs(){return{direction:new u.Vector3(.4,-1,.6),color:new c.Color3(1,1,1),ambient:new c.Color3(.35,.35,.35)}}function us(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 ds(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 fs(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 ms(t,e={}){const i=ds(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}t.RenderMode=void 0,(ls=t.RenderMode||(t.RenderMode={}))[ls.BillBoard=0]="BillBoard",ls[ls.StretchedBillBoard=1]="StretchedBillBoard",ls[ls.Mesh=2]="Mesh",ls[ls.Trail=3]="Trail",ls[ls.HorizontalBillBoard=4]="HorizontalBillBoard",ls[ls.VerticalBillBoard=5]="VerticalBillBoard",ls[ls.Beam=6]="Beam";const ps={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 ys(t){if(!t||"object"!=typeof t||!t.ramp)return;const e=t.channel;return{ramp:t.ramp,channel:void 0!==e&&e in ps?e:"r"}}const gs=.05;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:ds(t.maskUV),softness:Math.max(1e-4,e(t.softness,gs)),edgeWidth:Math.max(0,e(t.edgeWidth,0)),edgeColor:[e(i[0],1),e(i[1],1),e(i[2],1)]}}const xs={scroll:[0,.5]},Ss=.05;function bs(t){if(!t||"object"!=typeof t||!t.map)return;const e=t.strength;return{map:t.map,mapUV:ds(t.mapUV,xs),strength:Math.max(0,"number"==typeof e&&Number.isFinite(e)?e:Ss)}}function ws(t){if(!t||"object"!=typeof t)return;const e=ds(t);return void 0===ms(e)?void 0:e}function Ms(t){const{mapUV:e,uvDistortion:i,erosion:s}=t;return 1===e?.channel||1===i?.mapUV.channel||!!s?.mask&&1===s.maskUV.channel}class zs{constructor(t,e,i=null){this.visibleSystems=[],this.boundsMin_=new it,this.boundsMax_=new it,this.time=0,this.scene=e,this.depth=i,this.maxParticles=1e3,this.systems=new Set,this.settings=$s(t),this.mesh=new d.Mesh("vfxBatch",e),this.configureMesh()}configureMesh(){const t=this.mesh;t.alwaysSelectAsActiveMesh=!0,t.doNotSyncBoundingInfo=!0,t.setBoundingInfo(new a.BoundingInfo(u.Vector3.Zero(),u.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 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}static writeBound(t,e){e(t);const i=t.getEffect();i?.isReady()&&e(i)}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:f.Scene.FOGMODE_NONE;i.setFloat4("vFogInfos",s,e.fogStart,e.fogEnd,e.fogDensity),i.setColor3("vFogColor",e.fogColor)})}usesUV1(){return Ms(this.settings)}bindSurface(t){const{mapUV:e,uvDistortion:i,gradientMap:s,erosion:n}=this.settings;if(i?.map&&t.setTexture("distortionMap",i.map),s?.ramp&&t.setTexture("gradientMap",s.ramp),n?.mask&&t.setTexture("erosionMask",n.mask),this.writeSurfaceParams(t),!(e||i||n?.mask||s))return;const r=t=>t-2*Math.floor(t/2),o=new u.Vector4,a=new u.Vector4,h=new u.Vector4,l=new u.Vector2(0,1),c=(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 e=this.time,i=t.getEffect(),{mapUV:s,uvDistortion:n,gradientMap:r,erosion:u}=this.settings;if(s&&(c(s,e,o),t.setVector4("mapTransform",o),i?.setVector4("mapTransform",o)),n&&(c(n.mapUV,e,a),t.setVector4("distortionTransform",a),i?.setVector4("distortionTransform",a)),u?.mask&&(c(u.maskUV,e,h),t.setVector4("erosionMaskTransform",h),i?.setVector4("erosionMaskTransform",h)),r?.ramp){const e=r.ramp.getSize().width,s=e>0?.5/e:0;l.set(s,1-s),t.setVector2("gradientMapRange",l),i?.setVector2("gradientMapRange",l)}};d(),t.onBindObservable.add(d)}writeSurfaceParams(t){const{uvDistortion:e,gradientMap:i,erosion:s}=this.settings;if(e?.map&&t.setFloat("distortionStrength",e.strength),i?.ramp){const[e,s,n,r]=ps[i.channel];t.setVector4("gradientMapChannel",new u.Vector4(e,s,n,r))}s&&(t.setVector2("erosionParams",new u.Vector2(s.softness,s.edgeWidth)),t.setVector3("erosionEdgeColor",new u.Vector3(s.edgeColor[0],s.edgeColor[1],s.edgeColor[2])))}applyLiveSettings(t){Object.assign(this.settings,t);const e=this.mesh.material;e instanceof l.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 i of this.systems)i.emitter.visible&&!0!==i.culled&&(t[e++]=i);return t.length=e,t}applyDepthTexture(t){t instanceof h.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 i=this.mesh.material;t&&i instanceof l.ShaderMaterial&&i.setTexture("depthTexture",t.texture)}bindSoft(t){if(this.writeSoftParams(t),this.drawsSoft()){t.setTexture("depthTexture",this.depth.texture);const e=new u.Vector4(1,0,0,1);t.onBindObservable.add(()=>{const i=this.scene.activeCamera;i&&this.depth&&(hs(i,this.depth.encoding,e),zs.writeBound(t,t=>t.setVector4("projParams",e)))})}}writeSoftParams(t){this.drawsSoft()&&t.setVector2("softParams",new u.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 _s=new Float32Array(0),Vs=new Uint16Array(0);function As(e){return e===t.RenderMode.BillBoard||e===t.RenderMode.StretchedBillBoard||e===t.RenderMode.VerticalBillBoard||e===t.RenderMode.HorizontalBillBoard}function Ts(t){return t.uTileCount>1||t.vTileCount>1}function Os(t){return t.minParticleSize>0||t.maxParticleSize!==1/0}function $s(e){const i=e.renderMode,s=i===t.RenderMode.Mesh,n=i===t.RenderMode.Trail,r=As(i),a=e.softParticles,h=e.materialTransparent,l=e.pivot,c=ws(e.mapUV),u=bs(e.uvDistortion),d=ys(e.gradientMap),f=vs(e.erosion),m=ss(e.uTileCount),p=ss(e.vTileCount);var y;return{renderMode:i,instancingGeometry:n?_s:e.instancingGeometry,instancingIndices:n?Vs:e.instancingIndices,instancingUVs:n?void 0:e.instancingUVs,instancingUVs2:s&&Ms({mapUV:c,uvDistortion:u,erosion:f})?e.instancingUVs2:void 0,instancingNormals:s?e.instancingNormals:void 0,renderOrder:e.renderOrder,uTileCount:m,vTileCount:p,blendTiles:!n&&e.blendTiles&&Ts({uTileCount:m,vTileCount:p}),softParticles:a,softNearFade:a?ns(e.softNearFade,0):0,softFarFade:a?ns(e.softFarFade,1):0,materialBlendMode:h?e.materialBlendMode:o.Constants.ALPHA_DISABLE,materialTransparent:h,materialDepthTest:e.materialDepthTest,materialDepthWrite:e.materialDepthWrite,materialAlphaTest:e.materialAlphaTest>0?e.materialAlphaTest:0,texture:e.texture,reflectionTexture:s?e.reflectionTexture??null:null,reflectionLevel:s?e.reflectionLevel??1:1,reflectionAtlas:s?e.reflectionAtlas??null:null,layerMask:e.layerMask,renderingGroupId:e.renderingGroupId??0,applyFog:e.applyFog??!0,pivot:r&&l&&(0!==l.x||0!==l.y||0!==l.z)?l.clone():void 0,sortMode:e.sortMode??"none",minParticleSize:r?Math.max(0,e.minParticleSize??0):0,maxParticleSize:r?(y=e.maxParticleSize,void 0!==y&&y>0?y:1/0):1/0,lighting:s?e.lighting??"fixed":"fixed",rim:s?us(e.rim):void 0,mapUV:c,uvDistortion:u,gradientMap:d,erosion:f}}function Ps(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&&Os(t)===Os(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 Cs(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&&Es(t.color,e.color)}(t.rim,e.rim)&&Fs(t.mapUV,e.mapUV)&&t.uvDistortion?.strength===e.uvDistortion?.strength&&Fs(t.uvDistortion?.mapUV,e.uvDistortion?.mapUV)&&t.gradientMap?.channel===e.gradientMap?.channel&&t.erosion?.softness===e.erosion?.softness&&t.erosion?.edgeWidth===e.erosion?.edgeWidth&&Es(t.erosion?.edgeColor,e.erosion?.edgeColor)&&Fs(t.erosion?.maskUV,e.erosion?.maskUV)}function Bs(t,e){return Ps(t,e)&&Cs(t,e)}function Es(t,e){return t&&e?t[0]===e[0]&&t[1]===e[1]&&t[2]===e[2]:!t==!e}function Fs(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 Is=2048,Ns=2047;class Us{constructor(t){this.counts=new Uint32Array(Is),this.floatView=new Float32Array(1),this.uintView=new Uint32Array(this.floatView.buffer),this.keys=new Uint32Array(t),this.orderA=new Uint32Array(t),this.orderB=new Uint32Array(t)}ensure(t){this.keys.length<t&&(this.keys=new Uint32Array(t),this.orderA=new Uint32Array(t),this.orderB=new Uint32Array(t))}floatKey(t,e){this.floatView[0]=t;const i=this.uintView[0];return e?~i>>>0:i}}const Rs="\n#ifdef FOG\nvarying vec3 vFogDistance;\n#endif\n";function Ds(t){return`\n#ifdef FOG\n vFogDistance = ${t};\n#endif\n`}const ks="\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 Ls(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 qs="\n#ifdef FOG\nvarying vFogDistance: vec3f;\n#endif\n";function Js(t){return`\n#ifdef FOG\n vertexOutputs.vFogDistance = ${t};\n#endif\n`}const Ws="\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 Gs(t){return`\n#ifdef FOG\n ${t} = vec4f(quarksFog(${t}.rgb, fragmentInputs.vFogDistance), ${t}.a);\n#endif\n`}function Qs(t,e,i){const s=e*i,n=js(Math.floor(t),s);return{column:js(n,e),row:Math.floor(n/e)}}function js(t,e){return t-e*Math.floor(t/e)}const Ys="\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 Hs(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 Xs="\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 Zs(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 Ks=`\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${Ys}\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${Rs}\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${Ds("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${Hs("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`,tn=`\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${Xs}\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${qs}\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${Js("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${Zs("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 en="\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 sn(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 nn="\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 rn(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 on="\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 an(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 hn="\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 ln(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 cn=`\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${ks}\n${en}\n${on}\nvoid main() {\n${an(!0)}\n#ifdef USE_ALPHATEST\n if (baseColor.a < alphaTest) discard;\n#else\n if (baseColor.a < 0.01) discard;\n#endif\n\n${Ls("baseColor.rgb")}\n gl_FragColor = baseColor;\n${sn("gl_FragColor")}\n}\n`,un=`\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${Ws}\n${nn}\n${hn}\n@fragment\nfn main(input: FragmentInputs) -> FragmentOutputs {\n${ln(!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${Gs("baseColor")}\n${rn("baseColor")}\n fragmentOutputs.color = baseColor;\n}\n`,dn=`\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${ks}\n${en}\n${on}\nvoid main() {\n${an(!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${Ls("color")}\n gl_FragColor = vec4(color, baseColor.a);\n${sn("gl_FragColor")}\n}\n`,fn=`\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${Ws}\n${nn}\n${hn}\n@fragment\nfn main(input: FragmentInputs) -> FragmentOutputs {\n${ln(!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${Gs("finalColor")}\n${rn("finalColor")}\n fragmentOutputs.color = finalColor;\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;\n\n// Uniforms\nuniform mat4 world;\nuniform mat4 view;\nuniform mat4 projection;\n${Ys}\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${Rs}\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${Ds("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${Hs("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${Xs}\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${qs}\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${Js("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${Zs("vertexInputs.uv")}\n\n#ifdef UV1\n vertexOutputs.vUV1 = vertexInputs.uv;\n#endif\n vertexOutputs.vColor = vertexInputs.color;\n}\n`,yn=`\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${Ys}\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${Rs}\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${Ds("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${Hs("quadUV")}\n\n#ifdef UV1\n vUV1 = quadUV;\n#endif\n vColor = color;\n}\n`,gn=`\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${Xs}\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${qs}\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${Js("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${Zs("quadUV")}\n\n#ifdef UV1\n vertexOutputs.vUV1 = quadUV;\n#endif\n vertexOutputs.vColor = vertexInputs.color;\n}\n`,vn=`\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${ks}\n${en}\n${on}\nvoid main() {\n${an(!1)}\n#ifdef USE_ALPHATEST\n if (baseColor.a < alphaTest) discard;\n#else\n if (baseColor.a < 0.01) discard;\n#endif\n\n${Ls("baseColor.rgb")}\n gl_FragColor = baseColor;\n${sn("gl_FragColor")}}\n`,xn=`\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${Ws}\n${nn}\n${hn}\n@fragment\nfn main(input: FragmentInputs) -> FragmentOutputs {\n${ln(!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${Gs("baseColor")}\n${rn("baseColor")}\n fragmentOutputs.color = baseColor;\n}\n`,Sn=`\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${Rs}\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${Ds("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`,bn=`\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${qs}\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${Js("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"],Mn=["position","previous","next","side","width","uv","color"],zn=["vFogInfos","vFogColor"];function _n(e){return e===t.RenderMode.StretchedBillBoard||e===t.RenderMode.Beam}function Vn(e,i){return e.renderMode===t.RenderMode.Trail?function(t,e){const i=An(t),s=[...Mn],n=["view","projection",...zn],r=[];null!==t.texture&&(i.push("USE_MAP"),r.push("map"));On(t,i,n,r),Tn(t,e,i,n,r),Ms(t)&&s.push("uv2");return{name:"quarksTrail",vertex:{glsl:Sn,wgsl:bn},fragment:{glsl:vn,wgsl:xn},defines:i,attributes:s,uniforms:n,samplers:r}}(e,i):function(e,i){const s=e.renderMode,n=s===t.RenderMode.Mesh,r=`quarksParticle_${s}`;let o,a;n?(o={glsl:Ks,wgsl:tn},a={glsl:dn,wgsl:fn}):_n(s)?(o={glsl:yn,wgsl:gn},a={glsl:cn,wgsl:un}):(o={glsl:mn,wgsl:pn},a={glsl:cn,wgsl:un});const h=An(e),l=[...wn],c=["world","view","projection",...zn],u=[];(function(e){return null!==e.texture||e.renderMode===t.RenderMode.Mesh})(e)&&(h.push("USE_MAP"),u.push("map"));const d=n&&null!==e.reflectionAtlas&&i.envAtlasReady;d&&(h.push("USE_ENVMAP_ATLAS"),u.push("envAtlas"),c.push("reflectionLevel"));Ts(e)&&(h.push("UV_TILE"),c.push("tileCountX","tileCountY"),e.blendTiles&&h.push("TILE_BLEND"));Tn(e,i,h,c,u),s===t.RenderMode.VerticalBillBoard&&h.push("VERTICAL");s===t.RenderMode.HorizontalBillBoard&&h.push("HORIZONTAL");s===t.RenderMode.Beam&&h.push("BEAM");As(s)&&(e.pivot&&(h.push("PIVOT"),c.push("pivot")),Os(e)&&(h.push("SIZE_LIMITS"),c.push("sizeLimits")));const f=n&&"unlit"!==(e.lighting??"fixed");n&&!f&&h.push("MESH_UNLIT");f&&c.push("lightDirection","lightColor","ambientColor");const m=n?e.rim:void 0;m&&(h.push("MESH_RIM"),"fade"===m.mode?h.push("MESH_RIM_FADE"):"mix"===m.mode&&h.push("MESH_RIM_MIX"),c.push("rimColor","rimParams"));(d||m)&&c.push("eyePosition");On(e,h,c,u),n&&(l.push("normal"),Ms(e)&&i.meshUV2&&(h.push("MESH_UV2"),l.push("uv2")));_n(s)&&l.push("velocity");return{name:r,vertex:o,fragment:a,defines:h,attributes:l,uniforms:c,samplers:u}}(e,i)}function An(t){return t.applyFog?function(t){return t.materialTransparent&&(t.materialBlendMode===o.Constants.ALPHA_ADD||t.materialBlendMode===o.Constants.ALPHA_ONEONE)}(t)?["FOG","FOG_ADDITIVE"]:["FOG"]:[]}function Tn(t,e,i,s,n){t.softParticles&&null!==e.depth&&(i.push("SOFT_PARTICLES"),e.depth.packed&&i.push("SOFT_DEPTH_PACKED"),s.push("softParams","projParams"),n.push("depthTexture")),t.materialAlphaTest>0&&(i.push("USE_ALPHATEST"),s.push("alphaTest"))}function On(t,e,i,s){const{mapUV:n,uvDistortion:r,gradientMap:o,erosion:a}=t;Ms(t)&&e.push("UV1"),n&&(e.push("MAP_TRANSFORM"),1===n.channel&&e.push("MAP_UV1"),i.push("mapTransform")),r&&(e.push("UV_DISTORTION"),1===r.mapUV.channel&&e.push("UV_DISTORTION_UV1"),s.push("distortionMap"),i.push("distortionTransform","distortionStrength")),o&&(e.push("GRADIENT_MAP"),s.push("gradientMap"),i.push("gradientMapRange","gradientMapChannel")),a&&(e.push("EROSION"),i.push("erosionParams","erosionEdgeColor"),a.mask&&(e.push("EROSION_MASK"),1===a.maskUV.channel&&e.push("EROSION_MASK_UV1"),s.push("erosionMask"),i.push("erosionMaskTransform")))}function $n(t){return t.isWebGPU?x.ShaderLanguage.WGSL:x.ShaderLanguage.GLSL}function Pn(t,e,i,s){if(s===x.ShaderLanguage.WGSL)return g.ShaderStore.ShadersStoreWGSL[t+"VertexShader"]=e.wgsl,void(g.ShaderStore.ShadersStoreWGSL[t+"FragmentShader"]=i.wgsl);v.Effect.ShadersStore[t+"VertexShader"]=e.glsl,v.Effect.ShadersStore[t+"FragmentShader"]=i.glsl}class Cn extends zs{static whiteTexture(t){let e=Cn.whiteTextureByScene.get(t);return e||(e=p.RawTexture.CreateRGBATexture(new Uint8Array([255,255,255,255]),1,1,t),e.name="quarksMeshWhite",Cn.whiteTextureByScene.set(t,e)),e}constructor(t,e,i=null){super(t,e,i),this.shaderMaterial=null,this.cancelAtlasRebuild=null,this.disposed=!1,this.fixedLightDirection=new u.Vector3,this.fixedLightColor=new u.Vector3,this.fixedAmbientColor=new u.Vector3,this.warnedUV2=!1,this.gatherScratch=[],this.vector_=new it,this.vector2_=new it,this.vector3_=new it,this.quaternion_=new et,this.quaternion2_=new et,this.quaternion3_=new et,this.quaternion4_=new et,this.quaternion5_=new et,this.rotationMat_=new vt,this.rotationMat2_=new vt,this.clearedInstanceUploaded=!1,this.beamEnd_=new it,this.storeFixedLighting(cs()),this.maxParticles=1e3,this.setupBuffers(),this.rebuildMaterial()}setupBuffers(){this.mesh.dispose(),this.mesh=new d.Mesh("spriteBatch",this.scene),this.configureMesh();const t=new y.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 e=this.settings.instancingUVs2;if(this.settings.renderMode!==t.RenderMode.Mesh||!e||!this.usesUV1())return!1;const i=this.settings.instancingGeometry.length/3*2;return e.length===i||(this.warnedUV2||(this.warnedUV2=!0,console.warn(`[babylon.quarks] instancingUVs2 has ${e.length} values for ${i/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 i=this.scene.getEngine();this.offsetBuffer=new Float32Array(3*this.maxParticles),this.offsetVB=new e.VertexBuffer(i,this.offsetBuffer,"offset",!0,!1,3,!0),this.mesh.setVerticesBuffer(this.offsetVB),this.colorBuffer=new Float32Array(4*this.maxParticles),this.colorVB=new e.VertexBuffer(i,this.colorBuffer,"color",!0,!1,4,!0),this.mesh.setVerticesBuffer(this.colorVB),this.sizeBuffer=new Float32Array(3*this.maxParticles),this.sizeVB=new e.VertexBuffer(i,this.sizeBuffer,"size",!0,!1,3,!0),this.mesh.setVerticesBuffer(this.sizeVB),this.uvTileBuffer=new Float32Array(this.maxParticles),this.uvTileVB=new e.VertexBuffer(i,this.uvTileBuffer,"uvTile",!0,!1,1,!0),this.mesh.setVerticesBuffer(this.uvTileVB),this.settings.renderMode===t.RenderMode.Mesh?(this.rotationBuffer=new Float32Array(4*this.maxParticles),this.rotationVB=new e.VertexBuffer(i,this.rotationBuffer,"rotation",!0,!1,4,!0)):(this.rotationBuffer=new Float32Array(this.maxParticles),this.rotationVB=new e.VertexBuffer(i,this.rotationBuffer,"rotation",!0,!1,1,!0)),this.mesh.setVerticesBuffer(this.rotationVB),_n(this.settings.renderMode)&&(this.velocityBuffer=new Float32Array(4*this.maxParticles),this.velocityVB=new e.VertexBuffer(i,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 As(this.settings.renderMode)&&Os(this.settings)?new u.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 Us(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=xe.SCALAR_STRIDE;for(let t=0,i=xe.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&Ns]++;if(s[i[n[0]]>>>t&Ns]===e)continue;let o=0;for(let t=0;t<Is;t++){const e=s[t];s[t]=o,o+=e}for(let o=0;o<e;o++){const e=n[o];r[s[i[e]>>>t&Ns]++]=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 e=this.settings.renderMode===t.RenderMode.Mesh,i=this.settings.texture??(e?Cn.whiteTexture(this.scene):null),s=this.settings.reflectionAtlas,n=e&&!!s&&!s.isReady();if(this.cancelAtlasRebuild?.(),this.cancelAtlasRebuild=null,n&&s){const t=s.onLoadObservable;if(t){const e=t.addOnce(()=>{this.cancelAtlasRebuild=null,this.disposed||this.rebuildMaterial()});this.cancelAtlasRebuild=()=>t.remove(e)}}const r=this.usesEnvAtlas(),a=Vn(this.settings,{depth:this.depth,envAtlasReady:r,meshUV2:this.meshUV2()}),{defines:h,attributes:c,uniforms:d,samplers:f}=a,m=a.name,p=this.settings.lighting??"fixed",y=e&&"unlit"!==p,g=e?this.settings.rim:void 0,v=r||!!g,x=$n(this.scene.getEngine());Pn(m,a.vertex,a.fragment,x);const S=new l.ShaderMaterial(m,this.scene,{vertex:m,fragment:m},{attributes:c,uniforms:d,samplers:f,defines:h,needAlphaBlending:this.settings.materialTransparent,shaderLanguage:x});if(i&&S.setTexture("map",i),r&&s&&S.setTexture("envAtlas",s),v){const t=new u.Vector3;S.setVector3("eyePosition",t),S.onBindObservable.add(()=>{const e=this.scene.activeCamera;e&&(t.copyFrom(e.globalPosition),zs.writeBound(S,e=>e.setVector3("eyePosition",t)))})}if(Ts(this.settings)&&(S.setFloat("tileCountX",this.settings.uTileCount),S.setFloat("tileCountY",this.settings.vTileCount)),this.bindSoft(S),this.writeSpriteParams(S,r),y&&(this.writeFixedLighting(S),"scene"===p)){const t=new u.Vector3,e=new u.Vector3,i=new u.Vector3;S.onBindObservable.add(()=>{const s=Cn.readSceneLight(this.scene,t,e,i);zs.writeBound(S,n=>s?n.setVector3("lightDirection",t).setVector3("lightColor",e).setVector3("ambientColor",i):this.writeFixedLighting(n))})}this.bindFog(S),this.bindSurface(S),S.backFaceCulling=!1,this.settings.materialTransparent?S.alphaMode=this.settings.materialBlendMode:S.alphaMode=o.Constants.ALPHA_DISABLE,S.needDepthPrePass=this.settings.materialDepthWrite&&this.settings.materialTransparent,S.forceDepthWrite=this.settings.materialDepthWrite,S.disableDepthWrite=!this.settings.materialDepthWrite,S.depthFunction=this.settings.materialDepthTest?0:o.Constants.ALWAYS,this.shaderMaterial?.dispose(!1,!1),this.mesh.material=S,this.shaderMaterial=S}writeSpriteParams(e,i){i&&e.setFloat("reflectionLevel",this.settings.reflectionLevel);const s=this.settings.renderMode===t.RenderMode.Mesh?this.settings.rim:void 0;s&&(e.setVector3("rimColor",new u.Vector3(s.color[0],s.color[1],s.color[2])),e.setVector2("rimParams",new u.Vector2(s.power,s.strength)));const n=As(this.settings.renderMode)?this.settings.pivot:void 0;n&&e.setVector3("pivot",new u.Vector3(n.x,n.y,n.z));const r=this.sizeLimits();r&&e.setVector2("sizeLimits",r)}writeLiveUniforms(t){super.writeLiveUniforms(t),this.writeSpriteParams(t,this.usesEnvAtlas())}usesEnvAtlas(){const e=this.settings.reflectionAtlas;return this.settings.renderMode===t.RenderMode.Mesh&&!!e&&e.isReady()}applyMeshLighting(e){this.storeFixedLighting(e);const i=this.shaderMaterial;null!==i&&this.settings.renderMode===t.RenderMode.Mesh&&"unlit"!==this.settings.lighting&&this.writeFixedLighting(i)}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 e=0,i=0;const s=this.settings.renderMode,n=s===t.RenderMode.Mesh,r=s===t.RenderMode.StretchedBillBoard,o=s===t.RenderMode.Beam,a=r||o,h=As(s),l=this.getVisibleSystems();for(let t=0;t<l.length;t++)i+=l[t].particleNum;i>this.maxParticles&&this.expandBuffers(i);for(let t=0;t<l.length;t++){const i=l[t],s=i.particleNum;if(0===s)continue;const a=i.particles,c=this.quaternion2_,u=this.vector2_,d=this.vector3_,f=i.worldSpace,m=i.emitter.matrixWorld;if(n&&!f)m.decompose(u,c,d);else{const t=m.elements;d.set(Math.sqrt(t[0]*t[0]+t[1]*t[1]+t[2]*t[2]),Math.sqrt(t[4]*t[4]+t[5]*t[5]+t[6]*t[6]),Math.sqrt(t[8]*t[8]+t[9]*t[9]+t[10]*t[10]))}r&&!f&&this.rotationMat_.setFromMatrix4(m);const p=Math.abs(d.x),y=Math.abs(d.y),g=Math.abs(d.z),v=r?i.rendererEmitterSettings:void 0,x=void 0===v||0===v.speedFactor?.001:v.speedFactor,S=v?.lengthFactor??0,b=i.store,w=void 0!==b,M=void 0!==b&&!0!==i.onlyUsedByOther,z=i.simulationResidual??0,_=0===z?0:z/(i.simulationStep??z);w&&(0!==_&&s>0&&b.previousColor!==b.color?Cn.continueColor(this.colorBuffer,4*e,b,s,_):this.colorBuffer.set(b.color.subarray(0,4*s),4*e));let V=!1;if(void 0!==b&&f)0!==_&&s>0?Cn.extrapolate(this.offsetBuffer,3*e,b,s,_):this.offsetBuffer.set(b.position.subarray(0,3*s),3*e),0!==_&&s>0&&b.previousSize!==b.size?Cn.continueVector3(this.sizeBuffer,3*e,b.size,b.previousSize,s,_):this.sizeBuffer.set(b.size.subarray(0,3*s),3*e),V=!0;else if(M&&s>0){const t=3*e,i=t+3*s,n=this.offsetBuffer;0!==_?Cn.extrapolate(n,t,b,s,_):n.set(b.position.subarray(0,3*s),t);const r=m.elements,o=r[0],a=r[1],h=r[2],l=r[3],c=r[4],u=r[5],d=r[6],f=r[7],v=r[8],x=r[9],S=r[10],w=r[11],M=r[12],z=r[13],A=r[14],T=r[15];for(let e=t;e<i;e+=3){const t=n[e],i=n[e+1],s=n[e+2],r=1/(l*t+f*i+w*s+T);n[e]=(o*t+c*i+v*s+M)*r,n[e+1]=(a*t+u*i+x*s+z)*r,n[e+2]=(h*t+d*i+S*s+A)*r}const O=this.sizeBuffer;0!==_&&b.previousSize!==b.size?Cn.continueVector3(O,t,b.size,b.previousSize,s,_):O.set(b.size.subarray(0,3*s),t);for(let e=t;e<i;e+=3)O[e]*=p,O[e+1]*=y,O[e+2]*=g;V=!0}const A=e;if(M&&!n){const t=b;this.uvTileBuffer.set(t.uvTile.subarray(0,s),A);const i=this.rotationBuffer;if(i.set(t.rotation.subarray(0,s),A),0!==z){const e=t.angularVelocity;for(let t=0;t<s;t++)i[A+t]+=e[t]*z}r&&this.velocityBuffer&&Cn.writeVelocities(this.velocityBuffer,4*A,t,s,_,f?null:this.rotationMat_,x,S),e+=s}else if(M&&b.rotationQuaternion.length>0){const t=b;this.uvTileBuffer.set(t.uvTile.subarray(0,s),A),Cn.writeQuaternions(this.rotationBuffer,4*A,t,s,_,f?null:c),e+=s}else for(let t=0;t<s;t++,e++){const i=a[t];if(n){let t=i.rotation;const s=i.angularVelocity;let n;if(0!==_&&s instanceof et&&(t=this.quaternion4_.copy(t).multiply(Cn.partialTurn(s,_,this.quaternion5_))),f)n=t;else{let e;e=i.parentMatrix?this.quaternion3_.setFromRotationMatrix(i.parentMatrix):c,n=this.quaternion_,n.copy(e).multiply(t)}const r=4*e;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 t=i.angularVelocity;this.rotationBuffer[e]=i.rotation+("number"==typeof t?t*z:0)}if(!V){const t=i.position,s=i.previousPosition;let n=t.x+(t.x-s.x)*_,r=t.y+(t.y-s.y)*_,o=t.z+(t.z-s.z)*_;if(!f){const t=(i.parentMatrix??m).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*e;this.offsetBuffer[a]=n,this.offsetBuffer[a+1]=r,this.offsetBuffer[a+2]=o;const h=i.size,l=3*e;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*p,this.sizeBuffer[l+1]=h.y*y,this.sizeBuffer[l+2]=h.z*g)}if(!w){const t=i.color,s=4*e;this.colorBuffer[s]=t.x,this.colorBuffer[s+1]=t.y,this.colorBuffer[s+2]=t.z,this.colorBuffer[s+3]=t.w}if(this.uvTileBuffer[e]=i.uvTile,r&&this.velocityBuffer){const t=i.velocity,s=i.previousVelocity,n=t.x+(t.x-s.x)*_,r=t.y+(t.y-s.y)*_,o=t.z+(t.z-s.z)*_,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*e;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=i.tint;void 0!==T&&e>A&&Cn.applyTint(this.colorBuffer,4*A,e-A,T),h&&void 0!==i.flip&&(void 0!==b?Cn.applyFlip(this.sizeBuffer,3*A,b.flip,s):Cn.applyFlipFromParticles(this.sizeBuffer,3*A,a,s)),o&&this.velocityBuffer&&this.writeBeams(i,A,e-A)}this.mesh.forcedInstanceCount=e,this.refreshBoundingInfo(),0!==e?(this.clearedInstanceUploaded=!1,"none"!==this.settings.sortMode&&this.sortInstances(e,n,a),this.offsetVB.update(this.offsetBuffer.subarray(0,3*e)),this.sizeVB.update(this.sizeBuffer.subarray(0,3*e)),this.colorVB.update(this.colorBuffer.subarray(0,4*e)),this.uvTileVB.update(this.uvTileBuffer.subarray(0,e)),this.rotationVB.update(this.rotationBuffer.subarray(0,n?4*e:e)),a&&this.velocityVB&&this.velocityBuffer&&this.velocityVB.update(this.velocityBuffer.subarray(0,4*e))):this.clearedInstanceUploaded||(this.uploadClearedInstance(n,a),this.clearedInstanceUploaded=!0)}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 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],m=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,p=l*c,y=e*p+m*u+i*f-s*d,g=i*p+m*d+s*u-e*f,v=s*p+m*f+e*d-i*u;m=m*p-e*u-i*d-s*f,e=y,i=g,s=v}if(h){const t=l*m+d*e+c*s-u*i,n=c*m+d*i+u*e-l*s,r=u*m+d*s+l*i-c*e;m=d*m-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]=m}}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.disposed=!0,this.cancelAtlasRebuild?.(),this.cancelAtlasRebuild=null,this.mesh.material&&this.mesh.material.dispose(),super.dispose()}}Cn.whiteTextureByScene=new WeakMap;function Bn(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 In(t){const e=t?.textureMode;return void 0!==e&&Fn.includes(e)?e:"stretch"}function Nn(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 Rn(t){const e=Number(t?.lifetime);return Number.isFinite(e)&&e>0?e:1/0}class Dn{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,i,s,n){const r=3*t;if(n){const t=1/(n[3]*e+n[7]*i+n[11]*s+n[15]);this.position[r]=(n[0]*e+n[4]*i+n[8]*s+n[12])*t,this.position[r+1]=(n[1]*e+n[5]*i+n[9]*s+n[13])*t,this.position[r+2]=(n[2]*e+n[6]*i+n[10]*s+n[14])*t}else this.position[r]=e,this.position[r+1]=i,this.position[r+2]=s}writeSide(t,e,i,s,n){const r=3*t;n?(this.side[r]=n[0]*e+n[4]*i+n[8]*s,this.side[r+1]=n[1]*e+n[5]*i+n[9]*s,this.side[r+2]=n[2]*e+n[6]*i+n[10]*s):(this.side[r]=e,this.side[r+1]=i,this.side[r+2]=s)}writeColor(t,e,i,s,n){const r=4*t;this.color[r]=e,this.color[r+1]=i,this.color[r+2]=s,this.color[r+3]=n}}function kn(t,e,i){return Math.sqrt(Math.sqrt((t[i]-t[e])**2+(t[i+1]-t[e+1])**2+(t[i+2]-t[e+2])**2))}class Ln extends zs{constructor(t,e,i=null){super(t,e,i),this.uv1Buffer=null,this.drawsNothing=!1,this.vector2_=new it,this.vector3_=new it,this.quaternion_=new et,this.samples_=new Dn,this.curve_=new Dn,this.cutScratch_=new Dn,this.maxParticles=1024,this.setupBuffers(),this.rebuildMaterial()}setupBuffers(){this.mesh.dispose(),this.mesh=new d.Mesh("trailBatch",this.scene),this.configureMesh(),this.buildGeometryBuffers()}buildGeometryBuffers(){const t=this.maxParticles;this.positionBuffer=new Float32Array(3*t),this.previousBuffer=new Float32Array(3*t),this.nextBuffer=new Float32Array(3*t),this.uvBuffer=new Float32Array(2*t),this.uv1Buffer=this.usesUV1()?new Float32Array(2*t):null,this.sideBuffer=new Float32Array(t),this.widthBuffer=new Float32Array(t),this.colorBuffer=new Float32Array(4*t),this.indexBuffer=new Uint32Array(3*t);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(e.VertexBuffer.PositionKind,this.positionBuffer,!0),this.mesh.setVerticesData(e.VertexBuffer.UVKind,this.uvBuffer,!0),this.uv1Buffer&&this.mesh.setVerticesData(e.VertexBuffer.UV2Kind,this.uv1Buffer,!0),this.mesh.setVerticesData(e.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 i=this.scene.getEngine();this.previousVB=new e.VertexBuffer(i,this.previousBuffer,"previous",!0,!1,3,!1),this.nextVB=new e.VertexBuffer(i,this.nextBuffer,"next",!0,!1,3,!1),this.sideVB=new e.VertexBuffer(i,this.sideBuffer,"side",!0,!1,1,!1),this.widthVB=new e.VertexBuffer(i,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=Vn(this.settings,{depth:this.depth,envAtlasReady:!1,meshUV2:!1}),{defines:e,attributes:i,uniforms:s,samplers:n}=t,r=t.name,a=$n(this.scene.getEngine());Pn(r,t.vertex,t.fragment,a);const h=new l.ShaderMaterial(r,this.scene,{vertex:r,fragment:r},{attributes:i,uniforms:s,samplers:n,defines:e,needAlphaBlending:this.settings.materialTransparent,shaderLanguage:a});this.settings.texture&&h.setTexture("map",this.settings.texture),this.bindFog(h),this.bindSoft(h),this.bindSurface(h),h.backFaceCulling=!1,this.settings.materialTransparent?h.alphaMode=this.settings.materialBlendMode:h.alphaMode=o.Constants.ALPHA_DISABLE,h.needDepthPrePass=this.settings.materialDepthWrite&&this.settings.materialTransparent,h.forceDepthWrite=this.settings.materialDepthWrite,h.disableDepthWrite=!this.settings.materialDepthWrite,h.depthFunction=this.settings.materialDepthTest?0:o.Constants.ALWAYS,this.mesh.material?.dispose(!1,!1),this.mesh.material=h}trailSamples(t){return this.samples_.reserve(t)}cutLastSegment(t,e,i,s,n){const r=e-1-i,o=this.cutScratch_.reserve(i+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<=i;e++){const a=s*e,h=Math.min(i-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,i,s,n,r){const o=this.curve_.reserve((i-1)*(s+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<i;n++){const i=3*n,f=i+3;let m=0,p=0,y=0,g=0,v=0,x=0,S=i,b=f;if(n+1<e){S=3*(n>0?n-1:n),b=3*(n+2<e?n+2:n+1);const t=kn(a,i,f);if(t>1e-6){const e=kn(a,S,i),s=kn(a,f,b);y=u,g=u,e>1e-6&&(m=u*t/e,p=-u*t/(e+t)),s>1e-6&&(v=-u*t/(t+s),x=u*t/s)}}const w=0===m&&0===p&&0===y&&0===g&&0===v&&0===x,M=r?Math.sqrt(h[i]*h[i]+h[i+1]*h[i+1]+h[i+2]*h[i+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<=s;e++,d++){const u=e/(s+1),_=u*u,V=_*u,A=w?1-u:2*V-3*_+1,T=V-2*_+u,O=w?u:-2*V+3*_,$=V-_,P=3*d;for(let t=0;t<3;t++){const e=a[i+t],s=a[f+t],n=m*(e-a[S+t])+p*(s-a[S+t])+y*(s-e),r=g*(s-e)+v*(a[b+t]-e)+x*(a[b+t]-s);l[P+t]=A*e+T*n+O*s+$*r}if(r){let t=0,e=0,s=0;for(let n=0;n<3;n++){const r=h[i+n],o=h[f+n],a=A*r+T*(m*(r-h[S+n])+p*(o-h[S+n])+y*(o-r))+O*o+$*(g*(o-r)+v*(h[b+n]-r)+x*(h[b+n]-o));0===n?t=a:1===n?e=a:s=a}let n=Math.sqrt(t*t+e*e+s*s);if(n<=1e-6*Math.max(M,z,1e-6)){const r=u<.5?i:f;t=h[r],e=h[r+1],s=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]=s*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,B=4*d;for(let e=0;e<4;e++)o.color[B+e]=t.color[C+e]+(t.color[C+4+e]-t.color[C+e])*u}}const f=3*(i-1),m=3*d;for(let t=0;t<3;t++)l[m+t]=a[f+t],c[m+t]=h[f+t];o.size[d]=t.size[i-1],o.distance[d]=t.distance[i-1];for(let e=0;e<4;e++)o.color[4*d+e]=t.color[4*(i-1)+e];return o}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,r=Bn(e.rendererEmitterSettings);for(let t=0;t<e.particleNum;t++){const e=n[t].historyCount;0!==e&&(i+=2*(e*(r+1)+1))}}i>this.maxParticles&&this.expandBuffers(i);for(let i=0;i<s.length;i++){const n=s[i],r=t;Ln.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,m=1/d,p=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),V=Math.abs(_)<1e-4?0:_,A=Bn(v),T=En(v),O=In(v),$="stretch"===O?0:"tile"===O?1:"repeatPerSegment"===O?3:2,P=Nn(v),C=Un(v)>0;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.historyDistances,u=s.historySides,v=void 0!==M&&u.length>=3*r,z=b?s.store.color:s.historyColors,_=4*s.storeIndex,{column:O,row:B}=Qs(s.uvTile,d,f),E=(s.parentMatrix??l).elements,F=y||s.parentMatrix?1:g,I=w||s.parentMatrix?1:g,N=s.age<s.life,U=N&&V>0,R=n+(U?1:0),D=this.trailSamples(R);let k=s.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],w?null:E),v){const e=u;D.writeSide(t,e[3*k],e[3*k+1],e[3*k+2],w?null:E)}D.size[t]=a[k],D.distance[t]=h[k];const i=b?_:4*k;D.writeColor(t,z[i],z[i+1],z[i+2],z[i+3]),k=k+1===r?0:k+1}if(U){const t=s.previousPosition,e=s.position,i=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(i,r,a,h,y?null:E),w&&!y){const t=1/(E[3]*r+E[7]*a+E[11]*h+E[15]),e=(E[0]*r+E[4]*a+E[8]*h+E[12])*t,i=(E[1]*r+E[5]*a+E[9]*h+E[13])*t;h=(E[2]*r+E[6]*a+E[10]*h+E[14])*t,r=e,a=i}const l=3*s.getHistoryIndex(n-1),c=r-o[l],u=a-o[l+1],d=h-o[l+2];D.distance[i]=D.distance[i-1]+Math.sqrt(c*c+u*u+d*d),v&&D.writeSide(i,M.x,M.y,M.z,E),D.size[i]=D.size[i-1];const f=s.color;D.writeColor(i,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=N&&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=s.previousPosition,i=s.position;let n=i.x-t.x,r=i.y-t.y,o=i.z-t.z;if(w&&!y){const t=E[0]*n+E[4]*r+E[8]*o,e=E[1]*n+E[5]*r+E[9]*o;o=E[2]*n+E[6]*r+E[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+(U?V:W?G-1:0),j=1/Math.max(.001,Q),Y=(R-2)*J,H=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),it=I*P,st=Math.floor(Z*it),nt=(f-B-1)*p,rt=(f-B)*p;for(let i=0;i<q;i++,t+=2){const s=3*i,r=i>0?s-3:s,o=i+1<q?s+3:s,a=H[s],h=H[s+1],l=H[s+2],c=L.size[i],u=3*t;if(v){const e=L.side;this.writeSweptPair(u,a,h,l,e[s],e[s+1],e[s+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*F,this.widthBuffer[t+1]=c*F;this.previousBuffer[u]=H[r],this.previousBuffer[u+1]=H[r+1],this.previousBuffer[u+2]=H[r+2],this.previousBuffer[u+3]=H[r],this.previousBuffer[u+4]=H[r+1],this.previousBuffer[u+5]=H[r+2],this.nextBuffer[u]=H[o],this.nextBuffer[u+1]=H[o+1],this.nextBuffer[u+2]=H[o+2],this.nextBuffer[u+3]=H[o],this.nextBuffer[u+4]=H[o+1],this.nextBuffer[u+5]=H[o+2];const d=2*t;let f;if(tt){const t=(X[i]-Z)*et;f=(x?1-t:t)*P}else if(1===$)f=x?(K-X[i])*it:X[i]*it-st;else{let t=i/J;if(i>Y&&(U||W)){const e=(i-Y)/J;t=U?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 p=(f+O)*m;this.uvBuffer[d]=p,this.uvBuffer[d+1]=nt,this.uvBuffer[d+2]=p,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*i,b=4*t;this.colorBuffer[b]=y[g],this.colorBuffer[b+1]=y[g+1],this.colorBuffer[b+2]=y[g+2],this.colorBuffer[b+3]=y[g+3],this.colorBuffer[b+4]=y[g],this.colorBuffer[b+5]=y[g+1],this.colorBuffer[b+6]=y[g+2],this.colorBuffer[b+7]=y[g+3],i+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 B=n.tint;if(void 0!==B){const e=this.colorBuffer;for(let i=4*r,s=4*t;i<s;i+=4)e[i]*=B.x,e[i+1]*=B.y,e[i+2]*=B.z,e[i+3]*=B.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(t,i){const s=this.mesh.geometry,n=s?.getIndexBuffer();if(t>0&&i>0){this.mesh.updateVerticesData(e.VertexBuffer.PositionKind,this.positionBuffer.subarray(0,3*t)),this.mesh.updateVerticesData(e.VertexBuffer.UVKind,this.uvBuffer.subarray(0,2*t)),this.uv1Buffer&&this.mesh.updateVerticesData(e.VertexBuffer.UV2Kind,this.uv1Buffer.subarray(0,2*t)),n&&this.scene.getEngine().updateDynamicIndexBuffer(n,this.indexBuffer.subarray(0,3*i),0),this.previousVB.update(this.previousBuffer.subarray(0,3*t)),this.nextVB.update(this.nextBuffer.subarray(0,3*t)),this.widthVB.update(this.widthBuffer.subarray(0,t));const s=this.mesh.getVertexBuffer(e.VertexBuffer.ColorKind);s&&s.update(this.colorBuffer.subarray(0,4*t)),this.mesh.subMeshes&&this.mesh.subMeshes.length>0&&(this.mesh.subMeshes[0].indexCount=3*i,this.mesh.subMeshes[0].verticesCount=t),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 qn extends r.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=cs(),this.cullingEnabled=!0,this.catchUpBudgetMs=2,this.simulationBudgetMs=1/0,this.frustumPlanes=[],this.boundsMin=new it,this.boundsMax=new it}collectFrustumPlanes(){const t=this.getScene(),e=this.frustumPlanes,i=t.activeCameras,r=t.activeCamera,o=i&&i.length>0?i:r?[r]:[],a=6*o.length;for(;e.length<a;)e.push(new n.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 i=0;i<6;i++)e[6*t+i]=r[i]}return e}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))}addSystem(t){if(this.isDisposed())throw new Error("BatchedRenderer.addSystem: the renderer has been disposed");const e=t,i=e._renderer;void 0!==i&&i!==this&&i.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(e){const i=e,s=e.getRendererSettings(),n=$s(s);for(let t=0;t<this.batches.length;t++)if(Bs(this.batches[t].settings,n))return this.batches[t].addSystem(i),void this.systemToBatchIndex.set(i,t);let r;const o=this.getScene();switch(s.renderMode){case t.RenderMode.Trail:r=new Ln(s,o,this.depth);break;case t.RenderMode.Mesh:case t.RenderMode.BillBoard:case t.RenderMode.VerticalBillBoard:case t.RenderMode.HorizontalBillBoard:case t.RenderMode.StretchedBillBoard:case t.RenderMode.Beam:r=new Cn(s,o,this.depth);break;default:throw new Error(`Unsupported render mode: ${s.renderMode}`)}r.mesh.parent=this,r.applyMeshLighting(this.meshLighting),r.addSystem(i),this.batches.push(r),this.batchEmptyFrames.push(0),this.systemToBatchIndex.set(i,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){const e=this.systemToBatchIndex.get(t);if(void 0!==e){const i=this.batches[e],s=$s(t.getRendererSettings());if(1===i.systems.size&&Ps(i.settings,s)&&!this.batches.some(t=>t!==i&&Bs(t.settings,s)))return void i.applyLiveSettings(s)}this.removeFromBatch(t),this.addSystem(t)}setDepthTexture(t,e={}){this.depth=t?as(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,i=qn.clamp(t.minQuality??e.minQuality,.05,1),s=qn.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=qn.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,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,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=qn.clamp(e.currentQuality-e.decreaseStep,e.minQuality,e.maxQuality):e.currentQuality=qn.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>qn.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;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()}}qn.EMPTY_BATCH_GRACE_FRAMES=120;const Jn=new WeakMap,Wn=new WeakMap;function Gn(t,e,i){if(Jn.has(t))return;const s={textures:new Set(e),materials:i};for(const t of s.textures)Wn.set(t,(Wn.get(t)??0)+1);Jn.set(t,s),t.onDisposeObservable.addOnce(()=>Qn(t))}function Qn(t){const e=Jn.get(t);if(void 0!==e){Jn.delete(t);for(const t of e.materials)t.dispose();for(const t of e.textures){const e=(Wn.get(t)??1)-1;e>0?Wn.set(t,e):(Wn.delete(t),t.dispose())}}}function jn(t){t.dispose(),Qn(t)}let Yn=0;class Hn extends r.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 Yi(this)}constructor(t,e){super("particleEmitter",e||void 0),this._matrixWorld=new at,this._matrixWorldFlag=-1,this.system=t}dispose(t,e=!1){this.isDisposed()||(super.dispose(t,e),Yn>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:Yi(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 Xn{static runOnAllParticleEmitters(t,e){Xn.traverseNode(t,t=>{t instanceof Hn&&e(t)})}static addToBatchRenderer(t,e){Xn.runOnAllParticleEmitters(t,t=>{e.addSystem(t.system)})}static play(t){Xn.runOnAllParticleEmitters(t,t=>{t.system.play()})}static stop(t){Xn.runOnAllParticleEmitters(t,t=>{t.system.stop()})}static pause(t){Xn.runOnAllParticleEmitters(t,t=>{t.system.pause()})}static restart(t){Xn.runOnAllParticleEmitters(t,t=>{t.system.restart()})}static setAutoDestroy(t,e){Xn.runOnAllParticleEmitters(t,t=>{t.system.autoDestroy=e})}static endEmit(t){Xn.runOnAllParticleEmitters(t,t=>{t.system.endEmit()})}static isEffectFinished(t){let e=!1,i=!0;return Xn.runOnAllParticleEmitters(t,t=>{e=!0,t.system.isFinished()||(i=!1)}),e&&i}static instantiate(t,e){const i=new Map,s=(t,e,n)=>{let o;if(t instanceof Hn)o=t.clone(n),i.set(t,o);else{if(!(t instanceof r.TransformNode))return null;o=new r.TransformNode(n??t.name,t.getScene()),o.position.copyFrom(t.position),o.rotation.copyFrom(t.rotation),o.scaling.copyFrom(t.scaling),t.rotationQuaternion&&(o.rotationQuaternion=t.rotationQuaternion.clone()),o.setEnabled(t.isEnabled(!1))}o.parent=e;for(const e of t.getChildren())s(e,o);return o},n=s(t,null,e);!function(t,e){for(let i=t;null!==i;i=i.parent){const t=Jn.get(i);if(void 0!==t)return void Gn(e,t.textures,[])}}(t,n);for(const t of i.values())for(const e of t.system.behaviors)if(e instanceof Ee){const t=i.get(e.subParticleSystem);void 0!==t&&(e.subParticleSystem=t)}return n}static getDuration(t){const e=[];Xn.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 Ee))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=Xn.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:(Xn.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 Dt)return t.value;if(t instanceof kt)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)Xn.traverseNode(t,e)}}const Zn=new WeakMap,Kn=new WeakMap,tr=new WeakSet,er=new WeakSet,ir=new WeakSet;function sr(t){if(!t?.isCube)return null;const e=t.files??t._files;return 6===e?.length?e.slice():null}function nr(t){return t.getScene?.()??null}function rr(t,e=nr(t)){return e&&Zn.get(t)?.get(e)||null}function or(t,e){const i=Zn.get(t);if(i)for(const[t,s]of[...i])e&&t!==e||(i.delete(t),tr.has(s)&&s.dispose())}function ar(t,e,i){let s=Zn.get(t);s||(s=new Map,Zn.set(t,s)),s.set(e,i),!er.has(i)&&i.onDisposeObservable&&(er.add(i),i.onDisposeObservable.addOnce(()=>{Zn.get(t)?.get(e)===i&&Zn.get(t).delete(e)})),!ir.has(t)&&t.onDisposeObservable&&(ir.add(t),t.onDisposeObservable.addOnce(()=>{ir.delete(t),or(t)}))}async function hr(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 S.Texture(n.toDataURL("image/jpeg",.92),e,{noMipmap:!0,invertY:!1,samplingMode:S.Texture.LINEAR_LINEAR});return o.name="quarksEnvAtlas",o}const lr={createFromFaceUrls:hr};function cr(t,e,i){const s=rr(t,e);if(s)return i(s),s;let n=Kn.get(t);n||(n=new Map,Kn.set(t,n));const r=n,o=()=>{const s=r.get(e);if(s)return void s.then(t=>{t&&i(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=lr.createFromFaceUrls(n,e).then(s=>(h(),o||e.isDisposed?(s.dispose(),null):(tr.add(s),ar(t,e,s),i(s),s))).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 rr(t,e)}function ur(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 dr=new Set(["SizeOverLife","SizeBySpeed"]),fr=new Set(["ColorOverLife","ColorBySpeed"]),mr=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 i=!0;for(let s=0;s<t.length;s++)if(e[s]!==t[s]){i=!1;break}if(i)return this.fusionSteps}this.plan=t.slice(),this.fusionSteps=$i(t);let i=!1,s=!1;for(let e=0;e<t.length;e++){const n=t[e].type;dr.has(n)?i=!0:fr.has(n)?s=!0:mr.has(n)||(i=!0,s=!0)}return this.changesSize=i,this.changesColor=s,this.fusionSteps}}function yr(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 gr{constructor(){this.min=new it,this.max=new it,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(e,i,s,n,r,o,a,h,l,c,u,d,f,m){if(0===e)return void(this.valid=!1);this.stepsSince=i?0:this.stepsSince+1,this.maxSize=l,this.maxSpeedSq=c;const p=Math.sqrt(c),y=u.renderMode;let g=p*m*(this.stepsSince+1);if(y===t.RenderMode.Mesh)g+=l*this.meshGeometryRadius(u.instancingGeometry);else if(y===t.RenderMode.StretchedBillBoard){const t=d;g+=l*(1+(t.lengthFactor??0)+p*(t.speedFactor??0))}else{const t=u.pivot;g+=l*(.75+(void 0===t?0:Math.abs(t.x)+Math.abs(t.y)+Math.abs(t.z)))}this.min.set(s,n,r),this.max.set(o,a,h),this.padding=g,this.inWorld=f,this.valid=!0}setWorld(t,e,i,s,n,r,o){this.min.set(t,e,i),this.max.set(s,n,r),this.padding=o,this.inWorld=!0,this.valid=!0}worldPadding(t){return this.inWorld?this.padding:this.padding*yr(t.matrixWorld.elements)}toWorld(t,e,i){if(!this.valid)return!1;const s=this.min,n=this.max;if(this.inWorld){const i=this.padding;return t.set(s.x-i,s.y-i,s.z-i),e.set(n.x+i,n.y+i,n.z+i),!0}const r=i.matrixWorld.elements,o=this.padding*yr(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:s.x,i=2&t?n.y:s.y,o=4&t?n.z:s.z,f=1/(r[3]*e+r[7]*i+r[11]*o+r[15]),m=(r[0]*e+r[4]*i+r[8]*o+r[12])*f,p=(r[1]*e+r[5]*i+r[9]*o+r[13])*f,y=(r[2]*e+r[6]*i+r[10]*o+r[14])*f;m<a&&(a=m),m>c&&(c=m),p<h&&(h=p),p>u&&(u=p),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 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}}function vr(t){return t.cycle>=1?Math.floor(t.cycle):1}function xr(t){return t.interval>0?t.interval:0}class Sr{constructor(t,e){this.system=t,this.spawner=e,this.memory=[],this.pathMatrix=new at,this.temp=new it}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 i=t.startDelay.genValue(e,0);return t.emissionOverTime.startGen(e),i}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 i=e.time/t.duration;return this.emitsFrom(t.emissionOverTime,i)||this.emitsFrom(t.emissionOverDistance,i)}emitsFrom(t,e){if(t.genValue(this.memory,e)>0)return!0;if("function"!==t.type)return!1;if(t instanceof Jt){for(let i=0;i<t.functions.length;i++)if(t.getEndX(i)>e&&t.functions[i][0].p.some(t=>t>0))return!0;return!1}for(let i=1;i<=64;i++)if(t.genValue(this.memory,e+(1-e)*i/64)>0)return!0;return!1}hasPendingBurstWaves(t){const e=t.burstWaves;if(void 0===e)return!1;const i=this.system.emissionBursts,s=this.system.duration;for(let n=0;n<t.burstIndex&&n<i.length;n++){const t=i[n],r=e[n]??0;if(r<vr(t)&&(0===r||t.time+r*xr(t)<=s))return!0}return!1}emit(t,e,i){const s=this.system;if(s.isDisposed)return;const n=s.duration,r=s.isEmitEnded&&e===s.emissionState;if(e.time>n)if(s.looping){e.time-=n,e.burstIndex=0,void 0!==e.burstWaves&&(e.burstWaves.length=0);const t=s.behaviors;for(let e=0;e<t.length;e++)t[e].reset()}else s.isEmitEnded||s.onlyUsedByOther||s.endEmit();s.worldSpace&&this.spawner.normalMatrix.getNormalMatrix(i);const o=s.emissionFactor();s.emissionBursts.length>0&&!r&&this.emitBursts(e,i);let a=0,h=0,l=0,c=0;const u=e.previousWorldPos;if(!s.isEmitEnded){const r=e.time/n;if(e.waitEmiting+=t*s.emissionOverTime.genValue(this.memory,r)*o,void 0!==u){this.temp.set(i.elements[12],i.elements[13],i.elements[14]),c=u.distanceTo(this.temp);const t=s.emissionOverDistance.genValue(this.memory,r)*o;if(t>0){l=e.travelDistance,e.travelDistance+=c;const i=Math.floor(e.travelDistance*t);i>0&&(e.travelDistance-=i/t,s.worldSpace&&c>0?(a=i,h=1/t):e.waitEmiting+=i)}else e.travelDistance=0}}const d=Math.floor(e.waitEmiting);d>0&&(this.spawner.spawn(d,e,i),e.waitEmiting-=d),a>0&&this.spawnAlongPath(a,e,i,u,l,h,c),void 0===e.previousWorldPos&&(e.previousWorldPos=new it),e.previousWorldPos.set(i.elements[12],i.elements[13],i.elements[14]),e.time+=t}emitBursts(t,e){const i=this.system.emissionBursts,s=this.system.duration,n=i.length,r=t.time,o=t.burstWaves??(t.burstWaves=[]);for(;t.burstIndex<n&&i[t.burstIndex].time<=r;)o[t.burstIndex]=0,t.burstIndex++;const a=t.burstIndex;for(let n=0;n<a;n++){const a=i[n],h=vr(a);let l=o[n]??0;if(l>=h)continue;const c=xr(a);for(;l<h;){const i=a.time+l*c;if(l>0&&i>s){l=h;break}if(i>r)break;t.burstWaveIndex=l,this.fireBurstWave(a,t,e),l++}o[n]=l}}fireBurstWave(t,e,i){if(z()>=t.probability)return;const s=t.count.genValue(this.memory,e.time/this.system.duration),n=this.system.emissionFactor(),r=Math.abs(n-1)<.001?s:Math.floor(s*n+z());e.isBursting=!0,e.burstParticleCount=r,this.spawner.spawn(r,e,i),e.isBursting=!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.spawner.spawn(1,e,a)}}}class br{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 i=this.listeners[t].indexOf(e);-1!==i&&this.listeners[t].splice(i,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 i=0;i<e.length;i++)e[i](t)}}const wr=new Float32Array([-.5,-.5,0,.5,-.5,0,.5,.5,0,-.5,.5,0]),Mr=new Float32Array([0,0,1,0,1,1,0,1]),zr=new Uint32Array([0,1,2,0,2,3]),_r=new WeakMap,Vr=new WeakMap;function Ar(t){let e=_r.get(t);return void 0!==e&&e.length===t.length/3*2||(e=new Float32Array(t.length/3*2),_r.set(t,e)),e}function Tr(t){let e=Vr.get(t);if(!e){e=new Float32Array(t.length);for(let t=2;t<e.length;t+=3)e[t]=1;Vr.set(t,e)}return e}const Or=1/60;class $r{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 i=e>1?Math.ceil(8*e):8,s=Math.min(i,Math.max(0,Math.round(this.accumulator/Or-1e-9)));return this.accumulator-=s*Or,s}get residual(){return this.accumulator>Or?Or:this.accumulator<-Or?-Or: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/Or);return this.pendingCatchUp=0,t}}const Pr=new it;function Cr(t,e,i,s){const n=t[i],r=t[s];return t[i]=r,t[s]=n,i!==s&&(e.swapRows(i,s),r.setStoreIndex(i),n.setStoreIndex(s)),n}function Br(t){return t?.getScene()?t:null}const Er=new it(0,0,1),Fr=new et,Ir=new et,Nr=new it,Ur=new it;class Rr{constructor(t){this.system=t,this.normalMatrix=new vt}rebind(){const t=this.system.particles;for(let e=0;e<t.length;e++)t[e].rebind()}grow(t){const e=this.system,i=e.particles.length;e.store.ensureCapacity(i+1)&&this.rebind(),e.particles.push(t?new ze(e.store,i):new we(e.store,i))}spawn(e,i,s){const n=this.system,r=Nr,o=Ur;s.decompose(r,Ir,o);const a=n.behaviors,h=a.length,l=n.rendererSettings.renderMode,c=l===t.RenderMode.Trail,u=!c,d=l===t.RenderMode.Mesh,f=n.startRotation,m=n.startSize,p="rotation"===f.type,y="vec3function"===m.type,g=i.time/n.duration,v=c?n.rendererEmitterSettings:void 0,x=Boolean(v?.followLocalOrigin),S=n.worldSpace,b="hierarchy"===n.scalingMode,w=n.particles;void 0!==n.maxParticles&&(e=Math.min(e,Math.max(0,n.maxParticles-n.particleNum)));for(let t=0;t<e;t++){i.burstParticleIndex=t,n.particleNum++,w.length<n.particleNum&&this.grow(c);const e=w[n.particleNum-1];if(e.reset(),e.serial=(e.serial??0)+1,e.speedModifier=1,n.finishedEventFired=!1,n.startColor.startGen(e.memory),n.startColor.genColor(e.memory,e.startColor,g),e.color.copy(e.startColor),n.startSpeed.startGen(e.memory),e.startSpeed=n.startSpeed.genValue(e.memory,g),n.startLife.startGen(e.memory),e.life=n.startLife.genValue(e.memory,g),e.age=0,m.startGen(e.memory),y)m.genValue(e.memory,e.startSize,g);else{const t=m.genValue(e.memory,g);e.startSize.set(t,t,t)}if(n.startTileIndex.startGen(e.memory),e.uvTile=n.startTileIndex.genValue(e.memory),e.size.copy(e.startSize),u){const t=e;if(f.startGen(e.memory),d)t.rotation instanceof et||(t.rotation=Fr),t.angularVelocity instanceof et&&t.angularVelocity.set(0,0,0,1),p?f.genValue(e.memory,t.rotation,1,g):t.rotation.setFromAxisAngle(Er,f.genValue(t.memory,g));else{t.rotation=p?0:f.genValue(t.memory,g),t.angularVelocity=0;const e=n.flip;t.flip=void 0===e?0:(z()<e.x?1:0)|(z()<e.y?2:0)}}else if(v){const t=e;v.startLength.startGen(t.memory),t.length=v.startLength.genValue(t.memory,g),t.ensureHistoryCapacity(Math.max(1,Math.ceil(t.length))),t.resetHistory()}n.emitterShape.initialize(e,i),n.alignToDirection&&u&&Dr(e,d);const r=i.particle,l=i.inherit;if(void 0!==r&&void 0!==l&&0!==l&&kr(e,r,l,u),c&&x){const t=e;t.localPosition||(t.localPosition=new it),t.localPosition.copy(t.position)}S?(e.position.applyMatrix4(s),e.startSize.multiply(o).abs(),e.size.copy(e.startSize),b?e.velocity.multiply(n.hierarchyScale).applyQuaternion(Ir):e.velocity.multiply(o).applyMatrix3(this.normalMatrix),e.rotation&&e.rotation instanceof et&&e.rotation.multiplyQuaternions(Ir,e.rotation)):n.onlyUsedByOther&&(e.parentMatrix=s);for(let t=0;t<h;t++)a[t].initialize(e,n);n.store.recordMemory(e.storeIndex,e.memory)}}}function Dr(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;Nr.copy(i).divideScalar(Math.sqrt(s)),Ir.setFromUnitVectors(Er,Nr),e.multiplyQuaternions(Ir,e)}else 0===i.x&&0===i.y||(t.rotation=t.rotation+Math.atan2(-i.x,i.y))}function kr(t,e,i,s){if(i&Ce.color&&(t.startColor.multiply(e.color),t.color.copy(t.startColor)),i&Ce.size&&(t.startSize.multiply(e.size),t.size.copy(t.startSize)),i&Ce.rotation&&s){const i=t,s=e.rotation;"number"==typeof i.rotation?"number"==typeof s&&(i.rotation+=s):s instanceof et&&i.rotation.multiplyQuaternions(s,i.rotation)}i&Ce.lifetime&&e.life>0&&(t.life*=Math.max(0,1-e.age/e.life))}function Lr(t,e,i,s,n={}){return{param:t,json:n.json,get:e,isDefault:t=>t===i,toJSON:t=>t,fromJSON:s,clone:t=>t}}function qr(t){return"number"==typeof t?t:void 0}function Jr(t){return"number"==typeof t?ss(t):void 0}function Wr(t){return"number"==typeof t&&Number.isFinite(t)&&t>=0?t:void 0}function Gr(t){return"number"==typeof t?0!==t:"boolean"==typeof t?t:void 0}function Qr(t,e,i,s,n=!0){const r=JSON.stringify(i().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 Dt(t):s(t),clone:t=>t.clone()}}function jr(t){const e=t;if(void 0!==e)return void 0===e.z?[e.x,e.y]:[e.x,e.y,e.z]}const Yr=[Lr("autoDestroy",t=>t.autoDestroy,!1,Gr),Lr("looping",t=>t.looping,!0,Gr),Lr("prewarm",t=>t.prewarm,!1,Gr),Lr("prewarmTime",t=>t.prewarmTime,0,qr),Lr("duration",t=>t.duration,1,qr),Qr("startDelay",t=>t.startDelay,()=>new Dt(0),Wt,!1),Qr("startLife",t=>t.startLife,()=>new Dt(5),Wt),Qr("startSpeed",t=>t.startSpeed,()=>new Dt(0),Wt),Qr("startRotation",t=>t.startRotation,()=>new Dt(0),t=>ae(t)),Qr("startSize",t=>t.startSize,()=>new Dt(1),t=>ae(t)),Qr("startColor",t=>t.startColor,()=>new te(new At(1,1,1,1)),t=>ee(t)),Qr("emissionOverTime",t=>t.emissionOverTime,()=>new Dt(10),Wt),Qr("emissionOverDistance",t=>t.emissionOverDistance,()=>new Dt(0),Wt),{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)?os(t.map(t=>({time:t.time,count:"number"==typeof t.count?new Dt(t.count):Wt(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()}))},Lr("maxParticles",t=>t.maxParticles,void 0,qr),Lr("onlyUsedByOther",t=>t.onlyUsedByOther,!1,Gr),Lr("renderMode",t=>t.renderMode,t.RenderMode.BillBoard,qr),Lr("renderOrder",t=>t.renderOrder,0,qr),Lr("renderingGroupId",t=>t.renderingGroupId,0,qr),Lr("applyFog",t=>t.applyFog,!0,t=>!1!==t),Lr("playbackSpeed",t=>t.playbackSpeed,1,qr),Lr("cullingMode",t=>t.cullingMode,"always",ts),Lr("scalingMode",t=>t.scalingMode,"shape",t=>"hierarchy"===t?"hierarchy":"shape"),Lr("seed",t=>t.seed,void 0,qr),Lr("sortMode",t=>t.sortMode,"none",Ki),Lr("alignToDirection",t=>t.alignToDirection,!1,t=>!0===t),Lr("minParticleSize",t=>t.minParticleSize,0,qr),Lr("maxParticleSize",t=>t.maxParticleSize,1/0,qr),Lr("layerMask",t=>t.layers.mask,268435455,qr,{json:"layers"}),Qr("startTileIndex",t=>t.startTileIndex,()=>new Dt(0),Wt),Lr("uTileCount",t=>t.uTileCount,1,Jr),Lr("vTileCount",t=>t.vTileCount,1,Jr),Lr("blendTiles",t=>t.blendTiles,!1,Gr),Lr("softParticles",t=>t.softParticles,!1,Gr),Lr("softFarFade",t=>t.softFarFade,1,Wr),Lr("softNearFade",t=>t.softNearFade,0,Wr),Lr("blendMode",t=>t.blending,o.Constants.ALPHA_ADD,qr,{json:"blending"}),Lr("transparent",t=>t.transparent,!0,Gr),Lr("depthTest",t=>t.depthTest,!0,Gr),Lr("depthWrite",t=>t.depthWrite,!1,Gr),Lr("alphaTest",t=>t.alphaTest,0,qr),Lr("worldSpace",t=>t.worldSpace,!1,Gr),{param:"pivot",get:t=>t.pivot,isDefault:t=>void 0===t,toJSON:jr,fromJSON:t=>Array.isArray(t)?new it(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:jr,fromJSON:t=>Array.isArray(t)?new Mt(t[0]??0,t[1]??0):void 0,clone:t=>t?.clone()}];function Hr(t){return t.json??t.param}function Xr(t){const e={};for(const i of Yr){const s=i.get(t);!i.always&&i.isDefault(s)||(e[Hr(i)]=i.toJSON(s))}return e}function Zr(t){const e={};for(const i of Yr)e[i.param]=i.clone(i.get(t));return e}const Kr=new WeakMap,to=new WeakMap,eo=new WeakMap;function io(t,e){const i=(Kr.get(t)??0)+1;return Kr.set(t,i),`${e}_${i}`}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 no(t){const e={},i=Bn(t),s=En(t);return i>0&&(e.tessellation=i),s>0&&(e.curveTension=s),e}function ro(t){const e={},i=In(t),s=Nn(t),n=Un(t),r=Rn(t);return"stretch"!==i&&(e.textureMode=i),1!==s&&(e.textureScale=s),n>0&&(e.minVertexDistance=n),r!==1/0&&(e.lifetime=r),e}function oo(t){return t?.followLocalOrigin?{followLocalOrigin:!0}:{}}function ao(t){const e=t?.sideAxis;return e?{sideAxis:[e.x,e.y,e.z]}:{}}function ho(t){if(null==t)return{};let e,i,s;Array.isArray(t)?[e,i,s]=t:"object"==typeof t&&({x:e,y:i,z:s}=t);const n=t=>"number"==typeof t?t:"string"==typeof t&&""!==t.trim()?Number(t):NaN,[r,o,a]=[n(e),n(i),n(s)];return Number.isFinite(r)&&Number.isFinite(o)&&Number.isFinite(a)&&r*r+o*o+a*a>0?{sideAxis:new it(r,o,a)}:(console.warn(`[quarks] sideAxis ${JSON.stringify(t)} is not a direction and is ignored`),{})}function lo(e,i){const s=void 0===i||"string"==typeof i?{geometries:{},materials:{},textures:{},images:{},shapes:{},skeletons:{},animations:{},nodes:{}}:i,n=function(t,e){const i=t.rendererSettings,s=[i.instancingGeometry,i.instancingIndices,i.instancingUVs,i.instancingUVs2,i.instancingNormals];let n=to.get(e);void 0===n&&(n=[],to.set(e,n));const r=n.find(t=>t.arrays.every((t,e)=>t===s[e]));if(void 0!==r)return r.uuid;const o=io(e,"quarks_geometry");return n.push({arrays:s,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}(e,s),r=function(t,e){let i=eo.get(e);void 0===i&&(i=new Map,eo.set(e,i));const s=i,n=(t,i=!1,n="texture")=>{if(!(t instanceof S.Texture||i&&t))return void(t&&console.warn(`[quarks] ${n} is not a url-backed Texture and is not written to the file`));let r=s.get(t);return void 0===r&&(r=io(e,"quarks_texture"),s.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=io(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?ms(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",ms(a.maskUV)),...a.softness!==gs?{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",ms(h.mapUV,xs)),...h.strength!==Ss?{strength:h.strength}:{}}}:{},sourceMaterial:t.material??void 0},u}(e,s),o=function(e){if(e.renderMode===t.RenderMode.Trail){const t=e.rendererEmitterSettings;return{startLength:t.startLength.toJSON(),...oo(t),...so(t),...no(t),...ro(t),...ao(t)}}if(e.renderMode===t.RenderMode.StretchedBillBoard)return{speedFactor:e.rendererEmitterSettings.speedFactor,lengthFactor:e.rendererEmitterSettings.lengthFactor};return{}}(e);return{version:"3.0",shape:e.emitterShape.toJSON(),...Xr(e),instancingGeometry:n,...Object.keys(o).length>0?{rendererEmitterSettings:o}:{},material:r,behaviors:e.behaviors.map(t=>t.toJSON())}}function co(e,i,s){const n=e.shape?Gi(e.shape,i):void 0;let r;if(e.renderMode===t.RenderMode.Trail){const t=e.rendererEmitterSettings;r={startLength:void 0!==t?.startLength?Wt(t.startLength):new Dt(30),followLocalOrigin:Boolean(t?.followLocalOrigin),...so(t),...no(t),...ro(t),...ho(t?.sideAxis)}}else e.renderMode===t.RenderMode.StretchedBillBoard?(r={...e.rendererEmitterSettings??{}},void 0!==e.speedFactor&&(r.speedFactor=e.speedFactor)):r={};const a=e.material?i.materials?.[e.material]:void 0,h=a?.texture??e.texture,l="string"==typeof h?i.textures?.[h]??null:h??null,c=t=>"string"==typeof t?i.textures?.[t]??null:t??null,u=a?.erosion,d=a?.gradientMap,f=a?.uvDistortion,m=function(t){if(t?.positions){const e=t.positions instanceof Float32Array?t.positions:new Float32Array(t.positions);return{positions:e,indices:ur(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;return e.index?.array&&(i=new("Uint16Array"===e.index.type?Uint16Array:Uint32Array)(e.index.array)),{positions:t,indices:ur(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:wr,indices:zr,uvs:Mr}}("string"==typeof e.instancingGeometry?i.geometries?.[e.instancingGeometry]:e.instancingGeometry),p=function(t){const e={},i=t;for(const t of Yr){const s=i[Hr(t)];if(null==s)continue;const n=t.fromJSON(s);void 0!==n&&(e[t.param]=n)}return e}(e);return{...p,scene:s,shape:n,instancingGeometry:m.positions,instancingIndices:m.indices,instancingUVs:m.uvs,instancingUVs2:m.uvs2,instancingNormals:m.normals,rendererEmitterSettings:r,texture:l,material:a?.sourceMaterial??a,blendMode:a?.alphaMode??p.blendMode??o.Constants.ALPHA_ADD,transparent:a?.transparent??p.transparent??!0,depthTest:a?.depthTest??p.depthTest??!0,depthWrite:a?.depthWrite??p.depthWrite??!1,alphaTest:a?.alphaTest??p.alphaTest??0,behaviors:[],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}}const uo=new it,fo=new et,mo=new it,po=new it,yo=new et,go=new it,vo=new it,xo=new et,So=new it;class bo{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>Or?t:Or}set time(t){const e=this.duration;let i=Number.isFinite(t)&&t>0?t:0;i>=e&&(i=this.looping?i%e:e);const s=this.emissionState;s.time=i,s.isBursting=!1,s.burstIndex=0,s.burstWaveIndex=0,s.burstWaves=void 0,this.markBurstsBefore(i)}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=ss(t),this.neededToUpdateRender=!0}get vTileCount(){return this.rendererSettings.vTileCount}set vTileCount(t){this.rendererSettings.vTileCount=ss(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=Ki(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=es(t),this.neededToUpdateRender=!0}get lighting(){return this.rendererSettings.lighting??"fixed"}set lighting(t){this.rendererSettings.lighting=Zi(t),this.neededToUpdateRender=!0}get rim(){return this.rendererSettings.rim}set rim(t){this.rendererSettings.rim=us(t),this.neededToUpdateRender=!0}get mapUV(){return this.rendererSettings.mapUV}set mapUV(t){this.rendererSettings.mapUV=ws(t),this.neededToUpdateRender=!0}get gradientMap(){return this.rendererSettings.gradientMap}set gradientMap(t){this.rendererSettings.gradientMap=ys(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=bs(t),this.neededToUpdateRender=!0}measureMotionScale(t){if("hierarchy"!==this.scalingMode||!this.worldSpace)return this.hierarchyScale.set(1,1,1),1;const e=t.elements,i=Math.sqrt(e[0]*e[0]+e[1]*e[1]+e[2]*e[2]),s=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(i,s,n),(i+s+n)/3}get softNearFade(){return this.rendererSettings.softNearFade}set softNearFade(t){this.rendererSettings.softNearFade=ns(t,0),this.neededToUpdateRender=!0}get softFarFade(){return this.rendererSettings.softFarFade}set softFarFade(t){this.rendererSettings.softFarFade=ns(t,1),this.neededToUpdateRender=!0}get instancingGeometry(){return this.rendererSettings.instancingGeometry}set instancingGeometry(t){this.restartKeepingPause();const e=this.rendererSettings,i=t.length/3*2,s=e.instancingGeometry;var n,r;e.instancingGeometry=t,t.length===s.length&&function(t,e){for(let i=0;i<t.length;i++)if(t[i]>=e)return!1;return!0}(e.instancingIndices,t.length/3)||(e.instancingIndices=ur(t)),e.instancingUVs?.length===i&&(n=e.instancingUVs,r=s,void 0===n||n!==_r.get(r))||(e.instancingUVs=Ar(t)),e.instancingNormals&&(e.instancingNormals.length!==t.length||function(t,e){return void 0!==t&&t===Vr.get(e)}(e.instancingNormals,s))&&(e.instancingNormals=Tr(t)),e.instancingUVs2&&e.instancingUVs2.length!==i&&(e.instancingUVs2=void 0),this.ensureMeshNormals(),this.neededToUpdateRender=!0}ensureMeshNormals(){const e=this.rendererSettings;e.renderMode!==t.RenderMode.Mesh||e.instancingNormals||(e.instancingNormals=Tr(e.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??Ar(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=is(t),this.neededToUpdateRender=!0}get renderMode(){return this.rendererSettings.renderMode}set renderMode(e){if(this.rendererSettings.renderMode!==e){let i=!1;switch(this.rendererSettings.renderMode===t.RenderMode.Trail&&(i=!0),this.rendererSettings.renderMode===t.RenderMode.Mesh&&(this.startRotation=new Dt(0)),e){case t.RenderMode.Trail:this.rendererEmitterSettings={startLength:new Dt(30),followLocalOrigin:!1},i=!0;break;case t.RenderMode.Mesh:this.rendererEmitterSettings={},this.startRotation=new Gt(new it(0,1,0),new Dt(0));break;case t.RenderMode.StretchedBillBoard:this.rendererEmitterSettings={speedFactor:0,lengthFactor:2};break;case t.RenderMode.BillBoard:case t.RenderMode.VerticalBillBoard:case t.RenderMode.HorizontalBillBoard:case t.RenderMode.Beam:this.rendererEmitterSettings={}}this.rendererSettings.renderMode=e,i&&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:A(t),void 0!==this.emissionState&&0===this.emissionState.time&&0===this.particleNum&&(this.emission.memory.length=0,this.initSystemGenerators())}constructor(e){var i,s;if(this.prewarmTimeValue=0,this.durationValue=1,this.store=new xe(64),this.emitterVelocity=new it,this.finishedEventFired=!1,this.clock=new $r,this.tempEmitterPos=new it,this.stepMatrix=new at,this.spawner=new Rr(this),this.emission=new Sr(this,this.spawner),this.events=new br,this.materialRef=null,this.qualityFactor=1,this.destroyed=!1,this.behaviorPlan=new pr,this.hierarchyScale=new it(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 gr,this.firstTimeUpdate=!0,this.beamEndScratch=new it,this.rebindParticles=()=>this.spawner.rebind(),this.fireParticleDied=t=>{this.events.fire({type:"particleDied",particleSystem:this,particle:t})},this.sceneRef=e.scene,this.layerMaskProxy={mask:e.layerMask??268435455},Object.defineProperty(this.layerMaskProxy,"mask",{enumerable:!0,get:()=>this.rendererSettings.layerMask,set:t=>{this.rendererSettings.layerMask=t,this.neededToUpdateRender=!0}}),this.autoDestroy=e.autoDestroy??!1,this.duration=e.duration??1,this.startDelay=e.startDelay??new Dt(0),this.looping=e.looping??!0,this.prewarm=e.prewarm??!1,this.prewarmTime=e.prewarmTime??0,this.startLife=e.startLife??new Dt(5),this.startSpeed=e.startSpeed??new Dt(0),this.startRotation=e.startRotation??new Dt(0),this.startSize=e.startSize??new Dt(1),this.startColor=e.startColor??new te(new At(1,1,1,1)),this.emissionOverTime=e.emissionOverTime??new Dt(10),this.emissionOverDistance=e.emissionOverDistance??new Dt(0),this.emissionBursts=os(e.emissionBursts),this.maxParticles="number"==typeof(i=e.maxParticles)&&i>=0&&i<1/0?Math.floor(i):void 0,this.onlyUsedByOther=e.onlyUsedByOther??!1,this.emitterShape=e.shape??new qi,this.behaviors=e.behaviors??[],this.worldSpace=e.worldSpace??!1,this.rendererEmitterSettings=e.rendererEmitterSettings??{},e.renderMode===t.RenderMode.Trail){const t={...this.rendererEmitterSettings};this.rendererEmitterSettings=t,t.startLength=t.startLength??new Dt(30),t.followLocalOrigin=t.followLocalOrigin??!1}if(e.renderMode===t.RenderMode.StretchedBillBoard){const t={...this.rendererEmitterSettings};this.rendererEmitterSettings=t,void 0!==e.speedFactor&&(t.speedFactor=e.speedFactor),t.speedFactor=t.speedFactor??0,t.lengthFactor=t.lengthFactor??0}this.rendererSettings={instancingGeometry:e.instancingGeometry??wr,instancingIndices:e.instancingIndices??zr,instancingUVs:e.instancingUVs??(e.instancingGeometry?Ar(e.instancingGeometry):Mr),instancingUVs2:e.instancingUVs2,instancingNormals:e.instancingNormals,renderMode:e.renderMode??t.RenderMode.BillBoard,renderOrder:e.renderOrder??0,uTileCount:ss(e.uTileCount),vTileCount:ss(e.vTileCount),blendTiles:e.blendTiles??!1,softParticles:e.softParticles??!1,softNearFade:ns(e.softNearFade,0),softFarFade:ns(e.softFarFade,1),materialBlendMode:e.blendMode??o.Constants.ALPHA_ADD,materialTransparent:e.transparent??!0,materialDepthTest:e.depthTest??!0,materialDepthWrite:e.depthWrite??!1,materialAlphaTest:is(e.alphaTest),texture:e.texture??null,reflectionTexture:null,reflectionLevel:1,reflectionAtlas:null,layerMask:e.layerMask??268435455,pivot:es(e.pivot),sortMode:Ki(e.sortMode),minParticleSize:Math.max(0,e.minParticleSize??0),maxParticleSize:e.maxParticleSize??1/0,renderingGroupId:e.renderingGroupId??0,applyFog:e.applyFog??!0,lighting:Zi(e.lighting),rim:us(e.rim),mapUV:ws(e.mapUV),gradientMap:ys(e.gradientMap),erosion:vs(e.erosion),uvDistortion:bs(e.uvDistortion)},this.flip=(s=e.flip)&&(s.x>0||s.y>0)?s.clone():void 0,this.playbackSpeed=e.playbackSpeed??1,this.cullingMode=ts(e.cullingMode),this.scalingMode="hierarchy"===e.scalingMode?"hierarchy":"shape",this.alignToDirection=!0===e.alignToDirection,this.seed=e.seed,this.ensureMeshNormals(),this.materialRef=e.material??null,this.applyMaterialSettings(this.materialRef,{blendMode:e.blendMode,transparent:e.transparent,depthTest:e.depthTest,depthWrite:e.depthWrite,alphaTest:e.alphaTest,texture:e.texture,layerMask:e.layerMask}),this.neededToUpdateRender=!0,this.particles=[],this.startTileIndex=e.startTileIndex||new Dt(0),this.emitter=new Hn(this,e.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 i=this.rendererSettings.reflectionTexture;i?.isCube&&i.getScene()&&this.sceneRef&&cr(i,this.sceneRef,t=>{this.destroyed||this.rendererSettings.reflectionTexture!==i||(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 i=function(t,e,i){const s=void 0!==e.texture?e.texture:t?.albedoTexture??t?.diffuseTexture??t?.emissiveTexture??t?.opacityTexture??t?.baseTexture??i.texture??null,n=t?.reflectionTexture??t?.environmentTexture??i.reflectionTexture??null,r="number"==typeof n?.level?n.level:1,o=e.blendMode??("number"==typeof t?.alphaMode?t.alphaMode:i.materialBlendMode),a=e.transparent??("function"==typeof t?.needAlphaBlending?t.needAlphaBlending():"number"==typeof t?.alpha?t.alpha<1:i.materialTransparent),h=e.depthTest??("boolean"==typeof t?.disableDepthTest?!t.disableDepthTest:i.materialDepthTest),l=e.depthWrite??("boolean"==typeof t?.disableDepthWrite?!t.disableDepthWrite:"boolean"==typeof t?.forceDepthWrite?t.forceDepthWrite:i.materialDepthWrite),c=e.alphaTest??(()=>{const e=t?.transparencyMode,s=1===e||3===e;return s&&"number"==typeof t?.alphaCutOff?t.alphaCutOff:s&&"number"==typeof t?.alphaCutOffValue?t.alphaCutOffValue:t?0:i.materialAlphaTest})();return{texture:s,reflectionTexture:n,reflectionLevel:"number"==typeof t?.reflectionLevel?t.reflectionLevel:r,reflectionAtlas:Br(t?.reflectionAtlas)??Br(e.reflectionAtlas)??Br(i.reflectionAtlas),blendMode:o,transparent:a,depthTest:h,depthWrite:l,alphaTest:c}}(t,e,this.rendererSettings);this.rendererSettings.texture=i.texture,this.rendererSettings.reflectionTexture=i.reflectionTexture,this.rendererSettings.reflectionLevel=i.reflectionLevel;let s=i.reflectionAtlas;const n=i.reflectionTexture;!s&&n?.isCube&&(s=rr(n,this.sceneRef),!s&&this.sceneRef&&(cr(n,this.sceneRef,e=>{this.rendererSettings.reflectionAtlas!==e&&(this.rendererSettings.reflectionAtlas=e,t&&!Br(t.reflectionAtlas)&&(t.reflectionAtlas=e),this.watchEnvAtlas(e,t),this.neededToUpdateRender=!0)}),s=rr(n,this.sceneRef))),this.rendererSettings.reflectionAtlas=s,this.watchEnvAtlas(s,t),this.rendererSettings.materialBlendMode=i.blendMode,this.rendererSettings.materialTransparent=i.transparent,this.rendererSettings.materialDepthTest=i.depthTest,this.rendererSettings.materialDepthWrite=i.depthWrite,this.rendererSettings.materialAlphaTest=is(i.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===t.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){Yn++;try{t.dispose()}finally{Yn--}}(this.emitter),this.events.fire({type:"destroy",particleSystem:this}))}initSystemGenerators(){const t=this.rng,e=void 0===t?void 0:V(t);try{this.clock.setStartDelay(this.emission.rollGenerators())}finally{void 0!==t&&V(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=A(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,rs(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,i){if(this.paused||this.destroyed)return;const s=this.playbackSpeed;if(t=$r.frameSeconds(t,s),this.culled)return"pauseAndCatchUp"===this.cullingMode&&this.clock.deferCatchUp(t),void(this.previousEmitterMatrix=void 0);if(this.clock.owesCatchUp){if(this.catchUp(i??performance.now()+bo.catchUpBudgetMs),this.paused||this.destroyed)return;(this.previousEmitterMatrix??(this.previousEmitterMatrix=new at)).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,s);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 it)).copy(this.tempEmitterPos),this.clock.delaying&&(!this.prewarm||!this.looping)&&0===(t=this.clock.consumeStartDelay(t)))return;const r=this.clock.accrue(t,s);if(0===r)return;const o=this.emitter.matrixWorld,a=this.previousEmitterMatrix,h=r>1&&void 0!==a&&!a.equals(o);h&&(a.decompose(uo,fo,mo),o.decompose(po,yo,go));let l=o;for(let t=0;t<r;t++){if(h&&t+1<r){const e=(t+1)/r;vo.copy(uo).lerp(po,e),xo.copy(fo).slerp(yo,e),So.copy(mo).lerp(go,e),l=this.stepMatrix.compose(vo,xo,So)}else l=o;if(this.simulateStep(Or,l),this.paused||this.destroyed)break;if(e!==1/0&&t+1<r&&performance.now()>=e)break}this.destroyed||(this.previousEmitterMatrix??(this.previousEmitterMatrix=new at)).copy(l)}catchUp(t){let e=this.clock.takeCatchUpSteps();for(;e-- >0&&(this.simulateStep(Or),!this.paused&&!this.destroyed)&&!(e>0&&performance.now()>=t););}markBurstsBefore(t){const e=this.emissionState,i=this.emissionBursts,s=e.burstWaves??(e.burstWaves=[]);for(;e.burstIndex<i.length&&i[e.burstIndex].time<t;){const n=i[e.burstIndex],r=vr(n),o=xr(n);let a=0;if(o>0)for(;a<r&&n.time+a*o<t;)a++;else a=r;s[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,bo.maxPrewarmSeconds)),i=Math.round(e/Or);if(e<this.duration){const t=this.emissionState;t.time=this.duration-i*Or,this.markBurstsBefore(t.time)}for(let t=0;t<i;t++)if(this.simulateStep(Or),this.paused||this.destroyed)return}getWorldBounds(e,i){if(!this.bounds.toWorld(e,i,this.emitter))return!1;if(this.rendererSettings.renderMode===t.RenderMode.Beam){const t=this.beamEndScratch;if(!this.getBeamEnd(t))return!0;const s=this.bounds.worldPadding(this.emitter);e.set(Math.min(e.x,t.x-s),Math.min(e.y,t.y-s),Math.min(e.z,t.z-s)),i.set(Math.max(i.x,t.x+s),Math.max(i.y,t.y+s),Math.max(i.z,t.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}setWorldBounds(t,e,i,s,n,r,o){this.bounds.setWorld(t,e,i,s,n,r,o)}get simulationStep(){return Or}get simulationResidual(){return this.paused?0:this.clock.residual}simulateStep(t,e=this.emitter.matrixWorld){const i=this.rng;if(void 0===i)return void this.stepOnce(t,e);const s=V(i);try{this.stepOnce(t,e)}finally{V(s)}}stepOnce(e,i){if(this.destroyed)return;this.motionScale=this.measureMotionScale(i),this.onlyUsedByOther||this.emission.emit(e,this.emissionState,i);const s=this.particles,n=this.behaviors,r=this.particleNum,o=this.store,a=this.rendererSettings.renderMode,h=a===t.RenderMode.Trail,l=this.behaviorPlan.steps(n),c=this.behaviorPlan.changesSize,u=this.behaviorPlan.changesColor;!function(t,e,i,s,n,r){const o=3*e;t.useSizeSnapshot(i),t.useColorSnapshot(s),t.previousPosition.set(t.position.subarray(0,o)),i&&t.previousSize.set(t.size.subarray(0,o)),n&&(t.keepPreviousVelocity()&&r(),t.previousVelocity.set(t.velocity.subarray(0,o))),s&&t.previousColor.set(t.color.subarray(0,4*e))}(o,r,c,u,a===t.RenderMode.StretchedBillBoard,this.rebindParticles),this.emitterShape.update(this,e),function(t,e,i,s,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===s)continue;if(void 0!==a.run){a.run(e,i,s,n,r);continue}const l=h[0];if(void 0===l.updateAll)for(let t=0;t<s;t++){const e=i[t];e.age<e.life&&l.update(e,n)}else l.updateAll(i,s,n)}}(l,n,s,r,e,o);const d=this.events.has("particleDied")?this.fireParticleDied:void 0;let f=this.particleNum;if(h){const t=this.rendererEmitterSettings;!function(t,e,i,s){const n=t.scalars,r=xe.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+xe.AGE]&&(i&&(o[c]=a[c],o[c+1]=a[c+1],o[c+2]=a[c+2]),s&&(h[u]=l[u],h[u+1]=l[u+1],h[u+2]=l[u+2],h[u+3]=l[u+3]))}(o,r,c,u),function(t,e,i,s,n,r){if(n){for(let i=0;i<s;i++){const s=e[i];s.localPosition?(s.position.copy(s.localPosition),s.position.applyMatrix4(s.parentMatrix??r)):s.position.addScaledVector(s.velocity,t*s.speedModifier),s.age+=t}return}const o=i.scalars,a=xe.SCALAR_STRIDE,h=i.position,l=i.velocity;for(let e=0,i=0,n=0;e<s;e++,i+=3,n+=a){const e=t*o[n+xe.SPEED_MODIFIER];h[i]+=l[i]*e,h[i+1]+=l[i+1]*e,h[i+2]+=l[i+2]*e,o[n+xe.AGE]+=t}}(e,s,o,r,Boolean(t.followLocalOrigin),i),function(t,e,i,s,n){const r=i.dieWithParticle,o=i.recordWorldSpace&&!s,a=i.sideAxis,h=s||Boolean(i.recordWorldSpace),l=Un(i),c=Rn(i);for(let i=0;i<e;i++){const e=t[i],s=e.age<e.life;if(r&&!s){e.resetHistory();continue}let u=!1;if(l>0&&s&&e.historyCount>1){const t=e.historyDistances,i=e.historyCount;u=t[e.getHistoryIndex(i-1)]-t[e.getHistoryIndex(i-2)]<l}if(e.update(u,!o),o&&s){const t=(e.historyHead+e.historyCapacity-1)%e.historyCapacity*3,i=e.historyPositions;Pr.set(i[t],i[t+1],i[t+2]),Pr.applyMatrix4(e.parentMatrix??n),i[t]=Pr.x,i[t+1]=Pr.y,i[t+2]=Pr.z,e.measureHeadDistance()}if(c!==1/0){const t=e.historyAges,i=e.age;for(;e.historyCount>0&&i-t[e.getHistoryIndex(0)]>c;)e.dropOldest()}if(a&&s){e.ensureSideHistory();const t=(e.historyHead+e.historyCapacity-1)%e.historyCapacity*3,i=e.historySides;let s=a.x,r=a.y,o=a.z;if(h){const t=(e.parentMatrix??n).elements,i=t[0]*s+t[4]*r+t[8]*o,a=t[1]*s+t[5]*r+t[9]*o;o=t[2]*s+t[6]*r+t[10]*o,s=i,r=a}i[t]=s,i[t+1]=r,i[t+2]=o}}}(s,r,t,this.worldSpace,i),f=function(t,e,i,s){const n=e.scalars,r=xe.SCALAR_STRIDE;for(let o=0;o<i;o++){const a=t[o],h=o*r;n[h+xe.AGE]>=n[h+xe.LIFE]&&0===a.historyCount&&(Cr(t,e,o,i-1),i--,o--,void 0!==s&&s(a))}return i}(s,o,f,d)}else f=function(t,e,i,s,n,r,o,a,h){const l=i.scalars,c=xe.SCALAR_STRIDE,u=i.position,d=i.velocity,f=i.previousSize,m=i.size,p=i.previousColor,y=i.color,g=o.due,v=o.min,x=o.max;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:o.maxSize,A=g?0:o.maxSpeedSq;for(let o=0;o<s;o++){const a=o*c;let v=l[a+xe.AGE];const x=3*o,T=g||0===v;if(0===v&&(n&&(f[x]=m[x],f[x+1]=m[x+1],f[x+2]=m[x+2]),r)){const t=4*o;p[t]=y[t],p[t+1]=y[t+1],p[t+2]=y[t+2],p[t+3]=y[t+3]}const O=t*l[a+xe.SPEED_MODIFIER],$=d[x],P=d[x+1],C=d[x+2],B=u[x]+$*O,E=u[x+1]+P*O,F=u[x+2]+C*O;if(u[x]=B,u[x+1]=E,u[x+2]=F,T&&(S=Math.min(S,B),M=Math.max(M,B),b=Math.min(b,E),z=Math.max(z,E),w=Math.min(w,F),_=Math.max(_,F),V=Math.max(V,Math.max(m[x],Math.max(m[x+1],m[x+2])))),A=Math.max(A,$*$+P*P+C*C),v+=t,l[a+xe.AGE]=v,v>=l[a+xe.LIFE]){const t=Cr(e,i,o,s-1);s--,o--,void 0!==h&&h(t)}}return o.store(s,g,S,b,w,M,z,_,V,A,a.rendererSettings,a.rendererEmitterSettings,a.worldSpace,Or),s}(e,s,o,f,c,u,this.bounds,this,d);this.particleNum=this.destroyed?0:f,this.notifyFinished()}notifyFinished(){this.isFinished()&&(this.finishedEventFired||(this.finishedEventFired=!0,this.events.fire({type:"finished",particleSystem:this})),this.autoDestroy&&this.dispose())}emit(t,e,i){this.emission.emit(t,e,i)}toJSON(t,e={}){return lo(this,t)}static fromJSON(t,e,i={},s){const n=new bo(co(t,e,s));return n.behaviors=(t.behaviors??[]).map(t=>{const e=yi(t,n);return e&&"EmitSubParticleSystem"===e.type&&(i[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 e=this.behaviors.map(t=>t.clone());let i;if(this.renderMode===t.RenderMode.Trail){const t=this.rendererEmitterSettings;i={startLength:t.startLength.clone(),followLocalOrigin:Boolean(t.followLocalOrigin),...so(t),...no(t),...ro(t),...t.sideAxis?{sideAxis:t.sideAxis.clone()}:{}}}else i=this.renderMode===t.RenderMode.StretchedBillBoard?{lengthFactor:this.rendererEmitterSettings.lengthFactor,speedFactor:this.rendererEmitterSettings.speedFactor}:{};const s=new bo({...Zr(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:i,material:this.materialRef,texture:this.rendererSettings.texture,behaviors:e,lighting:this.lighting,rim:this.rim,mapUV:this.mapUV,gradientMap:this.gradientMap,erosion:this.erosion,uvDistortion:this.uvDistortion,scene:this.emitter.getScene()});for(const t of e)t instanceof Ee&&(t.particleSystem=s);this.tint&&(s.tint=this.tint.clone()),s.emissionMultiplier=this.emissionMultiplier;const n=this.beamEnd;return n&&(s.beamEnd="function"==typeof n.getAbsolutePosition?n:{x:n.x,y:n.y,z:n.z}),s}}bo.catchUpBudgetMs=2,bo.maxPrewarmSeconds=10;class wo extends r.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(),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(),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 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(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 Hn?i.target.system.endEmit():i.clip?.stop?.():"ps"===i.type&&i.target instanceof Hn?i.target.system.restart():i.clip?.play?.()})}getDuration(){return this.duration}resolveReferences(t){const e={},i=t=>{var s;const n=t._quarksUUID;n?e[n]=t:e[s=t.uniqueId.toString()]??(e[s]=t);const o=t.getChildren();for(const t of o)t instanceof r.TransformNode&&i(t)};i(t),this._tempAnimationJSON.forEach(t=>{const i=e[t.targetUUID];if("ps"===t.type&&i instanceof Hn)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,...1!==this.timeScale?{timeScale:this.timeScale}:{},animationData:this.animationData.map(t=>({startTime:t.startTime,duration:t.duration,type:t.type,targetUUID:Yi(t.target),clipUUID:"three"===t.type?t.clipUUID??t.clip?.uuid:void 0,loop:t.loop}))}}static fromJSON(t,e){const i=new wo(t.name||"QuarksPrefab",e);return"number"==typeof t.timeScale&&(i.timeScale=t.timeScale),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 Mo=new WeakMap;function zo(t,e,i){Mo.set(t,{source:e,loaded:i})}function _o(t){const e=Mo.get(t);return void 0!==e&&t.url===e.loaded?e.source:void 0}const Vo={[S.Texture.WRAP_ADDRESSMODE]:1e3,[S.Texture.CLAMP_ADDRESSMODE]:1001,[S.Texture.MIRROR_ADDRESSMODE]:1002};function Ao(t){return!!t&&(!/^blob:/i.test(t)&&(!/^data:/i.test(t)||t.includes(",")))}function To(t){const e=t.rotationQuaternion??u.Quaternion.FromEulerVector(t.rotation);return Array.from(u.Matrix.Compose(t.scaling,e,t.position).asArray())}class Oo{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,i=[],s=t=>{e.add(t.uuid),i.push(t),t.children?.forEach(s)};s(t);for(const t of i)for(const[i,s]of $o(t))""===s||e.has(s)||this.warn(`"${t.name}" has ${i} on node "${s}", 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 r.TransformNode,!0).filter(t=>!1!==this.options.filter?.(t)).map(t=>this.node(t)),i={uuid:Yi(t),type:"Group",name:t.name,matrix:To(t)};if(t.isEnabled(!1)||(i.visible=!1),t instanceof d.Mesh&&!t.isVisible&&(i.isVisible=!1),t instanceof Hn)i.type="ParticleEmitter",i.ps=t.system.toJSON(this.meta);else if(t instanceof wo){const{type:e,name:s,...n}=t.toJSON();Object.assign(i,n),i.type="QuarksPrefab"}else t instanceof d.Mesh?(i.type="Mesh",i.geometry=this.meshGeometry(t),i.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&&(i.children=e),i}id(t){return this.nextId+=1,`${t}_${this.nextId}`}meshGeometry(t){const i=t.geometry?this.geometryIds.get(t.geometry):void 0;if(void 0!==i)return i;const s=t.getVerticesData(e.VertexBuffer.PositionKind);if(!s||0===s.length)return void this.warn(`Mesh "${t.name}" has no vertices; it is written without geometry.`);const n=t.getIndices(),r=ur(s instanceof Float32Array?s:new Float32Array(s),n&&n.length>0?Uint32Array.from(n):void 0),o=e=>{const i=t.getVerticesData(e);return i?Array.from(i):void 0},a={uuid:this.id("quarks_mesh_geometry"),type:"QuarksGeometry",positions:Array.from(s),indices:Array.from(r)},h=o(e.VertexBuffer.UVKind),l=o(e.VertexBuffer.UV2Kind),c=o(e.VertexBuffer.NormalKind);return h&&(a.uvs=h),l&&(a.uvs2=l),c&&(a.normals=c),this.meshGeometries.set(a.uuid,a),t.geometry&&this.geometryIds.set(t.geometry,a.uuid),a.uuid}meshMaterial(t){const e=t.material;if(!e)return;if(!(e instanceof b.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 i=this.meshMaterialIds.get(e);if(void 0!==i)return i;i=this.id("quarks_mesh_material"),this.meshMaterialIds.set(e,i);const s=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&&s&&n||this.warn(`Mesh "${t.name}": its material's alpha and colours are not written; it loads opaque white.`);const r={uuid:i,type:"MeshBasicMaterial"};return e.alphaMode!==o.Constants.ALPHA_COMBINE&&(r.alphaMode=e.alphaMode),e.backFaceCulling&&(r.side=0),0!==e.alphaCutOff&&(r.alphaTest=e.alphaCutOff),e.disableDepthWrite||(r.depthWrite=!0),this.meshMaterials.push({json:r,map:e.diffuseTexture}),i}texture(t){for(const[e,i]of Object.entries(this.meta.textures))if(i===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 i=[],s=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 S.Texture?this.options.imageUrl?this.options.imageUrl(e):_o(e)??e.url:null;if(Ao(o)){let t=s.get(o);void 0===t&&(t=`quarks_image_${s.size+1}`,s.set(o,t),i.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 S.Texture&&Object.assign(r,Po(e)),n.push(r)}const o=Object.values(this.meta.materials).map(t=>{const{sourceMaterial:e,...i}=t;return i});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:i,object:t}}}function*$o(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 Po(t){const e={};return t.invertY||(e.invertY=!1),t.noMipmap&&(e.noMipmap=!0),t.samplingMode!==o.Constants.TEXTURE_TRILINEAR_SAMPLINGMODE&&(e.samplingMode=t.samplingMode),t.wrapU===S.Texture.WRAP_ADDRESSMODE&&t.wrapV===S.Texture.WRAP_ADDRESSMODE||(e.wrap=[Vo[t.wrapU]??1e3,Vo[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 Co=new WeakMap,Bo=new WeakMap,Eo=new WeakMap;function Fo(t,e){let i=t.get(e);return void 0===i&&(i=new Map,t.set(e,i)),i}const Io=new WeakMap,No=new WeakMap;class Uo extends Error{constructor(t){super(t),this.name="QuarksFormatError"}}function Ro(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(Io.get(t)===e.url&&"string"==typeof e.url){Io.set(e,e.url);const i=No.get(t);void 0!==i&&No.set(e,i)}return e})),Array.isArray(t.geometries)&&(e.geometries=t.geometries.map(t=>t&&"object"==typeof t?{...t}:t)),e}const Do=new WeakMap,ko=t=>t.reason??new Error("[QuarksLoader] The load was aborted."),Lo=()=>new Error("[QuarksLoader] The scene was disposed while the effect loaded.");function qo(t,e){if(e?.aborted)throw ko(e);if(t.isDisposed)throw Lo()}function Jo(t,e,i){return qo(e,i),new Promise((s,n)=>{const r=()=>n(ko(i));i?.addEventListener("abort",r,{once:!0});const o=e.onDisposeObservable.addOnce(()=>n(Lo()));t.then(s,n).finally(()=>{i?.removeEventListener("abort",r),e.onDisposeObservable.remove(o)})})}class Wo{constructor(t,e={}){this.scene=t,this.options=e}async load(t,e={}){const{json:i,baseUrl:s}=await Jo(this.fetchEffectDocument(t,e.signal),this.scene,e.signal);return this.loadFromJSON(i,s,e)}async loadFromJSON(t,e,i={}){const s=i.signal;qo(this.scene,s);const n=e??this.options.baseUrl??"";t=Ro(t),await Jo(this.resolveResources(t,n),this.scene,s);const r=this.parseDocument(t,"");return await this.finishLoad(r,s),r.root}static disposeEffect(t){jn(t)}async finishLoad(t,e){try{if(this.options.waitForTextures){for(const e of t.textures)e.delayLoadState===o.Constants.DELAYLOADSTATE_NOTLOADED&&e.delayLoad();await Jo(Promise.all(t.textures.map(t=>Do.get(t))),this.scene,e)}qo(this.scene,e)}catch(e){throw this.scene.isDisposed||jn(t.root),e}}async loadAll(t,e={}){qo(this.scene,e.signal);const i=Wo.mapPool(t,e.concurrency,async(i,s)=>{qo(this.scene,e.signal);try{return await this.fetchEffectDocument(i,e.signal)}catch(n){if(!e.continueOnError||e.signal?.aborted||this.scene.isDisposed)throw n;return console.warn(`[QuarksLoader] Failed to fetch effect "${i}" (${s+1}/${t.length}):`,n),null}}),s=await Jo(i,this.scene,e.signal);return this.loadDocuments(s,e)}async loadFromJSONAll(t,e={}){const i=t.map(t=>{if(null!==t&&"object"==typeof t&&"json"in t){const e=t;return{json:Ro(e.json),baseUrl:e.baseUrl??this.options.baseUrl??""}}return{json:Ro(t),baseUrl:this.options.baseUrl??""}});return this.loadDocuments(i,e)}async resolveResources(t,e=""){await Wo.resolveLinkedResources(t,{baseUrl:e,resolver:this.options.resolver,scene:this.scene,onResourceError:this.options.onResourceError})}static async resolveLinkedResources(t,e={}){const i=e.baseUrl??"",s=e.resolver,n=e.scene;await Wo.inlineGeometryEntries(t,async t=>{const e=await Wo.resolveWith(s,t,"geometry",i);return Wo.fetchJsonWith(s,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(Io.get(t)===t.url)return;const e=t.url;t.url=await Wo.resolveWith(s,t.url,"image",i),Io.set(t,t.url),/^(data|blob):/i.test(t.url)||No.set(t,e)}))}static async resolveExternalGeometries(t,e){await Wo.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 i=t.metadata?.quarksFormat;"number"==typeof i&&i>1&&console.warn(`[QuarksLoader] This effect was written in format ${i}, newer than the 1 this version of babylon.quarks reads; settings it does not know are left out.`);const s={ownedMaterials:[],images:{},imageSources:{},textures:{},geometries:{},materials:{}};t.geometries&&this.parseGeometries(t.geometries,s),t.images&&this.parseImages(t.images,e,s),t.textures&&this.parseTextures(t.textures,s),t.materials&&this.parseMaterials(t.materials,s);const n=this.parseObject(t.object,s);this.linkReferences(n);const r=[...new Set(Object.values(s.textures).filter(t=>null!==t))];return Gn(n,r,s.ownedMaterials),{root:n,textures:r}}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=Fo(Bo,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){Co.delete(t),Bo.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,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=[],m=t/s,p=o+m*a;for(let t=0;t<=i;t++){const s=t/i,o=n+s*r,a=-e*Math.cos(o)*Math.sin(p),d=e*Math.cos(p),y=e*Math.sin(o)*Math.sin(p);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-m),u.push(f++)}d.push(u)}const m=o<=0,p=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&&m||u.push(i,n,o),t===s-1&&p||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=ur(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 Wo.resolveWith(this.options.resolver,t,e,i)}async fetchEffectDocument(t,e){const i=this.options.baseUrl||t.substring(0,t.lastIndexOf("/")+1),s=await this.resolveResourceUrl(t,"effect",i);return{json:await Wo.fetchJsonWith(this.options.resolver,s,void 0,e),baseUrl:i}}async loadDocuments(t,e){if(0===t.length)return[];qo(this.scene,e.signal);const i=new AbortController,s=()=>i.abort(ko(e.signal));e.signal?.addEventListener("abort",s,{once:!0});try{return await this.loadResolvedDocuments(t,e,i)}finally{e.signal?.removeEventListener("abort",s)}}async loadResolvedDocuments(t,e,i){const s=t.length,n=i.signal,r=new Array(s).fill(null),o=new Array(s).fill(!1);let a=0;const h=(t,i)=>{o[t]||n.aborted||(o[t]=!0,r[t]=i,a++,e.onProgress?.(a,s))};await Jo(Promise.all(t.map(async(i,n)=>{if(i)try{await this.resolveResources(i.json,i.baseUrl)}catch(i){if(!e.continueOnError)throw i;console.warn(`[QuarksLoader] Failed to resolve resources for effect ${n+1}/${s}:`,i),t[n]=null,h(n,null)}})),this.scene,n);const l=[],c=[];try{for(let i=0;i<s;i++){if(o[i])continue;const r=t[i];if(!r){h(i,null);continue}let a;try{a=this.parseDocument(r.json,"")}catch(t){if(!e.continueOnError)throw t;console.warn(`[QuarksLoader] Failed to parse effect ${i+1}/${s}:`,t),h(i,null);continue}l.push(a),c.push(this.finishLoad(a,n).then(()=>h(i,a.root)))}await Promise.all(c)}catch(t){throw n.aborted||i.abort(t),Promise.allSettled(c),this.scene.isDisposed||l.forEach(t=>jn(t.root)),t}return r}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):Wo.joinUrl(s,e)}static fetchJsonWith(t,e,i,s){const n=async()=>{if(t?.fetchJson)return s?t.fetchJson(e,{signal:s}):t.fetchJson(e);const i=await(s?fetch(e,{signal:s}):fetch(e));if(!i.ok)throw new Error(`HTTP ${i.status}`);return i.json()};if(!i)return n();const r=Fo(Eo,i),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,i=Wo.warnResourceError){const s=Array.isArray(t?.geometries)?t.geometries:[];await Promise.all(s.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){i("geometry",t.url,e)}}))}static warnResourceError(t,e,i){console.warn(`[QuarksLoader] Could not load ${t} "${e}":`,i)}reportResourceError(t,e,i){(this.options.onResourceError??Wo.warnResourceError)(t,e,i)}parseImages(t,e,i){for(const s of t){s.url&&Wo.warnIfNotAnImageUrl(s.url),i.images[s.uuid]=s.url?Wo.joinUrl(e,s.url):null;const t=No.get(s)??s.url;t&&!/^(data|blob):/i.test(t)&&(i.imageSources[s.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 i of t){const t=e.images[i.image];if(t){const s=void 0===i.invertY||!!i.invertY,n=!!i.noMipmap,r=!1!==this.options.shareResources,o=r?[s,n,i.samplingMode,i.wrap,i.repeat,i.offset,i.rotation].join("|")+"|"+t:"",a=r?Fo(Co,this.scene):void 0,h=a?.get(o);if(void 0!==h){e.textures[i.uuid]=h;continue}let l;const c=new Promise(t=>l=t);let u,d=!1;const f={noMipmap:n,invertY:s,samplingMode:"number"==typeof i.samplingMode?i.samplingMode:void 0,onLoad:()=>l(),onError:(e,i)=>{d=!0,void 0!==a&&a.get(o)===u&&a.delete(o),this.reportResourceError("image",t,i??e),l()}};try{u=new S.Texture(t,this.scene,f)}catch{e.textures[i.uuid]=null;continue}Do.set(u,c);const m=e.imageSources[i.image];void 0!==m&&zo(u,m,t),u.onDisposeObservable.addOnce(()=>l()),Array.isArray(i.wrap)&&(u.wrapU=this.mapWrapMode(i.wrap[0]),u.wrapV=this.mapWrapMode(i.wrap[1]??i.wrap[0])),Array.isArray(i.repeat)&&(u.uScale=i.repeat[0]??1,u.vScale=i.repeat[1]??1),Array.isArray(i.offset)&&(u.uOffset=i.offset[0]??0,u.vOffset=i.offset[1]??0),"number"==typeof i.rotation&&(u.wAng=i.rotation),void 0===a||d||(a.set(o,u),u.onDisposeObservable.addOnce(()=>{a.get(o)===u&&a.delete(o)})),e.textures[i.uuid]=u}else e.textures[i.uuid]=null}}mapWrapMode(t){switch(t){case 1001:return S.Texture.CLAMP_ADDRESSMODE;case 1002:return S.Texture.MIRROR_ADDRESSMODE;default:return S.Texture.WRAP_ADDRESSMODE}}parseMaterials(t,e){for(const i of t){const t={uuid:i.uuid,transparent:i.transparent??!0,blending:i.blending??1,side:i.side??2,depthTest:i.depthTest??!0,depthWrite:i.depthWrite??!1,alphaTest:i.alphaTest??0,texture:null},s=i.map??i.texture;s&&(t.texture=e.textures[s]||null);const n=i.reflectionAtlas;if(n&&(t.reflectionAtlas=e.textures[n]||null),"number"==typeof i.reflectionLevel&&(t.reflectionLevel=i.reflectionLevel),"unlit"!==i.lighting&&"fixed"!==i.lighting&&"scene"!==i.lighting||(t.lighting=i.lighting),i.rim&&"object"==typeof i.rim&&(t.rim=i.rim),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:o.Constants.ALPHA_COMBINE,2:o.Constants.ALPHA_ADD,3:o.Constants.ALPHA_SUBTRACT,4:o.Constants.ALPHA_MULTIPLY};t.alphaMode=e[i.blending]||o.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 r.TransformNode(e||t||"node",this.scene);return i.quarksOriginalType=t,i}createMeshNode(t,e){const i=new d.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 y.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 n=this.getMaterial(e,t.material);if(n){const t=new b.StandardMaterial(`quarks_loader_material_${n.uuid}`,this.scene);e.ownedMaterials.push(t),t.alphaMode=n.alphaMode??o.Constants.ALPHA_COMBINE,t.backFaceCulling=2!==n.side,t.alphaCutOff=n.alphaTest??0,t.disableDepthWrite=!n.depthWrite,n.texture&&(t.diffuseTexture=n.texture,t.opacityTexture=n.texture),i.material=t}return i}parseObject(t,e){let i;switch(t.type){case"QuarksPrefab":i=wo.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 r.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=u.Matrix.FromArray(t.matrix),s=new u.Vector3(1,1,1),n=u.Quaternion.Identity(),r=new u.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 u.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),!1===t.isVisible&&i instanceof d.Mesh&&(i.isVisible=!1),t.children)for(const s of t.children){this.parseObject(s,e).parent=i}return i}parseParticleSystem(t,e){const i=bo.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 r.TransformNode&&i(e)};i(t);const s=i=>{if(i instanceof wo&&i.resolveReferences(t),i instanceof Hn){const t=i.system,s=t._meshSurfaceReferenceUUID;if(s&&"mesh_surface"===t.emitterShape.type){const n=e[s];n instanceof d.Mesh?t.emitterShape.mesh=n:console.warn(`[QuarksLoader] Emitter "${i.name}" has a mesh surface shape on "${s}", `+(n?"which is not a mesh":"which is not in the effect")+"; it emits nothing until a mesh is set.")}for(let s=0;s<t.behaviors.length;s++)if(t.behaviors[s]instanceof Ee){const n=t.behaviors[s],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 "${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 r.TransformNode&&s(t)};s(t)}}const Go={};const Qo={name:""},jo=[{name:"billboard",settings:{renderMode:t.RenderMode.BillBoard}},{name:"vertical billboard",settings:{renderMode:t.RenderMode.VerticalBillBoard}},{name:"horizontal billboard",settings:{renderMode:t.RenderMode.HorizontalBillBoard}},{name:"stretched",settings:{renderMode:t.RenderMode.StretchedBillBoard}},{name:"beam",settings:{renderMode:t.RenderMode.Beam}},{name:"mesh",settings:{renderMode:t.RenderMode.Mesh}},{name:"mesh scene lit",settings:{renderMode:t.RenderMode.Mesh,lighting:"scene"}},{name:"mesh unlit",settings:{renderMode:t.RenderMode.Mesh,lighting:"unlit"}},{name:"mesh rim",settings:{renderMode:t.RenderMode.Mesh,rim:us({mode:"add"})}},{name:"mesh unlit rim mix",settings:{renderMode:t.RenderMode.Mesh,lighting:"unlit",rim:us({mode:"mix"})}},{name:"mesh unlit rim fade",settings:{renderMode:t.RenderMode.Mesh,lighting:"unlit",rim:us({mode:"fade"})}},{name:"mesh reflecting",settings:{renderMode:t.RenderMode.Mesh,reflectionAtlas:Go},context:{envAtlasReady:!0}},{name:"mesh unlit reflecting rim fade",settings:{renderMode:t.RenderMode.Mesh,lighting:"unlit",reflectionAtlas:Go,rim:us({mode:"fade"})},context:{envAtlasReady:!0}},{name:"trail",settings:{renderMode:t.RenderMode.Trail}}],Yo=[Qo,{name:"pivot",settings:{pivot:new it(.5,0,0)}},{name:"size limits",settings:{minParticleSize:.01}},{name:"pivot size limits",settings:{pivot:new it(0,.5,.5),maxParticleSize:.5}}],Ho=[Qo,{name:"sheet",settings:{uTileCount:4,vTileCount:2}},{name:"sheet blend",settings:{uTileCount:4,vTileCount:2,blendTiles:!0}}],Xo=[Qo,{name:"map",settings:{texture:Go}}],Zo=[Qo,{name:"soft",settings:{softParticles:!0},context:{depth:{packed:!1}}},{name:"soft packed",settings:{softParticles:!0},context:{depth:{packed:!0}}}],Ko=[Qo,{name:"alpha test",settings:{materialAlphaTest:.5}}],ta=[Qo,{name:"fog",settings:{applyFog:!0}},{name:"fog additive",settings:{applyFog:!0,materialBlendMode:o.Constants.ALPHA_ADD}}],ea=(()=>{const t=ws({tiling:[2,2]}),e=ws({channel:1,tiling:[2,2]}),i=bs({map:Go}),s=bs({map:Go,mapUV:{channel:1}}),n=ys({ramp:Go}),r=vs({}),o=vs({mask:Go}),a=vs({mask:Go,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:i}},{name:"distortion uv1",settings:{uvDistortion:s}},{name:"map transform distortion gradient erosion mask",settings:{mapUV:t,uvDistortion:i,gradientMap:n,erosion:o}},{name:"map transform uv1 distortion gradient erosion",settings:{mapUV:e,uvDistortion:i,gradientMap:n,erosion:r}},{name:"every effect on uv1",settings:{mapUV:e,uvDistortion:s,gradientMap:n,erosion:a}}]})(),ia=["billboard","stretched","beam","mesh","mesh unlit","mesh unlit rim mix","mesh reflecting","trail"],sa={name:"uv2",context:{meshUV2:!0}},na={name:"soft packed alpha test fog additive",settings:{softParticles:!0,materialAlphaTest:.5,applyFog:!0,materialBlendMode:o.Constants.ALPHA_ADD},context:{depth:{packed:!0}}};ji(Xi),t.ApplyCollision=Ct,t.ApplyForce=ue,t.ApplySequences=me,t.AxisAngleGenerator=Gt,t.BatchedRenderer=qn,t.BehaviorFromJSON=yi,t.BehaviorTypes=pi,t.Bezier=Lt,t.BoxEmitter=Ei,t.ChangeEmitDirection=pe,t.CircleEmitter=Ii,t.ColorBySpeed=ge,t.ColorGeneratorFromJSON=ee,t.ColorOverLife=ve,t.ColorRange=Qt,t.ConeEmitter=Ni,t.ConstantColor=te,t.ConstantValue=Dt,t.DEG2RAD=$,t.DonutEmitter=Ui,t.EROSION_DEFAULT_SOFTNESS=gs,t.EdgeEmitter=Ri,t.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(Xn.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),Xn.restart(i),Xn.play(i),i)}stop(t){this.playing.has(t)&&Xn.endEmit(t)}release(t){this.playing.delete(t)&&(Xn.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=Xn.instantiate(this.template),e=[];return Xn.runOnAllParticleEmitters(t,t=>{const i=t.system;i.autoDestroy=!1,i.addEventListener("finished",this.onSystemFinished),e.push(i)}),this.systemsOf.set(t,e),Xn.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),jn(t)}},t.EmitSubParticleSystem=Ee,t.EmitterFrame=ce,t.EmitterFromJSON=Gi,t.EmitterShapes=Wi,t.Euler=gt,t.EulerGenerator=ie,t.ForceOverLife=Fe,t.FrameOverLife=Ie,t.GRADIENT_MAP_WEIGHTS=ps,t.GeneratorFromJSON=ae,t.Gradient=Ht,t.GravityForce=Ne,t.GridEmitter=Di,t.HemisphereEmitter=ki,t.InheritVelocity=Ue,t.IntervalValue=kt,t.LimitSpeedOverLife=Re,t.MAX_TRAIL_TESSELLATION=16,t.MathUtils=tt,t.Matrix3=vt,t.Matrix4=at,t.MeshSurfaceEmitter=Hi,t.MeshSurfaceEmitterPlugin=Xi,t.NodeParticle=class{constructor(){this.position=new it,this.velocity=new it,this.age=0,this.life=1,this.size=new it,this.rotation=0,this.color=new At(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}},t.Noise=ti,t.OrbitOverLife=ei,t.ParticleEmitter=Hn,t.ParticleStore=xe,t.ParticleSystem=bo,t.PiecewiseBezier=Jt,t.PiecewiseFunction=qt,t.Plugins=Qi,t.PointEmitter=Li,t.QUARKS_FORMAT_VERSION=1,t.QuarksFormatError=Uo,t.QuarksLoader=Wo,t.QuarksPrefab=wo,t.QuarksUtil=Xn,t.Quaternion=et,t.QuaternionView=bt,t.RAD2DEG=P,t.RandomColor=Xt,t.RandomColorBetweenGradient=Kt,t.RandomQuatGenerator=se,t.RecordState=class{constructor(t,e,i){this.position=t,this.size=e,this.color=i}},t.RectangleEmitter=Ji,t.Rotation3DOverLife=ii,t.RotationBySpeed=si,t.RotationGeneratorFromJSON=ne,t.RotationOverLife=ni,t.SequencerFromJSON=fe,t.ShapeTransform=Pi,t.SizeBySpeed=ri,t.SizeOverLife=oi,t.SpeedOverLife=ai,t.SphereEmitter=qi,t.SpriteParticle=we,t.SubEmitterInheritMask=Ce,t.TextureSequencer=de,t.TrailParticle=ze,t.TurbulenceField=li,t.UV_DISTORTION_DEFAULT_STRENGTH=Ss,t.UV_DISTORTION_DEFAULT_UV=xs,t.VFXBatch=zs,t.ValueGeneratorFromJSON=Wt,t.Vector2=Mt,t.Vector3=it,t.Vector3Function=re,t.Vector3GeneratorFromJSON=oe,t.Vector3View=_t,t.Vector4=At,t.Vector4View=Ot,t.VelocityOverLife=fi,t.WebGLCoordinateSystem=rt,t.WebGPUCoordinateSystem=ot,t.WidthOverLength=mi,t.cacheEnvAtlas=function(t,e){const i=nr(e)??nr(t);i?ar(t,i,e):console.warn("[babylon.quarks] cacheEnvAtlas: neither the atlas nor the cube has a scene; not cached")},t.ceilPowerOfTwo=Y,t.clamp=B,t.createEnvAtlasFromFaceUrls=hr,t.createSeededRandom=A,t.cubeFaceUrls=sr,t.damp=U,t.decodeSoftDepth=function(t,e){const i=e.z*t+e.w,s=Math.abs(i)>1e-8?Math.abs((e.x*t+e.y)/i):0;return s>0?s:1e30},t.defaultMeshLighting=cs,t.degToRad=G,t.denormalize=Z,t.disposeEnvAtlas=or,t.ensureEnvAtlasFromCube=cr,t.erosionEqual=function(t,e){return t===e||!(!t||!e)&&(t.mask===e.mask&&fs(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])},t.euclideanModulo=E,t.floorPowerOfTwo=H,t.generateUUID=C,t.getCachedEnvAtlas=rr,t.getPhysicsResolver=function(){return Pt},t.getRandomSource=_,t.getValueFromEmitterMode=Fi,t.gradientMapEqual=function(t,e){return t===e||!!t&&!!e&&t.ramp===e.ramp&&t.channel===e.channel},t.inverseLerp=I,t.isPowerOfTwo=j,t.lerp=N,t.loadPlugin=ji,t.mapLinear=F,t.mapUVEqual=function(t,e){return t===e||!!t&&!!e&&fs(t,e)},t.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])},t.normalize=K,t.normalizeErosion=vs,t.normalizeGradientMap=ys,t.normalizeMapUV=ws,t.normalizeMeshRim=us,t.normalizeTextureUV=ds,t.normalizeUVDistortion=bs,t.pingpong=R,t.planBehaviorFusion=$i,t.quarksNodeId=Yi,t.radToDeg=Q,t.randFloat=q,t.randFloatSpread=J,t.randInt=L,t.random=z,t.readBehaviorSpace=he,t.readsUV1=Ms,t.seededRandom=W,t.serializeEffect=function(t,e={}){const i=new Oo(e);let s;if(Array.isArray(t)){const n=e.name??"effect";s={uuid:`${n}-root`,type:"Group",name:n,matrix:u.Matrix.Identity().asArray().slice(),children:t.map(t=>i.node(t))}}else s=i.node(t);return i.finish(s)},t.setPhysicsResolver=function(t){Pt=t},t.setQuaternionFromProperEuler=X,t.setRandomSource=V,t.shaderProgram=Vn,t.shaderVariants=function(){const e=new Set,i=[],s=s=>{const n={renderMode:r=t.RenderMode.BillBoard,texture:null,reflectionAtlas:null,uTileCount:1,vTileCount:1,blendTiles:!1,softParticles:!1,materialAlphaTest:0,materialTransparent:!0,materialBlendMode:o.Constants.ALPHA_COMBINE,applyFog:!1,pivot:void 0,minParticleSize:0,maxParticleSize:1/0,lighting:r===t.RenderMode.Mesh?"fixed":void 0,rim:void 0,mapUV:void 0,uvDistortion:void 0,gradientMap:void 0,erosion:void 0};var r;const a={depth:null,envAtlasReady:!1,meshUV2:!1};for(const t of s)Object.assign(n,t.settings),Object.assign(a,t.context);const h=Vn(n,a),l=h.name+" "+h.defines.join(",");if(e.has(l))return;e.add(l);const c=s.map(t=>t.name).filter(t=>""!==t);i.push({name:`${c.join(", ")} [${h.defines.join(",")||"none"}]`,program:h})};for(const t of jo)for(const e of Yo)for(const i of Ho)for(const n of Xo)for(const r of Zo)for(const o of Ko)for(const a of ta)s([t,e,i,n,r,o,a]);for(const e of jo.filter(t=>ia.includes(t.name)))for(const i of e.settings?.renderMode===t.RenderMode.Mesh?[Qo,sa]:[Qo])for(const t of ea)for(const n of Xo)for(const r of[Qo,Ho[2]])for(const o of[Qo,na])s([e,i,t,n,r,o]);return i},t.smootherstep=k,t.smoothstep=D,t.softDepthParams=hs,t.speedFraction=ye,t.subEmitterInheritMask=Be,t.textureSourceUrl=_o,t.textureUVEqual=fs,t.textureUVToJSON=ms,t.trailCurveTension=En,t.trailLifetime=Rn,t.trailMinVertexDistance=Un,t.trailTessellation=Bn,t.trailTextureMode=In,t.trailTextureScale=Nn,t.unloadPlugin=function(t){const e=Qi.findIndex(e=>e.id===t);if(e<0)return;const i=Qi[e];Qi.splice(e,1);for(const t of i.emitterShapes)Wi[t.type]===t&&delete Wi[t.type];for(const t of i.behaviors)pi[t.type]===t&&delete pi[t.type]},t.uvDistortionEqual=function(t,e){return t===e||!(!t||!e)&&(t.map===e.map&&t.strength===e.strength&&fs(t.mapUV,e.mapUV))},t.withRandomSource=function(t,e){const i=V(t);try{return e()}finally{V(i)}}});
1
+ !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("@babylonjs/core/Buffers/buffer"),require("@babylonjs/core/Misc/guid"),require("@babylonjs/core/Maths/math.frustum"),require("@babylonjs/core/Maths/math.plane"),require("@babylonjs/core/Meshes/transformNode"),require("@babylonjs/core/Engines/constants"),require("@babylonjs/core/Maths/math.color"),require("@babylonjs/core/Maths/math.vector"),require("@babylonjs/core/Cameras/camera"),require("@babylonjs/core/Materials/shaderMaterial"),require("@babylonjs/core/Materials/Textures/rawTexture"),require("@babylonjs/core/Meshes/mesh"),require("@babylonjs/core/Meshes/mesh.vertexData"),require("@babylonjs/core/Engines/shaderStore"),require("@babylonjs/core/Materials/effect"),require("@babylonjs/core/Materials/shaderLanguage"),require("@babylonjs/core/Culling/boundingInfo"),require("@babylonjs/core/Materials/Textures/baseTexture"),require("@babylonjs/core/scene"),require("@babylonjs/core/Meshes/instancedMesh"),require("@babylonjs/core/Materials/Textures/texture"),require("@babylonjs/core/Materials/standardMaterial")):"function"==typeof define&&define.amd?define(["exports","@babylonjs/core/Buffers/buffer","@babylonjs/core/Misc/guid","@babylonjs/core/Maths/math.frustum","@babylonjs/core/Maths/math.plane","@babylonjs/core/Meshes/transformNode","@babylonjs/core/Engines/constants","@babylonjs/core/Maths/math.color","@babylonjs/core/Maths/math.vector","@babylonjs/core/Cameras/camera","@babylonjs/core/Materials/shaderMaterial","@babylonjs/core/Materials/Textures/rawTexture","@babylonjs/core/Meshes/mesh","@babylonjs/core/Meshes/mesh.vertexData","@babylonjs/core/Engines/shaderStore","@babylonjs/core/Materials/effect","@babylonjs/core/Materials/shaderLanguage","@babylonjs/core/Culling/boundingInfo","@babylonjs/core/Materials/Textures/baseTexture","@babylonjs/core/scene","@babylonjs/core/Meshes/instancedMesh","@babylonjs/core/Materials/Textures/texture","@babylonjs/core/Materials/standardMaterial"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).BabylonQuarks={},t.BABYLON,t.BABYLON,t.BABYLON,t.BABYLON,t.BABYLON,t.BABYLON,t.BABYLON,t.BABYLON,t.BABYLON,t.BABYLON,t.BABYLON,t.BABYLON,t.BABYLON,t.BABYLON,t.BABYLON,t.BABYLON,t.BABYLON,t.BABYLON,t.BABYLON,t.BABYLON,t.BABYLON,t.BABYLON)}(this,function(t,e,i,s,n,r,o,a,h,l,c,u,d,f,m,p,y,g,v,x,b,S,w){"use strict";let M=null;function z(){return null===M?Math.random():M()}function _(){return M??Math.random}function A(t){const e=_();return M=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 O=["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 P=Math.PI/180,$=180/Math.PI;function E(){const t=4294967295*Math.random()|0,e=4294967295*Math.random()|0,i=4294967295*Math.random()|0,s=4294967295*Math.random()|0;return(O[255&t]+O[t>>8&255]+O[t>>16&255]+O[t>>24&255]+"-"+O[255&e]+O[e>>8&255]+"-"+O[e>>16&15|64]+O[e>>24&255]+"-"+O[63&i|128]+O[i>>8&255]+"-"+O[i>>16&255]+O[i>>24&255]+O[255&s]+O[s>>8&255]+O[s>>16&255]+O[s>>24&255]).toLowerCase()}function C(t,e,i){return Math.max(e,Math.min(i,t))}function F(t,e){return(t%e+e)%e}function B(t,e,i,s,n){return s+(t-e)*(n-s)/(i-e)}function N(t,e,i){return t!==e?(i-t)/(e-t):0}function I(t,e,i){return(1-i)*t+i*e}function U(t,e,i,s){return I(t,e,1-Math.exp(-i*s))}function R(t,e=1){return e-Math.abs(F(t,2*e)-e)}function L(t,e,i){return t<=e?0:t>=i?1:(t=(t-e)/(i-e))*t*(3-2*t)}function D(t,e,i){return t<=e?0:t>=i?1:(t=(t-e)/(i-e))*t*t*(t*(6*t-15)+10)}function k(t,e){return t+Math.floor(z()*(e-t+1))}function q(t,e){return t+z()*(e-t)}function J(t){return t*(.5-z())}function W(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 G(t){return t*P}function Q(t){return t*$}function j(t){return!(t&t-1)&&0!==t}function Y(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 X(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),m=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*m,h*f,a*l);break;case"YXY":t.set(h*f,a*c,h*m,a*l);break;case"ZYZ":t.set(h*m,h*f,a*c,a*l);break;default:console.warn("../math.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: "+n)}}function Z(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 K(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 tt={DEG2RAD:P,RAD2DEG:$,generateUUID:E,clamp:C,euclideanModulo:F,mapLinear:B,inverseLerp:N,lerp:I,damp:U,pingpong:R,smoothstep:L,smootherstep:D,randInt:k,randFloat:q,randFloatSpread:J,seededRandom:W,degToRad:G,radToDeg:Q,isPowerOfTwo:j,ceilPowerOfTwo:Y,floorPowerOfTwo:H,setQuaternionFromProperEuler:X,normalize:K,denormalize:Z};class et{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],m=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]=m);if(c!==m||a!==u||h!==d||l!==f){let t=1-o;const e=a*u+h*d+l*f+c*m,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+m*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 et(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(C(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*z(),e=2*Math.PI*z(),i=z(),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}}Object.defineProperty(et.prototype,"isQuaternion",{value:!0});class it{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 it(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(nt.setFromEuler(t))}applyAxisAngle(t,e){return this.applyQuaternion(nt.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 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 i=this.dot(t)/e;return Math.acos(C(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=z(),this.y=z(),this.z=z(),this}randomDirection(){const t=z()*Math.PI*2,e=2*z()-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}}Object.defineProperty(it.prototype,"isVector3",{value:!0});const st=new it,nt=new et,rt=2e3,ot=2001;class at{constructor(t,e,i,s,n,r,o,a,h,l,c,u,d,f,m,p){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,m,p)}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,m,p){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]=m,y[15]=p,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 at).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/ht.setFromMatrixColumn(t,0).length(),n=1/ht.setFromMatrixColumn(t,1).length(),r=1/ht.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(ct,t,ut)}lookAt(t,e,i){const s=this.elements;return mt.subVectors(t,e),0===mt.lengthSq()&&(mt.z=1),mt.normalize(),dt.crossVectors(i,mt),0===dt.lengthSq()&&(1===Math.abs(i.z)?mt.x+=1e-4:mt.z+=1e-4,mt.normalize(),dt.crossVectors(i,mt)),dt.normalize(),ft.crossVectors(mt,dt),s[0]=dt.x,s[4]=ft.x,s[8]=mt.x,s[1]=dt.y,s[5]=ft.y,s[9]=mt.y,s[2]=dt.z,s[6]=ft.z,s[10]=mt.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],m=i[6],p=i[10],y=i[14],g=i[3],v=i[7],x=i[11],b=i[15],S=s[0],w=s[4],M=s[8],z=s[12],_=s[1],A=s[5],V=s[9],O=s[13],T=s[2],P=s[6],$=s[10],E=s[14],C=s[3],F=s[7],B=s[11],N=s[15];return n[0]=r*S+o*_+a*T+h*C,n[4]=r*w+o*A+a*P+h*F,n[8]=r*M+o*V+a*$+h*B,n[12]=r*z+o*O+a*E+h*N,n[1]=l*S+c*_+u*T+d*C,n[5]=l*w+c*A+u*P+d*F,n[9]=l*M+c*V+u*$+d*B,n[13]=l*z+c*O+u*E+d*N,n[2]=f*S+m*_+p*T+y*C,n[6]=f*w+m*A+p*P+y*F,n[10]=f*M+m*V+p*$+y*B,n[14]=f*z+m*O+p*E+y*N,n[3]=g*S+v*_+x*T+b*C,n[7]=g*w+v*A+x*P+b*F,n[11]=g*M+v*V+x*$+b*B,n[15]=g*z+v*O+x*E+b*N,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"number"==typeof t?(s[12]=t,s[13]=e,s[14]=i):(s[12]=t.x,s[13]=t.y,s[14]=t.z),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],m=t[13],p=t[14],y=t[15],g=c*p*h-m*u*h+m*a*d-o*p*d-c*a*y+o*u*y,v=f*u*h-l*p*h-f*a*d+r*p*d+l*a*y-r*u*y,x=l*m*h-f*c*h+f*o*d-r*m*d-l*o*y+r*c*y,b=f*c*a-l*m*a-f*o*u+r*m*u+l*o*p-r*c*p,S=e*g+i*v+s*x+n*b;if(0===S)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);const w=1/S;return t[0]=g*w,t[1]=(m*u*n-c*p*n-m*s*d+i*p*d+c*s*y-i*u*y)*w,t[2]=(o*p*n-m*a*n+m*s*h-i*p*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*p*n-f*u*n+f*s*d-e*p*d-l*s*y+e*u*y)*w,t[6]=(f*a*n-r*p*n-f*s*h+e*p*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*m*n-f*i*d+e*m*d+l*i*y-e*c*y)*w,t[10]=(r*m*n-f*o*n+f*i*h-e*m*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]=b*w,t[13]=(l*m*s-f*c*s+f*i*u-e*m*u-l*i*p+e*c*p)*w,t[14]=(f*o*s-r*m*s-f*i*a+e*m*a+r*i*p-e*o*p)*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"number"==typeof t?this.set(1,0,0,t,0,1,0,e,0,0,1,i,0,0,0,1):this.set(1,0,0,t.x,0,1,0,t.y,0,0,1,t.z,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,m=r*l,p=r*c,y=o*c,g=a*h,v=a*l,x=a*c,b=i.x,S=i.y,w=i.z;return s[0]=(1-(m+y))*b,s[1]=(d+x)*b,s[2]=(f-v)*b,s[3]=0,s[4]=(d-x)*S,s[5]=(1-(u+y))*S,s[6]=(p+g)*S,s[7]=0,s[8]=(f+v)*w,s[9]=(p-g)*w,s[10]=(1-(u+m))*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=ht.set(s[0],s[1],s[2]).length();const r=ht.set(s[4],s[5],s[6]).length(),o=ht.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],lt.copy(this);const a=1/n,h=1/r,l=1/o;return lt.elements[0]*=a,lt.elements[1]*=a,lt.elements[2]*=a,lt.elements[4]*=h,lt.elements[5]*=h,lt.elements[6]*=h,lt.elements[8]*=l,lt.elements[9]*=l,lt.elements[10]*=l,e.setFromRotationMatrix(lt),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===rt)d=-(r+n)/(r-n),f=-2*r*n/(r-n);else{if(o!==ot)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,m;if(o===rt)f=(r+n)*c,m=-2*c;else{if(o!==ot)throw new Error("../math.Matrix4.makeOrthographic(): Invalid coordinate system: "+o);f=n*c,m=-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]=m,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}}Object.defineProperty(at.prototype,"isMatrix4",{value:!0});const ht=new it,lt=new at,ct=new it(0,0,0),ut=new it(1,1,1),dt=new it,ft=new it,mt=new it,pt=new at,yt=new et;class gt{constructor(t=0,e=0,i=0,s=gt.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 gt(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(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===i&&this._onChangeCallback(),this}setFromQuaternion(t,e,i){return pt.makeRotationFromQuaternion(t),this.setFromRotationMatrix(pt,e,i)}setFromVector3(t,e=this._order){return this.set(t.x,t.y,t.z,e)}reorder(t){return yt.setFromEuler(this),this.setFromQuaternion(yt,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}}gt.DEFAULT_ORDER="XYZ",Object.defineProperty(gt.prototype,"isEuler",{value:!0});class vt{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],m=s[0],p=s[3],y=s[6],g=s[1],v=s[4],x=s[7],b=s[2],S=s[5],w=s[8];return n[0]=r*m+o*g+a*b,n[3]=r*p+o*v+a*S,n[6]=r*y+o*x+a*w,n[1]=h*m+l*g+c*b,n[4]=h*p+l*v+c*S,n[7]=h*y+l*x+c*w,n[2]=u*m+d*g+f*b,n[5]=u*p+d*v+f*S,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 m=1/f;return t[0]=c*m,t[1]=(s*h-l*i)*m,t[2]=(o*i-s*r)*m,t[3]=u*m,t[4]=(l*e-s*a)*m,t[5]=(s*n-o*e)*m,t[6]=d*m,t[7]=(i*a-h*e)*m,t[8]=(r*e-i*n)*m,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(xt.makeScale(t,e)),this}rotate(t){return this.premultiply(xt.makeRotation(-t)),this}translate(t,e){return this.premultiply(xt.makeTranslation(t,e)),this}makeTranslation(t,e){return"number"==typeof t?this.set(1,0,t,0,1,e,0,0,1):this.set(1,0,t.x,0,1,t.y,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 vt).fromArray(this.elements)}}Object.defineProperty(vt.prototype,"isMatrix3",{value:!0});const xt=new vt,bt=new Float32Array(4);class St extends et{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=bt,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 Mt{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 Mt(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(C(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=z(),this.y=z(),this}*[Symbol.iterator](){yield this.x,yield this.y}}Object.defineProperty(Mt.prototype,"isVector2",{value:!0});const zt=new Float32Array(3);class _t extends it{constructor(t,e){super(),this.data=t,this.offset=e}bind(t,e){this.data=t,this.offset=e}}const At=_t.prototype;At.data=zt,At.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}}});class Vt{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 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,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],m=a[2],p=a[6],y=a[10];if(Math.abs(l-u)<r&&Math.abs(c-m)<r&&Math.abs(f-p)<r){if(Math.abs(l+u)<o&&Math.abs(c+m)<o&&Math.abs(f+p)<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+m)/4,b=(f+p)/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=b/s):g<r?(i=.707106781,s=.707106781,n=0):(n=Math.sqrt(g),i=x/n,s=b/n),this.set(i,s,n,e),this}let g=Math.sqrt((p-f)*(p-f)+(c-m)*(c-m)+(u-l)*(u-l));return Math.abs(g)<.001&&(g=1),this.x=(p-f)/g,this.y=(c-m)/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=z(),this.y=z(),this.z=z(),this.w=z(),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z,yield this.w}}Object.defineProperty(Vt.prototype,"isVector4",{value:!0});const Ot=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 Pt=Tt.prototype;let $t;Pt.data=Ot,Pt.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 Et{constructor(t,e){this.resolver=t,this.bounce=e,this.type="ApplyCollision",this.tempV=new it}initialize(t){}update(t,e){const i=this.resolver??$t;void 0!==i&&i.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 Et(void 0,"number"==typeof t.bounce?t.bounce:1)}clone(){return new Et(this.resolver,this.bounce)}reset(){}}const Ct=t=>({r:t.x,g:t.y,b:t.z,a:t.w}),Ft=t=>new Vt(t.r,t.g,t.b,t.a);function Bt(t,e){if("number"==typeof t)return t;switch(e){case"Color":return{r:t.x,g:t.y,b:t.z};case"Vector4":return t instanceof Vt?{x:t.x,y:t.y,z:t.z,w:t.w}:{...Nt(t),w:0};default:return Nt(t)}}const Nt=t=>({x:t.x,y:t.y,z:t.z}),It=t=>"number"==typeof t?t:0;function Ut(t){return"number"==typeof t?new it:"r"in t?new it(t.r,t.g,t.b):new it(t.x,t.y,t.z)}function Rt(t){return"number"==typeof t||"r"in t?new Vt:new Vt(t.x,t.y,t.z,"w"in t?t.w:0)}class Lt extends Error{constructor(t,e=[t]){super(t),this.name="QuarksFormatError",this.problems=e}}let Dt={};const kt=[];function qt(t,e){const i=Dt,s=kt.splice(0);Dt=t;try{return e()}finally{Dt=i,kt.splice(0,kt.length,...s)}}function Jt(t,e){kt.push(t);try{return e()}finally{kt.pop()}}function Wt(){return kt.reduce((t,e)=>t&&!e.startsWith("[")?`${t}.${e}`:t+e,"")}const Gt=t=>{const e=Wt();if(Dt.strict)throw new Lt(e?`${t} (at ${e})`:t);Dt.onWarning?Dt.onWarning(t,e):console.warn(`[quarks] ${t}${e?` (at ${e})`:""}`)},Qt=(t,e)=>Array.isArray(t)?new it(t[0]??e.x,t[1]??e.y,t[2]??e.z):e,jt=(t,e)=>{const i=e?.type;return null==e?`Missing ${t}`:void 0===i?`${t[0].toUpperCase()}${t.slice(1)} without a type`:`Unknown ${t} ${JSON.stringify(i)}`};function Yt(t,e){if(t===e)return!0;if("object"!=typeof t||"object"!=typeof e||null===t||null===e)return"number"==typeof t&&"number"==typeof e&&Number.isNaN(t)&&Number.isNaN(e);if(Array.isArray(t)!==Array.isArray(e))return!1;const i=new Set([...Object.keys(t),...Object.keys(e)]);for(const s of i)if(!Yt(t[s],e[s]))return!1;return!0}function Ht(t,e){if(null===t||"object"!=typeof t||"string"!=typeof t.type)return t;const i=t=>{let i=!1;try{return{out:qt({onWarning:()=>i=!0},()=>e(t)),warned:i}}catch{return{out:void 0,warned:!0}}},s=i({type:t.type}).out;if(null==s||"object"!=typeof s)return t;const n={type:t.type};for(const[e,i]of Object.entries(t))"type"===e||void 0===i||Yt(i,s[e])||(n[e]=i);if(Object.keys(n).length===Object.keys(t).length)return t;const r=i(n);return!r.warned&&Yt(r.out,t)?n:t}class Xt{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 Xt(t.value)}clone(){return new Xt(this.value)}}class Zt{constructor(t,e){this.a=t,this.b=e,this.indexCount=-1,this.type="value"}startGen(t){this.indexCount=t.length,t.push(z())}genValue(t){return-1===this.indexCount&&this.startGen(t),tt.lerp(this.a,this.b,t[this.indexCount])}toJSON(){return{type:"IntervalValue",a:this.a,b:this.b}}static fromJSON(t){return new Zt(t.a,t.b)}clone(){return new Zt(this.a,this.b)}}class Kt{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=this.p;const i=[e[0],e[1],e[2],e[3]];for(;e.length>1;){const s=[];for(let n=0;n<e.length-1;n++){const r=(1-t)*e[n]+t*e[n+1];i.push(r),s.push(r)}e=s}return i}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 te{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=Math.min(Math.max(t,0),1);let s=this.functions.findIndex(([,t])=>t>i);-1===s&&(s=this.functions.length),this.functions.splice(s,0,[e,i])}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 ee extends te{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 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=ee.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||0===this.functions.length)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.genValueExact(s)].join(" ");return i}toJSON(){return{type:"PiecewiseBezier",functions:this.functions.map(([t,e])=>({function:t.toJSON(),start:e}))}}static fromJSON(t){return new ee(t.functions.map(t=>[Kt.fromJSON(t.function),t.start]))}clone(){return new ee(this.functions.map(([t,e])=>[t.clone(),e]))}startGen(t){}}function ie(t){switch(t?.type){case"ConstantValue":return Xt.fromJSON(t);case"IntervalValue":return Zt.fromJSON(t);case"PiecewiseBezier":return ee.fromJSON(t);default:return Gt(`${jt("value generator",t)}; using 0.`),new Xt(0)}}ee.TABLE_SIZE=257;const se=new it;class ne{constructor(t,e){this.axis=t,this.angle=e,this.type="rotation"}startGen(t){this.angle.startGen(t)}genValue(t,e,i,s){const n=this.axis,r=n.lengthSq();return 0===r?se.set(0,0,1):se.copy(n).multiplyScalar(1/Math.sqrt(r)),e.setFromAxisAngle(se,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 ne(new it(t.axis.x,t.axis.y,t.axis.z),ie(t.angle))}clone(){return new ne(this.axis.clone(),this.angle.clone())}}class re{constructor(t,e){this.a=t,this.b=e,this.indexCount=-1,this.type="value"}startGen(t){this.indexCount=t.length,t.push(z())}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 re(Ft(t.a),Ft(t.b))}clone(){return new re(this.a.clone(),this.b.clone())}}class oe{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||t<e[0][1])return-1;if(t>=e[i][1])return i;if(1===i)return 0;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{type:"CLinearFunction",subType:this.subType,keys:this.keys.map(([t,e])=>({value:Bt(t,this.subType),pos:e}))}}static fromJSON(t){switch(t.subType){case"Number":return new oe(t.keys.map(t=>[It(t.value),t.pos]),t.subType);case"Vector4":return new oe(t.keys.map(t=>[Rt(t.value),t.pos]),t.subType);default:return new oe(t.keys.map(t=>[Ut(t.value),t.pos]),t.subType)}}clone(){return"Number"===this.subType?new oe(this.keys.map(([t,e])=>[t,e]),this.subType):new oe(this.keys.map(([t,e])=>[t.clone(),e]),this.subType)}}const ae=new Vt;class he{constructor(t=[[new it(1,1,1),0],[new it(1,1,1),1]],e=[[1,0],[1,1]]){this.table=null,this.tableSignature=null,this.type="function",this.color=new oe(t,"Color"),this.alpha=new oe(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=he.TABLE_SIZE,a=null!==this.table&&this.table.length===4*o?this.table:new Float32Array(4*o),h=1/(o-1),l=ae;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=he.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(({function:t,start:e})=>[re.fromJSON(t),e]),i=e.map(([t,e])=>[t.a,e]);return e.length>0&&i.push([e[e.length-1][0].b,1]),new he(i.map(([t,e])=>[new it(t.x,t.y,t.z),e]),i.map(([t,e])=>[t.w,e]))}{const e=new he;return t.alpha?e.alpha=oe.fromJSON(t.alpha):Gt("Gradient has no alpha keys; it is opaque."),t.color?e.color=oe.fromJSON(t.color):Gt("Gradient has no color keys; it is white."),e}}clone(){const t=new he;return t.alpha=this.alpha.clone(),t.color=this.color.clone(),t}startGen(t){}}he.TABLE_SIZE=257;class le{constructor(t,e){this.a=t,this.b=e,this.type="value"}startGen(t){}genColor(t,e){const i=z();return e.copy(this.a).lerp(this.b,i)}toJSON(){return{type:"RandomColor",a:Ct(this.a),b:Ct(this.b)}}static fromJSON(t){return new le(Ft(t.a),Ft(t.b))}clone(){return new le(this.a.clone(),this.b.clone())}}const ce=new Vt;class ue{constructor(t,e){this.indexCount=-1,this.type="function",this.gradient1=t,this.gradient2=e}startGen(t){this.indexCount=t.length,t.push(z())}genColor(t,e,i){return-1===this.indexCount&&this.startGen(t),this.gradient1.genColor(t,e,i),this.gradient2.genColor(t,ce,i),e.lerp(ce,t[this.indexCount])}toJSON(){return{type:"RandomColorBetweenGradient",gradient1:this.gradient1.toJSON(),gradient2:this.gradient2.toJSON()}}static fromJSON(t){return new ue(he.fromJSON(t.gradient1),he.fromJSON(t.gradient2))}clone(){return new ue(this.gradient1.clone(),this.gradient2.clone())}}class de{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 de(Ft(t.color))}clone(){return new de(this.color.clone())}}function fe(t){switch(t?.type){case"ConstantColor":return de.fromJSON(t);case"ColorRange":return re.fromJSON(t);case"RandomColor":return le.fromJSON(t);case"Gradient":return he.fromJSON(t);case"RandomColorBetweenGradient":return ue.fromJSON(t);default:return Gt(`${jt("colour generator",t)}; using white.`),new de(new Vt(1,1,1,1))}}class me{get eular(){return this.euler}set eular(t){this.euler=t}constructor(t,e,i,s){this.angleX=t,this.angleY=e,this.angleZ=i,this.type="rotation",this.euler=new gt(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.euler.set(this.angleX.genValue(t,s)*i,this.angleY.genValue(t,s)*i,this.angleZ.genValue(t,s)*i),e.setFromEuler(this.euler)}toJSON(){return{type:"Euler",angleX:this.angleX.toJSON(),angleY:this.angleY.toJSON(),angleZ:this.angleZ.toJSON(),eulerOrder:this.euler.order}}static fromJSON(t){return new me(ie(t.angleX),ie(t.angleY),ie(t.angleZ),t.eulerOrder)}clone(){return new me(this.angleX.clone(),this.angleY.clone(),this.angleZ.clone(),this.euler.order)}}class pe{constructor(){this.indexCount=-1,this.type="rotation"}startGen(t){let e,i,s,n,r,o;this.indexCount=t.length;do{e=2*z()-1,i=2*z()-1,s=e*e+i*i}while(s>1);do{n=2*z()-1,r=2*z()-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 pe}clone(){return new pe}}function ye(t){switch(t?.type){case"AxisAngle":return ne.fromJSON(t);case"Euler":return me.fromJSON(t);case"RandomQuat":return pe.fromJSON(t);default:return Gt(`${jt("rotation generator",t)}; using a random rotation.`),new pe}}class ge{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 ge(ie(t.x),ie(t.y),ie(t.z))}clone(){return new ge(this.x.clone(),this.y.clone(),this.z.clone())}}function ve(t){return"Vector3Function"===t?.type?ge.fromJSON(t):(Gt(`${jt("vector generator",t)}; using a zero vector.`),new ge(new Xt(0),new Xt(0),new Xt(0)))}function xe(t){switch(t?.type){case"ConstantValue":case"IntervalValue":case"PiecewiseBezier":return ie(t);case"AxisAngle":case"RandomQuat":case"Euler":return ye(t);case"Vector3Function":return ve(t);default:return Gt(`${jt("generator",t)}; using 0.`),new Xt(0)}}function be(t,e){return"world"===t||"local"===t?t:e}function Se(t){return 0===t?0:1/t}class we{constructor(){this.position=new it,this.quaternion=new et,this.scale=new it(1,1,1),this.quaternionInverse=new et,this.scaleInverse=new it(1,1,1)}refresh(t){t.emitter.matrixWorld.decompose(this.position,this.quaternion,this.scale),this.quaternionInverse.copy(this.quaternion).invert(),this.scaleInverse.set(Se(this.scale.x),Se(this.scale.y),Se(this.scale.z))}toSimulation(t,e,i){return i&&"local"===e?t.multiply(this.scale).applyQuaternion(this.quaternion):i||"world"!==e||t.applyQuaternion(this.quaternionInverse).multiply(this.scaleInverse),t}pointToSimulation(t,e,i){return i&&"local"===e?t.multiply(this.scale).applyQuaternion(this.quaternion).add(this.position):i||"world"!==e||t.sub(this.position).applyQuaternion(this.quaternionInverse).multiply(this.scaleInverse),t}}class Me{constructor(t,e,i="world"){this.direction=t,this.magnitude=e,this.space=i,this.type="ApplyForce",this._frame=new we,this._direction=new it,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 i=this.magnitude.genValue(t.memory)*this._step(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.magnitude,n=this._direction,r=this._step(i),o=s instanceof Xt,a=o?s.value*r:0;for(let i=0;i<e;i++){const e=t[i];if(e.age>=e.life)continue;const h=o?a:s.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 Me(Qt(t.direction,new it(0,0,0)),ie(t.magnitude??t.force),be(t.space,"world"))}clone(){return new Me(this.direction.clone(),this.magnitude.clone(),this.space)}reset(){}}class ze{constructor(t=0,e=0,i=new it){this.scaleX=t,this.scaleY=e,this.position=i,this.locations=[]}transform(t,e){const i=this.locations.length;if(0===i)return;const s=this.locations[e%i];t.x=s.x*this.scaleX+this.position.x,t.y=s.y*this.scaleY+this.position.y,t.z=this.position.z}static fromJSON(t){const e=t.position,i=Array.isArray(e)?new it(e[0],e[1],e[2]):new it(e?.x??0,e?.y??0,e?.z??0),s=new ze(t.scaleX??0,t.scaleY??0,i);return s.locations=(t.locations??[]).map(t=>new Mt(t.x,t.y)),s}clone(){const t=new ze(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 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 Mt(i,n.height-t))}}function _e(t){switch(t?.type){case void 0:return null==t?void Gt(`${jt("sequencer",t)}; skipping it.`):ze.fromJSON(t);case"TextureSequencer":return ze.fromJSON(t);default:return void Gt(`${jt("sequencer",t)}; skipping it.`)}}class Ae{constructor(t){this.type="ApplySequences",this.sequencers=[],this.time=0,this.index=0,this.pCount=0,this.tempV=new it,this.states=new WeakMap,this.delay=t}initialize(t){const e=this.states.get(t);e?(e.id=this.pCount,e.inMotion=!1):this.states.set(t,{id:this.pCount,begin:new it,dst:new it,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=this.states.get(t);if(void 0===s)return;const[n,r]=i,o=s.id*this.delay;if(this.time>=n.a+o&&this.time<=n.b+o){s.inMotion||(s.inMotion=!0,s.begin.copy(t.position),r.transform(s.dst,s.id));const e=n.b-n.a;t.position.lerpVectors(s.begin,s.dst,Ae.BEZIER.genValue(e>0?(this.time-n.a-o)/e:1))}else this.time>n.b+o&&(s.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 Ae("number"==typeof t.delay?t.delay:0);return(Array.isArray(t.sequencers)?t.sequencers:[]).forEach(t=>{const i=_e(t.sequencer);void 0!==i&&e.sequencers.push([ie(t.range),i])}),e}clone(){const t=new Ae(this.delay);return t.sequencers=this.sequencers.map(t=>[t[0].clone(),t[1].clone()]),t}}Ae.BEZIER=new Kt(0,0,1,1);class Ve{constructor(t){this.angle=t,this.type="ChangeEmitDirection",this._temp=new it,this._q=new et,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,z()*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 Ve(ie(t.angle))}clone(){return new Ve(this.angle.clone())}reset(){this.memory.length=0}}function Oe(t,e){const i=t.velocity.length()*t.speedModifier,s=e.b-e.a;if(0===s)return i>=e.a?1:0;const n=(i-e.a)/s;return n<0?0:n>1?1:n}class Te{constructor(t,e){this.color=t,this.speedRange=e,this.type="ColorBySpeed"}initialize(t){this.color.startGen(t.memory)}update(t,e){const i=Oe(t,this.speedRange);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 Te(fe(t.color),t.speedRange?Zt.fromJSON(t.speedRange):new Zt(0,1))}clone(){return new Te(this.color.clone(),this.speedRange.clone())}reset(){}}class Pe{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 Pe(fe(t.color))}clone(){return new Pe(this.color.clone())}reset(){}}class $e{constructor(t=64){this.previousVelocity=$e.EMPTY,this.rotationQuaternion=$e.EMPTY,this.angularVelocityQuaternion=$e.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*$e.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=$e.grow(this.position,3*e),this.previousPosition=$e.grow(this.previousPosition,3*e);const i=this.previousSize===this.size,s=this.previousColor===this.color;if(i||(this.previousSize=$e.grow(this.previousSize,3*e)),this.previousVelocity.length>0&&(this.previousVelocity=$e.grow(this.previousVelocity,3*e)),this.rotationQuaternion.length>0){const t=this.rotationQuaternion.length;this.rotationQuaternion=$e.grow(this.rotationQuaternion,4*e),this.angularVelocityQuaternion=$e.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=$e.grow(this.previousColor,4*e)),this.velocity=$e.grow(this.velocity,3*e),this.size=$e.grow(this.size,3*e),this.startSize=$e.grow(this.startSize,3*e),this.color=$e.grow(this.color,4*e),i&&(this.previousSize=this.size),s&&(this.previousColor=this.color),this.startColor=$e.grow(this.startColor,4*e),this.scalars=$e.growDouble(this.scalars,e*$e.SCALAR_STRIDE),this.memoryStride>0){const t=new Float64Array(e*this.memoryStride);t.fill(NaN),t.set(this.memory),this.memory=t}this.rotation=$e.grow(this.rotation,e),this.angularVelocity=$e.grow(this.angularVelocity,e),this.uvTile=$e.grow(this.uvTile,e),this.startSpeed=$e.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;$e.swap3(this.position,i,s),$e.swap3(this.previousPosition,i,s),this.previousSize!==this.size&&$e.swap3(this.previousSize,i,s),this.previousVelocity.length>0&&$e.swap3(this.previousVelocity,i,s),$e.swap3(this.velocity,i,s),$e.swap3(this.size,i,s),$e.swap3(this.startSize,i,s);const n=4*t,r=4*e;$e.swap4(this.color,n,r),this.previousColor!==this.color&&$e.swap4(this.previousColor,n,r),$e.swap4(this.startColor,n,r),this.rotationQuaternion.length>0&&($e.swap4(this.rotationQuaternion,n,r),$e.swap4(this.angularVelocityQuaternion,n,r)),$e.swap3(this.scalars,t*$e.SCALAR_STRIDE,e*$e.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}}$e.swap1(this.rotation,t,e),$e.swap1(this.angularVelocity,t,e),$e.swap1(this.uvTile,t,e),$e.swap1(this.startSpeed,t,e),$e.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){$e.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}}$e.EMPTY=new Float32Array(0),$e.SCALAR_STRIDE=3,$e.AGE=0,$e.LIFE=1,$e.SPEED_MODIFIER=2;class Ee{constructor(t){this.data=t,this.next=null,this.prev=null}hasPrev(){return null!==this.prev}hasNext(){return null!==this.next}}class Ce{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 Ee(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 Ee(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 Ee(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 Fe{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 $e(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 _t(t.position,i),this.previousPosition=new _t(t.previousPosition,i),this.previousVelocity=new _t(t.previousVelocity,i),this.velocity=new _t(t.velocity,i),this.size=new _t(t.size,i),this.startSize=new _t(t.startSize,i),this.color=new Tt(t.color,s),this.startColor=new Tt(t.startColor,s),this.scalars=t.scalars,this.scalarOffset=e*$e.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*$e.SCALAR_STRIDE}get died(){return this.age>=this.life}reset(){this.memory.length=0}}const Be=new Float32Array(0);class Ne{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 Ce)}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 $e(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 i=3*e,s=4*e;this.position=new _t(t.position,i),this.previousPosition=new _t(t.previousPosition,i),this.previousVelocity=new _t(t.previousVelocity,i),this.velocity=new _t(t.velocity,i),this.size=new _t(t.size,i),this.startSize=new _t(t.startSize,i),this.color=new Tt(t.color,s),this.startColor=new Tt(t.startColor,s),this.scalars=t.scalars,this.scalarOffset=e*$e.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*$e.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 i=this.historyCapacity,s=this.store,n=this.storeIndex,r=n*$e.SCALAR_STRIDE,o=s.scalars[r+$e.AGE];if(o>=s.scalars[r+$e.LIFE])return void this.dropOldest();const a=t&&this.historyCount>0,h=a?(this.historyHead+i-1)%i:this.historyHead,l=3*h,c=this.historyPositions,u=s.position,d=3*n;c[l]=u[d],c[l+1]=u[d+1],c[l+2]=u[d+2];const f=s.size[d];this.historyBaseSizes[h]=f,this.historySizes[h]=f*this.headWidthScale;const m=4*h,p=this.historyColors,y=s.color,g=4*n;p[m]=y[g],p[m+1]=y[g+1],p[m+2]=y[g+2],p[m+3]=y[g+3],this.historyAges[h]=o,a||(this.historyHead=(h+1)%i,this.historyCount<i&&this.historyCount++),e&&this.measureHeadDistance()}measureHeadDistance(){const t=this.historyCount;if(0===t)return;const e=this.historyCapacity,i=(this.historyHead+e-1)%e;if(1===t)return void(this.historyDistances[i]=0);const s=(i+e-1)%e,n=this.historyPositions,r=n[3*i]-n[3*s],o=n[3*i+1]-n[3*s+1],a=n[3*i+2]-n[3*s+2];this.historyDistances[i]=this.historyDistances[s]+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 Ie(t,e){return Math.floor(z()*(e-t))+t}function Ue(t,e){const i=Number.isNaN(t)?0:1-tt.clamp(t,0,1),s=tt.lerp(Math.pow(i,e),1,z());return 2===e?Math.sqrt(s):Math.cbrt(s)}const Re=new it(0,1,0),Le=new it(0,0,0),De=new it(1,1,1),ke=new it(0,0,1),qe=1e-6;var Je;t.SubParticleEmitMode=void 0,(Je=t.SubParticleEmitMode||(t.SubParticleEmitMode={}))[Je.Death=0]="Death",Je[Je.Birth=1]="Birth",Je[Je.Frame=2]="Frame";const We={color:1,size:2,rotation:4,lifetime:8};function Ge(t){let e=0;for(const i of t)e|=We[i]??0;return e}class Qe{constructor(e,i,s,n=t.SubParticleEmitMode.Frame,r=1,o=[]){this.particleSystem=e,this.useVelocityAsBasis=i,this.subParticleSystem=s,this.mode=n,this.emitProbability=r,this.inherit=o,this.type="EmitSubParticleSystem",this.q_=new et,this.v_=new it,this.v2_=new it,this.v3_=new it,this.subEmissions=new Array,this.spareEmissions=new Array;const a=this.target;a&&(a.onlyUsedByOther=!0)}initialize(t){}update(e,i){(this.mode===t.SubParticleEmitMode.Frame||this.mode===t.SubParticleEmitMode.Birth&&0===e.age||this.mode===t.SubParticleEmitMode.Death&&e.age+i>=e.life)&&this.emit(e,i)}get target(){const t=this.subParticleSystem;if(null===t||"object"!=typeof t)return;const e=t.system;return e?.isDisposed?void 0:e}emit(e,i){if(!this.target)return;if(z()>this.emitProbability)return;const s=this.spareEmissions.pop(),n=void 0!==s?s:{burstParticleCount:0,burstParticleIndex:0,isBursting:!1,burstIndex:0,burstWaveIndex:0,time:0,waitEmiting:0,matrix:new at,travelDistance:0,particle:void 0,serial:void 0,previousWorldPos:void 0};n.burstParticleCount=0,n.burstParticleIndex=0,n.isBursting=!1,n.burstIndex=0,n.burstWaveIndex=0,n.time=0,n.waitEmiting=0,n.travelDistance=0,this.mode===t.SubParticleEmitMode.Death?(n.particle=Qe.copyInto(n.ghost??(n.ghost=new Fe),e),n.serial=void 0):(n.particle=e,n.serial=e.serial),n.inherit=Ge(this.inherit),this.mode===t.SubParticleEmitMode.Death&&(n.inherit&=~We.lifetime),n.previousWorldPos=void 0,this.setMatrixFromParticle(n.matrix,e),this.subEmissions.push(n)}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,t.matrix=new at,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],n=s.particle;void 0!==n&&n===s.ghost||(void 0!==n&&n.age<n.life&&n.serial===s.serial?this.setMatrixFromParticle(s.matrix,n):s.particle=void 0),e.emit(t,s,s.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 Qe(e,Boolean(t.useVelocityAsBasis),t.subParticleSystem,t.mode,t.emitProbability,Qe.validInherit(t.inherit))}clone(){return new Qe(this.particleSystem,this.useVelocityAsBasis,this.subParticleSystem,this.mode,this.emitProbability,this.inherit.slice())}reset(){this.clearEmissions()}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 We):[]}setMatrixFromParticle(t,e){let i;if(void 0===e.rotation||this.useVelocityAsBasis){const i=e.position,s=this.v3_.copy(e.velocity),n=s.length(),r=this.v_,o=this.v2_;if(n<qe)r.set(1,0,0),o.set(0,1,0),s.set(0,0,1);else if(s.divideScalar(n),Math.abs(s.x)<qe&&Math.abs(s.y)<qe){const t=s.z>0?1:-1;r.set(1,0,0),o.set(0,t,0),s.set(0,0,t)}else r.copy(ke).cross(s).normalize(),o.copy(s).cross(r);t.set(r.x,o.x,s.x,i.x,r.y,o.y,s.y,i.y,r.z,o.z,s.z,i.z,0,0,0,1)}else e.rotation instanceof et?i=e.rotation:(this.q_.setFromAxisAngle(ke,e.rotation),i=this.q_),t.compose(e.position,i,De);this.particleSystem.worldSpace||t.multiplyMatrices(this.particleSystem.emitter.matrixWorld,t)}}class je{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,s="world"){this.x=t,this.y=e,this.z=i,this.space=s,this.type="ForceOverLife",this._temp=new it,this._frame=new we}_step(t){const e=this.ps;return(void 0===e||e.worldSpace)&&"world"===this.space?t*(e?.motionScale??1):t}update(t,e){const i=t.age/t.life;this._temp.set(this.x.genValue(t.memory,i),this.y.genValue(t.memory,i),this.z.genValue(t.memory,i));const s=void 0===this.ps||this.ps.worldSpace;this._frame.toSimulation(this._temp,this.space,s),t.velocity.addScaledVector(this._temp,this._step(e))}updateAll(t,e,i){const s=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(i);for(let i=0;i<e;i++){const e=t[i];if(e.age>=e.life)continue;const d=e.memory,f=e.age/e.life;s.set(n.genValue(d,f),r.genValue(d,f),o.genValue(d,f)),c&&a.toSimulation(s,h,l),e.velocity.addScaledVector(s,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 je(ie(t.x),ie(t.y),ie(t.z),be(t.space,"world"))}frameUpdate(t){void 0!==this.ps&&this.ps.worldSpace!==("world"===this.space)&&this._frame.refresh(this.ps)}clone(){return new je(this.x.clone(),this.y.clone(),this.z.clone(),this.space)}reset(){}}class Ye{constructor(t,e={}){this.type="FrameOverLife",this.salt=new Zt(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(Ye.hash(r,this.saltOf(t))*n):(n>0&&(r=this.loop?Ye.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=Ye.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 Ye(ie(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?ie(t.startFrame):void 0})}clone(){return new Ye(this.frame.clone(),{fps:this.fps,cycles:this.cycles,frameCount:this.frameCount,loop:this.loop,random:this.random,startFrame:this.startFrame?.clone()})}reset(){}}class He{constructor(t,e){this.center=t,this.magnitude=e,this.type="GravityForce",this.temp=new it}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 He(Qt(t.center,new it(0,0,0)),"number"==typeof t.magnitude?t.magnitude:0)}clone(){return new He(this.center.clone(),this.magnitude)}reset(){}}class Xe{constructor(t=new Xt(1),e="initial"){this.multiplier=t,this.mode=e,this.type="InheritVelocity",this._temp=new it,this._tempPos=new it,this._tempQInv=new et,this._tempScaleInv=new it(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 Xe(t.multiplier?ie(t.multiplier):new Xt(1),"current"===t.mode?"current":"initial")}clone(){return new Xe(this.multiplier.clone(),this.mode)}reset(){}}class Ze{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 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.dampenStep(e))}}updateAll(t,e,i){const s=this.speed,n=this.dampenStep(i),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 Ze(ie(t.speed),"number"==typeof t.dampen?t.dampen:1)}frameUpdate(t){this.speed.refreshTable?.()}clone(){return new Ze(this.speed.clone(),this.dampen)}reset(){}}const Ke=.5*(Math.sqrt(3)-1),ti=(3-Math.sqrt(3))/6,ei=1/3,ii=1/6,si=(Math.sqrt(5)-1)/4,ni=(5-Math.sqrt(5))/20,ri=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]),oi=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 ai{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)*Ke,h=Math.floor(t+a),l=Math.floor(e+a),c=(h+l)*ti,u=t-(h-c),d=e-(l-c);let f,m;u>d?(f=1,m=0):(f=0,m=1);const p=u-f+ti,y=d-m+ti,g=u-1+2*ti,v=d-1+2*ti,x=255&h,b=255&l;let S=.5-u*u-d*d;if(S>=0){const t=3*i[x+s[b]];S*=S,n=S*S*(ri[t]*u+ri[t+1]*d)}let w=.5-p*p-y*y;if(w>=0){const t=3*i[x+f+s[b+m]];w*=w,r=w*w*(ri[t]*p+ri[t+1]*y)}let M=.5-g*g-v*v;if(M>=0){const t=3*i[x+1+s[b+1]];M*=M,o=M*M*(ri[t]*g+ri[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)*ei,c=Math.floor(t+l),u=Math.floor(e+l),d=Math.floor(i+l),f=(c+u+d)*ii,m=t-(c-f),p=e-(u-f),y=i-(d-f);let g,v,x,b,S,w;m>=p?p>=y?(g=1,v=0,x=0,b=1,S=1,w=0):m>=y?(g=1,v=0,x=0,b=1,S=0,w=1):(g=0,v=0,x=1,b=1,S=0,w=1):p<y?(g=0,v=0,x=1,b=0,S=1,w=1):m<y?(g=0,v=1,x=0,b=0,S=1,w=1):(g=0,v=1,x=0,b=1,S=1,w=0);const M=m-g+ii,z=p-v+ii,_=y-x+ii,A=m-b+2*ii,V=p-S+2*ii,O=y-w+2*ii,T=m-1+.5,P=p-1+.5,$=y-1+.5,E=255&c,C=255&u,F=255&d;let B=.6-m*m-p*p-y*y;if(B<0)r=0;else{const t=3*s[E+n[C+n[F]]];B*=B,r=B*B*(ri[t]*m+ri[t+1]*p+ri[t+2]*y)}let N=.6-M*M-z*z-_*_;if(N<0)o=0;else{const t=3*s[E+g+n[C+v+n[F+x]]];N*=N,o=N*N*(ri[t]*M+ri[t+1]*z+ri[t+2]*_)}let I=.6-A*A-V*V-O*O;if(I<0)a=0;else{const t=3*s[E+b+n[C+S+n[F+w]]];I*=I,a=I*I*(ri[t]*A+ri[t+1]*V+ri[t+2]*O)}let U=.6-T*T-P*P-$*$;if(U<0)h=0;else{const t=3*s[E+1+n[C+1+n[F+1]]];U*=U,h=U*U*(ri[t]*T+ri[t+1]*P+ri[t+2]*$)}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)*si,u=Math.floor(t+c),d=Math.floor(e+c),f=Math.floor(i+c),m=Math.floor(s+c),p=(u+d+f+m)*ni,y=t-(u-p),g=e-(d-p),v=i-(f-p),x=s-(m-p);let b=0,S=0,w=0,M=0;y>g?b++:S++,y>v?b++:w++,y>x?b++:M++,g>v?S++:w++,g>x?S++:M++,v>x?w++:M++;const z=b>=3?1:0,_=S>=3?1:0,A=w>=3?1:0,V=M>=3?1:0,O=b>=2?1:0,T=S>=2?1:0,P=w>=2?1:0,$=M>=2?1:0,E=b>=1?1:0,C=S>=1?1:0,F=w>=1?1:0,B=M>=1?1:0,N=y-z+ni,I=g-_+ni,U=v-A+ni,R=x-V+ni,L=y-O+2*ni,D=g-T+2*ni,k=v-P+2*ni,q=x-$+2*ni,J=y-E+3*ni,W=g-C+3*ni,G=v-F+3*ni,Q=x-B+3*ni,j=y-1+4*ni,Y=g-1+4*ni,H=v-1+4*ni,X=x-1+4*ni,Z=255&u,K=255&d,tt=255&f,et=255&m;let it=.6-y*y-g*g-v*v-x*x;if(it<0)r=0;else{const t=n[Z+n[K+n[tt+n[et]]]]%32*4;it*=it,r=it*it*(oi[t]*y+oi[t+1]*g+oi[t+2]*v+oi[t+3]*x)}let st=.6-N*N-I*I-U*U-R*R;if(st<0)o=0;else{const t=n[Z+z+n[K+_+n[tt+A+n[et+V]]]]%32*4;st*=st,o=st*st*(oi[t]*N+oi[t+1]*I+oi[t+2]*U+oi[t+3]*R)}let nt=.6-L*L-D*D-k*k-q*q;if(nt<0)a=0;else{const t=n[Z+O+n[K+T+n[tt+P+n[et+$]]]]%32*4;nt*=nt,a=nt*nt*(oi[t]*L+oi[t+1]*D+oi[t+2]*k+oi[t+3]*q)}let rt=.6-J*J-W*W-G*G-Q*Q;if(rt<0)h=0;else{const t=n[Z+E+n[K+C+n[tt+F+n[et+B]]]]%32*4;rt*=rt,h=rt*rt*(oi[t]*J+oi[t+1]*W+oi[t+2]*G+oi[t+3]*Q)}let ot=.6-j*j-Y*Y-H*H-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*(oi[t]*j+oi[t+1]*Y+oi[t+2]*H+oi[t+3]*X)}return 27*(r+o+a+h+l)}}const hi=100,li=new Array(hi),ci=new it,ui=new et;function di(t){let e=li[t];return void 0===e&&(e=new ai(t),li[t]=e),e}class fi{constructor(t,e,i=new Xt(1),s=new Xt(0),n=new Xt(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 it,lastRot:0,lastRotQ:e?null:new et,generatorX:di(Ie(0,hi)),generatorY:di(Ie(0,hi)),generatorZ:di(Ie(0,hi)),generatorW:di(Ie(0,hi))},void(t._noiseState=i);i.lastPos.set(0,0,0),i.lastRot=0,e?i.lastRotQ=null:null===i.lastRotQ?i.lastRotQ=new et:i.lastRotQ.set(0,0,0,1),i.generatorX=di(Ie(0,hi)),i.generatorY=di(Ie(0,hi)),i.generatorZ=di(Ie(0,hi)),i.generatorW=di(Ie(0,hi))}static constantOf(t){return t instanceof Xt?t.value:NaN}rotateByNoise(t,e,i,s,n){const r=e.lastRotQ;t.multiply(r.invert()),ci.set(this.sample(e.generatorX,i,n),this.sample(e.generatorY,i,n),this.sample(e.generatorZ,i,n));const o=ci.length();o>0?(ci.multiplyScalar(1/o),ui.setFromAxisAngle(ci,this.sample(e.generatorW,i,n)*Math.PI*s)):ui.set(0,0,0,1),t.multiply(ui),r.copy(ui)}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),ci.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(ci),i.lastPos.copy(ci)}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 null!==i.lastRotQ&&this.rotateByNoise(t.rotation,i,f,e,s)}}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=$e.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],m=f._noiseState;if(void 0===m)continue;const p=f.memory,y=e/a,g=h==h?h:this.frequency.genValue(p,y),v=l==l?l:this.power.genValue(p,y),x=c==c?c:this.positionAmount.genValue(p,y),b=u==u?u:this.rotationAmount.genValue(p,y),S=e*g+this.scrollOffset;if(x>0){const t=v*x,e=m.lastPos,i=this.sample(m.generatorX,S,p)*t,r=this.sample(m.generatorY,S,p)*t,o=this.sample(m.generatorZ,S,p)*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(b>0){const t=v*b;if("number"==typeof f.rotation){const e=this.sample(m.generatorW,S,p)*Math.PI*t;r[i]=r[i]-m.lastRot+e,m.lastRot=e}else null!==m.lastRotQ&&this.rotateByNoise(f.rotation,m,S,t,p)}}}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=fi.constantOf(this.frequency),this._power=fi.constantOf(this.power),this._positionAmount=fi.constantOf(this.positionAmount),this._rotationAmount=fi.constantOf(this.rotationAmount)}static fromJSON(t){return new fi(ie(t.frequency),ie(t.power),t.positionAmount?ie(t.positionAmount):void 0,t.rotationAmount?ie(t.rotationAmount):void 0,t.scrollSpeed?ie(t.scrollSpeed):new Xt(0),t.remap?ie(t.remap):void 0)}clone(){return new fi(this.frequency.clone(),this.power.clone(),this.positionAmount.clone(),this.rotationAmount.clone(),this.scrollSpeed.clone(),this.remap?.clone())}reset(){this.scrollOffset=0}}class mi{constructor(t,e=new it(0,1,0),i="local"){this.orbitSpeed=t,this.axis=e,this.space=i,this.type="OrbitOverLife",this.temp=new it,this._frame=new we,this._axis=new it(0,1,0),this._center=new it,this.rotation=new et,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 i=this.ps.worldSpace;this._frame.toSimulation(t,this.space,i),this._frame.pointToSimulation(e,this.space,i)}const i=t.length();i>0?t.multiplyScalar(1/i):t.set(0,0,0)}converts(){return void 0!==this.ps&&this.ps.worldSpace!==("world"===this.space)}update(t,e){const i=this._axis;if(0===i.x&&0===i.y&&0===i.z)return;const s=t.position;s.sub(this._center),this.temp.copy(s).projectOnVector(i),this.rotation.setFromAxisAngle(i,this.orbitSpeed.genValue(t.memory,t.age/t.life)*e),s.sub(this.temp),s.applyQuaternion(this.rotation),s.add(this.temp),s.add(this._center)}updateAll(t,e,i){const s=this._axis;if(0===s.x&&0===s.y&&0===s.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(s),a.setFromAxisAngle(s,n.genValue(e.memory,e.age/e.life)*i),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 mi(ie(t.orbitSpeed),t.axis?new it(t.axis[0],t.axis[1],t.axis[2]):void 0,be(t.space,"local"))}clone(){return new mi(this.orbitSpeed.clone(),this.axis.clone(),this.space)}reset(){}}const pi=new et;class yi{constructor(t){this.angularVelocity=t,this.type="Rotation3DOverLife",this.tempQuat=new et}initialize(t){t.rotation instanceof et&&(t.angularVelocity=t instanceof Fe?pi:new et,this.angularVelocity.startGen(t.memory))}update(t,e){if(t.rotation instanceof et){this.angularVelocity.genValue(t.memory,this.tempQuat,e,t.age/t.life),t.rotation.multiply(this.tempQuat);const i=t.angularVelocity;i instanceof et&&i.copy(this.tempQuat)}}toJSON(){return{type:this.type,angularVelocity:this.angularVelocity.toJSON()}}static fromJSON(t){return new yi(ye(t.angularVelocity))}frameUpdate(t){}clone(){return new yi(this.angularVelocity.clone())}reset(){}}class gi{constructor(t,e){this.angularVelocity=t,this.speedRange=e,this.type="RotationBySpeed",this.tempQuat=new et}initialize(t){"number"==typeof t.rotation&&this.angularVelocity.startGen(t.memory)}update(t,e){if("number"==typeof t.rotation){const i=Oe(t,this.speedRange),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 gi(ie(t.angularVelocity),t.speedRange?Zt.fromJSON(t.speedRange):new Zt(0,1))}frameUpdate(t){}clone(){return new gi(this.angularVelocity.clone(),this.speedRange.clone())}reset(){}}class vi{constructor(t){this.angularVelocity=t,this.type="RotationOverLife",this.tempQuat=new et}initialize(t){"number"==typeof t.rotation?this.angularVelocity.startGen(t.memory):t.rotation instanceof et&&(this.angularVelocity.startGen(t.memory),t.angularVelocity instanceof et||(t.angularVelocity=new et))}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 et){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 et){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(ke,i);e.multiply(s);const n=t.angularVelocity;n instanceof et&&n.copy(s)}toJSON(){return{type:this.type,angularVelocity:this.angularVelocity.toJSON()}}static fromJSON(t){return new vi(ie(t.angularVelocity))}frameUpdate(t){this.angularVelocity.refreshTable?.()}clone(){return new vi(this.angularVelocity.clone())}reset(){}}class xi{initialize(t){this.size.startGen(t.memory)}constructor(t,e){this.size=t,this.speedRange=e,this.type="SizeBySpeed"}update(t){const e=Oe(t,this.speedRange);this.size instanceof ge?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 xi(xe(t.size),t.speedRange?Zt.fromJSON(t.speedRange):new Zt(0,1))}frameUpdate(t){}clone(){return new xi(this.size.clone(),this.speedRange.clone())}reset(){}}class bi{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 ge}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 bi(xe(t.size))}frameUpdate(t){this._size.refreshTable?.()}clone(){return new bi(this.size.clone())}reset(){}}class Si{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 Si(ie(t.speed))}frameUpdate(t){this.speed.refreshTable?.()}clone(){return new Si(this.speed.clone())}reset(){}}function wi(t){return 0===t?0:1/t}class Mi{constructor(t,e,i,s,n=0){this.scale=t,this.octaves=e,this.velocityMultiplier=i,this.timeScale=s,this.seed=n,this.type="TurbulenceField",this.timeOffset=new it,this.initialOffset=new it,this.temp=new it,this.temp2=new it;const r=V(n);this.generator=new ai(r),this.initialOffset.set(r()*wi(t.x)*s.x,r()*wi(t.y)*s.y,r()*wi(t.z)*s.z),this.timeOffset.copy(this.initialOffset)}initialize(t){}update(t,e){const i=t.position.x*wi(this.scale.x),s=t.position.y*wi(this.scale.y),n=t.position.z*wi(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=$e.SCALAR_STRIDE,h=this.generator,l=this.octaves,c=wi(this.scale.x),u=wi(this.scale.y),d=wi(this.scale.z),f=this.velocityMultiplier.x*i,m=this.velocityMultiplier.y*i,p=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,b=0,S=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,b+=h.noise4D(i,s,n,g*w)/w,S+=h.noise4D(i,s,n,v*w)/w,w*=2}r[i]+=x*f,r[i+1]+=b*m,r[i+2]+=S*p}}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 Mi(Qt(t.scale,new it(1,1,1)),"number"==typeof t.octaves?t.octaves:1,Qt(t.velocityMultiplier,new it(1,1,1)),Qt(t.timeScale,new it(1,1,1)),"number"==typeof t.seed?t.seed:0)}clone(){return new Mi(this.scale.clone(),this.octaves,this.velocityMultiplier.clone(),this.timeScale.clone(),this.seed)}reset(){this.timeOffset.copy(this.initialOffset)}}const zi=new it(1,0,0),_i=new it(0,1,0),Ai=new it(0,0,1);class Vi{constructor(t=new Xt(0),e=new Xt(0),i=new Xt(0),s=new Xt(0),n=new Xt(0),r=new Xt(0),o="local",a=new Xt(0),h=new it){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 it,this._tempEmitterPos=new it,this._tempQ=new et,this._tempQInv=new et,this._tempScale=new it(1,1,1),this._tempScaleInv=new it(1,1,1),this._tempRot=new et,this._axisX=new it(1,0,0),this._axisY=new it(0,1,0),this._axisZ=new it(0,0,1),this._center=new it}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(zi),this._axisY.copy(_i),this._axisZ.copy(Ai),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?ie(t):new Xt(0);return new Vi(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 it(t.orbitalOffset[0]??0,t.orbitalOffset[1]??0,t.orbitalOffset[2]??0):new it)}clone(){return new Vi(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 Oi{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 Ne))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/i,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 Oi(ie(t.width),t.absolute??!0)}clone(){return new Oi(this.width.clone(),this.absolute)}reset(){}}const Ti={ApplyForce:{type:"ApplyForce",constructor:Me,params:[["direction",["vec3"]],["magnitude",["value"]],["space",["string"]]],loadJSON:Me.fromJSON},Noise:{type:"Noise",constructor:fi,params:[["frequency",["value"]],["power",["value"]],["positionAmount",["value"]],["rotationAmount",["value"]],["scrollSpeed",["value"]],["remap",["valueFunc"]]],loadJSON:fi.fromJSON},TurbulenceField:{type:"TurbulenceField",constructor:Mi,params:[["scale",["vec3"]],["octaves",["number"]],["velocityMultiplier",["vec3"]],["timeScale",["vec3"]],["seed",["number"]]],loadJSON:Mi.fromJSON},GravityForce:{type:"GravityForce",constructor:He,params:[["center",["vec3"]],["magnitude",["number"]]],loadJSON:He.fromJSON},ColorOverLife:{type:"ColorOverLife",constructor:Pe,params:[["color",["colorFunc"]]],loadJSON:Pe.fromJSON},RotationOverLife:{type:"RotationOverLife",constructor:vi,params:[["angularVelocity",["value","valueFunc"]]],loadJSON:vi.fromJSON},Rotation3DOverLife:{type:"Rotation3DOverLife",constructor:yi,params:[["angularVelocity",["rotationFunc"]]],loadJSON:yi.fromJSON},SizeOverLife:{type:"SizeOverLife",constructor:bi,params:[["size",["value","valueFunc","vec3Func"]]],loadJSON:bi.fromJSON},ColorBySpeed:{type:"ColorBySpeed",constructor:Te,params:[["color",["colorFunc"]],["speedRange",["range"]]],loadJSON:Te.fromJSON},RotationBySpeed:{type:"RotationBySpeed",constructor:gi,params:[["angularVelocity",["value","valueFunc"]],["speedRange",["range"]]],loadJSON:gi.fromJSON},SizeBySpeed:{type:"SizeBySpeed",constructor:xi,params:[["size",["value","valueFunc","vec3Func"]],["speedRange",["range"]]],loadJSON:xi.fromJSON},SpeedOverLife:{type:"SpeedOverLife",constructor:Si,params:[["speed",["value","valueFunc"]]],loadJSON:Si.fromJSON},FrameOverLife:{type:"FrameOverLife",constructor:Ye,params:[["frame",["value","valueFunc"]],["fps",["number"]],["cycles",["number"]],["frameCount",["number"]],["loop",["boolean"]],["random",["boolean"]],["startFrame",["value"]]],loadJSON:Ye.fromJSON},ForceOverLife:{type:"ForceOverLife",constructor:je,params:[["x",["value","valueFunc"]],["y",["value","valueFunc"]],["z",["value","valueFunc"]],["space",["string"]]],loadJSON:je.fromJSON},VelocityOverLife:{type:"VelocityOverLife",constructor:Vi,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:Vi.fromJSON},InheritVelocity:{type:"InheritVelocity",constructor:Xe,params:[["multiplier",["value","valueFunc"]],["mode",["string"]]],loadJSON:Xe.fromJSON},OrbitOverLife:{type:"OrbitOverLife",constructor:mi,params:[["orbitSpeed",["value","valueFunc"]],["axis",["vec3"]],["space",["string"]]],loadJSON:mi.fromJSON},WidthOverLength:{type:"WidthOverLength",constructor:Oi,params:[["width",["value","valueFunc"]],["absolute",["boolean"]]],loadJSON:Oi.fromJSON},ChangeEmitDirection:{type:"ChangeEmitDirection",constructor:Ve,params:[["angle",["value"]]],loadJSON:Ve.fromJSON},ApplySequences:{type:"ApplySequences",constructor:Ae,params:[["delay",["number"]]],loadJSON:Ae.fromJSON},EmitSubParticleSystem:{type:"EmitSubParticleSystem",constructor:Qe,params:[["particleSystem",["self"]],["useVelocityAsBasis",["boolean"]],["subParticleSystem",["particleSystem"]],["mode",["number"]],["emitProbability",["number"]],["inherit",["subEmitterInherit"]]],loadJSON:Qe.fromJSON},LimitSpeedOverLife:{type:"LimitSpeedOverLife",constructor:Ze,params:[["speed",["value","valueFunc"]],["dampen",["number"]]],loadJSON:Ze.fromJSON},ApplyCollision:{type:"ApplyCollision",constructor:Et,params:[["bounce",["number"]]],loadJSON:Et.fromJSON}};function Pi(t,e){const i=t?Ti[t.type]:void 0;return i?i.loadJSON(t,e):(Gt(`${jt("behavior",t)}; it is skipped.`),null)}function $i(t,e){const i=t.toJSON(),s=Ti[i?.type];return s?Ht(i,t=>s.loadJSON(t,e).toJSON()):i}const Ei={PiecewiseBezier:ee,Vector3Function:ge,Quaternion:et,ConstantValue:Xt,Gradient:he,Vector4View:Tt,AxisAngleGenerator:ne,IntervalValue:Zt,ColorRange:re};function Ci(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 Fi(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 Bi(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 Ni(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 Ii(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 Ui(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 Ri(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 Li(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 Di(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 ${Ui("px","py","pz","qx","qy","qz","qw")}\n px = Math.fround(px); py = Math.fround(py); pz = Math.fround(pz);\n }`}function ki(t,e){switch(t.type){case"ColorOverLife":return{setup:Ni(`g${e}`,`behaviors[${e}].color`),body:`{${Ii(`g${e}`,"t")}}`};case"SizeOverLife":return{setup:`const g${e} = behaviors[${e}].size;\n const vec3_${e} = g${e} instanceof deps.Vector3Function;\n ${Ci(`sg${e}`,`g${e}`)}`,body:`if (vec3_${e}) {\n g${e}.genValue(p.memory, p.size, t).multiply(p.startSize);\n } else {\n ${Bi(`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 ${Ci(`g${e}`,`b${e}.magnitude`)}`,body:`{\n ${Bi(`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:`${Ci(`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 ${Bi(`g${e}`,"rate","t")}\n rot[row] += delta * rate;\n angVel[row] = rate;\n } else if (quat_${e}) {\n ${Bi(`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:`${Ci(`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}) {${Bi(`g${e}`,"v","t")} uvTile[row] = v;}\n else uvTile[row] = b${e}.frameAt(p, age, t);`};case"SpeedOverLife":return{setup:Ci(`g${e}`,`behaviors[${e}].speed`),body:`{${Bi(`g${e}`,"v","t")} scalars[s + 2] = v;}`};case"ForceOverLife":return{setup:`const b${e} = behaviors[${e}];\n ${Ci(`gx${e}`,`b${e}.x`)}\n ${Ci(`gy${e}`,`b${e}.y`)}\n ${Ci(`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 ${Li(`sc${e}`,`toWorld${e} ? fr${e}.scale : fr${e}.scaleInverse`)}\n ${Ri(`q${e}`,`toWorld${e} ? fr${e}.quaternion : fr${e}.quaternionInverse`)}`,body:`{\n ${Bi(`gx${e}`,"fx","t")}\n ${Bi(`gy${e}`,"fy","t")}\n ${Bi(`gz${e}`,"fz","t")}\n if (toWorld${e}) {\n fx *= sc${e}x; fy *= sc${e}y; fz *= sc${e}z;\n ${Ui("fx","fy","fz",`q${e}x`,`q${e}y`,`q${e}z`,`q${e}w`)}\n } else if (toLocal${e}) {\n ${Ui("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 ${Ci(`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 ${Bi(`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 ${Ni(`g${e}`,`b${e}.color`)}\n const lo${e} = b${e}.speedRange.a;\n const span${e} = b${e}.speedRange.b - lo${e};`,body:`{${Fi(e)}\n ${Ii(`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 ${Ci(`sg${e}`,`g${e}`)}`,body:`{${Fi(e)}\n if (vec3_${e}) {\n g${e}.genValue(p.memory, p.size, ts).multiply(p.startSize);\n } else {\n ${Bi(`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 ${Ci(`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 ${Fi(e)}\n ${Bi(`g${e}`,"rate","ts")}\n rot[row] += delta * rate;\n angVel[row] = rate;\n }`};case"OrbitOverLife":return{setup:`const b${e} = behaviors[${e}];\n ${Ci(`g${e}`,`b${e}.orbitSpeed`)}\n ${Li(`ax${e}`,`b${e}._axis`)}\n ${Li(`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 ${Bi(`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 ${Ui("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 ${Ci(`lx${e}`,`b${e}.linearX`)}\n ${Ci(`ly${e}`,`b${e}.linearY`)}\n ${Ci(`lz${e}`,`b${e}.linearZ`)}\n ${Ci(`ox${e}`,`b${e}.orbitalX`)}\n ${Ci(`oy${e}`,`b${e}.orbitalY`)}\n ${Ci(`oz${e}`,`b${e}.orbitalZ`)}\n ${Li(`aX${e}`,`b${e}._axisX`)}\n ${Li(`aY${e}`,`b${e}._axisY`)}\n ${Li(`aZ${e}`,`b${e}._axisZ`)}\n ${Ci(`rd${e}`,`b${e}.radial`)}\n ${Li(`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 ${Li(`sc${e}`,`toWorld${e} ? b${e}._tempScale : b${e}._tempScaleInv`)}\n ${Ri(`q${e}`,`toWorld${e} ? b${e}._tempQ : b${e}._tempQInv`)}`,body:`{\n ${Bi(`lx${e}`,"fx","t")}\n ${Bi(`ly${e}`,"fy","t")}\n ${Bi(`lz${e}`,"fz","t")}\n if (convert${e}) {\n fx *= sc${e}x; fy *= sc${e}y; fz *= sc${e}z;\n ${Ui("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 ${Bi(`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 ${Bi(`ox${e}`,"rx","t")}\n ${Bi(`oy${e}`,"ry","t")}\n ${Bi(`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) ${Di("rx",`aX${e}x`,`aX${e}y`,`aX${e}z`)}\n if (ry !== 0) ${Di("ry",`aY${e}x`,`aY${e}y`,`aY${e}z`)}\n if (rz !== 0) ${Di("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 ${Li(`sc${e}`,`b${e}._tempScaleInv`)}\n ${Ri(`q${e}`,`b${e}._tempQInv`)}\n ivx${e} *= sc${e}x; ivy${e} *= sc${e}y; ivz${e} *= sc${e}z;\n ${Ui(`ivx${e}`,`ivy${e}`,`ivz${e}`,`q${e}x`,`q${e}y`,`q${e}z`,`q${e}w`)}\n }\n }\n ${Ci(`gm${e}`,`b${e}.multiplier`)}`,body:`if (active${e}) {\n ${Bi(`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 qi=new Map;function Ji(t,e,i){const s=qi.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}};`)(Ei)}catch(t){return}}(t,e);return qi.set(i,n??null),n}function Wi(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=Ji(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=ki(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}class Gi{constructor(t,e,i){this.position=t??new it,this.rotation=e??new et,this.scale=i??new it(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 Gi(e?new it(e[0],e[1],e[2]):void 0,i?new et(i[0],i[1],i[2],i[3]).normalize():void 0,s?new it(s[0],s[1],s[2]):void 0)}static toShapeJSON(t){return t&&!t.isIdentity()?{transform:t.toJSON()}:{}}clone(){return new Gi(this.position.clone(),this.rotation.clone(),this.scale.clone())}}var Qi,ji;t.BoxEmitFrom=void 0,(Qi=t.BoxEmitFrom||(t.BoxEmitFrom={}))[Qi.Volume=0]="Volume",Qi[Qi.Shell=1]="Shell",Qi[Qi.Edge=2]="Edge";class Yi{constructor(e={}){this.type="box",this._point=[0,0,0],this.width=e.width??1,this.height=e.height??1,this.depth=e.depth??1,this.emitFrom=e.emitFrom??t.BoxEmitFrom.Volume,this.boxThickness=e.boxThickness?[...e.boxThickness]:[0,0,0],this.transform=e.transform}update(t,e){}initialize(e,i){const s=this._point;for(let t=0;t<3;t++)s[t]=2*z()-1;const n=Math.floor(3*z())%3;this.emitFrom===t.BoxEmitFrom.Shell?s[n]=this.onSurface(n):this.emitFrom===t.BoxEmitFrom.Edge&&(s[(n+1)%3]=this.onSurface((n+1)%3),s[(n+2)%3]=this.onSurface((n+2)%3)),e.position.set(s[0]*this.width/2,s[1]*this.height/2,s[2]*this.depth/2),e.velocity.set(0,0,e.startSpeed),this.transform?.apply(e)}onSurface(t){const e=z()<.5?-1:1,i=Math.min(this.boxThickness[t],1);return i<=0||z()<.5?e:e*(1-2*i*z())}toJSON(){return{type:"box",width:this.width,height:this.height,depth:this.depth,emitFrom:this.emitFrom,boxThickness:[...this.boxThickness],...Gi.toShapeJSON(this.transform)}}static fromJSON(t){return new Yi({width:t.width,height:t.height,depth:t.depth,emitFrom:t.emitFrom,boxThickness:Array.isArray(t.boxThickness)?[Number(t.boxThickness[0])||0,Number(t.boxThickness[1])||0,Number(t.boxThickness[2])||0]:void 0,transform:Gi.fromJSON(t.transform)})}clone(){return new Yi({width:this.width,height:this.height,depth:this.depth,emitFrom:this.emitFrom,boxThickness:this.boxThickness,transform:this.transform?.clone()})}}function Hi(e,i,s,n){let r;switch(e){case t.EmitterMode.Loop:r=i-Math.floor(i);break;case t.EmitterMode.PingPong:{const t=i-2*Math.floor(i/2);r=1-Math.abs(t-1);break}case t.EmitterMode.Burst:r=n.isBursting&&n.burstParticleCount>0?n.burstParticleIndex/n.burstParticleCount:z();break;default:r=z()}return s>0&&(r=Math.floor(r/s)*s),r}t.EmitterMode=void 0,(ji=t.EmitterMode||(t.EmitterMode={}))[ji.Random=0]="Random",ji[ji.Loop=1]="Loop",ji[ji.PingPong=2]="PingPong",ji[ji.Burst=3]="Burst";class Xi{reset(){this.currentValue=0,this.memory.length=0}constructor(e={}){this.type="circle",this.currentValue=0,this.radius=e.radius??10,this.arc=e.arc??2*Math.PI,this.thickness=e.thickness??1,this.mode=e.mode??t.EmitterMode.Random,this.spread=e.spread??0,this.speed=e.speed??new Xt(1),this.memory=[],this.transform=e.transform}update(e,i){t.EmitterMode.Random!==this.mode&&(this.currentValue+=this.speed.genValue(this.memory,e.emissionState.time/e.duration)*i)}initialize(t,e){const i=Hi(this.mode,this.currentValue,this.spread,e),s=Ue(this.thickness,2),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(Math.max(0,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(),...Gi.toShapeJSON(this.transform)}}static fromJSON(t){return new Xi({radius:t.radius,arc:t.arc,thickness:t.thickness,mode:t.mode,speed:t.speed?ie(t.speed):void 0,transform:Gi.fromJSON(t.transform),spread:t.spread})}clone(){return new Xi({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{reset(){this.currentValue=0,this.memory.length=0}constructor(e={}){this.type="cone",this.currentValue=0,this.radius=e.radius??10,this.arc=e.arc??2*Math.PI,this.thickness=e.thickness??1,this.angle=e.angle??Math.PI/6,this.mode=e.mode??t.EmitterMode.Random,this.spread=e.spread??0,this.speed=e.speed??new Xt(1),this.memory=[],this.transform=e.transform}update(e,i){t.EmitterMode.Random!=this.mode&&(this.currentValue+=this.speed.genValue(this.memory,e.emissionState.time/e.duration)*i)}initialize(t,e){const i=Hi(this.mode,this.currentValue,this.spread,e),s=Ue(this.thickness,2),n=i*this.arc,r=Math.sin(n),o=Math.cos(n);t.position.x=s*o,t.position.y=s*r,t.position.z=0;const a=Math.min(Math.max(this.angle,0),Math.PI/2)*s;t.velocity.set(0,0,Math.cos(a)).addScaledVector(t.position,s>0?Math.sin(a)/s:0).multiplyScalar(t.startSpeed),t.position.multiplyScalar(Math.max(0,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(),...Gi.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?ie(t.speed):void 0,transform:Gi.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 Ki{constructor(e={}){this.type="donut",this.currentValue=0,this.radius=e.radius??10,this.arc=e.arc??2*Math.PI,this.thickness=e.thickness??1,this.donutRadius=e.donutRadius??.2*this.radius,this.mode=e.mode??t.EmitterMode.Random,this.spread=e.spread??0,this.speed=e.speed??new Xt(1),this.memory=[],this.transform=e.transform,this._m1=new at}reset(){this.currentValue=0,this.memory.length=0}update(e,i){t.EmitterMode.Random!=this.mode&&(this.currentValue+=this.speed.genValue(this.memory,e.emissionState.time/e.duration)*i)}initialize(t,e){const i=Hi(this.mode,this.currentValue,this.spread,e),s=z(),n=Ue(this.thickness,2),r=i*this.arc,o=s*Math.PI*2,a=Math.sin(r),h=Math.cos(r),l=Math.max(0,this.radius),c=Math.max(0,this.donutRadius)*n;if(t.velocity.set(Math.cos(o)*h,Math.cos(o)*a,Math.sin(o)),t.position.set(l*h,l*a,0).addScaledVector(t.velocity,c),t.velocity.multiplyScalar(t.startSpeed),t.rotation instanceof et){const e=t.rotation;0===e.x&&0===e.y&&0===e.z&&1===e.w&&(this._m1.lookAt(Le,t.velocity,Re),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(),...Gi.toShapeJSON(this.transform)}}static fromJSON(t){return new Ki({radius:t.radius,arc:t.arc,thickness:t.thickness,donutRadius:t.donutRadius,mode:t.mode,speed:t.speed?ie(t.speed):void 0,transform:Gi.fromJSON(t.transform),spread:t.spread})}clone(){return new Ki({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 ts{reset(){this.currentValue=0,this.memory.length=0}constructor(e={}){this.type="edge",this.currentValue=0,this.radius=e.radius??1,this.mode=e.mode??t.EmitterMode.Random,this.spread=e.spread??0,this.speed=e.speed??new Xt(1),this.memory=[],this.transform=e.transform}update(e,i){t.EmitterMode.Random!=this.mode&&(this.currentValue+=this.speed.genValue(this.memory,e.emissionState.time/e.duration)*i)}initialize(t,e){const i=Hi(this.mode,this.currentValue,this.spread,e);t.position.set((2*i-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(),...Gi.toShapeJSON(this.transform)}}static fromJSON(t){return new ts({radius:t.radius,mode:t.mode,speed:t.speed?ie(t.speed):void 0,spread:t.spread,transform:Gi.fromJSON(t.transform)})}clone(){return new ts({radius:this.radius,mode:this.mode,speed:this.speed.clone(),spread:this.spread,transform:this.transform?.clone()})}}class es{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=Number.isFinite(this.row)?Math.max(1,Math.floor(this.row)):1,i=Number.isFinite(this.column)?Math.max(1,Math.floor(this.column)):1,s=Math.floor(z()*e),n=Math.floor(z()*i);t.position.x=((n+.5)/i-.5)*this.width,t.position.y=((s+.5)/e-.5)*this.height,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,...Gi.toShapeJSON(this.transform)}}static fromJSON(t){return new es({width:t.width,height:t.height,column:t.column,row:t.row,transform:Gi.fromJSON(t.transform)})}clone(){return new es({width:this.width,height:this.height,column:this.column,row:this.row,transform:this.transform?.clone()})}update(t,e){}}class is{constructor(e={}){this.type="hemisphere",this.currentValue=0,this.radius=e.radius??10,this.arc=e.arc??2*Math.PI,this.thickness=e.thickness??1,this.mode=e.mode??t.EmitterMode.Random,this.spread=e.spread??0,this.speed=e.speed??new Xt(1),this.memory=[],this.transform=e.transform,this._m1=new at}reset(){this.currentValue=0,this.memory.length=0}update(e,i){t.EmitterMode.Random!=this.mode&&(this.currentValue+=this.speed.genValue(this.memory,e.emissionState.time/e.duration)*i)}initialize(t,e){const i=Hi(this.mode,this.currentValue,this.spread,e),s=z(),n=Ue(this.thickness,3),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(Math.max(0,this.radius)*n),t.rotation instanceof et){const e=t.rotation;0===e.x&&0===e.y&&0===e.z&&1===e.w&&(this._m1.lookAt(Le,t.position,Re),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(),...Gi.toShapeJSON(this.transform)}}static fromJSON(t){return new is({radius:t.radius,arc:t.arc,thickness:t.thickness,mode:t.mode,speed:t.speed?ie(t.speed):void 0,transform:Gi.fromJSON(t.transform),spread:t.spread})}clone(){return new is({radius:this.radius,arc:this.arc,thickness:this.thickness,mode:this.mode,speed:this.speed.clone(),transform:this.transform?.clone(),spread:this.spread})}}class ss{constructor(t){this.type="point",this._m1=new at,this.transform=t}update(t,e){}initialize(t){const e=z(),i=z(),s=e*Math.PI*2,n=2*i-1,r=Math.sqrt(Math.max(0,1-n*n));if(t.velocity.x=r*Math.cos(s),t.velocity.y=r*Math.sin(s),t.velocity.z=n,t.velocity.multiplyScalar(t.startSpeed),t.position.setScalar(0),t.rotation instanceof et){const e=t.rotation;0===e.x&&0===e.y&&0===e.z&&1===e.w&&(this._m1.lookAt(Le,t.velocity,Re),t.rotation.setFromRotationMatrix(this._m1))}this.transform?.apply(t)}toJSON(){return{type:"point",...Gi.toShapeJSON(this.transform)}}static fromJSON(t){return new ss(Gi.fromJSON(t?.transform))}clone(){return new ss(this.transform?.clone())}}class ns{constructor(e={}){this.type="sphere",this.currentValue=0,this.radius=e.radius??10,this.arc=e.arc??2*Math.PI,this.thickness=e.thickness??1,this.mode=e.mode??t.EmitterMode.Random,this.spread=e.spread??0,this.speed=e.speed??new Xt(1),this.memory=[],this.transform=e.transform,this._m1=new at}reset(){this.currentValue=0,this.memory.length=0}update(e,i){t.EmitterMode.Random!=this.mode&&(this.currentValue+=this.speed.genValue(this.memory,e.emissionState.time/e.duration)*i)}initialize(t,e){const i=Hi(this.mode,this.currentValue,this.spread,e),s=z(),n=Ue(this.thickness,3),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(Math.max(0,this.radius)*n),t.rotation instanceof et){const e=t.rotation;0===e.x&&0===e.y&&0===e.z&&1===e.w&&(this._m1.lookAt(Le,t.position,Re),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(),...Gi.toShapeJSON(this.transform)}}static fromJSON(t){return new ns({radius:t.radius,arc:t.arc,thickness:t.thickness,mode:t.mode,speed:t.speed?ie(t.speed):void 0,transform:Gi.fromJSON(t.transform),spread:t.spread})}clone(){return new ns({radius:this.radius,arc:this.arc,thickness:this.thickness,mode:this.mode,speed:this.speed.clone(),transform:this.transform?.clone(),spread:this.spread})}}class rs{reset(){this.currentValue=0,this.memory.length=0}constructor(e={}){this.type="rectangle",this.currentValue=0,this.width=e.width??10,this.height=e.height??10,this.thickness=e.thickness??1,this.mode=e.mode??t.EmitterMode.Random,this.spread=e.spread??0,this.speed=e.speed??new Xt(1),this.memory=[],this.transform=e.transform,this._m1=new at}update(e,i){t.EmitterMode.Random!==this.mode&&(this.currentValue+=this.speed.genValue(this.memory,e.emissionState.time/e.duration)*i)}initialize(t,e){const i=Hi(this.mode,this.currentValue,this.spread,e);z();const s=Math.max(0,this.width),n=Math.max(0,this.height),r=2*i*(s+n);let o,a,h,l;r<s?(o=r-s/2,a=-n/2,h=0,l=-1):r<s+n?(o=s/2,a=r-s-n/2,h=1,l=0):r<2*s+n?(o=s/2-(r-s-n),a=n/2,h=0,l=1):(o=-s/2,a=n/2-(r-2*s-n),h=-1,l=0);const c=Ue(this.thickness,2);if(t.position.set(o*c,a*c,0),0===o&&0===a?t.velocity.set(h,l,0):t.velocity.set(o,a,0).normalize(),t.velocity.multiplyScalar(t.startSpeed),t.rotation instanceof et){const e=t.rotation;0===e.x&&0===e.y&&0===e.z&&1===e.w&&(this._m1.lookAt(Le,t.velocity,Re),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(),...Gi.toShapeJSON(this.transform)}}static fromJSON(t){return new rs({width:t.width,height:t.height,thickness:t.thickness,mode:t.mode,speed:t.speed?ie(t.speed):void 0,transform:Gi.fromJSON(t.transform),spread:t.spread})}clone(){return new rs({width:this.width,height:this.height,thickness:this.thickness,mode:this.mode,speed:this.speed.clone(),transform:this.transform?.clone(),spread:this.spread})}}const os={box:{type:"box",params:[["width",["number"]],["height",["number"]],["depth",["number"]],["emitFrom",["boxEmitFrom"]],["boxThickness",["vec3"]],["transform",["shapeTransform"]]],constructor:Yi,loadJSON:Yi.fromJSON},circle:{type:"circle",params:[["radius",["number"]],["arc",["radian"]],["thickness",["number"]],["mode",["emitterMode"]],["spread",["number"]],["speed",["valueFunc","value"]],["transform",["shapeTransform"]]],constructor:Xi,loadJSON:Xi.fromJSON},cone:{type:"cone",params:[["radius",["number"]],["arc",["radian"]],["thickness",["number"]],["angle",["radian"]],["mode",["emitterMode"]],["spread",["number"]],["speed",["valueFunc","value"]],["transform",["shapeTransform"]]],constructor:Zi,loadJSON:Zi.fromJSON},donut:{type:"donut",params:[["radius",["number"]],["arc",["radian"]],["thickness",["number"]],["donutRadius",["number"]],["mode",["emitterMode"]],["spread",["number"]],["speed",["valueFunc","value"]],["transform",["shapeTransform"]]],constructor:Ki,loadJSON:Ki.fromJSON},edge:{type:"edge",params:[["radius",["number"]],["mode",["emitterMode"]],["spread",["number"]],["speed",["valueFunc","value"]],["transform",["shapeTransform"]]],constructor:ts,loadJSON:ts.fromJSON},point:{type:"point",params:[["transform",["shapeTransform"]]],constructor:ss,loadJSON:ss.fromJSON},sphere:{type:"sphere",params:[["radius",["number"]],["arc",["radian"]],["thickness",["number"]],["mode",["emitterMode"]],["spread",["number"]],["speed",["valueFunc","value"]],["transform",["shapeTransform"]]],constructor:ns,loadJSON:ns.fromJSON},hemisphere:{type:"hemisphere",params:[["radius",["number"]],["arc",["radian"]],["thickness",["number"]],["mode",["emitterMode"]],["spread",["number"]],["speed",["valueFunc","value"]],["transform",["shapeTransform"]]],constructor:is,loadJSON:is.fromJSON},grid:{type:"grid",params:[["width",["number"]],["height",["number"]],["column",["number"]],["row",["number"]],["transform",["shapeTransform"]]],constructor:es,loadJSON:es.fromJSON},rectangle:{type:"rectangle",params:[["width",["number"]],["height",["number"]],["thickness",["number"]],["mode",["emitterMode"]],["spread",["number"]],["speed",["valueFunc","value"]],["transform",["shapeTransform"]]],constructor:rs,loadJSON:rs.fromJSON}};function as(t,e){const i=t?os[t.type]:void 0;return i?i.loadJSON(t,e):(Gt(`${jt("emitter shape",t)}; using a point emitter.`),new ss)}function hs(t,e={}){const i=t.toJSON(),s=os[i?.type];return s?Ht(i,t=>s.loadJSON(t,e).toJSON()):i}const ls=[];function cs(t){if(!ls.find(e=>e.id===t.id)){t.initialize(),ls.push(t);for(const e of t.emitterShapes)os[e.type]||(os[e.type]=e);for(const e of t.behaviors)Ti[e.type]||(Ti[e.type]=e)}}function us(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 ds=new WeakMap;function fs(t){let e=ds.get(t);return void 0===e&&(e=i.RandomGUID(),ds.set(t,e)),e}function ms(t){return ds.get(t)}class ps{get mesh(){return this._mesh}set mesh(t){if(this._mesh=t,this._positions=void 0,this._indices=void 0,this._triangleIndexToArea.length=0,!t)return;const i=t.getVerticesData(e.VertexBuffer.PositionKind);if(!i||i.length<9)return;const s=new Float32Array(i),n=t.getIndices(),r=us(s,n&&n.length>0?Uint32Array.from(n):void 0),o=Math.floor(r.length/3);if(0===o)return;this._positions=s,this._indices=new Int32Array(r.subarray(0,3*o));let a=0;this._triangleIndexToArea.push(0);const h=new it,l=new it,c=new it,u=new it;for(let t=0;t<o;t++){const e=r[3*t],s=r[3*t+1],n=r[3*t+2];h.set(i[3*e],i[3*e+1],i[3*e+2]),l.set(i[3*s],i[3*s+1],i[3*s+2]),c.set(i[3*n],i[3*n+1],i[3*n+2]),l.sub(h),c.sub(h),u.crossVectors(l,c),a+=.5*u.length(),this._triangleIndexToArea.push(a)}}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=z()*this._triangleIndexToArea[e];for(;i+1<s;){const t=Math.floor((i+s)/2);n<this._triangleIndexToArea[t]?s=t:i=t}let r=z(),o=z();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,m=this._positions[3*h+1]-u,p=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+m*r+g*o,d+p*r+v*o);const x=m*v-p*g,b=p*y-f*v,S=f*g-m*y,w=Math.sqrt(x*x+b*b+S*S)||1;t.velocity.set(x/w,b/w,S/w).multiplyScalar(t.startSpeed),this.transform?.apply(t)}toJSON(){return{type:"mesh_surface",mesh:this._mesh?fs(this._mesh):this._meshReferenceId??"",...Gi.toShapeJSON(this.transform)}}static fromJSON(t){return new ps(void 0,t?.mesh,Gi.fromJSON(t?.transform))}clone(){return new ps(this._mesh,this._meshReferenceId,this.transform?.clone())}update(t,e){}}const ys={id:"babylon.quarks",initialize:()=>{},emitterShapes:[{type:"mesh_surface",params:[["mesh",["mesh"]]],constructor:ps,loadJSON:t=>ps.fromJSON(t)}],behaviors:[]};var gs;function vs(){return{direction:new h.Vector3(.4,-1,.6),color:new a.Color3(1,1,1),ambient:new a.Color3(.35,.35,.35)}}function xs(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 bs(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 Ss(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=bs(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}t.RenderMode=void 0,(gs=t.RenderMode||(t.RenderMode={}))[gs.BillBoard=0]="BillBoard",gs[gs.StretchedBillBoard=1]="StretchedBillBoard",gs[gs.Mesh=2]="Mesh",gs[gs.Trail=3]="Trail",gs[gs.HorizontalBillBoard=4]="HorizontalBillBoard",gs[gs.VerticalBillBoard=5]="VerticalBillBoard",gs[gs.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"}}const _s=.05;function As(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:bs(t.maskUV),softness:Math.max(1e-4,e(t.softness,_s)),edgeWidth:Math.max(0,e(t.edgeWidth,0)),edgeColor:[e(i[0],1),e(i[1],1),e(i[2],1)]}}const Vs={scroll:[0,.5]},Os=.05;function Ts(t){if(!t||"object"!=typeof t||!t.map)return;const e=t.strength;return{map:t.map,mapUV:bs(t.mapUV,Vs),strength:Math.max(0,"number"==typeof e&&Number.isFinite(e)?e:Os)}}function Ps(t){if(!t||"object"!=typeof t)return;const e=bs(t);return void 0===ws(e)?void 0:e}function $s(t){const{mapUV:e,uvDistortion:i,erosion:s}=t;return 1===e?.channel||1===i?.mapUV.channel||!!s?.mask&&1===s.maskUV.channel}function Es(t){return"unlit"===t||"scene"===t?t:"fixed"}function Cs(t){return"distance"===t||"oldestInFront"===t||"youngestInFront"===t?t:"none"}function Fs(t){return"front"===t||"back"===t?t:"both"}function Bs(t){return"pause"===t||"pauseAndCatchUp"===t?t:"always"}function Ns(t){return!t||0===t.x&&0===t.y&&0===t.z?void 0:t.clone()}function Is(t){return"number"==typeof t&&t>0?Math.min(t,1):0}function Us(t){return"number"==typeof t&&Number.isFinite(t)&&t>=1?Math.floor(t):1}function Rs(t,e){return"number"==typeof t&&Number.isFinite(t)&&t>=0?t:e}function Ls(t){const e=t.count,i="number"==typeof t.time&&Number.isFinite(t.time)&&t.time>0?t.time:0,s="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:i,count:"number"==typeof e?new Xt(e):null!=e?e:new Xt(0),cycle:s,interval:n,probability:r}}function Ds(t){return(t??[]).map(Ls).sort((t,e)=>t.time-e.time)}const ks=new Float32Array(0),qs=new Uint16Array(0);function Js(e){return e===t.RenderMode.BillBoard||e===t.RenderMode.StretchedBillBoard||e===t.RenderMode.VerticalBillBoard||e===t.RenderMode.HorizontalBillBoard}function Ws(t){return t.uTileCount>1||t.vTileCount>1}function Gs(t){return t.minParticleSize>0||t.maxParticleSize!==1/0}function Qs(e){const i=e.renderMode,s=i===t.RenderMode.Mesh,n=i===t.RenderMode.Trail,r=Js(i),a=e.softParticles,h=e.materialTransparent,l=e.pivot,c=Ps(e.mapUV),u=Ts(e.uvDistortion),d=zs(e.gradientMap),f=As(e.erosion),m=Us(e.uTileCount),p=Us(e.vTileCount);var y;return{renderMode:i,instancingGeometry:n?ks:e.instancingGeometry,instancingIndices:n?qs:e.instancingIndices,instancingUVs:n?void 0:e.instancingUVs,instancingUVs2:s&&$s({mapUV:c,uvDistortion:u,erosion:f})?e.instancingUVs2:void 0,instancingNormals:s?e.instancingNormals:void 0,renderOrder:e.renderOrder,uTileCount:m,vTileCount:p,blendTiles:!n&&e.blendTiles&&Ws({uTileCount:m,vTileCount:p}),softParticles:a,softNearFade:a?Rs(e.softNearFade,0):0,softFarFade:a?Rs(e.softFarFade,1):0,materialBlendMode:h?e.materialBlendMode:o.Constants.ALPHA_DISABLE,materialTransparent:h,materialDepthTest:e.materialDepthTest,materialDepthWrite:e.materialDepthWrite,materialAlphaTest:e.materialAlphaTest>0?e.materialAlphaTest:0,texture:e.texture,reflectionTexture:s?e.reflectionTexture??null:null,reflectionLevel:s?e.reflectionLevel??1:1,reflectionAtlas:s?e.reflectionAtlas??null:null,layerMask:e.layerMask,renderingGroupId:e.renderingGroupId??0,applyFog:e.applyFog??!0,pivot:r&&l&&(0!==l.x||0!==l.y||0!==l.z)?l.clone():void 0,sortMode:e.sortMode??"none",renderFace:s?Fs(e.renderFace):"both",minParticleSize:r?Math.max(0,e.minParticleSize??0):0,maxParticleSize:r?(y=e.maxParticleSize,void 0!==y&&y>0?y:1/0):1/0,lighting:s?e.lighting??"fixed":"fixed",rim:s?xs(e.rim):void 0,mapUV:c,uvDistortion:u,gradientMap:d,erosion:f}}function js(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.renderFace===e.renderFace&&!t.pivot==!e.pivot&&Gs(t)===Gs(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 Ys(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&&Xs(t.color,e.color)}(t.rim,e.rim)&&Zs(t.mapUV,e.mapUV)&&t.uvDistortion?.strength===e.uvDistortion?.strength&&Zs(t.uvDistortion?.mapUV,e.uvDistortion?.mapUV)&&t.gradientMap?.channel===e.gradientMap?.channel&&t.erosion?.softness===e.erosion?.softness&&t.erosion?.edgeWidth===e.erosion?.edgeWidth&&Xs(t.erosion?.edgeColor,e.erosion?.edgeColor)&&Zs(t.erosion?.maskUV,e.erosion?.maskUV)}function Hs(t,e){return js(t,e)&&Ys(t,e)}function Xs(t,e){return t&&e?t[0]===e[0]&&t[1]===e[1]&&t[2]===e[2]:!t==!e}function Zs(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}function Ks(t,e={}){const i=function(t,e){if(i=t,"function"==typeof i?.getDepthMap){const i=t,s=i._storeCameraSpaceZ?"viewZ":i._storeNonLinearDepth?"nonLinear":"linear";return{texture:t.getDepthMap(),encoding:e.encoding??s,packed:e.packed??t.isPacked}}var i;return{texture:t,encoding:e.encoding??"linear",packed:e.packed??!1}}(t,e);if(i.packed&&"viewZ"===i.encoding)throw new Error("[babylon.quarks] A packed view-Z depth cannot be decoded; use a float depth texture");return i}function tn(t,e,i){if("viewZ"===e)return i.set(1,0,0,1);const s=t.getEngine(),n=s.useReverseDepthBuffer,r=s.isNDCHalfZRange,o=t.getProjectionMatrix().m,a=o[10],h=o[11],c=o[14],u=o[15];if("linear"===e){let e,s;t.mode===l.Camera.ORTHOGRAPHIC_CAMERA?(e=!n&&r?0:1,s=n&&r?0:1):(e=n&&r?t.minZ:r?0:t.minZ,s=n&&r?0:t.maxZ);const o=n?-1:1,h=e+s;return i.set(o*h/a,(-o*e-c)/a,0,1)}const d=r?1:2,f=r?0:-1;return i.set(-d*u,c-f*u,d*h,f*h-a)}const en=2048,sn=2047;class nn{constructor(t){this.counts=new Uint32Array(en),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}}const rn="\n#ifdef FOG\nvarying vec3 vFogDistance;\n#endif\n";function on(t){return`\n#ifdef FOG\n vFogDistance = ${t};\n#endif\n`}const an="\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 hn(t){return`\n#ifdef FOG\n {\n float fogFactor = quarksFogFactor();\n#if defined(FOG_ADDITIVE)\n ${t} *= fogFactor;\n#elif defined(FOG_MULTIPLY)\n ${t} = mix(vec3(1.0), ${t}, fogFactor);\n#else\n ${t} = mix(vFogColor, ${t}, fogFactor);\n#endif\n }\n#endif\n`}const ln="\n#ifdef FOG\nvarying vFogDistance: vec3f;\n#endif\n";function cn(t){return`\n#ifdef FOG\n vertexOutputs.vFogDistance = ${t};\n#endif\n`}const un="\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#if defined(FOG_ADDITIVE)\n return rgb * fogFactor;\n#elif defined(FOG_MULTIPLY)\n return mix(vec3f(1.0), rgb, fogFactor);\n#else\n return mix(uniforms.vFogColor, rgb, fogFactor);\n#endif\n}\n#endif\n";function dn(t){return`\n#ifdef FOG\n ${t} = vec4f(quarksFog(${t}.rgb, fragmentInputs.vFogDistance), ${t}.a);\n#endif\n`}function fn(t,e,i){const s=e*i,n=mn(Math.floor(t),s);return{column:mn(n,e),row:Math.floor(n/e)}}function mn(t,e){return t-e*Math.floor(t/e)}const pn="\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 yn(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 gn="\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 vn(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 xn=`\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${pn}\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${rn}\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${on("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${yn("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`,bn=`\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${gn}\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${ln}\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${cn("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${vn("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`;function Sn(t){return`\n#if defined(BLEND_PREMULTIPLY)\n ${t}.rgb *= ${t}.a;\n#elif defined(BLEND_MULTIPLY)\n ${t}.rgb = mix(vec3(1.0), ${t}.rgb, ${t}.a);\n#endif\n`}function wn(t){return`\n#if defined(BLEND_PREMULTIPLY)\n ${t} = vec4f(${t}.rgb * ${t}.a, ${t}.a);\n#elif defined(BLEND_MULTIPLY)\n ${t} = vec4f(mix(vec3f(1.0), ${t}.rgb, ${t}.a), ${t}.a);\n#endif\n`}const Mn="\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 zn(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}.a *= clamp(softParams.y * ((sceneDepth - softParams.x) - linearDepth), 0.0, 1.0);\n }\n#endif\n`}const _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\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 An(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}.a *= clamp(uniforms.softParams.y * ((sceneDepth - uniforms.softParams.x) - fragmentInputs.linearDepth), 0.0, 1.0);\n }\n#endif\n`}const Vn="\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 Tn="\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 Pn(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 $n=`\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${an}\n${Mn}\n${Vn}\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${hn("baseColor.rgb")}\n${zn("baseColor")}\n${Sn("baseColor")}\n gl_FragColor = baseColor;\n}\n`,En=`\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${un}\n${_n}\n${Tn}\n@fragment\nfn main(input: FragmentInputs) -> FragmentOutputs {\n${Pn(!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${dn("baseColor")}\n${An("baseColor")}\n${wn("baseColor")}\n fragmentOutputs.color = baseColor;\n}\n`,Cn=`\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${an}\n${Mn}\n${Vn}\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${hn("color")}\n vec4 finalColor = vec4(color, baseColor.a);\n${zn("finalColor")}\n${Sn("finalColor")}\n gl_FragColor = finalColor;\n}\n`,Fn=`\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${un}\n${_n}\n${Tn}\n@fragment\nfn main(input: FragmentInputs) -> FragmentOutputs {\n${Pn(!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${dn("finalColor")}\n${An("finalColor")}\n${wn("finalColor")}\n fragmentOutputs.color = finalColor;\n}\n`,Bn=`\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${pn}\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${rn}\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${on("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${yn("uv")}\n\n#ifdef UV1\n vUV1 = uv;\n#endif\n vColor = color;\n}\n`,Nn=`\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${gn}\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${ln}\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${cn("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${vn("vertexInputs.uv")}\n\n#ifdef UV1\n vertexOutputs.vUV1 = vertexInputs.uv;\n#endif\n vertexOutputs.vColor = vertexInputs.color;\n}\n`,In=`\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${pn}\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${rn}\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${on("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${yn("quadUV")}\n\n#ifdef UV1\n vUV1 = quadUV;\n#endif\n vColor = color;\n}\n`,Un=`\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${gn}\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${ln}\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${cn("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${vn("quadUV")}\n\n#ifdef UV1\n vertexOutputs.vUV1 = quadUV;\n#endif\n vertexOutputs.vColor = vertexInputs.color;\n}\n`,Rn=`\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${an}\n${Mn}\n${Vn}\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${hn("baseColor.rgb")}\n${zn("baseColor")}\n${Sn("baseColor")}\n gl_FragColor = baseColor;\n}\n`,Ln=`\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${un}\n${_n}\n${Tn}\n@fragment\nfn main(input: FragmentInputs) -> FragmentOutputs {\n${Pn(!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${dn("baseColor")}\n${An("baseColor")}\n${wn("baseColor")}\n fragmentOutputs.color = baseColor;\n}\n`,Dn=`\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${rn}\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${on("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`,kn=`\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${ln}\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${cn("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 qn=["position","uv","offset","color","size","rotation","uvTile"],Jn=["position","previous","next","side","width","uv","color"],Wn=["vFogInfos","vFogColor"];function Gn(e){return e===t.RenderMode.StretchedBillBoard||e===t.RenderMode.Beam}const Qn=new Set([o.Constants.ALPHA_SUBTRACT,o.Constants.ALPHA_MAXIMIZED,o.Constants.ALPHA_ONEONE,o.Constants.ALPHA_PREMULTIPLIED,o.Constants.ALPHA_PREMULTIPLIED_PORTERDUFF,o.Constants.ALPHA_SCREENMODE,o.Constants.ALPHA_ONEONE_ONEONE,o.Constants.ALPHA_ALPHATOCOLOR,o.Constants.ALPHA_REVERSEONEMINUS,o.Constants.ALPHA_SRC_DSTONEMINUSSRCALPHA,o.Constants.ALPHA_ONEONE_ONEZERO,o.Constants.ALPHA_EXCLUSION,o.Constants.ALPHA_MAX]),jn=new Set([o.Constants.ALPHA_MULTIPLY,o.Constants.ALPHA_MIN]),Yn=new Set([o.Constants.ALPHA_COMBINE,o.Constants.ALPHA_PREMULTIPLIED,o.Constants.ALPHA_PREMULTIPLIED_PORTERDUFF,o.Constants.ALPHA_INTERPOLATE,o.Constants.ALPHA_SRC_DSTONEMINUSSRCALPHA,o.Constants.ALPHA_LAYER_ACCUMULATE,o.Constants.ALPHA_REPLACE_COLOR]);function Hn(t){const e=t.materialBlendMode;if(!t.materialTransparent||e===o.Constants.ALPHA_DISABLE)return{output:"straight",fogTarget:"color"};const i=Qn.has(e)?"premultiply":jn.has(e)?"multiply":"straight";return{output:i,fogTarget:"multiply"===i?"white":Yn.has(e)||"straight"===i&&e!==o.Constants.ALPHA_ADD?"color":"black"}}function Xn(e,i){return e.renderMode===t.RenderMode.Trail?function(t,e){const i=Zn(t),s=[...Jn],n=["view","projection",...Wn],r=[];null!==t.texture&&(i.push("USE_MAP"),r.push("map"));tr(t,i,n,r),Kn(t,e,i,n,r),$s(t)&&s.push("uv2");return{name:"quarksTrail",vertex:{glsl:Dn,wgsl:kn},fragment:{glsl:Rn,wgsl:Ln},defines:i,attributes:s,uniforms:n,samplers:r}}(e,i):function(e,i){const s=e.renderMode,n=s===t.RenderMode.Mesh,r=`quarksParticle_${s}`;let o,a;n?(o={glsl:xn,wgsl:bn},a={glsl:Cn,wgsl:Fn}):Gn(s)?(o={glsl:In,wgsl:Un},a={glsl:$n,wgsl:En}):(o={glsl:Bn,wgsl:Nn},a={glsl:$n,wgsl:En});const h=Zn(e),l=[...qn],c=["world","view","projection",...Wn],u=[];(function(e){return null!==e.texture||e.renderMode===t.RenderMode.Mesh})(e)&&(h.push("USE_MAP"),u.push("map"));const d=n&&null!==e.reflectionAtlas&&i.envAtlasReady;d&&(h.push("USE_ENVMAP_ATLAS"),u.push("envAtlas"),c.push("reflectionLevel"));Ws(e)&&(h.push("UV_TILE"),c.push("tileCountX","tileCountY"),e.blendTiles&&h.push("TILE_BLEND"));Kn(e,i,h,c,u),s===t.RenderMode.VerticalBillBoard&&h.push("VERTICAL");s===t.RenderMode.HorizontalBillBoard&&h.push("HORIZONTAL");s===t.RenderMode.Beam&&h.push("BEAM");Js(s)&&(e.pivot&&(h.push("PIVOT"),c.push("pivot")),Gs(e)&&(h.push("SIZE_LIMITS"),c.push("sizeLimits")));const f=n&&"unlit"!==(e.lighting??"fixed");n&&!f&&h.push("MESH_UNLIT");f&&c.push("lightDirection","lightColor","ambientColor");const m=n?e.rim:void 0;m&&(h.push("MESH_RIM"),"fade"===m.mode?h.push("MESH_RIM_FADE"):"mix"===m.mode&&h.push("MESH_RIM_MIX"),c.push("rimColor","rimParams"));(d||m)&&c.push("eyePosition");tr(e,h,c,u),n&&(l.push("normal"),$s(e)&&i.meshUV2&&(h.push("MESH_UV2"),l.push("uv2")));Gn(s)&&l.push("velocity");return{name:r,vertex:o,fragment:a,defines:h,attributes:l,uniforms:c,samplers:u}}(e,i)}function Zn(t){const{output:e,fogTarget:i}=Hn(t),s=[];return"premultiply"===e?s.push("BLEND_PREMULTIPLY"):"multiply"===e&&s.push("BLEND_MULTIPLY"),t.applyFog&&(s.push("FOG"),"black"===i?s.push("FOG_ADDITIVE"):"white"===i&&s.push("FOG_MULTIPLY")),s}function Kn(t,e,i,s,n){t.softParticles&&null!==e.depth&&(i.push("SOFT_PARTICLES"),e.depth.packed&&i.push("SOFT_DEPTH_PACKED"),s.push("softParams","projParams"),n.push("depthTexture")),t.materialAlphaTest>0&&(i.push("USE_ALPHATEST"),s.push("alphaTest"))}function tr(t,e,i,s){const{mapUV:n,uvDistortion:r,gradientMap:o,erosion:a}=t;$s(t)&&e.push("UV1"),n&&(e.push("MAP_TRANSFORM"),1===n.channel&&e.push("MAP_UV1"),i.push("mapTransform")),r&&(e.push("UV_DISTORTION"),1===r.mapUV.channel&&e.push("UV_DISTORTION_UV1"),s.push("distortionMap"),i.push("distortionTransform","distortionStrength")),o&&(e.push("GRADIENT_MAP"),s.push("gradientMap"),i.push("gradientMapRange","gradientMapChannel")),a&&(e.push("EROSION"),i.push("erosionParams","erosionEdgeColor"),a.mask&&(e.push("EROSION_MASK"),1===a.maskUV.channel&&e.push("EROSION_MASK_UV1"),s.push("erosionMask"),i.push("erosionMaskTransform")))}function er(t){return t.isWebGPU?y.ShaderLanguage.WGSL:y.ShaderLanguage.GLSL}function ir(t,e,i,s){if(s===y.ShaderLanguage.WGSL)return m.ShaderStore.ShadersStoreWGSL[t+"VertexShader"]=e.wgsl,void(m.ShaderStore.ShadersStoreWGSL[t+"FragmentShader"]=i.wgsl);p.Effect.ShadersStore[t+"VertexShader"]=e.glsl,p.Effect.ShadersStore[t+"FragmentShader"]=i.glsl}class sr{constructor(t,e,i=null){this.parentNode=null,this.visibleSystems=[],this.boundsMin_=new it,this.boundsMax_=new it,this.time=0,this.underusedFills=0,this.scene=e,this.depth=i,this.maxParticles=0,this.systems=new Set,this.settings=Qs(t)}attachTo(t){this.parentNode=t,this.mesh.parent=t}configureMesh(){const t=this.mesh;t.alwaysSelectAsActiveMesh=!0,t.doNotSyncBoundingInfo=!0,t.parent=this.parentNode,t.freezeWorldMatrix(h.Matrix.Identity());const e=t.getWorldMatrix();t.computeWorldMatrix=()=>e,t.setBoundingInfo(new g.BoundingInfo(h.Vector3.Zero(),h.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 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}static writeBound(t,e){e(t);const i=t.getEffect();i?.isReady()&&e(i)}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:x.Scene.FOGMODE_NONE;i.setFloat4("vFogInfos",s,e.fogStart,e.fogEnd,e.fogDensity),i.setColor3("vFogColor",e.fogColor)})}usesUV1(){return $s(this.settings)}bindSurface(t){const{mapUV:e,uvDistortion:i,gradientMap:s,erosion:n}=this.settings;if(i?.map&&t.setTexture("distortionMap",i.map),s?.ramp&&t.setTexture("gradientMap",s.ramp),n?.mask&&t.setTexture("erosionMask",n.mask),this.writeSurfaceParams(t),!(e||i||n?.mask||s))return;const r=t=>t-2*Math.floor(t/2),o=new h.Vector4,a=new h.Vector4,l=new h.Vector4,c=new h.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 e=this.time,i=t.getEffect(),{mapUV:s,uvDistortion:n,gradientMap:r,erosion:h}=this.settings;if(s&&(u(s,e,o),t.setVector4("mapTransform",o),i?.setVector4("mapTransform",o)),n&&(u(n.mapUV,e,a),t.setVector4("distortionTransform",a),i?.setVector4("distortionTransform",a)),h?.mask&&(u(h.maskUV,e,l),t.setVector4("erosionMaskTransform",l),i?.setVector4("erosionMaskTransform",l)),r?.ramp){const e=r.ramp.getSize().width,s=e>0?.5/e:0;c.set(s,1-s),t.setVector2("gradientMapRange",c),i?.setVector2("gradientMapRange",c)}};d(),t.onBindObservable.add(d)}writeSurfaceParams(t){const{uvDistortion:e,gradientMap:i,erosion:s}=this.settings;if(e?.map&&t.setFloat("distortionStrength",e.strength),i?.ramp){const[e,s,n,r]=Ms[i.channel];t.setVector4("gradientMapChannel",new h.Vector4(e,s,n,r))}s&&(t.setVector2("erosionParams",new h.Vector2(s.softness,s.edgeWidth)),t.setVector3("erosionEdgeColor",new h.Vector3(s.edgeColor[0],s.edgeColor[1],s.edgeColor[2])))}applyLiveSettings(t){Object.assign(this.settings,t);const e=this.mesh.material;e instanceof c.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 i of this.systems)i.emitter.visible&&!0!==i.culled&&(t[e++]=i);return t.length=e,t}applyDepthTexture(t){t instanceof v.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 i=this.mesh.material;t&&i instanceof c.ShaderMaterial&&i.setTexture("depthTexture",t.texture)}bindSoft(t){if(this.writeSoftParams(t),this.drawsSoft()){t.setTexture("depthTexture",this.depth.texture);const e=new h.Vector4(1,0,0,1);t.onBindObservable.add(()=>{const i=this.scene.activeCamera;i&&this.depth&&(tn(i,this.depth.encoding,e),sr.writeBound(t,t=>t.setVector4("projParams",e)))})}}writeSoftParams(t){this.drawsSoft()&&t.setVector2("softParams",new h.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){}fitBuffers(t){if(t>this.maxParticles)return this.underusedFills=0,void this.expandBuffers(t);this.maxParticles>this.initialCapacity&&t<this.maxParticles/4?++this.underusedFills>=sr.SHRINK_AFTER_FILLS&&(this.underusedFills=0,this.maxParticles=Math.max(this.initialCapacity,this.maxParticles/2),this.resizeBuffers()):this.underusedFills=0}dispose(){this.mesh.dispose()}}sr.SHRINK_AFTER_FILLS=300;class nr extends sr{static whiteTexture(t){let e=nr.whiteTextureByScene.get(t);if(!e){e=u.RawTexture.CreateRGBATexture(new Uint8Array([255,255,255,255]),1,1,t),e.name="quarksMeshWhite",nr.whiteTextureByScene.set(t,e);const i=e;e.onDisposeObservable.addOnce(()=>{nr.whiteTextureByScene.get(t)===i&&nr.whiteTextureByScene.delete(t)})}return e}constructor(t,e,i=null){super(t,e,i),this.shaderMaterial=null,this.cancelAtlasRebuild=null,this.disposed=!1,this.fixedLightDirection=new h.Vector3,this.fixedLightColor=new h.Vector3,this.fixedAmbientColor=new h.Vector3,this.warnedUV2=!1,this.initialCapacity=1e3,this.gatherScratch=[],this.vector_=new it,this.vector2_=new it,this.vector3_=new it,this.quaternion_=new et,this.quaternion2_=new et,this.quaternion3_=new et,this.quaternion4_=new et,this.quaternion5_=new et,this.rotationMat_=new vt,this.rotationMat2_=new vt,this.clearedInstanceUploaded=!1,this.beamEnd_=new it,this.storeFixedLighting(vs()),this.maxParticles=this.initialCapacity,this.setupBuffers(),this.rebuildMaterial()}setupBuffers(){this.mesh?.dispose(),this.mesh=new d.Mesh("spriteBatch",this.scene),this.configureMesh();const t=new f.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 e=this.settings.instancingUVs2;if(this.settings.renderMode!==t.RenderMode.Mesh||!e||!this.usesUV1())return!1;const i=this.settings.instancingGeometry.length/3*2;return e.length===i||(this.warnedUV2||(this.warnedUV2=!0,console.warn(`[babylon.quarks] instancingUVs2 has ${e.length} values for ${i/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 i=this.scene.getEngine();this.offsetBuffer=new Float32Array(3*this.maxParticles),this.offsetVB=new e.VertexBuffer(i,this.offsetBuffer,"offset",!0,!1,3,!0),this.mesh.setVerticesBuffer(this.offsetVB),this.colorBuffer=new Float32Array(4*this.maxParticles),this.colorVB=new e.VertexBuffer(i,this.colorBuffer,"color",!0,!1,4,!0),this.mesh.setVerticesBuffer(this.colorVB),this.sizeBuffer=new Float32Array(3*this.maxParticles),this.sizeVB=new e.VertexBuffer(i,this.sizeBuffer,"size",!0,!1,3,!0),this.mesh.setVerticesBuffer(this.sizeVB),this.uvTileBuffer=new Float32Array(this.maxParticles),this.uvTileVB=new e.VertexBuffer(i,this.uvTileBuffer,"uvTile",!0,!1,1,!0),this.mesh.setVerticesBuffer(this.uvTileVB),this.settings.renderMode===t.RenderMode.Mesh?(this.rotationBuffer=new Float32Array(4*this.maxParticles),this.rotationVB=new e.VertexBuffer(i,this.rotationBuffer,"rotation",!0,!1,4,!0)):(this.rotationBuffer=new Float32Array(this.maxParticles),this.rotationVB=new e.VertexBuffer(i,this.rotationBuffer,"rotation",!0,!1,1,!0)),this.mesh.setVerticesBuffer(this.rotationVB),Gn(this.settings.renderMode)&&(this.velocityBuffer=new Float32Array(4*this.maxParticles),this.velocityVB=new e.VertexBuffer(i,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.resizeBuffers()}resizeBuffers(){this.disposeExpandableBuffers(),this.buildExpandableBuffers(),this.sortScratch=void 0,this.gatherScratch.length=0}sizeLimits(){const{minParticleSize:t,maxParticleSize:e}=this.settings;return Js(this.settings.renderMode)&&Gs(this.settings)?new h.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 nn(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=$e.SCALAR_STRIDE;for(let t=0,i=$e.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&sn]++;if(s[i[n[0]]>>>t&sn]===e)continue;let o=0;for(let t=0;t<en;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&sn]++]=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 e=this.settings.renderMode===t.RenderMode.Mesh,i=this.settings.texture??(e?nr.whiteTexture(this.scene):null),s=this.settings.reflectionAtlas,n=e&&!!s&&!s.isReady();if(this.cancelAtlasRebuild?.(),this.cancelAtlasRebuild=null,n&&s){const t=s.onLoadObservable;if(t){const e=t.addOnce(()=>{this.cancelAtlasRebuild=null,this.disposed||this.rebuildMaterial()});this.cancelAtlasRebuild=()=>t.remove(e)}}const r=this.usesEnvAtlas(),a=Xn(this.settings,{depth:this.depth,envAtlasReady:r,meshUV2:this.meshUV2()}),{defines:l,attributes:u,uniforms:d,samplers:f}=a,m=a.name,p=this.settings.lighting??"fixed",y=e&&"unlit"!==p,g=e?this.settings.rim:void 0,v=r||!!g,x=er(this.scene.getEngine());ir(m,a.vertex,a.fragment,x);const b=new c.ShaderMaterial(m,this.scene,{vertex:m,fragment:m},{attributes:u,uniforms:d,samplers:f,defines:l,needAlphaBlending:this.settings.materialTransparent,shaderLanguage:x});if(i&&b.setTexture("map",i),r&&s&&b.setTexture("envAtlas",s),v){const t=new h.Vector3;b.setVector3("eyePosition",t),b.onBindObservable.add(()=>{const e=this.scene.activeCamera;e&&(t.copyFrom(e.globalPosition),sr.writeBound(b,e=>e.setVector3("eyePosition",t)))})}if(Ws(this.settings)&&(b.setFloat("tileCountX",this.settings.uTileCount),b.setFloat("tileCountY",this.settings.vTileCount)),this.bindSoft(b),this.writeSpriteParams(b,r),y&&(this.writeFixedLighting(b),"scene"===p)){const t=new h.Vector3,e=new h.Vector3,i=new h.Vector3;b.onBindObservable.add(()=>{const s=nr.readSceneLight(this.scene,t,e,i);sr.writeBound(b,n=>s?n.setVector3("lightDirection",t).setVector3("lightColor",e).setVector3("ambientColor",i):this.writeFixedLighting(n))})}this.bindFog(b),this.bindSurface(b),b.backFaceCulling="both"!==this.settings.renderFace,b.cullBackFaces="back"!==this.settings.renderFace,this.settings.materialTransparent?b.alphaMode=this.settings.materialBlendMode:b.alphaMode=o.Constants.ALPHA_DISABLE,b.needDepthPrePass=this.settings.materialDepthWrite&&this.settings.materialTransparent,b.forceDepthWrite=this.settings.materialDepthWrite,b.disableDepthWrite=!this.settings.materialDepthWrite,b.depthFunction=this.settings.materialDepthTest?0:o.Constants.ALWAYS,this.shaderMaterial?.dispose(!1,!1),this.mesh.material=b,this.shaderMaterial=b}writeSpriteParams(e,i){i&&e.setFloat("reflectionLevel",this.settings.reflectionLevel);const s=this.settings.renderMode===t.RenderMode.Mesh?this.settings.rim:void 0;s&&(e.setVector3("rimColor",new h.Vector3(s.color[0],s.color[1],s.color[2])),e.setVector2("rimParams",new h.Vector2(s.power,s.strength)));const n=Js(this.settings.renderMode)?this.settings.pivot:void 0;n&&e.setVector3("pivot",new h.Vector3(n.x,n.y,n.z));const r=this.sizeLimits();r&&e.setVector2("sizeLimits",r)}writeLiveUniforms(t){super.writeLiveUniforms(t),this.writeSpriteParams(t,this.usesEnvAtlas())}usesEnvAtlas(){const e=this.settings.reflectionAtlas;return this.settings.renderMode===t.RenderMode.Mesh&&!!e&&e.isReady()}applyMeshLighting(e){this.storeFixedLighting(e);const i=this.shaderMaterial;null!==i&&this.settings.renderMode===t.RenderMode.Mesh&&"unlit"!==this.settings.lighting&&this.writeFixedLighting(i)}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 e=0,i=0;const s=this.settings.renderMode,n=s===t.RenderMode.Mesh,r=s===t.RenderMode.StretchedBillBoard,o=s===t.RenderMode.Beam,a=r||o,h=Js(s),l=this.getVisibleSystems();for(let t=0;t<l.length;t++)i+=l[t].particleNum;this.fitBuffers(i);for(let t=0;t<l.length;t++){const i=l[t],s=i.particleNum;if(0===s)continue;const a=i.particles,c=this.quaternion2_,u=this.vector2_,d=this.vector3_,f=i.worldSpace,m=i.emitter.matrixWorld;if(n&&!f)m.decompose(u,c,d);else{const t=m.elements;d.set(Math.sqrt(t[0]*t[0]+t[1]*t[1]+t[2]*t[2]),Math.sqrt(t[4]*t[4]+t[5]*t[5]+t[6]*t[6]),Math.sqrt(t[8]*t[8]+t[9]*t[9]+t[10]*t[10]))}r&&!f&&this.rotationMat_.setFromMatrix4(m);const p=Math.abs(d.x),y=Math.abs(d.y),g=Math.abs(d.z),v=r?i.rendererEmitterSettings:void 0,x=void 0===v||0===v.speedFactor?.001:v.speedFactor,b=v?.lengthFactor??0,S=i.store,w=void 0!==S,M=void 0!==S&&!0!==i.onlyUsedByOther,z=i.simulationResidual??0,_=0===z?0:z/(i.simulationStep??z);w&&(0!==_&&s>0&&S.previousColor!==S.color?nr.continueColor(this.colorBuffer,4*e,S,s,_):this.colorBuffer.set(S.color.subarray(0,4*s),4*e));let A=!1;if(void 0!==S&&f)0!==_&&s>0?nr.extrapolate(this.offsetBuffer,3*e,S,s,_):this.offsetBuffer.set(S.position.subarray(0,3*s),3*e),0!==_&&s>0&&S.previousSize!==S.size?nr.continueVector3(this.sizeBuffer,3*e,S.size,S.previousSize,s,_):this.sizeBuffer.set(S.size.subarray(0,3*s),3*e),A=!0;else if(M&&s>0){const t=3*e,i=t+3*s,n=this.offsetBuffer;0!==_?nr.extrapolate(n,t,S,s,_):n.set(S.position.subarray(0,3*s),t);const r=m.elements,o=r[0],a=r[1],h=r[2],l=r[3],c=r[4],u=r[5],d=r[6],f=r[7],v=r[8],x=r[9],b=r[10],w=r[11],M=r[12],z=r[13],V=r[14],O=r[15];for(let e=t;e<i;e+=3){const t=n[e],i=n[e+1],s=n[e+2],r=1/(l*t+f*i+w*s+O);n[e]=(o*t+c*i+v*s+M)*r,n[e+1]=(a*t+u*i+x*s+z)*r,n[e+2]=(h*t+d*i+b*s+V)*r}const T=this.sizeBuffer;0!==_&&S.previousSize!==S.size?nr.continueVector3(T,t,S.size,S.previousSize,s,_):T.set(S.size.subarray(0,3*s),t);for(let e=t;e<i;e+=3)T[e]*=p,T[e+1]*=y,T[e+2]*=g;A=!0}const V=e;if(M&&!n){const t=S;this.uvTileBuffer.set(t.uvTile.subarray(0,s),V);const i=this.rotationBuffer;if(i.set(t.rotation.subarray(0,s),V),0!==z){const e=t.angularVelocity;for(let t=0;t<s;t++)i[V+t]+=e[t]*z}r&&this.velocityBuffer&&nr.writeVelocities(this.velocityBuffer,4*V,t,s,_,f?null:this.rotationMat_,x,b),e+=s}else if(M&&S.rotationQuaternion.length>0){const t=S;this.uvTileBuffer.set(t.uvTile.subarray(0,s),V),nr.writeQuaternions(this.rotationBuffer,4*V,t,s,_,f?null:c),e+=s}else for(let t=0;t<s;t++,e++){const i=a[t];if(n){let t=i.rotation;const s=i.angularVelocity;let n;if(0!==_&&s instanceof et&&(t=this.quaternion4_.copy(t).multiply(nr.partialTurn(s,_,this.quaternion5_))),f)n=t;else{let e;e=i.parentMatrix?this.quaternion3_.setFromRotationMatrix(i.parentMatrix):c,n=this.quaternion_,n.copy(e).multiply(t)}const r=4*e;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 t=i.angularVelocity;this.rotationBuffer[e]=i.rotation+("number"==typeof t?t*z:0)}if(!A){const t=i.position,s=i.previousPosition;let n=t.x+(t.x-s.x)*_,r=t.y+(t.y-s.y)*_,o=t.z+(t.z-s.z)*_;if(!f){const t=(i.parentMatrix??m).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*e;this.offsetBuffer[a]=n,this.offsetBuffer[a+1]=r,this.offsetBuffer[a+2]=o;const h=i.size,l=3*e;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*p,this.sizeBuffer[l+1]=h.y*y,this.sizeBuffer[l+2]=h.z*g)}if(!w){const t=i.color,s=4*e;this.colorBuffer[s]=t.x,this.colorBuffer[s+1]=t.y,this.colorBuffer[s+2]=t.z,this.colorBuffer[s+3]=t.w}if(this.uvTileBuffer[e]=i.uvTile,r&&this.velocityBuffer){const t=i.velocity,s=i.previousVelocity,n=t.x+(t.x-s.x)*_,r=t.y+(t.y-s.y)*_,o=t.z+(t.z-s.z)*_,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*e;this.velocityBuffer[h]=a.x*x,this.velocityBuffer[h+1]=a.y*x,this.velocityBuffer[h+2]=a.z*x,this.velocityBuffer[h+3]=b}}const O=i.tint;void 0!==O&&e>V&&nr.applyTint(this.colorBuffer,4*V,e-V,O),h&&void 0!==i.flip&&(void 0!==S?nr.applyFlip(this.sizeBuffer,3*V,S.flip,s):nr.applyFlipFromParticles(this.sizeBuffer,3*V,a,s)),o&&this.velocityBuffer&&this.writeBeams(i,V,e-V)}this.mesh.forcedInstanceCount=e,this.refreshBoundingInfo(),0!==e?(this.clearedInstanceUploaded=!1,"none"!==this.settings.sortMode&&this.sortInstances(e,n,a),this.offsetVB.update(this.offsetBuffer.subarray(0,3*e)),this.sizeVB.update(this.sizeBuffer.subarray(0,3*e)),this.colorVB.update(this.colorBuffer.subarray(0,4*e)),this.uvTileVB.update(this.uvTileBuffer.subarray(0,e)),this.rotationVB.update(this.rotationBuffer.subarray(0,n?4*e:e)),a&&this.velocityVB&&this.velocityBuffer&&this.velocityVB.update(this.velocityBuffer.subarray(0,4*e))):this.clearedInstanceUploaded||(this.uploadClearedInstance(n,a),this.clearedInstanceUploaded=!0)}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 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],m=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,p=l*c,y=e*p+m*u+i*f-s*d,g=i*p+m*d+s*u-e*f,v=s*p+m*f+e*d-i*u;m=m*p-e*u-i*d-s*f,e=y,i=g,s=v}if(h){const t=l*m+d*e+c*s-u*i,n=c*m+d*i+u*e-l*s,r=u*m+d*s+l*i-c*e;m=d*m-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]=m}}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.disposed=!0,this.cancelAtlasRebuild?.(),this.cancelAtlasRebuild=null,this.mesh.material&&this.mesh.material.dispose(),super.dispose()}}nr.whiteTextureByScene=new WeakMap;function rr(t){const e=Math.round(Number(t?.tessellation)||0);return Math.min(16,Math.max(0,e))}function or(t){const e=Number(t?.curveTension)||0;return Math.min(1,Math.max(0,e))}const ar=["stretch","tile","distributePerSegment","repeatPerSegment"];function hr(t){const e=t?.textureMode;return void 0!==e&&ar.includes(e)?e:"stretch"}function lr(t){const e=Number(t?.textureScale);return Number.isFinite(e)&&e>0?e:1}function cr(t){const e=Number(t?.minVertexDistance);return Number.isFinite(e)&&e>0?e:0}function ur(t){const e=Number(t?.lifetime);return Number.isFinite(e)&&e>0?e:1/0}class dr{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,i,s,n){const r=3*t;if(n){const t=1/(n[3]*e+n[7]*i+n[11]*s+n[15]);this.position[r]=(n[0]*e+n[4]*i+n[8]*s+n[12])*t,this.position[r+1]=(n[1]*e+n[5]*i+n[9]*s+n[13])*t,this.position[r+2]=(n[2]*e+n[6]*i+n[10]*s+n[14])*t}else this.position[r]=e,this.position[r+1]=i,this.position[r+2]=s}writeSide(t,e,i,s,n){const r=3*t;n?(this.side[r]=n[0]*e+n[4]*i+n[8]*s,this.side[r+1]=n[1]*e+n[5]*i+n[9]*s,this.side[r+2]=n[2]*e+n[6]*i+n[10]*s):(this.side[r]=e,this.side[r+1]=i,this.side[r+2]=s)}writeColor(t,e,i,s,n){const r=4*t;this.color[r]=e,this.color[r+1]=i,this.color[r+2]=s,this.color[r+3]=n}}function fr(t,e,i){return Math.sqrt(Math.sqrt((t[i]-t[e])**2+(t[i+1]-t[e+1])**2+(t[i+2]-t[e+2])**2))}class mr extends sr{constructor(t,e,i=null){super(t,e,i),this.uv1Buffer=null,this.drawsNothing=!1,this.initialCapacity=1024,this.vector2_=new it,this.vector3_=new it,this.quaternion_=new et,this.samples_=new dr,this.curve_=new dr,this.cutScratch_=new dr,this.maxParticles=this.initialCapacity,this.setupBuffers(),this.rebuildMaterial()}setupBuffers(){this.mesh?.dispose(),this.mesh=new d.Mesh("trailBatch",this.scene),this.configureMesh(),this.buildGeometryBuffers()}buildGeometryBuffers(){const t=this.maxParticles;this.positionBuffer=new Float32Array(3*t),this.previousBuffer=new Float32Array(3*t),this.nextBuffer=new Float32Array(3*t),this.uvBuffer=new Float32Array(2*t),this.uv1Buffer=this.usesUV1()?new Float32Array(2*t):null,this.sideBuffer=new Float32Array(t),this.widthBuffer=new Float32Array(t),this.colorBuffer=new Float32Array(4*t),this.indexBuffer=new Uint32Array(3*t);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(e.VertexBuffer.PositionKind,this.positionBuffer,!0),this.mesh.setVerticesData(e.VertexBuffer.UVKind,this.uvBuffer,!0),this.uv1Buffer&&this.mesh.setVerticesData(e.VertexBuffer.UV2Kind,this.uv1Buffer,!0),this.mesh.setVerticesData(e.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 i=this.scene.getEngine();this.previousVB=new e.VertexBuffer(i,this.previousBuffer,"previous",!0,!1,3,!1),this.nextVB=new e.VertexBuffer(i,this.nextBuffer,"next",!0,!1,3,!1),this.sideVB=new e.VertexBuffer(i,this.sideBuffer,"side",!0,!1,1,!1),this.widthVB=new e.VertexBuffer(i,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.resizeBuffers()}resizeBuffers(){this.previousVB?.dispose(),this.nextVB?.dispose(),this.sideVB?.dispose(),this.widthVB?.dispose(),this.buildGeometryBuffers()}rebuildMaterial(){const t=Xn(this.settings,{depth:this.depth,envAtlasReady:!1,meshUV2:!1}),{defines:e,attributes:i,uniforms:s,samplers:n}=t,r=t.name,a=er(this.scene.getEngine());ir(r,t.vertex,t.fragment,a);const h=new c.ShaderMaterial(r,this.scene,{vertex:r,fragment:r},{attributes:i,uniforms:s,samplers:n,defines:e,needAlphaBlending:this.settings.materialTransparent,shaderLanguage:a});this.settings.texture&&h.setTexture("map",this.settings.texture),this.bindFog(h),this.bindSoft(h),this.bindSurface(h),h.backFaceCulling=!1,this.settings.materialTransparent?h.alphaMode=this.settings.materialBlendMode:h.alphaMode=o.Constants.ALPHA_DISABLE,h.needDepthPrePass=this.settings.materialDepthWrite&&this.settings.materialTransparent,h.forceDepthWrite=this.settings.materialDepthWrite,h.disableDepthWrite=!this.settings.materialDepthWrite,h.depthFunction=this.settings.materialDepthTest?0:o.Constants.ALWAYS,this.mesh.material?.dispose(!1,!1),this.mesh.material=h}trailSamples(t){return this.samples_.reserve(t)}cutLastSegment(t,e,i,s,n){const r=e-1-i,o=this.cutScratch_.reserve(i+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<=i;e++){const a=s*e,h=Math.min(i-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,i,s,n,r){const o=this.curve_.reserve((i-1)*(s+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<i;n++){const i=3*n,f=i+3;let m=0,p=0,y=0,g=0,v=0,x=0,b=i,S=f;if(n+1<e){b=3*(n>0?n-1:n),S=3*(n+2<e?n+2:n+1);const t=fr(a,i,f);if(t>1e-6){const e=fr(a,b,i),s=fr(a,f,S);y=u,g=u,e>1e-6&&(m=u*t/e,p=-u*t/(e+t)),s>1e-6&&(v=-u*t/(t+s),x=u*t/s)}}const w=0===m&&0===p&&0===y&&0===g&&0===v&&0===x,M=r?Math.sqrt(h[i]*h[i]+h[i+1]*h[i+1]+h[i+2]*h[i+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<=s;e++,d++){const u=e/(s+1),_=u*u,A=_*u,V=w?1-u:2*A-3*_+1,O=A-2*_+u,T=w?u:-2*A+3*_,P=A-_,$=3*d;for(let t=0;t<3;t++){const e=a[i+t],s=a[f+t],n=m*(e-a[b+t])+p*(s-a[b+t])+y*(s-e),r=g*(s-e)+v*(a[S+t]-e)+x*(a[S+t]-s);l[$+t]=V*e+O*n+T*s+P*r}if(r){let t=0,e=0,s=0;for(let n=0;n<3;n++){const r=h[i+n],o=h[f+n],a=V*r+O*(m*(r-h[b+n])+p*(o-h[b+n])+y*(o-r))+T*o+P*(g*(o-r)+v*(h[S+n]-r)+x*(h[S+n]-o));0===n?t=a:1===n?e=a:s=a}let n=Math.sqrt(t*t+e*e+s*s);if(n<=1e-6*Math.max(M,z,1e-6)){const r=u<.5?i:f;t=h[r],e=h[r+1],s=h[r+2],n=u<.5?M:z}const r=n>0?(M+(z-M)*u)/n:0;c[$]=t*r,c[$+1]=e*r,c[$+2]=s*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 E=4*n,C=4*d;for(let e=0;e<4;e++)o.color[C+e]=t.color[E+e]+(t.color[E+4+e]-t.color[E+e])*u}}const f=3*(i-1),m=3*d;for(let t=0;t<3;t++)l[m+t]=a[f+t],c[m+t]=h[f+t];o.size[d]=t.size[i-1],o.distance[d]=t.distance[i-1];for(let e=0;e<4;e++)o.color[4*d+e]=t.color[4*(i-1)+e];return o}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,r=rr(e.rendererEmitterSettings);for(let t=0;t<e.particleNum;t++){const e=n[t].historyCount;0!==e&&(i+=2*(e*(r+1)+1))}}this.fitBuffers(i);for(let i=0;i<s.length;i++){const n=s[i],r=t;mr.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,m=1/d,p=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),b=this.uv1Buffer,S=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),A=Math.abs(_)<1e-4?0:_,V=rr(v),O=or(v),T=hr(v),P="stretch"===T?0:"tile"===T?1:"repeatPerSegment"===T?3:2,$=lr(v),E=cr(v)>0;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.historyDistances,u=s.historySides,v=void 0!==M&&u.length>=3*r,z=S?s.store.color:s.historyColors,_=4*s.storeIndex,{column:T,row:C}=fn(s.uvTile,d,f),F=(s.parentMatrix??l).elements,B=y||s.parentMatrix?1:g,N=w||s.parentMatrix?1:g,I=s.age<s.life,U=I&&A>0,R=n+(U?1:0),L=this.trailSamples(R);let D=s.getHistoryIndex(0);for(let t=0;t<n;t++){const e=o;if(L.writePoint(t,e[3*D],e[3*D+1],e[3*D+2],w?null:F),v){const e=u;L.writeSide(t,e[3*D],e[3*D+1],e[3*D+2],w?null:F)}L.size[t]=a[D],L.distance[t]=h[D];const i=S?_:4*D;L.writeColor(t,z[i],z[i+1],z[i+2],z[i+3]),D=D+1===r?0:D+1}if(U){const t=s.previousPosition,e=s.position,i=n;let r=e.x+(e.x-t.x)*A,a=e.y+(e.y-t.y)*A,h=e.z+(e.z-t.z)*A;if(L.writePoint(i,r,a,h,y?null:F),w&&!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,i=(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=i}const l=3*s.getHistoryIndex(n-1),c=r-o[l],u=a-o[l+1],d=h-o[l+2];L.distance[i]=L.distance[i-1]+Math.sqrt(c*c+u*u+d*d),v&&L.writeSide(i,M.x,M.y,M.z,F),L.size[i]=L.size[i-1];const f=s.color;L.writeColor(i,f.x,f.y,f.z,f.w)}const k=V>0?this.tessellate(L,n,R,V,O,v):L,q=V>0?(R-1)*(V+1)+1:R,J=V+1,W=I&&A<0&&n>1;let G=1+A;if(W&&E){const t=k.distance,e=t[q-1]-t[q-1-J];if(e>1e-9){const t=s.previousPosition,i=s.position;let n=i.x-t.x,r=i.y-t.y,o=i.z-t.z;if(w&&!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+A*Math.min(1,a/e)}}W&&this.cutLastSegment(k,q,J,G,v);const Q=n-1+(U?A:W?G-1:0),j=1/Math.max(.001,Q),Y=(R-2)*J,H=k.position,X=k.distance,Z=X[0],K=X[q-1],tt=0===P&&K-Z>1e-6,et=1/Math.max(1e-6,K-Z),it=N*$,st=Math.floor(Z*it),nt=(f-C-1)*p,rt=(f-C)*p;for(let i=0;i<q;i++,t+=2){const s=3*i,r=i>0?s-3:s,o=i+1<q?s+3:s,a=H[s],h=H[s+1],l=H[s+2],c=k.size[i],u=3*t;if(v){const e=k.side;this.writeSweptPair(u,a,h,l,e[s],e[s+1],e[s+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]=H[r],this.previousBuffer[u+1]=H[r+1],this.previousBuffer[u+2]=H[r+2],this.previousBuffer[u+3]=H[r],this.previousBuffer[u+4]=H[r+1],this.previousBuffer[u+5]=H[r+2],this.nextBuffer[u]=H[o],this.nextBuffer[u+1]=H[o+1],this.nextBuffer[u+2]=H[o+2],this.nextBuffer[u+3]=H[o],this.nextBuffer[u+4]=H[o+1],this.nextBuffer[u+5]=H[o+2];const d=2*t;let f;if(tt){const t=(X[i]-Z)*et;f=(x?1-t:t)*$}else if(1===P)f=x?(K-X[i])*it:X[i]*it-st;else{let t=i/J;if(i>Y&&(U||W)){const e=(i-Y)/J;t=U?n-1+A*e:n-2+G*e}if(3!==P){const e=Math.min(1,t*j);f=(x?1-e:e)*$}else f=(x?Q-t:t)*$}const p=(f+T)*m;this.uvBuffer[d]=p,this.uvBuffer[d+1]=nt,this.uvBuffer[d+2]=p,this.uvBuffer[d+3]=rt,b&&(b[d]=f,b[d+1]=0,b[d+2]=f,b[d+3]=1);const y=k.color,g=4*i,S=4*t;this.colorBuffer[S]=y[g],this.colorBuffer[S+1]=y[g+1],this.colorBuffer[S+2]=y[g+2],this.colorBuffer[S+3]=y[g+3],this.colorBuffer[S+4]=y[g],this.colorBuffer[S+5]=y[g+1],this.colorBuffer[S+6]=y[g+2],this.colorBuffer[S+7]=y[g+3],i+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 C=n.tint;if(void 0!==C){const e=this.colorBuffer;for(let i=4*r,s=4*t;i<s;i+=4)e[i]*=C.x,e[i+1]*=C.y,e[i+2]*=C.z,e[i+3]*=C.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(t,i){const s=this.mesh.geometry,n=s?.getIndexBuffer();if(t>0&&i>0){this.mesh.updateVerticesData(e.VertexBuffer.PositionKind,this.positionBuffer.subarray(0,3*t)),this.mesh.updateVerticesData(e.VertexBuffer.UVKind,this.uvBuffer.subarray(0,2*t)),this.uv1Buffer&&this.mesh.updateVerticesData(e.VertexBuffer.UV2Kind,this.uv1Buffer.subarray(0,2*t)),n&&this.scene.getEngine().updateDynamicIndexBuffer(n,this.indexBuffer.subarray(0,3*i),0),this.previousVB.update(this.previousBuffer.subarray(0,3*t)),this.nextVB.update(this.nextBuffer.subarray(0,3*t)),this.widthVB.update(this.widthBuffer.subarray(0,t));const s=this.mesh.getVertexBuffer(e.VertexBuffer.ColorKind);s&&s.update(this.colorBuffer.subarray(0,4*t)),this.mesh.subMeshes&&this.mesh.subMeshes.length>0&&(this.mesh.subMeshes[0].indexCount=3*i,this.mesh.subMeshes[0].verticesCount=t),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.setBoundingInfo(t)}dispose(){this.mesh.material&&this.mesh.material.dispose(),super.dispose()}}class pr extends r.TransformNode{get batches(){return this.batchList}get systemToBatchIndex(){return this.batchIndexOf}constructor(t,e){super(t,e),this.batchList=[],this.batchIndexOf=new Map,this.elapsed=0,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=vs(),this.cullingEnabled=!0,this.catchUpBudgetMs=2,this.simulationBudgetMs=1/0,this.cameraPlanes=[],this.cameraMasks=[],this.cameraCount=0,this.boundsMin=new it,this.boundsMax=new it}collectCameras(){var t;const e=this.getScene(),i=e.activeCameras,r=e.activeCamera,o=i&&i.length>0?i:r?[r]:[];for(let e=0;e<o.length;e++){const i=o[e];i.getViewMatrix(),i.getProjectionMatrix();const r=(t=this.cameraPlanes)[e]??(t[e]=[0,1,2,3,4,5].map(()=>new n.Plane(0,0,0,0)));s.Frustum.GetPlanesToRef(i.getTransformationMatrix(),r),this.cameraMasks[e]=i.layerMask}return this.cameraCount=o.length,o.length}isSystemInView(t){const e=this.boundsMin,i=this.boundsMax;if(!t.getWorldBounds(e,i))return!0;const s=t.layers.mask;for(let t=0;t<this.cameraCount;t++){if(0===(this.cameraMasks[t]&s))continue;const n=this.cameraPlanes[t];let r=!0;for(let t=0;t<6;t++){const s=n[t],o=s.normal,a=o.x>=0?i.x:e.x,h=o.y>=0?i.y:e.y,l=o.z>=0?i.z:e.z;if(o.x*a+o.y*h+o.z*l+s.d<0){r=!1;break}}if(r)return!0}return!1}static clamp(t,e,i){return Math.max(e,Math.min(i,t))}addSystem(t){if(this.isDisposed())throw new Error("BatchedRenderer.addSystem: the renderer has been disposed");const e=t;if(e.emitter.getScene()!==this.getScene())throw new Error("BatchedRenderer.addSystem: the system belongs to another scene");const i=e._renderer;void 0!==i&&i!==this&&i.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(e){const i=e,s=e.getRendererSettings(),n=Qs(s);for(let t=0;t<this.batchList.length;t++)if(Hs(this.batchList[t].settings,n))return this.batchList[t].addSystem(i),void this.batchIndexOf.set(i,t);let r;const o=this.getScene();switch(s.renderMode){case t.RenderMode.Trail:r=new mr(s,o,this.depth);break;case t.RenderMode.Mesh:case t.RenderMode.BillBoard:case t.RenderMode.VerticalBillBoard:case t.RenderMode.HorizontalBillBoard:case t.RenderMode.StretchedBillBoard:case t.RenderMode.Beam:r=new nr(s,o,this.depth);break;default:throw new Error(`Unsupported render mode: ${s.renderMode}`)}r.attachTo(this),r.applyMeshLighting(this.meshLighting),r.addSystem(i),this.batchList.push(r),this.batchEmptyFrames.push(0),this.batchIndexOf.set(i,this.batchList.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.batchIndexOf.get(t);return void 0!==e&&(this.batchList[e].removeSystem(t),this.batchIndexOf.delete(t),!0)}updateSystem(t){const e=this.batchIndexOf.get(t);if(void 0!==e){const i=this.batchList[e],s=Qs(t.getRendererSettings());if(1===i.systems.size&&js(i.settings,s)&&!this.batchList.some(t=>t!==i&&Hs(t.settings,s)))return void i.applyLiveSettings(s)}this.removeFromBatch(t),this.addSystem(t)}setDepthTexture(t,e={}){this.depth=t?Ks(t,e):null;for(const t of this.batchList)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.batchList)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=pr.clamp(t.minQuality??e.minQuality,.1,1),s=pr.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=pr.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,n="object"==typeof t?t.system:void 0;void 0!==n&&s.has(n)&&e.push(n)}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.collectCameras():0,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=n>0&&"always"!==i.cullingMode&&!0!==i.onlyUsedByOther&&!this.isSystemInView(i),i.update(t,o,a)),s[e]!==i&&e--}this.refreshBatches(),e.enabled&&(e.lastFrameCpuMs=performance.now()-i,e.lastFrameCpuMs>e.targetFrameMs?e.currentQuality=pr.clamp(e.currentQuality-e.decreaseStep,e.minQuality,e.maxQuality):e.currentQuality=pr.clamp(e.currentQuality+e.increaseStep,e.minQuality,e.maxQuality))}refreshBatches(){const t=this.batchEmptyFrames;for(let e=0;e<this.batchList.length;e++){const i=this.batchList[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>pr.EMPTY_BATCH_GRACE_FRAMES&&(this.removeBatch(e),e--)}}removeBatch(t){this.batchList[t].dispose(),this.batchList.splice(t,1),this.batchEmptyFrames.splice(t,1);for(const[e,i]of this.batchIndexOf)i>t&&this.batchIndexOf.set(e,i-1)}getBatchRenderStats(){return this.batchList.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.batchList)t.dispose();this.batchList.length=0,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.batchIndexOf.clear(),super.dispose()}}pr.EMPTY_BATCH_GRACE_FRAMES=120;const yr=new WeakMap,gr=new WeakMap;function vr(t,e,i){if(yr.has(t))return;const s={textures:new Set(e),materials:new Set(i)};for(const t of[...s.textures,...s.materials])gr.set(t,(gr.get(t)??0)+1);yr.set(t,s),t.onDisposeObservable.addOnce(()=>xr(t))}function xr(t){const e=yr.get(t);if(void 0!==e){yr.delete(t);for(const t of[...e.materials,...e.textures]){const e=(gr.get(t)??1)-1;e>0?gr.set(t,e):(gr.delete(t),t.dispose())}}}function br(t){t.dispose(),xr(t)}let Sr=0;class wr extends r.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 fs(this)}constructor(t,e){super("particleEmitter",e||void 0),this._matrixWorld=new at,this._matrixWorldFlag=-1,this.system=t}dispose(t,e=!1){this.isDisposed()||(super.dispose(t,e),Sr>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:fs(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(!1),ps:this.system.toJSON(t,e)}}}class Mr{static runOnAllParticleEmitters(t,e){Mr.traverseNode(t,t=>{t instanceof wr&&e(t)})}static addToBatchRenderer(t,e){Mr.runOnAllParticleEmitters(t,t=>{e.addSystem(t.system)})}static play(t){Mr.runOnAllParticleEmitters(t,t=>{t.system.play()})}static resume(t){Mr.runOnAllParticleEmitters(t,t=>{t.system.resume()})}static stop(t){Mr.runOnAllParticleEmitters(t,t=>{t.system.stop()})}static pause(t){Mr.runOnAllParticleEmitters(t,t=>{t.system.pause()})}static restart(t){Mr.runOnAllParticleEmitters(t,t=>{t.system.restart()})}static setAutoDestroy(t,e){Mr.runOnAllParticleEmitters(t,t=>{t.system.autoDestroy=e})}static endEmit(t){Mr.runOnAllParticleEmitters(t,t=>{t.system.endEmit()})}static isEffectFinished(t){let e=!1,i=!0;return Mr.runOnAllParticleEmitters(t,t=>{e=!0,t.system.isFinished()||(i=!1)}),e&&i}static instantiate(t,e){const i=new Map,s=new Map,n=new Set([t,...t.getDescendants(!1)]),o=t=>{let e=s.get(t);return void 0===e&&(e=t.clone(t.name,null,!0),e.setEnabled(t.isEnabled(!1)),s.set(t,e)),e},a=(t,e,s)=>{let h;if(t instanceof wr)h=t.clone(s),i.set(t,h);else if(t instanceof d.Mesh)h=o(t),void 0!==s&&(h.name=s);else if(t instanceof b.InstancedMesh){const e=n.has(t.sourceMesh)?o(t.sourceMesh):void 0;h=t.clone(s??t.name,null,!0,e),h.setEnabled(t.isEnabled(!1))}else{if(!(t instanceof r.TransformNode))return null;h=new r.TransformNode(s??t.name,t.getScene()),h.position.copyFrom(t.position),h.rotation.copyFrom(t.rotation),h.scaling.copyFrom(t.scaling),t.rotationQuaternion&&(h.rotationQuaternion=t.rotationQuaternion.clone()),h.setEnabled(t.isEnabled(!1))}h.parent=e;for(const e of t.getChildren())a(e,h);return h},h=a(t,null,e);!function(t,e){for(let i=t;null!==i;i=i.parent){const t=yr.get(i);if(void 0!==t)return void vr(e,t.textures,t.materials)}}(t,h);for(const t of i.values()){const e=t.system;for(const t of e.behaviors)if(t instanceof Qe){const e=i.get(t.subParticleSystem);void 0!==e&&(t.subParticleSystem=e)}const n=e.emitterShape;if(n instanceof ps&&void 0!==n.mesh){const t=s.get(n.mesh);void 0!==t&&(n.mesh=t)}}return h}static getDuration(t){const e=[];Mr.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 Qe))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=Mr.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:(Mr.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 Xt)return t.value;if(t instanceof Zt)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)Mr.traverseNode(t,e)}}const zr=new WeakMap,_r=new WeakMap,Ar=new WeakSet,Vr=new WeakMap,Or=new WeakSet,Tr=new WeakSet;function Pr(t){if(!t?.isCube)return null;const e=t.files??t._files;return 6===e?.length?e.slice():null}function $r(t){return t.getScene?.()??null}function Er(t,e=$r(t)){return e&&zr.get(t)?.get(e)||null}function Cr(t,e){Vr.delete(t);const i=zr.get(t);if(i)for(const[t,s]of[...i])e&&t!==e||(i.delete(t),Ar.has(s)&&s.dispose())}function Fr(t,e,i){let s=zr.get(t);s||(s=new Map,zr.set(t,s)),s.set(e,i),!Or.has(i)&&i.onDisposeObservable&&(Or.add(i),i.onDisposeObservable.addOnce(()=>{zr.get(t)?.get(e)===i&&zr.get(t).delete(e)})),!Tr.has(t)&&t.onDisposeObservable&&(Tr.add(t),t.onDisposeObservable.addOnce(()=>{Tr.delete(t),Cr(t)}))}async function Br(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 S.Texture(n.toDataURL("image/jpeg",.92),e,{noMipmap:!0,invertY:!1,samplingMode:S.Texture.LINEAR_LINEAR});return o.name="quarksEnvAtlas",o}const Nr={createFromFaceUrls:Br};function Ir(t,e,i){const s=Er(t,e);if(s)return i(s),s;let n=_r.get(t);n||(n=new Map,_r.set(t,n));const r=n,o=()=>{const s=r.get(e);if(s)return void s.then(t=>{t&&i(t)});const n=Pr(t);if(!n||Vr.get(t)===n.join("\n"))return;let o=!1;const a=t.onDisposeObservable?.addOnce(()=>o=!0),h=()=>{r.delete(e),a&&t.onDisposeObservable.remove(a)},l=Nr.createFromFaceUrls(n,e).then(s=>(h(),o||e.isDisposed?(s.dispose(),null):(Ar.add(s),Fr(t,e,s),i(s),s))).catch(e=>(h(),Vr.set(t,n.join("\n")),console.warn("[babylon.quarks] Failed to build env atlas from cubemap faces",e),null));r.set(e,l)};if(t.isReady())o();else{const e=t.onLoadObservable;e?e.addOnce(()=>o()):o()}return Er(t,e)}const Ur=new Set(["SizeOverLife","SizeBySpeed"]),Rr=new Set(["ColorOverLife","ColorBySpeed"]),Lr=new Set(["ApplyForce","Noise","TurbulenceField","GravityForce","RotationOverLife","Rotation3DOverLife","RotationBySpeed","SpeedOverLife","FrameOverLife","ForceOverLife","VelocityOverLife","InheritVelocity","OrbitOverLife","WidthOverLength","ChangeEmitDirection","EmitSubParticleSystem","LimitSpeedOverLife","ApplyCollision"]);class Dr{constructor(){this.fusionSteps=[],this.changesSize=!0,this.changesColor=!0}steps(t){const e=this.plan;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.plan=t.slice(),this.fusionSteps=Wi(t);let i=!1,s=!1;for(let e=0;e<t.length;e++){const n=t[e].type;Ur.has(n)?i=!0:Rr.has(n)?s=!0:Lr.has(n)||(i=!0,s=!0)}return this.changesSize=i,this.changesColor=s,this.fusionSteps}}function kr(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 qr{constructor(){this.min=new it,this.max=new it,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(e,i,s,n,r,o,a,h,l,c,u,d,f,m){if(0===e)return void(this.valid=!1);this.stepsSince=i?0:this.stepsSince+1,this.maxSize=l,this.maxSpeedSq=c;const p=Math.sqrt(c),y=u.renderMode;let g=p*m*(this.stepsSince+1);if(y===t.RenderMode.Mesh)g+=l*this.meshGeometryRadius(u.instancingGeometry);else if(y===t.RenderMode.StretchedBillBoard){const t=d;g+=l*(1+(t.lengthFactor??0)+p*(t.speedFactor??0))}else{const t=u.pivot;g+=l*(.75+(void 0===t?0:Math.abs(t.x)+Math.abs(t.y)+Math.abs(t.z)))}this.min.set(s,n,r),this.max.set(o,a,h),this.padding=g,this.inWorld=f,this.valid=!0}setWorld(t,e,i,s,n,r,o){this.min.set(t,e,i),this.max.set(s,n,r),this.padding=o,this.inWorld=!0,this.valid=!0}worldPadding(t){return this.inWorld?this.padding:this.padding*kr(t.matrixWorld.elements)}toWorld(t,e,i){if(!this.valid)return!1;const s=this.min,n=this.max;if(this.inWorld){const i=this.padding;return t.set(s.x-i,s.y-i,s.z-i),e.set(n.x+i,n.y+i,n.z+i),!0}const r=i.matrixWorld.elements,o=this.padding*kr(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:s.x,i=2&t?n.y:s.y,o=4&t?n.z:s.z,f=1/(r[3]*e+r[7]*i+r[11]*o+r[15]),m=(r[0]*e+r[4]*i+r[8]*o+r[12])*f,p=(r[1]*e+r[5]*i+r[9]*o+r[13])*f,y=(r[2]*e+r[6]*i+r[10]*o+r[14])*f;m<a&&(a=m),m>c&&(c=m),p<h&&(h=p),p>u&&(u=p),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 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}}function Jr(t){return t.cycle>=1?Math.floor(t.cycle):1}function Wr(t){return t.interval>0?t.interval:0}class Gr{constructor(t,e){this.system=t,this.spawner=e,this.memory=[],this.pathMatrix=new at,this.temp=new it}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 i=t.startDelay.genValue(e,0);return t.emissionOverTime.startGen(e),i}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 i=e.time/t.duration;return this.emitsFrom(t.emissionOverTime,i)||this.emitsFrom(t.emissionOverDistance,i)}emitsFrom(t,e){if(t.genValue(this.memory,e)>0)return!0;if("function"!==t.type)return!1;if(t instanceof ee){for(let i=0;i<t.functions.length;i++)if(t.getEndX(i)>e&&t.functions[i][0].p.some(t=>t>0))return!0;return!1}for(let i=1;i<=64;i++)if(t.genValue(this.memory,e+(1-e)*i/64)>0)return!0;return!1}hasPendingBurstWaves(t){const e=t.burstWaves;if(void 0===e)return!1;const i=this.system.emissionBursts,s=this.system.duration;for(let n=0;n<t.burstIndex&&n<i.length;n++){const t=i[n],r=e[n]??0;if(r<Jr(t)&&(0===r||t.time+r*Wr(t)<=s))return!0}return!1}emit(t,e,i){const s=this.system;if(s.isDisposed)return;const n=s.duration,r=s.isEmitEnded&&e===s.emissionState;e.time>n&&(s.looping?(e.time-=n,e.burstIndex=0,void 0!==e.burstWaves&&(e.burstWaves.length=0)):s.isEmitEnded||s.onlyUsedByOther||s.endEmit()),s.worldSpace&&this.spawner.normalMatrix.getNormalMatrix(i);const o=s.emissionFactor();s.emissionBursts.length>0&&!r&&this.emitBursts(e,i);let a=0,h=0,l=0,c=0;const u=e.previousWorldPos;if(!s.isEmitEnded){const r=e.time/n;if(e.waitEmiting+=t*s.emissionOverTime.genValue(this.memory,r)*o,void 0!==u){this.temp.set(i.elements[12],i.elements[13],i.elements[14]),c=u.distanceTo(this.temp);const t=s.emissionOverDistance.genValue(this.memory,r)*o;if(t>0){l=e.travelDistance,e.travelDistance+=c;const i=Math.floor(e.travelDistance*t);i>0&&(e.travelDistance-=i/t,s.worldSpace&&c>0?(a=i,h=1/t):e.waitEmiting+=i)}else e.travelDistance=0}}const d=Math.floor(e.waitEmiting);d>0&&(this.spawner.spawn(d,e,i),e.waitEmiting-=d),a>0&&this.spawnAlongPath(a,e,i,u,l,h,c),void 0===e.previousWorldPos&&(e.previousWorldPos=new it),e.previousWorldPos.set(i.elements[12],i.elements[13],i.elements[14]),e.time+=t}emitBursts(t,e){const i=this.system.emissionBursts,s=this.system.duration,n=i.length,r=t.time,o=t.burstWaves??(t.burstWaves=[]);for(;t.burstIndex<n&&i[t.burstIndex].time<=r;)o[t.burstIndex]=0,t.burstIndex++;const a=t.burstIndex;for(let n=0;n<a;n++){const a=i[n],h=Jr(a);let l=o[n]??0;if(l>=h)continue;const c=Wr(a);for(;l<h;){const i=a.time+l*c;if(l>0&&i>s){l=h;break}if(i>r)break;t.burstWaveIndex=l,this.fireBurstWave(a,t,e),l++}o[n]=l}}fireBurstWave(t,e,i){if(z()>=t.probability)return;const s=t.count.genValue(this.memory,e.time/this.system.duration),n=this.system.emissionFactor(),r=Math.abs(n-1)<.001?s:Math.floor(s*n+z());e.isBursting=!0,e.burstParticleCount=r,this.spawner.spawn(r,e,i),e.isBursting=!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.spawner.spawn(1,e,a)}}}class Qr{constructor(){this.listeners={}}add(t,e){this.listeners[t]=[...this.listeners[t]??[],e]}removeAll(t){if(void 0!==t)delete this.listeners[t];else for(const t of Object.keys(this.listeners))delete this.listeners[t]}remove(t,e){const i=this.listeners[t];if(void 0===i)return;const s=i.indexOf(e);-1!==s&&(this.listeners[t]=i.filter((t,e)=>e!==s))}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 i=0;i<e.length;i++)e[i](t)}}const jr=new Float32Array([-.5,-.5,0,.5,-.5,0,.5,.5,0,-.5,.5,0]),Yr=new Float32Array([0,0,1,0,1,1,0,1]),Hr=new Uint32Array([0,1,2,0,2,3]),Xr=new WeakMap,Zr=new WeakMap;function Kr(t){let e=Xr.get(t);return void 0!==e&&e.length===t.length/3*2||(e=new Float32Array(t.length/3*2),Xr.set(t,e)),e}function to(t){let e=Zr.get(t);if(!e){e=new Float32Array(t.length);for(let t=2;t<e.length;t+=3)e[t]=1;Zr.set(t,e)}return e}function eo(t){return t?t instanceof Float32Array?t:new Float32Array(t):void 0}const io=1/60;class so{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 i=e>1?Math.ceil(8*e):8,s=Math.min(i,Math.max(0,Math.round(this.accumulator/io-1e-9)));return this.accumulator-=s*io,s}get residual(){return this.accumulator>io?io:this.accumulator<-io?-io: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/io);return this.pendingCatchUp=0,t}}const no=new it;function ro(t,e,i,s){const n=t[i],r=t[s];return t[i]=r,t[s]=n,i!==s&&(e.swapRows(i,s),r.setStoreIndex(i),n.setStoreIndex(s)),n}function oo(t){return t?.getScene()?t:null}const ao=new it(0,0,1),ho=new et,lo=new et,co=new it,uo=new it;class fo{constructor(t){this.system=t,this.normalMatrix=new vt}rebind(){const t=this.system.particles;for(let e=0;e<t.length;e++)t[e].rebind()}grow(t){const e=this.system,i=e.particles.length;e.store.ensureCapacity(i+1)&&this.rebind(),e.particles.push(t?new Ne(e.store,i):new Fe(e.store,i))}spawn(e,i,s){const n=this.system,r=co,o=uo;s.decompose(r,lo,o);const a=n.behaviors,h=a.length,l=n.rendererSettings.renderMode,c=l===t.RenderMode.Trail,u=!c,d=l===t.RenderMode.Mesh,f=n.startRotation,m=n.startSize,p="rotation"===f.type,y="vec3function"===m.type,g=i.time/n.duration,v=c?n.rendererEmitterSettings:void 0,x=Boolean(v?.followLocalOrigin),b=n.worldSpace,S="hierarchy"===n.scalingMode,w=n.particles;void 0!==n.maxParticles&&(e=Math.min(e,Math.max(0,n.maxParticles-n.particleNum)));for(let t=0;t<e;t++){i.burstParticleIndex=t,n.particleNum++,w.length<n.particleNum&&this.grow(c);const e=w[n.particleNum-1];if(e.reset(),e.serial=(e.serial??0)+1,e.speedModifier=1,n.finishedEventFired=!1,n.startColor.startGen(e.memory),n.startColor.genColor(e.memory,e.startColor,g),e.color.copy(e.startColor),n.startSpeed.startGen(e.memory),e.startSpeed=n.startSpeed.genValue(e.memory,g),n.startLife.startGen(e.memory),e.life=n.startLife.genValue(e.memory,g),e.age=0,m.startGen(e.memory),y)m.genValue(e.memory,e.startSize,g);else{const t=m.genValue(e.memory,g);e.startSize.set(t,t,t)}if(n.startTileIndex.startGen(e.memory),e.uvTile=n.startTileIndex.genValue(e.memory),e.size.copy(e.startSize),u){const t=e;if(f.startGen(e.memory),d)t.rotation instanceof et||(t.rotation=ho),t.angularVelocity instanceof et&&t.angularVelocity.set(0,0,0,1),p?f.genValue(e.memory,t.rotation,1,g):t.rotation.setFromAxisAngle(ao,f.genValue(t.memory,g));else{t.rotation=p?0:f.genValue(t.memory,g),t.angularVelocity=0;const e=n.flip;t.flip=void 0===e?0:(z()<e.x?1:0)|(z()<e.y?2:0)}}else if(v){const t=e;v.startLength.startGen(t.memory),t.length=v.startLength.genValue(t.memory,g),t.ensureHistoryCapacity(Math.max(1,Math.ceil(t.length))),t.resetHistory()}n.emitterShape.initialize(e,i),n.alignToDirection&&u&&mo(e,d);const r=i.particle,l=i.inherit;if(void 0!==r&&void 0!==l&&0!==l&&po(e,r,l,u),c&&x){const t=e;t.localPosition||(t.localPosition=new it),t.localPosition.copy(t.position)}b?(e.position.applyMatrix4(s),e.startSize.multiply(o).abs(),e.size.copy(e.startSize),S?e.velocity.multiply(n.hierarchyScale).applyQuaternion(lo):e.velocity.multiply(o).applyMatrix3(this.normalMatrix),e.rotation&&e.rotation instanceof et&&e.rotation.multiplyQuaternions(lo,e.rotation)):n.onlyUsedByOther&&(e.parentMatrix=s);for(let t=0;t<h;t++)a[t].initialize(e,n);n.store.recordMemory(e.storeIndex,e.memory)}}}function mo(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;co.copy(i).divideScalar(Math.sqrt(s)),lo.setFromUnitVectors(ao,co),e.multiplyQuaternions(lo,e)}else 0===i.x&&0===i.y||(t.rotation=t.rotation+Math.atan2(-i.x,i.y))}function po(t,e,i,s){if(i&We.color&&(t.startColor.multiply(e.color),t.color.copy(t.startColor)),i&We.size&&(t.startSize.multiply(e.size),t.size.copy(t.startSize)),i&We.rotation&&s){const i=t,s=e.rotation;"number"==typeof i.rotation?"number"==typeof s&&(i.rotation+=s):s instanceof et&&i.rotation.multiplyQuaternions(s,i.rotation)}i&We.lifetime&&e.life>0&&(t.life*=Math.max(0,1-e.age/e.life))}function yo(t,e,i,s,n={}){return{param:t,json:n.json,get:e,isDefault:t=>t===i,toJSON:t=>t,fromJSON:s,clone:t=>t}}function go(t){return"number"==typeof t?t:void 0}function vo(t){return"number"==typeof t?Us(t):void 0}function xo(t){return"number"==typeof t&&Number.isFinite(t)&&t>=0?t:void 0}function bo(t){return"number"==typeof t?0!==t:"boolean"==typeof t?t:void 0}function So(t,e,i,s,n=!0){const r=JSON.stringify(i().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 Xt(t):s(t),clone:t=>t.clone()}}function wo(t){const e=t;if(void 0!==e)return void 0===e.z?[e.x,e.y]:[e.x,e.y,e.z]}const Mo=[yo("autoDestroy",t=>t.autoDestroy,!1,bo),yo("looping",t=>t.looping,!0,bo),yo("prewarm",t=>t.prewarm,!1,bo),yo("prewarmTime",t=>t.prewarmTime,0,go),yo("duration",t=>t.duration,1,go),So("startDelay",t=>t.startDelay,()=>new Xt(0),ie,!1),So("startLife",t=>t.startLife,()=>new Xt(5),ie),So("startSpeed",t=>t.startSpeed,()=>new Xt(0),ie),So("startRotation",t=>t.startRotation,()=>new Xt(0),t=>xe(t)),So("startSize",t=>t.startSize,()=>new Xt(1),t=>xe(t)),So("startColor",t=>t.startColor,()=>new de(new Vt(1,1,1,1)),t=>fe(t)),So("emissionOverTime",t=>t.emissionOverTime,()=>new Xt(10),ie),So("emissionOverDistance",t=>t.emissionOverDistance,()=>new Xt(0),ie),{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)?Ds(t.map(t=>({time:t.time,count:"number"==typeof t.count?new Xt(t.count):ie(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()}))},yo("maxParticles",t=>t.maxParticles,void 0,go),yo("onlyUsedByOther",t=>t.onlyUsedByOther,!1,bo),yo("renderMode",t=>t.renderMode,t.RenderMode.BillBoard,go),yo("renderOrder",t=>t.renderOrder,0,go),yo("renderingGroupId",t=>t.renderingGroupId,0,go),yo("applyFog",t=>t.applyFog,!0,t=>!1!==t),yo("playbackSpeed",t=>t.playbackSpeed,1,go),yo("cullingMode",t=>t.cullingMode,"always",Bs),yo("scalingMode",t=>t.scalingMode,"shape",t=>"hierarchy"===t?"hierarchy":"shape"),yo("seed",t=>t.seed,void 0,go),yo("sortMode",t=>t.sortMode,"none",Cs),yo("renderFace",t=>t.renderFace,"both",Fs),yo("alignToDirection",t=>t.alignToDirection,!1,t=>!0===t),yo("minParticleSize",t=>t.minParticleSize,0,go),yo("maxParticleSize",t=>t.maxParticleSize,1/0,go),yo("layerMask",t=>t.layers.mask,268435455,go,{json:"layers"}),So("startTileIndex",t=>t.startTileIndex,()=>new Xt(0),ie),yo("uTileCount",t=>t.uTileCount,1,vo),yo("vTileCount",t=>t.vTileCount,1,vo),yo("blendTiles",t=>t.blendTiles,!1,bo),yo("softParticles",t=>t.softParticles,!1,bo),yo("softFarFade",t=>t.softFarFade,1,xo),yo("softNearFade",t=>t.softNearFade,0,xo),yo("blendMode",t=>t.blending,o.Constants.ALPHA_ADD,go,{json:"blending"}),yo("transparent",t=>t.transparent,!0,bo),yo("depthTest",t=>t.depthTest,!0,bo),yo("depthWrite",t=>t.depthWrite,!1,bo),yo("alphaTest",t=>t.alphaTest,0,go),yo("worldSpace",t=>t.worldSpace,!1,bo),{param:"pivot",get:t=>t.pivot,isDefault:t=>void 0===t,toJSON:wo,fromJSON:t=>Array.isArray(t)?new it(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:wo,fromJSON:t=>Array.isArray(t)?new Mt(t[0]??0,t[1]??0):void 0,clone:t=>t?.clone()}];function zo(t){return t.json??t.param}function _o(t){const e={};for(const i of Mo){const s=i.get(t);!i.always&&i.isDefault(s)||(e[zo(i)]=i.toJSON(s))}return e}function Ao(t){const e={};for(const i of Mo)e[i.param]=i.clone(i.get(t));return e}const Vo=new WeakMap,Oo=new WeakMap,To=new WeakMap;function Po(t,e){const i=(Vo.get(t)??0)+1;return Vo.set(t,i),`${e}_${i}`}function $o(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 Eo(t){const e={},i=rr(t),s=or(t);return i>0&&(e.tessellation=i),s>0&&(e.curveTension=s),e}function Co(t){const e={},i=hr(t),s=lr(t),n=cr(t),r=ur(t);return"stretch"!==i&&(e.textureMode=i),1!==s&&(e.textureScale=s),n>0&&(e.minVertexDistance=n),r!==1/0&&(e.lifetime=r),e}function Fo(t){return t?.followLocalOrigin?{followLocalOrigin:!0}:{}}function Bo(t){const e=t?.sideAxis;return e?{sideAxis:[e.x,e.y,e.z]}:{}}function No(t){if(null==t)return{};let e,i,s;Array.isArray(t)?[e,i,s]=t:"object"==typeof t&&({x:e,y:i,z:s}=t);const n=t=>"number"==typeof t?t:"string"==typeof t&&""!==t.trim()?Number(t):NaN,[r,o,a]=[n(e),n(i),n(s)];return Number.isFinite(r)&&Number.isFinite(o)&&Number.isFinite(a)&&r*r+o*o+a*a>0?{sideAxis:new it(r,o,a)}:(Gt(`sideAxis ${JSON.stringify(t)} is not a direction and is ignored`),{})}function Io(e,i){const s=void 0===i||"string"==typeof i?{geometries:{},materials:{},textures:{},images:{},shapes:{},skeletons:{},animations:{},nodes:{}}:i,n=function(t,e){const i=t.rendererSettings,s=[i.instancingGeometry,i.instancingIndices,i.instancingUVs,i.instancingUVs2,i.instancingNormals];let n=Oo.get(e);void 0===n&&(n=[],Oo.set(e,n));const r=n.find(t=>t.arrays.every((t,e)=>t===s[e]));if(void 0!==r)return r.uuid;const o=Po(e,"quarks_geometry");return n.push({arrays:s,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}(e,s),r=function(t,e){let i=To.get(e);void 0===i&&(i=new Map,To.set(e,i));const s=i,n=(t,i=!1,n="texture")=>{if(!(t instanceof S.Texture||i&&t))return void(t&&console.warn(`[quarks] ${n} is not a url-backed Texture and is not written to the file`));let r=s.get(t);return void 0===r&&(r=Po(e,"quarks_texture"),s.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=Po(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?ws(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",ws(a.maskUV)),...a.softness!==_s?{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",ws(h.mapUV,Vs)),...h.strength!==Os?{strength:h.strength}:{}}}:{},sourceMaterial:t.material??void 0},u}(e,s),o=function(e){if(e.renderMode===t.RenderMode.Trail){const t=e.rendererEmitterSettings;return{startLength:t.startLength.toJSON(),...Fo(t),...$o(t),...Eo(t),...Co(t),...Bo(t)}}if(e.renderMode===t.RenderMode.StretchedBillBoard)return{speedFactor:e.rendererEmitterSettings.speedFactor,lengthFactor:e.rendererEmitterSettings.lengthFactor};return}(e);return{version:"3.0",shape:hs(e.emitterShape),..._o(e),instancingGeometry:n,...o?{rendererEmitterSettings:o}:{},material:r,behaviors:e.behaviors.map(t=>$i(t,e))}}function Uo(e,i,s){const n=e.shape?Jt("shape",()=>as(e.shape,i)):void 0;let r;if(e.renderMode===t.RenderMode.Trail){const t=e.rendererEmitterSettings;r={startLength:void 0!==t?.startLength?ie(t.startLength):new Xt(30),followLocalOrigin:Boolean(t?.followLocalOrigin),...$o(t),...Eo(t),...Co(t),...No(t?.sideAxis)}}else if(e.renderMode===t.RenderMode.StretchedBillBoard){const t={...e.rendererEmitterSettings};void 0!==e.speedFactor&&(t.speedFactor=e.speedFactor),r=t}else r={};const a=e.material?i.materials?.[e.material]:void 0,h=t=>"string"==typeof t?i.textures?.[t]??null:t??null,l=h(a?.texture??e.texture),c=l instanceof S.Texture?l:null,u=a?.sourceMaterial??(a?{...a,reflectionAtlas:h(a.reflectionAtlas)}:void 0),d=a?.erosion,f=a?.gradientMap,m=a?.uvDistortion,p=function(t){if(t&&"positions"in t&&t.positions){const e=eo(t.positions);return{positions:e,indices:us(e,t.indices instanceof Uint16Array||t.indices instanceof Uint32Array?t.indices:t.indices?new Uint32Array(t.indices):void 0),uvs:eo(t.uvs),uvs2:eo(t.uvs2),normals:eo(t.normals)}}const e=t&&"data"in t?t.data:t,i=e&&"attributes"in e?e.attributes:void 0,s=i?.position?.array;if(e&&"attributes"in e&&i&&s){const t=new Float32Array(s);let n;return e.index?.array&&(n=new("Uint16Array"===e.index.type?Uint16Array:Uint32Array)(e.index.array)),{positions:t,indices:us(t,n),uvs:eo(i.uv?.array),uvs2:eo((i.uv1??i.uv2)?.array),normals:eo(i.normal?.array)}}return{positions:jr,indices:Hr,uvs:Yr}}("string"==typeof e.instancingGeometry?i.geometries?.[e.instancingGeometry]:e.instancingGeometry),y=function(t){const e={},i=t;for(const t of Mo){const s=i[zo(t)];if(null==s)continue;const n=Jt(zo(t),()=>t.fromJSON(s));void 0!==n&&(e[t.param]=n)}return e}(e);return{...y,scene:s,shape:n,instancingGeometry:p.positions,instancingIndices:p.indices,instancingUVs:p.uvs,instancingUVs2:p.uvs2,instancingNormals:p.normals,rendererEmitterSettings:r,texture:c,material:u,blendMode:a?.alphaMode??y.blendMode??o.Constants.ALPHA_ADD,transparent:a?.transparent??y.transparent??!0,depthTest:a?.depthTest??y.depthTest??!0,depthWrite:a?.depthWrite??y.depthWrite??!1,alphaTest:a?.alphaTest??y.alphaTest??0,behaviors:[],lighting:a?.lighting,rim:a?.rim,mapUV:a?.mapUV,gradientMap:f&&"object"==typeof f?{...f,ramp:h(f.ramp)}:void 0,erosion:d&&"object"==typeof d?{...d,mask:h(d.mask)}:void 0,uvDistortion:m&&"object"==typeof m?{...m,map:h(m.map)}:void 0}}const Ro=new it,Lo=new et,Do=new it,ko=new it,qo=new et,Jo=new it,Wo=new it,Go=new et,Qo=new it;class jo{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>io?t:io}set time(t){const e=this.duration;let i=Number.isFinite(t)&&t>0?t:0;i>=e&&(i=this.looping?i%e:e);const s=this.emissionState;s.time=i,s.isBursting=!1,s.burstIndex=0,s.burstWaveIndex=0,s.burstWaves=void 0,this.markBurstsBefore(i)}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=Us(t),this.neededToUpdateRender=!0}get vTileCount(){return this.rendererSettings.vTileCount}set vTileCount(t){this.rendererSettings.vTileCount=Us(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=Cs(t),this.neededToUpdateRender=!0}get renderFace(){return this.rendererSettings.renderFace??"both"}set renderFace(t){this.rendererSettings.renderFace=Fs(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=Ns(t),this.neededToUpdateRender=!0}get lighting(){return this.rendererSettings.lighting??"fixed"}set lighting(t){this.rendererSettings.lighting=Es(t),this.neededToUpdateRender=!0}get rim(){return this.rendererSettings.rim}set rim(t){this.rendererSettings.rim=xs(t),this.neededToUpdateRender=!0}get mapUV(){return this.rendererSettings.mapUV}set mapUV(t){this.rendererSettings.mapUV=Ps(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=As(t),this.neededToUpdateRender=!0}get uvDistortion(){return this.rendererSettings.uvDistortion}set uvDistortion(t){this.rendererSettings.uvDistortion=Ts(t),this.neededToUpdateRender=!0}measureMotionScale(t){if("hierarchy"!==this.scalingMode||!this.worldSpace)return this.hierarchyScale.set(1,1,1),1;const e=t.elements,i=Math.sqrt(e[0]*e[0]+e[1]*e[1]+e[2]*e[2]),s=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(i,s,n),(i+s+n)/3}get softNearFade(){return this.rendererSettings.softNearFade}set softNearFade(t){this.rendererSettings.softNearFade=Rs(t,0),this.neededToUpdateRender=!0}get softFarFade(){return this.rendererSettings.softFarFade}set softFarFade(t){this.rendererSettings.softFarFade=Rs(t,1),this.neededToUpdateRender=!0}get instancingGeometry(){return this.rendererSettings.instancingGeometry}set instancingGeometry(t){this.restartKeepingPause();const e=this.rendererSettings,i=t.length/3*2,s=e.instancingGeometry;var n,r;e.instancingGeometry=t,t.length===s.length&&function(t,e){for(let i=0;i<t.length;i++)if(t[i]>=e)return!1;return!0}(e.instancingIndices,t.length/3)||(e.instancingIndices=us(t)),e.instancingUVs?.length===i&&(n=e.instancingUVs,r=s,void 0===n||n!==Xr.get(r))||(e.instancingUVs=Kr(t)),e.instancingNormals&&(e.instancingNormals.length!==t.length||function(t,e){return void 0!==t&&t===Zr.get(e)}(e.instancingNormals,s))&&(e.instancingNormals=to(t)),e.instancingUVs2&&e.instancingUVs2.length!==i&&(e.instancingUVs2=void 0),this.ensureMeshNormals(),this.neededToUpdateRender=!0}ensureMeshNormals(){const e=this.rendererSettings;e.renderMode!==t.RenderMode.Mesh||e.instancingNormals||(e.instancingNormals=to(e.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??Kr(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=Is(t),this.neededToUpdateRender=!0}get renderMode(){return this.rendererSettings.renderMode}set renderMode(e){if(this.rendererSettings.renderMode!==e){let i=!1;switch(this.rendererSettings.renderMode===t.RenderMode.Trail&&(i=!0),this.rendererSettings.renderMode===t.RenderMode.Mesh&&(this.startRotation=new Xt(0)),e){case t.RenderMode.Trail:this.rendererEmitterSettings={startLength:new Xt(30),followLocalOrigin:!1},i=!0;break;case t.RenderMode.Mesh:this.rendererEmitterSettings={},this.startRotation=new ne(new it(0,1,0),new Xt(0));break;case t.RenderMode.StretchedBillBoard:this.rendererEmitterSettings={speedFactor:0,lengthFactor:2};break;case t.RenderMode.BillBoard:case t.RenderMode.VerticalBillBoard:case t.RenderMode.HorizontalBillBoard:case t.RenderMode.Beam:this.rendererEmitterSettings={}}this.rendererSettings.renderMode=e,i&&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 timeDilation(){return this.timeDilationValue}set timeDilation(t){this.timeDilationValue=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(e){var i,s;if(this.prewarmTimeValue=0,this.durationValue=1,this.store=new $e(64),this.emitterVelocity=new it,this.finishedEventFired=!1,this.clock=new so,this.tempEmitterPos=new it,this.stepMatrix=new at,this.spawner=new fo(this),this.emission=new Gr(this,this.spawner),this.events=new Qr,this.materialRef=null,this.qualityFactor=1,this.destroyed=!1,this.behaviorPlan=new Dr,this.hierarchyScale=new it(1,1,1),this.playbackSpeedValue=1,this.timeDilationValue=1,this.emissionMultiplierValue=1,this.cullingMode="always",this.scalingMode="shape",this.motionScale=1,this.alignToDirection=!1,this.culled=!1,this.bounds=new qr,this.firstTimeUpdate=!0,this.beamEndScratch=new it,this.rebindParticles=()=>this.spawner.rebind(),this.particleDiedEvent={type:"particleDied",particleSystem:this},this.fireParticleDied=t=>{const e=this.particleDiedEvent;e.particle=t,this.events.fire(e),e.particle=void 0},this.sceneRef=e.scene,this.layerMaskProxy={mask:e.layerMask??268435455},Object.defineProperty(this.layerMaskProxy,"mask",{enumerable:!0,get:()=>this.rendererSettings.layerMask,set:t=>{this.rendererSettings.layerMask=t,this.neededToUpdateRender=!0}}),this.autoDestroy=e.autoDestroy??!1,this.duration=e.duration??1,this.startDelay=e.startDelay??new Xt(0),this.looping=e.looping??!0,this.prewarm=e.prewarm??!1,this.prewarmTime=e.prewarmTime??0,this.startLife=e.startLife??new Xt(5),this.startSpeed=e.startSpeed??new Xt(0),this.startRotation=e.startRotation??new Xt(0),this.startSize=e.startSize??new Xt(1),this.startColor=e.startColor??new de(new Vt(1,1,1,1)),this.emissionOverTime=e.emissionOverTime??new Xt(10),this.emissionOverDistance=e.emissionOverDistance??new Xt(0),this.emissionBursts=Ds(e.emissionBursts),this.maxParticles="number"==typeof(i=e.maxParticles)&&i>=0&&i<1/0?Math.floor(i):void 0,this.onlyUsedByOther=e.onlyUsedByOther??!1,this.emitterShape=e.shape??new ns,this.behaviors=e.behaviors??[],this.worldSpace=e.worldSpace??!1,this.rendererEmitterSettings=e.rendererEmitterSettings??{},e.renderMode===t.RenderMode.Trail){const t={...this.rendererEmitterSettings};this.rendererEmitterSettings=t,t.startLength=t.startLength??new Xt(30),t.followLocalOrigin=t.followLocalOrigin??!1}if(e.renderMode===t.RenderMode.StretchedBillBoard){const t={...this.rendererEmitterSettings};this.rendererEmitterSettings=t,void 0!==e.speedFactor&&(t.speedFactor=e.speedFactor),t.speedFactor=t.speedFactor??0,t.lengthFactor=t.lengthFactor??0}this.rendererSettings={instancingGeometry:e.instancingGeometry??jr,instancingIndices:e.instancingIndices??Hr,instancingUVs:e.instancingUVs??(e.instancingGeometry?Kr(e.instancingGeometry):Yr),instancingUVs2:e.instancingUVs2,instancingNormals:e.instancingNormals,renderMode:e.renderMode??t.RenderMode.BillBoard,renderOrder:e.renderOrder??0,uTileCount:Us(e.uTileCount),vTileCount:Us(e.vTileCount),blendTiles:e.blendTiles??!1,softParticles:e.softParticles??!1,softNearFade:Rs(e.softNearFade,0),softFarFade:Rs(e.softFarFade,1),materialBlendMode:e.blendMode??o.Constants.ALPHA_ADD,materialTransparent:e.transparent??!0,materialDepthTest:e.depthTest??!0,materialDepthWrite:e.depthWrite??!1,materialAlphaTest:Is(e.alphaTest),texture:e.texture??null,reflectionTexture:null,reflectionLevel:1,reflectionAtlas:null,layerMask:e.layerMask??268435455,pivot:Ns(e.pivot),sortMode:Cs(e.sortMode),renderFace:Fs(e.renderFace),minParticleSize:Math.max(0,e.minParticleSize??0),maxParticleSize:e.maxParticleSize??1/0,renderingGroupId:e.renderingGroupId??0,applyFog:e.applyFog??!0,lighting:Es(e.lighting),rim:xs(e.rim),mapUV:Ps(e.mapUV),gradientMap:zs(e.gradientMap),erosion:As(e.erosion),uvDistortion:Ts(e.uvDistortion)},this.flip=(s=e.flip)&&(s.x>0||s.y>0)?s.clone():void 0,this.playbackSpeed=e.playbackSpeed??1,this.cullingMode=Bs(e.cullingMode),this.scalingMode="hierarchy"===e.scalingMode?"hierarchy":"shape",this.alignToDirection=!0===e.alignToDirection,this.seed=e.seed,this.ensureMeshNormals(),this.materialRef=e.material??null,this.applyMaterialSettings(this.materialRef,{blendMode:e.blendMode,transparent:e.transparent,depthTest:e.depthTest,depthWrite:e.depthWrite,alphaTest:e.alphaTest,texture:e.texture,layerMask:e.layerMask}),this.neededToUpdateRender=!0,this.particles=[],this.startTileIndex=e.startTileIndex||new Xt(0),this.emitter=new wr(this,e.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 i=this.rendererSettings.reflectionTexture;i?.isCube&&i.getScene()&&this.sceneRef&&Ir(i,this.sceneRef,t=>{this.destroyed||this.rendererSettings.reflectionTexture!==i||(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 i=function(t,e,i){const s=void 0!==e.texture?e.texture:[t?.albedoTexture,t?.diffuseTexture,t?.emissiveTexture,t?.opacityTexture,t?.baseTexture].find(t=>t instanceof S.Texture)??i.texture??null,n=t?.reflectionTexture??t?.environmentTexture??i.reflectionTexture??null,r="number"==typeof n?.level?n.level:1,o=e.blendMode??("number"==typeof t?.alphaMode?t.alphaMode:i.materialBlendMode),a=e.transparent??("function"==typeof t?.needAlphaBlending?t.needAlphaBlending():"number"==typeof t?.alpha?t.alpha<1:i.materialTransparent),h=e.depthTest??("boolean"==typeof t?.disableDepthTest?!t.disableDepthTest:i.materialDepthTest),l=e.depthWrite??("boolean"==typeof t?.disableDepthWrite?!t.disableDepthWrite:"boolean"==typeof t?.forceDepthWrite?t.forceDepthWrite:i.materialDepthWrite),c=e.alphaTest??(()=>{const e=t?.transparencyMode,s=1===e||3===e;return s&&"number"==typeof t?.alphaCutOff?t.alphaCutOff:s&&"number"==typeof t?.alphaCutOffValue?t.alphaCutOffValue:t?0:i.materialAlphaTest})();return{texture:s,reflectionTexture:n,reflectionLevel:"number"==typeof t?.reflectionLevel?t.reflectionLevel:r,reflectionAtlas:oo(t?.reflectionAtlas)??oo(e.reflectionAtlas)??oo(i.reflectionAtlas),blendMode:o,transparent:a,depthTest:h,depthWrite:l,alphaTest:c}}(t,e,this.rendererSettings);this.rendererSettings.texture=i.texture,this.rendererSettings.reflectionTexture=i.reflectionTexture,this.rendererSettings.reflectionLevel=i.reflectionLevel;let s=i.reflectionAtlas;const n=i.reflectionTexture;!s&&n?.isCube&&(s=Er(n,this.sceneRef),!s&&this.sceneRef&&(Ir(n,this.sceneRef,e=>{this.rendererSettings.reflectionAtlas!==e&&(this.rendererSettings.reflectionAtlas=e,t&&!oo(t.reflectionAtlas)&&(t.reflectionAtlas=e),this.watchEnvAtlas(e,t),this.neededToUpdateRender=!0)}),s=Er(n,this.sceneRef))),this.rendererSettings.reflectionAtlas=s,this.watchEnvAtlas(s,t),this.rendererSettings.materialBlendMode=i.blendMode,this.rendererSettings.materialTransparent=i.transparent,this.rendererSettings.materialDepthTest=i.depthTest,this.rendererSettings.materialDepthWrite=i.depthWrite,this.rendererSettings.materialAlphaTest=Is(i.alphaTest),void 0!==e.layerMask&&(this.rendererSettings.layerMask=e.layerMask),this.neededToUpdateRender=!0}pause(){this.paused=!0}play(){this.destroyed||(this.isFinished()&&this.restart(),this.resume())}resume(){this.destroyed||(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 Qe&&t.clearEmissions()}clearTrails(){if(this.rendererSettings.renderMode===t.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){Sr++;try{t.dispose()}finally{Sr--}}(this.emitter),this.events.fire({type:"destroy",particleSystem:this}))}initSystemGenerators(){const t=this.rng,e=void 0===t?void 0:A(t);try{this.clock.setStartDelay(this.emission.rollGenerators())}finally{void 0!==t&&A(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,Ls(t))),this.emissionBursts.sort((t,e)=>t.time-e.time),this.behaviors.forEach(t=>t.reset()),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,i){if(this.paused||this.destroyed)return;const s=this.playbackSpeed*this.timeDilationValue;if(t=so.frameSeconds(t,s),this.culled)return"pauseAndCatchUp"===this.cullingMode&&this.clock.deferCatchUp(t),void(this.previousEmitterMatrix=void 0);if(this.clock.owesCatchUp){if(this.catchUp(i??performance.now()+jo.catchUpBudgetMs),this.paused||this.destroyed)return;(this.previousEmitterMatrix??(this.previousEmitterMatrix=new at)).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,s);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 it)).copy(this.tempEmitterPos),this.clock.delaying&&(!this.prewarm||!this.looping)&&0===(t=this.clock.consumeStartDelay(t)))return;const r=this.clock.accrue(t,s);if(0===r)return;const o=this.emitter.matrixWorld,a=this.previousEmitterMatrix,h=r>1&&void 0!==a&&!a.equals(o);h&&(a.decompose(Ro,Lo,Do),o.decompose(ko,qo,Jo));let l=o;for(let t=0;t<r;t++){if(h&&t+1<r){const e=(t+1)/r;Wo.copy(Ro).lerp(ko,e),Go.copy(Lo).slerp(qo,e),Qo.copy(Do).lerp(Jo,e),l=this.stepMatrix.compose(Wo,Go,Qo)}else l=o;if(this.simulateStep(io,l),this.paused||this.destroyed)break;if(e!==1/0&&t+1<r&&performance.now()>=e)break}this.destroyed||(this.previousEmitterMatrix??(this.previousEmitterMatrix=new at)).copy(l)}catchUp(t){let e=this.clock.takeCatchUpSteps();for(;e-- >0&&(this.simulateStep(io),!this.paused&&!this.destroyed)&&!(e>0&&performance.now()>=t););}markBurstsBefore(t){const e=this.emissionState,i=this.emissionBursts,s=e.burstWaves??(e.burstWaves=[]);for(;e.burstIndex<i.length&&i[e.burstIndex].time<t;){const n=i[e.burstIndex],r=Jr(n),o=Wr(n);let a=0;if(o>0)for(;a<r&&n.time+a*o<t;)a++;else a=r;s[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,jo.maxPrewarmSeconds)),i=Math.round(e/io);if(e<this.duration){const t=this.emissionState;t.time=this.duration-i*io,this.markBurstsBefore(t.time)}for(let t=0;t<i;t++)if(this.simulateStep(io),this.paused||this.destroyed)return}getWorldBounds(e,i){if(!this.bounds.toWorld(e,i,this.emitter))return!1;if(this.rendererSettings.renderMode===t.RenderMode.Beam){const t=this.beamEndScratch;if(!this.getBeamEnd(t))return!0;const s=this.bounds.worldPadding(this.emitter);e.set(Math.min(e.x,t.x-s),Math.min(e.y,t.y-s),Math.min(e.z,t.z-s)),i.set(Math.max(i.x,t.x+s),Math.max(i.y,t.y+s),Math.max(i.z,t.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}setWorldBounds(t,e,i,s,n,r,o){this.bounds.setWorld(t,e,i,s,n,r,o)}get simulationStep(){return io}get simulationResidual(){return this.paused?0:this.clock.residual}simulateStep(t,e=this.emitter.matrixWorld){const i=this.rng;if(void 0===i)return void this.stepOnce(t,e);const s=A(i);try{this.stepOnce(t,e)}finally{A(s)}}stepOnce(e,i){if(this.destroyed)return;this.motionScale=this.measureMotionScale(i),this.onlyUsedByOther||this.emission.emit(e,this.emissionState,i);const s=this.particles,n=this.behaviors,r=this.particleNum,o=this.store,a=this.rendererSettings.renderMode,h=a===t.RenderMode.Trail,l=this.behaviorPlan.steps(n),c=this.behaviorPlan.changesSize,u=this.behaviorPlan.changesColor;!function(t,e,i,s,n,r){const o=3*e;t.useSizeSnapshot(i),t.useColorSnapshot(s),t.previousPosition.set(t.position.subarray(0,o)),i&&t.previousSize.set(t.size.subarray(0,o)),n&&(t.keepPreviousVelocity()&&r(),t.previousVelocity.set(t.velocity.subarray(0,o))),s&&t.previousColor.set(t.color.subarray(0,4*e))}(o,r,c,u,a===t.RenderMode.StretchedBillBoard,this.rebindParticles),this.emitterShape.update(this,e),function(t,e,i,s,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===s)continue;if(void 0!==a.run){a.run(e,i,s,n,r);continue}const l=h[0];if(void 0===l.updateAll)for(let t=0;t<s;t++){const e=i[t];e.age<e.life&&l.update(e,n)}else l.updateAll(i,s,n)}}(l,n,s,r,e,o);const d=this.events.has("particleDied")?this.fireParticleDied:void 0;let f=this.particleNum;if(h){const t=this.rendererEmitterSettings;!function(t,e,i,s){const n=t.scalars,r=$e.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+$e.AGE]&&(i&&(o[c]=a[c],o[c+1]=a[c+1],o[c+2]=a[c+2]),s&&(h[u]=l[u],h[u+1]=l[u+1],h[u+2]=l[u+2],h[u+3]=l[u+3]))}(o,r,c,u),function(t,e,i,s,n,r){if(n){for(let i=0;i<s;i++){const s=e[i];s.localPosition?(s.position.copy(s.localPosition),s.position.applyMatrix4(s.parentMatrix??r)):s.position.addScaledVector(s.velocity,t*s.speedModifier),s.age+=t}return}const o=i.scalars,a=$e.SCALAR_STRIDE,h=i.position,l=i.velocity;for(let e=0,i=0,n=0;e<s;e++,i+=3,n+=a){const e=t*o[n+$e.SPEED_MODIFIER];h[i]+=l[i]*e,h[i+1]+=l[i+1]*e,h[i+2]+=l[i+2]*e,o[n+$e.AGE]+=t}}(e,s,o,r,Boolean(t.followLocalOrigin),i),function(t,e,i,s,n){const r=i.dieWithParticle,o=i.recordWorldSpace&&!s,a=i.sideAxis,h=s||Boolean(i.recordWorldSpace),l=cr(i),c=ur(i);for(let i=0;i<e;i++){const e=t[i],s=e.age<e.life;if(r&&!s){e.resetHistory();continue}let u=!1;if(l>0&&s&&e.historyCount>1){const t=e.historyDistances,i=e.historyCount;u=t[e.getHistoryIndex(i-1)]-t[e.getHistoryIndex(i-2)]<l}if(e.update(u,!o),o&&s){const t=(e.historyHead+e.historyCapacity-1)%e.historyCapacity*3,i=e.historyPositions;no.set(i[t],i[t+1],i[t+2]),no.applyMatrix4(e.parentMatrix??n),i[t]=no.x,i[t+1]=no.y,i[t+2]=no.z,e.measureHeadDistance()}if(c!==1/0){const t=e.historyAges,i=e.age;for(;e.historyCount>0&&i-t[e.getHistoryIndex(0)]>c;)e.dropOldest()}if(a&&s){e.ensureSideHistory();const t=(e.historyHead+e.historyCapacity-1)%e.historyCapacity*3,i=e.historySides;let s=a.x,r=a.y,o=a.z;if(h){const t=(e.parentMatrix??n).elements,i=t[0]*s+t[4]*r+t[8]*o,a=t[1]*s+t[5]*r+t[9]*o;o=t[2]*s+t[6]*r+t[10]*o,s=i,r=a}i[t]=s,i[t+1]=r,i[t+2]=o}}}(s,r,t,this.worldSpace,i),f=function(t,e,i,s){const n=e.scalars,r=$e.SCALAR_STRIDE;for(let o=0;o<i;o++){const a=t[o],h=o*r;n[h+$e.AGE]>=n[h+$e.LIFE]&&0===a.historyCount&&(ro(t,e,o,i-1),i--,o--,void 0!==s&&s(a))}return i}(s,o,f,d)}else f=function(t,e,i,s,n,r,o,a,h){const l=i.scalars,c=$e.SCALAR_STRIDE,u=i.position,d=i.velocity,f=i.previousSize,m=i.size,p=i.previousColor,y=i.color,g=o.due,v=o.min,x=o.max;let b=g?1/0:v.x,S=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,A=g?0:o.maxSize,V=g?0:o.maxSpeedSq;for(let o=0;o<s;o++){const a=o*c;let v=l[a+$e.AGE];const x=3*o,O=g||0===v;if(0===v&&(n&&(f[x]=m[x],f[x+1]=m[x+1],f[x+2]=m[x+2]),r)){const t=4*o;p[t]=y[t],p[t+1]=y[t+1],p[t+2]=y[t+2],p[t+3]=y[t+3]}const T=t*l[a+$e.SPEED_MODIFIER],P=d[x],$=d[x+1],E=d[x+2],C=u[x]+P*T,F=u[x+1]+$*T,B=u[x+2]+E*T;if(u[x]=C,u[x+1]=F,u[x+2]=B,O&&(b=Math.min(b,C),M=Math.max(M,C),S=Math.min(S,F),z=Math.max(z,F),w=Math.min(w,B),_=Math.max(_,B),A=Math.max(A,Math.max(m[x],Math.max(m[x+1],m[x+2])))),V=Math.max(V,P*P+$*$+E*E),v+=t,l[a+$e.AGE]=v,v>=l[a+$e.LIFE]){const t=ro(e,i,o,s-1);s--,o--,void 0!==h&&h(t)}}return o.store(s,g,b,S,w,M,z,_,A,V,a.rendererSettings,a.rendererEmitterSettings,a.worldSpace,io),s}(e,s,o,f,c,u,this.bounds,this,d);this.particleNum=this.destroyed?0:f,this.notifyFinished()}notifyFinished(){this.isFinished()&&(this.finishedEventFired||(this.finishedEventFired=!0,this.events.fire({type:"finished",particleSystem:this})),this.autoDestroy&&this.dispose())}emit(t,e,i){this.emission.emit(t,e,i)}toJSON(t,e={}){return Io(this,t)}static fromJSON(t,e,i={},s){const n=new jo(Uo(t,e,s));return n.behaviors=(t.behaviors??[]).map((t,e)=>{const s=Jt(`behaviors[${e}]`,()=>Pi(t,n)),r=t.subParticleSystem;return s&&"EmitSubParticleSystem"===s.type&&"string"==typeof r&&(i[r]=s),s}).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 e=this.behaviors.map(t=>t.clone());let i;if(this.renderMode===t.RenderMode.Trail){const t=this.rendererEmitterSettings;i={startLength:t.startLength.clone(),followLocalOrigin:Boolean(t.followLocalOrigin),...$o(t),...Eo(t),...Co(t),...t.sideAxis?{sideAxis:t.sideAxis.clone()}:{}}}else i=this.renderMode===t.RenderMode.StretchedBillBoard?{lengthFactor:this.rendererEmitterSettings.lengthFactor,speedFactor:this.rendererEmitterSettings.speedFactor}:{};const s=new jo({...Ao(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:i,material:this.materialRef,texture:this.rendererSettings.texture,behaviors:e,lighting:this.lighting,rim:this.rim,mapUV:this.mapUV,gradientMap:this.gradientMap,erosion:this.erosion,uvDistortion:this.uvDistortion,scene:this.emitter.getScene()});for(const t of e)t instanceof Qe&&(t.particleSystem=s);this.tint&&(s.tint=this.tint.clone()),s.emissionMultiplier=this.emissionMultiplier;const n=this.beamEnd;return n&&(s.beamEnd="function"==typeof n.getAbsolutePosition?n:{x:n.x,y:n.y,z:n.z}),s}}function Yo(t){if("ps"===t.type&&t.target instanceof wr)return t.target.system}function Ho(t){return"object"==typeof t&&null!==t}jo.catchUpBudgetMs=2,jo.maxPrewarmSeconds=10;class Xo extends r.TransformNode{constructor(t="QuarksPrefab",e){super(t,e),this.type="QuarksPrefab",this.animationData=[],this.isPlaying=!1,this.currentTime=-1e-5,this.duration=0,this._timeScale=1,this._tempAnimationJSON=[],this._autoUpdate=null,this._pendingEndEmit=new Set,this._pendingObserver=null,this._started=new Set,this._pausedSystems=new Set}get timeScale(){return this._timeScale}set timeScale(t){this._timeScale=t>0&&t<1/0?t:0;for(const t of this.animationData){const e=Yo(t);void 0!==e&&(e.timeDilation=this._timeScale)}}get autoUpdate(){return null!==this._autoUpdate}set autoUpdate(t){t!==this.autoUpdate&&(t?this._autoUpdate=this.getScene().onBeforeRenderObservable.add(()=>this.update()):(this.getScene().onBeforeRenderObservable.remove(this._autoUpdate),this._autoUpdate=null))}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),t.system.timeDilation=this._timeScale,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){const[e]=this.animationData.splice(t,1),i=e&&Yo(e);void 0===i||this.animationData.some(t=>Yo(t)===i)||(i.timeDilation=1,this._pendingEndEmit.delete(i)&&i.endEmit(),this._started.delete(i),this._pausedSystems.delete(i)),this.updateDuration()}play(){if(!this.isPlaying){this.isPlaying=!0;for(const t of this._pausedSystems)t.resume();this._pausedSystems.clear(),this.animationData.forEach(t=>{"three"===t.type&&this.isInside(t,this.currentTime)&&t.clip?.play?.()})}}pause(){this.isPlaying&&(this.isPlaying=!1,this.animationData.forEach(t=>{const e=Yo(t);void 0===e?t.clip?.pause?.():e.paused||(e.pause(),this._pausedSystems.add(e))}))}stop(){this.pause(),this.currentTime=-1e-5,this.clearPending(),this._started.clear(),this._pausedSystems.clear(),this.animationData.forEach(t=>{const e=Yo(t);void 0===e?t.clip?.stop?.():e.stop()})}update(t){if(this.flushPending(),!this.isPlaying)return;const e=t??this.getScene().getEngine().getDeltaTime()/1e3,i=this.currentTime,s=i+Math.max(e,0)*this._timeScale>=this.duration;if(this.currentTime=s?this.duration:i+Math.max(e,0)*this._timeScale,this.animationData.forEach(t=>{const e=this.isInside(t,i),n=this.isInside(t,this.currentTime),r=!e&&!n&&i<t.startTime&&this.currentTime>=t.startTime+t.duration;if(n&&!e)this.enterTrack(t);else if(r){this.enterTrack(t);const e=Yo(t);void 0!==e?this.addPending(e):t.clip?.stop?.()}else e&&!n&&this.leaveTrack(t,!s)}),s){for(const t of this._started)this._pendingEndEmit.has(t)||t.isEmitEnded||t.endEmit();this._started.clear(),this.isPlaying=!1,this.currentTime=-1e-5}}setTime(t){const e=this.currentTime;this.currentTime=t,this.animationData.forEach(i=>{const s=this.isInside(i,t),n=this.isInside(i,e);if(s&&!n)this.enterTrack(i);else if(!s&&n)return void this.leaveTrack(i,!1);s&&"three"===i.type&&i.clip?.setTime?.(Math.max(t-i.startTime,0))})}dispose(t,e){this.autoUpdate=!1;for(const t of this._pendingEndEmit)t.endEmit();this.clearPending(),this._started.clear(),this._pausedSystems.clear(),super.dispose(t,e)}addPending(t){this._pendingEndEmit.add(t),this._pendingObserver??(this._pendingObserver=this.getScene().onAfterRenderObservable.add(()=>this.flushPending()))}flushPending(){for(const t of this._pendingEndEmit)(t.emissionState.time>0||t.isDisposed)&&(t.endEmit(),this._pendingEndEmit.delete(t));0===this._pendingEndEmit.size&&this.clearPending()}clearPending(){this._pendingEndEmit.clear(),null!==this._pendingObserver&&(this.getScene().onAfterRenderObservable.remove(this._pendingObserver),this._pendingObserver=null)}isInside(t,e){return e>=t.startTime&&e<t.startTime+t.duration}enterTrack(t){const e=Yo(t);if(void 0!==e)return this._pendingEndEmit.delete(e),e.restart(),this._started.add(e),this.isPlaying||(e.pause(),this._pausedSystems.add(e)),void this._batchedRenderer?.addSystem(e);t.clip?.play?.()}leaveTrack(t,e){const i=Yo(t);void 0===i?t.loop&&e?t.clip?.play?.():t.clip?.stop?.():t.loop&&e?i.restart():i.endEmit()}getDuration(){return this.duration}resolveReferences(t){const e={},i=t=>{var s;const n=ms(t);n?e[n]=t:e[s=t.uniqueId.toString()]??(e[s]=t);const o=t.getChildren();for(const t of o)t instanceof r.TransformNode&&i(t)};i(t),this._tempAnimationJSON.forEach(t=>{const i=e[t.targetUUID];if("ps"===t.type&&i instanceof wr)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,...1!==this.timeScale?{timeScale:this.timeScale}:{},animationData:this.animationData.map(t=>({startTime:t.startTime,duration:t.duration,type:t.type,targetUUID:fs(t.target),clipUUID:"three"===t.type?t.clipUUID??t.clip?.uuid:void 0,loop:t.loop}))}}static fromJSON(t,e){const i=new Xo(t.name||"QuarksPrefab",e);return"number"==typeof t.timeScale&&(i.timeScale=t.timeScale),Array.isArray(t.animationData)&&(i._tempAnimationJSON=t.animationData.filter(t=>"ps"===t?.type||"three"===t?.type)),i}resolveTimelineClip(t,e){const i=t,s=t.metadata,n=[i.animations,i.animationGroups,s?.animations,s?.animationGroups];for(const t of n){if(!Array.isArray(t))continue;const i=t;if(!e)return i.find(Ho);const s=i.find(t=>{return s=e,Ho(i=t)&&i.uuid===s;var i,s});if(s)return s}}updateDuration(){let t=0;this.animationData.forEach(e=>{const i=e.startTime+e.duration;i>t&&(t=i)}),this.duration=t}}const Zo=new WeakMap;function Ko(t,e,i){Zo.set(t,{source:e,loaded:i})}function ta(t){const e=Zo.get(t);return void 0!==e&&t.url===e.loaded?e.source:void 0}const ea={[S.Texture.WRAP_ADDRESSMODE]:1e3,[S.Texture.CLAMP_ADDRESSMODE]:1001,[S.Texture.MIRROR_ADDRESSMODE]:1002};function ia(t){return!!t&&(!/^blob:/i.test(t)&&(!/^data:/i.test(t)||t.includes(",")))}function sa(t){const e=t.rotationQuaternion??h.Quaternion.FromEulerVector(t.rotation);return Array.from(h.Matrix.Compose(t.scaling,e,t.position).asArray())}class na{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,i=[],s=t=>{e.add(t.uuid),i.push(t),t.children?.forEach(s)};s(t);for(const t of i)for(const[i,s]of oa(t))""===s||e.has(s)||this.warn(`"${t.name}" has ${i} on node "${s}", 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 r.TransformNode,!0).filter(t=>!1!==this.options.filter?.(t)).map(t=>this.node(t)),i={uuid:fs(t),type:"Group",name:t.name,matrix:sa(t)};if(t.isEnabled(!1)||(i.visible=!1),t instanceof d.Mesh&&!t.isVisible&&(i.isVisible=!1),t instanceof wr)i.type="ParticleEmitter",i.ps=t.system.toJSON(this.meta);else if(t instanceof Xo){const{type:e,name:s,...n}=t.toJSON();Object.assign(i,n),i.type="QuarksPrefab"}else t instanceof d.Mesh?(i.type="Mesh",i.geometry=this.meshGeometry(t),i.material=this.meshMaterial(t)):t instanceof b.InstancedMesh&&this.warn(`"${t.name}" is an instance of "${t.sourceMesh.name}"; it is written as a group.`);return e.length>0&&(i.children=e),i}id(t){return this.nextId+=1,`${t}_${this.nextId}`}meshGeometry(t){const i=t.geometry?this.geometryIds.get(t.geometry):void 0;if(void 0!==i)return i;const s=t.getVerticesData(e.VertexBuffer.PositionKind);if(!s||0===s.length)return void this.warn(`Mesh "${t.name}" has no vertices; it is written without geometry.`);const n=t.getIndices(),r=us(s instanceof Float32Array?s:new Float32Array(s),n&&n.length>0?Uint32Array.from(n):void 0),o=e=>{const i=t.getVerticesData(e);return i?Array.from(i):void 0},a={uuid:this.id("quarks_mesh_geometry"),type:"QuarksGeometry",positions:Array.from(s),indices:Array.from(r)},h=o(e.VertexBuffer.UVKind),l=o(e.VertexBuffer.UV2Kind),c=o(e.VertexBuffer.NormalKind);return h&&(a.uvs=h),l&&(a.uvs2=l),c&&(a.normals=c),this.meshGeometries.set(a.uuid,a),t.geometry&&this.geometryIds.set(t.geometry,a.uuid),a.uuid}meshMaterial(t){const e=t.material;if(!e)return;if(!(e instanceof w.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 i=this.meshMaterialIds.get(e);if(void 0!==i)return i;i=this.id("quarks_mesh_material"),this.meshMaterialIds.set(e,i);const s=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&&s&&n||this.warn(`Mesh "${t.name}": its material's alpha and colours are not written; it loads opaque white.`);const r={uuid:i,type:"MeshBasicMaterial"};return e.alphaMode!==o.Constants.ALPHA_COMBINE&&(r.alphaMode=e.alphaMode),e.backFaceCulling&&(r.side=0),0!==e.alphaCutOff&&(r.alphaTest=e.alphaCutOff),e.disableDepthWrite||(r.depthWrite=!0),this.meshMaterials.push({json:r,map:e.diffuseTexture}),i}texture(t){for(const[e,i]of Object.entries(this.meta.textures))if(i===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 i=[],s=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 S.Texture?this.options.imageUrl?this.options.imageUrl(e):ta(e)??e.url:null;if(ia(o)){let t=s.get(o);void 0===t&&(t=`quarks_image_${s.size+1}`,s.set(o,t),i.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 S.Texture&&Object.assign(r,aa(e)),n.push(r)}const o=Object.values(this.meta.materials).map(t=>{const{sourceMaterial:e,...i}=t;return i});return{metadata:{version:4.5,type:"Object3D",generator:this.options.generator??"babylon.quarks",quarksFormat:1},geometries:[...Object.values(this.meta.geometries).filter(ra),...this.meshGeometries.values()],materials:[...o,...e],textures:n,images:i,object:t}}}function ra(t){return"type"in t&&"QuarksGeometry"===t.type&&Array.isArray(t.positions)}function*oa(t){const e=t.ps;for(const t of e?.behaviors??[])"EmitSubParticleSystem"===t.type&&"subParticleSystem"in t&&"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 aa(t){const e={};return t.invertY||(e.invertY=!1),t.noMipmap&&(e.noMipmap=!0),t.samplingMode!==o.Constants.TEXTURE_TRILINEAR_SAMPLINGMODE&&(e.samplingMode=t.samplingMode),t.wrapU===S.Texture.WRAP_ADDRESSMODE&&t.wrapV===S.Texture.WRAP_ADDRESSMODE||(e.wrap=[ea[t.wrapU]??1e3,ea[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}function ha(t){return null!==t&&"object"==typeof t}function la(t){if(!Array.isArray(t))return Gt("This part is not a list; it is skipped."),[];const e=[];return t.forEach((t,i)=>{ha(t)?e.push(t):Jt(`[${i}]`,()=>Gt("This entry is not an object; it is skipped."))}),e}function ca(t,e){const i=ha(t)?t[e]:void 0;return Array.isArray(i)?i:[]}const ua=new WeakMap,da=new WeakMap,fa=new WeakMap,ma=new WeakMap,pa=new WeakMap;function ya(t,e){let i=t.get(e);return void 0===i&&(i=new Map,t.set(e,i)),i}const ga=new WeakMap,va=new WeakMap;function xa(t){if(!ha(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(ga.get(t)===e.url&&"string"==typeof e.url){ga.set(e,e.url);const i=va.get(t);void 0!==i&&va.set(e,i)}return e})),Array.isArray(t.geometries)&&(e.geometries=t.geometries.map(t=>t&&"object"==typeof t?{...t}:t)),e}const ba=new WeakMap,Sa=t=>t.reason??new Error("[QuarksLoader] The load was aborted."),wa=()=>new Error("[QuarksLoader] The scene was disposed while the effect loaded.");function Ma(t,e){if(e?.aborted)throw Sa(e);if(t.isDisposed)throw wa()}function za(t,e,i){return Ma(e,i),new Promise((s,n)=>{const r=()=>n(Sa(i));i?.addEventListener("abort",r,{once:!0});const o=e.onDisposeObservable.addOnce(()=>n(wa()));t.then(s,n).finally(()=>{i?.removeEventListener("abort",r),e.onDisposeObservable.remove(o)})})}class _a{constructor(t,e={}){this.scene=t,this.options=e}async load(t,e={}){const{json:i,baseUrl:s}=await za(this.fetchEffectDocument(t,e.signal),this.scene,e.signal);return this.loadFromJSON(i,s,e)}async loadFromJSON(t,e,i={}){const s=i.signal;Ma(this.scene,s);const n=e??this.options.baseUrl??"",r=xa(t);await za(this.resolveResources(r,n),this.scene,s);const o=this.parseDocument(r,"");return await this.finishLoad(o,s),o.root}static disposeEffect(t){br(t)}async finishLoad(t,e){try{if(this.options.waitForTextures){for(const e of t.textures)e.delayLoadState===o.Constants.DELAYLOADSTATE_NOTLOADED&&e.delayLoad();await za(Promise.all(t.textures.map(t=>ba.get(t))),this.scene,e)}Ma(this.scene,e)}catch(e){throw this.scene.isDisposed||br(t.root),e}}async loadAll(t,e={}){Ma(this.scene,e.signal);const i=_a.mapPool(t,e.concurrency,async(i,s)=>{Ma(this.scene,e.signal);try{return await this.fetchEffectDocument(i,e.signal)}catch(n){if(!e.continueOnError||e.signal?.aborted||this.scene.isDisposed)throw n;return console.warn(`[QuarksLoader] Failed to fetch effect "${i}" (${s+1}/${t.length}):`,n),null}}),s=await za(i,this.scene,e.signal);return this.loadDocuments(s,e)}async loadFromJSONAll(t,e={}){const i=t.map(t=>{if(null!==t&&"object"==typeof t&&"json"in t){const e=t;return{json:xa(e.json),baseUrl:e.baseUrl??this.options.baseUrl??""}}return{json:xa(t),baseUrl:this.options.baseUrl??""}});return this.loadDocuments(i,e)}async resolveResources(t,e=""){await _a.resolveLinkedResources(t,{baseUrl:e,resolver:this.options.resolver,scene:this.scene,onResourceError:this.options.onResourceError})}static async resolveLinkedResources(t,e={}){const i=e.baseUrl??"",s=e.resolver,n=e.scene;await _a.inlineGeometryEntries(t,async t=>{const e=await _a.resolveWith(s,t,"geometry",i);return _a.fetchJsonWith(s,e,n)},e.onResourceError),await Promise.all(ca(t,"images").map(async t=>{if(!ha(t)||"string"!=typeof t.url||!t.url)return;if(ga.get(t)===t.url)return;const e=t.url,n=await _a.resolveWith(s,e,"image",i);t.url=n,ga.set(t,n),/^(data|blob):/i.test(n)||va.set(t,e)}))}static async resolveExternalGeometries(t,e){await _a.inlineGeometryEntries(t,e)}parse(t,e=""){return this.parseDocument(t,e).root}parseDocument(t,e){const{strict:i,onFormatWarning:s}=this.options,n=[],r=qt({onWarning:(t,e)=>{const r=e?`${t} (at ${e})`:t;i&&n.push(r),s?s(t,e):i||console.warn(`[quarks] ${r}`)}},()=>this.readDocument(t,e));if(n.length>0){_a.disposeEffect(r.root);const t=n.length>1?` (and ${n.length-1} more)`:"";throw new Lt(`${n[0]}${t}`,n)}return r}readDocument(t,e){if(!ha(i=t)||!ha(i.object))throw new Lt('[QuarksLoader] Not an effect document: it has no "object" to load.');var i;const s=t,n=s.metadata?.quarksFormat;"number"==typeof n&&n>1&&Gt(`This effect was written in format ${n}, newer than the 1 this version of babylon.quarks reads; settings it does not know are left out.`);const r={ownedMaterials:[],images:{},imageSources:{},textures:{},geometries:{},materials:{}},{geometries:o,images:a,textures:h,materials:l}=s;o&&Jt("geometries",()=>this.parseGeometries(la(o),r)),a&&Jt("images",()=>this.parseImages(la(a),e,r)),h&&Jt("textures",()=>this.parseTextures(la(h),r)),l&&Jt("materials",()=>this.parseMaterials(la(l),r));const c=Jt("object",()=>this.parseObject(s.object,r));this.linkReferences(c);const u=[...new Set(Object.values(r.textures).filter(t=>null!==t))];return vr(c,u,r.ownedMaterials),{root:c,textures:u}}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||Gt(`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=ya(ma,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){fa.delete(t),ma.delete(t),pa.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=[],m=t/s,p=o+m*a;for(let t=0;t<=i;t++){const s=t/i,o=n+s*r,a=-e*Math.cos(o)*Math.sin(p),d=e*Math.cos(p),y=e*Math.sin(o)*Math.sin(p);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-m),u.push(f++)}d.push(u)}const m=o<=0,p=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&&m||u.push(i,n,o),t===s-1&&p||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}}}const a=t=>{const e=t?.isInterleavedBufferAttribute&&void 0!==t.data?r[t.data]:void 0;return e?this.extractInterleavedAttribute(e.data,e.stride,t?.offset,t?.itemSize):void 0};n=a(t.attributes?.position)??n,e=a(t.attributes?.uv),i=a(o),s=a(t.attributes?.normal)}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=us(n,r),{positions:n,indices:r,uvs:e,uvs2:i,normals:s}}extractInterleavedAttribute(t,e,i=0,s=0){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 _a.resolveWith(this.options.resolver,t,e,i)}async fetchEffectDocument(t,e){const i=this.options.baseUrl||t.substring(0,t.lastIndexOf("/")+1),s=await this.resolveResourceUrl(t,"effect",i);return{json:await _a.fetchJsonWith(this.options.resolver,s,void 0,e),baseUrl:i}}async loadDocuments(t,e){if(0===t.length)return[];Ma(this.scene,e.signal);const i=new AbortController,s=()=>i.abort(Sa(e.signal));e.signal?.addEventListener("abort",s,{once:!0});try{return await this.loadResolvedDocuments(t,e,i)}finally{e.signal?.removeEventListener("abort",s)}}async loadResolvedDocuments(t,e,i){const s=t.length,n=i.signal,r=new Array(s).fill(null),o=new Array(s).fill(!1);let a=0;const h=(t,i)=>{o[t]||n.aborted||(o[t]=!0,r[t]=i,a++,e.onProgress?.(a,s))};await za(Promise.all(t.map(async(i,n)=>{if(i)try{await this.resolveResources(i.json,i.baseUrl)}catch(i){if(!e.continueOnError)throw i;console.warn(`[QuarksLoader] Failed to resolve resources for effect ${n+1}/${s}:`,i),t[n]=null,h(n,null)}})),this.scene,n);const l=[],c=[];try{for(let i=0;i<s;i++){if(o[i])continue;const r=t[i];if(!r){h(i,null);continue}let a;try{a=this.parseDocument(r.json,"")}catch(t){if(!e.continueOnError)throw t;console.warn(`[QuarksLoader] Failed to parse effect ${i+1}/${s}:`,t),h(i,null);continue}l.push(a),c.push(this.finishLoad(a,n).then(()=>h(i,a.root)))}await Promise.all(c)}catch(t){throw n.aborted||i.abort(t),Promise.allSettled(c),this.scene.isDisposed||l.forEach(t=>br(t.root)),t}return r}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):_a.joinUrl(s,e)}static fetchJsonWith(t,e,i,s){const n=async()=>{if(t?.fetchJson)return s?t.fetchJson(e,{signal:s}):t.fetchJson(e);const i=await(s?fetch(e,{signal:s}):fetch(e));if(!i.ok)throw new Error(`HTTP ${i.status}`);return i.json()};if(!i)return n();const r=ya(pa,i),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,i=_a.warnResourceError){await Promise.all(ca(t,"geometries").map(async t=>{if(!ha(t)||"string"!=typeof t.url||t.positions)return;const s=t.url;try{const i=await e(s);for(const e of["positions","indices","uvs","uvs2","normals"]){const s=ha(i)?i[e]:void 0;void 0!==s&&(t[e]=Array.isArray(s)?s.slice():s)}delete t.url}catch(t){i("geometry",s,t)}}))}static warnResourceError(t,e,i){console.warn(`[QuarksLoader] Could not load ${t} "${e}":`,i)}reportResourceError(t,e,i){(this.options.onResourceError??_a.warnResourceError)(t,e,i)}parseImages(t,e,i){for(const[s,n]of t.entries()){const t=n.url;t&&Jt(`[${s}]`,()=>_a.warnIfNotAnImageUrl(t)),i.images[n.uuid]=t?_a.joinUrl(e,t):null;const r=va.get(n)??t;r&&!/^(data|blob):/i.test(r)&&(i.imageSources[n.uuid]=r)}}static warnIfNotAnImageUrl(t){/^(data|blob):/i.test(t)||/\.(png|jpe?g|webp|gif|bmp|ktx2?|dds|env|basis)(\?|#|$)/i.test(t)||Gt(`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 i of t){const t=void 0!==i.image?e.images[i.image]:void 0;if(t){const s=void 0===i.invertY||!!i.invertY,n=!!i.noMipmap,r=!1!==this.options.shareResources,o=r?[s,n,i.samplingMode,i.wrap,i.repeat,i.offset,i.rotation].join("|")+"|"+t:"",a=r?ya(fa,this.scene):void 0,h=a?.get(o);if(void 0!==h){e.textures[i.uuid]=h;continue}let l;const c=new Promise(t=>l=t);let u,d=!1;const f={noMipmap:n,invertY:s,samplingMode:"number"==typeof i.samplingMode?i.samplingMode:void 0,onLoad:()=>l(),onError:(e,i)=>{d=!0,void 0!==a&&a.get(o)===u&&a.delete(o),this.reportResourceError("image",t,i??e),l()}};try{u=new S.Texture(t,this.scene,f)}catch{e.textures[i.uuid]=null;continue}ba.set(u,c);const m=void 0!==i.image?e.imageSources[i.image]:void 0;void 0!==m&&Ko(u,m,t),u.onDisposeObservable.addOnce(()=>l()),Array.isArray(i.wrap)&&(u.wrapU=this.mapWrapMode(i.wrap[0]),u.wrapV=this.mapWrapMode(i.wrap[1]??i.wrap[0])),Array.isArray(i.repeat)&&(u.uScale=i.repeat[0]??1,u.vScale=i.repeat[1]??1),Array.isArray(i.offset)&&(u.uOffset=i.offset[0]??0,u.vOffset=i.offset[1]??0),"number"==typeof i.rotation&&(u.wAng=i.rotation),void 0===a||d||(a.set(o,u),u.onDisposeObservable.addOnce(()=>{a.get(o)===u&&a.delete(o)})),e.textures[i.uuid]=u}else e.textures[i.uuid]=null}}mapWrapMode(t){switch(t){case 1001:return S.Texture.CLAMP_ADDRESSMODE;case 1002:return S.Texture.MIRROR_ADDRESSMODE;default:return S.Texture.WRAP_ADDRESSMODE}}parseMaterials(t,e){const i=t=>"string"==typeof t&&e.textures[t]||null;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},n=s.map??s.texture;n&&(t.texture=i(n));const r=s.reflectionAtlas;if(r&&(t.reflectionAtlas=i(r)),"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:i(s.gradientMap.ramp)}),s.erosion&&"object"==typeof s.erosion&&(t.erosion={...s.erosion,mask:i(s.erosion.mask)}),s.uvDistortion&&"object"==typeof s.uvDistortion&&(t.uvDistortion={...s.uvDistortion,map:i(s.uvDistortion.map)}),"number"==typeof s.alphaMode)t.alphaMode=s.alphaMode;else{const e={1:o.Constants.ALPHA_COMBINE,2:o.Constants.ALPHA_ADD,3:o.Constants.ALPHA_SUBTRACT,4:o.Constants.ALPHA_MULTIPLY};t.alphaMode=e[s.blending??1]||o.Constants.ALPHA_COMBINE}e.materials[s.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 r.TransformNode(e||t||"node",this.scene);return Object.assign(i,{quarksOriginalType:t}),i}createMeshNode(t,e){const i=new d.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 f.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 n=this.getMaterial(e,t.material);if(n){const t=new w.StandardMaterial(`quarks_loader_material_${n.uuid}`,this.scene);e.ownedMaterials.push(t),t.alphaMode=n.alphaMode??o.Constants.ALPHA_COMBINE,t.backFaceCulling=2!==n.side,t.alphaCutOff=n.alphaTest??0,t.disableDepthWrite=!n.depthWrite;const s=n.texture;s&&"string"!=typeof s&&(t.diffuseTexture=s,t.opacityTexture=s),i.material=t}return i}parseObject(t,e){let i;switch(t.type){case"QuarksPrefab":i=Xo.fromJSON(t,this.scene);break;case"ParticleEmitter":if(t.ps){const s=t.ps,n=Jt("ps",()=>this.parseParticleSystem(s,e));i=n.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 r.TransformNode(t.name||t.type||"node",this.scene)}if(t.uuid&&function(t,e){ds.set(t,e)}(i,t.uuid),t.name&&(i.name=t.name),t.matrix){const e=h.Matrix.FromArray(t.matrix),s=new h.Vector3(1,1,1),n=h.Quaternion.Identity(),r=new h.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 h.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),!1===t.isVisible&&i instanceof d.Mesh&&(i.isVisible=!1),t.children){const s=t.children;Array.isArray(s)?s.forEach((t,s)=>{const n=Jt(`children[${s}]`,()=>ha(t)?this.parseObject(t,e):Gt("A child is not an object; it is skipped."));n&&(n.parent=i)}):Jt("children",()=>Gt('"children" is not a list; the node loads without them.'))}return i}parseParticleSystem(t,e){const i=jo.fromJSON(t,e,{},this.scene);return"mesh_surface"===t?.shape?.type&&"string"==typeof t.shape.mesh&&ua.set(i,t.shape.mesh),da.set(i,Wt()),i}linkReferences(t){const e={},i=t=>{const s=ms(t);s&&(e[s]=t);for(const e of t.getChildren())e instanceof r.TransformNode&&i(e)};i(t);const s=i=>{if(i instanceof Xo&&i.resolveReferences(t),i instanceof wr){const t=i.system,s=da.get(t),n=t=>s?Jt(s,()=>Gt(t)):Gt(t),r=ua.get(t),o=t.emitterShape;if(r&&o instanceof ps){const t=e[r];t instanceof d.Mesh?o.mesh=t:n(`Emitter "${i.name}" has a mesh surface shape on "${r}", `+(t?"which is not a mesh":"which is not in the effect")+"; it emits nothing until a mesh is set.")}for(let s=0;s<t.behaviors.length;s++)if(t.behaviors[s]instanceof Qe){const r=t.behaviors[s],o=r.subParticleSystem;if("string"!=typeof o)continue;const a=e[o];a instanceof wr?(r.subParticleSystem=a,a.system.onlyUsedByOther=!0):(r.subParticleSystem=void 0,""!==o&&n(`Emitter "${i.name}" has a sub emitter targeting "${o}", `+(a?"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 r.TransformNode&&s(t)};s(t)}}const Aa={};const Va={name:""},Oa=[{name:"billboard",settings:{renderMode:t.RenderMode.BillBoard}},{name:"vertical billboard",settings:{renderMode:t.RenderMode.VerticalBillBoard}},{name:"horizontal billboard",settings:{renderMode:t.RenderMode.HorizontalBillBoard}},{name:"stretched",settings:{renderMode:t.RenderMode.StretchedBillBoard}},{name:"beam",settings:{renderMode:t.RenderMode.Beam}},{name:"mesh",settings:{renderMode:t.RenderMode.Mesh}},{name:"mesh scene lit",settings:{renderMode:t.RenderMode.Mesh,lighting:"scene"}},{name:"mesh unlit",settings:{renderMode:t.RenderMode.Mesh,lighting:"unlit"}},{name:"mesh rim",settings:{renderMode:t.RenderMode.Mesh,rim:xs({mode:"add"})}},{name:"mesh unlit rim mix",settings:{renderMode:t.RenderMode.Mesh,lighting:"unlit",rim:xs({mode:"mix"})}},{name:"mesh unlit rim fade",settings:{renderMode:t.RenderMode.Mesh,lighting:"unlit",rim:xs({mode:"fade"})}},{name:"mesh reflecting",settings:{renderMode:t.RenderMode.Mesh,reflectionAtlas:Aa},context:{envAtlasReady:!0}},{name:"mesh unlit reflecting rim fade",settings:{renderMode:t.RenderMode.Mesh,lighting:"unlit",reflectionAtlas:Aa,rim:xs({mode:"fade"})},context:{envAtlasReady:!0}},{name:"trail",settings:{renderMode:t.RenderMode.Trail}}],Ta=[Va,{name:"pivot",settings:{pivot:new it(.5,0,0)}},{name:"size limits",settings:{minParticleSize:.01}},{name:"pivot size limits",settings:{pivot:new it(0,.5,.5),maxParticleSize:.5}}],Pa=[Va,{name:"sheet",settings:{uTileCount:4,vTileCount:2}},{name:"sheet blend",settings:{uTileCount:4,vTileCount:2,blendTiles:!0}}],$a=[Va,{name:"map",settings:{texture:Aa}}],Ea=[Va,{name:"soft",settings:{softParticles:!0},context:{depth:{packed:!1}}},{name:"soft packed",settings:{softParticles:!0},context:{depth:{packed:!0}}}],Ca=[Va,{name:"alpha test",settings:{materialAlphaTest:.5}}],Fa=[Va,{name:"fog",settings:{applyFog:!0}},{name:"fog additive",settings:{applyFog:!0,materialBlendMode:o.Constants.ALPHA_ADD}}],Ba=[{name:"premultiplied",settings:{materialBlendMode:o.Constants.ALPHA_PREMULTIPLIED}},{name:"premultiplied fog",settings:{materialBlendMode:o.Constants.ALPHA_PREMULTIPLIED,applyFog:!0}},{name:"one-one",settings:{materialBlendMode:o.Constants.ALPHA_ONEONE}},{name:"one-one fog",settings:{materialBlendMode:o.Constants.ALPHA_ONEONE,applyFog:!0}},{name:"multiply",settings:{materialBlendMode:o.Constants.ALPHA_MULTIPLY}},{name:"multiply fog",settings:{materialBlendMode:o.Constants.ALPHA_MULTIPLY,applyFog:!0}},{name:"multiply fog alpha test",settings:{materialBlendMode:o.Constants.ALPHA_MULTIPLY,applyFog:!0,materialAlphaTest:.5}},{name:"opaque",settings:{materialTransparent:!1}}],Na=(()=>{const t=Ps({tiling:[2,2]}),e=Ps({channel:1,tiling:[2,2]}),i=Ts({map:Aa}),s=Ts({map:Aa,mapUV:{channel:1}}),n=zs({ramp:Aa}),r=As({}),o=As({mask:Aa}),a=As({mask:Aa,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:i}},{name:"distortion uv1",settings:{uvDistortion:s}},{name:"map transform distortion gradient erosion mask",settings:{mapUV:t,uvDistortion:i,gradientMap:n,erosion:o}},{name:"map transform uv1 distortion gradient erosion",settings:{mapUV:e,uvDistortion:i,gradientMap:n,erosion:r}},{name:"every effect on uv1",settings:{mapUV:e,uvDistortion:s,gradientMap:n,erosion:a}}]})(),Ia=["billboard","stretched","beam","mesh","mesh unlit","mesh unlit rim mix","mesh reflecting","trail"],Ua={name:"uv2",context:{meshUV2:!0}},Ra={name:"soft packed alpha test fog one-one",settings:{softParticles:!0,materialAlphaTest:.5,applyFog:!0,materialBlendMode:o.Constants.ALPHA_ONEONE},context:{depth:{packed:!0}}};cs(ys),t.ApplyCollision=Et,t.ApplyForce=Me,t.ApplySequences=Ae,t.AxisAngleGenerator=ne,t.BatchedRenderer=pr,t.BehaviorFromJSON=Pi,t.BehaviorToJSON=$i,t.BehaviorTypes=Ti,t.Bezier=Kt,t.BoxEmitter=Yi,t.ChangeEmitDirection=Ve,t.CircleEmitter=Xi,t.ColorBySpeed=Te,t.ColorGeneratorFromJSON=fe,t.ColorOverLife=Pe,t.ColorRange=re,t.ConeEmitter=Zi,t.ConstantColor=de,t.ConstantValue=Xt,t.ContinuousLinearFunction=oe,t.DEG2RAD=P,t.DonutEmitter=Ki,t.EROSION_DEFAULT_SOFTNESS=_s,t.EdgeEmitter=ts,t.EffectPool=class{constructor(t,e){this.template=t,this.options=e,this.idle=[],this.playing=new Set,this.systemsOf=new Map,this.restOf=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(Mr.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();if(null===i)return null;const s=void 0===t||"number"==typeof t.x?{position:t,parent:e}:t;return this.placeCopy(i,s),i.setEnabled(!0),this.playing.add(i),Mr.restart(i),Mr.play(i),i}stop(t){this.playing.has(t)&&Mr.endEmit(t)}release(t){this.playing.delete(t)&&(t.isDisposed()?this.forget(t):(Mr.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=Mr.instantiate(this.template),e=[];return Mr.runOnAllParticleEmitters(t,t=>{const i=t.system;i.autoDestroy=!1,i.addEventListener("finished",this.onSystemFinished),e.push(i)}),this.systemsOf.set(t,e),this.restOf.set(t,{position:t.position.clone(),rotation:t.rotation.clone(),rotationQuaternion:t.rotationQuaternion?.clone()??null,scaling:t.scaling.clone()}),Mr.addToBatchRenderer(t,this.options.renderer),t.setEnabled(!1),t.parent=null,t.onDisposeObservable.addOnce(()=>this.forget(t)),t}placeCopy(t,e){const i=this.restOf.get(t);t.parent=e.parent??null;const s=e.position??i.position,n=e.scaling??i.scaling;t.position.copyFromFloats(s.x,s.y,s.z),t.scaling.copyFromFloats(n.x,n.y,n.z),void 0!==e.rotationQuaternion?t.rotationQuaternion=e.rotationQuaternion.clone():void 0!==e.rotation?(t.rotationQuaternion=null,t.rotation.copyFromFloats(e.rotation.x,e.rotation.y,e.rotation.z)):(t.rotationQuaternion=i.rotationQuaternion?.clone()??null,t.rotation.copyFrom(i.rotation))}forget(t){for(const e of this.systemsOf.get(t)??[])e.removeEventListener("finished",this.onSystemFinished),this.options.renderer.deleteSystem(e),e.dispose();this.systemsOf.delete(t),this.restOf.delete(t),this.playing.delete(t);const e=this.idle.indexOf(t);-1!==e&&this.idle.splice(e,1)}disposeCopy(t){this.forget(t),br(t)}},t.EmitSubParticleSystem=Qe,t.EmitterFrame=we,t.EmitterFromJSON=as,t.EmitterShapes=os,t.EmitterToJSON=hs,t.Euler=gt,t.EulerGenerator=me,t.ForceOverLife=je,t.FrameOverLife=Ye,t.GRADIENT_MAP_WEIGHTS=Ms,t.GeneratorFromJSON=xe,t.Gradient=he,t.GravityForce=He,t.GridEmitter=es,t.HemisphereEmitter=is,t.InheritVelocity=Xe,t.IntervalValue=Zt,t.LimitSpeedOverLife=Ze,t.MAX_TRAIL_TESSELLATION=16,t.MathUtils=tt,t.Matrix3=vt,t.Matrix4=at,t.MeshSurfaceEmitter=ps,t.MeshSurfaceEmitterPlugin=ys,t.NodeParticle=class{constructor(){this.position=new it,this.velocity=new it,this.age=0,this.life=1,this.size=new it,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}},t.Noise=fi,t.OrbitOverLife=mi,t.ParticleEmitter=wr,t.ParticleStore=$e,t.ParticleSystem=jo,t.PiecewiseBezier=ee,t.PiecewiseFunction=te,t.Plugins=ls,t.PointEmitter=ss,t.QUARKS_FORMAT_VERSION=1,t.QuarksFormatError=Lt,t.QuarksLoader=_a,t.QuarksPrefab=Xo,t.QuarksUtil=Mr,t.Quaternion=et,t.QuaternionView=St,t.RAD2DEG=$,t.RandomColor=le,t.RandomColorBetweenGradient=ue,t.RandomQuatGenerator=pe,t.RecordState=class{constructor(t,e,i){this.position=t,this.size=e,this.color=i}},t.RectangleEmitter=rs,t.Rotation3DOverLife=yi,t.RotationBySpeed=gi,t.RotationGeneratorFromJSON=ye,t.RotationOverLife=vi,t.SequencerFromJSON=_e,t.ShapeTransform=Gi,t.SizeBySpeed=xi,t.SizeOverLife=bi,t.SpeedOverLife=Si,t.SphereEmitter=ns,t.SpriteParticle=Fe,t.SubEmitterInheritMask=We,t.TextureSequencer=ze,t.TrailParticle=Ne,t.TurbulenceField=Mi,t.UV_DISTORTION_DEFAULT_STRENGTH=Os,t.UV_DISTORTION_DEFAULT_UV=Vs,t.VFXBatch=sr,t.ValueGeneratorFromJSON=ie,t.Vector2=Mt,t.Vector3=it,t.Vector3Function=ge,t.Vector3GeneratorFromJSON=ve,t.Vector3View=_t,t.Vector4=Vt,t.Vector4View=Tt,t.VelocityOverLife=Vi,t.WebGLCoordinateSystem=rt,t.WebGPUCoordinateSystem=ot,t.WidthOverLength=Oi,t.blendCategory=Hn,t.cacheEnvAtlas=function(t,e){const i=$r(e)??$r(t);i?Fr(t,i,e):console.warn("[babylon.quarks] cacheEnvAtlas: neither the atlas nor the cube has a scene; not cached")},t.ceilPowerOfTwo=Y,t.clamp=C,t.createEnvAtlasFromFaceUrls=Br,t.createSeededRandom=V,t.cubeFaceUrls=Pr,t.currentFormatPath=Wt,t.damp=U,t.decodeSoftDepth=function(t,e){const i=e.z*t+e.w,s=Math.abs(i)>1e-8?Math.abs((e.x*t+e.y)/i):0;return s>0?s:1e30},t.defaultMeshLighting=vs,t.degToRad=G,t.denormalize=Z,t.disposeEnvAtlas=Cr,t.ensureEnvAtlasFromCube=Ir,t.erosionEqual=function(t,e){return t===e||!(!t||!e)&&(t.mask===e.mask&&Ss(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])},t.euclideanModulo=F,t.floorPowerOfTwo=H,t.generateUUID=E,t.getCachedEnvAtlas=Er,t.getPhysicsResolver=function(){return $t},t.getRandomSource=_,t.getValueFromEmitterMode=Hi,t.gradientMapEqual=function(t,e){return t===e||!!t&&!!e&&t.ramp===e.ramp&&t.channel===e.channel},t.inverseLerp=N,t.isPowerOfTwo=j,t.lerp=I,t.loadPlugin=cs,t.mapLinear=B,t.mapUVEqual=function(t,e){return t===e||!!t&&!!e&&Ss(t,e)},t.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])},t.normalize=K,t.normalizeErosion=As,t.normalizeGradientMap=zs,t.normalizeMapUV=Ps,t.normalizeMeshRim=xs,t.normalizeTextureUV=bs,t.normalizeUVDistortion=Ts,t.pingpong=R,t.planBehaviorFusion=Wi,t.quarksNodeId=fs,t.radToDeg=Q,t.randFloat=q,t.randFloatSpread=J,t.randInt=k,t.random=z,t.readBehaviorSpace=be,t.readFormat=qt,t.readFormatPart=Jt,t.readsUV1=$s,t.seededRandom=W,t.serializeEffect=function(t,e={}){const i=new na(e);let s;if(Array.isArray(t)){const n=e.name??"effect";s={uuid:`${n}-root`,type:"Group",name:n,matrix:h.Matrix.Identity().asArray().slice(),children:t.map(t=>i.node(t))}}else s=i.node(t);return i.finish(s)},t.setPhysicsResolver=function(t){$t=t},t.setQuaternionFromProperEuler=X,t.setRandomSource=A,t.shaderProgram=Xn,t.shaderVariants=function(){const e=new Set,i=[],s=s=>{const n={renderMode:r=t.RenderMode.BillBoard,texture:null,reflectionAtlas:null,uTileCount:1,vTileCount:1,blendTiles:!1,softParticles:!1,materialAlphaTest:0,materialTransparent:!0,materialBlendMode:o.Constants.ALPHA_COMBINE,applyFog:!1,pivot:void 0,minParticleSize:0,maxParticleSize:1/0,lighting:r===t.RenderMode.Mesh?"fixed":void 0,rim:void 0,mapUV:void 0,uvDistortion:void 0,gradientMap:void 0,erosion:void 0};var r;const a={depth:null,envAtlasReady:!1,meshUV2:!1};for(const t of s)Object.assign(n,t.settings),Object.assign(a,t.context);const h=Xn(n,a),l=h.name+" "+h.defines.join(",");if(e.has(l))return;e.add(l);const c=s.map(t=>t.name).filter(t=>""!==t);i.push({name:`${c.join(", ")} [${h.defines.join(",")||"none"}]`,program:h})};for(const t of Oa)for(const e of Ta)for(const i of Pa)for(const n of $a)for(const r of Ea)for(const o of Ca)for(const a of Fa)s([t,e,i,n,r,o,a]);for(const t of Oa)for(const e of Ba)for(const i of Ea.slice(0,2))for(const n of $a)s([t,e,i,n]);for(const e of Oa.filter(t=>Ia.includes(t.name)))for(const i of e.settings?.renderMode===t.RenderMode.Mesh?[Va,Ua]:[Va])for(const t of Na)for(const n of $a)for(const r of[Va,Pa[2]])for(const o of[Va,Ra])s([e,i,t,n,r,o]);return i},t.smootherstep=D,t.smoothstep=L,t.softDepthParams=tn,t.speedFraction=Oe,t.subEmitterInheritMask=Ge,t.textureSourceUrl=ta,t.textureUVEqual=Ss,t.textureUVToJSON=ws,t.trailCurveTension=or,t.trailLifetime=ur,t.trailMinVertexDistance=cr,t.trailTessellation=rr,t.trailTextureMode=hr,t.trailTextureScale=lr,t.unloadPlugin=function(t){const e=ls.findIndex(e=>e.id===t);if(e<0)return;const i=ls[e];ls.splice(e,1);for(const t of i.emitterShapes)os[t.type]===t&&delete os[t.type];for(const t of i.behaviors)Ti[t.type]===t&&delete Ti[t.type]},t.uvDistortionEqual=function(t,e){return t===e||!(!t||!e)&&(t.map===e.map&&t.strength===e.strength&&Ss(t.mapUV,e.mapUV))},t.warnFormat=Gt,t.withRandomSource=function(t,e){const i=A(t);try{return e()}finally{A(i)}}});
2
2
  //# sourceMappingURL=babylon.quarks.umd.min.js.map