@newkrok/three-particles 2.8.0 → 2.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../node_modules/easing-functions/index.js","../src/js/effects/three-particles/three-particles-bezier.ts","../src/js/effects/three-particles/three-particles-curves.ts","../src/js/effects/three-particles/three-particles-enums.ts","../src/js/effects/three-particles/three-particles-utils.ts","../src/js/effects/three-particles/three-particles-modifiers.ts","../node_modules/@newkrok/three-utils/dist/object-utils.js","../scripts/stubs/three-loaders.js","../node_modules/@newkrok/three-utils/dist/assets/loaders.js","../node_modules/three-noise/build/three-noise.module.js","../src/js/effects/three-particles/shaders/particle-system-fragment-shader.glsl.ts","../src/js/effects/three-particles/shaders/particle-system-vertex-shader.glsl.ts","../src/js/effects/three-particles/three-particles.ts"],"names":["exports","p","kInner","k2","Easing","CurveFunctionId","SimulationSpace","Shape","EmitFrom","TimeMode","LifeTimeCurve","SubEmitterTrigger","THREE","THREE2","THREE3","THREE6","colorRandomRatio"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAA,wBAAA,GAAA,UAAA,CAAA;AAAA,EAAA,wCAAA,CAAAA,SAAA,EAAA,MAAA,EAAA;AAGA,IAAA,IAAM,SAAS,CAAA,CAAA,KAAK,CAAA;AAKpB,IAAA,IAAM,SAAA,GAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOhB,GAAI,CAAA,EAAG;AACL,QAAA,OAAO,CAAA,GAAI,CAAA;AAAA,MACb,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,IAAK,CAAA,EAAG;AACN,QAAA,OAAO,KAAK,CAAA,GAAI,CAAA,CAAA;AAAA,MAClB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,MAAO,CAAA,EAAG;AACR,QAAA,IAAI,KAAK,CAAA,GAAI,CAAA;AACb,QAAA,IAAI,KAAK,CAAA,EAAG;AACV,UAAA,OAAO,MAAM,EAAA,GAAK,EAAA;AAAA,QACpB;AACA,QAAA,EAAA,IAAM,CAAA;AACN,QAAA,OAAO,IAAA,IAAS,EAAA,IAAM,EAAA,GAAK,CAAA,CAAA,GAAK,CAAA,CAAA;AAAA,MAClC;AAAA,KAEF;AAKA,IAAA,IAAM,KAAA,GAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOZ,GAAI,CAAA,EAAG;AACL,QAAA,OAAO,IAAI,CAAA,GAAI,CAAA;AAAA,MACjB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,IAAK,CAAA,EAAG;AACN,QAAA,OAAO,EAAG,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA;AAAA,MACxB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,MAAO,CAAA,EAAG;AACR,QAAA,IAAI,KAAK,CAAA,GAAI,CAAA;AACb,QAAA,IAAI,KAAK,CAAA,EAAG;AACV,UAAA,OAAO,GAAA,GAAM,KAAK,EAAA,GAAK,EAAA;AAAA,QACzB;AACA,QAAA,EAAA,IAAM,CAAA;AACN,QAAA,OAAO,GAAA,IAAO,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,CAAA,CAAA;AAAA,MAC/B;AAAA,KAEF;AAKA,IAAA,IAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOd,GAAI,CAAA,EAAG;AACL,QAAA,OAAO,CAAA,GAAI,IAAI,CAAA,GAAI,CAAA;AAAA,MACrB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,IAAK,CAAA,EAAG;AACN,QAAA,OAAO,CAAA,GAAK,EAAG,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA;AAAA,MAC7B,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,MAAO,CAAA,EAAG;AACR,QAAA,IAAI,KAAK,CAAA,GAAI,CAAA;AACb,QAAA,IAAI,KAAK,CAAA,EAAG;AACV,UAAA,OAAO,GAAA,GAAM,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAAA,QAC9B;AACA,QAAA,EAAA,IAAM,CAAA;AACN,QAAA,OAAO,IAAA,IAAS,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,CAAA,CAAA;AAAA,MACtC;AAAA,KAEF;AAKA,IAAA,IAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOd,GAAI,CAAA,EAAG;AACL,QAAA,OAAO,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA;AAAA,MACzB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,IAAK,CAAA,EAAG;AACN,QAAA,OAAO,EAAG,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,IAAI,CAAA,GAAI,CAAA;AAAA,MAChC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,MAAO,CAAA,EAAG;AACR,QAAA,IAAI,KAAK,CAAA,GAAI,CAAA;AACb,QAAA,IAAI,KAAK,CAAA,EAAG;AACV,UAAA,OAAO,GAAA,GAAM,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAAA,QACnC;AACA,QAAA,EAAA,IAAM,CAAA;AACN,QAAA,OAAO,GAAA,IAAO,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAA,GAAK,CAAA,CAAA;AAAA,MACzC;AAAA,KAEF;AAKA,IAAA,IAAM,UAAA,GAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOjB,GAAI,CAAA,EAAG;AACL,QAAA,OAAO,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,MACrC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,IAAK,CAAA,EAAG;AACN,QAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,MACjC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,MAAO,CAAA,EAAG;AACR,QAAA,OAAO,OAAO,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,KAAK,CAAC,CAAA,CAAA;AAAA,MACxC;AAAA,KAEF;AAKA,IAAA,IAAM,WAAA,GAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOlB,GAAI,CAAA,EAAG;AACL,QAAA,OAAO,CAAA,KAAM,CAAA,GAAI,CAAA,GAAI,IAAA,KAAS,CAAA,GAAI,CAAA,CAAA;AAAA,MACpC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,IAAK,CAAA,EAAG;AACN,QAAA,OAAO,CAAA,KAAM,CAAA,GAAI,CAAA,GAAI,CAAA,GAAK,MAAM,GAAA,GAAO,CAAA,CAAA;AAAA,MACzC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,MAAO,CAAA,EAAG;AACR,QAAA,IAAI,CAAA,KAAM,GAAG,OAAO,CAAA;AACpB,QAAA,IAAI,CAAA,KAAM,GAAG,OAAO,CAAA;AACpB,QAAA,MAAM,KAAK,CAAA,GAAI,CAAA;AACf,QAAA,IAAI,KAAK,CAAA,EAAG;AACV,UAAA,OAAO,GAAA,GAAO,SAAS,EAAA,GAAK,CAAA,CAAA;AAAA,QAC9B;AACA,QAAA,OAAO,GAAA,IAAO,EAAG,CAAA,KAAM,GAAA,IAAQ,KAAK,CAAA,CAAA,CAAA,CAAA,GAAO,CAAA,CAAA;AAAA,MAC7C;AAAA,KAEF;AAKA,IAAA,IAAM,QAAA,GAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOf,GAAI,CAAA,EAAG;AACL,QAAA,OAAO,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,CAAA,GAAI,IAAI,CAAC,CAAA;AAAA,MAChC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,IAAK,CAAA,EAAG;AACN,QAAA,OAAO,IAAA,CAAK,IAAA,CAAK,CAAA,GAAK,EAAG,IAAI,CAAE,CAAA;AAAA,MACjC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,MAAO,CAAA,EAAG;AACR,QAAA,IAAI,KAAK,CAAA,GAAI,CAAA;AACb,QAAA,IAAI,KAAK,CAAA,EAAG;AACV,UAAA,OAAO,QAAS,IAAA,CAAK,IAAA,CAAK,CAAA,GAAI,EAAA,GAAK,EAAE,CAAA,GAAI,CAAA,CAAA;AAAA,QAC3C;AACA,QAAA,EAAA,IAAM,CAAA;AACN,QAAA,OAAO,OAAO,IAAA,CAAK,IAAA,CAAK,CAAA,GAAI,EAAA,GAAK,EAAE,CAAA,GAAI,CAAA,CAAA;AAAA,MACzC;AAAA,KAEF;AAKA,IAAA,IAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOd,GAAI,CAAA,EAAG;AACL,QAAA,IAAI,CAAA,GAAI,GAAA;AACR,QAAA,MAAMC,EAAAA,GAAI,GAAA;AACV,QAAA,IAAI,CAAA;AACJ,QAAA,IAAI,CAAA,KAAM,GAAG,OAAO,CAAA;AACpB,QAAA,IAAI,CAAA,KAAM,GAAG,OAAO,CAAA;AACpB,QAAA,IAAI,IAAI,CAAA,EAAG;AACT,UAAA,CAAA,GAAI,CAAA;AACJ,UAAA,CAAA,GAAIA,EAAAA,GAAI,CAAA;AAAA,QACV,CAAA,MAAO;AACL,UAAA,CAAA,GAAIA,KAAI,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC,CAAA,IAAK,IAAI,IAAA,CAAK,EAAA,CAAA;AAAA,QACvC;AACA,QAAA,CAAA,IAAK,CAAA;AACL,QAAA,OAAO,EAAG,CAAA,GAAK,CAAA,KAAM,EAAA,GAAK,CAAA,CAAA,GAAM,IAAA,CAAK,GAAA,CAAA,CAAK,CAAA,GAAI,CAAA,KAAM,CAAA,GAAI,IAAA,CAAK,EAAA,CAAA,GAAMA,EAAC,CAAA,CAAA;AAAA,MACtE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,IAAK,CAAA,EAAG;AACN,QAAA,IAAI,CAAA,GAAI,GAAA;AACR,QAAA,MAAMA,EAAAA,GAAI,GAAA;AACV,QAAA,IAAI,CAAA;AACJ,QAAA,IAAI,CAAA,KAAM,GAAG,OAAO,CAAA;AACpB,QAAA,IAAI,CAAA,KAAM,GAAG,OAAO,CAAA;AACpB,QAAA,IAAI,IAAI,CAAA,EAAG;AACT,UAAA,CAAA,GAAI,CAAA;AACJ,UAAA,CAAA,GAAIA,EAAAA,GAAI,CAAA;AAAA,QACV,CAAA,MAAO;AACL,UAAA,CAAA,GAAIA,KAAI,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC,CAAA,IAAK,IAAI,IAAA,CAAK,EAAA,CAAA;AAAA,QACvC;AACA,QAAA,OAAQ,CAAA,GAAK,CAAA,KAAM,GAAA,GAAO,CAAA,CAAA,GAAM,IAAA,CAAK,GAAA,CAAA,CAAK,CAAA,GAAI,CAAA,KAAM,CAAA,GAAI,IAAA,CAAK,EAAA,CAAA,GAAMA,EAAC,CAAA,GAAI,CAAA;AAAA,MAC1E,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,MAAO,CAAA,EAAG;AACR,QAAA,IAAI,CAAA,GAAI,GAAA;AACR,QAAA,MAAMA,EAAAA,GAAI,GAAA;AACV,QAAA,IAAI,CAAA;AACJ,QAAA,IAAI,CAAA,KAAM,GAAG,OAAO,CAAA;AACpB,QAAA,IAAI,CAAA,KAAM,GAAG,OAAO,CAAA;AACpB,QAAA,IAAI,IAAI,CAAA,EAAG;AACT,UAAA,CAAA,GAAI,CAAA;AACJ,UAAA,CAAA,GAAIA,EAAAA,GAAI,CAAA;AAAA,QACV,CAAA,MAAO;AACL,UAAA,CAAA,GAAIA,KAAI,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC,CAAA,IAAK,IAAI,IAAA,CAAK,EAAA,CAAA;AAAA,QACvC;AACA,QAAA,MAAM,KAAK,CAAA,GAAI,CAAA;AACf,QAAA,IAAI,KAAK,CAAA,EAAG;AACV,UAAA,MAAMC,UAAS,EAAA,GAAK,CAAA;AACpB,UAAA,OAAO,IAAA,IAAS,CAAA,GAAK,CAAA,KAAM,EAAA,GAAKA,OAAAA,CAAAA,GAAW,IAAA,CAAK,GAAA,CAAA,CAAKA,OAAAA,GAAS,CAAA,KAAM,CAAA,GAAI,IAAA,CAAK,EAAA,CAAA,GAAMD,EAAC,CAAA,CAAA;AAAA,QACtF;AACA,QAAA,MAAM,SAAS,EAAA,GAAK,CAAA;AACpB,QAAA,OAAO,CAAA,GAAK,CAAA,KAAM,GAAA,GAAO,MAAA,CAAA,GAAW,IAAA,CAAK,GAAA,CAAA,CAAK,MAAA,GAAS,CAAA,KAAM,CAAA,GAAI,IAAA,CAAK,EAAA,CAAA,GAAMA,EAAC,IAAI,GAAA,GAAM,CAAA;AAAA,MACzF;AAAA,KAEF;AAKA,IAAA,IAAM,IAAA,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOX,GAAI,CAAA,EAAG;AACL,QAAA,MAAM,CAAA,GAAI,OAAA;AACV,QAAA,OAAO,CAAA,GAAI,CAAA,IAAA,CAAM,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,CAAA,CAAA;AAAA,MAChC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,IAAK,CAAA,EAAG;AACN,QAAA,MAAM,CAAA,GAAI,OAAA;AACV,QAAA,OAAO,EAAG,CAAA,GAAI,CAAA,IAAA,CAAM,CAAA,GAAI,CAAA,IAAK,IAAI,CAAA,CAAA,GAAK,CAAA;AAAA,MACxC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,MAAO,CAAA,EAAG;AACR,QAAA,MAAM,IAAI,OAAA,GAAU,KAAA;AACpB,QAAA,IAAI,KAAK,CAAA,GAAI,CAAA;AACb,QAAA,IAAI,KAAK,CAAA,EAAG;AACV,UAAA,OAAO,GAAA,IAAO,EAAA,GAAK,EAAA,IAAA,CAAO,CAAA,GAAI,KAAK,EAAA,GAAK,CAAA,CAAA,CAAA;AAAA,QAC1C;AACA,QAAA,EAAA,IAAM,CAAA;AACN,QAAA,OAAO,OAAO,EAAA,GAAK,EAAA,IAAA,CAAO,CAAA,GAAI,CAAA,IAAK,KAAK,CAAA,CAAA,GAAK,CAAA,CAAA;AAAA,MAC/C;AAAA,KAEF;AAKA,IAAA,IAAM,MAAA,GAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOb,GAAI,CAAA,EAAG;AACL,QAAA,OAAO,CAAA,GAAI,MAAA,CAAO,GAAA,CAAI,CAAA,GAAI,CAAC,CAAA;AAAA,MAC7B,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,IAAK,CAAA,EAAG;AACN,QAAA,IAAI,CAAA,GAAI,IAAI,IAAA,EAAM;AAChB,UAAA,OAAO,SAAS,CAAA,GAAI,CAAA;AAAA,QACtB;AAAE,QAAA,IAAI,CAAA,GAAI,IAAI,IAAA,EAAM;AAClB,UAAA,MAAME,GAAAA,GAAK,IAAK,GAAA,GAAM,IAAA;AACtB,UAAA,OAAO,MAAA,GAASA,MAAKA,GAAAA,GAAK,IAAA;AAAA,QAC5B;AAAE,QAAA,IAAI,CAAA,GAAI,MAAM,IAAA,EAAM;AACpB,UAAA,MAAMA,GAAAA,GAAK,IAAK,IAAA,GAAO,IAAA;AACvB,UAAA,OAAO,MAAA,GAASA,MAAKA,GAAAA,GAAK,MAAA;AAAA,QAC5B;AACA,QAAA,MAAM,EAAA,GAAK,IAAK,KAAA,GAAQ,IAAA;AACxB,QAAA,OAAO,MAAA,GAAS,KAAK,EAAA,GAAK,QAAA;AAAA,MAC5B,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,MAAO,CAAA,EAAG;AACR,QAAA,IAAI,IAAI,GAAA,EAAK,OAAO,OAAO,EAAA,CAAG,CAAA,GAAI,CAAC,CAAA,GAAI,GAAA;AACvC,QAAA,OAAO,OAAO,GAAA,CAAI,CAAA,GAAI,CAAA,GAAI,CAAC,IAAI,GAAA,GAAM,GAAA;AAAA,MACvC;AAAA,KAEF;AAEA,IAAA,IAAMC,OAAAA,GAAS;AAAA,MACb,SAAA;AAAA,MACA,KAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA,UAAA;AAAA,MACA,WAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAA;AAAA,MACA,IAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,IAAM,MAAA,GAAS,CAAC,GAAA,EAAK,GAAA,EAAK,UAAU,MAAA,CAAO,cAAA,CAAe,KAAK,GAAA,EAAK;AAAA,MAClE;AAAA,KACD,CAAA;AAED,IAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAKA,OAAM,CAAA,EAAG;AACrC,MAAA,MAAM,GAAA,GAAMA,QAAO,GAAG,CAAA;AACtB,MAAA,MAAM,QAAA,GAAW,IAAI,WAAA,EAAY;AACjC,MAAA,MAAA,CAAOA,OAAAA,EAAQ,UAAU,GAAG,CAAA;AAE5B,MAAA,KAAA,MAAW,IAAA,IAAQ,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,EAAG;AACnC,QAAA,MAAM,EAAA,GAAK,IAAI,IAAI,CAAA;AACnB,QAAA,MAAM,SAAA,GAAY,KAAK,WAAA,EAAY;AAGnC,QAAA,MAAA,CAAOA,SAAQ,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,IAAI,IAAI,EAAE,CAAA;AAGnC,QAAA,MAAA,CAAOA,SAAQ,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,SAAS,IAAI,EAAE,CAAA;AAC7C,QAAA,MAAA,CAAO,GAAA,EAAK,WAAW,EAAE,CAAA;AAAA,MAC3B;AAAA,IACF;AAEA,IAAAA,QAAO,MAAA,GAAS,MAAA;AAChB,IAAA,MAAA,CAAOA,OAAAA,EAAQ,UAAU,MAAM,CAAA;AAE/B,IAAA,MAAA,CAAO,OAAA,GAAUA,OAAAA;AAEjB,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,MAAA,MAAA,CAAO,MAAA,GAASA,OAAAA;AAAA,IAClB;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC3dA,IAAM,QAID,EAAC;AAEN,IAAM,GAAA,GAAM,CAAC,CAAA,EAAW,CAAA,KAAc;AACpC,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,KAAA,IAAS,CAAA,GAAI,GAAG,CAAA,IAAK,CAAA,EAAG,KAAK,CAAA,IAAA,CAAM,CAAA,GAAI,IAAI,CAAA,IAAK,CAAA;AAChD,EAAA,OAAO,CAAA;AACT,CAAA;AAEO,IAAM,yBAAA,GAA4B,CACvC,gBAAA,EACA,YAAA,KACG;AACH,EAAA,MAAM,aAAa,KAAA,CAAM,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,CAAK,iBAAiB,YAAY,CAAA;AAE1E,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,IAAI,CAAC,UAAA,CAAW,YAAA,CAAa,QAAA,CAAS,gBAAgB,CAAA;AACpD,MAAA,UAAA,CAAW,YAAA,CAAa,KAAK,gBAAgB,CAAA;AAC/C,IAAA,OAAO,UAAA,CAAW,aAAA;AAAA,EACpB;AAEA,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,YAAA,EAAc,CAAC,gBAAgB,CAAA;AAAA,IAC/B,YAAA;AAAA,IACA,aAAA,EAAe,CAAC,UAAA,KAA+B;AAC7C,MAAA,IAAI,UAAA,GAAa,CAAA,EAAG,OAAO,YAAA,CAAa,CAAC,CAAA,CAAE,CAAA;AAC3C,MAAA,IAAI,aAAa,CAAA,EAAG,OAAO,aAAa,YAAA,CAAa,MAAA,GAAS,CAAC,CAAA,CAAE,CAAA;AAEjE,MAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,MAAA,IAAI,IAAA,GAAO,aAAa,MAAA,GAAS,CAAA;AAEjC,MAAA,YAAA,CAAa,IAAA,CAAK,CAAC,KAAA,EAAO,KAAA,KAAU;AAClC,QAAA,MAAM,MAAA,GAAS,UAAA,IAAc,KAAA,CAAM,UAAA,IAAc,CAAA,CAAA;AACjD,QAAA,IAAI,QAAQ,IAAA,GAAO,KAAA;AAAA,aAAA,IACV,KAAA,CAAM,UAAA,KAAe,MAAA,EAAW,KAAA,GAAQ,KAAA;AACjD,QAAA,OAAO,MAAA;AAAA,MACT,CAAC,CAAA;AAED,MAAA,MAAM,IAAI,IAAA,GAAO,KAAA;AACjB,MAAA,MAAM,oBAAA,GAAA,CACH,UAAA,IAAc,YAAA,CAAa,KAAK,EAAE,UAAA,IAAc,CAAA,CAAA,KAAA,CAC/C,YAAA,CAAa,IAAI,EAAE,UAAA,IAAc,CAAA,KAChC,YAAA,CAAa,KAAK,EAAE,UAAA,IAAc,CAAA,CAAA,CAAA;AAEvC,MAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,CAAA,EAAG,CAAA,EAAA,EAAK;AAC3B,QAAA,MAAMH,EAAAA,GAAI,YAAA,CAAa,KAAA,GAAQ,CAAC,CAAA;AAChC,QAAA,MAAM,CAAA,GACJ,GAAA,CAAI,CAAA,EAAG,CAAC,IACR,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,oBAAA,EAAsB,IAAI,CAAC,CAAA,GACxC,IAAA,CAAK,GAAA,CAAI,sBAAsB,CAAC,CAAA;AAClC,QAAA,KAAA,IAAS,IAAIA,EAAAA,CAAE,CAAA;AAAA,MACjB;AACA,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,GACF;AAEA,EAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAChB,EAAA,OAAO,KAAA,CAAM,aAAA;AACf;AAEO,IAAM,yBAAA,GAA4B,CAAC,gBAAA,KAA6B;AACrE,EAAA,OAAO,IAAA,EAAM;AACX,IAAA,MAAM,QAAQ,KAAA,CAAM,SAAA;AAAA,MAAU,CAAC,IAAA,KAC7B,IAAA,CAAK,YAAA,CAAa,SAAS,gBAAgB;AAAA,KAC7C;AACA,IAAA,IAAI,UAAU,EAAA,EAAI;AAClB,IAAA,MAAM,KAAA,GAAQ,MAAM,KAAK,CAAA;AACzB,IAAA,KAAA,CAAM,YAAA,GAAe,MAAM,YAAA,CAAa,MAAA;AAAA,MACtC,CAAC,OAAO,EAAA,KAAO;AAAA,KACjB;AACA,IAAA,IAAI,MAAM,YAAA,CAAa,MAAA,KAAW,GAAG,KAAA,CAAM,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA,EAC5D;AACF;AAEO,IAAM,kBAAA,GAAqB,MAAM,KAAA,CAAM;;;AChF9C,IAAA,uBAAA,GAAmB,OAAA,CAAA,wBAAA,EAAA,CAAA;AAiBZ,IAAW,eAAA,qBAAAI,gBAAAA,KAAX;AAEL,EAAAA,iBAAA,QAAA,CAAA,GAAS,QAAA;AAGT,EAAAA,iBAAA,QAAA,CAAA,GAAS,QAAA;AAGT,EAAAA,iBAAA,cAAA,CAAA,GAAe,cAAA;AAEf,EAAAA,iBAAA,eAAA,CAAA,GAAgB,eAAA;AAEhB,EAAAA,iBAAA,kBAAA,CAAA,GAAmB,kBAAA;AAGnB,EAAAA,iBAAA,UAAA,CAAA,GAAW,UAAA;AAEX,EAAAA,iBAAA,WAAA,CAAA,GAAY,WAAA;AAEZ,EAAAA,iBAAA,cAAA,CAAA,GAAe,cAAA;AAGf,EAAAA,iBAAA,YAAA,CAAA,GAAa,YAAA;AAEb,EAAAA,iBAAA,aAAA,CAAA,GAAc,aAAA;AAEd,EAAAA,iBAAA,gBAAA,CAAA,GAAiB,gBAAA;AAGjB,EAAAA,iBAAA,YAAA,CAAA,GAAa,YAAA;AAEb,EAAAA,iBAAA,aAAA,CAAA,GAAc,aAAA;AAEd,EAAAA,iBAAA,gBAAA,CAAA,GAAiB,gBAAA;AAGjB,EAAAA,iBAAA,eAAA,CAAA,GAAgB,eAAA;AAEhB,EAAAA,iBAAA,gBAAA,CAAA,GAAiB,gBAAA;AAEjB,EAAAA,iBAAA,mBAAA,CAAA,GAAoB,mBAAA;AAGpB,EAAAA,iBAAA,gBAAA,CAAA,GAAiB,gBAAA;AAEjB,EAAAA,iBAAA,iBAAA,CAAA,GAAkB,iBAAA;AAElB,EAAAA,iBAAA,oBAAA,CAAA,GAAqB,oBAAA;AAGrB,EAAAA,iBAAA,aAAA,CAAA,GAAc,aAAA;AAEd,EAAAA,iBAAA,cAAA,CAAA,GAAe,cAAA;AAEf,EAAAA,iBAAA,iBAAA,CAAA,GAAkB,iBAAA;AAGlB,EAAAA,iBAAA,YAAA,CAAA,GAAa,YAAA;AAEb,EAAAA,iBAAA,aAAA,CAAA,GAAc,aAAA;AAEd,EAAAA,iBAAA,gBAAA,CAAA,GAAiB,gBAAA;AAGjB,EAAAA,iBAAA,SAAA,CAAA,GAAU,SAAA;AAEV,EAAAA,iBAAA,UAAA,CAAA,GAAW,UAAA;AAEX,EAAAA,iBAAA,aAAA,CAAA,GAAc,aAAA;AAGd,EAAAA,iBAAA,WAAA,CAAA,GAAY,WAAA;AAEZ,EAAAA,iBAAA,YAAA,CAAA,GAAa,YAAA;AAEb,EAAAA,iBAAA,eAAA,CAAA,GAAgB,eAAA;AA3EA,EAAA,OAAAA,gBAAAA;AAAA,CAAA,EAAA,eAAA,IAAA,EAAA;AA8ElB,IAAM,kBAAA,GAAsE;AAAA,EAC1E,CAAC,QAAA,gBAAyB,uBAAA,CAAAD,QAAO,MAAA,CAAO,IAAA;AAAA,EACxC,CAAC,cAAA,sBAA+B,uBAAA,CAAAA,QAAO,SAAA,CAAU,EAAA;AAAA,EACjD,CAAC,eAAA,uBAAgC,uBAAA,CAAAA,QAAO,SAAA,CAAU,GAAA;AAAA,EAClD,CAAC,kBAAA,0BAAmC,uBAAA,CAAAA,QAAO,SAAA,CAAU,KAAA;AAAA,EACrD,CAAC,UAAA,kBAA2B,uBAAA,CAAAA,QAAO,KAAA,CAAM,EAAA;AAAA,EACzC,CAAC,WAAA,mBAA4B,uBAAA,CAAAA,QAAO,KAAA,CAAM,GAAA;AAAA,EAC1C,CAAC,cAAA,sBAA+B,uBAAA,CAAAA,QAAO,KAAA,CAAM,KAAA;AAAA,EAC7C,CAAC,YAAA,oBAA6B,uBAAA,CAAAA,QAAO,OAAA,CAAQ,EAAA;AAAA,EAC7C,CAAC,aAAA,qBAA8B,uBAAA,CAAAA,QAAO,OAAA,CAAQ,GAAA;AAAA,EAC9C,CAAC,gBAAA,wBAAiC,uBAAA,CAAAA,QAAO,OAAA,CAAQ,KAAA;AAAA,EACjD,CAAC,YAAA,oBAA6B,uBAAA,CAAAA,QAAO,OAAA,CAAQ,EAAA;AAAA,EAC7C,CAAC,aAAA,qBAA8B,uBAAA,CAAAA,QAAO,OAAA,CAAQ,GAAA;AAAA,EAC9C,CAAC,gBAAA,wBAAiC,uBAAA,CAAAA,QAAO,OAAA,CAAQ,KAAA;AAAA,EACjD,CAAC,eAAA,uBAAgC,uBAAA,CAAAA,QAAO,UAAA,CAAW,EAAA;AAAA,EACnD,CAAC,gBAAA,wBAAiC,uBAAA,CAAAA,QAAO,UAAA,CAAW,GAAA;AAAA,EACpD,CAAC,mBAAA,2BAAoC,uBAAA,CAAAA,QAAO,UAAA,CAAW,KAAA;AAAA,EACvD,CAAC,gBAAA,wBAAiC,uBAAA,CAAAA,QAAO,WAAA,CAAY,EAAA;AAAA,EACrD,CAAC,iBAAA,yBAAkC,uBAAA,CAAAA,QAAO,WAAA,CAAY,GAAA;AAAA,EACtD,CAAC,oBAAA,4BAAqC,uBAAA,CAAAA,QAAO,WAAA,CAAY,KAAA;AAAA,EACzD,CAAC,aAAA,qBAA8B,uBAAA,CAAAA,QAAO,QAAA,CAAS,EAAA;AAAA,EAC/C,CAAC,cAAA,sBAA+B,uBAAA,CAAAA,QAAO,QAAA,CAAS,GAAA;AAAA,EAChD,CAAC,iBAAA,yBAAkC,uBAAA,CAAAA,QAAO,QAAA,CAAS,KAAA;AAAA,EACnD,CAAC,YAAA,oBAA6B,uBAAA,CAAAA,QAAO,OAAA,CAAQ,EAAA;AAAA,EAC7C,CAAC,aAAA,qBAA8B,uBAAA,CAAAA,QAAO,OAAA,CAAQ,GAAA;AAAA,EAC9C,CAAC,gBAAA,wBAAiC,uBAAA,CAAAA,QAAO,OAAA,CAAQ,KAAA;AAAA,EACjD,CAAC,SAAA,iBAA0B,uBAAA,CAAAA,QAAO,IAAA,CAAK,EAAA;AAAA,EACvC,CAAC,UAAA,kBAA2B,uBAAA,CAAAA,QAAO,IAAA,CAAK,GAAA;AAAA,EACxC,CAAC,aAAA,qBAA8B,uBAAA,CAAAA,QAAO,IAAA,CAAK,KAAA;AAAA,EAC3C,CAAC,WAAA,mBAA4B,uBAAA,CAAAA,QAAO,MAAA,CAAO,EAAA;AAAA,EAC3C,CAAC,YAAA,oBAA6B,uBAAA,CAAAA,QAAO,MAAA,CAAO,GAAA;AAAA,EAC5C,CAAC,eAAA,uBAAgC,uBAAA,CAAAA,QAAO,MAAA,CAAO;AACjD,CAAA;AA2BO,IAAM,gBAAA,GAAmB,CAC9B,eAAA,KAEA,OAAO,oBAAoB,UAAA,GACvB,eAAA,GACA,mBAAmB,eAAe;;;AC1JjC,IAAW,eAAA,qBAAAE,gBAAAA,KAAX;AAML,EAAAA,iBAAA,OAAA,CAAA,GAAQ,OAAA;AAOR,EAAAA,iBAAA,OAAA,CAAA,GAAQ,OAAA;AAbQ,EAAA,OAAAA,gBAAAA;AAAA,CAAA,EAAA,eAAA,IAAA,EAAA;AAqBX,IAAW,KAAA,qBAAAC,MAAAA,KAAX;AAKL,EAAAA,OAAA,QAAA,CAAA,GAAS,QAAA;AAOT,EAAAA,OAAA,MAAA,CAAA,GAAO,MAAA;AAOP,EAAAA,OAAA,KAAA,CAAA,GAAM,KAAA;AAON,EAAAA,OAAA,QAAA,CAAA,GAAS,QAAA;AAOT,EAAAA,OAAA,WAAA,CAAA,GAAY,WAAA;AAjCI,EAAA,OAAAA,MAAAA;AAAA,CAAA,EAAA,KAAA,IAAA,EAAA;AA0CX,IAAW,QAAA,qBAAAC,SAAAA,KAAX;AAKL,EAAAA,UAAA,QAAA,CAAA,GAAS,QAAA;AAMT,EAAAA,UAAA,OAAA,CAAA,GAAQ,OAAA;AAMR,EAAAA,UAAA,MAAA,CAAA,GAAO,MAAA;AAjBS,EAAA,OAAAA,SAAAA;AAAA,CAAA,EAAA,QAAA,IAAA,EAAA;AAyBX,IAAW,QAAA,qBAAAC,SAAAA,KAAX;AAKL,EAAAA,UAAA,UAAA,CAAA,GAAW,UAAA;AAMX,EAAAA,UAAA,KAAA,CAAA,GAAM,KAAA;AAXU,EAAA,OAAAA,SAAAA;AAAA,CAAA,EAAA,QAAA,IAAA,EAAA;AAmBX,IAAW,aAAA,qBAAAC,cAAAA,KAAX;AAML,EAAAA,eAAA,QAAA,CAAA,GAAS,QAAA;AAOT,EAAAA,eAAA,QAAA,CAAA,GAAS,QAAA;AAbO,EAAA,OAAAA,cAAAA;AAAA,CAAA,EAAA,aAAA,IAAA,EAAA;AAqBX,IAAW,iBAAA,qBAAAC,kBAAAA,KAAX;AAKL,EAAAA,mBAAA,OAAA,CAAA,GAAQ,OAAA;AAMR,EAAAA,mBAAA,OAAA,CAAA,GAAQ,OAAA;AAXQ,EAAA,OAAAA,kBAAAA;AAAA,CAAA,EAAA,iBAAA,IAAA,EAAA;ACpGX,IAAM,0CAAA,GAA6C,CACxD,QAAA,EACA,UAAA,EACA,UACA,KAAA,EACA;AAAA,EACE,MAAA;AAAA,EACA,eAAA;AAAA,EACA;AACF,CAAA,KACG;AACH,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,MAAA,EAAO,IAAK,GAAA,GAAM,GAAA,CAAA;AACjC,EAAA,MAAM,CAAA,GAAI,KAAK,MAAA,EAAO;AACtB,EAAA,MAAM,uBAAA,GAA0B,KAAK,MAAA,EAAO;AAC5C,EAAA,MAAM,KAAA,GAAQ,CAAA,GAAI,IAAA,CAAK,EAAA,GAAK,CAAA;AAC5B,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,IAAA,CAAK,CAAA,GAAI,IAAI,CAAC,CAAA;AAC/B,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AAE3B,EAAA,MAAM,UAAA,GAAa,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA;AAC1C,EAAA,MAAM,UAAA,GAAa,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA;AAC1C,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AAC/B,EAAA,MAAM,sBAAsB,CAAA,GAAI,eAAA;AAEhC,EAAA,QAAA,CAAS,IACP,MAAA,GAAS,mBAAA,GAAsB,UAAA,GAC/B,MAAA,GAAS,kBAAkB,uBAAA,GAA0B,UAAA;AACvD,EAAA,QAAA,CAAS,IACP,MAAA,GAAS,mBAAA,GAAsB,UAAA,GAC/B,MAAA,GAAS,kBAAkB,uBAAA,GAA0B,UAAA;AACvD,EAAA,QAAA,CAAS,IACP,MAAA,GAAS,mBAAA,GAAsB,UAAA,GAC/B,MAAA,GAAS,kBAAkB,uBAAA,GAA0B,UAAA;AAEvD,EAAA,QAAA,CAAS,gBAAgB,UAAU,CAAA;AAEnC,EAAA,MAAM,yBAAA,GAA4B,CAAA,GAAI,QAAA,CAAS,MAAA,EAAO;AACtD,EAAA,QAAA,CAAS,GAAA;AAAA,IACP,QAAA,CAAS,IAAI,yBAAA,GAA4B,KAAA;AAAA,IACzC,QAAA,CAAS,IAAI,yBAAA,GAA4B,KAAA;AAAA,IACzC,QAAA,CAAS,IAAI,yBAAA,GAA4B;AAAA,GAC3C;AACA,EAAA,QAAA,CAAS,gBAAgB,UAAU,CAAA;AACrC;AA4BO,IAAM,wCAAA,GAA2C,CACtD,QAAA,EACA,UAAA,EACA,UACA,KAAA,EACA;AAAA,EACE,MAAA;AAAA,EACA,eAAA;AAAA,EACA,GAAA;AAAA,EACA,KAAA,GAAQ;AACV,CAAA,KAMG;AACH,EAAA,MAAM,QAAQ,CAAA,GAAI,IAAA,CAAK,KAAK,IAAA,CAAK,MAAA,MAAY,GAAA,GAAM,GAAA,CAAA;AACnD,EAAA,MAAM,uBAAA,GAA0B,KAAK,MAAA,EAAO;AAE5C,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA;AACjC,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA;AACjC,EAAA,MAAM,sBAAsB,CAAA,GAAI,eAAA;AAEhC,EAAA,QAAA,CAAS,IACP,MAAA,GAAS,mBAAA,GAAsB,UAAA,GAC/B,MAAA,GAAS,kBAAkB,uBAAA,GAA0B,UAAA;AACvD,EAAA,QAAA,CAAS,IACP,MAAA,GAAS,mBAAA,GAAsB,UAAA,GAC/B,MAAA,GAAS,kBAAkB,uBAAA,GAA0B,UAAA;AACvD,EAAA,QAAA,CAAS,CAAA,GAAI,CAAA;AAEb,EAAA,QAAA,CAAS,gBAAgB,UAAU,CAAA;AAEnC,EAAA,MAAM,cAAA,GAAiB,SAAS,MAAA,EAAO;AACvC,EAAA,MAAM,kBAAkB,IAAA,CAAK,GAAA;AAAA,IAC1B,cAAA,GAAiB,MAAA,GAAgBC,MAAA,CAAA,SAAA,CAAU,QAAA,CAAS,KAAK;AAAA,GAC5D;AACA,EAAA,MAAM,kBAAA,GAAqB,IAAA,CAAK,GAAA,CAAI,eAAe,CAAA;AAEnD,EAAA,MAAM,4BAA4B,CAAA,GAAI,cAAA;AACtC,EAAA,QAAA,CAAS,GAAA;AAAA,IACP,QAAA,CAAS,CAAA,GAAI,kBAAA,GAAqB,yBAAA,GAA4B,KAAA;AAAA,IAC9D,QAAA,CAAS,CAAA,GAAI,kBAAA,GAAqB,yBAAA,GAA4B,KAAA;AAAA,IAC9D,IAAA,CAAK,GAAA,CAAI,eAAe,CAAA,GAAI;AAAA,GAC9B;AACA,EAAA,QAAA,CAAS,gBAAgB,UAAU,CAAA;AACrC;AA6BO,IAAM,uCAAA,GAA0C,CACrD,QAAA,EACA,UAAA,EACA,UACA,KAAA,EACA,EAAE,KAAA,EAAO,QAAA,EAAS,KACf;AACH,EAAA,MAAM,MAAA,GAAS,KAAA;AACf,EAAA,QAAQ,QAAA;AAAU,IAChB,KAAA,QAAA;AACE,MAAA,QAAA,CAAS,IAAI,IAAA,CAAK,MAAA,KAAW,MAAA,CAAO,CAAA,GAAI,OAAO,CAAA,GAAI,CAAA;AACnD,MAAA,QAAA,CAAS,IAAI,IAAA,CAAK,MAAA,KAAW,MAAA,CAAO,CAAA,GAAI,OAAO,CAAA,GAAI,CAAA;AACnD,MAAA,QAAA,CAAS,IAAI,IAAA,CAAK,MAAA,KAAW,MAAA,CAAO,CAAA,GAAI,OAAO,CAAA,GAAI,CAAA;AACnD,MAAA;AAAA,IAEF,KAAA,OAAA;AACE,MAAA,MAAM,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAA,KAAW,CAAC,CAAA;AACzC,MAAA,MAAM,oBAAoB,IAAA,GAAO,CAAA;AACjC,MAAA,MAAM,cAAc,EAAC;AACrB,MAAA,WAAA,CAAY,iBAAiB,CAAA,GAAI,IAAA,GAAO,CAAA,GAAI,CAAA,GAAI,CAAA;AAChD,MAAA,WAAA,CAAA,CAAa,iBAAA,GAAoB,CAAA,IAAK,CAAC,CAAA,GAAI,KAAK,MAAA,EAAO;AACvD,MAAA,WAAA,CAAA,CAAa,iBAAA,GAAoB,CAAA,IAAK,CAAC,CAAA,GAAI,KAAK,MAAA,EAAO;AACvD,MAAA,QAAA,CAAS,IAAI,WAAA,CAAY,CAAC,IAAI,MAAA,CAAO,CAAA,GAAI,OAAO,CAAA,GAAI,CAAA;AACpD,MAAA,QAAA,CAAS,IAAI,WAAA,CAAY,CAAC,IAAI,MAAA,CAAO,CAAA,GAAI,OAAO,CAAA,GAAI,CAAA;AACpD,MAAA,QAAA,CAAS,IAAI,WAAA,CAAY,CAAC,IAAI,MAAA,CAAO,CAAA,GAAI,OAAO,CAAA,GAAI,CAAA;AACpD,MAAA;AAAA,IAEF,KAAA,MAAA;AACE,MAAA,MAAM,QAAQ,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAA,KAAW,CAAC,CAAA;AAC1C,MAAA,MAAM,qBAAqB,KAAA,GAAQ,CAAA;AACnC,MAAA,MAAM,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAA,KAAW,CAAC,CAAA;AACzC,MAAA,MAAM,aAAa,EAAC;AACpB,MAAA,UAAA,CAAW,kBAAkB,CAAA,GAAI,KAAA,GAAQ,CAAA,GAAI,CAAA,GAAI,CAAA;AACjD,MAAA,UAAA,CAAA,CAAY,kBAAA,GAAqB,KAAK,CAAC,CAAA,GACrC,OAAO,CAAA,GAAI,IAAA,CAAK,MAAA,EAAO,GAAI,IAAA,GAAO,CAAA;AACpC,MAAA,UAAA,CAAA,CAAY,kBAAA,GAAqB,KAAK,CAAC,CAAA,GACrC,OAAO,CAAA,GAAI,IAAA,GAAO,KAAK,MAAA,EAAO;AAChC,MAAA,QAAA,CAAS,IAAI,UAAA,CAAW,CAAC,IAAI,MAAA,CAAO,CAAA,GAAI,OAAO,CAAA,GAAI,CAAA;AACnD,MAAA,QAAA,CAAS,IAAI,UAAA,CAAW,CAAC,IAAI,MAAA,CAAO,CAAA,GAAI,OAAO,CAAA,GAAI,CAAA;AACnD,MAAA,QAAA,CAAS,IAAI,UAAA,CAAW,CAAC,IAAI,MAAA,CAAO,CAAA,GAAI,OAAO,CAAA,GAAI,CAAA;AACnD,MAAA;AAAA;AAGJ,EAAA,QAAA,CAAS,gBAAgB,UAAU,CAAA;AAEnC,EAAA,QAAA,CAAS,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,KAAK,CAAA;AACxB,EAAA,QAAA,CAAS,gBAAgB,UAAU,CAAA;AACrC;AA0BO,IAAM,0CAAA,GAA6C,CACxD,QAAA,EACA,UAAA,EACA,UACA,KAAA,EACA;AAAA,EACE,MAAA;AAAA,EACA,eAAA;AAAA,EACA;AACF,CAAA,KACG;AACH,EAAA,MAAM,QAAQ,CAAA,GAAI,IAAA,CAAK,KAAK,IAAA,CAAK,MAAA,MAAY,GAAA,GAAM,GAAA,CAAA;AACnD,EAAA,MAAM,uBAAA,GAA0B,KAAK,MAAA,EAAO;AAE5C,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA;AACjC,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA;AACjC,EAAA,MAAM,sBAAsB,CAAA,GAAI,eAAA;AAEhC,EAAA,QAAA,CAAS,IACP,MAAA,GAAS,mBAAA,GAAsB,UAAA,GAC/B,MAAA,GAAS,kBAAkB,uBAAA,GAA0B,UAAA;AACvD,EAAA,QAAA,CAAS,IACP,MAAA,GAAS,mBAAA,GAAsB,UAAA,GAC/B,MAAA,GAAS,kBAAkB,uBAAA,GAA0B,UAAA;AACvD,EAAA,QAAA,CAAS,CAAA,GAAI,CAAA;AAEb,EAAA,QAAA,CAAS,gBAAgB,UAAU,CAAA;AAEnC,EAAA,MAAM,cAAA,GAAiB,SAAS,MAAA,EAAO;AACvC,EAAA,MAAM,4BAA4B,CAAA,GAAI,cAAA;AACtC,EAAA,QAAA,CAAS,GAAA;AAAA,IACP,QAAA,CAAS,IAAI,yBAAA,GAA4B,KAAA;AAAA,IACzC,QAAA,CAAS,IAAI,yBAAA,GAA4B,KAAA;AAAA,IACzC;AAAA,GACF;AACA,EAAA,QAAA,CAAS,gBAAgB,UAAU,CAAA;AACrC;AA0BO,IAAM,6CAAA,GAAgD,CAC3D,QAAA,EACA,UAAA,EACA,UACA,KAAA,EACA,EAAE,QAAA,EAAU,KAAA,EAAM,KACf;AACH,EAAA,MAAM,MAAA,GAAS,KAAA;AACf,EAAA,MAAM,SAAA,GAAY,QAAA;AAElB,EAAA,MAAM,UAAU,IAAA,CAAK,MAAA,KAAW,MAAA,CAAO,CAAA,GAAI,OAAO,CAAA,GAAI,CAAA;AACtD,EAAA,MAAM,UAAU,IAAA,CAAK,MAAA,KAAW,MAAA,CAAO,CAAA,GAAI,OAAO,CAAA,GAAI,CAAA;AACtD,EAAA,MAAM,SAAA,GAAkBA,MAAA,CAAA,SAAA,CAAU,QAAA,CAAS,SAAA,CAAU,CAAC,CAAA;AACtD,EAAA,MAAM,SAAA,GAAkBA,MAAA,CAAA,SAAA,CAAU,QAAA,CAAS,SAAA,CAAU,CAAC,CAAA;AACtD,EAAA,QAAA,CAAS,CAAA,GAAI,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA;AACzC,EAAA,QAAA,CAAS,CAAA,GAAI,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA;AACzC,EAAA,QAAA,CAAS,CAAA,GAAI,UAAU,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA,GAAI,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA;AAEzE,EAAA,QAAA,CAAS,gBAAgB,UAAU,CAAA;AAEnC,EAAA,QAAA,CAAS,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,KAAK,CAAA;AACxB,EAAA,QAAA,CAAS,gBAAgB,UAAU,CAAA;AACrC;AAMO,IAAM,+BAA+B,MAAkC;AAC5E,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,IAAA,MAAM,IAAA,GAAO,EAAA;AACb,IAAA,MAAA,CAAO,KAAA,GAAQ,IAAA;AACf,IAAA,MAAA,CAAO,MAAA,GAAS,IAAA;AAChB,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AACtC,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAM,UAAU,IAAA,GAAO,CAAA;AACvB,MAAA,MAAM,UAAU,IAAA,GAAO,CAAA;AACvB,MAAA,MAAM,MAAA,GAAS,OAAO,CAAA,GAAI,CAAA;AAE1B,MAAA,OAAA,CAAQ,SAAA,EAAU;AAClB,MAAA,OAAA,CAAQ,GAAA,CAAI,SAAS,OAAA,EAAS,MAAA,EAAQ,GAAG,CAAA,GAAI,IAAA,CAAK,IAAI,KAAK,CAAA;AAC3D,MAAA,OAAA,CAAQ,SAAA,GAAY,OAAA;AACpB,MAAA,OAAA,CAAQ,IAAA,EAAK;AACb,MAAA,MAAM,OAAA,GAAU,IAAUA,MAAA,CAAA,aAAA,CAAc,MAAM,CAAA;AAC9C,MAAA,OAAA,CAAQ,WAAA,GAAc,IAAA;AACtB,MAAA,OAAO,OAAA;AAAA,IACT,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN;AAAA,OACF;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF,SAAS,KAAA,EAAO;AAEd,IAAA,OAAA,CAAQ,IAAA,CAAK,4CAA4C,KAAK,CAAA;AAC9D,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEO,IAAM,eAAA,GAAkB,CAC7B,KAAA,KAC2B;AAC3B,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,MAAA,IAAU,KAAA;AAChD;AAEO,IAAM,0BAAA,GAA6B,CACxC,gBAAA,EACA,aAAA,KACG;AACH,EAAA,IAAI,cAAc,IAAA,KAAA,QAAA,eAA+B;AAC/C,IAAA,OAAO,yBAAA;AAAA,MACL,gBAAA;AAAA,MACA,aAAA,CAAc;AAAA,KAChB;AAAA,EACF;AAEA,EAAA,IAAI,cAAc,IAAA,KAAA,QAAA,eAA+B;AAC/C,IAAA,OAAO,aAAA,CAAc,aAAA;AAAA,EACvB;AAEA,EAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,aAAa,CAAA,CAAE,CAAA;AAC5D;AAEO,IAAM,cAAA,GAAiB,CAC5B,gBAAA,EACA,KAAA,EACA,OAAe,CAAA,KACJ;AACX,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,KAAA,IAAS,KAAA,IAAS,KAAA,IAAS,KAAA,EAAO;AACpC,IAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,KAAA,CAAM,GAAA,EAAK;AAC3B,MAAA,OAAO,MAAM,GAAA,IAAO,CAAA;AAAA,IACtB;AACA,IAAA,OAAaA,iBAAU,SAAA,CAAU,KAAA,CAAM,OAAO,CAAA,EAAG,KAAA,CAAM,OAAO,CAAC,CAAA;AAAA,EACjE;AAEA,EAAA,MAAM,aAAA,GAAgB,KAAA;AACtB,EAAA,OACE,2BAA2B,gBAAA,EAAkB,aAAa,EAAE,IAAI,CAAA,IAC/D,cAAc,KAAA,IAAS,CAAA,CAAA;AAE5B;;;AC9ZA,IAAM,UAAA,GAAa,IAAUC,MAAA,CAAA,OAAA,CAAQ,CAAA,EAAG,GAAG,CAAC,CAAA;AAC5C,IAAM,YAAA,GAAe,IAAUA,MAAA,CAAA,KAAA,EAAM;AAgE9B,IAAM,iBAAiB,CAAC;AAAA,EAC7B,KAAA;AAAA,EACA,WAAA;AAAA,EACA,gBAAA;AAAA,EACA,UAAA;AAAA,EACA,0BAAA;AAAA,EACA;AACF,CAAA,KAOM;AACJ,EAAA,MAAM;AAAA,IACJ,gBAAA;AAAA,IACA,WAAA;AAAA,IACA,cAAA;AAAA,IACA,kBAAA;AAAA,IACA,mBAAA;AAAA,IACA;AAAA,GACF,GAAI,WAAA;AAEJ,EAAA,MAAM,gBAAgB,aAAA,GAAgB,CAAA;AACtC,EAAA,MAAM,WAAA,GAAc,WAAW,QAAA,CAAS,KAAA;AAExC,EAAA,IAAI,kBAAA,EAAoB;AACtB,IAAA,MAAM,EAAE,KAAA,EAAO,cAAA,EAAe,GAAI,mBAAmB,aAAa,CAAA;AAElE,IAAA,MAAM,mBAAmB,cAAA,CAAe,CAAA,GACpC,eAAe,CAAA,CAAE,0BAA0B,IAC3C,KAAA,CAAM,CAAA;AAEV,IAAA,MAAM,mBAAmB,cAAA,CAAe,CAAA,GACpC,eAAe,CAAA,CAAE,0BAA0B,IAC3C,KAAA,CAAM,CAAA;AAEV,IAAA,MAAM,mBAAmB,cAAA,CAAe,CAAA,GACpC,eAAe,CAAA,CAAE,0BAA0B,IAC3C,KAAA,CAAM,CAAA;AAEV,IAAA,WAAA,CAAY,aAAa,KAAK,gBAAA,GAAmB,KAAA;AACjD,IAAA,WAAA,CAAY,aAAA,GAAgB,CAAC,CAAA,IAAK,gBAAA,GAAmB,KAAA;AACrD,IAAA,WAAA,CAAY,aAAA,GAAgB,CAAC,CAAA,IAAK,gBAAA,GAAmB,KAAA;AAErD,IAAA,UAAA,CAAW,SAAS,WAAA,GAAc,IAAA;AAAA,EACpC;AAEA,EAAA,IAAI,mBAAA,EAAqB;AACvB,IAAA,MAAM,EAAE,KAAA,EAAO,cAAA,EAAgB,cAAA,EAAe,GAC5C,oBAAoB,aAAa,CAAA;AAEnC,IAAA,WAAA,CAAY,aAAa,KAAK,cAAA,CAAe,CAAA;AAC7C,IAAA,WAAA,CAAY,aAAA,GAAgB,CAAC,CAAA,IAAK,cAAA,CAAe,CAAA;AACjD,IAAA,WAAA,CAAY,aAAA,GAAgB,CAAC,CAAA,IAAK,cAAA,CAAe,CAAA;AAEjD,IAAA,MAAM,mBAAmB,cAAA,CAAe,CAAA,GACpC,eAAe,CAAA,CAAE,0BAA0B,IAC3C,KAAA,CAAM,CAAA;AAEV,IAAA,MAAM,mBAAmB,cAAA,CAAe,CAAA,GACpC,eAAe,CAAA,CAAE,0BAA0B,IAC3C,KAAA,CAAM,CAAA;AAEV,IAAA,MAAM,mBAAmB,cAAA,CAAe,CAAA,GACpC,eAAe,CAAA,CAAE,0BAA0B,IAC3C,KAAA,CAAM,CAAA;AAEV,IAAA,YAAA,CAAa,GAAA;AAAA,MACX,gBAAA,GAAmB,KAAA;AAAA,MACnB,gBAAA,GAAmB,KAAA;AAAA,MACnB,gBAAA,GAAmB;AAAA,KACrB;AACA,IAAA,cAAA,CAAe,WAAW,YAAY,CAAA;AAEtC,IAAA,WAAA,CAAY,aAAa,KAAK,cAAA,CAAe,CAAA;AAC7C,IAAA,WAAA,CAAY,aAAA,GAAgB,CAAC,CAAA,IAAK,cAAA,CAAe,CAAA;AACjD,IAAA,WAAA,CAAY,aAAA,GAAgB,CAAC,CAAA,IAAK,cAAA,CAAe,CAAA;AAEjD,IAAA,UAAA,CAAW,SAAS,WAAA,GAAc,IAAA;AAAA,EACpC;AAEA,EAAA,IAAI,gBAAA,CAAiB,iBAAiB,QAAA,EAAU;AAC9C,IAAA,MAAM,UAAA,GAAa,cAAA;AAAA,MACjB,gBAAA;AAAA,MACA,iBAAiB,gBAAA,CAAiB,aAAA;AAAA,MAClC;AAAA,KACF;AACA,IAAA,UAAA,CAAW,KAAK,KAAA,CAAM,aAAa,IACjC,WAAA,CAAY,SAAA,CAAU,aAAa,CAAA,GAAI,UAAA;AACzC,IAAA,UAAA,CAAW,KAAK,WAAA,GAAc,IAAA;AAAA,EAChC;AAEA,EAAA,IAAI,gBAAA,CAAiB,oBAAoB,QAAA,EAAU;AACjD,IAAA,MAAM,UAAA,GAAa,cAAA;AAAA,MACjB,gBAAA;AAAA,MACA,iBAAiB,mBAAA,CAAoB,aAAA;AAAA,MACrC;AAAA,KACF;AACA,IAAA,UAAA,CAAW,OAAO,KAAA,CAAM,aAAa,IACnC,WAAA,CAAY,YAAA,CAAa,aAAa,CAAA,GAAI,UAAA;AAC5C,IAAA,UAAA,CAAW,OAAO,WAAA,GAAc,IAAA;AAAA,EAClC;AAEA,EAAA,IAAI,gBAAA,CAAiB,kBAAkB,QAAA,EAAU;AAC/C,IAAA,MAAM,WAAA,GAAc,cAAA;AAAA,MAClB,gBAAA;AAAA,MACA,iBAAiB,iBAAA,CAAkB,CAAA;AAAA,MACnC;AAAA,KACF;AACA,IAAA,MAAM,WAAA,GAAc,cAAA;AAAA,MAClB,gBAAA;AAAA,MACA,iBAAiB,iBAAA,CAAkB,CAAA;AAAA,MACnC;AAAA,KACF;AACA,IAAA,MAAM,WAAA,GAAc,cAAA;AAAA,MAClB,gBAAA;AAAA,MACA,iBAAiB,iBAAA,CAAkB,CAAA;AAAA,MACnC;AAAA,KACF;AAEA,IAAA,UAAA,CAAW,OAAO,KAAA,CAAM,aAAa,IACnC,WAAA,CAAY,WAAA,CAAY,aAAa,CAAA,GAAI,WAAA;AAC3C,IAAA,UAAA,CAAW,OAAO,KAAA,CAAM,aAAa,IACnC,WAAA,CAAY,WAAA,CAAY,aAAa,CAAA,GAAI,WAAA;AAC3C,IAAA,UAAA,CAAW,OAAO,KAAA,CAAM,aAAa,IACnC,WAAA,CAAY,WAAA,CAAY,aAAa,CAAA,GAAI,WAAA;AAE3C,IAAA,UAAA,CAAW,OAAO,WAAA,GAAc,IAAA;AAChC,IAAA,UAAA,CAAW,OAAO,WAAA,GAAc,IAAA;AAChC,IAAA,UAAA,CAAW,OAAO,WAAA,GAAc,IAAA;AAAA,EAClC;AAEA,EAAA,IAAI,eAAe,oBAAA,EAAsB;AACvC,IAAA,UAAA,CAAW,QAAA,CAAS,MAAM,aAAa,CAAA,IACrC,eAAe,oBAAA,CAAqB,aAAa,IAAI,KAAA,GAAQ,IAAA;AAC/D,IAAA,UAAA,CAAW,SAAS,WAAA,GAAc,IAAA;AAAA,EACpC;AAEA,EAAA,IAAI,MAAM,QAAA,EAAU;AAClB,IAAA,MAAM;AAAA,MACJ,OAAA;AAAA,MACA,QAAA;AAAA,MACA,UAAA;AAAA,MACA,OAAA;AAAA,MACA,cAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA,KACF,GAAI,KAAA;AACJ,IAAA,IAAI,eAAA;AAEJ,IAAA,MAAM,iBACH,0BAAA,IAA8B,OAAA,GAAU,QAAQ,aAAa,CAAA,GAAI,MAClE,EAAA,GACA,QAAA;AAEF,IAAA,UAAA,CAAW,GAAA,CAAI,aAAA,EAAe,CAAA,EAAG,CAAC,CAAA;AAClC,IAAA,eAAA,GAAkB,OAAA,CAAS,KAAK,UAAU,CAAA;AAC1C,IAAA,WAAA,CAAY,aAAa,CAAA,IAAK,eAAA,GAAkB,UAAA,GAAa,cAAA;AAE7D,IAAA,IAAI,mBAAmB,CAAA,EAAG;AACxB,MAAA,UAAA,CAAW,QAAA,CAAS,KAAA,CAAM,aAAa,CAAA,IACrC,kBAAkB,UAAA,GAAa,cAAA;AACjC,MAAA,UAAA,CAAW,SAAS,WAAA,GAAc,IAAA;AAAA,IACpC;AAEA,IAAA,IAAI,eAAe,CAAA,EAAG;AACpB,MAAA,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM,aAAa,CAAA,IACjC,kBAAkB,UAAA,GAAa,UAAA;AACjC,MAAA,UAAA,CAAW,KAAK,WAAA,GAAc,IAAA;AAAA,IAChC;AAEA,IAAA,UAAA,CAAW,GAAA,CAAI,aAAA,EAAe,aAAA,EAAe,CAAC,CAAA;AAC9C,IAAA,eAAA,GAAkB,OAAA,CAAS,KAAK,UAAU,CAAA;AAC1C,IAAA,WAAA,CAAY,aAAA,GAAgB,CAAC,CAAA,IAC3B,eAAA,GAAkB,UAAA,GAAa,cAAA;AAEjC,IAAA,UAAA,CAAW,GAAA,CAAI,aAAA,EAAe,aAAA,EAAe,aAAa,CAAA;AAC1D,IAAA,eAAA,GAAkB,OAAA,CAAS,KAAK,UAAU,CAAA;AAC1C,IAAA,WAAA,CAAY,aAAA,GAAgB,CAAC,CAAA,IAC3B,eAAA,GAAkB,UAAA,GAAa,cAAA;AAEjC,IAAA,UAAA,CAAW,SAAS,WAAA,GAAc,IAAA;AAAA,EACpC;AACF;;;AC/PA,IAAA,oBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,oBAAA,EAAA;AAAA,EAAA,SAAA,EAAA,MAAA,SAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,WAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAAO,IAAM,WAAA,GAAc,CAAC,OAAA,EAAS,OAAA,EAAS,MAAA,GAAS;AAAA,EACnD,mBAAmB,EAAC;AAAA,EACpB,kBAAA,EAAoB;AACxB,CAAA,KAAM;AACF,EAAA,MAAM,SAAS,EAAC;AAChB,EAAA,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,CAAE,OAAA,CAAQ,CAAC,GAAA,KAAQ;AAClC,IAAA,IAAI,CAAC,OAAO,iBAAA,IAAqB,CAAC,OAAO,iBAAA,CAAkB,QAAA,CAAS,GAAG,CAAA,EAAG;AACtE,MAAA,IAAI,OAAO,OAAA,CAAQ,GAAG,CAAA,KAAM,QAAA,IACxB,QAAQ,GAAG,CAAA,IACX,OAAA,CAAQ,GAAG,KACX,CAAC,KAAA,CAAM,QAAQ,OAAA,CAAQ,GAAG,CAAC,CAAA,EAAG;AAC9B,QAAA,MAAA,CAAO,GAAG,IAAI,WAAA,CAAY,OAAA,CAAQ,GAAG,CAAA,EAAG,OAAA,CAAQ,GAAG,CAAA,EAAG,MAAM,CAAA;AAAA,MAChE,CAAA,MACK;AACD,QAAA,MAAA,CAAO,GAAG,CAAA,GACN,OAAA,CAAQ,GAAG,CAAA,KAAM,IACX,CAAA,GACA,OAAA,CAAQ,GAAG,CAAA,KAAM,QACb,KAAA,GACA,OAAA,CAAQ,GAAG,CAAA,IAAK,QAAQ,GAAG,CAAA;AACzC,QAAA,IAAI,MAAA,CAAO,kBAAA;AACP,UAAA,OAAA,CAAQ,GAAG,CAAA,GAAI,MAAA,CAAO,GAAG,CAAA;AAAA,MACjC;AAAA,IACJ;AAAA,EACJ,CAAC,CAAA;AACD,EAAA,OAAO,MAAA;AACX,CAAA;AACO,IAAM,SAAA,GAAY,CAAC,OAAA,EAAS,OAAA,EAAS,MAAA,GAAS;AAAA,EACjD,mBAAmB,EAAC;AAAA,EACpB,kBAAA,EAAoB;AACxB,CAAA,KAAM;AACF,EAAA,MAAM,SAAS,EAAC;AAChB,EAAA,KAAA,CAAM,IAAA,qBAAS,GAAA,CAAI;AAAA,IACf,GAAG,MAAA,CAAO,IAAA,CAAM,OAAA,IAAW,EAAG,CAAA;AAAA,IAC9B,GAAG,MAAA,CAAO,IAAA,CAAM,OAAA,IAAW,EAAG;AAAA,GACjC,CAAC,CAAA,CAAE,OAAA,CAAQ,CAAC,GAAA,KAAQ;AACjB,IAAA,IAAI,CAAC,OAAO,iBAAA,IAAqB,CAAC,OAAO,iBAAA,CAAkB,QAAA,CAAS,GAAG,CAAA,EAAG;AACtE,MAAA,IAAI,OAAO,OAAA,GAAU,GAAG,CAAA,KAAM,QAAA,IAC1B,UAAU,GAAG,CAAA,IACb,OAAA,GAAU,GAAG,KACb,CAAC,KAAA,CAAM,QAAQ,OAAA,CAAQ,GAAG,CAAC,CAAA,EAAG;AAC9B,QAAA,MAAA,CAAO,GAAG,IAAI,SAAA,CAAU,OAAA,CAAQ,GAAG,CAAA,EAAG,OAAA,CAAQ,GAAG,CAAA,EAAG,MAAM,CAAA;AAAA,MAC9D,CAAA,MACK;AACD,QAAA,MAAA,CAAO,GAAG,CAAA,GACN,OAAA,GAAU,GAAG,CAAA,KAAM,IACb,CAAA,GACA,OAAA,GAAU,GAAG,CAAA,KAAM,QACf,KAAA,GACA,OAAA,GAAU,GAAG,CAAA,IAAK,UAAU,GAAG,CAAA;AAC7C,QAAA,IAAI,MAAA,CAAO,kBAAA;AACP,UAAA,OAAA,CAAQ,GAAG,CAAA,GAAI,MAAA,CAAO,GAAG,CAAA;AAAA,MACjC;AAAA,IACJ;AAAA,EACJ,CAAC,CAAA;AACD,EAAA,OAAO,MAAA;AACX,CAAA;AACO,IAAM,aAAA,GAAgB,CAAC,OAAA,EAAS,OAAA,EAAS,SAAS,EAAE,iBAAA,EAAmB,EAAC,EAAE,KAAM;AACnF,EAAA,MAAM,SAAS,EAAC;AAChB,EAAA,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,CAAE,OAAA,CAAQ,CAAC,GAAA,KAAQ;AAClC,IAAA,IAAI,CAAC,OAAO,iBAAA,IAAqB,CAAC,OAAO,iBAAA,CAAkB,QAAA,CAAS,GAAG,CAAA,EAAG;AACtE,MAAA,IAAI,OAAO,OAAA,CAAQ,GAAG,CAAA,KAAM,QAAA,IACxB,QAAQ,GAAG,CAAA,IACX,OAAA,CAAQ,GAAG,KACX,CAAC,KAAA,CAAM,QAAQ,OAAA,CAAQ,GAAG,CAAC,CAAA,EAAG;AAC9B,QAAA,MAAM,UAAA,GAAa,cAAc,OAAA,CAAQ,GAAG,GAAG,OAAA,CAAQ,GAAG,GAAG,MAAM,CAAA;AACnE,QAAA,IAAI,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,CAAE,MAAA,GAAS,CAAA;AACjC,UAAA,MAAA,CAAO,GAAG,CAAA,GAAI,UAAA;AAAA,MACtB,CAAA,MACK;AACD,QAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,GAAG,CAAA,KAAM,CAAA,GAC/B,IACA,OAAA,CAAQ,GAAG,CAAA,IAAK,OAAA,CAAQ,GAAG,CAAA;AACjC,QAAA,IAAI,WAAA,KAAgB,QAAQ,GAAG,CAAA;AAC3B,UAAA,MAAA,CAAO,GAAG,CAAA,GAAI,WAAA;AAAA,MACtB;AAAA,IACJ;AAAA,EACJ,CAAC,CAAA;AACD,EAAA,OAAO,MAAA;AACX,CAAA;;;AC7EA,IAAM,OAAO,WAAY;AAAC,CAAA;AAC1B,IAAA,CAAK,UAAU,IAAA,GAAO,IAAA;AACtB,IAAA,CAAK,UAAU,KAAA,GAAQ,IAAA;AAGhB,IAAM,SAAA,GAAY,IAAA;ACFN,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,CAAA,IAAK,OAAO;AAAA,EAChD,MAAA,EAAQ,IAAI,SAAA,EAAU;AAAA,EACtB,MAAA,EAAQ;AACZ,CAAA,CAAE;AAEqB,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,CAAA,IAAK,OAAO;AAAA,EACpD,MAAA,EAAQ,IAAUC,MAAA,CAAA,aAAA,EAAc;AAAA,EAChC,MAAA,EAAQ;AACZ,CAAA,CAAE;AAEmB,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,CAAA,IAAK,OAAO;AAAA,EAClD,MAAA,EAAQ,IAAUA,MAAA,CAAA,WAAA,EAAY;AAAA,EAC9B,MAAA,EAAQ;AACZ,CAAA,CAAE;AChBF,IAAI,kBAAA,GAAqB,u0FAAA;AAEzB,IAAI,CAAA,GAAI;AAAA,EACN,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,CAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,CAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,CAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,CAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,CAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,CAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,CAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,CAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,CAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EAC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","file":"three-particles.min.js","sourcesContent":["// Linear easing.\n//\n// @class Easing.Linear\nconst Linear = k => k\n\n// Quadratic easing.\n//\n// @class Easing.Quadratic\nconst Quadratic = {\n\n // Ease-in.\n //\n // @method Easing.Quadratic#In\n // @param {number} k - The value to be tweened.\n // @returns {number} k^2.\n In (k) {\n return k * k\n },\n\n // Ease-out.\n //\n // @method Easing.Quadratic#Out\n // @param {number} k - The value to be tweened.\n // @returns {number} k * (2 - k).\n Out (k) {\n return k * (2 - k)\n },\n\n // Ease-in/out.\n //\n // @method Easing.Quadratic#InOut\n // @param {number} k - The value to be tweened.\n // @returns {number} The tweened value.\n InOut (k) {\n let dk = k * 2\n if (dk < 1) {\n return 0.5 * dk * dk\n }\n dk -= 1\n return - 0.5 * (dk * (dk - 2) - 1)\n }\n\n}\n\n// Cubic easing.\n//\n// @class Easing.Cubic\nconst Cubic = {\n\n // Cubic ease-in.\n //\n // @method Easing.Cubic#In\n // @param {number} k - The value to be tweened.\n // @returns {number} The tweened value.\n In (k) {\n return k * k * k\n },\n\n // Cubic ease-out.\n //\n // @method Easing.Cubic#Out\n // @param {number} k - The value to be tweened.\n // @returns {number} The tweened value.\n Out (k) {\n return -- k * k * k + 1\n },\n\n // Cubic ease-in/out.\n //\n // @method Easing.Cubic#InOut\n // @param {number} k - The value to be tweened.\n // @returns {number} The tweened value.\n InOut (k) {\n let dk = k * 2\n if (dk < 1) {\n return 0.5 * dk * dk * dk\n }\n dk -= 2\n return 0.5 * (dk * dk * dk + 2)\n }\n\n}\n\n// Quartic easing.\n//\n// @class Easing.Quartic\nconst Quartic = {\n\n // Quartic ease-in.\n //\n // @method Easing.Quartic#In\n // @param {number} k - The value to be tweened.\n // @returns {number} The tweened value.\n In (k) {\n return k * k * k * k\n },\n\n // Quartic ease-out.\n //\n // @method Easing.Quartic#Out\n // @param {number} k - The value to be tweened.\n // @returns {number} The tweened value.\n Out (k) {\n return 1 - (-- k * k * k * k)\n },\n\n // Quartic ease-in/out.\n //\n // @method Easing.Quartic#InOut\n // @param {number} k - The value to be tweened.\n // @returns {number} The tweened value.\n InOut (k) {\n let dk = k * 2\n if (dk < 1) {\n return 0.5 * dk * dk * dk * dk\n }\n dk -= 2\n return - 0.5 * (dk * dk * dk * dk - 2)\n }\n\n}\n\n// Quintic easing.\n//\n// @class Easing.Quintic\nconst Quintic = {\n\n // Quintic ease-in.\n //\n // @method Easing.Quintic#In\n // @param {number} k - The value to be tweened.\n // @returns {number} The tweened value.\n In (k) {\n return k * k * k * k * k\n },\n\n // Quintic ease-out.\n //\n // @method Easing.Quintic#Out\n // @param {number} k - The value to be tweened.\n // @returns {number} The tweened value.\n Out (k) {\n return -- k * k * k * k * k + 1\n },\n\n // Quintic ease-in/out.\n //\n // @method Easing.Quintic#InOut\n // @param {number} k - The value to be tweened.\n // @returns {number} The tweened value.\n InOut (k) {\n let dk = k * 2\n if (dk < 1) {\n return 0.5 * dk * dk * dk * dk * dk\n }\n dk -= 2\n return 0.5 * (dk * dk * dk * dk * dk + 2)\n }\n\n}\n\n// Sinusoidal easing.\n//\n// @class Easing.Sinusoidal\nconst Sinusoidal = {\n\n // Sinusoidal ease-in.\n //\n // @method Easing.Sinusoidal#In\n // @param {number} k - The value to be tweened.\n // @returns {number} The tweened value.\n In (k) {\n return 1 - Math.cos(k * Math.PI / 2)\n },\n\n // Sinusoidal ease-out.\n //\n // @method Easing.Sinusoidal#Out\n // @param {number} k - The value to be tweened.\n // @returns {number} The tweened value.\n Out (k) {\n return Math.sin(k * Math.PI / 2)\n },\n\n // Sinusoidal ease-in/out.\n //\n // @method Easing.Sinusoidal#InOut\n // @param {number} k - The value to be tweened.\n // @returns {number} The tweened value.\n InOut (k) {\n return 0.5 * (1 - Math.cos(Math.PI * k))\n }\n\n}\n\n// Exponential easing.\n//\n// @class Easing.Exponential\nconst Exponential = {\n\n // Exponential ease-in.\n //\n // @method Easing.Exponential#In\n // @param {number} k - The value to be tweened.\n // @returns {number} The tweened value.\n In (k) {\n return k === 0 ? 0 : 1024 ** (k - 1)\n },\n\n // Exponential ease-out.\n //\n // @method Easing.Exponential#Out\n // @param {number} k - The value to be tweened.\n // @returns {number} The tweened value.\n Out (k) {\n return k === 1 ? 1 : 1 - (2 ** (- 10 * k))\n },\n\n // Exponential ease-in/out.\n //\n // @method Easing.Exponential#InOut\n // @param {number} k - The value to be tweened.\n // @returns {number} The tweened value.\n InOut (k) {\n if (k === 0) return 0\n if (k === 1) return 1\n const dk = k * 2\n if (dk < 1) {\n return 0.5 * (1024 ** (dk - 1))\n }\n return 0.5 * (- (2 ** (- 10 * (dk - 1))) + 2)\n }\n\n}\n\n// Circular easing.\n//\n// @class Easing.Circular\nconst Circular = {\n\n // Circular ease-in.\n //\n // @method Easing.Circular#In\n // @param {number} k - The value to be tweened.\n // @returns {number} The tweened value.\n In (k) {\n return 1 - Math.sqrt(1 - k * k)\n },\n\n // Circular ease-out.\n //\n // @method Easing.Circular#Out\n // @param {number} k - The value to be tweened.\n // @returns {number} The tweened value.\n Out (k) {\n return Math.sqrt(1 - (-- k * k))\n },\n\n // Circular ease-in/out.\n //\n // @method Easing.Circular#InOut\n // @param {number} k - The value to be tweened.\n // @returns {number} The tweened value.\n InOut (k) {\n let dk = k * 2\n if (dk < 1) {\n return - 0.5 * (Math.sqrt(1 - dk * dk) - 1)\n }\n dk -= 2\n return 0.5 * (Math.sqrt(1 - dk * dk) + 1)\n }\n\n}\n\n// Elastic easing.\n//\n// @class Easing.Elastic\nconst Elastic = {\n\n // Elastic ease-in.\n //\n // @method Easing.Elastic#In\n // @param {number} k - The value to be tweened.\n // @returns {number} The tweened value.\n In (k) {\n let a = 0.1\n const p = 0.4\n let s\n if (k === 0) return 0\n if (k === 1) return 1\n if (a < 1) {\n a = 1\n s = p / 4\n } else {\n s = p * Math.asin(1 / a) / (2 * Math.PI)\n }\n k -= 1\n return - (a * (2 ** (10 * k)) * Math.sin((k - s) * (2 * Math.PI) / p))\n },\n\n // Elastic ease-out.\n //\n // @method Easing.Elastic#Out\n // @param {number} k - The value to be tweened.\n // @returns {number} The tweened value.\n Out (k) {\n let a = 0.1\n const p = 0.4\n let s\n if (k === 0) return 0\n if (k === 1) return 1\n if (a < 1) {\n a = 1\n s = p / 4\n } else {\n s = p * Math.asin(1 / a) / (2 * Math.PI)\n }\n return (a * (2 ** (- 10 * k)) * Math.sin((k - s) * (2 * Math.PI) / p) + 1)\n },\n\n // Elastic ease-in/out.\n //\n // @method Easing.Elastic#InOut\n // @param {number} k - The value to be tweened.\n // @returns {number} The tweened value.\n InOut (k) {\n let a = 0.1\n const p = 0.4\n let s\n if (k === 0) return 0\n if (k === 1) return 1\n if (a < 1) {\n a = 1\n s = p / 4\n } else {\n s = p * Math.asin(1 / a) / (2 * Math.PI)\n }\n const dk = k * 2\n if (dk < 1) {\n const kInner = dk - 1\n return - 0.5 * (a * (2 ** (10 * kInner)) * Math.sin((kInner - s) * (2 * Math.PI) / p))\n }\n const kInner = dk - 1\n return a * (2 ** (- 10 * kInner)) * Math.sin((kInner - s) * (2 * Math.PI) / p) * 0.5 + 1\n }\n\n}\n\n// Back easing.\n//\n// @class Easing.Back\nconst Back = {\n\n // Back ease-in.\n //\n // @method Easing.Back#In\n // @param {number} k - The value to be tweened.\n // @returns {number} The tweened value.\n In (k) {\n const s = 1.70158\n return k * k * ((s + 1) * k - s)\n },\n\n // Back ease-out.\n //\n // @method Easing.Back#Out\n // @param {number} k - The value to be tweened.\n // @returns {number} The tweened value.\n Out (k) {\n const s = 1.70158\n return -- k * k * ((s + 1) * k + s) + 1\n },\n\n // Back ease-in/out.\n //\n // @method Easing.Back#InOut\n // @param {number} k - The value to be tweened.\n // @returns {number} The tweened value.\n InOut (k) {\n const s = 1.70158 * 1.525\n let dk = k * 2\n if (dk < 1) {\n return 0.5 * (dk * dk * ((s + 1) * dk - s))\n }\n dk -= 2\n return 0.5 * (dk * dk * ((s + 1) * dk + s) + 2)\n }\n\n}\n\n// Bounce easing.\n//\n// @class Easing.Bounce\nconst Bounce = {\n\n // Bounce ease-in.\n //\n // @method Easing.Bounce#In\n // @param {number} k - The value to be tweened.\n // @returns {number} The tweened value.\n In (k) {\n return 1 - Bounce.Out(1 - k)\n },\n\n // Bounce ease-out.\n //\n // @method Easing.Bounce#Out\n // @param {number} k - The value to be tweened.\n // @returns {number} The tweened value.\n Out (k) {\n if (k < 1 / 2.75) {\n return 7.5625 * k * k\n } if (k < 2 / 2.75) {\n const k2 = k - (1.5 / 2.75)\n return 7.5625 * k2 * k2 + 0.75\n } if (k < 2.5 / 2.75) {\n const k2 = k - (2.25 / 2.75)\n return 7.5625 * k2 * k2 + 0.9375\n }\n const k2 = k - (2.625 / 2.75)\n return 7.5625 * k2 * k2 + 0.984375\n },\n\n // Bounce ease-in/out.\n //\n // @method Easing.Bounce#InOut\n // @param {number} k - The value to be tweened.\n // @returns {number} The tweened value.\n InOut (k) {\n if (k < 0.5) return Bounce.In(k * 2) * 0.5\n return Bounce.Out(k * 2 - 1) * 0.5 + 0.5\n }\n\n}\n\nconst Easing = {\n Quadratic,\n Cubic,\n Quartic,\n Quintic,\n Sinusoidal,\n Exponential,\n Circular,\n Elastic,\n Back,\n Bounce,\n}\n\nconst define = (obj, key, value) => Object.defineProperty(obj, key, {\n value\n})\n\nfor (const key of Object.keys(Easing)) {\n const obj = Easing[key]\n const lowerKey = key.toLowerCase()\n define(Easing, lowerKey, obj)\n\n for (const prop of Object.keys(obj)) {\n const fn = obj[prop]\n const lowerProp = prop.toLowerCase()\n\n // Easing['Quadratic.In']\n define(Easing, `${key}.${prop}`, fn)\n\n // Easing['quadratic.in']\n define(Easing, `${lowerKey}.${lowerProp}`, fn)\n define(obj, lowerProp, fn)\n }\n}\n\nEasing.Linear = Linear\ndefine(Easing, 'linear', Linear)\n\nmodule.exports = Easing\n\nif (typeof window !== 'undefined') {\n window.Easing = Easing\n}\n","import { BezierPoint, CurveFunction } from './types.js';\n\nconst cache: Array<{\n bezierPoints: Array<BezierPoint>;\n curveFunction: CurveFunction;\n referencedBy: Array<number>;\n}> = [];\n\nconst nCr = (n: number, k: number) => {\n let z = 1;\n for (let i = 1; i <= k; i++) z *= (n + 1 - i) / i;\n return z;\n};\n\nexport const createBezierCurveFunction = (\n particleSystemId: number,\n bezierPoints: Array<BezierPoint>\n) => {\n const cacheEntry = cache.find((item) => item.bezierPoints === bezierPoints);\n\n if (cacheEntry) {\n if (!cacheEntry.referencedBy.includes(particleSystemId))\n cacheEntry.referencedBy.push(particleSystemId);\n return cacheEntry.curveFunction;\n }\n\n const entry = {\n referencedBy: [particleSystemId],\n bezierPoints,\n curveFunction: (percentage: number): number => {\n if (percentage < 0) return bezierPoints[0].y;\n if (percentage > 1) return bezierPoints[bezierPoints.length - 1].y;\n\n let start = 0;\n let stop = bezierPoints.length - 1;\n\n bezierPoints.find((point, index) => {\n const result = percentage < (point.percentage ?? 0);\n if (result) stop = index;\n else if (point.percentage !== undefined) start = index;\n return result;\n });\n\n const n = stop - start;\n const calculatedPercentage =\n (percentage - (bezierPoints[start].percentage ?? 0)) /\n ((bezierPoints[stop].percentage ?? 1) -\n (bezierPoints[start].percentage ?? 0));\n\n let value = 0;\n for (let i = 0; i <= n; i++) {\n const p = bezierPoints[start + i];\n const c =\n nCr(n, i) *\n Math.pow(1 - calculatedPercentage, n - i) *\n Math.pow(calculatedPercentage, i);\n value += c * p.y;\n }\n return value;\n },\n };\n\n cache.push(entry);\n return entry.curveFunction;\n};\n\nexport const removeBezierCurveFunction = (particleSystemId: number) => {\n while (true) {\n const index = cache.findIndex((item) =>\n item.referencedBy.includes(particleSystemId)\n );\n if (index === -1) break;\n const entry = cache[index];\n entry.referencedBy = entry.referencedBy.filter(\n (id) => id !== particleSystemId\n );\n if (entry.referencedBy.length === 0) cache.splice(index, 1);\n }\n};\n\nexport const getBezierCacheSize = () => cache.length;\n","import Easing from 'easing-functions';\nimport { CurveFunction } from './types.js';\n\n/**\n * Predefined easing function identifiers for animating particle properties\n * over their lifetime.\n *\n * These functions control the rate of change and create different animation\n * feels. Each type has three variants:\n * - **IN**: Starts slow, accelerates toward the end\n * - **OUT**: Starts fast, decelerates toward the end\n * - **IN_OUT**: Combines both, slow at start and end, fast in middle\n *\n * @enum {string}\n *\n * @see {@link https://easings.net/} - Visual reference for easing functions\n */\nexport const enum CurveFunctionId {\n /** Use custom Bezier curve (not an easing function) */\n BEZIER = 'BEZIER',\n\n /** Linear interpolation with constant rate of change */\n LINEAR = 'LINEAR',\n\n /** Quadratic (t²) easing - gentle acceleration */\n QUADRATIC_IN = 'QUADRATIC_IN',\n /** Quadratic (t²) easing - gentle deceleration */\n QUADRATIC_OUT = 'QUADRATIC_OUT',\n /** Quadratic (t²) easing - gentle acceleration then deceleration */\n QUADRATIC_IN_OUT = 'QUADRATIC_IN_OUT',\n\n /** Cubic (t³) easing - moderate acceleration */\n CUBIC_IN = 'CUBIC_IN',\n /** Cubic (t³) easing - moderate deceleration */\n CUBIC_OUT = 'CUBIC_OUT',\n /** Cubic (t³) easing - moderate acceleration then deceleration */\n CUBIC_IN_OUT = 'CUBIC_IN_OUT',\n\n /** Quartic (t⁴) easing - strong acceleration */\n QUARTIC_IN = 'QUARTIC_IN',\n /** Quartic (t⁴) easing - strong deceleration */\n QUARTIC_OUT = 'QUARTIC_OUT',\n /** Quartic (t⁴) easing - strong acceleration then deceleration */\n QUARTIC_IN_OUT = 'QUARTIC_IN_OUT',\n\n /** Quintic (t⁵) easing - very strong acceleration */\n QUINTIC_IN = 'QUINTIC_IN',\n /** Quintic (t⁵) easing - very strong deceleration */\n QUINTIC_OUT = 'QUINTIC_OUT',\n /** Quintic (t⁵) easing - very strong acceleration then deceleration */\n QUINTIC_IN_OUT = 'QUINTIC_IN_OUT',\n\n /** Sinusoidal easing - smooth, natural acceleration */\n SINUSOIDAL_IN = 'SINUSOIDAL_IN',\n /** Sinusoidal easing - smooth, natural deceleration */\n SINUSOIDAL_OUT = 'SINUSOIDAL_OUT',\n /** Sinusoidal easing - smooth acceleration then deceleration */\n SINUSOIDAL_IN_OUT = 'SINUSOIDAL_IN_OUT',\n\n /** Exponential easing - dramatic, explosive acceleration */\n EXPONENTIAL_IN = 'EXPONENTIAL_IN',\n /** Exponential easing - dramatic, explosive deceleration */\n EXPONENTIAL_OUT = 'EXPONENTIAL_OUT',\n /** Exponential easing - dramatic acceleration then deceleration */\n EXPONENTIAL_IN_OUT = 'EXPONENTIAL_IN_OUT',\n\n /** Circular easing - sharp acceleration with curved trajectory */\n CIRCULAR_IN = 'CIRCULAR_IN',\n /** Circular easing - sharp deceleration with curved trajectory */\n CIRCULAR_OUT = 'CIRCULAR_OUT',\n /** Circular easing - sharp acceleration then deceleration */\n CIRCULAR_IN_OUT = 'CIRCULAR_IN_OUT',\n\n /** Elastic easing - oscillates back before accelerating (spring-like) */\n ELASTIC_IN = 'ELASTIC_IN',\n /** Elastic easing - overshoots then oscillates back (spring-like) */\n ELASTIC_OUT = 'ELASTIC_OUT',\n /** Elastic easing - oscillates at both ends (spring-like) */\n ELASTIC_IN_OUT = 'ELASTIC_IN_OUT',\n\n /** Back easing - pulls back before accelerating forward */\n BACK_IN = 'BACK_IN',\n /** Back easing - overshoots forward then pulls back */\n BACK_OUT = 'BACK_OUT',\n /** Back easing - pulls back, overshoots, then settles */\n BACK_IN_OUT = 'BACK_IN_OUT',\n\n /** Bounce easing - bounces at the start */\n BOUNCE_IN = 'BOUNCE_IN',\n /** Bounce easing - bounces at the end (like a ball landing) */\n BOUNCE_OUT = 'BOUNCE_OUT',\n /** Bounce easing - bounces at both start and end */\n BOUNCE_IN_OUT = 'BOUNCE_IN_OUT',\n}\n\nconst CurveFunctionIdMap: Partial<Record<CurveFunctionId, CurveFunction>> = {\n [CurveFunctionId.LINEAR]: Easing.Linear.None,\n [CurveFunctionId.QUADRATIC_IN]: Easing.Quadratic.In,\n [CurveFunctionId.QUADRATIC_OUT]: Easing.Quadratic.Out,\n [CurveFunctionId.QUADRATIC_IN_OUT]: Easing.Quadratic.InOut,\n [CurveFunctionId.CUBIC_IN]: Easing.Cubic.In,\n [CurveFunctionId.CUBIC_OUT]: Easing.Cubic.Out,\n [CurveFunctionId.CUBIC_IN_OUT]: Easing.Cubic.InOut,\n [CurveFunctionId.QUARTIC_IN]: Easing.Quartic.In,\n [CurveFunctionId.QUARTIC_OUT]: Easing.Quartic.Out,\n [CurveFunctionId.QUARTIC_IN_OUT]: Easing.Quartic.InOut,\n [CurveFunctionId.QUINTIC_IN]: Easing.Quintic.In,\n [CurveFunctionId.QUINTIC_OUT]: Easing.Quintic.Out,\n [CurveFunctionId.QUINTIC_IN_OUT]: Easing.Quintic.InOut,\n [CurveFunctionId.SINUSOIDAL_IN]: Easing.Sinusoidal.In,\n [CurveFunctionId.SINUSOIDAL_OUT]: Easing.Sinusoidal.Out,\n [CurveFunctionId.SINUSOIDAL_IN_OUT]: Easing.Sinusoidal.InOut,\n [CurveFunctionId.EXPONENTIAL_IN]: Easing.Exponential.In,\n [CurveFunctionId.EXPONENTIAL_OUT]: Easing.Exponential.Out,\n [CurveFunctionId.EXPONENTIAL_IN_OUT]: Easing.Exponential.InOut,\n [CurveFunctionId.CIRCULAR_IN]: Easing.Circular.In,\n [CurveFunctionId.CIRCULAR_OUT]: Easing.Circular.Out,\n [CurveFunctionId.CIRCULAR_IN_OUT]: Easing.Circular.InOut,\n [CurveFunctionId.ELASTIC_IN]: Easing.Elastic.In,\n [CurveFunctionId.ELASTIC_OUT]: Easing.Elastic.Out,\n [CurveFunctionId.ELASTIC_IN_OUT]: Easing.Elastic.InOut,\n [CurveFunctionId.BACK_IN]: Easing.Back.In,\n [CurveFunctionId.BACK_OUT]: Easing.Back.Out,\n [CurveFunctionId.BACK_IN_OUT]: Easing.Back.InOut,\n [CurveFunctionId.BOUNCE_IN]: Easing.Bounce.In,\n [CurveFunctionId.BOUNCE_OUT]: Easing.Bounce.Out,\n [CurveFunctionId.BOUNCE_IN_OUT]: Easing.Bounce.InOut,\n};\n\n/**\n * Resolves a curve function from an identifier or returns the function itself.\n *\n * This utility function allows you to use either a {@link CurveFunctionId} string\n * identifier or a custom function directly.\n *\n * @param curveFunctionId - Either a {@link CurveFunctionId} enum value or a\n * custom {@link CurveFunction} implementation\n * @returns The actual easing function that takes a normalized time value (0-1)\n * and returns the eased value\n *\n * @example\n * ```typescript\n * import { getCurveFunction, CurveFunctionId } from '@newkrok/three-particles';\n *\n * // Using a predefined easing function\n * const easingFunc = getCurveFunction(CurveFunctionId.CUBIC_OUT);\n * console.log(easingFunc(0.5)); // Returns eased value at 50% progress\n *\n * // Using a custom function\n * const customEasing = (t: number) => t * t; // Quadratic\n * const customFunc = getCurveFunction(customEasing);\n * console.log(customFunc(0.5)); // Returns 0.25\n * ```\n */\nexport const getCurveFunction = (\n curveFunctionId: CurveFunctionId | CurveFunction\n): CurveFunction =>\n typeof curveFunctionId === 'function'\n ? curveFunctionId\n : CurveFunctionIdMap[curveFunctionId]!;\n","/**\n * Defines the coordinate space in which particles are simulated.\n *\n * @enum {string}\n */\nexport const enum SimulationSpace {\n /**\n * Particles move relative to the emitter's local coordinate system.\n * When the emitter moves or rotates, particles move with it.\n * Ideal for effects attached to moving objects (e.g., engine trails, character auras).\n */\n LOCAL = 'LOCAL',\n\n /**\n * Particles move in world space and are independent of the emitter's transform.\n * Once emitted, particles remain stationary or move according to their velocity in world coordinates.\n * Ideal for environmental effects (e.g., smoke, explosions, ambient particles).\n */\n WORLD = 'WORLD',\n}\n\n/**\n * Defines the geometric shape from which particles are emitted.\n *\n * @enum {string}\n */\nexport const enum Shape {\n /**\n * Emit particles from a spherical volume or shell.\n * Configure with {@link Sphere} properties (radius, arc, radiusThickness).\n */\n SPHERE = 'SPHERE',\n\n /**\n * Emit particles from a conical volume or shell.\n * Configure with {@link Cone} properties (angle, radius, arc, radiusThickness).\n * Useful for directional effects like fire, smoke plumes, or spray effects.\n */\n CONE = 'CONE',\n\n /**\n * Emit particles from a box volume, shell, or edges.\n * Configure with {@link Box} properties (scale, emitFrom).\n * Useful for area-based effects like dust clouds or rain.\n */\n BOX = 'BOX',\n\n /**\n * Emit particles from a circular area or edge.\n * Configure with {@link Circle} properties (radius, arc, radiusThickness).\n * Useful for ground impacts, rings, or radial effects.\n */\n CIRCLE = 'CIRCLE',\n\n /**\n * Emit particles from a rectangular area.\n * Configure with {@link Rectangle} properties (scale, rotation).\n * Useful for planar effects like rain on a surface or screen effects.\n */\n RECTANGLE = 'RECTANGLE',\n}\n\n/**\n * Defines where on a shape particles are emitted from.\n * Not all shapes support all emit modes.\n *\n * @enum {string}\n */\nexport const enum EmitFrom {\n /**\n * Emit particles from random positions within the entire volume of the shape.\n * Supported by: SPHERE, CONE, BOX.\n */\n VOLUME = 'VOLUME',\n\n /**\n * Emit particles from the surface/shell of the shape.\n * Supported by: SPHERE, CONE, BOX.\n */\n SHELL = 'SHELL',\n\n /**\n * Emit particles from the edges of the shape.\n * Supported by: BOX.\n */\n EDGE = 'EDGE',\n}\n\n/**\n * Defines how texture sheet animation is timed.\n *\n * @enum {string}\n */\nexport const enum TimeMode {\n /**\n * Animation frames are based on the particle's lifetime percentage.\n * The animation completes once over the particle's lifetime.\n */\n LIFETIME = 'LIFETIME',\n\n /**\n * Animation frames are based on frames per second (FPS).\n * The animation runs at a fixed speed regardless of particle lifetime.\n */\n FPS = 'FPS',\n}\n\n/**\n * Defines the type of curve function used for animating values over a particle's lifetime.\n *\n * @enum {string}\n */\nexport const enum LifeTimeCurve {\n /**\n * Use custom Bezier curves with control points.\n * Provides maximum control over the animation curve shape.\n * See {@link BezierCurve} for configuration.\n */\n BEZIER = 'BEZIER',\n\n /**\n * Use predefined easing functions (e.g., easeInQuad, easeOutCubic).\n * Convenient for common animation patterns.\n * See {@link EasingCurve} and {@link CurveFunctionId} for available functions.\n */\n EASING = 'EASING',\n}\n\n/**\n * Defines when a sub-emitter is triggered relative to a particle's lifecycle.\n *\n * @enum {string}\n */\nexport const enum SubEmitterTrigger {\n /**\n * Trigger the sub-emitter when a particle is born (activated).\n * Useful for trail effects that start immediately with each particle.\n */\n BIRTH = 'BIRTH',\n\n /**\n * Trigger the sub-emitter when a particle dies (reaches end of lifetime).\n * Useful for cascading effects like explosions spawning smoke.\n */\n DEATH = 'DEATH',\n}\n","import * as THREE from 'three';\n\nimport { createBezierCurveFunction } from './three-particles-bezier.js';\nimport { EmitFrom, LifeTimeCurve } from './three-particles-enums.js';\nimport {\n Constant,\n LifetimeCurve,\n Point3D,\n RandomBetweenTwoConstants,\n} from './types.js';\n\n/**\n * Calculates random position and velocity for particles emitted from a sphere.\n *\n * Supports emission from the entire volume or just the shell of the sphere.\n * Uses spherical coordinates for uniform distribution across the surface.\n *\n * @param position - Output vector for the particle's starting position\n * @param quaternion - Rotation to apply to the emission shape\n * @param velocity - Output vector for the particle's initial velocity\n * @param speed - Speed multiplier for the velocity\n * @param params - Sphere configuration\n * @param params.radius - Radius of the sphere\n * @param params.radiusThickness - Controls emission from volume (1.0) vs shell (0.0)\n * @param params.arc - Arc angle in degrees (360 = full sphere, 180 = hemisphere)\n *\n * @remarks\n * - `radiusThickness = 1.0`: Emit from entire volume\n * - `radiusThickness = 0.0`: Emit only from surface shell\n * - Particles are emitted radially outward from the center\n *\n * @see {@link Sphere} - Configuration type for sphere shape\n */\nexport const calculateRandomPositionAndVelocityOnSphere = (\n position: THREE.Vector3,\n quaternion: THREE.Quaternion,\n velocity: THREE.Vector3,\n speed: number,\n {\n radius,\n radiusThickness,\n arc,\n }: { radius: number; radiusThickness: number; arc: number }\n) => {\n const u = Math.random() * (arc / 360);\n const v = Math.random();\n const randomizedDistanceRatio = Math.random();\n const theta = 2 * Math.PI * u;\n const phi = Math.acos(2 * v - 1);\n const sinPhi = Math.sin(phi);\n\n const xDirection = sinPhi * Math.cos(theta);\n const yDirection = sinPhi * Math.sin(theta);\n const zDirection = Math.cos(phi);\n const normalizedThickness = 1 - radiusThickness;\n\n position.x =\n radius * normalizedThickness * xDirection +\n radius * radiusThickness * randomizedDistanceRatio * xDirection;\n position.y =\n radius * normalizedThickness * yDirection +\n radius * radiusThickness * randomizedDistanceRatio * yDirection;\n position.z =\n radius * normalizedThickness * zDirection +\n radius * radiusThickness * randomizedDistanceRatio * zDirection;\n\n position.applyQuaternion(quaternion);\n\n const speedMultiplierByPosition = 1 / position.length();\n velocity.set(\n position.x * speedMultiplierByPosition * speed,\n position.y * speedMultiplierByPosition * speed,\n position.z * speedMultiplierByPosition * speed\n );\n velocity.applyQuaternion(quaternion);\n};\n\n/**\n * Calculates random position and velocity for particles emitted from a cone.\n *\n * Useful for directional particle effects like fire, smoke plumes, fountains,\n * or spray effects. The cone emits particles in a spreading pattern.\n *\n * @param position - Output vector for the particle's starting position\n * @param quaternion - Rotation to apply to the emission shape\n * @param velocity - Output vector for the particle's initial velocity\n * @param speed - Speed multiplier for the velocity\n * @param params - Cone configuration\n * @param params.radius - Base radius of the cone\n * @param params.radiusThickness - Controls emission from volume (1.0) vs shell (0.0)\n * @param params.arc - Arc angle in degrees (360 = full cone, 180 = half cone)\n * @param params.angle - Cone opening angle in degrees (default: 90)\n * Smaller values create tighter cones\n *\n * @remarks\n * - The cone emits from its base (circular area) outward\n * - Particles travel in a conical spread pattern\n * - `angle = 0`: Straight line (no spread)\n * - `angle = 90`: Wide cone\n * - Common for fire (10-30°), smoke (30-60°), explosions (60-90°)\n *\n * @see {@link Cone} - Configuration type for cone shape\n */\nexport const calculateRandomPositionAndVelocityOnCone = (\n position: THREE.Vector3,\n quaternion: THREE.Quaternion,\n velocity: THREE.Vector3,\n speed: number,\n {\n radius,\n radiusThickness,\n arc,\n angle = 90,\n }: {\n radius: number;\n radiusThickness: number;\n arc: number;\n angle?: number;\n }\n) => {\n const theta = 2 * Math.PI * Math.random() * (arc / 360);\n const randomizedDistanceRatio = Math.random();\n\n const xDirection = Math.cos(theta);\n const yDirection = Math.sin(theta);\n const normalizedThickness = 1 - radiusThickness;\n\n position.x =\n radius * normalizedThickness * xDirection +\n radius * radiusThickness * randomizedDistanceRatio * xDirection;\n position.y =\n radius * normalizedThickness * yDirection +\n radius * radiusThickness * randomizedDistanceRatio * yDirection;\n position.z = 0;\n\n position.applyQuaternion(quaternion);\n\n const positionLength = position.length();\n const normalizedAngle = Math.abs(\n (positionLength / radius) * THREE.MathUtils.degToRad(angle)\n );\n const sinNormalizedAngle = Math.sin(normalizedAngle);\n\n const speedMultiplierByPosition = 1 / positionLength;\n velocity.set(\n position.x * sinNormalizedAngle * speedMultiplierByPosition * speed,\n position.y * sinNormalizedAngle * speedMultiplierByPosition * speed,\n Math.cos(normalizedAngle) * speed\n );\n velocity.applyQuaternion(quaternion);\n};\n\n/**\n * Calculates random position and velocity for particles emitted from a box.\n *\n * Supports three emission modes: volume, shell (surface), and edges.\n * Useful for area-based effects like dust clouds, rain, or geometric patterns.\n *\n * @param position - Output vector for the particle's starting position\n * @param quaternion - Rotation to apply to the emission shape\n * @param velocity - Output vector for the particle's initial velocity\n * @param speed - Speed multiplier for the velocity\n * @param params - Box configuration\n * @param params.scale - Size of the box on each axis (width, height, depth)\n * @param params.emitFrom - Emission mode:\n * - `VOLUME`: Random positions throughout the entire box volume\n * - `SHELL`: Random positions on the 6 faces (surface)\n * - `EDGE`: Random positions along the 12 edges\n *\n * @remarks\n * - All particles emit with velocity along the +Z axis (forward)\n * - Box is centered at the origin before rotation\n * - VOLUME mode: Best for rain, snow, or volumetric clouds\n * - SHELL mode: Best for hollow effects or surface particles\n * - EDGE mode: Best for wireframe effects or particle outlines\n *\n * @see {@link Box} - Configuration type for box shape\n * @see {@link EmitFrom} - Emission mode enum\n */\nexport const calculateRandomPositionAndVelocityOnBox = (\n position: THREE.Vector3,\n quaternion: THREE.Quaternion,\n velocity: THREE.Vector3,\n speed: number,\n { scale, emitFrom }: { scale: Point3D; emitFrom: EmitFrom }\n) => {\n const _scale = scale as Required<Point3D>;\n switch (emitFrom) {\n case EmitFrom.VOLUME:\n position.x = Math.random() * _scale.x - _scale.x / 2;\n position.y = Math.random() * _scale.y - _scale.y / 2;\n position.z = Math.random() * _scale.z - _scale.z / 2;\n break;\n\n case EmitFrom.SHELL:\n const side = Math.floor(Math.random() * 6);\n const perpendicularAxis = side % 3;\n const shellResult = [];\n shellResult[perpendicularAxis] = side > 2 ? 1 : 0;\n shellResult[(perpendicularAxis + 1) % 3] = Math.random();\n shellResult[(perpendicularAxis + 2) % 3] = Math.random();\n position.x = shellResult[0] * _scale.x - _scale.x / 2;\n position.y = shellResult[1] * _scale.y - _scale.y / 2;\n position.z = shellResult[2] * _scale.z - _scale.z / 2;\n break;\n\n case EmitFrom.EDGE:\n const side2 = Math.floor(Math.random() * 6);\n const perpendicularAxis2 = side2 % 3;\n const edge = Math.floor(Math.random() * 4);\n const edgeResult = [];\n edgeResult[perpendicularAxis2] = side2 > 2 ? 1 : 0;\n edgeResult[(perpendicularAxis2 + 1) % 3] =\n edge < 2 ? Math.random() : edge - 2;\n edgeResult[(perpendicularAxis2 + 2) % 3] =\n edge < 2 ? edge : Math.random();\n position.x = edgeResult[0] * _scale.x - _scale.x / 2;\n position.y = edgeResult[1] * _scale.y - _scale.y / 2;\n position.z = edgeResult[2] * _scale.z - _scale.z / 2;\n break;\n }\n\n position.applyQuaternion(quaternion);\n\n velocity.set(0, 0, speed);\n velocity.applyQuaternion(quaternion);\n};\n\n/**\n * Calculates random position and velocity for particles emitted from a circle.\n *\n * Emits particles from a circular area or ring. Useful for ground impacts,\n * radial effects, magic circles, or any circular planar emission.\n *\n * @param position - Output vector for the particle's starting position\n * @param quaternion - Rotation to apply to the emission shape\n * @param velocity - Output vector for the particle's initial velocity\n * @param speed - Speed multiplier for the velocity\n * @param params - Circle configuration\n * @param params.radius - Radius of the circle\n * @param params.radiusThickness - Controls emission from area (1.0) vs edge (0.0)\n * @param params.arc - Arc angle in degrees (360 = full circle, 180 = semicircle)\n *\n * @remarks\n * - Circle lies in the XY plane by default (Z = 0)\n * - Particles emit along the +Z axis (perpendicular to circle)\n * - `radiusThickness = 1.0`: Filled circle (disc)\n * - `radiusThickness = 0.0`: Ring (circle edge only)\n * - Good for ground impact effects, teleport circles, or radial bursts\n *\n * @see {@link Circle} - Configuration type for circle shape\n */\nexport const calculateRandomPositionAndVelocityOnCircle = (\n position: THREE.Vector3,\n quaternion: THREE.Quaternion,\n velocity: THREE.Vector3,\n speed: number,\n {\n radius,\n radiusThickness,\n arc,\n }: { radius: number; radiusThickness: number; arc: number }\n) => {\n const theta = 2 * Math.PI * Math.random() * (arc / 360);\n const randomizedDistanceRatio = Math.random();\n\n const xDirection = Math.cos(theta);\n const yDirection = Math.sin(theta);\n const normalizedThickness = 1 - radiusThickness;\n\n position.x =\n radius * normalizedThickness * xDirection +\n radius * radiusThickness * randomizedDistanceRatio * xDirection;\n position.y =\n radius * normalizedThickness * yDirection +\n radius * radiusThickness * randomizedDistanceRatio * yDirection;\n position.z = 0;\n\n position.applyQuaternion(quaternion);\n\n const positionLength = position.length();\n const speedMultiplierByPosition = 1 / positionLength;\n velocity.set(\n position.x * speedMultiplierByPosition * speed,\n position.y * speedMultiplierByPosition * speed,\n 0\n );\n velocity.applyQuaternion(quaternion);\n};\n\n/**\n * Calculates random position and velocity for particles emitted from a rectangle.\n *\n * Emits particles from a rectangular planar area. Useful for rain on a surface,\n * screen-space effects, or any planar emission pattern.\n *\n * @param position - Output vector for the particle's starting position\n * @param quaternion - Rotation to apply to the emission shape\n * @param velocity - Output vector for the particle's initial velocity\n * @param speed - Speed multiplier for the velocity\n * @param params - Rectangle configuration\n * @param params.rotation - Local rotation of the rectangle (degrees) before\n * applying quaternion\n * @param params.scale - Size of the rectangle (width and height)\n *\n * @remarks\n * - Rectangle lies in the XY plane by default\n * - Particles emit along the +Z axis (perpendicular to rectangle)\n * - The rotation parameter allows tilting the rectangle before the main\n * quaternion rotation is applied\n * - Good for rain effects, screen particles, or planar area emissions\n *\n * @see {@link Rectangle} - Configuration type for rectangle shape\n */\nexport const calculateRandomPositionAndVelocityOnRectangle = (\n position: THREE.Vector3,\n quaternion: THREE.Quaternion,\n velocity: THREE.Vector3,\n speed: number,\n { rotation, scale }: { rotation: Point3D; scale: Point3D }\n) => {\n const _scale = scale as Required<Point3D>;\n const _rotation = rotation as Required<Point3D>;\n\n const xOffset = Math.random() * _scale.x - _scale.x / 2;\n const yOffset = Math.random() * _scale.y - _scale.y / 2;\n const rotationX = THREE.MathUtils.degToRad(_rotation.x);\n const rotationY = THREE.MathUtils.degToRad(_rotation.y);\n position.x = xOffset * Math.cos(rotationY);\n position.y = yOffset * Math.cos(rotationX);\n position.z = xOffset * Math.sin(rotationY) - yOffset * Math.sin(rotationX);\n\n position.applyQuaternion(quaternion);\n\n velocity.set(0, 0, speed);\n velocity.applyQuaternion(quaternion);\n};\n\n/**\n * Creates a default white circle texture using CanvasTexture.\n * @returns {THREE.CanvasTexture | null} The generated texture or null if context fails.\n */\nexport const createDefaultParticleTexture = (): THREE.CanvasTexture | null => {\n try {\n const canvas = document.createElement('canvas');\n const size = 64;\n canvas.width = size;\n canvas.height = size;\n const context = canvas.getContext('2d');\n if (context) {\n const centerX = size / 2;\n const centerY = size / 2;\n const radius = size / 2 - 2; // Small padding\n\n context.beginPath();\n context.arc(centerX, centerY, radius, 0, 2 * Math.PI, false);\n context.fillStyle = 'white';\n context.fill();\n const texture = new THREE.CanvasTexture(canvas);\n texture.needsUpdate = true;\n return texture;\n } else {\n console.warn(\n 'Could not get 2D context to generate default particle texture.'\n );\n return null;\n }\n } catch (error) {\n // Handle potential errors (e.g., document not available in non-browser env)\n console.warn('Error creating default particle texture:', error);\n return null;\n }\n};\n\nexport const isLifeTimeCurve = (\n value: Constant | RandomBetweenTwoConstants | LifetimeCurve\n): value is LifetimeCurve => {\n return typeof value !== 'number' && 'type' in value;\n};\n\nexport const getCurveFunctionFromConfig = (\n particleSystemId: number,\n lifetimeCurve: LifetimeCurve\n) => {\n if (lifetimeCurve.type === LifeTimeCurve.BEZIER) {\n return createBezierCurveFunction(\n particleSystemId,\n lifetimeCurve.bezierPoints\n ); // Bézier curve\n }\n\n if (lifetimeCurve.type === LifeTimeCurve.EASING) {\n return lifetimeCurve.curveFunction; // Easing curve\n }\n\n throw new Error(`Unsupported value type: ${lifetimeCurve}`);\n};\n\nexport const calculateValue = (\n particleSystemId: number,\n value: Constant | RandomBetweenTwoConstants | LifetimeCurve,\n time: number = 0\n): number => {\n if (typeof value === 'number') {\n return value; // Constant value\n }\n\n if ('min' in value && 'max' in value) {\n if (value.min === value.max) {\n return value.min ?? 0; // Constant value\n }\n return THREE.MathUtils.randFloat(value.min ?? 0, value.max ?? 1); // Random range\n }\n\n const lifetimeCurve = value as LifetimeCurve;\n return (\n getCurveFunctionFromConfig(particleSystemId, lifetimeCurve)(time) *\n (lifetimeCurve.scale ?? 1)\n );\n};\n","import * as THREE from 'three';\n\nimport { calculateValue } from './three-particles-utils.js';\nimport { GeneralData, NormalizedParticleSystemConfig } from './types.js';\n\nconst noiseInput = new THREE.Vector3(0, 0, 0);\nconst orbitalEuler = new THREE.Euler();\n\n/**\n * Applies all active modifiers to a single particle during the update cycle.\n *\n * This function handles the animation and modification of particle properties over its lifetime,\n * including velocity (linear and orbital), size, opacity, color, rotation, and noise-based effects.\n * It is called once per particle per frame by the {@link updateParticleSystems} function.\n *\n * @param params - Configuration object containing:\n * @param params.delta - Time elapsed since the last frame in seconds. Used for velocity and rotation calculations.\n * @param params.generalData - Internal particle system state and cached values.\n * @param params.normalizedConfig - The normalized particle system configuration with all modifiers.\n * @param params.attributes - Three.js buffer attributes for position, size, rotation, and color.\n * @param params.particleLifetimePercentage - Normalized lifetime of the particle (0.0 to 1.0).\n * - 0.0 = particle just born\n * - 1.0 = particle at end of life\n * @param params.particleIndex - Index of the particle in the buffer arrays.\n *\n * @remarks\n * The function modifies the following particle properties based on configuration:\n *\n * - **Linear Velocity**: Moves particles in a straight line (velocityOverLifetime.linear)\n * - **Orbital Velocity**: Rotates particles around their emission point (velocityOverLifetime.orbital)\n * - **Size Over Lifetime**: Scales particle size based on lifetime curve (sizeOverLifetime)\n * - **Opacity Over Lifetime**: Fades particles in/out based on lifetime curve (opacityOverLifetime)\n * - **Color Over Lifetime**: Animates RGB channels independently based on lifetime curves (colorOverLifetime)\n * - **Rotation Over Lifetime**: Rotates particles around their center (rotationOverLifetime)\n * - **Noise**: Adds organic, turbulent motion to position, rotation, and size (noise)\n *\n * Each modifier only runs if it's active in the configuration, optimizing performance for simple effects.\n *\n * @example\n * ```typescript\n * // This function is called internally by updateParticleSystems\n * // You typically don't need to call it directly\n *\n * // However, understanding its behavior helps configure particle systems:\n * const config = {\n * sizeOverLifetime: {\n * isActive: true,\n * lifetimeCurve: {\n * type: 'BEZIER',\n * bezierPoints: [\n * { x: 0, y: 0, percentage: 0 }, // Start at 0% size\n * { x: 0.5, y: 1, percentage: 0.5 }, // Grow to 100% at midlife\n * { x: 1, y: 0, percentage: 1 } // Shrink to 0% at end\n * ]\n * }\n * },\n * opacityOverLifetime: {\n * isActive: true,\n * lifetimeCurve: {\n * type: 'EASING',\n * curveFunction: 'easeOutQuad'\n * }\n * }\n * };\n * ```\n *\n * @see {@link updateParticleSystems} - Calls this function for each active particle\n * @see {@link VelocityOverLifetime} - Configuration for velocity modifiers\n * @see {@link NoiseConfig} - Configuration for noise-based effects\n */\nexport const applyModifiers = ({\n delta,\n generalData,\n normalizedConfig,\n attributes,\n particleLifetimePercentage,\n particleIndex,\n}: {\n delta: number;\n generalData: GeneralData;\n normalizedConfig: NormalizedParticleSystemConfig;\n attributes: THREE.NormalBufferAttributes;\n particleLifetimePercentage: number;\n particleIndex: number;\n}) => {\n const {\n particleSystemId,\n startValues,\n lifetimeValues,\n linearVelocityData,\n orbitalVelocityData,\n noise,\n } = generalData;\n\n const positionIndex = particleIndex * 3;\n const positionArr = attributes.position.array;\n\n if (linearVelocityData) {\n const { speed, valueModifiers } = linearVelocityData[particleIndex];\n\n const normalizedXSpeed = valueModifiers.x\n ? valueModifiers.x(particleLifetimePercentage)\n : speed.x;\n\n const normalizedYSpeed = valueModifiers.y\n ? valueModifiers.y(particleLifetimePercentage)\n : speed.y;\n\n const normalizedZSpeed = valueModifiers.z\n ? valueModifiers.z(particleLifetimePercentage)\n : speed.z;\n\n positionArr[positionIndex] += normalizedXSpeed * delta;\n positionArr[positionIndex + 1] += normalizedYSpeed * delta;\n positionArr[positionIndex + 2] += normalizedZSpeed * delta;\n\n attributes.position.needsUpdate = true;\n }\n\n if (orbitalVelocityData) {\n const { speed, positionOffset, valueModifiers } =\n orbitalVelocityData[particleIndex];\n\n positionArr[positionIndex] -= positionOffset.x;\n positionArr[positionIndex + 1] -= positionOffset.y;\n positionArr[positionIndex + 2] -= positionOffset.z;\n\n const normalizedXSpeed = valueModifiers.x\n ? valueModifiers.x(particleLifetimePercentage)\n : speed.x;\n\n const normalizedYSpeed = valueModifiers.y\n ? valueModifiers.y(particleLifetimePercentage)\n : speed.y;\n\n const normalizedZSpeed = valueModifiers.z\n ? valueModifiers.z(particleLifetimePercentage)\n : speed.z;\n\n orbitalEuler.set(\n normalizedXSpeed * delta,\n normalizedZSpeed * delta,\n normalizedYSpeed * delta\n );\n positionOffset.applyEuler(orbitalEuler);\n\n positionArr[positionIndex] += positionOffset.x;\n positionArr[positionIndex + 1] += positionOffset.y;\n positionArr[positionIndex + 2] += positionOffset.z;\n\n attributes.position.needsUpdate = true;\n }\n\n if (normalizedConfig.sizeOverLifetime.isActive) {\n const multiplier = calculateValue(\n particleSystemId,\n normalizedConfig.sizeOverLifetime.lifetimeCurve,\n particleLifetimePercentage\n );\n attributes.size.array[particleIndex] =\n startValues.startSize[particleIndex] * multiplier;\n attributes.size.needsUpdate = true;\n }\n\n if (normalizedConfig.opacityOverLifetime.isActive) {\n const multiplier = calculateValue(\n particleSystemId,\n normalizedConfig.opacityOverLifetime.lifetimeCurve,\n particleLifetimePercentage\n );\n attributes.colorA.array[particleIndex] =\n startValues.startOpacity[particleIndex] * multiplier;\n attributes.colorA.needsUpdate = true;\n }\n\n if (normalizedConfig.colorOverLifetime.isActive) {\n const rMultiplier = calculateValue(\n particleSystemId,\n normalizedConfig.colorOverLifetime.r,\n particleLifetimePercentage\n );\n const gMultiplier = calculateValue(\n particleSystemId,\n normalizedConfig.colorOverLifetime.g,\n particleLifetimePercentage\n );\n const bMultiplier = calculateValue(\n particleSystemId,\n normalizedConfig.colorOverLifetime.b,\n particleLifetimePercentage\n );\n\n attributes.colorR.array[particleIndex] =\n startValues.startColorR[particleIndex] * rMultiplier;\n attributes.colorG.array[particleIndex] =\n startValues.startColorG[particleIndex] * gMultiplier;\n attributes.colorB.array[particleIndex] =\n startValues.startColorB[particleIndex] * bMultiplier;\n\n attributes.colorR.needsUpdate = true;\n attributes.colorG.needsUpdate = true;\n attributes.colorB.needsUpdate = true;\n }\n\n if (lifetimeValues.rotationOverLifetime) {\n attributes.rotation.array[particleIndex] +=\n lifetimeValues.rotationOverLifetime[particleIndex] * delta * 0.02;\n attributes.rotation.needsUpdate = true;\n }\n\n if (noise.isActive) {\n const {\n sampler,\n strength,\n noisePower,\n offsets,\n positionAmount,\n rotationAmount,\n sizeAmount,\n } = noise;\n let noiseOnPosition;\n\n const noisePosition =\n (particleLifetimePercentage + (offsets ? offsets[particleIndex] : 0)) *\n 10 *\n strength;\n\n noiseInput.set(noisePosition, 0, 0);\n noiseOnPosition = sampler!.get3(noiseInput);\n positionArr[positionIndex] += noiseOnPosition * noisePower * positionAmount;\n\n if (rotationAmount !== 0) {\n attributes.rotation.array[particleIndex] +=\n noiseOnPosition * noisePower * rotationAmount;\n attributes.rotation.needsUpdate = true;\n }\n\n if (sizeAmount !== 0) {\n attributes.size.array[particleIndex] +=\n noiseOnPosition * noisePower * sizeAmount;\n attributes.size.needsUpdate = true;\n }\n\n noiseInput.set(noisePosition, noisePosition, 0);\n noiseOnPosition = sampler!.get3(noiseInput);\n positionArr[positionIndex + 1] +=\n noiseOnPosition * noisePower * positionAmount;\n\n noiseInput.set(noisePosition, noisePosition, noisePosition);\n noiseOnPosition = sampler!.get3(noiseInput);\n positionArr[positionIndex + 2] +=\n noiseOnPosition * noisePower * positionAmount;\n\n attributes.position.needsUpdate = true;\n }\n};\n","export const patchObject = (objectA, objectB, config = {\n skippedProperties: [],\n applyToFirstObject: false,\n}) => {\n const result = {};\n Object.keys(objectA).forEach((key) => {\n if (!config.skippedProperties || !config.skippedProperties.includes(key)) {\n if (typeof objectA[key] === 'object' &&\n objectA[key] &&\n objectB[key] &&\n !Array.isArray(objectA[key])) {\n result[key] = patchObject(objectA[key], objectB[key], config);\n }\n else {\n result[key] =\n objectB[key] === 0\n ? 0\n : objectB[key] === false\n ? false\n : objectB[key] || objectA[key];\n if (config.applyToFirstObject)\n objectA[key] = result[key];\n }\n }\n });\n return result;\n};\nexport const deepMerge = (objectA, objectB, config = {\n skippedProperties: [],\n applyToFirstObject: false,\n}) => {\n const result = {};\n Array.from(new Set([\n ...Object.keys((objectA || {})),\n ...Object.keys((objectB || {})),\n ])).forEach((key) => {\n if (!config.skippedProperties || !config.skippedProperties.includes(key)) {\n if (typeof objectA?.[key] === 'object' &&\n objectA?.[key] &&\n objectB?.[key] &&\n !Array.isArray(objectA[key])) {\n result[key] = deepMerge(objectA[key], objectB[key], config);\n }\n else {\n result[key] =\n objectB?.[key] === 0\n ? 0\n : objectB?.[key] === false\n ? false\n : objectB?.[key] || objectA?.[key];\n if (config.applyToFirstObject)\n objectA[key] = result[key];\n }\n }\n });\n return result;\n};\nexport const getObjectDiff = (objectA, objectB, config = { skippedProperties: [] }) => {\n const result = {};\n Object.keys(objectA).forEach((key) => {\n if (!config.skippedProperties || !config.skippedProperties.includes(key)) {\n if (typeof objectA[key] === 'object' &&\n objectA[key] &&\n objectB[key] &&\n !Array.isArray(objectA[key])) {\n const objectDiff = getObjectDiff(objectA[key], objectB[key], config);\n if (Object.keys(objectDiff).length > 0)\n result[key] = objectDiff;\n }\n else {\n const mergedValue = objectB[key] === 0\n ? 0\n : objectB[key] || objectA[key];\n if (mergedValue !== objectA[key])\n result[key] = mergedValue;\n }\n }\n });\n return result;\n};\n","// Stub for unused three.js add-ons pulled in by @newkrok/three-utils.\n// Provides no-op constructors so imports won't throw.\nconst noop = function () {};\nnoop.prototype.load = noop;\nnoop.prototype.parse = noop;\n\nexport const GLTFLoader = noop;\nexport const FBXLoader = noop;\nexport const PositionalAudioHelper = noop;\nexport const clone = noop;\n","import * as THREE from 'three';\nimport { FBXLoader } from 'three/examples/jsm/loaders/FBXLoader.js';\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';\n// Loader instances\nconst gltfLoader = new GLTFLoader();\nconst fbxLoaders = Array.from({ length: 3 }, () => ({\n loader: new FBXLoader(),\n isUsed: false,\n}));\nlet fbxLoaderQueue = [];\nconst textureLoaders = Array.from({ length: 3 }, () => ({\n loader: new THREE.TextureLoader(),\n isUsed: false,\n}));\nlet textureLoaderQueue = [];\nconst audioLoaders = Array.from({ length: 3 }, () => ({\n loader: new THREE.AudioLoader(),\n isUsed: false,\n}));\nlet audioLoaderQueue = [];\n// Loader getter functions\nconst getFBXLoader = (onComplete) => getLoader(onComplete, fbxLoaders, fbxLoaderQueue);\nconst getTextureLoader = (onComplete) => getLoader(onComplete, textureLoaders, textureLoaderQueue);\nconst getAudioLoader = (onComplete) => getLoader(onComplete, audioLoaders, audioLoaderQueue);\nconst getLoader = (onComplete, loaders, loaderQueue) => {\n const loader = loaders.find((entry) => !entry.isUsed);\n if (loader) {\n loader.isUsed = true;\n onComplete(loader.loader);\n }\n else {\n loaderQueue.push((availableLoader) => {\n onComplete(availableLoader.loader);\n availableLoader.isUsed = true;\n });\n }\n};\n// Loader release functions\nconst releaseFBXLoader = (loader) => releaseLoader(loader, fbxLoaders, fbxLoaderQueue);\nconst releaseTextureLoader = (loader) => releaseLoader(loader, textureLoaders, textureLoaderQueue);\nconst releaseAudioLoader = (loader) => releaseLoader(loader, audioLoaders, audioLoaderQueue);\nconst releaseLoader = (loader, loaders, loaderQueue) => {\n const loaderObject = loaders.find((entry) => entry.loader === loader);\n if (loaderObject) {\n if (loaderQueue.length > 0) {\n const callback = loaderQueue.shift();\n if (callback) {\n callback(loaderObject);\n }\n }\n else {\n loaderObject.isUsed = false;\n }\n }\n};\n// GLTF Model loading\nconst loadGLTFModelRoutine = ({ list, onElementLoaded, onComplete, onError, }) => {\n if (list.length > 0) {\n const { url } = list[0];\n gltfLoader.load(url, ({ scene, animations }) => {\n onElementLoaded({\n ...list[0],\n gltfModel: { scene, animations },\n });\n list.shift();\n loadGLTFModelRoutine({ list, onElementLoaded, onComplete, onError });\n }, undefined, (error) => onError(String(error)));\n }\n else {\n onComplete();\n }\n};\nexport const loadGLTFModels = (list, onProgress) => {\n const elements = [];\n const onElementLoaded = (element) => {\n elements.push(element);\n onProgress();\n };\n const promise = new Promise((resolve, reject) => {\n loadGLTFModelRoutine({\n list: [...list], // Create a copy to avoid modifying the original\n onElementLoaded,\n onComplete: () => resolve(elements),\n onError: (error) => reject(new Error(`Something wrong happened: ${error}`)),\n });\n });\n return promise;\n};\nexport const loadFBXModels = (list, onProgress) => {\n const elements = [];\n const onElementLoaded = (element) => {\n elements.push(element);\n onProgress();\n };\n const promise = new Promise((resolve, reject) => {\n if (list.length > 0) {\n const listCopy = [...list]; // Create a copy to avoid modifying the original\n while (listCopy.length > 0) {\n const { url, id } = listCopy[0];\n const current = listCopy[0];\n listCopy.shift();\n getFBXLoader((fbxLoader) => fbxLoader.load(url, (fbxModel) => {\n onElementLoaded({ ...current, id, fbxModel });\n releaseFBXLoader(fbxLoader);\n if (!fbxLoaders.some((entry) => entry.isUsed)) {\n resolve(elements);\n }\n }, undefined, (error) => reject(new Error(`Something wrong happened with an FBX model: ${id}, url: ${url}, error: ${error}`))));\n }\n }\n else {\n resolve([]);\n }\n });\n return promise;\n};\nexport const loadTextures = (list, onProgress) => {\n const elements = [];\n const onElementLoaded = (element) => {\n elements.push(element);\n onProgress();\n };\n const promise = new Promise((resolve, reject) => {\n if (list.length > 0) {\n const listCopy = [...list]; // Create a copy to avoid modifying the original\n while (listCopy.length > 0) {\n const { url, id } = listCopy[0];\n listCopy.shift();\n getTextureLoader((textureLoader) => textureLoader.load(url, (texture) => {\n texture.wrapS = THREE.RepeatWrapping;\n texture.wrapT = THREE.RepeatWrapping;\n onElementLoaded({ id, url, texture });\n releaseTextureLoader(textureLoader);\n if (!textureLoaders.some((entry) => entry.isUsed)) {\n resolve(elements);\n }\n }, undefined, (error) => reject(new Error(`Something wrong happened with a texture: ${id}, url: ${url}, error: ${error}`))));\n }\n }\n else {\n resolve([]);\n }\n });\n return promise;\n};\nexport const loadAudio = (list, onProgress) => {\n const elements = [];\n const onElementLoaded = (element) => {\n elements.push(element);\n onProgress();\n };\n const promise = new Promise((resolve, reject) => {\n if (list.length > 0) {\n const listCopy = [...list]; // Create a copy to avoid modifying the original\n while (listCopy.length > 0) {\n const { url, id } = listCopy[0];\n listCopy.shift();\n getAudioLoader((audioLoader) => audioLoader.load(url, (audioBuffer) => {\n onElementLoaded({ id, url, audioBuffer });\n releaseAudioLoader(audioLoader);\n if (!audioLoaders.some((entry) => entry.isUsed)) {\n resolve(elements);\n }\n }, undefined, (error) => reject(new Error(`Something wrong happened with an audio: ${id}, url: ${url}, error: ${error}`))));\n }\n }\n else {\n resolve([]);\n }\n });\n return promise;\n};\n","import * as THREE from 'three';\n\nvar definitions_perlin = \"#define GLSLIFY 1\\n// From https://github.com/hughsk/glsl-noise/blob/master/periodic/2d.glsl\\n\\n//\\n// GLSL textureless classic 2D noise \\\"cnoise\\\",\\n// with an RSL-style periodic variant \\\"pnoise\\\".\\n// Author: Stefan Gustavson (stefan.gustavson@liu.se)\\n// Version: 2011-08-22\\n//\\n// Many thanks to Ian McEwan of Ashima Arts for the\\n// ideas for permutation and gradient selection.\\n//\\n// Copyright (c) 2011 Stefan Gustavson. All rights reserved.\\n// Distributed under the MIT license. See LICENSE file.\\n// https://github.com/ashima/webgl-noise\\n//\\n\\nvec4 mod289(vec4 x) { return x - floor(x * (1.0 / 289.0)) * 289.0; }\\n\\nvec4 permute(vec4 x) { return mod289(((x * 34.0) + 1.0) * x); }\\n\\nvec4 taylorInvSqrt(vec4 r) { return 1.79284291400159 - 0.85373472095314 * r; }\\n\\nvec2 fade(vec2 t) { return t * t * t * (t * (t * 6.0 - 15.0) + 10.0); }\\n\\nfloat map(float value, float min1, float max1, float min2, float max2) {\\n return min2 + (value - min1) * (max2 - min2) / (max1 - min1);\\n}\\n\\n// Classic Perlin noise, periodic variant\\nfloat perlin(vec2 P) {\\n\\n vec2 rep = vec2(255.0, 255.0);\\n\\n vec4 Pi = floor(P.xyxy) + vec4(0.0, 0.0, 1.0, 1.0);\\n vec4 Pf = fract(P.xyxy) - vec4(0.0, 0.0, 1.0, 1.0);\\n Pi = mod(Pi, rep.xyxy); // To create noise with explicit period\\n Pi = mod289(Pi); // To avoid truncation effects in permutation\\n vec4 ix = Pi.xzxz;\\n vec4 iy = Pi.yyww;\\n vec4 fx = Pf.xzxz;\\n vec4 fy = Pf.yyww;\\n\\n vec4 i = permute(permute(ix) + iy);\\n\\n vec4 gx = fract(i * (1.0 / 41.0)) * 2.0 - 1.0;\\n vec4 gy = abs(gx) - 0.5;\\n vec4 tx = floor(gx + 0.5);\\n gx = gx - tx;\\n\\n vec2 g00 = vec2(gx.x, gy.x);\\n vec2 g10 = vec2(gx.y, gy.y);\\n vec2 g01 = vec2(gx.z, gy.z);\\n vec2 g11 = vec2(gx.w, gy.w);\\n\\n vec4 norm = taylorInvSqrt(\\n vec4(dot(g00, g00), dot(g01, g01), dot(g10, g10), dot(g11, g11)));\\n g00 *= norm.x;\\n g01 *= norm.y;\\n g10 *= norm.z;\\n g11 *= norm.w;\\n\\n float n00 = dot(g00, vec2(fx.x, fy.x));\\n float n10 = dot(g10, vec2(fx.y, fy.y));\\n float n01 = dot(g01, vec2(fx.z, fy.z));\\n float n11 = dot(g11, vec2(fx.w, fy.w));\\n\\n vec2 fade_xy = fade(Pf.xy);\\n vec2 n_x = mix(vec2(n00, n01), vec2(n10, n11), fade_xy.x);\\n float n_xy = mix(n_x.x, n_x.y, fade_xy.y);\\n return map(2.3 * n_xy, -1.0, 1.0, 0.0, 1.0);\\n}\\n\\nfloat fbm(vec2 pos, vec4 props) {\\n float persistance = props.x;\\n float lacunarity = props.y;\\n float redistribution = props.z;\\n int octaves = int(props.w);\\n\\n float result = 0.0;\\n float amplitude = 1.0;\\n float frequency = 1.0;\\n float maximum = amplitude;\\n\\n for (int i = 0; i < 2; i++) {\\n\\n vec2 p = pos.xy * frequency;\\n\\n float noiseVal = perlin(p);\\n result += noiseVal * amplitude;\\n\\n frequency *= lacunarity;\\n amplitude *= persistance;\\n maximum += amplitude;\\n }\\n\\n float redistributed = pow(result, redistribution);\\n return redistributed / maximum;\\n}\\n\"; // eslint-disable-line\n\nvar p = [\n 151,\n 160,\n 137,\n 91,\n 90,\n 15,\n 131,\n 13,\n 201,\n 95,\n 96,\n 53,\n 194,\n 233,\n 7,\n 225,\n 140,\n 36,\n 103,\n 30,\n 69,\n 142,\n 8,\n 99,\n 37,\n 240,\n 21,\n 10,\n 23,\n 190,\n 6,\n 148,\n 247,\n 120,\n 234,\n 75,\n 0,\n 26,\n 197,\n 62,\n 94,\n 252,\n 219,\n 203,\n 117,\n 35,\n 11,\n 32,\n 57,\n 177,\n 33,\n 88,\n 237,\n 149,\n 56,\n 87,\n 174,\n 20,\n 125,\n 136,\n 171,\n 168,\n 68,\n 175,\n 74,\n 165,\n 71,\n 134,\n 139,\n 48,\n 27,\n 166,\n 77,\n 146,\n 158,\n 231,\n 83,\n 111,\n 229,\n 122,\n 60,\n 211,\n 133,\n 230,\n 220,\n 105,\n 92,\n 41,\n 55,\n 46,\n 245,\n 40,\n 244,\n 102,\n 143,\n 54,\n 65,\n 25,\n 63,\n 161,\n 1,\n 216,\n 80,\n 73,\n 209,\n 76,\n 132,\n 187,\n 208,\n 89,\n 18,\n 169,\n 200,\n 196,\n 135,\n 130,\n 116,\n 188,\n 159,\n 86,\n 164,\n 100,\n 109,\n 198,\n 173,\n 186,\n 3,\n 64,\n 52,\n 217,\n 226,\n 250,\n 124,\n 123,\n 5,\n 202,\n 38,\n 147,\n 118,\n 126,\n 255,\n 82,\n 85,\n 212,\n 207,\n 206,\n 59,\n 227,\n 47,\n 16,\n 58,\n 17,\n 182,\n 189,\n 28,\n 42,\n 223,\n 183,\n 170,\n 213,\n 119,\n 248,\n 152,\n 2,\n 44,\n 154,\n 163,\n 70,\n 221,\n 153,\n 101,\n 155,\n 167,\n 43,\n 172,\n 9,\n 129,\n 22,\n 39,\n 253,\n 19,\n 98,\n 108,\n 110,\n 79,\n 113,\n 224,\n 232,\n 178,\n 185,\n 112,\n 104,\n 218,\n 246,\n 97,\n 228,\n 251,\n 34,\n 242,\n 193,\n 238,\n 210,\n 144,\n 12,\n 191,\n 179,\n 162,\n 241,\n 81,\n 51,\n 145,\n 235,\n 249,\n 14,\n 239,\n 107,\n 49,\n 192,\n 214,\n 31,\n 181,\n 199,\n 106,\n 157,\n 184,\n 84,\n 204,\n 176,\n 115,\n 121,\n 50,\n 45,\n 127,\n 4,\n 150,\n 254,\n 138,\n 236,\n 205,\n 93,\n 222,\n 114,\n 67,\n 29,\n 24,\n 72,\n 243,\n 141,\n 128,\n 195,\n 78,\n 66,\n 215,\n 61,\n 156,\n 180,\n];\n\n/**\n * An implimentation of Perlin Noise by Ken Perlin.\n */\nclass Perlin {\n /**\n *\n * @param {number} seed Seed Value for PRNG.\n */\n constructor(seed) {\n const _gradientVecs = [\n // 2D Vecs\n new THREE.Vector3(1, 1, 0),\n new THREE.Vector3(-1, 1, 0),\n new THREE.Vector3(1, -1, 0),\n new THREE.Vector3(-1, -1, 0),\n // + 3D Vecs\n new THREE.Vector3(1, 0, 1),\n new THREE.Vector3(-1, 0, 1),\n new THREE.Vector3(1, 0, -1),\n new THREE.Vector3(-1, 0, -1),\n new THREE.Vector3(0, 1, 1),\n new THREE.Vector3(0, -1, 1),\n new THREE.Vector3(0, 1, -1),\n new THREE.Vector3(0, -1, -1),\n ];\n\n var perm = new Array(512);\n var gradP = new Array(512);\n\n if (!seed) seed = 1;\n seed *= 65536;\n\n seed = Math.floor(seed);\n if (seed < 256) {\n seed |= seed << 8;\n }\n\n for (var i = 0; i < 256; i++) {\n var v;\n if (i & 1) {\n v = p[i] ^ (seed & 255);\n } else {\n v = p[i] ^ ((seed >> 8) & 255);\n }\n\n perm[i] = perm[i + 256] = v;\n gradP[i] = gradP[i + 256] = _gradientVecs[v % 12];\n }\n\n this._seed = seed;\n\n this._offsetMatrix = [\n new THREE.Vector3(0, 0, 0),\n new THREE.Vector3(0, 0, 1),\n new THREE.Vector3(0, 1, 0),\n new THREE.Vector3(0, 1, 1),\n new THREE.Vector3(1, 0, 0),\n new THREE.Vector3(1, 0, 1),\n new THREE.Vector3(1, 1, 0),\n new THREE.Vector3(1, 1, 1),\n ];\n\n /**\n * GLSL Shader Chunk for 2D Perlin Noise. Can be used with\n * three-CustomShaderMaterial.\n * See: <a href=\"https://github.com/FarazzShaikh/THREE-CustomShaderMaterial\">three-CustomShaderMaterial</a>\n */\n this.shaderChunk = {\n defines: \"\",\n header: definitions_perlin,\n main: \"\",\n uniforms: [{ three_noise_seed: this._seed }],\n };\n\n this.perm = perm;\n this.gradP = gradP;\n }\n\n _fade(t) {\n return t * t * t * (t * (t * 6 - 15) + 10);\n }\n\n _lerp(a, b, t) {\n return (1 - t) * a + t * b;\n }\n\n _gradient(posInCell) {\n if (posInCell instanceof THREE.Vector3) {\n return posInCell.x + this.perm[posInCell.y + this.perm[posInCell.z]];\n } else {\n return posInCell.x + this.perm[posInCell.y];\n }\n }\n\n /**\n * Maps a number from one range to another.\n * @param {number} x Input Number\n * @param {number} in_min Current range minimum\n * @param {number} in_max Current range maximum\n * @param {number} out_min New range minimum\n * @param {number} out_max New range maximum\n * @returns {number} Input Mapped to range [out_min, out_max]\n */\n static map(x, in_min, in_max, out_min, out_max) {\n return ((x - in_min) * (out_max - out_min)) / (in_max - in_min) + out_min;\n }\n\n /**\n * Samples 2D Perlin Nosie at given coordinates.\n * @param {THREE.Vector2 | THREE.Vector3} input Coordincates to sample at\n * @returns {number} Value of Perlin Noise at that coordinate.\n */\n get2(input) {\n if (input.z !== undefined) input = new THREE.Vector2(input.x, input.y);\n\n const cell = new THREE.Vector2(Math.floor(input.x), Math.floor(input.y));\n input.sub(cell);\n\n cell.x &= 255;\n cell.y &= 255;\n\n const gradiantDot = [];\n for (let i = 0; i < 4; i++) {\n const s3 = this._offsetMatrix[i * 2];\n const s = new THREE.Vector2(s3.x, s3.y);\n\n const grad3 =\n this.gradP[this._gradient(new THREE.Vector2().addVectors(cell, s))];\n const grad2 = new THREE.Vector2(grad3.x, grad3.y);\n const dist2 = new THREE.Vector2().subVectors(input, s);\n\n gradiantDot.push(grad2.dot(dist2));\n }\n\n const u = this._fade(input.x);\n const v = this._fade(input.y);\n\n const value = this._lerp(\n this._lerp(gradiantDot[0], gradiantDot[2], u),\n this._lerp(gradiantDot[1], gradiantDot[3], u),\n v\n );\n\n return value;\n }\n\n /**\n * Samples 3D Perlin Nosie at given coordinates.\n * @param {THREE.Vector}3 input Coordincates to sample at\n * @returns {number} Value of Perlin Noise at that coordinate.\n */\n get3(input) {\n if (input.z === undefined)\n throw \"Input to Perlin::get3() must be of type THREE.Vector3\";\n\n const cell = new THREE.Vector3(\n Math.floor(input.x),\n Math.floor(input.y),\n Math.floor(input.z)\n );\n input.sub(cell);\n\n cell.x &= 255;\n cell.y &= 255;\n cell.z &= 255;\n\n const gradiantDot = [];\n for (let i = 0; i < 8; i++) {\n const s = this._offsetMatrix[i];\n\n const grad3 =\n this.gradP[this._gradient(new THREE.Vector3().addVectors(cell, s))];\n const dist2 = new THREE.Vector3().subVectors(input, s);\n\n gradiantDot.push(grad3.dot(dist2));\n }\n\n const u = this._fade(input.x);\n const v = this._fade(input.y);\n const w = this._fade(input.z);\n\n const value = this._lerp(\n this._lerp(\n this._lerp(gradiantDot[0], gradiantDot[4], u),\n this._lerp(gradiantDot[1], gradiantDot[5], u),\n w\n ),\n this._lerp(\n this._lerp(gradiantDot[2], gradiantDot[6], u),\n this._lerp(gradiantDot[3], gradiantDot[7], u),\n w\n ),\n v\n );\n\n return value;\n }\n}\n\n/**\n * This class is an implimentaiton of a Fractal Brownian Motion\n * function using Perlin Nosie.\n */\nclass FBM {\n /**\n * Create an instance of the FBM class.\n * Use this instance to generate fBm noise.\n *\n * @param {Object} options Options for fBm generaiton.\n * @param {number} options.seed Seed for Perlin Noise\n * @param {number} options.scale What distance to view the noisemap\n * @param {number} options.persistance How much each octave contributes to the overall shape\n * @param {number} options.lacunarity How much detail is added or removed at each octave\n * @param {number} options.octaves Levels of detail you want you perlin noise to have\n * @param {number} options.redistribution Level of flatness within the valleys\n */\n constructor(options) {\n const { seed, scale, persistance, lacunarity, octaves, redistribution } =\n options;\n this._noise = new Perlin(seed);\n this._scale = scale || 1;\n this._persistance = persistance || 0.5;\n this._lacunarity = lacunarity || 2;\n this._octaves = octaves || 6;\n this._redistribution = redistribution || 1;\n }\n\n /**\n * Sample 2D Perlin Noise with fBm at given\n * coordinates. The function will use <code>Perlin_get2</code> or <code>Perlin_get3</code>\n * depending on the input vector's type.\n *\n * @param {(THREE.Vector2 | THREE.Vector3)} input Coordinates to sample noise at.\n * @returns {number} Normalized noise in the range [0, 1]\n */\n get2(input) {\n let result = 0;\n let amplitude = 1;\n let frequency = 1;\n let max = amplitude;\n\n let noiseFunction = this._noise.get2.bind(this._noise);\n\n for (let i = 0; i < this._octaves; i++) {\n const position = new THREE.Vector2(\n input.x * this._scale * frequency,\n input.y * this._scale * frequency\n );\n\n const noiseVal = noiseFunction(position);\n result += noiseVal * amplitude;\n\n frequency *= this._lacunarity;\n amplitude *= this._persistance;\n max += amplitude;\n }\n\n const redistributed = Math.pow(result, this._redistribution);\n return redistributed / max;\n }\n\n /**\n * Sample 3D Perlin Noise with fBm at given\n * coordinates. The function will use <code>Perlin_get2</code> or <code>Perlin_get3</code>\n * depending on the input vector's type.\n *\n * @param {THREE.Vector3} input Coordinates to sample noise at.\n * @returns {number} Normalized noise in the range [0, 1]\n */\n get3(input) {\n let result = 0;\n let amplitude = 1;\n let frequency = 1;\n let max = amplitude;\n\n let noiseFunction = this._noise.get3.bind(this._noise);\n\n for (let i = 0; i < this._octaves; i++) {\n const position = new THREE.Vector3(\n input.x * this._scale * frequency,\n input.y * this._scale * frequency,\n input.z * this._scale * frequency\n );\n\n const noiseVal = noiseFunction(position);\n result += noiseVal * amplitude;\n\n frequency *= this._lacunarity;\n amplitude *= this._persistance;\n max += amplitude;\n }\n\n const redistributed = Math.pow(result, this._redistribution);\n return redistributed / max;\n }\n}\n\nexport { FBM, Perlin };\n","const ParticleSystemFragmentShader = `\n uniform sampler2D map;\n uniform float elapsed;\n uniform float fps;\n uniform bool useFPSForFrameIndex;\n uniform vec2 tiles;\n uniform bool discardBackgroundColor;\n uniform vec3 backgroundColor;\n uniform float backgroundColorTolerance;\n\n varying vec4 vColor;\n varying float vLifetime;\n varying float vStartLifetime;\n varying float vRotation;\n varying float vStartFrame;\n\n #include <common>\n #include <logdepthbuf_pars_fragment>\n\n void main()\n {\n gl_FragColor = vColor;\n float mid = 0.5;\n\n float frameIndex = round(vStartFrame) + (\n useFPSForFrameIndex == true\n ? fps == 0.0\n ? 0.0\n : max((vLifetime / 1000.0) * fps, 0.0)\n : max(min(floor(min(vLifetime / vStartLifetime, 1.0) * (tiles.x * tiles.y)), tiles.x * tiles.y - 1.0), 0.0)\n );\n \n float spriteXIndex = floor(mod(frameIndex, tiles.x));\n float spriteYIndex = floor(mod(frameIndex / tiles.x, tiles.y));\n\n vec2 frameUV = vec2(\n gl_PointCoord.x / tiles.x + spriteXIndex / tiles.x,\n gl_PointCoord.y / tiles.y + spriteYIndex / tiles.y);\n\n vec2 center = vec2(0.5, 0.5);\n vec2 centeredPoint = gl_PointCoord - center;\n\n mat2 rotation = mat2(\n cos(vRotation), sin(vRotation),\n -sin(vRotation), cos(vRotation)\n );\n\n centeredPoint = rotation * centeredPoint;\n vec2 centeredMiddlePoint = vec2(\n centeredPoint.x + center.x,\n centeredPoint.y + center.y\n );\n\n float dist = distance(centeredMiddlePoint, center);\n if (dist > 0.5) discard;\n\n vec2 uvPoint = vec2(\n centeredMiddlePoint.x / tiles.x + spriteXIndex / tiles.x,\n centeredMiddlePoint.y / tiles.y + spriteYIndex / tiles.y\n );\n\n vec4 rotatedTexture = texture2D(map, uvPoint);\n\n gl_FragColor = gl_FragColor * rotatedTexture;\n\n if (discardBackgroundColor && abs(length(rotatedTexture.rgb - backgroundColor.rgb)) < backgroundColorTolerance) discard;\n \n #include <logdepthbuf_fragment>\n }\n`;\n\nexport default ParticleSystemFragmentShader;\n","const ParticleSystemVertexShader = `\n attribute float size;\n attribute float colorR;\n attribute float colorG;\n attribute float colorB;\n attribute float colorA;\n attribute float lifetime;\n attribute float startLifetime;\n attribute float rotation;\n attribute float startFrame;\n\n varying mat4 vPosition;\n varying vec4 vColor;\n varying float vLifetime;\n varying float vStartLifetime;\n varying float vRotation;\n varying float vStartFrame;\n\n #include <common>\n #include <logdepthbuf_pars_vertex>\n\n void main()\n {\n vColor = vec4(colorR, colorG, colorB, colorA);\n vLifetime = lifetime;\n vStartLifetime = startLifetime;\n vRotation = rotation;\n vStartFrame = startFrame;\n\n vec4 mvPosition = modelViewMatrix * vec4(position, 1.0);\n gl_PointSize = size * (100.0 / length(mvPosition.xyz));\n gl_Position = projectionMatrix * mvPosition;\n\n #include <logdepthbuf_vertex>\n }\n`;\n\nexport default ParticleSystemVertexShader;\n","import { ObjectUtils } from '@newkrok/three-utils';\nimport * as THREE from 'three';\nimport { Gyroscope } from 'three/examples/jsm/misc/Gyroscope.js';\nimport { FBM } from 'three-noise/build/three-noise.module.js';\nimport ParticleSystemFragmentShader from './shaders/particle-system-fragment-shader.glsl.js';\nimport ParticleSystemVertexShader from './shaders/particle-system-vertex-shader.glsl.js';\nimport { removeBezierCurveFunction } from './three-particles-bezier.js';\nimport {\n EmitFrom,\n LifeTimeCurve,\n Shape,\n SimulationSpace,\n SubEmitterTrigger,\n TimeMode,\n} from './three-particles-enums';\nimport { applyModifiers } from './three-particles-modifiers.js';\nimport {\n calculateRandomPositionAndVelocityOnBox,\n calculateRandomPositionAndVelocityOnCircle,\n calculateRandomPositionAndVelocityOnCone,\n calculateRandomPositionAndVelocityOnRectangle,\n calculateRandomPositionAndVelocityOnSphere,\n calculateValue,\n getCurveFunctionFromConfig,\n isLifeTimeCurve,\n createDefaultParticleTexture,\n} from './three-particles-utils.js';\n\nimport {\n Constant,\n CycleData,\n GeneralData,\n LifetimeCurve,\n NormalizedParticleSystemConfig,\n ParticleSystem,\n ParticleSystemConfig,\n ParticleSystemInstance,\n Point3D,\n RandomBetweenTwoConstants,\n ShapeConfig,\n SubEmitterConfig,\n} from './types.js';\n\nexport * from './types.js';\n\nlet _particleSystemId = 0;\nlet createdParticleSystems: Array<ParticleSystemInstance> = [];\n\n// Pre-allocated objects for updateParticleSystemInstance to avoid GC pressure\nconst _subEmitterPosition = new THREE.Vector3();\nconst _lastWorldPositionSnapshot = new THREE.Vector3();\nconst _distanceStep = { x: 0, y: 0, z: 0 };\nconst _tempPosition = { x: 0, y: 0, z: 0 };\nconst _modifierParams = {\n delta: 0,\n generalData: null as unknown as GeneralData,\n normalizedConfig: null as unknown as NormalizedParticleSystemConfig,\n attributes: null as unknown as THREE.NormalBufferAttributes,\n particleLifetimePercentage: 0,\n particleIndex: 0,\n};\n\n/**\n * Mapping of blending mode string identifiers to Three.js blending constants.\n *\n * Used for converting serialized particle system configurations (e.g., from JSON)\n * to actual Three.js blending mode constants.\n *\n * @example\n * ```typescript\n * import { blendingMap } from '@newkrok/three-particles';\n *\n * // Convert string to Three.js constant\n * const blending = blendingMap['THREE.AdditiveBlending'];\n * // blending === THREE.AdditiveBlending\n * ```\n */\nexport const blendingMap = {\n 'THREE.NoBlending': THREE.NoBlending,\n 'THREE.NormalBlending': THREE.NormalBlending,\n 'THREE.AdditiveBlending': THREE.AdditiveBlending,\n 'THREE.SubtractiveBlending': THREE.SubtractiveBlending,\n 'THREE.MultiplyBlending': THREE.MultiplyBlending,\n};\n\n/**\n * Returns a deep copy of the default particle system configuration.\n *\n * This is useful when you want to start with default settings and modify specific properties\n * without affecting the internal default configuration object.\n *\n * @returns A new object containing all default particle system settings\n *\n * @example\n * ```typescript\n * import { getDefaultParticleSystemConfig, createParticleSystem } from '@newkrok/three-particles';\n *\n * // Get default config and modify it\n * const config = getDefaultParticleSystemConfig();\n * config.emission.rateOverTime = 100;\n * config.startColor.min = { r: 1, g: 0, b: 0 };\n *\n * const { instance } = createParticleSystem(config);\n * scene.add(instance);\n * ```\n */\nexport const getDefaultParticleSystemConfig = () =>\n JSON.parse(JSON.stringify(DEFAULT_PARTICLE_SYSTEM_CONFIG));\n\nconst DEFAULT_PARTICLE_SYSTEM_CONFIG: ParticleSystemConfig = {\n transform: {\n position: new THREE.Vector3(),\n rotation: new THREE.Vector3(),\n scale: new THREE.Vector3(1, 1, 1),\n },\n duration: 5.0,\n looping: true,\n startDelay: 0,\n startLifetime: 5.0,\n startSpeed: 1.0,\n startSize: 1.0,\n startOpacity: 1.0,\n startRotation: 0.0,\n startColor: {\n min: { r: 1.0, g: 1.0, b: 1.0 },\n max: { r: 1.0, g: 1.0, b: 1.0 },\n },\n gravity: 0.0,\n simulationSpace: SimulationSpace.LOCAL,\n maxParticles: 100.0,\n emission: {\n rateOverTime: 10.0,\n rateOverDistance: 0.0,\n bursts: [],\n },\n shape: {\n shape: Shape.SPHERE,\n sphere: {\n radius: 1.0,\n radiusThickness: 1.0,\n arc: 360.0,\n },\n cone: {\n angle: 25.0,\n radius: 1.0,\n radiusThickness: 1.0,\n arc: 360.0,\n },\n circle: {\n radius: 1.0,\n radiusThickness: 1.0,\n arc: 360.0,\n },\n rectangle: {\n rotation: { x: 0.0, y: 0.0 }, // TODO: add z rotation\n scale: { x: 1.0, y: 1.0 },\n },\n box: {\n scale: { x: 1.0, y: 1.0, z: 1.0 },\n emitFrom: EmitFrom.VOLUME,\n },\n },\n map: undefined,\n renderer: {\n blending: THREE.NormalBlending,\n discardBackgroundColor: false,\n backgroundColorTolerance: 1.0,\n backgroundColor: { r: 1.0, g: 1.0, b: 1.0 },\n transparent: true,\n depthTest: true,\n depthWrite: false,\n },\n velocityOverLifetime: {\n isActive: false,\n linear: {\n x: 0,\n y: 0,\n z: 0,\n },\n orbital: {\n x: 0,\n y: 0,\n z: 0,\n },\n },\n sizeOverLifetime: {\n isActive: false,\n lifetimeCurve: {\n type: LifeTimeCurve.BEZIER,\n scale: 1,\n bezierPoints: [\n { x: 0, y: 0, percentage: 0 },\n { x: 1, y: 1, percentage: 1 },\n ],\n },\n },\n colorOverLifetime: {\n isActive: false,\n r: {\n type: LifeTimeCurve.BEZIER,\n scale: 1,\n bezierPoints: [\n { x: 0, y: 1, percentage: 0 },\n { x: 1, y: 1, percentage: 1 },\n ],\n },\n g: {\n type: LifeTimeCurve.BEZIER,\n scale: 1,\n bezierPoints: [\n { x: 0, y: 1, percentage: 0 },\n { x: 1, y: 1, percentage: 1 },\n ],\n },\n b: {\n type: LifeTimeCurve.BEZIER,\n scale: 1,\n bezierPoints: [\n { x: 0, y: 1, percentage: 0 },\n { x: 1, y: 1, percentage: 1 },\n ],\n },\n },\n opacityOverLifetime: {\n isActive: false,\n lifetimeCurve: {\n type: LifeTimeCurve.BEZIER,\n scale: 1,\n bezierPoints: [\n { x: 0, y: 0, percentage: 0 },\n { x: 1, y: 1, percentage: 1 },\n ],\n },\n },\n rotationOverLifetime: {\n isActive: false,\n min: 0.0,\n max: 0.0,\n },\n noise: {\n isActive: false,\n useRandomOffset: false,\n strength: 1.0,\n frequency: 0.5,\n octaves: 1,\n positionAmount: 1.0,\n rotationAmount: 0.0,\n sizeAmount: 0.0,\n },\n textureSheetAnimation: {\n tiles: new THREE.Vector2(1.0, 1.0),\n timeMode: TimeMode.LIFETIME,\n fps: 30.0,\n startFrame: 0,\n },\n};\n\nconst createFloat32Attributes = ({\n geometry,\n propertyName,\n maxParticles,\n factory,\n}: {\n geometry: THREE.BufferGeometry;\n propertyName: string;\n maxParticles: number;\n factory: ((value: never, index: number) => number) | number;\n}) => {\n const array = new Float32Array(maxParticles);\n if (typeof factory === 'function') {\n for (let i = 0; i < maxParticles; i++) {\n array[i] = factory(undefined as never, i);\n }\n } else {\n array.fill(factory);\n }\n geometry.setAttribute(propertyName, new THREE.BufferAttribute(array, 1));\n};\n\nconst calculatePositionAndVelocity = (\n generalData: GeneralData,\n { shape, sphere, cone, circle, rectangle, box }: ShapeConfig,\n startSpeed: Constant | RandomBetweenTwoConstants | LifetimeCurve,\n position: THREE.Vector3,\n velocity: THREE.Vector3\n) => {\n const calculatedStartSpeed = calculateValue(\n generalData.particleSystemId,\n startSpeed,\n generalData.normalizedLifetimePercentage\n );\n\n switch (shape) {\n case Shape.SPHERE:\n calculateRandomPositionAndVelocityOnSphere(\n position,\n generalData.wrapperQuaternion,\n velocity,\n calculatedStartSpeed,\n sphere as Required<NonNullable<ShapeConfig['sphere']>>\n );\n break;\n\n case Shape.CONE:\n calculateRandomPositionAndVelocityOnCone(\n position,\n generalData.wrapperQuaternion,\n velocity,\n calculatedStartSpeed,\n cone as Required<NonNullable<ShapeConfig['cone']>>\n );\n break;\n\n case Shape.CIRCLE:\n calculateRandomPositionAndVelocityOnCircle(\n position,\n generalData.wrapperQuaternion,\n velocity,\n calculatedStartSpeed,\n circle as Required<NonNullable<ShapeConfig['circle']>>\n );\n break;\n\n case Shape.RECTANGLE:\n calculateRandomPositionAndVelocityOnRectangle(\n position,\n generalData.wrapperQuaternion,\n velocity,\n calculatedStartSpeed,\n rectangle as Required<NonNullable<ShapeConfig['rectangle']>>\n );\n break;\n\n case Shape.BOX:\n calculateRandomPositionAndVelocityOnBox(\n position,\n generalData.wrapperQuaternion,\n velocity,\n calculatedStartSpeed,\n box as Required<NonNullable<ShapeConfig['box']>>\n );\n break;\n }\n};\n\nconst destroyParticleSystem = (particleSystem: THREE.Points) => {\n createdParticleSystems = createdParticleSystems.filter(\n ({\n particleSystem: savedParticleSystem,\n wrapper,\n generalData: { particleSystemId },\n }) => {\n if (\n savedParticleSystem !== particleSystem &&\n wrapper !== particleSystem\n ) {\n return true;\n }\n\n removeBezierCurveFunction(particleSystemId);\n savedParticleSystem.geometry.dispose();\n if (Array.isArray(savedParticleSystem.material))\n savedParticleSystem.material.forEach((material) => material.dispose());\n else savedParticleSystem.material.dispose();\n\n if (savedParticleSystem.parent)\n savedParticleSystem.parent.remove(savedParticleSystem);\n return false;\n }\n );\n};\n\n/**\n * Creates a new particle system with the specified configuration.\n *\n * This is the primary function for instantiating particle effects. It handles the complete\n * setup of a particle system including geometry creation, material configuration, shader setup,\n * and initialization of all particle properties.\n *\n * @param config - Configuration object for the particle system. If not provided, uses default settings.\n * See {@link ParticleSystemConfig} for all available options.\n * @param externalNow - Optional custom timestamp in milliseconds. If not provided, uses `Date.now()`.\n * Useful for synchronized particle systems or testing.\n *\n * @returns A {@link ParticleSystem} object containing:\n * - `instance`: The THREE.Object3D that should be added to your scene\n * - `resumeEmitter()`: Function to resume particle emission\n * - `pauseEmitter()`: Function to pause particle emission\n * - `dispose()`: Function to clean up resources and remove the particle system\n *\n * @example\n * ```typescript\n * import { createParticleSystem, updateParticleSystems } from '@newkrok/three-particles';\n *\n * // Create a basic particle system with default settings\n * const { instance, dispose } = createParticleSystem();\n * scene.add(instance);\n *\n * // Create a custom fire effect\n * const fireEffect = createParticleSystem({\n * duration: 2.0,\n * looping: true,\n * startLifetime: { min: 0.5, max: 1.5 },\n * startSpeed: { min: 2, max: 4 },\n * startSize: { min: 0.5, max: 1.5 },\n * startColor: {\n * min: { r: 1.0, g: 0.3, b: 0.0 },\n * max: { r: 1.0, g: 0.8, b: 0.0 }\n * },\n * emission: { rateOverTime: 50 },\n * shape: {\n * shape: Shape.CONE,\n * cone: { angle: 10, radius: 0.2 }\n * }\n * });\n * scene.add(fireEffect.instance);\n *\n * // In your animation loop\n * function animate(time) {\n * updateParticleSystems({ now: time, delta: deltaTime, elapsed: elapsedTime });\n * renderer.render(scene, camera);\n * }\n *\n * // Clean up when done\n * fireEffect.dispose();\n * ```\n *\n * @see {@link updateParticleSystems} - Required function to call in your animation loop\n * @see {@link ParticleSystemConfig} - Complete configuration options\n */\nexport const createParticleSystem = (\n config: ParticleSystemConfig = DEFAULT_PARTICLE_SYSTEM_CONFIG,\n externalNow?: number\n): ParticleSystem => {\n const now = externalNow || Date.now();\n const generalData: GeneralData = {\n particleSystemId: _particleSystemId++,\n normalizedLifetimePercentage: 0,\n distanceFromLastEmitByDistance: 0,\n lastWorldPosition: new THREE.Vector3(-99999),\n currentWorldPosition: new THREE.Vector3(-99999),\n worldPositionChange: new THREE.Vector3(),\n worldQuaternion: new THREE.Quaternion(),\n wrapperQuaternion: new THREE.Quaternion(),\n lastWorldQuaternion: new THREE.Quaternion(-99999),\n worldEuler: new THREE.Euler(),\n gravityVelocity: new THREE.Vector3(0, 0, 0),\n startValues: {},\n linearVelocityData: undefined,\n orbitalVelocityData: undefined,\n lifetimeValues: {},\n creationTimes: [],\n noise: {\n isActive: false,\n strength: 0,\n noisePower: 0,\n positionAmount: 0,\n rotationAmount: 0,\n sizeAmount: 0,\n },\n isEnabled: true,\n };\n const normalizedConfig = ObjectUtils.deepMerge(\n DEFAULT_PARTICLE_SYSTEM_CONFIG as NormalizedParticleSystemConfig,\n config,\n { applyToFirstObject: false, skippedProperties: [] }\n ) as NormalizedParticleSystemConfig;\n let particleMap: THREE.Texture | null =\n normalizedConfig.map || createDefaultParticleTexture();\n\n const {\n transform,\n duration,\n looping,\n startDelay,\n startLifetime,\n startSpeed,\n startSize,\n startRotation,\n startColor,\n startOpacity,\n gravity,\n simulationSpace,\n maxParticles,\n emission,\n shape,\n renderer,\n noise,\n velocityOverLifetime,\n onUpdate,\n onComplete,\n textureSheetAnimation,\n subEmitters,\n } = normalizedConfig;\n\n if (typeof renderer?.blending === 'string')\n renderer.blending = blendingMap[renderer.blending];\n\n const startPositions = Array.from(\n { length: maxParticles },\n () => new THREE.Vector3()\n );\n const velocities = Array.from(\n { length: maxParticles },\n () => new THREE.Vector3()\n );\n\n generalData.creationTimes = Array.from({ length: maxParticles }, () => 0);\n\n // Free list for O(1) inactive particle lookup (stack, top = end of array)\n const freeList: Array<number> = Array.from(\n { length: maxParticles },\n (_, i) => maxParticles - 1 - i\n );\n\n if (velocityOverLifetime.isActive) {\n generalData.linearVelocityData = Array.from(\n { length: maxParticles },\n () => ({\n speed: new THREE.Vector3(\n velocityOverLifetime.linear.x\n ? calculateValue(\n generalData.particleSystemId,\n velocityOverLifetime.linear.x,\n 0\n )\n : 0,\n velocityOverLifetime.linear.y\n ? calculateValue(\n generalData.particleSystemId,\n velocityOverLifetime.linear.y,\n 0\n )\n : 0,\n velocityOverLifetime.linear.z\n ? calculateValue(\n generalData.particleSystemId,\n velocityOverLifetime.linear.z,\n 0\n )\n : 0\n ),\n valueModifiers: {\n x: isLifeTimeCurve(velocityOverLifetime.linear.x || 0)\n ? getCurveFunctionFromConfig(\n generalData.particleSystemId,\n velocityOverLifetime.linear.x as LifetimeCurve\n )\n : undefined,\n y: isLifeTimeCurve(velocityOverLifetime.linear.y || 0)\n ? getCurveFunctionFromConfig(\n generalData.particleSystemId,\n velocityOverLifetime.linear.y as LifetimeCurve\n )\n : undefined,\n z: isLifeTimeCurve(velocityOverLifetime.linear.z || 0)\n ? getCurveFunctionFromConfig(\n generalData.particleSystemId,\n velocityOverLifetime.linear.z as LifetimeCurve\n )\n : undefined,\n },\n })\n );\n\n generalData.orbitalVelocityData = Array.from(\n { length: maxParticles },\n () => ({\n speed: new THREE.Vector3(\n velocityOverLifetime.orbital.x\n ? calculateValue(\n generalData.particleSystemId,\n velocityOverLifetime.orbital.x,\n 0\n )\n : 0,\n velocityOverLifetime.orbital.y\n ? calculateValue(\n generalData.particleSystemId,\n velocityOverLifetime.orbital.y,\n 0\n )\n : 0,\n velocityOverLifetime.orbital.z\n ? calculateValue(\n generalData.particleSystemId,\n velocityOverLifetime.orbital.z,\n 0\n )\n : 0\n ),\n valueModifiers: {\n x: isLifeTimeCurve(velocityOverLifetime.orbital.x || 0)\n ? getCurveFunctionFromConfig(\n generalData.particleSystemId,\n velocityOverLifetime.orbital.x as LifetimeCurve\n )\n : undefined,\n y: isLifeTimeCurve(velocityOverLifetime.orbital.y || 0)\n ? getCurveFunctionFromConfig(\n generalData.particleSystemId,\n velocityOverLifetime.orbital.y as LifetimeCurve\n )\n : undefined,\n z: isLifeTimeCurve(velocityOverLifetime.orbital.z || 0)\n ? getCurveFunctionFromConfig(\n generalData.particleSystemId,\n velocityOverLifetime.orbital.z as LifetimeCurve\n )\n : undefined,\n },\n positionOffset: new THREE.Vector3(),\n })\n );\n }\n\n const startValueKeys: Array<keyof NormalizedParticleSystemConfig> = [\n 'startSize',\n 'startOpacity',\n ];\n startValueKeys.forEach((key) => {\n generalData.startValues[key] = Array.from({ length: maxParticles }, () =>\n calculateValue(\n generalData.particleSystemId,\n normalizedConfig[key] as\n | Constant\n | RandomBetweenTwoConstants\n | LifetimeCurve,\n 0\n )\n );\n });\n\n generalData.startValues.startColorR = Array.from(\n { length: maxParticles },\n () => 0\n );\n generalData.startValues.startColorG = Array.from(\n { length: maxParticles },\n () => 0\n );\n generalData.startValues.startColorB = Array.from(\n { length: maxParticles },\n () => 0\n );\n\n const lifetimeValueKeys: Array<keyof NormalizedParticleSystemConfig> = [\n 'rotationOverLifetime',\n ];\n lifetimeValueKeys.forEach((key) => {\n const value = normalizedConfig[key] as {\n isActive: boolean;\n } & RandomBetweenTwoConstants;\n if (value.isActive)\n generalData.lifetimeValues[key] = Array.from(\n { length: maxParticles },\n () => THREE.MathUtils.randFloat(value.min!, value.max!)\n );\n });\n\n generalData.noise = {\n isActive: noise.isActive,\n strength: noise.strength,\n noisePower: 0.15 * noise.strength,\n positionAmount: noise.positionAmount,\n rotationAmount: noise.rotationAmount,\n sizeAmount: noise.sizeAmount,\n sampler: noise.isActive\n ? new FBM({\n seed: Math.random(),\n scale: noise.frequency,\n octaves: noise.octaves,\n })\n : undefined,\n offsets: noise.useRandomOffset\n ? Array.from({ length: maxParticles }, () => Math.random() * 100)\n : undefined,\n };\n\n // Initialize burst states if bursts are configured\n if (emission.bursts && emission.bursts.length > 0) {\n generalData.burstStates = emission.bursts.map(() => ({\n cyclesExecuted: 0,\n lastCycleTime: 0,\n probabilityPassed: false,\n }));\n }\n\n const material = new THREE.ShaderMaterial({\n uniforms: {\n elapsed: {\n value: 0.0,\n },\n map: {\n value: particleMap,\n },\n tiles: {\n value: textureSheetAnimation.tiles,\n },\n fps: {\n value: textureSheetAnimation.fps,\n },\n useFPSForFrameIndex: {\n value: textureSheetAnimation.timeMode === TimeMode.FPS,\n },\n backgroundColor: {\n value: renderer.backgroundColor,\n },\n discardBackgroundColor: {\n value: renderer.discardBackgroundColor,\n },\n backgroundColorTolerance: {\n value: renderer.backgroundColorTolerance,\n },\n },\n vertexShader: ParticleSystemVertexShader,\n fragmentShader: ParticleSystemFragmentShader,\n transparent: renderer.transparent,\n blending: renderer.blending,\n depthTest: renderer.depthTest,\n depthWrite: renderer.depthWrite,\n });\n\n const geometry = new THREE.BufferGeometry();\n\n for (let i = 0; i < maxParticles; i++)\n calculatePositionAndVelocity(\n generalData,\n shape,\n startSpeed,\n startPositions[i],\n velocities[i]\n );\n\n const positionArray = new Float32Array(maxParticles * 3);\n for (let i = 0; i < maxParticles; i++) {\n positionArray[i * 3] = startPositions[i].x;\n positionArray[i * 3 + 1] = startPositions[i].y;\n positionArray[i * 3 + 2] = startPositions[i].z;\n }\n geometry.setAttribute(\n 'position',\n new THREE.BufferAttribute(positionArray, 3)\n );\n\n createFloat32Attributes({\n geometry,\n propertyName: 'isActive',\n maxParticles,\n factory: 0,\n });\n\n createFloat32Attributes({\n geometry,\n propertyName: 'lifetime',\n maxParticles,\n factory: 0,\n });\n\n createFloat32Attributes({\n geometry,\n propertyName: 'startLifetime',\n maxParticles,\n factory: () =>\n calculateValue(generalData.particleSystemId, startLifetime, 0) * 1000,\n });\n\n createFloat32Attributes({\n geometry,\n propertyName: 'startFrame',\n maxParticles,\n factory: () =>\n textureSheetAnimation.startFrame\n ? calculateValue(\n generalData.particleSystemId,\n textureSheetAnimation.startFrame,\n 0\n )\n : 0,\n });\n\n createFloat32Attributes({\n geometry,\n propertyName: 'opacity',\n maxParticles,\n factory: () =>\n calculateValue(generalData.particleSystemId, startOpacity, 0),\n });\n\n createFloat32Attributes({\n geometry,\n propertyName: 'rotation',\n maxParticles,\n factory: () =>\n calculateValue(generalData.particleSystemId, startRotation, 0),\n });\n\n createFloat32Attributes({\n geometry,\n propertyName: 'size',\n maxParticles,\n factory: (_, index) => generalData.startValues.startSize[index],\n });\n\n createFloat32Attributes({\n geometry,\n propertyName: 'rotation',\n maxParticles,\n factory: 0,\n });\n\n const colorRandomRatio = Math.random();\n createFloat32Attributes({\n geometry,\n propertyName: 'colorR',\n maxParticles,\n factory: () =>\n startColor.min!.r! +\n colorRandomRatio * (startColor.max!.r! - startColor.min!.r!),\n });\n createFloat32Attributes({\n geometry,\n propertyName: 'colorG',\n maxParticles,\n factory: () =>\n startColor.min!.g! +\n colorRandomRatio * (startColor.max!.g! - startColor.min!.g!),\n });\n createFloat32Attributes({\n geometry,\n propertyName: 'colorB',\n maxParticles,\n factory: () =>\n startColor.min!.b! +\n colorRandomRatio * (startColor.max!.b! - startColor.min!.b!),\n });\n createFloat32Attributes({\n geometry,\n propertyName: 'colorA',\n maxParticles,\n factory: 0,\n });\n\n const deactivateParticle = (particleIndex: number) => {\n geometry.attributes.isActive.array[particleIndex] = 0;\n geometry.attributes.colorA.array[particleIndex] = 0;\n geometry.attributes.colorA.needsUpdate = true;\n freeList.push(particleIndex);\n };\n\n const activateParticle = ({\n particleIndex,\n activationTime,\n position,\n }: {\n particleIndex: number;\n activationTime: number;\n position: Required<Point3D>;\n }) => {\n geometry.attributes.isActive.array[particleIndex] = 1;\n generalData.creationTimes[particleIndex] = activationTime;\n\n if (generalData.noise.offsets)\n generalData.noise.offsets[particleIndex] = Math.random() * 100;\n\n const colorRandomRatio = Math.random();\n\n geometry.attributes.colorR.array[particleIndex] =\n startColor.min!.r! +\n colorRandomRatio * (startColor.max!.r! - startColor.min!.r!);\n geometry.attributes.colorR.needsUpdate = true;\n\n geometry.attributes.colorG.array[particleIndex] =\n startColor.min!.g! +\n colorRandomRatio * (startColor.max!.g! - startColor.min!.g!);\n geometry.attributes.colorG.needsUpdate = true;\n\n geometry.attributes.colorB.array[particleIndex] =\n startColor.min!.b! +\n colorRandomRatio * (startColor.max!.b! - startColor.min!.b!);\n geometry.attributes.colorB.needsUpdate = true;\n\n generalData.startValues.startColorR[particleIndex] =\n geometry.attributes.colorR.array[particleIndex];\n generalData.startValues.startColorG[particleIndex] =\n geometry.attributes.colorG.array[particleIndex];\n generalData.startValues.startColorB[particleIndex] =\n geometry.attributes.colorB.array[particleIndex];\n\n geometry.attributes.startFrame.array[particleIndex] =\n textureSheetAnimation.startFrame\n ? calculateValue(\n generalData.particleSystemId,\n textureSheetAnimation.startFrame,\n 0\n )\n : 0;\n geometry.attributes.startFrame.needsUpdate = true;\n\n geometry.attributes.startLifetime.array[particleIndex] =\n calculateValue(\n generalData.particleSystemId,\n startLifetime,\n generalData.normalizedLifetimePercentage\n ) * 1000;\n geometry.attributes.startLifetime.needsUpdate = true;\n\n generalData.startValues.startSize[particleIndex] = calculateValue(\n generalData.particleSystemId,\n startSize,\n generalData.normalizedLifetimePercentage\n );\n geometry.attributes.size.array[particleIndex] =\n generalData.startValues.startSize[particleIndex];\n geometry.attributes.size.needsUpdate = true;\n\n generalData.startValues.startOpacity[particleIndex] = calculateValue(\n generalData.particleSystemId,\n startOpacity,\n generalData.normalizedLifetimePercentage\n );\n geometry.attributes.colorA.array[particleIndex] =\n generalData.startValues.startOpacity[particleIndex];\n geometry.attributes.colorA.needsUpdate = true;\n\n geometry.attributes.rotation.array[particleIndex] = calculateValue(\n generalData.particleSystemId,\n startRotation,\n generalData.normalizedLifetimePercentage\n );\n geometry.attributes.rotation.needsUpdate = true;\n\n if (normalizedConfig.rotationOverLifetime.isActive)\n generalData.lifetimeValues.rotationOverLifetime[particleIndex] =\n THREE.MathUtils.randFloat(\n normalizedConfig.rotationOverLifetime.min!,\n normalizedConfig.rotationOverLifetime.max!\n );\n\n calculatePositionAndVelocity(\n generalData,\n shape,\n startSpeed,\n startPositions[particleIndex],\n velocities[particleIndex]\n );\n const positionIndex = Math.floor(particleIndex * 3);\n geometry.attributes.position.array[positionIndex] =\n position.x + startPositions[particleIndex].x;\n geometry.attributes.position.array[positionIndex + 1] =\n position.y + startPositions[particleIndex].y;\n geometry.attributes.position.array[positionIndex + 2] =\n position.z + startPositions[particleIndex].z;\n geometry.attributes.position.needsUpdate = true;\n\n if (generalData.linearVelocityData) {\n generalData.linearVelocityData[particleIndex].speed.set(\n normalizedConfig.velocityOverLifetime.linear.x\n ? calculateValue(\n generalData.particleSystemId,\n normalizedConfig.velocityOverLifetime.linear.x,\n 0\n )\n : 0,\n normalizedConfig.velocityOverLifetime.linear.y\n ? calculateValue(\n generalData.particleSystemId,\n normalizedConfig.velocityOverLifetime.linear.y,\n 0\n )\n : 0,\n normalizedConfig.velocityOverLifetime.linear.z\n ? calculateValue(\n generalData.particleSystemId,\n normalizedConfig.velocityOverLifetime.linear.z,\n 0\n )\n : 0\n );\n }\n\n if (generalData.orbitalVelocityData) {\n generalData.orbitalVelocityData[particleIndex].speed.set(\n normalizedConfig.velocityOverLifetime.orbital.x\n ? calculateValue(\n generalData.particleSystemId,\n normalizedConfig.velocityOverLifetime.orbital.x,\n 0\n )\n : 0,\n normalizedConfig.velocityOverLifetime.orbital.y\n ? calculateValue(\n generalData.particleSystemId,\n normalizedConfig.velocityOverLifetime.orbital.y,\n 0\n )\n : 0,\n normalizedConfig.velocityOverLifetime.orbital.z\n ? calculateValue(\n generalData.particleSystemId,\n normalizedConfig.velocityOverLifetime.orbital.z,\n 0\n )\n : 0\n );\n generalData.orbitalVelocityData[particleIndex].positionOffset.set(\n startPositions[particleIndex].x,\n startPositions[particleIndex].y,\n startPositions[particleIndex].z\n );\n }\n\n geometry.attributes.lifetime.array[particleIndex] = 0;\n geometry.attributes.lifetime.needsUpdate = true;\n\n applyModifiers({\n delta: 0,\n generalData,\n normalizedConfig,\n attributes: particleSystem.geometry.attributes,\n particleLifetimePercentage: 0,\n particleIndex,\n });\n };\n\n // Sub-emitter setup\n const subEmitterArr: Array<SubEmitterConfig> = subEmitters ?? [];\n const deathSubEmitters = subEmitterArr.filter(\n (s) => (s.trigger ?? SubEmitterTrigger.DEATH) === SubEmitterTrigger.DEATH\n );\n const birthSubEmitters = subEmitterArr.filter(\n (s) => s.trigger === SubEmitterTrigger.BIRTH\n );\n // Track sub-emitter instances per config for per-config maxInstances enforcement\n const subEmitterInstancesMap = new Map<\n SubEmitterConfig,\n Array<ParticleSystem>\n >();\n for (const cfg of subEmitterArr) {\n subEmitterInstancesMap.set(cfg, []);\n }\n\n const cleanupCompletedInstances = (instances: Array<ParticleSystem>) => {\n for (let i = instances.length - 1; i >= 0; i--) {\n const sub = instances[i];\n const points = sub.instance as THREE.Points;\n const isActiveArr = points.geometry?.attributes?.isActive?.array;\n if (!isActiveArr) {\n sub.dispose();\n instances.splice(i, 1);\n continue;\n }\n let hasActive = false;\n for (let j = 0; j < isActiveArr.length; j++) {\n if (isActiveArr[j]) {\n hasActive = true;\n break;\n }\n }\n if (!hasActive) {\n sub.dispose();\n instances.splice(i, 1);\n }\n }\n };\n\n const spawnSubEmitters = (\n configs: Array<SubEmitterConfig>,\n position: THREE.Vector3,\n velocity: THREE.Vector3,\n spawnNow: number\n ) => {\n for (const subConfig of configs) {\n const instances = subEmitterInstancesMap.get(subConfig)!;\n const maxInst = subConfig.maxInstances ?? 32;\n if (instances.length >= maxInst) {\n cleanupCompletedInstances(instances);\n if (instances.length >= maxInst) continue;\n }\n\n const inheritVelocity = subConfig.inheritVelocity ?? 0;\n const subSystem = createParticleSystem(\n {\n ...subConfig.config,\n looping: false,\n transform: {\n ...subConfig.config.transform,\n position: new THREE.Vector3(position.x, position.y, position.z),\n },\n ...(inheritVelocity > 0\n ? {\n startSpeed:\n (typeof subConfig.config.startSpeed === 'number'\n ? subConfig.config.startSpeed\n : typeof subConfig.config.startSpeed === 'object' &&\n subConfig.config.startSpeed !== null &&\n 'min' in subConfig.config.startSpeed\n ? ((\n subConfig.config\n .startSpeed as RandomBetweenTwoConstants\n ).min ?? 0)\n : 0) +\n velocity.length() * inheritVelocity,\n }\n : {}),\n },\n spawnNow\n );\n\n const parentObj = (wrapper || particleSystem).parent;\n if (parentObj) parentObj.add(subSystem.instance);\n\n instances.push(subSystem);\n }\n };\n\n let particleSystem = new THREE.Points(geometry, material);\n\n particleSystem.position.copy(transform!.position!);\n particleSystem.rotation.x = THREE.MathUtils.degToRad(transform.rotation!.x);\n particleSystem.rotation.y = THREE.MathUtils.degToRad(transform.rotation!.y);\n particleSystem.rotation.z = THREE.MathUtils.degToRad(transform.rotation!.z);\n particleSystem.scale.copy(transform.scale!);\n\n const calculatedCreationTime =\n now + calculateValue(generalData.particleSystemId, startDelay) * 1000;\n\n let wrapper: Gyroscope | undefined;\n if (normalizedConfig.simulationSpace === SimulationSpace.WORLD) {\n wrapper = new Gyroscope();\n wrapper.add(particleSystem);\n }\n\n const hasDeathSubEmitters = deathSubEmitters.length > 0;\n const hasBirthSubEmitters = birthSubEmitters.length > 0;\n\n const onParticleDeath = hasDeathSubEmitters\n ? (\n particleIndex: number,\n positionArr: THREE.TypedArray,\n velocity: THREE.Vector3,\n deathNow: number\n ) => {\n const posIdx = particleIndex * 3;\n _subEmitterPosition.set(\n positionArr[posIdx],\n positionArr[posIdx + 1],\n positionArr[posIdx + 2]\n );\n spawnSubEmitters(\n deathSubEmitters,\n _subEmitterPosition,\n velocity,\n deathNow\n );\n }\n : undefined;\n\n const onParticleBirth = hasBirthSubEmitters\n ? (\n particleIndex: number,\n positionArr: THREE.TypedArray,\n velocity: THREE.Vector3,\n birthNow: number\n ) => {\n const posIdx = particleIndex * 3;\n _subEmitterPosition.set(\n positionArr[posIdx],\n positionArr[posIdx + 1],\n positionArr[posIdx + 2]\n );\n spawnSubEmitters(\n birthSubEmitters,\n _subEmitterPosition,\n velocity,\n birthNow\n );\n }\n : undefined;\n\n const instanceData: ParticleSystemInstance = {\n particleSystem,\n wrapper,\n elapsedUniform: material.uniforms.elapsed,\n generalData,\n onUpdate,\n onComplete,\n creationTime: calculatedCreationTime,\n lastEmissionTime: calculatedCreationTime,\n duration,\n looping,\n simulationSpace,\n gravity,\n emission,\n normalizedConfig,\n iterationCount: 0,\n velocities,\n freeList,\n deactivateParticle,\n activateParticle,\n onParticleDeath,\n onParticleBirth,\n };\n\n createdParticleSystems.push(instanceData);\n\n const resumeEmitter = () => (generalData.isEnabled = true);\n const pauseEmitter = () => (generalData.isEnabled = false);\n const dispose = () => {\n for (const instances of subEmitterInstancesMap.values()) {\n for (const sub of instances) sub.dispose();\n instances.length = 0;\n }\n destroyParticleSystem(particleSystem);\n };\n const update = (cycleData: CycleData) => {\n updateParticleSystemInstance(instanceData, cycleData);\n for (const instances of subEmitterInstancesMap.values()) {\n for (const sub of instances) sub.update(cycleData);\n }\n };\n\n return {\n instance: wrapper || particleSystem,\n resumeEmitter,\n pauseEmitter,\n dispose,\n update,\n };\n};\n\n/**\n * Updates all active particle systems created with {@link createParticleSystem}.\n *\n * This function must be called once per frame in your animation loop to animate all particles.\n * It handles particle emission, movement, lifetime tracking, modifier application, and cleanup\n * of expired particle systems.\n *\n * @param cycleData - Object containing timing information for the current frame:\n * - `now`: Current timestamp in milliseconds (typically from `performance.now()` or `Date.now()`)\n * - `delta`: Time elapsed since the last frame in seconds\n * - `elapsed`: Total time elapsed since the animation started in seconds\n *\n * @example\n * ```typescript\n * import { createParticleSystem, updateParticleSystems } from '@newkrok/three-particles';\n *\n * const { instance } = createParticleSystem({\n * // your config\n * });\n * scene.add(instance);\n *\n * // Animation loop\n * let lastTime = 0;\n * let elapsedTime = 0;\n *\n * function animate(currentTime) {\n * requestAnimationFrame(animate);\n *\n * const delta = (currentTime - lastTime) / 1000; // Convert to seconds\n * elapsedTime += delta;\n * lastTime = currentTime;\n *\n * // Update all particle systems\n * updateParticleSystems({\n * now: currentTime,\n * delta: delta,\n * elapsed: elapsedTime\n * });\n *\n * renderer.render(scene, camera);\n * }\n *\n * animate(0);\n * ```\n *\n * @example\n * ```typescript\n * // Using Three.js Clock for timing\n * import * as THREE from 'three';\n * import { updateParticleSystems } from '@newkrok/three-particles';\n *\n * const clock = new THREE.Clock();\n *\n * function animate() {\n * requestAnimationFrame(animate);\n *\n * const delta = clock.getDelta();\n * const elapsed = clock.getElapsedTime();\n *\n * updateParticleSystems({\n * now: performance.now(),\n * delta: delta,\n * elapsed: elapsed\n * });\n *\n * renderer.render(scene, camera);\n * }\n * ```\n *\n * @see {@link createParticleSystem} - Creates particle systems to be updated\n * @see {@link CycleData} - Timing data structure\n */\nconst updateParticleSystemInstance = (\n props: ParticleSystemInstance,\n { now, delta, elapsed }: CycleData\n) => {\n const {\n onUpdate,\n generalData,\n onComplete,\n particleSystem,\n wrapper,\n elapsedUniform,\n creationTime,\n lastEmissionTime,\n duration,\n looping,\n emission,\n normalizedConfig,\n iterationCount,\n velocities,\n freeList,\n deactivateParticle,\n activateParticle,\n simulationSpace,\n gravity,\n onParticleDeath,\n onParticleBirth,\n } = props;\n\n const lifetime = now - creationTime;\n const normalizedLifetime = lifetime % (duration * 1000);\n\n generalData.normalizedLifetimePercentage = Math.max(\n Math.min(normalizedLifetime / (duration * 1000), 1),\n 0\n );\n\n const {\n lastWorldPosition,\n currentWorldPosition,\n worldPositionChange,\n lastWorldQuaternion,\n worldQuaternion,\n worldEuler,\n gravityVelocity,\n isEnabled,\n } = generalData;\n\n if (wrapper?.parent)\n generalData.wrapperQuaternion.copy(wrapper.parent.quaternion);\n\n _lastWorldPositionSnapshot.copy(lastWorldPosition);\n\n elapsedUniform.value = elapsed;\n\n particleSystem.getWorldPosition(currentWorldPosition);\n if (lastWorldPosition.x !== -99999) {\n worldPositionChange.set(\n currentWorldPosition.x - lastWorldPosition.x,\n currentWorldPosition.y - lastWorldPosition.y,\n currentWorldPosition.z - lastWorldPosition.z\n );\n }\n if (isEnabled) {\n generalData.distanceFromLastEmitByDistance += worldPositionChange.length();\n }\n particleSystem.getWorldPosition(lastWorldPosition);\n particleSystem.getWorldQuaternion(worldQuaternion);\n if (\n lastWorldQuaternion.x === -99999 ||\n lastWorldQuaternion.x !== worldQuaternion.x ||\n lastWorldQuaternion.y !== worldQuaternion.y ||\n lastWorldQuaternion.z !== worldQuaternion.z\n ) {\n worldEuler.setFromQuaternion(worldQuaternion);\n lastWorldQuaternion.copy(worldQuaternion);\n gravityVelocity.set(\n lastWorldPosition.x,\n lastWorldPosition.y + gravity,\n lastWorldPosition.z\n );\n particleSystem.worldToLocal(gravityVelocity);\n }\n\n const creationTimes = generalData.creationTimes;\n const attributes = particleSystem.geometry.attributes;\n const isActiveArr = attributes.isActive.array;\n const startLifetimeArr = attributes.startLifetime.array;\n const positionArr = attributes.position.array;\n const lifetimeArr = attributes.lifetime.array;\n const creationTimesLength = creationTimes.length;\n\n let positionNeedsUpdate = false;\n let lifetimeNeedsUpdate = false;\n\n _modifierParams.delta = delta;\n _modifierParams.generalData = generalData;\n _modifierParams.normalizedConfig = normalizedConfig;\n _modifierParams.attributes = attributes;\n\n for (let index = 0; index < creationTimesLength; index++) {\n if (isActiveArr[index]) {\n const particleLifetime = now - creationTimes[index];\n if (particleLifetime > startLifetimeArr[index]) {\n if (onParticleDeath)\n onParticleDeath(index, positionArr, velocities[index], now);\n deactivateParticle(index);\n } else {\n const velocity = velocities[index];\n velocity.x -= gravityVelocity.x * delta;\n velocity.y -= gravityVelocity.y * delta;\n velocity.z -= gravityVelocity.z * delta;\n\n if (\n gravity !== 0 ||\n velocity.x !== 0 ||\n velocity.y !== 0 ||\n velocity.z !== 0 ||\n worldPositionChange.x !== 0 ||\n worldPositionChange.y !== 0 ||\n worldPositionChange.z !== 0\n ) {\n const positionIndex = index * 3;\n\n if (simulationSpace === SimulationSpace.WORLD) {\n positionArr[positionIndex] -= worldPositionChange.x;\n positionArr[positionIndex + 1] -= worldPositionChange.y;\n positionArr[positionIndex + 2] -= worldPositionChange.z;\n }\n\n positionArr[positionIndex] += velocity.x * delta;\n positionArr[positionIndex + 1] += velocity.y * delta;\n positionArr[positionIndex + 2] += velocity.z * delta;\n positionNeedsUpdate = true;\n }\n\n lifetimeArr[index] = particleLifetime;\n lifetimeNeedsUpdate = true;\n\n _modifierParams.particleLifetimePercentage =\n particleLifetime / startLifetimeArr[index];\n _modifierParams.particleIndex = index;\n applyModifiers(_modifierParams);\n }\n }\n }\n\n if (positionNeedsUpdate) attributes.position.needsUpdate = true;\n if (lifetimeNeedsUpdate) attributes.lifetime.needsUpdate = true;\n\n if (isEnabled && (looping || lifetime < duration * 1000)) {\n const emissionDelta = now - lastEmissionTime;\n const neededParticlesByTime = emission.rateOverTime\n ? Math.floor(\n calculateValue(\n generalData.particleSystemId,\n emission.rateOverTime,\n generalData.normalizedLifetimePercentage\n ) *\n (emissionDelta / 1000)\n )\n : 0;\n\n const rateOverDistance = emission.rateOverDistance\n ? calculateValue(\n generalData.particleSystemId,\n emission.rateOverDistance,\n generalData.normalizedLifetimePercentage\n )\n : 0;\n const neededParticlesByDistance =\n rateOverDistance > 0 && generalData.distanceFromLastEmitByDistance > 0\n ? Math.floor(\n generalData.distanceFromLastEmitByDistance / (1 / rateOverDistance!)\n )\n : 0;\n const useDistanceStep = neededParticlesByDistance > 0;\n if (useDistanceStep) {\n _distanceStep.x =\n (currentWorldPosition.x - _lastWorldPositionSnapshot.x) /\n neededParticlesByDistance;\n _distanceStep.y =\n (currentWorldPosition.y - _lastWorldPositionSnapshot.y) /\n neededParticlesByDistance;\n _distanceStep.z =\n (currentWorldPosition.z - _lastWorldPositionSnapshot.z) /\n neededParticlesByDistance;\n }\n let neededParticles = neededParticlesByTime + neededParticlesByDistance;\n\n if (rateOverDistance > 0 && neededParticlesByDistance >= 1) {\n generalData.distanceFromLastEmitByDistance = 0;\n }\n\n // Process burst emissions\n if (emission.bursts && generalData.burstStates) {\n const bursts = emission.bursts;\n const burstStates = generalData.burstStates;\n const currentIterationTime = normalizedLifetime;\n\n for (let i = 0; i < bursts.length; i++) {\n const burst = bursts[i];\n const state = burstStates[i];\n const burstTimeMs = burst.time * 1000;\n const cycles = burst.cycles ?? 1;\n const intervalMs = (burst.interval ?? 0) * 1000;\n const probability = burst.probability ?? 1;\n\n // Check if we've looped and need to reset burst states\n if (\n looping &&\n currentIterationTime < burstTimeMs &&\n state.cyclesExecuted > 0\n ) {\n state.cyclesExecuted = 0;\n state.lastCycleTime = 0;\n state.probabilityPassed = false;\n }\n\n // Check if all cycles for this burst have been executed\n if (state.cyclesExecuted >= cycles) continue;\n\n // Calculate the time for the next cycle\n const nextCycleTime = burstTimeMs + state.cyclesExecuted * intervalMs;\n\n // Check if it's time for the next cycle\n if (currentIterationTime >= nextCycleTime) {\n // On first cycle, determine if probability check passes\n if (state.cyclesExecuted === 0) {\n state.probabilityPassed = Math.random() < probability;\n }\n\n // Only emit if probability check passed\n if (state.probabilityPassed) {\n const burstCount = Math.floor(\n calculateValue(\n generalData.particleSystemId,\n burst.count,\n generalData.normalizedLifetimePercentage\n )\n );\n neededParticles += burstCount;\n }\n\n state.cyclesExecuted++;\n state.lastCycleTime = currentIterationTime;\n }\n }\n }\n\n if (neededParticles > 0) {\n let generatedParticlesByDistanceNeeds = 0;\n\n for (let i = 0; i < neededParticles; i++) {\n if (freeList.length === 0) break;\n const particleIndex = freeList.pop()!;\n\n _tempPosition.x = 0;\n _tempPosition.y = 0;\n _tempPosition.z = 0;\n if (\n useDistanceStep &&\n generatedParticlesByDistanceNeeds < neededParticlesByDistance\n ) {\n _tempPosition.x = _distanceStep.x * generatedParticlesByDistanceNeeds;\n _tempPosition.y = _distanceStep.y * generatedParticlesByDistanceNeeds;\n _tempPosition.z = _distanceStep.z * generatedParticlesByDistanceNeeds;\n generatedParticlesByDistanceNeeds++;\n }\n activateParticle({\n particleIndex,\n activationTime: now,\n position: _tempPosition,\n });\n if (onParticleBirth)\n onParticleBirth(\n particleIndex,\n attributes.position.array,\n velocities[particleIndex],\n now\n );\n props.lastEmissionTime = now;\n }\n }\n\n if (onUpdate)\n onUpdate({\n particleSystem,\n delta,\n elapsed,\n lifetime,\n normalizedLifetime,\n iterationCount: iterationCount + 1,\n });\n } else if (onComplete)\n onComplete({\n particleSystem,\n });\n};\n\nexport const updateParticleSystems = (cycleData: CycleData) => {\n createdParticleSystems.forEach((props) =>\n updateParticleSystemInstance(props, cycleData)\n );\n};\n"]}
1
+ {"version":3,"sources":["../node_modules/easing-functions/index.js","../src/js/effects/three-particles/three-particles-bezier.ts","../src/js/effects/three-particles/three-particles-curves.ts","../src/js/effects/three-particles/three-particles-enums.ts","../src/js/effects/three-particles/three-particles-utils.ts","../src/js/effects/three-particles/three-particles-modifiers.ts","../node_modules/@newkrok/three-utils/dist/object-utils.js","../scripts/stubs/three-loaders.js","../node_modules/@newkrok/three-utils/dist/assets/loaders.js","../node_modules/three-noise/build/three-noise.module.js","../src/js/effects/three-particles/shaders/particle-system-fragment-shader.glsl.ts","../src/js/effects/three-particles/shaders/particle-system-vertex-shader.glsl.ts","../src/js/effects/three-particles/three-particles.ts"],"names":["exports","p","kInner","k2","Easing","CurveFunctionId","SimulationSpace","Shape","EmitFrom","TimeMode","LifeTimeCurve","SubEmitterTrigger","THREE","THREE2","THREE3","THREE6","colorRandomRatio"],"mappings":"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AAA,EACA,GAAA;AAAA,EACA,CAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,CAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,CAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,CAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,CAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,CAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,CAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,CAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAA;AAAA,EACA,EAAA;A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","file":"three-particles.min.js","sourcesContent":["// Linear easing.\n//\n// @class Easing.Linear\nconst Linear = k => k\n\n// Quadratic easing.\n//\n// @class Easing.Quadratic\nconst Quadratic = {\n\n // Ease-in.\n //\n // @method Easing.Quadratic#In\n // @param {number} k - The value to be tweened.\n // @returns {number} k^2.\n In (k) {\n return k * k\n },\n\n // Ease-out.\n //\n // @method Easing.Quadratic#Out\n // @param {number} k - The value to be tweened.\n // @returns {number} k * (2 - k).\n Out (k) {\n return k * (2 - k)\n },\n\n // Ease-in/out.\n //\n // @method Easing.Quadratic#InOut\n // @param {number} k - The value to be tweened.\n // @returns {number} The tweened value.\n InOut (k) {\n let dk = k * 2\n if (dk < 1) {\n return 0.5 * dk * dk\n }\n dk -= 1\n return - 0.5 * (dk * (dk - 2) - 1)\n }\n\n}\n\n// Cubic easing.\n//\n// @class Easing.Cubic\nconst Cubic = {\n\n // Cubic ease-in.\n //\n // @method Easing.Cubic#In\n // @param {number} k - The value to be tweened.\n // @returns {number} The tweened value.\n In (k) {\n return k * k * k\n },\n\n // Cubic ease-out.\n //\n // @method Easing.Cubic#Out\n // @param {number} k - The value to be tweened.\n // @returns {number} The tweened value.\n Out (k) {\n return -- k * k * k + 1\n },\n\n // Cubic ease-in/out.\n //\n // @method Easing.Cubic#InOut\n // @param {number} k - The value to be tweened.\n // @returns {number} The tweened value.\n InOut (k) {\n let dk = k * 2\n if (dk < 1) {\n return 0.5 * dk * dk * dk\n }\n dk -= 2\n return 0.5 * (dk * dk * dk + 2)\n }\n\n}\n\n// Quartic easing.\n//\n// @class Easing.Quartic\nconst Quartic = {\n\n // Quartic ease-in.\n //\n // @method Easing.Quartic#In\n // @param {number} k - The value to be tweened.\n // @returns {number} The tweened value.\n In (k) {\n return k * k * k * k\n },\n\n // Quartic ease-out.\n //\n // @method Easing.Quartic#Out\n // @param {number} k - The value to be tweened.\n // @returns {number} The tweened value.\n Out (k) {\n return 1 - (-- k * k * k * k)\n },\n\n // Quartic ease-in/out.\n //\n // @method Easing.Quartic#InOut\n // @param {number} k - The value to be tweened.\n // @returns {number} The tweened value.\n InOut (k) {\n let dk = k * 2\n if (dk < 1) {\n return 0.5 * dk * dk * dk * dk\n }\n dk -= 2\n return - 0.5 * (dk * dk * dk * dk - 2)\n }\n\n}\n\n// Quintic easing.\n//\n// @class Easing.Quintic\nconst Quintic = {\n\n // Quintic ease-in.\n //\n // @method Easing.Quintic#In\n // @param {number} k - The value to be tweened.\n // @returns {number} The tweened value.\n In (k) {\n return k * k * k * k * k\n },\n\n // Quintic ease-out.\n //\n // @method Easing.Quintic#Out\n // @param {number} k - The value to be tweened.\n // @returns {number} The tweened value.\n Out (k) {\n return -- k * k * k * k * k + 1\n },\n\n // Quintic ease-in/out.\n //\n // @method Easing.Quintic#InOut\n // @param {number} k - The value to be tweened.\n // @returns {number} The tweened value.\n InOut (k) {\n let dk = k * 2\n if (dk < 1) {\n return 0.5 * dk * dk * dk * dk * dk\n }\n dk -= 2\n return 0.5 * (dk * dk * dk * dk * dk + 2)\n }\n\n}\n\n// Sinusoidal easing.\n//\n// @class Easing.Sinusoidal\nconst Sinusoidal = {\n\n // Sinusoidal ease-in.\n //\n // @method Easing.Sinusoidal#In\n // @param {number} k - The value to be tweened.\n // @returns {number} The tweened value.\n In (k) {\n return 1 - Math.cos(k * Math.PI / 2)\n },\n\n // Sinusoidal ease-out.\n //\n // @method Easing.Sinusoidal#Out\n // @param {number} k - The value to be tweened.\n // @returns {number} The tweened value.\n Out (k) {\n return Math.sin(k * Math.PI / 2)\n },\n\n // Sinusoidal ease-in/out.\n //\n // @method Easing.Sinusoidal#InOut\n // @param {number} k - The value to be tweened.\n // @returns {number} The tweened value.\n InOut (k) {\n return 0.5 * (1 - Math.cos(Math.PI * k))\n }\n\n}\n\n// Exponential easing.\n//\n// @class Easing.Exponential\nconst Exponential = {\n\n // Exponential ease-in.\n //\n // @method Easing.Exponential#In\n // @param {number} k - The value to be tweened.\n // @returns {number} The tweened value.\n In (k) {\n return k === 0 ? 0 : 1024 ** (k - 1)\n },\n\n // Exponential ease-out.\n //\n // @method Easing.Exponential#Out\n // @param {number} k - The value to be tweened.\n // @returns {number} The tweened value.\n Out (k) {\n return k === 1 ? 1 : 1 - (2 ** (- 10 * k))\n },\n\n // Exponential ease-in/out.\n //\n // @method Easing.Exponential#InOut\n // @param {number} k - The value to be tweened.\n // @returns {number} The tweened value.\n InOut (k) {\n if (k === 0) return 0\n if (k === 1) return 1\n const dk = k * 2\n if (dk < 1) {\n return 0.5 * (1024 ** (dk - 1))\n }\n return 0.5 * (- (2 ** (- 10 * (dk - 1))) + 2)\n }\n\n}\n\n// Circular easing.\n//\n// @class Easing.Circular\nconst Circular = {\n\n // Circular ease-in.\n //\n // @method Easing.Circular#In\n // @param {number} k - The value to be tweened.\n // @returns {number} The tweened value.\n In (k) {\n return 1 - Math.sqrt(1 - k * k)\n },\n\n // Circular ease-out.\n //\n // @method Easing.Circular#Out\n // @param {number} k - The value to be tweened.\n // @returns {number} The tweened value.\n Out (k) {\n return Math.sqrt(1 - (-- k * k))\n },\n\n // Circular ease-in/out.\n //\n // @method Easing.Circular#InOut\n // @param {number} k - The value to be tweened.\n // @returns {number} The tweened value.\n InOut (k) {\n let dk = k * 2\n if (dk < 1) {\n return - 0.5 * (Math.sqrt(1 - dk * dk) - 1)\n }\n dk -= 2\n return 0.5 * (Math.sqrt(1 - dk * dk) + 1)\n }\n\n}\n\n// Elastic easing.\n//\n// @class Easing.Elastic\nconst Elastic = {\n\n // Elastic ease-in.\n //\n // @method Easing.Elastic#In\n // @param {number} k - The value to be tweened.\n // @returns {number} The tweened value.\n In (k) {\n let a = 0.1\n const p = 0.4\n let s\n if (k === 0) return 0\n if (k === 1) return 1\n if (a < 1) {\n a = 1\n s = p / 4\n } else {\n s = p * Math.asin(1 / a) / (2 * Math.PI)\n }\n k -= 1\n return - (a * (2 ** (10 * k)) * Math.sin((k - s) * (2 * Math.PI) / p))\n },\n\n // Elastic ease-out.\n //\n // @method Easing.Elastic#Out\n // @param {number} k - The value to be tweened.\n // @returns {number} The tweened value.\n Out (k) {\n let a = 0.1\n const p = 0.4\n let s\n if (k === 0) return 0\n if (k === 1) return 1\n if (a < 1) {\n a = 1\n s = p / 4\n } else {\n s = p * Math.asin(1 / a) / (2 * Math.PI)\n }\n return (a * (2 ** (- 10 * k)) * Math.sin((k - s) * (2 * Math.PI) / p) + 1)\n },\n\n // Elastic ease-in/out.\n //\n // @method Easing.Elastic#InOut\n // @param {number} k - The value to be tweened.\n // @returns {number} The tweened value.\n InOut (k) {\n let a = 0.1\n const p = 0.4\n let s\n if (k === 0) return 0\n if (k === 1) return 1\n if (a < 1) {\n a = 1\n s = p / 4\n } else {\n s = p * Math.asin(1 / a) / (2 * Math.PI)\n }\n const dk = k * 2\n if (dk < 1) {\n const kInner = dk - 1\n return - 0.5 * (a * (2 ** (10 * kInner)) * Math.sin((kInner - s) * (2 * Math.PI) / p))\n }\n const kInner = dk - 1\n return a * (2 ** (- 10 * kInner)) * Math.sin((kInner - s) * (2 * Math.PI) / p) * 0.5 + 1\n }\n\n}\n\n// Back easing.\n//\n// @class Easing.Back\nconst Back = {\n\n // Back ease-in.\n //\n // @method Easing.Back#In\n // @param {number} k - The value to be tweened.\n // @returns {number} The tweened value.\n In (k) {\n const s = 1.70158\n return k * k * ((s + 1) * k - s)\n },\n\n // Back ease-out.\n //\n // @method Easing.Back#Out\n // @param {number} k - The value to be tweened.\n // @returns {number} The tweened value.\n Out (k) {\n const s = 1.70158\n return -- k * k * ((s + 1) * k + s) + 1\n },\n\n // Back ease-in/out.\n //\n // @method Easing.Back#InOut\n // @param {number} k - The value to be tweened.\n // @returns {number} The tweened value.\n InOut (k) {\n const s = 1.70158 * 1.525\n let dk = k * 2\n if (dk < 1) {\n return 0.5 * (dk * dk * ((s + 1) * dk - s))\n }\n dk -= 2\n return 0.5 * (dk * dk * ((s + 1) * dk + s) + 2)\n }\n\n}\n\n// Bounce easing.\n//\n// @class Easing.Bounce\nconst Bounce = {\n\n // Bounce ease-in.\n //\n // @method Easing.Bounce#In\n // @param {number} k - The value to be tweened.\n // @returns {number} The tweened value.\n In (k) {\n return 1 - Bounce.Out(1 - k)\n },\n\n // Bounce ease-out.\n //\n // @method Easing.Bounce#Out\n // @param {number} k - The value to be tweened.\n // @returns {number} The tweened value.\n Out (k) {\n if (k < 1 / 2.75) {\n return 7.5625 * k * k\n } if (k < 2 / 2.75) {\n const k2 = k - (1.5 / 2.75)\n return 7.5625 * k2 * k2 + 0.75\n } if (k < 2.5 / 2.75) {\n const k2 = k - (2.25 / 2.75)\n return 7.5625 * k2 * k2 + 0.9375\n }\n const k2 = k - (2.625 / 2.75)\n return 7.5625 * k2 * k2 + 0.984375\n },\n\n // Bounce ease-in/out.\n //\n // @method Easing.Bounce#InOut\n // @param {number} k - The value to be tweened.\n // @returns {number} The tweened value.\n InOut (k) {\n if (k < 0.5) return Bounce.In(k * 2) * 0.5\n return Bounce.Out(k * 2 - 1) * 0.5 + 0.5\n }\n\n}\n\nconst Easing = {\n Quadratic,\n Cubic,\n Quartic,\n Quintic,\n Sinusoidal,\n Exponential,\n Circular,\n Elastic,\n Back,\n Bounce,\n}\n\nconst define = (obj, key, value) => Object.defineProperty(obj, key, {\n value\n})\n\nfor (const key of Object.keys(Easing)) {\n const obj = Easing[key]\n const lowerKey = key.toLowerCase()\n define(Easing, lowerKey, obj)\n\n for (const prop of Object.keys(obj)) {\n const fn = obj[prop]\n const lowerProp = prop.toLowerCase()\n\n // Easing['Quadratic.In']\n define(Easing, `${key}.${prop}`, fn)\n\n // Easing['quadratic.in']\n define(Easing, `${lowerKey}.${lowerProp}`, fn)\n define(obj, lowerProp, fn)\n }\n}\n\nEasing.Linear = Linear\ndefine(Easing, 'linear', Linear)\n\nmodule.exports = Easing\n\nif (typeof window !== 'undefined') {\n window.Easing = Easing\n}\n","import { BezierPoint, CurveFunction } from './types.js';\n\nconst cache: Array<{\n bezierPoints: Array<BezierPoint>;\n curveFunction: CurveFunction;\n referencedBy: Array<number>;\n}> = [];\n\nconst nCr = (n: number, k: number) => {\n let z = 1;\n for (let i = 1; i <= k; i++) z *= (n + 1 - i) / i;\n return z;\n};\n\nexport const createBezierCurveFunction = (\n particleSystemId: number,\n bezierPoints: Array<BezierPoint>\n) => {\n const cacheEntry = cache.find((item) => item.bezierPoints === bezierPoints);\n\n if (cacheEntry) {\n if (!cacheEntry.referencedBy.includes(particleSystemId))\n cacheEntry.referencedBy.push(particleSystemId);\n return cacheEntry.curveFunction;\n }\n\n const entry = {\n referencedBy: [particleSystemId],\n bezierPoints,\n curveFunction: (percentage: number): number => {\n if (percentage < 0) return bezierPoints[0].y;\n if (percentage > 1) return bezierPoints[bezierPoints.length - 1].y;\n\n let start = 0;\n let stop = bezierPoints.length - 1;\n\n bezierPoints.find((point, index) => {\n const result = percentage < (point.percentage ?? 0);\n if (result) stop = index;\n else if (point.percentage !== undefined) start = index;\n return result;\n });\n\n const n = stop - start;\n const calculatedPercentage =\n (percentage - (bezierPoints[start].percentage ?? 0)) /\n ((bezierPoints[stop].percentage ?? 1) -\n (bezierPoints[start].percentage ?? 0));\n\n let value = 0;\n for (let i = 0; i <= n; i++) {\n const p = bezierPoints[start + i];\n const c =\n nCr(n, i) *\n Math.pow(1 - calculatedPercentage, n - i) *\n Math.pow(calculatedPercentage, i);\n value += c * p.y;\n }\n return value;\n },\n };\n\n cache.push(entry);\n return entry.curveFunction;\n};\n\nexport const removeBezierCurveFunction = (particleSystemId: number) => {\n while (true) {\n const index = cache.findIndex((item) =>\n item.referencedBy.includes(particleSystemId)\n );\n if (index === -1) break;\n const entry = cache[index];\n entry.referencedBy = entry.referencedBy.filter(\n (id) => id !== particleSystemId\n );\n if (entry.referencedBy.length === 0) cache.splice(index, 1);\n }\n};\n\nexport const getBezierCacheSize = () => cache.length;\n","import Easing from 'easing-functions';\nimport { CurveFunction } from './types.js';\n\n/**\n * Predefined easing function identifiers for animating particle properties\n * over their lifetime.\n *\n * These functions control the rate of change and create different animation\n * feels. Each type has three variants:\n * - **IN**: Starts slow, accelerates toward the end\n * - **OUT**: Starts fast, decelerates toward the end\n * - **IN_OUT**: Combines both, slow at start and end, fast in middle\n *\n * @enum {string}\n *\n * @see {@link https://easings.net/} - Visual reference for easing functions\n */\nexport const enum CurveFunctionId {\n /** Use custom Bezier curve (not an easing function) */\n BEZIER = 'BEZIER',\n\n /** Linear interpolation with constant rate of change */\n LINEAR = 'LINEAR',\n\n /** Quadratic (t²) easing - gentle acceleration */\n QUADRATIC_IN = 'QUADRATIC_IN',\n /** Quadratic (t²) easing - gentle deceleration */\n QUADRATIC_OUT = 'QUADRATIC_OUT',\n /** Quadratic (t²) easing - gentle acceleration then deceleration */\n QUADRATIC_IN_OUT = 'QUADRATIC_IN_OUT',\n\n /** Cubic (t³) easing - moderate acceleration */\n CUBIC_IN = 'CUBIC_IN',\n /** Cubic (t³) easing - moderate deceleration */\n CUBIC_OUT = 'CUBIC_OUT',\n /** Cubic (t³) easing - moderate acceleration then deceleration */\n CUBIC_IN_OUT = 'CUBIC_IN_OUT',\n\n /** Quartic (t⁴) easing - strong acceleration */\n QUARTIC_IN = 'QUARTIC_IN',\n /** Quartic (t⁴) easing - strong deceleration */\n QUARTIC_OUT = 'QUARTIC_OUT',\n /** Quartic (t⁴) easing - strong acceleration then deceleration */\n QUARTIC_IN_OUT = 'QUARTIC_IN_OUT',\n\n /** Quintic (t⁵) easing - very strong acceleration */\n QUINTIC_IN = 'QUINTIC_IN',\n /** Quintic (t⁵) easing - very strong deceleration */\n QUINTIC_OUT = 'QUINTIC_OUT',\n /** Quintic (t⁵) easing - very strong acceleration then deceleration */\n QUINTIC_IN_OUT = 'QUINTIC_IN_OUT',\n\n /** Sinusoidal easing - smooth, natural acceleration */\n SINUSOIDAL_IN = 'SINUSOIDAL_IN',\n /** Sinusoidal easing - smooth, natural deceleration */\n SINUSOIDAL_OUT = 'SINUSOIDAL_OUT',\n /** Sinusoidal easing - smooth acceleration then deceleration */\n SINUSOIDAL_IN_OUT = 'SINUSOIDAL_IN_OUT',\n\n /** Exponential easing - dramatic, explosive acceleration */\n EXPONENTIAL_IN = 'EXPONENTIAL_IN',\n /** Exponential easing - dramatic, explosive deceleration */\n EXPONENTIAL_OUT = 'EXPONENTIAL_OUT',\n /** Exponential easing - dramatic acceleration then deceleration */\n EXPONENTIAL_IN_OUT = 'EXPONENTIAL_IN_OUT',\n\n /** Circular easing - sharp acceleration with curved trajectory */\n CIRCULAR_IN = 'CIRCULAR_IN',\n /** Circular easing - sharp deceleration with curved trajectory */\n CIRCULAR_OUT = 'CIRCULAR_OUT',\n /** Circular easing - sharp acceleration then deceleration */\n CIRCULAR_IN_OUT = 'CIRCULAR_IN_OUT',\n\n /** Elastic easing - oscillates back before accelerating (spring-like) */\n ELASTIC_IN = 'ELASTIC_IN',\n /** Elastic easing - overshoots then oscillates back (spring-like) */\n ELASTIC_OUT = 'ELASTIC_OUT',\n /** Elastic easing - oscillates at both ends (spring-like) */\n ELASTIC_IN_OUT = 'ELASTIC_IN_OUT',\n\n /** Back easing - pulls back before accelerating forward */\n BACK_IN = 'BACK_IN',\n /** Back easing - overshoots forward then pulls back */\n BACK_OUT = 'BACK_OUT',\n /** Back easing - pulls back, overshoots, then settles */\n BACK_IN_OUT = 'BACK_IN_OUT',\n\n /** Bounce easing - bounces at the start */\n BOUNCE_IN = 'BOUNCE_IN',\n /** Bounce easing - bounces at the end (like a ball landing) */\n BOUNCE_OUT = 'BOUNCE_OUT',\n /** Bounce easing - bounces at both start and end */\n BOUNCE_IN_OUT = 'BOUNCE_IN_OUT',\n}\n\nexport const curveFunctionIdMap: Partial<\n Record<CurveFunctionId, CurveFunction>\n> = {\n [CurveFunctionId.LINEAR]: Easing.Linear.None,\n [CurveFunctionId.QUADRATIC_IN]: Easing.Quadratic.In,\n [CurveFunctionId.QUADRATIC_OUT]: Easing.Quadratic.Out,\n [CurveFunctionId.QUADRATIC_IN_OUT]: Easing.Quadratic.InOut,\n [CurveFunctionId.CUBIC_IN]: Easing.Cubic.In,\n [CurveFunctionId.CUBIC_OUT]: Easing.Cubic.Out,\n [CurveFunctionId.CUBIC_IN_OUT]: Easing.Cubic.InOut,\n [CurveFunctionId.QUARTIC_IN]: Easing.Quartic.In,\n [CurveFunctionId.QUARTIC_OUT]: Easing.Quartic.Out,\n [CurveFunctionId.QUARTIC_IN_OUT]: Easing.Quartic.InOut,\n [CurveFunctionId.QUINTIC_IN]: Easing.Quintic.In,\n [CurveFunctionId.QUINTIC_OUT]: Easing.Quintic.Out,\n [CurveFunctionId.QUINTIC_IN_OUT]: Easing.Quintic.InOut,\n [CurveFunctionId.SINUSOIDAL_IN]: Easing.Sinusoidal.In,\n [CurveFunctionId.SINUSOIDAL_OUT]: Easing.Sinusoidal.Out,\n [CurveFunctionId.SINUSOIDAL_IN_OUT]: Easing.Sinusoidal.InOut,\n [CurveFunctionId.EXPONENTIAL_IN]: Easing.Exponential.In,\n [CurveFunctionId.EXPONENTIAL_OUT]: Easing.Exponential.Out,\n [CurveFunctionId.EXPONENTIAL_IN_OUT]: Easing.Exponential.InOut,\n [CurveFunctionId.CIRCULAR_IN]: Easing.Circular.In,\n [CurveFunctionId.CIRCULAR_OUT]: Easing.Circular.Out,\n [CurveFunctionId.CIRCULAR_IN_OUT]: Easing.Circular.InOut,\n [CurveFunctionId.ELASTIC_IN]: Easing.Elastic.In,\n [CurveFunctionId.ELASTIC_OUT]: Easing.Elastic.Out,\n [CurveFunctionId.ELASTIC_IN_OUT]: Easing.Elastic.InOut,\n [CurveFunctionId.BACK_IN]: Easing.Back.In,\n [CurveFunctionId.BACK_OUT]: Easing.Back.Out,\n [CurveFunctionId.BACK_IN_OUT]: Easing.Back.InOut,\n [CurveFunctionId.BOUNCE_IN]: Easing.Bounce.In,\n [CurveFunctionId.BOUNCE_OUT]: Easing.Bounce.Out,\n [CurveFunctionId.BOUNCE_IN_OUT]: Easing.Bounce.InOut,\n};\n\n/**\n * Resolves a curve function from an identifier or returns the function itself.\n *\n * This utility function allows you to use either a {@link CurveFunctionId} string\n * identifier or a custom function directly.\n *\n * @param curveFunctionId - Either a {@link CurveFunctionId} enum value or a\n * custom {@link CurveFunction} implementation\n * @returns The actual easing function that takes a normalized time value (0-1)\n * and returns the eased value\n *\n * @example\n * ```typescript\n * import { getCurveFunction, CurveFunctionId } from '@newkrok/three-particles';\n *\n * // Using a predefined easing function\n * const easingFunc = getCurveFunction(CurveFunctionId.CUBIC_OUT);\n * console.log(easingFunc(0.5)); // Returns eased value at 50% progress\n *\n * // Using a custom function\n * const customEasing = (t: number) => t * t; // Quadratic\n * const customFunc = getCurveFunction(customEasing);\n * console.log(customFunc(0.5)); // Returns 0.25\n * ```\n */\nexport const getCurveFunction = (\n curveFunctionId: CurveFunctionId | CurveFunction\n): CurveFunction =>\n typeof curveFunctionId === 'function'\n ? curveFunctionId\n : curveFunctionIdMap[curveFunctionId]!;\n","/**\n * Defines the coordinate space in which particles are simulated.\n *\n * @enum {string}\n */\nexport const enum SimulationSpace {\n /**\n * Particles move relative to the emitter's local coordinate system.\n * When the emitter moves or rotates, particles move with it.\n * Ideal for effects attached to moving objects (e.g., engine trails, character auras).\n */\n LOCAL = 'LOCAL',\n\n /**\n * Particles move in world space and are independent of the emitter's transform.\n * Once emitted, particles remain stationary or move according to their velocity in world coordinates.\n * Ideal for environmental effects (e.g., smoke, explosions, ambient particles).\n */\n WORLD = 'WORLD',\n}\n\n/**\n * Defines the geometric shape from which particles are emitted.\n *\n * @enum {string}\n */\nexport const enum Shape {\n /**\n * Emit particles from a spherical volume or shell.\n * Configure with {@link Sphere} properties (radius, arc, radiusThickness).\n */\n SPHERE = 'SPHERE',\n\n /**\n * Emit particles from a conical volume or shell.\n * Configure with {@link Cone} properties (angle, radius, arc, radiusThickness).\n * Useful for directional effects like fire, smoke plumes, or spray effects.\n */\n CONE = 'CONE',\n\n /**\n * Emit particles from a box volume, shell, or edges.\n * Configure with {@link Box} properties (scale, emitFrom).\n * Useful for area-based effects like dust clouds or rain.\n */\n BOX = 'BOX',\n\n /**\n * Emit particles from a circular area or edge.\n * Configure with {@link Circle} properties (radius, arc, radiusThickness).\n * Useful for ground impacts, rings, or radial effects.\n */\n CIRCLE = 'CIRCLE',\n\n /**\n * Emit particles from a rectangular area.\n * Configure with {@link Rectangle} properties (scale, rotation).\n * Useful for planar effects like rain on a surface or screen effects.\n */\n RECTANGLE = 'RECTANGLE',\n}\n\n/**\n * Defines where on a shape particles are emitted from.\n * Not all shapes support all emit modes.\n *\n * @enum {string}\n */\nexport const enum EmitFrom {\n /**\n * Emit particles from random positions within the entire volume of the shape.\n * Supported by: SPHERE, CONE, BOX.\n */\n VOLUME = 'VOLUME',\n\n /**\n * Emit particles from the surface/shell of the shape.\n * Supported by: SPHERE, CONE, BOX.\n */\n SHELL = 'SHELL',\n\n /**\n * Emit particles from the edges of the shape.\n * Supported by: BOX.\n */\n EDGE = 'EDGE',\n}\n\n/**\n * Defines how texture sheet animation is timed.\n *\n * @enum {string}\n */\nexport const enum TimeMode {\n /**\n * Animation frames are based on the particle's lifetime percentage.\n * The animation completes once over the particle's lifetime.\n */\n LIFETIME = 'LIFETIME',\n\n /**\n * Animation frames are based on frames per second (FPS).\n * The animation runs at a fixed speed regardless of particle lifetime.\n */\n FPS = 'FPS',\n}\n\n/**\n * Defines the type of curve function used for animating values over a particle's lifetime.\n *\n * @enum {string}\n */\nexport const enum LifeTimeCurve {\n /**\n * Use custom Bezier curves with control points.\n * Provides maximum control over the animation curve shape.\n * See {@link BezierCurve} for configuration.\n */\n BEZIER = 'BEZIER',\n\n /**\n * Use predefined easing functions (e.g., easeInQuad, easeOutCubic).\n * Convenient for common animation patterns.\n * See {@link EasingCurve} and {@link CurveFunctionId} for available functions.\n */\n EASING = 'EASING',\n}\n\n/**\n * Defines when a sub-emitter is triggered relative to a particle's lifecycle.\n *\n * @enum {string}\n */\nexport const enum SubEmitterTrigger {\n /**\n * Trigger the sub-emitter when a particle is born (activated).\n * Useful for trail effects that start immediately with each particle.\n */\n BIRTH = 'BIRTH',\n\n /**\n * Trigger the sub-emitter when a particle dies (reaches end of lifetime).\n * Useful for cascading effects like explosions spawning smoke.\n */\n DEATH = 'DEATH',\n}\n","import * as THREE from 'three';\n\nimport { createBezierCurveFunction } from './three-particles-bezier.js';\nimport { EmitFrom, LifeTimeCurve } from './three-particles-enums.js';\nimport {\n Constant,\n LifetimeCurve,\n Point3D,\n RandomBetweenTwoConstants,\n} from './types.js';\n\n/**\n * Calculates random position and velocity for particles emitted from a sphere.\n *\n * Supports emission from the entire volume or just the shell of the sphere.\n * Uses spherical coordinates for uniform distribution across the surface.\n *\n * @param position - Output vector for the particle's starting position\n * @param quaternion - Rotation to apply to the emission shape\n * @param velocity - Output vector for the particle's initial velocity\n * @param speed - Speed multiplier for the velocity\n * @param params - Sphere configuration\n * @param params.radius - Radius of the sphere\n * @param params.radiusThickness - Controls emission from volume (1.0) vs shell (0.0)\n * @param params.arc - Arc angle in degrees (360 = full sphere, 180 = hemisphere)\n *\n * @remarks\n * - `radiusThickness = 1.0`: Emit from entire volume\n * - `radiusThickness = 0.0`: Emit only from surface shell\n * - Particles are emitted radially outward from the center\n *\n * @see {@link Sphere} - Configuration type for sphere shape\n */\nexport const calculateRandomPositionAndVelocityOnSphere = (\n position: THREE.Vector3,\n quaternion: THREE.Quaternion,\n velocity: THREE.Vector3,\n speed: number,\n {\n radius,\n radiusThickness,\n arc,\n }: { radius: number; radiusThickness: number; arc: number }\n) => {\n const u = Math.random() * (arc / 360);\n const v = Math.random();\n const randomizedDistanceRatio = Math.random();\n const theta = 2 * Math.PI * u;\n const phi = Math.acos(2 * v - 1);\n const sinPhi = Math.sin(phi);\n\n const xDirection = sinPhi * Math.cos(theta);\n const yDirection = sinPhi * Math.sin(theta);\n const zDirection = Math.cos(phi);\n const normalizedThickness = 1 - radiusThickness;\n\n position.x =\n radius * normalizedThickness * xDirection +\n radius * radiusThickness * randomizedDistanceRatio * xDirection;\n position.y =\n radius * normalizedThickness * yDirection +\n radius * radiusThickness * randomizedDistanceRatio * yDirection;\n position.z =\n radius * normalizedThickness * zDirection +\n radius * radiusThickness * randomizedDistanceRatio * zDirection;\n\n position.applyQuaternion(quaternion);\n\n const speedMultiplierByPosition = 1 / position.length();\n velocity.set(\n position.x * speedMultiplierByPosition * speed,\n position.y * speedMultiplierByPosition * speed,\n position.z * speedMultiplierByPosition * speed\n );\n velocity.applyQuaternion(quaternion);\n};\n\n/**\n * Calculates random position and velocity for particles emitted from a cone.\n *\n * Useful for directional particle effects like fire, smoke plumes, fountains,\n * or spray effects. The cone emits particles in a spreading pattern.\n *\n * @param position - Output vector for the particle's starting position\n * @param quaternion - Rotation to apply to the emission shape\n * @param velocity - Output vector for the particle's initial velocity\n * @param speed - Speed multiplier for the velocity\n * @param params - Cone configuration\n * @param params.radius - Base radius of the cone\n * @param params.radiusThickness - Controls emission from volume (1.0) vs shell (0.0)\n * @param params.arc - Arc angle in degrees (360 = full cone, 180 = half cone)\n * @param params.angle - Cone opening angle in degrees (default: 90)\n * Smaller values create tighter cones\n *\n * @remarks\n * - The cone emits from its base (circular area) outward\n * - Particles travel in a conical spread pattern\n * - `angle = 0`: Straight line (no spread)\n * - `angle = 90`: Wide cone\n * - Common for fire (10-30°), smoke (30-60°), explosions (60-90°)\n *\n * @see {@link Cone} - Configuration type for cone shape\n */\nexport const calculateRandomPositionAndVelocityOnCone = (\n position: THREE.Vector3,\n quaternion: THREE.Quaternion,\n velocity: THREE.Vector3,\n speed: number,\n {\n radius,\n radiusThickness,\n arc,\n angle = 90,\n }: {\n radius: number;\n radiusThickness: number;\n arc: number;\n angle?: number;\n }\n) => {\n const theta = 2 * Math.PI * Math.random() * (arc / 360);\n const randomizedDistanceRatio = Math.random();\n\n const xDirection = Math.cos(theta);\n const yDirection = Math.sin(theta);\n const normalizedThickness = 1 - radiusThickness;\n\n position.x =\n radius * normalizedThickness * xDirection +\n radius * radiusThickness * randomizedDistanceRatio * xDirection;\n position.y =\n radius * normalizedThickness * yDirection +\n radius * radiusThickness * randomizedDistanceRatio * yDirection;\n position.z = 0;\n\n position.applyQuaternion(quaternion);\n\n const positionLength = position.length();\n const normalizedAngle = Math.abs(\n (positionLength / radius) * THREE.MathUtils.degToRad(angle)\n );\n const sinNormalizedAngle = Math.sin(normalizedAngle);\n\n const speedMultiplierByPosition = 1 / positionLength;\n velocity.set(\n position.x * sinNormalizedAngle * speedMultiplierByPosition * speed,\n position.y * sinNormalizedAngle * speedMultiplierByPosition * speed,\n Math.cos(normalizedAngle) * speed\n );\n velocity.applyQuaternion(quaternion);\n};\n\n/**\n * Calculates random position and velocity for particles emitted from a box.\n *\n * Supports three emission modes: volume, shell (surface), and edges.\n * Useful for area-based effects like dust clouds, rain, or geometric patterns.\n *\n * @param position - Output vector for the particle's starting position\n * @param quaternion - Rotation to apply to the emission shape\n * @param velocity - Output vector for the particle's initial velocity\n * @param speed - Speed multiplier for the velocity\n * @param params - Box configuration\n * @param params.scale - Size of the box on each axis (width, height, depth)\n * @param params.emitFrom - Emission mode:\n * - `VOLUME`: Random positions throughout the entire box volume\n * - `SHELL`: Random positions on the 6 faces (surface)\n * - `EDGE`: Random positions along the 12 edges\n *\n * @remarks\n * - All particles emit with velocity along the +Z axis (forward)\n * - Box is centered at the origin before rotation\n * - VOLUME mode: Best for rain, snow, or volumetric clouds\n * - SHELL mode: Best for hollow effects or surface particles\n * - EDGE mode: Best for wireframe effects or particle outlines\n *\n * @see {@link Box} - Configuration type for box shape\n * @see {@link EmitFrom} - Emission mode enum\n */\nexport const calculateRandomPositionAndVelocityOnBox = (\n position: THREE.Vector3,\n quaternion: THREE.Quaternion,\n velocity: THREE.Vector3,\n speed: number,\n { scale, emitFrom }: { scale: Point3D; emitFrom: EmitFrom }\n) => {\n const _scale = scale as Required<Point3D>;\n switch (emitFrom) {\n case EmitFrom.VOLUME:\n position.x = Math.random() * _scale.x - _scale.x / 2;\n position.y = Math.random() * _scale.y - _scale.y / 2;\n position.z = Math.random() * _scale.z - _scale.z / 2;\n break;\n\n case EmitFrom.SHELL:\n const side = Math.floor(Math.random() * 6);\n const perpendicularAxis = side % 3;\n const shellResult = [];\n shellResult[perpendicularAxis] = side > 2 ? 1 : 0;\n shellResult[(perpendicularAxis + 1) % 3] = Math.random();\n shellResult[(perpendicularAxis + 2) % 3] = Math.random();\n position.x = shellResult[0] * _scale.x - _scale.x / 2;\n position.y = shellResult[1] * _scale.y - _scale.y / 2;\n position.z = shellResult[2] * _scale.z - _scale.z / 2;\n break;\n\n case EmitFrom.EDGE:\n const side2 = Math.floor(Math.random() * 6);\n const perpendicularAxis2 = side2 % 3;\n const edge = Math.floor(Math.random() * 4);\n const edgeResult = [];\n edgeResult[perpendicularAxis2] = side2 > 2 ? 1 : 0;\n edgeResult[(perpendicularAxis2 + 1) % 3] =\n edge < 2 ? Math.random() : edge - 2;\n edgeResult[(perpendicularAxis2 + 2) % 3] =\n edge < 2 ? edge : Math.random();\n position.x = edgeResult[0] * _scale.x - _scale.x / 2;\n position.y = edgeResult[1] * _scale.y - _scale.y / 2;\n position.z = edgeResult[2] * _scale.z - _scale.z / 2;\n break;\n }\n\n position.applyQuaternion(quaternion);\n\n velocity.set(0, 0, speed);\n velocity.applyQuaternion(quaternion);\n};\n\n/**\n * Calculates random position and velocity for particles emitted from a circle.\n *\n * Emits particles from a circular area or ring. Useful for ground impacts,\n * radial effects, magic circles, or any circular planar emission.\n *\n * @param position - Output vector for the particle's starting position\n * @param quaternion - Rotation to apply to the emission shape\n * @param velocity - Output vector for the particle's initial velocity\n * @param speed - Speed multiplier for the velocity\n * @param params - Circle configuration\n * @param params.radius - Radius of the circle\n * @param params.radiusThickness - Controls emission from area (1.0) vs edge (0.0)\n * @param params.arc - Arc angle in degrees (360 = full circle, 180 = semicircle)\n *\n * @remarks\n * - Circle lies in the XY plane by default (Z = 0)\n * - Particles emit along the +Z axis (perpendicular to circle)\n * - `radiusThickness = 1.0`: Filled circle (disc)\n * - `radiusThickness = 0.0`: Ring (circle edge only)\n * - Good for ground impact effects, teleport circles, or radial bursts\n *\n * @see {@link Circle} - Configuration type for circle shape\n */\nexport const calculateRandomPositionAndVelocityOnCircle = (\n position: THREE.Vector3,\n quaternion: THREE.Quaternion,\n velocity: THREE.Vector3,\n speed: number,\n {\n radius,\n radiusThickness,\n arc,\n }: { radius: number; radiusThickness: number; arc: number }\n) => {\n const theta = 2 * Math.PI * Math.random() * (arc / 360);\n const randomizedDistanceRatio = Math.random();\n\n const xDirection = Math.cos(theta);\n const yDirection = Math.sin(theta);\n const normalizedThickness = 1 - radiusThickness;\n\n position.x =\n radius * normalizedThickness * xDirection +\n radius * radiusThickness * randomizedDistanceRatio * xDirection;\n position.y =\n radius * normalizedThickness * yDirection +\n radius * radiusThickness * randomizedDistanceRatio * yDirection;\n position.z = 0;\n\n position.applyQuaternion(quaternion);\n\n const positionLength = position.length();\n const speedMultiplierByPosition = 1 / positionLength;\n velocity.set(\n position.x * speedMultiplierByPosition * speed,\n position.y * speedMultiplierByPosition * speed,\n 0\n );\n velocity.applyQuaternion(quaternion);\n};\n\n/**\n * Calculates random position and velocity for particles emitted from a rectangle.\n *\n * Emits particles from a rectangular planar area. Useful for rain on a surface,\n * screen-space effects, or any planar emission pattern.\n *\n * @param position - Output vector for the particle's starting position\n * @param quaternion - Rotation to apply to the emission shape\n * @param velocity - Output vector for the particle's initial velocity\n * @param speed - Speed multiplier for the velocity\n * @param params - Rectangle configuration\n * @param params.rotation - Local rotation of the rectangle (degrees) before\n * applying quaternion\n * @param params.scale - Size of the rectangle (width and height)\n *\n * @remarks\n * - Rectangle lies in the XY plane by default\n * - Particles emit along the +Z axis (perpendicular to rectangle)\n * - The rotation parameter allows tilting the rectangle before the main\n * quaternion rotation is applied\n * - Good for rain effects, screen particles, or planar area emissions\n *\n * @see {@link Rectangle} - Configuration type for rectangle shape\n */\nexport const calculateRandomPositionAndVelocityOnRectangle = (\n position: THREE.Vector3,\n quaternion: THREE.Quaternion,\n velocity: THREE.Vector3,\n speed: number,\n { rotation, scale }: { rotation: Point3D; scale: Point3D }\n) => {\n const _scale = scale as Required<Point3D>;\n const _rotation = rotation as Required<Point3D>;\n\n const xOffset = Math.random() * _scale.x - _scale.x / 2;\n const yOffset = Math.random() * _scale.y - _scale.y / 2;\n const rotationX = THREE.MathUtils.degToRad(_rotation.x);\n const rotationY = THREE.MathUtils.degToRad(_rotation.y);\n position.x = xOffset * Math.cos(rotationY);\n position.y = yOffset * Math.cos(rotationX);\n position.z = xOffset * Math.sin(rotationY) - yOffset * Math.sin(rotationX);\n\n position.applyQuaternion(quaternion);\n\n velocity.set(0, 0, speed);\n velocity.applyQuaternion(quaternion);\n};\n\n/**\n * Creates a default white circle texture using CanvasTexture.\n * @returns {THREE.CanvasTexture | null} The generated texture or null if context fails.\n */\nexport const createDefaultParticleTexture = (): THREE.CanvasTexture | null => {\n try {\n const canvas = document.createElement('canvas');\n const size = 64;\n canvas.width = size;\n canvas.height = size;\n const context = canvas.getContext('2d');\n if (context) {\n const centerX = size / 2;\n const centerY = size / 2;\n const radius = size / 2 - 2; // Small padding\n\n context.beginPath();\n context.arc(centerX, centerY, radius, 0, 2 * Math.PI, false);\n context.fillStyle = 'white';\n context.fill();\n const texture = new THREE.CanvasTexture(canvas);\n texture.needsUpdate = true;\n return texture;\n } else {\n console.warn(\n 'Could not get 2D context to generate default particle texture.'\n );\n return null;\n }\n } catch (error) {\n // Handle potential errors (e.g., document not available in non-browser env)\n console.warn('Error creating default particle texture:', error);\n return null;\n }\n};\n\nexport const isLifeTimeCurve = (\n value: Constant | RandomBetweenTwoConstants | LifetimeCurve\n): value is LifetimeCurve => {\n return typeof value !== 'number' && 'type' in value;\n};\n\nexport const getCurveFunctionFromConfig = (\n particleSystemId: number,\n lifetimeCurve: LifetimeCurve\n) => {\n if (lifetimeCurve.type === LifeTimeCurve.BEZIER) {\n return createBezierCurveFunction(\n particleSystemId,\n lifetimeCurve.bezierPoints\n ); // Bézier curve\n }\n\n if (lifetimeCurve.type === LifeTimeCurve.EASING) {\n return lifetimeCurve.curveFunction; // Easing curve\n }\n\n throw new Error(`Unsupported value type: ${lifetimeCurve}`);\n};\n\nexport const calculateValue = (\n particleSystemId: number,\n value: Constant | RandomBetweenTwoConstants | LifetimeCurve,\n time: number = 0\n): number => {\n if (typeof value === 'number') {\n return value; // Constant value\n }\n\n if ('min' in value && 'max' in value) {\n if (value.min === value.max) {\n return value.min ?? 0; // Constant value\n }\n return THREE.MathUtils.randFloat(value.min ?? 0, value.max ?? 1); // Random range\n }\n\n const lifetimeCurve = value as LifetimeCurve;\n return (\n getCurveFunctionFromConfig(particleSystemId, lifetimeCurve)(time) *\n (lifetimeCurve.scale ?? 1)\n );\n};\n","import * as THREE from 'three';\n\nimport { calculateValue } from './three-particles-utils.js';\nimport { GeneralData, NormalizedParticleSystemConfig } from './types.js';\n\nconst noiseInput = new THREE.Vector3(0, 0, 0);\nconst orbitalEuler = new THREE.Euler();\n\n/**\n * Applies all active modifiers to a single particle during the update cycle.\n *\n * This function handles the animation and modification of particle properties over its lifetime,\n * including velocity (linear and orbital), size, opacity, color, rotation, and noise-based effects.\n * It is called once per particle per frame by the {@link updateParticleSystems} function.\n *\n * @param params - Configuration object containing:\n * @param params.delta - Time elapsed since the last frame in seconds. Used for velocity and rotation calculations.\n * @param params.generalData - Internal particle system state and cached values.\n * @param params.normalizedConfig - The normalized particle system configuration with all modifiers.\n * @param params.attributes - Three.js buffer attributes for position, size, rotation, and color.\n * @param params.particleLifetimePercentage - Normalized lifetime of the particle (0.0 to 1.0).\n * - 0.0 = particle just born\n * - 1.0 = particle at end of life\n * @param params.particleIndex - Index of the particle in the buffer arrays.\n *\n * @remarks\n * The function modifies the following particle properties based on configuration:\n *\n * - **Linear Velocity**: Moves particles in a straight line (velocityOverLifetime.linear)\n * - **Orbital Velocity**: Rotates particles around their emission point (velocityOverLifetime.orbital)\n * - **Size Over Lifetime**: Scales particle size based on lifetime curve (sizeOverLifetime)\n * - **Opacity Over Lifetime**: Fades particles in/out based on lifetime curve (opacityOverLifetime)\n * - **Color Over Lifetime**: Animates RGB channels independently based on lifetime curves (colorOverLifetime)\n * - **Rotation Over Lifetime**: Rotates particles around their center (rotationOverLifetime)\n * - **Noise**: Adds organic, turbulent motion to position, rotation, and size (noise)\n *\n * Each modifier only runs if it's active in the configuration, optimizing performance for simple effects.\n *\n * @example\n * ```typescript\n * // This function is called internally by updateParticleSystems\n * // You typically don't need to call it directly\n *\n * // However, understanding its behavior helps configure particle systems:\n * const config = {\n * sizeOverLifetime: {\n * isActive: true,\n * lifetimeCurve: {\n * type: 'BEZIER',\n * bezierPoints: [\n * { x: 0, y: 0, percentage: 0 }, // Start at 0% size\n * { x: 0.5, y: 1, percentage: 0.5 }, // Grow to 100% at midlife\n * { x: 1, y: 0, percentage: 1 } // Shrink to 0% at end\n * ]\n * }\n * },\n * opacityOverLifetime: {\n * isActive: true,\n * lifetimeCurve: {\n * type: 'EASING',\n * curveFunction: 'easeOutQuad'\n * }\n * }\n * };\n * ```\n *\n * @see {@link updateParticleSystems} - Calls this function for each active particle\n * @see {@link VelocityOverLifetime} - Configuration for velocity modifiers\n * @see {@link NoiseConfig} - Configuration for noise-based effects\n */\nexport const applyModifiers = ({\n delta,\n generalData,\n normalizedConfig,\n attributes,\n particleLifetimePercentage,\n particleIndex,\n}: {\n delta: number;\n generalData: GeneralData;\n normalizedConfig: NormalizedParticleSystemConfig;\n attributes: THREE.NormalBufferAttributes;\n particleLifetimePercentage: number;\n particleIndex: number;\n}) => {\n const {\n particleSystemId,\n startValues,\n lifetimeValues,\n linearVelocityData,\n orbitalVelocityData,\n noise,\n } = generalData;\n\n const positionIndex = particleIndex * 3;\n const positionArr = attributes.position.array;\n\n if (linearVelocityData) {\n const { speed, valueModifiers } = linearVelocityData[particleIndex];\n\n const normalizedXSpeed = valueModifiers.x\n ? valueModifiers.x(particleLifetimePercentage)\n : speed.x;\n\n const normalizedYSpeed = valueModifiers.y\n ? valueModifiers.y(particleLifetimePercentage)\n : speed.y;\n\n const normalizedZSpeed = valueModifiers.z\n ? valueModifiers.z(particleLifetimePercentage)\n : speed.z;\n\n positionArr[positionIndex] += normalizedXSpeed * delta;\n positionArr[positionIndex + 1] += normalizedYSpeed * delta;\n positionArr[positionIndex + 2] += normalizedZSpeed * delta;\n\n attributes.position.needsUpdate = true;\n }\n\n if (orbitalVelocityData) {\n const { speed, positionOffset, valueModifiers } =\n orbitalVelocityData[particleIndex];\n\n positionArr[positionIndex] -= positionOffset.x;\n positionArr[positionIndex + 1] -= positionOffset.y;\n positionArr[positionIndex + 2] -= positionOffset.z;\n\n const normalizedXSpeed = valueModifiers.x\n ? valueModifiers.x(particleLifetimePercentage)\n : speed.x;\n\n const normalizedYSpeed = valueModifiers.y\n ? valueModifiers.y(particleLifetimePercentage)\n : speed.y;\n\n const normalizedZSpeed = valueModifiers.z\n ? valueModifiers.z(particleLifetimePercentage)\n : speed.z;\n\n orbitalEuler.set(\n normalizedXSpeed * delta,\n normalizedZSpeed * delta,\n normalizedYSpeed * delta\n );\n positionOffset.applyEuler(orbitalEuler);\n\n positionArr[positionIndex] += positionOffset.x;\n positionArr[positionIndex + 1] += positionOffset.y;\n positionArr[positionIndex + 2] += positionOffset.z;\n\n attributes.position.needsUpdate = true;\n }\n\n if (normalizedConfig.sizeOverLifetime.isActive) {\n const multiplier = calculateValue(\n particleSystemId,\n normalizedConfig.sizeOverLifetime.lifetimeCurve,\n particleLifetimePercentage\n );\n attributes.size.array[particleIndex] =\n startValues.startSize[particleIndex] * multiplier;\n attributes.size.needsUpdate = true;\n }\n\n if (normalizedConfig.opacityOverLifetime.isActive) {\n const multiplier = calculateValue(\n particleSystemId,\n normalizedConfig.opacityOverLifetime.lifetimeCurve,\n particleLifetimePercentage\n );\n attributes.colorA.array[particleIndex] =\n startValues.startOpacity[particleIndex] * multiplier;\n attributes.colorA.needsUpdate = true;\n }\n\n if (normalizedConfig.colorOverLifetime.isActive) {\n const rMultiplier = calculateValue(\n particleSystemId,\n normalizedConfig.colorOverLifetime.r,\n particleLifetimePercentage\n );\n const gMultiplier = calculateValue(\n particleSystemId,\n normalizedConfig.colorOverLifetime.g,\n particleLifetimePercentage\n );\n const bMultiplier = calculateValue(\n particleSystemId,\n normalizedConfig.colorOverLifetime.b,\n particleLifetimePercentage\n );\n\n attributes.colorR.array[particleIndex] =\n startValues.startColorR[particleIndex] * rMultiplier;\n attributes.colorG.array[particleIndex] =\n startValues.startColorG[particleIndex] * gMultiplier;\n attributes.colorB.array[particleIndex] =\n startValues.startColorB[particleIndex] * bMultiplier;\n\n attributes.colorR.needsUpdate = true;\n attributes.colorG.needsUpdate = true;\n attributes.colorB.needsUpdate = true;\n }\n\n if (lifetimeValues.rotationOverLifetime) {\n attributes.rotation.array[particleIndex] +=\n lifetimeValues.rotationOverLifetime[particleIndex] * delta * 0.02;\n attributes.rotation.needsUpdate = true;\n }\n\n if (noise.isActive) {\n const {\n sampler,\n strength,\n noisePower,\n offsets,\n positionAmount,\n rotationAmount,\n sizeAmount,\n } = noise;\n let noiseOnPosition;\n\n const noisePosition =\n (particleLifetimePercentage + (offsets ? offsets[particleIndex] : 0)) *\n 10 *\n strength;\n\n noiseInput.set(noisePosition, 0, 0);\n noiseOnPosition = sampler!.get3(noiseInput);\n positionArr[positionIndex] += noiseOnPosition * noisePower * positionAmount;\n\n if (rotationAmount !== 0) {\n attributes.rotation.array[particleIndex] +=\n noiseOnPosition * noisePower * rotationAmount;\n attributes.rotation.needsUpdate = true;\n }\n\n if (sizeAmount !== 0) {\n attributes.size.array[particleIndex] +=\n noiseOnPosition * noisePower * sizeAmount;\n attributes.size.needsUpdate = true;\n }\n\n noiseInput.set(noisePosition, noisePosition, 0);\n noiseOnPosition = sampler!.get3(noiseInput);\n positionArr[positionIndex + 1] +=\n noiseOnPosition * noisePower * positionAmount;\n\n noiseInput.set(noisePosition, noisePosition, noisePosition);\n noiseOnPosition = sampler!.get3(noiseInput);\n positionArr[positionIndex + 2] +=\n noiseOnPosition * noisePower * positionAmount;\n\n attributes.position.needsUpdate = true;\n }\n};\n","export const patchObject = (objectA, objectB, config = {\n skippedProperties: [],\n applyToFirstObject: false,\n}) => {\n const result = {};\n Object.keys(objectA).forEach((key) => {\n if (!config.skippedProperties || !config.skippedProperties.includes(key)) {\n if (typeof objectA[key] === 'object' &&\n objectA[key] &&\n objectB[key] &&\n !Array.isArray(objectA[key])) {\n result[key] = patchObject(objectA[key], objectB[key], config);\n }\n else {\n result[key] =\n objectB[key] === 0\n ? 0\n : objectB[key] === false\n ? false\n : objectB[key] || objectA[key];\n if (config.applyToFirstObject)\n objectA[key] = result[key];\n }\n }\n });\n return result;\n};\nexport const deepMerge = (objectA, objectB, config = {\n skippedProperties: [],\n applyToFirstObject: false,\n}) => {\n const result = {};\n Array.from(new Set([\n ...Object.keys((objectA || {})),\n ...Object.keys((objectB || {})),\n ])).forEach((key) => {\n if (!config.skippedProperties || !config.skippedProperties.includes(key)) {\n if (typeof objectA?.[key] === 'object' &&\n objectA?.[key] &&\n objectB?.[key] &&\n !Array.isArray(objectA[key])) {\n result[key] = deepMerge(objectA[key], objectB[key], config);\n }\n else {\n result[key] =\n objectB?.[key] === 0\n ? 0\n : objectB?.[key] === false\n ? false\n : objectB?.[key] || objectA?.[key];\n if (config.applyToFirstObject)\n objectA[key] = result[key];\n }\n }\n });\n return result;\n};\nexport const getObjectDiff = (objectA, objectB, config = { skippedProperties: [] }) => {\n const result = {};\n Object.keys(objectA).forEach((key) => {\n if (!config.skippedProperties || !config.skippedProperties.includes(key)) {\n if (typeof objectA[key] === 'object' &&\n objectA[key] &&\n objectB[key] &&\n !Array.isArray(objectA[key])) {\n const objectDiff = getObjectDiff(objectA[key], objectB[key], config);\n if (Object.keys(objectDiff).length > 0)\n result[key] = objectDiff;\n }\n else {\n const mergedValue = objectB[key] === 0\n ? 0\n : objectB[key] || objectA[key];\n if (mergedValue !== objectA[key])\n result[key] = mergedValue;\n }\n }\n });\n return result;\n};\n","// Stub for unused three.js add-ons pulled in by @newkrok/three-utils.\n// Provides no-op constructors so imports won't throw.\nconst noop = function () {};\nnoop.prototype.load = noop;\nnoop.prototype.parse = noop;\n\nexport const GLTFLoader = noop;\nexport const FBXLoader = noop;\nexport const PositionalAudioHelper = noop;\nexport const clone = noop;\n","import * as THREE from 'three';\nimport { FBXLoader } from 'three/examples/jsm/loaders/FBXLoader.js';\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';\n// Loader instances\nconst gltfLoader = new GLTFLoader();\nconst fbxLoaders = Array.from({ length: 3 }, () => ({\n loader: new FBXLoader(),\n isUsed: false,\n}));\nlet fbxLoaderQueue = [];\nconst textureLoaders = Array.from({ length: 3 }, () => ({\n loader: new THREE.TextureLoader(),\n isUsed: false,\n}));\nlet textureLoaderQueue = [];\nconst audioLoaders = Array.from({ length: 3 }, () => ({\n loader: new THREE.AudioLoader(),\n isUsed: false,\n}));\nlet audioLoaderQueue = [];\n// Loader getter functions\nconst getFBXLoader = (onComplete) => getLoader(onComplete, fbxLoaders, fbxLoaderQueue);\nconst getTextureLoader = (onComplete) => getLoader(onComplete, textureLoaders, textureLoaderQueue);\nconst getAudioLoader = (onComplete) => getLoader(onComplete, audioLoaders, audioLoaderQueue);\nconst getLoader = (onComplete, loaders, loaderQueue) => {\n const loader = loaders.find((entry) => !entry.isUsed);\n if (loader) {\n loader.isUsed = true;\n onComplete(loader.loader);\n }\n else {\n loaderQueue.push((availableLoader) => {\n onComplete(availableLoader.loader);\n availableLoader.isUsed = true;\n });\n }\n};\n// Loader release functions\nconst releaseFBXLoader = (loader) => releaseLoader(loader, fbxLoaders, fbxLoaderQueue);\nconst releaseTextureLoader = (loader) => releaseLoader(loader, textureLoaders, textureLoaderQueue);\nconst releaseAudioLoader = (loader) => releaseLoader(loader, audioLoaders, audioLoaderQueue);\nconst releaseLoader = (loader, loaders, loaderQueue) => {\n const loaderObject = loaders.find((entry) => entry.loader === loader);\n if (loaderObject) {\n if (loaderQueue.length > 0) {\n const callback = loaderQueue.shift();\n if (callback) {\n callback(loaderObject);\n }\n }\n else {\n loaderObject.isUsed = false;\n }\n }\n};\n// GLTF Model loading\nconst loadGLTFModelRoutine = ({ list, onElementLoaded, onComplete, onError, }) => {\n if (list.length > 0) {\n const { url } = list[0];\n gltfLoader.load(url, ({ scene, animations }) => {\n onElementLoaded({\n ...list[0],\n gltfModel: { scene, animations },\n });\n list.shift();\n loadGLTFModelRoutine({ list, onElementLoaded, onComplete, onError });\n }, undefined, (error) => onError(String(error)));\n }\n else {\n onComplete();\n }\n};\nexport const loadGLTFModels = (list, onProgress) => {\n const elements = [];\n const onElementLoaded = (element) => {\n elements.push(element);\n onProgress();\n };\n const promise = new Promise((resolve, reject) => {\n loadGLTFModelRoutine({\n list: [...list], // Create a copy to avoid modifying the original\n onElementLoaded,\n onComplete: () => resolve(elements),\n onError: (error) => reject(new Error(`Something wrong happened: ${error}`)),\n });\n });\n return promise;\n};\nexport const loadFBXModels = (list, onProgress) => {\n const elements = [];\n const onElementLoaded = (element) => {\n elements.push(element);\n onProgress();\n };\n const promise = new Promise((resolve, reject) => {\n if (list.length > 0) {\n const listCopy = [...list]; // Create a copy to avoid modifying the original\n while (listCopy.length > 0) {\n const { url, id } = listCopy[0];\n const current = listCopy[0];\n listCopy.shift();\n getFBXLoader((fbxLoader) => fbxLoader.load(url, (fbxModel) => {\n onElementLoaded({ ...current, id, fbxModel });\n releaseFBXLoader(fbxLoader);\n if (!fbxLoaders.some((entry) => entry.isUsed)) {\n resolve(elements);\n }\n }, undefined, (error) => reject(new Error(`Something wrong happened with an FBX model: ${id}, url: ${url}, error: ${error}`))));\n }\n }\n else {\n resolve([]);\n }\n });\n return promise;\n};\nexport const loadTextures = (list, onProgress) => {\n const elements = [];\n const onElementLoaded = (element) => {\n elements.push(element);\n onProgress();\n };\n const promise = new Promise((resolve, reject) => {\n if (list.length > 0) {\n const listCopy = [...list]; // Create a copy to avoid modifying the original\n while (listCopy.length > 0) {\n const { url, id } = listCopy[0];\n listCopy.shift();\n getTextureLoader((textureLoader) => textureLoader.load(url, (texture) => {\n texture.wrapS = THREE.RepeatWrapping;\n texture.wrapT = THREE.RepeatWrapping;\n onElementLoaded({ id, url, texture });\n releaseTextureLoader(textureLoader);\n if (!textureLoaders.some((entry) => entry.isUsed)) {\n resolve(elements);\n }\n }, undefined, (error) => reject(new Error(`Something wrong happened with a texture: ${id}, url: ${url}, error: ${error}`))));\n }\n }\n else {\n resolve([]);\n }\n });\n return promise;\n};\nexport const loadAudio = (list, onProgress) => {\n const elements = [];\n const onElementLoaded = (element) => {\n elements.push(element);\n onProgress();\n };\n const promise = new Promise((resolve, reject) => {\n if (list.length > 0) {\n const listCopy = [...list]; // Create a copy to avoid modifying the original\n while (listCopy.length > 0) {\n const { url, id } = listCopy[0];\n listCopy.shift();\n getAudioLoader((audioLoader) => audioLoader.load(url, (audioBuffer) => {\n onElementLoaded({ id, url, audioBuffer });\n releaseAudioLoader(audioLoader);\n if (!audioLoaders.some((entry) => entry.isUsed)) {\n resolve(elements);\n }\n }, undefined, (error) => reject(new Error(`Something wrong happened with an audio: ${id}, url: ${url}, error: ${error}`))));\n }\n }\n else {\n resolve([]);\n }\n });\n return promise;\n};\n","import * as THREE from 'three';\n\nvar definitions_perlin = \"#define GLSLIFY 1\\n// From https://github.com/hughsk/glsl-noise/blob/master/periodic/2d.glsl\\n\\n//\\n// GLSL textureless classic 2D noise \\\"cnoise\\\",\\n// with an RSL-style periodic variant \\\"pnoise\\\".\\n// Author: Stefan Gustavson (stefan.gustavson@liu.se)\\n// Version: 2011-08-22\\n//\\n// Many thanks to Ian McEwan of Ashima Arts for the\\n// ideas for permutation and gradient selection.\\n//\\n// Copyright (c) 2011 Stefan Gustavson. All rights reserved.\\n// Distributed under the MIT license. See LICENSE file.\\n// https://github.com/ashima/webgl-noise\\n//\\n\\nvec4 mod289(vec4 x) { return x - floor(x * (1.0 / 289.0)) * 289.0; }\\n\\nvec4 permute(vec4 x) { return mod289(((x * 34.0) + 1.0) * x); }\\n\\nvec4 taylorInvSqrt(vec4 r) { return 1.79284291400159 - 0.85373472095314 * r; }\\n\\nvec2 fade(vec2 t) { return t * t * t * (t * (t * 6.0 - 15.0) + 10.0); }\\n\\nfloat map(float value, float min1, float max1, float min2, float max2) {\\n return min2 + (value - min1) * (max2 - min2) / (max1 - min1);\\n}\\n\\n// Classic Perlin noise, periodic variant\\nfloat perlin(vec2 P) {\\n\\n vec2 rep = vec2(255.0, 255.0);\\n\\n vec4 Pi = floor(P.xyxy) + vec4(0.0, 0.0, 1.0, 1.0);\\n vec4 Pf = fract(P.xyxy) - vec4(0.0, 0.0, 1.0, 1.0);\\n Pi = mod(Pi, rep.xyxy); // To create noise with explicit period\\n Pi = mod289(Pi); // To avoid truncation effects in permutation\\n vec4 ix = Pi.xzxz;\\n vec4 iy = Pi.yyww;\\n vec4 fx = Pf.xzxz;\\n vec4 fy = Pf.yyww;\\n\\n vec4 i = permute(permute(ix) + iy);\\n\\n vec4 gx = fract(i * (1.0 / 41.0)) * 2.0 - 1.0;\\n vec4 gy = abs(gx) - 0.5;\\n vec4 tx = floor(gx + 0.5);\\n gx = gx - tx;\\n\\n vec2 g00 = vec2(gx.x, gy.x);\\n vec2 g10 = vec2(gx.y, gy.y);\\n vec2 g01 = vec2(gx.z, gy.z);\\n vec2 g11 = vec2(gx.w, gy.w);\\n\\n vec4 norm = taylorInvSqrt(\\n vec4(dot(g00, g00), dot(g01, g01), dot(g10, g10), dot(g11, g11)));\\n g00 *= norm.x;\\n g01 *= norm.y;\\n g10 *= norm.z;\\n g11 *= norm.w;\\n\\n float n00 = dot(g00, vec2(fx.x, fy.x));\\n float n10 = dot(g10, vec2(fx.y, fy.y));\\n float n01 = dot(g01, vec2(fx.z, fy.z));\\n float n11 = dot(g11, vec2(fx.w, fy.w));\\n\\n vec2 fade_xy = fade(Pf.xy);\\n vec2 n_x = mix(vec2(n00, n01), vec2(n10, n11), fade_xy.x);\\n float n_xy = mix(n_x.x, n_x.y, fade_xy.y);\\n return map(2.3 * n_xy, -1.0, 1.0, 0.0, 1.0);\\n}\\n\\nfloat fbm(vec2 pos, vec4 props) {\\n float persistance = props.x;\\n float lacunarity = props.y;\\n float redistribution = props.z;\\n int octaves = int(props.w);\\n\\n float result = 0.0;\\n float amplitude = 1.0;\\n float frequency = 1.0;\\n float maximum = amplitude;\\n\\n for (int i = 0; i < 2; i++) {\\n\\n vec2 p = pos.xy * frequency;\\n\\n float noiseVal = perlin(p);\\n result += noiseVal * amplitude;\\n\\n frequency *= lacunarity;\\n amplitude *= persistance;\\n maximum += amplitude;\\n }\\n\\n float redistributed = pow(result, redistribution);\\n return redistributed / maximum;\\n}\\n\"; // eslint-disable-line\n\nvar p = [\n 151,\n 160,\n 137,\n 91,\n 90,\n 15,\n 131,\n 13,\n 201,\n 95,\n 96,\n 53,\n 194,\n 233,\n 7,\n 225,\n 140,\n 36,\n 103,\n 30,\n 69,\n 142,\n 8,\n 99,\n 37,\n 240,\n 21,\n 10,\n 23,\n 190,\n 6,\n 148,\n 247,\n 120,\n 234,\n 75,\n 0,\n 26,\n 197,\n 62,\n 94,\n 252,\n 219,\n 203,\n 117,\n 35,\n 11,\n 32,\n 57,\n 177,\n 33,\n 88,\n 237,\n 149,\n 56,\n 87,\n 174,\n 20,\n 125,\n 136,\n 171,\n 168,\n 68,\n 175,\n 74,\n 165,\n 71,\n 134,\n 139,\n 48,\n 27,\n 166,\n 77,\n 146,\n 158,\n 231,\n 83,\n 111,\n 229,\n 122,\n 60,\n 211,\n 133,\n 230,\n 220,\n 105,\n 92,\n 41,\n 55,\n 46,\n 245,\n 40,\n 244,\n 102,\n 143,\n 54,\n 65,\n 25,\n 63,\n 161,\n 1,\n 216,\n 80,\n 73,\n 209,\n 76,\n 132,\n 187,\n 208,\n 89,\n 18,\n 169,\n 200,\n 196,\n 135,\n 130,\n 116,\n 188,\n 159,\n 86,\n 164,\n 100,\n 109,\n 198,\n 173,\n 186,\n 3,\n 64,\n 52,\n 217,\n 226,\n 250,\n 124,\n 123,\n 5,\n 202,\n 38,\n 147,\n 118,\n 126,\n 255,\n 82,\n 85,\n 212,\n 207,\n 206,\n 59,\n 227,\n 47,\n 16,\n 58,\n 17,\n 182,\n 189,\n 28,\n 42,\n 223,\n 183,\n 170,\n 213,\n 119,\n 248,\n 152,\n 2,\n 44,\n 154,\n 163,\n 70,\n 221,\n 153,\n 101,\n 155,\n 167,\n 43,\n 172,\n 9,\n 129,\n 22,\n 39,\n 253,\n 19,\n 98,\n 108,\n 110,\n 79,\n 113,\n 224,\n 232,\n 178,\n 185,\n 112,\n 104,\n 218,\n 246,\n 97,\n 228,\n 251,\n 34,\n 242,\n 193,\n 238,\n 210,\n 144,\n 12,\n 191,\n 179,\n 162,\n 241,\n 81,\n 51,\n 145,\n 235,\n 249,\n 14,\n 239,\n 107,\n 49,\n 192,\n 214,\n 31,\n 181,\n 199,\n 106,\n 157,\n 184,\n 84,\n 204,\n 176,\n 115,\n 121,\n 50,\n 45,\n 127,\n 4,\n 150,\n 254,\n 138,\n 236,\n 205,\n 93,\n 222,\n 114,\n 67,\n 29,\n 24,\n 72,\n 243,\n 141,\n 128,\n 195,\n 78,\n 66,\n 215,\n 61,\n 156,\n 180,\n];\n\n/**\n * An implimentation of Perlin Noise by Ken Perlin.\n */\nclass Perlin {\n /**\n *\n * @param {number} seed Seed Value for PRNG.\n */\n constructor(seed) {\n const _gradientVecs = [\n // 2D Vecs\n new THREE.Vector3(1, 1, 0),\n new THREE.Vector3(-1, 1, 0),\n new THREE.Vector3(1, -1, 0),\n new THREE.Vector3(-1, -1, 0),\n // + 3D Vecs\n new THREE.Vector3(1, 0, 1),\n new THREE.Vector3(-1, 0, 1),\n new THREE.Vector3(1, 0, -1),\n new THREE.Vector3(-1, 0, -1),\n new THREE.Vector3(0, 1, 1),\n new THREE.Vector3(0, -1, 1),\n new THREE.Vector3(0, 1, -1),\n new THREE.Vector3(0, -1, -1),\n ];\n\n var perm = new Array(512);\n var gradP = new Array(512);\n\n if (!seed) seed = 1;\n seed *= 65536;\n\n seed = Math.floor(seed);\n if (seed < 256) {\n seed |= seed << 8;\n }\n\n for (var i = 0; i < 256; i++) {\n var v;\n if (i & 1) {\n v = p[i] ^ (seed & 255);\n } else {\n v = p[i] ^ ((seed >> 8) & 255);\n }\n\n perm[i] = perm[i + 256] = v;\n gradP[i] = gradP[i + 256] = _gradientVecs[v % 12];\n }\n\n this._seed = seed;\n\n this._offsetMatrix = [\n new THREE.Vector3(0, 0, 0),\n new THREE.Vector3(0, 0, 1),\n new THREE.Vector3(0, 1, 0),\n new THREE.Vector3(0, 1, 1),\n new THREE.Vector3(1, 0, 0),\n new THREE.Vector3(1, 0, 1),\n new THREE.Vector3(1, 1, 0),\n new THREE.Vector3(1, 1, 1),\n ];\n\n /**\n * GLSL Shader Chunk for 2D Perlin Noise. Can be used with\n * three-CustomShaderMaterial.\n * See: <a href=\"https://github.com/FarazzShaikh/THREE-CustomShaderMaterial\">three-CustomShaderMaterial</a>\n */\n this.shaderChunk = {\n defines: \"\",\n header: definitions_perlin,\n main: \"\",\n uniforms: [{ three_noise_seed: this._seed }],\n };\n\n this.perm = perm;\n this.gradP = gradP;\n }\n\n _fade(t) {\n return t * t * t * (t * (t * 6 - 15) + 10);\n }\n\n _lerp(a, b, t) {\n return (1 - t) * a + t * b;\n }\n\n _gradient(posInCell) {\n if (posInCell instanceof THREE.Vector3) {\n return posInCell.x + this.perm[posInCell.y + this.perm[posInCell.z]];\n } else {\n return posInCell.x + this.perm[posInCell.y];\n }\n }\n\n /**\n * Maps a number from one range to another.\n * @param {number} x Input Number\n * @param {number} in_min Current range minimum\n * @param {number} in_max Current range maximum\n * @param {number} out_min New range minimum\n * @param {number} out_max New range maximum\n * @returns {number} Input Mapped to range [out_min, out_max]\n */\n static map(x, in_min, in_max, out_min, out_max) {\n return ((x - in_min) * (out_max - out_min)) / (in_max - in_min) + out_min;\n }\n\n /**\n * Samples 2D Perlin Nosie at given coordinates.\n * @param {THREE.Vector2 | THREE.Vector3} input Coordincates to sample at\n * @returns {number} Value of Perlin Noise at that coordinate.\n */\n get2(input) {\n if (input.z !== undefined) input = new THREE.Vector2(input.x, input.y);\n\n const cell = new THREE.Vector2(Math.floor(input.x), Math.floor(input.y));\n input.sub(cell);\n\n cell.x &= 255;\n cell.y &= 255;\n\n const gradiantDot = [];\n for (let i = 0; i < 4; i++) {\n const s3 = this._offsetMatrix[i * 2];\n const s = new THREE.Vector2(s3.x, s3.y);\n\n const grad3 =\n this.gradP[this._gradient(new THREE.Vector2().addVectors(cell, s))];\n const grad2 = new THREE.Vector2(grad3.x, grad3.y);\n const dist2 = new THREE.Vector2().subVectors(input, s);\n\n gradiantDot.push(grad2.dot(dist2));\n }\n\n const u = this._fade(input.x);\n const v = this._fade(input.y);\n\n const value = this._lerp(\n this._lerp(gradiantDot[0], gradiantDot[2], u),\n this._lerp(gradiantDot[1], gradiantDot[3], u),\n v\n );\n\n return value;\n }\n\n /**\n * Samples 3D Perlin Nosie at given coordinates.\n * @param {THREE.Vector}3 input Coordincates to sample at\n * @returns {number} Value of Perlin Noise at that coordinate.\n */\n get3(input) {\n if (input.z === undefined)\n throw \"Input to Perlin::get3() must be of type THREE.Vector3\";\n\n const cell = new THREE.Vector3(\n Math.floor(input.x),\n Math.floor(input.y),\n Math.floor(input.z)\n );\n input.sub(cell);\n\n cell.x &= 255;\n cell.y &= 255;\n cell.z &= 255;\n\n const gradiantDot = [];\n for (let i = 0; i < 8; i++) {\n const s = this._offsetMatrix[i];\n\n const grad3 =\n this.gradP[this._gradient(new THREE.Vector3().addVectors(cell, s))];\n const dist2 = new THREE.Vector3().subVectors(input, s);\n\n gradiantDot.push(grad3.dot(dist2));\n }\n\n const u = this._fade(input.x);\n const v = this._fade(input.y);\n const w = this._fade(input.z);\n\n const value = this._lerp(\n this._lerp(\n this._lerp(gradiantDot[0], gradiantDot[4], u),\n this._lerp(gradiantDot[1], gradiantDot[5], u),\n w\n ),\n this._lerp(\n this._lerp(gradiantDot[2], gradiantDot[6], u),\n this._lerp(gradiantDot[3], gradiantDot[7], u),\n w\n ),\n v\n );\n\n return value;\n }\n}\n\n/**\n * This class is an implimentaiton of a Fractal Brownian Motion\n * function using Perlin Nosie.\n */\nclass FBM {\n /**\n * Create an instance of the FBM class.\n * Use this instance to generate fBm noise.\n *\n * @param {Object} options Options for fBm generaiton.\n * @param {number} options.seed Seed for Perlin Noise\n * @param {number} options.scale What distance to view the noisemap\n * @param {number} options.persistance How much each octave contributes to the overall shape\n * @param {number} options.lacunarity How much detail is added or removed at each octave\n * @param {number} options.octaves Levels of detail you want you perlin noise to have\n * @param {number} options.redistribution Level of flatness within the valleys\n */\n constructor(options) {\n const { seed, scale, persistance, lacunarity, octaves, redistribution } =\n options;\n this._noise = new Perlin(seed);\n this._scale = scale || 1;\n this._persistance = persistance || 0.5;\n this._lacunarity = lacunarity || 2;\n this._octaves = octaves || 6;\n this._redistribution = redistribution || 1;\n }\n\n /**\n * Sample 2D Perlin Noise with fBm at given\n * coordinates. The function will use <code>Perlin_get2</code> or <code>Perlin_get3</code>\n * depending on the input vector's type.\n *\n * @param {(THREE.Vector2 | THREE.Vector3)} input Coordinates to sample noise at.\n * @returns {number} Normalized noise in the range [0, 1]\n */\n get2(input) {\n let result = 0;\n let amplitude = 1;\n let frequency = 1;\n let max = amplitude;\n\n let noiseFunction = this._noise.get2.bind(this._noise);\n\n for (let i = 0; i < this._octaves; i++) {\n const position = new THREE.Vector2(\n input.x * this._scale * frequency,\n input.y * this._scale * frequency\n );\n\n const noiseVal = noiseFunction(position);\n result += noiseVal * amplitude;\n\n frequency *= this._lacunarity;\n amplitude *= this._persistance;\n max += amplitude;\n }\n\n const redistributed = Math.pow(result, this._redistribution);\n return redistributed / max;\n }\n\n /**\n * Sample 3D Perlin Noise with fBm at given\n * coordinates. The function will use <code>Perlin_get2</code> or <code>Perlin_get3</code>\n * depending on the input vector's type.\n *\n * @param {THREE.Vector3} input Coordinates to sample noise at.\n * @returns {number} Normalized noise in the range [0, 1]\n */\n get3(input) {\n let result = 0;\n let amplitude = 1;\n let frequency = 1;\n let max = amplitude;\n\n let noiseFunction = this._noise.get3.bind(this._noise);\n\n for (let i = 0; i < this._octaves; i++) {\n const position = new THREE.Vector3(\n input.x * this._scale * frequency,\n input.y * this._scale * frequency,\n input.z * this._scale * frequency\n );\n\n const noiseVal = noiseFunction(position);\n result += noiseVal * amplitude;\n\n frequency *= this._lacunarity;\n amplitude *= this._persistance;\n max += amplitude;\n }\n\n const redistributed = Math.pow(result, this._redistribution);\n return redistributed / max;\n }\n}\n\nexport { FBM, Perlin };\n","const ParticleSystemFragmentShader = `\n uniform sampler2D map;\n uniform float elapsed;\n uniform float fps;\n uniform bool useFPSForFrameIndex;\n uniform vec2 tiles;\n uniform bool discardBackgroundColor;\n uniform vec3 backgroundColor;\n uniform float backgroundColorTolerance;\n\n varying vec4 vColor;\n varying float vLifetime;\n varying float vStartLifetime;\n varying float vRotation;\n varying float vStartFrame;\n\n #include <common>\n #include <logdepthbuf_pars_fragment>\n\n void main()\n {\n gl_FragColor = vColor;\n float mid = 0.5;\n\n float frameIndex = round(vStartFrame) + (\n useFPSForFrameIndex == true\n ? fps == 0.0\n ? 0.0\n : max((vLifetime / 1000.0) * fps, 0.0)\n : max(min(floor(min(vLifetime / vStartLifetime, 1.0) * (tiles.x * tiles.y)), tiles.x * tiles.y - 1.0), 0.0)\n );\n \n float spriteXIndex = floor(mod(frameIndex, tiles.x));\n float spriteYIndex = floor(mod(frameIndex / tiles.x, tiles.y));\n\n vec2 frameUV = vec2(\n gl_PointCoord.x / tiles.x + spriteXIndex / tiles.x,\n gl_PointCoord.y / tiles.y + spriteYIndex / tiles.y);\n\n vec2 center = vec2(0.5, 0.5);\n vec2 centeredPoint = gl_PointCoord - center;\n\n mat2 rotation = mat2(\n cos(vRotation), sin(vRotation),\n -sin(vRotation), cos(vRotation)\n );\n\n centeredPoint = rotation * centeredPoint;\n vec2 centeredMiddlePoint = vec2(\n centeredPoint.x + center.x,\n centeredPoint.y + center.y\n );\n\n float dist = distance(centeredMiddlePoint, center);\n if (dist > 0.5) discard;\n\n vec2 uvPoint = vec2(\n centeredMiddlePoint.x / tiles.x + spriteXIndex / tiles.x,\n centeredMiddlePoint.y / tiles.y + spriteYIndex / tiles.y\n );\n\n vec4 rotatedTexture = texture2D(map, uvPoint);\n\n gl_FragColor = gl_FragColor * rotatedTexture;\n\n if (discardBackgroundColor && abs(length(rotatedTexture.rgb - backgroundColor.rgb)) < backgroundColorTolerance) discard;\n \n #include <logdepthbuf_fragment>\n }\n`;\n\nexport default ParticleSystemFragmentShader;\n","const ParticleSystemVertexShader = `\n attribute float size;\n attribute float colorR;\n attribute float colorG;\n attribute float colorB;\n attribute float colorA;\n attribute float lifetime;\n attribute float startLifetime;\n attribute float rotation;\n attribute float startFrame;\n\n varying mat4 vPosition;\n varying vec4 vColor;\n varying float vLifetime;\n varying float vStartLifetime;\n varying float vRotation;\n varying float vStartFrame;\n\n #include <common>\n #include <logdepthbuf_pars_vertex>\n\n void main()\n {\n vColor = vec4(colorR, colorG, colorB, colorA);\n vLifetime = lifetime;\n vStartLifetime = startLifetime;\n vRotation = rotation;\n vStartFrame = startFrame;\n\n vec4 mvPosition = modelViewMatrix * vec4(position, 1.0);\n gl_PointSize = size * (100.0 / length(mvPosition.xyz));\n gl_Position = projectionMatrix * mvPosition;\n\n #include <logdepthbuf_vertex>\n }\n`;\n\nexport default ParticleSystemVertexShader;\n","import { ObjectUtils } from '@newkrok/three-utils';\nimport * as THREE from 'three';\nimport { Gyroscope } from 'three/examples/jsm/misc/Gyroscope.js';\nimport { FBM } from 'three-noise/build/three-noise.module.js';\nimport ParticleSystemFragmentShader from './shaders/particle-system-fragment-shader.glsl.js';\nimport ParticleSystemVertexShader from './shaders/particle-system-vertex-shader.glsl.js';\nimport { removeBezierCurveFunction } from './three-particles-bezier.js';\nimport {\n EmitFrom,\n LifeTimeCurve,\n Shape,\n SimulationSpace,\n SubEmitterTrigger,\n TimeMode,\n} from './three-particles-enums';\nimport { applyModifiers } from './three-particles-modifiers.js';\nimport {\n calculateRandomPositionAndVelocityOnBox,\n calculateRandomPositionAndVelocityOnCircle,\n calculateRandomPositionAndVelocityOnCone,\n calculateRandomPositionAndVelocityOnRectangle,\n calculateRandomPositionAndVelocityOnSphere,\n calculateValue,\n getCurveFunctionFromConfig,\n isLifeTimeCurve,\n createDefaultParticleTexture,\n} from './three-particles-utils.js';\n\nimport {\n Constant,\n CycleData,\n GeneralData,\n LifetimeCurve,\n NormalizedParticleSystemConfig,\n ParticleSystem,\n ParticleSystemConfig,\n ParticleSystemInstance,\n Point3D,\n RandomBetweenTwoConstants,\n ShapeConfig,\n SubEmitterConfig,\n} from './types.js';\n\nexport * from './types.js';\n\nlet _particleSystemId = 0;\nlet createdParticleSystems: Array<ParticleSystemInstance> = [];\n\n// Pre-allocated objects for updateParticleSystemInstance to avoid GC pressure\nconst _subEmitterPosition = new THREE.Vector3();\nconst _lastWorldPositionSnapshot = new THREE.Vector3();\nconst _distanceStep = { x: 0, y: 0, z: 0 };\nconst _tempPosition = { x: 0, y: 0, z: 0 };\nconst _modifierParams = {\n delta: 0,\n generalData: null as unknown as GeneralData,\n normalizedConfig: null as unknown as NormalizedParticleSystemConfig,\n attributes: null as unknown as THREE.NormalBufferAttributes,\n particleLifetimePercentage: 0,\n particleIndex: 0,\n};\n\n/**\n * Mapping of blending mode string identifiers to Three.js blending constants.\n *\n * Used for converting serialized particle system configurations (e.g., from JSON)\n * to actual Three.js blending mode constants.\n *\n * @example\n * ```typescript\n * import { blendingMap } from '@newkrok/three-particles';\n *\n * // Convert string to Three.js constant\n * const blending = blendingMap['THREE.AdditiveBlending'];\n * // blending === THREE.AdditiveBlending\n * ```\n */\nexport const blendingMap = {\n 'THREE.NoBlending': THREE.NoBlending,\n 'THREE.NormalBlending': THREE.NormalBlending,\n 'THREE.AdditiveBlending': THREE.AdditiveBlending,\n 'THREE.SubtractiveBlending': THREE.SubtractiveBlending,\n 'THREE.MultiplyBlending': THREE.MultiplyBlending,\n};\n\n/**\n * Returns a deep copy of the default particle system configuration.\n *\n * This is useful when you want to start with default settings and modify specific properties\n * without affecting the internal default configuration object.\n *\n * @returns A new object containing all default particle system settings\n *\n * @example\n * ```typescript\n * import { getDefaultParticleSystemConfig, createParticleSystem } from '@newkrok/three-particles';\n *\n * // Get default config and modify it\n * const config = getDefaultParticleSystemConfig();\n * config.emission.rateOverTime = 100;\n * config.startColor.min = { r: 1, g: 0, b: 0 };\n *\n * const { instance } = createParticleSystem(config);\n * scene.add(instance);\n * ```\n */\nexport const getDefaultParticleSystemConfig = () =>\n JSON.parse(JSON.stringify(DEFAULT_PARTICLE_SYSTEM_CONFIG));\n\nconst DEFAULT_PARTICLE_SYSTEM_CONFIG: ParticleSystemConfig = {\n transform: {\n position: new THREE.Vector3(),\n rotation: new THREE.Vector3(),\n scale: new THREE.Vector3(1, 1, 1),\n },\n duration: 5.0,\n looping: true,\n startDelay: 0,\n startLifetime: 5.0,\n startSpeed: 1.0,\n startSize: 1.0,\n startOpacity: 1.0,\n startRotation: 0.0,\n startColor: {\n min: { r: 1.0, g: 1.0, b: 1.0 },\n max: { r: 1.0, g: 1.0, b: 1.0 },\n },\n gravity: 0.0,\n simulationSpace: SimulationSpace.LOCAL,\n maxParticles: 100.0,\n emission: {\n rateOverTime: 10.0,\n rateOverDistance: 0.0,\n bursts: [],\n },\n shape: {\n shape: Shape.SPHERE,\n sphere: {\n radius: 1.0,\n radiusThickness: 1.0,\n arc: 360.0,\n },\n cone: {\n angle: 25.0,\n radius: 1.0,\n radiusThickness: 1.0,\n arc: 360.0,\n },\n circle: {\n radius: 1.0,\n radiusThickness: 1.0,\n arc: 360.0,\n },\n rectangle: {\n rotation: { x: 0.0, y: 0.0 }, // TODO: add z rotation\n scale: { x: 1.0, y: 1.0 },\n },\n box: {\n scale: { x: 1.0, y: 1.0, z: 1.0 },\n emitFrom: EmitFrom.VOLUME,\n },\n },\n map: undefined,\n renderer: {\n blending: THREE.NormalBlending,\n discardBackgroundColor: false,\n backgroundColorTolerance: 1.0,\n backgroundColor: { r: 1.0, g: 1.0, b: 1.0 },\n transparent: true,\n depthTest: true,\n depthWrite: false,\n },\n velocityOverLifetime: {\n isActive: false,\n linear: {\n x: 0,\n y: 0,\n z: 0,\n },\n orbital: {\n x: 0,\n y: 0,\n z: 0,\n },\n },\n sizeOverLifetime: {\n isActive: false,\n lifetimeCurve: {\n type: LifeTimeCurve.BEZIER,\n scale: 1,\n bezierPoints: [\n { x: 0, y: 0, percentage: 0 },\n { x: 1, y: 1, percentage: 1 },\n ],\n },\n },\n colorOverLifetime: {\n isActive: false,\n r: {\n type: LifeTimeCurve.BEZIER,\n scale: 1,\n bezierPoints: [\n { x: 0, y: 1, percentage: 0 },\n { x: 1, y: 1, percentage: 1 },\n ],\n },\n g: {\n type: LifeTimeCurve.BEZIER,\n scale: 1,\n bezierPoints: [\n { x: 0, y: 1, percentage: 0 },\n { x: 1, y: 1, percentage: 1 },\n ],\n },\n b: {\n type: LifeTimeCurve.BEZIER,\n scale: 1,\n bezierPoints: [\n { x: 0, y: 1, percentage: 0 },\n { x: 1, y: 1, percentage: 1 },\n ],\n },\n },\n opacityOverLifetime: {\n isActive: false,\n lifetimeCurve: {\n type: LifeTimeCurve.BEZIER,\n scale: 1,\n bezierPoints: [\n { x: 0, y: 0, percentage: 0 },\n { x: 1, y: 1, percentage: 1 },\n ],\n },\n },\n rotationOverLifetime: {\n isActive: false,\n min: 0.0,\n max: 0.0,\n },\n noise: {\n isActive: false,\n useRandomOffset: false,\n strength: 1.0,\n frequency: 0.5,\n octaves: 1,\n positionAmount: 1.0,\n rotationAmount: 0.0,\n sizeAmount: 0.0,\n },\n textureSheetAnimation: {\n tiles: new THREE.Vector2(1.0, 1.0),\n timeMode: TimeMode.LIFETIME,\n fps: 30.0,\n startFrame: 0,\n },\n};\n\nconst createFloat32Attributes = ({\n geometry,\n propertyName,\n maxParticles,\n factory,\n}: {\n geometry: THREE.BufferGeometry;\n propertyName: string;\n maxParticles: number;\n factory: ((value: never, index: number) => number) | number;\n}) => {\n const array = new Float32Array(maxParticles);\n if (typeof factory === 'function') {\n for (let i = 0; i < maxParticles; i++) {\n array[i] = factory(undefined as never, i);\n }\n } else {\n array.fill(factory);\n }\n geometry.setAttribute(propertyName, new THREE.BufferAttribute(array, 1));\n};\n\nconst calculatePositionAndVelocity = (\n generalData: GeneralData,\n { shape, sphere, cone, circle, rectangle, box }: ShapeConfig,\n startSpeed: Constant | RandomBetweenTwoConstants | LifetimeCurve,\n position: THREE.Vector3,\n velocity: THREE.Vector3\n) => {\n const calculatedStartSpeed = calculateValue(\n generalData.particleSystemId,\n startSpeed,\n generalData.normalizedLifetimePercentage\n );\n\n switch (shape) {\n case Shape.SPHERE:\n calculateRandomPositionAndVelocityOnSphere(\n position,\n generalData.wrapperQuaternion,\n velocity,\n calculatedStartSpeed,\n sphere as Required<NonNullable<ShapeConfig['sphere']>>\n );\n break;\n\n case Shape.CONE:\n calculateRandomPositionAndVelocityOnCone(\n position,\n generalData.wrapperQuaternion,\n velocity,\n calculatedStartSpeed,\n cone as Required<NonNullable<ShapeConfig['cone']>>\n );\n break;\n\n case Shape.CIRCLE:\n calculateRandomPositionAndVelocityOnCircle(\n position,\n generalData.wrapperQuaternion,\n velocity,\n calculatedStartSpeed,\n circle as Required<NonNullable<ShapeConfig['circle']>>\n );\n break;\n\n case Shape.RECTANGLE:\n calculateRandomPositionAndVelocityOnRectangle(\n position,\n generalData.wrapperQuaternion,\n velocity,\n calculatedStartSpeed,\n rectangle as Required<NonNullable<ShapeConfig['rectangle']>>\n );\n break;\n\n case Shape.BOX:\n calculateRandomPositionAndVelocityOnBox(\n position,\n generalData.wrapperQuaternion,\n velocity,\n calculatedStartSpeed,\n box as Required<NonNullable<ShapeConfig['box']>>\n );\n break;\n }\n};\n\nconst destroyParticleSystem = (particleSystem: THREE.Points) => {\n createdParticleSystems = createdParticleSystems.filter(\n ({\n particleSystem: savedParticleSystem,\n wrapper,\n generalData: { particleSystemId },\n }) => {\n if (\n savedParticleSystem !== particleSystem &&\n wrapper !== particleSystem\n ) {\n return true;\n }\n\n removeBezierCurveFunction(particleSystemId);\n savedParticleSystem.geometry.dispose();\n if (Array.isArray(savedParticleSystem.material))\n savedParticleSystem.material.forEach((material) => material.dispose());\n else savedParticleSystem.material.dispose();\n\n if (savedParticleSystem.parent)\n savedParticleSystem.parent.remove(savedParticleSystem);\n if (wrapper?.parent) wrapper.parent.remove(wrapper);\n return false;\n }\n );\n};\n\n/**\n * Creates a new particle system with the specified configuration.\n *\n * This is the primary function for instantiating particle effects. It handles the complete\n * setup of a particle system including geometry creation, material configuration, shader setup,\n * and initialization of all particle properties.\n *\n * @param config - Configuration object for the particle system. If not provided, uses default settings.\n * See {@link ParticleSystemConfig} for all available options.\n * @param externalNow - Optional custom timestamp in milliseconds. If not provided, uses `Date.now()`.\n * Useful for synchronized particle systems or testing.\n *\n * @returns A {@link ParticleSystem} object containing:\n * - `instance`: The THREE.Object3D that should be added to your scene\n * - `resumeEmitter()`: Function to resume particle emission\n * - `pauseEmitter()`: Function to pause particle emission\n * - `dispose()`: Function to clean up resources and remove the particle system\n *\n * @example\n * ```typescript\n * import { createParticleSystem, updateParticleSystems } from '@newkrok/three-particles';\n *\n * // Create a basic particle system with default settings\n * const { instance, dispose } = createParticleSystem();\n * scene.add(instance);\n *\n * // Create a custom fire effect\n * const fireEffect = createParticleSystem({\n * duration: 2.0,\n * looping: true,\n * startLifetime: { min: 0.5, max: 1.5 },\n * startSpeed: { min: 2, max: 4 },\n * startSize: { min: 0.5, max: 1.5 },\n * startColor: {\n * min: { r: 1.0, g: 0.3, b: 0.0 },\n * max: { r: 1.0, g: 0.8, b: 0.0 }\n * },\n * emission: { rateOverTime: 50 },\n * shape: {\n * shape: Shape.CONE,\n * cone: { angle: 10, radius: 0.2 }\n * }\n * });\n * scene.add(fireEffect.instance);\n *\n * // In your animation loop\n * function animate(time) {\n * updateParticleSystems({ now: time, delta: deltaTime, elapsed: elapsedTime });\n * renderer.render(scene, camera);\n * }\n *\n * // Clean up when done\n * fireEffect.dispose();\n * ```\n *\n * @see {@link updateParticleSystems} - Required function to call in your animation loop\n * @see {@link ParticleSystemConfig} - Complete configuration options\n */\nexport const createParticleSystem = (\n config: ParticleSystemConfig = DEFAULT_PARTICLE_SYSTEM_CONFIG,\n externalNow?: number\n): ParticleSystem => {\n const now = externalNow || Date.now();\n const generalData: GeneralData = {\n particleSystemId: _particleSystemId++,\n normalizedLifetimePercentage: 0,\n distanceFromLastEmitByDistance: 0,\n lastWorldPosition: new THREE.Vector3(-99999),\n currentWorldPosition: new THREE.Vector3(-99999),\n worldPositionChange: new THREE.Vector3(),\n worldQuaternion: new THREE.Quaternion(),\n wrapperQuaternion: new THREE.Quaternion(),\n lastWorldQuaternion: new THREE.Quaternion(-99999),\n worldEuler: new THREE.Euler(),\n gravityVelocity: new THREE.Vector3(0, 0, 0),\n startValues: {},\n linearVelocityData: undefined,\n orbitalVelocityData: undefined,\n lifetimeValues: {},\n creationTimes: [],\n noise: {\n isActive: false,\n strength: 0,\n noisePower: 0,\n positionAmount: 0,\n rotationAmount: 0,\n sizeAmount: 0,\n },\n isEnabled: true,\n };\n const normalizedConfig = ObjectUtils.deepMerge(\n DEFAULT_PARTICLE_SYSTEM_CONFIG as NormalizedParticleSystemConfig,\n config,\n { applyToFirstObject: false, skippedProperties: [] }\n ) as NormalizedParticleSystemConfig;\n let particleMap: THREE.Texture | null =\n normalizedConfig.map || createDefaultParticleTexture();\n\n const {\n transform,\n duration,\n looping,\n startDelay,\n startLifetime,\n startSpeed,\n startSize,\n startRotation,\n startColor,\n startOpacity,\n gravity,\n simulationSpace,\n maxParticles,\n emission,\n shape,\n renderer,\n noise,\n velocityOverLifetime,\n onUpdate,\n onComplete,\n textureSheetAnimation,\n subEmitters,\n } = normalizedConfig;\n\n if (typeof renderer?.blending === 'string')\n renderer.blending = blendingMap[renderer.blending];\n\n const startPositions = Array.from(\n { length: maxParticles },\n () => new THREE.Vector3()\n );\n const velocities = Array.from(\n { length: maxParticles },\n () => new THREE.Vector3()\n );\n\n generalData.creationTimes = Array.from({ length: maxParticles }, () => 0);\n\n // Free list for O(1) inactive particle lookup (stack, top = end of array)\n const freeList: Array<number> = Array.from(\n { length: maxParticles },\n (_, i) => maxParticles - 1 - i\n );\n\n if (velocityOverLifetime.isActive) {\n generalData.linearVelocityData = Array.from(\n { length: maxParticles },\n () => ({\n speed: new THREE.Vector3(\n velocityOverLifetime.linear.x\n ? calculateValue(\n generalData.particleSystemId,\n velocityOverLifetime.linear.x,\n 0\n )\n : 0,\n velocityOverLifetime.linear.y\n ? calculateValue(\n generalData.particleSystemId,\n velocityOverLifetime.linear.y,\n 0\n )\n : 0,\n velocityOverLifetime.linear.z\n ? calculateValue(\n generalData.particleSystemId,\n velocityOverLifetime.linear.z,\n 0\n )\n : 0\n ),\n valueModifiers: {\n x: isLifeTimeCurve(velocityOverLifetime.linear.x || 0)\n ? getCurveFunctionFromConfig(\n generalData.particleSystemId,\n velocityOverLifetime.linear.x as LifetimeCurve\n )\n : undefined,\n y: isLifeTimeCurve(velocityOverLifetime.linear.y || 0)\n ? getCurveFunctionFromConfig(\n generalData.particleSystemId,\n velocityOverLifetime.linear.y as LifetimeCurve\n )\n : undefined,\n z: isLifeTimeCurve(velocityOverLifetime.linear.z || 0)\n ? getCurveFunctionFromConfig(\n generalData.particleSystemId,\n velocityOverLifetime.linear.z as LifetimeCurve\n )\n : undefined,\n },\n })\n );\n\n generalData.orbitalVelocityData = Array.from(\n { length: maxParticles },\n () => ({\n speed: new THREE.Vector3(\n velocityOverLifetime.orbital.x\n ? calculateValue(\n generalData.particleSystemId,\n velocityOverLifetime.orbital.x,\n 0\n )\n : 0,\n velocityOverLifetime.orbital.y\n ? calculateValue(\n generalData.particleSystemId,\n velocityOverLifetime.orbital.y,\n 0\n )\n : 0,\n velocityOverLifetime.orbital.z\n ? calculateValue(\n generalData.particleSystemId,\n velocityOverLifetime.orbital.z,\n 0\n )\n : 0\n ),\n valueModifiers: {\n x: isLifeTimeCurve(velocityOverLifetime.orbital.x || 0)\n ? getCurveFunctionFromConfig(\n generalData.particleSystemId,\n velocityOverLifetime.orbital.x as LifetimeCurve\n )\n : undefined,\n y: isLifeTimeCurve(velocityOverLifetime.orbital.y || 0)\n ? getCurveFunctionFromConfig(\n generalData.particleSystemId,\n velocityOverLifetime.orbital.y as LifetimeCurve\n )\n : undefined,\n z: isLifeTimeCurve(velocityOverLifetime.orbital.z || 0)\n ? getCurveFunctionFromConfig(\n generalData.particleSystemId,\n velocityOverLifetime.orbital.z as LifetimeCurve\n )\n : undefined,\n },\n positionOffset: new THREE.Vector3(),\n })\n );\n }\n\n const startValueKeys: Array<keyof NormalizedParticleSystemConfig> = [\n 'startSize',\n 'startOpacity',\n ];\n startValueKeys.forEach((key) => {\n generalData.startValues[key] = Array.from({ length: maxParticles }, () =>\n calculateValue(\n generalData.particleSystemId,\n normalizedConfig[key] as\n | Constant\n | RandomBetweenTwoConstants\n | LifetimeCurve,\n 0\n )\n );\n });\n\n generalData.startValues.startColorR = Array.from(\n { length: maxParticles },\n () => 0\n );\n generalData.startValues.startColorG = Array.from(\n { length: maxParticles },\n () => 0\n );\n generalData.startValues.startColorB = Array.from(\n { length: maxParticles },\n () => 0\n );\n\n const lifetimeValueKeys: Array<keyof NormalizedParticleSystemConfig> = [\n 'rotationOverLifetime',\n ];\n lifetimeValueKeys.forEach((key) => {\n const value = normalizedConfig[key] as {\n isActive: boolean;\n } & RandomBetweenTwoConstants;\n if (value.isActive)\n generalData.lifetimeValues[key] = Array.from(\n { length: maxParticles },\n () => THREE.MathUtils.randFloat(value.min!, value.max!)\n );\n });\n\n generalData.noise = {\n isActive: noise.isActive,\n strength: noise.strength,\n noisePower: 0.15 * noise.strength,\n positionAmount: noise.positionAmount,\n rotationAmount: noise.rotationAmount,\n sizeAmount: noise.sizeAmount,\n sampler: noise.isActive\n ? new FBM({\n seed: Math.random(),\n scale: noise.frequency,\n octaves: noise.octaves,\n })\n : undefined,\n offsets: noise.useRandomOffset\n ? Array.from({ length: maxParticles }, () => Math.random() * 100)\n : undefined,\n };\n\n // Initialize burst states if bursts are configured\n if (emission.bursts && emission.bursts.length > 0) {\n generalData.burstStates = emission.bursts.map(() => ({\n cyclesExecuted: 0,\n lastCycleTime: 0,\n probabilityPassed: false,\n }));\n }\n\n const material = new THREE.ShaderMaterial({\n uniforms: {\n elapsed: {\n value: 0.0,\n },\n map: {\n value: particleMap,\n },\n tiles: {\n value: textureSheetAnimation.tiles,\n },\n fps: {\n value: textureSheetAnimation.fps,\n },\n useFPSForFrameIndex: {\n value: textureSheetAnimation.timeMode === TimeMode.FPS,\n },\n backgroundColor: {\n value: renderer.backgroundColor,\n },\n discardBackgroundColor: {\n value: renderer.discardBackgroundColor,\n },\n backgroundColorTolerance: {\n value: renderer.backgroundColorTolerance,\n },\n },\n vertexShader: ParticleSystemVertexShader,\n fragmentShader: ParticleSystemFragmentShader,\n transparent: renderer.transparent,\n blending: renderer.blending,\n depthTest: renderer.depthTest,\n depthWrite: renderer.depthWrite,\n });\n\n const geometry = new THREE.BufferGeometry();\n\n for (let i = 0; i < maxParticles; i++)\n calculatePositionAndVelocity(\n generalData,\n shape,\n startSpeed,\n startPositions[i],\n velocities[i]\n );\n\n const positionArray = new Float32Array(maxParticles * 3);\n for (let i = 0; i < maxParticles; i++) {\n positionArray[i * 3] = startPositions[i].x;\n positionArray[i * 3 + 1] = startPositions[i].y;\n positionArray[i * 3 + 2] = startPositions[i].z;\n }\n geometry.setAttribute(\n 'position',\n new THREE.BufferAttribute(positionArray, 3)\n );\n\n createFloat32Attributes({\n geometry,\n propertyName: 'isActive',\n maxParticles,\n factory: 0,\n });\n\n createFloat32Attributes({\n geometry,\n propertyName: 'lifetime',\n maxParticles,\n factory: 0,\n });\n\n createFloat32Attributes({\n geometry,\n propertyName: 'startLifetime',\n maxParticles,\n factory: () =>\n calculateValue(generalData.particleSystemId, startLifetime, 0) * 1000,\n });\n\n createFloat32Attributes({\n geometry,\n propertyName: 'startFrame',\n maxParticles,\n factory: () =>\n textureSheetAnimation.startFrame\n ? calculateValue(\n generalData.particleSystemId,\n textureSheetAnimation.startFrame,\n 0\n )\n : 0,\n });\n\n createFloat32Attributes({\n geometry,\n propertyName: 'opacity',\n maxParticles,\n factory: () =>\n calculateValue(generalData.particleSystemId, startOpacity, 0),\n });\n\n createFloat32Attributes({\n geometry,\n propertyName: 'rotation',\n maxParticles,\n factory: () =>\n calculateValue(generalData.particleSystemId, startRotation, 0),\n });\n\n createFloat32Attributes({\n geometry,\n propertyName: 'size',\n maxParticles,\n factory: (_, index) => generalData.startValues.startSize[index],\n });\n\n createFloat32Attributes({\n geometry,\n propertyName: 'rotation',\n maxParticles,\n factory: 0,\n });\n\n const colorRandomRatio = Math.random();\n createFloat32Attributes({\n geometry,\n propertyName: 'colorR',\n maxParticles,\n factory: () =>\n startColor.min!.r! +\n colorRandomRatio * (startColor.max!.r! - startColor.min!.r!),\n });\n createFloat32Attributes({\n geometry,\n propertyName: 'colorG',\n maxParticles,\n factory: () =>\n startColor.min!.g! +\n colorRandomRatio * (startColor.max!.g! - startColor.min!.g!),\n });\n createFloat32Attributes({\n geometry,\n propertyName: 'colorB',\n maxParticles,\n factory: () =>\n startColor.min!.b! +\n colorRandomRatio * (startColor.max!.b! - startColor.min!.b!),\n });\n createFloat32Attributes({\n geometry,\n propertyName: 'colorA',\n maxParticles,\n factory: 0,\n });\n\n const deactivateParticle = (particleIndex: number) => {\n geometry.attributes.isActive.array[particleIndex] = 0;\n geometry.attributes.colorA.array[particleIndex] = 0;\n geometry.attributes.colorA.needsUpdate = true;\n freeList.push(particleIndex);\n };\n\n const activateParticle = ({\n particleIndex,\n activationTime,\n position,\n }: {\n particleIndex: number;\n activationTime: number;\n position: Required<Point3D>;\n }) => {\n geometry.attributes.isActive.array[particleIndex] = 1;\n generalData.creationTimes[particleIndex] = activationTime;\n\n if (generalData.noise.offsets)\n generalData.noise.offsets[particleIndex] = Math.random() * 100;\n\n const colorRandomRatio = Math.random();\n\n geometry.attributes.colorR.array[particleIndex] =\n startColor.min!.r! +\n colorRandomRatio * (startColor.max!.r! - startColor.min!.r!);\n geometry.attributes.colorR.needsUpdate = true;\n\n geometry.attributes.colorG.array[particleIndex] =\n startColor.min!.g! +\n colorRandomRatio * (startColor.max!.g! - startColor.min!.g!);\n geometry.attributes.colorG.needsUpdate = true;\n\n geometry.attributes.colorB.array[particleIndex] =\n startColor.min!.b! +\n colorRandomRatio * (startColor.max!.b! - startColor.min!.b!);\n geometry.attributes.colorB.needsUpdate = true;\n\n generalData.startValues.startColorR[particleIndex] =\n geometry.attributes.colorR.array[particleIndex];\n generalData.startValues.startColorG[particleIndex] =\n geometry.attributes.colorG.array[particleIndex];\n generalData.startValues.startColorB[particleIndex] =\n geometry.attributes.colorB.array[particleIndex];\n\n geometry.attributes.startFrame.array[particleIndex] =\n textureSheetAnimation.startFrame\n ? calculateValue(\n generalData.particleSystemId,\n textureSheetAnimation.startFrame,\n 0\n )\n : 0;\n geometry.attributes.startFrame.needsUpdate = true;\n\n geometry.attributes.startLifetime.array[particleIndex] =\n calculateValue(\n generalData.particleSystemId,\n startLifetime,\n generalData.normalizedLifetimePercentage\n ) * 1000;\n geometry.attributes.startLifetime.needsUpdate = true;\n\n generalData.startValues.startSize[particleIndex] = calculateValue(\n generalData.particleSystemId,\n startSize,\n generalData.normalizedLifetimePercentage\n );\n geometry.attributes.size.array[particleIndex] =\n generalData.startValues.startSize[particleIndex];\n geometry.attributes.size.needsUpdate = true;\n\n generalData.startValues.startOpacity[particleIndex] = calculateValue(\n generalData.particleSystemId,\n startOpacity,\n generalData.normalizedLifetimePercentage\n );\n geometry.attributes.colorA.array[particleIndex] =\n generalData.startValues.startOpacity[particleIndex];\n geometry.attributes.colorA.needsUpdate = true;\n\n geometry.attributes.rotation.array[particleIndex] = calculateValue(\n generalData.particleSystemId,\n startRotation,\n generalData.normalizedLifetimePercentage\n );\n geometry.attributes.rotation.needsUpdate = true;\n\n if (normalizedConfig.rotationOverLifetime.isActive)\n generalData.lifetimeValues.rotationOverLifetime[particleIndex] =\n THREE.MathUtils.randFloat(\n normalizedConfig.rotationOverLifetime.min!,\n normalizedConfig.rotationOverLifetime.max!\n );\n\n calculatePositionAndVelocity(\n generalData,\n shape,\n startSpeed,\n startPositions[particleIndex],\n velocities[particleIndex]\n );\n const positionIndex = Math.floor(particleIndex * 3);\n geometry.attributes.position.array[positionIndex] =\n position.x + startPositions[particleIndex].x;\n geometry.attributes.position.array[positionIndex + 1] =\n position.y + startPositions[particleIndex].y;\n geometry.attributes.position.array[positionIndex + 2] =\n position.z + startPositions[particleIndex].z;\n geometry.attributes.position.needsUpdate = true;\n\n if (generalData.linearVelocityData) {\n generalData.linearVelocityData[particleIndex].speed.set(\n normalizedConfig.velocityOverLifetime.linear.x\n ? calculateValue(\n generalData.particleSystemId,\n normalizedConfig.velocityOverLifetime.linear.x,\n 0\n )\n : 0,\n normalizedConfig.velocityOverLifetime.linear.y\n ? calculateValue(\n generalData.particleSystemId,\n normalizedConfig.velocityOverLifetime.linear.y,\n 0\n )\n : 0,\n normalizedConfig.velocityOverLifetime.linear.z\n ? calculateValue(\n generalData.particleSystemId,\n normalizedConfig.velocityOverLifetime.linear.z,\n 0\n )\n : 0\n );\n }\n\n if (generalData.orbitalVelocityData) {\n generalData.orbitalVelocityData[particleIndex].speed.set(\n normalizedConfig.velocityOverLifetime.orbital.x\n ? calculateValue(\n generalData.particleSystemId,\n normalizedConfig.velocityOverLifetime.orbital.x,\n 0\n )\n : 0,\n normalizedConfig.velocityOverLifetime.orbital.y\n ? calculateValue(\n generalData.particleSystemId,\n normalizedConfig.velocityOverLifetime.orbital.y,\n 0\n )\n : 0,\n normalizedConfig.velocityOverLifetime.orbital.z\n ? calculateValue(\n generalData.particleSystemId,\n normalizedConfig.velocityOverLifetime.orbital.z,\n 0\n )\n : 0\n );\n generalData.orbitalVelocityData[particleIndex].positionOffset.set(\n startPositions[particleIndex].x,\n startPositions[particleIndex].y,\n startPositions[particleIndex].z\n );\n }\n\n geometry.attributes.lifetime.array[particleIndex] = 0;\n geometry.attributes.lifetime.needsUpdate = true;\n\n applyModifiers({\n delta: 0,\n generalData,\n normalizedConfig,\n attributes: particleSystem.geometry.attributes,\n particleLifetimePercentage: 0,\n particleIndex,\n });\n };\n\n // Sub-emitter setup\n const subEmitterArr: Array<SubEmitterConfig> = subEmitters ?? [];\n const deathSubEmitters = subEmitterArr.filter(\n (s) => (s.trigger ?? SubEmitterTrigger.DEATH) === SubEmitterTrigger.DEATH\n );\n const birthSubEmitters = subEmitterArr.filter(\n (s) => s.trigger === SubEmitterTrigger.BIRTH\n );\n // Track sub-emitter instances per config for per-config maxInstances enforcement\n const subEmitterInstancesMap = new Map<\n SubEmitterConfig,\n Array<ParticleSystem>\n >();\n for (const cfg of subEmitterArr) {\n subEmitterInstancesMap.set(cfg, []);\n }\n\n const cleanupCompletedInstances = (instances: Array<ParticleSystem>) => {\n for (let i = instances.length - 1; i >= 0; i--) {\n const sub = instances[i];\n const points =\n sub.instance instanceof THREE.Points\n ? sub.instance\n : (sub.instance.children[0] as THREE.Points | undefined);\n const isActiveArr = points?.geometry?.attributes?.isActive?.array;\n if (!isActiveArr) {\n sub.dispose();\n instances.splice(i, 1);\n continue;\n }\n let hasActive = false;\n for (let j = 0; j < isActiveArr.length; j++) {\n if (isActiveArr[j]) {\n hasActive = true;\n break;\n }\n }\n if (!hasActive) {\n sub.dispose();\n instances.splice(i, 1);\n }\n }\n };\n\n const spawnSubEmitters = (\n configs: Array<SubEmitterConfig>,\n position: THREE.Vector3,\n velocity: THREE.Vector3,\n spawnNow: number\n ) => {\n for (const subConfig of configs) {\n const instances = subEmitterInstancesMap.get(subConfig)!;\n const maxInst = subConfig.maxInstances ?? 32;\n if (instances.length >= maxInst) {\n cleanupCompletedInstances(instances);\n if (instances.length >= maxInst) continue;\n }\n\n const inheritVelocity = subConfig.inheritVelocity ?? 0;\n const subSystem = createParticleSystem(\n {\n ...subConfig.config,\n looping: false,\n transform: {\n ...subConfig.config.transform,\n position: new THREE.Vector3(position.x, position.y, position.z),\n },\n ...(inheritVelocity > 0\n ? {\n startSpeed:\n (typeof subConfig.config.startSpeed === 'number'\n ? subConfig.config.startSpeed\n : typeof subConfig.config.startSpeed === 'object' &&\n subConfig.config.startSpeed !== null &&\n 'min' in subConfig.config.startSpeed\n ? ((\n subConfig.config\n .startSpeed as RandomBetweenTwoConstants\n ).min ?? 0)\n : 0) +\n velocity.length() * inheritVelocity,\n }\n : {}),\n },\n spawnNow\n );\n\n const parentObj = (wrapper || particleSystem).parent;\n if (parentObj) parentObj.add(subSystem.instance);\n\n instances.push(subSystem);\n }\n };\n\n let particleSystem = new THREE.Points(geometry, material);\n\n particleSystem.position.copy(transform!.position!);\n particleSystem.rotation.x = THREE.MathUtils.degToRad(transform.rotation!.x);\n particleSystem.rotation.y = THREE.MathUtils.degToRad(transform.rotation!.y);\n particleSystem.rotation.z = THREE.MathUtils.degToRad(transform.rotation!.z);\n particleSystem.scale.copy(transform.scale!);\n\n const calculatedCreationTime =\n now + calculateValue(generalData.particleSystemId, startDelay) * 1000;\n\n let wrapper: Gyroscope | undefined;\n if (normalizedConfig.simulationSpace === SimulationSpace.WORLD) {\n wrapper = new Gyroscope();\n wrapper.add(particleSystem);\n }\n\n const hasDeathSubEmitters = deathSubEmitters.length > 0;\n const hasBirthSubEmitters = birthSubEmitters.length > 0;\n\n const onParticleDeath = hasDeathSubEmitters\n ? (\n particleIndex: number,\n positionArr: THREE.TypedArray,\n velocity: THREE.Vector3,\n deathNow: number\n ) => {\n const posIdx = particleIndex * 3;\n _subEmitterPosition.set(\n positionArr[posIdx],\n positionArr[posIdx + 1],\n positionArr[posIdx + 2]\n );\n spawnSubEmitters(\n deathSubEmitters,\n _subEmitterPosition,\n velocity,\n deathNow\n );\n }\n : undefined;\n\n const onParticleBirth = hasBirthSubEmitters\n ? (\n particleIndex: number,\n positionArr: THREE.TypedArray,\n velocity: THREE.Vector3,\n birthNow: number\n ) => {\n const posIdx = particleIndex * 3;\n _subEmitterPosition.set(\n positionArr[posIdx],\n positionArr[posIdx + 1],\n positionArr[posIdx + 2]\n );\n spawnSubEmitters(\n birthSubEmitters,\n _subEmitterPosition,\n velocity,\n birthNow\n );\n }\n : undefined;\n\n const instanceData: ParticleSystemInstance = {\n particleSystem,\n wrapper,\n elapsedUniform: material.uniforms.elapsed,\n generalData,\n onUpdate,\n onComplete,\n creationTime: calculatedCreationTime,\n lastEmissionTime: calculatedCreationTime,\n duration,\n looping,\n simulationSpace,\n gravity,\n emission,\n normalizedConfig,\n iterationCount: 0,\n velocities,\n freeList,\n deactivateParticle,\n activateParticle,\n onParticleDeath,\n onParticleBirth,\n };\n\n createdParticleSystems.push(instanceData);\n\n const resumeEmitter = () => (generalData.isEnabled = true);\n const pauseEmitter = () => (generalData.isEnabled = false);\n const dispose = () => {\n for (const instances of subEmitterInstancesMap.values()) {\n for (const sub of instances) sub.dispose();\n instances.length = 0;\n }\n destroyParticleSystem(particleSystem);\n };\n const update = (cycleData: CycleData) => {\n updateParticleSystemInstance(instanceData, cycleData);\n for (const instances of subEmitterInstancesMap.values()) {\n for (const sub of instances) sub.update(cycleData);\n }\n };\n\n return {\n instance: wrapper || particleSystem,\n resumeEmitter,\n pauseEmitter,\n dispose,\n update,\n };\n};\n\n/**\n * Updates all active particle systems created with {@link createParticleSystem}.\n *\n * This function must be called once per frame in your animation loop to animate all particles.\n * It handles particle emission, movement, lifetime tracking, modifier application, and cleanup\n * of expired particle systems.\n *\n * @param cycleData - Object containing timing information for the current frame:\n * - `now`: Current timestamp in milliseconds (typically from `performance.now()` or `Date.now()`)\n * - `delta`: Time elapsed since the last frame in seconds\n * - `elapsed`: Total time elapsed since the animation started in seconds\n *\n * @example\n * ```typescript\n * import { createParticleSystem, updateParticleSystems } from '@newkrok/three-particles';\n *\n * const { instance } = createParticleSystem({\n * // your config\n * });\n * scene.add(instance);\n *\n * // Animation loop\n * let lastTime = 0;\n * let elapsedTime = 0;\n *\n * function animate(currentTime) {\n * requestAnimationFrame(animate);\n *\n * const delta = (currentTime - lastTime) / 1000; // Convert to seconds\n * elapsedTime += delta;\n * lastTime = currentTime;\n *\n * // Update all particle systems\n * updateParticleSystems({\n * now: currentTime,\n * delta: delta,\n * elapsed: elapsedTime\n * });\n *\n * renderer.render(scene, camera);\n * }\n *\n * animate(0);\n * ```\n *\n * @example\n * ```typescript\n * // Using Three.js Clock for timing\n * import * as THREE from 'three';\n * import { updateParticleSystems } from '@newkrok/three-particles';\n *\n * const clock = new THREE.Clock();\n *\n * function animate() {\n * requestAnimationFrame(animate);\n *\n * const delta = clock.getDelta();\n * const elapsed = clock.getElapsedTime();\n *\n * updateParticleSystems({\n * now: performance.now(),\n * delta: delta,\n * elapsed: elapsed\n * });\n *\n * renderer.render(scene, camera);\n * }\n * ```\n *\n * @see {@link createParticleSystem} - Creates particle systems to be updated\n * @see {@link CycleData} - Timing data structure\n */\nconst updateParticleSystemInstance = (\n props: ParticleSystemInstance,\n { now, delta, elapsed }: CycleData\n) => {\n const {\n onUpdate,\n generalData,\n onComplete,\n particleSystem,\n wrapper,\n elapsedUniform,\n creationTime,\n lastEmissionTime,\n duration,\n looping,\n emission,\n normalizedConfig,\n iterationCount,\n velocities,\n freeList,\n deactivateParticle,\n activateParticle,\n simulationSpace,\n gravity,\n onParticleDeath,\n onParticleBirth,\n } = props;\n\n const lifetime = now - creationTime;\n const normalizedLifetime = lifetime % (duration * 1000);\n\n generalData.normalizedLifetimePercentage = Math.max(\n Math.min(normalizedLifetime / (duration * 1000), 1),\n 0\n );\n\n const {\n lastWorldPosition,\n currentWorldPosition,\n worldPositionChange,\n lastWorldQuaternion,\n worldQuaternion,\n worldEuler,\n gravityVelocity,\n isEnabled,\n } = generalData;\n\n if (wrapper?.parent)\n generalData.wrapperQuaternion.copy(wrapper.parent.quaternion);\n\n _lastWorldPositionSnapshot.copy(lastWorldPosition);\n\n elapsedUniform.value = elapsed;\n\n particleSystem.getWorldPosition(currentWorldPosition);\n if (lastWorldPosition.x !== -99999) {\n worldPositionChange.set(\n currentWorldPosition.x - lastWorldPosition.x,\n currentWorldPosition.y - lastWorldPosition.y,\n currentWorldPosition.z - lastWorldPosition.z\n );\n }\n if (isEnabled) {\n generalData.distanceFromLastEmitByDistance += worldPositionChange.length();\n }\n particleSystem.getWorldPosition(lastWorldPosition);\n particleSystem.getWorldQuaternion(worldQuaternion);\n if (\n lastWorldQuaternion.x === -99999 ||\n lastWorldQuaternion.x !== worldQuaternion.x ||\n lastWorldQuaternion.y !== worldQuaternion.y ||\n lastWorldQuaternion.z !== worldQuaternion.z\n ) {\n worldEuler.setFromQuaternion(worldQuaternion);\n lastWorldQuaternion.copy(worldQuaternion);\n gravityVelocity.set(\n lastWorldPosition.x,\n lastWorldPosition.y + gravity,\n lastWorldPosition.z\n );\n particleSystem.worldToLocal(gravityVelocity);\n }\n\n const creationTimes = generalData.creationTimes;\n const attributes = particleSystem.geometry.attributes;\n const isActiveArr = attributes.isActive.array;\n const startLifetimeArr = attributes.startLifetime.array;\n const positionArr = attributes.position.array;\n const lifetimeArr = attributes.lifetime.array;\n const creationTimesLength = creationTimes.length;\n\n let positionNeedsUpdate = false;\n let lifetimeNeedsUpdate = false;\n\n _modifierParams.delta = delta;\n _modifierParams.generalData = generalData;\n _modifierParams.normalizedConfig = normalizedConfig;\n _modifierParams.attributes = attributes;\n\n for (let index = 0; index < creationTimesLength; index++) {\n if (isActiveArr[index]) {\n const particleLifetime = now - creationTimes[index];\n if (particleLifetime > startLifetimeArr[index]) {\n if (onParticleDeath)\n onParticleDeath(index, positionArr, velocities[index], now);\n deactivateParticle(index);\n } else {\n const velocity = velocities[index];\n velocity.x -= gravityVelocity.x * delta;\n velocity.y -= gravityVelocity.y * delta;\n velocity.z -= gravityVelocity.z * delta;\n\n if (\n gravity !== 0 ||\n velocity.x !== 0 ||\n velocity.y !== 0 ||\n velocity.z !== 0 ||\n worldPositionChange.x !== 0 ||\n worldPositionChange.y !== 0 ||\n worldPositionChange.z !== 0\n ) {\n const positionIndex = index * 3;\n\n if (simulationSpace === SimulationSpace.WORLD) {\n positionArr[positionIndex] -= worldPositionChange.x;\n positionArr[positionIndex + 1] -= worldPositionChange.y;\n positionArr[positionIndex + 2] -= worldPositionChange.z;\n }\n\n positionArr[positionIndex] += velocity.x * delta;\n positionArr[positionIndex + 1] += velocity.y * delta;\n positionArr[positionIndex + 2] += velocity.z * delta;\n positionNeedsUpdate = true;\n }\n\n lifetimeArr[index] = particleLifetime;\n lifetimeNeedsUpdate = true;\n\n _modifierParams.particleLifetimePercentage =\n particleLifetime / startLifetimeArr[index];\n _modifierParams.particleIndex = index;\n applyModifiers(_modifierParams);\n }\n }\n }\n\n if (positionNeedsUpdate) attributes.position.needsUpdate = true;\n if (lifetimeNeedsUpdate) attributes.lifetime.needsUpdate = true;\n\n if (isEnabled && (looping || lifetime < duration * 1000)) {\n const emissionDelta = now - lastEmissionTime;\n const neededParticlesByTime = emission.rateOverTime\n ? Math.floor(\n calculateValue(\n generalData.particleSystemId,\n emission.rateOverTime,\n generalData.normalizedLifetimePercentage\n ) *\n (emissionDelta / 1000)\n )\n : 0;\n\n const rateOverDistance = emission.rateOverDistance\n ? calculateValue(\n generalData.particleSystemId,\n emission.rateOverDistance,\n generalData.normalizedLifetimePercentage\n )\n : 0;\n const neededParticlesByDistance =\n rateOverDistance > 0 && generalData.distanceFromLastEmitByDistance > 0\n ? Math.floor(\n generalData.distanceFromLastEmitByDistance / (1 / rateOverDistance!)\n )\n : 0;\n const useDistanceStep = neededParticlesByDistance > 0;\n if (useDistanceStep) {\n _distanceStep.x =\n (currentWorldPosition.x - _lastWorldPositionSnapshot.x) /\n neededParticlesByDistance;\n _distanceStep.y =\n (currentWorldPosition.y - _lastWorldPositionSnapshot.y) /\n neededParticlesByDistance;\n _distanceStep.z =\n (currentWorldPosition.z - _lastWorldPositionSnapshot.z) /\n neededParticlesByDistance;\n }\n let neededParticles = neededParticlesByTime + neededParticlesByDistance;\n\n if (rateOverDistance > 0 && neededParticlesByDistance >= 1) {\n generalData.distanceFromLastEmitByDistance = 0;\n }\n\n // Process burst emissions\n if (emission.bursts && generalData.burstStates) {\n const bursts = emission.bursts;\n const burstStates = generalData.burstStates;\n const currentIterationTime = normalizedLifetime;\n\n for (let i = 0; i < bursts.length; i++) {\n const burst = bursts[i];\n const state = burstStates[i];\n const burstTimeMs = burst.time * 1000;\n const cycles = burst.cycles ?? 1;\n const intervalMs = (burst.interval ?? 0) * 1000;\n const probability = burst.probability ?? 1;\n\n // Check if we've looped and need to reset burst states\n if (\n looping &&\n currentIterationTime < burstTimeMs &&\n state.cyclesExecuted > 0\n ) {\n state.cyclesExecuted = 0;\n state.lastCycleTime = 0;\n state.probabilityPassed = false;\n }\n\n // Check if all cycles for this burst have been executed\n if (state.cyclesExecuted >= cycles) continue;\n\n // Calculate the time for the next cycle\n const nextCycleTime = burstTimeMs + state.cyclesExecuted * intervalMs;\n\n // Check if it's time for the next cycle\n if (currentIterationTime >= nextCycleTime) {\n // On first cycle, determine if probability check passes\n if (state.cyclesExecuted === 0) {\n state.probabilityPassed = Math.random() < probability;\n }\n\n // Only emit if probability check passed\n if (state.probabilityPassed) {\n const burstCount = Math.floor(\n calculateValue(\n generalData.particleSystemId,\n burst.count,\n generalData.normalizedLifetimePercentage\n )\n );\n neededParticles += burstCount;\n }\n\n state.cyclesExecuted++;\n state.lastCycleTime = currentIterationTime;\n }\n }\n }\n\n if (neededParticles > 0) {\n let generatedParticlesByDistanceNeeds = 0;\n\n for (let i = 0; i < neededParticles; i++) {\n if (freeList.length === 0) break;\n const particleIndex = freeList.pop()!;\n\n _tempPosition.x = 0;\n _tempPosition.y = 0;\n _tempPosition.z = 0;\n if (\n useDistanceStep &&\n generatedParticlesByDistanceNeeds < neededParticlesByDistance\n ) {\n _tempPosition.x = _distanceStep.x * generatedParticlesByDistanceNeeds;\n _tempPosition.y = _distanceStep.y * generatedParticlesByDistanceNeeds;\n _tempPosition.z = _distanceStep.z * generatedParticlesByDistanceNeeds;\n generatedParticlesByDistanceNeeds++;\n }\n activateParticle({\n particleIndex,\n activationTime: now,\n position: _tempPosition,\n });\n if (onParticleBirth)\n onParticleBirth(\n particleIndex,\n attributes.position.array,\n velocities[particleIndex],\n now\n );\n props.lastEmissionTime = now;\n }\n }\n\n if (onUpdate)\n onUpdate({\n particleSystem,\n delta,\n elapsed,\n lifetime,\n normalizedLifetime,\n iterationCount: iterationCount + 1,\n });\n } else if (onComplete)\n onComplete({\n particleSystem,\n });\n};\n\nexport const updateParticleSystems = (cycleData: CycleData) => {\n createdParticleSystems.forEach((props) =>\n updateParticleSystemInstance(props, cycleData)\n );\n};\n"]}