babylon.quarks 0.20.0 → 0.23.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,"file":"babylon.quarks.umd.min.js","sources":["../../quarks.core/dist/quarks.core.esm.js","../src/MeshSurfaceEmitter.ts","../src/shaders/chunks/register-shader-chunks.ts","../src/shaders/chunks/tile_pars_vertex.glsl.ts","../src/shaders/chunks/tile_vertex.glsl.ts","../src/shaders/chunks/tile_pars_fragment.glsl.ts","../src/shaders/chunks/tile_fragment.glsl.ts","../src/shaders/chunks/soft_pars_vertex.glsl.ts","../src/shaders/chunks/soft_vertex.glsl.ts","../src/shaders/chunks/soft_pars_fragment.glsl.ts","../src/shaders/chunks/soft_fragment.glsl.ts","../src/shaders/local_particle_physics_vert.glsl.ts","../src/shaders/particle_frag.glsl.ts","../src/shaders/particle_physics_frag.glsl.ts","../src/shaders/particle_vert.glsl.ts","../src/shaders/stretched_bb_particle_vert.glsl.ts","../src/shaders/trail_frag.glsl.ts","../src/shaders/trail_vert.glsl.ts","../src/shaders/particle_frag.wgsl.ts","../src/shaders/shaderLanguageSupport.ts","../src/shaders/stretched_bb_particle_vert.wgsl.ts","../src/VFXBatch.ts","../src/SpriteBatch.ts","../src/shaders/local_particle_physics_vert.wgsl.ts","../src/shaders/particle_physics_frag.wgsl.ts","../src/shaders/particle_vert.wgsl.ts","../src/TrailBatch.ts","../src/shaders/trail_vert.wgsl.ts","../src/shaders/trail_frag.wgsl.ts","../src/BatchedRenderer.ts","../src/BatchedParticleRenderer.ts","../src/envAtlas.ts","../src/materials/ParticleMaterials.ts","../src/ParticleEmitter.ts","../src/geometryUtil.ts","../src/ParticleSystem.ts","../src/QuarksPrefab.ts","../src/QuarksLoader.ts","../src/QuarksUtil.ts","../src/index.ts","../src/shaders/local_particle_vert.glsl.ts"],"sourcesContent":["/**\n * quarks.core v0.20.0 build Fri Oct 16 2026\n * https://quarks.art\n * Copyright 2026 Alchemist0823 <the.forrest.sun@gmail.com>, MIT\n */\nconst _lut = [\n '00',\n '01',\n '02',\n '03',\n '04',\n '05',\n '06',\n '07',\n '08',\n '09',\n '0a',\n '0b',\n '0c',\n '0d',\n '0e',\n '0f',\n '10',\n '11',\n '12',\n '13',\n '14',\n '15',\n '16',\n '17',\n '18',\n '19',\n '1a',\n '1b',\n '1c',\n '1d',\n '1e',\n '1f',\n '20',\n '21',\n '22',\n '23',\n '24',\n '25',\n '26',\n '27',\n '28',\n '29',\n '2a',\n '2b',\n '2c',\n '2d',\n '2e',\n '2f',\n '30',\n '31',\n '32',\n '33',\n '34',\n '35',\n '36',\n '37',\n '38',\n '39',\n '3a',\n '3b',\n '3c',\n '3d',\n '3e',\n '3f',\n '40',\n '41',\n '42',\n '43',\n '44',\n '45',\n '46',\n '47',\n '48',\n '49',\n '4a',\n '4b',\n '4c',\n '4d',\n '4e',\n '4f',\n '50',\n '51',\n '52',\n '53',\n '54',\n '55',\n '56',\n '57',\n '58',\n '59',\n '5a',\n '5b',\n '5c',\n '5d',\n '5e',\n '5f',\n '60',\n '61',\n '62',\n '63',\n '64',\n '65',\n '66',\n '67',\n '68',\n '69',\n '6a',\n '6b',\n '6c',\n '6d',\n '6e',\n '6f',\n '70',\n '71',\n '72',\n '73',\n '74',\n '75',\n '76',\n '77',\n '78',\n '79',\n '7a',\n '7b',\n '7c',\n '7d',\n '7e',\n '7f',\n '80',\n '81',\n '82',\n '83',\n '84',\n '85',\n '86',\n '87',\n '88',\n '89',\n '8a',\n '8b',\n '8c',\n '8d',\n '8e',\n '8f',\n '90',\n '91',\n '92',\n '93',\n '94',\n '95',\n '96',\n '97',\n '98',\n '99',\n '9a',\n '9b',\n '9c',\n '9d',\n '9e',\n '9f',\n 'a0',\n 'a1',\n 'a2',\n 'a3',\n 'a4',\n 'a5',\n 'a6',\n 'a7',\n 'a8',\n 'a9',\n 'aa',\n 'ab',\n 'ac',\n 'ad',\n 'ae',\n 'af',\n 'b0',\n 'b1',\n 'b2',\n 'b3',\n 'b4',\n 'b5',\n 'b6',\n 'b7',\n 'b8',\n 'b9',\n 'ba',\n 'bb',\n 'bc',\n 'bd',\n 'be',\n 'bf',\n 'c0',\n 'c1',\n 'c2',\n 'c3',\n 'c4',\n 'c5',\n 'c6',\n 'c7',\n 'c8',\n 'c9',\n 'ca',\n 'cb',\n 'cc',\n 'cd',\n 'ce',\n 'cf',\n 'd0',\n 'd1',\n 'd2',\n 'd3',\n 'd4',\n 'd5',\n 'd6',\n 'd7',\n 'd8',\n 'd9',\n 'da',\n 'db',\n 'dc',\n 'dd',\n 'de',\n 'df',\n 'e0',\n 'e1',\n 'e2',\n 'e3',\n 'e4',\n 'e5',\n 'e6',\n 'e7',\n 'e8',\n 'e9',\n 'ea',\n 'eb',\n 'ec',\n 'ed',\n 'ee',\n 'ef',\n 'f0',\n 'f1',\n 'f2',\n 'f3',\n 'f4',\n 'f5',\n 'f6',\n 'f7',\n 'f8',\n 'f9',\n 'fa',\n 'fb',\n 'fc',\n 'fd',\n 'fe',\n 'ff',\n];\nlet _seed = 1234567;\nconst DEG2RAD = Math.PI / 180;\nconst RAD2DEG = 180 / Math.PI;\n// http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136\nfunction generateUUID() {\n const d0 = (Math.random() * 0xffffffff) | 0;\n const d1 = (Math.random() * 0xffffffff) | 0;\n const d2 = (Math.random() * 0xffffffff) | 0;\n const d3 = (Math.random() * 0xffffffff) | 0;\n const uuid = _lut[d0 & 0xff] +\n _lut[(d0 >> 8) & 0xff] +\n _lut[(d0 >> 16) & 0xff] +\n _lut[(d0 >> 24) & 0xff] +\n '-' +\n _lut[d1 & 0xff] +\n _lut[(d1 >> 8) & 0xff] +\n '-' +\n _lut[((d1 >> 16) & 0x0f) | 0x40] +\n _lut[(d1 >> 24) & 0xff] +\n '-' +\n _lut[(d2 & 0x3f) | 0x80] +\n _lut[(d2 >> 8) & 0xff] +\n '-' +\n _lut[(d2 >> 16) & 0xff] +\n _lut[(d2 >> 24) & 0xff] +\n _lut[d3 & 0xff] +\n _lut[(d3 >> 8) & 0xff] +\n _lut[(d3 >> 16) & 0xff] +\n _lut[(d3 >> 24) & 0xff];\n // .toLowerCase() here flattens concatenated strings to save heap memory space.\n return uuid.toLowerCase();\n}\nfunction clamp(value, min, max) {\n return Math.max(min, Math.min(max, value));\n}\n// compute euclidean modulo of m % n\n// https://en.wikipedia.org/wiki/Modulo_operation\nfunction euclideanModulo(n, m) {\n return ((n % m) + m) % m;\n}\n// Linear mapping from range <a1, a2> to range <b1, b2>\nfunction mapLinear(x, a1, a2, b1, b2) {\n return b1 + ((x - a1) * (b2 - b1)) / (a2 - a1);\n}\n// https://www.gamedev.net/tutorials/programming/general-and-gameplay-programming/inverse-lerp-a-super-useful-yet-often-overlooked-function-r5230/\nfunction inverseLerp(x, y, value) {\n if (x !== y) {\n return (value - x) / (y - x);\n }\n else {\n return 0;\n }\n}\n// https://en.wikipedia.org/wiki/Linear_interpolation\nfunction lerp(x, y, t) {\n return (1 - t) * x + t * y;\n}\n// http://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/\nfunction damp(x, y, lambda, dt) {\n return lerp(x, y, 1 - Math.exp(-lambda * dt));\n}\n// https://www.desmos.com/calculator/vcsjnyz7x4\nfunction pingpong(x, length = 1) {\n return length - Math.abs(euclideanModulo(x, length * 2) - length);\n}\n// http://en.wikipedia.org/wiki/Smoothstep\nfunction smoothstep(x, min, max) {\n if (x <= min)\n return 0;\n if (x >= max)\n return 1;\n x = (x - min) / (max - min);\n return x * x * (3 - 2 * x);\n}\nfunction smootherstep(x, min, max) {\n if (x <= min)\n return 0;\n if (x >= max)\n return 1;\n x = (x - min) / (max - min);\n return x * x * x * (x * (x * 6 - 15) + 10);\n}\n// Random integer from <low, high> interval\nfunction randInt(low, high) {\n return low + Math.floor(Math.random() * (high - low + 1));\n}\n// Random float from <low, high> interval\nfunction randFloat(low, high) {\n return low + Math.random() * (high - low);\n}\n// Random float from <-range/2, range/2> interval\nfunction randFloatSpread(range) {\n return range * (0.5 - Math.random());\n}\n// Deterministic pseudo-random float in the interval [ 0, 1 ]\nfunction seededRandom(s) {\n if (s !== undefined)\n _seed = s;\n // Mulberry32 generator\n let t = (_seed += 0x6d2b79f5);\n t = Math.imul(t ^ (t >>> 15), t | 1);\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61);\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n}\nfunction degToRad(degrees) {\n return degrees * DEG2RAD;\n}\nfunction radToDeg(radians) {\n return radians * RAD2DEG;\n}\nfunction isPowerOfTwo(value) {\n return (value & (value - 1)) === 0 && value !== 0;\n}\nfunction ceilPowerOfTwo(value) {\n return Math.pow(2, Math.ceil(Math.log(value) / Math.LN2));\n}\nfunction floorPowerOfTwo(value) {\n return Math.pow(2, Math.floor(Math.log(value) / Math.LN2));\n}\nfunction setQuaternionFromProperEuler(q, a, b, c, order) {\n // Intrinsic Proper Euler Angles - see https://en.wikipedia.org/wiki/Euler_angles\n // rotations are applied to the axes in the order specified by 'order'\n // rotation by angle 'a' is applied first, then by angle 'b', then by angle 'c'\n // angles are in radians\n const cos = Math.cos;\n const sin = Math.sin;\n const c2 = cos(b / 2);\n const s2 = sin(b / 2);\n const c13 = cos((a + c) / 2);\n const s13 = sin((a + c) / 2);\n const c1_3 = cos((a - c) / 2);\n const s1_3 = sin((a - c) / 2);\n const c3_1 = cos((c - a) / 2);\n const s3_1 = sin((c - a) / 2);\n switch (order) {\n case 'XYX':\n q.set(c2 * s13, s2 * c1_3, s2 * s1_3, c2 * c13);\n break;\n case 'YZY':\n q.set(s2 * s1_3, c2 * s13, s2 * c1_3, c2 * c13);\n break;\n case 'ZXZ':\n q.set(s2 * c1_3, s2 * s1_3, c2 * s13, c2 * c13);\n break;\n case 'XZX':\n q.set(c2 * s13, s2 * s3_1, s2 * c3_1, c2 * c13);\n break;\n case 'YXY':\n q.set(s2 * c3_1, c2 * s13, s2 * s3_1, c2 * c13);\n break;\n case 'ZYZ':\n q.set(s2 * s3_1, s2 * c3_1, c2 * s13, c2 * c13);\n break;\n default:\n console.warn('../math.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: ' + order);\n }\n}\nfunction denormalize(value, array) {\n switch (array.constructor) {\n case Float32Array:\n return value;\n case Uint32Array:\n return value / 4294967295.0;\n case Uint16Array:\n return value / 65535.0;\n case Uint8Array:\n return value / 255.0;\n case Int32Array:\n return Math.max(value / 2147483647.0, -1);\n case Int16Array:\n return Math.max(value / 32767.0, -1);\n case Int8Array:\n return Math.max(value / 127.0, -1);\n default:\n throw new Error('Invalid component type.');\n }\n}\nfunction normalize(value, array) {\n switch (array.constructor) {\n case Float32Array:\n return value;\n case Uint32Array:\n return Math.round(value * 4294967295.0);\n case Uint16Array:\n return Math.round(value * 65535.0);\n case Uint8Array:\n return Math.round(value * 255.0);\n case Int32Array:\n return Math.round(value * 2147483647.0);\n case Int16Array:\n return Math.round(value * 32767.0);\n case Int8Array:\n return Math.round(value * 127.0);\n default:\n throw new Error('Invalid component type.');\n }\n}\nconst MathUtils = {\n DEG2RAD: DEG2RAD,\n RAD2DEG: RAD2DEG,\n generateUUID: generateUUID,\n clamp: clamp,\n euclideanModulo: euclideanModulo,\n mapLinear: mapLinear,\n inverseLerp: inverseLerp,\n lerp: lerp,\n damp: damp,\n pingpong: pingpong,\n smoothstep: smoothstep,\n smootherstep: smootherstep,\n randInt: randInt,\n randFloat: randFloat,\n randFloatSpread: randFloatSpread,\n seededRandom: seededRandom,\n degToRad: degToRad,\n radToDeg: radToDeg,\n isPowerOfTwo: isPowerOfTwo,\n ceilPowerOfTwo: ceilPowerOfTwo,\n floorPowerOfTwo: floorPowerOfTwo,\n setQuaternionFromProperEuler: setQuaternionFromProperEuler,\n normalize: normalize,\n denormalize: denormalize,\n};\n\nclass Quaternion {\n constructor(x = 0, y = 0, z = 0, w = 1) {\n this._x = x;\n this._y = y;\n this._z = z;\n this._w = w;\n }\n static slerpFlat(dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t) {\n // fuzz-free, array-based Quaternion SLERP operation\n let x0 = src0[srcOffset0 + 0], y0 = src0[srcOffset0 + 1], z0 = src0[srcOffset0 + 2], w0 = src0[srcOffset0 + 3];\n const x1 = src1[srcOffset1 + 0], y1 = src1[srcOffset1 + 1], z1 = src1[srcOffset1 + 2], w1 = src1[srcOffset1 + 3];\n if (t === 0) {\n dst[dstOffset + 0] = x0;\n dst[dstOffset + 1] = y0;\n dst[dstOffset + 2] = z0;\n dst[dstOffset + 3] = w0;\n return;\n }\n if (t === 1) {\n dst[dstOffset + 0] = x1;\n dst[dstOffset + 1] = y1;\n dst[dstOffset + 2] = z1;\n dst[dstOffset + 3] = w1;\n return;\n }\n if (w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1) {\n let s = 1 - t;\n const cos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1, dir = cos >= 0 ? 1 : -1, sqrSin = 1 - cos * cos;\n // Skip the Slerp for tiny steps to avoid numeric problems:\n if (sqrSin > Number.EPSILON) {\n const sin = Math.sqrt(sqrSin), len = Math.atan2(sin, cos * dir);\n s = Math.sin(s * len) / sin;\n t = Math.sin(t * len) / sin;\n }\n const tDir = t * dir;\n x0 = x0 * s + x1 * tDir;\n y0 = y0 * s + y1 * tDir;\n z0 = z0 * s + z1 * tDir;\n w0 = w0 * s + w1 * tDir;\n // Normalize in case we just did a lerp:\n if (s === 1 - t) {\n const f = 1 / Math.sqrt(x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0);\n x0 *= f;\n y0 *= f;\n z0 *= f;\n w0 *= f;\n }\n }\n dst[dstOffset] = x0;\n dst[dstOffset + 1] = y0;\n dst[dstOffset + 2] = z0;\n dst[dstOffset + 3] = w0;\n }\n static multiplyQuaternionsFlat(dst, dstOffset, src0, srcOffset0, src1, srcOffset1) {\n const x0 = src0[srcOffset0];\n const y0 = src0[srcOffset0 + 1];\n const z0 = src0[srcOffset0 + 2];\n const w0 = src0[srcOffset0 + 3];\n const x1 = src1[srcOffset1];\n const y1 = src1[srcOffset1 + 1];\n const z1 = src1[srcOffset1 + 2];\n const w1 = src1[srcOffset1 + 3];\n dst[dstOffset] = x0 * w1 + w0 * x1 + y0 * z1 - z0 * y1;\n dst[dstOffset + 1] = y0 * w1 + w0 * y1 + z0 * x1 - x0 * z1;\n dst[dstOffset + 2] = z0 * w1 + w0 * z1 + x0 * y1 - y0 * x1;\n dst[dstOffset + 3] = w0 * w1 - x0 * x1 - y0 * y1 - z0 * z1;\n return dst;\n }\n get x() {\n return this._x;\n }\n set x(value) {\n this._x = value;\n this._onChangeCallback();\n }\n get y() {\n return this._y;\n }\n set y(value) {\n this._y = value;\n this._onChangeCallback();\n }\n get z() {\n return this._z;\n }\n set z(value) {\n this._z = value;\n this._onChangeCallback();\n }\n get w() {\n return this._w;\n }\n set w(value) {\n this._w = value;\n this._onChangeCallback();\n }\n set(x, y, z, w) {\n this._x = x;\n this._y = y;\n this._z = z;\n this._w = w;\n this._onChangeCallback();\n return this;\n }\n clone() {\n return new Quaternion(this._x, this._y, this._z, this._w);\n }\n copy(quaternion) {\n this._x = quaternion.x;\n this._y = quaternion.y;\n this._z = quaternion.z;\n this._w = quaternion.w;\n this._onChangeCallback();\n return this;\n }\n setFromEuler(euler, update = true) {\n const x = euler._x, y = euler._y, z = euler._z, order = euler._order;\n // http://www.mathworks.com/matlabcentral/fileexchange/\n // \t20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/\n //\tcontent/SpinCalc.m\n const cos = Math.cos;\n const sin = Math.sin;\n const c1 = cos(x / 2);\n const c2 = cos(y / 2);\n const c3 = cos(z / 2);\n const s1 = sin(x / 2);\n const s2 = sin(y / 2);\n const s3 = sin(z / 2);\n switch (order) {\n case 'XYZ':\n this._x = s1 * c2 * c3 + c1 * s2 * s3;\n this._y = c1 * s2 * c3 - s1 * c2 * s3;\n this._z = c1 * c2 * s3 + s1 * s2 * c3;\n this._w = c1 * c2 * c3 - s1 * s2 * s3;\n break;\n case 'YXZ':\n this._x = s1 * c2 * c3 + c1 * s2 * s3;\n this._y = c1 * s2 * c3 - s1 * c2 * s3;\n this._z = c1 * c2 * s3 - s1 * s2 * c3;\n this._w = c1 * c2 * c3 + s1 * s2 * s3;\n break;\n case 'ZXY':\n this._x = s1 * c2 * c3 - c1 * s2 * s3;\n this._y = c1 * s2 * c3 + s1 * c2 * s3;\n this._z = c1 * c2 * s3 + s1 * s2 * c3;\n this._w = c1 * c2 * c3 - s1 * s2 * s3;\n break;\n case 'ZYX':\n this._x = s1 * c2 * c3 - c1 * s2 * s3;\n this._y = c1 * s2 * c3 + s1 * c2 * s3;\n this._z = c1 * c2 * s3 - s1 * s2 * c3;\n this._w = c1 * c2 * c3 + s1 * s2 * s3;\n break;\n case 'YZX':\n this._x = s1 * c2 * c3 + c1 * s2 * s3;\n this._y = c1 * s2 * c3 + s1 * c2 * s3;\n this._z = c1 * c2 * s3 - s1 * s2 * c3;\n this._w = c1 * c2 * c3 - s1 * s2 * s3;\n break;\n case 'XZY':\n this._x = s1 * c2 * c3 - c1 * s2 * s3;\n this._y = c1 * s2 * c3 - s1 * c2 * s3;\n this._z = c1 * c2 * s3 + s1 * s2 * c3;\n this._w = c1 * c2 * c3 + s1 * s2 * s3;\n break;\n default:\n console.warn('../math.Quaternion: .setFromEuler() encountered an unknown order: ' + order);\n }\n if (update === true)\n this._onChangeCallback();\n return this;\n }\n setFromAxisAngle(axis, angle) {\n // http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\n // assumes axis is normalized\n const halfAngle = angle / 2, s = Math.sin(halfAngle);\n this._x = axis.x * s;\n this._y = axis.y * s;\n this._z = axis.z * s;\n this._w = Math.cos(halfAngle);\n this._onChangeCallback();\n return this;\n }\n setFromRotationMatrix(m) {\n // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm\n // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n const te = m.elements, m11 = te[0], m12 = te[4], m13 = te[8], m21 = te[1], m22 = te[5], m23 = te[9], m31 = te[2], m32 = te[6], m33 = te[10], trace = m11 + m22 + m33;\n if (trace > 0) {\n const s = 0.5 / Math.sqrt(trace + 1.0);\n this._w = 0.25 / s;\n this._x = (m32 - m23) * s;\n this._y = (m13 - m31) * s;\n this._z = (m21 - m12) * s;\n }\n else if (m11 > m22 && m11 > m33) {\n const s = 2.0 * Math.sqrt(1.0 + m11 - m22 - m33);\n this._w = (m32 - m23) / s;\n this._x = 0.25 * s;\n this._y = (m12 + m21) / s;\n this._z = (m13 + m31) / s;\n }\n else if (m22 > m33) {\n const s = 2.0 * Math.sqrt(1.0 + m22 - m11 - m33);\n this._w = (m13 - m31) / s;\n this._x = (m12 + m21) / s;\n this._y = 0.25 * s;\n this._z = (m23 + m32) / s;\n }\n else {\n const s = 2.0 * Math.sqrt(1.0 + m33 - m11 - m22);\n this._w = (m21 - m12) / s;\n this._x = (m13 + m31) / s;\n this._y = (m23 + m32) / s;\n this._z = 0.25 * s;\n }\n this._onChangeCallback();\n return this;\n }\n setFromUnitVectors(vFrom, vTo) {\n // assumes direction vectors vFrom and vTo are normalized\n let r = vFrom.dot(vTo) + 1;\n if (r < Number.EPSILON) {\n // vFrom and vTo point in opposite directions\n r = 0;\n if (Math.abs(vFrom.x) > Math.abs(vFrom.z)) {\n this._x = -vFrom.y;\n this._y = vFrom.x;\n this._z = 0;\n this._w = r;\n }\n else {\n this._x = 0;\n this._y = -vFrom.z;\n this._z = vFrom.y;\n this._w = r;\n }\n }\n else {\n // crossVectors( vFrom, vTo ); // inlined to avoid cyclic dependency on Vector3\n this._x = vFrom.y * vTo.z - vFrom.z * vTo.y;\n this._y = vFrom.z * vTo.x - vFrom.x * vTo.z;\n this._z = vFrom.x * vTo.y - vFrom.y * vTo.x;\n this._w = r;\n }\n return this.normalize();\n }\n angleTo(q) {\n return 2 * Math.acos(Math.abs(clamp(this.dot(q), -1, 1)));\n }\n rotateTowards(q, step) {\n const angle = this.angleTo(q);\n if (angle === 0)\n return this;\n const t = Math.min(1, step / angle);\n this.slerp(q, t);\n return this;\n }\n identity() {\n return this.set(0, 0, 0, 1);\n }\n invert() {\n // quaternion is assumed to have unit length\n return this.conjugate();\n }\n conjugate() {\n this._x *= -1;\n this._y *= -1;\n this._z *= -1;\n this._onChangeCallback();\n return this;\n }\n dot(v) {\n return this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;\n }\n lengthSq() {\n return this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;\n }\n length() {\n return Math.sqrt(this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w);\n }\n normalize() {\n let l = this.length();\n if (l === 0) {\n this._x = 0;\n this._y = 0;\n this._z = 0;\n this._w = 1;\n }\n else {\n l = 1 / l;\n this._x = this._x * l;\n this._y = this._y * l;\n this._z = this._z * l;\n this._w = this._w * l;\n }\n this._onChangeCallback();\n return this;\n }\n multiply(q) {\n return this.multiplyQuaternions(this, q);\n }\n premultiply(q) {\n return this.multiplyQuaternions(q, this);\n }\n multiplyQuaternions(a, b) {\n // from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\n const qax = a._x, qay = a._y, qaz = a._z, qaw = a._w;\n const qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w;\n this._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n this._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n this._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n this._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n this._onChangeCallback();\n return this;\n }\n slerp(qb, t) {\n if (t === 0)\n return this;\n if (t === 1)\n return this.copy(qb);\n const x = this._x, y = this._y, z = this._z, w = this._w;\n // http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/\n let cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z;\n if (cosHalfTheta < 0) {\n this._w = -qb._w;\n this._x = -qb._x;\n this._y = -qb._y;\n this._z = -qb._z;\n cosHalfTheta = -cosHalfTheta;\n }\n else {\n this.copy(qb);\n }\n if (cosHalfTheta >= 1.0) {\n this._w = w;\n this._x = x;\n this._y = y;\n this._z = z;\n return this;\n }\n const sqrSinHalfTheta = 1.0 - cosHalfTheta * cosHalfTheta;\n if (sqrSinHalfTheta <= Number.EPSILON) {\n const s = 1 - t;\n this._w = s * w + t * this._w;\n this._x = s * x + t * this._x;\n this._y = s * y + t * this._y;\n this._z = s * z + t * this._z;\n this.normalize(); // normalize calls _onChangeCallback()\n return this;\n }\n const sinHalfTheta = Math.sqrt(sqrSinHalfTheta);\n const halfTheta = Math.atan2(sinHalfTheta, cosHalfTheta);\n const ratioA = Math.sin((1 - t) * halfTheta) / sinHalfTheta, ratioB = Math.sin(t * halfTheta) / sinHalfTheta;\n this._w = w * ratioA + this._w * ratioB;\n this._x = x * ratioA + this._x * ratioB;\n this._y = y * ratioA + this._y * ratioB;\n this._z = z * ratioA + this._z * ratioB;\n this._onChangeCallback();\n return this;\n }\n slerpQuaternions(qa, qb, t) {\n return this.copy(qa).slerp(qb, t);\n }\n random() {\n // sets this quaternion to a uniform random unit quaternnion\n // Ken Shoemake\n // Uniform random rotations\n // D. Kirk, editor, Graphics Gems III, pages 124-132. Academic Press, New York, 1992.\n const theta1 = 2 * Math.PI * Math.random();\n const theta2 = 2 * Math.PI * Math.random();\n const x0 = Math.random();\n const r1 = Math.sqrt(1 - x0);\n const r2 = Math.sqrt(x0);\n return this.set(r1 * Math.sin(theta1), r1 * Math.cos(theta1), r2 * Math.sin(theta2), r2 * Math.cos(theta2));\n }\n equals(quaternion) {\n return (quaternion._x === this._x &&\n quaternion._y === this._y &&\n quaternion._z === this._z &&\n quaternion._w === this._w);\n }\n fromArray(array, offset = 0) {\n this._x = array[offset];\n this._y = array[offset + 1];\n this._z = array[offset + 2];\n this._w = array[offset + 3];\n this._onChangeCallback();\n return this;\n }\n toArray(array = [], offset = 0) {\n array[offset] = this._x;\n array[offset + 1] = this._y;\n array[offset + 2] = this._z;\n array[offset + 3] = this._w;\n return array;\n }\n /*\n fromBufferAttribute( attribute, index ) {\n\n this._x = attribute.getX( index );\n this._y = attribute.getY( index );\n this._z = attribute.getZ( index );\n this._w = attribute.getW( index );\n\n this._onChangeCallback();\n\n return this;\n\n }*/\n toJSON() {\n return this.toArray();\n }\n _onChange(callback) {\n this._onChangeCallback = callback;\n return this;\n }\n _onChangeCallback() { }\n *[Symbol.iterator]() {\n yield this._x;\n yield this._y;\n yield this._z;\n yield this._w;\n }\n}\nQuaternion.prototype.isQuaternion = true;\n\nclass Vector3 {\n constructor(x = 0, y = 0, z = 0) {\n this.x = x;\n this.y = y;\n this.z = z;\n }\n set(x, y, z) {\n if (z === undefined)\n z = this.z; // sprite.scale.set(x,y)\n this.x = x;\n this.y = y;\n this.z = z;\n return this;\n }\n setScalar(scalar) {\n this.x = scalar;\n this.y = scalar;\n this.z = scalar;\n return this;\n }\n setX(x) {\n this.x = x;\n return this;\n }\n setY(y) {\n this.y = y;\n return this;\n }\n setZ(z) {\n this.z = z;\n return this;\n }\n setComponent(index, value) {\n switch (index) {\n case 0:\n this.x = value;\n break;\n case 1:\n this.y = value;\n break;\n case 2:\n this.z = value;\n break;\n default:\n throw new Error('index is out of range: ' + index);\n }\n return this;\n }\n getComponent(index) {\n switch (index) {\n case 0:\n return this.x;\n case 1:\n return this.y;\n case 2:\n return this.z;\n default:\n throw new Error('index is out of range: ' + index);\n }\n }\n clone() {\n return new Vector3(this.x, this.y, this.z);\n }\n copy(v) {\n this.x = v.x;\n this.y = v.y;\n this.z = v.z;\n return this;\n }\n add(v) {\n this.x += v.x;\n this.y += v.y;\n this.z += v.z;\n return this;\n }\n addScalar(s) {\n this.x += s;\n this.y += s;\n this.z += s;\n return this;\n }\n addVectors(a, b) {\n this.x = a.x + b.x;\n this.y = a.y + b.y;\n this.z = a.z + b.z;\n return this;\n }\n addScaledVector(v, s) {\n this.x += v.x * s;\n this.y += v.y * s;\n this.z += v.z * s;\n return this;\n }\n sub(v) {\n this.x -= v.x;\n this.y -= v.y;\n this.z -= v.z;\n return this;\n }\n subScalar(s) {\n this.x -= s;\n this.y -= s;\n this.z -= s;\n return this;\n }\n subVectors(a, b) {\n this.x = a.x - b.x;\n this.y = a.y - b.y;\n this.z = a.z - b.z;\n return this;\n }\n multiply(v) {\n this.x *= v.x;\n this.y *= v.y;\n this.z *= v.z;\n return this;\n }\n multiplyScalar(scalar) {\n this.x *= scalar;\n this.y *= scalar;\n this.z *= scalar;\n return this;\n }\n multiplyVectors(a, b) {\n this.x = a.x * b.x;\n this.y = a.y * b.y;\n this.z = a.z * b.z;\n return this;\n }\n applyEuler(euler) {\n return this.applyQuaternion(_quaternion$1.setFromEuler(euler));\n }\n applyAxisAngle(axis, angle) {\n return this.applyQuaternion(_quaternion$1.setFromAxisAngle(axis, angle));\n }\n applyMatrix3(m) {\n const x = this.x, y = this.y, z = this.z;\n const e = m.elements;\n this.x = e[0] * x + e[3] * y + e[6] * z;\n this.y = e[1] * x + e[4] * y + e[7] * z;\n this.z = e[2] * x + e[5] * y + e[8] * z;\n return this;\n }\n applyNormalMatrix(m) {\n return this.applyMatrix3(m).normalize();\n }\n applyMatrix4(m) {\n const x = this.x, y = this.y, z = this.z;\n const e = m.elements;\n const w = 1 / (e[3] * x + e[7] * y + e[11] * z + e[15]);\n this.x = (e[0] * x + e[4] * y + e[8] * z + e[12]) * w;\n this.y = (e[1] * x + e[5] * y + e[9] * z + e[13]) * w;\n this.z = (e[2] * x + e[6] * y + e[10] * z + e[14]) * w;\n return this;\n }\n applyQuaternion(q) {\n // quaternion q is assumed to have unit length\n const vx = this.x, vy = this.y, vz = this.z;\n const qx = q.x, qy = q.y, qz = q.z, qw = q.w;\n // t = 2 * cross( q.xyz, v );\n const tx = 2 * (qy * vz - qz * vy);\n const ty = 2 * (qz * vx - qx * vz);\n const tz = 2 * (qx * vy - qy * vx);\n // v + q.w * t + cross( q.xyz, t );\n this.x = vx + qw * tx + qy * tz - qz * ty;\n this.y = vy + qw * ty + qz * tx - qx * tz;\n this.z = vz + qw * tz + qx * ty - qy * tx;\n return this;\n }\n /*project(camera: Camera) {\n return this.applyMatrix4(camera.matrixWorldInverse).applyMatrix4(camera.projectionMatrix);\n }\n\n unproject(camera: Camera) {\n return this.applyMatrix4(camera.projectionMatrixInverse).applyMatrix4(camera.matrixWorld);\n }*/\n transformDirection(m) {\n // input: ../math.Matrix4 affine matrix\n // vector interpreted as a direction\n const x = this.x, y = this.y, z = this.z;\n const e = m.elements;\n this.x = e[0] * x + e[4] * y + e[8] * z;\n this.y = e[1] * x + e[5] * y + e[9] * z;\n this.z = e[2] * x + e[6] * y + e[10] * z;\n return this.normalize();\n }\n divide(v) {\n this.x /= v.x;\n this.y /= v.y;\n this.z /= v.z;\n return this;\n }\n divideScalar(scalar) {\n return this.multiplyScalar(1 / scalar);\n }\n min(v) {\n this.x = Math.min(this.x, v.x);\n this.y = Math.min(this.y, v.y);\n this.z = Math.min(this.z, v.z);\n return this;\n }\n max(v) {\n this.x = Math.max(this.x, v.x);\n this.y = Math.max(this.y, v.y);\n this.z = Math.max(this.z, v.z);\n return this;\n }\n clamp(min, max) {\n // assumes min < max, componentwise\n this.x = Math.max(min.x, Math.min(max.x, this.x));\n this.y = Math.max(min.y, Math.min(max.y, this.y));\n this.z = Math.max(min.z, Math.min(max.z, this.z));\n return this;\n }\n clampScalar(minVal, maxVal) {\n this.x = Math.max(minVal, Math.min(maxVal, this.x));\n this.y = Math.max(minVal, Math.min(maxVal, this.y));\n this.z = Math.max(minVal, Math.min(maxVal, this.z));\n return this;\n }\n clampLength(min, max) {\n const length = this.length();\n return this.divideScalar(length || 1).multiplyScalar(Math.max(min, Math.min(max, length)));\n }\n floor() {\n this.x = Math.floor(this.x);\n this.y = Math.floor(this.y);\n this.z = Math.floor(this.z);\n return this;\n }\n ceil() {\n this.x = Math.ceil(this.x);\n this.y = Math.ceil(this.y);\n this.z = Math.ceil(this.z);\n return this;\n }\n round() {\n this.x = Math.round(this.x);\n this.y = Math.round(this.y);\n this.z = Math.round(this.z);\n return this;\n }\n roundToZero() {\n this.x = Math.trunc(this.x);\n this.y = Math.trunc(this.y);\n this.z = Math.trunc(this.z);\n return this;\n }\n negate() {\n this.x = -this.x;\n this.y = -this.y;\n this.z = -this.z;\n return this;\n }\n dot(v) {\n return this.x * v.x + this.y * v.y + this.z * v.z;\n }\n // TODO lengthSquared?\n lengthSq() {\n return this.x * this.x + this.y * this.y + this.z * this.z;\n }\n length() {\n return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z);\n }\n manhattanLength() {\n return Math.abs(this.x) + Math.abs(this.y) + Math.abs(this.z);\n }\n normalize() {\n return this.divideScalar(this.length() || 1);\n }\n setLength(length) {\n return this.normalize().multiplyScalar(length);\n }\n lerp(v, alpha) {\n this.x += (v.x - this.x) * alpha;\n this.y += (v.y - this.y) * alpha;\n this.z += (v.z - this.z) * alpha;\n return this;\n }\n lerpVectors(v1, v2, alpha) {\n this.x = v1.x + (v2.x - v1.x) * alpha;\n this.y = v1.y + (v2.y - v1.y) * alpha;\n this.z = v1.z + (v2.z - v1.z) * alpha;\n return this;\n }\n cross(v) {\n return this.crossVectors(this, v);\n }\n crossVectors(a, b) {\n const ax = a.x, ay = a.y, az = a.z;\n const bx = b.x, by = b.y, bz = b.z;\n this.x = ay * bz - az * by;\n this.y = az * bx - ax * bz;\n this.z = ax * by - ay * bx;\n return this;\n }\n projectOnVector(v) {\n const denominator = v.lengthSq();\n if (denominator === 0)\n return this.set(0, 0, 0);\n const scalar = v.dot(this) / denominator;\n return this.copy(v).multiplyScalar(scalar);\n }\n projectOnPlane(planeNormal) {\n _vector.copy(this).projectOnVector(planeNormal);\n return this.sub(_vector);\n }\n reflect(normal) {\n // reflect incident vector off plane orthogonal to normal\n // normal is assumed to have unit length\n return this.sub(_vector.copy(normal).multiplyScalar(2 * this.dot(normal)));\n }\n angleTo(v) {\n const denominator = Math.sqrt(this.lengthSq() * v.lengthSq());\n if (denominator === 0)\n return Math.PI / 2;\n const theta = this.dot(v) / denominator;\n // clamp, to handle numerical problems\n return Math.acos(clamp(theta, -1, 1));\n }\n distanceTo(v) {\n return Math.sqrt(this.distanceToSquared(v));\n }\n distanceToSquared(v) {\n const dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z;\n return dx * dx + dy * dy + dz * dz;\n }\n manhattanDistanceTo(v) {\n return Math.abs(this.x - v.x) + Math.abs(this.y - v.y) + Math.abs(this.z - v.z);\n }\n /*setFromSpherical(s) {\n return this.setFromSphericalCoords(s.radius, s.phi, s.theta);\n }*/\n setFromSphericalCoords(radius, phi, theta) {\n const sinPhiRadius = Math.sin(phi) * radius;\n this.x = sinPhiRadius * Math.sin(theta);\n this.y = Math.cos(phi) * radius;\n this.z = sinPhiRadius * Math.cos(theta);\n return this;\n }\n /*setFromCylindrical(c) {\n return this.setFromCylindricalCoords(c.radius, c.theta, c.y);\n }*/\n setFromCylindricalCoords(radius, theta, y) {\n this.x = radius * Math.sin(theta);\n this.y = y;\n this.z = radius * Math.cos(theta);\n return this;\n }\n setFromMatrixPosition(m) {\n const e = m.elements;\n this.x = e[12];\n this.y = e[13];\n this.z = e[14];\n return this;\n }\n setFromMatrixScale(m) {\n const sx = this.setFromMatrixColumn(m, 0).length();\n const sy = this.setFromMatrixColumn(m, 1).length();\n const sz = this.setFromMatrixColumn(m, 2).length();\n this.x = sx;\n this.y = sy;\n this.z = sz;\n return this;\n }\n setFromMatrixColumn(m, index) {\n return this.fromArray(m.elements, index * 4);\n }\n setFromMatrix3Column(m, index) {\n return this.fromArray(m.elements, index * 3);\n }\n setFromEuler(e) {\n this.x = e._x;\n this.y = e._y;\n this.z = e._z;\n return this;\n }\n /*setFromColor(c) {\n this.x = c.r;\n this.y = c.g;\n this.z = c.b;\n\n return this;\n }*/\n equals(v) {\n return v.x === this.x && v.y === this.y && v.z === this.z;\n }\n fromArray(array, offset = 0) {\n this.x = array[offset];\n this.y = array[offset + 1];\n this.z = array[offset + 2];\n return this;\n }\n toArray(array = [], offset = 0) {\n array[offset] = this.x;\n array[offset + 1] = this.y;\n array[offset + 2] = this.z;\n return array;\n }\n /*fromBufferAttribute(attribute, index) {\n this.x = attribute.getX(index);\n this.y = attribute.getY(index);\n this.z = attribute.getZ(index);\n\n return this;\n }*/\n random() {\n this.x = Math.random();\n this.y = Math.random();\n this.z = Math.random();\n return this;\n }\n randomDirection() {\n // https://mathworld.wolfram.com/SpherePointPicking.html\n const theta = Math.random() * Math.PI * 2;\n const u = Math.random() * 2 - 1;\n const c = Math.sqrt(1 - u * u);\n this.x = c * Math.cos(theta);\n this.y = u;\n this.z = c * Math.sin(theta);\n return this;\n }\n abs() {\n this.x = Math.abs(this.x);\n this.y = Math.abs(this.y);\n this.z = Math.abs(this.z);\n return this;\n }\n *[Symbol.iterator]() {\n yield this.x;\n yield this.y;\n yield this.z;\n }\n}\nVector3.prototype.isVector3 = true;\nconst _vector = /*@__PURE__*/ new Vector3();\nconst _quaternion$1 = /*@__PURE__*/ new Quaternion();\n\nconst WebGLCoordinateSystem = 2000;\nconst WebGPUCoordinateSystem = 2001;\nclass Matrix4 {\n constructor(n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44) {\n this.elements = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];\n if (n11 !== undefined) {\n this.set(n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44);\n }\n }\n /**\n * @deprecated Use {@link Matrix4#copyPosition .copyPosition()} instead.\n */\n extractPosition(m) {\n console.warn('THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().');\n return this.copyPosition(m);\n }\n /**\n * Sets this matrix to a x b and stores the result into the flat array r.\n * r can be either a regular Array or a TypedArray.\n *\n * @deprecated This method has been removed completely.\n */\n multiplyToArray(a, b, r) {\n console.error('THREE.Matrix4: .multiplyToArray() has been removed.');\n return this;\n }\n /**\n * @deprecated Use {@link Matrix4#makeRotationFromQuaternion .makeRotationFromQuaternion()} instead.\n */\n setRotationFromQuaternion(q) {\n return this.makeRotationFromQuaternion(q);\n }\n set(n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44) {\n const te = this.elements;\n te[0] = n11;\n te[4] = n12;\n te[8] = n13;\n te[12] = n14;\n te[1] = n21;\n te[5] = n22;\n te[9] = n23;\n te[13] = n24;\n te[2] = n31;\n te[6] = n32;\n te[10] = n33;\n te[14] = n34;\n te[3] = n41;\n te[7] = n42;\n te[11] = n43;\n te[15] = n44;\n return this;\n }\n identity() {\n this.set(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n return this;\n }\n clone() {\n return new Matrix4().fromArray(this.elements);\n }\n copy(m) {\n const te = this.elements;\n const me = m.elements;\n te[0] = me[0];\n te[1] = me[1];\n te[2] = me[2];\n te[3] = me[3];\n te[4] = me[4];\n te[5] = me[5];\n te[6] = me[6];\n te[7] = me[7];\n te[8] = me[8];\n te[9] = me[9];\n te[10] = me[10];\n te[11] = me[11];\n te[12] = me[12];\n te[13] = me[13];\n te[14] = me[14];\n te[15] = me[15];\n return this;\n }\n copyPosition(m) {\n const te = this.elements, me = m.elements;\n te[12] = me[12];\n te[13] = me[13];\n te[14] = me[14];\n return this;\n }\n setFromMatrix3(m) {\n const me = m.elements;\n this.set(me[0], me[3], me[6], 0, me[1], me[4], me[7], 0, me[2], me[5], me[8], 0, 0, 0, 0, 1);\n return this;\n }\n extractBasis(xAxis, yAxis, zAxis) {\n xAxis.setFromMatrixColumn(this, 0);\n yAxis.setFromMatrixColumn(this, 1);\n zAxis.setFromMatrixColumn(this, 2);\n return this;\n }\n makeBasis(xAxis, yAxis, zAxis) {\n this.set(xAxis.x, yAxis.x, zAxis.x, 0, xAxis.y, yAxis.y, zAxis.y, 0, xAxis.z, yAxis.z, zAxis.z, 0, 0, 0, 0, 1);\n return this;\n }\n extractRotation(m) {\n // this method does not support reflection matrices\n const te = this.elements;\n const me = m.elements;\n const scaleX = 1 / _v1.setFromMatrixColumn(m, 0).length();\n const scaleY = 1 / _v1.setFromMatrixColumn(m, 1).length();\n const scaleZ = 1 / _v1.setFromMatrixColumn(m, 2).length();\n te[0] = me[0] * scaleX;\n te[1] = me[1] * scaleX;\n te[2] = me[2] * scaleX;\n te[3] = 0;\n te[4] = me[4] * scaleY;\n te[5] = me[5] * scaleY;\n te[6] = me[6] * scaleY;\n te[7] = 0;\n te[8] = me[8] * scaleZ;\n te[9] = me[9] * scaleZ;\n te[10] = me[10] * scaleZ;\n te[11] = 0;\n te[12] = 0;\n te[13] = 0;\n te[14] = 0;\n te[15] = 1;\n return this;\n }\n makeRotationFromEuler(euler) {\n const te = this.elements;\n const x = euler.x, y = euler.y, z = euler.z;\n const a = Math.cos(x), b = Math.sin(x);\n const c = Math.cos(y), d = Math.sin(y);\n const e = Math.cos(z), f = Math.sin(z);\n if (euler.order === 'XYZ') {\n const ae = a * e, af = a * f, be = b * e, bf = b * f;\n te[0] = c * e;\n te[4] = -c * f;\n te[8] = d;\n te[1] = af + be * d;\n te[5] = ae - bf * d;\n te[9] = -b * c;\n te[2] = bf - ae * d;\n te[6] = be + af * d;\n te[10] = a * c;\n }\n else if (euler.order === 'YXZ') {\n const ce = c * e, cf = c * f, de = d * e, df = d * f;\n te[0] = ce + df * b;\n te[4] = de * b - cf;\n te[8] = a * d;\n te[1] = a * f;\n te[5] = a * e;\n te[9] = -b;\n te[2] = cf * b - de;\n te[6] = df + ce * b;\n te[10] = a * c;\n }\n else if (euler.order === 'ZXY') {\n const ce = c * e, cf = c * f, de = d * e, df = d * f;\n te[0] = ce - df * b;\n te[4] = -a * f;\n te[8] = de + cf * b;\n te[1] = cf + de * b;\n te[5] = a * e;\n te[9] = df - ce * b;\n te[2] = -a * d;\n te[6] = b;\n te[10] = a * c;\n }\n else if (euler.order === 'ZYX') {\n const ae = a * e, af = a * f, be = b * e, bf = b * f;\n te[0] = c * e;\n te[4] = be * d - af;\n te[8] = ae * d + bf;\n te[1] = c * f;\n te[5] = bf * d + ae;\n te[9] = af * d - be;\n te[2] = -d;\n te[6] = b * c;\n te[10] = a * c;\n }\n else if (euler.order === 'YZX') {\n const ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n te[0] = c * e;\n te[4] = bd - ac * f;\n te[8] = bc * f + ad;\n te[1] = f;\n te[5] = a * e;\n te[9] = -b * e;\n te[2] = -d * e;\n te[6] = ad * f + bc;\n te[10] = ac - bd * f;\n }\n else if (euler.order === 'XZY') {\n const ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n te[0] = c * e;\n te[4] = -f;\n te[8] = d * e;\n te[1] = ac * f + bd;\n te[5] = a * e;\n te[9] = ad * f - bc;\n te[2] = bc * f - ad;\n te[6] = b * e;\n te[10] = bd * f + ac;\n }\n // bottom row\n te[3] = 0;\n te[7] = 0;\n te[11] = 0;\n // last column\n te[12] = 0;\n te[13] = 0;\n te[14] = 0;\n te[15] = 1;\n return this;\n }\n makeRotationFromQuaternion(q) {\n return this.compose(_zero, q, _one);\n }\n lookAt(eye, target, up) {\n const te = this.elements;\n _z.subVectors(eye, target);\n if (_z.lengthSq() === 0) {\n // eye and target are in the same position\n _z.z = 1;\n }\n _z.normalize();\n _x.crossVectors(up, _z);\n if (_x.lengthSq() === 0) {\n // up and z are parallel\n if (Math.abs(up.z) === 1) {\n _z.x += 0.0001;\n }\n else {\n _z.z += 0.0001;\n }\n _z.normalize();\n _x.crossVectors(up, _z);\n }\n _x.normalize();\n _y.crossVectors(_z, _x);\n te[0] = _x.x;\n te[4] = _y.x;\n te[8] = _z.x;\n te[1] = _x.y;\n te[5] = _y.y;\n te[9] = _z.y;\n te[2] = _x.z;\n te[6] = _y.z;\n te[10] = _z.z;\n return this;\n }\n multiply(m) {\n return this.multiplyMatrices(this, m);\n }\n premultiply(m) {\n return this.multiplyMatrices(m, this);\n }\n multiplyMatrices(a, b) {\n const ae = a.elements;\n const be = b.elements;\n const te = this.elements;\n const a11 = ae[0], a12 = ae[4], a13 = ae[8], a14 = ae[12];\n const a21 = ae[1], a22 = ae[5], a23 = ae[9], a24 = ae[13];\n const a31 = ae[2], a32 = ae[6], a33 = ae[10], a34 = ae[14];\n const a41 = ae[3], a42 = ae[7], a43 = ae[11], a44 = ae[15];\n const b11 = be[0], b12 = be[4], b13 = be[8], b14 = be[12];\n const b21 = be[1], b22 = be[5], b23 = be[9], b24 = be[13];\n const b31 = be[2], b32 = be[6], b33 = be[10], b34 = be[14];\n const b41 = be[3], b42 = be[7], b43 = be[11], b44 = be[15];\n te[0] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;\n te[4] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;\n te[8] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;\n te[12] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;\n te[1] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;\n te[5] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;\n te[9] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;\n te[13] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;\n te[2] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;\n te[6] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;\n te[10] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;\n te[14] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;\n te[3] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;\n te[7] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;\n te[11] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;\n te[15] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;\n return this;\n }\n multiplyScalar(s) {\n const te = this.elements;\n te[0] *= s;\n te[4] *= s;\n te[8] *= s;\n te[12] *= s;\n te[1] *= s;\n te[5] *= s;\n te[9] *= s;\n te[13] *= s;\n te[2] *= s;\n te[6] *= s;\n te[10] *= s;\n te[14] *= s;\n te[3] *= s;\n te[7] *= s;\n te[11] *= s;\n te[15] *= s;\n return this;\n }\n determinant() {\n const te = this.elements;\n const n11 = te[0], n12 = te[4], n13 = te[8], n14 = te[12];\n const n21 = te[1], n22 = te[5], n23 = te[9], n24 = te[13];\n const n31 = te[2], n32 = te[6], n33 = te[10], n34 = te[14];\n const n41 = te[3], n42 = te[7], n43 = te[11], n44 = te[15];\n //TODO: make this more efficient\n //( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm )\n return (n41 *\n (+n14 * n23 * n32 -\n n13 * n24 * n32 -\n n14 * n22 * n33 +\n n12 * n24 * n33 +\n n13 * n22 * n34 -\n n12 * n23 * n34) +\n n42 *\n (+n11 * n23 * n34 -\n n11 * n24 * n33 +\n n14 * n21 * n33 -\n n13 * n21 * n34 +\n n13 * n24 * n31 -\n n14 * n23 * n31) +\n n43 *\n (+n11 * n24 * n32 -\n n11 * n22 * n34 -\n n14 * n21 * n32 +\n n12 * n21 * n34 +\n n14 * n22 * n31 -\n n12 * n24 * n31) +\n n44 *\n (-n13 * n22 * n31 -\n n11 * n23 * n32 +\n n11 * n22 * n33 +\n n13 * n21 * n32 -\n n12 * n21 * n33 +\n n12 * n23 * n31));\n }\n transpose() {\n const te = this.elements;\n let tmp;\n tmp = te[1];\n te[1] = te[4];\n te[4] = tmp;\n tmp = te[2];\n te[2] = te[8];\n te[8] = tmp;\n tmp = te[6];\n te[6] = te[9];\n te[9] = tmp;\n tmp = te[3];\n te[3] = te[12];\n te[12] = tmp;\n tmp = te[7];\n te[7] = te[13];\n te[13] = tmp;\n tmp = te[11];\n te[11] = te[14];\n te[14] = tmp;\n return this;\n }\n setPosition(x, y, z) {\n const te = this.elements;\n if (x.isVector3) {\n te[12] = x.x;\n te[13] = x.y;\n te[14] = x.z;\n }\n else {\n te[12] = x;\n te[13] = y;\n te[14] = z;\n }\n return this;\n }\n invert() {\n // based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm\n const te = this.elements, n11 = te[0], n21 = te[1], n31 = te[2], n41 = te[3], n12 = te[4], n22 = te[5], n32 = te[6], n42 = te[7], n13 = te[8], n23 = te[9], n33 = te[10], n43 = te[11], n14 = te[12], n24 = te[13], n34 = te[14], n44 = te[15], t11 = n23 * n34 * n42 -\n n24 * n33 * n42 +\n n24 * n32 * n43 -\n n22 * n34 * n43 -\n n23 * n32 * n44 +\n n22 * n33 * n44, t12 = n14 * n33 * n42 -\n n13 * n34 * n42 -\n n14 * n32 * n43 +\n n12 * n34 * n43 +\n n13 * n32 * n44 -\n n12 * n33 * n44, t13 = n13 * n24 * n42 -\n n14 * n23 * n42 +\n n14 * n22 * n43 -\n n12 * n24 * n43 -\n n13 * n22 * n44 +\n n12 * n23 * n44, t14 = n14 * n23 * n32 -\n n13 * n24 * n32 -\n n14 * n22 * n33 +\n n12 * n24 * n33 +\n n13 * n22 * n34 -\n n12 * n23 * n34;\n const det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;\n if (det === 0)\n return this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);\n const detInv = 1 / det;\n te[0] = t11 * detInv;\n te[1] =\n (n24 * n33 * n41 -\n n23 * n34 * n41 -\n n24 * n31 * n43 +\n n21 * n34 * n43 +\n n23 * n31 * n44 -\n n21 * n33 * n44) *\n detInv;\n te[2] =\n (n22 * n34 * n41 -\n n24 * n32 * n41 +\n n24 * n31 * n42 -\n n21 * n34 * n42 -\n n22 * n31 * n44 +\n n21 * n32 * n44) *\n detInv;\n te[3] =\n (n23 * n32 * n41 -\n n22 * n33 * n41 -\n n23 * n31 * n42 +\n n21 * n33 * n42 +\n n22 * n31 * n43 -\n n21 * n32 * n43) *\n detInv;\n te[4] = t12 * detInv;\n te[5] =\n (n13 * n34 * n41 -\n n14 * n33 * n41 +\n n14 * n31 * n43 -\n n11 * n34 * n43 -\n n13 * n31 * n44 +\n n11 * n33 * n44) *\n detInv;\n te[6] =\n (n14 * n32 * n41 -\n n12 * n34 * n41 -\n n14 * n31 * n42 +\n n11 * n34 * n42 +\n n12 * n31 * n44 -\n n11 * n32 * n44) *\n detInv;\n te[7] =\n (n12 * n33 * n41 -\n n13 * n32 * n41 +\n n13 * n31 * n42 -\n n11 * n33 * n42 -\n n12 * n31 * n43 +\n n11 * n32 * n43) *\n detInv;\n te[8] = t13 * detInv;\n te[9] =\n (n14 * n23 * n41 -\n n13 * n24 * n41 -\n n14 * n21 * n43 +\n n11 * n24 * n43 +\n n13 * n21 * n44 -\n n11 * n23 * n44) *\n detInv;\n te[10] =\n (n12 * n24 * n41 -\n n14 * n22 * n41 +\n n14 * n21 * n42 -\n n11 * n24 * n42 -\n n12 * n21 * n44 +\n n11 * n22 * n44) *\n detInv;\n te[11] =\n (n13 * n22 * n41 -\n n12 * n23 * n41 -\n n13 * n21 * n42 +\n n11 * n23 * n42 +\n n12 * n21 * n43 -\n n11 * n22 * n43) *\n detInv;\n te[12] = t14 * detInv;\n te[13] =\n (n13 * n24 * n31 -\n n14 * n23 * n31 +\n n14 * n21 * n33 -\n n11 * n24 * n33 -\n n13 * n21 * n34 +\n n11 * n23 * n34) *\n detInv;\n te[14] =\n (n14 * n22 * n31 -\n n12 * n24 * n31 -\n n14 * n21 * n32 +\n n11 * n24 * n32 +\n n12 * n21 * n34 -\n n11 * n22 * n34) *\n detInv;\n te[15] =\n (n12 * n23 * n31 -\n n13 * n22 * n31 +\n n13 * n21 * n32 -\n n11 * n23 * n32 -\n n12 * n21 * n33 +\n n11 * n22 * n33) *\n detInv;\n return this;\n }\n scale(v) {\n const te = this.elements;\n const x = v.x, y = v.y, z = v.z;\n te[0] *= x;\n te[4] *= y;\n te[8] *= z;\n te[1] *= x;\n te[5] *= y;\n te[9] *= z;\n te[2] *= x;\n te[6] *= y;\n te[10] *= z;\n te[3] *= x;\n te[7] *= y;\n te[11] *= z;\n return this;\n }\n getMaxScaleOnAxis() {\n const te = this.elements;\n const scaleXSq = te[0] * te[0] + te[1] * te[1] + te[2] * te[2];\n const scaleYSq = te[4] * te[4] + te[5] * te[5] + te[6] * te[6];\n const scaleZSq = te[8] * te[8] + te[9] * te[9] + te[10] * te[10];\n return Math.sqrt(Math.max(scaleXSq, scaleYSq, scaleZSq));\n }\n makeTranslation(x, y, z) {\n if (x.isVector3) {\n this.set(1, 0, 0, x.x, 0, 1, 0, x.y, 0, 0, 1, x.z, 0, 0, 0, 1);\n }\n else {\n this.set(1, 0, 0, x, 0, 1, 0, y, 0, 0, 1, z, 0, 0, 0, 1);\n }\n return this;\n }\n makeRotationX(theta) {\n const c = Math.cos(theta), s = Math.sin(theta);\n this.set(1, 0, 0, 0, 0, c, -s, 0, 0, s, c, 0, 0, 0, 0, 1);\n return this;\n }\n makeRotationY(theta) {\n const c = Math.cos(theta), s = Math.sin(theta);\n this.set(c, 0, s, 0, 0, 1, 0, 0, -s, 0, c, 0, 0, 0, 0, 1);\n return this;\n }\n makeRotationZ(theta) {\n const c = Math.cos(theta), s = Math.sin(theta);\n this.set(c, -s, 0, 0, s, c, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n return this;\n }\n makeRotationAxis(axis, angle) {\n // Based on http://www.gamedev.net/reference/articles/article1199.asp\n const c = Math.cos(angle);\n const s = Math.sin(angle);\n const t = 1 - c;\n const x = axis.x, y = axis.y, z = axis.z;\n const tx = t * x, ty = t * y;\n this.set(tx * x + c, tx * y - s * z, tx * z + s * y, 0, tx * y + s * z, ty * y + c, ty * z - s * x, 0, tx * z - s * y, ty * z + s * x, t * z * z + c, 0, 0, 0, 0, 1);\n return this;\n }\n makeScale(x, y, z) {\n this.set(x, 0, 0, 0, 0, y, 0, 0, 0, 0, z, 0, 0, 0, 0, 1);\n return this;\n }\n makeShear(xy, xz, yx, yz, zx, zy) {\n this.set(1, yx, zx, 0, xy, 1, zy, 0, xz, yz, 1, 0, 0, 0, 0, 1);\n return this;\n }\n compose(position, quaternion, scale) {\n const te = this.elements;\n const x = quaternion._x, y = quaternion._y, z = quaternion._z, w = quaternion._w;\n const x2 = x + x, y2 = y + y, z2 = z + z;\n const xx = x * x2, xy = x * y2, xz = x * z2;\n const yy = y * y2, yz = y * z2, zz = z * z2;\n const wx = w * x2, wy = w * y2, wz = w * z2;\n const sx = scale.x, sy = scale.y, sz = scale.z;\n te[0] = (1 - (yy + zz)) * sx;\n te[1] = (xy + wz) * sx;\n te[2] = (xz - wy) * sx;\n te[3] = 0;\n te[4] = (xy - wz) * sy;\n te[5] = (1 - (xx + zz)) * sy;\n te[6] = (yz + wx) * sy;\n te[7] = 0;\n te[8] = (xz + wy) * sz;\n te[9] = (yz - wx) * sz;\n te[10] = (1 - (xx + yy)) * sz;\n te[11] = 0;\n te[12] = position.x;\n te[13] = position.y;\n te[14] = position.z;\n te[15] = 1;\n return this;\n }\n decompose(position, quaternion, scale) {\n const te = this.elements;\n let sx = _v1.set(te[0], te[1], te[2]).length();\n const sy = _v1.set(te[4], te[5], te[6]).length();\n const sz = _v1.set(te[8], te[9], te[10]).length();\n // if determine is negative, we need to invert one scale\n const det = this.determinant();\n if (det < 0)\n sx = -sx;\n position.x = te[12];\n position.y = te[13];\n position.z = te[14];\n // scale the rotation part\n _m1.copy(this);\n const invSX = 1 / sx;\n const invSY = 1 / sy;\n const invSZ = 1 / sz;\n _m1.elements[0] *= invSX;\n _m1.elements[1] *= invSX;\n _m1.elements[2] *= invSX;\n _m1.elements[4] *= invSY;\n _m1.elements[5] *= invSY;\n _m1.elements[6] *= invSY;\n _m1.elements[8] *= invSZ;\n _m1.elements[9] *= invSZ;\n _m1.elements[10] *= invSZ;\n quaternion.setFromRotationMatrix(_m1);\n scale.x = sx;\n scale.y = sy;\n scale.z = sz;\n return this;\n }\n makePerspective(left, right, top, bottom, near, far, coordinateSystem = WebGLCoordinateSystem) {\n const te = this.elements;\n const x = (2 * near) / (right - left);\n const y = (2 * near) / (top - bottom);\n const a = (right + left) / (right - left);\n const b = (top + bottom) / (top - bottom);\n let c, d;\n if (coordinateSystem === WebGLCoordinateSystem) {\n c = -(far + near) / (far - near);\n d = (-2 * far * near) / (far - near);\n }\n else if (coordinateSystem === WebGPUCoordinateSystem) {\n c = -far / (far - near);\n d = (-far * near) / (far - near);\n }\n else {\n throw new Error('Matrix4.makePerspective(): Invalid coordinate system: ' + coordinateSystem);\n }\n te[0] = x;\n te[4] = 0;\n te[8] = a;\n te[12] = 0;\n te[1] = 0;\n te[5] = y;\n te[9] = b;\n te[13] = 0;\n te[2] = 0;\n te[6] = 0;\n te[10] = c;\n te[14] = d;\n te[3] = 0;\n te[7] = 0;\n te[11] = -1;\n te[15] = 0;\n return this;\n }\n makeOrthographic(left, right, top, bottom, near, far, coordinateSystem = WebGLCoordinateSystem) {\n const te = this.elements;\n const w = 1.0 / (right - left);\n const h = 1.0 / (top - bottom);\n const p = 1.0 / (far - near);\n const x = (right + left) * w;\n const y = (top + bottom) * h;\n let z, zInv;\n if (coordinateSystem === WebGLCoordinateSystem) {\n z = (far + near) * p;\n zInv = -2 * p;\n }\n else if (coordinateSystem === WebGPUCoordinateSystem) {\n z = near * p;\n zInv = -1 * p;\n }\n else {\n throw new Error('../math.Matrix4.makeOrthographic(): Invalid coordinate system: ' + coordinateSystem);\n }\n te[0] = 2 * w;\n te[4] = 0;\n te[8] = 0;\n te[12] = -x;\n te[1] = 0;\n te[5] = 2 * h;\n te[9] = 0;\n te[13] = -y;\n te[2] = 0;\n te[6] = 0;\n te[10] = zInv;\n te[14] = -z;\n te[3] = 0;\n te[7] = 0;\n te[11] = 0;\n te[15] = 1;\n return this;\n }\n equals(matrix) {\n const te = this.elements;\n const me = matrix.elements;\n for (let i = 0; i < 16; i++) {\n if (te[i] !== me[i])\n return false;\n }\n return true;\n }\n fromArray(array, offset = 0) {\n for (let i = 0; i < 16; i++) {\n this.elements[i] = array[i + offset];\n }\n return this;\n }\n toArray(array = [], offset = 0) {\n const te = this.elements;\n array[offset] = te[0];\n array[offset + 1] = te[1];\n array[offset + 2] = te[2];\n array[offset + 3] = te[3];\n array[offset + 4] = te[4];\n array[offset + 5] = te[5];\n array[offset + 6] = te[6];\n array[offset + 7] = te[7];\n array[offset + 8] = te[8];\n array[offset + 9] = te[9];\n array[offset + 10] = te[10];\n array[offset + 11] = te[11];\n array[offset + 12] = te[12];\n array[offset + 13] = te[13];\n array[offset + 14] = te[14];\n array[offset + 15] = te[15];\n return array;\n }\n}\nMatrix4.prototype.isMatrix4 = true;\nconst _v1 = /*@__PURE__*/ new Vector3();\nconst _m1 = /*@__PURE__*/ new Matrix4();\nconst _zero = /*@__PURE__*/ new Vector3(0, 0, 0);\nconst _one = /*@__PURE__*/ new Vector3(1, 1, 1);\nconst _x = /*@__PURE__*/ new Vector3();\nconst _y = /*@__PURE__*/ new Vector3();\nconst _z = /*@__PURE__*/ new Vector3();\n\nconst _matrix = /*@__PURE__*/ new Matrix4();\nconst _quaternion = /*@__PURE__*/ new Quaternion();\nclass Euler {\n constructor(x = 0, y = 0, z = 0, order = Euler.DEFAULT_ORDER) {\n this._x = x;\n this._y = y;\n this._z = z;\n this._order = order;\n }\n get x() {\n return this._x;\n }\n set x(value) {\n this._x = value;\n this._onChangeCallback();\n }\n get y() {\n return this._y;\n }\n set y(value) {\n this._y = value;\n this._onChangeCallback();\n }\n get z() {\n return this._z;\n }\n set z(value) {\n this._z = value;\n this._onChangeCallback();\n }\n get order() {\n return this._order;\n }\n set order(value) {\n this._order = value;\n this._onChangeCallback();\n }\n set(x, y, z, order = this._order) {\n this._x = x;\n this._y = y;\n this._z = z;\n this._order = order;\n this._onChangeCallback();\n return this;\n }\n clone() {\n return new Euler(this._x, this._y, this._z, this._order);\n }\n copy(euler) {\n this._x = euler._x;\n this._y = euler._y;\n this._z = euler._z;\n this._order = euler._order;\n this._onChangeCallback();\n return this;\n }\n setFromRotationMatrix(m, order = this._order, update = true) {\n // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n const te = m.elements;\n const m11 = te[0], m12 = te[4], m13 = te[8];\n const m21 = te[1], m22 = te[5], m23 = te[9];\n const m31 = te[2], m32 = te[6], m33 = te[10];\n switch (order) {\n case 'XYZ':\n this._y = Math.asin(clamp(m13, -1, 1));\n if (Math.abs(m13) < 0.9999999) {\n this._x = Math.atan2(-m23, m33);\n this._z = Math.atan2(-m12, m11);\n }\n else {\n this._x = Math.atan2(m32, m22);\n this._z = 0;\n }\n break;\n case 'YXZ':\n this._x = Math.asin(-clamp(m23, -1, 1));\n if (Math.abs(m23) < 0.9999999) {\n this._y = Math.atan2(m13, m33);\n this._z = Math.atan2(m21, m22);\n }\n else {\n this._y = Math.atan2(-m31, m11);\n this._z = 0;\n }\n break;\n case 'ZXY':\n this._x = Math.asin(clamp(m32, -1, 1));\n if (Math.abs(m32) < 0.9999999) {\n this._y = Math.atan2(-m31, m33);\n this._z = Math.atan2(-m12, m22);\n }\n else {\n this._y = 0;\n this._z = Math.atan2(m21, m11);\n }\n break;\n case 'ZYX':\n this._y = Math.asin(-clamp(m31, -1, 1));\n if (Math.abs(m31) < 0.9999999) {\n this._x = Math.atan2(m32, m33);\n this._z = Math.atan2(m21, m11);\n }\n else {\n this._x = 0;\n this._z = Math.atan2(-m12, m22);\n }\n break;\n case 'YZX':\n this._z = Math.asin(clamp(m21, -1, 1));\n if (Math.abs(m21) < 0.9999999) {\n this._x = Math.atan2(-m23, m22);\n this._y = Math.atan2(-m31, m11);\n }\n else {\n this._x = 0;\n this._y = Math.atan2(m13, m33);\n }\n break;\n case 'XZY':\n this._z = Math.asin(-clamp(m12, -1, 1));\n if (Math.abs(m12) < 0.9999999) {\n this._x = Math.atan2(m32, m22);\n this._y = Math.atan2(m13, m11);\n }\n else {\n this._x = Math.atan2(-m23, m33);\n this._y = 0;\n }\n break;\n default:\n console.warn('../math.Euler: .setFromRotationMatrix() encountered an unknown order: ' + order);\n }\n this._order = order;\n if (update === true)\n this._onChangeCallback();\n return this;\n }\n setFromQuaternion(q, order, update) {\n _matrix.makeRotationFromQuaternion(q);\n return this.setFromRotationMatrix(_matrix, order, update);\n }\n setFromVector3(v, order = this._order) {\n return this.set(v.x, v.y, v.z, order);\n }\n reorder(newOrder) {\n // WARNING: this discards revolution information -bhouston\n _quaternion.setFromEuler(this);\n return this.setFromQuaternion(_quaternion, newOrder);\n }\n equals(euler) {\n return euler._x === this._x && euler._y === this._y && euler._z === this._z && euler._order === this._order;\n }\n fromArray(array) {\n this._x = array[0];\n this._y = array[1];\n this._z = array[2];\n if (array[3] !== undefined)\n this._order = array[3];\n this._onChangeCallback();\n return this;\n }\n toArray(array = [], offset = 0) {\n array[offset] = this._x;\n array[offset + 1] = this._y;\n array[offset + 2] = this._z;\n array[offset + 3] = this._order;\n return array;\n }\n _onChange(callback) {\n this._onChangeCallback = callback;\n return this;\n }\n _onChangeCallback(euler) { }\n *[Symbol.iterator]() {\n yield this._x;\n yield this._y;\n yield this._z;\n yield this._order;\n }\n}\nEuler.DEFAULT_ORDER = 'XYZ';\nEuler.prototype.isEuler = true;\n\nclass Matrix3 {\n constructor(n11, n12, n13, n21, n22, n23, n31, n32, n33) {\n this.elements = [1, 0, 0, 0, 1, 0, 0, 0, 1];\n if (n11 !== undefined) {\n this.set(n11, n12, n13, n21, n22, n23, n31, n32, n33);\n }\n }\n set(n11, n12, n13, n21, n22, n23, n31, n32, n33) {\n const te = this.elements;\n te[0] = n11;\n te[1] = n21;\n te[2] = n31;\n te[3] = n12;\n te[4] = n22;\n te[5] = n32;\n te[6] = n13;\n te[7] = n23;\n te[8] = n33;\n return this;\n }\n identity() {\n this.set(1, 0, 0, 0, 1, 0, 0, 0, 1);\n return this;\n }\n copy(m) {\n const te = this.elements;\n const me = m.elements;\n te[0] = me[0];\n te[1] = me[1];\n te[2] = me[2];\n te[3] = me[3];\n te[4] = me[4];\n te[5] = me[5];\n te[6] = me[6];\n te[7] = me[7];\n te[8] = me[8];\n return this;\n }\n extractBasis(xAxis, yAxis, zAxis) {\n xAxis.setFromMatrix3Column(this, 0);\n yAxis.setFromMatrix3Column(this, 1);\n zAxis.setFromMatrix3Column(this, 2);\n return this;\n }\n setFromMatrix4(m) {\n const me = m.elements;\n this.set(me[0], me[4], me[8], me[1], me[5], me[9], me[2], me[6], me[10]);\n return this;\n }\n multiply(m) {\n return this.multiplyMatrices(this, m);\n }\n premultiply(m) {\n return this.multiplyMatrices(m, this);\n }\n multiplyMatrices(a, b) {\n const ae = a.elements;\n const be = b.elements;\n const te = this.elements;\n const a11 = ae[0], a12 = ae[3], a13 = ae[6];\n const a21 = ae[1], a22 = ae[4], a23 = ae[7];\n const a31 = ae[2], a32 = ae[5], a33 = ae[8];\n const b11 = be[0], b12 = be[3], b13 = be[6];\n const b21 = be[1], b22 = be[4], b23 = be[7];\n const b31 = be[2], b32 = be[5], b33 = be[8];\n te[0] = a11 * b11 + a12 * b21 + a13 * b31;\n te[3] = a11 * b12 + a12 * b22 + a13 * b32;\n te[6] = a11 * b13 + a12 * b23 + a13 * b33;\n te[1] = a21 * b11 + a22 * b21 + a23 * b31;\n te[4] = a21 * b12 + a22 * b22 + a23 * b32;\n te[7] = a21 * b13 + a22 * b23 + a23 * b33;\n te[2] = a31 * b11 + a32 * b21 + a33 * b31;\n te[5] = a31 * b12 + a32 * b22 + a33 * b32;\n te[8] = a31 * b13 + a32 * b23 + a33 * b33;\n return this;\n }\n multiplyScalar(s) {\n const te = this.elements;\n te[0] *= s;\n te[3] *= s;\n te[6] *= s;\n te[1] *= s;\n te[4] *= s;\n te[7] *= s;\n te[2] *= s;\n te[5] *= s;\n te[8] *= s;\n return this;\n }\n determinant() {\n const te = this.elements;\n const a = te[0], b = te[1], c = te[2], d = te[3], e = te[4], f = te[5], g = te[6], h = te[7], i = te[8];\n return a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g;\n }\n invert() {\n const te = this.elements, n11 = te[0], n21 = te[1], n31 = te[2], n12 = te[3], n22 = te[4], n32 = te[5], n13 = te[6], n23 = te[7], n33 = te[8], t11 = n33 * n22 - n32 * n23, t12 = n32 * n13 - n33 * n12, t13 = n23 * n12 - n22 * n13, det = n11 * t11 + n21 * t12 + n31 * t13;\n if (det === 0)\n return this.set(0, 0, 0, 0, 0, 0, 0, 0, 0);\n const detInv = 1 / det;\n te[0] = t11 * detInv;\n te[1] = (n31 * n23 - n33 * n21) * detInv;\n te[2] = (n32 * n21 - n31 * n22) * detInv;\n te[3] = t12 * detInv;\n te[4] = (n33 * n11 - n31 * n13) * detInv;\n te[5] = (n31 * n12 - n32 * n11) * detInv;\n te[6] = t13 * detInv;\n te[7] = (n21 * n13 - n23 * n11) * detInv;\n te[8] = (n22 * n11 - n21 * n12) * detInv;\n return this;\n }\n transpose() {\n let tmp;\n const m = this.elements;\n tmp = m[1];\n m[1] = m[3];\n m[3] = tmp;\n tmp = m[2];\n m[2] = m[6];\n m[6] = tmp;\n tmp = m[5];\n m[5] = m[7];\n m[7] = tmp;\n return this;\n }\n getNormalMatrix(matrix4) {\n return this.setFromMatrix4(matrix4).invert().transpose();\n }\n transposeIntoArray(r) {\n const m = this.elements;\n r[0] = m[0];\n r[1] = m[3];\n r[2] = m[6];\n r[3] = m[1];\n r[4] = m[4];\n r[5] = m[7];\n r[6] = m[2];\n r[7] = m[5];\n r[8] = m[8];\n return this;\n }\n setUvTransform(tx, ty, sx, sy, rotation, cx, cy) {\n const c = Math.cos(rotation);\n const s = Math.sin(rotation);\n this.set(sx * c, sx * s, -sx * (c * cx + s * cy) + cx + tx, -sy * s, sy * c, -sy * (-s * cx + c * cy) + cy + ty, 0, 0, 1);\n return this;\n }\n //\n scale(sx, sy) {\n this.premultiply(_m3.makeScale(sx, sy));\n return this;\n }\n rotate(theta) {\n this.premultiply(_m3.makeRotation(-theta));\n return this;\n }\n translate(tx, ty) {\n this.premultiply(_m3.makeTranslation(tx, ty));\n return this;\n }\n // for 2D Transforms\n makeTranslation(x, y) {\n if (x.isVector2) {\n this.set(1, 0, x.x, 0, 1, x.y, 0, 0, 1);\n }\n else {\n this.set(1, 0, x, 0, 1, y, 0, 0, 1);\n }\n return this;\n }\n makeRotation(theta) {\n // counterclockwise\n const c = Math.cos(theta);\n const s = Math.sin(theta);\n this.set(c, -s, 0, s, c, 0, 0, 0, 1);\n return this;\n }\n makeScale(x, y) {\n this.set(x, 0, 0, 0, y, 0, 0, 0, 1);\n return this;\n }\n //\n equals(matrix) {\n const te = this.elements;\n const me = matrix.elements;\n for (let i = 0; i < 9; i++) {\n if (te[i] !== me[i])\n return false;\n }\n return true;\n }\n fromArray(array, offset = 0) {\n for (let i = 0; i < 9; i++) {\n this.elements[i] = array[i + offset];\n }\n return this;\n }\n toArray(array = [], offset = 0) {\n const te = this.elements;\n array[offset] = te[0];\n array[offset + 1] = te[1];\n array[offset + 2] = te[2];\n array[offset + 3] = te[3];\n array[offset + 4] = te[4];\n array[offset + 5] = te[5];\n array[offset + 6] = te[6];\n array[offset + 7] = te[7];\n array[offset + 8] = te[8];\n return array;\n }\n clone() {\n return new Matrix3().fromArray(this.elements);\n }\n}\nMatrix3.prototype.isMatrix3 = true;\nconst _m3 = /*@__PURE__*/ new Matrix3();\n\nclass Vector2 {\n constructor(x = 0, y = 0) {\n this.x = x;\n this.y = y;\n }\n get width() {\n return this.x;\n }\n set width(value) {\n this.x = value;\n }\n get height() {\n return this.y;\n }\n set height(value) {\n this.y = value;\n }\n set(x, y) {\n this.x = x;\n this.y = y;\n return this;\n }\n setScalar(scalar) {\n this.x = scalar;\n this.y = scalar;\n return this;\n }\n setX(x) {\n this.x = x;\n return this;\n }\n setY(y) {\n this.y = y;\n return this;\n }\n setComponent(index, value) {\n switch (index) {\n case 0:\n this.x = value;\n break;\n case 1:\n this.y = value;\n break;\n default:\n throw new Error('index is out of range: ' + index);\n }\n return this;\n }\n getComponent(index) {\n switch (index) {\n case 0:\n return this.x;\n case 1:\n return this.y;\n default:\n throw new Error('index is out of range: ' + index);\n }\n }\n clone() {\n return new Vector2(this.x, this.y);\n }\n copy(v) {\n this.x = v.x;\n this.y = v.y;\n return this;\n }\n add(v) {\n this.x += v.x;\n this.y += v.y;\n return this;\n }\n addScalar(s) {\n this.x += s;\n this.y += s;\n return this;\n }\n addVectors(a, b) {\n this.x = a.x + b.x;\n this.y = a.y + b.y;\n return this;\n }\n addScaledVector(v, s) {\n this.x += v.x * s;\n this.y += v.y * s;\n return this;\n }\n sub(v) {\n this.x -= v.x;\n this.y -= v.y;\n return this;\n }\n subScalar(s) {\n this.x -= s;\n this.y -= s;\n return this;\n }\n subVectors(a, b) {\n this.x = a.x - b.x;\n this.y = a.y - b.y;\n return this;\n }\n multiply(v) {\n this.x *= v.x;\n this.y *= v.y;\n return this;\n }\n multiplyScalar(scalar) {\n this.x *= scalar;\n this.y *= scalar;\n return this;\n }\n divide(v) {\n this.x /= v.x;\n this.y /= v.y;\n return this;\n }\n divideScalar(scalar) {\n return this.multiplyScalar(1 / scalar);\n }\n applyMatrix3(m) {\n const x = this.x, y = this.y;\n const e = m.elements;\n this.x = e[0] * x + e[3] * y + e[6];\n this.y = e[1] * x + e[4] * y + e[7];\n return this;\n }\n min(v) {\n this.x = Math.min(this.x, v.x);\n this.y = Math.min(this.y, v.y);\n return this;\n }\n max(v) {\n this.x = Math.max(this.x, v.x);\n this.y = Math.max(this.y, v.y);\n return this;\n }\n clamp(min, max) {\n // assumes min < max, componentwise\n this.x = Math.max(min.x, Math.min(max.x, this.x));\n this.y = Math.max(min.y, Math.min(max.y, this.y));\n return this;\n }\n clampScalar(minVal, maxVal) {\n this.x = Math.max(minVal, Math.min(maxVal, this.x));\n this.y = Math.max(minVal, Math.min(maxVal, this.y));\n return this;\n }\n clampLength(min, max) {\n const length = this.length();\n return this.divideScalar(length || 1).multiplyScalar(Math.max(min, Math.min(max, length)));\n }\n floor() {\n this.x = Math.floor(this.x);\n this.y = Math.floor(this.y);\n return this;\n }\n ceil() {\n this.x = Math.ceil(this.x);\n this.y = Math.ceil(this.y);\n return this;\n }\n round() {\n this.x = Math.round(this.x);\n this.y = Math.round(this.y);\n return this;\n }\n roundToZero() {\n this.x = Math.trunc(this.x);\n this.y = Math.trunc(this.y);\n return this;\n }\n negate() {\n this.x = -this.x;\n this.y = -this.y;\n return this;\n }\n dot(v) {\n return this.x * v.x + this.y * v.y;\n }\n cross(v) {\n return this.x * v.y - this.y * v.x;\n }\n lengthSq() {\n return this.x * this.x + this.y * this.y;\n }\n length() {\n return Math.sqrt(this.x * this.x + this.y * this.y);\n }\n manhattanLength() {\n return Math.abs(this.x) + Math.abs(this.y);\n }\n normalize() {\n return this.divideScalar(this.length() || 1);\n }\n angle() {\n // computes the angle in radians with respect to the positive x-axis\n const angle = Math.atan2(-this.y, -this.x) + Math.PI;\n return angle;\n }\n angleTo(v) {\n const denominator = Math.sqrt(this.lengthSq() * v.lengthSq());\n if (denominator === 0)\n return Math.PI / 2;\n const theta = this.dot(v) / denominator;\n // clamp, to handle numerical problems\n return Math.acos(clamp(theta, -1, 1));\n }\n distanceTo(v) {\n return Math.sqrt(this.distanceToSquared(v));\n }\n distanceToSquared(v) {\n const dx = this.x - v.x, dy = this.y - v.y;\n return dx * dx + dy * dy;\n }\n manhattanDistanceTo(v) {\n return Math.abs(this.x - v.x) + Math.abs(this.y - v.y);\n }\n setLength(length) {\n return this.normalize().multiplyScalar(length);\n }\n lerp(v, alpha) {\n this.x += (v.x - this.x) * alpha;\n this.y += (v.y - this.y) * alpha;\n return this;\n }\n lerpVectors(v1, v2, alpha) {\n this.x = v1.x + (v2.x - v1.x) * alpha;\n this.y = v1.y + (v2.y - v1.y) * alpha;\n return this;\n }\n equals(v) {\n return v.x === this.x && v.y === this.y;\n }\n fromArray(array, offset = 0) {\n this.x = array[offset];\n this.y = array[offset + 1];\n return this;\n }\n toArray(array = [], offset = 0) {\n array[offset] = this.x;\n array[offset + 1] = this.y;\n return array;\n }\n /*fromBufferAttribute(attribute, index: number) {\n this.x = attribute.getX(index);\n this.y = attribute.getY(index);\n\n return this;\n }*/\n rotateAround(center, angle) {\n const c = Math.cos(angle), s = Math.sin(angle);\n const x = this.x - center.x;\n const y = this.y - center.y;\n this.x = x * c - y * s + center.x;\n this.y = x * s + y * c + center.y;\n return this;\n }\n random() {\n this.x = Math.random();\n this.y = Math.random();\n return this;\n }\n *[Symbol.iterator]() {\n yield this.x;\n yield this.y;\n }\n}\nVector2.isVector2 = true;\n\n/**\n * Scratch storage the accessors fall back to while the base `Vector3`\n * constructor runs, before the instance owns a `data` binding. Living on the\n * prototype, it absorbs those writes without needing a guard on every\n * component write.\n */\nconst UNBOUND$1 = new Float32Array(3);\n/**\n * A `Vector3` whose components live in a shared `Float32Array` at a fixed\n * offset rather than in three own properties.\n *\n * Every `Vector3` method routes through `x` / `y` / `z`, so replacing those\n * with accessors inherits the whole API unchanged — including `clone()`, which\n * still returns a detached plain `Vector3`.\n *\n * The accessors are installed on the prototype below rather than written as\n * `get x()` in the class body, because TypeScript forbids overriding an\n * inherited property with an accessor (TS2611). Runtime behaviour is the same:\n * one shared property descriptor for every instance.\n */\nclass Vector3View extends Vector3 {\n constructor(data, offset) {\n super();\n this.data = data;\n this.offset = offset;\n }\n /** Points the view at a new backing array and row offset. */\n bind(data, offset) {\n this.data = data;\n this.offset = offset;\n }\n}\nconst prototype$1 = Vector3View.prototype;\nprototype$1.data = UNBOUND$1;\nprototype$1.offset = 0;\nObject.defineProperties(Vector3View.prototype, {\n x: {\n get() {\n return this.data[this.offset];\n },\n set(value) {\n this.data[this.offset] = value;\n },\n },\n y: {\n get() {\n return this.data[this.offset + 1];\n },\n set(value) {\n this.data[this.offset + 1] = value;\n },\n },\n z: {\n get() {\n return this.data[this.offset + 2];\n },\n set(value) {\n this.data[this.offset + 2] = value;\n },\n },\n});\n\nclass Vector4 {\n constructor(x = 0, y = 0, z = 0, w = 1) {\n this.x = x;\n this.y = y;\n this.z = z;\n this.w = w;\n }\n get width() {\n return this.z;\n }\n set width(value) {\n this.z = value;\n }\n get height() {\n return this.w;\n }\n set height(value) {\n this.w = value;\n }\n set(x, y, z, w) {\n this.x = x;\n this.y = y;\n this.z = z;\n this.w = w;\n return this;\n }\n setScalar(scalar) {\n this.x = scalar;\n this.y = scalar;\n this.z = scalar;\n this.w = scalar;\n return this;\n }\n setX(x) {\n this.x = x;\n return this;\n }\n setY(y) {\n this.y = y;\n return this;\n }\n setZ(z) {\n this.z = z;\n return this;\n }\n setW(w) {\n this.w = w;\n return this;\n }\n setComponent(index, value) {\n switch (index) {\n case 0:\n this.x = value;\n break;\n case 1:\n this.y = value;\n break;\n case 2:\n this.z = value;\n break;\n case 3:\n this.w = value;\n break;\n default:\n throw new Error('index is out of range: ' + index);\n }\n return this;\n }\n getComponent(index) {\n switch (index) {\n case 0:\n return this.x;\n case 1:\n return this.y;\n case 2:\n return this.z;\n case 3:\n return this.w;\n default:\n throw new Error('index is out of range: ' + index);\n }\n }\n clone() {\n return new Vector4(this.x, this.y, this.z, this.w);\n }\n copy(v) {\n this.x = v.x;\n this.y = v.y;\n this.z = v.z;\n this.w = v.w;\n return this;\n }\n add(v) {\n this.x += v.x;\n this.y += v.y;\n this.z += v.z;\n this.w += v.w;\n return this;\n }\n addScalar(scalar) {\n this.x += scalar;\n this.y += scalar;\n this.z += scalar;\n this.w += scalar;\n return this;\n }\n addVectors(a, b) {\n this.x = a.x + b.x;\n this.y = a.y + b.y;\n this.z = a.z + b.z;\n this.w = a.w + b.w;\n return this;\n }\n addScaledVector(v, s) {\n this.x += v.x * s;\n this.y += v.y * s;\n this.z += v.z * s;\n this.w += v.w * s;\n return this;\n }\n sub(v) {\n this.x -= v.x;\n this.y -= v.y;\n this.z -= v.z;\n this.w -= v.w;\n return this;\n }\n subScalar(scalar) {\n this.x -= scalar;\n this.y -= scalar;\n this.z -= scalar;\n this.w -= scalar;\n return this;\n }\n subVectors(a, b) {\n this.x = a.x - b.x;\n this.y = a.y - b.y;\n this.z = a.z - b.z;\n this.w = a.w - b.w;\n return this;\n }\n multiply(v) {\n this.x *= v.x;\n this.y *= v.y;\n this.z *= v.z;\n this.w *= v.w;\n return this;\n }\n multiplyScalar(scalar) {\n this.x *= scalar;\n this.y *= scalar;\n this.z *= scalar;\n this.w *= scalar;\n return this;\n }\n applyMatrix4(m) {\n const x = this.x, y = this.y, z = this.z, w = this.w;\n const e = m.elements;\n this.x = e[0] * x + e[4] * y + e[8] * z + e[12] * w;\n this.y = e[1] * x + e[5] * y + e[9] * z + e[13] * w;\n this.z = e[2] * x + e[6] * y + e[10] * z + e[14] * w;\n this.w = e[3] * x + e[7] * y + e[11] * z + e[15] * w;\n return this;\n }\n divideScalar(scalar) {\n return this.multiplyScalar(1 / scalar);\n }\n setAxisAngleFromQuaternion(q) {\n // http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm\n // q is assumed to be normalized\n this.w = 2 * Math.acos(q.w);\n const s = Math.sqrt(1 - q.w * q.w);\n if (s < 0.0001) {\n this.x = 1;\n this.y = 0;\n this.z = 0;\n }\n else {\n this.x = q.x / s;\n this.y = q.y / s;\n this.z = q.z / s;\n }\n return this;\n }\n setAxisAngleFromRotationMatrix(m) {\n // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm\n // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n let angle, x, y, z; // variables for result\n const epsilon = 0.01, // margin to allow for rounding errors\n epsilon2 = 0.1, // margin to distinguish between 0 and 180 degrees\n te = m.elements, m11 = te[0], m12 = te[4], m13 = te[8], m21 = te[1], m22 = te[5], m23 = te[9], m31 = te[2], m32 = te[6], m33 = te[10];\n if (Math.abs(m12 - m21) < epsilon && Math.abs(m13 - m31) < epsilon && Math.abs(m23 - m32) < epsilon) {\n // singularity found\n // first check for identity matrix which must have +1 for all terms\n // in leading diagonal and zero in other terms\n if (Math.abs(m12 + m21) < epsilon2 &&\n Math.abs(m13 + m31) < epsilon2 &&\n Math.abs(m23 + m32) < epsilon2 &&\n Math.abs(m11 + m22 + m33 - 3) < epsilon2) {\n // this singularity is identity matrix so angle = 0\n this.set(1, 0, 0, 0);\n return this; // zero angle, arbitrary axis\n }\n // otherwise this singularity is angle = 180\n angle = Math.PI;\n const xx = (m11 + 1) / 2;\n const yy = (m22 + 1) / 2;\n const zz = (m33 + 1) / 2;\n const xy = (m12 + m21) / 4;\n const xz = (m13 + m31) / 4;\n const yz = (m23 + m32) / 4;\n if (xx > yy && xx > zz) {\n // m11 is the largest diagonal term\n if (xx < epsilon) {\n x = 0;\n y = 0.707106781;\n z = 0.707106781;\n }\n else {\n x = Math.sqrt(xx);\n y = xy / x;\n z = xz / x;\n }\n }\n else if (yy > zz) {\n // m22 is the largest diagonal term\n if (yy < epsilon) {\n x = 0.707106781;\n y = 0;\n z = 0.707106781;\n }\n else {\n y = Math.sqrt(yy);\n x = xy / y;\n z = yz / y;\n }\n }\n else {\n // m33 is the largest diagonal term so base result on this\n if (zz < epsilon) {\n x = 0.707106781;\n y = 0.707106781;\n z = 0;\n }\n else {\n z = Math.sqrt(zz);\n x = xz / z;\n y = yz / z;\n }\n }\n this.set(x, y, z, angle);\n return this; // return 180 deg rotation\n }\n // as we have reached here there are no singularities so we can handle normally\n let s = Math.sqrt((m32 - m23) * (m32 - m23) + (m13 - m31) * (m13 - m31) + (m21 - m12) * (m21 - m12)); // used to normalize\n if (Math.abs(s) < 0.001)\n s = 1;\n // prevent divide by zero, should not happen if matrix is orthogonal and should be\n // caught by singularity test above, but I've left it in just in case\n this.x = (m32 - m23) / s;\n this.y = (m13 - m31) / s;\n this.z = (m21 - m12) / s;\n this.w = Math.acos((m11 + m22 + m33 - 1) / 2);\n return this;\n }\n min(v) {\n this.x = Math.min(this.x, v.x);\n this.y = Math.min(this.y, v.y);\n this.z = Math.min(this.z, v.z);\n this.w = Math.min(this.w, v.w);\n return this;\n }\n max(v) {\n this.x = Math.max(this.x, v.x);\n this.y = Math.max(this.y, v.y);\n this.z = Math.max(this.z, v.z);\n this.w = Math.max(this.w, v.w);\n return this;\n }\n clamp(min, max) {\n // assumes min < max, componentwise\n this.x = Math.max(min.x, Math.min(max.x, this.x));\n this.y = Math.max(min.y, Math.min(max.y, this.y));\n this.z = Math.max(min.z, Math.min(max.z, this.z));\n this.w = Math.max(min.w, Math.min(max.w, this.w));\n return this;\n }\n clampScalar(minVal, maxVal) {\n this.x = Math.max(minVal, Math.min(maxVal, this.x));\n this.y = Math.max(minVal, Math.min(maxVal, this.y));\n this.z = Math.max(minVal, Math.min(maxVal, this.z));\n this.w = Math.max(minVal, Math.min(maxVal, this.w));\n return this;\n }\n clampLength(min, max) {\n const length = this.length();\n return this.divideScalar(length || 1).multiplyScalar(Math.max(min, Math.min(max, length)));\n }\n floor() {\n this.x = Math.floor(this.x);\n this.y = Math.floor(this.y);\n this.z = Math.floor(this.z);\n this.w = Math.floor(this.w);\n return this;\n }\n ceil() {\n this.x = Math.ceil(this.x);\n this.y = Math.ceil(this.y);\n this.z = Math.ceil(this.z);\n this.w = Math.ceil(this.w);\n return this;\n }\n round() {\n this.x = Math.round(this.x);\n this.y = Math.round(this.y);\n this.z = Math.round(this.z);\n this.w = Math.round(this.w);\n return this;\n }\n roundToZero() {\n this.x = Math.trunc(this.x);\n this.y = Math.trunc(this.y);\n this.z = Math.trunc(this.z);\n this.w = Math.trunc(this.w);\n return this;\n }\n negate() {\n this.x = -this.x;\n this.y = -this.y;\n this.z = -this.z;\n this.w = -this.w;\n return this;\n }\n dot(v) {\n return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;\n }\n lengthSq() {\n return this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;\n }\n length() {\n return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w);\n }\n manhattanLength() {\n return Math.abs(this.x) + Math.abs(this.y) + Math.abs(this.z) + Math.abs(this.w);\n }\n normalize() {\n return this.divideScalar(this.length() || 1);\n }\n setLength(length) {\n return this.normalize().multiplyScalar(length);\n }\n lerp(v, alpha) {\n this.x += (v.x - this.x) * alpha;\n this.y += (v.y - this.y) * alpha;\n this.z += (v.z - this.z) * alpha;\n this.w += (v.w - this.w) * alpha;\n return this;\n }\n lerpVectors(v1, v2, alpha) {\n this.x = v1.x + (v2.x - v1.x) * alpha;\n this.y = v1.y + (v2.y - v1.y) * alpha;\n this.z = v1.z + (v2.z - v1.z) * alpha;\n this.w = v1.w + (v2.w - v1.w) * alpha;\n return this;\n }\n equals(v) {\n return v.x === this.x && v.y === this.y && v.z === this.z && v.w === this.w;\n }\n fromArray(array, offset = 0) {\n this.x = array[offset];\n this.y = array[offset + 1];\n this.z = array[offset + 2];\n this.w = array[offset + 3];\n return this;\n }\n toArray(array = [], offset = 0) {\n array[offset] = this.x;\n array[offset + 1] = this.y;\n array[offset + 2] = this.z;\n array[offset + 3] = this.w;\n return array;\n }\n /*\n fromBufferAttribute(attribute, index) {\n this.x = attribute.getX(index);\n this.y = attribute.getY(index);\n this.z = attribute.getZ(index);\n this.w = attribute.getW(index);\n\n return this;\n }*/\n random() {\n this.x = Math.random();\n this.y = Math.random();\n this.z = Math.random();\n this.w = Math.random();\n return this;\n }\n *[Symbol.iterator]() {\n yield this.x;\n yield this.y;\n yield this.z;\n yield this.w;\n }\n}\nVector4.prototype.isVector4 = true;\n\n/** See Vector3View: absorbs the base constructor's writes before binding. */\nconst UNBOUND = new Float32Array(4);\n/**\n * A `Vector4` backed by a shared `Float32Array` at a fixed offset. Replacing\n * the four component accessors inherits every `Vector4` method as-is; they are\n * installed on the prototype because TypeScript forbids overriding an\n * inherited property with an accessor in the class body (TS2611).\n */\nclass Vector4View extends Vector4 {\n constructor(data, offset) {\n super();\n this.data = data;\n this.offset = offset;\n }\n /** Points the view at a new backing array and row offset. */\n bind(data, offset) {\n this.data = data;\n this.offset = offset;\n }\n}\nconst prototype = Vector4View.prototype;\nprototype.data = UNBOUND;\nprototype.offset = 0;\nObject.defineProperties(Vector4View.prototype, {\n x: {\n get() {\n return this.data[this.offset];\n },\n set(value) {\n this.data[this.offset] = value;\n },\n },\n y: {\n get() {\n return this.data[this.offset + 1];\n },\n set(value) {\n this.data[this.offset + 1] = value;\n },\n },\n z: {\n get() {\n return this.data[this.offset + 2];\n },\n set(value) {\n this.data[this.offset + 2] = value;\n },\n },\n w: {\n get() {\n return this.data[this.offset + 3];\n },\n set(value) {\n this.data[this.offset + 3] = value;\n },\n },\n});\n\nlet physicsResolver;\nfunction setPhysicsResolver(resolver) {\n physicsResolver = resolver;\n}\nfunction getPhysicsResolver() {\n return physicsResolver;\n}\n/**\n * Apply collision to particles from a physics resolver.\n */\nclass ApplyCollision {\n constructor(resolver, bounce) {\n this.resolver = resolver;\n this.bounce = bounce;\n this.type = 'ApplyCollision';\n this.tempV = new Vector3();\n }\n initialize(particle) { }\n update(particle, delta) {\n // No-op when no collider is registered (getPhysicsResolver() was undefined at load time),\n // so a collision-bearing effect loads and renders anywhere — a host that wants actual\n // collisions registers a resolver via setPhysicsResolver.\n if (this.resolver && this.resolver.resolve(particle.position, this.tempV)) {\n particle.velocity.reflect(this.tempV).multiplyScalar(this.bounce);\n }\n }\n frameUpdate(delta) { }\n toJSON() {\n return {\n type: this.type,\n bounce: this.bounce,\n };\n }\n static fromJSON(json) {\n return new ApplyCollision(getPhysicsResolver(), json.bounce);\n }\n clone() {\n return new ApplyCollision(this.resolver, this.bounce);\n }\n reset() { }\n}\n\nclass ConstantValue {\n constructor(value) {\n this.value = value;\n this.type = 'value';\n }\n startGen(memory) { }\n genValue(memory) {\n return this.value;\n }\n toJSON() {\n return {\n type: 'ConstantValue',\n value: this.value,\n };\n }\n static fromJSON(json) {\n return new ConstantValue(json.value);\n }\n clone() {\n return new ConstantValue(this.value);\n }\n}\n\nclass IntervalValue {\n constructor(a, b) {\n this.a = a;\n this.b = b;\n this.indexCount = -1;\n this.type = 'value';\n }\n // Roll a random sample once at spawn and remember the slot, so the\n // particle keeps the same lerp factor for its whole life. See\n // GeneratorMemory.ts for the slot-allocation pattern.\n startGen(memory) {\n this.indexCount = memory.length;\n memory.push(Math.random());\n }\n genValue(memory) {\n if (this.indexCount === -1) {\n this.startGen(memory);\n }\n return MathUtils.lerp(this.a, this.b, memory[this.indexCount]);\n }\n toJSON() {\n return {\n type: 'IntervalValue',\n a: this.a,\n b: this.b,\n };\n }\n static fromJSON(json) {\n return new IntervalValue(json.a, json.b);\n }\n clone() {\n return new IntervalValue(this.a, this.b);\n }\n}\n\nclass Bezier {\n constructor(p1, p2, p3, p4) {\n this.p = [p1, p2, p3, p4];\n }\n genValue(t) {\n const p = this.p;\n const t2 = t * t;\n const mt = 1 - t;\n const mt2 = mt * mt;\n return p[0] * mt2 * mt + p[1] * mt2 * t * 3 + p[2] * mt * t2 * 3 + p[3] * t2 * t;\n }\n // get the coefficients of the polynomial's derivatives\n derivativeCoefficients(points) {\n const dpoints = [];\n for (let p = points, c = p.length - 1; c > 0; c--) {\n const list = [];\n for (let j = 0; j < c; j++) {\n const dpt = c * (p[j + 1] - p[j]);\n list.push(dpt);\n }\n dpoints.push(list);\n p = list;\n }\n return dpoints;\n }\n // calculate the slope\n getSlope(t) {\n const p = this.derivativeCoefficients(this.p)[0];\n const mt = 1 - t;\n const a = mt * mt;\n const b = mt * t * 2;\n const c = t * t;\n return a * p[0] + b * p[1] + c * p[2];\n //return a * (p[1] - p[0]) * 3 + b * (p[2] - p[1]) * 3 + c * (p[3] - p[2]) * 3;\n }\n // derivative(0) = (p[1] - p[0]) * 3\n // derivative(1) = (p[3] - p[2]) * 3\n controlCurve(d0, d1) {\n this.p[1] = d0 / 3 + this.p[0];\n this.p[2] = this.p[3] - d1 / 3;\n }\n hull(t) {\n let p = this.p;\n let _p = [], pt, idx = 0, i = 0, l = 0;\n const q = [];\n q[idx++] = p[0];\n q[idx++] = p[1];\n q[idx++] = p[2];\n q[idx++] = p[3];\n // we lerp between all points at each iteration, until we have 1 point left.\n while (p.length > 1) {\n _p = [];\n for (i = 0, l = p.length - 1; i < l; i++) {\n pt = t * p[i] + (1 - t) * p[i + 1];\n q[idx++] = pt;\n _p.push(pt);\n }\n p = _p;\n }\n return q;\n }\n split(t) {\n // no shortcut: use \"de Casteljau\" iteration.\n const q = this.hull(t);\n const result = {\n left: new Bezier(q[0], q[4], q[7], q[9]),\n right: new Bezier(q[9], q[8], q[6], q[3]),\n span: q,\n };\n return result;\n }\n clone() {\n return new Bezier(this.p[0], this.p[1], this.p[2], this.p[3]);\n }\n toJSON() {\n return {\n p0: this.p[0],\n p1: this.p[1],\n p2: this.p[2],\n p3: this.p[3],\n };\n }\n static fromJSON(json) {\n return new Bezier(json.p0, json.p1, json.p2, json.p3);\n }\n}\n\nclass PiecewiseFunction {\n constructor() {\n this.functions = new Array();\n }\n findFunction(t) {\n const functions = this.functions;\n const last = functions.length - 1;\n // Single-curve piecewise functions are the common case (one bezier over\n // the whole [0, 1] range); resolve them without running the search.\n if (last <= 0) {\n return last === 0 && t >= functions[0][1] && t <= 1 ? 0 : -1;\n }\n let left = 0, right = last;\n while (left + 1 < right) {\n const mid = (left + right) >> 1;\n if (t < functions[mid][1])\n right = mid - 1;\n else if (t > this.getEndX(mid))\n left = mid + 1;\n else\n return mid;\n }\n for (let i = left; i <= right; i++) {\n if (t >= functions[i][1] && t <= this.getEndX(i))\n return i;\n }\n return -1;\n }\n getStartX(index) {\n return this.functions[index][1];\n }\n setStartX(index, x) {\n if (index > 0)\n this.functions[index][1] = x;\n }\n getEndX(index) {\n if (index + 1 < this.functions.length)\n return this.functions[index + 1][1];\n return 1;\n }\n setEndX(index, x) {\n if (index + 1 < this.functions.length)\n this.functions[index + 1][1] = x;\n }\n insertFunction(t, func) {\n const index = this.findFunction(t);\n this.functions.splice(index + 1, 0, [func, t]);\n }\n removeFunction(index) {\n return this.functions.splice(index, 1)[0][0];\n }\n getFunction(index) {\n return this.functions[index][0];\n }\n setFunction(index, func) {\n this.functions[index][0] = func;\n }\n get numOfFunctions() {\n return this.functions.length;\n }\n}\n\nclass PiecewiseBezier extends PiecewiseFunction {\n // default linear bezier\n constructor(curves = [[new Bezier(0, 1.0 / 3, (1.0 / 3) * 2, 1), 0]]) {\n super();\n /**\n * Sampled copy of the curve, or null while none has been built.\n * See {@link refreshTable}.\n */\n this.table = null;\n /**\n * Control points the table was built from, used to detect edits. Float64 on purpose: the\n * points are doubles, and a Float32Array rounds most of them (0.2, almost any exported value),\n * so the comparison never matched and the table was resampled on every call.\n */\n this.tableSignature = null;\n this.type = 'function';\n this.functions = curves;\n }\n /**\n * Rebuilds the sampled table when the curve changed, otherwise does nothing.\n *\n * Evaluating this curve means a piece lookup plus a cubic; a particle system\n * does that once per particle per frame. Sampling it once and interpolating\n * costs two loads and a lerp instead. Sampling error at\n * {@link PiecewiseBezier.TABLE_SIZE} points stays around 1e-5 for the shapes\n * a curve editor produces — far below what a colour or a size can show.\n *\n * The curve is public and mutable (a curve editor writes straight into\n * `functions` and a Bezier's `p`), so this compares the control points\n * against the ones the table was built from and only resamples on a real\n * change. That is a handful of float compares per frame.\n */\n refreshTable() {\n const functions = this.functions;\n const count = functions.length;\n if (count === 0) {\n this.table = null;\n this.tableSignature = null;\n return;\n }\n // signature: four control points plus the start position of each piece\n const signatureLength = count * 5;\n let signature = this.tableSignature;\n let changed = signature === null || signature.length !== signatureLength;\n if (changed) {\n signature = new Float64Array(signatureLength);\n }\n for (let i = 0, s = 0; i < count; i++, s += 5) {\n const p = functions[i][0].p;\n const start = functions[i][1];\n if (!changed) {\n changed =\n signature[s] !== p[0] ||\n signature[s + 1] !== p[1] ||\n signature[s + 2] !== p[2] ||\n signature[s + 3] !== p[3] ||\n signature[s + 4] !== start;\n }\n if (changed) {\n signature[s] = p[0];\n signature[s + 1] = p[1];\n signature[s + 2] = p[2];\n signature[s + 3] = p[3];\n signature[s + 4] = start;\n }\n }\n if (!changed && this.table !== null) {\n return;\n }\n this.tableSignature = signature;\n const size = PiecewiseBezier.TABLE_SIZE;\n const table = this.table !== null && this.table.length === size ? this.table : new Float32Array(size);\n const step = 1 / (size - 1);\n for (let i = 0; i < size; i++) {\n table[i] = this.genValueExact(i * step);\n }\n this.table = table;\n }\n /** Drops the sampled table, so later reads go back to evaluating the curve. */\n clearTable() {\n this.table = null;\n this.tableSignature = null;\n }\n genValue(memory, t = 0) {\n const table = this.table;\n if (table !== null) {\n const last = table.length - 1;\n if (t <= 0) {\n return table[0];\n }\n if (t >= 1) {\n return table[last];\n }\n const x = t * last;\n const index = x | 0;\n const fraction = x - index;\n const value = table[index];\n return value + (table[index + 1] - value) * fraction;\n }\n return this.genValueExact(t);\n }\n /** Evaluates the curve itself, ignoring any sampled table. */\n genValueExact(t) {\n const functions = this.functions;\n const count = functions.length;\n if (count === 0) {\n return 0;\n }\n const index = this.findFunction(t);\n if (index === -1) {\n // Clamp like Unity: before the first key use the first curve value, not zero.\n if (t < functions[0][1]) {\n return functions[0][0].genValue(0);\n }\n return functions[count - 1][0].genValue(1);\n }\n const startX = functions[index][1];\n const endX = index + 1 < count ? functions[index + 1][1] : 1;\n const span = endX - startX;\n // Adjacent curves can start at the same position; an empty span would\n // divide to NaN, so evaluate at the curve's start.\n return functions[index][0].genValue(span > 0 ? (t - startX) / span : 0);\n }\n toSVG(length, segments) {\n if (segments < 1)\n return '';\n let result = ['M', 0, this.functions[0][0].p[0]].join(' ');\n for (let i = 1.0 / segments; i <= 1; i += 1.0 / segments) {\n result = [result, 'L', i * length, this.genValue(undefined, i)].join(' ');\n }\n return result;\n }\n toJSON() {\n return {\n type: 'PiecewiseBezier',\n functions: this.functions.map(([bezier, start]) => ({ function: bezier.toJSON(), start: start })),\n };\n }\n static fromJSON(json) {\n return new PiecewiseBezier(json.functions.map((piecewiseFunction) => [\n Bezier.fromJSON(piecewiseFunction.function),\n piecewiseFunction.start,\n ]));\n }\n clone() {\n return new PiecewiseBezier(this.functions.map(([bezier, start]) => [bezier.clone(), start]));\n }\n startGen(memory) { }\n}\n/** Sample count of the table built by {@link refreshTable}. */\nPiecewiseBezier.TABLE_SIZE = 257;\n\nfunction ValueGeneratorFromJSON(json) {\n switch (json.type) {\n case 'ConstantValue':\n return ConstantValue.fromJSON(json);\n case 'IntervalValue':\n return IntervalValue.fromJSON(json);\n case 'PiecewiseBezier':\n return PiecewiseBezier.fromJSON(json);\n default:\n return new ConstantValue(0);\n }\n}\n\nclass AxisAngleGenerator {\n constructor(axis, angle) {\n this.axis = axis;\n this.angle = angle;\n this.type = 'rotation';\n }\n startGen(memory) {\n this.angle.startGen(memory);\n }\n genValue(memory, quat, delta, t) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return quat.setFromAxisAngle(this.axis, this.angle.genValue(memory, t) * delta);\n }\n toJSON() {\n return {\n type: 'AxisAngle',\n axis: { x: this.axis.x, y: this.axis.y, z: this.axis.z },\n angle: this.angle.toJSON(),\n };\n }\n static fromJSON(json) {\n return new AxisAngleGenerator(new Vector3(json.axis.x, json.axis.y, json.axis.z), ValueGeneratorFromJSON(json.angle));\n }\n clone() {\n return new AxisAngleGenerator(this.axis.clone(), this.angle.clone());\n }\n}\n\nconst ColorToJSON = (color) => {\n return { r: color.x, g: color.y, b: color.z, a: color.w };\n};\nconst JSONToColor = (json) => {\n return new Vector4(json.r, json.g, json.b, json.a);\n};\nconst JSONToValue = (json, type) => {\n switch (type) {\n case 'Vector3':\n return new Vector3(json.x, json.y, json.z);\n case 'Vector4':\n return new Vector4(json.x, json.y, json.z, json.w);\n case 'Color':\n return new Vector3(json.r, json.g, json.b);\n case 'Number':\n return json;\n default:\n return json;\n }\n};\nconst ValueToJSON = (value, type) => {\n switch (type) {\n case 'Vector3':\n return { x: value.x, y: value.y, z: value.z };\n case 'Vector4':\n return { x: value.x, y: value.y, z: value.z, w: value.w };\n case 'Color':\n return { r: value.x, g: value.y, b: value.z };\n case 'Number':\n return value;\n default:\n return value;\n }\n};\n\nclass ColorRange {\n constructor(a, b) {\n this.a = a;\n this.b = b;\n this.indexCount = -1;\n this.type = 'value';\n }\n startGen(memory) {\n this.indexCount = memory.length;\n memory.push(Math.random());\n }\n genColor(memory, color) {\n if (this.indexCount === -1) {\n this.startGen(memory);\n }\n return color.copy(this.a).lerp(this.b, memory[this.indexCount]);\n }\n toJSON() {\n return {\n type: 'ColorRange',\n a: ColorToJSON(this.a),\n b: ColorToJSON(this.b),\n };\n }\n static fromJSON(json) {\n return new ColorRange(JSONToColor(json.a), JSONToColor(json.b));\n }\n clone() {\n return new ColorRange(this.a.clone(), this.b.clone());\n }\n}\n\nclass ContinuousLinearFunction {\n // default linear bezier\n constructor(keys, subType) {\n this.subType = subType;\n this.type = 'function';\n this.keys = keys;\n }\n findKey(t) {\n const keys = this.keys;\n const last = keys.length - 1;\n // One- and two-key gradients are by far the most common case; resolve\n // them without running the search.\n if (last <= 0) {\n return last === 0 && t >= keys[0][1] && t <= 1 ? 0 : -1;\n }\n if (last === 1) {\n if (t < keys[0][1] || t > 1)\n return -1;\n return t <= keys[1][1] ? 0 : 1;\n }\n let left = 0, right = last;\n while (left + 1 < right) {\n const mid = (left + right) >> 1;\n if (t < keys[mid][1])\n right = mid - 1;\n else if (t > this.getEndX(mid))\n left = mid + 1;\n else\n return mid;\n }\n for (let i = left; i <= right; i++) {\n if (t >= keys[i][1] && t <= this.getEndX(i))\n return i;\n }\n return -1;\n }\n getStartX(index) {\n return this.keys[index][1];\n }\n getEndX(index) {\n if (index + 1 < this.keys.length)\n return this.keys[index + 1][1];\n return 1;\n }\n genValue(value, t) {\n const keys = this.keys;\n const index = this.findKey(t);\n const last = keys.length - 1;\n if (this.subType === 'Number') {\n if (index === -1) {\n return keys[0][0];\n }\n else if (index >= last) {\n return keys[last][0];\n }\n const startX = keys[index][1];\n const a = keys[index][0];\n // Neighbouring keys may sit at the same position; an empty span would\n // divide to NaN, so hold the first key's value instead.\n const span = keys[index + 1][1] - startX;\n return ((keys[index + 1][0] - a) * (span > 0 ? (t - startX) / span : 0) + a);\n }\n else {\n if (index === -1) {\n return value.copy(keys[0][0]);\n }\n if (index >= last) {\n return value.copy(keys[last][0]);\n }\n const startX = keys[index][1];\n const span = keys[index + 1][1] - startX;\n return value\n .copy(keys[index][0])\n .lerp(keys[index + 1][0], span > 0 ? (t - startX) / span : 0);\n }\n }\n toJSON() {\n this.keys[0][0].constructor.name;\n return {\n type: 'CLinearFunction',\n subType: this.subType,\n keys: this.keys.map(([color, pos]) => ({ value: ValueToJSON(color, this.subType), pos: pos })),\n };\n }\n static fromJSON(json) {\n return new ContinuousLinearFunction(json.keys.map((pair) => [JSONToValue(pair.value, json.subType), pair.pos]), json.subType);\n }\n clone() {\n if (this.subType === 'Number') {\n return new ContinuousLinearFunction(this.keys.map(([value, pos]) => [value, pos]), this.subType);\n }\n else {\n return new ContinuousLinearFunction(this.keys.map(([value, pos]) => [value.clone(), pos]), this.subType);\n }\n }\n}\n\n/** Scratch colour used while sampling the gradient into its table. */\nconst tempColor$1 = new Vector4();\nclass Gradient {\n // default linear bezier\n constructor(color = [\n [new Vector3(0, 0, 0), 0],\n [new Vector3(1, 1, 1), 0],\n ], alpha = [\n [1, 0],\n [1, 1],\n ]) {\n /** Sampled RGBA copy of the gradient, or null while none has been built. */\n this.table = null;\n /** Keys the tables were built from, used to detect edits. Float64 for the same reason as PiecewiseBezier's. */\n this.tableSignature = null;\n this.type = 'function';\n this.color = new ContinuousLinearFunction(color, 'Color');\n this.alpha = new ContinuousLinearFunction(alpha, 'Number');\n }\n /**\n * Rebuilds the sampled table when the gradient changed, otherwise does\n * nothing. See PiecewiseBezier.refreshTable — same reasoning, and the same\n * signature check so a gradient edited in an editor is picked up.\n */\n refreshTable() {\n const colorKeys = this.color.keys;\n const alphaKeys = this.alpha.keys;\n const signatureLength = colorKeys.length * 4 + alphaKeys.length * 2;\n let signature = this.tableSignature;\n let changed = signature === null || signature.length !== signatureLength;\n if (changed) {\n signature = new Float64Array(signatureLength);\n }\n let s = 0;\n for (let i = 0; i < colorKeys.length; i++, s += 4) {\n const value = colorKeys[i][0];\n const position = colorKeys[i][1];\n if (!changed) {\n changed =\n signature[s] !== value.x ||\n signature[s + 1] !== value.y ||\n signature[s + 2] !== value.z ||\n signature[s + 3] !== position;\n }\n if (changed) {\n signature[s] = value.x;\n signature[s + 1] = value.y;\n signature[s + 2] = value.z;\n signature[s + 3] = position;\n }\n }\n for (let i = 0; i < alphaKeys.length; i++, s += 2) {\n const value = alphaKeys[i][0];\n const position = alphaKeys[i][1];\n if (!changed) {\n changed = signature[s] !== value || signature[s + 1] !== position;\n }\n if (changed) {\n signature[s] = value;\n signature[s + 1] = position;\n }\n }\n if (!changed && this.table !== null) {\n return;\n }\n this.tableSignature = signature;\n const size = Gradient.TABLE_SIZE;\n const table = this.table !== null && this.table.length === size * 4 ? this.table : new Float32Array(size * 4);\n const step = 1 / (size - 1);\n const sample = tempColor$1;\n for (let i = 0; i < size; i++) {\n this.genColorExact(sample, i * step);\n const offset = i * 4;\n table[offset] = sample.x;\n table[offset + 1] = sample.y;\n table[offset + 2] = sample.z;\n table[offset + 3] = sample.w;\n }\n this.table = table;\n }\n /** Drops the sampled table, so later reads go back to evaluating the keys. */\n clearTable() {\n this.table = null;\n this.tableSignature = null;\n }\n genColor(memory, color, t) {\n const table = this.table;\n if (table !== null) {\n const last = Gradient.TABLE_SIZE - 1;\n if (t <= 0) {\n color.x = table[0];\n color.y = table[1];\n color.z = table[2];\n color.w = table[3];\n return color;\n }\n if (t >= 1) {\n const offset = last * 4;\n color.x = table[offset];\n color.y = table[offset + 1];\n color.z = table[offset + 2];\n color.w = table[offset + 3];\n return color;\n }\n const x = t * last;\n const index = x | 0;\n const fraction = x - index;\n const offset = index * 4;\n const next = offset + 4;\n color.x = table[offset] + (table[next] - table[offset]) * fraction;\n color.y = table[offset + 1] + (table[next + 1] - table[offset + 1]) * fraction;\n color.z = table[offset + 2] + (table[next + 2] - table[offset + 2]) * fraction;\n color.w = table[offset + 3] + (table[next + 3] - table[offset + 3]) * fraction;\n return color;\n }\n return this.genColorExact(color, t);\n }\n /** Evaluates the gradient keys themselves, ignoring any sampled table. */\n genColorExact(color, t) {\n // Specialised inline of ContinuousLinearFunction.genValue for both\n // channels: this runs once per particle per frame, and going through the\n // generic (number | Vector3) path costs a temp vector plus polymorphic\n // key reads.\n const colorKeys = this.color.keys;\n const lastColor = colorKeys.length - 1;\n const colorIndex = this.color.findKey(t);\n let r;\n let g;\n let b;\n if (colorIndex === -1 || colorIndex >= lastColor) {\n const key = colorKeys[colorIndex === -1 ? 0 : lastColor][0];\n r = key.x;\n g = key.y;\n b = key.z;\n }\n else {\n const from = colorKeys[colorIndex][0];\n const to = colorKeys[colorIndex + 1][0];\n const startX = colorKeys[colorIndex][1];\n const span = colorKeys[colorIndex + 1][1] - startX;\n // Two keys can share a position — the default gradient does. Dividing\n // by that empty span yields NaN, which reaches the vertex buffer and\n // drops the particle for a frame; stay on the first key instead.\n const ratio = span > 0 ? (t - startX) / span : 0;\n r = from.x + (to.x - from.x) * ratio;\n g = from.y + (to.y - from.y) * ratio;\n b = from.z + (to.z - from.z) * ratio;\n }\n const alphaKeys = this.alpha.keys;\n const lastAlpha = alphaKeys.length - 1;\n const alphaIndex = this.alpha.findKey(t);\n let a;\n if (alphaIndex === -1 || alphaIndex >= lastAlpha) {\n a = alphaKeys[alphaIndex === -1 ? 0 : lastAlpha][0];\n }\n else {\n const startX = alphaKeys[alphaIndex][1];\n const from = alphaKeys[alphaIndex][0];\n const span = alphaKeys[alphaIndex + 1][1] - startX;\n a = from + (alphaKeys[alphaIndex + 1][0] - from) * (span > 0 ? (t - startX) / span : 0);\n }\n color.x = r;\n color.y = g;\n color.z = b;\n color.w = a;\n return color;\n }\n toJSON() {\n return {\n type: 'Gradient',\n color: this.color.toJSON(),\n alpha: this.alpha.toJSON(),\n };\n }\n static fromJSON(json) {\n // compatibility\n if (json.functions) {\n const keys = json.functions.map((func) => [ColorRange.fromJSON(func.function).a, func.start]);\n if (json.functions.length > 0) {\n keys.push([ColorRange.fromJSON(json.functions[json.functions.length - 1].function).b, 1]);\n }\n return new Gradient(keys.map((key) => [new Vector3(key[0].x, key[0].y, key[0].z), key[1]]), keys.map((key) => [key[0].w, key[1]]));\n }\n else {\n const gradient = new Gradient();\n gradient.alpha = ContinuousLinearFunction.fromJSON(json.alpha);\n gradient.color = ContinuousLinearFunction.fromJSON(json.color);\n return gradient;\n }\n }\n clone() {\n const gradient = new Gradient();\n gradient.alpha = this.alpha.clone();\n gradient.color = this.color.clone();\n return gradient;\n }\n startGen(memory) { }\n}\n/** Sample count of the tables built by {@link refreshTable}. */\nGradient.TABLE_SIZE = 257;\n\nclass RandomColor {\n constructor(a, b) {\n this.a = a;\n this.b = b;\n this.type = 'value';\n }\n startGen(memory) { }\n genColor(memory, color) {\n const rand = Math.random();\n return color.copy(this.a).lerp(this.b, rand);\n }\n toJSON() {\n return {\n type: 'RandomColor',\n a: ColorToJSON(this.a),\n b: ColorToJSON(this.b),\n };\n }\n static fromJSON(json) {\n return new RandomColor(JSONToColor(json.a), JSONToColor(json.b));\n }\n clone() {\n return new RandomColor(this.a.clone(), this.b.clone());\n }\n}\n\nconst tempColor = new Vector4();\n// generate a random color from the start two gradients\nclass RandomColorBetweenGradient {\n constructor(gradient1, gradient2) {\n this.indexCount = 0;\n this.type = 'function';\n this.gradient1 = gradient1;\n this.gradient2 = gradient2;\n }\n startGen(memory) {\n this.indexCount = memory.length;\n memory.push(Math.random());\n }\n genColor(memory, color, t) {\n this.gradient1.genColor(memory, color, t);\n this.gradient2.genColor(memory, tempColor, t);\n if (memory && memory[this.indexCount] !== undefined) {\n color.lerp(tempColor, memory[this.indexCount]);\n }\n else {\n color.lerp(tempColor, Math.random());\n }\n return color;\n }\n toJSON() {\n return {\n type: 'RandomColorBetweenGradient',\n gradient1: this.gradient1.toJSON(),\n gradient2: this.gradient2.toJSON(),\n };\n }\n static fromJSON(json) {\n return new RandomColorBetweenGradient(Gradient.fromJSON(json.gradient1), Gradient.fromJSON(json.gradient2));\n }\n clone() {\n return new RandomColorBetweenGradient(this.gradient1.clone(), this.gradient2.clone());\n }\n}\n\nclass ConstantColor {\n constructor(color) {\n this.color = color;\n this.type = 'value';\n }\n startGen(memory) { }\n genColor(memoryGenerator, color) {\n return color.copy(this.color);\n }\n toJSON() {\n return {\n type: 'ConstantColor',\n color: ColorToJSON(this.color),\n };\n }\n static fromJSON(json) {\n return new ConstantColor(JSONToColor(json.color));\n }\n clone() {\n return new ConstantColor(this.color.clone());\n }\n}\nfunction ColorGeneratorFromJSON(json) {\n switch (json.type) {\n case 'ConstantColor':\n return ConstantColor.fromJSON(json);\n case 'ColorRange':\n return ColorRange.fromJSON(json);\n case 'RandomColor':\n return RandomColor.fromJSON(json);\n case 'Gradient':\n return Gradient.fromJSON(json);\n case 'RandomColorBetweenGradient':\n return RandomColorBetweenGradient.fromJSON(json);\n default:\n return new ConstantColor(new Vector4(1, 1, 1, 1));\n }\n}\n\nclass EulerGenerator {\n constructor(angleX, angleY, angleZ, eulerOrder) {\n this.angleX = angleX;\n this.angleY = angleY;\n this.angleZ = angleZ;\n this.type = 'rotation';\n this.eular = new Euler(0, 0, 0, eulerOrder);\n }\n startGen(memory) {\n this.angleX.startGen(memory);\n this.angleY.startGen(memory);\n this.angleZ.startGen(memory);\n }\n genValue(memory, quat, delta, t) {\n this.eular.set(this.angleX.genValue(memory, t) * delta, this.angleY.genValue(memory, t) * delta, this.angleZ.genValue(memory, t) * delta);\n return quat.setFromEuler(this.eular);\n }\n toJSON() {\n return {\n type: 'Euler',\n angleX: this.angleX.toJSON(),\n angleY: this.angleY.toJSON(),\n angleZ: this.angleZ.toJSON(),\n eulerOrder: this.eular.order,\n };\n }\n static fromJSON(json) {\n return new EulerGenerator(ValueGeneratorFromJSON(json.angleX), ValueGeneratorFromJSON(json.angleY), ValueGeneratorFromJSON(json.angleZ), json.eulerOrder);\n }\n clone() {\n return new EulerGenerator(this.angleX, this.angleY, this.angleZ, this.eular.order);\n }\n}\n\nclass RandomQuatGenerator {\n constructor() {\n this.indexCount = 0;\n this.type = 'rotation';\n }\n startGen(memory) {\n this.indexCount = memory.length;\n memory.push(new Quaternion());\n let x, y, z, u, v, w;\n do {\n x = Math.random() * 2 - 1;\n y = Math.random() * 2 - 1;\n z = x * x + y * y;\n } while (z > 1);\n do {\n u = Math.random() * 2 - 1;\n v = Math.random() * 2 - 1;\n w = u * u + v * v;\n } while (w > 1);\n const s = Math.sqrt((1 - z) / w);\n memory[this.indexCount].set(x, y, s * u, s * v);\n }\n genValue(memory, quat, delta, t) {\n if (this.indexCount === -1) {\n this.startGen(memory);\n }\n quat.copy(memory[this.indexCount]);\n return quat;\n }\n toJSON() {\n return {\n type: 'RandomQuat',\n };\n }\n static fromJSON(json) {\n return new RandomQuatGenerator();\n }\n clone() {\n return new RandomQuatGenerator();\n }\n}\n\nfunction RotationGeneratorFromJSON(json) {\n switch (json.type) {\n case 'AxisAngle':\n return AxisAngleGenerator.fromJSON(json);\n case 'Euler':\n return EulerGenerator.fromJSON(json);\n case 'RandomQuat':\n return RandomQuatGenerator.fromJSON(json);\n default:\n return new RandomQuatGenerator();\n }\n}\n\nclass Vector3Function {\n constructor(x, y, z) {\n this.x = x;\n this.y = y;\n this.z = z;\n this.type = 'vec3function';\n }\n startGen(memory) {\n this.x.startGen(memory);\n this.y.startGen(memory);\n this.z.startGen(memory);\n }\n genValue(memory, vec, t) {\n return vec.set(this.x.genValue(memory, t), this.y.genValue(memory, t), this.z.genValue(memory, t));\n }\n toJSON() {\n return {\n type: 'Vector3Function',\n x: this.x.toJSON(),\n y: this.y.toJSON(),\n z: this.z.toJSON(),\n };\n }\n static fromJSON(json) {\n return new Vector3Function(ValueGeneratorFromJSON(json.x), ValueGeneratorFromJSON(json.y), ValueGeneratorFromJSON(json.z));\n }\n clone() {\n return new Vector3Function(this.x, this.y, this.z);\n }\n}\n\nfunction Vector3GeneratorFromJSON(json) {\n switch (json.type) {\n case 'Vector3Function':\n return Vector3Function.fromJSON(json);\n default:\n return new Vector3Function(new ConstantValue(0), new ConstantValue(0), new ConstantValue(0));\n }\n}\n\nfunction GeneratorFromJSON(json) {\n switch (json.type) {\n case 'ConstantValue':\n case 'IntervalValue':\n case 'PiecewiseBezier':\n return ValueGeneratorFromJSON(json);\n case 'AxisAngle':\n case 'RandomQuat':\n case 'Euler':\n return RotationGeneratorFromJSON(json);\n case 'Vector3Function':\n return Vector3GeneratorFromJSON(json);\n default:\n return new ConstantValue(0);\n }\n}\n\n/**\n * Apply a global force to particles.\n */\nclass ApplyForce {\n constructor(direction, magnitude) {\n this.direction = direction;\n this.magnitude = magnitude;\n this.type = 'ApplyForce';\n this.memory = {\n data: [],\n dataCount: 0,\n };\n this.magnitudeValue = this.magnitude.genValue(this.memory);\n }\n initialize(particle) { }\n update(particle, delta) {\n const scale = this.magnitudeValue * delta;\n const direction = this.direction;\n const velocity = particle.velocity;\n velocity.x += direction.x * scale;\n velocity.y += direction.y * scale;\n velocity.z += direction.z * scale;\n }\n updateAll(particles, count, delta) {\n // The force is identical for every particle, so the vector maths\n // collapses to three constants computed once per frame.\n const scale = this.magnitudeValue * delta;\n const dx = this.direction.x * scale;\n const dy = this.direction.y * scale;\n const dz = this.direction.z * scale;\n for (let i = 0; i < count; i++) {\n const particle = particles[i];\n if (particle.age >= particle.life) {\n continue;\n }\n const velocity = particle.velocity;\n velocity.x += dx;\n velocity.y += dy;\n velocity.z += dz;\n }\n }\n frameUpdate(delta) {\n this.magnitudeValue = this.magnitude.genValue(this.memory);\n }\n toJSON() {\n return {\n type: this.type,\n direction: [this.direction.x, this.direction.y, this.direction.z],\n magnitude: this.magnitude.toJSON(),\n };\n }\n static fromJSON(json) {\n return new ApplyForce(new Vector3(json.direction[0], json.direction[1], json.direction[2]), ValueGeneratorFromJSON(json.magnitude ?? json.force));\n }\n clone() {\n return new ApplyForce(this.direction.clone(), this.magnitude.clone());\n }\n reset() { }\n}\n\nclass TextureSequencer {\n constructor(scaleX = 0, scaleY = 0, position = new Vector3()) {\n this.scaleX = scaleX;\n this.scaleY = scaleY;\n this.position = position;\n this.locations = [];\n }\n transform(position, index) {\n position.x = this.locations[index % this.locations.length].x * this.scaleX + this.position.x;\n position.y = this.locations[index % this.locations.length].y * this.scaleY + this.position.y;\n position.z = this.position.z;\n }\n static fromJSON(json) {\n const textureSequencer = new TextureSequencer(json.scaleX, json.scaleY, new Vector3(json.position[0], json.position[1], json.position[2]));\n textureSequencer.locations = json.locations.map((loc) => new Vector2(loc.x, loc.y));\n return textureSequencer;\n }\n clone() {\n const textureSequencer = new TextureSequencer(this.scaleX, this.scaleY, this.position.clone());\n textureSequencer.locations = this.locations.map((loc) => loc.clone());\n return textureSequencer;\n }\n toJSON() {\n return {\n scaleX: this.scaleX,\n scaleY: this.scaleY,\n position: this.position,\n locations: this.locations.map((loc) => ({\n x: loc.x,\n y: loc.y,\n })),\n };\n }\n fromImage(img, threshold) {\n // Create an empty canvas element\n const canvas = document.createElement('canvas');\n canvas.width = img.width;\n canvas.height = img.height;\n // Copy the image contents to the canvas\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n return;\n }\n ctx.drawImage(img, 0, 0);\n const data = ctx.getImageData(0, 0, canvas.width, canvas.height, { colorSpace: 'srgb' });\n canvas.remove();\n this.locations.length = 0;\n for (let i = 0; i < data.height; i++) {\n for (let j = 0; j < data.width; j++) {\n if (data.data[(i * data.width + j) * 4 + 3] > threshold) {\n this.locations.push(new Vector2(j, data.height - i));\n }\n }\n }\n //return data;\n // Get the data-URL formatted image\n // Firefox supports PNG and JPEG. You could check img.src to\n // guess the original format, but be aware the using \"image/jpg\"\n // will re-encode the image.\n //var dataURL = canvas.toDataURL(\"image/png\");\n //return dataURL.replace(/^data:image\\/(png|jpg);base64,/, \"\");\n }\n}\n\nfunction SequencerFromJSON(json) {\n switch (json.type) {\n case 'TextureSequencer':\n return TextureSequencer.fromJSON(json);\n default:\n return new TextureSequencer();\n }\n}\n\n/**\n * Apply sequences to particles.\n * {@link Sequencer}\n */\nclass ApplySequences {\n constructor(delayBetweenParticles) {\n this.type = 'ApplySequences';\n this.sequencers = [];\n this.time = 0;\n this.index = 0;\n this.pCount = 0;\n this.tempV = new Vector3();\n this.delay = delayBetweenParticles;\n }\n initialize(particle) {\n particle.id = this.pCount;\n particle.dst = new Vector3();\n particle.begin = new Vector3();\n particle.inMotion = false;\n this.pCount++;\n }\n reset() {\n this.time = 0;\n this.index = 0;\n this.pCount = 0;\n }\n update(particle, delta) {\n const sequencer = this.sequencers[this.index];\n const delay = particle.id * this.delay;\n if (this.time >= sequencer[0].a + delay && this.time <= sequencer[0].b + delay) {\n if (!particle.inMotion) {\n particle.inMotion = true;\n particle.begin.copy(particle.position);\n sequencer[1].transform(particle.dst, particle.id);\n }\n particle.position.lerpVectors(particle.begin, particle.dst, ApplySequences.BEZIER.genValue((this.time - sequencer[0].a - delay) / (sequencer[0].b - sequencer[0].a)));\n }\n else if (this.time > sequencer[0].b + delay) {\n particle.inMotion = false;\n }\n }\n frameUpdate(delta) {\n while (this.index + 1 < this.sequencers.length && this.time >= this.sequencers[this.index + 1][0].a) {\n this.index++;\n }\n this.time += delta;\n }\n appendSequencer(range, sequencer) {\n this.sequencers.push([range, sequencer]);\n }\n toJSON() {\n return {\n type: this.type,\n delay: this.delay,\n sequencers: this.sequencers.map(([range, sequencer]) => ({\n range: range.toJSON(),\n sequencer: sequencer.toJSON(),\n })),\n };\n }\n static fromJSON(json) {\n const seq = new ApplySequences(json.delay);\n json.sequencers.forEach((sequencerJson) => {\n seq.sequencers.push([\n ValueGeneratorFromJSON(sequencerJson.range),\n SequencerFromJSON(sequencerJson.sequencer),\n ]);\n });\n return seq;\n }\n clone() {\n const applySequences = new ApplySequences(this.delay);\n applySequences.sequencers = this.sequencers.map((seq) => [seq[0].clone(), seq[1].clone()]);\n return applySequences;\n }\n}\nApplySequences.BEZIER = new Bezier(0, 0, 1, 1);\n\n/**\n * Change the emit direction of particles.\n */\nclass ChangeEmitDirection {\n constructor(angle) {\n this.angle = angle;\n this.type = 'ChangeEmitDirection';\n this._temp = new Vector3();\n this._q = new Quaternion();\n this.memory = { data: [], dataCount: 0 };\n }\n initialize(particle) {\n const len = particle.velocity.length();\n if (len == 0)\n return;\n particle.velocity.normalize();\n if (particle.velocity.x === 0 && particle.velocity.y === 0) {\n this._temp.set(0, particle.velocity.z, 0);\n }\n else {\n this._temp.set(-particle.velocity.y, particle.velocity.x, 0);\n }\n this.angle.startGen(this.memory);\n this._q.setFromAxisAngle(this._temp.normalize(), this.angle.genValue(this.memory));\n this._temp.copy(particle.velocity);\n particle.velocity.applyQuaternion(this._q);\n this._q.setFromAxisAngle(this._temp, Math.random() * Math.PI * 2);\n particle.velocity.applyQuaternion(this._q);\n particle.velocity.setLength(len);\n }\n update(particle, delta) { }\n frameUpdate(delta) { }\n toJSON() {\n return {\n type: this.type,\n angle: this.angle.toJSON(),\n };\n }\n static fromJSON(json) {\n return new ChangeEmitDirection(ValueGeneratorFromJSON(json.angle));\n }\n clone() {\n return new ChangeEmitDirection(this.angle);\n }\n reset() { }\n}\n\n/**\n * Color particles by their speed.\n */\nclass ColorBySpeed {\n constructor(color, speedRange) {\n this.color = color;\n this.speedRange = speedRange;\n this.type = 'ColorBySpeed';\n }\n initialize(particle) {\n this.color.startGen(particle.memory);\n }\n update(particle, delta) {\n const t = (particle.startSpeed - this.speedRange.a) / (this.speedRange.b - this.speedRange.a);\n this.color.genColor(particle.memory, particle.color, t);\n particle.color.x *= particle.startColor.x;\n particle.color.y *= particle.startColor.y;\n particle.color.z *= particle.startColor.z;\n particle.color.w *= particle.startColor.w;\n }\n frameUpdate(delta) { }\n toJSON() {\n return {\n type: this.type,\n color: this.color.toJSON(),\n speedRange: this.speedRange.toJSON(),\n };\n }\n static fromJSON(json) {\n return new ColorBySpeed(ColorGeneratorFromJSON(json.color), IntervalValue.fromJSON(json.speedRange));\n }\n clone() {\n return new ColorBySpeed(this.color.clone(), this.speedRange.clone());\n }\n reset() { }\n}\n\n/**\n * Color particles by their life.\n */\nclass ColorOverLife {\n constructor(color) {\n this.color = color;\n this.type = 'ColorOverLife';\n }\n initialize(particle) {\n this.color.startGen(particle.memory);\n }\n update(particle, delta) {\n const color = particle.color;\n const startColor = particle.startColor;\n this.color.genColor(particle.memory, color, particle.age / particle.life);\n color.x *= startColor.x;\n color.y *= startColor.y;\n color.z *= startColor.z;\n color.w *= startColor.w;\n }\n updateAll(particles, count, delta) {\n // Hoisting the generator makes genColor a monomorphic call site here,\n // unlike the shared per-particle dispatch in the system.\n const generator = this.color;\n for (let i = 0; i < count; i++) {\n const particle = particles[i];\n if (particle.age >= particle.life) {\n continue;\n }\n const color = particle.color;\n const startColor = particle.startColor;\n generator.genColor(particle.memory, color, particle.age / particle.life);\n color.x *= startColor.x;\n color.y *= startColor.y;\n color.z *= startColor.z;\n color.w *= startColor.w;\n }\n }\n frameUpdate(delta) {\n // Refresh once per frame, before either update path reads the generator,\n // so both see the same values and an edited gradient is picked up.\n this.color.refreshTable?.();\n }\n toJSON() {\n return {\n type: this.type,\n color: this.color.toJSON(),\n };\n }\n static fromJSON(json) {\n return new ColorOverLife(ColorGeneratorFromJSON(json.color));\n }\n clone() {\n return new ColorOverLife(this.color.clone());\n }\n reset() { }\n}\n\nfunction randomInt(a, b) {\n return Math.floor(Math.random() * (b - a)) + a;\n}\nconst UP_VEC3 = new Vector3(0, 1, 0);\nconst ZERO_VEC3 = new Vector3(0, 0, 0);\nconst ONE_VEC3 = new Vector3(1, 1, 1);\nconst Z_VEC3 = new Vector3(0, 0, 1);\n\nvar SubParticleEmitMode;\n(function (SubParticleEmitMode) {\n SubParticleEmitMode[SubParticleEmitMode[\"Death\"] = 0] = \"Death\";\n SubParticleEmitMode[SubParticleEmitMode[\"Birth\"] = 1] = \"Birth\";\n SubParticleEmitMode[SubParticleEmitMode[\"Frame\"] = 2] = \"Frame\";\n})(SubParticleEmitMode || (SubParticleEmitMode = {}));\n/**\n * Emit a sub particle system from particles.\n */\nclass EmitSubParticleSystem {\n constructor(particleSystem, useVelocityAsBasis, subParticleSystem, mode = SubParticleEmitMode.Frame, emitProbability = 1) {\n this.particleSystem = particleSystem;\n this.useVelocityAsBasis = useVelocityAsBasis;\n this.subParticleSystem = subParticleSystem;\n this.mode = mode;\n this.emitProbability = emitProbability;\n this.type = 'EmitSubParticleSystem';\n //private matrix_ = new Matrix4();\n this.q_ = new Quaternion();\n this.v_ = new Vector3();\n this.v2_ = new Vector3();\n this.subEmissions = new Array();\n if (this.subParticleSystem && this.subParticleSystem.system) {\n this.subParticleSystem.system.onlyUsedByOther = true;\n }\n }\n initialize(particle) {\n /*particle.emissionState = {\n burstIndex: 0,\n burstWaveIndex: 0,\n time: 0,\n waitEmiting: 0,\n matrix: new Matrix4(),\n } as EmissionState;*/\n }\n update(particle, delta) {\n if (this.mode === SubParticleEmitMode.Frame) {\n this.emit(particle, delta);\n }\n else if (this.mode === SubParticleEmitMode.Birth && particle.age === 0) {\n this.emit(particle, delta);\n }\n else if (this.mode === SubParticleEmitMode.Death && particle.age + delta >= particle.life) {\n this.emit(particle, delta);\n }\n }\n emit(particle, delta) {\n if (!this.subParticleSystem)\n return;\n if (Math.random() > this.emitProbability) {\n return;\n }\n const m = new Matrix4();\n this.setMatrixFromParticle(m, particle);\n this.subEmissions.push({\n burstParticleCount: 0,\n burstParticleIndex: 0,\n isBursting: false,\n burstIndex: 0,\n burstWaveIndex: 0,\n time: 0,\n waitEmiting: 0,\n matrix: m,\n travelDistance: 0,\n particle: particle,\n });\n //(this.subParticleSystem.system as ParticleSystem).emit(delta, particle.emissionState, m);\n }\n frameUpdate(delta) {\n if (!this.subParticleSystem)\n return;\n for (let i = 0; i < this.subEmissions.length; i++) {\n if (this.subEmissions[i].time >= this.subParticleSystem.system.duration) {\n this.subEmissions[i] = this.subEmissions[this.subEmissions.length - 1];\n this.subEmissions.length = this.subEmissions.length - 1;\n i--;\n }\n else {\n const subEmissionState = this.subEmissions[i];\n if (subEmissionState.particle && subEmissionState.particle.age < subEmissionState.particle.life) {\n this.setMatrixFromParticle(subEmissionState.matrix, subEmissionState.particle);\n }\n else {\n subEmissionState.particle = undefined;\n }\n this.subParticleSystem.system.emit(delta, subEmissionState, subEmissionState.matrix);\n }\n }\n }\n toJSON() {\n return {\n type: this.type,\n subParticleSystem: this.subParticleSystem ? this.subParticleSystem.uuid : '',\n useVelocityAsBasis: this.useVelocityAsBasis,\n mode: this.mode,\n emitProbability: this.emitProbability,\n };\n }\n static fromJSON(json, particleSystem) {\n return new EmitSubParticleSystem(particleSystem, json.useVelocityAsBasis, json.subParticleSystem, json.mode, json.emitProbability);\n }\n clone() {\n return new EmitSubParticleSystem(this.particleSystem, this.useVelocityAsBasis, this.subParticleSystem, this.mode, this.emitProbability);\n }\n reset() { }\n setMatrixFromParticle(m, particle) {\n let rotation;\n if (particle.rotation === undefined || this.useVelocityAsBasis) {\n if (particle.velocity.x === 0 &&\n particle.velocity.y === 0 &&\n (particle.velocity.z === 1 || particle.velocity.z === 0)) {\n m.set(1, 0, 0, particle.position.x, 0, 1, 0, particle.position.y, 0, 0, 1, particle.position.z, 0, 0, 0, 1);\n }\n else {\n this.v_.copy(Z_VEC3).cross(particle.velocity);\n this.v2_.copy(particle.velocity).cross(this.v_);\n const len = this.v_.length();\n const len2 = this.v2_.length();\n m.set(this.v_.x / len, this.v2_.x / len2, particle.velocity.x, particle.position.x, this.v_.y / len, this.v2_.y / len2, particle.velocity.y, particle.position.y, this.v_.z / len, this.v2_.z / len2, particle.velocity.z, particle.position.z, 0, 0, 0, 1);\n }\n }\n else {\n if (particle.rotation instanceof Quaternion) {\n rotation = particle.rotation;\n }\n else {\n this.q_.setFromAxisAngle(Z_VEC3, particle.rotation);\n rotation = this.q_;\n }\n m.compose(particle.position, rotation, ONE_VEC3);\n }\n if (!this.particleSystem.worldSpace) {\n m.multiplyMatrices(this.particleSystem.emitter.matrixWorld, m);\n }\n }\n}\n\n/**\n * Apply a force to particles over their life.\n */\nclass ForceOverLife {\n initialize(particle, particleSystem) {\n this.ps = particleSystem;\n this.x.startGen(particle.memory);\n this.y.startGen(particle.memory);\n this.z.startGen(particle.memory);\n }\n constructor(x, y, z) {\n this.x = x;\n this.y = y;\n this.z = z;\n this.type = 'ForceOverLife';\n this._temp = new Vector3();\n this._tempScale = new Vector3();\n this._tempQ = new Quaternion();\n }\n update(particle, delta) {\n this._temp.set(this.x.genValue(particle.memory, particle.age / particle.life), this.y.genValue(particle.memory, particle.age / particle.life), this.z.genValue(particle.memory, particle.age / particle.life));\n // Undefined until initialize() has run for this behavior; treat an\n // unknown system as world space rather than throwing.\n if (this.ps === undefined || this.ps.worldSpace) {\n particle.velocity.addScaledVector(this._temp, delta);\n }\n else {\n this._temp.multiply(this._tempScale).applyQuaternion(this._tempQ);\n particle.velocity.addScaledVector(this._temp, delta);\n }\n }\n updateAll(particles, count, delta) {\n const system = this.ps;\n // The system is only learned in initialize(), which has not run while the\n // system is empty — a sub emitter waiting to be triggered, or a behavior\n // added after the particles were spawned. There is nothing to apply yet.\n if (system === undefined) {\n return;\n }\n const temp = this._temp;\n const generatorX = this.x;\n const generatorY = this.y;\n const generatorZ = this.z;\n // The space test is per system, not per particle.\n const worldSpace = system.worldSpace;\n for (let i = 0; i < count; i++) {\n const particle = particles[i];\n if (particle.age >= particle.life) {\n continue;\n }\n const memory = particle.memory;\n const t = particle.age / particle.life;\n temp.set(generatorX.genValue(memory, t), generatorY.genValue(memory, t), generatorZ.genValue(memory, t));\n if (!worldSpace) {\n temp.multiply(this._tempScale).applyQuaternion(this._tempQ);\n }\n particle.velocity.addScaledVector(temp, delta);\n }\n }\n toJSON() {\n return {\n type: this.type,\n x: this.x.toJSON(),\n y: this.y.toJSON(),\n z: this.z.toJSON(),\n };\n }\n static fromJSON(json) {\n return new ForceOverLife(ValueGeneratorFromJSON(json.x), ValueGeneratorFromJSON(json.y), ValueGeneratorFromJSON(json.z));\n }\n frameUpdate(delta) {\n if (this.ps && !this.ps.worldSpace) {\n const translation = this._temp;\n const quaternion = this._tempQ;\n const scale = this._tempScale;\n this.ps.emitter.matrixWorld.decompose(translation, quaternion, scale);\n quaternion.invert();\n scale.set(1 / scale.x, 1 / scale.y, 1 / scale.z);\n }\n }\n clone() {\n return new ForceOverLife(this.x.clone(), this.y.clone(), this.z.clone());\n }\n reset() { }\n}\n\n/**\n * apply tile number of particle texture by particles' life.\n */\nclass FrameOverLife {\n constructor(frame) {\n this.type = 'FrameOverLife';\n this.frame = frame;\n }\n get frame() {\n return this._frame;\n }\n set frame(frame) {\n this._frame = frame;\n }\n initialize(particle) {\n this._frame.startGen(particle.memory);\n }\n update(particle, delta) {\n particle.uvTile = this.sampleFrame(particle, particle.age / particle.life);\n }\n updateAll(particles, count, delta) {\n for (let i = 0; i < count; i++) {\n const particle = particles[i];\n if (particle.age >= particle.life) {\n continue;\n }\n particle.uvTile = this.sampleFrame(particle, particle.age / particle.life);\n }\n }\n sampleFrame(particle, t) {\n return this._frame.type === 'function'\n ? this._frame.genValue(particle.memory, t)\n : this._frame.genValue(particle.memory);\n }\n frameUpdate(delta) {\n this._frame.refreshTable?.();\n }\n toJSON() {\n return {\n type: this.type,\n frame: this.frame.toJSON(),\n };\n }\n static fromJSON(json) {\n return new FrameOverLife(ValueGeneratorFromJSON(json.frame));\n }\n clone() {\n return new FrameOverLife(this.frame.clone());\n }\n reset() { }\n}\n\n/**\n * Apply a gravity force to particles.\n * the gravity force is calculated as:\n * F = G * m1 * m2 / r^2\n */\nclass GravityForce {\n constructor(center, magnitude) {\n this.center = center;\n this.magnitude = magnitude;\n this.type = 'GravityForce';\n this.temp = new Vector3();\n }\n initialize(particle) { }\n update(particle, delta) {\n const distanceSquared = particle.position.distanceToSquared(this.center);\n // A particle sitting exactly on the attractor used to divide by zero and\n // poison its velocity with NaN; leave it untouched instead.\n if (distanceSquared === 0) {\n return;\n }\n this.temp.copy(this.center).sub(particle.position).normalize();\n particle.velocity.addScaledVector(this.temp, (this.magnitude / distanceSquared) * delta);\n }\n updateAll(particles, count, delta) {\n // The attractor is fixed, so its components and the scaled magnitude are\n // constants for the whole run.\n const cx = this.center.x;\n const cy = this.center.y;\n const cz = this.center.z;\n const magnitude = this.magnitude * delta;\n for (let i = 0; i < count; i++) {\n const particle = particles[i];\n if (particle.age >= particle.life) {\n continue;\n }\n const position = particle.position;\n const dx = cx - position.x;\n const dy = cy - position.y;\n const dz = cz - position.z;\n const distanceSquared = dx * dx + dy * dy + dz * dz;\n if (distanceSquared === 0) {\n continue;\n }\n // normalize then scale by magnitude / distance², folded into one factor\n const scale = magnitude / (distanceSquared * Math.sqrt(distanceSquared));\n const velocity = particle.velocity;\n velocity.x += dx * scale;\n velocity.y += dy * scale;\n velocity.z += dz * scale;\n }\n }\n frameUpdate(delta) { }\n toJSON() {\n return {\n type: this.type,\n center: [this.center.x, this.center.y, this.center.z],\n magnitude: this.magnitude,\n };\n }\n static fromJSON(json) {\n return new GravityForce(new Vector3(json.center[0], json.center[1], json.center[2]), json.magnitude);\n }\n clone() {\n return new GravityForce(this.center.clone(), this.magnitude);\n }\n reset() { }\n}\n\n/**\n * Make particles inherit the emitter's movement velocity (Unity's \"Inherit Velocity\").\n * 'initial' adds the emitter velocity to the particle velocity once at spawn;\n * 'current' displaces particles by the current emitter velocity every frame.\n */\nclass InheritVelocity {\n constructor(multiplier = new ConstantValue(1), mode = 'initial') {\n this.multiplier = multiplier;\n this.mode = mode;\n this.type = 'InheritVelocity';\n this._temp = new Vector3();\n this._tempPos = new Vector3();\n this._tempQInv = new Quaternion();\n this._tempScaleInv = new Vector3(1, 1, 1);\n }\n initialize(particle, particleSystem) {\n this.ps = particleSystem;\n this.multiplier.startGen(particle.memory);\n if (this.mode === 'initial' && particleSystem.emitterVelocity) {\n this._temp.copy(particleSystem.emitterVelocity);\n if (!particleSystem.worldSpace) {\n // initialize runs during emit(), before this frame's frameUpdate cache\n // exists, so decompose the emitter matrix on demand.\n this.decomposeInverse(particleSystem);\n this._temp.multiply(this._tempScaleInv).applyQuaternion(this._tempQInv);\n }\n particle.velocity.addScaledVector(this._temp, this.multiplier.genValue(particle.memory, 0));\n }\n }\n frameUpdate(delta) {\n if (this.ps && !this.ps.worldSpace) {\n this.decomposeInverse(this.ps);\n }\n }\n update(particle, delta) {\n // ps is undefined until initialize() has run for this behavior.\n if (this.mode !== 'current' || this.ps === undefined || !this.ps.emitterVelocity) {\n return;\n }\n this._temp.copy(this.ps.emitterVelocity);\n if (!this.ps.worldSpace) {\n this._temp.multiply(this._tempScaleInv).applyQuaternion(this._tempQInv);\n }\n particle.position.addScaledVector(this._temp, this.multiplier.genValue(particle.memory, particle.age / particle.life) * delta);\n }\n decomposeInverse(particleSystem) {\n particleSystem.emitter.matrixWorld.decompose(this._tempPos, this._tempQInv, this._tempScaleInv);\n this._tempQInv.invert();\n this._tempScaleInv.set(1 / this._tempScaleInv.x, 1 / this._tempScaleInv.y, 1 / this._tempScaleInv.z);\n }\n toJSON() {\n return {\n type: this.type,\n multiplier: this.multiplier.toJSON(),\n mode: this.mode,\n };\n }\n static fromJSON(json) {\n return new InheritVelocity(json.multiplier\n ? ValueGeneratorFromJSON(json.multiplier)\n : new ConstantValue(1), json.mode === 'current' ? 'current' : 'initial');\n }\n clone() {\n return new InheritVelocity(this.multiplier.clone(), this.mode);\n }\n reset() { }\n}\n\n/**\n * Limit the speed of particles over their life.\n */\nclass LimitSpeedOverLife {\n initialize(particle) {\n this.speed.startGen(particle.memory);\n }\n constructor(speed, dampen) {\n this.speed = speed;\n this.dampen = dampen;\n this.type = 'LimitSpeedOverLife';\n }\n update(particle, delta) {\n let speed = particle.velocity.length();\n let limit = this.speed.genValue(particle.memory, particle.age / particle.life);\n if (speed > limit) {\n const percent = (speed - limit) / speed;\n particle.velocity.multiplyScalar(1 - percent * this.dampen * delta * 20);\n }\n }\n updateAll(particles, count, delta) {\n const generator = this.speed;\n const dampenStep = this.dampen * delta * 20;\n for (let i = 0; i < count; i++) {\n const particle = particles[i];\n if (particle.age >= particle.life) {\n continue;\n }\n const velocity = particle.velocity;\n const speed = velocity.length();\n const limit = generator.genValue(particle.memory, particle.age / particle.life);\n if (speed > limit) {\n velocity.multiplyScalar(1 - ((speed - limit) / speed) * dampenStep);\n }\n }\n }\n toJSON() {\n return {\n type: this.type,\n speed: this.speed.toJSON(),\n dampen: this.dampen,\n };\n }\n static fromJSON(json) {\n return new LimitSpeedOverLife(ValueGeneratorFromJSON(json.speed), json.dampen);\n }\n frameUpdate(delta) {\n this.speed.refreshTable?.();\n }\n clone() {\n return new LimitSpeedOverLife(this.speed.clone(), this.dampen);\n }\n reset() { }\n}\n\n/*\n * A fast javascript implementation of simplex noise by Jonas Wagner\nBased on a speed-improved simplex noise algorithm for 2D, 3D and 4D in Java.\nWhich is based on example code by Stefan Gustavson (stegu@itn.liu.se).\nWith Optimisations by Peter Eastman (peastman@drizzle.stanford.edu).\nBetter rank ordering method by Stefan Gustavson in 2012.\n Copyright (c) 2021 Jonas Wagner\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n */\nconst F2 = 0.5 * (Math.sqrt(3.0) - 1.0);\nconst G2 = (3.0 - Math.sqrt(3.0)) / 6.0;\nconst F3 = 1.0 / 3.0;\nconst G3 = 1.0 / 6.0;\nconst F4 = (Math.sqrt(5.0) - 1.0) / 4.0;\nconst G4 = (5.0 - Math.sqrt(5.0)) / 20.0;\nconst grad3 = new Float32Array([\n 1, 1, 0, -1, 1, 0, 1, -1, 0,\n -1, -1, 0, 1, 0, 1, -1, 0, 1,\n 1, 0, -1, -1, 0, -1, 0, 1, 1,\n 0, -1, 1, 0, 1, -1, 0, -1, -1,\n]);\nconst grad4 = new Float32Array([\n 0, 1, 1, 1, 0, 1, 1, -1, 0, 1, -1, 1, 0, 1, -1, -1, 0, -1, 1, 1, 0, -1, 1, -1, 0, -1, -1, 1, 0, -1, -1, -1, 1, 0, 1,\n 1, 1, 0, 1, -1, 1, 0, -1, 1, 1, 0, -1, -1, -1, 0, 1, 1, -1, 0, 1, -1, -1, 0, -1, 1, -1, 0, -1, -1, 1, 1, 0, 1, 1, 1,\n 0, -1, 1, -1, 0, 1, 1, -1, 0, -1, -1, 1, 0, 1, -1, 1, 0, -1, -1, -1, 0, 1, -1, -1, 0, -1, 1, 1, 1, 0, 1, 1, -1, 0,\n 1, -1, 1, 0, 1, -1, -1, 0, -1, 1, 1, 0, -1, 1, -1, 0, -1, -1, 1, 0, -1, -1, -1, 0,\n]);\n/** Deterministic simplex noise generator suitable for 2D, 3D and 4D spaces. */\nclass SimplexNoise {\n /**\n * Creates a new `SimplexNoise` instance.\n * This involves some setup. You can save a few cpu cycles by reusing the same instance.\n * @param randomOrSeed A random number generator or a seed (string|number).\n * Defaults to Math.random (random irreproducible initialization).\n */\n constructor(randomOrSeed = Math.random) {\n const random = typeof randomOrSeed == 'function' ? randomOrSeed : alea(randomOrSeed);\n this.p = buildPermutationTable(random);\n this.perm = new Uint8Array(512);\n this.permMod12 = new Uint8Array(512);\n for (let i = 0; i < 512; i++) {\n this.perm[i] = this.p[i & 255];\n this.permMod12[i] = this.perm[i] % 12;\n }\n }\n /**\n * Samples the noise field in 2 dimensions\n * @param x\n * @param y\n * @returns a number in the interval [-1, 1]\n */\n noise2D(x, y) {\n const permMod12 = this.permMod12;\n const perm = this.perm;\n let n0 = 0; // Noise contributions from the ../math corners\n let n1 = 0;\n let n2 = 0;\n // Skew the input space to determine which simplex cell we're in\n const s = (x + y) * F2; // Hairy factor for 2D\n const i = Math.floor(x + s);\n const j = Math.floor(y + s);\n const t = (i + j) * G2;\n const X0 = i - t; // Unskew the cell origin back to (x,y) space\n const Y0 = j - t;\n const x0 = x - X0; // The x,y distances from the cell origin\n const y0 = y - Y0;\n // For the 2D case, the simplex shape is an equilateral triangle.\n // Determine which simplex we are in.\n let i1, j1; // Offsets for second (middle) corner of simplex in (i,j) coords\n if (x0 > y0) {\n i1 = 1;\n j1 = 0;\n } // lower triangle, XY order: (0,0)->(1,0)->(1,1)\n else {\n i1 = 0;\n j1 = 1;\n } // upper triangle, YX order: (0,0)->(0,1)->(1,1)\n // A step of (1,0) in (i,j) means a step of (1-c,-c) in (x,y), and\n // a step of (0,1) in (i,j) means a step of (-c,1-c) in (x,y), where\n // c = (3-sqrt(3))/6\n const x1 = x0 - i1 + G2; // Offsets for middle corner in (x,y) unskewed coords\n const y1 = y0 - j1 + G2;\n const x2 = x0 - 1.0 + 2.0 * G2; // Offsets for last corner in (x,y) unskewed coords\n const y2 = y0 - 1.0 + 2.0 * G2;\n // Work out the hashed gradient indices of the ../math simplex corners\n const ii = i & 255;\n const jj = j & 255;\n // Calculate the contribution from the ../math corners\n let t0 = 0.5 - x0 * x0 - y0 * y0;\n if (t0 >= 0) {\n const gi0 = permMod12[ii + perm[jj]] * 3;\n t0 *= t0;\n n0 = t0 * t0 * (grad3[gi0] * x0 + grad3[gi0 + 1] * y0); // (x,y) of grad3 used for 2D gradient\n }\n let t1 = 0.5 - x1 * x1 - y1 * y1;\n if (t1 >= 0) {\n const gi1 = permMod12[ii + i1 + perm[jj + j1]] * 3;\n t1 *= t1;\n n1 = t1 * t1 * (grad3[gi1] * x1 + grad3[gi1 + 1] * y1);\n }\n let t2 = 0.5 - x2 * x2 - y2 * y2;\n if (t2 >= 0) {\n const gi2 = permMod12[ii + 1 + perm[jj + 1]] * 3;\n t2 *= t2;\n n2 = t2 * t2 * (grad3[gi2] * x2 + grad3[gi2 + 1] * y2);\n }\n // Add contributions from each corner to get the final noise value.\n // The result is scaled to return values in the interval [-1,1].\n return 70.0 * (n0 + n1 + n2);\n }\n /**\n * Samples the noise field in 3 dimensions\n * @param x\n * @param y\n * @param z\n * @returns a number in the interval [-1, 1]\n */\n noise3D(x, y, z) {\n const permMod12 = this.permMod12;\n const perm = this.perm;\n let n0, n1, n2, n3; // Noise contributions from the four corners\n // Skew the input space to determine which simplex cell we're in\n const s = (x + y + z) * F3; // Very nice and simple skew factor for 3D\n const i = Math.floor(x + s);\n const j = Math.floor(y + s);\n const k = Math.floor(z + s);\n const t = (i + j + k) * G3;\n const X0 = i - t; // Unskew the cell origin back to (x,y,z) space\n const Y0 = j - t;\n const Z0 = k - t;\n const x0 = x - X0; // The x,y,z distances from the cell origin\n const y0 = y - Y0;\n const z0 = z - Z0;\n // For the 3D case, the simplex shape is a slightly irregular tetrahedron.\n // Determine which simplex we are in.\n let i1, j1, k1; // Offsets for second corner of simplex in (i,j,k) coords\n let i2, j2, k2; // Offsets for third corner of simplex in (i,j,k) coords\n if (x0 >= y0) {\n if (y0 >= z0) {\n i1 = 1;\n j1 = 0;\n k1 = 0;\n i2 = 1;\n j2 = 1;\n k2 = 0;\n } // X Y Z order\n else if (x0 >= z0) {\n i1 = 1;\n j1 = 0;\n k1 = 0;\n i2 = 1;\n j2 = 0;\n k2 = 1;\n } // X Z Y order\n else {\n i1 = 0;\n j1 = 0;\n k1 = 1;\n i2 = 1;\n j2 = 0;\n k2 = 1;\n } // Z X Y order\n }\n else {\n // x0<y0\n if (y0 < z0) {\n i1 = 0;\n j1 = 0;\n k1 = 1;\n i2 = 0;\n j2 = 1;\n k2 = 1;\n } // Z Y X order\n else if (x0 < z0) {\n i1 = 0;\n j1 = 1;\n k1 = 0;\n i2 = 0;\n j2 = 1;\n k2 = 1;\n } // Y Z X order\n else {\n i1 = 0;\n j1 = 1;\n k1 = 0;\n i2 = 1;\n j2 = 1;\n k2 = 0;\n } // Y X Z order\n }\n // A step of (1,0,0) in (i,j,k) means a step of (1-c,-c,-c) in (x,y,z),\n // a step of (0,1,0) in (i,j,k) means a step of (-c,1-c,-c) in (x,y,z), and\n // a step of (0,0,1) in (i,j,k) means a step of (-c,-c,1-c) in (x,y,z), where\n // c = 1/6.\n const x1 = x0 - i1 + G3; // Offsets for second corner in (x,y,z) coords\n const y1 = y0 - j1 + G3;\n const z1 = z0 - k1 + G3;\n const x2 = x0 - i2 + 2.0 * G3; // Offsets for third corner in (x,y,z) coords\n const y2 = y0 - j2 + 2.0 * G3;\n const z2 = z0 - k2 + 2.0 * G3;\n const x3 = x0 - 1.0 + 3.0 * G3; // Offsets for last corner in (x,y,z) coords\n const y3 = y0 - 1.0 + 3.0 * G3;\n const z3 = z0 - 1.0 + 3.0 * G3;\n // Work out the hashed gradient indices of the four simplex corners\n const ii = i & 255;\n const jj = j & 255;\n const kk = k & 255;\n // Calculate the contribution from the four corners\n let t0 = 0.6 - x0 * x0 - y0 * y0 - z0 * z0;\n if (t0 < 0)\n n0 = 0.0;\n else {\n const gi0 = permMod12[ii + perm[jj + perm[kk]]] * 3;\n t0 *= t0;\n n0 = t0 * t0 * (grad3[gi0] * x0 + grad3[gi0 + 1] * y0 + grad3[gi0 + 2] * z0);\n }\n let t1 = 0.6 - x1 * x1 - y1 * y1 - z1 * z1;\n if (t1 < 0)\n n1 = 0.0;\n else {\n const gi1 = permMod12[ii + i1 + perm[jj + j1 + perm[kk + k1]]] * 3;\n t1 *= t1;\n n1 = t1 * t1 * (grad3[gi1] * x1 + grad3[gi1 + 1] * y1 + grad3[gi1 + 2] * z1);\n }\n let t2 = 0.6 - x2 * x2 - y2 * y2 - z2 * z2;\n if (t2 < 0)\n n2 = 0.0;\n else {\n const gi2 = permMod12[ii + i2 + perm[jj + j2 + perm[kk + k2]]] * 3;\n t2 *= t2;\n n2 = t2 * t2 * (grad3[gi2] * x2 + grad3[gi2 + 1] * y2 + grad3[gi2 + 2] * z2);\n }\n let t3 = 0.6 - x3 * x3 - y3 * y3 - z3 * z3;\n if (t3 < 0)\n n3 = 0.0;\n else {\n const gi3 = permMod12[ii + 1 + perm[jj + 1 + perm[kk + 1]]] * 3;\n t3 *= t3;\n n3 = t3 * t3 * (grad3[gi3] * x3 + grad3[gi3 + 1] * y3 + grad3[gi3 + 2] * z3);\n }\n // Add contributions from each corner to get the final noise value.\n // The result is scaled to stay just inside [-1,1]\n return 32.0 * (n0 + n1 + n2 + n3);\n }\n /**\n * Samples the noise field in 4 dimensions\n * @param x\n * @param y\n * @param z\n * @returns a number in the interval [-1, 1]\n */\n noise4D(x, y, z, w) {\n const perm = this.perm;\n let n0, n1, n2, n3, n4; // Noise contributions from the five corners\n // Skew the (x,y,z,w) space to determine which cell of 24 simplices we're in\n const s = (x + y + z + w) * F4; // Factor for 4D skewing\n const i = Math.floor(x + s);\n const j = Math.floor(y + s);\n const k = Math.floor(z + s);\n const l = Math.floor(w + s);\n const t = (i + j + k + l) * G4; // Factor for 4D unskewing\n const X0 = i - t; // Unskew the cell origin back to (x,y,z,w) space\n const Y0 = j - t;\n const Z0 = k - t;\n const W0 = l - t;\n const x0 = x - X0; // The x,y,z,w distances from the cell origin\n const y0 = y - Y0;\n const z0 = z - Z0;\n const w0 = w - W0;\n // For the 4D case, the simplex is a 4D shape I won't even try to describe.\n // To find out which of the 24 possible simplices we're in, we need to\n // determine the magnitude ordering of x0, y0, z0 and w0.\n // Six pair-wise comparisons are performed between each possible pair\n // of the four coordinates, and the results are used to rank the numbers.\n let rankx = 0;\n let ranky = 0;\n let rankz = 0;\n let rankw = 0;\n if (x0 > y0)\n rankx++;\n else\n ranky++;\n if (x0 > z0)\n rankx++;\n else\n rankz++;\n if (x0 > w0)\n rankx++;\n else\n rankw++;\n if (y0 > z0)\n ranky++;\n else\n rankz++;\n if (y0 > w0)\n ranky++;\n else\n rankw++;\n if (z0 > w0)\n rankz++;\n else\n rankw++;\n // simplex[c] is a 4-vector with the numbers 0, 1, 2 and 3 in some order.\n // Many values of c will never occur, since e.g. x>y>z>w makes x<z, y<w and x<w\n // impossible. Only the 24 indices which have non-zero entries make any sense.\n // We use a thresholding to set the coordinates in turn from the largest magnitude.\n // Rank 3 denotes the largest coordinate.\n // Rank 2 denotes the second largest coordinate.\n // Rank 1 denotes the second smallest coordinate.\n // The integer offsets for the second simplex corner\n const i1 = rankx >= 3 ? 1 : 0;\n const j1 = ranky >= 3 ? 1 : 0;\n const k1 = rankz >= 3 ? 1 : 0;\n const l1 = rankw >= 3 ? 1 : 0;\n // The integer offsets for the third simplex corner\n const i2 = rankx >= 2 ? 1 : 0;\n const j2 = ranky >= 2 ? 1 : 0;\n const k2 = rankz >= 2 ? 1 : 0;\n const l2 = rankw >= 2 ? 1 : 0;\n // The integer offsets for the fourth simplex corner\n const i3 = rankx >= 1 ? 1 : 0;\n const j3 = ranky >= 1 ? 1 : 0;\n const k3 = rankz >= 1 ? 1 : 0;\n const l3 = rankw >= 1 ? 1 : 0;\n // The fifth corner has all coordinate offsets = 1, so no need to compute that.\n const x1 = x0 - i1 + G4; // Offsets for second corner in (x,y,z,w) coords\n const y1 = y0 - j1 + G4;\n const z1 = z0 - k1 + G4;\n const w1 = w0 - l1 + G4;\n const x2 = x0 - i2 + 2.0 * G4; // Offsets for third corner in (x,y,z,w) coords\n const y2 = y0 - j2 + 2.0 * G4;\n const z2 = z0 - k2 + 2.0 * G4;\n const w2 = w0 - l2 + 2.0 * G4;\n const x3 = x0 - i3 + 3.0 * G4; // Offsets for fourth corner in (x,y,z,w) coords\n const y3 = y0 - j3 + 3.0 * G4;\n const z3 = z0 - k3 + 3.0 * G4;\n const w3 = w0 - l3 + 3.0 * G4;\n const x4 = x0 - 1.0 + 4.0 * G4; // Offsets for last corner in (x,y,z,w) coords\n const y4 = y0 - 1.0 + 4.0 * G4;\n const z4 = z0 - 1.0 + 4.0 * G4;\n const w4 = w0 - 1.0 + 4.0 * G4;\n // Work out the hashed gradient indices of the five simplex corners\n const ii = i & 255;\n const jj = j & 255;\n const kk = k & 255;\n const ll = l & 255;\n // Calculate the contribution from the five corners\n let t0 = 0.6 - x0 * x0 - y0 * y0 - z0 * z0 - w0 * w0;\n if (t0 < 0)\n n0 = 0.0;\n else {\n const gi0 = (perm[ii + perm[jj + perm[kk + perm[ll]]]] % 32) * 4;\n t0 *= t0;\n n0 = t0 * t0 * (grad4[gi0] * x0 + grad4[gi0 + 1] * y0 + grad4[gi0 + 2] * z0 + grad4[gi0 + 3] * w0);\n }\n let t1 = 0.6 - x1 * x1 - y1 * y1 - z1 * z1 - w1 * w1;\n if (t1 < 0)\n n1 = 0.0;\n else {\n const gi1 = (perm[ii + i1 + perm[jj + j1 + perm[kk + k1 + perm[ll + l1]]]] % 32) * 4;\n t1 *= t1;\n n1 = t1 * t1 * (grad4[gi1] * x1 + grad4[gi1 + 1] * y1 + grad4[gi1 + 2] * z1 + grad4[gi1 + 3] * w1);\n }\n let t2 = 0.6 - x2 * x2 - y2 * y2 - z2 * z2 - w2 * w2;\n if (t2 < 0)\n n2 = 0.0;\n else {\n const gi2 = (perm[ii + i2 + perm[jj + j2 + perm[kk + k2 + perm[ll + l2]]]] % 32) * 4;\n t2 *= t2;\n n2 = t2 * t2 * (grad4[gi2] * x2 + grad4[gi2 + 1] * y2 + grad4[gi2 + 2] * z2 + grad4[gi2 + 3] * w2);\n }\n let t3 = 0.6 - x3 * x3 - y3 * y3 - z3 * z3 - w3 * w3;\n if (t3 < 0)\n n3 = 0.0;\n else {\n const gi3 = (perm[ii + i3 + perm[jj + j3 + perm[kk + k3 + perm[ll + l3]]]] % 32) * 4;\n t3 *= t3;\n n3 = t3 * t3 * (grad4[gi3] * x3 + grad4[gi3 + 1] * y3 + grad4[gi3 + 2] * z3 + grad4[gi3 + 3] * w3);\n }\n let t4 = 0.6 - x4 * x4 - y4 * y4 - z4 * z4 - w4 * w4;\n if (t4 < 0)\n n4 = 0.0;\n else {\n const gi4 = (perm[ii + 1 + perm[jj + 1 + perm[kk + 1 + perm[ll + 1]]]] % 32) * 4;\n t4 *= t4;\n n4 = t4 * t4 * (grad4[gi4] * x4 + grad4[gi4 + 1] * y4 + grad4[gi4 + 2] * z4 + grad4[gi4 + 3] * w4);\n }\n // Sum up and scale the result to cover the range [-1,1]\n return 27.0 * (n0 + n1 + n2 + n3 + n4);\n }\n}\n/**\n * Builds a random permutation table.\n * This is exported only for (internal) testing purposes.\n * Do not rely on this export.\n * @private\n */\nfunction buildPermutationTable(random) {\n const p = new Uint8Array(256);\n for (let i = 0; i < 256; i++) {\n p[i] = i;\n }\n for (let i = 0; i < 255; i++) {\n const r = i + ~~(random() * (256 - i));\n const aux = p[i];\n p[i] = p[r];\n p[r] = aux;\n }\n return p;\n}\n/*\nThe ALEA PRNG and masher code used by simplex-noise.js\nis based on code by Johannes Baagøe, modified by Jonas Wagner.\nSee alea.md for the full license.\n*/\nfunction alea(seed) {\n let s0 = 0;\n let s1 = 0;\n let s2 = 0;\n let c = 1;\n const mash = masher();\n s0 = mash(' ');\n s1 = mash(' ');\n s2 = mash(' ');\n s0 -= mash(seed);\n if (s0 < 0) {\n s0 += 1;\n }\n s1 -= mash(seed);\n if (s1 < 0) {\n s1 += 1;\n }\n s2 -= mash(seed);\n if (s2 < 0) {\n s2 += 1;\n }\n return function () {\n const t = 2091639 * s0 + c * 2.3283064365386963e-10; // 2^-32\n s0 = s1;\n s1 = s2;\n return (s2 = t - (c = t | 0));\n };\n}\nfunction masher() {\n let n = 0xefc8249d;\n return function (data) {\n data = data.toString();\n for (let i = 0; i < data.length; i++) {\n n += data.charCodeAt(i);\n let h = 0.02519603282416938 * n;\n n = h >>> 0;\n h -= n;\n h *= n;\n n = h >>> 0;\n h -= n;\n n += h * 0x100000000; // 2^32\n }\n return (n >>> 0) * 2.3283064365386963e-10; // 2^-32\n };\n}\n\nconst GENERATOR_COUNT = 100;\nconst generators = new Array(GENERATOR_COUNT);\nconst tempV = new Vector3();\nconst tempQ = new Quaternion();\n/** Simplex generators are built on first use, so constructing a Noise behavior stays cheap. */\nfunction getGenerator(index) {\n let generator = generators[index];\n if (generator === undefined) {\n generator = new SimplexNoise();\n generators[index] = generator;\n }\n return generator;\n}\n/**\n * Apply noise to particles.\n */\nclass Noise {\n constructor(frequency, power, positionAmount = new ConstantValue(1), rotationAmount = new ConstantValue(0)) {\n this.frequency = frequency;\n this.power = power;\n this.positionAmount = positionAmount;\n this.rotationAmount = rotationAmount;\n this.type = 'Noise';\n this.duration = 0;\n }\n initialize(particle) {\n const isScalarRotation = typeof particle.rotation === 'number';\n let state = particle._noiseState;\n if (state === undefined) {\n state = {\n lastPos: new Vector3(),\n lastRot: 0,\n lastRotQ: isScalarRotation ? null : new Quaternion(),\n generatorX: getGenerator(randomInt(0, GENERATOR_COUNT)),\n generatorY: getGenerator(randomInt(0, GENERATOR_COUNT)),\n generatorZ: getGenerator(randomInt(0, GENERATOR_COUNT)),\n generatorW: getGenerator(randomInt(0, GENERATOR_COUNT)),\n };\n particle._noiseState = state;\n return;\n }\n // Recycled particle: reset the accumulated offsets and re-roll generators.\n state.lastPos.set(0, 0, 0);\n state.lastRot = 0;\n if (isScalarRotation) {\n state.lastRotQ = null;\n }\n else if (state.lastRotQ === null) {\n state.lastRotQ = new Quaternion();\n }\n else {\n state.lastRotQ.set(0, 0, 0, 1);\n }\n state.generatorX = getGenerator(randomInt(0, GENERATOR_COUNT));\n state.generatorY = getGenerator(randomInt(0, GENERATOR_COUNT));\n state.generatorZ = getGenerator(randomInt(0, GENERATOR_COUNT));\n state.generatorW = getGenerator(randomInt(0, GENERATOR_COUNT));\n }\n update(particle, _) {\n const state = particle._noiseState;\n if (state === undefined) {\n return;\n }\n const memory = particle.memory;\n const t = particle.age / particle.life;\n const frequency = this.frequency.genValue(memory, t);\n const power = this.power.genValue(memory, t);\n const positionAmount = this.positionAmount.genValue(memory, t);\n const rotationAmount = this.rotationAmount.genValue(memory, t);\n const noiseTime = particle.age * frequency;\n if (positionAmount > 0) {\n const amount = power * positionAmount;\n particle.position.sub(state.lastPos);\n tempV.set(state.generatorX.noise2D(0, noiseTime) * amount, state.generatorY.noise2D(0, noiseTime) * amount, state.generatorZ.noise2D(0, noiseTime) * amount);\n particle.position.add(tempV);\n state.lastPos.copy(tempV);\n }\n if (rotationAmount > 0) {\n const amount = power * rotationAmount;\n if (typeof particle.rotation === 'number') {\n const noise = state.generatorW.noise2D(0, noiseTime) * Math.PI * amount;\n particle.rotation = particle.rotation - state.lastRot + noise;\n state.lastRot = noise;\n }\n else if (state.lastRotQ !== null) {\n const rotation = particle.rotation;\n state.lastRotQ.invert();\n rotation.multiply(state.lastRotQ);\n tempQ\n .set(state.generatorX.noise2D(0, noiseTime) * amount, state.generatorY.noise2D(0, noiseTime) * amount, state.generatorZ.noise2D(0, noiseTime) * amount, state.generatorW.noise2D(0, noiseTime) * amount)\n .normalize();\n rotation.multiply(tempQ);\n state.lastRotQ.copy(tempQ);\n }\n }\n }\n updateAll(particles, count, delta) {\n // Each particle carries its own noise state and simplex generators, so\n // there is nothing to hoist out of the body. The gain here is only that\n // this call site sees one implementation and can be inlined, unlike the\n // shared dispatch in the system.\n for (let i = 0; i < count; i++) {\n const particle = particles[i];\n if (particle.age < particle.life) {\n this.update(particle, delta);\n }\n }\n }\n toJSON() {\n return {\n type: this.type,\n frequency: this.frequency.toJSON(),\n power: this.power.toJSON(),\n positionAmount: this.positionAmount.toJSON(),\n rotationAmount: this.rotationAmount.toJSON(),\n };\n }\n frameUpdate(delta) {\n this.duration += delta;\n }\n static fromJSON(json) {\n return new Noise(ValueGeneratorFromJSON(json.frequency), ValueGeneratorFromJSON(json.power), ValueGeneratorFromJSON(json.positionAmount), ValueGeneratorFromJSON(json.rotationAmount));\n }\n clone() {\n return new Noise(this.frequency.clone(), this.power.clone(), this.positionAmount.clone(), this.rotationAmount.clone());\n }\n reset() { }\n}\n\n/**\n * Orbit particles around an axis over their life.\n */\nclass OrbitOverLife {\n constructor(orbitSpeed, axis = new Vector3(0, 1, 0)) {\n this.orbitSpeed = orbitSpeed;\n this.axis = axis;\n this.type = 'OrbitOverLife';\n this.temp = new Vector3();\n this.rotation = new Quaternion();\n }\n initialize(particle) {\n this.orbitSpeed.startGen(particle.memory);\n }\n update(particle, delta) {\n this.temp.copy(particle.position).projectOnVector(this.axis);\n this.rotation.setFromAxisAngle(this.axis, this.orbitSpeed.genValue(particle.memory, particle.age / particle.life) * delta);\n particle.position.sub(this.temp);\n particle.position.applyQuaternion(this.rotation);\n particle.position.add(this.temp);\n }\n updateAll(particles, count, delta) {\n const generator = this.orbitSpeed;\n const axis = this.axis;\n const temp = this.temp;\n const rotation = this.rotation;\n for (let i = 0; i < count; i++) {\n const particle = particles[i];\n if (particle.age >= particle.life) {\n continue;\n }\n const position = particle.position;\n temp.copy(position).projectOnVector(axis);\n rotation.setFromAxisAngle(axis, generator.genValue(particle.memory, particle.age / particle.life) * delta);\n position.sub(temp);\n position.applyQuaternion(rotation);\n position.add(temp);\n }\n }\n frameUpdate(delta) { }\n toJSON() {\n return {\n type: this.type,\n orbitSpeed: this.orbitSpeed.toJSON(),\n axis: [this.axis.x, this.axis.y, this.axis.z],\n };\n }\n static fromJSON(json) {\n return new OrbitOverLife(ValueGeneratorFromJSON(json.orbitSpeed), json.axis ? new Vector3(json.axis[0], json.axis[1], json.axis[2]) : undefined);\n }\n clone() {\n return new OrbitOverLife(this.orbitSpeed.clone());\n }\n reset() { }\n}\n\n/**\n * Apply rotation to particles over their life.\n */\nclass Rotation3DOverLife {\n constructor(angularVelocity) {\n this.angularVelocity = angularVelocity;\n this.type = 'Rotation3DOverLife';\n /** Scratch for the frame's rotation step; also read by the fused pass. */\n this.tempQuat = new Quaternion();\n }\n initialize(particle) {\n if (particle.rotation instanceof Quaternion) {\n particle.angularVelocity = new Quaternion();\n this.angularVelocity.startGen(particle.memory);\n }\n }\n update(particle, delta) {\n if (particle.rotation instanceof Quaternion) {\n this.angularVelocity.genValue(particle.memory, this.tempQuat, delta, particle.age / particle.life);\n particle.rotation.multiply(this.tempQuat);\n // This step's turn, kept for the renderer to draw a fraction of when\n // the frame falls between steps.\n const step = particle.angularVelocity;\n if (step instanceof Quaternion) {\n step.copy(this.tempQuat);\n }\n }\n }\n toJSON() {\n return {\n type: this.type,\n angularVelocity: this.angularVelocity.toJSON(),\n };\n }\n static fromJSON(json) {\n return new Rotation3DOverLife(RotationGeneratorFromJSON(json.angularVelocity));\n }\n frameUpdate(delta) { }\n clone() {\n return new Rotation3DOverLife(this.angularVelocity.clone());\n }\n reset() { }\n}\n\n/**\n * Apply rotation to particles based on their speed.\n */\nclass RotationBySpeed {\n constructor(angularVelocity, speedRange) {\n this.angularVelocity = angularVelocity;\n this.speedRange = speedRange;\n this.type = 'RotationBySpeed';\n this.tempQuat = new Quaternion();\n }\n initialize(particle) {\n if (typeof particle.rotation === 'number') {\n this.angularVelocity.startGen(particle.memory);\n }\n }\n update(particle, delta) {\n if (typeof particle.rotation === 'number') {\n const t = (particle.startSpeed - this.speedRange.a) / (this.speedRange.b - this.speedRange.a);\n const rate = this.angularVelocity.genValue(particle.memory, t);\n particle.rotation += delta * rate;\n // Kept for the renderer, which draws between steps.\n particle.angularVelocity = rate;\n }\n }\n toJSON() {\n return {\n type: this.type,\n angularVelocity: this.angularVelocity.toJSON(),\n speedRange: this.speedRange.toJSON(),\n };\n }\n static fromJSON(json) {\n return new RotationBySpeed(ValueGeneratorFromJSON(json.angularVelocity), IntervalValue.fromJSON(json.speedRange));\n }\n frameUpdate(delta) { }\n clone() {\n return new RotationBySpeed(this.angularVelocity.clone(), this.speedRange.clone());\n }\n reset() { }\n}\n\n/**\n * Apply rotation to particles over their life.\n */\nclass RotationOverLife {\n constructor(angularVelocity) {\n this.angularVelocity = angularVelocity;\n this.type = 'RotationOverLife';\n }\n initialize(particle) {\n if (typeof particle.rotation === 'number') {\n this.angularVelocity.startGen(particle.memory);\n }\n }\n update(particle, delta) {\n if (typeof particle.rotation === 'number') {\n const rate = this.angularVelocity.genValue(particle.memory, particle.age / particle.life);\n particle.rotation += delta * rate;\n // Kept for the renderer, which draws between steps and has no other\n // way to know how fast this particle is turning.\n particle.angularVelocity = rate;\n }\n }\n updateAll(particles, count, delta) {\n const generator = this.angularVelocity;\n for (let i = 0; i < count; i++) {\n const particle = particles[i];\n if (particle.age >= particle.life || typeof particle.rotation !== 'number') {\n continue;\n }\n const rate = generator.genValue(particle.memory, particle.age / particle.life);\n particle.rotation += delta * rate;\n particle.angularVelocity = rate;\n }\n }\n toJSON() {\n return {\n type: this.type,\n angularVelocity: this.angularVelocity.toJSON(),\n };\n }\n static fromJSON(json) {\n return new RotationOverLife(ValueGeneratorFromJSON(json.angularVelocity));\n }\n frameUpdate(delta) {\n this.angularVelocity.refreshTable?.();\n }\n clone() {\n return new RotationOverLife(this.angularVelocity.clone());\n }\n reset() { }\n}\n\n/**\n * Apply size to particles based on their speed.\n */\nclass SizeBySpeed {\n initialize(particle) {\n this.size.startGen(particle.memory);\n }\n constructor(size, speedRange) {\n this.size = size;\n this.speedRange = speedRange;\n this.type = 'SizeBySpeed';\n }\n update(particle) {\n const t = (particle.startSpeed - this.speedRange.a) / (this.speedRange.b - this.speedRange.a);\n if (this.size instanceof Vector3Function) {\n this.size.genValue(particle.memory, particle.size, t).multiply(particle.startSize);\n }\n else {\n particle.size\n .copy(particle.startSize)\n .multiplyScalar(this.size.genValue(particle.memory, t));\n }\n }\n toJSON() {\n return {\n type: this.type,\n size: this.size.toJSON(),\n speedRange: this.speedRange.toJSON(),\n };\n }\n static fromJSON(json) {\n return new SizeBySpeed(GeneratorFromJSON(json.size), IntervalValue.fromJSON(json.speedRange));\n }\n frameUpdate(delta) { }\n clone() {\n return new SizeBySpeed(this.size.clone(), this.speedRange.clone());\n }\n reset() { }\n}\n\n/**\n * Apply size to particles based on their life.\n */\nclass SizeOverLife {\n constructor(size) {\n this.type = 'SizeOverLife';\n // Cached so the per-particle update does not repeat the instanceof test.\n this._sizeIsVector3 = false;\n this.size = size;\n }\n get size() {\n return this._size;\n }\n set size(size) {\n this._size = size;\n this._sizeIsVector3 = size instanceof Vector3Function;\n }\n initialize(particle) {\n this._size.startGen(particle.memory);\n }\n update(particle) {\n const t = particle.age / particle.life;\n if (this._sizeIsVector3) {\n this._size.genValue(particle.memory, particle.size, t).multiply(particle.startSize);\n }\n else {\n const scale = this._size.genValue(particle.memory, t);\n const size = particle.size;\n const startSize = particle.startSize;\n size.x = startSize.x * scale;\n size.y = startSize.y * scale;\n size.z = startSize.z * scale;\n }\n }\n updateAll(particles, count, delta) {\n // Split by generator kind once per frame rather than per particle, so\n // each loop keeps a single monomorphic genValue call site.\n if (this._sizeIsVector3) {\n const generator = this._size;\n for (let i = 0; i < count; i++) {\n const particle = particles[i];\n if (particle.age >= particle.life) {\n continue;\n }\n generator\n .genValue(particle.memory, particle.size, particle.age / particle.life)\n .multiply(particle.startSize);\n }\n return;\n }\n const generator = this._size;\n for (let i = 0; i < count; i++) {\n const particle = particles[i];\n if (particle.age >= particle.life) {\n continue;\n }\n const scale = generator.genValue(particle.memory, particle.age / particle.life);\n const size = particle.size;\n const startSize = particle.startSize;\n size.x = startSize.x * scale;\n size.y = startSize.y * scale;\n size.z = startSize.z * scale;\n }\n }\n toJSON() {\n return {\n type: this.type,\n size: this.size.toJSON(),\n };\n }\n static fromJSON(json) {\n return new SizeOverLife(GeneratorFromJSON(json.size));\n }\n frameUpdate(delta) {\n this._size.refreshTable?.();\n }\n clone() {\n return new SizeOverLife(this.size.clone());\n }\n reset() { }\n}\n\n/**\n * Apply speed to particles based on their life.\n */\nclass SpeedOverLife {\n initialize(particle) {\n this.speed.startGen(particle.memory);\n }\n constructor(speed) {\n this.speed = speed;\n this.type = 'SpeedOverLife';\n }\n update(particle) {\n particle.speedModifier = this.speed.genValue(particle.memory, particle.age / particle.life);\n }\n updateAll(particles, count, delta) {\n const generator = this.speed;\n for (let i = 0; i < count; i++) {\n const particle = particles[i];\n if (particle.age >= particle.life) {\n continue;\n }\n particle.speedModifier = generator.genValue(particle.memory, particle.age / particle.life);\n }\n }\n toJSON() {\n return {\n type: this.type,\n speed: this.speed.toJSON(),\n };\n }\n static fromJSON(json) {\n return new SpeedOverLife(ValueGeneratorFromJSON(json.speed));\n }\n frameUpdate(delta) {\n this.speed.refreshTable?.();\n }\n clone() {\n return new SpeedOverLife(this.speed.clone());\n }\n reset() { }\n}\n\n/**\n * Apply turbulence to particles.\n */\nclass TurbulenceField {\n constructor(scale, octaves, velocityMultiplier, timeScale) {\n this.scale = scale;\n this.octaves = octaves;\n this.velocityMultiplier = velocityMultiplier;\n this.timeScale = timeScale;\n this.type = 'TurbulenceField';\n this.generator = new SimplexNoise();\n this.timeOffset = new Vector3();\n this.temp = new Vector3();\n this.temp2 = new Vector3();\n this.timeOffset.x = (Math.random() / this.scale.x) * this.timeScale.x;\n this.timeOffset.y = (Math.random() / this.scale.y) * this.timeScale.y;\n this.timeOffset.z = (Math.random() / this.scale.z) * this.timeScale.z;\n }\n initialize(particle) { }\n update(particle, delta) {\n const x = particle.position.x / this.scale.x;\n const y = particle.position.y / this.scale.y;\n const z = particle.position.z / this.scale.z;\n this.temp.set(0, 0, 0);\n let lvl = 1;\n for (let i = 0; i < this.octaves; i++) {\n this.temp2.set(this.generator.noise4D(x * lvl, y * lvl, z * lvl, this.timeOffset.x * lvl) / lvl, this.generator.noise4D(x * lvl, y * lvl, z * lvl, this.timeOffset.y * lvl) / lvl, this.generator.noise4D(x * lvl, y * lvl, z * lvl, this.timeOffset.z * lvl) / lvl);\n this.temp.add(this.temp2);\n lvl *= 2;\n }\n this.temp.multiply(this.velocityMultiplier);\n particle.velocity.addScaledVector(this.temp, delta);\n }\n toJSON() {\n return {\n type: this.type,\n scale: [this.scale.x, this.scale.y, this.scale.z],\n octaves: this.octaves,\n velocityMultiplier: [this.velocityMultiplier.x, this.velocityMultiplier.y, this.velocityMultiplier.z],\n timeScale: [this.timeScale.x, this.timeScale.y, this.timeScale.z],\n };\n }\n frameUpdate(delta) {\n this.timeOffset.x += delta * this.timeScale.x;\n this.timeOffset.y += delta * this.timeScale.y;\n this.timeOffset.z += delta * this.timeScale.z;\n }\n static fromJSON(json) {\n return new TurbulenceField(new Vector3(json.scale[0], json.scale[1], json.scale[2]), json.octaves, new Vector3(json.velocityMultiplier[0], json.velocityMultiplier[1], json.velocityMultiplier[2]), new Vector3(json.timeScale[0], json.timeScale[1], json.timeScale[2]));\n }\n clone() {\n return new TurbulenceField(this.scale.clone(), this.octaves, this.velocityMultiplier.clone(), this.timeScale.clone());\n }\n reset() { }\n}\n\nconst UNIT_X = new Vector3(1, 0, 0);\nconst UNIT_Y = new Vector3(0, 1, 0);\nconst UNIT_Z = new Vector3(0, 0, 1);\n/**\n * Move particles with a direct velocity over their life (Unity's \"Velocity over Lifetime\").\n * Applied as a positional displacement, so it is not affected by speed modifiers,\n * forces, or speed limits. Orbital speeds rotate particles around the emitter axes.\n */\nclass VelocityOverLife {\n constructor(linearX = new ConstantValue(0), linearY = new ConstantValue(0), linearZ = new ConstantValue(0), orbitalX = new ConstantValue(0), orbitalY = new ConstantValue(0), orbitalZ = new ConstantValue(0), space = 'local') {\n this.linearX = linearX;\n this.linearY = linearY;\n this.linearZ = linearZ;\n this.orbitalX = orbitalX;\n this.orbitalY = orbitalY;\n this.orbitalZ = orbitalZ;\n this.space = space;\n this.type = 'VelocityOverLife';\n this._temp = new Vector3();\n this._tempEmitterPos = new Vector3();\n this._tempQ = new Quaternion();\n this._tempQInv = new Quaternion();\n this._tempScale = new Vector3(1, 1, 1);\n this._tempScaleInv = new Vector3(1, 1, 1);\n this._tempRot = new Quaternion();\n /**\n * Axes the orbital speeds turn around, refreshed once per frame by\n * {@link frameUpdate}. In world space they are the emitter's axes, which\n * only change when the emitter does — so they are hoisted out of the\n * per-particle work rather than rebuilt for every particle.\n */\n this._axisX = new Vector3(1, 0, 0);\n this._axisY = new Vector3(0, 1, 0);\n this._axisZ = new Vector3(0, 0, 1);\n }\n initialize(particle, particleSystem) {\n this.ps = particleSystem;\n this.linearX.startGen(particle.memory);\n this.linearY.startGen(particle.memory);\n this.linearZ.startGen(particle.memory);\n this.orbitalX.startGen(particle.memory);\n this.orbitalY.startGen(particle.memory);\n this.orbitalZ.startGen(particle.memory);\n }\n frameUpdate(delta) {\n if (this.ps) {\n this.ps.emitter.matrixWorld.decompose(this._tempEmitterPos, this._tempQ, this._tempScale);\n this._tempQInv.copy(this._tempQ).invert();\n this._tempScaleInv.set(1 / this._tempScale.x, 1 / this._tempScale.y, 1 / this._tempScale.z);\n this._axisX.copy(UNIT_X);\n this._axisY.copy(UNIT_Y);\n this._axisZ.copy(UNIT_Z);\n if (this.ps.worldSpace) {\n this._axisX.applyQuaternion(this._tempQ);\n this._axisY.applyQuaternion(this._tempQ);\n this._axisZ.applyQuaternion(this._tempQ);\n }\n }\n }\n update(particle, delta) {\n const t = particle.age / particle.life;\n this._temp.set(this.linearX.genValue(particle.memory, t), this.linearY.genValue(particle.memory, t), this.linearZ.genValue(particle.memory, t));\n // The system is undefined until initialize() has run for this behavior;\n // an unknown one is treated as world space rather than throwing, which\n // is also what frameUpdate's guard assumes.\n const worldSpace = this.ps !== undefined && this.ps.worldSpace;\n // Convert the authored space into the particle simulation space.\n if (worldSpace && this.space === 'local') {\n this._temp.multiply(this._tempScale).applyQuaternion(this._tempQ);\n }\n else if (!worldSpace && this.space === 'world') {\n this._temp.multiply(this._tempScaleInv).applyQuaternion(this._tempQInv);\n }\n particle.position.addScaledVector(this._temp, delta);\n const angleX = this.orbitalX.genValue(particle.memory, t) * delta;\n const angleY = this.orbitalY.genValue(particle.memory, t) * delta;\n const angleZ = this.orbitalZ.genValue(particle.memory, t) * delta;\n if (angleX !== 0 || angleY !== 0 || angleZ !== 0) {\n if (worldSpace) {\n particle.position.sub(this._tempEmitterPos);\n }\n this.orbit(particle.position, this._axisX, angleX);\n this.orbit(particle.position, this._axisY, angleY);\n this.orbit(particle.position, this._axisZ, angleZ);\n if (worldSpace) {\n particle.position.add(this._tempEmitterPos);\n }\n }\n }\n orbit(position, axis, angle) {\n if (angle === 0) {\n return;\n }\n this._tempRot.setFromAxisAngle(axis, angle);\n position.applyQuaternion(this._tempRot);\n }\n toJSON() {\n return {\n type: this.type,\n linearX: this.linearX.toJSON(),\n linearY: this.linearY.toJSON(),\n linearZ: this.linearZ.toJSON(),\n orbitalX: this.orbitalX.toJSON(),\n orbitalY: this.orbitalY.toJSON(),\n orbitalZ: this.orbitalZ.toJSON(),\n space: this.space,\n };\n }\n static fromJSON(json) {\n const readValue = (field) => field ? ValueGeneratorFromJSON(field) : new ConstantValue(0);\n return new VelocityOverLife(readValue(json.linearX), readValue(json.linearY), readValue(json.linearZ), readValue(json.orbitalX), readValue(json.orbitalY), readValue(json.orbitalZ), json.space === 'world' ? 'world' : 'local');\n }\n clone() {\n return new VelocityOverLife(this.linearX.clone(), this.linearY.clone(), this.linearZ.clone(), this.orbitalX.clone(), this.orbitalY.clone(), this.orbitalZ.clone(), this.space);\n }\n reset() { }\n}\n\n/**\n * Column storage for the vector-valued particle attributes.\n *\n * The three-component and four-component fields of a particle used to be six\n * separate objects per particle, so walking a system meant chasing pointers\n * across the heap. Here each attribute is one flat `Float32Array` shared by\n * every particle in a system, and a particle holds views into its own row. The\n * numbers a simulation step touches are then contiguous and prefetchable, while\n * `particle.position.x` keeps working exactly as before.\n *\n * Scalar attributes (age, life, rotation, …) stay as plain properties on the\n * particle: a monomorphic own property is already a single load, so moving them\n * here would add an indirection rather than remove one.\n */\nclass ParticleStore {\n constructor(capacity = 64) {\n /**\n * Velocity at the start of the current step. A stretched billboard's shape\n * is its velocity — the streak points along it and is as long as it — so a\n * velocity that only changes on steps makes the sprite's outline pop at the\n * step rate even while its position moves smoothly.\n *\n * Empty until {@link keepPreviousVelocity} asks for it, because only that\n * one render mode reads it and an unused column is not free: it sits\n * between the columns that are hot and costs them their locality.\n */\n this.previousVelocity = ParticleStore.EMPTY;\n this.capacity = Math.max(1, capacity);\n this.position = new Float32Array(this.capacity * 3);\n this.previousPosition = new Float32Array(this.capacity * 3);\n this.previousSize = new Float32Array(this.capacity * 3);\n this.previousColor = new Float32Array(this.capacity * 4);\n this.velocity = new Float32Array(this.capacity * 3);\n this.size = new Float32Array(this.capacity * 3);\n this.startSize = new Float32Array(this.capacity * 3);\n this.color = new Float32Array(this.capacity * 4);\n this.startColor = new Float32Array(this.capacity * 4);\n this.scalars = new Float64Array(this.capacity * ParticleStore.SCALAR_STRIDE);\n }\n /**\n * Grows the arrays so `count` rows fit, preserving the existing contents.\n *\n * @param count - Number of rows that must be addressable.\n * @returns `true` when the arrays were replaced, meaning every particle\n * bound to this store has to be re-bound.\n */\n ensureCapacity(count) {\n if (count <= this.capacity) {\n return false;\n }\n let capacity = this.capacity;\n while (capacity < count) {\n capacity *= 2;\n }\n this.position = ParticleStore.grow(this.position, capacity * 3);\n this.previousPosition = ParticleStore.grow(this.previousPosition, capacity * 3);\n this.previousSize = ParticleStore.grow(this.previousSize, capacity * 3);\n if (this.previousVelocity.length > 0) {\n this.previousVelocity = ParticleStore.grow(this.previousVelocity, capacity * 3);\n }\n this.previousColor = ParticleStore.grow(this.previousColor, capacity * 4);\n this.velocity = ParticleStore.grow(this.velocity, capacity * 3);\n this.size = ParticleStore.grow(this.size, capacity * 3);\n this.startSize = ParticleStore.grow(this.startSize, capacity * 3);\n this.color = ParticleStore.grow(this.color, capacity * 4);\n this.startColor = ParticleStore.grow(this.startColor, capacity * 4);\n this.scalars = ParticleStore.growDouble(this.scalars, capacity * ParticleStore.SCALAR_STRIDE);\n this.capacity = capacity;\n return true;\n }\n /**\n * Exchanges the contents of two rows.\n *\n * Used to keep row order aligned with the owning system's particle order, so\n * the live particles stay a contiguous range that a renderer can copy in one\n * go rather than gathering particle by particle.\n */\n /**\n * Starts keeping {@link previousVelocity}. Harmless to call every step;\n * returns true on the call that allocated, which replaces the array and so\n * leaves every particle's view of it pointing at the old one.\n */\n keepPreviousVelocity() {\n if (this.previousVelocity.length >= this.capacity * 3) {\n return false;\n }\n this.previousVelocity = new Float32Array(this.capacity * 3);\n return true;\n }\n swapRows(a, b) {\n if (a === b) {\n return;\n }\n const a3 = a * 3;\n const b3 = b * 3;\n ParticleStore.swap3(this.position, a3, b3);\n ParticleStore.swap3(this.previousPosition, a3, b3);\n ParticleStore.swap3(this.previousSize, a3, b3);\n if (this.previousVelocity.length > 0) {\n ParticleStore.swap3(this.previousVelocity, a3, b3);\n }\n ParticleStore.swap3(this.velocity, a3, b3);\n ParticleStore.swap3(this.size, a3, b3);\n ParticleStore.swap3(this.startSize, a3, b3);\n const a4 = a * 4;\n const b4 = b * 4;\n ParticleStore.swap4(this.color, a4, b4);\n ParticleStore.swap4(this.previousColor, a4, b4);\n ParticleStore.swap4(this.startColor, a4, b4);\n ParticleStore.swap3(this.scalars, a * ParticleStore.SCALAR_STRIDE, b * ParticleStore.SCALAR_STRIDE);\n }\n static growDouble(source, length) {\n const grown = new Float64Array(length);\n grown.set(source);\n return grown;\n }\n static swap3(data, a, b) {\n let temp = data[a];\n data[a] = data[b];\n data[b] = temp;\n temp = data[a + 1];\n data[a + 1] = data[b + 1];\n data[b + 1] = temp;\n temp = data[a + 2];\n data[a + 2] = data[b + 2];\n data[b + 2] = temp;\n }\n static swap4(data, a, b) {\n ParticleStore.swap3(data, a, b);\n const temp = data[a + 3];\n data[a + 3] = data[b + 3];\n data[b + 3] = temp;\n }\n static grow(source, length) {\n const grown = new Float32Array(length);\n grown.set(source);\n return grown;\n }\n}\nParticleStore.EMPTY = new Float32Array(0);\n/** Values per row in {@link scalars}. */\nParticleStore.SCALAR_STRIDE = 3;\n/** Offsets within a {@link scalars} row. */\nParticleStore.AGE = 0;\nParticleStore.LIFE = 1;\nParticleStore.SPEED_MODIFIER = 2;\n\nclass LinkedListNode {\n constructor(data) {\n this.data = data;\n this.next = null;\n this.prev = null;\n }\n hasPrev() {\n return this.prev !== null;\n }\n hasNext() {\n return this.next !== null;\n }\n}\nclass LinkedList {\n constructor() {\n this.length = 0;\n this.head = this.tail = null;\n }\n isEmpty() {\n return this.head === null;\n }\n clear() {\n this.length = 0;\n this.head = this.tail = null;\n }\n front() {\n if (this.head === null)\n return null;\n return this.head.data;\n }\n back() {\n if (this.tail === null)\n return null;\n return this.tail.data;\n }\n /**\n * remove at head in O(1)\n */\n dequeue() {\n if (this.head) {\n const value = this.head.data;\n this.head = this.head.next;\n if (!this.head) {\n this.tail = null;\n }\n else {\n this.head.prev = null;\n }\n this.length--;\n return value;\n }\n return undefined;\n }\n /**\n * remove at tail in O(1)\n */\n pop() {\n if (this.tail) {\n const value = this.tail.data;\n this.tail = this.tail.prev;\n if (!this.tail) {\n this.head = null;\n }\n else {\n this.tail.next = null;\n }\n this.length--;\n return value;\n }\n return undefined;\n }\n /**\n * add at head in O(1)\n */\n queue(data) {\n const node = new LinkedListNode(data);\n if (!this.tail) {\n this.tail = node;\n }\n if (this.head) {\n this.head.prev = node;\n node.next = this.head;\n }\n this.head = node;\n this.length++;\n }\n /**\n * add at tail in O(1)\n */\n push(data) {\n const node = new LinkedListNode(data);\n if (!this.head) {\n this.head = node;\n }\n if (this.tail) {\n this.tail.next = node;\n node.prev = this.tail;\n }\n this.tail = node;\n this.length++;\n }\n insertBefore(node, data) {\n const newNode = new LinkedListNode(data);\n newNode.next = node;\n newNode.prev = node.prev;\n if (newNode.prev !== null) {\n newNode.prev.next = newNode;\n }\n newNode.next.prev = newNode;\n if (node == this.head) {\n this.head = newNode;\n }\n this.length++;\n }\n remove(data) {\n if (this.head === null || this.tail === null) {\n return;\n }\n let tempNode = this.head;\n if (data === this.head.data) {\n this.head = this.head.next;\n }\n if (data === this.tail.data) {\n this.tail = this.tail.prev;\n }\n while (tempNode.next !== null && tempNode.data !== data) {\n tempNode = tempNode.next;\n }\n if (tempNode.data === data) {\n if (tempNode.prev !== null)\n tempNode.prev.next = tempNode.next;\n if (tempNode.next !== null)\n tempNode.next.prev = tempNode.prev;\n this.length--;\n }\n }\n /**\n * Returns an iterator over the values\n */\n *values() {\n let current = this.head;\n while (current !== null) {\n yield current.data;\n current = current.next;\n }\n }\n}\n\n/**\n * Particle implementation for node-based particle systems.\n */\nclass NodeParticle {\n constructor() {\n /**\n * Position of the particle.\n * @type {Vector3}\n */\n this.position = new Vector3();\n /**\n * Velocity of the particle.\n * @type {Vector3}\n */\n this.velocity = new Vector3();\n /**\n * Age of the particle.\n * @type {number}\n */\n this.age = 0;\n /**\n * Life duration of the particle.\n * @type {number}\n */\n this.life = 1;\n /**\n * Size of the particle.\n * @type {Vector3}\n */\n this.size = new Vector3();\n /**\n * Rotation of the particle.\n * @type {number | Quaternion}\n */\n this.rotation = 0;\n /**\n * Color of the particle.\n * @type {Vector4}\n */\n this.color = new Vector4(1, 1, 1, 1);\n /**\n * UV tile index.\n * @type {number}\n */\n this.uvTile = 0;\n this.memory = [];\n }\n /**\n * Indicates if the particle has died.\n * @type {boolean}\n */\n get died() {\n return this.age >= this.life;\n }\n /**\n * Resets the particle properties to initial values.\n */\n reset() {\n this.memory.length = 0;\n this.position.set(0, 0, 0);\n this.velocity.set(0, 0, 0);\n this.age = 0;\n this.life = 1;\n this.size.set(1, 1, 1);\n this.rotation = 0;\n this.color.set(1, 1, 1, 1);\n this.uvTile = 0;\n }\n}\n/**\n * Particle implementation for sprite-based particle.\n */\nclass SpriteParticle {\n /**\n * Age of the particle.\n * @type {number}\n */\n get age() {\n return this.scalars[this.scalarOffset];\n }\n set age(value) {\n this.scalars[this.scalarOffset] = value;\n }\n /**\n * Life duration of the particle.\n * @type {number}\n */\n get life() {\n return this.scalars[this.scalarOffset + 1];\n }\n set life(value) {\n this.scalars[this.scalarOffset + 1] = value;\n }\n /**\n * Speed modifier of the particle.\n * @type {number}\n */\n get speedModifier() {\n return this.scalars[this.scalarOffset + 2];\n }\n set speedModifier(value) {\n this.scalars[this.scalarOffset + 2] = value;\n }\n /**\n * @param store - Column storage to bind to. A private single-row store is\n * created when omitted, so a standalone `new SpriteParticle()` still works.\n * @param storeIndex - Row this particle owns.\n */\n constructor(store = new ParticleStore(1), storeIndex = 0) {\n /**\n * Initial speed of the particle.\n * @type {number}\n */\n this.startSpeed = 0;\n // GPU properties\n /**\n * Rotation of the particle.\n * @type {number | Quaternion}\n */\n this.rotation = 0;\n /**\n * UV tile index.\n * @type {number}\n */\n this.uvTile = 0;\n /**\n * Mirroring picked at birth from the system's `flip` fractions: bit 1\n * mirrors the sprite along U, bit 2 along V. 0 draws it as is.\n * @type {number}\n */\n this.flip = 0;\n this.memory = [];\n this.store = store;\n this.storeIndex = storeIndex;\n const offset3 = storeIndex * 3;\n const offset4 = storeIndex * 4;\n this.position = new Vector3View(store.position, offset3);\n this.previousPosition = new Vector3View(store.previousPosition, offset3);\n this.previousVelocity = new Vector3View(store.previousVelocity, offset3);\n this.velocity = new Vector3View(store.velocity, offset3);\n this.size = new Vector3View(store.size, offset3);\n this.startSize = new Vector3View(store.startSize, offset3);\n this.color = new Vector4View(store.color, offset4);\n this.startColor = new Vector4View(store.startColor, offset4);\n this.scalars = store.scalars;\n this.scalarOffset = storeIndex * ParticleStore.SCALAR_STRIDE;\n this.size.set(1, 1, 1);\n this.startSize.set(1, 1, 1);\n this.life = 1;\n this.speedModifier = 1;\n }\n /**\n * Moves this particle onto a different store row. The caller is responsible\n * for having moved the row contents too.\n */\n setStoreIndex(index) {\n this.storeIndex = index;\n this.rebind();\n }\n /** Re-points the vector views after the store grew its arrays. */\n rebind() {\n const store = this.store;\n const offset3 = this.storeIndex * 3;\n const offset4 = this.storeIndex * 4;\n this.position.bind(store.position, offset3);\n this.previousPosition.bind(store.previousPosition, offset3);\n this.previousVelocity.bind(store.previousVelocity, offset3);\n this.velocity.bind(store.velocity, offset3);\n this.size.bind(store.size, offset3);\n this.startSize.bind(store.startSize, offset3);\n this.color.bind(store.color, offset4);\n this.startColor.bind(store.startColor, offset4);\n this.scalars = store.scalars;\n this.scalarOffset = this.storeIndex * ParticleStore.SCALAR_STRIDE;\n }\n /**\n * Indicates if the particle has died.\n * @type {boolean}\n */\n get died() {\n return this.age >= this.life;\n }\n reset() {\n this.memory.length = 0;\n }\n}\n/** Shared zero-length placeholder so trail buffers are never null. */\nconst EMPTY_HISTORY = new Float32Array(0);\nclass RecordState {\n /**\n * Creates a new record state.\n * @param {Vector3} position - The position of the particle.\n * @param {number} size - The size of the particle.\n * @param {Vector4} color - The color of the particle.\n */\n constructor(position, size, color) {\n this.position = position;\n this.size = size;\n this.color = color;\n }\n}\n/**\n * Particle implementation for trail-based particles.\n */\nclass TrailParticle {\n /**\n * Age of the particle.\n * @type {number}\n */\n get age() {\n return this.scalars[this.scalarOffset];\n }\n set age(value) {\n this.scalars[this.scalarOffset] = value;\n }\n /**\n * Life duration of the particle.\n * @type {number}\n */\n get life() {\n return this.scalars[this.scalarOffset + 1];\n }\n set life(value) {\n this.scalars[this.scalarOffset + 1] = value;\n }\n /**\n * Speed modifier of the particle.\n * @type {number}\n */\n get speedModifier() {\n return this.scalars[this.scalarOffset + 2];\n }\n set speedModifier(value) {\n this.scalars[this.scalarOffset + 2] = value;\n }\n /**\n * @param store - Column storage to bind to. A private single-row store is\n * created when omitted, so a standalone `new TrailParticle()` still works.\n * @param storeIndex - Row this particle owns.\n */\n constructor(store = new ParticleStore(1), storeIndex = 0) {\n /**\n * Initial speed of the particle.\n * @type {number}\n */\n this.startSpeed = 0;\n /**\n * Length of the trail.\n * @type {number}\n */\n this.length = 100;\n /**\n * Previous states of the particle.\n *\n * @deprecated The trail history now lives in the flat ring buffer below\n * (`historyPositions` / `historySizes` / `historyColors`), which records a\n * sample without allocating. This list is no longer populated or rendered.\n * @type {LinkedList<RecordState>}\n */\n this.previous = new LinkedList();\n /**\n * UV tile index.\n * @type {number}\n */\n this.uvTile = 0;\n /** Ring buffer of recorded positions, 3 floats per sample. */\n this.historyPositions = EMPTY_HISTORY;\n /** Ring buffer of recorded widths, 1 float per sample. */\n this.historySizes = EMPTY_HISTORY;\n /** Ring buffer of recorded colors, 4 floats per sample. */\n this.historyColors = EMPTY_HISTORY;\n /** Number of samples the ring buffers can hold. */\n this.historyCapacity = 0;\n /** Slot the next sample is written to. */\n this.historyHead = 0;\n /** Number of valid samples currently held. */\n this.historyCount = 0;\n this.memory = [];\n this.store = store;\n this.storeIndex = storeIndex;\n const offset3 = storeIndex * 3;\n const offset4 = storeIndex * 4;\n this.position = new Vector3View(store.position, offset3);\n this.previousPosition = new Vector3View(store.previousPosition, offset3);\n this.previousVelocity = new Vector3View(store.previousVelocity, offset3);\n this.velocity = new Vector3View(store.velocity, offset3);\n this.size = new Vector3View(store.size, offset3);\n this.startSize = new Vector3View(store.startSize, offset3);\n this.color = new Vector4View(store.color, offset4);\n this.startColor = new Vector4View(store.startColor, offset4);\n this.scalars = store.scalars;\n this.scalarOffset = storeIndex * ParticleStore.SCALAR_STRIDE;\n this.size.set(1, 1, 1);\n this.startSize.set(1, 1, 1);\n this.life = 1;\n this.speedModifier = 1;\n }\n /**\n * Moves this particle onto a different store row. The caller is responsible\n * for having moved the row contents too.\n */\n setStoreIndex(index) {\n this.storeIndex = index;\n this.rebind();\n }\n /** Re-points the vector views after the store grew its arrays. */\n rebind() {\n const store = this.store;\n const offset3 = this.storeIndex * 3;\n const offset4 = this.storeIndex * 4;\n this.position.bind(store.position, offset3);\n this.previousPosition.bind(store.previousPosition, offset3);\n this.previousVelocity.bind(store.previousVelocity, offset3);\n this.velocity.bind(store.velocity, offset3);\n this.size.bind(store.size, offset3);\n this.startSize.bind(store.startSize, offset3);\n this.color.bind(store.color, offset4);\n this.startColor.bind(store.startColor, offset4);\n this.scalars = store.scalars;\n this.scalarOffset = this.storeIndex * ParticleStore.SCALAR_STRIDE;\n }\n /**\n * Allocates the trail ring buffers, reusing them when the capacity is unchanged.\n * @param {number} capacity - Number of samples to hold.\n */\n ensureHistoryCapacity(capacity) {\n if (this.historyCapacity === capacity) {\n return;\n }\n this.historyCapacity = capacity;\n this.historyPositions = new Float32Array(capacity * 3);\n this.historySizes = new Float32Array(capacity);\n this.historyColors = new Float32Array(capacity * 4);\n this.historyHead = 0;\n this.historyCount = 0;\n }\n /** Drops every recorded sample without releasing the buffers. */\n resetHistory() {\n this.historyHead = 0;\n this.historyCount = 0;\n }\n /**\n * Ring buffer slot of the i-th sample counting from the oldest one.\n * @param {number} i - Sample offset, `0` being the oldest live sample.\n */\n getHistoryIndex(i) {\n const capacity = this.historyCapacity;\n return (this.historyHead - this.historyCount + capacity + i) % capacity;\n }\n /**\n * Records the current state into the trail ring buffer, or retires the\n * oldest sample once the particle is dead. Allocation free.\n */\n update() {\n this.ensureHistoryCapacity(Math.max(1, Math.ceil(this.length)));\n const capacity = this.historyCapacity;\n if (this.age > this.life) {\n if (this.historyCount > 0) {\n this.historyCount--;\n }\n return;\n }\n const head = this.historyHead;\n const positionIndex = head * 3;\n const positions = this.historyPositions;\n positions[positionIndex] = this.position.x;\n positions[positionIndex + 1] = this.position.y;\n positions[positionIndex + 2] = this.position.z;\n this.historySizes[head] = this.size.x;\n const colorIndex = head * 4;\n const colors = this.historyColors;\n colors[colorIndex] = this.color.x;\n colors[colorIndex + 1] = this.color.y;\n colors[colorIndex + 2] = this.color.z;\n colors[colorIndex + 3] = this.color.w;\n this.historyHead = (head + 1) % capacity;\n if (this.historyCount < capacity) {\n this.historyCount++;\n }\n }\n /**\n * Indicates if the particle has died.\n * @type {boolean}\n */\n get died() {\n return this.age >= this.life;\n }\n /**\n * Resets the particle properties and clears the previous states.\n */\n reset() {\n this.memory.length = 0;\n this.resetHistory();\n }\n}\n\n/**\n * Apply width to particles based on their length.\n */\nclass WidthOverLength {\n initialize(particle) {\n this.width.startGen(particle.memory);\n }\n constructor(width) {\n this.width = width;\n this.type = 'WidthOverLength';\n }\n update(particle) {\n if (!(particle instanceof TrailParticle)) {\n return;\n }\n const count = particle.historyCount;\n if (count === 0) {\n return;\n }\n const capacity = particle.historyCapacity;\n const sizes = particle.historySizes;\n const memory = particle.memory;\n const invLength = 1 / particle.length;\n // Walk the ring buffer oldest-first, wrapping by hand so the loop stays\n // free of divisions.\n let slot = particle.getHistoryIndex(0);\n for (let i = 0; i < count; i++) {\n sizes[slot] = this.width.genValue(memory, (count - i) * invLength);\n slot++;\n if (slot === capacity) {\n slot = 0;\n }\n }\n }\n frameUpdate(delta) { }\n toJSON() {\n return {\n type: this.type,\n width: this.width.toJSON(),\n };\n }\n static fromJSON(json) {\n return new WidthOverLength(ValueGeneratorFromJSON(json.width));\n }\n clone() {\n return new WidthOverLength(this.width.clone());\n }\n reset() { }\n}\n\nconst BehaviorTypes = {\n ApplyForce: {\n type: 'ApplyForce',\n constructor: ApplyForce,\n params: [\n ['direction', ['vec3']],\n ['magnitude', ['value']],\n ],\n loadJSON: ApplyForce.fromJSON,\n },\n Noise: {\n type: 'Noise',\n constructor: Noise,\n params: [\n ['frequency', ['value']],\n ['power', ['value']],\n ['positionAmount', ['value']],\n ['rotationAmount', ['value']],\n ],\n loadJSON: Noise.fromJSON,\n },\n TurbulenceField: {\n type: 'TurbulenceField',\n constructor: TurbulenceField,\n params: [\n ['scale', ['vec3']],\n ['octaves', ['number']],\n ['velocityMultiplier', ['vec3']],\n ['timeScale', ['vec3']],\n ],\n loadJSON: TurbulenceField.fromJSON,\n },\n GravityForce: {\n type: 'GravityForce',\n constructor: GravityForce,\n params: [\n ['center', ['vec3']],\n ['magnitude', ['number']],\n ],\n loadJSON: GravityForce.fromJSON,\n },\n ColorOverLife: {\n type: 'ColorOverLife',\n constructor: ColorOverLife,\n params: [['color', ['colorFunc']]],\n loadJSON: ColorOverLife.fromJSON,\n },\n RotationOverLife: {\n type: 'RotationOverLife',\n constructor: RotationOverLife,\n params: [['angularVelocity', ['value', 'valueFunc']]],\n loadJSON: RotationOverLife.fromJSON,\n },\n Rotation3DOverLife: {\n type: 'Rotation3DOverLife',\n constructor: Rotation3DOverLife,\n params: [['angularVelocity', ['rotationFunc']]],\n loadJSON: Rotation3DOverLife.fromJSON,\n },\n SizeOverLife: {\n type: 'SizeOverLife',\n constructor: SizeOverLife,\n params: [['size', ['value', 'valueFunc', 'vec3Func']]],\n loadJSON: SizeOverLife.fromJSON,\n },\n ColorBySpeed: {\n type: 'ColorBySpeed',\n constructor: ColorBySpeed,\n params: [\n ['color', ['colorFunc']],\n ['speedRange', ['range']],\n ],\n loadJSON: ColorBySpeed.fromJSON,\n },\n RotationBySpeed: {\n type: 'RotationBySpeed',\n constructor: RotationBySpeed,\n params: [\n ['angularVelocity', ['value', 'valueFunc']],\n ['speedRange', ['range']],\n ],\n loadJSON: RotationBySpeed.fromJSON,\n },\n SizeBySpeed: {\n type: 'SizeBySpeed',\n constructor: SizeBySpeed,\n params: [\n ['size', ['value', 'valueFunc', 'vec3Func']],\n ['speedRange', ['range']],\n ],\n loadJSON: SizeBySpeed.fromJSON,\n },\n SpeedOverLife: {\n type: 'SpeedOverLife',\n constructor: SpeedOverLife,\n params: [['speed', ['value', 'valueFunc']]],\n loadJSON: SpeedOverLife.fromJSON,\n },\n FrameOverLife: {\n type: 'FrameOverLife',\n constructor: FrameOverLife,\n params: [['frame', ['value', 'valueFunc']]],\n loadJSON: FrameOverLife.fromJSON,\n },\n ForceOverLife: {\n type: 'ForceOverLife',\n constructor: ForceOverLife,\n params: [\n ['x', ['value', 'valueFunc']],\n ['y', ['value', 'valueFunc']],\n ['z', ['value', 'valueFunc']],\n ],\n loadJSON: ForceOverLife.fromJSON,\n },\n VelocityOverLife: {\n type: 'VelocityOverLife',\n constructor: VelocityOverLife,\n params: [\n ['linearX', ['value', 'valueFunc']],\n ['linearY', ['value', 'valueFunc']],\n ['linearZ', ['value', 'valueFunc']],\n ['orbitalX', ['value', 'valueFunc']],\n ['orbitalY', ['value', 'valueFunc']],\n ['orbitalZ', ['value', 'valueFunc']],\n ['space', ['string']],\n ],\n loadJSON: VelocityOverLife.fromJSON,\n },\n InheritVelocity: {\n type: 'InheritVelocity',\n constructor: InheritVelocity,\n params: [\n ['multiplier', ['value', 'valueFunc']],\n ['mode', ['string']],\n ],\n loadJSON: InheritVelocity.fromJSON,\n },\n OrbitOverLife: {\n type: 'OrbitOverLife',\n constructor: OrbitOverLife,\n params: [\n ['orbitSpeed', ['value', 'valueFunc']],\n ['axis', ['vec3']],\n ],\n loadJSON: OrbitOverLife.fromJSON,\n },\n WidthOverLength: {\n type: 'WidthOverLength',\n constructor: WidthOverLength,\n params: [['width', ['value', 'valueFunc']]],\n loadJSON: WidthOverLength.fromJSON,\n },\n ChangeEmitDirection: {\n type: 'ChangeEmitDirection',\n constructor: ChangeEmitDirection,\n params: [['angle', ['value']]],\n loadJSON: ChangeEmitDirection.fromJSON,\n },\n EmitSubParticleSystem: {\n type: 'EmitSubParticleSystem',\n constructor: EmitSubParticleSystem,\n params: [\n ['particleSystem', ['self']],\n ['useVelocityAsBasis', ['boolean']],\n ['subParticleSystem', ['particleSystem']],\n ['mode', ['number']],\n ['emitProbability', ['number']],\n ],\n loadJSON: EmitSubParticleSystem.fromJSON,\n },\n LimitSpeedOverLife: {\n type: 'LimitSpeedOverLife',\n constructor: LimitSpeedOverLife,\n params: [\n ['speed', ['value', 'valueFunc']],\n ['dampen', ['number']],\n ],\n loadJSON: LimitSpeedOverLife.fromJSON,\n },\n ApplyCollision: {\n type: 'ApplyCollision',\n constructor: ApplyCollision,\n // The resolver is host-provided (getPhysicsResolver), not serialized; only bounce round-trips.\n params: [['bounce', ['number']]],\n loadJSON: ApplyCollision.fromJSON,\n },\n};\nfunction BehaviorFromJSON(json, particleSystem) {\n if (BehaviorTypes[json.type]) {\n return BehaviorTypes[json.type].loadJSON(json, particleSystem);\n }\n return null;\n}\n\n/** Constructors the generated code needs to test a generator's or a particle's kind. */\nconst DEPS = { PiecewiseBezier, Vector3Function, Quaternion };\n/**\n * Source for one behavior, or null when it is not one this module knows.\n *\n * Everything is read out of `behaviors[k]` at pass time rather than captured,\n * so swapping a behavior's generator takes effect on the next frame without\n * recompiling.\n */\nfunction fragmentFor(behavior, k) {\n switch (behavior.type) {\n case 'ColorOverLife':\n return {\n setup: `const g${k} = behaviors[${k}].color;`,\n body: `{const c = p.color, sc = p.startColor;\n g${k}.genColor(p.memory, c, t);\n c.x *= sc.x; c.y *= sc.y; c.z *= sc.z; c.w *= sc.w;}`,\n };\n case 'SizeOverLife':\n return {\n setup: `const g${k} = behaviors[${k}].size;\n const vec3_${k} = g${k} instanceof deps.Vector3Function;`,\n body: `if (vec3_${k}) {\n g${k}.genValue(p.memory, p.size, t).multiply(p.startSize);\n } else {\n const v = g${k}.genValue(p.memory, t);\n const s = p.size, ss = p.startSize;\n s.x = ss.x * v; s.y = ss.y * v; s.z = ss.z * v;\n }`,\n };\n case 'ApplyForce':\n return {\n setup: `const b${k} = behaviors[${k}];\n const f${k} = b${k}.magnitudeValue * delta;\n const dx${k} = b${k}.direction.x * f${k};\n const dy${k} = b${k}.direction.y * f${k};\n const dz${k} = b${k}.direction.z * f${k};`,\n body: `{const v = p.velocity; v.x += dx${k}; v.y += dy${k}; v.z += dz${k};}`,\n };\n case 'RotationOverLife':\n return {\n setup: `const g${k} = behaviors[${k}].angularVelocity;`,\n // The rate is kept on the particle for the renderer, which draws\n // between simulation steps.\n body: `if (typeof p.rotation === 'number') {\n const rate = g${k}.genValue(p.memory, t);\n p.rotation += delta * rate;\n p.angularVelocity = rate;\n }`,\n };\n case 'FrameOverLife':\n return {\n setup: `const g${k} = behaviors[${k}].frame;`,\n body: `p.uvTile = g${k}.type === 'function' ? g${k}.genValue(p.memory, t) : g${k}.genValue(p.memory);`,\n };\n case 'SpeedOverLife':\n return {\n setup: `const g${k} = behaviors[${k}].speed;`,\n body: `p.speedModifier = g${k}.genValue(p.memory, t);`,\n };\n case 'ForceOverLife':\n return {\n setup: `const b${k} = behaviors[${k}];\n const gx${k} = b${k}.x, gy${k} = b${k}.y, gz${k} = b${k}.z;\n const tmp${k} = b${k}._temp, scale${k} = b${k}._tempScale, quat${k} = b${k}._tempQ;\n const local${k} = b${k}.ps !== undefined && !b${k}.ps.worldSpace;`,\n body: `{tmp${k}.set(\n gx${k}.genValue(p.memory, t),\n gy${k}.genValue(p.memory, t),\n gz${k}.genValue(p.memory, t));\n if (local${k}) { tmp${k}.multiply(scale${k}).applyQuaternion(quat${k}); }\n p.velocity.addScaledVector(tmp${k}, delta);}`,\n };\n case 'LimitSpeedOverLife':\n return {\n setup: `const b${k} = behaviors[${k}];\n const g${k} = b${k}.speed;\n const dampen${k} = b${k}.dampen * delta * 20;`,\n body: `{const v = p.velocity;\n const speed = v.length();\n const limit = g${k}.genValue(p.memory, t);\n if (speed > limit) {\n v.multiplyScalar(1 - ((speed - limit) / speed) * dampen${k});\n }}`,\n };\n case 'GravityForce':\n return {\n setup: `const b${k} = behaviors[${k}];\n const cx${k} = b${k}.center.x, cy${k} = b${k}.center.y, cz${k} = b${k}.center.z;\n const gm${k} = b${k}.magnitude * delta;`,\n body: `{const pos = p.position;\n const dx = cx${k} - pos.x, dy = cy${k} - pos.y, dz = cz${k} - pos.z;\n const d2 = dx * dx + dy * dy + dz * dz;\n if (d2 > 0) {\n const s = gm${k} / (d2 * Math.sqrt(d2));\n const v = p.velocity;\n v.x += dx * s; v.y += dy * s; v.z += dz * s;\n }}`,\n };\n case 'ColorBySpeed':\n return {\n setup: `const b${k} = behaviors[${k}];\n const g${k} = b${k}.color;\n const lo${k} = b${k}.speedRange.a;\n const span${k} = b${k}.speedRange.b - lo${k};`,\n body: `{const ts = (p.startSpeed - lo${k}) / span${k};\n const c = p.color, sc = p.startColor;\n g${k}.genColor(p.memory, c, ts);\n c.x *= sc.x; c.y *= sc.y; c.z *= sc.z; c.w *= sc.w;}`,\n };\n case 'SizeBySpeed':\n return {\n setup: `const b${k} = behaviors[${k}];\n const g${k} = b${k}.size;\n const lo${k} = b${k}.speedRange.a;\n const span${k} = b${k}.speedRange.b - lo${k};\n const vec3_${k} = g${k} instanceof deps.Vector3Function;`,\n body: `{const ts = (p.startSpeed - lo${k}) / span${k};\n if (vec3_${k}) {\n g${k}.genValue(p.memory, p.size, ts).multiply(p.startSize);\n } else {\n const v = g${k}.genValue(p.memory, ts);\n const s = p.size, ss = p.startSize;\n s.x = ss.x * v; s.y = ss.y * v; s.z = ss.z * v;\n }}`,\n };\n case 'RotationBySpeed':\n return {\n setup: `const b${k} = behaviors[${k}];\n const g${k} = b${k}.angularVelocity;\n const lo${k} = b${k}.speedRange.a;\n const span${k} = b${k}.speedRange.b - lo${k};`,\n body: `if (typeof p.rotation === 'number') {\n const rate = g${k}.genValue(p.memory, (p.startSpeed - lo${k}) / span${k});\n p.rotation += delta * rate;\n p.angularVelocity = rate;\n }`,\n };\n case 'OrbitOverLife':\n return {\n setup: `const b${k} = behaviors[${k}];\n const g${k} = b${k}.orbitSpeed;\n const axis${k} = b${k}.axis, tmp${k} = b${k}.temp, rot${k} = b${k}.rotation;`,\n body: `{const pos = p.position;\n tmp${k}.copy(pos).projectOnVector(axis${k});\n rot${k}.setFromAxisAngle(axis${k}, g${k}.genValue(p.memory, t) * delta);\n pos.sub(tmp${k});\n pos.applyQuaternion(rot${k});\n pos.add(tmp${k});}`,\n };\n case 'Rotation3DOverLife':\n return {\n setup: `const b${k} = behaviors[${k}];\n const g${k} = b${k}.angularVelocity;\n const q${k} = b${k}.tempQuat;`,\n // Only particles whose rotation is a quaternion take part; a\n // sprite billboard rotating by an angle is left alone, exactly\n // as the behavior's own update does.\n body: `{const r = p.rotation;\n if (r instanceof deps.Quaternion) {\n g${k}.genValue(p.memory, q${k}, delta, t);\n r.multiply(q${k});\n const step = p.angularVelocity;\n if (step instanceof deps.Quaternion) { step.copy(q${k}); }\n }}`,\n };\n case 'VelocityOverLife':\n return {\n setup: `const b${k} = behaviors[${k}];\n const lx${k} = b${k}.linearX, ly${k} = b${k}.linearY, lz${k} = b${k}.linearZ;\n const ox${k} = b${k}.orbitalX, oy${k} = b${k}.orbitalY, oz${k} = b${k}.orbitalZ;\n const tmp${k} = b${k}._temp, rot${k} = b${k}._tempRot;\n const ax${k} = b${k}._axisX, ay${k} = b${k}._axisY, az${k} = b${k}._axisZ;\n const pivot${k} = b${k}._tempEmitterPos;\n const world${k} = b${k}.ps !== undefined && b${k}.ps.worldSpace;\n const toWorld${k} = world${k} && b${k}.space === 'local';\n const convert${k} = toWorld${k} || (!world${k} && b${k}.space === 'world');\n const scale${k} = toWorld${k} ? b${k}._tempScale : b${k}._tempScaleInv;\n const quat${k} = toWorld${k} ? b${k}._tempQ : b${k}._tempQInv;`,\n body: `{const pos = p.position;\n tmp${k}.set(\n lx${k}.genValue(p.memory, t),\n ly${k}.genValue(p.memory, t),\n lz${k}.genValue(p.memory, t));\n if (convert${k}) { tmp${k}.multiply(scale${k}).applyQuaternion(quat${k}); }\n pos.addScaledVector(tmp${k}, delta);\n const rx = ox${k}.genValue(p.memory, t) * delta;\n const ry = oy${k}.genValue(p.memory, t) * delta;\n const rz = oz${k}.genValue(p.memory, t) * delta;\n if (rx !== 0 || ry !== 0 || rz !== 0) {\n if (world${k}) { pos.sub(pivot${k}); }\n if (rx !== 0) { rot${k}.setFromAxisAngle(ax${k}, rx); pos.applyQuaternion(rot${k}); }\n if (ry !== 0) { rot${k}.setFromAxisAngle(ay${k}, ry); pos.applyQuaternion(rot${k}); }\n if (rz !== 0) { rot${k}.setFromAxisAngle(az${k}, rz); pos.applyQuaternion(rot${k}); }\n if (world${k}) { pos.add(pivot${k}); }\n }}`,\n };\n case 'InheritVelocity':\n return {\n setup: `const b${k} = behaviors[${k}];\n const ps${k} = b${k}.ps;\n const velocity${k} = b${k}.mode === 'current' && ps${k} !== undefined\n ? ps${k}.emitterVelocity : undefined;\n const tmp${k} = b${k}._temp;\n const local${k} = velocity${k} !== undefined && !ps${k}.worldSpace;\n const scale${k} = b${k}._tempScaleInv, quat${k} = b${k}._tempQInv;\n const gm${k} = b${k}.multiplier;`,\n body: `if (velocity${k} !== undefined) {\n tmp${k}.copy(velocity${k});\n if (local${k}) { tmp${k}.multiply(scale${k}).applyQuaternion(quat${k}); }\n p.position.addScaledVector(tmp${k}, gm${k}.genValue(p.memory, t) * delta);\n }`,\n };\n default:\n return null;\n }\n}\n/**\n * Compiled passes shared by every system whose behaviors line up the same way.\n *\n * The generated code depends only on the behavior types and their positions, so\n * a scene full of copies of one effect compiles once rather than once per\n * system. `null` records a shape that could not be compiled, so an environment\n * without code generation does not retry on every system.\n */\nconst passCache = new Map();\n/**\n * Compiles the fragments of a run into one pass, reusing an earlier compile of\n * the same shape. Returns undefined when the environment forbids code\n * generation.\n */\nfunction compile(fragments, key) {\n const cached = passCache.get(key);\n if (cached !== undefined) {\n return cached ?? undefined;\n }\n const compiled = generate(fragments);\n passCache.set(key, compiled ?? null);\n return compiled;\n}\nfunction generate(fragments) {\n const source = `\n ${fragments.map((f) => f.setup).join('\\n')}\n for (let i = 0; i < count; i++) {\n const p = particles[i];\n if (p.age >= p.life) continue;\n const t = p.age / p.life;\n ${fragments.map((f) => f.body).join('\\n')}\n }`;\n try {\n // eslint-disable-next-line @typescript-eslint/no-implied-eval\n const factory = new Function('deps', `return function (behaviors, particles, count, delta) {${source}};`);\n return factory(DEPS);\n }\n catch (error) {\n // A page served under a Content-Security-Policy without 'unsafe-eval'\n // cannot build functions at runtime. Behaviors then keep their own\n // passes, which is only slower, never wrong.\n return undefined;\n }\n}\n/**\n * Splits `behaviors` into steps, merging consecutive recognised ones.\n *\n * Only consecutive behaviors are merged: a behavior that stays on its own must\n * still see the particles exactly where the original order left them.\n */\nfunction planBehaviorFusion(behaviors) {\n const steps = [];\n let runBehaviors = [];\n let runFragments = [];\n let runStart = 0;\n const flush = () => {\n if (runFragments.length === 0) {\n return;\n }\n // A single behavior gains nothing from being wrapped in generated code.\n const key = `${runStart}:${runBehaviors.map((b) => b.type).join(',')}`;\n const run = runFragments.length > 1 ? compile(runFragments, key) : undefined;\n if (run !== undefined) {\n steps.push({ behaviors: runBehaviors, run });\n }\n else {\n for (const behavior of runBehaviors) {\n steps.push({ behaviors: [behavior] });\n }\n }\n runBehaviors = [];\n runFragments = [];\n };\n for (let i = 0; i < behaviors.length; i++) {\n const behavior = behaviors[i];\n const fragment = fragmentFor(behavior, i);\n if (fragment === null) {\n flush();\n steps.push({ behaviors: [behavior] });\n continue;\n }\n if (runFragments.length === 0) {\n runStart = i;\n }\n runBehaviors.push(behavior);\n runFragments.push(fragment);\n }\n flush();\n return steps;\n}\n\n/**\n * Which part of the box particles start from.\n */\nvar BoxEmitFrom;\n(function (BoxEmitFrom) {\n /** Anywhere inside the box. */\n BoxEmitFrom[BoxEmitFrom[\"Volume\"] = 0] = \"Volume\";\n /** On the six faces. */\n BoxEmitFrom[BoxEmitFrom[\"Shell\"] = 1] = \"Shell\";\n /** On the twelve edges. */\n BoxEmitFrom[BoxEmitFrom[\"Edge\"] = 2] = \"Edge\";\n})(BoxEmitFrom || (BoxEmitFrom = {}));\n/**\n * A particle emitter that emits particles from a box centered on the emitter, all moving along +Z\n * like Unity's Box shape. A box with no depth is a flat rectangle (Unity's Rectangle shape).\n */\nclass BoxEmitter {\n constructor(parameters = {}) {\n this.type = 'box';\n this._point = [0, 0, 0];\n this.width = parameters.width ?? 1;\n this.height = parameters.height ?? 1;\n this.depth = parameters.depth ?? 1;\n this.emitFrom = parameters.emitFrom ?? BoxEmitFrom.Volume;\n this.boxThickness = parameters.boxThickness ? [...parameters.boxThickness] : [0, 0, 0];\n }\n update(_system, _delta) { }\n initialize(p, _emissionState) {\n const point = this._point;\n for (let axis = 0; axis < 3; axis++) {\n point[axis] = Math.random() * 2 - 1;\n }\n // Unity picks the face (or the edge direction) evenly per axis rather than by area.\n const axis = Math.floor(Math.random() * 3) % 3;\n if (this.emitFrom === BoxEmitFrom.Shell) {\n point[axis] = this.onSurface(axis);\n }\n else if (this.emitFrom === BoxEmitFrom.Edge) {\n point[(axis + 1) % 3] = this.onSurface((axis + 1) % 3);\n point[(axis + 2) % 3] = this.onSurface((axis + 2) % 3);\n }\n p.position.set((point[0] * this.width) / 2, (point[1] * this.height) / 2, (point[2] * this.depth) / 2);\n p.velocity.set(0, 0, p.startSpeed);\n }\n /**\n * A coordinate on one of the two faces across `axis`, in -1..1. As measured in Unity, a\n * thickness leaves half the particles on the face and sinks the rest evenly up to\n * 2 × thickness of the half-size into the box.\n */\n onSurface(axis) {\n const side = Math.random() < 0.5 ? -1 : 1;\n const thickness = this.boxThickness[axis];\n if (thickness <= 0 || Math.random() < 0.5) {\n return side;\n }\n return side * (1 - 2 * thickness * Math.random());\n }\n toJSON() {\n return {\n type: 'box',\n width: this.width,\n height: this.height,\n depth: this.depth,\n emitFrom: this.emitFrom,\n boxThickness: [...this.boxThickness],\n };\n }\n static fromJSON(json) {\n return new BoxEmitter({\n width: json.width,\n height: json.height,\n depth: json.depth,\n emitFrom: json.emitFrom,\n boxThickness: Array.isArray(json.boxThickness) ? json.boxThickness : undefined,\n });\n }\n clone() {\n return new BoxEmitter({\n width: this.width,\n height: this.height,\n depth: this.depth,\n emitFrom: this.emitFrom,\n boxThickness: this.boxThickness,\n });\n }\n}\n\n/**\n * Enum representing the emitter modes for particles.\n */\nvar EmitterMode;\n(function (EmitterMode) {\n /**\n * Emit particles randomly over the specified duration.\n */\n EmitterMode[EmitterMode[\"Random\"] = 0] = \"Random\";\n /**\n * Emit particles in a continuous loop.\n */\n EmitterMode[EmitterMode[\"Loop\"] = 1] = \"Loop\";\n /**\n * Emit particles back and forth in a ping-pong manner.\n */\n EmitterMode[EmitterMode[\"PingPong\"] = 2] = \"PingPong\";\n /**\n * Emit particles in bursts.\n */\n EmitterMode[EmitterMode[\"Burst\"] = 3] = \"Burst\";\n})(EmitterMode || (EmitterMode = {}));\nfunction getValueFromEmitterMode(mode, currentValue, spread, emissionState) {\n let u;\n if (EmitterMode.Random === mode) {\n currentValue = Math.random();\n }\n else if (EmitterMode.Burst === mode && emissionState.isBursting) {\n currentValue = emissionState.burstParticleIndex / emissionState.burstParticleCount;\n }\n if (spread > 0) {\n u = Math.floor(currentValue / spread) * spread;\n }\n else {\n u = currentValue;\n }\n switch (mode) {\n case EmitterMode.Loop:\n u = u % 1;\n break;\n case EmitterMode.PingPong:\n u = Math.abs((u % 2) - 1);\n break;\n }\n return u;\n}\n\n/**\n * Local transform of an emitter shape inside its particle system, like the\n * Position / Rotation / Scale of Unity's Shape module.\n *\n * A spawn point `p` lands at `position + rotation * (scale * p)`. The start\n * direction goes through the same scale and rotation and is then brought back\n * to its old length, so a squashed shape bends directions without changing the\n * start speed — which is what Unity does.\n */\nclass ShapeTransform {\n constructor(position, rotation, scale) {\n this.position = position ?? new Vector3();\n this.rotation = rotation ?? new Quaternion();\n this.scale = scale ?? new Vector3(1, 1, 1);\n }\n /** Moves a freshly initialized particle from shape space into system space. */\n apply(p) {\n p.position.multiply(this.scale).applyQuaternion(this.rotation).add(this.position);\n const velocity = p.velocity;\n const speed = velocity.length();\n if (speed === 0) {\n return;\n }\n velocity.multiply(this.scale).applyQuaternion(this.rotation);\n const length = velocity.length();\n if (length > 0) {\n velocity.multiplyScalar(speed / length);\n }\n }\n isIdentity() {\n const { position: t, rotation: r, scale: s } = this;\n return (t.x === 0 &&\n t.y === 0 &&\n t.z === 0 &&\n r.x === 0 &&\n r.y === 0 &&\n r.z === 0 &&\n r.w === 1 &&\n s.x === 1 &&\n s.y === 1 &&\n s.z === 1);\n }\n toJSON() {\n const json = {};\n const { position: t, rotation: r, scale: s } = this;\n if (t.x !== 0 || t.y !== 0 || t.z !== 0)\n json.position = [t.x, t.y, t.z];\n if (r.x !== 0 || r.y !== 0 || r.z !== 0 || r.w !== 1)\n json.rotation = [r.x, r.y, r.z, r.w];\n if (s.x !== 1 || s.y !== 1 || s.z !== 1)\n json.scale = [s.x, s.y, s.z];\n return json;\n }\n /** Returns undefined when there is no transform in the JSON. */\n static fromJSON(json) {\n if (!json) {\n return undefined;\n }\n const { position: t, rotation: r, scale: s } = json;\n return new ShapeTransform(t ? new Vector3(t[0], t[1], t[2]) : undefined, r ? new Quaternion(r[0], r[1], r[2], r[3]) : undefined, s ? new Vector3(s[0], s[1], s[2]) : undefined);\n }\n /**\n * The `transform` entry of a shape's JSON: empty when the shape has no\n * transform or an identity one, so shapes without one serialize as before.\n */\n static toShapeJSON(transform) {\n return transform && !transform.isIdentity() ? { transform: transform.toJSON() } : {};\n }\n clone() {\n return new ShapeTransform(this.position.clone(), this.rotation.clone(), this.scale.clone());\n }\n}\n\n/**\n * a particle emitter that emits particles from a circle.\n */\nclass CircleEmitter {\n constructor(parameters = {}) {\n this.type = 'circle';\n this.currentValue = 0;\n this.radius = parameters.radius ?? 10;\n this.arc = parameters.arc ?? 2.0 * Math.PI;\n this.thickness = parameters.thickness ?? 1;\n this.mode = parameters.mode ?? EmitterMode.Random;\n this.spread = parameters.spread ?? 0;\n this.speed = parameters.speed ?? new ConstantValue(1);\n this.memory = [];\n this.transform = parameters.transform;\n }\n update(system, delta) {\n this.currentValue += this.speed.genValue(this.memory, system.emissionState.time / system.duration) * delta;\n }\n initialize(p, emissionState) {\n const u = getValueFromEmitterMode(this.mode, this.currentValue, this.spread, emissionState);\n const r = MathUtils.lerp(1 - this.thickness, 1, Math.random());\n const theta = u * this.arc;\n p.position.x = Math.cos(theta);\n p.position.y = Math.sin(theta);\n p.position.z = 0;\n p.velocity.copy(p.position).multiplyScalar(p.startSpeed);\n //const v = Math.random();\n p.position.multiplyScalar(this.radius * r);\n this.transform?.apply(p);\n }\n toJSON() {\n return {\n type: 'circle',\n radius: this.radius,\n arc: this.arc,\n thickness: this.thickness,\n mode: this.mode,\n spread: this.spread,\n speed: this.speed.toJSON(),\n ...ShapeTransform.toShapeJSON(this.transform),\n };\n }\n static fromJSON(json) {\n return new CircleEmitter({\n radius: json.radius,\n arc: json.arc,\n thickness: json.thickness,\n mode: json.mode,\n speed: json.speed ? ValueGeneratorFromJSON(json.speed) : undefined,\n transform: ShapeTransform.fromJSON(json.transform),\n spread: json.spread,\n });\n }\n clone() {\n return new CircleEmitter({\n radius: this.radius,\n arc: this.arc,\n thickness: this.thickness,\n mode: this.mode,\n speed: this.speed.clone(),\n transform: this.transform?.clone(),\n spread: this.spread,\n });\n }\n}\n\nclass ConeEmitter {\n constructor(parameters = {}) {\n this.type = 'cone';\n this.currentValue = 0;\n this.radius = parameters.radius ?? 10;\n this.arc = parameters.arc ?? 2.0 * Math.PI;\n this.thickness = parameters.thickness ?? 1;\n this.angle = parameters.angle ?? Math.PI / 6;\n this.mode = parameters.mode ?? EmitterMode.Random;\n this.spread = parameters.spread ?? 0;\n this.speed = parameters.speed ?? new ConstantValue(1);\n this.memory = [];\n this.transform = parameters.transform;\n }\n update(system, delta) {\n if (EmitterMode.Random != this.mode) {\n this.currentValue += this.speed.genValue(this.memory, system.emissionState.time / system.duration) * delta;\n }\n }\n initialize(p, emissionState) {\n const u = getValueFromEmitterMode(this.mode, this.currentValue, this.spread, emissionState);\n const rand = MathUtils.lerp(1 - this.thickness, 1, Math.random());\n const theta = u * this.arc;\n const r = Math.sqrt(rand);\n const sinTheta = Math.sin(theta);\n const cosTheta = Math.cos(theta);\n p.position.x = r * cosTheta;\n p.position.y = r * sinTheta;\n p.position.z = 0;\n const angle = this.angle * r;\n p.velocity.set(0, 0, Math.cos(angle)).addScaledVector(p.position, Math.sin(angle)).multiplyScalar(p.startSpeed);\n //const v = Math.random();\n p.position.multiplyScalar(this.radius);\n this.transform?.apply(p);\n }\n toJSON() {\n return {\n type: 'cone',\n radius: this.radius,\n arc: this.arc,\n thickness: this.thickness,\n angle: this.angle,\n mode: this.mode,\n spread: this.spread,\n speed: this.speed.toJSON(),\n ...ShapeTransform.toShapeJSON(this.transform),\n };\n }\n static fromJSON(json) {\n return new ConeEmitter({\n radius: json.radius,\n arc: json.arc,\n thickness: json.thickness,\n angle: json.angle,\n mode: json.mode,\n speed: json.speed ? ValueGeneratorFromJSON(json.speed) : undefined,\n transform: ShapeTransform.fromJSON(json.transform),\n spread: json.spread,\n });\n }\n clone() {\n return new ConeEmitter({\n radius: this.radius,\n arc: this.arc,\n thickness: this.thickness,\n angle: this.angle,\n mode: this.mode,\n speed: this.speed.clone(),\n transform: this.transform?.clone(),\n spread: this.spread,\n });\n }\n}\n\nclass DonutEmitter {\n constructor(parameters = {}) {\n this.type = 'donut';\n this.currentValue = 0;\n this.radius = parameters.radius ?? 10;\n this.arc = parameters.arc ?? 2.0 * Math.PI;\n this.thickness = parameters.thickness ?? 1;\n this.donutRadius = parameters.donutRadius ?? this.radius * 0.2;\n this.mode = parameters.mode ?? EmitterMode.Random;\n this.spread = parameters.spread ?? 0;\n this.speed = parameters.speed ?? new ConstantValue(1);\n this.memory = [];\n this.transform = parameters.transform;\n this._m1 = new Matrix4();\n }\n update(system, delta) {\n if (EmitterMode.Random != this.mode) {\n this.currentValue += this.speed.genValue(this.memory, system.emissionState.time / system.duration) * delta;\n }\n }\n initialize(p, emissionState) {\n const u = getValueFromEmitterMode(this.mode, this.currentValue, this.spread, emissionState);\n const v = Math.random();\n const rand = MathUtils.lerp(1 - this.thickness, 1, Math.random());\n const theta = u * this.arc;\n const phi = v * Math.PI * 2;\n //const r = Math.sqrt(rand);\n const sinTheta = Math.sin(theta);\n const cosTheta = Math.cos(theta);\n p.position.x = this.radius * cosTheta;\n p.position.y = this.radius * sinTheta;\n p.position.z = 0;\n p.velocity.z = this.donutRadius * rand * Math.sin(phi);\n p.velocity.x = this.donutRadius * rand * Math.cos(phi) * cosTheta;\n p.velocity.y = this.donutRadius * rand * Math.cos(phi) * sinTheta;\n p.position.add(p.velocity);\n p.velocity.normalize().multiplyScalar(p.startSpeed);\n //const angle = this.angle * r;\n //p.velocity.set(0, 0, Math.cos(angle)).addScaledVector(p.position, Math.sin(angle)).multiplyScalar(p.startSpeed);\n //const v = Math.random();\n //.multiplyScalar(this.radius);\n // Default facing-velocity orientation, but defer to startRotation if set.\n if (p.rotation instanceof Quaternion) {\n const r = p.rotation;\n if (r.x === 0 && r.y === 0 && r.z === 0 && r.w === 1) {\n this._m1.lookAt(ZERO_VEC3, p.velocity, UP_VEC3);\n p.rotation.setFromRotationMatrix(this._m1);\n }\n }\n this.transform?.apply(p);\n }\n toJSON() {\n return {\n type: 'donut',\n radius: this.radius,\n arc: this.arc,\n thickness: this.thickness,\n donutRadius: this.donutRadius,\n mode: this.mode,\n spread: this.spread,\n speed: this.speed.toJSON(),\n ...ShapeTransform.toShapeJSON(this.transform),\n };\n }\n static fromJSON(json) {\n return new DonutEmitter({\n radius: json.radius,\n arc: json.arc,\n thickness: json.thickness,\n donutRadius: json.donutRadius,\n mode: json.mode,\n speed: json.speed ? ValueGeneratorFromJSON(json.speed) : undefined,\n transform: ShapeTransform.fromJSON(json.transform),\n spread: json.spread,\n });\n }\n clone() {\n return new DonutEmitter({\n radius: this.radius,\n arc: this.arc,\n thickness: this.thickness,\n donutRadius: this.donutRadius,\n mode: this.mode,\n speed: this.speed.clone(),\n transform: this.transform?.clone(),\n spread: this.spread,\n });\n }\n}\n\n/**\n * A particle emitter that emits particles from a line along X, all moving along +Y like Unity's\n * single-sided Edge shape.\n */\nclass EdgeEmitter {\n constructor(parameters = {}) {\n this.type = 'edge';\n this.currentValue = 0;\n this.radius = parameters.radius ?? 1;\n this.mode = parameters.mode ?? EmitterMode.Random;\n this.spread = parameters.spread ?? 0;\n this.speed = parameters.speed ?? new ConstantValue(1);\n this.memory = [];\n }\n update(system, delta) {\n if (EmitterMode.Random != this.mode) {\n this.currentValue += this.speed.genValue(this.memory, system.emissionState.time / system.duration) * delta;\n }\n }\n initialize(p, emissionState) {\n const u = getValueFromEmitterMode(this.mode, this.currentValue, this.spread, emissionState);\n p.position.set((u * 2 - 1) * this.radius, 0, 0);\n p.velocity.set(0, p.startSpeed, 0);\n }\n toJSON() {\n return {\n type: 'edge',\n radius: this.radius,\n mode: this.mode,\n spread: this.spread,\n speed: this.speed.toJSON(),\n };\n }\n static fromJSON(json) {\n return new EdgeEmitter({\n radius: json.radius,\n mode: json.mode,\n speed: json.speed ? ValueGeneratorFromJSON(json.speed) : undefined,\n spread: json.spread,\n });\n }\n clone() {\n return new EdgeEmitter({\n radius: this.radius,\n mode: this.mode,\n speed: this.speed.clone(),\n spread: this.spread,\n });\n }\n}\n\nclass GridEmitter {\n constructor(parameters = {}) {\n this.type = 'grid';\n this.width = parameters.width ?? 1;\n this.height = parameters.height ?? 1;\n this.column = parameters.column ?? 10;\n this.row = parameters.row ?? 10;\n this.transform = parameters.transform;\n }\n initialize(p) {\n const r = Math.floor(Math.random() * this.row);\n const c = Math.floor(Math.random() * this.column);\n p.position.x = (c * this.width) / this.column - this.width / 2;\n p.position.y = (r * this.height) / this.row - this.height / 2;\n p.position.z = 0;\n p.velocity.set(0, 0, p.startSpeed);\n this.transform?.apply(p);\n }\n toJSON() {\n return {\n type: 'grid',\n width: this.width,\n height: this.height,\n column: this.column,\n row: this.row,\n ...ShapeTransform.toShapeJSON(this.transform),\n };\n }\n static fromJSON(json) {\n return new GridEmitter({ ...json, transform: ShapeTransform.fromJSON(json.transform) });\n }\n clone() {\n return new GridEmitter({\n width: this.width,\n height: this.height,\n column: this.column,\n row: this.row,\n transform: this.transform?.clone(),\n });\n }\n update(system, delta) { }\n}\n\nclass HemisphereEmitter {\n constructor(parameters = {}) {\n this.type = 'hemisphere';\n this.currentValue = 0;\n this.radius = parameters.radius ?? 10;\n this.arc = parameters.arc ?? 2.0 * Math.PI;\n this.thickness = parameters.thickness ?? 1;\n this.mode = parameters.mode ?? EmitterMode.Random;\n this.spread = parameters.spread ?? 0;\n this.speed = parameters.speed ?? new ConstantValue(1);\n this.memory = [];\n this.transform = parameters.transform;\n this._m1 = new Matrix4();\n }\n update(system, delta) {\n if (EmitterMode.Random != this.mode) {\n this.currentValue += this.speed.genValue(this.memory, system.emissionState.time / system.duration) * delta;\n }\n }\n initialize(p, emissionState) {\n const u = getValueFromEmitterMode(this.mode, this.currentValue, this.spread, emissionState);\n const v = Math.random();\n const rand = MathUtils.lerp(1 - this.thickness, 1, Math.random());\n const theta = u * this.arc;\n const phi = Math.acos(v);\n //const r = Math.cbrt(rand);\n const sinTheta = Math.sin(theta);\n const cosTheta = Math.cos(theta);\n const sinPhi = Math.sin(phi);\n const cosPhi = Math.cos(phi);\n p.position.x = sinPhi * cosTheta;\n p.position.y = sinPhi * sinTheta;\n p.position.z = cosPhi;\n p.velocity.copy(p.position).multiplyScalar(p.startSpeed);\n p.position.multiplyScalar(this.radius * rand);\n // Default facing-outward orientation, but defer to startRotation if set.\n if (p.rotation instanceof Quaternion) {\n const r = p.rotation;\n if (r.x === 0 && r.y === 0 && r.z === 0 && r.w === 1) {\n this._m1.lookAt(ZERO_VEC3, p.position, UP_VEC3);\n p.rotation.setFromRotationMatrix(this._m1);\n }\n }\n this.transform?.apply(p);\n }\n toJSON() {\n return {\n type: 'hemisphere',\n radius: this.radius,\n arc: this.arc,\n thickness: this.thickness,\n mode: this.mode,\n spread: this.spread,\n speed: this.speed.toJSON(),\n ...ShapeTransform.toShapeJSON(this.transform),\n };\n }\n static fromJSON(json) {\n return new HemisphereEmitter({\n radius: json.radius,\n arc: json.arc,\n thickness: json.thickness,\n mode: json.mode,\n speed: json.speed ? ValueGeneratorFromJSON(json.speed) : undefined,\n transform: ShapeTransform.fromJSON(json.transform),\n spread: json.spread,\n });\n }\n clone() {\n return new HemisphereEmitter({\n radius: this.radius,\n arc: this.arc,\n thickness: this.thickness,\n mode: this.mode,\n speed: this.speed.clone(),\n transform: this.transform?.clone(),\n spread: this.spread,\n });\n }\n}\n\n/**\n * A point emitter emits particles from a single point.\n */\nclass PointEmitter {\n constructor(transform) {\n this.type = 'point';\n this._m1 = new Matrix4();\n this.transform = transform;\n }\n update(system, delta) { }\n initialize(p) {\n const u = Math.random();\n const v = Math.random();\n const theta = u * Math.PI * 2;\n const phi = Math.acos(2.0 * v - 1.0);\n const r = Math.cbrt(Math.random());\n const sinTheta = Math.sin(theta);\n const cosTheta = Math.cos(theta);\n const sinPhi = Math.sin(phi);\n const cosPhi = Math.cos(phi);\n p.velocity.x = r * sinPhi * cosTheta;\n p.velocity.y = r * sinPhi * sinTheta;\n p.velocity.z = r * cosPhi;\n p.velocity.multiplyScalar(p.startSpeed);\n p.position.setScalar(0);\n // Only set a default facing-along-velocity orientation if the user's\n // startRotation didn't already write a non-identity rotation.\n // (lookAt(ZERO, p.position, UP) would be degenerate here since\n // p.position is zero — use velocity instead.)\n if (p.rotation instanceof Quaternion) {\n const r = p.rotation;\n if (r.x === 0 && r.y === 0 && r.z === 0 && r.w === 1) {\n this._m1.lookAt(ZERO_VEC3, p.velocity, UP_VEC3);\n p.rotation.setFromRotationMatrix(this._m1);\n }\n }\n this.transform?.apply(p);\n }\n toJSON() {\n return {\n type: 'point',\n ...ShapeTransform.toShapeJSON(this.transform),\n };\n }\n static fromJSON(json) {\n return new PointEmitter(ShapeTransform.fromJSON(json?.transform));\n }\n clone() {\n return new PointEmitter(this.transform?.clone());\n }\n}\n\nclass SphereEmitter {\n constructor(parameters = {}) {\n this.type = 'sphere';\n this.currentValue = 0;\n this.radius = parameters.radius ?? 10;\n this.arc = parameters.arc ?? 2.0 * Math.PI;\n this.thickness = parameters.thickness ?? 1;\n this.mode = parameters.mode ?? EmitterMode.Random;\n this.spread = parameters.spread ?? 0;\n this.speed = parameters.speed ?? new ConstantValue(1);\n this.memory = [];\n this.transform = parameters.transform;\n this._m1 = new Matrix4();\n }\n update(system, delta) {\n if (EmitterMode.Random != this.mode) {\n this.currentValue += this.speed.genValue(this.memory, system.emissionState.time / system.duration) * delta;\n }\n }\n initialize(p, emissionState) {\n const u = getValueFromEmitterMode(this.mode, this.currentValue, this.spread, emissionState);\n const v = Math.random();\n const rand = MathUtils.lerp(1 - this.thickness, 1, Math.random());\n const theta = u * this.arc;\n const phi = Math.acos(2.0 * v - 1.0);\n const sinTheta = Math.sin(theta);\n const cosTheta = Math.cos(theta);\n const sinPhi = Math.sin(phi);\n const cosPhi = Math.cos(phi);\n p.position.x = sinPhi * cosTheta;\n p.position.y = sinPhi * sinTheta;\n p.position.z = cosPhi;\n p.velocity.copy(p.position).multiplyScalar(p.startSpeed);\n p.position.multiplyScalar(this.radius * rand);\n // Default facing-outward orientation, but defer to startRotation if set.\n if (p.rotation instanceof Quaternion) {\n const r = p.rotation;\n if (r.x === 0 && r.y === 0 && r.z === 0 && r.w === 1) {\n this._m1.lookAt(ZERO_VEC3, p.position, UP_VEC3);\n p.rotation.setFromRotationMatrix(this._m1);\n }\n }\n this.transform?.apply(p);\n }\n toJSON() {\n return {\n type: 'sphere',\n radius: this.radius,\n arc: this.arc,\n thickness: this.thickness,\n mode: this.mode,\n spread: this.spread,\n speed: this.speed.toJSON(),\n ...ShapeTransform.toShapeJSON(this.transform),\n };\n }\n static fromJSON(json) {\n return new SphereEmitter({\n radius: json.radius,\n arc: json.arc,\n thickness: json.thickness,\n mode: json.mode,\n speed: json.speed ? ValueGeneratorFromJSON(json.speed) : undefined,\n transform: ShapeTransform.fromJSON(json.transform),\n spread: json.spread,\n });\n }\n clone() {\n return new SphereEmitter({\n radius: this.radius,\n arc: this.arc,\n thickness: this.thickness,\n mode: this.mode,\n speed: this.speed.clone(),\n transform: this.transform?.clone(),\n spread: this.spread,\n });\n }\n}\n\n/**\n * a particle emitter that emits particles from a rectangle.\n */\nclass RectangleEmitter {\n constructor(parameters = {}) {\n this.type = 'rectangle';\n this.currentValue = 0;\n this.width = parameters.width ?? 10;\n this.height = parameters.height ?? 10;\n this.thickness = parameters.thickness ?? 1;\n this.mode = parameters.mode ?? EmitterMode.Random;\n this.spread = parameters.spread ?? 0;\n this.speed = parameters.speed ?? new ConstantValue(1);\n this.memory = [];\n this.transform = parameters.transform;\n this._m1 = new Matrix4();\n }\n update(system, delta) {\n this.currentValue += this.speed.genValue(this.memory, system.emissionState.time / system.duration) * delta;\n }\n initialize(p, emissionState) {\n const u = getValueFromEmitterMode(this.mode, this.currentValue, this.spread, emissionState);\n // Calculate perimeter points\n const totalPerimeter = 2 * (this.width + this.height);\n const point = u * totalPerimeter;\n // Map perimeter position to x,y coordinates\n let x, y;\n if (point < this.width) {\n // Bottom edge\n x = point - this.width / 2;\n y = -this.height / 2;\n }\n else if (point < this.width + this.height) {\n // Right edge\n x = this.width / 2;\n y = point - this.width - this.height / 2;\n }\n else if (point < 2 * this.width + this.height) {\n // Top edge\n x = this.width / 2 - (point - this.width - this.height);\n y = this.height / 2;\n }\n else {\n // Left edge\n x = -this.width / 2;\n y = this.height / 2 - (point - 2 * this.width - this.height);\n }\n // Apply thickness - lerp from edge point toward center\n const rand = Math.random();\n const thicknessScale = 1 - this.thickness * rand;\n p.position.x = x * thicknessScale;\n p.position.y = y * thicknessScale;\n p.position.z = 0;\n // Set velocity outward from center\n p.velocity.x = x;\n p.velocity.y = y;\n p.velocity.z = 0;\n p.velocity.normalize().multiplyScalar(p.startSpeed);\n // Default facing-velocity orientation, but defer to startRotation if set.\n if (p.rotation instanceof Quaternion) {\n const r = p.rotation;\n if (r.x === 0 && r.y === 0 && r.z === 0 && r.w === 1) {\n this._m1.lookAt(ZERO_VEC3, p.velocity, UP_VEC3);\n p.rotation.setFromRotationMatrix(this._m1);\n }\n }\n this.transform?.apply(p);\n }\n toJSON() {\n return {\n type: 'rectangle',\n width: this.width,\n height: this.height,\n thickness: this.thickness,\n mode: this.mode,\n spread: this.spread,\n speed: this.speed.toJSON(),\n ...ShapeTransform.toShapeJSON(this.transform),\n };\n }\n static fromJSON(json) {\n return new RectangleEmitter({\n width: json.width,\n height: json.height,\n thickness: json.thickness,\n mode: json.mode,\n speed: json.speed ? ValueGeneratorFromJSON(json.speed) : undefined,\n transform: ShapeTransform.fromJSON(json.transform),\n spread: json.spread,\n });\n }\n clone() {\n return new RectangleEmitter({\n width: this.width,\n height: this.height,\n thickness: this.thickness,\n mode: this.mode,\n speed: this.speed.clone(),\n transform: this.transform?.clone(),\n spread: this.spread,\n });\n }\n}\n\nconst EmitterShapes = {\n box: {\n type: 'box',\n params: [\n ['width', ['number']],\n ['height', ['number']],\n ['depth', ['number']],\n ['emitFrom', ['number']],\n ['boxThickness', ['vec3']],\n ],\n constructor: BoxEmitter,\n loadJSON: BoxEmitter.fromJSON,\n },\n circle: {\n type: 'circle',\n params: [\n ['radius', ['number']],\n ['arc', ['radian']],\n ['thickness', ['number']],\n ['mode', ['emitterMode']],\n ['spread', ['number']],\n ['speed', ['valueFunc', 'value']],\n ],\n constructor: CircleEmitter,\n loadJSON: CircleEmitter.fromJSON,\n },\n cone: {\n type: 'cone',\n params: [\n ['radius', ['number']],\n ['arc', ['radian']],\n ['thickness', ['number']],\n ['angle', ['radian']],\n ['mode', ['emitterMode']],\n ['spread', ['number']],\n ['speed', ['valueFunc', 'value']],\n ],\n constructor: ConeEmitter,\n loadJSON: ConeEmitter.fromJSON,\n },\n donut: {\n type: 'donut',\n params: [\n ['radius', ['number']],\n ['arc', ['radian']],\n ['thickness', ['number']],\n ['donutRadius', ['number']],\n ['mode', ['emitterMode']],\n ['spread', ['number']],\n ['speed', ['valueFunc', 'value']],\n ],\n constructor: DonutEmitter,\n loadJSON: DonutEmitter.fromJSON,\n },\n edge: {\n type: 'edge',\n params: [\n ['radius', ['number']],\n ['mode', ['emitterMode']],\n ['spread', ['number']],\n ['speed', ['valueFunc', 'value']],\n ],\n constructor: EdgeEmitter,\n loadJSON: EdgeEmitter.fromJSON,\n },\n point: { type: 'point', params: [], constructor: PointEmitter, loadJSON: PointEmitter.fromJSON },\n sphere: {\n type: 'sphere',\n params: [\n ['radius', ['number']],\n ['arc', ['radian']],\n ['thickness', ['number']],\n ['angle', ['radian']],\n ['mode', ['emitterMode']],\n ['spread', ['number']],\n ['speed', ['valueFunc', 'value']],\n ],\n constructor: SphereEmitter,\n loadJSON: SphereEmitter.fromJSON,\n },\n hemisphere: {\n type: 'hemisphere',\n params: [\n ['radius', ['number']],\n ['arc', ['radian']],\n ['thickness', ['number']],\n ['angle', ['radian']],\n ['mode', ['emitterMode']],\n ['spread', ['number']],\n ['speed', ['valueFunc', 'value']],\n ],\n constructor: HemisphereEmitter,\n loadJSON: HemisphereEmitter.fromJSON,\n },\n grid: {\n type: 'grid',\n params: [\n ['width', ['number']],\n ['height', ['number']],\n ['rows', ['number']],\n ['column', ['number']],\n ],\n constructor: GridEmitter,\n loadJSON: GridEmitter.fromJSON,\n },\n rectangle: {\n type: 'rectangle',\n params: [\n ['width', ['number']],\n ['height', ['number']],\n ['thickness', ['number']],\n ['mode', ['emitterMode']],\n ['spread', ['number']],\n ['speed', ['valueFunc', 'value']],\n ],\n constructor: RectangleEmitter,\n loadJSON: RectangleEmitter.fromJSON,\n },\n};\nfunction EmitterFromJSON(json, meta) {\n return EmitterShapes[json.type].loadJSON(json, meta);\n}\n\nconst Plugins = [];\nfunction loadPlugin(plugin) {\n const existing = Plugins.find((item) => item.id === plugin.id);\n if (!existing) {\n plugin.initialize();\n for (const emitterShape of plugin.emitterShapes) {\n if (!EmitterShapes[emitterShape.type]) {\n EmitterShapes[emitterShape.type] = emitterShape;\n }\n }\n for (const behavior of plugin.behaviors) {\n if (!BehaviorTypes[behavior.type]) {\n BehaviorTypes[behavior.type] = behavior;\n }\n }\n }\n}\nfunction unloadPlugin(pluginId) {\n const plugin = Plugins.find((item) => item.id === pluginId);\n if (plugin) {\n for (const emitterShape of plugin.emitterShapes) {\n if (EmitterShapes[emitterShape.type]) {\n delete EmitterShapes[emitterShape.type];\n }\n }\n for (const behavior of plugin.behaviors) {\n if (BehaviorTypes[behavior.type]) {\n delete BehaviorTypes[behavior.type];\n }\n }\n }\n}\n\nexport { ApplyCollision, ApplyForce, ApplySequences, AxisAngleGenerator, BehaviorFromJSON, BehaviorTypes, Bezier, BoxEmitFrom, BoxEmitter, ChangeEmitDirection, CircleEmitter, ColorBySpeed, ColorGeneratorFromJSON, ColorOverLife, ColorRange, ConeEmitter, ConstantColor, ConstantValue, DEG2RAD, DonutEmitter, EdgeEmitter, EmitSubParticleSystem, EmitterFromJSON, EmitterMode, EmitterShapes, Euler, EulerGenerator, ForceOverLife, FrameOverLife, GeneratorFromJSON, Gradient, GravityForce, GridEmitter, HemisphereEmitter, InheritVelocity, IntervalValue, LimitSpeedOverLife, MathUtils, Matrix3, Matrix4, NodeParticle, Noise, OrbitOverLife, ParticleStore, PiecewiseBezier, PiecewiseFunction, Plugins, PointEmitter, Quaternion, RAD2DEG, RandomColor, RandomColorBetweenGradient, RandomQuatGenerator, RecordState, RectangleEmitter, Rotation3DOverLife, RotationBySpeed, RotationGeneratorFromJSON, RotationOverLife, SequencerFromJSON, ShapeTransform, SizeBySpeed, SizeOverLife, SpeedOverLife, SphereEmitter, SpriteParticle, SubParticleEmitMode, TextureSequencer, TrailParticle, TurbulenceField, ValueGeneratorFromJSON, Vector2, Vector3, Vector3Function, Vector3GeneratorFromJSON, Vector3View, Vector4, Vector4View, VelocityOverLife, WebGLCoordinateSystem, WebGPUCoordinateSystem, WidthOverLength, ceilPowerOfTwo, clamp, damp, degToRad, denormalize, euclideanModulo, floorPowerOfTwo, generateUUID, getPhysicsResolver, getValueFromEmitterMode, inverseLerp, isPowerOfTwo, lerp, loadPlugin, mapLinear, normalize, pingpong, planBehaviorFusion, radToDeg, randFloat, randFloatSpread, randInt, seededRandom, setPhysicsResolver, setQuaternionFromProperEuler, smootherstep, smoothstep, unloadPlugin };\n","import {VertexBuffer} from '@babylonjs/core/Buffers/buffer';\nimport {Mesh} from '@babylonjs/core/Meshes/mesh';\nimport {EmitterShape, IParticleSystem, Particle, Plugin, ShapeJSON, ShapeTransform, Vector3} from 'quarks.core';\n\nexport class MeshSurfaceEmitter implements EmitterShape {\n type = 'mesh_surface';\n\n private _triangleIndexToArea: number[] = [];\n private _mesh?: Mesh;\n private _positions?: Float32Array;\n private _indices?: Uint32Array | Int32Array;\n private _meshReferenceId?: string;\n /** Offset, rotation and scale of the mesh within the particle system. */\n transform?: ShapeTransform;\n\n get mesh() {\n return this._mesh;\n }\n\n set mesh(mesh: Mesh | undefined) {\n this._mesh = mesh;\n if (!mesh) return;\n\n const positions = mesh.getVerticesData(VertexBuffer.PositionKind);\n const indices = mesh.getIndices();\n if (!positions || !indices) return;\n\n this._positions = new Float32Array(positions);\n this._indices = new Int32Array(indices);\n\n this._triangleIndexToArea.length = 0;\n let area = 0;\n const triCount = indices.length / 3;\n this._triangleIndexToArea.push(0);\n\n const a = new Vector3();\n const b = new Vector3();\n const c = new Vector3();\n\n for (let i = 0; i < triCount; i++) {\n const i0 = indices[i * 3];\n const i1 = indices[i * 3 + 1];\n const i2 = indices[i * 3 + 2];\n\n a.set(positions[i0 * 3], positions[i0 * 3 + 1], positions[i0 * 3 + 2]);\n b.set(positions[i1 * 3], positions[i1 * 3 + 1], positions[i1 * 3 + 2]);\n c.set(positions[i2 * 3], positions[i2 * 3 + 1], positions[i2 * 3 + 2]);\n\n b.sub(a);\n c.sub(a);\n const cross = new Vector3();\n cross.crossVectors(b, c);\n area += cross.length() * 0.5;\n this._triangleIndexToArea.push(area);\n }\n }\n\n constructor(mesh?: Mesh, meshReferenceId?: string, transform?: ShapeTransform) {\n this._meshReferenceId = meshReferenceId;\n this.transform = transform;\n if (mesh) this.mesh = mesh;\n }\n\n initialize(p: Particle) {\n if (!this._positions || !this._indices) {\n p.position.set(0, 0, 0);\n p.velocity.set(0, 0, 1).multiplyScalar(p.startSpeed);\n this.transform?.apply(p);\n return;\n }\n\n const triCount = this._triangleIndexToArea.length - 1;\n let left = 0,\n right = triCount;\n const target = Math.random() * this._triangleIndexToArea[triCount];\n\n while (left + 1 < right) {\n const mid = Math.floor((left + right) / 2);\n if (target < this._triangleIndexToArea[mid]) {\n right = mid;\n } else {\n left = mid;\n }\n }\n\n let u1 = Math.random();\n let u2 = Math.random();\n if (u1 + u2 > 1) {\n u1 = 1 - u1;\n u2 = 1 - u2;\n }\n\n const idx0 = this._indices[left * 3];\n const idx1 = this._indices[left * 3 + 1];\n const idx2 = this._indices[left * 3 + 2];\n\n const ax = this._positions[idx0 * 3],\n ay = this._positions[idx0 * 3 + 1],\n az = this._positions[idx0 * 3 + 2];\n const bx = this._positions[idx1 * 3] - ax,\n by = this._positions[idx1 * 3 + 1] - ay,\n bz = this._positions[idx1 * 3 + 2] - az;\n const cx = this._positions[idx2 * 3] - ax,\n cy = this._positions[idx2 * 3 + 1] - ay,\n cz = this._positions[idx2 * 3 + 2] - az;\n\n p.position.set(ax + bx * u1 + cx * u2, ay + by * u1 + cy * u2, az + bz * u1 + cz * u2);\n\n const nx = by * cz - bz * cy;\n const ny = bz * cx - bx * cz;\n const nz = bx * cy - by * cx;\n const len = Math.sqrt(nx * nx + ny * ny + nz * nz) || 1;\n p.velocity.set(nx / len, ny / len, nz / len).multiplyScalar(p.startSpeed);\n this.transform?.apply(p);\n }\n\n toJSON(): ShapeJSON {\n return {\n type: 'mesh_surface',\n mesh: this._mesh ? (this._mesh as any).uniqueId?.toString() : (this._meshReferenceId ?? ''),\n ...ShapeTransform.toShapeJSON(this.transform),\n };\n }\n\n static fromJSON(json: any): MeshSurfaceEmitter {\n return new MeshSurfaceEmitter(undefined, json?.mesh, ShapeTransform.fromJSON(json?.transform));\n }\n\n clone(): EmitterShape {\n return new MeshSurfaceEmitter(this._mesh, this._meshReferenceId, this.transform?.clone());\n }\n\n update(_system: IParticleSystem, _delta: number): void {}\n}\n\nexport const MeshSurfaceEmitterPlugin: Plugin = {\n id: 'babylon.quarks',\n initialize: () => {},\n emitterShapes: [\n {\n type: 'mesh_surface',\n params: [['mesh', ['mesh']]],\n constructor: MeshSurfaceEmitter,\n loadJSON: (json: any) => MeshSurfaceEmitter.fromJSON(json),\n },\n ],\n behaviors: [],\n};\n","import softFragment from './soft_fragment.glsl';\nimport softParsFragment from './soft_pars_fragment.glsl';\nimport softParsVertex from './soft_pars_vertex.glsl';\nimport softVertex from './soft_vertex.glsl';\nimport tileFragment from './tile_fragment.glsl';\nimport tileParsFragment from './tile_pars_fragment.glsl';\nimport tileParsVertex from './tile_pars_vertex.glsl';\nimport tileVertex from './tile_vertex.glsl';\n\nconst shaderChunks: Record<string, string> = {};\nlet registered = false;\n\nexport function registerShaderChunks(): void {\n if (registered) return;\n shaderChunks.tile_pars_vertex = tileParsVertex;\n shaderChunks.tile_vertex = tileVertex;\n shaderChunks.tile_pars_fragment = tileParsFragment;\n shaderChunks.tile_fragment = tileFragment;\n shaderChunks.soft_pars_vertex = softParsVertex;\n shaderChunks.soft_vertex = softVertex;\n shaderChunks.soft_pars_fragment = softParsFragment;\n shaderChunks.soft_fragment = softFragment;\n registered = true;\n}\n\nexport function getShaderChunk(chunkName: string): string | undefined {\n return shaderChunks[chunkName];\n}\n\nexport function getRegisteredShaderChunks(): Readonly<Record<string, string>> {\n return shaderChunks;\n}\n","export default /* glsl */ `\n#ifdef UV_TILE\n attribute float uvTile;\n uniform vec2 tileCount;\n\n mat3 makeTileTransform(float tileIndex) {\n float col = mod(tileIndex, tileCount.x);\n float row = (tileCount.y - floor(tileIndex / tileCount.x) - 1.0);\n return mat3(\n 1.0 / tileCount.x, 0.0, 0.0,\n 0.0, 1.0 / tileCount.y, 0.0,\n col / tileCount.x, row / tileCount.y, 1.0\n );\n }\n#else\n mat3 makeTileTransform(float tileIndex) {\n return mat3(1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0);\n }\n#endif\n\n#if defined(USE_UV)\n varying vec2 vUv;\n #ifdef TILE_BLEND\n varying vec2 vUvNext;\n varying float vUvBlend;\n #endif\n#endif\n`;\n","export default /* glsl */ `\n#ifdef UV_TILE\n mat3 tileTransform = makeTileTransform(floor(uvTile));\n #ifdef TILE_BLEND\n mat3 nextTileTransform = makeTileTransform(ceil(uvTile));\n vUvBlend = fract(uvTile);\n #endif\n#else\n mat3 tileTransform = makeTileTransform(0.0);\n#endif\n\n#if defined(USE_UV)\n vUv = (tileTransform * vec3(uv, 1.0)).xy;\n #if defined(TILE_BLEND) && defined(UV_TILE)\n vUvNext = (nextTileTransform * vec3(uv, 1.0)).xy;\n #endif\n#endif\n`;\n","export default /* glsl */ `\n#if defined(USE_UV)\n varying vec2 vUv;\n #ifdef TILE_BLEND\n varying vec2 vUvNext;\n varying float vUvBlend;\n #endif\n#endif\n`;\n","export default /* glsl */ `\n#ifdef USE_MAP\n vec4 texelColor = texture2D(map, vUv);\n #ifdef TILE_BLEND\n texelColor = mix(texelColor, texture2D(map, vUvNext), vUvBlend);\n #endif\n diffuseColor *= texelColor;\n#endif\n`;\n","export default /* glsl */ `\n#ifdef SOFT_PARTICLES\n varying vec4 projPosition;\n varying float linearDepth;\n#endif\n`;\n","export default /* glsl */ `\n#ifdef SOFT_PARTICLES\n projPosition = gl_Position;\n linearDepth = -mvPosition.z;\n#endif\n`;\n","export default /* glsl */ `\n#ifdef SOFT_PARTICLES\n uniform sampler2D depthTexture;\n uniform vec4 projParams;\n uniform vec2 softParams;\n\n varying vec4 projPosition;\n varying float linearDepth;\n\n #define SOFT_NEAR_FADE softParams.x\n #define SOFT_INV_FADE_DISTANCE softParams.y\n\n #define zNear projParams.x\n #define zFar projParams.y\n\n float linearize_depth(float d) {\n return (zFar * zNear) / (zFar - d * (zFar - zNear));\n }\n#endif\n`;\n","export default /* glsl */ `\n#ifdef SOFT_PARTICLES\n\n vec2 p2 = projPosition.xy / projPosition.w;\n p2 = 0.5 * p2 + 0.5;\n\n float readDepth = texture2D(depthTexture, p2.xy).r;\n float viewDepth = linearize_depth(readDepth);\n float softParticlesFade = saturate(SOFT_INV_FADE_DISTANCE * ((viewDepth - SOFT_NEAR_FADE) - linearDepth));\n\n gl_FragColor *= softParticlesFade;\n#endif\n`;\n","export default /* glsl */ `\nattribute vec3 position;\nattribute vec2 uv;\nattribute vec3 normal;\nattribute vec3 offset;\nattribute vec4 color;\nattribute vec3 size;\nattribute vec4 rotation;\nattribute float uvTile;\n\nuniform mat4 world;\nuniform mat4 view;\nuniform mat4 projection;\n\n#ifdef UV_TILE\nuniform float tileCountX;\nuniform float tileCountY;\n#endif\n\nvarying vec2 vUV;\nvarying vec4 vColor;\nvarying vec3 vNormal;\nvarying vec3 vWorldPos;\n\n#ifdef TILE_BLEND\nvarying vec2 vUV2;\nvarying float vTileBlend;\n#endif\n\n#ifdef SOFT_PARTICLES\nvarying vec4 projPosition;\nvarying float linearDepth;\n#endif\n\nvec3 applyQuaternion(vec3 v, vec4 q) {\n vec3 qVec = q.xyz;\n float qW = q.w;\n vec3 t = 2.0 * cross(qVec, v);\n return v + qW * t + cross(qVec, t);\n}\n\nvoid main() {\n vec3 scaledPosition = position * size;\n vec3 rotatedPosition = applyQuaternion(scaledPosition, rotation);\n vec3 rotatedNormal = normalize(applyQuaternion(normal, rotation));\n vec3 localPos = rotatedPosition + offset;\n\n vec4 worldPos = world * vec4(localPos, 1.0);\n vec4 viewPos = view * worldPos;\n gl_Position = projection * viewPos;\n\n vWorldPos = worldPos.xyz;\n vNormal = normalize((world * vec4(rotatedNormal, 0.0)).xyz);\n\n#ifdef SOFT_PARTICLES\n projPosition = gl_Position;\n linearDepth = -viewPos.z;\n#endif\n\n#ifdef UV_TILE\n vec2 tc = vec2(tileCountX, tileCountY);\n float baseTile = floor(uvTile);\n float tileU = mod(baseTile, tc.x) / tc.x;\n float tileV = 1.0 - floor(baseTile / tc.x) / tc.y - 1.0 / tc.y;\n vUV = uv / tc + vec2(tileU, tileV);\n #ifdef TILE_BLEND\n float nextTile = ceil(uvTile);\n float nextU = mod(nextTile, tc.x) / tc.x;\n float nextV = 1.0 - floor(nextTile / tc.x) / tc.y - 1.0 / tc.y;\n vUV2 = uv / tc + vec2(nextU, nextV);\n vTileBlend = fract(uvTile);\n #endif\n#else\n vUV = uv;\n#endif\n\n vColor = color;\n}\n`;\n","export default /* glsl */ `\nvarying vec2 vUV;\nvarying vec4 vColor;\n\n#ifdef TILE_BLEND\nvarying vec2 vUV2;\nvarying float vTileBlend;\n#endif\n\n#ifdef USE_MAP\nuniform sampler2D map;\n#endif\n\n#ifdef SOFT_PARTICLES\nuniform sampler2D depthTexture;\nuniform vec2 softParams;\nuniform vec4 projParams;\nvarying vec4 projPosition;\nvarying float linearDepth;\n#endif\n\n#ifdef USE_ALPHATEST\nuniform float alphaTest;\n#endif\n\nvoid main() {\n vec4 baseColor = vColor;\n\n#ifdef USE_MAP\n vec4 texColor = texture2D(map, vUV);\n #ifdef TILE_BLEND\n vec4 texColor2 = texture2D(map, vUV2);\n texColor = mix(texColor, texColor2, vTileBlend);\n #endif\n baseColor *= texColor;\n#endif\n\n#ifdef USE_COLOR_AS_ALPHA\n baseColor.a *= (baseColor.r + baseColor.g + baseColor.b) / 3.0;\n#endif\n\n#ifdef USE_ALPHATEST\n if (baseColor.a < alphaTest) discard;\n#else\n if (baseColor.a < 0.01) discard;\n#endif\n\n gl_FragColor = baseColor;\n\n#ifdef SOFT_PARTICLES\n vec2 p2 = projPosition.xy / projPosition.w;\n p2 = 0.5 * p2 + 0.5;\n float readDepth = texture2D(depthTexture, p2.xy).r;\n float zNear = projParams.x;\n float zFar = projParams.y;\n float viewDepth = (zFar * zNear) / (zFar - readDepth * (zFar - zNear));\n float fade = clamp(softParams.y * ((viewDepth - softParams.x) - linearDepth), 0.0, 1.0);\n gl_FragColor *= fade;\n#endif\n}\n`;\n","export default /* glsl */ `\nvarying vec2 vUV;\nvarying vec4 vColor;\nvarying vec3 vNormal;\nvarying vec3 vWorldPos;\n\nuniform vec3 lightDirection;\nuniform vec3 lightColor;\nuniform vec3 ambientColor;\n\n#ifdef TILE_BLEND\nvarying vec2 vUV2;\nvarying float vTileBlend;\n#endif\n\n#ifdef USE_MAP\nuniform sampler2D map;\n#endif\n\n// One 3×2 atlas (px py pz / nx ny nz). Avoids samplerCube and multi-face\n// sampler bindings that raise GL_INVALID_OPERATION on iOS WebKit.\n#ifdef USE_ENVMAP_ATLAS\nuniform sampler2D envAtlas;\nuniform vec3 eyePosition;\nuniform float reflectionLevel;\n\nvec3 sampleEnvAtlas(vec3 r) {\n vec3 a = abs(r);\n vec2 localUV;\n float cellX;\n float cellY;\n // Atlas layout: +X +Y +Z on row 0, -X -Y -Z on row 1.\n if (a.x >= a.y && a.x >= a.z) {\n cellX = 0.0;\n if (r.x >= 0.0) {\n cellY = 0.0;\n localUV = vec2(-r.z, -r.y) / a.x * 0.5 + 0.5;\n } else {\n cellY = 1.0;\n localUV = vec2(r.z, -r.y) / a.x * 0.5 + 0.5;\n }\n } else if (a.y >= a.z) {\n cellX = 1.0;\n if (r.y >= 0.0) {\n cellY = 0.0;\n localUV = vec2(r.x, r.z) / a.y * 0.5 + 0.5;\n } else {\n cellY = 1.0;\n localUV = vec2(r.x, -r.z) / a.y * 0.5 + 0.5;\n }\n } else {\n cellX = 2.0;\n if (r.z >= 0.0) {\n cellY = 0.0;\n localUV = vec2(r.x, -r.y) / a.z * 0.5 + 0.5;\n } else {\n cellY = 1.0;\n localUV = vec2(-r.x, -r.y) / a.z * 0.5 + 0.5;\n }\n }\n vec2 uv = (vec2(cellX, cellY) + clamp(localUV, 0.0, 1.0)) / vec2(3.0, 2.0);\n return texture2D(envAtlas, uv).rgb;\n}\n#endif\n\n#ifdef SOFT_PARTICLES\nuniform sampler2D depthTexture;\nuniform vec2 softParams;\nuniform vec4 projParams;\nvarying vec4 projPosition;\nvarying float linearDepth;\n#endif\n\n#ifdef USE_ALPHATEST\nuniform float alphaTest;\n#endif\n\nvoid main() {\n vec4 baseColor = vColor;\n\n#ifdef USE_MAP\n vec4 texColor = texture2D(map, vUV);\n #ifdef TILE_BLEND\n vec4 texColor2 = texture2D(map, vUV2);\n texColor = mix(texColor, texColor2, vTileBlend);\n #endif\n baseColor *= texColor;\n#endif\n\n#ifdef USE_ALPHATEST\n if (baseColor.a < alphaTest) discard;\n#else\n if (baseColor.a < 0.01) discard;\n#endif\n\n vec3 N = normalize(vNormal);\n vec3 L = normalize(-lightDirection);\n float NdotL = max(dot(N, L), 0.0);\n vec3 litColor = ambientColor + lightColor * NdotL;\n\n vec3 color = baseColor.rgb * litColor;\n\n#ifdef USE_ENVMAP_ATLAS\n vec3 viewDir = normalize(vWorldPos - eyePosition);\n vec3 reflectionCoords = reflect(viewDir, N);\n color += sampleEnvAtlas(reflectionCoords) * reflectionLevel;\n#endif\n\n gl_FragColor = vec4(color, baseColor.a);\n\n#ifdef SOFT_PARTICLES\n vec2 p2 = projPosition.xy / projPosition.w;\n p2 = 0.5 * p2 + 0.5;\n float readDepth = texture2D(depthTexture, p2.xy).r;\n float zNear = projParams.x;\n float zFar = projParams.y;\n float viewDepth = (zFar * zNear) / (zFar - readDepth * (zFar - zNear));\n float fade = clamp(softParams.y * ((viewDepth - softParams.x) - linearDepth), 0.0, 1.0);\n gl_FragColor *= fade;\n#endif\n}\n`;\n","export default /* glsl */ `\n// Per-vertex attributes\nattribute vec3 position;\nattribute vec2 uv;\n\n// Per-instance attributes\nattribute vec3 offset;\nattribute vec4 color;\nattribute vec3 size;\nattribute float rotation;\nattribute float uvTile;\n\n// Uniforms\nuniform mat4 world;\nuniform mat4 view;\nuniform mat4 projection;\nuniform mat4 worldViewProjection;\n\n#ifdef UV_TILE\nuniform float tileCountX;\nuniform float tileCountY;\n#endif\n\n#ifdef PIVOT\n// Quad offset in particle-size units: xy in the quad's plane, z toward the camera.\nuniform vec3 pivot;\n#endif\n\n// Varyings\nvarying vec2 vUV;\nvarying vec4 vColor;\n#ifdef TILE_BLEND\nvarying vec2 vUV2;\nvarying float vTileBlend;\n#endif\n#ifdef SOFT_PARTICLES\nvarying vec4 projPosition;\nvarying float linearDepth;\n#endif\n\nvoid main() {\n float c = cos(rotation);\n float s = sin(rotation);\n\n // A negative size mirrors the quad, which is how flipped particles arrive.\n vec2 alignedPosition = position.xy * size.xy;\n#ifdef PIVOT\n // The pivot turns with the particle but is not mirrored with it.\n alignedPosition += pivot.xy * abs(size.xy);\n#endif\n vec2 rotatedPosition;\n rotatedPosition.x = c * alignedPosition.x - s * alignedPosition.y;\n rotatedPosition.y = s * alignedPosition.x + c * alignedPosition.y;\n\n#ifdef HORIZONTAL\n vec4 mvPosition = world * vec4(offset, 1.0);\n mvPosition.x += rotatedPosition.x;\n mvPosition.z -= rotatedPosition.y;\n#ifdef PIVOT\n mvPosition.y += pivot.z * abs(size.x);\n#endif\n mvPosition = view * mvPosition;\n#elif defined(VERTICAL)\n vec4 mvPosition = world * vec4(offset, 1.0);\n mvPosition.y += rotatedPosition.y;\n mvPosition = view * mvPosition;\n mvPosition.x += rotatedPosition.x;\n#else\n vec4 mvPosition = view * world * vec4(offset, 1.0);\n mvPosition.xy += rotatedPosition;\n#endif\n#ifdef PIVOT\n#ifndef HORIZONTAL\n // Toward the camera along its view axis, whichever way the view space\n // faces: anything in front of the camera has the sign of the far side.\n mvPosition.z -= sign(mvPosition.z) * pivot.z * abs(size.x);\n#endif\n#endif\n\n gl_Position = projection * mvPosition;\n#ifdef SOFT_PARTICLES\n projPosition = gl_Position;\n linearDepth = -mvPosition.z;\n#endif\n\n #ifdef UV_TILE\n vec2 tc = vec2(tileCountX, tileCountY);\n float baseTile = floor(uvTile);\n float tileU = mod(baseTile, tc.x) / tc.x;\n float tileV = 1.0 - floor(baseTile / tc.x) / tc.y - 1.0 / tc.y;\n vUV = uv / tc + vec2(tileU, tileV);\n #ifdef TILE_BLEND\n float nextTile = ceil(uvTile);\n float nextU = mod(nextTile, tc.x) / tc.x;\n float nextV = 1.0 - floor(nextTile / tc.x) / tc.y - 1.0 / tc.y;\n vUV2 = uv / tc + vec2(nextU, nextV);\n vTileBlend = fract(uvTile);\n #endif\n #else\n vUV = uv;\n #endif\n\n vColor = color;\n}\n`;\n","export default /* glsl */ `\n// Per-vertex attributes\nattribute vec3 position;\nattribute vec2 uv;\n\n// Per-instance attributes\nattribute vec3 offset;\nattribute vec4 color;\nattribute vec3 size;\nattribute float rotation;\nattribute float uvTile;\nattribute vec4 velocity;\n\n// Uniforms\nuniform mat4 world;\nuniform mat4 view;\nuniform mat4 projection;\nuniform float speedFactor;\n\n#ifdef UV_TILE\nuniform float tileCountX;\nuniform float tileCountY;\n#endif\n\n#ifdef PIVOT\n// Streak offset in particle-size units: x from head to tail, y across.\nuniform vec3 pivot;\n#endif\n\n// Varyings\nvarying vec2 vUV;\nvarying vec4 vColor;\n#ifdef TILE_BLEND\nvarying vec2 vUV2;\nvarying float vTileBlend;\n#endif\n#ifdef SOFT_PARTICLES\nvarying vec4 projPosition;\nvarying float linearDepth;\n#endif\n\nvoid main() {\n float lengthFactor = velocity.w;\n // A flipped particle arrives with a negative size: the streak keeps its\n // extent and mirrors its texture instead (see quadUV below).\n float avgSize = (abs(size.x) + abs(size.y)) * 0.5;\n vec4 mvPosition = view * world * vec4(offset, 1.0);\n vec3 viewVelocity = mat3(view * world) * velocity.xyz;\n float vlength = length(viewVelocity);\n // Stretch direction is the velocity direction; only a genuinely motionless particle has none.\n // Deriving it via normalize keeps the stretch aligned even when the speed contribution is ~0\n // (e.g. speedFactor 0), instead of collapsing the whole burst onto a fixed screen axis.\n vec3 vdir = vlength > 0.000001 ? viewVelocity / vlength : vec3(0.0, 0.0, 1.0);\n vec3 side = normalize(cross(mvPosition.xyz, vdir));\n mvPosition.xyz += position.y * side * avgSize;\n // Equivalent to viewVelocity * (1.0 + lengthFactor / vlength) for moving particles, but the\n // size-based term (vdir * lengthFactor) survives when the velocity contribution vanishes.\n mvPosition.xyz -= (position.x + 0.5) * (viewVelocity + vdir * lengthFactor) * avgSize;\n#ifdef PIVOT\n // In particle-size units along the quad's own axes: x from head to tail, y across.\n mvPosition.xyz += (pivot.y * side - pivot.x * vdir) * avgSize;\n#endif\n gl_Position = projection * mvPosition;\n vec2 quadUV = vec2(size.x < 0.0 ? 1.0 - uv.x : uv.x, size.y < 0.0 ? 1.0 - uv.y : uv.y);\n#ifdef SOFT_PARTICLES\n projPosition = gl_Position;\n linearDepth = -mvPosition.z;\n#endif\n\n #ifdef UV_TILE\n vec2 tc = vec2(tileCountX, tileCountY);\n float baseTile = floor(uvTile);\n float tileU = mod(baseTile, tc.x) / tc.x;\n float tileV = 1.0 - floor(baseTile / tc.x) / tc.y - 1.0 / tc.y;\n vUV = quadUV / tc + vec2(tileU, tileV);\n #ifdef TILE_BLEND\n float nextTile = ceil(uvTile);\n float nextU = mod(nextTile, tc.x) / tc.x;\n float nextV = 1.0 - floor(nextTile / tc.x) / tc.y - 1.0 / tc.y;\n vUV2 = quadUV / tc + vec2(nextU, nextV);\n vTileBlend = fract(uvTile);\n #endif\n #else\n vUV = quadUV;\n #endif\n\n vColor = color;\n}\n`;\n","export default /* glsl */ `\nvarying vec2 vUV;\nvarying vec4 vColor;\n\n#ifdef USE_MAP\nuniform sampler2D map;\n#endif\n\nvoid main() {\n vec4 baseColor = vColor;\n\n#ifdef USE_MAP\n vec4 texColor = texture2D(map, vUV);\n baseColor *= texColor;\n#endif\n\n if (baseColor.a < 0.01) discard;\n\n gl_FragColor = baseColor;\n}\n`;\n","export default /* glsl */ `\nattribute vec3 position;\nattribute vec3 previous;\nattribute vec3 next;\nattribute float side;\nattribute float width;\nattribute vec2 uv;\nattribute vec4 color;\n\nuniform mat4 view;\nuniform mat4 projection;\nuniform float lineWidth;\nuniform vec2 resolution;\nuniform float sizeAttenuation;\n\nvarying vec2 vUV;\nvarying vec4 vColor;\n\nvec2 fix(vec4 i, float aspect) {\n vec2 res = i.xy / i.w;\n res.x *= aspect;\n return res;\n}\n\nvoid main() {\n float aspect = resolution.x / resolution.y;\n vec4 finalPosition = projection * view * vec4(position, 1.0);\n vec4 prevPos = projection * view * vec4(previous, 1.0);\n vec4 nextPos = projection * view * vec4(next, 1.0);\n\n vec2 currentP = fix(finalPosition, aspect);\n vec2 prevP = fix(prevPos, aspect);\n vec2 nextP = fix(nextPos, aspect);\n\n float w = lineWidth * width;\n vec2 dir;\n if (distance(nextP, currentP) < 0.0001) {\n dir = normalize(currentP - prevP);\n } else if (distance(prevP, currentP) < 0.0001) {\n dir = normalize(nextP - currentP);\n } else {\n vec2 dir1 = normalize(currentP - prevP);\n vec2 dir2 = normalize(nextP - currentP);\n dir = normalize(dir1 + dir2);\n }\n vec4 normal = vec4(-dir.y, dir.x, 0.0, 1.0);\n normal.xy *= 0.5 * w;\n normal *= projection;\n if (sizeAttenuation == 0.0) {\n normal.xy *= finalPosition.w;\n normal.xy /= (vec4(resolution, 0.0, 1.0) * projection).xy;\n }\n finalPosition.xy += normal.xy * side;\n gl_Position = finalPosition;\n vUV = uv;\n vColor = color;\n}\n`;\n","export default /* wgsl */ `\nvarying vUV: vec2f;\nvarying vColor: vec4f;\n\n#ifdef TILE_BLEND\nvarying vUV2: vec2f;\nvarying vTileBlend: f32;\n#endif\n\n#ifdef USE_MAP\nvar mapSampler: sampler;\nvar map: texture_2d<f32>;\n#endif\n\n#ifdef SOFT_PARTICLES\nvar depthTextureSampler: sampler;\nvar depthTexture: texture_2d<f32>;\nuniform softParams: vec2f;\nuniform projParams: vec4f;\nvarying projPosition: vec4f;\nvarying linearDepth: f32;\n#endif\n\n#ifdef USE_ALPHATEST\nuniform alphaTest: f32;\n#endif\n\n@fragment\nfn main(input: FragmentInputs) -> FragmentOutputs {\n var baseColor = fragmentInputs.vColor;\n\n#ifdef USE_MAP\n var texColor = textureSample(map, mapSampler, fragmentInputs.vUV);\n #ifdef TILE_BLEND\n let texColor2 = textureSample(map, mapSampler, fragmentInputs.vUV2);\n texColor = mix(texColor, texColor2, fragmentInputs.vTileBlend);\n #endif\n baseColor *= texColor;\n#endif\n\n#ifdef USE_COLOR_AS_ALPHA\n baseColor.a *= (baseColor.r + baseColor.g + baseColor.b) / 3.0;\n#endif\n\n#ifdef USE_ALPHATEST\n if (baseColor.a < uniforms.alphaTest) { discard; }\n#else\n if (baseColor.a < 0.01) { discard; }\n#endif\n\n#ifdef SOFT_PARTICLES\n var p2 = fragmentInputs.projPosition.xy / fragmentInputs.projPosition.w;\n p2 = 0.5 * p2 + 0.5;\n let readDepth = textureSample(depthTexture, depthTextureSampler, p2).r;\n let zNear = uniforms.projParams.x;\n let zFar = uniforms.projParams.y;\n let viewDepth = (zFar * zNear) / (zFar - readDepth * (zFar - zNear));\n let fade = clamp(uniforms.softParams.y * ((viewDepth - uniforms.softParams.x) - fragmentInputs.linearDepth), 0.0, 1.0);\n baseColor *= fade;\n#endif\n\n fragmentOutputs.color = baseColor;\n}\n`;\n","import type {AbstractEngine} from '@babylonjs/core/Engines/abstractEngine';\nimport {ShaderStore} from '@babylonjs/core/Engines/shaderStore';\nimport {Effect} from '@babylonjs/core/Materials/effect';\nimport {ShaderLanguage} from '@babylonjs/core/Materials/shaderLanguage';\n\n/**\n * Picking the shader language a batch compiles in, and putting the source where\n * the engine will look for it.\n *\n * WebGPU speaks WGSL. Handing it GLSL is not an error — Babylon transpiles —\n * but the transpilers are two WASM modules it downloads from cdn.babylonjs.com\n * the first time a GLSL shader is compiled. That is a third-party request on\n * first draw, a hard failure under a Content-Security-Policy that does not list\n * the CDN or with no network at all, and a GLSL to SPIR-V to WGSL round trip\n * before the first particle appears. Shipping the WGSL means none of that\n * happens.\n *\n * The two languages live in separate stores keyed by the same name, so a scene\n * that somehow ran both would not collide.\n */\nexport interface ShaderSources {\n /** GLSL source, used on every WebGL engine. */\n glsl: string;\n /** WGSL source, used on WebGPU. */\n wgsl: string;\n}\n\n/** The language `engine` wants: WGSL on WebGPU, GLSL everywhere else. */\nexport function shaderLanguageFor(engine: AbstractEngine): ShaderLanguage {\n return engine.isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL;\n}\n\n/**\n * Registers a vertex/fragment pair under `name` in the store for `language`,\n * and returns that language so the caller can pass it to the material.\n *\n * Registration is by name rather than per material instance: the sources only\n * depend on the render mode, so a fresh name per rebuild would grow the store\n * without bound and defeat Babylon's compiled-effect cache.\n */\nexport function registerShaders(\n name: string,\n vertex: ShaderSources,\n fragment: ShaderSources,\n language: ShaderLanguage\n): void {\n if (language === ShaderLanguage.WGSL) {\n ShaderStore.ShadersStoreWGSL[name + 'VertexShader'] = vertex.wgsl;\n ShaderStore.ShadersStoreWGSL[name + 'FragmentShader'] = fragment.wgsl;\n return;\n }\n Effect.ShadersStore[name + 'VertexShader'] = vertex.glsl;\n Effect.ShadersStore[name + 'FragmentShader'] = fragment.glsl;\n}\n","export default /* wgsl */ `\n// Per-vertex attributes\nattribute position: vec3f;\nattribute uv: vec2f;\n\n// Per-instance attributes\nattribute offset: vec3f;\nattribute color: vec4f;\nattribute size: vec3f;\nattribute rotation: f32;\nattribute uvTile: f32;\nattribute velocity: vec4f;\n\n// Uniforms\nuniform world: mat4x4f;\nuniform view: mat4x4f;\nuniform projection: mat4x4f;\nuniform speedFactor: f32;\n\n#ifdef UV_TILE\nuniform tileCountX: f32;\nuniform tileCountY: f32;\n#endif\n\n#ifdef PIVOT\n// Streak offset in particle-size units: x from head to tail, y across.\nuniform pivot: vec3f;\n#endif\n\n// Varyings\nvarying vUV: vec2f;\nvarying vColor: vec4f;\n#ifdef TILE_BLEND\nvarying vUV2: vec2f;\nvarying vTileBlend: f32;\n#endif\n#ifdef SOFT_PARTICLES\nvarying projPosition: vec4f;\nvarying linearDepth: f32;\n#endif\n\n@vertex\nfn main(input: VertexInputs) -> FragmentInputs {\n let lengthFactor = vertexInputs.velocity.w;\n // A flipped particle arrives with a negative size: the streak keeps its\n // extent and mirrors its texture instead (see quadUV below).\n let avgSize = (abs(vertexInputs.size.x) + abs(vertexInputs.size.y)) * 0.5;\n var mvPosition = uniforms.view * uniforms.world * vec4f(vertexInputs.offset, 1.0);\n let viewWorld = uniforms.view * uniforms.world;\n let viewWorld3 = mat3x3f(viewWorld[0].xyz, viewWorld[1].xyz, viewWorld[2].xyz);\n let viewVelocity = viewWorld3 * vertexInputs.velocity.xyz;\n let vlength = length(viewVelocity);\n // Stretch direction is the velocity direction; only a genuinely motionless particle has none.\n // Deriving it via normalize keeps the stretch aligned even when the speed contribution is ~0\n // (e.g. speedFactor 0), instead of collapsing the whole burst onto a fixed screen axis.\n var vdir = vec3f(0.0, 0.0, 1.0);\n if (vlength > 0.000001) {\n vdir = viewVelocity / vlength;\n }\n let side = normalize(cross(mvPosition.xyz, vdir));\n let widthOffset = vertexInputs.position.y * side * avgSize;\n // Equivalent to viewVelocity * (1.0 + lengthFactor / vlength) for moving particles, but the\n // size-based term (vdir * lengthFactor) survives when the velocity contribution vanishes.\n let lengthOffset = (vertexInputs.position.x + 0.5) * (viewVelocity + vdir * lengthFactor) * avgSize;\n var stretched = mvPosition.xyz + widthOffset - lengthOffset;\n#ifdef PIVOT\n // In particle-size units along the quad's own axes: x from head to tail, y across.\n stretched += (uniforms.pivot.y * side - uniforms.pivot.x * vdir) * avgSize;\n#endif\n mvPosition.x = stretched.x;\n mvPosition.y = stretched.y;\n mvPosition.z = stretched.z;\n\n let clipPosition = uniforms.projection * mvPosition;\n vertexOutputs.position = clipPosition;\n let quadUV = select(vertexInputs.uv, 1.0 - vertexInputs.uv, vertexInputs.size.xy < vec2f(0.0));\n#ifdef SOFT_PARTICLES\n vertexOutputs.projPosition = clipPosition;\n vertexOutputs.linearDepth = -mvPosition.z;\n#endif\n\n #ifdef UV_TILE\n let tc = vec2f(uniforms.tileCountX, uniforms.tileCountY);\n let baseTile = floor(vertexInputs.uvTile);\n let tileU = (baseTile % tc.x) / tc.x;\n let tileV = 1.0 - floor(baseTile / tc.x) / tc.y - 1.0 / tc.y;\n vertexOutputs.vUV = quadUV / tc + vec2f(tileU, tileV);\n #ifdef TILE_BLEND\n let nextTile = ceil(vertexInputs.uvTile);\n let nextU = (nextTile % tc.x) / tc.x;\n let nextV = 1.0 - floor(nextTile / tc.x) / tc.y - 1.0 / tc.y;\n vertexOutputs.vUV2 = quadUV / tc + vec2f(nextU, nextV);\n vertexOutputs.vTileBlend = fract(vertexInputs.uvTile);\n #endif\n #else\n vertexOutputs.vUV = quadUV;\n #endif\n\n vertexOutputs.vColor = vertexInputs.color;\n}\n`;\n","import {BaseTexture} from '@babylonjs/core/Materials/Textures/baseTexture';\nimport {ShaderMaterial} from '@babylonjs/core/Materials/shaderMaterial';\nimport {Mesh} from '@babylonjs/core/Meshes/mesh';\nimport {Scene} from '@babylonjs/core/scene';\nimport {IParticleSystem, Vector3} from 'quarks.core';\nimport {VFXBatchSettings} from './BatchedRenderer';\n\nexport enum RenderMode {\n BillBoard = 0,\n StretchedBillBoard = 1,\n Mesh = 2,\n Trail = 3,\n HorizontalBillBoard = 4,\n VerticalBillBoard = 5,\n}\n\nexport interface StoredBatchSettings {\n instancingGeometry: Float32Array;\n instancingIndices: Uint32Array | Uint16Array;\n instancingUVs?: Float32Array;\n instancingNormals?: Float32Array;\n renderMode: RenderMode;\n renderOrder: number;\n uTileCount: number;\n vTileCount: number;\n blendTiles: boolean;\n softParticles: boolean;\n softNearFade: number;\n softFarFade: number;\n materialBlendMode: number;\n materialTransparent: boolean;\n materialDepthTest: boolean;\n materialDepthWrite: boolean;\n materialAlphaTest: number;\n texture: any;\n reflectionTexture: BaseTexture | null;\n reflectionLevel: number;\n reflectionFaces: BaseTexture[] | null;\n reflectionAtlas: BaseTexture | null;\n layerMask: number;\n /** Billboard pivot in particle-size units, see {@link VFXBatchSettings.pivot}. */\n pivot?: Vector3;\n}\n\nexport abstract class VFXBatch {\n mesh: Mesh;\n systems: Set<IParticleSystem>;\n settings: StoredBatchSettings;\n protected maxParticles: number;\n protected scene: Scene;\n private readonly visibleSystems: IParticleSystem[] = [];\n\n protected constructor(settings: VFXBatchSettings, scene: Scene) {\n this.scene = scene;\n this.maxParticles = 1000;\n this.systems = new Set<IParticleSystem>();\n this.settings = {\n instancingGeometry: settings.instancingGeometry,\n instancingIndices: settings.instancingIndices,\n instancingUVs: settings.instancingUVs,\n instancingNormals: settings.instancingNormals,\n renderMode: settings.renderMode,\n renderOrder: settings.renderOrder,\n uTileCount: settings.uTileCount,\n vTileCount: settings.vTileCount,\n blendTiles: settings.blendTiles,\n softParticles: settings.softParticles,\n softNearFade: settings.softNearFade,\n softFarFade: settings.softFarFade,\n materialBlendMode: settings.materialBlendMode,\n materialTransparent: settings.materialTransparent,\n materialDepthTest: settings.materialDepthTest,\n materialDepthWrite: settings.materialDepthWrite,\n materialAlphaTest: settings.materialAlphaTest,\n texture: settings.texture,\n reflectionTexture: settings.reflectionTexture ?? null,\n reflectionLevel: settings.reflectionLevel ?? 1,\n reflectionFaces: settings.reflectionFaces ?? null,\n reflectionAtlas: settings.reflectionAtlas ?? null,\n pivot: settings.pivot?.clone(),\n layerMask: settings.layerMask,\n };\n this.mesh = new Mesh('vfxBatch', scene);\n this.mesh.alwaysSelectAsActiveMesh = true;\n }\n\n addSystem(system: IParticleSystem) {\n this.systems.add(system);\n }\n\n removeSystem(system: IParticleSystem) {\n this.systems.delete(system);\n }\n\n /**\n * Visible systems of this batch, written into a buffer owned by the batch.\n * Called once per frame per batch, so the result is reused rather than\n * reallocated; treat it as valid only until the next call.\n */\n getVisibleSystems(): IParticleSystem[] {\n const visibleSystems = this.visibleSystems;\n let count = 0;\n for (const system of this.systems) {\n if (system.emitter.visible) {\n visibleSystems[count++] = system;\n }\n }\n visibleSystems.length = count;\n return visibleSystems;\n }\n\n applyDepthTexture(depthTexture: BaseTexture | null): void {\n const material = this.mesh.material;\n if (material && material instanceof ShaderMaterial) {\n material.setTexture('depthTexture', depthTexture);\n }\n }\n\n abstract setupBuffers(): void;\n abstract expandBuffers(target: number): void;\n abstract rebuildMaterial(): void;\n abstract update(): void;\n\n dispose(): void {\n this.mesh.dispose();\n }\n}\n","import {VertexBuffer} from '@babylonjs/core/Buffers/buffer';\nimport {Constants} from '@babylonjs/core/Engines/constants';\nimport {ShaderMaterial} from '@babylonjs/core/Materials/shaderMaterial';\nimport {RawTexture} from '@babylonjs/core/Materials/Textures/rawTexture';\nimport {Vector2 as BVector2, Vector3 as BVector3, Vector4 as BVector4} from '@babylonjs/core/Maths/math.vector';\nimport {Mesh} from '@babylonjs/core/Meshes/mesh';\nimport {VertexData} from '@babylonjs/core/Meshes/mesh.vertexData';\nimport {Scene} from '@babylonjs/core/scene';\nimport {\n IParticle,\n IParticleSystem,\n Matrix3,\n ParticleStore,\n Quaternion,\n SpriteParticle,\n StretchedBillBoardSettings,\n Vector3,\n} from 'quarks.core';\nimport {VFXBatchSettings} from './BatchedRenderer';\nimport local_particle_physics_vert from './shaders/local_particle_physics_vert.glsl';\nimport local_particle_physics_vert_wgsl from './shaders/local_particle_physics_vert.wgsl';\nimport particle_frag from './shaders/particle_frag.glsl';\nimport particle_frag_wgsl from './shaders/particle_frag.wgsl';\nimport particle_physics_frag from './shaders/particle_physics_frag.glsl';\nimport particle_physics_frag_wgsl from './shaders/particle_physics_frag.wgsl';\nimport particle_vert from './shaders/particle_vert.glsl';\nimport particle_vert_wgsl from './shaders/particle_vert.wgsl';\nimport {registerShaders, shaderLanguageFor, ShaderSources} from './shaders/shaderLanguageSupport';\nimport stretched_bb_particle_vert from './shaders/stretched_bb_particle_vert.glsl';\nimport stretched_bb_particle_vert_wgsl from './shaders/stretched_bb_particle_vert.wgsl';\nimport {RenderMode, VFXBatch} from './VFXBatch';\n\nexport class SpriteBatch extends VFXBatch {\n private static whiteTextureByScene = new WeakMap<Scene, RawTexture>();\n\n /** 1×1 white map so mesh batches always have a sampler2D (iOS WebKit). */\n private static whiteTexture(scene: Scene): RawTexture {\n let texture = SpriteBatch.whiteTextureByScene.get(scene);\n if (!texture) {\n texture = RawTexture.CreateRGBATexture(new Uint8Array([255, 255, 255, 255]), 1, 1, scene);\n texture.name = 'quarksMeshWhite';\n SpriteBatch.whiteTextureByScene.set(scene, texture);\n }\n return texture;\n }\n private offsetBuffer!: Float32Array;\n private rotationBuffer!: Float32Array;\n private sizeBuffer!: Float32Array;\n private colorBuffer!: Float32Array;\n private uvTileBuffer!: Float32Array;\n private velocityBuffer?: Float32Array;\n\n /** Concretely typed handle on the batch material, see syncStretchedSpeedFactor. */\n private shaderMaterial: ShaderMaterial | null = null;\n\n private offsetVB!: VertexBuffer;\n private rotationVB!: VertexBuffer;\n private sizeVB!: VertexBuffer;\n private colorVB!: VertexBuffer;\n private uvTileVB!: VertexBuffer;\n private velocityVB?: VertexBuffer;\n\n constructor(settings: VFXBatchSettings, scene: Scene) {\n super(settings, scene);\n this.maxParticles = 1000;\n this.setupBuffers();\n this.rebuildMaterial();\n }\n\n setupBuffers(): void {\n this.mesh.dispose();\n this.mesh = new Mesh('spriteBatch', this.scene);\n this.mesh.alwaysSelectAsActiveMesh = true;\n\n const vertexData = new VertexData();\n vertexData.positions = this.settings.instancingGeometry;\n vertexData.indices = this.settings.instancingIndices;\n const vertexCount = this.settings.instancingGeometry.length / 3;\n const uvs = this.settings.instancingUVs;\n // WebGL (especially iOS) raises INVALID_OPERATION if the shader reads\n // `attribute vec2 uv` but the buffer is missing or shorter than vertices.\n if (uvs && uvs.length >= vertexCount * 2) {\n vertexData.uvs = uvs;\n } else {\n vertexData.uvs = new Float32Array(vertexCount * 2);\n }\n if (this.settings.instancingNormals) {\n vertexData.normals = this.settings.instancingNormals;\n }\n vertexData.applyToMesh(this.mesh, false);\n\n this.buildExpandableBuffers();\n }\n\n /** Releases the instance vertex buffers so a resize does not leak GPU memory. */\n private disposeExpandableBuffers(): void {\n this.offsetVB?.dispose();\n this.colorVB?.dispose();\n this.sizeVB?.dispose();\n this.uvTileVB?.dispose();\n this.rotationVB?.dispose();\n this.velocityVB?.dispose();\n this.velocityVB = undefined;\n this.velocityBuffer = undefined;\n }\n\n private buildExpandableBuffers(): void {\n const engine = this.scene.getEngine();\n\n this.offsetBuffer = new Float32Array(this.maxParticles * 3);\n this.offsetVB = new VertexBuffer(engine, this.offsetBuffer, 'offset', true, false, 3, true);\n this.mesh.setVerticesBuffer(this.offsetVB);\n\n this.colorBuffer = new Float32Array(this.maxParticles * 4);\n this.colorVB = new VertexBuffer(engine, this.colorBuffer, 'color', true, false, 4, true);\n this.mesh.setVerticesBuffer(this.colorVB);\n\n this.sizeBuffer = new Float32Array(this.maxParticles * 3);\n this.sizeVB = new VertexBuffer(engine, this.sizeBuffer, 'size', true, false, 3, true);\n this.mesh.setVerticesBuffer(this.sizeVB);\n\n this.uvTileBuffer = new Float32Array(this.maxParticles);\n this.uvTileVB = new VertexBuffer(engine, this.uvTileBuffer, 'uvTile', true, false, 1, true);\n this.mesh.setVerticesBuffer(this.uvTileVB);\n\n if (this.settings.renderMode === RenderMode.Mesh) {\n this.rotationBuffer = new Float32Array(this.maxParticles * 4);\n this.rotationVB = new VertexBuffer(engine, this.rotationBuffer, 'rotation', true, false, 4, true);\n } else {\n this.rotationBuffer = new Float32Array(this.maxParticles);\n this.rotationVB = new VertexBuffer(engine, this.rotationBuffer, 'rotation', true, false, 1, true);\n }\n this.mesh.setVerticesBuffer(this.rotationVB);\n\n if (this.settings.renderMode === RenderMode.StretchedBillBoard) {\n this.velocityBuffer = new Float32Array(this.maxParticles * 4);\n this.velocityVB = new VertexBuffer(engine, this.velocityBuffer, 'velocity', true, false, 4, true);\n this.mesh.setVerticesBuffer(this.velocityVB);\n }\n\n this.mesh.forcedInstanceCount = 0;\n this.mesh.doNotSyncBoundingInfo = true;\n }\n\n expandBuffers(target: number): void {\n while (target >= this.maxParticles) {\n this.maxParticles *= 2;\n }\n this.disposeExpandableBuffers();\n this.buildExpandableBuffers();\n }\n\n rebuildMaterial(): void {\n // The shader sources only depend on the render mode, so the store entry is\n // registered once per mode. A unique name per rebuild would leak entries in\n // Effect.ShadersStore and defeat Babylon's compiled-effect cache.\n const shaderName = `quarksParticle_${this.settings.renderMode}`;\n this.lastStretchedSpeedFactor = Number.NaN;\n const defines: string[] = [];\n\n let vertexShader: ShaderSources;\n let fragmentShader: ShaderSources;\n if (this.settings.renderMode === RenderMode.Mesh) {\n vertexShader = {glsl: local_particle_physics_vert, wgsl: local_particle_physics_vert_wgsl};\n fragmentShader = {glsl: particle_physics_frag, wgsl: particle_physics_frag_wgsl};\n } else if (this.settings.renderMode === RenderMode.StretchedBillBoard) {\n vertexShader = {glsl: stretched_bb_particle_vert, wgsl: stretched_bb_particle_vert_wgsl};\n fragmentShader = {glsl: particle_frag, wgsl: particle_frag_wgsl};\n } else {\n vertexShader = {glsl: particle_vert, wgsl: particle_vert_wgsl};\n fragmentShader = {glsl: particle_frag, wgsl: particle_frag_wgsl};\n }\n\n // Mesh batches without a diffuse map still need a sampler2D on iOS WebKit —\n // a zero-sampler particle mesh effect often never becomes drawable there.\n const mapTexture =\n this.settings.texture ??\n (this.settings.renderMode === RenderMode.Mesh ? SpriteBatch.whiteTexture(this.scene) : null);\n if (mapTexture) {\n defines.push('USE_MAP');\n }\n const atlas = this.settings.reflectionAtlas;\n const atlasPending = this.settings.renderMode === RenderMode.Mesh && !!atlas && !atlas.isReady();\n if (atlasPending && atlas) {\n const onLoad = (atlas as {onLoadObservable?: {addOnce: (cb: () => void) => void}}).onLoadObservable;\n onLoad?.addOnce(() => {\n this.rebuildMaterial();\n });\n }\n const useEnvAtlas = this.settings.renderMode === RenderMode.Mesh && !!atlas && atlas.isReady();\n if (useEnvAtlas) {\n defines.push('USE_ENVMAP_ATLAS');\n }\n if (this.settings.uTileCount > 1 || this.settings.vTileCount > 1) {\n defines.push('UV_TILE');\n }\n if (this.settings.blendTiles) {\n defines.push('TILE_BLEND');\n }\n if (this.settings.softParticles) {\n defines.push('SOFT_PARTICLES');\n }\n if (this.settings.materialAlphaTest > 0) {\n defines.push('USE_ALPHATEST');\n }\n if (this.settings.renderMode === RenderMode.VerticalBillBoard) {\n defines.push('VERTICAL');\n }\n if (this.settings.renderMode === RenderMode.HorizontalBillBoard) {\n defines.push('HORIZONTAL');\n }\n const pivot = SpriteBatch.takesPivotAndFlip(this.settings.renderMode) ? this.settings.pivot : undefined;\n if (pivot) {\n defines.push('PIVOT');\n }\n\n const shaderLanguage = shaderLanguageFor(this.scene.getEngine());\n registerShaders(shaderName, vertexShader, fragmentShader, shaderLanguage);\n\n const attributes = ['position', 'uv', 'offset', 'color', 'size', 'rotation', 'uvTile'];\n if (this.settings.renderMode === RenderMode.Mesh) {\n attributes.push('normal');\n }\n if (this.settings.renderMode === RenderMode.StretchedBillBoard) {\n attributes.push('velocity');\n }\n\n const uniforms = ['world', 'view', 'projection', 'worldView', 'worldViewProjection'];\n const samplers: string[] = [];\n\n if (this.settings.uTileCount > 1 || this.settings.vTileCount > 1) {\n uniforms.push('tileCountX');\n uniforms.push('tileCountY');\n }\n if (mapTexture) {\n samplers.push('map');\n }\n if (useEnvAtlas) {\n samplers.push('envAtlas');\n uniforms.push('eyePosition');\n uniforms.push('reflectionLevel');\n }\n if (this.settings.renderMode === RenderMode.StretchedBillBoard) {\n uniforms.push('speedFactor');\n }\n if (this.settings.softParticles) {\n uniforms.push('softParams');\n uniforms.push('projParams');\n samplers.push('depthTexture');\n }\n if (this.settings.materialAlphaTest > 0) {\n uniforms.push('alphaTest');\n }\n if (pivot) {\n uniforms.push('pivot');\n }\n if (this.settings.renderMode === RenderMode.Mesh) {\n uniforms.push('lightDirection');\n uniforms.push('lightColor');\n uniforms.push('ambientColor');\n }\n\n const mat = new ShaderMaterial(\n shaderName,\n this.scene,\n {vertex: shaderName, fragment: shaderName},\n {\n attributes,\n uniforms,\n samplers,\n defines,\n needAlphaBlending: this.settings.materialTransparent,\n shaderLanguage,\n }\n );\n\n if (mapTexture) {\n mat.setTexture('map', mapTexture);\n }\n if (useEnvAtlas && atlas) {\n mat.setTexture('envAtlas', atlas);\n mat.setFloat('reflectionLevel', this.settings.reflectionLevel);\n const eyePosition = new BVector3();\n mat.onBindObservable.add(() => {\n const camera = this.scene.activeCamera;\n if (!camera) {\n return;\n }\n eyePosition.copyFrom(camera.globalPosition);\n mat.setVector3('eyePosition', eyePosition);\n });\n }\n if (this.settings.uTileCount > 1 || this.settings.vTileCount > 1) {\n mat.setFloat('tileCountX', this.settings.uTileCount);\n mat.setFloat('tileCountY', this.settings.vTileCount);\n }\n if (this.settings.renderMode === RenderMode.StretchedBillBoard) {\n mat.setFloat('speedFactor', this.settings.softNearFade > 0 ? this.settings.softNearFade : 1.0);\n }\n if (this.settings.softParticles) {\n mat.setVector2(\n 'softParams',\n new BVector2(\n this.settings.softNearFade,\n 1.0 / Math.max(this.settings.softFarFade - this.settings.softNearFade, 0.0001)\n )\n );\n // Reused across binds: this runs on every draw call.\n const projParams = new BVector4(0, 0, 0, 0);\n mat.onBindObservable.add(() => {\n const camera = this.scene.activeCamera;\n if (camera) {\n projParams.x = camera.minZ;\n projParams.y = camera.maxZ;\n mat.setVector4('projParams', projParams);\n }\n });\n }\n if (this.settings.materialAlphaTest > 0) {\n mat.setFloat('alphaTest', this.settings.materialAlphaTest);\n }\n if (pivot) {\n mat.setVector3('pivot', new BVector3(pivot.x, pivot.y, pivot.z));\n }\n if (this.settings.renderMode === RenderMode.Mesh) {\n mat.setVector3('lightDirection', new BVector3(0.4, -1, 0.6));\n mat.setVector3('lightColor', new BVector3(1, 1, 1));\n mat.setVector3('ambientColor', new BVector3(0.35, 0.35, 0.35));\n }\n\n mat.backFaceCulling = false;\n\n if (this.settings.materialTransparent) {\n mat.alphaMode = this.settings.materialBlendMode;\n } else {\n mat.alphaMode = Constants.ALPHA_DISABLE;\n }\n mat.needDepthPrePass = this.settings.materialDepthWrite;\n mat.forceDepthWrite = this.settings.materialDepthWrite;\n mat.disableDepthWrite = !this.settings.materialDepthWrite;\n\n this.mesh.material = mat;\n this.shaderMaterial = mat;\n }\n\n private vector_ = new Vector3();\n private vector2_ = new Vector3();\n private vector3_ = new Vector3();\n private quaternion_ = new Quaternion();\n private quaternion2_ = new Quaternion();\n private quaternion3_ = new Quaternion();\n private quaternion4_ = new Quaternion();\n private quaternion5_ = new Quaternion();\n private rotationMat_ = new Matrix3();\n private rotationMat2_ = new Matrix3();\n private lastStretchedSpeedFactor = Number.NaN;\n /** Slot 0 holds the zero-alpha instance since the batch last went empty. */\n private clearedInstanceUploaded = false;\n\n update(): void {\n let index = 0;\n let particleCount = 0;\n const renderMode = this.settings.renderMode;\n const isMeshRender = renderMode === RenderMode.Mesh;\n const isStretchedRender = renderMode === RenderMode.StretchedBillBoard;\n const flipsSprites = SpriteBatch.takesPivotAndFlip(renderMode);\n\n const visibleSystems = this.getVisibleSystems();\n for (let i = 0; i < visibleSystems.length; i++) {\n particleCount += visibleSystems[i].particleNum;\n }\n if (particleCount > this.maxParticles) {\n this.expandBuffers(particleCount);\n }\n\n for (let s = 0; s < visibleSystems.length; s++) {\n const system = visibleSystems[s];\n const particleNum = system.particleNum;\n // A finished or between-bursts system adds nothing to the batch. With many effects\n // loaded most systems are idle at any moment, so skip their per-system setup.\n if (particleNum === 0) {\n continue;\n }\n const particles = system.particles;\n const rotation = this.quaternion2_;\n const translation = this.vector2_;\n const scale = this.vector3_;\n const systemWorldSpace = system.worldSpace;\n const emitterMatrix = system.emitter.matrixWorld;\n // Only a local-space mesh needs the emitter's turn as a quaternion, and only a\n // local-space stretched billboard its rotation matrix. Everything else needs at most\n // the scale, which the basis column lengths give without a full decompose.\n if (isMeshRender && !systemWorldSpace) {\n emitterMatrix.decompose(translation, rotation, scale);\n } else {\n const e = emitterMatrix.elements;\n scale.set(\n Math.sqrt(e[0] * e[0] + e[1] * e[1] + e[2] * e[2]),\n Math.sqrt(e[4] * e[4] + e[5] * e[5] + e[6] * e[6]),\n Math.sqrt(e[8] * e[8] + e[9] * e[9] + e[10] * e[10])\n );\n }\n if (isStretchedRender && !systemWorldSpace) {\n this.rotationMat_.setFromMatrix4(emitterMatrix);\n }\n const absScaleX = Math.abs(scale.x);\n const absScaleY = Math.abs(scale.y);\n const absScaleZ = Math.abs(scale.z);\n // Stretched-billboard settings are per system, not per particle.\n const stretchedSettings = isStretchedRender\n ? (system.rendererEmitterSettings as StretchedBillBoardSettings)\n : undefined;\n const speedFactor =\n stretchedSettings === undefined || stretchedSettings.speedFactor === 0\n ? 0.001\n : stretchedSettings.speedFactor;\n const lengthFactor = stretchedSettings?.lengthFactor ?? 0;\n\n // Live particles occupy store rows [0, particleNum) in the same order\n // this loop writes them, so attributes that need no per-particle\n // transform can be copied as one range instead of gathered.\n const store = system.store;\n const copiedColor = store !== undefined;\n // Particles only carry their own parent transform when the system\n // emits through another one; otherwise the whole range shares the\n // emitter's matrix and can be transformed in place after the copy.\n const sharedTransform = store !== undefined && system.onlyUsedByOther !== true;\n // The simulation runs on a fixed step that the display does not\n // share, so the last step is usually in the past by the time the\n // frame is drawn. Continuing the motion that step produced puts each\n // particle where it belongs now; without it they visibly stutter on\n // any display that is not exactly 60Hz and in phase.\n //\n // The motion is measured, not predicted from velocity: plenty of\n // behaviors move a particle by writing its position — orbits, noise,\n // turbulence, anything a plugin does — and a velocity based guess\n // leaves every one of those stuttering exactly as before.\n const residual = system.simulationResidual ?? 0;\n const stepFraction = residual === 0 ? 0 : residual / (system.simulationStep ?? residual);\n if (copiedColor) {\n if (stepFraction !== 0 && particleNum > 0) {\n SpriteBatch.continueColor(this.colorBuffer, index * 4, store!, particleNum, stepFraction);\n } else {\n this.colorBuffer.set(store!.color.subarray(0, particleNum * 4), index * 4);\n }\n }\n let copiedPositionAndSize = false;\n if (store !== undefined && systemWorldSpace) {\n if (stepFraction !== 0 && particleNum > 0) {\n SpriteBatch.extrapolate(this.offsetBuffer, index * 3, store, particleNum, stepFraction);\n } else {\n this.offsetBuffer.set(store.position.subarray(0, particleNum * 3), index * 3);\n }\n if (stepFraction !== 0 && particleNum > 0) {\n SpriteBatch.continueVector3(\n this.sizeBuffer,\n index * 3,\n store.size,\n store.previousSize,\n particleNum,\n stepFraction\n );\n } else {\n this.sizeBuffer.set(store.size.subarray(0, particleNum * 3), index * 3);\n }\n copiedPositionAndSize = true;\n } else if (sharedTransform && particleNum > 0) {\n const base = index * 3;\n const end = base + particleNum * 3;\n const offsets = this.offsetBuffer;\n if (stepFraction !== 0) {\n SpriteBatch.extrapolate(offsets, base, store!, particleNum, stepFraction);\n } else {\n offsets.set(store!.position.subarray(0, particleNum * 3), base);\n }\n const me = emitterMatrix.elements;\n const m00 = me[0],\n m01 = me[1],\n m02 = me[2],\n m03 = me[3];\n const m10 = me[4],\n m11 = me[5],\n m12 = me[6],\n m13 = me[7];\n const m20 = me[8],\n m21 = me[9],\n m22 = me[10],\n m23 = me[11];\n const m30 = me[12],\n m31 = me[13],\n m32 = me[14],\n m33 = me[15];\n for (let o = base; o < end; o += 3) {\n const px = offsets[o];\n const py = offsets[o + 1];\n const pz = offsets[o + 2];\n const w = 1 / (m03 * px + m13 * py + m23 * pz + m33);\n offsets[o] = (m00 * px + m10 * py + m20 * pz + m30) * w;\n offsets[o + 1] = (m01 * px + m11 * py + m21 * pz + m31) * w;\n offsets[o + 2] = (m02 * px + m12 * py + m22 * pz + m32) * w;\n }\n const sizes = this.sizeBuffer;\n if (stepFraction !== 0) {\n SpriteBatch.continueVector3(\n sizes,\n base,\n store!.size,\n store!.previousSize,\n particleNum,\n stepFraction\n );\n } else {\n sizes.set(store!.size.subarray(0, particleNum * 3), base);\n }\n for (let o = base; o < end; o += 3) {\n sizes[o] *= absScaleX;\n sizes[o + 1] *= absScaleY;\n sizes[o + 2] *= absScaleZ;\n }\n copiedPositionAndSize = true;\n }\n\n const firstIndex = index;\n for (let j = 0; j < particleNum; j++, index++) {\n const particle = particles[j] as SpriteParticle;\n\n if (isMeshRender) {\n // Turning behaviors leave the last step's turn on the\n // particle; a fraction of it carries the mesh the rest of\n // the way to now.\n let own = particle.rotation as Quaternion;\n const step = particle.angularVelocity;\n if (stepFraction !== 0 && step instanceof Quaternion) {\n own = this.quaternion4_\n .copy(own)\n .multiply(SpriteBatch.partialTurn(step, stepFraction, this.quaternion5_));\n }\n let q: Quaternion;\n if (systemWorldSpace) {\n q = own;\n } else {\n let parentQ: Quaternion;\n if (particle.parentMatrix) {\n parentQ = this.quaternion3_.setFromRotationMatrix(particle.parentMatrix);\n } else {\n parentQ = rotation;\n }\n q = this.quaternion_;\n q.copy(parentQ).multiply(own);\n }\n const ri = index * 4;\n this.rotationBuffer[ri] = q.x;\n this.rotationBuffer[ri + 1] = q.y;\n this.rotationBuffer[ri + 2] = q.z;\n this.rotationBuffer[ri + 3] = q.w;\n } else {\n const spin = particle.angularVelocity;\n this.rotationBuffer[index] =\n (particle.rotation as number) + (typeof spin === 'number' ? spin * residual : 0);\n }\n\n if (!copiedPositionAndSize) {\n const position = particle.position;\n const previous = particle.previousPosition;\n let px = position.x + (position.x - previous.x) * stepFraction;\n let py = position.y + (position.y - previous.y) * stepFraction;\n let pz = position.z + (position.z - previous.z) * stepFraction;\n if (!systemWorldSpace) {\n // Inlined point transform: this is the default (local space)\n // path and runs for every particle every frame.\n const me = (particle.parentMatrix ?? emitterMatrix).elements;\n const w = 1 / (me[3] * px + me[7] * py + me[11] * pz + me[15]);\n const tx = (me[0] * px + me[4] * py + me[8] * pz + me[12]) * w;\n const ty = (me[1] * px + me[5] * py + me[9] * pz + me[13]) * w;\n pz = (me[2] * px + me[6] * py + me[10] * pz + me[14]) * w;\n px = tx;\n py = ty;\n }\n\n const oi = index * 3;\n this.offsetBuffer[oi] = px;\n this.offsetBuffer[oi + 1] = py;\n this.offsetBuffer[oi + 2] = pz;\n\n const size = particle.size;\n const si = index * 3;\n // Particle size is already in world units when the system is in world\n // space or the particle carries its own parent transform.\n if (systemWorldSpace || particle.parentMatrix) {\n this.sizeBuffer[si] = size.x;\n this.sizeBuffer[si + 1] = size.y;\n this.sizeBuffer[si + 2] = size.z;\n } else {\n this.sizeBuffer[si] = size.x * absScaleX;\n this.sizeBuffer[si + 1] = size.y * absScaleY;\n this.sizeBuffer[si + 2] = size.z * absScaleZ;\n }\n }\n\n if (!copiedColor) {\n const color = particle.color;\n const ci = index * 4;\n this.colorBuffer[ci] = color.x;\n this.colorBuffer[ci + 1] = color.y;\n this.colorBuffer[ci + 2] = color.z;\n this.colorBuffer[ci + 3] = color.w;\n }\n\n this.uvTileBuffer[index] = particle.uvTile;\n\n if (isStretchedRender && this.velocityBuffer) {\n // The streak points along the velocity and is as long as it,\n // so a velocity frozen between steps makes the sprite's\n // outline pop at the step rate while its position glides.\n const velocity = particle.velocity;\n const previousVelocity = particle.previousVelocity;\n const vx = velocity.x + (velocity.x - previousVelocity.x) * stepFraction;\n const vy = velocity.y + (velocity.y - previousVelocity.y) * stepFraction;\n const vz = velocity.z + (velocity.z - previousVelocity.z) * stepFraction;\n let vel: Vector3 = this.vector_;\n vel.set(vx, vy, vz);\n if (!systemWorldSpace) {\n if (particle.parentMatrix) {\n this.rotationMat2_.setFromMatrix4(particle.parentMatrix);\n vel.applyMatrix3(this.rotationMat2_);\n } else {\n vel.applyMatrix3(this.rotationMat_);\n }\n }\n const vi = index * 4;\n this.velocityBuffer[vi] = vel.x * speedFactor;\n this.velocityBuffer[vi + 1] = vel.y * speedFactor;\n this.velocityBuffer[vi + 2] = vel.z * speedFactor;\n this.velocityBuffer[vi + 3] = lengthFactor;\n }\n }\n\n if (flipsSprites && system.flip !== undefined) {\n SpriteBatch.applyFlip(this.sizeBuffer, firstIndex * 3, particles, particleNum);\n }\n }\n\n if (isStretchedRender && visibleSystems.length > 0) {\n this.syncStretchedSpeedFactor(visibleSystems[0]);\n }\n\n // Keep the mesh enabled even when count is 0 — toggling visibility off for a\n // single frame (common with short lifetimes + low emission overlap) causes flicker.\n this.mesh.forcedInstanceCount = index;\n\n if (index === 0) {\n // Slot 0 only needs clearing once per stretch of empty frames; re-uploading it every\n // frame cost five buffer uploads per idle batch per frame.\n if (!this.clearedInstanceUploaded) {\n this.uploadClearedInstance(isMeshRender, isStretchedRender);\n this.clearedInstanceUploaded = true;\n }\n return;\n }\n this.clearedInstanceUploaded = false;\n\n // Upload only the slots actually filled this frame: the buffers are sized\n // for the high-water mark and are usually far larger than the live count.\n this.offsetVB.update(this.offsetBuffer.subarray(0, index * 3));\n this.sizeVB.update(this.sizeBuffer.subarray(0, index * 3));\n this.colorVB.update(this.colorBuffer.subarray(0, index * 4));\n this.uvTileVB.update(this.uvTileBuffer.subarray(0, index));\n this.rotationVB.update(this.rotationBuffer.subarray(0, isMeshRender ? index * 4 : index));\n if (isStretchedRender && this.velocityVB && this.velocityBuffer) {\n this.velocityVB.update(this.velocityBuffer.subarray(0, index * 4));\n }\n }\n\n /**\n * Pushes the stretched-billboard speed factor to the shader when it changed.\n *\n * Deliberately kept out of `update`: touching the loosely typed\n * `mesh.material` from inside that function gives V8 a generic property\n * access it has no feedback for, which knocks the whole particle loop out of\n * optimised code on every frame.\n */\n private syncStretchedSpeedFactor(system: IParticleSystem): void {\n const material = this.shaderMaterial;\n if (material === null) {\n return;\n }\n const speedFactor = (system.rendererEmitterSettings as StretchedBillBoardSettings).speedFactor ?? 1.0;\n const clampedSpeedFactor = speedFactor === 0 ? 0.001 : speedFactor;\n if (clampedSpeedFactor !== this.lastStretchedSpeedFactor) {\n material.setFloat('speedFactor', clampedSpeedFactor);\n this.lastStretchedSpeedFactor = clampedSpeedFactor;\n }\n }\n\n /** The quads that take a pivot and flip: every billboard kind, stretched included, but not meshes. */\n private static takesPivotAndFlip(renderMode: RenderMode): boolean {\n return (\n renderMode === RenderMode.BillBoard ||\n renderMode === RenderMode.StretchedBillBoard ||\n renderMode === RenderMode.VerticalBillBoard ||\n renderMode === RenderMode.HorizontalBillBoard\n );\n }\n\n /**\n * Negates the size of each flipped particle along the axes it flips on,\n * starting at `base` in `sizes`. The billboard shader scales the quad by\n * the size, so a negative one mirrors it — and with it the texture, the\n * quad being centred — the way Unity's renderer Flip mirrors U and V. The\n * stretched shader reads the sign and mirrors the texture coordinates.\n */\n private static applyFlip(sizes: Float32Array, base: number, particles: IParticle[], count: number): void {\n for (let j = 0, o = base; j < count; j++, o += 3) {\n const flip = (particles[j] as SpriteParticle).flip;\n if (flip !== 0) {\n if (flip & 1) sizes[o] = -sizes[o];\n if (flip & 2) sizes[o + 1] = -sizes[o + 1];\n }\n }\n }\n\n /**\n * The fraction `f` of a turn, as a normalised lerp from no rotation toward\n * `step`, written into `out`.\n *\n * A true slerp would be exact, but `step` is one simulation step of turning\n * and `f` is below 1, so the arc being split is small enough that the lerp\n * is within a rounding error of it and costs a fraction as much.\n */\n private static partialTurn(step: Quaternion, f: number, out: Quaternion): Quaternion {\n const x = step.x * f;\n const y = step.y * f;\n const z = step.z * f;\n const w = 1 + (step.w - 1) * f;\n const inverseLength = 1 / Math.sqrt(x * x + y * y + z * z + w * w);\n out.x = x * inverseLength;\n out.y = y * inverseLength;\n out.z = z * inverseLength;\n out.w = w * inverseLength;\n return out;\n }\n\n /**\n * Continues a three-component column by `fraction` of the step it just took,\n * never below zero.\n *\n * Size fades to nothing at the end of a life, so the last step before death\n * can point past zero; a negative size turns a sprite inside out.\n */\n private static continueVector3(\n target: Float32Array,\n base: number,\n current: Float32Array,\n previous: Float32Array,\n count: number,\n fraction: number\n ): void {\n for (let i = 0, o = 0; i < count; i++, o += 3) {\n const x = current[o] + (current[o] - previous[o]) * fraction;\n const y = current[o + 1] + (current[o + 1] - previous[o + 1]) * fraction;\n const z = current[o + 2] + (current[o + 2] - previous[o + 2]) * fraction;\n target[base + o] = x > 0 ? x : 0;\n target[base + o + 1] = y > 0 ? y : 0;\n target[base + o + 2] = z > 0 ? z : 0;\n }\n }\n\n /** The same for colour, whose alpha runs out at the end of a life too. */\n private static continueColor(\n target: Float32Array,\n base: number,\n store: ParticleStore,\n count: number,\n fraction: number\n ): void {\n const current = store.color;\n const previous = store.previousColor;\n for (let i = 0, o = 0; i < count; i++, o += 4) {\n const r = current[o] + (current[o] - previous[o]) * fraction;\n const g = current[o + 1] + (current[o + 1] - previous[o + 1]) * fraction;\n const b = current[o + 2] + (current[o + 2] - previous[o + 2]) * fraction;\n const a = current[o + 3] + (current[o + 3] - previous[o + 3]) * fraction;\n target[base + o] = r > 0 ? r : 0;\n target[base + o + 1] = g > 0 ? g : 0;\n target[base + o + 2] = b > 0 ? b : 0;\n target[base + o + 3] = a > 0 ? a : 0;\n }\n }\n\n /**\n * Writes rows `[0, count)` of the store's positions into `target` at `base`,\n * each carried on by `fraction` of the step it just took.\n *\n * Continuing the measured last step covers every way a particle can move —\n * velocity integration, an orbit, noise, a plugin's own behavior — because\n * it reads what happened rather than predicting from one term of it. Over\n * less than a step it is a straight line through a path that may curve,\n * which for a sixtieth of a second is well under a pixel.\n *\n * A particle born during the step has the same position on both sides and\n * so does not move at all, which is what puts it at the emitter rather than\n * a step's travel away from it.\n */\n private static extrapolate(\n target: Float32Array,\n base: number,\n store: ParticleStore,\n count: number,\n fraction: number\n ): void {\n const positions = store.position;\n const previous = store.previousPosition;\n for (let i = 0, o = 0; i < count; i++, o += 3) {\n const x = positions[o];\n const y = positions[o + 1];\n const z = positions[o + 2];\n target[base + o] = x + (x - previous[o]) * fraction;\n target[base + o + 1] = y + (y - previous[o + 1]) * fraction;\n target[base + o + 2] = z + (z - previous[o + 2]) * fraction;\n }\n }\n\n /** Pushes a zero-alpha instance so stale instancing data cannot linger on screen. */\n private uploadClearedInstance(isMeshRender: boolean, isStretchedRender: boolean): void {\n this.colorBuffer[3] = 0;\n this.sizeBuffer[0] = 0;\n this.sizeBuffer[1] = 0;\n this.sizeBuffer[2] = 0;\n this.colorVB.update(this.colorBuffer.subarray(0, 4));\n this.sizeVB.update(this.sizeBuffer.subarray(0, 3));\n this.offsetVB.update(this.offsetBuffer.subarray(0, 3));\n this.uvTileVB.update(this.uvTileBuffer.subarray(0, 1));\n if (isMeshRender) {\n this.rotationVB.update(this.rotationBuffer.subarray(0, 4));\n } else {\n this.rotationVB.update(this.rotationBuffer.subarray(0, 1));\n }\n if (isStretchedRender && this.velocityVB && this.velocityBuffer) {\n this.velocityVB.update(this.velocityBuffer.subarray(0, 4));\n }\n }\n\n dispose(): void {\n if (this.mesh.material) {\n this.mesh.material.dispose();\n }\n super.dispose();\n }\n}\n","export default /* wgsl */ `\nattribute position: vec3f;\nattribute uv: vec2f;\nattribute normal: vec3f;\nattribute offset: vec3f;\nattribute color: vec4f;\nattribute size: vec3f;\nattribute rotation: vec4f;\nattribute uvTile: f32;\n\nuniform world: mat4x4f;\nuniform view: mat4x4f;\nuniform projection: mat4x4f;\n\n#ifdef UV_TILE\nuniform tileCountX: f32;\nuniform tileCountY: f32;\n#endif\n\nvarying vUV: vec2f;\nvarying vColor: vec4f;\nvarying vNormal: vec3f;\nvarying vWorldPos: vec3f;\n\n#ifdef TILE_BLEND\nvarying vUV2: vec2f;\nvarying vTileBlend: f32;\n#endif\n\n#ifdef SOFT_PARTICLES\nvarying projPosition: vec4f;\nvarying linearDepth: f32;\n#endif\n\nfn applyQuaternion(v: vec3f, q: vec4f) -> vec3f {\n let qVec = q.xyz;\n let qW = q.w;\n let t = 2.0 * cross(qVec, v);\n return v + qW * t + cross(qVec, t);\n}\n\n@vertex\nfn main(input: VertexInputs) -> FragmentInputs {\n let scaledPosition = vertexInputs.position * vertexInputs.size;\n let rotatedPosition = applyQuaternion(scaledPosition, vertexInputs.rotation);\n let rotatedNormal = normalize(applyQuaternion(vertexInputs.normal, vertexInputs.rotation));\n let localPos = rotatedPosition + vertexInputs.offset;\n\n let worldPos = uniforms.world * vec4f(localPos, 1.0);\n let viewPos = uniforms.view * worldPos;\n let clipPosition = uniforms.projection * viewPos;\n vertexOutputs.position = clipPosition;\n\n vertexOutputs.vWorldPos = worldPos.xyz;\n vertexOutputs.vNormal = normalize((uniforms.world * vec4f(rotatedNormal, 0.0)).xyz);\n\n#ifdef SOFT_PARTICLES\n vertexOutputs.projPosition = clipPosition;\n vertexOutputs.linearDepth = -viewPos.z;\n#endif\n\n#ifdef UV_TILE\n let tc = vec2f(uniforms.tileCountX, uniforms.tileCountY);\n let baseTile = floor(vertexInputs.uvTile);\n let tileU = (baseTile % tc.x) / tc.x;\n let tileV = 1.0 - floor(baseTile / tc.x) / tc.y - 1.0 / tc.y;\n vertexOutputs.vUV = vertexInputs.uv / tc + vec2f(tileU, tileV);\n #ifdef TILE_BLEND\n let nextTile = ceil(vertexInputs.uvTile);\n let nextU = (nextTile % tc.x) / tc.x;\n let nextV = 1.0 - floor(nextTile / tc.x) / tc.y - 1.0 / tc.y;\n vertexOutputs.vUV2 = vertexInputs.uv / tc + vec2f(nextU, nextV);\n vertexOutputs.vTileBlend = fract(vertexInputs.uvTile);\n #endif\n#else\n vertexOutputs.vUV = vertexInputs.uv;\n#endif\n\n vertexOutputs.vColor = vertexInputs.color;\n}\n`;\n","export default /* wgsl */ `\nvarying vUV: vec2f;\nvarying vColor: vec4f;\nvarying vNormal: vec3f;\nvarying vWorldPos: vec3f;\n\nuniform lightDirection: vec3f;\nuniform lightColor: vec3f;\nuniform ambientColor: vec3f;\n\n#ifdef TILE_BLEND\nvarying vUV2: vec2f;\nvarying vTileBlend: f32;\n#endif\n\n#ifdef USE_MAP\nvar mapSampler: sampler;\nvar map: texture_2d<f32>;\n#endif\n\n#ifdef USE_ENVMAP_ATLAS\nvar envAtlasSampler: sampler;\nvar envAtlas: texture_2d<f32>;\nuniform eyePosition: vec3f;\nuniform reflectionLevel: f32;\n\nfn sampleEnvAtlas(r: vec3f) -> vec3f {\n let a = abs(r);\n var localUV: vec2f;\n var cellX: f32;\n var cellY: f32;\n if (a.x >= a.y && a.x >= a.z) {\n cellX = 0.0;\n if (r.x >= 0.0) {\n cellY = 0.0;\n localUV = vec2f(-r.z, -r.y) / a.x * 0.5 + 0.5;\n } else {\n cellY = 1.0;\n localUV = vec2f(r.z, -r.y) / a.x * 0.5 + 0.5;\n }\n } else if (a.y >= a.z) {\n cellX = 1.0;\n if (r.y >= 0.0) {\n cellY = 0.0;\n localUV = vec2f(r.x, r.z) / a.y * 0.5 + 0.5;\n } else {\n cellY = 1.0;\n localUV = vec2f(r.x, -r.z) / a.y * 0.5 + 0.5;\n }\n } else {\n cellX = 2.0;\n if (r.z >= 0.0) {\n cellY = 0.0;\n localUV = vec2f(r.x, -r.y) / a.z * 0.5 + 0.5;\n } else {\n cellY = 1.0;\n localUV = vec2f(-r.x, -r.y) / a.z * 0.5 + 0.5;\n }\n }\n let uv = (vec2f(cellX, cellY) + clamp(localUV, vec2f(0.0), vec2f(1.0))) / vec2f(3.0, 2.0);\n return textureSample(envAtlas, envAtlasSampler, uv).rgb;\n}\n#endif\n\n#ifdef SOFT_PARTICLES\nvar depthTextureSampler: sampler;\nvar depthTexture: texture_2d<f32>;\nuniform softParams: vec2f;\nuniform projParams: vec4f;\nvarying projPosition: vec4f;\nvarying linearDepth: f32;\n#endif\n\n#ifdef USE_ALPHATEST\nuniform alphaTest: f32;\n#endif\n\n@fragment\nfn main(input: FragmentInputs) -> FragmentOutputs {\n var baseColor = fragmentInputs.vColor;\n\n#ifdef USE_MAP\n var texColor = textureSample(map, mapSampler, fragmentInputs.vUV);\n #ifdef TILE_BLEND\n let texColor2 = textureSample(map, mapSampler, fragmentInputs.vUV2);\n texColor = mix(texColor, texColor2, fragmentInputs.vTileBlend);\n #endif\n baseColor *= texColor;\n#endif\n\n#ifdef USE_ALPHATEST\n if (baseColor.a < uniforms.alphaTest) { discard; }\n#else\n if (baseColor.a < 0.01) { discard; }\n#endif\n\n let N = normalize(fragmentInputs.vNormal);\n let L = normalize(-uniforms.lightDirection);\n let NdotL = max(dot(N, L), 0.0);\n let litColor = uniforms.ambientColor + uniforms.lightColor * NdotL;\n\n var color = baseColor.rgb * litColor;\n\n#ifdef USE_ENVMAP_ATLAS\n let viewDir = normalize(fragmentInputs.vWorldPos - uniforms.eyePosition);\n let reflectionCoords = reflect(viewDir, N);\n color += sampleEnvAtlas(reflectionCoords) * uniforms.reflectionLevel;\n#endif\n\n var finalColor = vec4f(color, baseColor.a);\n\n#ifdef SOFT_PARTICLES\n var p2 = fragmentInputs.projPosition.xy / fragmentInputs.projPosition.w;\n p2 = 0.5 * p2 + 0.5;\n let readDepth = textureSample(depthTexture, depthTextureSampler, p2).r;\n let zNear = uniforms.projParams.x;\n let zFar = uniforms.projParams.y;\n let viewDepth = (zFar * zNear) / (zFar - readDepth * (zFar - zNear));\n let fade = clamp(uniforms.softParams.y * ((viewDepth - uniforms.softParams.x) - fragmentInputs.linearDepth), 0.0, 1.0);\n finalColor *= fade;\n#endif\n\n fragmentOutputs.color = finalColor;\n}\n`;\n","export default /* wgsl */ `\n// Per-vertex attributes\nattribute position: vec3f;\nattribute uv: vec2f;\n\n// Per-instance attributes\nattribute offset: vec3f;\nattribute color: vec4f;\nattribute size: vec3f;\nattribute rotation: f32;\nattribute uvTile: f32;\n\n// Uniforms\nuniform world: mat4x4f;\nuniform view: mat4x4f;\nuniform projection: mat4x4f;\n\n#ifdef UV_TILE\nuniform tileCountX: f32;\nuniform tileCountY: f32;\n#endif\n\n#ifdef PIVOT\n// Quad offset in particle-size units: xy in the quad's plane, z toward the camera.\nuniform pivot: vec3f;\n#endif\n\n// Varyings\nvarying vUV: vec2f;\nvarying vColor: vec4f;\n#ifdef TILE_BLEND\nvarying vUV2: vec2f;\nvarying vTileBlend: f32;\n#endif\n#ifdef SOFT_PARTICLES\nvarying projPosition: vec4f;\nvarying linearDepth: f32;\n#endif\n\n@vertex\nfn main(input: VertexInputs) -> FragmentInputs {\n let c = cos(vertexInputs.rotation);\n let s = sin(vertexInputs.rotation);\n\n // A negative size mirrors the quad, which is how flipped particles arrive.\n var alignedPosition = vertexInputs.position.xy * vertexInputs.size.xy;\n#ifdef PIVOT\n // The pivot turns with the particle but is not mirrored with it.\n alignedPosition += uniforms.pivot.xy * abs(vertexInputs.size.xy);\n#endif\n let rotatedPosition = vec2f(\n c * alignedPosition.x - s * alignedPosition.y,\n s * alignedPosition.x + c * alignedPosition.y);\n\n#ifdef HORIZONTAL\n var mvPosition = uniforms.world * vec4f(vertexInputs.offset, 1.0);\n mvPosition.x += rotatedPosition.x;\n mvPosition.z -= rotatedPosition.y;\n#ifdef PIVOT\n mvPosition.y += uniforms.pivot.z * abs(vertexInputs.size.x);\n#endif\n mvPosition = uniforms.view * mvPosition;\n#elif defined(VERTICAL)\n var mvPosition = uniforms.world * vec4f(vertexInputs.offset, 1.0);\n mvPosition.y += rotatedPosition.y;\n mvPosition = uniforms.view * mvPosition;\n mvPosition.x += rotatedPosition.x;\n#else\n var mvPosition = uniforms.view * uniforms.world * vec4f(vertexInputs.offset, 1.0);\n mvPosition.x += rotatedPosition.x;\n mvPosition.y += rotatedPosition.y;\n#endif\n#ifdef PIVOT\n#ifndef HORIZONTAL\n // Toward the camera along its view axis, whichever way the view space\n // faces: anything in front of the camera has the sign of the far side.\n mvPosition.z -= sign(mvPosition.z) * uniforms.pivot.z * abs(vertexInputs.size.x);\n#endif\n#endif\n\n let clipPosition = uniforms.projection * mvPosition;\n vertexOutputs.position = clipPosition;\n#ifdef SOFT_PARTICLES\n vertexOutputs.projPosition = clipPosition;\n vertexOutputs.linearDepth = -mvPosition.z;\n#endif\n\n #ifdef UV_TILE\n let tc = vec2f(uniforms.tileCountX, uniforms.tileCountY);\n let baseTile = floor(vertexInputs.uvTile);\n let tileU = (baseTile % tc.x) / tc.x;\n let tileV = 1.0 - floor(baseTile / tc.x) / tc.y - 1.0 / tc.y;\n vertexOutputs.vUV = vertexInputs.uv / tc + vec2f(tileU, tileV);\n #ifdef TILE_BLEND\n let nextTile = ceil(vertexInputs.uvTile);\n let nextU = (nextTile % tc.x) / tc.x;\n let nextV = 1.0 - floor(nextTile / tc.x) / tc.y - 1.0 / tc.y;\n vertexOutputs.vUV2 = vertexInputs.uv / tc + vec2f(nextU, nextV);\n vertexOutputs.vTileBlend = fract(vertexInputs.uvTile);\n #endif\n #else\n vertexOutputs.vUV = vertexInputs.uv;\n #endif\n\n vertexOutputs.vColor = vertexInputs.color;\n}\n`;\n","import {VertexBuffer} from '@babylonjs/core/Buffers/buffer';\nimport {BoundingInfo} from '@babylonjs/core/Culling/boundingInfo';\nimport {Constants} from '@babylonjs/core/Engines/constants';\nimport {ShaderMaterial} from '@babylonjs/core/Materials/shaderMaterial';\nimport {Vector2 as BVector2, Vector3 as BVector3} from '@babylonjs/core/Maths/math.vector';\nimport {Mesh} from '@babylonjs/core/Meshes/mesh';\nimport {Scene} from '@babylonjs/core/scene';\nimport {IParticleSystem, Matrix4, Quaternion, TrailParticle, TrailSettings, Vector3} from 'quarks.core';\nimport {VFXBatchSettings} from './BatchedRenderer';\nimport {registerShaders, shaderLanguageFor} from './shaders/shaderLanguageSupport';\nimport trail_frag from './shaders/trail_frag.glsl';\nimport trail_frag_wgsl from './shaders/trail_frag.wgsl';\nimport trail_vert from './shaders/trail_vert.glsl';\nimport trail_vert_wgsl from './shaders/trail_vert.wgsl';\nimport {VFXBatch} from './VFXBatch';\n\nexport class TrailBatch extends VFXBatch {\n private positionBuffer!: Float32Array;\n private previousBuffer!: Float32Array;\n private nextBuffer!: Float32Array;\n private uvBuffer!: Float32Array;\n private sideBuffer!: Float32Array;\n private widthBuffer!: Float32Array;\n private colorBuffer!: Float32Array;\n private indexBuffer!: Uint32Array;\n /** True while the batch is parked on the degenerate draw, see uploadGeometry. */\n private drawsNothing = false;\n private previousVB!: VertexBuffer;\n private nextVB!: VertexBuffer;\n private sideVB!: VertexBuffer;\n private widthVB!: VertexBuffer;\n\n constructor(settings: VFXBatchSettings, scene: Scene) {\n super(settings, scene);\n // Trail buffers hold two vertices per recorded sample and are the largest\n // per-batch allocation in the library, so start small and let\n // expandBuffers grow to whatever the batch actually needs.\n this.maxParticles = 1024;\n this.setupBuffers();\n this.rebuildMaterial();\n }\n\n setupBuffers(): void {\n this.mesh.dispose();\n this.mesh = new Mesh('trailBatch', this.scene);\n this.mesh.alwaysSelectAsActiveMesh = true;\n this.buildGeometryBuffers();\n }\n\n private buildGeometryBuffers(): void {\n this.positionBuffer = new Float32Array(this.maxParticles * 6);\n this.previousBuffer = new Float32Array(this.maxParticles * 6);\n this.nextBuffer = new Float32Array(this.maxParticles * 6);\n this.uvBuffer = new Float32Array(this.maxParticles * 4);\n this.sideBuffer = new Float32Array(this.maxParticles * 2);\n this.widthBuffer = new Float32Array(this.maxParticles * 2);\n this.colorBuffer = new Float32Array(this.maxParticles * 8);\n this.indexBuffer = new Uint32Array(this.maxParticles * 6);\n\n // Initialize with full-capacity buffers (updatable) and a dummy triangle\n this.positionBuffer[0] = 0;\n this.positionBuffer[1] = 0;\n this.positionBuffer[2] = 0;\n this.positionBuffer[3] = 1;\n this.positionBuffer[4] = 0;\n this.positionBuffer[5] = 0;\n this.positionBuffer[6] = 0;\n this.positionBuffer[7] = 1;\n this.positionBuffer[8] = 0;\n this.positionBuffer[9] = 1;\n this.positionBuffer[10] = 1;\n this.positionBuffer[11] = 0;\n this.indexBuffer[0] = 0;\n this.indexBuffer[1] = 1;\n this.indexBuffer[2] = 2;\n this.indexBuffer[3] = 1;\n this.indexBuffer[4] = 3;\n this.indexBuffer[5] = 2;\n\n // Set standard vertex data with full buffer capacity (updatable)\n this.mesh.setVerticesData(VertexBuffer.PositionKind, this.positionBuffer, true);\n this.mesh.setVerticesData(VertexBuffer.UVKind, this.uvBuffer, true);\n this.mesh.setVerticesData(VertexBuffer.ColorKind, this.colorBuffer, true, 4);\n // The whole array, not just the dummy triangle: this call is what sizes\n // the GPU index buffer, and updateIndices later writes into it without\n // resizing it. Handing it six indices here left a 24 byte buffer that\n // every later frame overran — WebGL tolerated it, WebGPU rejects the\n // draw outright (\"index range does not fit in index buffer size\").\n // The vertex buffers above are already created at full capacity; this\n // was the one that was not.\n this.mesh.setIndices(this.indexBuffer, null, true);\n this.drawsNothing = false;\n if (this.mesh.subMeshes && this.mesh.subMeshes.length > 0) {\n // Until the first update, only the dummy triangle is real.\n this.mesh.subMeshes[0].indexCount = 6;\n }\n const engine = this.scene.getEngine();\n this.previousVB = new VertexBuffer(engine, this.previousBuffer, 'previous', true, false, 3, false);\n this.nextVB = new VertexBuffer(engine, this.nextBuffer, 'next', true, false, 3, false);\n this.sideVB = new VertexBuffer(engine, this.sideBuffer, 'side', true, false, 1, false);\n this.widthVB = new VertexBuffer(engine, this.widthBuffer, 'width', true, false, 1, false);\n this.mesh.setVerticesBuffer(this.previousVB);\n this.mesh.setVerticesBuffer(this.nextVB);\n this.mesh.setVerticesBuffer(this.sideVB);\n this.mesh.setVerticesBuffer(this.widthVB);\n\n // Disable bounding info recomputation\n this.mesh.doNotSyncBoundingInfo = true;\n const min = new BVector3(-10000, -10000, -10000);\n const max = new BVector3(10000, 10000, 10000);\n this.mesh.setBoundingInfo(new BoundingInfo(min, max));\n if (this.mesh.subMeshes) {\n for (const sub of this.mesh.subMeshes) {\n (sub as any)._boundingInfo = this.mesh.getBoundingInfo();\n }\n }\n }\n\n expandBuffers(target: number): void {\n while (target >= this.maxParticles) {\n this.maxParticles *= 2;\n }\n // Release the previous custom attribute buffers; setVerticesBuffer only\n // replaces the reference, so skipping this leaks GPU memory on every grow.\n this.previousVB?.dispose();\n this.nextVB?.dispose();\n this.sideVB?.dispose();\n this.widthVB?.dispose();\n this.buildGeometryBuffers();\n }\n\n rebuildMaterial(): void {\n // Stable name: the trail shader source never varies, so registering it once\n // keeps Effect.ShadersStore bounded and lets Babylon reuse compiled effects.\n const shaderName = 'quarksTrail';\n const defines: string[] = [];\n\n if (this.settings.texture) {\n defines.push('USE_MAP');\n }\n\n const shaderLanguage = shaderLanguageFor(this.scene.getEngine());\n registerShaders(\n shaderName,\n {glsl: trail_vert, wgsl: trail_vert_wgsl},\n {glsl: trail_frag, wgsl: trail_frag_wgsl},\n shaderLanguage\n );\n\n const attributes = ['position', 'previous', 'next', 'side', 'width', 'uv', 'color'];\n const uniforms = [\n 'world',\n 'view',\n 'projection',\n 'worldViewProjection',\n 'lineWidth',\n 'resolution',\n 'sizeAttenuation',\n ];\n const samplers: string[] = [];\n\n if (this.settings.texture) {\n samplers.push('map');\n }\n\n const mat = new ShaderMaterial(\n shaderName,\n this.scene,\n {vertex: shaderName, fragment: shaderName},\n {\n attributes,\n uniforms,\n samplers,\n defines,\n needAlphaBlending: this.settings.materialTransparent,\n shaderLanguage,\n }\n );\n\n if (this.settings.texture) {\n mat.setTexture('map', this.settings.texture);\n }\n const engine = this.scene.getEngine();\n mat.setFloat('lineWidth', 1);\n // Reused across binds, and only re-uploaded when the render target resizes.\n const resolution = new BVector2(engine.getRenderWidth(), engine.getRenderHeight());\n mat.setVector2('resolution', resolution);\n mat.setFloat('sizeAttenuation', 1);\n mat.onBindObservable.add(() => {\n const renderEngine = this.scene.getEngine();\n const width = renderEngine.getRenderWidth();\n const height = renderEngine.getRenderHeight();\n if (resolution.x !== width || resolution.y !== height) {\n resolution.x = width;\n resolution.y = height;\n mat.setVector2('resolution', resolution);\n }\n });\n\n mat.backFaceCulling = false;\n\n if (this.settings.materialTransparent) {\n mat.alphaMode = this.settings.materialBlendMode;\n } else {\n mat.alphaMode = Constants.ALPHA_DISABLE;\n }\n mat.needDepthPrePass = this.settings.materialDepthWrite;\n mat.forceDepthWrite = this.settings.materialDepthWrite;\n mat.disableDepthWrite = !this.settings.materialDepthWrite;\n\n this.mesh.material = mat;\n }\n\n private vector_ = new Vector3();\n private vector2_ = new Vector3();\n private vector3_ = new Vector3();\n private quaternion_ = new Quaternion();\n\n /** Forces the emitter's world matrix to be current before sampling it. */\n private static ensureWorldMatrix(system: IParticleSystem): void {\n const emitter = system.emitter as {computeWorldMatrix?: (force: boolean) => void};\n if (emitter.computeWorldMatrix) {\n emitter.computeWorldMatrix(true);\n }\n }\n\n update(): void {\n let index = 0;\n let triangles = 0;\n\n let particleCount = 0;\n const visibleSystems = this.getVisibleSystems();\n for (let s = 0; s < visibleSystems.length; s++) {\n const system = visibleSystems[s];\n const particles = system.particles;\n for (let j = 0; j < system.particleNum; j++) {\n const historyCount = (particles[j] as TrailParticle).historyCount;\n if (historyCount === 0) {\n continue;\n }\n // +2 reserves the live tip vertex pair that frames between\n // simulation steps append ahead of the recorded head.\n particleCount += historyCount * 2 + 2;\n }\n }\n if (particleCount > this.maxParticles) {\n this.expandBuffers(particleCount);\n }\n\n for (let s = 0; s < visibleSystems.length; s++) {\n const system = visibleSystems[s];\n TrailBatch.ensureWorldMatrix(system);\n const rotation = this.quaternion_;\n const translation = this.vector2_;\n const scale = this.vector3_;\n const emitterMatrix = system.emitter.matrixWorld;\n emitterMatrix.decompose(translation, rotation, scale);\n\n const particles = system.particles;\n const particleNum = system.particleNum;\n const uTileCount = this.settings.uTileCount;\n const vTileCount = this.settings.vTileCount;\n const tileWidth = 1 / uTileCount;\n const tileHeight = 1 / vTileCount;\n const systemWorldSpace = system.worldSpace;\n const objectScale = (Math.abs(scale.x) + Math.abs(scale.y) + Math.abs(scale.z)) / 3;\n // A ribbon's samples were recorded at past steps and stay where they\n // were. The particle itself has moved on since the step that wrote\n // the newest sample, so frames that run no step would freeze the\n // whole trail if that head were left behind. Moving the recorded\n // head forward to catch up stretches the last segment from one\n // step of travel to almost two, then snaps it back when the next\n // step lands — a rubber-band the eye reads as lost smoothness,\n // especially at 120Hz where every other frame is between steps.\n // Appending a live tip ahead of the recorded samples keeps the\n // body still and the tip moving without that pulse. A trail pinned\n // to the emitter's origin is driven by the emitter's transform\n // rather than by the particle's velocity, so it is left alone.\n const trailSettings = system.rendererEmitterSettings as TrailSettings;\n const uvFromHead = Boolean(trailSettings.uvFromHead);\n const colorFromParticle = Boolean(trailSettings.colorFromParticle);\n // Recorded samples already sit in world space; the live tip still comes\n // from the particle's own (local) position.\n const samplesInWorld = systemWorldSpace || Boolean(trailSettings.recordWorldSpace);\n const residual = trailSettings.followLocalOrigin ? 0 : (system.simulationResidual ?? 0);\n // Measured from the step the particle just took, not from its\n // velocity: a trail pulled along by an orbit or by a plugin's own\n // behavior has motion no velocity term describes.\n const stepFraction = residual === 0 ? 0 : residual / (system.simulationStep ?? residual);\n\n for (let j = 0; j < particleNum; j++) {\n const particle = particles[j] as TrailParticle;\n const particleHistoryLength = particle.historyCount;\n if (particleHistoryLength === 0) {\n continue;\n }\n const historyCapacity = particle.historyCapacity;\n const historyPositions = particle.historyPositions;\n const historySizes = particle.historySizes;\n // Every sample takes its color from one place: its own recorded slot, or\n // the particle's current row in the store.\n const colors = colorFromParticle ? particle.store.color : particle.historyColors;\n const particleColorIndex = particle.storeIndex * 4;\n const col = particle.uvTile % vTileCount;\n const row = Math.floor(particle.uvTile / vTileCount + 0.001);\n const particleMatrix = particle.parentMatrix as unknown as Matrix4 | undefined;\n const me = (particleMatrix ?? emitterMatrix).elements;\n const m00 = me[0],\n m01 = me[1],\n m02 = me[2],\n m03 = me[3];\n const m10 = me[4],\n m11 = me[5],\n m12 = me[6],\n m13 = me[7];\n const m20 = me[8],\n m21 = me[9],\n m22 = me[10],\n m23 = me[11];\n const m30 = me[12],\n m31 = me[13],\n m32 = me[14],\n m33 = me[15];\n // The texture spans the ribbon end to end: up to the live tip when one is\n // drawn, otherwise up to the newest recorded sample.\n const invHistoryLength =\n 1 / (stepFraction !== 0 ? particleHistoryLength : Math.max(1, particleHistoryLength - 1));\n\n // Walk the ring buffer oldest-first with hand-rolled wrapping so the\n // inner loop stays free of modulo operations.\n let currentSlot = particle.getHistoryIndex(0);\n let previousSlot = currentSlot;\n\n for (let i = 0; i < particleHistoryLength; i++, index += 2) {\n const nextSlot =\n i + 1 < particleHistoryLength\n ? currentSlot + 1 === historyCapacity\n ? 0\n : currentSlot + 1\n : currentSlot;\n\n const currentPosIndex = currentSlot * 3;\n const previousPosIndex = previousSlot * 3;\n const nextPosIndex = nextSlot * 3;\n\n let currentX = historyPositions[currentPosIndex];\n let currentY = historyPositions[currentPosIndex + 1];\n let currentZ = historyPositions[currentPosIndex + 2];\n let previousX = historyPositions[previousPosIndex];\n let previousY = historyPositions[previousPosIndex + 1];\n let previousZ = historyPositions[previousPosIndex + 2];\n let nextX = historyPositions[nextPosIndex];\n let nextY = historyPositions[nextPosIndex + 1];\n let nextZ = historyPositions[nextPosIndex + 2];\n\n const currentSize = historySizes[currentSlot];\n const currentColorIndex = colorFromParticle ? particleColorIndex : currentSlot * 4;\n const currentColorX = colors[currentColorIndex];\n const currentColorY = colors[currentColorIndex + 1];\n const currentColorZ = colors[currentColorIndex + 2];\n const currentColorW = colors[currentColorIndex + 3];\n\n previousSlot = currentSlot;\n currentSlot = nextSlot;\n\n if (!samplesInWorld) {\n // Inlined point transforms — three per trail sample.\n let w = 1 / (m03 * currentX + m13 * currentY + m23 * currentZ + m33);\n let tx = (m00 * currentX + m10 * currentY + m20 * currentZ + m30) * w;\n let ty = (m01 * currentX + m11 * currentY + m21 * currentZ + m31) * w;\n currentZ = (m02 * currentX + m12 * currentY + m22 * currentZ + m32) * w;\n currentX = tx;\n currentY = ty;\n\n w = 1 / (m03 * previousX + m13 * previousY + m23 * previousZ + m33);\n tx = (m00 * previousX + m10 * previousY + m20 * previousZ + m30) * w;\n ty = (m01 * previousX + m11 * previousY + m21 * previousZ + m31) * w;\n previousZ = (m02 * previousX + m12 * previousY + m22 * previousZ + m32) * w;\n previousX = tx;\n previousY = ty;\n\n w = 1 / (m03 * nextX + m13 * nextY + m23 * nextZ + m33);\n tx = (m00 * nextX + m10 * nextY + m20 * nextZ + m30) * w;\n ty = (m01 * nextX + m11 * nextY + m21 * nextZ + m31) * w;\n nextZ = (m02 * nextX + m12 * nextY + m22 * nextZ + m32) * w;\n nextX = tx;\n nextY = ty;\n }\n\n const pi = index * 3;\n this.positionBuffer[pi] = currentX;\n this.positionBuffer[pi + 1] = currentY;\n this.positionBuffer[pi + 2] = currentZ;\n this.positionBuffer[pi + 3] = currentX;\n this.positionBuffer[pi + 4] = currentY;\n this.positionBuffer[pi + 5] = currentZ;\n\n this.previousBuffer[pi] = previousX;\n this.previousBuffer[pi + 1] = previousY;\n this.previousBuffer[pi + 2] = previousZ;\n this.previousBuffer[pi + 3] = previousX;\n this.previousBuffer[pi + 4] = previousY;\n this.previousBuffer[pi + 5] = previousZ;\n\n this.nextBuffer[pi] = nextX;\n this.nextBuffer[pi + 1] = nextY;\n this.nextBuffer[pi + 2] = nextZ;\n this.nextBuffer[pi + 3] = nextX;\n this.nextBuffer[pi + 4] = nextY;\n this.nextBuffer[pi + 5] = nextZ;\n\n this.sideBuffer[index] = 1;\n this.sideBuffer[index + 1] = -1;\n\n if (systemWorldSpace || particle.parentMatrix) {\n this.widthBuffer[index] = currentSize;\n this.widthBuffer[index + 1] = currentSize;\n } else {\n this.widthBuffer[index] = currentSize * objectScale;\n this.widthBuffer[index + 1] = currentSize * objectScale;\n }\n\n const ui = index * 2;\n const along = i * invHistoryLength;\n const u = ((uvFromHead ? 1 - along : along) + col) * tileWidth;\n this.uvBuffer[ui] = u;\n this.uvBuffer[ui + 1] = (vTileCount - row - 1) * tileHeight;\n this.uvBuffer[ui + 2] = u;\n this.uvBuffer[ui + 3] = (vTileCount - row) * tileHeight;\n\n const cci = index * 4;\n this.colorBuffer[cci] = currentColorX;\n this.colorBuffer[cci + 1] = currentColorY;\n this.colorBuffer[cci + 2] = currentColorZ;\n this.colorBuffer[cci + 3] = currentColorW;\n this.colorBuffer[cci + 4] = currentColorX;\n this.colorBuffer[cci + 5] = currentColorY;\n this.colorBuffer[cci + 6] = currentColorZ;\n this.colorBuffer[cci + 7] = currentColorW;\n\n if (i + 1 < particleHistoryLength) {\n this.indexBuffer[triangles * 3] = index;\n this.indexBuffer[triangles * 3 + 1] = index + 1;\n this.indexBuffer[triangles * 3 + 2] = index + 2;\n triangles++;\n this.indexBuffer[triangles * 3] = index + 2;\n this.indexBuffer[triangles * 3 + 1] = index + 1;\n this.indexBuffer[triangles * 3 + 2] = index + 3;\n triangles++;\n }\n }\n\n // Live tip: same place a sprite would be drawn this frame, past\n // the last recorded sample. The recorded ribbon stays put.\n if (stepFraction !== 0) {\n const previousHead = particle.previousPosition;\n const position = particle.position;\n let tipX = position.x + (position.x - previousHead.x) * stepFraction;\n let tipY = position.y + (position.y - previousHead.y) * stepFraction;\n let tipZ = position.z + (position.z - previousHead.z) * stepFraction;\n const headIndex = index - 2;\n const headX = this.positionBuffer[headIndex * 3];\n const headY = this.positionBuffer[headIndex * 3 + 1];\n const headZ = this.positionBuffer[headIndex * 3 + 2];\n\n if (!systemWorldSpace) {\n const w = 1 / (m03 * tipX + m13 * tipY + m23 * tipZ + m33);\n const tx = (m00 * tipX + m10 * tipY + m20 * tipZ + m30) * w;\n const ty = (m01 * tipX + m11 * tipY + m21 * tipZ + m31) * w;\n tipZ = (m02 * tipX + m12 * tipY + m22 * tipZ + m32) * w;\n tipX = tx;\n tipY = ty;\n }\n\n const tipPi = index * 3;\n this.positionBuffer[tipPi] = tipX;\n this.positionBuffer[tipPi + 1] = tipY;\n this.positionBuffer[tipPi + 2] = tipZ;\n this.positionBuffer[tipPi + 3] = tipX;\n this.positionBuffer[tipPi + 4] = tipY;\n this.positionBuffer[tipPi + 5] = tipZ;\n\n this.previousBuffer[tipPi] = headX;\n this.previousBuffer[tipPi + 1] = headY;\n this.previousBuffer[tipPi + 2] = headZ;\n this.previousBuffer[tipPi + 3] = headX;\n this.previousBuffer[tipPi + 4] = headY;\n this.previousBuffer[tipPi + 5] = headZ;\n\n this.nextBuffer[tipPi] = tipX;\n this.nextBuffer[tipPi + 1] = tipY;\n this.nextBuffer[tipPi + 2] = tipZ;\n this.nextBuffer[tipPi + 3] = tipX;\n this.nextBuffer[tipPi + 4] = tipY;\n this.nextBuffer[tipPi + 5] = tipZ;\n\n // The recorded head's `next` was itself; point it at the tip\n // so the shader builds the live segment from one version of\n // each endpoint.\n const headPi = headIndex * 3;\n this.nextBuffer[headPi] = tipX;\n this.nextBuffer[headPi + 1] = tipY;\n this.nextBuffer[headPi + 2] = tipZ;\n this.nextBuffer[headPi + 3] = tipX;\n this.nextBuffer[headPi + 4] = tipY;\n this.nextBuffer[headPi + 5] = tipZ;\n\n this.sideBuffer[index] = 1;\n this.sideBuffer[index + 1] = -1;\n\n const tipSize = particle.size.x;\n if (systemWorldSpace || particle.parentMatrix) {\n this.widthBuffer[index] = tipSize;\n this.widthBuffer[index + 1] = tipSize;\n } else {\n this.widthBuffer[index] = tipSize * objectScale;\n this.widthBuffer[index + 1] = tipSize * objectScale;\n }\n\n const tipUi = index * 2;\n const tipU = ((uvFromHead ? 0 : 1) + col) * tileWidth;\n this.uvBuffer[tipUi] = tipU;\n this.uvBuffer[tipUi + 1] = (vTileCount - row - 1) * tileHeight;\n this.uvBuffer[tipUi + 2] = tipU;\n this.uvBuffer[tipUi + 3] = (vTileCount - row) * tileHeight;\n\n const tipColor = particle.color;\n const tipCi = index * 4;\n this.colorBuffer[tipCi] = tipColor.x;\n this.colorBuffer[tipCi + 1] = tipColor.y;\n this.colorBuffer[tipCi + 2] = tipColor.z;\n this.colorBuffer[tipCi + 3] = tipColor.w;\n this.colorBuffer[tipCi + 4] = tipColor.x;\n this.colorBuffer[tipCi + 5] = tipColor.y;\n this.colorBuffer[tipCi + 6] = tipColor.z;\n this.colorBuffer[tipCi + 7] = tipColor.w;\n\n this.indexBuffer[triangles * 3] = headIndex;\n this.indexBuffer[triangles * 3 + 1] = headIndex + 1;\n this.indexBuffer[triangles * 3 + 2] = index;\n triangles++;\n this.indexBuffer[triangles * 3] = index;\n this.indexBuffer[triangles * 3 + 1] = headIndex + 1;\n this.indexBuffer[triangles * 3 + 2] = index + 1;\n triangles++;\n\n index += 2;\n }\n }\n }\n\n this.uploadGeometry(index, triangles);\n }\n\n /**\n * Uploads the vertex data written by `update` and resizes the sub mesh.\n *\n * Split out of `update` on purpose: the Babylon mesh/sub-mesh plumbing here\n * runs a handful of times per frame, and folding it into the per-vertex loop\n * costs that loop its optimised code.\n */\n private uploadGeometry(index: number, triangles: number): void {\n if (index > 0 && triangles > 0) {\n // Upload only the vertices written this frame; the buffers are sized for\n // the high-water mark of every system in the batch.\n this.mesh.updateVerticesData(VertexBuffer.PositionKind, this.positionBuffer.subarray(0, index * 3));\n this.mesh.updateVerticesData(VertexBuffer.UVKind, this.uvBuffer.subarray(0, index * 2));\n this.mesh.updateIndices(this.indexBuffer.subarray(0, triangles * 3));\n this.previousVB.update(this.previousBuffer.subarray(0, index * 3));\n this.nextVB.update(this.nextBuffer.subarray(0, index * 3));\n this.sideVB.update(this.sideBuffer.subarray(0, index));\n this.widthVB.update(this.widthBuffer.subarray(0, index));\n\n const colorVB = this.mesh.getVertexBuffer(VertexBuffer.ColorKind);\n if (colorVB) colorVB.update(this.colorBuffer.subarray(0, index * 4));\n\n if (this.mesh.subMeshes && this.mesh.subMeshes.length > 0) {\n this.adoptMeshBounds();\n this.mesh.subMeshes[0].indexCount = triangles * 3;\n this.mesh.subMeshes[0].verticesCount = index;\n }\n this.drawsNothing = false;\n } else if (this.mesh.subMeshes && this.mesh.subMeshes.length > 0) {\n // Nothing to draw. Leaving the count at zero still submits the draw,\n // and WebGPU complains about it once per frame for as long as the\n // batch stays empty — which, for a looping effect, is every gap\n // between passes. Disabling the mesh instead costs a frame coming\n // back, the flicker the sprite batch already works around.\n //\n // So draw a triangle whose corners are all the same vertex: it is a\n // legal draw that rasterises nothing, whatever stale geometry is\n // still in the buffers. Only written on the way into empty, not on\n // every empty frame.\n if (!this.drawsNothing) {\n this.indexBuffer.fill(0, 0, 6);\n this.mesh.updateIndices(this.indexBuffer.subarray(0, 6));\n this.adoptMeshBounds();\n this.drawsNothing = true;\n }\n this.mesh.subMeshes[0].indexCount = 6;\n this.mesh.subMeshes[0].verticesCount = 1;\n }\n }\n\n /**\n * Points every sub mesh at the mesh's own bounds.\n *\n * Updating indices rebuilds the sub meshes, and a fresh one computes its\n * bounds from the vertex data — which this batch keeps deliberately stale\n * beyond the range it draws. Transparent sorting reads those bounds every\n * frame, so they have to be replaced again after every index update, not\n * only when the geometry is built.\n */\n private adoptMeshBounds(): void {\n const meshBoundingInfo = this.mesh.getBoundingInfo();\n for (const subMesh of this.mesh.subMeshes) {\n (subMesh as any)._boundingInfo = meshBoundingInfo;\n }\n }\n\n dispose(): void {\n if (this.mesh.material) {\n this.mesh.material.dispose();\n }\n super.dispose();\n }\n}\n","export default /* wgsl */ `\nattribute position: vec3f;\nattribute previous: vec3f;\nattribute next: vec3f;\nattribute side: f32;\nattribute width: f32;\nattribute uv: vec2f;\nattribute color: vec4f;\n\nuniform view: mat4x4f;\nuniform projection: mat4x4f;\nuniform lineWidth: f32;\nuniform resolution: vec2f;\nuniform sizeAttenuation: f32;\n\nvarying vUV: vec2f;\nvarying vColor: vec4f;\n\nfn fix(i: vec4f, aspect: f32) -> vec2f {\n var res = i.xy / i.w;\n res.x *= aspect;\n return res;\n}\n\n@vertex\nfn main(input: VertexInputs) -> FragmentInputs {\n let aspect = uniforms.resolution.x / uniforms.resolution.y;\n var finalPosition = uniforms.projection * uniforms.view * vec4f(vertexInputs.position, 1.0);\n let prevPos = uniforms.projection * uniforms.view * vec4f(vertexInputs.previous, 1.0);\n let nextPos = uniforms.projection * uniforms.view * vec4f(vertexInputs.next, 1.0);\n\n let currentP = fix(finalPosition, aspect);\n let prevP = fix(prevPos, aspect);\n let nextP = fix(nextPos, aspect);\n\n let w = uniforms.lineWidth * vertexInputs.width;\n var dir: vec2f;\n if (distance(nextP, currentP) < 0.0001) {\n dir = normalize(currentP - prevP);\n } else if (distance(prevP, currentP) < 0.0001) {\n dir = normalize(nextP - currentP);\n } else {\n let dir1 = normalize(currentP - prevP);\n let dir2 = normalize(nextP - currentP);\n dir = normalize(dir1 + dir2);\n }\n var normal = vec4f(-dir.y, dir.x, 0.0, 1.0);\n normal.x *= 0.5 * w;\n normal.y *= 0.5 * w;\n normal = normal * uniforms.projection;\n if (uniforms.sizeAttenuation == 0.0) {\n let screen = (vec4f(uniforms.resolution, 0.0, 1.0) * uniforms.projection).xy;\n normal.x = normal.x * finalPosition.w / screen.x;\n normal.y = normal.y * finalPosition.w / screen.y;\n }\n finalPosition.x += normal.x * vertexInputs.side;\n finalPosition.y += normal.y * vertexInputs.side;\n\n vertexOutputs.position = finalPosition;\n vertexOutputs.vUV = vertexInputs.uv;\n vertexOutputs.vColor = vertexInputs.color;\n}\n`;\n","export default /* wgsl */ `\nvarying vUV: vec2f;\nvarying vColor: vec4f;\n\n#ifdef USE_MAP\nvar mapSampler: sampler;\nvar map: texture_2d<f32>;\n#endif\n\n@fragment\nfn main(input: FragmentInputs) -> FragmentOutputs {\n var baseColor = fragmentInputs.vColor;\n\n#ifdef USE_MAP\n let texColor = textureSample(map, mapSampler, fragmentInputs.vUV);\n baseColor *= texColor;\n#endif\n\n if (baseColor.a < 0.01) { discard; }\n\n fragmentOutputs.color = baseColor;\n}\n`;\n","import {BaseTexture} from '@babylonjs/core/Materials/Textures/baseTexture';\nimport {Texture} from '@babylonjs/core/Materials/Textures/texture';\nimport {TransformNode} from '@babylonjs/core/Meshes/transformNode';\nimport {Scene} from '@babylonjs/core/scene';\nimport {EmitSubParticleSystem, IParticleSystem, Vector3} from 'quarks.core';\nimport {ParticleSystem} from './ParticleSystem';\nimport {SpriteBatch} from './SpriteBatch';\nimport {TrailBatch} from './TrailBatch';\nimport {RenderMode, StoredBatchSettings, VFXBatch} from './VFXBatch';\n\nexport interface VFXBatchSettings {\n instancingGeometry: Float32Array;\n instancingIndices: Uint32Array | Uint16Array;\n instancingUVs?: Float32Array;\n instancingNormals?: Float32Array;\n renderMode: RenderMode;\n renderOrder: number;\n uTileCount: number;\n vTileCount: number;\n blendTiles: boolean;\n softParticles: boolean;\n softNearFade: number;\n softFarFade: number;\n materialBlendMode: number;\n materialTransparent: boolean;\n materialDepthTest: boolean;\n materialDepthWrite: boolean;\n materialAlphaTest: number;\n texture: Texture | null;\n /**\n * Cubemap (or other reflection texture) harvested from a Babylon material's\n * `reflectionTexture`. Mesh batches sample it like StandardMaterial cubic\n * reflection; other render modes ignore it.\n */\n reflectionTexture: BaseTexture | null;\n /** Multiplier for the reflection sample — mirrors `texture.level`. */\n reflectionLevel: number;\n /**\n * Optional six cube-face 2D textures (px,py,pz,nx,ny,nz). Prefer\n * `reflectionAtlas` on iOS — many simultaneous face samplers still trip\n * GL_INVALID_OPERATION on WebKit.\n */\n reflectionFaces: BaseTexture[] | null;\n /**\n * Single 3×2 atlas of cube faces (px py pz / nx ny nz). One sampler2D —\n * the path that stays valid on iOS WebKit ShaderMaterial draws.\n */\n reflectionAtlas: BaseTexture | null;\n layerMask: number;\n /**\n * Offset of billboard quads from their particle, in particle-size units\n * (Unity's renderer Pivot). On billboards x/y move the quad in its own plane\n * before it is rotated and z moves it toward the camera (up for horizontal\n * billboards). On stretched billboards x runs from the head to the tail and\n * y across, and z is unused. Absent or zero: no offset. Meshes ignore it.\n */\n pivot?: Vector3;\n}\n\nexport interface AdaptivePerformanceOptions {\n targetFrameMs: number;\n minQuality: number;\n maxQuality: number;\n decreaseStep: number;\n increaseStep: number;\n}\n\n/** True when both pivots put the quad in the same place; a missing pivot is zero. */\nfunction pivotEqual(a: Vector3 | undefined, b: Vector3 | undefined): boolean {\n return (a?.x ?? 0) === (b?.x ?? 0) && (a?.y ?? 0) === (b?.y ?? 0) && (a?.z ?? 0) === (b?.z ?? 0);\n}\n\n/** True when both face lists are the same six texture references (or both empty). */\nfunction reflectionFacesEqual(a: BaseTexture[] | null | undefined, b: BaseTexture[] | null | undefined): boolean {\n if (a === b) {\n return true;\n }\n if (!a || !b || a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n return true;\n}\n\nexport interface AdaptivePerformanceState extends AdaptivePerformanceOptions {\n enabled: boolean;\n currentQuality: number;\n lastFrameCpuMs: number;\n}\n\nexport class BatchedRenderer extends TransformNode {\n batches: Array<VFXBatch> = [];\n systemToBatchIndex: Map<IParticleSystem, number> = new Map<IParticleSystem, number>();\n depthTexture: BaseTexture | null = null;\n /** Systems in insertion order — iterated every frame, unlike the map. */\n private systems: Array<IParticleSystem> = [];\n /**\n * The same systems, ordered so that one emitting into another comes first.\n *\n * A sub emitter's particles are created by its parent's behaviors, part way\n * through the parent's step. A sub system updated before its parent has\n * already fixed the list of particles it will run behaviors over, so those\n * new particles are drawn that frame with nothing but their start values —\n * white where a colour curve would have coloured them, at their start size,\n * sitting at the point they were born. Rebuilt only when the set of systems\n * or their behaviors changes, not per frame.\n */\n private orderedSystems: Array<IParticleSystem> = [];\n private orderedSystemsStale = true;\n /** Consecutive frames each batch has held no system, parallel to `batches`. */\n private batchEmptyFrames: Array<number> = [];\n /**\n * How long an empty batch is kept before it is disposed. Systems that toggle\n * a setting back and forth reuse the batch within this window instead of\n * rebuilding a mesh and material every time.\n */\n private static readonly EMPTY_BATCH_GRACE_FRAMES = 120;\n private adaptivePerformanceState: AdaptivePerformanceState = {\n enabled: false,\n targetFrameMs: 16.7,\n minQuality: 0.35,\n maxQuality: 1,\n decreaseStep: 0.08,\n increaseStep: 0.02,\n currentQuality: 1,\n lastFrameCpuMs: 0,\n };\n private lastAppliedQuality = Number.NaN;\n\n constructor(name: string, scene: Scene) {\n super(name, scene);\n }\n\n private static clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n }\n\n private static equals(a: StoredBatchSettings, b: VFXBatchSettings): boolean {\n return (\n a.materialBlendMode === b.materialBlendMode &&\n a.materialTransparent === b.materialTransparent &&\n a.materialDepthTest === b.materialDepthTest &&\n a.materialDepthWrite === b.materialDepthWrite &&\n a.materialAlphaTest === b.materialAlphaTest &&\n a.texture === b.texture &&\n a.reflectionTexture === b.reflectionTexture &&\n a.reflectionLevel === b.reflectionLevel &&\n reflectionFacesEqual(a.reflectionFaces, b.reflectionFaces) &&\n a.reflectionAtlas === b.reflectionAtlas &&\n a.renderMode === b.renderMode &&\n a.blendTiles === b.blendTiles &&\n a.softParticles === b.softParticles &&\n a.softFarFade === b.softFarFade &&\n a.softNearFade === b.softNearFade &&\n a.uTileCount === b.uTileCount &&\n a.vTileCount === b.vTileCount &&\n a.instancingGeometry === b.instancingGeometry &&\n a.renderOrder === b.renderOrder &&\n a.layerMask === b.layerMask &&\n pivotEqual(a.pivot, b.pivot)\n );\n }\n\n addSystem(system: IParticleSystem) {\n const particleSystem = system as ParticleSystem;\n particleSystem._renderer = this;\n if (!this.systemToBatchIndex.has(system) && this.systems.indexOf(system) === -1) {\n this.systems.push(system);\n this.orderedSystemsStale = true;\n }\n if (this.adaptivePerformanceState.enabled) {\n particleSystem.setQualityFactor(this.adaptivePerformanceState.currentQuality);\n }\n this.assignToBatch(particleSystem);\n }\n\n /** Places a system into a compatible batch, creating one when none matches. */\n private assignToBatch(particleSystem: ParticleSystem) {\n const system = particleSystem as IParticleSystem;\n const settings = particleSystem.getRendererSettings();\n for (let i = 0; i < this.batches.length; i++) {\n if (BatchedRenderer.equals(this.batches[i].settings, settings)) {\n this.batches[i].addSystem(system);\n this.systemToBatchIndex.set(system, i);\n return;\n }\n }\n let batch: VFXBatch;\n const scene = this.getScene();\n switch (settings.renderMode) {\n case RenderMode.Trail:\n batch = new TrailBatch(settings, scene);\n break;\n case RenderMode.Mesh:\n case RenderMode.BillBoard:\n case RenderMode.VerticalBillBoard:\n case RenderMode.HorizontalBillBoard:\n case RenderMode.StretchedBillBoard:\n batch = new SpriteBatch(settings, scene);\n break;\n default:\n throw new Error(`Unsupported render mode: ${settings.renderMode}`);\n }\n batch.mesh.parent = this;\n if (this.depthTexture) {\n batch.applyDepthTexture(this.depthTexture);\n }\n batch.addSystem(system);\n this.batches.push(batch);\n this.batchEmptyFrames.push(0);\n this.systemToBatchIndex.set(system, this.batches.length - 1);\n }\n\n deleteSystem(system: IParticleSystem) {\n const removed = this.removeFromBatch(system);\n const index = this.systems.indexOf(system);\n if (index !== -1) {\n this.systems.splice(index, 1);\n this.orderedSystemsStale = true;\n }\n // Also out of the ordered copy, which update() may be iterating right\n // now: a system that disposes itself from inside its own update leaves\n // the loop expecting the slot it vacated to hold the next one.\n const ordered = this.orderedSystems.indexOf(system);\n if (ordered !== -1) {\n this.orderedSystems.splice(ordered, 1);\n }\n return removed;\n }\n\n /** Detaches a system from its batch, leaving the renderer's system list alone. */\n private removeFromBatch(system: IParticleSystem): boolean {\n const batchIndex = this.systemToBatchIndex.get(system);\n if (batchIndex === undefined) {\n return false;\n }\n this.batches[batchIndex].removeSystem(system);\n this.systemToBatchIndex.delete(system);\n return true;\n }\n\n /**\n * Re-buckets a system whose render settings changed. The system keeps its\n * place in the update order, so this is safe to call mid-frame.\n */\n updateSystem(system: IParticleSystem) {\n this.removeFromBatch(system);\n this.addSystem(system);\n }\n\n setDepthTexture(depthTexture: BaseTexture | null) {\n this.depthTexture = depthTexture;\n for (const batch of this.batches) {\n batch.applyDepthTexture(depthTexture);\n }\n }\n\n configureAdaptivePerformance(options: Partial<AdaptivePerformanceOptions> = {}) {\n const state = this.adaptivePerformanceState;\n const minQuality = BatchedRenderer.clamp(options.minQuality ?? state.minQuality, 0.05, 1);\n const maxQuality = BatchedRenderer.clamp(options.maxQuality ?? state.maxQuality, minQuality, 1);\n state.targetFrameMs = Math.max(options.targetFrameMs ?? state.targetFrameMs, 0.1);\n state.minQuality = minQuality;\n state.maxQuality = maxQuality;\n state.decreaseStep = Math.max(options.decreaseStep ?? state.decreaseStep, 0.001);\n state.increaseStep = Math.max(options.increaseStep ?? state.increaseStep, 0.001);\n state.currentQuality = BatchedRenderer.clamp(state.currentQuality, state.minQuality, state.maxQuality);\n state.enabled = true;\n this.lastAppliedQuality = Number.NaN;\n }\n\n disableAdaptivePerformance(resetQuality = true) {\n this.adaptivePerformanceState.enabled = false;\n if (resetQuality) {\n this.adaptivePerformanceState.currentQuality = this.adaptivePerformanceState.maxQuality;\n this.applyAdaptiveQuality();\n }\n }\n\n getAdaptivePerformanceState(): AdaptivePerformanceState {\n return {...this.adaptivePerformanceState};\n }\n\n private applyAdaptiveQuality() {\n const quality = this.adaptivePerformanceState.currentQuality;\n if (quality === this.lastAppliedQuality) {\n return;\n }\n for (let i = 0; i < this.systems.length; i++) {\n (this.systems[i] as ParticleSystem).setQualityFactor(quality);\n }\n this.lastAppliedQuality = quality;\n }\n\n /** @internal Called when a system's behaviors change, which can add a sub emitter. */\n _invalidateUpdateOrder(): void {\n this.orderedSystemsStale = true;\n }\n\n /**\n * Orders the systems so a system emitting into another runs first.\n *\n * Depth first over \"emits into\" edges, recording each system once all the\n * systems it feeds have been recorded, then reversed — a system therefore\n * lands ahead of everything it emits into, however deep the chain. A cycle\n * cannot be satisfied by any order; it is left as found rather than dropped.\n */\n private orderSystems(): Array<IParticleSystem> {\n if (!this.orderedSystemsStale) {\n return this.orderedSystems;\n }\n const ordered: Array<IParticleSystem> = [];\n const visiting = new Set<IParticleSystem>();\n const done = new Set<IParticleSystem>();\n const known = new Set<IParticleSystem>(this.systems);\n\n const subTargetsOf = (system: IParticleSystem): Array<IParticleSystem> => {\n const targets: Array<IParticleSystem> = [];\n for (const behavior of (system as ParticleSystem).behaviors ?? []) {\n if (behavior.type !== 'EmitSubParticleSystem') {\n continue;\n }\n const target = (behavior as EmitSubParticleSystem).subParticleSystem?.system;\n if (target !== undefined && known.has(target)) {\n targets.push(target);\n }\n }\n return targets;\n };\n\n const visit = (system: IParticleSystem): void => {\n if (done.has(system) || visiting.has(system)) {\n return;\n }\n visiting.add(system);\n for (const target of subTargetsOf(system)) {\n visit(target);\n }\n visiting.delete(system);\n done.add(system);\n ordered.push(system);\n };\n\n for (const system of this.systems) {\n visit(system);\n }\n ordered.reverse();\n this.orderedSystems = ordered;\n this.orderedSystemsStale = false;\n return ordered;\n }\n\n update(delta: number) {\n const adaptiveState = this.adaptivePerformanceState;\n const frameStart = adaptiveState.enabled ? performance.now() : 0;\n if (adaptiveState.enabled) {\n this.applyAdaptiveQuality();\n }\n const systems = this.orderSystems();\n for (let i = 0; i < systems.length; i++) {\n const system = systems[i];\n // A disabled emitter holds its particles frozen instead of simulating\n // them unseen, matching how Unity treats a disabled ParticleSystem.\n // Pooled effects parked with setEnabled(false) then cost nothing.\n if (system.emitter.visible) {\n (system as ParticleSystem).update(delta);\n }\n // An autoDestroy system disposes itself from inside update and drops\n // out of the list; stay on the slot it vacated.\n if (systems[i] !== system) {\n i--;\n }\n }\n this.refreshBatches();\n if (!adaptiveState.enabled) {\n return;\n }\n\n adaptiveState.lastFrameCpuMs = performance.now() - frameStart;\n if (adaptiveState.lastFrameCpuMs > adaptiveState.targetFrameMs) {\n adaptiveState.currentQuality = BatchedRenderer.clamp(\n adaptiveState.currentQuality - adaptiveState.decreaseStep,\n adaptiveState.minQuality,\n adaptiveState.maxQuality\n );\n } else {\n adaptiveState.currentQuality = BatchedRenderer.clamp(\n adaptiveState.currentQuality + adaptiveState.increaseStep,\n adaptiveState.minQuality,\n adaptiveState.maxQuality\n );\n }\n }\n\n /** Rebuild instance buffers from current particle state without advancing simulation. */\n refreshBatches(): void {\n const emptyFrames = this.batchEmptyFrames;\n for (let i = 0; i < this.batches.length; i++) {\n const batch = this.batches[i];\n if (batch.systems.size > 0) {\n emptyFrames[i] = 0;\n batch.update();\n continue;\n }\n const framesEmpty = (emptyFrames[i] ?? 0) + 1;\n emptyFrames[i] = framesEmpty;\n if (framesEmpty === 1) {\n // One last update clears the instance data left on screen.\n batch.update();\n } else if (framesEmpty > BatchedRenderer.EMPTY_BATCH_GRACE_FRAMES) {\n // Nothing has used these settings for a while: give the mesh,\n // material and GPU buffers back instead of re-uploading empty\n // instance data forever.\n this.removeBatch(i);\n i--;\n }\n }\n }\n\n /** Disposes the batch at `index` and repairs the system→batch mapping. */\n private removeBatch(index: number): void {\n this.batches[index].dispose();\n this.batches.splice(index, 1);\n this.batchEmptyFrames.splice(index, 1);\n for (const [system, batchIndex] of this.systemToBatchIndex) {\n if (batchIndex > index) {\n this.systemToBatchIndex.set(system, batchIndex - 1);\n }\n }\n }\n\n /** Per-batch particle vs GPU instance counts — for diagnosing stale render state. */\n getBatchRenderStats(): Array<{\n batchIndex: number;\n renderMode: RenderMode;\n instanceCount: number;\n particleCount: number;\n systemNames: string[];\n }> {\n return this.batches.map((batch, batchIndex) => {\n let particleCount = 0;\n const systemNames: string[] = [];\n for (const system of batch.systems) {\n const ps = system as ParticleSystem;\n particleCount += ps.particleNum;\n systemNames.push(ps.emitter.name);\n }\n return {\n batchIndex,\n renderMode: batch.settings.renderMode,\n instanceCount: batch.mesh.forcedInstanceCount ?? 0,\n particleCount,\n systemNames,\n };\n });\n }\n\n dispose(): void {\n for (const batch of this.batches) {\n batch.dispose();\n }\n this.batches = [];\n this.batchEmptyFrames.length = 0;\n this.systems.length = 0;\n this.systemToBatchIndex.clear();\n super.dispose();\n }\n}\n","import {BatchedRenderer} from './BatchedRenderer';\n\nexport const BatchedParticleRenderer = BatchedRenderer;\n","import {BaseTexture} from '@babylonjs/core/Materials/Textures/baseTexture';\nimport {Texture} from '@babylonjs/core/Materials/Textures/texture';\nimport {Scene} from '@babylonjs/core/scene';\n\nconst atlasByCube = new WeakMap<BaseTexture, Texture>();\nconst pendingByCube = new WeakMap<BaseTexture, Promise<Texture | null>>();\n\n/** Reads the six face URLs from a Babylon CubeTexture (px py pz nx ny nz). */\nexport function cubeFaceUrls(reflection: BaseTexture | null | undefined): string[] | null {\n if (!reflection?.isCube) {\n return null;\n }\n const files =\n (reflection as {files?: string[]; _files?: string[]}).files ?? (reflection as {_files?: string[]})._files;\n return files?.length === 6 ? files.slice() : null;\n}\n\n/** Returns a previously built atlas for this cube, if any. */\nexport function getCachedEnvAtlas(cube: BaseTexture): Texture | null {\n return atlasByCube.get(cube) ?? null;\n}\n\n/** Stores an atlas for a cube source (tests / prebuilt atlases). */\nexport function cacheEnvAtlas(cube: BaseTexture, atlas: Texture): void {\n atlasByCube.set(cube, atlas);\n}\n\n/**\n * Packs six cube-face images into one 3×2 atlas Texture (px py pz / nx ny nz).\n * Uses invertY:false so UV cellY=0 maps to the +faces row matching the shader.\n */\nexport async function createEnvAtlasFromFaceUrls(urls: string[], scene: Scene): Promise<Texture> {\n if (typeof document === 'undefined' || typeof Image === 'undefined') {\n throw new Error('createEnvAtlasFromFaceUrls requires a DOM Image/canvas environment');\n }\n const images = await Promise.all(urls.map((url) => loadImage(url)));\n const size = images[0].width || images[0].naturalWidth;\n if (!size) {\n throw new Error('Env atlas face image has zero size');\n }\n const canvas = document.createElement('canvas');\n canvas.width = size * 3;\n canvas.height = size * 2;\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n throw new Error('Could not create env atlas canvas');\n }\n for (let i = 0; i < 6; i++) {\n ctx.drawImage(images[i], (i % 3) * size, Math.floor(i / 3) * size, size, size);\n }\n const atlas = new Texture(canvas.toDataURL('image/jpeg', 0.92), scene, {\n noMipmap: true,\n invertY: false,\n samplingMode: Texture.LINEAR_LINEAR,\n });\n atlas.name = 'quarksEnvAtlas';\n return atlas;\n}\n\n/** Overridable builder hook (tests replace this to avoid needing DOM Image/canvas). */\nexport const envAtlasBuilder = {\n createFromFaceUrls: createEnvAtlasFromFaceUrls,\n};\n\n/**\n * Ensures a 3×2 env atlas exists for a CubeTexture. Returns a cached atlas\n * synchronously when available; otherwise starts (or joins) an async build and\n * invokes onReady when the atlas is usable.\n */\nexport function ensureEnvAtlasFromCube(\n cube: BaseTexture,\n scene: Scene,\n onReady: (atlas: Texture) => void\n): Texture | null {\n const cached = atlasByCube.get(cube);\n if (cached) {\n onReady(cached);\n return cached;\n }\n\n const kick = () => {\n const existingPending = pendingByCube.get(cube);\n if (existingPending) {\n existingPending.then((atlas) => {\n if (atlas) {\n onReady(atlas);\n }\n });\n return;\n }\n\n const urls = cubeFaceUrls(cube);\n if (!urls) {\n return;\n }\n\n const pending = envAtlasBuilder\n .createFromFaceUrls(urls, scene)\n .then((atlas) => {\n atlasByCube.set(cube, atlas);\n pendingByCube.delete(cube);\n onReady(atlas);\n return atlas;\n })\n .catch((err) => {\n pendingByCube.delete(cube);\n console.warn('[babylon.quarks] Failed to build env atlas from cubemap faces', err);\n return null;\n });\n pendingByCube.set(cube, pending);\n };\n\n if (cube.isReady()) {\n kick();\n } else {\n const observable = (cube as {onLoadObservable?: {addOnce: (cb: () => void) => void}}).onLoadObservable;\n if (observable) {\n observable.addOnce(() => kick());\n } else {\n kick();\n }\n }\n\n return atlasByCube.get(cube) ?? null;\n}\n\n/** Loads one image URL as an HTMLImageElement. */\nfunction loadImage(url: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const image = new Image();\n image.crossOrigin = 'anonymous';\n image.onload = () => resolve(image);\n image.onerror = () => reject(new Error(`Failed to load env face ${url}`));\n image.src = url;\n });\n}\n","import {PBRMaterial} from '@babylonjs/core/Materials/PBR/pbrMaterial';\nimport {StandardMaterial} from '@babylonjs/core/Materials/standardMaterial';\nimport {Scene} from '@babylonjs/core/scene';\n\nexport type BabylonParticleMaterialParameters = Record<string, any>;\n\nexport class ParticleMeshStandardMaterial extends StandardMaterial {\n readonly isParticleMeshStandardMaterial = true;\n\n constructor(name: string, scene?: Scene, parameters: BabylonParticleMaterialParameters = {}) {\n super(name, scene);\n Object.assign(this, parameters);\n }\n}\n\nexport class ParticleMeshPhysicsMaterial extends PBRMaterial {\n readonly isParticleMeshPhysicsMaterial = true;\n\n constructor(name: string, scene?: Scene, parameters: BabylonParticleMaterialParameters = {}) {\n super(name, scene);\n Object.assign(this, parameters);\n }\n}\n","import {TransformNode} from '@babylonjs/core/Meshes/transformNode';\nimport {Scene} from '@babylonjs/core/scene';\nimport {IParticleSystem, Matrix4, SerializationOptions} from 'quarks.core';\n\nexport class ParticleEmitter extends TransformNode {\n system: IParticleSystem;\n private _matrixWorld: Matrix4 = new Matrix4();\n private _matrixWorldFlag = -1;\n\n /**\n * The node's world matrix in quarks.core form. Mirrored from Babylon's\n * matrix only when that matrix actually changed (tracked by its\n * `updateFlag`), so repeated reads inside a frame are free.\n */\n get matrixWorld(): Matrix4 {\n const m = this.getWorldMatrix();\n const flag = m.updateFlag;\n if (flag === this._matrixWorldFlag) {\n return this._matrixWorld;\n }\n this._matrixWorldFlag = flag;\n const e = this._matrixWorld.elements;\n const s = m.m;\n e[0] = s[0];\n e[1] = s[1];\n e[2] = s[2];\n e[3] = s[3];\n e[4] = s[4];\n e[5] = s[5];\n e[6] = s[6];\n e[7] = s[7];\n e[8] = s[8];\n e[9] = s[9];\n e[10] = s[10];\n e[11] = s[11];\n e[12] = s[12];\n e[13] = s[13];\n e[14] = s[14];\n e[15] = s[15];\n return this._matrixWorld;\n }\n\n get visible(): boolean {\n return this.isEnabled();\n }\n\n set visible(value: boolean) {\n this.setEnabled(value);\n }\n\n get uuid(): string {\n return this.uniqueId.toString();\n }\n\n constructor(system: IParticleSystem, scene?: Scene) {\n super('particleEmitter', scene || undefined);\n this.system = system;\n }\n\n dispose(): void {\n super.dispose();\n }\n\n extractFromCache(cache: any): any[] {\n const values: any[] = [];\n for (const key in cache) {\n const data = cache[key];\n if (data && typeof data === 'object') {\n delete data.metadata;\n }\n values.push(data);\n }\n return values;\n }\n\n clone(name?: string): ParticleEmitter {\n const clonedSystem = this.system.clone();\n const clonedEmitter = clonedSystem.emitter as ParticleEmitter;\n clonedEmitter.name = name ?? this.name;\n clonedEmitter.position.copyFrom(this.position);\n clonedEmitter.rotation.copyFrom(this.rotation);\n clonedEmitter.scaling.copyFrom(this.scaling);\n if (this.rotationQuaternion) {\n clonedEmitter.rotationQuaternion = this.rotationQuaternion.clone();\n }\n clonedEmitter.setEnabled(this.isEnabled());\n return clonedEmitter;\n }\n\n toJSON(meta?: any, options: SerializationOptions = {}): any {\n return {\n uuid: (this as any)._quarksUUID ?? this.uniqueId.toString(),\n type: 'ParticleEmitter',\n name: this.name,\n position: [this.position.x, this.position.y, this.position.z],\n rotation: [this.rotation.x, this.rotation.y, this.rotation.z],\n quaternion: this.rotationQuaternion\n ? [\n this.rotationQuaternion.x,\n this.rotationQuaternion.y,\n this.rotationQuaternion.z,\n this.rotationQuaternion.w,\n ]\n : undefined,\n scale: [this.scaling.x, this.scaling.y, this.scaling.z],\n visible: this.isEnabled(),\n ps: this.system.toJSON(meta, options),\n };\n }\n}\n","/** Sequential 0..N-1 indices for non-indexed triangle-list BufferGeometry (Three.js drawArrays). */\nexport function ensureTriangleIndices(\n positions: Float32Array,\n indices?: Uint32Array | Uint16Array\n): Uint32Array | Uint16Array {\n if (indices && indices.length > 0) {\n return indices;\n }\n const vertexCount = positions.length / 3;\n const out = new Uint32Array(vertexCount);\n for (let i = 0; i < vertexCount; i++) {\n out[i] = i;\n }\n return out;\n}\n","import {Constants} from '@babylonjs/core/Engines/constants';\nimport {BaseTexture} from '@babylonjs/core/Materials/Textures/baseTexture';\nimport {Texture} from '@babylonjs/core/Materials/Textures/texture';\nimport {Scene} from '@babylonjs/core/scene';\nimport {\n AxisAngleGenerator,\n Behavior,\n BehaviorFromJSON,\n ColorGenerator,\n ColorGeneratorFromJSON,\n ConstantColor,\n ConstantValue,\n EmissionState,\n EmitterFromJSON,\n EmitterShape,\n FunctionColorGenerator,\n FunctionJSON,\n FunctionValueGenerator,\n FusionStep,\n GeneratorFromJSON,\n GeneratorMemory,\n IParticleSystem,\n Matrix3,\n Matrix4,\n Particle,\n ParticleStore,\n ParticleSystemEvent,\n ParticleSystemEventType,\n planBehaviorFusion,\n Quaternion,\n RendererEmitterSettings,\n RotationGenerator,\n SerializationOptions,\n SphereEmitter,\n SpriteParticle,\n StretchedBillBoardSettings,\n TrailParticle,\n TrailSettings,\n ValueGenerator,\n ValueGeneratorFromJSON,\n Vector2,\n Vector3,\n Vector3Generator,\n Vector4,\n} from 'quarks.core';\nimport {BatchedRenderer, VFXBatchSettings} from './BatchedRenderer';\nimport {ensureEnvAtlasFromCube, getCachedEnvAtlas} from './envAtlas';\nimport {ensureTriangleIndices} from './geometryUtil';\nimport {ParticleEmitter} from './ParticleEmitter';\nimport {RenderMode} from './VFXBatch';\n\nexport interface BurstParameters {\n time: number;\n count: ValueGenerator | FunctionValueGenerator;\n cycle: number;\n interval: number;\n probability: number;\n}\n\n/** Particle backed by a {@link ParticleStore} row, as this system always creates. */\ntype StoreBackedParticle = Particle & {storeIndex: number; setStoreIndex(index: number): void};\n\nconst UP = new Vector3(0, 0, 1);\nconst tempQ = new Quaternion();\nconst tempV = new Vector3();\nconst tempV2 = new Vector3();\nconst PREWARM_FPS = 60;\nconst SIMULATION_STEP = 1 / PREWARM_FPS;\nconst MAX_SIMULATION_STEPS_PER_FRAME = 8;\n// Math.round() breaks an exact tie (accumulator sitting at precisely half a\n// step) by rounding up. At exactly 120Hz that tie is not a corner case — it is\n// every single frame — and rounding it up would run a step on every one of\n// them instead of every other one. Nudging the tie down costs nothing on a\n// real display (real frame times essentially never land on the tie exactly)\n// and keeps the well-tested \"half a step is no step yet\" behavior.\nconst ROUND_TIE_BIAS = 1e-9;\n\nconst DEFAULT_POSITIONS = new Float32Array([-0.5, -0.5, 0, 0.5, -0.5, 0, 0.5, 0.5, 0, -0.5, 0.5, 0]);\nconst DEFAULT_UVS = new Float32Array([0, 0, 1, 0, 1, 1, 0, 1]);\n\n/** Zero UVs sized to a position buffer — missing/mismatched uv attrs → GL_INVALID_OPERATION on iOS. */\nfunction fallbackUVsForPositions(positions: Float32Array): Float32Array {\n return new Float32Array((positions.length / 3) * 2);\n}\nconst DEFAULT_INDICES = new Uint32Array([0, 1, 2, 0, 2, 3]);\n\n/** The optional trail flags that are switched on, so JSON and clones only carry the ones in use. */\nfunction trailFlags(settings: TrailSettings | undefined): Partial<TrailSettings> {\n const flags: Partial<TrailSettings> = {};\n if (settings?.uvFromHead) flags.uvFromHead = true;\n if (settings?.colorFromParticle) flags.colorFromParticle = true;\n if (settings?.dieWithParticle) flags.dieWithParticle = true;\n if (settings?.recordWorldSpace) flags.recordWorldSpace = true;\n return flags;\n}\n\nexport interface ParticleSystemParameters {\n autoDestroy?: boolean;\n looping?: boolean;\n prewarm?: boolean;\n duration?: number;\n startDelay?: ValueGenerator | FunctionValueGenerator;\n shape?: EmitterShape;\n startLife?: ValueGenerator | FunctionValueGenerator;\n startSpeed?: ValueGenerator | FunctionValueGenerator;\n startRotation?: ValueGenerator | FunctionValueGenerator | RotationGenerator;\n startSize?: ValueGenerator | FunctionValueGenerator | Vector3Generator;\n startLength?: ValueGenerator | FunctionValueGenerator;\n startColor?: ColorGenerator | FunctionColorGenerator;\n emissionOverTime?: ValueGenerator | FunctionValueGenerator;\n emissionOverDistance?: ValueGenerator | FunctionValueGenerator;\n emissionBursts?: Array<BurstParameters>;\n /** Most particles alive at once; emission past it is dropped. Leave unset for no limit. */\n maxParticles?: number;\n onlyUsedByOther?: boolean;\n behaviors?: Array<Behavior>;\n instancingGeometry?: Float32Array;\n instancingIndices?: Uint32Array | Uint16Array;\n instancingUVs?: Float32Array;\n instancingNormals?: Float32Array;\n renderMode?: RenderMode;\n rendererEmitterSettings?: RendererEmitterSettings;\n speedFactor?: number;\n material?: any;\n texture?: Texture | null;\n startTileIndex?: ValueGenerator;\n uTileCount?: number;\n vTileCount?: number;\n blendTiles?: boolean;\n softParticles?: boolean;\n softFarFade?: number;\n softNearFade?: number;\n renderOrder?: number;\n worldSpace?: boolean;\n blendMode?: number;\n transparent?: boolean;\n depthTest?: boolean;\n depthWrite?: boolean;\n alphaTest?: number;\n layerMask?: number;\n /** Billboard pivot in particle-size units, see {@link VFXBatchSettings.pivot}. */\n pivot?: Vector3;\n /** Fraction of billboard particles mirrored along U (x) and V (y), see {@link ParticleSystem.flip}. */\n flip?: Vector2;\n scene?: Scene;\n}\n\nexport interface BurstParametersJSON {\n time: number;\n count: FunctionJSON | number;\n cycle: number;\n interval: number;\n probability: number;\n}\n\nexport interface ParticleSystemJSONParameters {\n version: string;\n autoDestroy: boolean;\n looping: boolean;\n prewarm: boolean;\n duration: number;\n startDelay?: FunctionJSON;\n shape: any;\n startLife: FunctionJSON;\n startSpeed: FunctionJSON;\n startRotation: FunctionJSON;\n startSize: FunctionJSON;\n startColor: FunctionJSON;\n emissionOverTime: FunctionJSON;\n emissionOverDistance: FunctionJSON;\n emissionBursts?: Array<BurstParametersJSON>;\n maxParticles?: number;\n onlyUsedByOther: boolean;\n rendererEmitterSettings: RendererEmitterSettings;\n instancingGeometry?: any;\n renderMode: number;\n renderOrder?: number;\n speedFactor?: number;\n texture?: string;\n material?: string;\n layers?: number;\n startTileIndex: FunctionJSON | number;\n uTileCount: number;\n vTileCount: number;\n blendTiles?: boolean;\n softParticles?: boolean;\n softFarFade?: number;\n softNearFade?: number;\n blending?: number;\n transparent?: boolean;\n depthTest?: boolean;\n depthWrite?: boolean;\n alphaTest?: number;\n behaviors: Array<any>;\n worldSpace: boolean;\n /** `[x, y, z]`; written only when non-zero. */\n pivot?: number[];\n /** `[u, v]`; written only when non-zero. */\n flip?: number[];\n}\n\nexport interface BabylonMetaData {\n textures: {[uuid: string]: Texture | null};\n materials: {[uuid: string]: any};\n geometries: {[uuid: string]: any};\n images?: {[uuid: string]: any};\n shapes?: {[uuid: string]: any};\n skeletons?: {[uuid: string]: any};\n animations?: {[uuid: string]: any};\n nodes?: {[uuid: string]: any};\n}\n\nexport class ParticleSystem implements IParticleSystem {\n private static serializationCounter = 0;\n\n autoDestroy: boolean;\n prewarm: boolean;\n looping: boolean;\n duration: number;\n startDelay: ValueGenerator | FunctionValueGenerator;\n startLife: ValueGenerator | FunctionValueGenerator;\n startSpeed: ValueGenerator | FunctionValueGenerator;\n startRotation: ValueGenerator | FunctionValueGenerator | RotationGenerator;\n startSize: ValueGenerator | FunctionValueGenerator | Vector3Generator;\n startColor: ColorGenerator | FunctionColorGenerator;\n startTileIndex: ValueGenerator;\n rendererEmitterSettings: RendererEmitterSettings;\n /**\n * Fraction of billboard particles mirrored along U (x) and V (y), each\n * picked at random when the particle is born — Unity's renderer Flip.\n * Undefined: nothing is mirrored. Meshes ignore it.\n */\n flip?: Vector2;\n emissionOverTime: ValueGenerator | FunctionValueGenerator;\n emissionOverDistance: ValueGenerator | FunctionValueGenerator;\n emissionBursts: Array<BurstParameters>;\n /** Most particles alive at once (Unity's Max Particles); emission past it is dropped. Undefined means no limit. */\n maxParticles?: number;\n onlyUsedByOther: boolean;\n worldSpace: boolean;\n particleNum: number;\n paused: boolean;\n particles: Array<Particle>;\n /** Column storage shared by this system's particles. */\n readonly store: ParticleStore = new ParticleStore(64);\n emitterShape: EmitterShape;\n emitter: ParticleEmitter;\n rendererSettings: VFXBatchSettings;\n neededToUpdateRender: boolean;\n behaviors: Array<Behavior>;\n emissionState: EmissionState;\n emitterVelocity: Vector3 = new Vector3();\n\n private prewarmed: boolean;\n private emitEnded: boolean;\n private markForDestroy: boolean;\n private finishedEventFired = false;\n private startDelayTimeLeft = 0;\n private previousEmitterPos?: Vector3;\n private tempEmitterPos: Vector3 = new Vector3();\n private temp: Vector3 = new Vector3();\n private normalMatrix: Matrix3 = new Matrix3();\n private memory: GeneratorMemory = [];\n private listeners: {[event: string]: Array<(event: ParticleSystemEvent) => void>} = {};\n private readonly layerMaskProxy: {mask: number};\n private materialRef: any = null;\n private sceneRef: Scene | undefined;\n private qualityFactor = 1;\n private simulationAccumulator = 0;\n private destroyed = false;\n /** Behaviors the cached plan was built from, compared by identity. */\n private fusionPlan?: Array<Behavior>;\n private fusionSteps: Array<FusionStep> = [];\n /** @internal **/\n _renderer?: BatchedRenderer;\n\n set time(time: number) {\n this.emissionState.time = time;\n }\n\n get time(): number {\n return this.emissionState.time;\n }\n\n get isEmitEnded(): boolean {\n return this.emitEnded;\n }\n\n /** Whether continuous or queued emission can still spawn particles before the system is done. */\n hasPendingEmission(): boolean {\n if (this.looping) {\n return true;\n }\n if (this.emitEnded) {\n return false;\n }\n if (this.onlyUsedByOther) {\n return false;\n }\n const state = this.emissionState;\n if (state.waitEmiting > 0) {\n return true;\n }\n if (state.burstIndex < this.emissionBursts.length) {\n return true;\n }\n if (state.time >= this.duration) {\n return false;\n }\n const timeRatio = state.time / this.duration;\n if (this.emissionOverTime.genValue(this.memory, timeRatio) > 0) {\n return true;\n }\n return this.emissionOverDistance.genValue(this.memory, timeRatio) > 0;\n }\n\n /** Non-looping system with no particles left and nothing left to emit. */\n isFinished(): boolean {\n if (this.looping) {\n return false;\n }\n if (this.particleNum > 0) {\n return false;\n }\n if (this.onlyUsedByOther) {\n return true;\n }\n return !this.hasPendingEmission();\n }\n\n get layers() {\n return this.layerMaskProxy;\n }\n\n get texture() {\n return this.rendererSettings.texture;\n }\n\n set texture(texture: Texture | null) {\n this.rendererSettings.texture = texture;\n this.neededToUpdateRender = true;\n }\n\n get material() {\n return this.materialRef;\n }\n\n set material(material: any) {\n this.materialRef = material;\n this.applyMaterialSettings(material);\n }\n\n get uTileCount() {\n return this.rendererSettings.uTileCount;\n }\n\n set uTileCount(u: number) {\n this.rendererSettings.uTileCount = u;\n this.neededToUpdateRender = true;\n }\n\n get vTileCount() {\n return this.rendererSettings.vTileCount;\n }\n\n set vTileCount(v: number) {\n this.rendererSettings.vTileCount = v;\n this.neededToUpdateRender = true;\n }\n\n get blendTiles() {\n return this.rendererSettings.blendTiles;\n }\n\n set blendTiles(v: boolean) {\n this.rendererSettings.blendTiles = v;\n this.neededToUpdateRender = true;\n }\n\n get softParticles() {\n return this.rendererSettings.softParticles;\n }\n\n set softParticles(v: boolean) {\n this.rendererSettings.softParticles = v;\n this.neededToUpdateRender = true;\n }\n\n /**\n * Billboard pivot in particle-size units (Unity's renderer Pivot), see\n * {@link VFXBatchSettings.pivot}. Assign a new vector to change it: editing\n * the returned one in place does not reach the renderer.\n */\n get pivot(): Vector3 | undefined {\n return this.rendererSettings.pivot;\n }\n\n set pivot(v: Vector3 | undefined) {\n this.rendererSettings.pivot = ParticleSystem.nonZeroPivot(v);\n this.neededToUpdateRender = true;\n }\n\n private static nonZeroPivot(v: Vector3 | undefined): Vector3 | undefined {\n return v && (v.x !== 0 || v.y !== 0 || v.z !== 0) ? v.clone() : undefined;\n }\n\n private static nonZeroFlip(v: Vector2 | undefined): Vector2 | undefined {\n return v && (v.x > 0 || v.y > 0) ? v.clone() : undefined;\n }\n\n get softNearFade() {\n return this.rendererSettings.softNearFade;\n }\n\n set softNearFade(v: number) {\n this.rendererSettings.softNearFade = v;\n this.neededToUpdateRender = true;\n }\n\n get softFarFade() {\n return this.rendererSettings.softFarFade;\n }\n\n set softFarFade(v: number) {\n this.rendererSettings.softFarFade = v;\n this.neededToUpdateRender = true;\n }\n\n get instancingGeometry(): Float32Array {\n return this.rendererSettings.instancingGeometry;\n }\n\n set instancingGeometry(geometry: Float32Array) {\n this.restart();\n this.particles.length = 0;\n this.rendererSettings.instancingGeometry = geometry;\n this.neededToUpdateRender = true;\n }\n\n get blending() {\n return this.rendererSettings.materialBlendMode;\n }\n\n set blending(blending: number) {\n this.rendererSettings.materialBlendMode = blending;\n this.neededToUpdateRender = true;\n }\n\n get renderMode(): RenderMode {\n return this.rendererSettings.renderMode;\n }\n\n set renderMode(renderMode: RenderMode) {\n if (this.rendererSettings.renderMode !== renderMode) {\n let needRestart = false;\n if (this.rendererSettings.renderMode === RenderMode.Trail) {\n needRestart = true;\n }\n if (this.rendererSettings.renderMode === RenderMode.Mesh) {\n this.startRotation = new ConstantValue(0);\n }\n switch (renderMode) {\n case RenderMode.Trail:\n this.rendererEmitterSettings = {startLength: new ConstantValue(30), followLocalOrigin: false};\n needRestart = true;\n break;\n case RenderMode.Mesh:\n this.rendererEmitterSettings = {};\n this.startRotation = new AxisAngleGenerator(new Vector3(0, 1, 0), new ConstantValue(0));\n break;\n case RenderMode.StretchedBillBoard:\n this.rendererEmitterSettings = {speedFactor: 0, lengthFactor: 2};\n break;\n case RenderMode.BillBoard:\n case RenderMode.VerticalBillBoard:\n case RenderMode.HorizontalBillBoard:\n this.rendererEmitterSettings = {};\n break;\n }\n this.rendererSettings.renderMode = renderMode;\n if (needRestart) {\n this.restart();\n this.particles.length = 0;\n }\n this.neededToUpdateRender = true;\n }\n }\n\n get renderOrder(): number {\n return this.rendererSettings.renderOrder;\n }\n\n set renderOrder(renderOrder: number) {\n this.rendererSettings.renderOrder = renderOrder;\n this.neededToUpdateRender = true;\n }\n\n constructor(parameters: ParticleSystemParameters) {\n this.sceneRef = parameters.scene;\n this.layerMaskProxy = {mask: parameters.layerMask ?? 0x0fffffff};\n Object.defineProperty(this.layerMaskProxy, 'mask', {\n enumerable: true,\n get: () => this.rendererSettings.layerMask,\n set: (mask: number) => {\n this.rendererSettings.layerMask = mask;\n this.neededToUpdateRender = true;\n },\n });\n\n this.autoDestroy = parameters.autoDestroy ?? false;\n this.duration = parameters.duration ?? 1;\n this.startDelay = parameters.startDelay ?? new ConstantValue(0);\n this.looping = parameters.looping ?? true;\n this.prewarm = parameters.prewarm ?? false;\n this.startLife = parameters.startLife ?? new ConstantValue(5);\n this.startSpeed = parameters.startSpeed ?? new ConstantValue(0);\n this.startRotation = parameters.startRotation ?? new ConstantValue(0);\n this.startSize = parameters.startSize ?? new ConstantValue(1);\n this.startColor = parameters.startColor ?? new ConstantColor(new Vector4(1, 1, 1, 1));\n this.emissionOverTime = parameters.emissionOverTime ?? new ConstantValue(10);\n this.emissionOverDistance = parameters.emissionOverDistance ?? new ConstantValue(0);\n this.emissionBursts = parameters.emissionBursts ?? [];\n this.maxParticles = parameters.maxParticles;\n this.onlyUsedByOther = parameters.onlyUsedByOther ?? false;\n this.emitterShape = parameters.shape ?? new SphereEmitter();\n this.behaviors = parameters.behaviors ?? [];\n this.worldSpace = parameters.worldSpace ?? false;\n this.rendererEmitterSettings = parameters.rendererEmitterSettings ?? {};\n\n if (parameters.renderMode === RenderMode.StretchedBillBoard) {\n const settings = this.rendererEmitterSettings as StretchedBillBoardSettings;\n if (parameters.speedFactor !== undefined) {\n settings.speedFactor = parameters.speedFactor;\n }\n settings.speedFactor = settings.speedFactor ?? 0;\n settings.lengthFactor = settings.lengthFactor ?? 0;\n }\n\n this.rendererSettings = {\n instancingGeometry: parameters.instancingGeometry ?? DEFAULT_POSITIONS,\n instancingIndices: parameters.instancingIndices ?? DEFAULT_INDICES,\n instancingUVs:\n parameters.instancingUVs ??\n (parameters.instancingGeometry ? fallbackUVsForPositions(parameters.instancingGeometry) : DEFAULT_UVS),\n instancingNormals: parameters.instancingNormals,\n renderMode: parameters.renderMode ?? RenderMode.BillBoard,\n renderOrder: parameters.renderOrder ?? 0,\n uTileCount: parameters.uTileCount ?? 1,\n vTileCount: parameters.vTileCount ?? 1,\n blendTiles: parameters.blendTiles ?? false,\n softParticles: parameters.softParticles ?? false,\n softNearFade: parameters.softNearFade ?? 0,\n softFarFade: parameters.softFarFade ?? 0,\n materialBlendMode: parameters.blendMode ?? Constants.ALPHA_ADD,\n materialTransparent: parameters.transparent ?? true,\n materialDepthTest: parameters.depthTest ?? true,\n materialDepthWrite: parameters.depthWrite ?? false,\n materialAlphaTest: parameters.alphaTest ?? 0,\n texture: parameters.texture ?? null,\n reflectionTexture: null,\n reflectionLevel: 1,\n reflectionFaces: null,\n reflectionAtlas: null,\n layerMask: parameters.layerMask ?? 0x0fffffff,\n pivot: ParticleSystem.nonZeroPivot(parameters.pivot),\n };\n this.flip = ParticleSystem.nonZeroFlip(parameters.flip);\n if (this.rendererSettings.renderMode === RenderMode.Mesh && !this.rendererSettings.instancingNormals) {\n this.rendererSettings.instancingNormals = ParticleSystem.createFallbackNormals(\n this.rendererSettings.instancingGeometry\n );\n }\n\n this.materialRef = parameters.material ?? null;\n this.applyMaterialSettings(this.materialRef, {\n blendMode: parameters.blendMode,\n transparent: parameters.transparent,\n depthTest: parameters.depthTest,\n depthWrite: parameters.depthWrite,\n alphaTest: parameters.alphaTest,\n texture: parameters.texture,\n layerMask: parameters.layerMask,\n });\n this.neededToUpdateRender = true;\n\n this.particles = [];\n this.startTileIndex = parameters.startTileIndex || new ConstantValue(0);\n this.emitter = new ParticleEmitter(this, parameters.scene);\n\n this.paused = false;\n this.particleNum = 0;\n this.emissionState = {\n isBursting: false,\n burstParticleIndex: 0,\n burstParticleCount: 0,\n burstIndex: 0,\n burstWaveIndex: 0,\n time: 0,\n waitEmiting: 0,\n travelDistance: 0,\n };\n\n this.emissionBursts.forEach((burst) => burst.count.startGen(this.memory));\n this.emissionOverDistance.startGen(this.memory);\n this.startDelay.startGen(this.memory);\n this.startDelayTimeLeft = this.startDelay.genValue(this.memory, 0);\n\n this.emitEnded = false;\n this.markForDestroy = false;\n this.prewarmed = false;\n }\n\n private applyMaterialSettings(\n material: any,\n overrides: {\n blendMode?: number;\n transparent?: boolean;\n depthTest?: boolean;\n depthWrite?: boolean;\n alphaTest?: number;\n texture?: Texture | null;\n reflectionAtlas?: BaseTexture | null;\n layerMask?: number;\n } = {}\n ) {\n /* istanbul ignore if -- rendererSettings is always assigned in the constructor before any code path can call this private method */\n if (!this.rendererSettings) {\n return;\n }\n\n const resolvedTexture =\n overrides.texture !== undefined\n ? overrides.texture\n : (material?.albedoTexture ??\n material?.diffuseTexture ??\n material?.emissiveTexture ??\n material?.opacityTexture ??\n material?.baseTexture ??\n this.rendererSettings.texture ??\n null);\n const resolvedReflection =\n material?.reflectionTexture ??\n material?.environmentTexture ??\n this.rendererSettings.reflectionTexture ??\n null;\n const resolvedReflectionLevel = typeof resolvedReflection?.level === 'number' ? resolvedReflection.level : 1;\n const resolvedBlendMode =\n overrides.blendMode ??\n (typeof material?.alphaMode === 'number' ? material.alphaMode : this.rendererSettings.materialBlendMode);\n const resolvedTransparent =\n overrides.transparent ??\n (typeof material?.needAlphaBlending === 'function'\n ? material.needAlphaBlending()\n : typeof material?.alpha === 'number'\n ? material.alpha < 1\n : this.rendererSettings.materialTransparent);\n const resolvedDepthTest =\n overrides.depthTest ??\n (typeof material?.disableDepthTest === 'boolean'\n ? !material.disableDepthTest\n : this.rendererSettings.materialDepthTest);\n const resolvedDepthWrite =\n overrides.depthWrite ??\n (typeof material?.disableDepthWrite === 'boolean'\n ? !material.disableDepthWrite\n : typeof material?.forceDepthWrite === 'boolean'\n ? material.forceDepthWrite\n : this.rendererSettings.materialDepthWrite);\n const resolvedAlphaTest =\n overrides.alphaTest ??\n (() => {\n // StandardMaterial always has alphaCutOff (default 0.4). Only treat it as\n // particle alpha-test when the material is actually in an alpha-test mode —\n // otherwise Mesh Material demos wrongly enable USE_ALPHATEST.\n const mode = material?.transparencyMode;\n const alphaTestMode = mode === 1 || mode === 3;\n if (alphaTestMode && typeof material?.alphaCutOff === 'number') {\n return material.alphaCutOff;\n }\n if (alphaTestMode && typeof material?.alphaCutOffValue === 'number') {\n return material.alphaCutOffValue;\n }\n if (material) {\n return 0;\n }\n return this.rendererSettings.materialAlphaTest;\n })();\n\n this.rendererSettings.texture = resolvedTexture;\n this.rendererSettings.reflectionTexture = resolvedReflection;\n this.rendererSettings.reflectionLevel =\n typeof material?.reflectionLevel === 'number' ? material.reflectionLevel : resolvedReflectionLevel;\n // Prefer an explicit atlas; otherwise build a 3×2 atlas from CubeTexture\n // face URLs (iOS-safe single sampler2D — not samplerCube / six faces).\n let resolvedAtlas =\n material?.reflectionAtlas ?? overrides.reflectionAtlas ?? this.rendererSettings.reflectionAtlas ?? null;\n if (!resolvedAtlas && resolvedReflection?.isCube) {\n resolvedAtlas = getCachedEnvAtlas(resolvedReflection);\n if (!resolvedAtlas && this.sceneRef) {\n ensureEnvAtlasFromCube(resolvedReflection, this.sceneRef, (atlas) => {\n if (this.rendererSettings.reflectionAtlas === atlas) {\n return;\n }\n this.rendererSettings.reflectionAtlas = atlas;\n if (material && material.reflectionAtlas == null) {\n material.reflectionAtlas = atlas;\n }\n this.neededToUpdateRender = true;\n });\n resolvedAtlas = getCachedEnvAtlas(resolvedReflection);\n }\n }\n this.rendererSettings.reflectionAtlas = resolvedAtlas;\n // Do not expand cube files into six face textures anymore — that path\n // still trips GL_INVALID_OPERATION on iOS. Prefer a single atlas.\n this.rendererSettings.reflectionFaces =\n material?.reflectionFaces?.length === 6 ? material.reflectionFaces : null;\n this.rendererSettings.materialBlendMode = resolvedBlendMode;\n this.rendererSettings.materialTransparent = resolvedTransparent;\n this.rendererSettings.materialDepthTest = resolvedDepthTest;\n this.rendererSettings.materialDepthWrite = resolvedDepthWrite;\n this.rendererSettings.materialAlphaTest = resolvedAlphaTest;\n if (overrides.layerMask !== undefined) {\n this.rendererSettings.layerMask = overrides.layerMask;\n }\n this.neededToUpdateRender = true;\n }\n\n pause() {\n this.paused = true;\n }\n play() {\n this.paused = false;\n }\n stop() {\n this.restart();\n this.pause();\n }\n\n setQualityFactor(qualityFactor: number) {\n this.qualityFactor = Math.max(0.1, Math.min(1, qualityFactor));\n }\n\n /**\n * Appends one particle to the pool, giving it the next row of the store.\n *\n * Growing the store replaces its arrays, so every particle already bound to\n * it has to be re-pointed at the new ones.\n */\n /** Points every particle at the store's columns again, after any were replaced. */\n private rebindParticles(): void {\n const particles = this.particles;\n for (let i = 0; i < particles.length; i++) {\n (particles[i] as SpriteParticle | TrailParticle).rebind();\n }\n }\n\n private growParticlePool(isTrailMode: boolean): void {\n const index = this.particles.length;\n if (this.store.ensureCapacity(index + 1)) {\n this.rebindParticles();\n }\n this.particles.push(isTrailMode ? new TrailParticle(this.store, index) : new SpriteParticle(this.store, index));\n }\n\n private spawn(count: number, emissionState: EmissionState, matrix: Matrix4) {\n const translation = tempV;\n const scale = tempV2;\n // decompose writes tempQ, so no separate setFromRotationMatrix is needed.\n matrix.decompose(translation, tempQ, scale);\n const behaviors = this.behaviors;\n const behaviorCount = behaviors.length;\n const renderMode = this.rendererSettings.renderMode;\n const isTrailMode = renderMode === RenderMode.Trail;\n const isSpriteMode = !isTrailMode;\n const isMeshMode = renderMode === RenderMode.Mesh;\n const startRotationIsRotation = this.startRotation.type === 'rotation';\n const startSizeIsVector3 = this.startSize.type === 'vec3function';\n const timeRatio = emissionState.time / this.duration;\n const trailSettings = isTrailMode ? (this.rendererEmitterSettings as TrailSettings) : undefined;\n const followLocalOrigin = Boolean(trailSettings?.followLocalOrigin);\n if (this.maxParticles !== undefined) {\n // Like Unity, a full system skips the particles it has no room for rather than queueing them.\n count = Math.min(count, Math.max(0, this.maxParticles - this.particleNum));\n }\n\n for (let i = 0; i < count; i++) {\n emissionState.burstParticleIndex = i;\n this.particleNum++;\n if (this.particles.length < this.particleNum) {\n this.growParticlePool(isTrailMode);\n }\n const particle = this.particles[this.particleNum - 1];\n particle.reset();\n particle.speedModifier = 1;\n // Parent EmitSub can refill an onlyUsedByOther system after it had\n // already finished empty; clear the flag so update does not treat it\n // as done while it has live particles again.\n this.finishedEventFired = false;\n this.startColor.startGen(particle.memory);\n this.startColor.genColor(particle.memory, particle.startColor, this.emissionState.time);\n particle.color.copy(particle.startColor);\n this.startSpeed.startGen(particle.memory);\n particle.startSpeed = this.startSpeed.genValue(particle.memory, timeRatio);\n this.startLife.startGen(particle.memory);\n particle.life = this.startLife.genValue(particle.memory, timeRatio);\n particle.age = 0;\n this.startSize.startGen(particle.memory);\n if (startSizeIsVector3) {\n (this.startSize as Vector3Generator).genValue(particle.memory, particle.startSize, timeRatio);\n } else {\n const size = (this.startSize as FunctionValueGenerator).genValue(particle.memory, timeRatio);\n particle.startSize.set(size, size, size);\n }\n this.startTileIndex.startGen(particle.memory);\n particle.uvTile = this.startTileIndex.genValue(particle.memory);\n particle.size.copy(particle.startSize);\n\n if (isSpriteMode) {\n const sprite = particle as SpriteParticle;\n this.startRotation.startGen(particle.memory);\n if (isMeshMode) {\n if (!(sprite.rotation instanceof Quaternion)) {\n sprite.rotation = new Quaternion();\n }\n // A recycled particle can still carry the turn of whatever\n // it was last time; the renderer would draw a fraction of it\n // before any behavior has had a chance to say otherwise.\n if (sprite.angularVelocity instanceof Quaternion) {\n sprite.angularVelocity.set(0, 0, 0, 1);\n }\n if (startRotationIsRotation) {\n (this.startRotation as RotationGenerator).genValue(\n particle.memory,\n sprite.rotation as Quaternion,\n 1,\n timeRatio\n );\n } else {\n (sprite.rotation as Quaternion).setFromAxisAngle(\n UP,\n (this.startRotation as FunctionValueGenerator).genValue(sprite.memory, timeRatio)\n );\n }\n } else {\n if (startRotationIsRotation) {\n sprite.rotation = 0;\n } else {\n sprite.rotation = (this.startRotation as FunctionValueGenerator).genValue(\n sprite.memory,\n timeRatio\n );\n }\n // Set until a turning behavior says otherwise, so the\n // renderer never carries a recycled particle's old spin.\n sprite.angularVelocity = 0;\n const flip = this.flip;\n sprite.flip =\n flip === undefined ? 0 : (Math.random() < flip.x ? 1 : 0) | (Math.random() < flip.y ? 2 : 0);\n }\n } else if (trailSettings) {\n const trail = particle as TrailParticle;\n trailSettings.startLength.startGen(trail.memory);\n trail.length = trailSettings.startLength.genValue(trail.memory, timeRatio);\n trail.ensureHistoryCapacity(Math.max(1, Math.ceil(trail.length)));\n trail.resetHistory();\n }\n\n this.emitterShape.initialize(particle, emissionState);\n\n if (isTrailMode && followLocalOrigin) {\n const trail = particle as TrailParticle;\n if (!trail.localPosition) {\n trail.localPosition = new Vector3();\n }\n trail.localPosition.copy(trail.position);\n }\n\n if (this.worldSpace) {\n particle.position.applyMatrix4(matrix);\n particle.startSize.multiply(scale).abs();\n particle.size.copy(particle.startSize);\n particle.velocity.multiply(scale).applyMatrix3(this.normalMatrix);\n if (particle.rotation && particle.rotation instanceof Quaternion) {\n particle.rotation.multiplyQuaternions(tempQ, particle.rotation);\n }\n } else {\n if (this.onlyUsedByOther) {\n particle.parentMatrix = matrix;\n }\n }\n\n for (let j = 0; j < behaviorCount; j++) {\n behaviors[j].initialize(particle, this);\n }\n }\n }\n\n endEmit() {\n this.emitEnded = true;\n if (this.autoDestroy) {\n this.markForDestroy = true;\n }\n this.fire({type: 'emitEnd', particleSystem: this});\n }\n\n dispose() {\n if (this.destroyed) {\n return;\n }\n this.destroyed = true;\n if (this._renderer) this._renderer.deleteSystem(this);\n this.emitter.dispose();\n this.fire({type: 'destroy', particleSystem: this});\n }\n\n restart() {\n this.memory.length = 0;\n this.paused = false;\n this.particleNum = 0;\n this.emissionState.isBursting = false;\n this.emissionState.burstIndex = 0;\n this.emissionState.burstWaveIndex = 0;\n this.emissionState.time = 0;\n this.emissionState.waitEmiting = 0;\n this.behaviors.forEach((behavior) => behavior.reset());\n this.emitEnded = false;\n this.markForDestroy = false;\n this.finishedEventFired = false;\n this.prewarmed = false;\n this.emissionBursts.forEach((burst) => burst.count.startGen(this.memory));\n this.emissionOverDistance.startGen(this.memory);\n this.startDelay.startGen(this.memory);\n this.startDelayTimeLeft = this.startDelay.genValue(this.memory, 0);\n this.previousEmitterPos = undefined;\n this.emitterVelocity.set(0, 0, 0);\n this.simulationAccumulator = 0;\n this.destroyed = false;\n }\n\n private firstTimeUpdate = true;\n\n /** @internal */\n update(delta: number) {\n if (this.paused) return;\n\n if (this.firstTimeUpdate) {\n this.firstTimeUpdate = false;\n this.emitter.computeWorldMatrix(true);\n }\n\n if (!this.looping && this.finishedEventFired && this.particleNum === 0) {\n // Still tick the fixed-step clock. A sub-emitter target\n // (onlyUsedByOther) goes empty between parent bursts; skipping the\n // accumulator here desyncs it from the parent, so the next particles\n // the parent emits into it sit at age 0 / startColor until the phase\n // catches up — white flashes scattered wherever the parent was.\n if (delta > 0.1) {\n delta = 0.1;\n }\n this.simulationAccumulator += delta;\n const stepsToRun = Math.min(\n MAX_SIMULATION_STEPS_PER_FRAME,\n Math.max(0, Math.round(this.simulationAccumulator / SIMULATION_STEP - ROUND_TIE_BIAS))\n );\n this.simulationAccumulator -= stepsToRun * SIMULATION_STEP;\n return;\n }\n\n if (this.looping && this.prewarm && !this.prewarmed) {\n this.prewarmed = true;\n for (let i = 0; i < this.duration * PREWARM_FPS; i++) {\n this.update(1.0 / PREWARM_FPS);\n }\n }\n\n if (delta > 0.1) {\n delta = 0.1;\n }\n\n if (this.neededToUpdateRender) {\n if (this._renderer) this._renderer.updateSystem(this);\n this.neededToUpdateRender = false;\n }\n\n const emitterElements = this.emitter.matrixWorld.elements;\n this.tempEmitterPos.set(emitterElements[12], emitterElements[13], emitterElements[14]);\n if (this.previousEmitterPos !== undefined && delta > 0) {\n this.emitterVelocity.copy(this.tempEmitterPos).sub(this.previousEmitterPos).divideScalar(delta);\n }\n (this.previousEmitterPos ??= new Vector3()).copy(this.tempEmitterPos);\n\n // Start delay holds back emission once per play/restart (ignored with\n // prewarm, matching Unity). Carry the remainder so a large frame does\n // not lose time.\n if (this.startDelayTimeLeft > 0 && !(this.prewarm && this.looping)) {\n this.startDelayTimeLeft -= delta;\n if (this.startDelayTimeLeft >= 0) return;\n delta = Math.min(-this.startDelayTimeLeft, 0.1);\n this.startDelayTimeLeft = 0;\n }\n\n this.simulationAccumulator += delta;\n const stepsToRun = Math.min(\n MAX_SIMULATION_STEPS_PER_FRAME,\n Math.max(0, Math.round(this.simulationAccumulator / SIMULATION_STEP - ROUND_TIE_BIAS))\n );\n for (let i = 0; i < stepsToRun; i++) {\n this.simulateStep(SIMULATION_STEP);\n }\n this.simulationAccumulator -= stepsToRun * SIMULATION_STEP;\n }\n\n /**\n * Time the display is ahead of (positive) or still ahead of the simulation\n * (negative — the simulation ran a hair early), in seconds. Magnitude never\n * exceeds one step.\n *\n * The simulation runs on a fixed 1/60 step so that emission and lifetimes\n * stay in phase — without it a slow emitter flickers when the frame rate\n * wobbles. But frames do not arrive on that grid: a display running at\n * anything other than exactly 60Hz leaves some frames with no step at all\n * (half of them at 120Hz, three in five at 144Hz) and others with two, so\n * the particles are drawn stuttering even while the frame rate is perfect.\n *\n * The steps-per-frame count below is chosen by *rounding* the accumulated\n * time to the nearest step, not flooring it. Flooring always leaves the\n * accumulator positive, and when the real frame rate sits very close to\n * 60Hz (as most displays do) that leftover creeps toward a full step for\n * many consecutive frames before tipping over into a frame that runs two\n * steps at once and resets it to near zero — a visible lurch, every particle\n * in the system at once, with a perfectly steady frame rate the whole time.\n * Rounding lets the leftover go negative instead, which keeps it centered\n * near zero and stops it from ever building up toward that reset.\n *\n * Renderers close the gap by advancing what they draw along each particle's\n * velocity by this much. That reproduces the straight-line part of the\n * motion exactly — it is the same term the next step would integrate — so\n * the simulation stays fixed-step while the picture moves continuously.\n */\n /** Length of one simulation step, in seconds. See {@link simulationResidual}. */\n get simulationStep(): number {\n return SIMULATION_STEP;\n }\n\n get simulationResidual(): number {\n if (this.paused) {\n return 0;\n }\n // Magnitude never more than a step, even if a frame long enough to hit\n // the per-frame step cap left the accumulator with more than that.\n if (this.simulationAccumulator > SIMULATION_STEP) return SIMULATION_STEP;\n if (this.simulationAccumulator < -SIMULATION_STEP) return -SIMULATION_STEP;\n return this.simulationAccumulator;\n }\n\n /**\n * Execution plan for this system's behaviors, rebuilt when the list changes.\n *\n * Consecutive behaviors that can be compiled into one loop are merged, so\n * the particles are walked once instead of once per behavior. The plan is\n * keyed on the behavior instances, not their types: swapping one out has to\n * change the generated code's indices.\n */\n private behaviorSteps(): Array<FusionStep> {\n const behaviors = this.behaviors;\n const cached = this.fusionPlan;\n if (cached !== undefined && cached.length === behaviors.length) {\n let same = true;\n for (let i = 0; i < behaviors.length; i++) {\n if (cached[i] !== behaviors[i]) {\n same = false;\n break;\n }\n }\n if (same) {\n return this.fusionSteps;\n }\n }\n this.fusionPlan = behaviors.slice();\n this.fusionSteps = planBehaviorFusion(behaviors);\n return this.fusionSteps;\n }\n\n /** Advances emission, behaviors, motion and culling by one fixed timestep. */\n private simulateStep(delta: number): void {\n if (!this.onlyUsedByOther) {\n this.emit(delta, this.emissionState, this.emitter.matrixWorld);\n }\n\n const particles = this.particles;\n const behaviors = this.behaviors;\n const behaviorCount = behaviors.length;\n const particleCount = this.particleNum;\n const isTrailMode = this.rendererSettings.renderMode === RenderMode.Trail;\n // Only stretched billboards draw from velocity, and only they pay for\n // keeping the previous one.\n const stretched = this.rendererSettings.renderMode === RenderMode.StretchedBillBoard;\n\n // Remember where everything starts this step, so the renderer can carry\n // the motion the step produces on into the part of the frame that comes\n // after it. Taken after emission on purpose: a particle born this step\n // then starts from where it was born rather than from whatever the row\n // held before, and so is drawn at the emitter instead of jumping.\n const columns = this.store;\n const vector3Rows = particleCount * 3;\n columns.previousPosition.set(columns.position.subarray(0, vector3Rows));\n columns.previousSize.set(columns.size.subarray(0, vector3Rows));\n if (stretched) {\n if (columns.keepPreviousVelocity()) {\n this.rebindParticles();\n }\n columns.previousVelocity.set(columns.velocity.subarray(0, vector3Rows));\n }\n columns.previousColor.set(columns.color.subarray(0, particleCount * 4));\n\n this.emitterShape.update(this, delta);\n const steps = this.behaviorSteps();\n for (let s = 0; s < steps.length; s++) {\n const step = steps[s];\n const stepBehaviors = step.behaviors;\n for (let j = 0; j < stepBehaviors.length; j++) {\n stepBehaviors[j].frameUpdate(delta);\n }\n // Nothing to update: skip, matching what the per-particle loop did.\n // A behavior may set up state before its loop that is only valid\n // once it has seen a particle.\n if (particleCount === 0) {\n continue;\n }\n if (step.run !== undefined) {\n step.run(behaviors, particles, particleCount, delta);\n continue;\n }\n const behavior = stepBehaviors[0];\n if (behavior.updateAll !== undefined) {\n behavior.updateAll(particles, particleCount, delta);\n continue;\n }\n for (let i = 0; i < particleCount; i++) {\n const particle = particles[i];\n // Inlined `died` — this runs once per behavior per particle.\n if (particle.age < particle.life) {\n behavior.update(particle, delta);\n }\n }\n }\n\n // Newborns were snapshotted above with spawn size/color (startSize /\n // startColor) before SizeOverLife / ColorOverLife ran. That false jump\n // is then extrapolated by the renderer when simulationResidual is\n // negative (common with rounded fixed-step) and flashes the start\n // appearance at the emitter. Collapse it so birth matches t=0 on the\n // curves. Age is still 0 here — integration below ages them.\n if (particleCount > 0) {\n const prevSize = columns.previousSize;\n const curSize = columns.size;\n const prevColor = columns.previousColor;\n const curColor = columns.color;\n const scalars = columns.scalars;\n const stride = ParticleStore.SCALAR_STRIDE;\n for (let i = 0, o3 = 0, o4 = 0, s = 0; i < particleCount; i++, o3 += 3, o4 += 4, s += stride) {\n if (scalars[s + ParticleStore.AGE] !== 0) {\n continue;\n }\n prevSize[o3] = curSize[o3];\n prevSize[o3 + 1] = curSize[o3 + 1];\n prevSize[o3 + 2] = curSize[o3 + 2];\n prevColor[o4] = curColor[o4];\n prevColor[o4 + 1] = curColor[o4 + 1];\n prevColor[o4 + 2] = curColor[o4 + 2];\n prevColor[o4 + 3] = curColor[o4 + 3];\n }\n }\n\n const followLocalOrigin = isTrailMode && (this.rendererEmitterSettings as TrailSettings).followLocalOrigin;\n if (followLocalOrigin) {\n const emitterMatrix = this.emitter.matrixWorld;\n for (let i = 0; i < particleCount; i++) {\n const particle = particles[i];\n if ((particle as TrailParticle).localPosition) {\n particle.position.copy((particle as TrailParticle).localPosition!);\n particle.position.applyMatrix4(particle.parentMatrix ?? emitterMatrix);\n } else {\n particle.position.addScaledVector(particle.velocity, delta * particle.speedModifier);\n }\n particle.age += delta;\n }\n } else {\n // Live particles own rows [0, particleNum), so integrate straight\n // over the columns. Nothing in here touches a particle object.\n const positions = this.store.position;\n const velocities = this.store.velocity;\n const scalars = this.store.scalars;\n const stride = ParticleStore.SCALAR_STRIDE;\n for (let i = 0, offset = 0, scalar = 0; i < particleCount; i++, offset += 3, scalar += stride) {\n const step = delta * scalars[scalar + ParticleStore.SPEED_MODIFIER];\n positions[offset] += velocities[offset] * step;\n positions[offset + 1] += velocities[offset + 1] * step;\n positions[offset + 2] += velocities[offset + 2] * step;\n scalars[scalar + ParticleStore.AGE] += delta;\n }\n }\n\n if (isTrailMode) {\n const trailSettings = this.rendererEmitterSettings as TrailSettings;\n const dieWithParticle = trailSettings.dieWithParticle;\n // A world-space system records world positions already.\n const recordWorldSpace = trailSettings.recordWorldSpace && !this.worldSpace;\n const emitterMatrix = this.emitter.matrixWorld;\n for (let i = 0; i < particleCount; i++) {\n const trail = particles[i] as TrailParticle;\n // Emptying the history lets the removal pass below take the\n // particle this same step.\n if (dieWithParticle && trail.age >= trail.life) {\n trail.resetHistory();\n continue;\n }\n trail.update();\n // update() wrote a sample only while the particle is alive.\n if (recordWorldSpace && trail.age <= trail.life) {\n const offset = ((trail.historyHead + trail.historyCapacity - 1) % trail.historyCapacity) * 3;\n const positions = trail.historyPositions;\n tempV.set(positions[offset], positions[offset + 1], positions[offset + 2]);\n tempV.applyMatrix4(trail.parentMatrix ?? emitterMatrix);\n positions[offset] = tempV.x;\n positions[offset + 1] = tempV.y;\n positions[offset + 2] = tempV.z;\n }\n }\n }\n\n const notifyDeaths = this.hasListeners('particleDied');\n const store = this.store;\n const scalars = store.scalars;\n const scalarStride = ParticleStore.SCALAR_STRIDE;\n let liveParticleCount = this.particleNum;\n for (let i = 0; i < liveParticleCount; i++) {\n const particle = particles[i];\n const scalar = i * scalarStride;\n const dead = scalars[scalar + ParticleStore.AGE] >= scalars[scalar + ParticleStore.LIFE];\n if (dead && (!isTrailMode || (particle as TrailParticle).historyCount === 0)) {\n const last = liveParticleCount - 1;\n const survivor = particles[last] as StoreBackedParticle;\n particles[i] = survivor;\n particles[last] = particle;\n // Move the rows along with the particles so slot k always owns\n // row k. Live particles then stay one contiguous range, which is\n // what lets the renderer copy them without gathering.\n if (i !== last) {\n store.swapRows(i, last);\n survivor.setStoreIndex(i);\n (particle as StoreBackedParticle).setStoreIndex(last);\n }\n liveParticleCount--;\n i--;\n if (notifyDeaths) {\n this.fire({type: 'particleDied', particleSystem: this, particle: particle});\n }\n }\n }\n this.particleNum = liveParticleCount;\n this.notifyFinished();\n }\n\n private notifyFinished(): void {\n if (!this.isFinished()) {\n return;\n }\n if (!this.finishedEventFired) {\n this.finishedEventFired = true;\n this.fire({type: 'finished', particleSystem: this});\n }\n if (this.autoDestroy) {\n this.markForDestroy = true;\n this.dispose();\n }\n }\n\n emit(delta: number, emissionState: EmissionState, emitterMatrix: Matrix4) {\n if (emissionState.time > this.duration) {\n if (this.looping) {\n emissionState.time -= this.duration;\n emissionState.burstIndex = 0;\n for (let i = 0; i < this.behaviors.length; i++) {\n this.behaviors[i].reset();\n }\n } else {\n if (!this.emitEnded && !this.onlyUsedByOther) {\n this.endEmit();\n }\n }\n }\n\n // Only spawns in world space consume the normal matrix, and computing it\n // inverts a 4x4 — skip it for local-space systems.\n if (this.worldSpace) {\n this.normalMatrix.getNormalMatrix(emitterMatrix);\n }\n const emissionBursts = this.emissionBursts;\n const emissionBurstCount = emissionBursts.length;\n const qualityFactor = this.qualityFactor;\n\n while (\n emissionState.burstIndex < emissionBurstCount &&\n emissionBursts[emissionState.burstIndex].time <= emissionState.time\n ) {\n const burst = emissionBursts[emissionState.burstIndex];\n if (Math.random() < burst.probability) {\n const rawCount = burst.count.genValue(this.memory, this.time);\n const count = qualityFactor >= 0.999 ? rawCount : Math.floor(rawCount * qualityFactor);\n emissionState.isBursting = true;\n emissionState.burstParticleCount = count;\n this.spawn(count, emissionState, emitterMatrix);\n emissionState.isBursting = false;\n }\n emissionState.burstIndex++;\n }\n\n if (!this.emitEnded) {\n const timeRatio = emissionState.time / this.duration;\n emissionState.waitEmiting += delta * this.emissionOverTime.genValue(this.memory, timeRatio) * qualityFactor;\n\n const previousWorldPos = emissionState.previousWorldPos;\n if (previousWorldPos !== undefined) {\n this.temp.set(emitterMatrix.elements[12], emitterMatrix.elements[13], emitterMatrix.elements[14]);\n emissionState.travelDistance += previousWorldPos.distanceTo(this.temp);\n const emitPerMeter = this.emissionOverDistance.genValue(this.memory, timeRatio) * qualityFactor;\n if (emissionState.travelDistance * emitPerMeter > 0) {\n const count = Math.floor(emissionState.travelDistance * emitPerMeter);\n emissionState.travelDistance -= count / emitPerMeter;\n emissionState.waitEmiting += count;\n }\n }\n }\n\n // Accrue before spawning so replacement particles can appear on the same\n // frame an old one dies (rate * lifetime ≈ 1 would otherwise flicker).\n const totalSpawn = Math.floor(emissionState.waitEmiting);\n if (totalSpawn > 0) {\n this.spawn(totalSpawn, emissionState, emitterMatrix);\n emissionState.waitEmiting -= totalSpawn;\n }\n\n if (emissionState.previousWorldPos === undefined) emissionState.previousWorldPos = new Vector3();\n emissionState.previousWorldPos.set(\n emitterMatrix.elements[12],\n emitterMatrix.elements[13],\n emitterMatrix.elements[14]\n );\n emissionState.time += delta;\n }\n\n toJSON(metaData?: BabylonMetaData | string, _options: SerializationOptions = {}): ParticleSystemJSONParameters {\n const isRootObject = metaData === undefined || typeof metaData === 'string';\n const meta: BabylonMetaData = isRootObject\n ? {\n geometries: {},\n materials: {},\n textures: {},\n images: {},\n shapes: {},\n skeletons: {},\n animations: {},\n nodes: {},\n }\n : metaData;\n\n const geometryUUID = this.ensureGeometryMeta(meta);\n const materialUUID = this.ensureMaterialMeta(meta);\n const rendererEmitterSettingsJSON = this.toRendererSettingsJSON();\n\n return {\n version: '3.0',\n autoDestroy: this.autoDestroy,\n looping: this.looping,\n prewarm: this.prewarm,\n duration: this.duration,\n startDelay: this.startDelay.toJSON(),\n shape: this.emitterShape.toJSON(),\n startLife: this.startLife.toJSON(),\n startSpeed: this.startSpeed.toJSON(),\n startRotation: this.startRotation.toJSON(),\n startSize: this.startSize.toJSON(),\n startColor: this.startColor.toJSON(),\n emissionOverTime: this.emissionOverTime.toJSON(),\n emissionOverDistance: this.emissionOverDistance.toJSON(),\n emissionBursts: this.emissionBursts.map((burst) => ({\n time: burst.time,\n count: burst.count.toJSON(),\n probability: burst.probability,\n interval: burst.interval,\n cycle: burst.cycle,\n })),\n ...(this.maxParticles !== undefined ? {maxParticles: this.maxParticles} : {}),\n onlyUsedByOther: this.onlyUsedByOther,\n instancingGeometry: geometryUUID,\n renderMode: this.renderMode,\n renderOrder: this.renderOrder,\n rendererEmitterSettings: rendererEmitterSettingsJSON,\n material: materialUUID,\n layers: this.rendererSettings.layerMask,\n startTileIndex: this.startTileIndex.toJSON(),\n uTileCount: this.rendererSettings.uTileCount,\n vTileCount: this.rendererSettings.vTileCount,\n blendTiles: this.rendererSettings.blendTiles,\n softParticles: this.rendererSettings.softParticles,\n softFarFade: this.rendererSettings.softFarFade,\n softNearFade: this.rendererSettings.softNearFade,\n blending: this.rendererSettings.materialBlendMode,\n transparent: this.rendererSettings.materialTransparent,\n depthTest: this.rendererSettings.materialDepthTest,\n depthWrite: this.rendererSettings.materialDepthWrite,\n alphaTest: this.rendererSettings.materialAlphaTest,\n behaviors: this.behaviors.map((b) => b.toJSON()),\n worldSpace: this.worldSpace,\n ...(this.pivot ? {pivot: [this.pivot.x, this.pivot.y, this.pivot.z]} : {}),\n ...(this.flip ? {flip: [this.flip.x, this.flip.y]} : {}),\n };\n }\n\n static fromJSON(\n json: ParticleSystemJSONParameters,\n meta: BabylonMetaData,\n dependencies: {[uuid: string]: Behavior} = {},\n scene?: Scene\n ): ParticleSystem {\n const shape = EmitterFromJSON(json.shape, meta as any);\n let rendererEmitterSettings: RendererEmitterSettings;\n if (json.renderMode === RenderMode.Trail) {\n const trailSettings = json.rendererEmitterSettings as TrailSettings;\n rendererEmitterSettings = {\n startLength:\n trailSettings?.startLength !== undefined\n ? ValueGeneratorFromJSON(trailSettings.startLength)\n : new ConstantValue(30),\n followLocalOrigin: trailSettings?.followLocalOrigin ?? false,\n ...trailFlags(trailSettings),\n };\n } else if (json.renderMode === RenderMode.StretchedBillBoard) {\n rendererEmitterSettings = {...(json.rendererEmitterSettings ?? {})};\n if (json.speedFactor !== undefined) {\n (rendererEmitterSettings as StretchedBillBoardSettings).speedFactor = json.speedFactor;\n }\n } else {\n rendererEmitterSettings = {};\n }\n\n const materialMeta = json.material ? meta.materials?.[json.material] : undefined;\n const materialTextureRef = materialMeta?.texture ?? json.texture;\n const texture =\n typeof materialTextureRef === 'string'\n ? (meta.textures?.[materialTextureRef] ?? null)\n : (materialTextureRef ?? null);\n const resolvedGeometryEntry =\n typeof json.instancingGeometry === 'string'\n ? meta.geometries?.[json.instancingGeometry]\n : json.instancingGeometry;\n const resolvedGeometry = ParticleSystem.resolveGeometryData(resolvedGeometryEntry);\n\n const ps = new ParticleSystem({\n scene,\n autoDestroy: json.autoDestroy,\n looping: json.looping,\n prewarm: json.prewarm,\n duration: json.duration,\n startDelay: json.startDelay ? ValueGeneratorFromJSON(json.startDelay) : undefined,\n shape,\n startLife: ValueGeneratorFromJSON(json.startLife),\n startSpeed: ValueGeneratorFromJSON(json.startSpeed),\n startRotation: GeneratorFromJSON(json.startRotation) as\n | RotationGenerator\n | ValueGenerator\n | FunctionValueGenerator,\n startSize: GeneratorFromJSON(json.startSize) as Vector3Generator | ValueGenerator | FunctionValueGenerator,\n startColor: ColorGeneratorFromJSON(json.startColor) as ColorGenerator,\n emissionOverTime: ValueGeneratorFromJSON(json.emissionOverTime),\n emissionOverDistance: ValueGeneratorFromJSON(json.emissionOverDistance),\n emissionBursts: json.emissionBursts?.map((burst: any) => ({\n time: burst.time,\n count:\n typeof burst.count === 'number'\n ? new ConstantValue(burst.count)\n : ValueGeneratorFromJSON(burst.count),\n probability: burst.probability ?? 1,\n interval: burst.interval ?? 0.1,\n cycle: burst.cycle ?? burst.cycleCount ?? 1,\n })),\n maxParticles: typeof json.maxParticles === 'number' ? json.maxParticles : undefined,\n onlyUsedByOther: json.onlyUsedByOther,\n instancingGeometry: resolvedGeometry.positions,\n instancingIndices: resolvedGeometry.indices,\n instancingUVs: resolvedGeometry.uvs,\n instancingNormals: resolvedGeometry.normals,\n renderMode: json.renderMode,\n rendererEmitterSettings,\n renderOrder: json.renderOrder,\n texture,\n material: materialMeta?.sourceMaterial ?? materialMeta,\n blendMode: materialMeta?.alphaMode ?? json.blending ?? Constants.ALPHA_ADD,\n transparent: materialMeta?.transparent ?? json.transparent ?? true,\n depthTest: materialMeta?.depthTest ?? json.depthTest ?? true,\n depthWrite: materialMeta?.depthWrite ?? json.depthWrite ?? false,\n alphaTest: materialMeta?.alphaTest ?? json.alphaTest ?? 0,\n startTileIndex:\n typeof json.startTileIndex === 'number'\n ? new ConstantValue(json.startTileIndex)\n : (ValueGeneratorFromJSON(json.startTileIndex) as ValueGenerator),\n uTileCount: json.uTileCount,\n vTileCount: json.vTileCount,\n blendTiles: json.blendTiles,\n softParticles: json.softParticles,\n softFarFade: json.softFarFade,\n softNearFade: json.softNearFade,\n behaviors: [],\n worldSpace: json.worldSpace,\n layerMask: json.layers,\n pivot: json.pivot ? new Vector3(json.pivot[0] ?? 0, json.pivot[1] ?? 0, json.pivot[2] ?? 0) : undefined,\n flip: json.flip ? new Vector2(json.flip[0] ?? 0, json.flip[1] ?? 0) : undefined,\n });\n ps.behaviors = (json.behaviors ?? [])\n .map((behaviorJson) => {\n const behavior = BehaviorFromJSON(behaviorJson, ps);\n if (behavior && behavior.type === 'EmitSubParticleSystem') {\n dependencies[(behaviorJson as any).subParticleSystem] = behavior;\n }\n return behavior;\n })\n .filter((behavior) => behavior !== null) as Behavior[];\n return ps;\n }\n\n private static nextSerializationId(prefix: string): string {\n ParticleSystem.serializationCounter += 1;\n return `${prefix}_${ParticleSystem.serializationCounter}`;\n }\n\n private static createFallbackNormals(positions: Float32Array): Float32Array {\n const normals = new Float32Array(positions.length);\n for (let i = 0; i < normals.length; i += 3) {\n normals[i] = 0;\n normals[i + 1] = 0;\n normals[i + 2] = 1;\n }\n return normals;\n }\n\n private toRendererSettingsJSON(): RendererEmitterSettings {\n if (this.renderMode === RenderMode.Trail) {\n return {\n startLength: (this.rendererEmitterSettings as TrailSettings).startLength.toJSON(),\n followLocalOrigin: (this.rendererEmitterSettings as TrailSettings).followLocalOrigin,\n ...trailFlags(this.rendererEmitterSettings as TrailSettings),\n };\n }\n if (this.renderMode === RenderMode.StretchedBillBoard) {\n return {\n speedFactor: (this.rendererEmitterSettings as StretchedBillBoardSettings).speedFactor,\n lengthFactor: (this.rendererEmitterSettings as StretchedBillBoardSettings).lengthFactor,\n };\n }\n return {};\n }\n\n private ensureGeometryMeta(meta: BabylonMetaData): string {\n const geometryUUID = ParticleSystem.nextSerializationId('quarks_geometry');\n meta.geometries[geometryUUID] = {\n uuid: geometryUUID,\n type: 'QuarksGeometry',\n positions: Array.from(this.rendererSettings.instancingGeometry),\n indices: Array.from(this.rendererSettings.instancingIndices),\n uvs: this.rendererSettings.instancingUVs ? Array.from(this.rendererSettings.instancingUVs) : undefined,\n normals: this.rendererSettings.instancingNormals\n ? Array.from(this.rendererSettings.instancingNormals)\n : undefined,\n };\n return geometryUUID;\n }\n\n private ensureMaterialMeta(meta: BabylonMetaData): string {\n const texture = this.rendererSettings.texture;\n let textureUUID: string | undefined;\n if (texture) {\n textureUUID = ParticleSystem.nextSerializationId('quarks_texture');\n meta.textures[textureUUID] = texture;\n }\n\n const reflectionAtlas = this.rendererSettings.reflectionAtlas;\n let reflectionAtlasUUID: string | undefined;\n if (reflectionAtlas instanceof Texture) {\n reflectionAtlasUUID = ParticleSystem.nextSerializationId('quarks_texture');\n meta.textures[reflectionAtlasUUID] = reflectionAtlas;\n }\n\n const materialUUID = ParticleSystem.nextSerializationId('quarks_material');\n meta.materials[materialUUID] = {\n uuid: materialUUID,\n type: 'QuarksMaterial',\n transparent: this.rendererSettings.materialTransparent,\n alphaMode: this.rendererSettings.materialBlendMode,\n depthTest: this.rendererSettings.materialDepthTest,\n depthWrite: this.rendererSettings.materialDepthWrite,\n alphaTest: this.rendererSettings.materialAlphaTest,\n texture: textureUUID,\n reflectionAtlas: reflectionAtlasUUID,\n reflectionLevel: this.rendererSettings.reflectionLevel,\n sourceMaterial: this.materialRef ?? undefined,\n };\n return materialUUID;\n }\n\n private static resolveGeometryData(entry: any): {\n positions: Float32Array;\n indices: Uint32Array | Uint16Array;\n uvs?: Float32Array;\n normals?: Float32Array;\n } {\n if (entry?.positions) {\n const positions =\n entry.positions instanceof Float32Array ? entry.positions : new Float32Array(entry.positions);\n const rawIndices =\n entry.indices instanceof Uint16Array || entry.indices instanceof Uint32Array\n ? entry.indices\n : entry.indices\n ? new Uint32Array(entry.indices)\n : undefined;\n return {\n positions,\n indices: ensureTriangleIndices(positions, rawIndices),\n uvs: entry.uvs\n ? entry.uvs instanceof Float32Array\n ? entry.uvs\n : new Float32Array(entry.uvs)\n : undefined,\n normals: entry.normals\n ? entry.normals instanceof Float32Array\n ? entry.normals\n : new Float32Array(entry.normals)\n : undefined,\n };\n }\n\n const data = entry?.data ?? entry;\n if (data?.attributes?.position?.array) {\n const positions = new Float32Array(data.attributes.position.array);\n let indices: Uint32Array | Uint16Array | undefined;\n if (data.index?.array) {\n const indexType = data.index.type === 'Uint16Array' ? Uint16Array : Uint32Array;\n indices = new indexType(data.index.array);\n }\n return {\n positions,\n indices: ensureTriangleIndices(positions, indices),\n uvs: data.attributes.uv?.array ? new Float32Array(data.attributes.uv.array) : undefined,\n normals: data.attributes.normal?.array ? new Float32Array(data.attributes.normal.array) : undefined,\n };\n }\n\n return {\n positions: DEFAULT_POSITIONS,\n indices: DEFAULT_INDICES,\n uvs: DEFAULT_UVS,\n };\n }\n\n addBehavior(behavior: Behavior) {\n this.behaviors.push(behavior);\n // A sub emitter added here changes which system has to update first.\n this._renderer?._invalidateUpdateOrder();\n }\n\n getRendererSettings(): VFXBatchSettings {\n return this.rendererSettings;\n }\n\n addEventListener(event: ParticleSystemEventType, callback: (event: ParticleSystemEvent) => void): void {\n if (!this.listeners[event]) this.listeners[event] = [];\n this.listeners[event].push(callback);\n }\n\n removeAllEventListeners(event: ParticleSystemEventType): void {\n if (this.listeners[event]) this.listeners[event] = [];\n }\n\n removeEventListener(event: ParticleSystemEventType, callback: (event: ParticleSystemEvent) => void): void {\n if (this.listeners[event]) {\n const index = this.listeners[event].indexOf(callback);\n if (index !== -1) this.listeners[event].splice(index, 1);\n }\n }\n\n /** True when at least one callback is registered for the event type. */\n private hasListeners(event: ParticleSystemEventType): boolean {\n const callbacks = this.listeners[event];\n return callbacks !== undefined && callbacks.length > 0;\n }\n\n private fire(event: ParticleSystemEvent) {\n const callbacks = this.listeners[event.type];\n if (callbacks === undefined) {\n return;\n }\n for (let i = 0; i < callbacks.length; i++) {\n callbacks[i](event);\n }\n }\n\n clone(): ParticleSystem {\n const newBehaviors: Array<Behavior> = this.behaviors.map((b) => b.clone());\n let rendererEmitterSettings: RendererEmitterSettings;\n\n if (this.renderMode === RenderMode.Trail) {\n rendererEmitterSettings = {\n startLength: (this.rendererEmitterSettings as TrailSettings).startLength.clone(),\n followLocalOrigin: (this.rendererEmitterSettings as TrailSettings).followLocalOrigin,\n ...trailFlags(this.rendererEmitterSettings as TrailSettings),\n };\n } else if (this.renderMode === RenderMode.StretchedBillBoard) {\n rendererEmitterSettings = {\n lengthFactor: (this.rendererEmitterSettings as StretchedBillBoardSettings).lengthFactor,\n speedFactor: (this.rendererEmitterSettings as StretchedBillBoardSettings).speedFactor,\n };\n } else {\n rendererEmitterSettings = {};\n }\n\n return new ParticleSystem({\n autoDestroy: this.autoDestroy,\n looping: this.looping,\n prewarm: this.prewarm,\n duration: this.duration,\n startDelay: this.startDelay.clone(),\n shape: this.emitterShape.clone(),\n startLife: this.startLife.clone(),\n startSpeed: this.startSpeed.clone(),\n startRotation: this.startRotation.clone(),\n startSize: this.startSize.clone(),\n startColor: this.startColor.clone(),\n emissionOverTime: this.emissionOverTime.clone(),\n emissionOverDistance: this.emissionOverDistance.clone(),\n emissionBursts: this.emissionBursts.map((b) => ({...b})),\n maxParticles: this.maxParticles,\n onlyUsedByOther: this.onlyUsedByOther,\n instancingGeometry: this.rendererSettings.instancingGeometry,\n instancingIndices: this.rendererSettings.instancingIndices,\n instancingUVs: this.rendererSettings.instancingUVs,\n instancingNormals: this.rendererSettings.instancingNormals,\n renderMode: this.renderMode,\n renderOrder: this.renderOrder,\n rendererEmitterSettings,\n material: this.materialRef,\n texture: this.rendererSettings.texture,\n startTileIndex: this.startTileIndex,\n uTileCount: this.rendererSettings.uTileCount,\n vTileCount: this.rendererSettings.vTileCount,\n blendTiles: this.rendererSettings.blendTiles,\n softParticles: this.rendererSettings.softParticles,\n softFarFade: this.rendererSettings.softFarFade,\n softNearFade: this.rendererSettings.softNearFade,\n behaviors: newBehaviors,\n worldSpace: this.worldSpace,\n blendMode: this.rendererSettings.materialBlendMode,\n transparent: this.rendererSettings.materialTransparent,\n depthTest: this.rendererSettings.materialDepthTest,\n depthWrite: this.rendererSettings.materialDepthWrite,\n alphaTest: this.rendererSettings.materialAlphaTest,\n layerMask: this.rendererSettings.layerMask,\n pivot: this.pivot,\n flip: this.flip,\n scene: this.emitter.getScene(),\n });\n }\n}\n","import {TransformNode} from '@babylonjs/core/Meshes/transformNode';\nimport {Scene} from '@babylonjs/core/scene';\nimport {IAnimationData, IPrefab} from 'quarks.core';\nimport {BatchedRenderer} from './BatchedRenderer';\nimport {ParticleEmitter} from './ParticleEmitter';\n\nexport interface QuarksTimelineClip {\n uuid?: string;\n duration?: number;\n play?: () => void;\n pause?: () => void;\n stop?: () => void;\n setTime?: (time: number) => void;\n}\n\nexport interface AnimationData extends IAnimationData {\n type: 'three' | 'ps';\n target: TransformNode;\n loop: boolean;\n clip?: QuarksTimelineClip;\n clipUUID?: string;\n}\n\ninterface AnimationJSON {\n startTime: number;\n duration: number;\n type: 'three' | 'ps';\n targetUUID: string;\n clipUUID?: string;\n loop: boolean;\n}\n\nexport class QuarksPrefab extends TransformNode implements IPrefab {\n type = 'QuarksPrefab';\n animationData: Array<AnimationData> = [];\n isPlaying = false;\n currentTime = -0.00001;\n timeScale = 1;\n duration = 0;\n\n private _lastUpdateTimeMs = Date.now();\n private _batchedRenderer?: BatchedRenderer;\n private _tempAnimationJSON: Array<AnimationJSON> = [];\n\n constructor(name = 'QuarksPrefab', scene?: Scene) {\n super(name, scene);\n }\n\n registerBatchedRenderer(renderer: BatchedRenderer): void {\n this._batchedRenderer = renderer;\n }\n\n addParticleSystemAnimation(emitter: ParticleEmitter, startTime = 0, duration = 0, loop = false): AnimationData {\n const animationDuration = duration > 0 ? duration : emitter.system.duration;\n const data: AnimationData = {\n startTime,\n duration: animationDuration,\n type: 'ps',\n loop,\n target: emitter,\n };\n this.animationData.push(data);\n this.pause();\n this.updateDuration();\n return data;\n }\n\n addThreeAnimation(\n target: TransformNode,\n clip?: QuarksTimelineClip,\n startTime = 0,\n duration = clip?.duration ?? 0,\n loop = false,\n clipUUID?: string\n ): AnimationData {\n const animationDuration = duration > 0 ? duration : (clip?.duration ?? 0);\n const data: AnimationData = {\n startTime,\n duration: animationDuration,\n type: 'three',\n loop,\n target,\n clip,\n clipUUID: clipUUID ?? clip?.uuid,\n };\n this.animationData.push(data);\n this.updateDuration();\n return data;\n }\n\n removeAnimation(index: number): void {\n this.animationData.splice(index, 1);\n this.updateDuration();\n }\n\n play(): void {\n if (this.isPlaying) return;\n this.isPlaying = true;\n this._lastUpdateTimeMs = Date.now();\n }\n\n pause(): void {\n if (!this.isPlaying) return;\n this.isPlaying = false;\n this.animationData.forEach((animation) => {\n if (animation.type === 'ps' && animation.target instanceof ParticleEmitter) {\n animation.target.system.pause();\n return;\n }\n animation.clip?.pause?.();\n });\n }\n\n stop(): void {\n this.pause();\n this.currentTime = -0.00001;\n this.animationData.forEach((animation) => {\n if (animation.type === 'ps' && animation.target instanceof ParticleEmitter) {\n animation.target.system.stop();\n return;\n }\n animation.clip?.stop?.();\n });\n }\n\n update(forceDelta?: number): void {\n if (!this.isPlaying) return;\n const now = Date.now();\n const delta = forceDelta ?? Math.max((now - this._lastUpdateTimeMs) / 1000, 0);\n this._lastUpdateTimeMs = now;\n const previousTime = this.currentTime;\n this.currentTime += delta * this.timeScale;\n\n if (this.currentTime > this.duration) {\n this.stop();\n return;\n }\n\n this.animationData.forEach((animation) => {\n const startTime = animation.startTime;\n const endTime = animation.startTime + animation.duration;\n const isActive = this.currentTime >= startTime && this.currentTime <= endTime;\n const wasActive = previousTime >= startTime && previousTime <= endTime;\n if (isActive && !wasActive) {\n if (animation.type === 'ps' && animation.target instanceof ParticleEmitter) {\n animation.target.system.restart();\n if (this._batchedRenderer) {\n this._batchedRenderer.addSystem(animation.target.system);\n }\n } else {\n animation.clip?.play?.();\n }\n return;\n }\n\n if (!isActive && wasActive) {\n if (animation.loop && animation.type === 'ps' && animation.target instanceof ParticleEmitter) {\n animation.target.system.restart();\n return;\n }\n if (animation.type === 'ps' && animation.target instanceof ParticleEmitter) {\n animation.target.system.endEmit();\n } else if (animation.loop) {\n animation.clip?.play?.();\n } else {\n animation.clip?.stop?.();\n }\n }\n });\n }\n\n setTime(time: number): void {\n const previousTime = this.currentTime;\n this.currentTime = time;\n this.animationData.forEach((animation) => {\n const startTime = animation.startTime;\n const endTime = animation.startTime + animation.duration;\n const isActive = this.currentTime >= startTime && this.currentTime < endTime;\n const wasActive = previousTime >= startTime && previousTime < endTime;\n if (isActive && !wasActive) {\n if (animation.type === 'ps' && animation.target instanceof ParticleEmitter) {\n animation.target.system.restart();\n } else {\n animation.clip?.play?.();\n }\n return;\n }\n if (!isActive && wasActive) {\n if (animation.type === 'ps' && animation.target instanceof ParticleEmitter) {\n animation.target.system.endEmit();\n } else {\n animation.clip?.stop?.();\n }\n return;\n }\n if (isActive && animation.type === 'three') {\n animation.clip?.setTime?.(Math.max(time - startTime, 0));\n }\n });\n }\n\n getDuration(): number {\n return this.duration;\n }\n\n resolveReferences(root: TransformNode): void {\n const nodesMap: {[uuid: string]: TransformNode} = {};\n const traverse = (node: TransformNode) => {\n if ((node as any)._quarksUUID) {\n nodesMap[(node as any)._quarksUUID] = node;\n }\n nodesMap[node.uniqueId.toString()] = node;\n const children = node.getChildren();\n for (const child of children) {\n if (child instanceof TransformNode) {\n traverse(child);\n }\n }\n };\n traverse(root);\n\n this._tempAnimationJSON.forEach((animationJSON) => {\n const target = nodesMap[animationJSON.targetUUID];\n if (animationJSON.type === 'ps' && target instanceof ParticleEmitter) {\n this.addParticleSystemAnimation(\n target,\n animationJSON.startTime,\n animationJSON.duration,\n animationJSON.loop\n );\n return;\n }\n if (animationJSON.type === 'three' && target) {\n const clip = this.resolveTimelineClip(target, animationJSON.clipUUID);\n this.addThreeAnimation(\n target,\n clip,\n animationJSON.startTime,\n animationJSON.duration,\n animationJSON.loop,\n animationJSON.clipUUID\n );\n }\n });\n this.updateDuration();\n this._tempAnimationJSON = [];\n }\n\n toJSON(): any {\n return {\n type: this.type,\n name: this.name,\n animationData: this.animationData.map((animation) => ({\n startTime: animation.startTime,\n duration: animation.duration,\n type: animation.type,\n targetUUID: (animation.target as any)._quarksUUID ?? animation.target.uniqueId.toString(),\n clipUUID: animation.type === 'three' ? (animation.clipUUID ?? animation.clip?.uuid) : undefined,\n loop: animation.loop,\n })),\n };\n }\n\n static fromJSON(json: any, scene?: Scene): QuarksPrefab {\n const prefab = new QuarksPrefab(json.name || 'QuarksPrefab', scene);\n if (Array.isArray(json.animationData)) {\n prefab._tempAnimationJSON = json.animationData.filter(\n (item: any) => item?.type === 'ps' || item?.type === 'three'\n );\n }\n return prefab;\n }\n\n private resolveTimelineClip(target: TransformNode, clipUUID?: string): QuarksTimelineClip | undefined {\n const animationSources = [\n (target as any).animations,\n (target as any).animationGroups,\n (target.metadata as any)?.animations,\n (target.metadata as any)?.animationGroups,\n ];\n for (const source of animationSources) {\n if (!Array.isArray(source)) continue;\n if (!clipUUID) {\n return source[0];\n }\n const found = source.find((item: any) => item?.uuid === clipUUID);\n if (found) {\n return found;\n }\n }\n return undefined;\n }\n\n private updateDuration(): void {\n let maxDuration = 0;\n this.animationData.forEach((animation) => {\n const endTime = animation.startTime + animation.duration;\n if (endTime > maxDuration) {\n maxDuration = endTime;\n }\n });\n this.duration = maxDuration;\n }\n}\n","import {Constants} from '@babylonjs/core/Engines/constants';\nimport {Texture} from '@babylonjs/core/Materials/Textures/texture';\nimport {StandardMaterial} from '@babylonjs/core/Materials/standardMaterial';\nimport {Matrix, Quaternion, Vector3} from '@babylonjs/core/Maths/math.vector';\nimport {Mesh} from '@babylonjs/core/Meshes/mesh';\nimport {VertexData} from '@babylonjs/core/Meshes/mesh.vertexData';\nimport {TransformNode} from '@babylonjs/core/Meshes/transformNode';\nimport {Scene} from '@babylonjs/core/scene';\nimport {Behavior, EmitSubParticleSystem} from 'quarks.core';\nimport {ParticleEmitter} from './ParticleEmitter';\nimport {ParticleSystem} from './ParticleSystem';\nimport {QuarksPrefab} from './QuarksPrefab';\nimport {ensureTriangleIndices} from './geometryUtil';\n\nexport interface QuarksLoaderOptions {\n baseUrl?: string;\n /**\n * Reuse one Texture per scene for every effect that references the same image with the same\n * sampling, and one copy of the data for identical mesh geometry. The renderer only batches\n * systems that share the texture (and geometry) object, so without this every loaded effect\n * gets batches — draw calls and buffer uploads — of its own even when its images are the same\n * as another effect's. Default true; turn off to give each effect private textures, e.g. to\n * change one effect's texture settings without touching the others.\n */\n shareResources?: boolean;\n}\n\ninterface ParsedGeometry {\n positions: Float32Array;\n indices: Uint32Array | Uint16Array;\n uvs?: Float32Array;\n normals?: Float32Array;\n}\n\n/** Textures and geometries reused across loads, per scene. See QuarksLoaderOptions.shareResources. */\nconst sharedTextures = new WeakMap<Scene, Map<string, Texture>>();\nconst sharedGeometries = new WeakMap<Scene, Map<string, ParsedGeometry>>();\n\nfunction sceneMap<T>(maps: WeakMap<Scene, Map<string, T>>, scene: Scene): Map<string, T> {\n let map = maps.get(scene);\n if (map === undefined) {\n map = new Map();\n maps.set(scene, map);\n }\n return map;\n}\n\n/** Content key for a geometry: two independent 32-bit hashes over every array's bytes, plus lengths. */\nfunction geometryKey(geometry: ParsedGeometry): string {\n let h1 = 0x811c9dc5;\n let h2 = 0x9e3779b9;\n const parts: Array<ArrayBufferView | undefined> = [\n geometry.positions,\n geometry.indices,\n geometry.uvs,\n geometry.normals,\n ];\n let lengths = '';\n for (const part of parts) {\n if (part === undefined) {\n lengths += '-,';\n continue;\n }\n const bytes = new Uint8Array(part.buffer, part.byteOffset, part.byteLength);\n lengths += bytes.length + ',';\n for (let i = 0; i < bytes.length; i++) {\n h1 = Math.imul(h1 ^ bytes[i], 0x01000193);\n h2 = Math.imul(h2 ^ bytes[i], 0x5bd1e995) ^ (h2 >>> 15);\n }\n }\n return `${lengths}${(h1 >>> 0).toString(16)}${(h2 >>> 0).toString(16)}`;\n}\n\ninterface LoadedMeta {\n textures: {[uuid: string]: Texture | null};\n geometries: {[uuid: string]: ParsedGeometry};\n materials: {[uuid: string]: any};\n}\n\nexport class QuarksLoader {\n private scene: Scene;\n private options: QuarksLoaderOptions;\n\n constructor(scene: Scene, options: QuarksLoaderOptions = {}) {\n this.scene = scene;\n this.options = options;\n }\n\n async load(url: string): Promise<TransformNode> {\n const baseUrl = this.options.baseUrl || url.substring(0, url.lastIndexOf('/') + 1);\n const response = await fetch(url);\n const json = await response.json();\n await QuarksLoader.resolveExternalGeometries(json, async (geometryUrl) => {\n const geometryResponse = await fetch(QuarksLoader.resolveUrl(baseUrl, geometryUrl));\n if (!geometryResponse.ok) {\n throw new Error(`HTTP ${geometryResponse.status}`);\n }\n return geometryResponse.json();\n });\n return this.parse(json, baseUrl);\n }\n\n /**\n * Inlines geometries that an export wrote to their own file (`{uuid, type: 'QuarksGeometry',\n * url}` — e.g. the Unity exporter's \"geometries as files\"): each `url` is passed to\n * `loadGeometry`, and the `positions / indices / uvs / normals` it returns replace the url in\n * place, so `parse()` (which is synchronous) sees an ordinary inline geometry. `load()` does\n * this with `fetch`; call it yourself before `parse()` when the files come from elsewhere.\n * A geometry that fails to load is left as is and warned about.\n */\n static async resolveExternalGeometries(json: any, loadGeometry: (url: string) => Promise<any>): Promise<void> {\n const geometries: any[] = Array.isArray(json?.geometries) ? json.geometries : [];\n await Promise.all(\n geometries\n .filter((geom) => typeof geom?.url === 'string' && !geom.positions)\n .map(async (geom) => {\n try {\n const data = await loadGeometry(geom.url);\n for (const key of ['positions', 'indices', 'uvs', 'normals']) {\n if (data?.[key] !== undefined) {\n geom[key] = data[key];\n }\n }\n delete geom.url;\n } catch (err) {\n console.warn(`[QuarksLoader] Could not load geometry \"${geom.url}\":`, err);\n }\n })\n );\n }\n\n parse(json: any, baseUrl: string = ''): TransformNode {\n const meta: LoadedMeta = {\n textures: {},\n geometries: {},\n materials: {},\n };\n\n if (json.geometries) {\n this.parseGeometries(json.geometries, meta);\n }\n if (json.images) {\n this.parseImages(json.images, baseUrl, meta);\n }\n if (json.textures) {\n this.parseTextures(json.textures, meta);\n }\n if (json.materials) {\n this.parseMaterials(json.materials, meta);\n }\n\n const root = this.parseObject(json.object, meta);\n this.linkReferences(root);\n return root;\n }\n\n private parseGeometries(geometries: any[], meta: LoadedMeta): void {\n for (const geom of geometries) {\n if (geom.type === 'PlaneGeometry') {\n const w = geom.width || 1;\n const h = geom.height || 1;\n const hw = w / 2;\n const hh = h / 2;\n meta.geometries[geom.uuid] = {\n positions: new Float32Array([-hw, -hh, 0, hw, -hh, 0, hw, hh, 0, -hw, hh, 0]),\n indices: new Uint32Array([0, 1, 2, 0, 2, 3]),\n uvs: new Float32Array([0, 0, 1, 0, 1, 1, 0, 1]),\n normals: new Float32Array([0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1]),\n };\n } else if (geom.type === 'SphereGeometry') {\n meta.geometries[geom.uuid] = this.parseSphereGeometry(geom);\n } else if (geom.type === 'BufferGeometry' && geom.data) {\n const parsed = this.parseBufferGeometry(geom.data);\n meta.geometries[geom.uuid] = parsed;\n } else if (geom.type === 'QuarksGeometry') {\n if (typeof geom.url === 'string' && !geom.positions) {\n console.warn(\n `[QuarksLoader] Geometry \"${geom.url}\" is an external file; use load() or ` +\n 'QuarksLoader.resolveExternalGeometries() before parse().'\n );\n }\n meta.geometries[geom.uuid] = this.share({\n positions: new Float32Array(geom.positions ?? []),\n indices: geom.indices ? new Uint32Array(geom.indices) : new Uint32Array(0),\n uvs: geom.uvs ? new Float32Array(geom.uvs) : undefined,\n normals: geom.normals ? new Float32Array(geom.normals) : undefined,\n });\n }\n }\n }\n\n /** The scene's copy of an identical geometry when resources are shared, else `geometry` itself. */\n private share(geometry: ParsedGeometry): ParsedGeometry {\n if (this.options.shareResources === false) {\n return geometry;\n }\n const geometries = sceneMap(sharedGeometries, this.scene);\n const key = geometryKey(geometry);\n const existing = geometries.get(key);\n if (existing !== undefined) {\n return existing;\n }\n geometries.set(key, geometry);\n return geometry;\n }\n\n /**\n * Forgets the textures and geometries shared between loads into `scene` (see\n * {@link QuarksLoaderOptions.shareResources}). Effects already loaded keep theirs; the next\n * load creates new ones. Textures are not disposed — they may still be in use.\n */\n static clearSharedResources(scene: Scene): void {\n sharedTextures.delete(scene);\n sharedGeometries.delete(scene);\n }\n\n private parseSphereGeometry(geom: any): ParsedGeometry {\n const radius = geom.radius ?? 0.5;\n const widthSegments = Math.max(3, Math.floor(geom.widthSegments ?? 16));\n const heightSegments = Math.max(2, Math.floor(geom.heightSegments ?? 8));\n const phiStart = geom.phiStart ?? 0;\n const phiLength = geom.phiLength ?? Math.PI * 2;\n const thetaStart = geom.thetaStart ?? 0;\n const thetaLength = geom.thetaLength ?? Math.PI;\n\n const positions: number[] = [];\n const normals: number[] = [];\n const uvs: number[] = [];\n const indices: number[] = [];\n const grid: number[][] = [];\n\n let index = 0;\n\n for (let iy = 0; iy <= heightSegments; iy++) {\n const verticesRow: number[] = [];\n const v = iy / heightSegments;\n const theta = thetaStart + v * thetaLength;\n\n for (let ix = 0; ix <= widthSegments; ix++) {\n const u = ix / widthSegments;\n const phi = phiStart + u * phiLength;\n\n const x = -radius * Math.cos(phi) * Math.sin(theta);\n const y = radius * Math.cos(theta);\n const z = radius * Math.sin(phi) * Math.sin(theta);\n\n positions.push(x, y, z);\n const length = Math.hypot(x, y, z) || 1;\n normals.push(x / length, y / length, z / length);\n uvs.push(u, 1 - v);\n\n verticesRow.push(index++);\n }\n\n grid.push(verticesRow);\n }\n\n const thetaEnd = thetaStart + thetaLength;\n const isTopFull = thetaStart <= 0;\n const isBottomFull = thetaEnd >= Math.PI;\n\n for (let iy = 0; iy < heightSegments; iy++) {\n for (let ix = 0; ix < widthSegments; ix++) {\n const a = grid[iy][ix + 1];\n const b = grid[iy][ix];\n const c = grid[iy + 1][ix];\n const d = grid[iy + 1][ix + 1];\n\n if (iy !== 0 || !isTopFull) {\n indices.push(a, b, d);\n }\n if (iy !== heightSegments - 1 || !isBottomFull) {\n indices.push(b, c, d);\n }\n }\n }\n\n const typedIndices = positions.length / 3 > 65535 ? new Uint32Array(indices) : new Uint16Array(indices);\n return {\n positions: new Float32Array(positions),\n indices: typedIndices,\n uvs: new Float32Array(uvs),\n normals: new Float32Array(normals),\n };\n }\n\n private parseBufferGeometry(data: any): ParsedGeometry {\n let positions = new Float32Array(0);\n let indices: Uint32Array | Uint16Array = new Uint32Array(0);\n let uvs: Float32Array | undefined;\n let normals: Float32Array | undefined;\n\n if (data.interleavedBuffers && data.arrayBuffers) {\n const buffers: {[uuid: string]: {data: Float32Array; stride: number}} = {};\n for (const [uuid, ibDef] of Object.entries(data.interleavedBuffers) as any[]) {\n const arrayBuffer = data.arrayBuffers[ibDef.buffer];\n if (arrayBuffer) {\n const floatArray = new Float32Array(\n Array.isArray(arrayBuffer) ? this.int32ArrayToFloat32(arrayBuffer) : arrayBuffer\n );\n buffers[uuid] = {data: floatArray, stride: ibDef.stride};\n }\n }\n\n if (data.attributes) {\n if (data.attributes.position?.isInterleavedBufferAttribute) {\n const attr = data.attributes.position;\n const buf = buffers[attr.data];\n if (buf)\n positions = this.extractInterleavedAttribute(buf.data, buf.stride, attr.offset, attr.itemSize);\n }\n if (data.attributes.uv?.isInterleavedBufferAttribute) {\n const attr = data.attributes.uv;\n const buf = buffers[attr.data];\n if (buf) uvs = this.extractInterleavedAttribute(buf.data, buf.stride, attr.offset, attr.itemSize);\n }\n if (data.attributes.normal?.isInterleavedBufferAttribute) {\n const attr = data.attributes.normal;\n const buf = buffers[attr.data];\n if (buf)\n normals = this.extractInterleavedAttribute(buf.data, buf.stride, attr.offset, attr.itemSize);\n }\n }\n } else if (data.attributes) {\n if (data.attributes.position?.array) {\n positions = new Float32Array(data.attributes.position.array);\n }\n if (data.attributes.uv?.array) {\n uvs = new Float32Array(data.attributes.uv.array);\n }\n if (data.attributes.normal?.array) {\n normals = new Float32Array(data.attributes.normal.array);\n }\n }\n\n if (data.index) {\n if (data.index.type === 'Uint16Array') {\n indices = new Uint16Array(data.index.array);\n } else {\n indices = new Uint32Array(data.index.array);\n }\n }\n\n indices = ensureTriangleIndices(positions, indices);\n\n return {positions, indices, uvs, normals};\n }\n\n private extractInterleavedAttribute(buffer: Float32Array, stride: number, offset: number, itemSize: number): any {\n const count = Math.floor(buffer.length / stride);\n const result = new Float32Array(count * itemSize);\n for (let i = 0; i < count; i++) {\n for (let j = 0; j < itemSize; j++) {\n result[i * itemSize + j] = buffer[i * stride + offset + j];\n }\n }\n return result;\n }\n\n private int32ArrayToFloat32(intArray: number[]): Float32Array {\n const buffer = new ArrayBuffer(intArray.length * 4);\n const int32View = new Int32Array(buffer);\n for (let i = 0; i < intArray.length; i++) {\n int32View[i] = intArray[i];\n }\n return new Float32Array(buffer) as any;\n }\n\n private parseImages(images: any[], baseUrl: string, _meta: LoadedMeta): void {\n (this as any)._images = {};\n for (const img of images) {\n if (img.url) {\n QuarksLoader.warnIfNotAnImageUrl(img.url);\n }\n (this as any)._images[img.uuid] = img.url ? QuarksLoader.resolveUrl(baseUrl, img.url) : null;\n }\n }\n\n /**\n * Flags an image entry that is plainly not an image, which otherwise only\n * shows up as a texture that silently fails to load.\n *\n * The case worth naming: an exporter that could not embed a texture falls\n * back to writing the source asset's path, and a Unity built-in texture\n * reports a virtual path such as `Resources/unity_builtin_extra` that no\n * file backs.\n */\n private static warnIfNotAnImageUrl(url: string): void {\n if (/^(data|blob):/i.test(url) || /\\.(png|jpe?g|webp|gif|bmp|ktx2?|dds|env|basis)(\\?|#|$)/i.test(url)) {\n return;\n }\n console.warn(\n `[QuarksLoader] Image \"${url}\" does not look like an image; its texture will fail to load. ` +\n 'This usually means the effect was exported without embedding that texture.'\n );\n }\n\n /**\n * `img.url` is already absolute for data/blob URIs and full http(s) URLs — common for\n * \"portable\" exports that embed textures as base64 (see ensurePortableTextureUrl in\n * babylon.quarks-editor). Prepending baseUrl to those turns e.g.\n * \"data:image/png;base64,AAAA\" into an invalid path like \"/some/dir/data:image/png;base64,AAAA\".\n */\n private static resolveUrl(baseUrl: string, url: string): string {\n if (/^(data|blob):/i.test(url) || /^[a-z][a-z0-9+.-]*:\\/\\//i.test(url) || url.startsWith('/')) {\n return url;\n }\n return baseUrl + url;\n }\n\n private parseTextures(textures: any[], meta: LoadedMeta): void {\n const images = (this as any)._images || {};\n for (const texDef of textures) {\n const imageUrl = images[texDef.image];\n if (imageUrl) {\n const invertY = texDef.invertY !== undefined ? !!texDef.invertY : true;\n const noMipmap = !!texDef.noMipmap;\n // Everything below that ends up on the Texture object is part of the key, so a\n // shared texture always looks the way each of its effects asked for.\n const share = this.options.shareResources !== false;\n const key = share\n ? [\n invertY,\n noMipmap,\n texDef.samplingMode,\n texDef.wrap,\n texDef.repeat,\n texDef.offset,\n texDef.rotation,\n ].join('|') +\n '|' +\n imageUrl\n : '';\n const cache = share ? sceneMap(sharedTextures, this.scene) : undefined;\n const cached = cache?.get(key);\n if (cached !== undefined) {\n meta.textures[texDef.uuid] = cached;\n continue;\n }\n const texture = new Texture(imageUrl, this.scene, {\n noMipmap,\n invertY,\n samplingMode: typeof texDef.samplingMode === 'number' ? texDef.samplingMode : undefined,\n });\n if (Array.isArray(texDef.wrap)) {\n texture.wrapU = this.mapWrapMode(texDef.wrap[0]);\n texture.wrapV = this.mapWrapMode(texDef.wrap[1] ?? texDef.wrap[0]);\n }\n if (Array.isArray(texDef.repeat)) {\n texture.uScale = texDef.repeat[0] ?? 1;\n texture.vScale = texDef.repeat[1] ?? 1;\n }\n if (Array.isArray(texDef.offset)) {\n texture.uOffset = texDef.offset[0] ?? 0;\n texture.vOffset = texDef.offset[1] ?? 0;\n }\n if (typeof texDef.rotation === 'number') {\n texture.wAng = texDef.rotation;\n }\n if (cache !== undefined) {\n cache.set(key, texture);\n // Something outside the library may dispose it; never hand out a dead texture.\n texture.onDisposeObservable.addOnce(() => {\n if (cache.get(key) === texture) {\n cache.delete(key);\n }\n });\n }\n meta.textures[texDef.uuid] = texture;\n } else {\n meta.textures[texDef.uuid] = null;\n }\n }\n }\n\n private mapWrapMode(wrapMode?: number): number {\n switch (wrapMode) {\n case 1001: // ClampToEdgeWrapping (three.js)\n return Texture.CLAMP_ADDRESSMODE;\n case 1002: // MirroredRepeatWrapping (three.js)\n return Texture.MIRROR_ADDRESSMODE;\n case 1000: // RepeatWrapping (three.js)\n default:\n return Texture.WRAP_ADDRESSMODE;\n }\n }\n\n private parseMaterials(materials: any[], meta: LoadedMeta): void {\n for (const matDef of materials) {\n const matInfo: any = {\n uuid: matDef.uuid,\n transparent: matDef.transparent ?? true,\n blending: matDef.blending ?? 1,\n side: matDef.side ?? 2,\n depthTest: matDef.depthTest ?? true,\n depthWrite: matDef.depthWrite ?? false,\n alphaTest: matDef.alphaTest ?? 0,\n texture: null,\n };\n\n // three.js MeshBasicMaterial uses `map`; QuarksMaterial (what ParticleSystem.toJSON\n // emits) uses `texture`. Accept both so library-exported effects round-trip.\n const textureRef = matDef.map ?? matDef.texture;\n if (textureRef) {\n matInfo.texture = meta.textures[textureRef] || null;\n }\n\n const reflectionAtlasRef = matDef.reflectionAtlas;\n if (reflectionAtlasRef) {\n matInfo.reflectionAtlas = meta.textures[reflectionAtlasRef] || null;\n }\n if (typeof matDef.reflectionLevel === 'number') {\n matInfo.reflectionLevel = matDef.reflectionLevel;\n }\n\n // QuarksMaterial (what ParticleSystem.ensureMaterialMeta emits) writes `alphaMode`\n // directly as a Babylon alpha-mode constant; three.js materials (MeshBasicMaterial\n // etc.) instead use `blending` with three.js's own 1..4 numbering, which does NOT\n // line up with Babylon's constants (e.g. three.js Additive=2 vs Babylon ALPHA_ADD=1)\n // — only convert through the table when there's no native alphaMode to trust.\n if (typeof matDef.alphaMode === 'number') {\n matInfo.alphaMode = matDef.alphaMode;\n } else {\n const blendingToAlphaMode: {[key: number]: number} = {\n 1: Constants.ALPHA_COMBINE,\n 2: Constants.ALPHA_ADD,\n 3: Constants.ALPHA_SUBTRACT,\n 4: Constants.ALPHA_MULTIPLY,\n };\n matInfo.alphaMode = blendingToAlphaMode[matDef.blending] || Constants.ALPHA_COMBINE;\n }\n\n meta.materials[matDef.uuid] = matInfo;\n }\n }\n\n private getGeometry(meta: LoadedMeta, geometryId: string | undefined): ParsedGeometry | undefined {\n if (!geometryId) return undefined;\n return meta.geometries[geometryId];\n }\n\n private getMaterial(meta: LoadedMeta, materialId: string | string[] | undefined): any | undefined {\n if (!materialId) return undefined;\n const selectedId = Array.isArray(materialId) ? materialId[0] : materialId;\n return meta.materials[selectedId];\n }\n\n private createPlaceholderNode(type: string, name?: string): TransformNode {\n const node = new TransformNode(name || type || 'node', this.scene);\n (node as any).quarksOriginalType = type;\n return node;\n }\n\n private createMeshNode(data: any, meta: LoadedMeta): Mesh {\n const mesh = new Mesh(data.name || data.type || 'mesh', this.scene);\n const geometry = this.getGeometry(meta, data.geometry);\n if (geometry && geometry.positions.length > 0 && geometry.indices.length > 0) {\n const vertexData = new VertexData();\n vertexData.positions = geometry.positions;\n vertexData.indices = geometry.indices;\n if (geometry.uvs && geometry.uvs.length > 0) {\n vertexData.uvs = geometry.uvs;\n }\n if (geometry.normals && geometry.normals.length > 0) {\n vertexData.normals = geometry.normals;\n }\n vertexData.applyToMesh(mesh, true);\n }\n\n const materialInfo = this.getMaterial(meta, data.material);\n if (materialInfo) {\n const material = new StandardMaterial(`quarks_loader_material_${materialInfo.uuid}`, this.scene);\n material.alphaMode = materialInfo.alphaMode ?? Constants.ALPHA_COMBINE;\n material.backFaceCulling = materialInfo.side !== 2;\n material.alphaCutOff = materialInfo.alphaTest ?? 0;\n material.disableDepthWrite = !(materialInfo.depthWrite ?? false);\n if (materialInfo.texture) {\n material.diffuseTexture = materialInfo.texture;\n material.opacityTexture = materialInfo.texture;\n }\n mesh.material = material;\n }\n return mesh;\n }\n\n private parseObject(data: any, meta: LoadedMeta): TransformNode {\n let node: TransformNode;\n switch (data.type) {\n case 'QuarksPrefab':\n node = QuarksPrefab.fromJSON(data, this.scene);\n break;\n case 'ParticleEmitter':\n if (data.ps) {\n const ps = this.parseParticleSystem(data.ps, meta);\n node = ps.emitter;\n break;\n }\n node = this.createPlaceholderNode(data.type, data.name);\n break;\n case 'Mesh':\n case 'SkinnedMesh':\n case 'InstancedMesh':\n case 'BatchedMesh':\n node = this.createMeshNode(data, meta);\n break;\n case 'Scene':\n case 'Group':\n case 'Object3D':\n case 'PerspectiveCamera':\n case 'OrthographicCamera':\n case 'AmbientLight':\n case 'DirectionalLight':\n case 'PointLight':\n case 'RectAreaLight':\n case 'SpotLight':\n case 'HemisphereLight':\n case 'LightProbe':\n case 'LOD':\n case 'Line':\n case 'LineSegments':\n case 'LineLoop':\n case 'PointCloud':\n case 'Points':\n case 'Sprite':\n case 'Bone':\n node = this.createPlaceholderNode(data.type, data.name);\n break;\n default:\n node = new TransformNode(data.name || data.type || 'node', this.scene);\n }\n\n if (data.uuid) (node as any)._quarksUUID = data.uuid;\n if (data.name) node.name = data.name;\n\n if (data.matrix) {\n const matrix = Matrix.FromArray(data.matrix);\n const scaling = new Vector3(1, 1, 1);\n const rotation = Quaternion.Identity();\n const translation = new Vector3(0, 0, 0);\n matrix.decompose(scaling, rotation, translation);\n node.position.copyFrom(translation);\n node.scaling.copyFrom(scaling);\n node.rotationQuaternion = rotation;\n } else {\n if (data.position) node.position.set(data.position[0], data.position[1], data.position[2]);\n if (data.scale) node.scaling.set(data.scale[0], data.scale[1], data.scale[2]);\n if (data.quaternion) {\n node.rotationQuaternion = new Quaternion(\n data.quaternion[0],\n data.quaternion[1],\n data.quaternion[2],\n data.quaternion[3]\n );\n } else if (data.rotation) {\n node.rotation.set(data.rotation[0], data.rotation[1], data.rotation[2]);\n }\n }\n\n if (data.visible !== undefined) node.setEnabled(data.visible);\n\n if (data.children) {\n for (const childData of data.children) {\n const child = this.parseObject(childData, meta);\n child.parent = node;\n }\n }\n\n return node;\n }\n\n private parseParticleSystem(json: any, meta: LoadedMeta): ParticleSystem {\n const dependencies: {[uuid: string]: Behavior} = {};\n const ps = ParticleSystem.fromJSON(json, meta as any, dependencies, this.scene);\n (ps as any)._meshSurfaceReferenceUUID = json?.shape?.type === 'mesh_surface' ? json?.shape?.mesh : undefined;\n return ps;\n }\n\n private linkReferences(root: TransformNode): void {\n const nodesMap: {[uuid: string]: TransformNode} = {};\n\n const traverse = (node: TransformNode) => {\n if ((node as any)._quarksUUID) {\n nodesMap[(node as any)._quarksUUID] = node;\n }\n for (const child of node.getChildren()) {\n if (child instanceof TransformNode) {\n traverse(child);\n }\n }\n };\n traverse(root);\n\n const linkNode = (node: TransformNode) => {\n if (node instanceof QuarksPrefab) {\n node.resolveReferences(root);\n }\n if (node instanceof ParticleEmitter) {\n const system = node.system as ParticleSystem;\n const meshSurfaceUUID = (system as any)._meshSurfaceReferenceUUID;\n if (meshSurfaceUUID && (system.emitterShape as any).type === 'mesh_surface') {\n const targetNode = nodesMap[meshSurfaceUUID];\n if (targetNode instanceof Mesh) {\n (system.emitterShape as any).mesh = targetNode;\n }\n }\n for (let i = 0; i < system.behaviors.length; i++) {\n if (system.behaviors[i] instanceof EmitSubParticleSystem) {\n const subEmitter = system.behaviors[i] as EmitSubParticleSystem;\n const targetUUID = subEmitter.subParticleSystem as any;\n if (typeof targetUUID === 'string' && nodesMap[targetUUID]) {\n const resolved = nodesMap[targetUUID];\n (subEmitter as any).subParticleSystem = resolved;\n if (resolved instanceof ParticleEmitter) {\n (resolved.system as ParticleSystem).onlyUsedByOther = true;\n }\n }\n }\n }\n }\n for (const child of node.getChildren()) {\n if (child instanceof TransformNode) {\n linkNode(child);\n }\n }\n };\n linkNode(root);\n }\n}\n","import {Node} from '@babylonjs/core/node';\nimport {BatchedRenderer} from './BatchedRenderer';\nimport {ParticleEmitter} from './ParticleEmitter';\nimport {ParticleSystem} from './ParticleSystem';\n\nexport class QuarksUtil {\n static runOnAllParticleEmitters(root: Node, callback: (emitter: ParticleEmitter) => void): void {\n QuarksUtil.traverseNode(root, (node) => {\n if (node instanceof ParticleEmitter) {\n callback(node);\n }\n });\n }\n\n static addToBatchRenderer(root: Node, batchRenderer: BatchedRenderer): void {\n QuarksUtil.runOnAllParticleEmitters(root, (emitter) => {\n batchRenderer.addSystem(emitter.system);\n });\n }\n\n static play(root: Node): void {\n QuarksUtil.runOnAllParticleEmitters(root, (emitter) => {\n (emitter.system as unknown as ParticleSystem).play();\n });\n }\n\n static stop(root: Node): void {\n QuarksUtil.runOnAllParticleEmitters(root, (emitter) => {\n (emitter.system as unknown as ParticleSystem).stop();\n });\n }\n\n static pause(root: Node): void {\n QuarksUtil.runOnAllParticleEmitters(root, (emitter) => {\n (emitter.system as unknown as ParticleSystem).pause();\n });\n }\n\n static restart(root: Node): void {\n QuarksUtil.runOnAllParticleEmitters(root, (emitter) => {\n (emitter.system as unknown as ParticleSystem).restart();\n });\n }\n\n static setAutoDestroy(root: Node, autoDestroy: boolean): void {\n QuarksUtil.runOnAllParticleEmitters(root, (emitter) => {\n (emitter.system as unknown as ParticleSystem).autoDestroy = autoDestroy;\n });\n }\n\n static endEmit(root: Node): void {\n QuarksUtil.runOnAllParticleEmitters(root, (emitter) => {\n (emitter.system as unknown as ParticleSystem).endEmit();\n });\n }\n\n /** True when every emitter under `root` is a finished non-looping system (or looping). */\n static isEffectFinished(root: Node): boolean {\n let found = false;\n let finished = true;\n QuarksUtil.runOnAllParticleEmitters(root, (emitter) => {\n found = true;\n const system = emitter.system as unknown as ParticleSystem;\n if (system.looping) {\n finished = false;\n return;\n }\n if (!system.isFinished()) {\n finished = false;\n }\n });\n return found && finished;\n }\n\n private static traverseNode(node: Node, callback: (node: Node) => void): void {\n callback(node);\n const children = node.getChildren();\n for (const child of children) {\n QuarksUtil.traverseNode(child, callback);\n }\n }\n}\n","import {loadPlugin} from 'quarks.core';\nimport {MeshSurfaceEmitterPlugin} from './MeshSurfaceEmitter';\nimport {registerShaderChunks} from './shaders';\n\nexport * from 'quarks.core';\nexport {BatchedParticleRenderer} from './BatchedParticleRenderer';\nexport {BatchedRenderer} from './BatchedRenderer';\nexport type {AdaptivePerformanceOptions, AdaptivePerformanceState, VFXBatchSettings} from './BatchedRenderer';\nexport {\n cacheEnvAtlas,\n createEnvAtlasFromFaceUrls,\n cubeFaceUrls,\n ensureEnvAtlasFromCube,\n getCachedEnvAtlas,\n} from './envAtlas';\nexport * from './materials/';\nexport {MeshSurfaceEmitter, MeshSurfaceEmitterPlugin} from './MeshSurfaceEmitter';\nexport {ParticleEmitter} from './ParticleEmitter';\nexport {ParticleSystem} from './ParticleSystem';\nexport type {\n BabylonMetaData,\n BurstParameters,\n BurstParametersJSON,\n ParticleSystemJSONParameters,\n ParticleSystemParameters,\n} from './ParticleSystem';\nexport {QuarksLoader} from './QuarksLoader';\nexport type {QuarksLoaderOptions} from './QuarksLoader';\nexport {QuarksPrefab} from './QuarksPrefab';\nexport type {AnimationData, QuarksTimelineClip} from './QuarksPrefab';\nexport {QuarksUtil} from './QuarksUtil';\nexport * from './shaders/';\nexport {SpriteBatch} from './SpriteBatch';\nexport {TrailBatch} from './TrailBatch';\nexport {RenderMode, VFXBatch} from './VFXBatch';\nexport type {StoredBatchSettings} from './VFXBatch';\n\n// Re-export quarks.core types (interfaces - type-only)\nexport type {\n Behavior,\n BillBoardSettings,\n ColorGenerator,\n EmissionState,\n EmitterShape,\n FunctionColorGenerator,\n FunctionValueGenerator,\n IEmitter,\n IParticle,\n IParticleSystem,\n MeshSettings,\n Particle,\n ParticleSystemEvent,\n ParticleSystemEventType,\n RendererEmitterSettings,\n RotationGenerator,\n SerializationOptions,\n StretchedBillBoardSettings,\n TrailSettings,\n ValueGenerator,\n Vector3Generator,\n} from 'quarks.core';\n\nregisterShaderChunks();\nloadPlugin(MeshSurfaceEmitterPlugin);\n","export default /* glsl */ `\n// Per-vertex attributes\nattribute vec3 position;\nattribute vec2 uv;\n\n// Per-instance attributes\nattribute vec3 offset;\nattribute vec4 color;\nattribute vec3 size;\nattribute vec4 rotation;\nattribute float uvTile;\n\n// Uniforms\nuniform mat4 worldViewProjection;\n\n#ifdef UV_TILE\nuniform float tileCountX;\nuniform float tileCountY;\n#endif\n\n// Varyings\nvarying vec2 vUV;\nvarying vec4 vColor;\n\nvec3 applyQuaternion(vec3 v, vec4 q) {\n vec3 qVec = q.xyz;\n float qW = q.w;\n vec3 t = 2.0 * cross(qVec, v);\n return v + qW * t + cross(qVec, t);\n}\n\nvoid main() {\n vec3 rotatedPosition = applyQuaternion(position * size, rotation);\n vec3 worldPos = rotatedPosition + offset;\n\n gl_Position = worldViewProjection * vec4(worldPos, 1.0);\n\n #ifdef UV_TILE\n vec2 tc = vec2(tileCountX, tileCountY);\n float baseTile = floor(uvTile);\n float tileU = mod(baseTile, tc.x) / tc.x;\n float tileV = 1.0 - floor(baseTile / tc.x) / tc.y - 1.0 / tc.y;\n vUV = uv / tc + vec2(tileU, tileV);\n #else\n vUV = uv;\n #endif\n\n vColor = color;\n}\n`;\n"],"names":["_lut","_seed","DEG2RAD","Math","PI","RAD2DEG","generateUUID","d0","random","d1","d2","d3","toLowerCase","clamp","value","min","max","euclideanModulo","n","m","mapLinear","x","a1","a2","b1","b2","inverseLerp","y","lerp","t","damp","lambda","dt","exp","pingpong","length","abs","smoothstep","smootherstep","randInt","low","high","floor","randFloat","randFloatSpread","range","seededRandom","s","undefined","imul","degToRad","degrees","radToDeg","radians","isPowerOfTwo","ceilPowerOfTwo","pow","ceil","log","LN2","floorPowerOfTwo","setQuaternionFromProperEuler","q","a","b","c","order","cos","sin","c2","s2","c13","s13","c1_3","s1_3","c3_1","s3_1","set","console","warn","denormalize","array","constructor","Float32Array","Uint32Array","Uint16Array","Uint8Array","Int32Array","Int16Array","Int8Array","Error","normalize","round","MathUtils","Quaternion","z","w","this","_x","_y","_z","_w","slerpFlat","dst","dstOffset","src0","srcOffset0","src1","srcOffset1","x0","y0","z0","w0","x1","y1","z1","w1","dir","sqrSin","Number","EPSILON","sqrt","len","atan2","tDir","f","multiplyQuaternionsFlat","_onChangeCallback","clone","copy","quaternion","setFromEuler","euler","update","_order","c1","c3","s1","s3","setFromAxisAngle","axis","angle","halfAngle","setFromRotationMatrix","te","elements","m11","m12","m13","m21","m22","m23","m31","m32","m33","trace","setFromUnitVectors","vFrom","vTo","r","dot","angleTo","acos","rotateTowards","step","slerp","identity","invert","conjugate","v","lengthSq","l","multiply","multiplyQuaternions","premultiply","qax","qay","qaz","qaw","qbx","qby","qbz","qbw","qb","cosHalfTheta","sqrSinHalfTheta","sinHalfTheta","halfTheta","ratioA","ratioB","slerpQuaternions","qa","theta1","theta2","r1","r2","equals","fromArray","offset","toArray","toJSON","_onChange","callback","Symbol","iterator","prototype","isQuaternion","Vector3","setScalar","scalar","setX","setY","setZ","setComponent","index","getComponent","add","addScalar","addVectors","addScaledVector","sub","subScalar","subVectors","multiplyScalar","multiplyVectors","applyEuler","applyQuaternion","_quaternion$1","applyAxisAngle","applyMatrix3","e","applyNormalMatrix","applyMatrix4","vx","vy","vz","qx","qy","qz","qw","tx","ty","tz","transformDirection","divide","divideScalar","clampScalar","minVal","maxVal","clampLength","roundToZero","trunc","negate","manhattanLength","setLength","alpha","lerpVectors","v1","v2","cross","crossVectors","ax","ay","az","bx","by","bz","projectOnVector","denominator","projectOnPlane","planeNormal","_vector","reflect","normal","theta","distanceTo","distanceToSquared","dx","dy","dz","manhattanDistanceTo","setFromSphericalCoords","radius","phi","sinPhiRadius","setFromCylindricalCoords","setFromMatrixPosition","setFromMatrixScale","sx","setFromMatrixColumn","sy","sz","setFromMatrix3Column","randomDirection","u","isVector3","WebGLCoordinateSystem","WebGPUCoordinateSystem","Matrix4","n11","n12","n13","n14","n21","n22","n23","n24","n31","n32","n33","n34","n41","n42","n43","n44","extractPosition","copyPosition","multiplyToArray","error","setRotationFromQuaternion","makeRotationFromQuaternion","me","setFromMatrix3","extractBasis","xAxis","yAxis","zAxis","makeBasis","extractRotation","scaleX","_v1","scaleY","scaleZ","makeRotationFromEuler","d","ae","af","be","bf","ce","cf","de","df","ac","ad","bc","bd","compose","_zero","_one","lookAt","eye","target","up","multiplyMatrices","a11","a12","a13","a14","a21","a22","a23","a24","a31","a32","a33","a34","a41","a42","a43","a44","b11","b12","b13","b14","b21","b22","b23","b24","b31","b32","b33","b34","b41","b42","b43","b44","determinant","transpose","tmp","setPosition","t11","t12","t13","t14","det","detInv","scale","getMaxScaleOnAxis","scaleXSq","scaleYSq","scaleZSq","makeTranslation","makeRotationX","makeRotationY","makeRotationZ","makeRotationAxis","makeScale","makeShear","xy","xz","yx","yz","zx","zy","position","x2","y2","z2","xx","yy","zz","wx","wy","wz","decompose","_m1","invSX","invSY","invSZ","makePerspective","left","right","top","bottom","near","far","coordinateSystem","makeOrthographic","h","p","zInv","matrix","i","isMatrix4","_matrix","_quaternion","Euler","DEFAULT_ORDER","asin","setFromQuaternion","setFromVector3","reorder","newOrder","isEuler","Matrix3","setFromMatrix4","g","getNormalMatrix","matrix4","transposeIntoArray","setUvTransform","rotation","cx","cy","_m3","rotate","makeRotation","translate","isVector2","isMatrix3","Vector2","width","height","rotateAround","center","UNBOUND$1","Vector3View","data","super","bind","prototype$1","Object","defineProperties","get","Vector4","setW","setAxisAngleFromQuaternion","setAxisAngleFromRotationMatrix","epsilon","epsilon2","isVector4","UNBOUND","Vector4View","physicsResolver","getPhysicsResolver","ApplyCollision","resolver","bounce","type","tempV","initialize","particle","delta","resolve","velocity","frameUpdate","fromJSON","json","reset","ConstantValue","startGen","memory","genValue","IntervalValue","indexCount","push","Bezier","p1","p2","p3","p4","t2","mt","mt2","derivativeCoefficients","points","dpoints","list","j","dpt","getSlope","controlCurve","hull","pt","_p","idx","split","span","p0","PiecewiseFunction","functions","Array","findFunction","last","mid","getEndX","getStartX","setStartX","setEndX","insertFunction","func","splice","removeFunction","getFunction","setFunction","numOfFunctions","PiecewiseBezier","curves","table","tableSignature","refreshTable","count","signatureLength","signature","changed","Float64Array","start","size","TABLE_SIZE","genValueExact","clearTable","fraction","startX","toSVG","segments","result","join","map","bezier","function","piecewiseFunction","ValueGeneratorFromJSON","AxisAngleGenerator","quat","ColorToJSON","color","JSONToColor","JSONToValue","ValueToJSON","ColorRange","genColor","ContinuousLinearFunction","keys","subType","findKey","name","pos","pair","tempColor$1","Gradient","colorKeys","alphaKeys","sample","genColorExact","next","lastColor","colorIndex","key","from","to","ratio","lastAlpha","alphaIndex","gradient","RandomColor","rand","tempColor","RandomColorBetweenGradient","gradient1","gradient2","ConstantColor","memoryGenerator","ColorGeneratorFromJSON","EulerGenerator","angleX","angleY","angleZ","eulerOrder","eular","RandomQuatGenerator","RotationGeneratorFromJSON","Vector3Function","vec","Vector3GeneratorFromJSON","GeneratorFromJSON","ApplyForce","direction","magnitude","dataCount","magnitudeValue","updateAll","particles","age","life","force","TextureSequencer","locations","transform","textureSequencer","loc","fromImage","img","threshold","canvas","document","createElement","ctx","getContext","drawImage","getImageData","colorSpace","remove","SequencerFromJSON","ApplySequences","delayBetweenParticles","sequencers","time","pCount","delay","id","begin","inMotion","sequencer","BEZIER","appendSequencer","seq","forEach","sequencerJson","applySequences","ChangeEmitDirection","_temp","_q","ColorBySpeed","speedRange","startSpeed","startColor","ColorOverLife","generator","randomInt","UP_VEC3","ZERO_VEC3","ONE_VEC3","Z_VEC3","SubParticleEmitMode","EmitSubParticleSystem","particleSystem","useVelocityAsBasis","subParticleSystem","mode","Frame","emitProbability","q_","v_","v2_","subEmissions","system","onlyUsedByOther","Birth","Death","emit","setMatrixFromParticle","burstParticleCount","burstParticleIndex","isBursting","burstIndex","burstWaveIndex","waitEmiting","travelDistance","duration","subEmissionState","uuid","len2","worldSpace","emitter","matrixWorld","ForceOverLife","ps","_tempScale","_tempQ","temp","generatorX","generatorY","generatorZ","translation","FrameOverLife","frame","_frame","uvTile","sampleFrame","GravityForce","distanceSquared","cz","InheritVelocity","multiplier","_tempPos","_tempQInv","_tempScaleInv","emitterVelocity","decomposeInverse","LimitSpeedOverLife","speed","dampen","limit","percent","dampenStep","F2","G2","F3","G3","F4","G4","grad3","grad4","SimplexNoise","randomOrSeed","seed","s0","mash","toString","charCodeAt","masher","alea","aux","buildPermutationTable","perm","permMod12","noise2D","n0","n1","n2","i1","j1","ii","jj","t0","gi0","t1","gi1","gi2","noise3D","n3","k","k1","i2","j2","k2","x3","y3","z3","kk","t3","gi3","noise4D","n4","rankx","ranky","rankz","rankw","l1","l2","i3","j3","k3","l3","w2","w3","x4","y4","z4","w4","ll","t4","gi4","GENERATOR_COUNT","generators","tempQ","getGenerator","Noise","frequency","power","positionAmount","rotationAmount","isScalarRotation","state","_noiseState","lastPos","lastRot","lastRotQ","generatorW","_","noiseTime","amount","noise","OrbitOverLife","orbitSpeed","Rotation3DOverLife","angularVelocity","tempQuat","RotationBySpeed","rate","RotationOverLife","SizeBySpeed","startSize","SizeOverLife","_sizeIsVector3","_size","SpeedOverLife","speedModifier","TurbulenceField","octaves","velocityMultiplier","timeScale","timeOffset","temp2","lvl","UNIT_X","UNIT_Y","UNIT_Z","VelocityOverLife","linearX","linearY","linearZ","orbitalX","orbitalY","orbitalZ","space","_tempEmitterPos","_tempRot","_axisX","_axisY","_axisZ","orbit","readValue","field","ParticleStore","capacity","previousVelocity","EMPTY","previousPosition","previousSize","previousColor","scalars","SCALAR_STRIDE","ensureCapacity","grow","growDouble","keepPreviousVelocity","swapRows","a3","b3","swap3","a4","b4","swap4","source","grown","AGE","LIFE","SPEED_MODIFIER","LinkedListNode","prev","hasPrev","hasNext","LinkedList","head","tail","isEmpty","clear","front","back","dequeue","pop","queue","node","insertBefore","newNode","tempNode","values","current","SpriteParticle","scalarOffset","store","storeIndex","flip","offset3","offset4","setStoreIndex","rebind","died","EMPTY_HISTORY","TrailParticle","previous","historyPositions","historySizes","historyColors","historyCapacity","historyHead","historyCount","ensureHistoryCapacity","resetHistory","getHistoryIndex","positionIndex","positions","colors","WidthOverLength","sizes","invLength","slot","BehaviorTypes","params","loadJSON","BehaviorFromJSON","DEPS","fragmentFor","behavior","setup","body","passCache","Map","compile","fragments","cached","compiled","Function","factory","generate","planBehaviorFusion","behaviors","steps","runBehaviors","runFragments","runStart","flush","run","fragment","BoxEmitFrom","EmitterMode","BoxEmitter","parameters","_point","depth","emitFrom","Volume","boxThickness","_system","_delta","_emissionState","point","Shell","onSurface","Edge","side","thickness","isArray","getValueFromEmitterMode","currentValue","spread","emissionState","Random","Burst","Loop","PingPong","ShapeTransform","apply","isIdentity","toShapeJSON","CircleEmitter","arc","ConeEmitter","sinTheta","cosTheta","DonutEmitter","donutRadius","EdgeEmitter","GridEmitter","column","row","HemisphereEmitter","sinPhi","cosPhi","PointEmitter","cbrt","SphereEmitter","RectangleEmitter","thicknessScale","EmitterShapes","box","circle","cone","donut","edge","sphere","hemisphere","grid","rectangle","EmitterFromJSON","meta","Plugins","loadPlugin","plugin","find","item","emitterShape","emitterShapes","MeshSurfaceEmitter","mesh","_mesh","getVerticesData","VertexBuffer","PositionKind","indices","getIndices","_positions","_indices","_triangleIndexToArea","area","triCount","i0","meshReferenceId","_meshReferenceId","u1","u2","idx0","idx1","idx2","nx","ny","nz","uniqueId","MeshSurfaceEmitterPlugin","shaderChunks","registered","registerShaderChunks","tile_pars_vertex","tile_vertex","tile_pars_fragment","tile_fragment","soft_pars_vertex","soft_vertex","soft_pars_fragment","soft_fragment","local_particle_physics_vert","particle_frag","particle_physics_frag","particle_vert","stretched_bb_particle_vert","trail_frag","trail_vert","particle_frag_wgsl","shaderLanguageFor","engine","isWebGPU","ShaderLanguage","WGSL","GLSL","registerShaders","vertex","language","ShaderStore","ShadersStoreWGSL","wgsl","Effect","ShadersStore","glsl","RenderMode","VFXBatch","settings","scene","visibleSystems","maxParticles","systems","Set","instancingGeometry","instancingIndices","instancingUVs","instancingNormals","renderMode","renderOrder","uTileCount","vTileCount","blendTiles","softParticles","softNearFade","softFarFade","materialBlendMode","materialTransparent","materialDepthTest","materialDepthWrite","materialAlphaTest","texture","reflectionTexture","reflectionLevel","reflectionFaces","reflectionAtlas","pivot","layerMask","Mesh","alwaysSelectAsActiveMesh","addSystem","removeSystem","delete","getVisibleSystems","visible","applyDepthTexture","depthTexture","material","ShaderMaterial","setTexture","dispose","SpriteBatch","whiteTexture","whiteTextureByScene","RawTexture","CreateRGBATexture","shaderMaterial","vector_","vector2_","vector3_","quaternion_","quaternion2_","quaternion3_","quaternion4_","quaternion5_","rotationMat_","rotationMat2_","lastStretchedSpeedFactor","NaN","clearedInstanceUploaded","setupBuffers","rebuildMaterial","vertexData","VertexData","vertexCount","uvs","normals","applyToMesh","buildExpandableBuffers","disposeExpandableBuffers","offsetVB","colorVB","sizeVB","uvTileVB","rotationVB","velocityVB","velocityBuffer","getEngine","offsetBuffer","setVerticesBuffer","colorBuffer","sizeBuffer","uvTileBuffer","rotationBuffer","StretchedBillBoard","forcedInstanceCount","doNotSyncBoundingInfo","expandBuffers","shaderName","defines","vertexShader","fragmentShader","mapTexture","atlas","isReady","onLoad","onLoadObservable","addOnce","useEnvAtlas","VerticalBillBoard","HorizontalBillBoard","takesPivotAndFlip","shaderLanguage","attributes","uniforms","samplers","mat","needAlphaBlending","setFloat","eyePosition","BVector3","onBindObservable","camera","activeCamera","copyFrom","globalPosition","setVector3","setVector2","BVector2","projParams","BVector4","minZ","maxZ","setVector4","backFaceCulling","alphaMode","Constants","ALPHA_DISABLE","needDepthPrePass","forceDepthWrite","disableDepthWrite","particleCount","isMeshRender","isStretchedRender","flipsSprites","particleNum","systemWorldSpace","emitterMatrix","absScaleX","absScaleY","absScaleZ","stretchedSettings","rendererEmitterSettings","speedFactor","lengthFactor","copiedColor","sharedTransform","residual","simulationResidual","stepFraction","simulationStep","continueColor","subarray","copiedPositionAndSize","extrapolate","continueVector3","base","end","offsets","m00","m01","m02","m03","m10","m20","m30","o","px","py","pz","firstIndex","own","partialTurn","parentQ","parentMatrix","ri","spin","oi","si","ci","vel","vi","applyFlip","syncStretchedSpeedFactor","uploadClearedInstance","clampedSpeedFactor","BillBoard","out","inverseLength","WeakMap","TrailBatch","drawsNothing","buildGeometryBuffers","positionBuffer","previousBuffer","nextBuffer","uvBuffer","sideBuffer","widthBuffer","indexBuffer","setVerticesData","UVKind","ColorKind","setIndices","subMeshes","previousVB","nextVB","sideVB","widthVB","setBoundingInfo","BoundingInfo","_boundingInfo","getBoundingInfo","resolution","getRenderWidth","getRenderHeight","renderEngine","ensureWorldMatrix","computeWorldMatrix","triangles","tileWidth","tileHeight","objectScale","trailSettings","uvFromHead","Boolean","colorFromParticle","samplesInWorld","recordWorldSpace","followLocalOrigin","particleHistoryLength","particleColorIndex","col","invHistoryLength","currentSlot","previousSlot","nextSlot","currentPosIndex","previousPosIndex","nextPosIndex","currentX","currentY","currentZ","previousX","previousY","previousZ","nextX","nextY","nextZ","currentSize","currentColorIndex","currentColorX","currentColorY","currentColorZ","currentColorW","pi","ui","along","cci","previousHead","tipX","tipY","tipZ","headIndex","headX","headY","headZ","tipPi","headPi","tipSize","tipUi","tipU","tipColor","tipCi","uploadGeometry","updateVerticesData","updateIndices","getVertexBuffer","adoptMeshBounds","verticesCount","fill","meshBoundingInfo","subMesh","BatchedRenderer","TransformNode","batches","systemToBatchIndex","orderedSystems","orderedSystemsStale","batchEmptyFrames","adaptivePerformanceState","enabled","targetFrameMs","minQuality","maxQuality","decreaseStep","increaseStep","currentQuality","lastFrameCpuMs","lastAppliedQuality","reflectionFacesEqual","pivotEqual","_renderer","has","indexOf","setQualityFactor","assignToBatch","getRendererSettings","batch","getScene","Trail","parent","deleteSystem","removed","removeFromBatch","ordered","batchIndex","updateSystem","setDepthTexture","configureAdaptivePerformance","options","disableAdaptivePerformance","resetQuality","applyAdaptiveQuality","getAdaptivePerformanceState","quality","_invalidateUpdateOrder","orderSystems","visiting","done","known","visit","targets","subTargetsOf","reverse","adaptiveState","frameStart","performance","now","refreshBatches","emptyFrames","framesEmpty","EMPTY_BATCH_GRACE_FRAMES","removeBatch","getBatchRenderStats","systemNames","instanceCount","BatchedParticleRenderer","atlasByCube","pendingByCube","cubeFaceUrls","reflection","isCube","files","_files","slice","getCachedEnvAtlas","cube","async","createEnvAtlasFromFaceUrls","urls","Image","images","Promise","all","url","reject","image","crossOrigin","onload","onerror","src","loadImage","naturalWidth","Texture","toDataURL","noMipmap","invertY","samplingMode","LINEAR_LINEAR","envAtlasBuilder","createFromFaceUrls","ensureEnvAtlasFromCube","onReady","kick","existingPending","then","pending","catch","err","observable","ParticleMeshStandardMaterial","StandardMaterial","isParticleMeshStandardMaterial","assign","ParticleMeshPhysicsMaterial","PBRMaterial","isParticleMeshPhysicsMaterial","ParticleEmitter","getWorldMatrix","flag","updateFlag","_matrixWorldFlag","_matrixWorld","isEnabled","setEnabled","extractFromCache","cache","metadata","clonedEmitter","scaling","rotationQuaternion","_quarksUUID","ensureTriangleIndices","UP","tempV2","SIMULATION_STEP","DEFAULT_POSITIONS","DEFAULT_UVS","DEFAULT_INDICES","trailFlags","flags","dieWithParticle","ParticleSystem","isEmitEnded","emitEnded","hasPendingEmission","looping","emissionBursts","timeRatio","emissionOverTime","emissionOverDistance","isFinished","layers","layerMaskProxy","rendererSettings","neededToUpdateRender","materialRef","applyMaterialSettings","nonZeroPivot","nonZeroFlip","geometry","restart","blending","needRestart","startRotation","startLength","finishedEventFired","startDelayTimeLeft","tempEmitterPos","normalMatrix","listeners","qualityFactor","simulationAccumulator","destroyed","fusionSteps","firstTimeUpdate","sceneRef","mask","defineProperty","enumerable","autoDestroy","startDelay","prewarm","startLife","shape","blendMode","ALPHA_ADD","transparent","depthTest","depthWrite","alphaTest","createFallbackNormals","startTileIndex","paused","burst","markForDestroy","prewarmed","overrides","resolvedTexture","albedoTexture","diffuseTexture","emissiveTexture","opacityTexture","baseTexture","resolvedReflection","environmentTexture","resolvedReflectionLevel","level","resolvedBlendMode","resolvedTransparent","resolvedDepthTest","disableDepthTest","resolvedDepthWrite","resolvedAlphaTest","transparencyMode","alphaTestMode","alphaCutOff","alphaCutOffValue","resolvedAtlas","pause","play","stop","rebindParticles","growParticlePool","isTrailMode","spawn","behaviorCount","isSpriteMode","isMeshMode","startRotationIsRotation","startSizeIsVector3","sprite","trail","localPosition","endEmit","fire","previousEmitterPos","stepsToRun","emitterElements","simulateStep","behaviorSteps","fusionPlan","same","stretched","columns","vector3Rows","stepBehaviors","prevSize","curSize","prevColor","curColor","stride","o3","o4","velocities","notifyDeaths","hasListeners","scalarStride","liveParticleCount","survivor","notifyFinished","emissionBurstCount","probability","rawCount","previousWorldPos","emitPerMeter","totalSpawn","metaData","_options","geometries","materials","textures","shapes","skeletons","animations","nodes","geometryUUID","ensureGeometryMeta","materialUUID","ensureMaterialMeta","rendererEmitterSettingsJSON","toRendererSettingsJSON","version","interval","cycle","dependencies","materialMeta","materialTextureRef","resolvedGeometryEntry","resolvedGeometry","resolveGeometryData","cycleCount","sourceMaterial","behaviorJson","filter","nextSerializationId","prefix","serializationCounter","textureUUID","reflectionAtlasUUID","entry","uv","addBehavior","addEventListener","event","removeAllEventListeners","removeEventListener","callbacks","newBehaviors","QuarksPrefab","animationData","isPlaying","currentTime","_lastUpdateTimeMs","Date","_tempAnimationJSON","registerBatchedRenderer","renderer","_batchedRenderer","addParticleSystemAnimation","startTime","loop","updateDuration","addThreeAnimation","clip","clipUUID","removeAnimation","animation","forceDelta","previousTime","endTime","isActive","wasActive","setTime","getDuration","resolveReferences","root","nodesMap","traverse","children","getChildren","child","animationJSON","targetUUID","resolveTimelineClip","prefab","animationSources","animationGroups","found","maxDuration","sharedTextures","sharedGeometries","sceneMap","maps","QuarksLoader","load","baseUrl","substring","lastIndexOf","response","fetch","resolveExternalGeometries","geometryUrl","geometryResponse","resolveUrl","ok","status","parse","loadGeometry","geom","parseGeometries","parseImages","parseTextures","parseMaterials","parseObject","object","linkReferences","hw","hh","parseSphereGeometry","parsed","parseBufferGeometry","share","shareResources","h1","h2","parts","lengths","part","bytes","buffer","byteOffset","byteLength","geometryKey","existing","clearSharedResources","widthSegments","heightSegments","phiStart","phiLength","thetaStart","thetaLength","iy","verticesRow","ix","hypot","isTopFull","isBottomFull","typedIndices","interleavedBuffers","arrayBuffers","buffers","ibDef","entries","arrayBuffer","floatArray","int32ArrayToFloat32","isInterleavedBufferAttribute","attr","buf","extractInterleavedAttribute","itemSize","intArray","ArrayBuffer","int32View","_meta","_images","warnIfNotAnImageUrl","test","startsWith","texDef","imageUrl","wrap","repeat","wrapU","mapWrapMode","wrapV","uScale","vScale","uOffset","vOffset","wAng","onDisposeObservable","wrapMode","CLAMP_ADDRESSMODE","MIRROR_ADDRESSMODE","WRAP_ADDRESSMODE","matDef","matInfo","textureRef","reflectionAtlasRef","blendingToAlphaMode","ALPHA_COMBINE","ALPHA_SUBTRACT","ALPHA_MULTIPLY","getGeometry","geometryId","getMaterial","materialId","selectedId","createPlaceholderNode","quarksOriginalType","createMeshNode","materialInfo","parseParticleSystem","Matrix","FromArray","Identity","childData","_meshSurfaceReferenceUUID","linkNode","meshSurfaceUUID","targetNode","subEmitter","resolved","QuarksUtil","runOnAllParticleEmitters","traverseNode","addToBatchRenderer","batchRenderer","setAutoDestroy","isEffectFinished","finished","chunkName","pluginId"],"mappings":"qtDAKA,MAAMA,EAAO,CACT,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KA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"}
1
+ {"version":3,"file":"babylon.quarks.umd.min.js","sources":["../../quarks.core/dist/quarks.core.esm.js","../src/MeshSurfaceEmitter.ts","../src/shaders/chunks/register-shader-chunks.ts","../src/shaders/chunks/tile_pars_vertex.glsl.ts","../src/shaders/chunks/tile_vertex.glsl.ts","../src/shaders/chunks/tile_pars_fragment.glsl.ts","../src/shaders/chunks/tile_fragment.glsl.ts","../src/shaders/chunks/soft_pars_vertex.glsl.ts","../src/shaders/chunks/soft_vertex.glsl.ts","../src/shaders/chunks/soft_pars_fragment.glsl.ts","../src/shaders/chunks/soft_fragment.glsl.ts","../src/shaders/local_particle_physics_vert.glsl.ts","../src/shaders/particle_frag.glsl.ts","../src/shaders/particle_physics_frag.glsl.ts","../src/shaders/particle_vert.glsl.ts","../src/shaders/stretched_bb_particle_vert.glsl.ts","../src/shaders/trail_frag.glsl.ts","../src/shaders/trail_vert.glsl.ts","../src/shaders/particle_frag.wgsl.ts","../src/shaders/shaderLanguageSupport.ts","../src/shaders/stretched_bb_particle_vert.wgsl.ts","../src/VFXBatch.ts","../src/SpriteBatch.ts","../src/shaders/local_particle_physics_vert.wgsl.ts","../src/shaders/particle_physics_frag.wgsl.ts","../src/shaders/particle_vert.wgsl.ts","../src/TrailBatch.ts","../src/shaders/trail_vert.wgsl.ts","../src/shaders/trail_frag.wgsl.ts","../src/BatchedRenderer.ts","../src/BatchedParticleRenderer.ts","../src/envAtlas.ts","../src/materials/ParticleMaterials.ts","../src/ParticleEmitter.ts","../src/geometryUtil.ts","../src/ParticleSystem.ts","../src/QuarksPrefab.ts","../src/QuarksLoader.ts","../src/QuarksUtil.ts","../src/index.ts","../src/shaders/local_particle_vert.glsl.ts"],"sourcesContent":["/**\n * quarks.core v0.23.0 build Sun Oct 18 2026\n * https://quarks.art\n * Copyright 2026 Alchemist0823 <the.forrest.sun@gmail.com>, MIT\n */\nconst _lut = [\n '00',\n '01',\n '02',\n '03',\n '04',\n '05',\n '06',\n '07',\n '08',\n '09',\n '0a',\n '0b',\n '0c',\n '0d',\n '0e',\n '0f',\n '10',\n '11',\n '12',\n '13',\n '14',\n '15',\n '16',\n '17',\n '18',\n '19',\n '1a',\n '1b',\n '1c',\n '1d',\n '1e',\n '1f',\n '20',\n '21',\n '22',\n '23',\n '24',\n '25',\n '26',\n '27',\n '28',\n '29',\n '2a',\n '2b',\n '2c',\n '2d',\n '2e',\n '2f',\n '30',\n '31',\n '32',\n '33',\n '34',\n '35',\n '36',\n '37',\n '38',\n '39',\n '3a',\n '3b',\n '3c',\n '3d',\n '3e',\n '3f',\n '40',\n '41',\n '42',\n '43',\n '44',\n '45',\n '46',\n '47',\n '48',\n '49',\n '4a',\n '4b',\n '4c',\n '4d',\n '4e',\n '4f',\n '50',\n '51',\n '52',\n '53',\n '54',\n '55',\n '56',\n '57',\n '58',\n '59',\n '5a',\n '5b',\n '5c',\n '5d',\n '5e',\n '5f',\n '60',\n '61',\n '62',\n '63',\n '64',\n '65',\n '66',\n '67',\n '68',\n '69',\n '6a',\n '6b',\n '6c',\n '6d',\n '6e',\n '6f',\n '70',\n '71',\n '72',\n '73',\n '74',\n '75',\n '76',\n '77',\n '78',\n '79',\n '7a',\n '7b',\n '7c',\n '7d',\n '7e',\n '7f',\n '80',\n '81',\n '82',\n '83',\n '84',\n '85',\n '86',\n '87',\n '88',\n '89',\n '8a',\n '8b',\n '8c',\n '8d',\n '8e',\n '8f',\n '90',\n '91',\n '92',\n '93',\n '94',\n '95',\n '96',\n '97',\n '98',\n '99',\n '9a',\n '9b',\n '9c',\n '9d',\n '9e',\n '9f',\n 'a0',\n 'a1',\n 'a2',\n 'a3',\n 'a4',\n 'a5',\n 'a6',\n 'a7',\n 'a8',\n 'a9',\n 'aa',\n 'ab',\n 'ac',\n 'ad',\n 'ae',\n 'af',\n 'b0',\n 'b1',\n 'b2',\n 'b3',\n 'b4',\n 'b5',\n 'b6',\n 'b7',\n 'b8',\n 'b9',\n 'ba',\n 'bb',\n 'bc',\n 'bd',\n 'be',\n 'bf',\n 'c0',\n 'c1',\n 'c2',\n 'c3',\n 'c4',\n 'c5',\n 'c6',\n 'c7',\n 'c8',\n 'c9',\n 'ca',\n 'cb',\n 'cc',\n 'cd',\n 'ce',\n 'cf',\n 'd0',\n 'd1',\n 'd2',\n 'd3',\n 'd4',\n 'd5',\n 'd6',\n 'd7',\n 'd8',\n 'd9',\n 'da',\n 'db',\n 'dc',\n 'dd',\n 'de',\n 'df',\n 'e0',\n 'e1',\n 'e2',\n 'e3',\n 'e4',\n 'e5',\n 'e6',\n 'e7',\n 'e8',\n 'e9',\n 'ea',\n 'eb',\n 'ec',\n 'ed',\n 'ee',\n 'ef',\n 'f0',\n 'f1',\n 'f2',\n 'f3',\n 'f4',\n 'f5',\n 'f6',\n 'f7',\n 'f8',\n 'f9',\n 'fa',\n 'fb',\n 'fc',\n 'fd',\n 'fe',\n 'ff',\n];\nlet _seed = 1234567;\nconst DEG2RAD = Math.PI / 180;\nconst RAD2DEG = 180 / Math.PI;\n// http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136\nfunction generateUUID() {\n const d0 = (Math.random() * 0xffffffff) | 0;\n const d1 = (Math.random() * 0xffffffff) | 0;\n const d2 = (Math.random() * 0xffffffff) | 0;\n const d3 = (Math.random() * 0xffffffff) | 0;\n const uuid = _lut[d0 & 0xff] +\n _lut[(d0 >> 8) & 0xff] +\n _lut[(d0 >> 16) & 0xff] +\n _lut[(d0 >> 24) & 0xff] +\n '-' +\n _lut[d1 & 0xff] +\n _lut[(d1 >> 8) & 0xff] +\n '-' +\n _lut[((d1 >> 16) & 0x0f) | 0x40] +\n _lut[(d1 >> 24) & 0xff] +\n '-' +\n _lut[(d2 & 0x3f) | 0x80] +\n _lut[(d2 >> 8) & 0xff] +\n '-' +\n _lut[(d2 >> 16) & 0xff] +\n _lut[(d2 >> 24) & 0xff] +\n _lut[d3 & 0xff] +\n _lut[(d3 >> 8) & 0xff] +\n _lut[(d3 >> 16) & 0xff] +\n _lut[(d3 >> 24) & 0xff];\n // .toLowerCase() here flattens concatenated strings to save heap memory space.\n return uuid.toLowerCase();\n}\nfunction clamp(value, min, max) {\n return Math.max(min, Math.min(max, value));\n}\n// compute euclidean modulo of m % n\n// https://en.wikipedia.org/wiki/Modulo_operation\nfunction euclideanModulo(n, m) {\n return ((n % m) + m) % m;\n}\n// Linear mapping from range <a1, a2> to range <b1, b2>\nfunction mapLinear(x, a1, a2, b1, b2) {\n return b1 + ((x - a1) * (b2 - b1)) / (a2 - a1);\n}\n// https://www.gamedev.net/tutorials/programming/general-and-gameplay-programming/inverse-lerp-a-super-useful-yet-often-overlooked-function-r5230/\nfunction inverseLerp(x, y, value) {\n if (x !== y) {\n return (value - x) / (y - x);\n }\n else {\n return 0;\n }\n}\n// https://en.wikipedia.org/wiki/Linear_interpolation\nfunction lerp(x, y, t) {\n return (1 - t) * x + t * y;\n}\n// http://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/\nfunction damp(x, y, lambda, dt) {\n return lerp(x, y, 1 - Math.exp(-lambda * dt));\n}\n// https://www.desmos.com/calculator/vcsjnyz7x4\nfunction pingpong(x, length = 1) {\n return length - Math.abs(euclideanModulo(x, length * 2) - length);\n}\n// http://en.wikipedia.org/wiki/Smoothstep\nfunction smoothstep(x, min, max) {\n if (x <= min)\n return 0;\n if (x >= max)\n return 1;\n x = (x - min) / (max - min);\n return x * x * (3 - 2 * x);\n}\nfunction smootherstep(x, min, max) {\n if (x <= min)\n return 0;\n if (x >= max)\n return 1;\n x = (x - min) / (max - min);\n return x * x * x * (x * (x * 6 - 15) + 10);\n}\n// Random integer from <low, high> interval\nfunction randInt(low, high) {\n return low + Math.floor(Math.random() * (high - low + 1));\n}\n// Random float from <low, high> interval\nfunction randFloat(low, high) {\n return low + Math.random() * (high - low);\n}\n// Random float from <-range/2, range/2> interval\nfunction randFloatSpread(range) {\n return range * (0.5 - Math.random());\n}\n// Deterministic pseudo-random float in the interval [ 0, 1 ]\nfunction seededRandom(s) {\n if (s !== undefined)\n _seed = s;\n // Mulberry32 generator\n let t = (_seed += 0x6d2b79f5);\n t = Math.imul(t ^ (t >>> 15), t | 1);\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61);\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n}\nfunction degToRad(degrees) {\n return degrees * DEG2RAD;\n}\nfunction radToDeg(radians) {\n return radians * RAD2DEG;\n}\nfunction isPowerOfTwo(value) {\n return (value & (value - 1)) === 0 && value !== 0;\n}\nfunction ceilPowerOfTwo(value) {\n return Math.pow(2, Math.ceil(Math.log(value) / Math.LN2));\n}\nfunction floorPowerOfTwo(value) {\n return Math.pow(2, Math.floor(Math.log(value) / Math.LN2));\n}\nfunction setQuaternionFromProperEuler(q, a, b, c, order) {\n // Intrinsic Proper Euler Angles - see https://en.wikipedia.org/wiki/Euler_angles\n // rotations are applied to the axes in the order specified by 'order'\n // rotation by angle 'a' is applied first, then by angle 'b', then by angle 'c'\n // angles are in radians\n const cos = Math.cos;\n const sin = Math.sin;\n const c2 = cos(b / 2);\n const s2 = sin(b / 2);\n const c13 = cos((a + c) / 2);\n const s13 = sin((a + c) / 2);\n const c1_3 = cos((a - c) / 2);\n const s1_3 = sin((a - c) / 2);\n const c3_1 = cos((c - a) / 2);\n const s3_1 = sin((c - a) / 2);\n switch (order) {\n case 'XYX':\n q.set(c2 * s13, s2 * c1_3, s2 * s1_3, c2 * c13);\n break;\n case 'YZY':\n q.set(s2 * s1_3, c2 * s13, s2 * c1_3, c2 * c13);\n break;\n case 'ZXZ':\n q.set(s2 * c1_3, s2 * s1_3, c2 * s13, c2 * c13);\n break;\n case 'XZX':\n q.set(c2 * s13, s2 * s3_1, s2 * c3_1, c2 * c13);\n break;\n case 'YXY':\n q.set(s2 * c3_1, c2 * s13, s2 * s3_1, c2 * c13);\n break;\n case 'ZYZ':\n q.set(s2 * s3_1, s2 * c3_1, c2 * s13, c2 * c13);\n break;\n default:\n console.warn('../math.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: ' + order);\n }\n}\nfunction denormalize(value, array) {\n switch (array.constructor) {\n case Float32Array:\n return value;\n case Uint32Array:\n return value / 4294967295.0;\n case Uint16Array:\n return value / 65535.0;\n case Uint8Array:\n return value / 255.0;\n case Int32Array:\n return Math.max(value / 2147483647.0, -1);\n case Int16Array:\n return Math.max(value / 32767.0, -1);\n case Int8Array:\n return Math.max(value / 127.0, -1);\n default:\n throw new Error('Invalid component type.');\n }\n}\nfunction normalize(value, array) {\n switch (array.constructor) {\n case Float32Array:\n return value;\n case Uint32Array:\n return Math.round(value * 4294967295.0);\n case Uint16Array:\n return Math.round(value * 65535.0);\n case Uint8Array:\n return Math.round(value * 255.0);\n case Int32Array:\n return Math.round(value * 2147483647.0);\n case Int16Array:\n return Math.round(value * 32767.0);\n case Int8Array:\n return Math.round(value * 127.0);\n default:\n throw new Error('Invalid component type.');\n }\n}\nconst MathUtils = {\n DEG2RAD: DEG2RAD,\n RAD2DEG: RAD2DEG,\n generateUUID: generateUUID,\n clamp: clamp,\n euclideanModulo: euclideanModulo,\n mapLinear: mapLinear,\n inverseLerp: inverseLerp,\n lerp: lerp,\n damp: damp,\n pingpong: pingpong,\n smoothstep: smoothstep,\n smootherstep: smootherstep,\n randInt: randInt,\n randFloat: randFloat,\n randFloatSpread: randFloatSpread,\n seededRandom: seededRandom,\n degToRad: degToRad,\n radToDeg: radToDeg,\n isPowerOfTwo: isPowerOfTwo,\n ceilPowerOfTwo: ceilPowerOfTwo,\n floorPowerOfTwo: floorPowerOfTwo,\n setQuaternionFromProperEuler: setQuaternionFromProperEuler,\n normalize: normalize,\n denormalize: denormalize,\n};\n\nclass Quaternion {\n constructor(x = 0, y = 0, z = 0, w = 1) {\n this._x = x;\n this._y = y;\n this._z = z;\n this._w = w;\n }\n static slerpFlat(dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t) {\n // fuzz-free, array-based Quaternion SLERP operation\n let x0 = src0[srcOffset0 + 0], y0 = src0[srcOffset0 + 1], z0 = src0[srcOffset0 + 2], w0 = src0[srcOffset0 + 3];\n const x1 = src1[srcOffset1 + 0], y1 = src1[srcOffset1 + 1], z1 = src1[srcOffset1 + 2], w1 = src1[srcOffset1 + 3];\n if (t === 0) {\n dst[dstOffset + 0] = x0;\n dst[dstOffset + 1] = y0;\n dst[dstOffset + 2] = z0;\n dst[dstOffset + 3] = w0;\n return;\n }\n if (t === 1) {\n dst[dstOffset + 0] = x1;\n dst[dstOffset + 1] = y1;\n dst[dstOffset + 2] = z1;\n dst[dstOffset + 3] = w1;\n return;\n }\n if (w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1) {\n let s = 1 - t;\n const cos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1, dir = cos >= 0 ? 1 : -1, sqrSin = 1 - cos * cos;\n // Skip the Slerp for tiny steps to avoid numeric problems:\n if (sqrSin > Number.EPSILON) {\n const sin = Math.sqrt(sqrSin), len = Math.atan2(sin, cos * dir);\n s = Math.sin(s * len) / sin;\n t = Math.sin(t * len) / sin;\n }\n const tDir = t * dir;\n x0 = x0 * s + x1 * tDir;\n y0 = y0 * s + y1 * tDir;\n z0 = z0 * s + z1 * tDir;\n w0 = w0 * s + w1 * tDir;\n // Normalize in case we just did a lerp:\n if (s === 1 - t) {\n const f = 1 / Math.sqrt(x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0);\n x0 *= f;\n y0 *= f;\n z0 *= f;\n w0 *= f;\n }\n }\n dst[dstOffset] = x0;\n dst[dstOffset + 1] = y0;\n dst[dstOffset + 2] = z0;\n dst[dstOffset + 3] = w0;\n }\n static multiplyQuaternionsFlat(dst, dstOffset, src0, srcOffset0, src1, srcOffset1) {\n const x0 = src0[srcOffset0];\n const y0 = src0[srcOffset0 + 1];\n const z0 = src0[srcOffset0 + 2];\n const w0 = src0[srcOffset0 + 3];\n const x1 = src1[srcOffset1];\n const y1 = src1[srcOffset1 + 1];\n const z1 = src1[srcOffset1 + 2];\n const w1 = src1[srcOffset1 + 3];\n dst[dstOffset] = x0 * w1 + w0 * x1 + y0 * z1 - z0 * y1;\n dst[dstOffset + 1] = y0 * w1 + w0 * y1 + z0 * x1 - x0 * z1;\n dst[dstOffset + 2] = z0 * w1 + w0 * z1 + x0 * y1 - y0 * x1;\n dst[dstOffset + 3] = w0 * w1 - x0 * x1 - y0 * y1 - z0 * z1;\n return dst;\n }\n get x() {\n return this._x;\n }\n set x(value) {\n this._x = value;\n this._onChangeCallback();\n }\n get y() {\n return this._y;\n }\n set y(value) {\n this._y = value;\n this._onChangeCallback();\n }\n get z() {\n return this._z;\n }\n set z(value) {\n this._z = value;\n this._onChangeCallback();\n }\n get w() {\n return this._w;\n }\n set w(value) {\n this._w = value;\n this._onChangeCallback();\n }\n set(x, y, z, w) {\n this._x = x;\n this._y = y;\n this._z = z;\n this._w = w;\n this._onChangeCallback();\n return this;\n }\n clone() {\n return new Quaternion(this._x, this._y, this._z, this._w);\n }\n copy(quaternion) {\n this._x = quaternion.x;\n this._y = quaternion.y;\n this._z = quaternion.z;\n this._w = quaternion.w;\n this._onChangeCallback();\n return this;\n }\n setFromEuler(euler, update = true) {\n const x = euler._x, y = euler._y, z = euler._z, order = euler._order;\n // http://www.mathworks.com/matlabcentral/fileexchange/\n // \t20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/\n //\tcontent/SpinCalc.m\n const cos = Math.cos;\n const sin = Math.sin;\n const c1 = cos(x / 2);\n const c2 = cos(y / 2);\n const c3 = cos(z / 2);\n const s1 = sin(x / 2);\n const s2 = sin(y / 2);\n const s3 = sin(z / 2);\n switch (order) {\n case 'XYZ':\n this._x = s1 * c2 * c3 + c1 * s2 * s3;\n this._y = c1 * s2 * c3 - s1 * c2 * s3;\n this._z = c1 * c2 * s3 + s1 * s2 * c3;\n this._w = c1 * c2 * c3 - s1 * s2 * s3;\n break;\n case 'YXZ':\n this._x = s1 * c2 * c3 + c1 * s2 * s3;\n this._y = c1 * s2 * c3 - s1 * c2 * s3;\n this._z = c1 * c2 * s3 - s1 * s2 * c3;\n this._w = c1 * c2 * c3 + s1 * s2 * s3;\n break;\n case 'ZXY':\n this._x = s1 * c2 * c3 - c1 * s2 * s3;\n this._y = c1 * s2 * c3 + s1 * c2 * s3;\n this._z = c1 * c2 * s3 + s1 * s2 * c3;\n this._w = c1 * c2 * c3 - s1 * s2 * s3;\n break;\n case 'ZYX':\n this._x = s1 * c2 * c3 - c1 * s2 * s3;\n this._y = c1 * s2 * c3 + s1 * c2 * s3;\n this._z = c1 * c2 * s3 - s1 * s2 * c3;\n this._w = c1 * c2 * c3 + s1 * s2 * s3;\n break;\n case 'YZX':\n this._x = s1 * c2 * c3 + c1 * s2 * s3;\n this._y = c1 * s2 * c3 + s1 * c2 * s3;\n this._z = c1 * c2 * s3 - s1 * s2 * c3;\n this._w = c1 * c2 * c3 - s1 * s2 * s3;\n break;\n case 'XZY':\n this._x = s1 * c2 * c3 - c1 * s2 * s3;\n this._y = c1 * s2 * c3 - s1 * c2 * s3;\n this._z = c1 * c2 * s3 + s1 * s2 * c3;\n this._w = c1 * c2 * c3 + s1 * s2 * s3;\n break;\n default:\n console.warn('../math.Quaternion: .setFromEuler() encountered an unknown order: ' + order);\n }\n if (update === true)\n this._onChangeCallback();\n return this;\n }\n setFromAxisAngle(axis, angle) {\n // http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\n // assumes axis is normalized\n const halfAngle = angle / 2, s = Math.sin(halfAngle);\n this._x = axis.x * s;\n this._y = axis.y * s;\n this._z = axis.z * s;\n this._w = Math.cos(halfAngle);\n this._onChangeCallback();\n return this;\n }\n setFromRotationMatrix(m) {\n // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm\n // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n const te = m.elements, m11 = te[0], m12 = te[4], m13 = te[8], m21 = te[1], m22 = te[5], m23 = te[9], m31 = te[2], m32 = te[6], m33 = te[10], trace = m11 + m22 + m33;\n if (trace > 0) {\n const s = 0.5 / Math.sqrt(trace + 1.0);\n this._w = 0.25 / s;\n this._x = (m32 - m23) * s;\n this._y = (m13 - m31) * s;\n this._z = (m21 - m12) * s;\n }\n else if (m11 > m22 && m11 > m33) {\n const s = 2.0 * Math.sqrt(1.0 + m11 - m22 - m33);\n this._w = (m32 - m23) / s;\n this._x = 0.25 * s;\n this._y = (m12 + m21) / s;\n this._z = (m13 + m31) / s;\n }\n else if (m22 > m33) {\n const s = 2.0 * Math.sqrt(1.0 + m22 - m11 - m33);\n this._w = (m13 - m31) / s;\n this._x = (m12 + m21) / s;\n this._y = 0.25 * s;\n this._z = (m23 + m32) / s;\n }\n else {\n const s = 2.0 * Math.sqrt(1.0 + m33 - m11 - m22);\n this._w = (m21 - m12) / s;\n this._x = (m13 + m31) / s;\n this._y = (m23 + m32) / s;\n this._z = 0.25 * s;\n }\n this._onChangeCallback();\n return this;\n }\n setFromUnitVectors(vFrom, vTo) {\n // assumes direction vectors vFrom and vTo are normalized\n let r = vFrom.dot(vTo) + 1;\n if (r < Number.EPSILON) {\n // vFrom and vTo point in opposite directions\n r = 0;\n if (Math.abs(vFrom.x) > Math.abs(vFrom.z)) {\n this._x = -vFrom.y;\n this._y = vFrom.x;\n this._z = 0;\n this._w = r;\n }\n else {\n this._x = 0;\n this._y = -vFrom.z;\n this._z = vFrom.y;\n this._w = r;\n }\n }\n else {\n // crossVectors( vFrom, vTo ); // inlined to avoid cyclic dependency on Vector3\n this._x = vFrom.y * vTo.z - vFrom.z * vTo.y;\n this._y = vFrom.z * vTo.x - vFrom.x * vTo.z;\n this._z = vFrom.x * vTo.y - vFrom.y * vTo.x;\n this._w = r;\n }\n return this.normalize();\n }\n angleTo(q) {\n return 2 * Math.acos(Math.abs(clamp(this.dot(q), -1, 1)));\n }\n rotateTowards(q, step) {\n const angle = this.angleTo(q);\n if (angle === 0)\n return this;\n const t = Math.min(1, step / angle);\n this.slerp(q, t);\n return this;\n }\n identity() {\n return this.set(0, 0, 0, 1);\n }\n invert() {\n // quaternion is assumed to have unit length\n return this.conjugate();\n }\n conjugate() {\n this._x *= -1;\n this._y *= -1;\n this._z *= -1;\n this._onChangeCallback();\n return this;\n }\n dot(v) {\n return this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;\n }\n lengthSq() {\n return this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;\n }\n length() {\n return Math.sqrt(this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w);\n }\n normalize() {\n let l = this.length();\n if (l === 0) {\n this._x = 0;\n this._y = 0;\n this._z = 0;\n this._w = 1;\n }\n else {\n l = 1 / l;\n this._x = this._x * l;\n this._y = this._y * l;\n this._z = this._z * l;\n this._w = this._w * l;\n }\n this._onChangeCallback();\n return this;\n }\n multiply(q) {\n return this.multiplyQuaternions(this, q);\n }\n premultiply(q) {\n return this.multiplyQuaternions(q, this);\n }\n multiplyQuaternions(a, b) {\n // from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\n const qax = a._x, qay = a._y, qaz = a._z, qaw = a._w;\n const qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w;\n this._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n this._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n this._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n this._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n this._onChangeCallback();\n return this;\n }\n slerp(qb, t) {\n if (t === 0)\n return this;\n if (t === 1)\n return this.copy(qb);\n const x = this._x, y = this._y, z = this._z, w = this._w;\n // http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/\n let cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z;\n if (cosHalfTheta < 0) {\n this._w = -qb._w;\n this._x = -qb._x;\n this._y = -qb._y;\n this._z = -qb._z;\n cosHalfTheta = -cosHalfTheta;\n }\n else {\n this.copy(qb);\n }\n if (cosHalfTheta >= 1.0) {\n this._w = w;\n this._x = x;\n this._y = y;\n this._z = z;\n return this;\n }\n const sqrSinHalfTheta = 1.0 - cosHalfTheta * cosHalfTheta;\n if (sqrSinHalfTheta <= Number.EPSILON) {\n const s = 1 - t;\n this._w = s * w + t * this._w;\n this._x = s * x + t * this._x;\n this._y = s * y + t * this._y;\n this._z = s * z + t * this._z;\n this.normalize(); // normalize calls _onChangeCallback()\n return this;\n }\n const sinHalfTheta = Math.sqrt(sqrSinHalfTheta);\n const halfTheta = Math.atan2(sinHalfTheta, cosHalfTheta);\n const ratioA = Math.sin((1 - t) * halfTheta) / sinHalfTheta, ratioB = Math.sin(t * halfTheta) / sinHalfTheta;\n this._w = w * ratioA + this._w * ratioB;\n this._x = x * ratioA + this._x * ratioB;\n this._y = y * ratioA + this._y * ratioB;\n this._z = z * ratioA + this._z * ratioB;\n this._onChangeCallback();\n return this;\n }\n slerpQuaternions(qa, qb, t) {\n return this.copy(qa).slerp(qb, t);\n }\n random() {\n // sets this quaternion to a uniform random unit quaternnion\n // Ken Shoemake\n // Uniform random rotations\n // D. Kirk, editor, Graphics Gems III, pages 124-132. Academic Press, New York, 1992.\n const theta1 = 2 * Math.PI * Math.random();\n const theta2 = 2 * Math.PI * Math.random();\n const x0 = Math.random();\n const r1 = Math.sqrt(1 - x0);\n const r2 = Math.sqrt(x0);\n return this.set(r1 * Math.sin(theta1), r1 * Math.cos(theta1), r2 * Math.sin(theta2), r2 * Math.cos(theta2));\n }\n equals(quaternion) {\n return (quaternion._x === this._x &&\n quaternion._y === this._y &&\n quaternion._z === this._z &&\n quaternion._w === this._w);\n }\n fromArray(array, offset = 0) {\n this._x = array[offset];\n this._y = array[offset + 1];\n this._z = array[offset + 2];\n this._w = array[offset + 3];\n this._onChangeCallback();\n return this;\n }\n toArray(array = [], offset = 0) {\n array[offset] = this._x;\n array[offset + 1] = this._y;\n array[offset + 2] = this._z;\n array[offset + 3] = this._w;\n return array;\n }\n /*\n fromBufferAttribute( attribute, index ) {\n\n this._x = attribute.getX( index );\n this._y = attribute.getY( index );\n this._z = attribute.getZ( index );\n this._w = attribute.getW( index );\n\n this._onChangeCallback();\n\n return this;\n\n }*/\n toJSON() {\n return this.toArray();\n }\n _onChange(callback) {\n this._onChangeCallback = callback;\n return this;\n }\n _onChangeCallback() { }\n *[Symbol.iterator]() {\n yield this._x;\n yield this._y;\n yield this._z;\n yield this._w;\n }\n}\nQuaternion.prototype.isQuaternion = true;\n\nclass Vector3 {\n constructor(x = 0, y = 0, z = 0) {\n this.x = x;\n this.y = y;\n this.z = z;\n }\n set(x, y, z) {\n if (z === undefined)\n z = this.z; // sprite.scale.set(x,y)\n this.x = x;\n this.y = y;\n this.z = z;\n return this;\n }\n setScalar(scalar) {\n this.x = scalar;\n this.y = scalar;\n this.z = scalar;\n return this;\n }\n setX(x) {\n this.x = x;\n return this;\n }\n setY(y) {\n this.y = y;\n return this;\n }\n setZ(z) {\n this.z = z;\n return this;\n }\n setComponent(index, value) {\n switch (index) {\n case 0:\n this.x = value;\n break;\n case 1:\n this.y = value;\n break;\n case 2:\n this.z = value;\n break;\n default:\n throw new Error('index is out of range: ' + index);\n }\n return this;\n }\n getComponent(index) {\n switch (index) {\n case 0:\n return this.x;\n case 1:\n return this.y;\n case 2:\n return this.z;\n default:\n throw new Error('index is out of range: ' + index);\n }\n }\n clone() {\n return new Vector3(this.x, this.y, this.z);\n }\n copy(v) {\n this.x = v.x;\n this.y = v.y;\n this.z = v.z;\n return this;\n }\n add(v) {\n this.x += v.x;\n this.y += v.y;\n this.z += v.z;\n return this;\n }\n addScalar(s) {\n this.x += s;\n this.y += s;\n this.z += s;\n return this;\n }\n addVectors(a, b) {\n this.x = a.x + b.x;\n this.y = a.y + b.y;\n this.z = a.z + b.z;\n return this;\n }\n addScaledVector(v, s) {\n this.x += v.x * s;\n this.y += v.y * s;\n this.z += v.z * s;\n return this;\n }\n sub(v) {\n this.x -= v.x;\n this.y -= v.y;\n this.z -= v.z;\n return this;\n }\n subScalar(s) {\n this.x -= s;\n this.y -= s;\n this.z -= s;\n return this;\n }\n subVectors(a, b) {\n this.x = a.x - b.x;\n this.y = a.y - b.y;\n this.z = a.z - b.z;\n return this;\n }\n multiply(v) {\n this.x *= v.x;\n this.y *= v.y;\n this.z *= v.z;\n return this;\n }\n multiplyScalar(scalar) {\n this.x *= scalar;\n this.y *= scalar;\n this.z *= scalar;\n return this;\n }\n multiplyVectors(a, b) {\n this.x = a.x * b.x;\n this.y = a.y * b.y;\n this.z = a.z * b.z;\n return this;\n }\n applyEuler(euler) {\n return this.applyQuaternion(_quaternion$1.setFromEuler(euler));\n }\n applyAxisAngle(axis, angle) {\n return this.applyQuaternion(_quaternion$1.setFromAxisAngle(axis, angle));\n }\n applyMatrix3(m) {\n const x = this.x, y = this.y, z = this.z;\n const e = m.elements;\n this.x = e[0] * x + e[3] * y + e[6] * z;\n this.y = e[1] * x + e[4] * y + e[7] * z;\n this.z = e[2] * x + e[5] * y + e[8] * z;\n return this;\n }\n applyNormalMatrix(m) {\n return this.applyMatrix3(m).normalize();\n }\n applyMatrix4(m) {\n const x = this.x, y = this.y, z = this.z;\n const e = m.elements;\n const w = 1 / (e[3] * x + e[7] * y + e[11] * z + e[15]);\n this.x = (e[0] * x + e[4] * y + e[8] * z + e[12]) * w;\n this.y = (e[1] * x + e[5] * y + e[9] * z + e[13]) * w;\n this.z = (e[2] * x + e[6] * y + e[10] * z + e[14]) * w;\n return this;\n }\n applyQuaternion(q) {\n // quaternion q is assumed to have unit length\n const vx = this.x, vy = this.y, vz = this.z;\n const qx = q.x, qy = q.y, qz = q.z, qw = q.w;\n // t = 2 * cross( q.xyz, v );\n const tx = 2 * (qy * vz - qz * vy);\n const ty = 2 * (qz * vx - qx * vz);\n const tz = 2 * (qx * vy - qy * vx);\n // v + q.w * t + cross( q.xyz, t );\n this.x = vx + qw * tx + qy * tz - qz * ty;\n this.y = vy + qw * ty + qz * tx - qx * tz;\n this.z = vz + qw * tz + qx * ty - qy * tx;\n return this;\n }\n /*project(camera: Camera) {\n return this.applyMatrix4(camera.matrixWorldInverse).applyMatrix4(camera.projectionMatrix);\n }\n\n unproject(camera: Camera) {\n return this.applyMatrix4(camera.projectionMatrixInverse).applyMatrix4(camera.matrixWorld);\n }*/\n transformDirection(m) {\n // input: ../math.Matrix4 affine matrix\n // vector interpreted as a direction\n const x = this.x, y = this.y, z = this.z;\n const e = m.elements;\n this.x = e[0] * x + e[4] * y + e[8] * z;\n this.y = e[1] * x + e[5] * y + e[9] * z;\n this.z = e[2] * x + e[6] * y + e[10] * z;\n return this.normalize();\n }\n divide(v) {\n this.x /= v.x;\n this.y /= v.y;\n this.z /= v.z;\n return this;\n }\n divideScalar(scalar) {\n return this.multiplyScalar(1 / scalar);\n }\n min(v) {\n this.x = Math.min(this.x, v.x);\n this.y = Math.min(this.y, v.y);\n this.z = Math.min(this.z, v.z);\n return this;\n }\n max(v) {\n this.x = Math.max(this.x, v.x);\n this.y = Math.max(this.y, v.y);\n this.z = Math.max(this.z, v.z);\n return this;\n }\n clamp(min, max) {\n // assumes min < max, componentwise\n this.x = Math.max(min.x, Math.min(max.x, this.x));\n this.y = Math.max(min.y, Math.min(max.y, this.y));\n this.z = Math.max(min.z, Math.min(max.z, this.z));\n return this;\n }\n clampScalar(minVal, maxVal) {\n this.x = Math.max(minVal, Math.min(maxVal, this.x));\n this.y = Math.max(minVal, Math.min(maxVal, this.y));\n this.z = Math.max(minVal, Math.min(maxVal, this.z));\n return this;\n }\n clampLength(min, max) {\n const length = this.length();\n return this.divideScalar(length || 1).multiplyScalar(Math.max(min, Math.min(max, length)));\n }\n floor() {\n this.x = Math.floor(this.x);\n this.y = Math.floor(this.y);\n this.z = Math.floor(this.z);\n return this;\n }\n ceil() {\n this.x = Math.ceil(this.x);\n this.y = Math.ceil(this.y);\n this.z = Math.ceil(this.z);\n return this;\n }\n round() {\n this.x = Math.round(this.x);\n this.y = Math.round(this.y);\n this.z = Math.round(this.z);\n return this;\n }\n roundToZero() {\n this.x = Math.trunc(this.x);\n this.y = Math.trunc(this.y);\n this.z = Math.trunc(this.z);\n return this;\n }\n negate() {\n this.x = -this.x;\n this.y = -this.y;\n this.z = -this.z;\n return this;\n }\n dot(v) {\n return this.x * v.x + this.y * v.y + this.z * v.z;\n }\n // TODO lengthSquared?\n lengthSq() {\n return this.x * this.x + this.y * this.y + this.z * this.z;\n }\n length() {\n return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z);\n }\n manhattanLength() {\n return Math.abs(this.x) + Math.abs(this.y) + Math.abs(this.z);\n }\n normalize() {\n return this.divideScalar(this.length() || 1);\n }\n setLength(length) {\n return this.normalize().multiplyScalar(length);\n }\n lerp(v, alpha) {\n this.x += (v.x - this.x) * alpha;\n this.y += (v.y - this.y) * alpha;\n this.z += (v.z - this.z) * alpha;\n return this;\n }\n lerpVectors(v1, v2, alpha) {\n this.x = v1.x + (v2.x - v1.x) * alpha;\n this.y = v1.y + (v2.y - v1.y) * alpha;\n this.z = v1.z + (v2.z - v1.z) * alpha;\n return this;\n }\n cross(v) {\n return this.crossVectors(this, v);\n }\n crossVectors(a, b) {\n const ax = a.x, ay = a.y, az = a.z;\n const bx = b.x, by = b.y, bz = b.z;\n this.x = ay * bz - az * by;\n this.y = az * bx - ax * bz;\n this.z = ax * by - ay * bx;\n return this;\n }\n projectOnVector(v) {\n const denominator = v.lengthSq();\n if (denominator === 0)\n return this.set(0, 0, 0);\n const scalar = v.dot(this) / denominator;\n return this.copy(v).multiplyScalar(scalar);\n }\n projectOnPlane(planeNormal) {\n _vector.copy(this).projectOnVector(planeNormal);\n return this.sub(_vector);\n }\n reflect(normal) {\n // reflect incident vector off plane orthogonal to normal\n // normal is assumed to have unit length\n return this.sub(_vector.copy(normal).multiplyScalar(2 * this.dot(normal)));\n }\n angleTo(v) {\n const denominator = Math.sqrt(this.lengthSq() * v.lengthSq());\n if (denominator === 0)\n return Math.PI / 2;\n const theta = this.dot(v) / denominator;\n // clamp, to handle numerical problems\n return Math.acos(clamp(theta, -1, 1));\n }\n distanceTo(v) {\n return Math.sqrt(this.distanceToSquared(v));\n }\n distanceToSquared(v) {\n const dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z;\n return dx * dx + dy * dy + dz * dz;\n }\n manhattanDistanceTo(v) {\n return Math.abs(this.x - v.x) + Math.abs(this.y - v.y) + Math.abs(this.z - v.z);\n }\n /*setFromSpherical(s) {\n return this.setFromSphericalCoords(s.radius, s.phi, s.theta);\n }*/\n setFromSphericalCoords(radius, phi, theta) {\n const sinPhiRadius = Math.sin(phi) * radius;\n this.x = sinPhiRadius * Math.sin(theta);\n this.y = Math.cos(phi) * radius;\n this.z = sinPhiRadius * Math.cos(theta);\n return this;\n }\n /*setFromCylindrical(c) {\n return this.setFromCylindricalCoords(c.radius, c.theta, c.y);\n }*/\n setFromCylindricalCoords(radius, theta, y) {\n this.x = radius * Math.sin(theta);\n this.y = y;\n this.z = radius * Math.cos(theta);\n return this;\n }\n setFromMatrixPosition(m) {\n const e = m.elements;\n this.x = e[12];\n this.y = e[13];\n this.z = e[14];\n return this;\n }\n setFromMatrixScale(m) {\n const sx = this.setFromMatrixColumn(m, 0).length();\n const sy = this.setFromMatrixColumn(m, 1).length();\n const sz = this.setFromMatrixColumn(m, 2).length();\n this.x = sx;\n this.y = sy;\n this.z = sz;\n return this;\n }\n setFromMatrixColumn(m, index) {\n return this.fromArray(m.elements, index * 4);\n }\n setFromMatrix3Column(m, index) {\n return this.fromArray(m.elements, index * 3);\n }\n setFromEuler(e) {\n this.x = e._x;\n this.y = e._y;\n this.z = e._z;\n return this;\n }\n /*setFromColor(c) {\n this.x = c.r;\n this.y = c.g;\n this.z = c.b;\n\n return this;\n }*/\n equals(v) {\n return v.x === this.x && v.y === this.y && v.z === this.z;\n }\n fromArray(array, offset = 0) {\n this.x = array[offset];\n this.y = array[offset + 1];\n this.z = array[offset + 2];\n return this;\n }\n toArray(array = [], offset = 0) {\n array[offset] = this.x;\n array[offset + 1] = this.y;\n array[offset + 2] = this.z;\n return array;\n }\n /*fromBufferAttribute(attribute, index) {\n this.x = attribute.getX(index);\n this.y = attribute.getY(index);\n this.z = attribute.getZ(index);\n\n return this;\n }*/\n random() {\n this.x = Math.random();\n this.y = Math.random();\n this.z = Math.random();\n return this;\n }\n randomDirection() {\n // https://mathworld.wolfram.com/SpherePointPicking.html\n const theta = Math.random() * Math.PI * 2;\n const u = Math.random() * 2 - 1;\n const c = Math.sqrt(1 - u * u);\n this.x = c * Math.cos(theta);\n this.y = u;\n this.z = c * Math.sin(theta);\n return this;\n }\n abs() {\n this.x = Math.abs(this.x);\n this.y = Math.abs(this.y);\n this.z = Math.abs(this.z);\n return this;\n }\n *[Symbol.iterator]() {\n yield this.x;\n yield this.y;\n yield this.z;\n }\n}\nVector3.prototype.isVector3 = true;\nconst _vector = /*@__PURE__*/ new Vector3();\nconst _quaternion$1 = /*@__PURE__*/ new Quaternion();\n\nconst WebGLCoordinateSystem = 2000;\nconst WebGPUCoordinateSystem = 2001;\nclass Matrix4 {\n constructor(n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44) {\n this.elements = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];\n if (n11 !== undefined) {\n this.set(n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44);\n }\n }\n /**\n * @deprecated Use {@link Matrix4#copyPosition .copyPosition()} instead.\n */\n extractPosition(m) {\n console.warn('THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().');\n return this.copyPosition(m);\n }\n /**\n * Sets this matrix to a x b and stores the result into the flat array r.\n * r can be either a regular Array or a TypedArray.\n *\n * @deprecated This method has been removed completely.\n */\n multiplyToArray(a, b, r) {\n console.error('THREE.Matrix4: .multiplyToArray() has been removed.');\n return this;\n }\n /**\n * @deprecated Use {@link Matrix4#makeRotationFromQuaternion .makeRotationFromQuaternion()} instead.\n */\n setRotationFromQuaternion(q) {\n return this.makeRotationFromQuaternion(q);\n }\n set(n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44) {\n const te = this.elements;\n te[0] = n11;\n te[4] = n12;\n te[8] = n13;\n te[12] = n14;\n te[1] = n21;\n te[5] = n22;\n te[9] = n23;\n te[13] = n24;\n te[2] = n31;\n te[6] = n32;\n te[10] = n33;\n te[14] = n34;\n te[3] = n41;\n te[7] = n42;\n te[11] = n43;\n te[15] = n44;\n return this;\n }\n identity() {\n this.set(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n return this;\n }\n clone() {\n return new Matrix4().fromArray(this.elements);\n }\n copy(m) {\n const te = this.elements;\n const me = m.elements;\n te[0] = me[0];\n te[1] = me[1];\n te[2] = me[2];\n te[3] = me[3];\n te[4] = me[4];\n te[5] = me[5];\n te[6] = me[6];\n te[7] = me[7];\n te[8] = me[8];\n te[9] = me[9];\n te[10] = me[10];\n te[11] = me[11];\n te[12] = me[12];\n te[13] = me[13];\n te[14] = me[14];\n te[15] = me[15];\n return this;\n }\n copyPosition(m) {\n const te = this.elements, me = m.elements;\n te[12] = me[12];\n te[13] = me[13];\n te[14] = me[14];\n return this;\n }\n setFromMatrix3(m) {\n const me = m.elements;\n this.set(me[0], me[3], me[6], 0, me[1], me[4], me[7], 0, me[2], me[5], me[8], 0, 0, 0, 0, 1);\n return this;\n }\n extractBasis(xAxis, yAxis, zAxis) {\n xAxis.setFromMatrixColumn(this, 0);\n yAxis.setFromMatrixColumn(this, 1);\n zAxis.setFromMatrixColumn(this, 2);\n return this;\n }\n makeBasis(xAxis, yAxis, zAxis) {\n this.set(xAxis.x, yAxis.x, zAxis.x, 0, xAxis.y, yAxis.y, zAxis.y, 0, xAxis.z, yAxis.z, zAxis.z, 0, 0, 0, 0, 1);\n return this;\n }\n extractRotation(m) {\n // this method does not support reflection matrices\n const te = this.elements;\n const me = m.elements;\n const scaleX = 1 / _v1.setFromMatrixColumn(m, 0).length();\n const scaleY = 1 / _v1.setFromMatrixColumn(m, 1).length();\n const scaleZ = 1 / _v1.setFromMatrixColumn(m, 2).length();\n te[0] = me[0] * scaleX;\n te[1] = me[1] * scaleX;\n te[2] = me[2] * scaleX;\n te[3] = 0;\n te[4] = me[4] * scaleY;\n te[5] = me[5] * scaleY;\n te[6] = me[6] * scaleY;\n te[7] = 0;\n te[8] = me[8] * scaleZ;\n te[9] = me[9] * scaleZ;\n te[10] = me[10] * scaleZ;\n te[11] = 0;\n te[12] = 0;\n te[13] = 0;\n te[14] = 0;\n te[15] = 1;\n return this;\n }\n makeRotationFromEuler(euler) {\n const te = this.elements;\n const x = euler.x, y = euler.y, z = euler.z;\n const a = Math.cos(x), b = Math.sin(x);\n const c = Math.cos(y), d = Math.sin(y);\n const e = Math.cos(z), f = Math.sin(z);\n if (euler.order === 'XYZ') {\n const ae = a * e, af = a * f, be = b * e, bf = b * f;\n te[0] = c * e;\n te[4] = -c * f;\n te[8] = d;\n te[1] = af + be * d;\n te[5] = ae - bf * d;\n te[9] = -b * c;\n te[2] = bf - ae * d;\n te[6] = be + af * d;\n te[10] = a * c;\n }\n else if (euler.order === 'YXZ') {\n const ce = c * e, cf = c * f, de = d * e, df = d * f;\n te[0] = ce + df * b;\n te[4] = de * b - cf;\n te[8] = a * d;\n te[1] = a * f;\n te[5] = a * e;\n te[9] = -b;\n te[2] = cf * b - de;\n te[6] = df + ce * b;\n te[10] = a * c;\n }\n else if (euler.order === 'ZXY') {\n const ce = c * e, cf = c * f, de = d * e, df = d * f;\n te[0] = ce - df * b;\n te[4] = -a * f;\n te[8] = de + cf * b;\n te[1] = cf + de * b;\n te[5] = a * e;\n te[9] = df - ce * b;\n te[2] = -a * d;\n te[6] = b;\n te[10] = a * c;\n }\n else if (euler.order === 'ZYX') {\n const ae = a * e, af = a * f, be = b * e, bf = b * f;\n te[0] = c * e;\n te[4] = be * d - af;\n te[8] = ae * d + bf;\n te[1] = c * f;\n te[5] = bf * d + ae;\n te[9] = af * d - be;\n te[2] = -d;\n te[6] = b * c;\n te[10] = a * c;\n }\n else if (euler.order === 'YZX') {\n const ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n te[0] = c * e;\n te[4] = bd - ac * f;\n te[8] = bc * f + ad;\n te[1] = f;\n te[5] = a * e;\n te[9] = -b * e;\n te[2] = -d * e;\n te[6] = ad * f + bc;\n te[10] = ac - bd * f;\n }\n else if (euler.order === 'XZY') {\n const ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n te[0] = c * e;\n te[4] = -f;\n te[8] = d * e;\n te[1] = ac * f + bd;\n te[5] = a * e;\n te[9] = ad * f - bc;\n te[2] = bc * f - ad;\n te[6] = b * e;\n te[10] = bd * f + ac;\n }\n // bottom row\n te[3] = 0;\n te[7] = 0;\n te[11] = 0;\n // last column\n te[12] = 0;\n te[13] = 0;\n te[14] = 0;\n te[15] = 1;\n return this;\n }\n makeRotationFromQuaternion(q) {\n return this.compose(_zero, q, _one);\n }\n lookAt(eye, target, up) {\n const te = this.elements;\n _z.subVectors(eye, target);\n if (_z.lengthSq() === 0) {\n // eye and target are in the same position\n _z.z = 1;\n }\n _z.normalize();\n _x.crossVectors(up, _z);\n if (_x.lengthSq() === 0) {\n // up and z are parallel\n if (Math.abs(up.z) === 1) {\n _z.x += 0.0001;\n }\n else {\n _z.z += 0.0001;\n }\n _z.normalize();\n _x.crossVectors(up, _z);\n }\n _x.normalize();\n _y.crossVectors(_z, _x);\n te[0] = _x.x;\n te[4] = _y.x;\n te[8] = _z.x;\n te[1] = _x.y;\n te[5] = _y.y;\n te[9] = _z.y;\n te[2] = _x.z;\n te[6] = _y.z;\n te[10] = _z.z;\n return this;\n }\n multiply(m) {\n return this.multiplyMatrices(this, m);\n }\n premultiply(m) {\n return this.multiplyMatrices(m, this);\n }\n multiplyMatrices(a, b) {\n const ae = a.elements;\n const be = b.elements;\n const te = this.elements;\n const a11 = ae[0], a12 = ae[4], a13 = ae[8], a14 = ae[12];\n const a21 = ae[1], a22 = ae[5], a23 = ae[9], a24 = ae[13];\n const a31 = ae[2], a32 = ae[6], a33 = ae[10], a34 = ae[14];\n const a41 = ae[3], a42 = ae[7], a43 = ae[11], a44 = ae[15];\n const b11 = be[0], b12 = be[4], b13 = be[8], b14 = be[12];\n const b21 = be[1], b22 = be[5], b23 = be[9], b24 = be[13];\n const b31 = be[2], b32 = be[6], b33 = be[10], b34 = be[14];\n const b41 = be[3], b42 = be[7], b43 = be[11], b44 = be[15];\n te[0] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;\n te[4] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;\n te[8] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;\n te[12] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;\n te[1] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;\n te[5] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;\n te[9] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;\n te[13] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;\n te[2] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;\n te[6] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;\n te[10] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;\n te[14] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;\n te[3] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;\n te[7] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;\n te[11] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;\n te[15] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;\n return this;\n }\n multiplyScalar(s) {\n const te = this.elements;\n te[0] *= s;\n te[4] *= s;\n te[8] *= s;\n te[12] *= s;\n te[1] *= s;\n te[5] *= s;\n te[9] *= s;\n te[13] *= s;\n te[2] *= s;\n te[6] *= s;\n te[10] *= s;\n te[14] *= s;\n te[3] *= s;\n te[7] *= s;\n te[11] *= s;\n te[15] *= s;\n return this;\n }\n determinant() {\n const te = this.elements;\n const n11 = te[0], n12 = te[4], n13 = te[8], n14 = te[12];\n const n21 = te[1], n22 = te[5], n23 = te[9], n24 = te[13];\n const n31 = te[2], n32 = te[6], n33 = te[10], n34 = te[14];\n const n41 = te[3], n42 = te[7], n43 = te[11], n44 = te[15];\n //TODO: make this more efficient\n //( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm )\n return (n41 *\n (+n14 * n23 * n32 -\n n13 * n24 * n32 -\n n14 * n22 * n33 +\n n12 * n24 * n33 +\n n13 * n22 * n34 -\n n12 * n23 * n34) +\n n42 *\n (+n11 * n23 * n34 -\n n11 * n24 * n33 +\n n14 * n21 * n33 -\n n13 * n21 * n34 +\n n13 * n24 * n31 -\n n14 * n23 * n31) +\n n43 *\n (+n11 * n24 * n32 -\n n11 * n22 * n34 -\n n14 * n21 * n32 +\n n12 * n21 * n34 +\n n14 * n22 * n31 -\n n12 * n24 * n31) +\n n44 *\n (-n13 * n22 * n31 -\n n11 * n23 * n32 +\n n11 * n22 * n33 +\n n13 * n21 * n32 -\n n12 * n21 * n33 +\n n12 * n23 * n31));\n }\n transpose() {\n const te = this.elements;\n let tmp;\n tmp = te[1];\n te[1] = te[4];\n te[4] = tmp;\n tmp = te[2];\n te[2] = te[8];\n te[8] = tmp;\n tmp = te[6];\n te[6] = te[9];\n te[9] = tmp;\n tmp = te[3];\n te[3] = te[12];\n te[12] = tmp;\n tmp = te[7];\n te[7] = te[13];\n te[13] = tmp;\n tmp = te[11];\n te[11] = te[14];\n te[14] = tmp;\n return this;\n }\n setPosition(x, y, z) {\n const te = this.elements;\n if (x.isVector3) {\n te[12] = x.x;\n te[13] = x.y;\n te[14] = x.z;\n }\n else {\n te[12] = x;\n te[13] = y;\n te[14] = z;\n }\n return this;\n }\n invert() {\n // based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm\n const te = this.elements, n11 = te[0], n21 = te[1], n31 = te[2], n41 = te[3], n12 = te[4], n22 = te[5], n32 = te[6], n42 = te[7], n13 = te[8], n23 = te[9], n33 = te[10], n43 = te[11], n14 = te[12], n24 = te[13], n34 = te[14], n44 = te[15], t11 = n23 * n34 * n42 -\n n24 * n33 * n42 +\n n24 * n32 * n43 -\n n22 * n34 * n43 -\n n23 * n32 * n44 +\n n22 * n33 * n44, t12 = n14 * n33 * n42 -\n n13 * n34 * n42 -\n n14 * n32 * n43 +\n n12 * n34 * n43 +\n n13 * n32 * n44 -\n n12 * n33 * n44, t13 = n13 * n24 * n42 -\n n14 * n23 * n42 +\n n14 * n22 * n43 -\n n12 * n24 * n43 -\n n13 * n22 * n44 +\n n12 * n23 * n44, t14 = n14 * n23 * n32 -\n n13 * n24 * n32 -\n n14 * n22 * n33 +\n n12 * n24 * n33 +\n n13 * n22 * n34 -\n n12 * n23 * n34;\n const det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;\n if (det === 0)\n return this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);\n const detInv = 1 / det;\n te[0] = t11 * detInv;\n te[1] =\n (n24 * n33 * n41 -\n n23 * n34 * n41 -\n n24 * n31 * n43 +\n n21 * n34 * n43 +\n n23 * n31 * n44 -\n n21 * n33 * n44) *\n detInv;\n te[2] =\n (n22 * n34 * n41 -\n n24 * n32 * n41 +\n n24 * n31 * n42 -\n n21 * n34 * n42 -\n n22 * n31 * n44 +\n n21 * n32 * n44) *\n detInv;\n te[3] =\n (n23 * n32 * n41 -\n n22 * n33 * n41 -\n n23 * n31 * n42 +\n n21 * n33 * n42 +\n n22 * n31 * n43 -\n n21 * n32 * n43) *\n detInv;\n te[4] = t12 * detInv;\n te[5] =\n (n13 * n34 * n41 -\n n14 * n33 * n41 +\n n14 * n31 * n43 -\n n11 * n34 * n43 -\n n13 * n31 * n44 +\n n11 * n33 * n44) *\n detInv;\n te[6] =\n (n14 * n32 * n41 -\n n12 * n34 * n41 -\n n14 * n31 * n42 +\n n11 * n34 * n42 +\n n12 * n31 * n44 -\n n11 * n32 * n44) *\n detInv;\n te[7] =\n (n12 * n33 * n41 -\n n13 * n32 * n41 +\n n13 * n31 * n42 -\n n11 * n33 * n42 -\n n12 * n31 * n43 +\n n11 * n32 * n43) *\n detInv;\n te[8] = t13 * detInv;\n te[9] =\n (n14 * n23 * n41 -\n n13 * n24 * n41 -\n n14 * n21 * n43 +\n n11 * n24 * n43 +\n n13 * n21 * n44 -\n n11 * n23 * n44) *\n detInv;\n te[10] =\n (n12 * n24 * n41 -\n n14 * n22 * n41 +\n n14 * n21 * n42 -\n n11 * n24 * n42 -\n n12 * n21 * n44 +\n n11 * n22 * n44) *\n detInv;\n te[11] =\n (n13 * n22 * n41 -\n n12 * n23 * n41 -\n n13 * n21 * n42 +\n n11 * n23 * n42 +\n n12 * n21 * n43 -\n n11 * n22 * n43) *\n detInv;\n te[12] = t14 * detInv;\n te[13] =\n (n13 * n24 * n31 -\n n14 * n23 * n31 +\n n14 * n21 * n33 -\n n11 * n24 * n33 -\n n13 * n21 * n34 +\n n11 * n23 * n34) *\n detInv;\n te[14] =\n (n14 * n22 * n31 -\n n12 * n24 * n31 -\n n14 * n21 * n32 +\n n11 * n24 * n32 +\n n12 * n21 * n34 -\n n11 * n22 * n34) *\n detInv;\n te[15] =\n (n12 * n23 * n31 -\n n13 * n22 * n31 +\n n13 * n21 * n32 -\n n11 * n23 * n32 -\n n12 * n21 * n33 +\n n11 * n22 * n33) *\n detInv;\n return this;\n }\n scale(v) {\n const te = this.elements;\n const x = v.x, y = v.y, z = v.z;\n te[0] *= x;\n te[4] *= y;\n te[8] *= z;\n te[1] *= x;\n te[5] *= y;\n te[9] *= z;\n te[2] *= x;\n te[6] *= y;\n te[10] *= z;\n te[3] *= x;\n te[7] *= y;\n te[11] *= z;\n return this;\n }\n getMaxScaleOnAxis() {\n const te = this.elements;\n const scaleXSq = te[0] * te[0] + te[1] * te[1] + te[2] * te[2];\n const scaleYSq = te[4] * te[4] + te[5] * te[5] + te[6] * te[6];\n const scaleZSq = te[8] * te[8] + te[9] * te[9] + te[10] * te[10];\n return Math.sqrt(Math.max(scaleXSq, scaleYSq, scaleZSq));\n }\n makeTranslation(x, y, z) {\n if (x.isVector3) {\n this.set(1, 0, 0, x.x, 0, 1, 0, x.y, 0, 0, 1, x.z, 0, 0, 0, 1);\n }\n else {\n this.set(1, 0, 0, x, 0, 1, 0, y, 0, 0, 1, z, 0, 0, 0, 1);\n }\n return this;\n }\n makeRotationX(theta) {\n const c = Math.cos(theta), s = Math.sin(theta);\n this.set(1, 0, 0, 0, 0, c, -s, 0, 0, s, c, 0, 0, 0, 0, 1);\n return this;\n }\n makeRotationY(theta) {\n const c = Math.cos(theta), s = Math.sin(theta);\n this.set(c, 0, s, 0, 0, 1, 0, 0, -s, 0, c, 0, 0, 0, 0, 1);\n return this;\n }\n makeRotationZ(theta) {\n const c = Math.cos(theta), s = Math.sin(theta);\n this.set(c, -s, 0, 0, s, c, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n return this;\n }\n makeRotationAxis(axis, angle) {\n // Based on http://www.gamedev.net/reference/articles/article1199.asp\n const c = Math.cos(angle);\n const s = Math.sin(angle);\n const t = 1 - c;\n const x = axis.x, y = axis.y, z = axis.z;\n const tx = t * x, ty = t * y;\n this.set(tx * x + c, tx * y - s * z, tx * z + s * y, 0, tx * y + s * z, ty * y + c, ty * z - s * x, 0, tx * z - s * y, ty * z + s * x, t * z * z + c, 0, 0, 0, 0, 1);\n return this;\n }\n makeScale(x, y, z) {\n this.set(x, 0, 0, 0, 0, y, 0, 0, 0, 0, z, 0, 0, 0, 0, 1);\n return this;\n }\n makeShear(xy, xz, yx, yz, zx, zy) {\n this.set(1, yx, zx, 0, xy, 1, zy, 0, xz, yz, 1, 0, 0, 0, 0, 1);\n return this;\n }\n compose(position, quaternion, scale) {\n const te = this.elements;\n const x = quaternion._x, y = quaternion._y, z = quaternion._z, w = quaternion._w;\n const x2 = x + x, y2 = y + y, z2 = z + z;\n const xx = x * x2, xy = x * y2, xz = x * z2;\n const yy = y * y2, yz = y * z2, zz = z * z2;\n const wx = w * x2, wy = w * y2, wz = w * z2;\n const sx = scale.x, sy = scale.y, sz = scale.z;\n te[0] = (1 - (yy + zz)) * sx;\n te[1] = (xy + wz) * sx;\n te[2] = (xz - wy) * sx;\n te[3] = 0;\n te[4] = (xy - wz) * sy;\n te[5] = (1 - (xx + zz)) * sy;\n te[6] = (yz + wx) * sy;\n te[7] = 0;\n te[8] = (xz + wy) * sz;\n te[9] = (yz - wx) * sz;\n te[10] = (1 - (xx + yy)) * sz;\n te[11] = 0;\n te[12] = position.x;\n te[13] = position.y;\n te[14] = position.z;\n te[15] = 1;\n return this;\n }\n decompose(position, quaternion, scale) {\n const te = this.elements;\n let sx = _v1.set(te[0], te[1], te[2]).length();\n const sy = _v1.set(te[4], te[5], te[6]).length();\n const sz = _v1.set(te[8], te[9], te[10]).length();\n // if determine is negative, we need to invert one scale\n const det = this.determinant();\n if (det < 0)\n sx = -sx;\n position.x = te[12];\n position.y = te[13];\n position.z = te[14];\n // scale the rotation part\n _m1.copy(this);\n const invSX = 1 / sx;\n const invSY = 1 / sy;\n const invSZ = 1 / sz;\n _m1.elements[0] *= invSX;\n _m1.elements[1] *= invSX;\n _m1.elements[2] *= invSX;\n _m1.elements[4] *= invSY;\n _m1.elements[5] *= invSY;\n _m1.elements[6] *= invSY;\n _m1.elements[8] *= invSZ;\n _m1.elements[9] *= invSZ;\n _m1.elements[10] *= invSZ;\n quaternion.setFromRotationMatrix(_m1);\n scale.x = sx;\n scale.y = sy;\n scale.z = sz;\n return this;\n }\n makePerspective(left, right, top, bottom, near, far, coordinateSystem = WebGLCoordinateSystem) {\n const te = this.elements;\n const x = (2 * near) / (right - left);\n const y = (2 * near) / (top - bottom);\n const a = (right + left) / (right - left);\n const b = (top + bottom) / (top - bottom);\n let c, d;\n if (coordinateSystem === WebGLCoordinateSystem) {\n c = -(far + near) / (far - near);\n d = (-2 * far * near) / (far - near);\n }\n else if (coordinateSystem === WebGPUCoordinateSystem) {\n c = -far / (far - near);\n d = (-far * near) / (far - near);\n }\n else {\n throw new Error('Matrix4.makePerspective(): Invalid coordinate system: ' + coordinateSystem);\n }\n te[0] = x;\n te[4] = 0;\n te[8] = a;\n te[12] = 0;\n te[1] = 0;\n te[5] = y;\n te[9] = b;\n te[13] = 0;\n te[2] = 0;\n te[6] = 0;\n te[10] = c;\n te[14] = d;\n te[3] = 0;\n te[7] = 0;\n te[11] = -1;\n te[15] = 0;\n return this;\n }\n makeOrthographic(left, right, top, bottom, near, far, coordinateSystem = WebGLCoordinateSystem) {\n const te = this.elements;\n const w = 1.0 / (right - left);\n const h = 1.0 / (top - bottom);\n const p = 1.0 / (far - near);\n const x = (right + left) * w;\n const y = (top + bottom) * h;\n let z, zInv;\n if (coordinateSystem === WebGLCoordinateSystem) {\n z = (far + near) * p;\n zInv = -2 * p;\n }\n else if (coordinateSystem === WebGPUCoordinateSystem) {\n z = near * p;\n zInv = -1 * p;\n }\n else {\n throw new Error('../math.Matrix4.makeOrthographic(): Invalid coordinate system: ' + coordinateSystem);\n }\n te[0] = 2 * w;\n te[4] = 0;\n te[8] = 0;\n te[12] = -x;\n te[1] = 0;\n te[5] = 2 * h;\n te[9] = 0;\n te[13] = -y;\n te[2] = 0;\n te[6] = 0;\n te[10] = zInv;\n te[14] = -z;\n te[3] = 0;\n te[7] = 0;\n te[11] = 0;\n te[15] = 1;\n return this;\n }\n equals(matrix) {\n const te = this.elements;\n const me = matrix.elements;\n for (let i = 0; i < 16; i++) {\n if (te[i] !== me[i])\n return false;\n }\n return true;\n }\n fromArray(array, offset = 0) {\n for (let i = 0; i < 16; i++) {\n this.elements[i] = array[i + offset];\n }\n return this;\n }\n toArray(array = [], offset = 0) {\n const te = this.elements;\n array[offset] = te[0];\n array[offset + 1] = te[1];\n array[offset + 2] = te[2];\n array[offset + 3] = te[3];\n array[offset + 4] = te[4];\n array[offset + 5] = te[5];\n array[offset + 6] = te[6];\n array[offset + 7] = te[7];\n array[offset + 8] = te[8];\n array[offset + 9] = te[9];\n array[offset + 10] = te[10];\n array[offset + 11] = te[11];\n array[offset + 12] = te[12];\n array[offset + 13] = te[13];\n array[offset + 14] = te[14];\n array[offset + 15] = te[15];\n return array;\n }\n}\nMatrix4.prototype.isMatrix4 = true;\nconst _v1 = /*@__PURE__*/ new Vector3();\nconst _m1 = /*@__PURE__*/ new Matrix4();\nconst _zero = /*@__PURE__*/ new Vector3(0, 0, 0);\nconst _one = /*@__PURE__*/ new Vector3(1, 1, 1);\nconst _x = /*@__PURE__*/ new Vector3();\nconst _y = /*@__PURE__*/ new Vector3();\nconst _z = /*@__PURE__*/ new Vector3();\n\nconst _matrix = /*@__PURE__*/ new Matrix4();\nconst _quaternion = /*@__PURE__*/ new Quaternion();\nclass Euler {\n constructor(x = 0, y = 0, z = 0, order = Euler.DEFAULT_ORDER) {\n this._x = x;\n this._y = y;\n this._z = z;\n this._order = order;\n }\n get x() {\n return this._x;\n }\n set x(value) {\n this._x = value;\n this._onChangeCallback();\n }\n get y() {\n return this._y;\n }\n set y(value) {\n this._y = value;\n this._onChangeCallback();\n }\n get z() {\n return this._z;\n }\n set z(value) {\n this._z = value;\n this._onChangeCallback();\n }\n get order() {\n return this._order;\n }\n set order(value) {\n this._order = value;\n this._onChangeCallback();\n }\n set(x, y, z, order = this._order) {\n this._x = x;\n this._y = y;\n this._z = z;\n this._order = order;\n this._onChangeCallback();\n return this;\n }\n clone() {\n return new Euler(this._x, this._y, this._z, this._order);\n }\n copy(euler) {\n this._x = euler._x;\n this._y = euler._y;\n this._z = euler._z;\n this._order = euler._order;\n this._onChangeCallback();\n return this;\n }\n setFromRotationMatrix(m, order = this._order, update = true) {\n // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n const te = m.elements;\n const m11 = te[0], m12 = te[4], m13 = te[8];\n const m21 = te[1], m22 = te[5], m23 = te[9];\n const m31 = te[2], m32 = te[6], m33 = te[10];\n switch (order) {\n case 'XYZ':\n this._y = Math.asin(clamp(m13, -1, 1));\n if (Math.abs(m13) < 0.9999999) {\n this._x = Math.atan2(-m23, m33);\n this._z = Math.atan2(-m12, m11);\n }\n else {\n this._x = Math.atan2(m32, m22);\n this._z = 0;\n }\n break;\n case 'YXZ':\n this._x = Math.asin(-clamp(m23, -1, 1));\n if (Math.abs(m23) < 0.9999999) {\n this._y = Math.atan2(m13, m33);\n this._z = Math.atan2(m21, m22);\n }\n else {\n this._y = Math.atan2(-m31, m11);\n this._z = 0;\n }\n break;\n case 'ZXY':\n this._x = Math.asin(clamp(m32, -1, 1));\n if (Math.abs(m32) < 0.9999999) {\n this._y = Math.atan2(-m31, m33);\n this._z = Math.atan2(-m12, m22);\n }\n else {\n this._y = 0;\n this._z = Math.atan2(m21, m11);\n }\n break;\n case 'ZYX':\n this._y = Math.asin(-clamp(m31, -1, 1));\n if (Math.abs(m31) < 0.9999999) {\n this._x = Math.atan2(m32, m33);\n this._z = Math.atan2(m21, m11);\n }\n else {\n this._x = 0;\n this._z = Math.atan2(-m12, m22);\n }\n break;\n case 'YZX':\n this._z = Math.asin(clamp(m21, -1, 1));\n if (Math.abs(m21) < 0.9999999) {\n this._x = Math.atan2(-m23, m22);\n this._y = Math.atan2(-m31, m11);\n }\n else {\n this._x = 0;\n this._y = Math.atan2(m13, m33);\n }\n break;\n case 'XZY':\n this._z = Math.asin(-clamp(m12, -1, 1));\n if (Math.abs(m12) < 0.9999999) {\n this._x = Math.atan2(m32, m22);\n this._y = Math.atan2(m13, m11);\n }\n else {\n this._x = Math.atan2(-m23, m33);\n this._y = 0;\n }\n break;\n default:\n console.warn('../math.Euler: .setFromRotationMatrix() encountered an unknown order: ' + order);\n }\n this._order = order;\n if (update === true)\n this._onChangeCallback();\n return this;\n }\n setFromQuaternion(q, order, update) {\n _matrix.makeRotationFromQuaternion(q);\n return this.setFromRotationMatrix(_matrix, order, update);\n }\n setFromVector3(v, order = this._order) {\n return this.set(v.x, v.y, v.z, order);\n }\n reorder(newOrder) {\n // WARNING: this discards revolution information -bhouston\n _quaternion.setFromEuler(this);\n return this.setFromQuaternion(_quaternion, newOrder);\n }\n equals(euler) {\n return euler._x === this._x && euler._y === this._y && euler._z === this._z && euler._order === this._order;\n }\n fromArray(array) {\n this._x = array[0];\n this._y = array[1];\n this._z = array[2];\n if (array[3] !== undefined)\n this._order = array[3];\n this._onChangeCallback();\n return this;\n }\n toArray(array = [], offset = 0) {\n array[offset] = this._x;\n array[offset + 1] = this._y;\n array[offset + 2] = this._z;\n array[offset + 3] = this._order;\n return array;\n }\n _onChange(callback) {\n this._onChangeCallback = callback;\n return this;\n }\n _onChangeCallback(euler) { }\n *[Symbol.iterator]() {\n yield this._x;\n yield this._y;\n yield this._z;\n yield this._order;\n }\n}\nEuler.DEFAULT_ORDER = 'XYZ';\nEuler.prototype.isEuler = true;\n\nclass Matrix3 {\n constructor(n11, n12, n13, n21, n22, n23, n31, n32, n33) {\n this.elements = [1, 0, 0, 0, 1, 0, 0, 0, 1];\n if (n11 !== undefined) {\n this.set(n11, n12, n13, n21, n22, n23, n31, n32, n33);\n }\n }\n set(n11, n12, n13, n21, n22, n23, n31, n32, n33) {\n const te = this.elements;\n te[0] = n11;\n te[1] = n21;\n te[2] = n31;\n te[3] = n12;\n te[4] = n22;\n te[5] = n32;\n te[6] = n13;\n te[7] = n23;\n te[8] = n33;\n return this;\n }\n identity() {\n this.set(1, 0, 0, 0, 1, 0, 0, 0, 1);\n return this;\n }\n copy(m) {\n const te = this.elements;\n const me = m.elements;\n te[0] = me[0];\n te[1] = me[1];\n te[2] = me[2];\n te[3] = me[3];\n te[4] = me[4];\n te[5] = me[5];\n te[6] = me[6];\n te[7] = me[7];\n te[8] = me[8];\n return this;\n }\n extractBasis(xAxis, yAxis, zAxis) {\n xAxis.setFromMatrix3Column(this, 0);\n yAxis.setFromMatrix3Column(this, 1);\n zAxis.setFromMatrix3Column(this, 2);\n return this;\n }\n setFromMatrix4(m) {\n const me = m.elements;\n this.set(me[0], me[4], me[8], me[1], me[5], me[9], me[2], me[6], me[10]);\n return this;\n }\n multiply(m) {\n return this.multiplyMatrices(this, m);\n }\n premultiply(m) {\n return this.multiplyMatrices(m, this);\n }\n multiplyMatrices(a, b) {\n const ae = a.elements;\n const be = b.elements;\n const te = this.elements;\n const a11 = ae[0], a12 = ae[3], a13 = ae[6];\n const a21 = ae[1], a22 = ae[4], a23 = ae[7];\n const a31 = ae[2], a32 = ae[5], a33 = ae[8];\n const b11 = be[0], b12 = be[3], b13 = be[6];\n const b21 = be[1], b22 = be[4], b23 = be[7];\n const b31 = be[2], b32 = be[5], b33 = be[8];\n te[0] = a11 * b11 + a12 * b21 + a13 * b31;\n te[3] = a11 * b12 + a12 * b22 + a13 * b32;\n te[6] = a11 * b13 + a12 * b23 + a13 * b33;\n te[1] = a21 * b11 + a22 * b21 + a23 * b31;\n te[4] = a21 * b12 + a22 * b22 + a23 * b32;\n te[7] = a21 * b13 + a22 * b23 + a23 * b33;\n te[2] = a31 * b11 + a32 * b21 + a33 * b31;\n te[5] = a31 * b12 + a32 * b22 + a33 * b32;\n te[8] = a31 * b13 + a32 * b23 + a33 * b33;\n return this;\n }\n multiplyScalar(s) {\n const te = this.elements;\n te[0] *= s;\n te[3] *= s;\n te[6] *= s;\n te[1] *= s;\n te[4] *= s;\n te[7] *= s;\n te[2] *= s;\n te[5] *= s;\n te[8] *= s;\n return this;\n }\n determinant() {\n const te = this.elements;\n const a = te[0], b = te[1], c = te[2], d = te[3], e = te[4], f = te[5], g = te[6], h = te[7], i = te[8];\n return a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g;\n }\n invert() {\n const te = this.elements, n11 = te[0], n21 = te[1], n31 = te[2], n12 = te[3], n22 = te[4], n32 = te[5], n13 = te[6], n23 = te[7], n33 = te[8], t11 = n33 * n22 - n32 * n23, t12 = n32 * n13 - n33 * n12, t13 = n23 * n12 - n22 * n13, det = n11 * t11 + n21 * t12 + n31 * t13;\n if (det === 0)\n return this.set(0, 0, 0, 0, 0, 0, 0, 0, 0);\n const detInv = 1 / det;\n te[0] = t11 * detInv;\n te[1] = (n31 * n23 - n33 * n21) * detInv;\n te[2] = (n32 * n21 - n31 * n22) * detInv;\n te[3] = t12 * detInv;\n te[4] = (n33 * n11 - n31 * n13) * detInv;\n te[5] = (n31 * n12 - n32 * n11) * detInv;\n te[6] = t13 * detInv;\n te[7] = (n21 * n13 - n23 * n11) * detInv;\n te[8] = (n22 * n11 - n21 * n12) * detInv;\n return this;\n }\n transpose() {\n let tmp;\n const m = this.elements;\n tmp = m[1];\n m[1] = m[3];\n m[3] = tmp;\n tmp = m[2];\n m[2] = m[6];\n m[6] = tmp;\n tmp = m[5];\n m[5] = m[7];\n m[7] = tmp;\n return this;\n }\n getNormalMatrix(matrix4) {\n return this.setFromMatrix4(matrix4).invert().transpose();\n }\n transposeIntoArray(r) {\n const m = this.elements;\n r[0] = m[0];\n r[1] = m[3];\n r[2] = m[6];\n r[3] = m[1];\n r[4] = m[4];\n r[5] = m[7];\n r[6] = m[2];\n r[7] = m[5];\n r[8] = m[8];\n return this;\n }\n setUvTransform(tx, ty, sx, sy, rotation, cx, cy) {\n const c = Math.cos(rotation);\n const s = Math.sin(rotation);\n this.set(sx * c, sx * s, -sx * (c * cx + s * cy) + cx + tx, -sy * s, sy * c, -sy * (-s * cx + c * cy) + cy + ty, 0, 0, 1);\n return this;\n }\n //\n scale(sx, sy) {\n this.premultiply(_m3.makeScale(sx, sy));\n return this;\n }\n rotate(theta) {\n this.premultiply(_m3.makeRotation(-theta));\n return this;\n }\n translate(tx, ty) {\n this.premultiply(_m3.makeTranslation(tx, ty));\n return this;\n }\n // for 2D Transforms\n makeTranslation(x, y) {\n if (x.isVector2) {\n this.set(1, 0, x.x, 0, 1, x.y, 0, 0, 1);\n }\n else {\n this.set(1, 0, x, 0, 1, y, 0, 0, 1);\n }\n return this;\n }\n makeRotation(theta) {\n // counterclockwise\n const c = Math.cos(theta);\n const s = Math.sin(theta);\n this.set(c, -s, 0, s, c, 0, 0, 0, 1);\n return this;\n }\n makeScale(x, y) {\n this.set(x, 0, 0, 0, y, 0, 0, 0, 1);\n return this;\n }\n //\n equals(matrix) {\n const te = this.elements;\n const me = matrix.elements;\n for (let i = 0; i < 9; i++) {\n if (te[i] !== me[i])\n return false;\n }\n return true;\n }\n fromArray(array, offset = 0) {\n for (let i = 0; i < 9; i++) {\n this.elements[i] = array[i + offset];\n }\n return this;\n }\n toArray(array = [], offset = 0) {\n const te = this.elements;\n array[offset] = te[0];\n array[offset + 1] = te[1];\n array[offset + 2] = te[2];\n array[offset + 3] = te[3];\n array[offset + 4] = te[4];\n array[offset + 5] = te[5];\n array[offset + 6] = te[6];\n array[offset + 7] = te[7];\n array[offset + 8] = te[8];\n return array;\n }\n clone() {\n return new Matrix3().fromArray(this.elements);\n }\n}\nMatrix3.prototype.isMatrix3 = true;\nconst _m3 = /*@__PURE__*/ new Matrix3();\n\n/** See Vector3View: absorbs the base constructor's writes before binding. */\nconst UNBOUND$2 = new Float32Array(4);\n/**\n * A `Quaternion` whose components live in a shared `Float32Array` at a fixed\n * offset. Every `Quaternion` method reads and writes `_x` .. `_w`, so replacing\n * those four with accessors inherits the whole API; they are installed on the\n * prototype because TypeScript forbids overriding an inherited property with\n * an accessor in the class body (TS2611).\n */\nclass QuaternionView extends Quaternion {\n constructor(data, offset) {\n super();\n this.data = data;\n this.offset = offset;\n }\n /** Points the view at a new backing array and row offset. */\n bind(data, offset) {\n this.data = data;\n this.offset = offset;\n }\n}\nconst prototype$2 = QuaternionView.prototype;\nprototype$2.data = UNBOUND$2;\nprototype$2.offset = 0;\nObject.defineProperties(QuaternionView.prototype, {\n _x: {\n get() {\n return this.data[this.offset];\n },\n set(value) {\n this.data[this.offset] = value;\n },\n },\n _y: {\n get() {\n return this.data[this.offset + 1];\n },\n set(value) {\n this.data[this.offset + 1] = value;\n },\n },\n _z: {\n get() {\n return this.data[this.offset + 2];\n },\n set(value) {\n this.data[this.offset + 2] = value;\n },\n },\n _w: {\n get() {\n return this.data[this.offset + 3];\n },\n set(value) {\n this.data[this.offset + 3] = value;\n },\n },\n});\n\nclass Vector2 {\n constructor(x = 0, y = 0) {\n this.x = x;\n this.y = y;\n }\n get width() {\n return this.x;\n }\n set width(value) {\n this.x = value;\n }\n get height() {\n return this.y;\n }\n set height(value) {\n this.y = value;\n }\n set(x, y) {\n this.x = x;\n this.y = y;\n return this;\n }\n setScalar(scalar) {\n this.x = scalar;\n this.y = scalar;\n return this;\n }\n setX(x) {\n this.x = x;\n return this;\n }\n setY(y) {\n this.y = y;\n return this;\n }\n setComponent(index, value) {\n switch (index) {\n case 0:\n this.x = value;\n break;\n case 1:\n this.y = value;\n break;\n default:\n throw new Error('index is out of range: ' + index);\n }\n return this;\n }\n getComponent(index) {\n switch (index) {\n case 0:\n return this.x;\n case 1:\n return this.y;\n default:\n throw new Error('index is out of range: ' + index);\n }\n }\n clone() {\n return new Vector2(this.x, this.y);\n }\n copy(v) {\n this.x = v.x;\n this.y = v.y;\n return this;\n }\n add(v) {\n this.x += v.x;\n this.y += v.y;\n return this;\n }\n addScalar(s) {\n this.x += s;\n this.y += s;\n return this;\n }\n addVectors(a, b) {\n this.x = a.x + b.x;\n this.y = a.y + b.y;\n return this;\n }\n addScaledVector(v, s) {\n this.x += v.x * s;\n this.y += v.y * s;\n return this;\n }\n sub(v) {\n this.x -= v.x;\n this.y -= v.y;\n return this;\n }\n subScalar(s) {\n this.x -= s;\n this.y -= s;\n return this;\n }\n subVectors(a, b) {\n this.x = a.x - b.x;\n this.y = a.y - b.y;\n return this;\n }\n multiply(v) {\n this.x *= v.x;\n this.y *= v.y;\n return this;\n }\n multiplyScalar(scalar) {\n this.x *= scalar;\n this.y *= scalar;\n return this;\n }\n divide(v) {\n this.x /= v.x;\n this.y /= v.y;\n return this;\n }\n divideScalar(scalar) {\n return this.multiplyScalar(1 / scalar);\n }\n applyMatrix3(m) {\n const x = this.x, y = this.y;\n const e = m.elements;\n this.x = e[0] * x + e[3] * y + e[6];\n this.y = e[1] * x + e[4] * y + e[7];\n return this;\n }\n min(v) {\n this.x = Math.min(this.x, v.x);\n this.y = Math.min(this.y, v.y);\n return this;\n }\n max(v) {\n this.x = Math.max(this.x, v.x);\n this.y = Math.max(this.y, v.y);\n return this;\n }\n clamp(min, max) {\n // assumes min < max, componentwise\n this.x = Math.max(min.x, Math.min(max.x, this.x));\n this.y = Math.max(min.y, Math.min(max.y, this.y));\n return this;\n }\n clampScalar(minVal, maxVal) {\n this.x = Math.max(minVal, Math.min(maxVal, this.x));\n this.y = Math.max(minVal, Math.min(maxVal, this.y));\n return this;\n }\n clampLength(min, max) {\n const length = this.length();\n return this.divideScalar(length || 1).multiplyScalar(Math.max(min, Math.min(max, length)));\n }\n floor() {\n this.x = Math.floor(this.x);\n this.y = Math.floor(this.y);\n return this;\n }\n ceil() {\n this.x = Math.ceil(this.x);\n this.y = Math.ceil(this.y);\n return this;\n }\n round() {\n this.x = Math.round(this.x);\n this.y = Math.round(this.y);\n return this;\n }\n roundToZero() {\n this.x = Math.trunc(this.x);\n this.y = Math.trunc(this.y);\n return this;\n }\n negate() {\n this.x = -this.x;\n this.y = -this.y;\n return this;\n }\n dot(v) {\n return this.x * v.x + this.y * v.y;\n }\n cross(v) {\n return this.x * v.y - this.y * v.x;\n }\n lengthSq() {\n return this.x * this.x + this.y * this.y;\n }\n length() {\n return Math.sqrt(this.x * this.x + this.y * this.y);\n }\n manhattanLength() {\n return Math.abs(this.x) + Math.abs(this.y);\n }\n normalize() {\n return this.divideScalar(this.length() || 1);\n }\n angle() {\n // computes the angle in radians with respect to the positive x-axis\n const angle = Math.atan2(-this.y, -this.x) + Math.PI;\n return angle;\n }\n angleTo(v) {\n const denominator = Math.sqrt(this.lengthSq() * v.lengthSq());\n if (denominator === 0)\n return Math.PI / 2;\n const theta = this.dot(v) / denominator;\n // clamp, to handle numerical problems\n return Math.acos(clamp(theta, -1, 1));\n }\n distanceTo(v) {\n return Math.sqrt(this.distanceToSquared(v));\n }\n distanceToSquared(v) {\n const dx = this.x - v.x, dy = this.y - v.y;\n return dx * dx + dy * dy;\n }\n manhattanDistanceTo(v) {\n return Math.abs(this.x - v.x) + Math.abs(this.y - v.y);\n }\n setLength(length) {\n return this.normalize().multiplyScalar(length);\n }\n lerp(v, alpha) {\n this.x += (v.x - this.x) * alpha;\n this.y += (v.y - this.y) * alpha;\n return this;\n }\n lerpVectors(v1, v2, alpha) {\n this.x = v1.x + (v2.x - v1.x) * alpha;\n this.y = v1.y + (v2.y - v1.y) * alpha;\n return this;\n }\n equals(v) {\n return v.x === this.x && v.y === this.y;\n }\n fromArray(array, offset = 0) {\n this.x = array[offset];\n this.y = array[offset + 1];\n return this;\n }\n toArray(array = [], offset = 0) {\n array[offset] = this.x;\n array[offset + 1] = this.y;\n return array;\n }\n /*fromBufferAttribute(attribute, index: number) {\n this.x = attribute.getX(index);\n this.y = attribute.getY(index);\n\n return this;\n }*/\n rotateAround(center, angle) {\n const c = Math.cos(angle), s = Math.sin(angle);\n const x = this.x - center.x;\n const y = this.y - center.y;\n this.x = x * c - y * s + center.x;\n this.y = x * s + y * c + center.y;\n return this;\n }\n random() {\n this.x = Math.random();\n this.y = Math.random();\n return this;\n }\n *[Symbol.iterator]() {\n yield this.x;\n yield this.y;\n }\n}\nVector2.isVector2 = true;\n\n/**\n * Scratch storage the accessors fall back to while the base `Vector3`\n * constructor runs, before the instance owns a `data` binding. Living on the\n * prototype, it absorbs those writes without needing a guard on every\n * component write.\n */\nconst UNBOUND$1 = new Float32Array(3);\n/**\n * A `Vector3` whose components live in a shared `Float32Array` at a fixed\n * offset rather than in three own properties.\n *\n * Every `Vector3` method routes through `x` / `y` / `z`, so replacing those\n * with accessors inherits the whole API unchanged — including `clone()`, which\n * still returns a detached plain `Vector3`.\n *\n * The accessors are installed on the prototype below rather than written as\n * `get x()` in the class body, because TypeScript forbids overriding an\n * inherited property with an accessor (TS2611). Runtime behaviour is the same:\n * one shared property descriptor for every instance.\n */\nclass Vector3View extends Vector3 {\n constructor(data, offset) {\n super();\n this.data = data;\n this.offset = offset;\n }\n /** Points the view at a new backing array and row offset. */\n bind(data, offset) {\n this.data = data;\n this.offset = offset;\n }\n}\nconst prototype$1 = Vector3View.prototype;\nprototype$1.data = UNBOUND$1;\nprototype$1.offset = 0;\nObject.defineProperties(Vector3View.prototype, {\n x: {\n get() {\n return this.data[this.offset];\n },\n set(value) {\n this.data[this.offset] = value;\n },\n },\n y: {\n get() {\n return this.data[this.offset + 1];\n },\n set(value) {\n this.data[this.offset + 1] = value;\n },\n },\n z: {\n get() {\n return this.data[this.offset + 2];\n },\n set(value) {\n this.data[this.offset + 2] = value;\n },\n },\n});\n\nclass Vector4 {\n constructor(x = 0, y = 0, z = 0, w = 1) {\n this.x = x;\n this.y = y;\n this.z = z;\n this.w = w;\n }\n get width() {\n return this.z;\n }\n set width(value) {\n this.z = value;\n }\n get height() {\n return this.w;\n }\n set height(value) {\n this.w = value;\n }\n set(x, y, z, w) {\n this.x = x;\n this.y = y;\n this.z = z;\n this.w = w;\n return this;\n }\n setScalar(scalar) {\n this.x = scalar;\n this.y = scalar;\n this.z = scalar;\n this.w = scalar;\n return this;\n }\n setX(x) {\n this.x = x;\n return this;\n }\n setY(y) {\n this.y = y;\n return this;\n }\n setZ(z) {\n this.z = z;\n return this;\n }\n setW(w) {\n this.w = w;\n return this;\n }\n setComponent(index, value) {\n switch (index) {\n case 0:\n this.x = value;\n break;\n case 1:\n this.y = value;\n break;\n case 2:\n this.z = value;\n break;\n case 3:\n this.w = value;\n break;\n default:\n throw new Error('index is out of range: ' + index);\n }\n return this;\n }\n getComponent(index) {\n switch (index) {\n case 0:\n return this.x;\n case 1:\n return this.y;\n case 2:\n return this.z;\n case 3:\n return this.w;\n default:\n throw new Error('index is out of range: ' + index);\n }\n }\n clone() {\n return new Vector4(this.x, this.y, this.z, this.w);\n }\n copy(v) {\n this.x = v.x;\n this.y = v.y;\n this.z = v.z;\n this.w = v.w;\n return this;\n }\n add(v) {\n this.x += v.x;\n this.y += v.y;\n this.z += v.z;\n this.w += v.w;\n return this;\n }\n addScalar(scalar) {\n this.x += scalar;\n this.y += scalar;\n this.z += scalar;\n this.w += scalar;\n return this;\n }\n addVectors(a, b) {\n this.x = a.x + b.x;\n this.y = a.y + b.y;\n this.z = a.z + b.z;\n this.w = a.w + b.w;\n return this;\n }\n addScaledVector(v, s) {\n this.x += v.x * s;\n this.y += v.y * s;\n this.z += v.z * s;\n this.w += v.w * s;\n return this;\n }\n sub(v) {\n this.x -= v.x;\n this.y -= v.y;\n this.z -= v.z;\n this.w -= v.w;\n return this;\n }\n subScalar(scalar) {\n this.x -= scalar;\n this.y -= scalar;\n this.z -= scalar;\n this.w -= scalar;\n return this;\n }\n subVectors(a, b) {\n this.x = a.x - b.x;\n this.y = a.y - b.y;\n this.z = a.z - b.z;\n this.w = a.w - b.w;\n return this;\n }\n multiply(v) {\n this.x *= v.x;\n this.y *= v.y;\n this.z *= v.z;\n this.w *= v.w;\n return this;\n }\n multiplyScalar(scalar) {\n this.x *= scalar;\n this.y *= scalar;\n this.z *= scalar;\n this.w *= scalar;\n return this;\n }\n applyMatrix4(m) {\n const x = this.x, y = this.y, z = this.z, w = this.w;\n const e = m.elements;\n this.x = e[0] * x + e[4] * y + e[8] * z + e[12] * w;\n this.y = e[1] * x + e[5] * y + e[9] * z + e[13] * w;\n this.z = e[2] * x + e[6] * y + e[10] * z + e[14] * w;\n this.w = e[3] * x + e[7] * y + e[11] * z + e[15] * w;\n return this;\n }\n divideScalar(scalar) {\n return this.multiplyScalar(1 / scalar);\n }\n setAxisAngleFromQuaternion(q) {\n // http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm\n // q is assumed to be normalized\n this.w = 2 * Math.acos(q.w);\n const s = Math.sqrt(1 - q.w * q.w);\n if (s < 0.0001) {\n this.x = 1;\n this.y = 0;\n this.z = 0;\n }\n else {\n this.x = q.x / s;\n this.y = q.y / s;\n this.z = q.z / s;\n }\n return this;\n }\n setAxisAngleFromRotationMatrix(m) {\n // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm\n // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n let angle, x, y, z; // variables for result\n const epsilon = 0.01, // margin to allow for rounding errors\n epsilon2 = 0.1, // margin to distinguish between 0 and 180 degrees\n te = m.elements, m11 = te[0], m12 = te[4], m13 = te[8], m21 = te[1], m22 = te[5], m23 = te[9], m31 = te[2], m32 = te[6], m33 = te[10];\n if (Math.abs(m12 - m21) < epsilon && Math.abs(m13 - m31) < epsilon && Math.abs(m23 - m32) < epsilon) {\n // singularity found\n // first check for identity matrix which must have +1 for all terms\n // in leading diagonal and zero in other terms\n if (Math.abs(m12 + m21) < epsilon2 &&\n Math.abs(m13 + m31) < epsilon2 &&\n Math.abs(m23 + m32) < epsilon2 &&\n Math.abs(m11 + m22 + m33 - 3) < epsilon2) {\n // this singularity is identity matrix so angle = 0\n this.set(1, 0, 0, 0);\n return this; // zero angle, arbitrary axis\n }\n // otherwise this singularity is angle = 180\n angle = Math.PI;\n const xx = (m11 + 1) / 2;\n const yy = (m22 + 1) / 2;\n const zz = (m33 + 1) / 2;\n const xy = (m12 + m21) / 4;\n const xz = (m13 + m31) / 4;\n const yz = (m23 + m32) / 4;\n if (xx > yy && xx > zz) {\n // m11 is the largest diagonal term\n if (xx < epsilon) {\n x = 0;\n y = 0.707106781;\n z = 0.707106781;\n }\n else {\n x = Math.sqrt(xx);\n y = xy / x;\n z = xz / x;\n }\n }\n else if (yy > zz) {\n // m22 is the largest diagonal term\n if (yy < epsilon) {\n x = 0.707106781;\n y = 0;\n z = 0.707106781;\n }\n else {\n y = Math.sqrt(yy);\n x = xy / y;\n z = yz / y;\n }\n }\n else {\n // m33 is the largest diagonal term so base result on this\n if (zz < epsilon) {\n x = 0.707106781;\n y = 0.707106781;\n z = 0;\n }\n else {\n z = Math.sqrt(zz);\n x = xz / z;\n y = yz / z;\n }\n }\n this.set(x, y, z, angle);\n return this; // return 180 deg rotation\n }\n // as we have reached here there are no singularities so we can handle normally\n let s = Math.sqrt((m32 - m23) * (m32 - m23) + (m13 - m31) * (m13 - m31) + (m21 - m12) * (m21 - m12)); // used to normalize\n if (Math.abs(s) < 0.001)\n s = 1;\n // prevent divide by zero, should not happen if matrix is orthogonal and should be\n // caught by singularity test above, but I've left it in just in case\n this.x = (m32 - m23) / s;\n this.y = (m13 - m31) / s;\n this.z = (m21 - m12) / s;\n this.w = Math.acos((m11 + m22 + m33 - 1) / 2);\n return this;\n }\n min(v) {\n this.x = Math.min(this.x, v.x);\n this.y = Math.min(this.y, v.y);\n this.z = Math.min(this.z, v.z);\n this.w = Math.min(this.w, v.w);\n return this;\n }\n max(v) {\n this.x = Math.max(this.x, v.x);\n this.y = Math.max(this.y, v.y);\n this.z = Math.max(this.z, v.z);\n this.w = Math.max(this.w, v.w);\n return this;\n }\n clamp(min, max) {\n // assumes min < max, componentwise\n this.x = Math.max(min.x, Math.min(max.x, this.x));\n this.y = Math.max(min.y, Math.min(max.y, this.y));\n this.z = Math.max(min.z, Math.min(max.z, this.z));\n this.w = Math.max(min.w, Math.min(max.w, this.w));\n return this;\n }\n clampScalar(minVal, maxVal) {\n this.x = Math.max(minVal, Math.min(maxVal, this.x));\n this.y = Math.max(minVal, Math.min(maxVal, this.y));\n this.z = Math.max(minVal, Math.min(maxVal, this.z));\n this.w = Math.max(minVal, Math.min(maxVal, this.w));\n return this;\n }\n clampLength(min, max) {\n const length = this.length();\n return this.divideScalar(length || 1).multiplyScalar(Math.max(min, Math.min(max, length)));\n }\n floor() {\n this.x = Math.floor(this.x);\n this.y = Math.floor(this.y);\n this.z = Math.floor(this.z);\n this.w = Math.floor(this.w);\n return this;\n }\n ceil() {\n this.x = Math.ceil(this.x);\n this.y = Math.ceil(this.y);\n this.z = Math.ceil(this.z);\n this.w = Math.ceil(this.w);\n return this;\n }\n round() {\n this.x = Math.round(this.x);\n this.y = Math.round(this.y);\n this.z = Math.round(this.z);\n this.w = Math.round(this.w);\n return this;\n }\n roundToZero() {\n this.x = Math.trunc(this.x);\n this.y = Math.trunc(this.y);\n this.z = Math.trunc(this.z);\n this.w = Math.trunc(this.w);\n return this;\n }\n negate() {\n this.x = -this.x;\n this.y = -this.y;\n this.z = -this.z;\n this.w = -this.w;\n return this;\n }\n dot(v) {\n return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;\n }\n lengthSq() {\n return this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;\n }\n length() {\n return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w);\n }\n manhattanLength() {\n return Math.abs(this.x) + Math.abs(this.y) + Math.abs(this.z) + Math.abs(this.w);\n }\n normalize() {\n return this.divideScalar(this.length() || 1);\n }\n setLength(length) {\n return this.normalize().multiplyScalar(length);\n }\n lerp(v, alpha) {\n this.x += (v.x - this.x) * alpha;\n this.y += (v.y - this.y) * alpha;\n this.z += (v.z - this.z) * alpha;\n this.w += (v.w - this.w) * alpha;\n return this;\n }\n lerpVectors(v1, v2, alpha) {\n this.x = v1.x + (v2.x - v1.x) * alpha;\n this.y = v1.y + (v2.y - v1.y) * alpha;\n this.z = v1.z + (v2.z - v1.z) * alpha;\n this.w = v1.w + (v2.w - v1.w) * alpha;\n return this;\n }\n equals(v) {\n return v.x === this.x && v.y === this.y && v.z === this.z && v.w === this.w;\n }\n fromArray(array, offset = 0) {\n this.x = array[offset];\n this.y = array[offset + 1];\n this.z = array[offset + 2];\n this.w = array[offset + 3];\n return this;\n }\n toArray(array = [], offset = 0) {\n array[offset] = this.x;\n array[offset + 1] = this.y;\n array[offset + 2] = this.z;\n array[offset + 3] = this.w;\n return array;\n }\n /*\n fromBufferAttribute(attribute, index) {\n this.x = attribute.getX(index);\n this.y = attribute.getY(index);\n this.z = attribute.getZ(index);\n this.w = attribute.getW(index);\n\n return this;\n }*/\n random() {\n this.x = Math.random();\n this.y = Math.random();\n this.z = Math.random();\n this.w = Math.random();\n return this;\n }\n *[Symbol.iterator]() {\n yield this.x;\n yield this.y;\n yield this.z;\n yield this.w;\n }\n}\nVector4.prototype.isVector4 = true;\n\n/** See Vector3View: absorbs the base constructor's writes before binding. */\nconst UNBOUND = new Float32Array(4);\n/**\n * A `Vector4` backed by a shared `Float32Array` at a fixed offset. Replacing\n * the four component accessors inherits every `Vector4` method as-is; they are\n * installed on the prototype because TypeScript forbids overriding an\n * inherited property with an accessor in the class body (TS2611).\n */\nclass Vector4View extends Vector4 {\n constructor(data, offset) {\n super();\n this.data = data;\n this.offset = offset;\n }\n /** Points the view at a new backing array and row offset. */\n bind(data, offset) {\n this.data = data;\n this.offset = offset;\n }\n}\nconst prototype = Vector4View.prototype;\nprototype.data = UNBOUND;\nprototype.offset = 0;\nObject.defineProperties(Vector4View.prototype, {\n x: {\n get() {\n return this.data[this.offset];\n },\n set(value) {\n this.data[this.offset] = value;\n },\n },\n y: {\n get() {\n return this.data[this.offset + 1];\n },\n set(value) {\n this.data[this.offset + 1] = value;\n },\n },\n z: {\n get() {\n return this.data[this.offset + 2];\n },\n set(value) {\n this.data[this.offset + 2] = value;\n },\n },\n w: {\n get() {\n return this.data[this.offset + 3];\n },\n set(value) {\n this.data[this.offset + 3] = value;\n },\n },\n});\n\nlet physicsResolver;\nfunction setPhysicsResolver(resolver) {\n physicsResolver = resolver;\n}\nfunction getPhysicsResolver() {\n return physicsResolver;\n}\n/**\n * Apply collision to particles from a physics resolver.\n */\nclass ApplyCollision {\n constructor(resolver, bounce) {\n this.resolver = resolver;\n this.bounce = bounce;\n this.type = 'ApplyCollision';\n this.tempV = new Vector3();\n }\n initialize(particle) { }\n update(particle, delta) {\n // No-op when no collider is registered (getPhysicsResolver() was undefined at load time),\n // so a collision-bearing effect loads and renders anywhere — a host that wants actual\n // collisions registers a resolver via setPhysicsResolver.\n if (this.resolver && this.resolver.resolve(particle.position, this.tempV)) {\n particle.velocity.reflect(this.tempV).multiplyScalar(this.bounce);\n }\n }\n frameUpdate(delta) { }\n toJSON() {\n return {\n type: this.type,\n bounce: this.bounce,\n };\n }\n static fromJSON(json) {\n return new ApplyCollision(getPhysicsResolver(), json.bounce);\n }\n clone() {\n return new ApplyCollision(this.resolver, this.bounce);\n }\n reset() { }\n}\n\nclass ConstantValue {\n constructor(value) {\n this.value = value;\n this.type = 'value';\n }\n startGen(memory) { }\n genValue(memory) {\n return this.value;\n }\n toJSON() {\n return {\n type: 'ConstantValue',\n value: this.value,\n };\n }\n static fromJSON(json) {\n return new ConstantValue(json.value);\n }\n clone() {\n return new ConstantValue(this.value);\n }\n}\n\nclass IntervalValue {\n constructor(a, b) {\n this.a = a;\n this.b = b;\n this.indexCount = -1;\n this.type = 'value';\n }\n // Roll a random sample once at spawn and remember the slot, so the\n // particle keeps the same lerp factor for its whole life. See\n // GeneratorMemory.ts for the slot-allocation pattern.\n startGen(memory) {\n this.indexCount = memory.length;\n memory.push(Math.random());\n }\n genValue(memory) {\n if (this.indexCount === -1) {\n this.startGen(memory);\n }\n return MathUtils.lerp(this.a, this.b, memory[this.indexCount]);\n }\n toJSON() {\n return {\n type: 'IntervalValue',\n a: this.a,\n b: this.b,\n };\n }\n static fromJSON(json) {\n return new IntervalValue(json.a, json.b);\n }\n clone() {\n return new IntervalValue(this.a, this.b);\n }\n}\n\nclass Bezier {\n constructor(p1, p2, p3, p4) {\n this.p = [p1, p2, p3, p4];\n }\n genValue(t) {\n const p = this.p;\n const t2 = t * t;\n const mt = 1 - t;\n const mt2 = mt * mt;\n return p[0] * mt2 * mt + p[1] * mt2 * t * 3 + p[2] * mt * t2 * 3 + p[3] * t2 * t;\n }\n // get the coefficients of the polynomial's derivatives\n derivativeCoefficients(points) {\n const dpoints = [];\n for (let p = points, c = p.length - 1; c > 0; c--) {\n const list = [];\n for (let j = 0; j < c; j++) {\n const dpt = c * (p[j + 1] - p[j]);\n list.push(dpt);\n }\n dpoints.push(list);\n p = list;\n }\n return dpoints;\n }\n // calculate the slope\n getSlope(t) {\n const p = this.derivativeCoefficients(this.p)[0];\n const mt = 1 - t;\n const a = mt * mt;\n const b = mt * t * 2;\n const c = t * t;\n return a * p[0] + b * p[1] + c * p[2];\n //return a * (p[1] - p[0]) * 3 + b * (p[2] - p[1]) * 3 + c * (p[3] - p[2]) * 3;\n }\n // derivative(0) = (p[1] - p[0]) * 3\n // derivative(1) = (p[3] - p[2]) * 3\n controlCurve(d0, d1) {\n this.p[1] = d0 / 3 + this.p[0];\n this.p[2] = this.p[3] - d1 / 3;\n }\n hull(t) {\n let p = this.p;\n let _p = [], pt, idx = 0, i = 0, l = 0;\n const q = [];\n q[idx++] = p[0];\n q[idx++] = p[1];\n q[idx++] = p[2];\n q[idx++] = p[3];\n // we lerp between all points at each iteration, until we have 1 point left.\n while (p.length > 1) {\n _p = [];\n for (i = 0, l = p.length - 1; i < l; i++) {\n pt = t * p[i] + (1 - t) * p[i + 1];\n q[idx++] = pt;\n _p.push(pt);\n }\n p = _p;\n }\n return q;\n }\n split(t) {\n // no shortcut: use \"de Casteljau\" iteration.\n const q = this.hull(t);\n const result = {\n left: new Bezier(q[0], q[4], q[7], q[9]),\n right: new Bezier(q[9], q[8], q[6], q[3]),\n span: q,\n };\n return result;\n }\n clone() {\n return new Bezier(this.p[0], this.p[1], this.p[2], this.p[3]);\n }\n toJSON() {\n return {\n p0: this.p[0],\n p1: this.p[1],\n p2: this.p[2],\n p3: this.p[3],\n };\n }\n static fromJSON(json) {\n return new Bezier(json.p0, json.p1, json.p2, json.p3);\n }\n}\n\nclass PiecewiseFunction {\n constructor() {\n this.functions = new Array();\n }\n findFunction(t) {\n const functions = this.functions;\n const last = functions.length - 1;\n // Single-curve piecewise functions are the common case (one bezier over\n // the whole [0, 1] range); resolve them without running the search.\n if (last <= 0) {\n return last === 0 && t >= functions[0][1] && t <= 1 ? 0 : -1;\n }\n let left = 0, right = last;\n while (left + 1 < right) {\n const mid = (left + right) >> 1;\n if (t < functions[mid][1])\n right = mid - 1;\n else if (t > this.getEndX(mid))\n left = mid + 1;\n else\n return mid;\n }\n for (let i = left; i <= right; i++) {\n if (t >= functions[i][1] && t <= this.getEndX(i))\n return i;\n }\n return -1;\n }\n getStartX(index) {\n return this.functions[index][1];\n }\n setStartX(index, x) {\n if (index > 0)\n this.functions[index][1] = x;\n }\n getEndX(index) {\n if (index + 1 < this.functions.length)\n return this.functions[index + 1][1];\n return 1;\n }\n setEndX(index, x) {\n if (index + 1 < this.functions.length)\n this.functions[index + 1][1] = x;\n }\n insertFunction(t, func) {\n const index = this.findFunction(t);\n this.functions.splice(index + 1, 0, [func, t]);\n }\n removeFunction(index) {\n return this.functions.splice(index, 1)[0][0];\n }\n getFunction(index) {\n return this.functions[index][0];\n }\n setFunction(index, func) {\n this.functions[index][0] = func;\n }\n get numOfFunctions() {\n return this.functions.length;\n }\n}\n\nclass PiecewiseBezier extends PiecewiseFunction {\n // default linear bezier\n constructor(curves = [[new Bezier(0, 1.0 / 3, (1.0 / 3) * 2, 1), 0]]) {\n super();\n /**\n * Sampled copy of the curve, or null while none has been built.\n * See {@link refreshTable}.\n */\n this.table = null;\n /**\n * Control points the table was built from, used to detect edits. Float64 on purpose: the\n * points are doubles, and a Float32Array rounds most of them (0.2, almost any exported value),\n * so the comparison never matched and the table was resampled on every call.\n */\n this.tableSignature = null;\n this.type = 'function';\n this.functions = curves;\n }\n /**\n * Rebuilds the sampled table when the curve changed, otherwise does nothing.\n *\n * Evaluating this curve means a piece lookup plus a cubic; a particle system\n * does that once per particle per frame. Sampling it once and interpolating\n * costs two loads and a lerp instead. Sampling error at\n * {@link PiecewiseBezier.TABLE_SIZE} points stays around 1e-5 for the shapes\n * a curve editor produces — far below what a colour or a size can show.\n *\n * The curve is public and mutable (a curve editor writes straight into\n * `functions` and a Bezier's `p`), so this compares the control points\n * against the ones the table was built from and only resamples on a real\n * change. That is a handful of float compares per frame.\n */\n refreshTable() {\n const functions = this.functions;\n const count = functions.length;\n if (count === 0) {\n this.table = null;\n this.tableSignature = null;\n return;\n }\n // signature: four control points plus the start position of each piece\n const signatureLength = count * 5;\n let signature = this.tableSignature;\n let changed = signature === null || signature.length !== signatureLength;\n if (changed) {\n signature = new Float64Array(signatureLength);\n }\n for (let i = 0, s = 0; i < count; i++, s += 5) {\n const p = functions[i][0].p;\n const start = functions[i][1];\n if (!changed) {\n changed =\n signature[s] !== p[0] ||\n signature[s + 1] !== p[1] ||\n signature[s + 2] !== p[2] ||\n signature[s + 3] !== p[3] ||\n signature[s + 4] !== start;\n }\n if (changed) {\n signature[s] = p[0];\n signature[s + 1] = p[1];\n signature[s + 2] = p[2];\n signature[s + 3] = p[3];\n signature[s + 4] = start;\n }\n }\n if (!changed && this.table !== null) {\n return;\n }\n this.tableSignature = signature;\n const size = PiecewiseBezier.TABLE_SIZE;\n const table = this.table !== null && this.table.length === size ? this.table : new Float32Array(size);\n const step = 1 / (size - 1);\n for (let i = 0; i < size; i++) {\n table[i] = this.genValueExact(i * step);\n }\n this.table = table;\n }\n /**\n * The sampled table {@link genValue} currently reads from, or null while\n * none has been built. Lets a compiled behavior pass interpolate the table\n * inline instead of calling in here once per particle.\n */\n sampledTable() {\n return this.table;\n }\n /** Drops the sampled table, so later reads go back to evaluating the curve. */\n clearTable() {\n this.table = null;\n this.tableSignature = null;\n }\n genValue(memory, t = 0) {\n const table = this.table;\n if (table !== null) {\n const last = table.length - 1;\n if (t <= 0) {\n return table[0];\n }\n if (t >= 1) {\n return table[last];\n }\n const x = t * last;\n const index = x | 0;\n const fraction = x - index;\n const value = table[index];\n return value + (table[index + 1] - value) * fraction;\n }\n return this.genValueExact(t);\n }\n /** Evaluates the curve itself, ignoring any sampled table. */\n genValueExact(t) {\n const functions = this.functions;\n const count = functions.length;\n if (count === 0) {\n return 0;\n }\n const index = this.findFunction(t);\n if (index === -1) {\n // Clamp like Unity: before the first key use the first curve value, not zero.\n if (t < functions[0][1]) {\n return functions[0][0].genValue(0);\n }\n return functions[count - 1][0].genValue(1);\n }\n const startX = functions[index][1];\n const endX = index + 1 < count ? functions[index + 1][1] : 1;\n const span = endX - startX;\n // Adjacent curves can start at the same position; an empty span would\n // divide to NaN, so evaluate at the curve's start.\n return functions[index][0].genValue(span > 0 ? (t - startX) / span : 0);\n }\n toSVG(length, segments) {\n if (segments < 1)\n return '';\n let result = ['M', 0, this.functions[0][0].p[0]].join(' ');\n for (let i = 1.0 / segments; i <= 1; i += 1.0 / segments) {\n result = [result, 'L', i * length, this.genValue(undefined, i)].join(' ');\n }\n return result;\n }\n toJSON() {\n return {\n type: 'PiecewiseBezier',\n functions: this.functions.map(([bezier, start]) => ({ function: bezier.toJSON(), start: start })),\n };\n }\n static fromJSON(json) {\n return new PiecewiseBezier(json.functions.map((piecewiseFunction) => [\n Bezier.fromJSON(piecewiseFunction.function),\n piecewiseFunction.start,\n ]));\n }\n clone() {\n return new PiecewiseBezier(this.functions.map(([bezier, start]) => [bezier.clone(), start]));\n }\n startGen(memory) { }\n}\n/** Sample count of the table built by {@link refreshTable}. */\nPiecewiseBezier.TABLE_SIZE = 257;\n\nfunction ValueGeneratorFromJSON(json) {\n switch (json.type) {\n case 'ConstantValue':\n return ConstantValue.fromJSON(json);\n case 'IntervalValue':\n return IntervalValue.fromJSON(json);\n case 'PiecewiseBezier':\n return PiecewiseBezier.fromJSON(json);\n default:\n return new ConstantValue(0);\n }\n}\n\nclass AxisAngleGenerator {\n constructor(axis, angle) {\n this.axis = axis;\n this.angle = angle;\n this.type = 'rotation';\n }\n startGen(memory) {\n this.angle.startGen(memory);\n }\n genValue(memory, quat, delta, t) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return quat.setFromAxisAngle(this.axis, this.angle.genValue(memory, t) * delta);\n }\n toJSON() {\n return {\n type: 'AxisAngle',\n axis: { x: this.axis.x, y: this.axis.y, z: this.axis.z },\n angle: this.angle.toJSON(),\n };\n }\n static fromJSON(json) {\n return new AxisAngleGenerator(new Vector3(json.axis.x, json.axis.y, json.axis.z), ValueGeneratorFromJSON(json.angle));\n }\n clone() {\n return new AxisAngleGenerator(this.axis.clone(), this.angle.clone());\n }\n}\n\nconst ColorToJSON = (color) => {\n return { r: color.x, g: color.y, b: color.z, a: color.w };\n};\nconst JSONToColor = (json) => {\n return new Vector4(json.r, json.g, json.b, json.a);\n};\nconst JSONToValue = (json, type) => {\n switch (type) {\n case 'Vector3':\n return new Vector3(json.x, json.y, json.z);\n case 'Vector4':\n return new Vector4(json.x, json.y, json.z, json.w);\n case 'Color':\n return new Vector3(json.r, json.g, json.b);\n case 'Number':\n return json;\n default:\n return json;\n }\n};\nconst ValueToJSON = (value, type) => {\n switch (type) {\n case 'Vector3':\n return { x: value.x, y: value.y, z: value.z };\n case 'Vector4':\n return { x: value.x, y: value.y, z: value.z, w: value.w };\n case 'Color':\n return { r: value.x, g: value.y, b: value.z };\n case 'Number':\n return value;\n default:\n return value;\n }\n};\n\nclass ColorRange {\n constructor(a, b) {\n this.a = a;\n this.b = b;\n this.indexCount = -1;\n this.type = 'value';\n }\n startGen(memory) {\n this.indexCount = memory.length;\n memory.push(Math.random());\n }\n genColor(memory, color) {\n if (this.indexCount === -1) {\n this.startGen(memory);\n }\n return color.copy(this.a).lerp(this.b, memory[this.indexCount]);\n }\n toJSON() {\n return {\n type: 'ColorRange',\n a: ColorToJSON(this.a),\n b: ColorToJSON(this.b),\n };\n }\n static fromJSON(json) {\n return new ColorRange(JSONToColor(json.a), JSONToColor(json.b));\n }\n clone() {\n return new ColorRange(this.a.clone(), this.b.clone());\n }\n}\n\nclass ContinuousLinearFunction {\n // default linear bezier\n constructor(keys, subType) {\n this.subType = subType;\n this.type = 'function';\n this.keys = keys;\n }\n findKey(t) {\n const keys = this.keys;\n const last = keys.length - 1;\n // One- and two-key gradients are by far the most common case; resolve\n // them without running the search.\n if (last <= 0) {\n return last === 0 && t >= keys[0][1] && t <= 1 ? 0 : -1;\n }\n if (last === 1) {\n if (t < keys[0][1] || t > 1)\n return -1;\n return t <= keys[1][1] ? 0 : 1;\n }\n let left = 0, right = last;\n while (left + 1 < right) {\n const mid = (left + right) >> 1;\n if (t < keys[mid][1])\n right = mid - 1;\n else if (t > this.getEndX(mid))\n left = mid + 1;\n else\n return mid;\n }\n for (let i = left; i <= right; i++) {\n if (t >= keys[i][1] && t <= this.getEndX(i))\n return i;\n }\n return -1;\n }\n getStartX(index) {\n return this.keys[index][1];\n }\n getEndX(index) {\n if (index + 1 < this.keys.length)\n return this.keys[index + 1][1];\n return 1;\n }\n genValue(value, t) {\n const keys = this.keys;\n const index = this.findKey(t);\n const last = keys.length - 1;\n if (this.subType === 'Number') {\n if (index === -1) {\n return keys[0][0];\n }\n else if (index >= last) {\n return keys[last][0];\n }\n const startX = keys[index][1];\n const a = keys[index][0];\n // Neighbouring keys may sit at the same position; an empty span would\n // divide to NaN, so hold the first key's value instead.\n const span = keys[index + 1][1] - startX;\n return ((keys[index + 1][0] - a) * (span > 0 ? (t - startX) / span : 0) + a);\n }\n else {\n if (index === -1) {\n return value.copy(keys[0][0]);\n }\n if (index >= last) {\n return value.copy(keys[last][0]);\n }\n const startX = keys[index][1];\n const span = keys[index + 1][1] - startX;\n return value\n .copy(keys[index][0])\n .lerp(keys[index + 1][0], span > 0 ? (t - startX) / span : 0);\n }\n }\n toJSON() {\n this.keys[0][0].constructor.name;\n return {\n type: 'CLinearFunction',\n subType: this.subType,\n keys: this.keys.map(([color, pos]) => ({ value: ValueToJSON(color, this.subType), pos: pos })),\n };\n }\n static fromJSON(json) {\n return new ContinuousLinearFunction(json.keys.map((pair) => [JSONToValue(pair.value, json.subType), pair.pos]), json.subType);\n }\n clone() {\n if (this.subType === 'Number') {\n return new ContinuousLinearFunction(this.keys.map(([value, pos]) => [value, pos]), this.subType);\n }\n else {\n return new ContinuousLinearFunction(this.keys.map(([value, pos]) => [value.clone(), pos]), this.subType);\n }\n }\n}\n\n/** Scratch colour used while sampling the gradient into its table. */\nconst tempColor$1 = new Vector4();\nclass Gradient {\n // default linear bezier\n constructor(color = [\n [new Vector3(0, 0, 0), 0],\n [new Vector3(1, 1, 1), 0],\n ], alpha = [\n [1, 0],\n [1, 1],\n ]) {\n /** Sampled RGBA copy of the gradient, or null while none has been built. */\n this.table = null;\n /** Keys the tables were built from, used to detect edits. Float64 for the same reason as PiecewiseBezier's. */\n this.tableSignature = null;\n this.type = 'function';\n this.color = new ContinuousLinearFunction(color, 'Color');\n this.alpha = new ContinuousLinearFunction(alpha, 'Number');\n }\n /**\n * Rebuilds the sampled table when the gradient changed, otherwise does\n * nothing. See PiecewiseBezier.refreshTable — same reasoning, and the same\n * signature check so a gradient edited in an editor is picked up.\n */\n refreshTable() {\n const colorKeys = this.color.keys;\n const alphaKeys = this.alpha.keys;\n const signatureLength = colorKeys.length * 4 + alphaKeys.length * 2;\n let signature = this.tableSignature;\n let changed = signature === null || signature.length !== signatureLength;\n if (changed) {\n signature = new Float64Array(signatureLength);\n }\n let s = 0;\n for (let i = 0; i < colorKeys.length; i++, s += 4) {\n const value = colorKeys[i][0];\n const position = colorKeys[i][1];\n if (!changed) {\n changed =\n signature[s] !== value.x ||\n signature[s + 1] !== value.y ||\n signature[s + 2] !== value.z ||\n signature[s + 3] !== position;\n }\n if (changed) {\n signature[s] = value.x;\n signature[s + 1] = value.y;\n signature[s + 2] = value.z;\n signature[s + 3] = position;\n }\n }\n for (let i = 0; i < alphaKeys.length; i++, s += 2) {\n const value = alphaKeys[i][0];\n const position = alphaKeys[i][1];\n if (!changed) {\n changed = signature[s] !== value || signature[s + 1] !== position;\n }\n if (changed) {\n signature[s] = value;\n signature[s + 1] = position;\n }\n }\n if (!changed && this.table !== null) {\n return;\n }\n this.tableSignature = signature;\n const size = Gradient.TABLE_SIZE;\n const table = this.table !== null && this.table.length === size * 4 ? this.table : new Float32Array(size * 4);\n const step = 1 / (size - 1);\n const sample = tempColor$1;\n for (let i = 0; i < size; i++) {\n this.genColorExact(sample, i * step);\n const offset = i * 4;\n table[offset] = sample.x;\n table[offset + 1] = sample.y;\n table[offset + 2] = sample.z;\n table[offset + 3] = sample.w;\n }\n this.table = table;\n }\n /**\n * The sampled table {@link genColor} currently reads from, or null while\n * none has been built. Lets a compiled behavior pass interpolate the table\n * inline instead of calling in here once per particle.\n */\n sampledTable() {\n return this.table;\n }\n /** Drops the sampled table, so later reads go back to evaluating the keys. */\n clearTable() {\n this.table = null;\n this.tableSignature = null;\n }\n genColor(memory, color, t) {\n const table = this.table;\n if (table !== null) {\n const last = Gradient.TABLE_SIZE - 1;\n if (t <= 0) {\n color.x = table[0];\n color.y = table[1];\n color.z = table[2];\n color.w = table[3];\n return color;\n }\n if (t >= 1) {\n const offset = last * 4;\n color.x = table[offset];\n color.y = table[offset + 1];\n color.z = table[offset + 2];\n color.w = table[offset + 3];\n return color;\n }\n const x = t * last;\n const index = x | 0;\n const fraction = x - index;\n const offset = index * 4;\n const next = offset + 4;\n color.x = table[offset] + (table[next] - table[offset]) * fraction;\n color.y = table[offset + 1] + (table[next + 1] - table[offset + 1]) * fraction;\n color.z = table[offset + 2] + (table[next + 2] - table[offset + 2]) * fraction;\n color.w = table[offset + 3] + (table[next + 3] - table[offset + 3]) * fraction;\n return color;\n }\n return this.genColorExact(color, t);\n }\n /** Evaluates the gradient keys themselves, ignoring any sampled table. */\n genColorExact(color, t) {\n // Specialised inline of ContinuousLinearFunction.genValue for both\n // channels: this runs once per particle per frame, and going through the\n // generic (number | Vector3) path costs a temp vector plus polymorphic\n // key reads.\n const colorKeys = this.color.keys;\n const lastColor = colorKeys.length - 1;\n const colorIndex = this.color.findKey(t);\n let r;\n let g;\n let b;\n if (colorIndex === -1 || colorIndex >= lastColor) {\n const key = colorKeys[colorIndex === -1 ? 0 : lastColor][0];\n r = key.x;\n g = key.y;\n b = key.z;\n }\n else {\n const from = colorKeys[colorIndex][0];\n const to = colorKeys[colorIndex + 1][0];\n const startX = colorKeys[colorIndex][1];\n const span = colorKeys[colorIndex + 1][1] - startX;\n // Two keys can share a position — the default gradient does. Dividing\n // by that empty span yields NaN, which reaches the vertex buffer and\n // drops the particle for a frame; stay on the first key instead.\n const ratio = span > 0 ? (t - startX) / span : 0;\n r = from.x + (to.x - from.x) * ratio;\n g = from.y + (to.y - from.y) * ratio;\n b = from.z + (to.z - from.z) * ratio;\n }\n const alphaKeys = this.alpha.keys;\n const lastAlpha = alphaKeys.length - 1;\n const alphaIndex = this.alpha.findKey(t);\n let a;\n if (alphaIndex === -1 || alphaIndex >= lastAlpha) {\n a = alphaKeys[alphaIndex === -1 ? 0 : lastAlpha][0];\n }\n else {\n const startX = alphaKeys[alphaIndex][1];\n const from = alphaKeys[alphaIndex][0];\n const span = alphaKeys[alphaIndex + 1][1] - startX;\n a = from + (alphaKeys[alphaIndex + 1][0] - from) * (span > 0 ? (t - startX) / span : 0);\n }\n color.x = r;\n color.y = g;\n color.z = b;\n color.w = a;\n return color;\n }\n toJSON() {\n return {\n type: 'Gradient',\n color: this.color.toJSON(),\n alpha: this.alpha.toJSON(),\n };\n }\n static fromJSON(json) {\n // compatibility\n if (json.functions) {\n const keys = json.functions.map((func) => [ColorRange.fromJSON(func.function).a, func.start]);\n if (json.functions.length > 0) {\n keys.push([ColorRange.fromJSON(json.functions[json.functions.length - 1].function).b, 1]);\n }\n return new Gradient(keys.map((key) => [new Vector3(key[0].x, key[0].y, key[0].z), key[1]]), keys.map((key) => [key[0].w, key[1]]));\n }\n else {\n const gradient = new Gradient();\n gradient.alpha = ContinuousLinearFunction.fromJSON(json.alpha);\n gradient.color = ContinuousLinearFunction.fromJSON(json.color);\n return gradient;\n }\n }\n clone() {\n const gradient = new Gradient();\n gradient.alpha = this.alpha.clone();\n gradient.color = this.color.clone();\n return gradient;\n }\n startGen(memory) { }\n}\n/** Sample count of the tables built by {@link refreshTable}. */\nGradient.TABLE_SIZE = 257;\n\nclass RandomColor {\n constructor(a, b) {\n this.a = a;\n this.b = b;\n this.type = 'value';\n }\n startGen(memory) { }\n genColor(memory, color) {\n const rand = Math.random();\n return color.copy(this.a).lerp(this.b, rand);\n }\n toJSON() {\n return {\n type: 'RandomColor',\n a: ColorToJSON(this.a),\n b: ColorToJSON(this.b),\n };\n }\n static fromJSON(json) {\n return new RandomColor(JSONToColor(json.a), JSONToColor(json.b));\n }\n clone() {\n return new RandomColor(this.a.clone(), this.b.clone());\n }\n}\n\nconst tempColor = new Vector4();\n// generate a random color from the start two gradients\nclass RandomColorBetweenGradient {\n constructor(gradient1, gradient2) {\n this.indexCount = 0;\n this.type = 'function';\n this.gradient1 = gradient1;\n this.gradient2 = gradient2;\n }\n startGen(memory) {\n this.indexCount = memory.length;\n memory.push(Math.random());\n }\n genColor(memory, color, t) {\n this.gradient1.genColor(memory, color, t);\n this.gradient2.genColor(memory, tempColor, t);\n if (memory && memory[this.indexCount] !== undefined) {\n color.lerp(tempColor, memory[this.indexCount]);\n }\n else {\n color.lerp(tempColor, Math.random());\n }\n return color;\n }\n toJSON() {\n return {\n type: 'RandomColorBetweenGradient',\n gradient1: this.gradient1.toJSON(),\n gradient2: this.gradient2.toJSON(),\n };\n }\n static fromJSON(json) {\n return new RandomColorBetweenGradient(Gradient.fromJSON(json.gradient1), Gradient.fromJSON(json.gradient2));\n }\n clone() {\n return new RandomColorBetweenGradient(this.gradient1.clone(), this.gradient2.clone());\n }\n}\n\nclass ConstantColor {\n constructor(color) {\n this.color = color;\n this.type = 'value';\n }\n startGen(memory) { }\n genColor(memoryGenerator, color) {\n return color.copy(this.color);\n }\n toJSON() {\n return {\n type: 'ConstantColor',\n color: ColorToJSON(this.color),\n };\n }\n static fromJSON(json) {\n return new ConstantColor(JSONToColor(json.color));\n }\n clone() {\n return new ConstantColor(this.color.clone());\n }\n}\nfunction ColorGeneratorFromJSON(json) {\n switch (json.type) {\n case 'ConstantColor':\n return ConstantColor.fromJSON(json);\n case 'ColorRange':\n return ColorRange.fromJSON(json);\n case 'RandomColor':\n return RandomColor.fromJSON(json);\n case 'Gradient':\n return Gradient.fromJSON(json);\n case 'RandomColorBetweenGradient':\n return RandomColorBetweenGradient.fromJSON(json);\n default:\n return new ConstantColor(new Vector4(1, 1, 1, 1));\n }\n}\n\nclass EulerGenerator {\n constructor(angleX, angleY, angleZ, eulerOrder) {\n this.angleX = angleX;\n this.angleY = angleY;\n this.angleZ = angleZ;\n this.type = 'rotation';\n this.eular = new Euler(0, 0, 0, eulerOrder);\n }\n startGen(memory) {\n this.angleX.startGen(memory);\n this.angleY.startGen(memory);\n this.angleZ.startGen(memory);\n }\n genValue(memory, quat, delta, t) {\n this.eular.set(this.angleX.genValue(memory, t) * delta, this.angleY.genValue(memory, t) * delta, this.angleZ.genValue(memory, t) * delta);\n return quat.setFromEuler(this.eular);\n }\n toJSON() {\n return {\n type: 'Euler',\n angleX: this.angleX.toJSON(),\n angleY: this.angleY.toJSON(),\n angleZ: this.angleZ.toJSON(),\n eulerOrder: this.eular.order,\n };\n }\n static fromJSON(json) {\n return new EulerGenerator(ValueGeneratorFromJSON(json.angleX), ValueGeneratorFromJSON(json.angleY), ValueGeneratorFromJSON(json.angleZ), json.eulerOrder);\n }\n clone() {\n return new EulerGenerator(this.angleX, this.angleY, this.angleZ, this.eular.order);\n }\n}\n\nclass RandomQuatGenerator {\n constructor() {\n this.indexCount = 0;\n this.type = 'rotation';\n }\n // Four numeric slots rather than one Quaternion object: nothing is allocated\n // per spawn, and the numbers can be mirrored into the store's memory column.\n startGen(memory) {\n this.indexCount = memory.length;\n let x, y, z, u, v, w;\n do {\n x = Math.random() * 2 - 1;\n y = Math.random() * 2 - 1;\n z = x * x + y * y;\n } while (z > 1);\n do {\n u = Math.random() * 2 - 1;\n v = Math.random() * 2 - 1;\n w = u * u + v * v;\n } while (w > 1);\n const s = Math.sqrt((1 - z) / w);\n memory.push(x, y, s * u, s * v);\n }\n genValue(memory, quat, delta, t) {\n if (this.indexCount === -1) {\n this.startGen(memory);\n }\n const index = this.indexCount;\n quat.set(memory[index], memory[index + 1], memory[index + 2], memory[index + 3]);\n return quat;\n }\n toJSON() {\n return {\n type: 'RandomQuat',\n };\n }\n static fromJSON(json) {\n return new RandomQuatGenerator();\n }\n clone() {\n return new RandomQuatGenerator();\n }\n}\n\nfunction RotationGeneratorFromJSON(json) {\n switch (json.type) {\n case 'AxisAngle':\n return AxisAngleGenerator.fromJSON(json);\n case 'Euler':\n return EulerGenerator.fromJSON(json);\n case 'RandomQuat':\n return RandomQuatGenerator.fromJSON(json);\n default:\n return new RandomQuatGenerator();\n }\n}\n\nclass Vector3Function {\n constructor(x, y, z) {\n this.x = x;\n this.y = y;\n this.z = z;\n this.type = 'vec3function';\n }\n startGen(memory) {\n this.x.startGen(memory);\n this.y.startGen(memory);\n this.z.startGen(memory);\n }\n genValue(memory, vec, t) {\n return vec.set(this.x.genValue(memory, t), this.y.genValue(memory, t), this.z.genValue(memory, t));\n }\n toJSON() {\n return {\n type: 'Vector3Function',\n x: this.x.toJSON(),\n y: this.y.toJSON(),\n z: this.z.toJSON(),\n };\n }\n static fromJSON(json) {\n return new Vector3Function(ValueGeneratorFromJSON(json.x), ValueGeneratorFromJSON(json.y), ValueGeneratorFromJSON(json.z));\n }\n clone() {\n return new Vector3Function(this.x, this.y, this.z);\n }\n}\n\nfunction Vector3GeneratorFromJSON(json) {\n switch (json.type) {\n case 'Vector3Function':\n return Vector3Function.fromJSON(json);\n default:\n return new Vector3Function(new ConstantValue(0), new ConstantValue(0), new ConstantValue(0));\n }\n}\n\nfunction GeneratorFromJSON(json) {\n switch (json.type) {\n case 'ConstantValue':\n case 'IntervalValue':\n case 'PiecewiseBezier':\n return ValueGeneratorFromJSON(json);\n case 'AxisAngle':\n case 'RandomQuat':\n case 'Euler':\n return RotationGeneratorFromJSON(json);\n case 'Vector3Function':\n return Vector3GeneratorFromJSON(json);\n default:\n return new ConstantValue(0);\n }\n}\n\n/**\n * Apply a global force to particles.\n */\nclass ApplyForce {\n constructor(direction, magnitude) {\n this.direction = direction;\n this.magnitude = magnitude;\n this.type = 'ApplyForce';\n this.memory = {\n data: [],\n dataCount: 0,\n };\n this.magnitudeValue = this.magnitude.genValue(this.memory);\n }\n initialize(particle) { }\n update(particle, delta) {\n const scale = this.magnitudeValue * delta;\n const direction = this.direction;\n const velocity = particle.velocity;\n velocity.x += direction.x * scale;\n velocity.y += direction.y * scale;\n velocity.z += direction.z * scale;\n }\n updateAll(particles, count, delta) {\n // The force is identical for every particle, so the vector maths\n // collapses to three constants computed once per frame.\n const scale = this.magnitudeValue * delta;\n const dx = this.direction.x * scale;\n const dy = this.direction.y * scale;\n const dz = this.direction.z * scale;\n for (let i = 0; i < count; i++) {\n const particle = particles[i];\n if (particle.age >= particle.life) {\n continue;\n }\n const velocity = particle.velocity;\n velocity.x += dx;\n velocity.y += dy;\n velocity.z += dz;\n }\n }\n frameUpdate(delta) {\n this.magnitudeValue = this.magnitude.genValue(this.memory);\n }\n toJSON() {\n return {\n type: this.type,\n direction: [this.direction.x, this.direction.y, this.direction.z],\n magnitude: this.magnitude.toJSON(),\n };\n }\n static fromJSON(json) {\n return new ApplyForce(new Vector3(json.direction[0], json.direction[1], json.direction[2]), ValueGeneratorFromJSON(json.magnitude ?? json.force));\n }\n clone() {\n return new ApplyForce(this.direction.clone(), this.magnitude.clone());\n }\n reset() { }\n}\n\nclass TextureSequencer {\n constructor(scaleX = 0, scaleY = 0, position = new Vector3()) {\n this.scaleX = scaleX;\n this.scaleY = scaleY;\n this.position = position;\n this.locations = [];\n }\n transform(position, index) {\n position.x = this.locations[index % this.locations.length].x * this.scaleX + this.position.x;\n position.y = this.locations[index % this.locations.length].y * this.scaleY + this.position.y;\n position.z = this.position.z;\n }\n static fromJSON(json) {\n const textureSequencer = new TextureSequencer(json.scaleX, json.scaleY, new Vector3(json.position[0], json.position[1], json.position[2]));\n textureSequencer.locations = json.locations.map((loc) => new Vector2(loc.x, loc.y));\n return textureSequencer;\n }\n clone() {\n const textureSequencer = new TextureSequencer(this.scaleX, this.scaleY, this.position.clone());\n textureSequencer.locations = this.locations.map((loc) => loc.clone());\n return textureSequencer;\n }\n toJSON() {\n return {\n scaleX: this.scaleX,\n scaleY: this.scaleY,\n position: this.position,\n locations: this.locations.map((loc) => ({\n x: loc.x,\n y: loc.y,\n })),\n };\n }\n fromImage(img, threshold) {\n // Create an empty canvas element\n const canvas = document.createElement('canvas');\n canvas.width = img.width;\n canvas.height = img.height;\n // Copy the image contents to the canvas\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n return;\n }\n ctx.drawImage(img, 0, 0);\n const data = ctx.getImageData(0, 0, canvas.width, canvas.height, { colorSpace: 'srgb' });\n canvas.remove();\n this.locations.length = 0;\n for (let i = 0; i < data.height; i++) {\n for (let j = 0; j < data.width; j++) {\n if (data.data[(i * data.width + j) * 4 + 3] > threshold) {\n this.locations.push(new Vector2(j, data.height - i));\n }\n }\n }\n //return data;\n // Get the data-URL formatted image\n // Firefox supports PNG and JPEG. You could check img.src to\n // guess the original format, but be aware the using \"image/jpg\"\n // will re-encode the image.\n //var dataURL = canvas.toDataURL(\"image/png\");\n //return dataURL.replace(/^data:image\\/(png|jpg);base64,/, \"\");\n }\n}\n\nfunction SequencerFromJSON(json) {\n switch (json.type) {\n case 'TextureSequencer':\n return TextureSequencer.fromJSON(json);\n default:\n return new TextureSequencer();\n }\n}\n\n/**\n * Apply sequences to particles.\n * {@link Sequencer}\n */\nclass ApplySequences {\n constructor(delayBetweenParticles) {\n this.type = 'ApplySequences';\n this.sequencers = [];\n this.time = 0;\n this.index = 0;\n this.pCount = 0;\n this.tempV = new Vector3();\n this.delay = delayBetweenParticles;\n }\n initialize(particle) {\n particle.id = this.pCount;\n particle.dst = new Vector3();\n particle.begin = new Vector3();\n particle.inMotion = false;\n this.pCount++;\n }\n reset() {\n this.time = 0;\n this.index = 0;\n this.pCount = 0;\n }\n update(particle, delta) {\n const sequencer = this.sequencers[this.index];\n const delay = particle.id * this.delay;\n if (this.time >= sequencer[0].a + delay && this.time <= sequencer[0].b + delay) {\n if (!particle.inMotion) {\n particle.inMotion = true;\n particle.begin.copy(particle.position);\n sequencer[1].transform(particle.dst, particle.id);\n }\n particle.position.lerpVectors(particle.begin, particle.dst, ApplySequences.BEZIER.genValue((this.time - sequencer[0].a - delay) / (sequencer[0].b - sequencer[0].a)));\n }\n else if (this.time > sequencer[0].b + delay) {\n particle.inMotion = false;\n }\n }\n frameUpdate(delta) {\n while (this.index + 1 < this.sequencers.length && this.time >= this.sequencers[this.index + 1][0].a) {\n this.index++;\n }\n this.time += delta;\n }\n appendSequencer(range, sequencer) {\n this.sequencers.push([range, sequencer]);\n }\n toJSON() {\n return {\n type: this.type,\n delay: this.delay,\n sequencers: this.sequencers.map(([range, sequencer]) => ({\n range: range.toJSON(),\n sequencer: sequencer.toJSON(),\n })),\n };\n }\n static fromJSON(json) {\n const seq = new ApplySequences(json.delay);\n json.sequencers.forEach((sequencerJson) => {\n seq.sequencers.push([\n ValueGeneratorFromJSON(sequencerJson.range),\n SequencerFromJSON(sequencerJson.sequencer),\n ]);\n });\n return seq;\n }\n clone() {\n const applySequences = new ApplySequences(this.delay);\n applySequences.sequencers = this.sequencers.map((seq) => [seq[0].clone(), seq[1].clone()]);\n return applySequences;\n }\n}\nApplySequences.BEZIER = new Bezier(0, 0, 1, 1);\n\n/**\n * Change the emit direction of particles.\n */\nclass ChangeEmitDirection {\n constructor(angle) {\n this.angle = angle;\n this.type = 'ChangeEmitDirection';\n this._temp = new Vector3();\n this._q = new Quaternion();\n this.memory = { data: [], dataCount: 0 };\n }\n initialize(particle) {\n const len = particle.velocity.length();\n if (len == 0)\n return;\n particle.velocity.normalize();\n if (particle.velocity.x === 0 && particle.velocity.y === 0) {\n this._temp.set(0, particle.velocity.z, 0);\n }\n else {\n this._temp.set(-particle.velocity.y, particle.velocity.x, 0);\n }\n this.angle.startGen(this.memory);\n this._q.setFromAxisAngle(this._temp.normalize(), this.angle.genValue(this.memory));\n this._temp.copy(particle.velocity);\n particle.velocity.applyQuaternion(this._q);\n this._q.setFromAxisAngle(this._temp, Math.random() * Math.PI * 2);\n particle.velocity.applyQuaternion(this._q);\n particle.velocity.setLength(len);\n }\n update(particle, delta) { }\n frameUpdate(delta) { }\n toJSON() {\n return {\n type: this.type,\n angle: this.angle.toJSON(),\n };\n }\n static fromJSON(json) {\n return new ChangeEmitDirection(ValueGeneratorFromJSON(json.angle));\n }\n clone() {\n return new ChangeEmitDirection(this.angle);\n }\n reset() { }\n}\n\n/**\n * Color particles by their speed.\n */\nclass ColorBySpeed {\n constructor(color, speedRange) {\n this.color = color;\n this.speedRange = speedRange;\n this.type = 'ColorBySpeed';\n }\n initialize(particle) {\n this.color.startGen(particle.memory);\n }\n update(particle, delta) {\n const t = (particle.startSpeed - this.speedRange.a) / (this.speedRange.b - this.speedRange.a);\n this.color.genColor(particle.memory, particle.color, t);\n particle.color.x *= particle.startColor.x;\n particle.color.y *= particle.startColor.y;\n particle.color.z *= particle.startColor.z;\n particle.color.w *= particle.startColor.w;\n }\n frameUpdate(delta) { }\n toJSON() {\n return {\n type: this.type,\n color: this.color.toJSON(),\n speedRange: this.speedRange.toJSON(),\n };\n }\n static fromJSON(json) {\n return new ColorBySpeed(ColorGeneratorFromJSON(json.color), IntervalValue.fromJSON(json.speedRange));\n }\n clone() {\n return new ColorBySpeed(this.color.clone(), this.speedRange.clone());\n }\n reset() { }\n}\n\n/**\n * Color particles by their life.\n */\nclass ColorOverLife {\n constructor(color) {\n this.color = color;\n this.type = 'ColorOverLife';\n }\n initialize(particle) {\n this.color.startGen(particle.memory);\n }\n update(particle, delta) {\n const color = particle.color;\n const startColor = particle.startColor;\n this.color.genColor(particle.memory, color, particle.age / particle.life);\n color.x *= startColor.x;\n color.y *= startColor.y;\n color.z *= startColor.z;\n color.w *= startColor.w;\n }\n updateAll(particles, count, delta) {\n // Hoisting the generator makes genColor a monomorphic call site here,\n // unlike the shared per-particle dispatch in the system.\n const generator = this.color;\n for (let i = 0; i < count; i++) {\n const particle = particles[i];\n if (particle.age >= particle.life) {\n continue;\n }\n const color = particle.color;\n const startColor = particle.startColor;\n generator.genColor(particle.memory, color, particle.age / particle.life);\n color.x *= startColor.x;\n color.y *= startColor.y;\n color.z *= startColor.z;\n color.w *= startColor.w;\n }\n }\n frameUpdate(delta) {\n // Refresh once per frame, before either update path reads the generator,\n // so both see the same values and an edited gradient is picked up.\n this.color.refreshTable?.();\n }\n toJSON() {\n return {\n type: this.type,\n color: this.color.toJSON(),\n };\n }\n static fromJSON(json) {\n return new ColorOverLife(ColorGeneratorFromJSON(json.color));\n }\n clone() {\n return new ColorOverLife(this.color.clone());\n }\n reset() { }\n}\n\nfunction randomInt(a, b) {\n return Math.floor(Math.random() * (b - a)) + a;\n}\nconst UP_VEC3 = new Vector3(0, 1, 0);\nconst ZERO_VEC3 = new Vector3(0, 0, 0);\nconst ONE_VEC3 = new Vector3(1, 1, 1);\nconst Z_VEC3 = new Vector3(0, 0, 1);\n\nvar SubParticleEmitMode;\n(function (SubParticleEmitMode) {\n SubParticleEmitMode[SubParticleEmitMode[\"Death\"] = 0] = \"Death\";\n SubParticleEmitMode[SubParticleEmitMode[\"Birth\"] = 1] = \"Birth\";\n SubParticleEmitMode[SubParticleEmitMode[\"Frame\"] = 2] = \"Frame\";\n})(SubParticleEmitMode || (SubParticleEmitMode = {}));\n/**\n * Emit a sub particle system from particles.\n */\nclass EmitSubParticleSystem {\n constructor(particleSystem, useVelocityAsBasis, subParticleSystem, mode = SubParticleEmitMode.Frame, emitProbability = 1) {\n this.particleSystem = particleSystem;\n this.useVelocityAsBasis = useVelocityAsBasis;\n this.subParticleSystem = subParticleSystem;\n this.mode = mode;\n this.emitProbability = emitProbability;\n this.type = 'EmitSubParticleSystem';\n //private matrix_ = new Matrix4();\n this.q_ = new Quaternion();\n this.v_ = new Vector3();\n this.v2_ = new Vector3();\n this.subEmissions = new Array();\n /** Finished emission states, kept for reuse: a burst of deaths would otherwise allocate one plus a matrix each. */\n this.spareEmissions = new Array();\n const target = this.target;\n if (target) {\n target.onlyUsedByOther = true;\n }\n }\n initialize(particle) {\n /*particle.emissionState = {\n burstIndex: 0,\n burstWaveIndex: 0,\n time: 0,\n waitEmiting: 0,\n matrix: new Matrix4(),\n } as EmissionState;*/\n }\n update(particle, delta) {\n if (this.mode === SubParticleEmitMode.Frame) {\n this.emit(particle, delta);\n }\n else if (this.mode === SubParticleEmitMode.Birth && particle.age === 0) {\n this.emit(particle, delta);\n }\n else if (this.mode === SubParticleEmitMode.Death && particle.age + delta >= particle.life) {\n this.emit(particle, delta);\n }\n }\n /**\n * The system to emit into, or undefined when `subParticleSystem` does not\n * hold a resolved emitter — unset, or a uuid string a loader could not\n * link. Every use goes through here, so a bad value is skipped rather\n * than thrown on.\n */\n get target() {\n const sub = this.subParticleSystem;\n if (sub === null || typeof sub !== 'object') {\n return undefined;\n }\n return sub.system;\n }\n emit(particle, delta) {\n if (!this.target)\n return;\n if (Math.random() > this.emitProbability) {\n return;\n }\n const spare = this.spareEmissions.pop();\n const state = spare !== undefined\n ? spare\n : {\n burstParticleCount: 0,\n burstParticleIndex: 0,\n isBursting: false,\n burstIndex: 0,\n burstWaveIndex: 0,\n time: 0,\n waitEmiting: 0,\n matrix: new Matrix4(),\n travelDistance: 0,\n particle: undefined,\n previousWorldPos: undefined,\n };\n state.burstParticleCount = 0;\n state.burstParticleIndex = 0;\n state.isBursting = false;\n state.burstIndex = 0;\n state.burstWaveIndex = 0;\n state.time = 0;\n state.waitEmiting = 0;\n state.travelDistance = 0;\n state.particle = particle;\n state.previousWorldPos = undefined;\n this.setMatrixFromParticle(state.matrix, particle);\n this.subEmissions.push(state);\n //(this.subParticleSystem.system as ParticleSystem).emit(delta, particle.emissionState, m);\n }\n frameUpdate(delta) {\n const target = this.target;\n if (!target) {\n this.subEmissions.length = 0;\n return;\n }\n for (let i = 0; i < this.subEmissions.length; i++) {\n if (this.subEmissions[i].time >= target.duration) {\n const finished = this.subEmissions[i];\n finished.particle = undefined;\n this.spareEmissions.push(finished);\n this.subEmissions[i] = this.subEmissions[this.subEmissions.length - 1];\n this.subEmissions.length = this.subEmissions.length - 1;\n i--;\n }\n else {\n const subEmissionState = this.subEmissions[i];\n if (subEmissionState.particle && subEmissionState.particle.age < subEmissionState.particle.life) {\n this.setMatrixFromParticle(subEmissionState.matrix, subEmissionState.particle);\n }\n else {\n subEmissionState.particle = undefined;\n }\n target.emit(delta, subEmissionState, subEmissionState.matrix);\n }\n }\n }\n toJSON() {\n return {\n type: this.type,\n // An unresolved uuid is written back as it was read.\n subParticleSystem: typeof this.subParticleSystem === 'string'\n ? this.subParticleSystem\n : this.subParticleSystem\n ? this.subParticleSystem.uuid\n : '',\n useVelocityAsBasis: this.useVelocityAsBasis,\n mode: this.mode,\n emitProbability: this.emitProbability,\n };\n }\n static fromJSON(json, particleSystem) {\n return new EmitSubParticleSystem(particleSystem, json.useVelocityAsBasis, json.subParticleSystem, json.mode, json.emitProbability);\n }\n clone() {\n return new EmitSubParticleSystem(this.particleSystem, this.useVelocityAsBasis, this.subParticleSystem, this.mode, this.emitProbability);\n }\n reset() { }\n setMatrixFromParticle(m, particle) {\n let rotation;\n if (particle.rotation === undefined || this.useVelocityAsBasis) {\n if (particle.velocity.x === 0 &&\n particle.velocity.y === 0 &&\n (particle.velocity.z === 1 || particle.velocity.z === 0)) {\n m.set(1, 0, 0, particle.position.x, 0, 1, 0, particle.position.y, 0, 0, 1, particle.position.z, 0, 0, 0, 1);\n }\n else {\n this.v_.copy(Z_VEC3).cross(particle.velocity);\n this.v2_.copy(particle.velocity).cross(this.v_);\n const len = this.v_.length();\n const len2 = this.v2_.length();\n m.set(this.v_.x / len, this.v2_.x / len2, particle.velocity.x, particle.position.x, this.v_.y / len, this.v2_.y / len2, particle.velocity.y, particle.position.y, this.v_.z / len, this.v2_.z / len2, particle.velocity.z, particle.position.z, 0, 0, 0, 1);\n }\n }\n else {\n if (particle.rotation instanceof Quaternion) {\n rotation = particle.rotation;\n }\n else {\n this.q_.setFromAxisAngle(Z_VEC3, particle.rotation);\n rotation = this.q_;\n }\n m.compose(particle.position, rotation, ONE_VEC3);\n }\n if (!this.particleSystem.worldSpace) {\n m.multiplyMatrices(this.particleSystem.emitter.matrixWorld, m);\n }\n }\n}\n\n/**\n * Apply a force to particles over their life.\n */\nclass ForceOverLife {\n initialize(particle, particleSystem) {\n this.ps = particleSystem;\n this.x.startGen(particle.memory);\n this.y.startGen(particle.memory);\n this.z.startGen(particle.memory);\n }\n constructor(x, y, z) {\n this.x = x;\n this.y = y;\n this.z = z;\n this.type = 'ForceOverLife';\n this._temp = new Vector3();\n this._tempScale = new Vector3();\n this._tempQ = new Quaternion();\n }\n update(particle, delta) {\n this._temp.set(this.x.genValue(particle.memory, particle.age / particle.life), this.y.genValue(particle.memory, particle.age / particle.life), this.z.genValue(particle.memory, particle.age / particle.life));\n // Undefined until initialize() has run for this behavior; treat an\n // unknown system as world space rather than throwing.\n if (this.ps === undefined || this.ps.worldSpace) {\n particle.velocity.addScaledVector(this._temp, delta);\n }\n else {\n this._temp.multiply(this._tempScale).applyQuaternion(this._tempQ);\n particle.velocity.addScaledVector(this._temp, delta);\n }\n }\n updateAll(particles, count, delta) {\n const system = this.ps;\n // The system is only learned in initialize(), which has not run while the\n // system is empty — a sub emitter waiting to be triggered, or a behavior\n // added after the particles were spawned. There is nothing to apply yet.\n if (system === undefined) {\n return;\n }\n const temp = this._temp;\n const generatorX = this.x;\n const generatorY = this.y;\n const generatorZ = this.z;\n // The space test is per system, not per particle.\n const worldSpace = system.worldSpace;\n for (let i = 0; i < count; i++) {\n const particle = particles[i];\n if (particle.age >= particle.life) {\n continue;\n }\n const memory = particle.memory;\n const t = particle.age / particle.life;\n temp.set(generatorX.genValue(memory, t), generatorY.genValue(memory, t), generatorZ.genValue(memory, t));\n if (!worldSpace) {\n temp.multiply(this._tempScale).applyQuaternion(this._tempQ);\n }\n particle.velocity.addScaledVector(temp, delta);\n }\n }\n toJSON() {\n return {\n type: this.type,\n x: this.x.toJSON(),\n y: this.y.toJSON(),\n z: this.z.toJSON(),\n };\n }\n static fromJSON(json) {\n return new ForceOverLife(ValueGeneratorFromJSON(json.x), ValueGeneratorFromJSON(json.y), ValueGeneratorFromJSON(json.z));\n }\n frameUpdate(delta) {\n if (this.ps && !this.ps.worldSpace) {\n const translation = this._temp;\n const quaternion = this._tempQ;\n const scale = this._tempScale;\n this.ps.emitter.matrixWorld.decompose(translation, quaternion, scale);\n quaternion.invert();\n scale.set(1 / scale.x, 1 / scale.y, 1 / scale.z);\n }\n }\n clone() {\n return new ForceOverLife(this.x.clone(), this.y.clone(), this.z.clone());\n }\n reset() { }\n}\n\n/**\n * apply tile number of particle texture by particles' life.\n */\nclass FrameOverLife {\n constructor(frame) {\n this.type = 'FrameOverLife';\n this.frame = frame;\n }\n get frame() {\n return this._frame;\n }\n set frame(frame) {\n this._frame = frame;\n }\n initialize(particle) {\n this._frame.startGen(particle.memory);\n }\n update(particle, delta) {\n particle.uvTile = this.sampleFrame(particle, particle.age / particle.life);\n }\n updateAll(particles, count, delta) {\n for (let i = 0; i < count; i++) {\n const particle = particles[i];\n if (particle.age >= particle.life) {\n continue;\n }\n particle.uvTile = this.sampleFrame(particle, particle.age / particle.life);\n }\n }\n sampleFrame(particle, t) {\n return this._frame.type === 'function'\n ? this._frame.genValue(particle.memory, t)\n : this._frame.genValue(particle.memory);\n }\n frameUpdate(delta) {\n this._frame.refreshTable?.();\n }\n toJSON() {\n return {\n type: this.type,\n frame: this.frame.toJSON(),\n };\n }\n static fromJSON(json) {\n return new FrameOverLife(ValueGeneratorFromJSON(json.frame));\n }\n clone() {\n return new FrameOverLife(this.frame.clone());\n }\n reset() { }\n}\n\n/**\n * Apply a gravity force to particles.\n * the gravity force is calculated as:\n * F = G * m1 * m2 / r^2\n */\nclass GravityForce {\n constructor(center, magnitude) {\n this.center = center;\n this.magnitude = magnitude;\n this.type = 'GravityForce';\n this.temp = new Vector3();\n }\n initialize(particle) { }\n update(particle, delta) {\n const distanceSquared = particle.position.distanceToSquared(this.center);\n // A particle sitting exactly on the attractor used to divide by zero and\n // poison its velocity with NaN; leave it untouched instead.\n if (distanceSquared === 0) {\n return;\n }\n this.temp.copy(this.center).sub(particle.position).normalize();\n particle.velocity.addScaledVector(this.temp, (this.magnitude / distanceSquared) * delta);\n }\n updateAll(particles, count, delta) {\n // The attractor is fixed, so its components and the scaled magnitude are\n // constants for the whole run.\n const cx = this.center.x;\n const cy = this.center.y;\n const cz = this.center.z;\n const magnitude = this.magnitude * delta;\n for (let i = 0; i < count; i++) {\n const particle = particles[i];\n if (particle.age >= particle.life) {\n continue;\n }\n const position = particle.position;\n const dx = cx - position.x;\n const dy = cy - position.y;\n const dz = cz - position.z;\n const distanceSquared = dx * dx + dy * dy + dz * dz;\n if (distanceSquared === 0) {\n continue;\n }\n // normalize then scale by magnitude / distance², folded into one factor\n const scale = magnitude / (distanceSquared * Math.sqrt(distanceSquared));\n const velocity = particle.velocity;\n velocity.x += dx * scale;\n velocity.y += dy * scale;\n velocity.z += dz * scale;\n }\n }\n frameUpdate(delta) { }\n toJSON() {\n return {\n type: this.type,\n center: [this.center.x, this.center.y, this.center.z],\n magnitude: this.magnitude,\n };\n }\n static fromJSON(json) {\n return new GravityForce(new Vector3(json.center[0], json.center[1], json.center[2]), json.magnitude);\n }\n clone() {\n return new GravityForce(this.center.clone(), this.magnitude);\n }\n reset() { }\n}\n\n/**\n * Make particles inherit the emitter's movement velocity (Unity's \"Inherit Velocity\").\n * 'initial' adds the emitter velocity to the particle velocity once at spawn;\n * 'current' displaces particles by the current emitter velocity every frame.\n */\nclass InheritVelocity {\n constructor(multiplier = new ConstantValue(1), mode = 'initial') {\n this.multiplier = multiplier;\n this.mode = mode;\n this.type = 'InheritVelocity';\n this._temp = new Vector3();\n this._tempPos = new Vector3();\n this._tempQInv = new Quaternion();\n this._tempScaleInv = new Vector3(1, 1, 1);\n }\n initialize(particle, particleSystem) {\n this.ps = particleSystem;\n this.multiplier.startGen(particle.memory);\n if (this.mode === 'initial' && particleSystem.emitterVelocity) {\n this._temp.copy(particleSystem.emitterVelocity);\n if (!particleSystem.worldSpace) {\n // initialize runs during emit(), before this frame's frameUpdate cache\n // exists, so decompose the emitter matrix on demand.\n this.decomposeInverse(particleSystem);\n this._temp.multiply(this._tempScaleInv).applyQuaternion(this._tempQInv);\n }\n particle.velocity.addScaledVector(this._temp, this.multiplier.genValue(particle.memory, 0));\n }\n }\n frameUpdate(delta) {\n if (this.ps && !this.ps.worldSpace) {\n this.decomposeInverse(this.ps);\n }\n }\n update(particle, delta) {\n // ps is undefined until initialize() has run for this behavior.\n if (this.mode !== 'current' || this.ps === undefined || !this.ps.emitterVelocity) {\n return;\n }\n this._temp.copy(this.ps.emitterVelocity);\n if (!this.ps.worldSpace) {\n this._temp.multiply(this._tempScaleInv).applyQuaternion(this._tempQInv);\n }\n particle.position.addScaledVector(this._temp, this.multiplier.genValue(particle.memory, particle.age / particle.life) * delta);\n }\n decomposeInverse(particleSystem) {\n particleSystem.emitter.matrixWorld.decompose(this._tempPos, this._tempQInv, this._tempScaleInv);\n this._tempQInv.invert();\n this._tempScaleInv.set(1 / this._tempScaleInv.x, 1 / this._tempScaleInv.y, 1 / this._tempScaleInv.z);\n }\n toJSON() {\n return {\n type: this.type,\n multiplier: this.multiplier.toJSON(),\n mode: this.mode,\n };\n }\n static fromJSON(json) {\n return new InheritVelocity(json.multiplier\n ? ValueGeneratorFromJSON(json.multiplier)\n : new ConstantValue(1), json.mode === 'current' ? 'current' : 'initial');\n }\n clone() {\n return new InheritVelocity(this.multiplier.clone(), this.mode);\n }\n reset() { }\n}\n\n/**\n * Limit the speed of particles over their life.\n */\nclass LimitSpeedOverLife {\n initialize(particle) {\n this.speed.startGen(particle.memory);\n }\n constructor(speed, dampen) {\n this.speed = speed;\n this.dampen = dampen;\n this.type = 'LimitSpeedOverLife';\n }\n update(particle, delta) {\n let speed = particle.velocity.length();\n let limit = this.speed.genValue(particle.memory, particle.age / particle.life);\n if (speed > limit) {\n const percent = (speed - limit) / speed;\n particle.velocity.multiplyScalar(1 - percent * this.dampen * delta * 20);\n }\n }\n updateAll(particles, count, delta) {\n const generator = this.speed;\n const dampenStep = this.dampen * delta * 20;\n for (let i = 0; i < count; i++) {\n const particle = particles[i];\n if (particle.age >= particle.life) {\n continue;\n }\n const velocity = particle.velocity;\n const speed = velocity.length();\n const limit = generator.genValue(particle.memory, particle.age / particle.life);\n if (speed > limit) {\n velocity.multiplyScalar(1 - ((speed - limit) / speed) * dampenStep);\n }\n }\n }\n toJSON() {\n return {\n type: this.type,\n speed: this.speed.toJSON(),\n dampen: this.dampen,\n };\n }\n static fromJSON(json) {\n return new LimitSpeedOverLife(ValueGeneratorFromJSON(json.speed), json.dampen);\n }\n frameUpdate(delta) {\n this.speed.refreshTable?.();\n }\n clone() {\n return new LimitSpeedOverLife(this.speed.clone(), this.dampen);\n }\n reset() { }\n}\n\n/**\n * Column storage for the vector-valued particle attributes.\n *\n * The three-component and four-component fields of a particle used to be six\n * separate objects per particle, so walking a system meant chasing pointers\n * across the heap. Here each attribute is one flat `Float32Array` shared by\n * every particle in a system, and a particle holds views into its own row. The\n * numbers a simulation step touches are then contiguous and prefetchable, while\n * `particle.position.x` keeps working exactly as before.\n *\n * Scalar attributes (age, life, rotation, …) stay as plain properties on the\n * particle: a monomorphic own property is already a single load, so moving them\n * here would add an indirection rather than remove one.\n */\nclass ParticleStore {\n constructor(capacity = 64) {\n /**\n * Velocity at the start of the current step. A stretched billboard's shape\n * is its velocity — the streak points along it and is as long as it — so a\n * velocity that only changes on steps makes the sprite's outline pop at the\n * step rate even while its position moves smoothly.\n *\n * Empty until {@link keepPreviousVelocity} asks for it, because only that\n * one render mode reads it and an unused column is not free: it sits\n * between the columns that are hot and costs them their locality.\n */\n this.previousVelocity = ParticleStore.EMPTY;\n /**\n * Quaternion rotation and one step's quaternion turn, 4 per row, for\n * particles that rotate by quaternion (mesh render mode). Empty until\n * {@link ensureQuaternionColumns} is asked for them, so systems of\n * billboards do not pay for columns they never read.\n */\n this.rotationQuaternion = ParticleStore.EMPTY;\n this.angularVelocityQuaternion = ParticleStore.EMPTY;\n /**\n * Numeric copy of each particle's generator memory, {@link memoryStride}\n * values per row. The spawn path calls every generator's `startGen` in a\n * fixed order, so a given slot holds the same generator's sample for every\n * particle, which lets a compiled behavior pass read a particle's random\n * sample from a column instead of through its `memory` array. Slots that\n * hold something other than a number are NaN here; readers then fall back\n * to the array. Empty until {@link recordMemory} sees the first spawn.\n */\n this.memory = new Float64Array(0);\n this.memoryStride = 0;\n this.capacity = Math.max(1, capacity);\n this.position = new Float32Array(this.capacity * 3);\n this.previousPosition = new Float32Array(this.capacity * 3);\n this.previousSize = new Float32Array(this.capacity * 3);\n this.previousColor = new Float32Array(this.capacity * 4);\n this.velocity = new Float32Array(this.capacity * 3);\n this.size = new Float32Array(this.capacity * 3);\n this.startSize = new Float32Array(this.capacity * 3);\n this.color = new Float32Array(this.capacity * 4);\n this.startColor = new Float32Array(this.capacity * 4);\n this.scalars = new Float64Array(this.capacity * ParticleStore.SCALAR_STRIDE);\n this.rotation = new Float32Array(this.capacity);\n this.angularVelocity = new Float32Array(this.capacity);\n this.uvTile = new Float32Array(this.capacity);\n this.startSpeed = new Float32Array(this.capacity);\n this.flip = new Uint8Array(this.capacity);\n }\n /**\n * Grows the arrays so `count` rows fit, preserving the existing contents.\n *\n * @param count - Number of rows that must be addressable.\n * @returns `true` when the arrays were replaced, meaning every particle\n * bound to this store has to be re-bound.\n */\n ensureCapacity(count) {\n if (count <= this.capacity) {\n return false;\n }\n let capacity = this.capacity;\n while (capacity < count) {\n capacity *= 2;\n }\n this.position = ParticleStore.grow(this.position, capacity * 3);\n this.previousPosition = ParticleStore.grow(this.previousPosition, capacity * 3);\n const sizeAliased = this.previousSize === this.size;\n const colorAliased = this.previousColor === this.color;\n if (!sizeAliased) {\n this.previousSize = ParticleStore.grow(this.previousSize, capacity * 3);\n }\n if (this.previousVelocity.length > 0) {\n this.previousVelocity = ParticleStore.grow(this.previousVelocity, capacity * 3);\n }\n if (this.rotationQuaternion.length > 0) {\n const previousLength = this.rotationQuaternion.length;\n this.rotationQuaternion = ParticleStore.grow(this.rotationQuaternion, capacity * 4);\n this.angularVelocityQuaternion = ParticleStore.grow(this.angularVelocityQuaternion, capacity * 4);\n for (let i = previousLength + 3; i < capacity * 4; i += 4) {\n this.rotationQuaternion[i] = 1;\n this.angularVelocityQuaternion[i] = 1;\n }\n }\n if (!colorAliased) {\n this.previousColor = ParticleStore.grow(this.previousColor, capacity * 4);\n }\n this.velocity = ParticleStore.grow(this.velocity, capacity * 3);\n this.size = ParticleStore.grow(this.size, capacity * 3);\n this.startSize = ParticleStore.grow(this.startSize, capacity * 3);\n this.color = ParticleStore.grow(this.color, capacity * 4);\n if (sizeAliased) {\n this.previousSize = this.size;\n }\n if (colorAliased) {\n this.previousColor = this.color;\n }\n this.startColor = ParticleStore.grow(this.startColor, capacity * 4);\n this.scalars = ParticleStore.growDouble(this.scalars, capacity * ParticleStore.SCALAR_STRIDE);\n if (this.memoryStride > 0) {\n const grown = new Float64Array(capacity * this.memoryStride);\n grown.fill(NaN);\n grown.set(this.memory);\n this.memory = grown;\n }\n this.rotation = ParticleStore.grow(this.rotation, capacity);\n this.angularVelocity = ParticleStore.grow(this.angularVelocity, capacity);\n this.uvTile = ParticleStore.grow(this.uvTile, capacity);\n this.startSpeed = ParticleStore.grow(this.startSpeed, capacity);\n const flip = new Uint8Array(capacity);\n flip.set(this.flip);\n this.flip = flip;\n this.capacity = capacity;\n return true;\n }\n /**\n * Exchanges the contents of two rows.\n *\n * Used to keep row order aligned with the owning system's particle order, so\n * the live particles stay a contiguous range that a renderer can copy in one\n * go rather than gathering particle by particle.\n */\n /**\n * Starts keeping {@link previousVelocity}. Harmless to call every step;\n * returns true on the call that allocated, which replaces the array and so\n * leaves every particle's view of it pointing at the old one.\n */\n keepPreviousVelocity() {\n if (this.previousVelocity.length >= this.capacity * 3) {\n return false;\n }\n this.previousVelocity = new Float32Array(this.capacity * 3);\n return true;\n }\n /**\n * Mirrors a freshly spawned particle's generator memory into the\n * {@link memory} column, widening the column when this spawn used more\n * slots than any before it.\n */\n recordMemory(row, memory) {\n const slots = memory.length;\n let stride = this.memoryStride;\n if (slots > stride || this.memory.length < this.capacity * stride) {\n stride = Math.max(stride, slots);\n const widened = new Float64Array(this.capacity * stride);\n widened.fill(NaN);\n const previousStride = this.memoryStride;\n const previous = this.memory;\n const rows = previousStride > 0 ? previous.length / previousStride : 0;\n for (let r = 0, from = 0, to = 0; r < rows; r++, from += previousStride, to += stride) {\n for (let j = 0; j < previousStride; j++) {\n widened[to + j] = previous[from + j];\n }\n }\n this.memory = widened;\n this.memoryStride = stride;\n }\n const base = row * stride;\n for (let j = 0; j < stride; j++) {\n const value = j < slots ? memory[j] : undefined;\n this.memory[base + j] = typeof value === 'number' ? value : NaN;\n }\n }\n /**\n * Whether {@link previousSize} is a snapshot of its own or an alias of\n * {@link size}. A system whose behaviors never change a particle's size\n * after birth has nothing to carry between steps for it, and aliasing the\n * two saves the copy a step would otherwise make; readers that interpolate\n * from previous to current then get the current value unchanged.\n */\n useSizeSnapshot(enabled) {\n if (enabled) {\n if (this.previousSize === this.size) {\n this.previousSize = new Float32Array(this.size);\n }\n }\n else {\n this.previousSize = this.size;\n }\n }\n /** The same for {@link previousColor}, see {@link useSizeSnapshot}. */\n useColorSnapshot(enabled) {\n if (enabled) {\n if (this.previousColor === this.color) {\n this.previousColor = new Float32Array(this.color);\n }\n }\n else {\n this.previousColor = this.color;\n }\n }\n /**\n * Allocates the quaternion columns. Returns true on the call that did,\n * which means views already bound to the store need re-binding.\n */\n ensureQuaternionColumns() {\n if (this.rotationQuaternion.length >= this.capacity * 4) {\n return false;\n }\n this.rotationQuaternion = new Float32Array(this.capacity * 4);\n this.angularVelocityQuaternion = new Float32Array(this.capacity * 4);\n // Identity, so a row read before its particle writes it draws unturned.\n for (let i = 3; i < this.rotationQuaternion.length; i += 4) {\n this.rotationQuaternion[i] = 1;\n this.angularVelocityQuaternion[i] = 1;\n }\n return true;\n }\n swapRows(a, b) {\n if (a === b) {\n return;\n }\n const a3 = a * 3;\n const b3 = b * 3;\n ParticleStore.swap3(this.position, a3, b3);\n ParticleStore.swap3(this.previousPosition, a3, b3);\n if (this.previousSize !== this.size) {\n ParticleStore.swap3(this.previousSize, a3, b3);\n }\n if (this.previousVelocity.length > 0) {\n ParticleStore.swap3(this.previousVelocity, a3, b3);\n }\n ParticleStore.swap3(this.velocity, a3, b3);\n ParticleStore.swap3(this.size, a3, b3);\n ParticleStore.swap3(this.startSize, a3, b3);\n const a4 = a * 4;\n const b4 = b * 4;\n ParticleStore.swap4(this.color, a4, b4);\n if (this.previousColor !== this.color) {\n ParticleStore.swap4(this.previousColor, a4, b4);\n }\n ParticleStore.swap4(this.startColor, a4, b4);\n if (this.rotationQuaternion.length > 0) {\n ParticleStore.swap4(this.rotationQuaternion, a4, b4);\n ParticleStore.swap4(this.angularVelocityQuaternion, a4, b4);\n }\n ParticleStore.swap3(this.scalars, a * ParticleStore.SCALAR_STRIDE, b * ParticleStore.SCALAR_STRIDE);\n const stride = this.memoryStride;\n if (stride > 0) {\n const memory = this.memory;\n for (let j = 0, ma = a * stride, mb = b * stride; j < stride; j++, ma++, mb++) {\n const temp = memory[ma];\n memory[ma] = memory[mb];\n memory[mb] = temp;\n }\n }\n ParticleStore.swap1(this.rotation, a, b);\n ParticleStore.swap1(this.angularVelocity, a, b);\n ParticleStore.swap1(this.uvTile, a, b);\n ParticleStore.swap1(this.startSpeed, a, b);\n ParticleStore.swap1(this.flip, a, b);\n }\n static swap1(data, a, b) {\n const temp = data[a];\n data[a] = data[b];\n data[b] = temp;\n }\n static growDouble(source, length) {\n const grown = new Float64Array(length);\n grown.set(source);\n return grown;\n }\n static swap3(data, a, b) {\n let temp = data[a];\n data[a] = data[b];\n data[b] = temp;\n temp = data[a + 1];\n data[a + 1] = data[b + 1];\n data[b + 1] = temp;\n temp = data[a + 2];\n data[a + 2] = data[b + 2];\n data[b + 2] = temp;\n }\n static swap4(data, a, b) {\n ParticleStore.swap3(data, a, b);\n const temp = data[a + 3];\n data[a + 3] = data[b + 3];\n data[b + 3] = temp;\n }\n static grow(source, length) {\n const grown = new Float32Array(length);\n grown.set(source);\n return grown;\n }\n}\nParticleStore.EMPTY = new Float32Array(0);\n/** Values per row in {@link scalars}. */\nParticleStore.SCALAR_STRIDE = 3;\n/** Offsets within a {@link scalars} row. */\nParticleStore.AGE = 0;\nParticleStore.LIFE = 1;\nParticleStore.SPEED_MODIFIER = 2;\n\n/*\n * A fast javascript implementation of simplex noise by Jonas Wagner\nBased on a speed-improved simplex noise algorithm for 2D, 3D and 4D in Java.\nWhich is based on example code by Stefan Gustavson (stegu@itn.liu.se).\nWith Optimisations by Peter Eastman (peastman@drizzle.stanford.edu).\nBetter rank ordering method by Stefan Gustavson in 2012.\n Copyright (c) 2021 Jonas Wagner\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n */\nconst F2 = 0.5 * (Math.sqrt(3.0) - 1.0);\nconst G2 = (3.0 - Math.sqrt(3.0)) / 6.0;\nconst F3 = 1.0 / 3.0;\nconst G3 = 1.0 / 6.0;\nconst F4 = (Math.sqrt(5.0) - 1.0) / 4.0;\nconst G4 = (5.0 - Math.sqrt(5.0)) / 20.0;\nconst grad3 = new Float32Array([\n 1, 1, 0, -1, 1, 0, 1, -1, 0,\n -1, -1, 0, 1, 0, 1, -1, 0, 1,\n 1, 0, -1, -1, 0, -1, 0, 1, 1,\n 0, -1, 1, 0, 1, -1, 0, -1, -1,\n]);\nconst grad4 = new Float32Array([\n 0, 1, 1, 1, 0, 1, 1, -1, 0, 1, -1, 1, 0, 1, -1, -1, 0, -1, 1, 1, 0, -1, 1, -1, 0, -1, -1, 1, 0, -1, -1, -1, 1, 0, 1,\n 1, 1, 0, 1, -1, 1, 0, -1, 1, 1, 0, -1, -1, -1, 0, 1, 1, -1, 0, 1, -1, -1, 0, -1, 1, -1, 0, -1, -1, 1, 1, 0, 1, 1, 1,\n 0, -1, 1, -1, 0, 1, 1, -1, 0, -1, -1, 1, 0, 1, -1, 1, 0, -1, -1, -1, 0, 1, -1, -1, 0, -1, 1, 1, 1, 0, 1, 1, -1, 0,\n 1, -1, 1, 0, 1, -1, -1, 0, -1, 1, 1, 0, -1, 1, -1, 0, -1, -1, 1, 0, -1, -1, -1, 0,\n]);\n/** Deterministic simplex noise generator suitable for 2D, 3D and 4D spaces. */\nclass SimplexNoise {\n /**\n * Creates a new `SimplexNoise` instance.\n * This involves some setup. You can save a few cpu cycles by reusing the same instance.\n * @param randomOrSeed A random number generator or a seed (string|number).\n * Defaults to Math.random (random irreproducible initialization).\n */\n constructor(randomOrSeed = Math.random) {\n const random = typeof randomOrSeed == 'function' ? randomOrSeed : alea(randomOrSeed);\n this.p = buildPermutationTable(random);\n this.perm = new Uint8Array(512);\n this.permMod12 = new Uint8Array(512);\n for (let i = 0; i < 512; i++) {\n this.perm[i] = this.p[i & 255];\n this.permMod12[i] = this.perm[i] % 12;\n }\n }\n /**\n * Samples the noise field in 2 dimensions\n * @param x\n * @param y\n * @returns a number in the interval [-1, 1]\n */\n noise2D(x, y) {\n const permMod12 = this.permMod12;\n const perm = this.perm;\n let n0 = 0; // Noise contributions from the ../math corners\n let n1 = 0;\n let n2 = 0;\n // Skew the input space to determine which simplex cell we're in\n const s = (x + y) * F2; // Hairy factor for 2D\n const i = Math.floor(x + s);\n const j = Math.floor(y + s);\n const t = (i + j) * G2;\n const X0 = i - t; // Unskew the cell origin back to (x,y) space\n const Y0 = j - t;\n const x0 = x - X0; // The x,y distances from the cell origin\n const y0 = y - Y0;\n // For the 2D case, the simplex shape is an equilateral triangle.\n // Determine which simplex we are in.\n let i1, j1; // Offsets for second (middle) corner of simplex in (i,j) coords\n if (x0 > y0) {\n i1 = 1;\n j1 = 0;\n } // lower triangle, XY order: (0,0)->(1,0)->(1,1)\n else {\n i1 = 0;\n j1 = 1;\n } // upper triangle, YX order: (0,0)->(0,1)->(1,1)\n // A step of (1,0) in (i,j) means a step of (1-c,-c) in (x,y), and\n // a step of (0,1) in (i,j) means a step of (-c,1-c) in (x,y), where\n // c = (3-sqrt(3))/6\n const x1 = x0 - i1 + G2; // Offsets for middle corner in (x,y) unskewed coords\n const y1 = y0 - j1 + G2;\n const x2 = x0 - 1.0 + 2.0 * G2; // Offsets for last corner in (x,y) unskewed coords\n const y2 = y0 - 1.0 + 2.0 * G2;\n // Work out the hashed gradient indices of the ../math simplex corners\n const ii = i & 255;\n const jj = j & 255;\n // Calculate the contribution from the ../math corners\n let t0 = 0.5 - x0 * x0 - y0 * y0;\n if (t0 >= 0) {\n const gi0 = permMod12[ii + perm[jj]] * 3;\n t0 *= t0;\n n0 = t0 * t0 * (grad3[gi0] * x0 + grad3[gi0 + 1] * y0); // (x,y) of grad3 used for 2D gradient\n }\n let t1 = 0.5 - x1 * x1 - y1 * y1;\n if (t1 >= 0) {\n const gi1 = permMod12[ii + i1 + perm[jj + j1]] * 3;\n t1 *= t1;\n n1 = t1 * t1 * (grad3[gi1] * x1 + grad3[gi1 + 1] * y1);\n }\n let t2 = 0.5 - x2 * x2 - y2 * y2;\n if (t2 >= 0) {\n const gi2 = permMod12[ii + 1 + perm[jj + 1]] * 3;\n t2 *= t2;\n n2 = t2 * t2 * (grad3[gi2] * x2 + grad3[gi2 + 1] * y2);\n }\n // Add contributions from each corner to get the final noise value.\n // The result is scaled to return values in the interval [-1,1].\n return 70.0 * (n0 + n1 + n2);\n }\n /**\n * Samples the noise field in 3 dimensions\n * @param x\n * @param y\n * @param z\n * @returns a number in the interval [-1, 1]\n */\n noise3D(x, y, z) {\n const permMod12 = this.permMod12;\n const perm = this.perm;\n let n0, n1, n2, n3; // Noise contributions from the four corners\n // Skew the input space to determine which simplex cell we're in\n const s = (x + y + z) * F3; // Very nice and simple skew factor for 3D\n const i = Math.floor(x + s);\n const j = Math.floor(y + s);\n const k = Math.floor(z + s);\n const t = (i + j + k) * G3;\n const X0 = i - t; // Unskew the cell origin back to (x,y,z) space\n const Y0 = j - t;\n const Z0 = k - t;\n const x0 = x - X0; // The x,y,z distances from the cell origin\n const y0 = y - Y0;\n const z0 = z - Z0;\n // For the 3D case, the simplex shape is a slightly irregular tetrahedron.\n // Determine which simplex we are in.\n let i1, j1, k1; // Offsets for second corner of simplex in (i,j,k) coords\n let i2, j2, k2; // Offsets for third corner of simplex in (i,j,k) coords\n if (x0 >= y0) {\n if (y0 >= z0) {\n i1 = 1;\n j1 = 0;\n k1 = 0;\n i2 = 1;\n j2 = 1;\n k2 = 0;\n } // X Y Z order\n else if (x0 >= z0) {\n i1 = 1;\n j1 = 0;\n k1 = 0;\n i2 = 1;\n j2 = 0;\n k2 = 1;\n } // X Z Y order\n else {\n i1 = 0;\n j1 = 0;\n k1 = 1;\n i2 = 1;\n j2 = 0;\n k2 = 1;\n } // Z X Y order\n }\n else {\n // x0<y0\n if (y0 < z0) {\n i1 = 0;\n j1 = 0;\n k1 = 1;\n i2 = 0;\n j2 = 1;\n k2 = 1;\n } // Z Y X order\n else if (x0 < z0) {\n i1 = 0;\n j1 = 1;\n k1 = 0;\n i2 = 0;\n j2 = 1;\n k2 = 1;\n } // Y Z X order\n else {\n i1 = 0;\n j1 = 1;\n k1 = 0;\n i2 = 1;\n j2 = 1;\n k2 = 0;\n } // Y X Z order\n }\n // A step of (1,0,0) in (i,j,k) means a step of (1-c,-c,-c) in (x,y,z),\n // a step of (0,1,0) in (i,j,k) means a step of (-c,1-c,-c) in (x,y,z), and\n // a step of (0,0,1) in (i,j,k) means a step of (-c,-c,1-c) in (x,y,z), where\n // c = 1/6.\n const x1 = x0 - i1 + G3; // Offsets for second corner in (x,y,z) coords\n const y1 = y0 - j1 + G3;\n const z1 = z0 - k1 + G3;\n const x2 = x0 - i2 + 2.0 * G3; // Offsets for third corner in (x,y,z) coords\n const y2 = y0 - j2 + 2.0 * G3;\n const z2 = z0 - k2 + 2.0 * G3;\n const x3 = x0 - 1.0 + 3.0 * G3; // Offsets for last corner in (x,y,z) coords\n const y3 = y0 - 1.0 + 3.0 * G3;\n const z3 = z0 - 1.0 + 3.0 * G3;\n // Work out the hashed gradient indices of the four simplex corners\n const ii = i & 255;\n const jj = j & 255;\n const kk = k & 255;\n // Calculate the contribution from the four corners\n let t0 = 0.6 - x0 * x0 - y0 * y0 - z0 * z0;\n if (t0 < 0)\n n0 = 0.0;\n else {\n const gi0 = permMod12[ii + perm[jj + perm[kk]]] * 3;\n t0 *= t0;\n n0 = t0 * t0 * (grad3[gi0] * x0 + grad3[gi0 + 1] * y0 + grad3[gi0 + 2] * z0);\n }\n let t1 = 0.6 - x1 * x1 - y1 * y1 - z1 * z1;\n if (t1 < 0)\n n1 = 0.0;\n else {\n const gi1 = permMod12[ii + i1 + perm[jj + j1 + perm[kk + k1]]] * 3;\n t1 *= t1;\n n1 = t1 * t1 * (grad3[gi1] * x1 + grad3[gi1 + 1] * y1 + grad3[gi1 + 2] * z1);\n }\n let t2 = 0.6 - x2 * x2 - y2 * y2 - z2 * z2;\n if (t2 < 0)\n n2 = 0.0;\n else {\n const gi2 = permMod12[ii + i2 + perm[jj + j2 + perm[kk + k2]]] * 3;\n t2 *= t2;\n n2 = t2 * t2 * (grad3[gi2] * x2 + grad3[gi2 + 1] * y2 + grad3[gi2 + 2] * z2);\n }\n let t3 = 0.6 - x3 * x3 - y3 * y3 - z3 * z3;\n if (t3 < 0)\n n3 = 0.0;\n else {\n const gi3 = permMod12[ii + 1 + perm[jj + 1 + perm[kk + 1]]] * 3;\n t3 *= t3;\n n3 = t3 * t3 * (grad3[gi3] * x3 + grad3[gi3 + 1] * y3 + grad3[gi3 + 2] * z3);\n }\n // Add contributions from each corner to get the final noise value.\n // The result is scaled to stay just inside [-1,1]\n return 32.0 * (n0 + n1 + n2 + n3);\n }\n /**\n * Samples the noise field in 4 dimensions\n * @param x\n * @param y\n * @param z\n * @returns a number in the interval [-1, 1]\n */\n noise4D(x, y, z, w) {\n const perm = this.perm;\n let n0, n1, n2, n3, n4; // Noise contributions from the five corners\n // Skew the (x,y,z,w) space to determine which cell of 24 simplices we're in\n const s = (x + y + z + w) * F4; // Factor for 4D skewing\n const i = Math.floor(x + s);\n const j = Math.floor(y + s);\n const k = Math.floor(z + s);\n const l = Math.floor(w + s);\n const t = (i + j + k + l) * G4; // Factor for 4D unskewing\n const X0 = i - t; // Unskew the cell origin back to (x,y,z,w) space\n const Y0 = j - t;\n const Z0 = k - t;\n const W0 = l - t;\n const x0 = x - X0; // The x,y,z,w distances from the cell origin\n const y0 = y - Y0;\n const z0 = z - Z0;\n const w0 = w - W0;\n // For the 4D case, the simplex is a 4D shape I won't even try to describe.\n // To find out which of the 24 possible simplices we're in, we need to\n // determine the magnitude ordering of x0, y0, z0 and w0.\n // Six pair-wise comparisons are performed between each possible pair\n // of the four coordinates, and the results are used to rank the numbers.\n let rankx = 0;\n let ranky = 0;\n let rankz = 0;\n let rankw = 0;\n if (x0 > y0)\n rankx++;\n else\n ranky++;\n if (x0 > z0)\n rankx++;\n else\n rankz++;\n if (x0 > w0)\n rankx++;\n else\n rankw++;\n if (y0 > z0)\n ranky++;\n else\n rankz++;\n if (y0 > w0)\n ranky++;\n else\n rankw++;\n if (z0 > w0)\n rankz++;\n else\n rankw++;\n // simplex[c] is a 4-vector with the numbers 0, 1, 2 and 3 in some order.\n // Many values of c will never occur, since e.g. x>y>z>w makes x<z, y<w and x<w\n // impossible. Only the 24 indices which have non-zero entries make any sense.\n // We use a thresholding to set the coordinates in turn from the largest magnitude.\n // Rank 3 denotes the largest coordinate.\n // Rank 2 denotes the second largest coordinate.\n // Rank 1 denotes the second smallest coordinate.\n // The integer offsets for the second simplex corner\n const i1 = rankx >= 3 ? 1 : 0;\n const j1 = ranky >= 3 ? 1 : 0;\n const k1 = rankz >= 3 ? 1 : 0;\n const l1 = rankw >= 3 ? 1 : 0;\n // The integer offsets for the third simplex corner\n const i2 = rankx >= 2 ? 1 : 0;\n const j2 = ranky >= 2 ? 1 : 0;\n const k2 = rankz >= 2 ? 1 : 0;\n const l2 = rankw >= 2 ? 1 : 0;\n // The integer offsets for the fourth simplex corner\n const i3 = rankx >= 1 ? 1 : 0;\n const j3 = ranky >= 1 ? 1 : 0;\n const k3 = rankz >= 1 ? 1 : 0;\n const l3 = rankw >= 1 ? 1 : 0;\n // The fifth corner has all coordinate offsets = 1, so no need to compute that.\n const x1 = x0 - i1 + G4; // Offsets for second corner in (x,y,z,w) coords\n const y1 = y0 - j1 + G4;\n const z1 = z0 - k1 + G4;\n const w1 = w0 - l1 + G4;\n const x2 = x0 - i2 + 2.0 * G4; // Offsets for third corner in (x,y,z,w) coords\n const y2 = y0 - j2 + 2.0 * G4;\n const z2 = z0 - k2 + 2.0 * G4;\n const w2 = w0 - l2 + 2.0 * G4;\n const x3 = x0 - i3 + 3.0 * G4; // Offsets for fourth corner in (x,y,z,w) coords\n const y3 = y0 - j3 + 3.0 * G4;\n const z3 = z0 - k3 + 3.0 * G4;\n const w3 = w0 - l3 + 3.0 * G4;\n const x4 = x0 - 1.0 + 4.0 * G4; // Offsets for last corner in (x,y,z,w) coords\n const y4 = y0 - 1.0 + 4.0 * G4;\n const z4 = z0 - 1.0 + 4.0 * G4;\n const w4 = w0 - 1.0 + 4.0 * G4;\n // Work out the hashed gradient indices of the five simplex corners\n const ii = i & 255;\n const jj = j & 255;\n const kk = k & 255;\n const ll = l & 255;\n // Calculate the contribution from the five corners\n let t0 = 0.6 - x0 * x0 - y0 * y0 - z0 * z0 - w0 * w0;\n if (t0 < 0)\n n0 = 0.0;\n else {\n const gi0 = (perm[ii + perm[jj + perm[kk + perm[ll]]]] % 32) * 4;\n t0 *= t0;\n n0 = t0 * t0 * (grad4[gi0] * x0 + grad4[gi0 + 1] * y0 + grad4[gi0 + 2] * z0 + grad4[gi0 + 3] * w0);\n }\n let t1 = 0.6 - x1 * x1 - y1 * y1 - z1 * z1 - w1 * w1;\n if (t1 < 0)\n n1 = 0.0;\n else {\n const gi1 = (perm[ii + i1 + perm[jj + j1 + perm[kk + k1 + perm[ll + l1]]]] % 32) * 4;\n t1 *= t1;\n n1 = t1 * t1 * (grad4[gi1] * x1 + grad4[gi1 + 1] * y1 + grad4[gi1 + 2] * z1 + grad4[gi1 + 3] * w1);\n }\n let t2 = 0.6 - x2 * x2 - y2 * y2 - z2 * z2 - w2 * w2;\n if (t2 < 0)\n n2 = 0.0;\n else {\n const gi2 = (perm[ii + i2 + perm[jj + j2 + perm[kk + k2 + perm[ll + l2]]]] % 32) * 4;\n t2 *= t2;\n n2 = t2 * t2 * (grad4[gi2] * x2 + grad4[gi2 + 1] * y2 + grad4[gi2 + 2] * z2 + grad4[gi2 + 3] * w2);\n }\n let t3 = 0.6 - x3 * x3 - y3 * y3 - z3 * z3 - w3 * w3;\n if (t3 < 0)\n n3 = 0.0;\n else {\n const gi3 = (perm[ii + i3 + perm[jj + j3 + perm[kk + k3 + perm[ll + l3]]]] % 32) * 4;\n t3 *= t3;\n n3 = t3 * t3 * (grad4[gi3] * x3 + grad4[gi3 + 1] * y3 + grad4[gi3 + 2] * z3 + grad4[gi3 + 3] * w3);\n }\n let t4 = 0.6 - x4 * x4 - y4 * y4 - z4 * z4 - w4 * w4;\n if (t4 < 0)\n n4 = 0.0;\n else {\n const gi4 = (perm[ii + 1 + perm[jj + 1 + perm[kk + 1 + perm[ll + 1]]]] % 32) * 4;\n t4 *= t4;\n n4 = t4 * t4 * (grad4[gi4] * x4 + grad4[gi4 + 1] * y4 + grad4[gi4 + 2] * z4 + grad4[gi4 + 3] * w4);\n }\n // Sum up and scale the result to cover the range [-1,1]\n return 27.0 * (n0 + n1 + n2 + n3 + n4);\n }\n}\n/**\n * Builds a random permutation table.\n * This is exported only for (internal) testing purposes.\n * Do not rely on this export.\n * @private\n */\nfunction buildPermutationTable(random) {\n const p = new Uint8Array(256);\n for (let i = 0; i < 256; i++) {\n p[i] = i;\n }\n for (let i = 0; i < 255; i++) {\n const r = i + ~~(random() * (256 - i));\n const aux = p[i];\n p[i] = p[r];\n p[r] = aux;\n }\n return p;\n}\n/*\nThe ALEA PRNG and masher code used by simplex-noise.js\nis based on code by Johannes Baagøe, modified by Jonas Wagner.\nSee alea.md for the full license.\n*/\nfunction alea(seed) {\n let s0 = 0;\n let s1 = 0;\n let s2 = 0;\n let c = 1;\n const mash = masher();\n s0 = mash(' ');\n s1 = mash(' ');\n s2 = mash(' ');\n s0 -= mash(seed);\n if (s0 < 0) {\n s0 += 1;\n }\n s1 -= mash(seed);\n if (s1 < 0) {\n s1 += 1;\n }\n s2 -= mash(seed);\n if (s2 < 0) {\n s2 += 1;\n }\n return function () {\n const t = 2091639 * s0 + c * 2.3283064365386963e-10; // 2^-32\n s0 = s1;\n s1 = s2;\n return (s2 = t - (c = t | 0));\n };\n}\nfunction masher() {\n let n = 0xefc8249d;\n return function (data) {\n data = data.toString();\n for (let i = 0; i < data.length; i++) {\n n += data.charCodeAt(i);\n let h = 0.02519603282416938 * n;\n n = h >>> 0;\n h -= n;\n h *= n;\n n = h >>> 0;\n h -= n;\n n += h * 0x100000000; // 2^32\n }\n return (n >>> 0) * 2.3283064365386963e-10; // 2^-32\n };\n}\n\nconst GENERATOR_COUNT = 100;\nconst generators = new Array(GENERATOR_COUNT);\nconst tempV = new Vector3();\nconst tempQ = new Quaternion();\n/** Simplex generators are built on first use, so constructing a Noise behavior stays cheap. */\nfunction getGenerator(index) {\n let generator = generators[index];\n if (generator === undefined) {\n generator = new SimplexNoise();\n generators[index] = generator;\n }\n return generator;\n}\n/**\n * Apply noise to particles.\n */\nclass Noise {\n constructor(frequency, power, positionAmount = new ConstantValue(1), rotationAmount = new ConstantValue(0)) {\n this.frequency = frequency;\n this.power = power;\n this.positionAmount = positionAmount;\n this.rotationAmount = rotationAmount;\n this.type = 'Noise';\n this.duration = 0;\n /**\n * Values of the generators that are constants, cached by {@link frameUpdate};\n * NaN where the generator has to be evaluated per particle.\n */\n this._frequency = NaN;\n this._power = NaN;\n this._positionAmount = NaN;\n this._rotationAmount = NaN;\n }\n initialize(particle) {\n const isScalarRotation = typeof particle.rotation === 'number';\n let state = particle._noiseState;\n if (state === undefined) {\n state = {\n lastPos: new Vector3(),\n lastRot: 0,\n lastRotQ: isScalarRotation ? null : new Quaternion(),\n generatorX: getGenerator(randomInt(0, GENERATOR_COUNT)),\n generatorY: getGenerator(randomInt(0, GENERATOR_COUNT)),\n generatorZ: getGenerator(randomInt(0, GENERATOR_COUNT)),\n generatorW: getGenerator(randomInt(0, GENERATOR_COUNT)),\n };\n particle._noiseState = state;\n return;\n }\n // Recycled particle: reset the accumulated offsets and re-roll generators.\n state.lastPos.set(0, 0, 0);\n state.lastRot = 0;\n if (isScalarRotation) {\n state.lastRotQ = null;\n }\n else if (state.lastRotQ === null) {\n state.lastRotQ = new Quaternion();\n }\n else {\n state.lastRotQ.set(0, 0, 0, 1);\n }\n state.generatorX = getGenerator(randomInt(0, GENERATOR_COUNT));\n state.generatorY = getGenerator(randomInt(0, GENERATOR_COUNT));\n state.generatorZ = getGenerator(randomInt(0, GENERATOR_COUNT));\n state.generatorW = getGenerator(randomInt(0, GENERATOR_COUNT));\n }\n static constantOf(generator) {\n return generator instanceof ConstantValue ? generator.value : NaN;\n }\n update(particle, _) {\n const state = particle._noiseState;\n if (state === undefined) {\n return;\n }\n const memory = particle.memory;\n const t = particle.age / particle.life;\n const cf = this._frequency;\n const frequency = cf === cf ? cf : this.frequency.genValue(memory, t);\n const cp = this._power;\n const power = cp === cp ? cp : this.power.genValue(memory, t);\n const cpa = this._positionAmount;\n const positionAmount = cpa === cpa ? cpa : this.positionAmount.genValue(memory, t);\n const cra = this._rotationAmount;\n const rotationAmount = cra === cra ? cra : this.rotationAmount.genValue(memory, t);\n const noiseTime = particle.age * frequency;\n if (positionAmount > 0) {\n const amount = power * positionAmount;\n particle.position.sub(state.lastPos);\n tempV.set(state.generatorX.noise2D(0, noiseTime) * amount, state.generatorY.noise2D(0, noiseTime) * amount, state.generatorZ.noise2D(0, noiseTime) * amount);\n particle.position.add(tempV);\n state.lastPos.copy(tempV);\n }\n if (rotationAmount > 0) {\n const amount = power * rotationAmount;\n if (typeof particle.rotation === 'number') {\n const noise = state.generatorW.noise2D(0, noiseTime) * Math.PI * amount;\n particle.rotation = particle.rotation - state.lastRot + noise;\n state.lastRot = noise;\n }\n else if (state.lastRotQ !== null) {\n const rotation = particle.rotation;\n state.lastRotQ.invert();\n rotation.multiply(state.lastRotQ);\n tempQ\n .set(state.generatorX.noise2D(0, noiseTime) * amount, state.generatorY.noise2D(0, noiseTime) * amount, state.generatorZ.noise2D(0, noiseTime) * amount, state.generatorW.noise2D(0, noiseTime) * amount)\n .normalize();\n rotation.multiply(tempQ);\n state.lastRotQ.copy(tempQ);\n }\n }\n }\n updateAll(particles, count, delta) {\n const store = count > 0 ? particles[0].store : undefined;\n if (store === undefined) {\n for (let i = 0; i < count; i++) {\n const particle = particles[i];\n if (particle.age < particle.life) {\n this.update(particle, delta);\n }\n }\n return;\n }\n // Each particle still carries its own noise state and simplex\n // generators, but position and angle go through the store's columns\n // rather than the particle's vector views.\n const positions = store.position;\n const rotations = store.rotation;\n const scalars = store.scalars;\n const stride = ParticleStore.SCALAR_STRIDE;\n const cf = this._frequency;\n const cp = this._power;\n const cpa = this._positionAmount;\n const cra = this._rotationAmount;\n for (let i = 0, o3 = 0, s = 0; i < count; i++, o3 += 3, s += stride) {\n const age = scalars[s];\n const life = scalars[s + 1];\n if (age >= life) {\n continue;\n }\n const particle = particles[i];\n const state = particle._noiseState;\n if (state === undefined) {\n continue;\n }\n const memory = particle.memory;\n const t = age / life;\n const frequency = cf === cf ? cf : this.frequency.genValue(memory, t);\n const power = cp === cp ? cp : this.power.genValue(memory, t);\n const positionAmount = cpa === cpa ? cpa : this.positionAmount.genValue(memory, t);\n const rotationAmount = cra === cra ? cra : this.rotationAmount.genValue(memory, t);\n const noiseTime = age * frequency;\n if (positionAmount > 0) {\n const amount = power * positionAmount;\n const lastPos = state.lastPos;\n const nx = state.generatorX.noise2D(0, noiseTime) * amount;\n const ny = state.generatorY.noise2D(0, noiseTime) * amount;\n const nz = state.generatorZ.noise2D(0, noiseTime) * amount;\n // Rounded between the two steps as the vector view path is.\n positions[o3] = Math.fround(positions[o3] - lastPos.x) + nx;\n positions[o3 + 1] = Math.fround(positions[o3 + 1] - lastPos.y) + ny;\n positions[o3 + 2] = Math.fround(positions[o3 + 2] - lastPos.z) + nz;\n lastPos.set(nx, ny, nz);\n }\n if (rotationAmount > 0) {\n const amount = power * rotationAmount;\n if (typeof particle.rotation === 'number') {\n const noise = state.generatorW.noise2D(0, noiseTime) * Math.PI * amount;\n rotations[i] = rotations[i] - state.lastRot + noise;\n state.lastRot = noise;\n }\n else if (state.lastRotQ !== null) {\n const rotation = particle.rotation;\n state.lastRotQ.invert();\n rotation.multiply(state.lastRotQ);\n tempQ\n .set(state.generatorX.noise2D(0, noiseTime) * amount, state.generatorY.noise2D(0, noiseTime) * amount, state.generatorZ.noise2D(0, noiseTime) * amount, state.generatorW.noise2D(0, noiseTime) * amount)\n .normalize();\n rotation.multiply(tempQ);\n state.lastRotQ.copy(tempQ);\n }\n }\n }\n }\n toJSON() {\n return {\n type: this.type,\n frequency: this.frequency.toJSON(),\n power: this.power.toJSON(),\n positionAmount: this.positionAmount.toJSON(),\n rotationAmount: this.rotationAmount.toJSON(),\n };\n }\n frameUpdate(delta) {\n this.duration += delta;\n this._frequency = Noise.constantOf(this.frequency);\n this._power = Noise.constantOf(this.power);\n this._positionAmount = Noise.constantOf(this.positionAmount);\n this._rotationAmount = Noise.constantOf(this.rotationAmount);\n }\n static fromJSON(json) {\n return new Noise(ValueGeneratorFromJSON(json.frequency), ValueGeneratorFromJSON(json.power), ValueGeneratorFromJSON(json.positionAmount), ValueGeneratorFromJSON(json.rotationAmount));\n }\n clone() {\n return new Noise(this.frequency.clone(), this.power.clone(), this.positionAmount.clone(), this.rotationAmount.clone());\n }\n reset() { }\n}\n\n/**\n * Orbit particles around an axis over their life.\n */\nclass OrbitOverLife {\n constructor(orbitSpeed, axis = new Vector3(0, 1, 0)) {\n this.orbitSpeed = orbitSpeed;\n this.axis = axis;\n this.type = 'OrbitOverLife';\n this.temp = new Vector3();\n this.rotation = new Quaternion();\n }\n initialize(particle) {\n this.orbitSpeed.startGen(particle.memory);\n }\n update(particle, delta) {\n this.temp.copy(particle.position).projectOnVector(this.axis);\n this.rotation.setFromAxisAngle(this.axis, this.orbitSpeed.genValue(particle.memory, particle.age / particle.life) * delta);\n particle.position.sub(this.temp);\n particle.position.applyQuaternion(this.rotation);\n particle.position.add(this.temp);\n }\n updateAll(particles, count, delta) {\n const generator = this.orbitSpeed;\n const axis = this.axis;\n const temp = this.temp;\n const rotation = this.rotation;\n for (let i = 0; i < count; i++) {\n const particle = particles[i];\n if (particle.age >= particle.life) {\n continue;\n }\n const position = particle.position;\n temp.copy(position).projectOnVector(axis);\n rotation.setFromAxisAngle(axis, generator.genValue(particle.memory, particle.age / particle.life) * delta);\n position.sub(temp);\n position.applyQuaternion(rotation);\n position.add(temp);\n }\n }\n frameUpdate(delta) { }\n toJSON() {\n return {\n type: this.type,\n orbitSpeed: this.orbitSpeed.toJSON(),\n axis: [this.axis.x, this.axis.y, this.axis.z],\n };\n }\n static fromJSON(json) {\n return new OrbitOverLife(ValueGeneratorFromJSON(json.orbitSpeed), json.axis ? new Vector3(json.axis[0], json.axis[1], json.axis[2]) : undefined);\n }\n clone() {\n return new OrbitOverLife(this.orbitSpeed.clone());\n }\n reset() { }\n}\n\n/**\n * Apply rotation to particles over their life.\n */\nclass Rotation3DOverLife {\n constructor(angularVelocity) {\n this.angularVelocity = angularVelocity;\n this.type = 'Rotation3DOverLife';\n /** Scratch for the frame's rotation step; also read by the fused pass. */\n this.tempQuat = new Quaternion();\n }\n initialize(particle) {\n if (particle.rotation instanceof Quaternion) {\n particle.angularVelocity = new Quaternion();\n this.angularVelocity.startGen(particle.memory);\n }\n }\n update(particle, delta) {\n if (particle.rotation instanceof Quaternion) {\n this.angularVelocity.genValue(particle.memory, this.tempQuat, delta, particle.age / particle.life);\n particle.rotation.multiply(this.tempQuat);\n // This step's turn, kept for the renderer to draw a fraction of when\n // the frame falls between steps.\n const step = particle.angularVelocity;\n if (step instanceof Quaternion) {\n step.copy(this.tempQuat);\n }\n }\n }\n toJSON() {\n return {\n type: this.type,\n angularVelocity: this.angularVelocity.toJSON(),\n };\n }\n static fromJSON(json) {\n return new Rotation3DOverLife(RotationGeneratorFromJSON(json.angularVelocity));\n }\n frameUpdate(delta) { }\n clone() {\n return new Rotation3DOverLife(this.angularVelocity.clone());\n }\n reset() { }\n}\n\n/**\n * Apply rotation to particles based on their speed.\n */\nclass RotationBySpeed {\n constructor(angularVelocity, speedRange) {\n this.angularVelocity = angularVelocity;\n this.speedRange = speedRange;\n this.type = 'RotationBySpeed';\n this.tempQuat = new Quaternion();\n }\n initialize(particle) {\n if (typeof particle.rotation === 'number') {\n this.angularVelocity.startGen(particle.memory);\n }\n }\n update(particle, delta) {\n if (typeof particle.rotation === 'number') {\n const t = (particle.startSpeed - this.speedRange.a) / (this.speedRange.b - this.speedRange.a);\n const rate = this.angularVelocity.genValue(particle.memory, t);\n particle.rotation += delta * rate;\n // Kept for the renderer, which draws between steps.\n particle.angularVelocity = rate;\n }\n }\n toJSON() {\n return {\n type: this.type,\n angularVelocity: this.angularVelocity.toJSON(),\n speedRange: this.speedRange.toJSON(),\n };\n }\n static fromJSON(json) {\n return new RotationBySpeed(ValueGeneratorFromJSON(json.angularVelocity), IntervalValue.fromJSON(json.speedRange));\n }\n frameUpdate(delta) { }\n clone() {\n return new RotationBySpeed(this.angularVelocity.clone(), this.speedRange.clone());\n }\n reset() { }\n}\n\n/**\n * Apply rotation to particles over their life.\n *\n * A billboard (rotation is an angle) turns in its own plane. A mesh particle\n * (rotation is a quaternion) turns about its local Z axis — the axis a\n * number `startRotation` turns a mesh about, and what Unity's Rotation over\n * Lifetime without separate axes does to mesh particles. For any other axis,\n * or a turn about all three, use {@link Rotation3DOverLife}.\n */\nclass RotationOverLife {\n constructor(angularVelocity) {\n this.angularVelocity = angularVelocity;\n this.type = 'RotationOverLife';\n /** Scratch for a mesh particle's rotation step; also read by the fused pass. */\n this.tempQuat = new Quaternion();\n }\n initialize(particle) {\n if (typeof particle.rotation === 'number') {\n this.angularVelocity.startGen(particle.memory);\n }\n else if (particle.rotation instanceof Quaternion) {\n this.angularVelocity.startGen(particle.memory);\n if (!(particle.angularVelocity instanceof Quaternion)) {\n particle.angularVelocity = new Quaternion();\n }\n }\n }\n update(particle, delta) {\n if (typeof particle.rotation === 'number') {\n const rate = this.angularVelocity.genValue(particle.memory, particle.age / particle.life);\n particle.rotation += delta * rate;\n // Kept for the renderer, which draws between steps and has no other\n // way to know how fast this particle is turning.\n particle.angularVelocity = rate;\n }\n else if (particle.rotation instanceof Quaternion) {\n const rate = this.angularVelocity.genValue(particle.memory, particle.age / particle.life);\n this.turnAboutZ(particle, particle.rotation, rate * delta);\n }\n }\n updateAll(particles, count, delta) {\n const generator = this.angularVelocity;\n for (let i = 0; i < count; i++) {\n const particle = particles[i];\n if (particle.age >= particle.life) {\n continue;\n }\n const rotation = particle.rotation;\n if (typeof rotation === 'number') {\n const rate = generator.genValue(particle.memory, particle.age / particle.life);\n particle.rotation = rotation + delta * rate;\n particle.angularVelocity = rate;\n }\n else if (rotation instanceof Quaternion) {\n const rate = generator.genValue(particle.memory, particle.age / particle.life);\n this.turnAboutZ(particle, rotation, rate * delta);\n }\n }\n }\n /**\n * Turns a mesh particle by `angle` about its own Z axis, keeping the step\n * for the renderer to draw a fraction of between simulation steps.\n */\n turnAboutZ(particle, rotation, angle) {\n const step = this.tempQuat.setFromAxisAngle(Z_VEC3, angle);\n rotation.multiply(step);\n const kept = particle.angularVelocity;\n if (kept instanceof Quaternion) {\n kept.copy(step);\n }\n }\n toJSON() {\n return {\n type: this.type,\n angularVelocity: this.angularVelocity.toJSON(),\n };\n }\n static fromJSON(json) {\n return new RotationOverLife(ValueGeneratorFromJSON(json.angularVelocity));\n }\n frameUpdate(delta) {\n this.angularVelocity.refreshTable?.();\n }\n clone() {\n return new RotationOverLife(this.angularVelocity.clone());\n }\n reset() { }\n}\n\n/**\n * Apply size to particles based on their speed.\n */\nclass SizeBySpeed {\n initialize(particle) {\n this.size.startGen(particle.memory);\n }\n constructor(size, speedRange) {\n this.size = size;\n this.speedRange = speedRange;\n this.type = 'SizeBySpeed';\n }\n update(particle) {\n const t = (particle.startSpeed - this.speedRange.a) / (this.speedRange.b - this.speedRange.a);\n if (this.size instanceof Vector3Function) {\n this.size.genValue(particle.memory, particle.size, t).multiply(particle.startSize);\n }\n else {\n particle.size\n .copy(particle.startSize)\n .multiplyScalar(this.size.genValue(particle.memory, t));\n }\n }\n toJSON() {\n return {\n type: this.type,\n size: this.size.toJSON(),\n speedRange: this.speedRange.toJSON(),\n };\n }\n static fromJSON(json) {\n return new SizeBySpeed(GeneratorFromJSON(json.size), IntervalValue.fromJSON(json.speedRange));\n }\n frameUpdate(delta) { }\n clone() {\n return new SizeBySpeed(this.size.clone(), this.speedRange.clone());\n }\n reset() { }\n}\n\n/**\n * Apply size to particles based on their life.\n */\nclass SizeOverLife {\n constructor(size) {\n this.type = 'SizeOverLife';\n // Cached so the per-particle update does not repeat the instanceof test.\n this._sizeIsVector3 = false;\n this.size = size;\n }\n get size() {\n return this._size;\n }\n set size(size) {\n this._size = size;\n this._sizeIsVector3 = size instanceof Vector3Function;\n }\n initialize(particle) {\n this._size.startGen(particle.memory);\n }\n update(particle) {\n const t = particle.age / particle.life;\n if (this._sizeIsVector3) {\n this._size.genValue(particle.memory, particle.size, t).multiply(particle.startSize);\n }\n else {\n const scale = this._size.genValue(particle.memory, t);\n const size = particle.size;\n const startSize = particle.startSize;\n size.x = startSize.x * scale;\n size.y = startSize.y * scale;\n size.z = startSize.z * scale;\n }\n }\n updateAll(particles, count, delta) {\n // Split by generator kind once per frame rather than per particle, so\n // each loop keeps a single monomorphic genValue call site.\n if (this._sizeIsVector3) {\n const generator = this._size;\n for (let i = 0; i < count; i++) {\n const particle = particles[i];\n if (particle.age >= particle.life) {\n continue;\n }\n generator\n .genValue(particle.memory, particle.size, particle.age / particle.life)\n .multiply(particle.startSize);\n }\n return;\n }\n const generator = this._size;\n for (let i = 0; i < count; i++) {\n const particle = particles[i];\n if (particle.age >= particle.life) {\n continue;\n }\n const scale = generator.genValue(particle.memory, particle.age / particle.life);\n const size = particle.size;\n const startSize = particle.startSize;\n size.x = startSize.x * scale;\n size.y = startSize.y * scale;\n size.z = startSize.z * scale;\n }\n }\n toJSON() {\n return {\n type: this.type,\n size: this.size.toJSON(),\n };\n }\n static fromJSON(json) {\n return new SizeOverLife(GeneratorFromJSON(json.size));\n }\n frameUpdate(delta) {\n this._size.refreshTable?.();\n }\n clone() {\n return new SizeOverLife(this.size.clone());\n }\n reset() { }\n}\n\n/**\n * Apply speed to particles based on their life.\n */\nclass SpeedOverLife {\n initialize(particle) {\n this.speed.startGen(particle.memory);\n }\n constructor(speed) {\n this.speed = speed;\n this.type = 'SpeedOverLife';\n }\n update(particle) {\n particle.speedModifier = this.speed.genValue(particle.memory, particle.age / particle.life);\n }\n updateAll(particles, count, delta) {\n const generator = this.speed;\n for (let i = 0; i < count; i++) {\n const particle = particles[i];\n if (particle.age >= particle.life) {\n continue;\n }\n particle.speedModifier = generator.genValue(particle.memory, particle.age / particle.life);\n }\n }\n toJSON() {\n return {\n type: this.type,\n speed: this.speed.toJSON(),\n };\n }\n static fromJSON(json) {\n return new SpeedOverLife(ValueGeneratorFromJSON(json.speed));\n }\n frameUpdate(delta) {\n this.speed.refreshTable?.();\n }\n clone() {\n return new SpeedOverLife(this.speed.clone());\n }\n reset() { }\n}\n\n/**\n * Apply turbulence to particles.\n */\nclass TurbulenceField {\n constructor(scale, octaves, velocityMultiplier, timeScale) {\n this.scale = scale;\n this.octaves = octaves;\n this.velocityMultiplier = velocityMultiplier;\n this.timeScale = timeScale;\n this.type = 'TurbulenceField';\n this.generator = new SimplexNoise();\n this.timeOffset = new Vector3();\n this.temp = new Vector3();\n this.temp2 = new Vector3();\n this.timeOffset.x = (Math.random() / this.scale.x) * this.timeScale.x;\n this.timeOffset.y = (Math.random() / this.scale.y) * this.timeScale.y;\n this.timeOffset.z = (Math.random() / this.scale.z) * this.timeScale.z;\n }\n initialize(particle) { }\n update(particle, delta) {\n const x = particle.position.x / this.scale.x;\n const y = particle.position.y / this.scale.y;\n const z = particle.position.z / this.scale.z;\n this.temp.set(0, 0, 0);\n let lvl = 1;\n for (let i = 0; i < this.octaves; i++) {\n this.temp2.set(this.generator.noise4D(x * lvl, y * lvl, z * lvl, this.timeOffset.x * lvl) / lvl, this.generator.noise4D(x * lvl, y * lvl, z * lvl, this.timeOffset.y * lvl) / lvl, this.generator.noise4D(x * lvl, y * lvl, z * lvl, this.timeOffset.z * lvl) / lvl);\n this.temp.add(this.temp2);\n lvl *= 2;\n }\n this.temp.multiply(this.velocityMultiplier);\n particle.velocity.addScaledVector(this.temp, delta);\n }\n updateAll(particles, count, delta) {\n const store = count > 0 ? particles[0].store : undefined;\n if (store === undefined) {\n for (let i = 0; i < count; i++) {\n const particle = particles[i];\n if (particle.age < particle.life) {\n this.update(particle, delta);\n }\n }\n return;\n }\n // Everything but the noise itself is hoisted: the inverse scale, the\n // per-octave time offsets and the velocity multiplier.\n const positions = store.position;\n const velocities = store.velocity;\n const scalars = store.scalars;\n const stride = ParticleStore.SCALAR_STRIDE;\n const generator = this.generator;\n const octaves = this.octaves;\n const inverseScaleX = 1 / this.scale.x;\n const inverseScaleY = 1 / this.scale.y;\n const inverseScaleZ = 1 / this.scale.z;\n const multiplierX = this.velocityMultiplier.x * delta;\n const multiplierY = this.velocityMultiplier.y * delta;\n const multiplierZ = this.velocityMultiplier.z * delta;\n const timeX = this.timeOffset.x;\n const timeY = this.timeOffset.y;\n const timeZ = this.timeOffset.z;\n for (let i = 0, o3 = 0, s = 0; i < count; i++, o3 += 3, s += stride) {\n if (scalars[s] >= scalars[s + 1]) {\n continue;\n }\n const x = positions[o3] * inverseScaleX;\n const y = positions[o3 + 1] * inverseScaleY;\n const z = positions[o3 + 2] * inverseScaleZ;\n let tx = 0;\n let ty = 0;\n let tz = 0;\n let lvl = 1;\n for (let octave = 0; octave < octaves; octave++) {\n const lx = x * lvl;\n const ly = y * lvl;\n const lz = z * lvl;\n tx += generator.noise4D(lx, ly, lz, timeX * lvl) / lvl;\n ty += generator.noise4D(lx, ly, lz, timeY * lvl) / lvl;\n tz += generator.noise4D(lx, ly, lz, timeZ * lvl) / lvl;\n lvl *= 2;\n }\n velocities[o3] += tx * multiplierX;\n velocities[o3 + 1] += ty * multiplierY;\n velocities[o3 + 2] += tz * multiplierZ;\n }\n }\n toJSON() {\n return {\n type: this.type,\n scale: [this.scale.x, this.scale.y, this.scale.z],\n octaves: this.octaves,\n velocityMultiplier: [this.velocityMultiplier.x, this.velocityMultiplier.y, this.velocityMultiplier.z],\n timeScale: [this.timeScale.x, this.timeScale.y, this.timeScale.z],\n };\n }\n frameUpdate(delta) {\n this.timeOffset.x += delta * this.timeScale.x;\n this.timeOffset.y += delta * this.timeScale.y;\n this.timeOffset.z += delta * this.timeScale.z;\n }\n static fromJSON(json) {\n return new TurbulenceField(new Vector3(json.scale[0], json.scale[1], json.scale[2]), json.octaves, new Vector3(json.velocityMultiplier[0], json.velocityMultiplier[1], json.velocityMultiplier[2]), new Vector3(json.timeScale[0], json.timeScale[1], json.timeScale[2]));\n }\n clone() {\n return new TurbulenceField(this.scale.clone(), this.octaves, this.velocityMultiplier.clone(), this.timeScale.clone());\n }\n reset() { }\n}\n\nconst UNIT_X = new Vector3(1, 0, 0);\nconst UNIT_Y = new Vector3(0, 1, 0);\nconst UNIT_Z = new Vector3(0, 0, 1);\n/**\n * Move particles with a direct velocity over their life (Unity's \"Velocity over Lifetime\").\n * Applied as a positional displacement, so it is not affected by speed modifiers,\n * forces, or speed limits. Orbital speeds rotate particles around the emitter axes.\n */\nclass VelocityOverLife {\n constructor(linearX = new ConstantValue(0), linearY = new ConstantValue(0), linearZ = new ConstantValue(0), orbitalX = new ConstantValue(0), orbitalY = new ConstantValue(0), orbitalZ = new ConstantValue(0), space = 'local') {\n this.linearX = linearX;\n this.linearY = linearY;\n this.linearZ = linearZ;\n this.orbitalX = orbitalX;\n this.orbitalY = orbitalY;\n this.orbitalZ = orbitalZ;\n this.space = space;\n this.type = 'VelocityOverLife';\n this._temp = new Vector3();\n this._tempEmitterPos = new Vector3();\n this._tempQ = new Quaternion();\n this._tempQInv = new Quaternion();\n this._tempScale = new Vector3(1, 1, 1);\n this._tempScaleInv = new Vector3(1, 1, 1);\n this._tempRot = new Quaternion();\n /**\n * Axes the orbital speeds turn around, refreshed once per frame by\n * {@link frameUpdate}. In world space they are the emitter's axes, which\n * only change when the emitter does — so they are hoisted out of the\n * per-particle work rather than rebuilt for every particle.\n */\n this._axisX = new Vector3(1, 0, 0);\n this._axisY = new Vector3(0, 1, 0);\n this._axisZ = new Vector3(0, 0, 1);\n }\n initialize(particle, particleSystem) {\n this.ps = particleSystem;\n this.linearX.startGen(particle.memory);\n this.linearY.startGen(particle.memory);\n this.linearZ.startGen(particle.memory);\n this.orbitalX.startGen(particle.memory);\n this.orbitalY.startGen(particle.memory);\n this.orbitalZ.startGen(particle.memory);\n }\n frameUpdate(delta) {\n if (this.ps) {\n this.ps.emitter.matrixWorld.decompose(this._tempEmitterPos, this._tempQ, this._tempScale);\n this._tempQInv.copy(this._tempQ).invert();\n this._tempScaleInv.set(1 / this._tempScale.x, 1 / this._tempScale.y, 1 / this._tempScale.z);\n this._axisX.copy(UNIT_X);\n this._axisY.copy(UNIT_Y);\n this._axisZ.copy(UNIT_Z);\n if (this.ps.worldSpace) {\n this._axisX.applyQuaternion(this._tempQ);\n this._axisY.applyQuaternion(this._tempQ);\n this._axisZ.applyQuaternion(this._tempQ);\n }\n }\n }\n update(particle, delta) {\n const t = particle.age / particle.life;\n this._temp.set(this.linearX.genValue(particle.memory, t), this.linearY.genValue(particle.memory, t), this.linearZ.genValue(particle.memory, t));\n // The system is undefined until initialize() has run for this behavior;\n // an unknown one is treated as world space rather than throwing, which\n // is also what frameUpdate's guard assumes.\n const worldSpace = this.ps !== undefined && this.ps.worldSpace;\n // Convert the authored space into the particle simulation space.\n if (worldSpace && this.space === 'local') {\n this._temp.multiply(this._tempScale).applyQuaternion(this._tempQ);\n }\n else if (!worldSpace && this.space === 'world') {\n this._temp.multiply(this._tempScaleInv).applyQuaternion(this._tempQInv);\n }\n particle.position.addScaledVector(this._temp, delta);\n const angleX = this.orbitalX.genValue(particle.memory, t) * delta;\n const angleY = this.orbitalY.genValue(particle.memory, t) * delta;\n const angleZ = this.orbitalZ.genValue(particle.memory, t) * delta;\n if (angleX !== 0 || angleY !== 0 || angleZ !== 0) {\n if (worldSpace) {\n particle.position.sub(this._tempEmitterPos);\n }\n this.orbit(particle.position, this._axisX, angleX);\n this.orbit(particle.position, this._axisY, angleY);\n this.orbit(particle.position, this._axisZ, angleZ);\n if (worldSpace) {\n particle.position.add(this._tempEmitterPos);\n }\n }\n }\n orbit(position, axis, angle) {\n if (angle === 0) {\n return;\n }\n this._tempRot.setFromAxisAngle(axis, angle);\n position.applyQuaternion(this._tempRot);\n }\n toJSON() {\n return {\n type: this.type,\n linearX: this.linearX.toJSON(),\n linearY: this.linearY.toJSON(),\n linearZ: this.linearZ.toJSON(),\n orbitalX: this.orbitalX.toJSON(),\n orbitalY: this.orbitalY.toJSON(),\n orbitalZ: this.orbitalZ.toJSON(),\n space: this.space,\n };\n }\n static fromJSON(json) {\n const readValue = (field) => field ? ValueGeneratorFromJSON(field) : new ConstantValue(0);\n return new VelocityOverLife(readValue(json.linearX), readValue(json.linearY), readValue(json.linearZ), readValue(json.orbitalX), readValue(json.orbitalY), readValue(json.orbitalZ), json.space === 'world' ? 'world' : 'local');\n }\n clone() {\n return new VelocityOverLife(this.linearX.clone(), this.linearY.clone(), this.linearZ.clone(), this.orbitalX.clone(), this.orbitalY.clone(), this.orbitalZ.clone(), this.space);\n }\n reset() { }\n}\n\nclass LinkedListNode {\n constructor(data) {\n this.data = data;\n this.next = null;\n this.prev = null;\n }\n hasPrev() {\n return this.prev !== null;\n }\n hasNext() {\n return this.next !== null;\n }\n}\nclass LinkedList {\n constructor() {\n this.length = 0;\n this.head = this.tail = null;\n }\n isEmpty() {\n return this.head === null;\n }\n clear() {\n this.length = 0;\n this.head = this.tail = null;\n }\n front() {\n if (this.head === null)\n return null;\n return this.head.data;\n }\n back() {\n if (this.tail === null)\n return null;\n return this.tail.data;\n }\n /**\n * remove at head in O(1)\n */\n dequeue() {\n if (this.head) {\n const value = this.head.data;\n this.head = this.head.next;\n if (!this.head) {\n this.tail = null;\n }\n else {\n this.head.prev = null;\n }\n this.length--;\n return value;\n }\n return undefined;\n }\n /**\n * remove at tail in O(1)\n */\n pop() {\n if (this.tail) {\n const value = this.tail.data;\n this.tail = this.tail.prev;\n if (!this.tail) {\n this.head = null;\n }\n else {\n this.tail.next = null;\n }\n this.length--;\n return value;\n }\n return undefined;\n }\n /**\n * add at head in O(1)\n */\n queue(data) {\n const node = new LinkedListNode(data);\n if (!this.tail) {\n this.tail = node;\n }\n if (this.head) {\n this.head.prev = node;\n node.next = this.head;\n }\n this.head = node;\n this.length++;\n }\n /**\n * add at tail in O(1)\n */\n push(data) {\n const node = new LinkedListNode(data);\n if (!this.head) {\n this.head = node;\n }\n if (this.tail) {\n this.tail.next = node;\n node.prev = this.tail;\n }\n this.tail = node;\n this.length++;\n }\n insertBefore(node, data) {\n const newNode = new LinkedListNode(data);\n newNode.next = node;\n newNode.prev = node.prev;\n if (newNode.prev !== null) {\n newNode.prev.next = newNode;\n }\n newNode.next.prev = newNode;\n if (node == this.head) {\n this.head = newNode;\n }\n this.length++;\n }\n remove(data) {\n if (this.head === null || this.tail === null) {\n return;\n }\n let tempNode = this.head;\n if (data === this.head.data) {\n this.head = this.head.next;\n }\n if (data === this.tail.data) {\n this.tail = this.tail.prev;\n }\n while (tempNode.next !== null && tempNode.data !== data) {\n tempNode = tempNode.next;\n }\n if (tempNode.data === data) {\n if (tempNode.prev !== null)\n tempNode.prev.next = tempNode.next;\n if (tempNode.next !== null)\n tempNode.next.prev = tempNode.prev;\n this.length--;\n }\n }\n /**\n * Returns an iterator over the values\n */\n *values() {\n let current = this.head;\n while (current !== null) {\n yield current.data;\n current = current.next;\n }\n }\n}\n\n/**\n * Particle implementation for node-based particle systems.\n */\nclass NodeParticle {\n constructor() {\n /**\n * Position of the particle.\n * @type {Vector3}\n */\n this.position = new Vector3();\n /**\n * Velocity of the particle.\n * @type {Vector3}\n */\n this.velocity = new Vector3();\n /**\n * Age of the particle.\n * @type {number}\n */\n this.age = 0;\n /**\n * Life duration of the particle.\n * @type {number}\n */\n this.life = 1;\n /**\n * Size of the particle.\n * @type {Vector3}\n */\n this.size = new Vector3();\n /**\n * Rotation of the particle.\n * @type {number | Quaternion}\n */\n this.rotation = 0;\n /**\n * Color of the particle.\n * @type {Vector4}\n */\n this.color = new Vector4(1, 1, 1, 1);\n /**\n * UV tile index.\n * @type {number}\n */\n this.uvTile = 0;\n this.memory = [];\n }\n /**\n * Indicates if the particle has died.\n * @type {boolean}\n */\n get died() {\n return this.age >= this.life;\n }\n /**\n * Resets the particle properties to initial values.\n */\n reset() {\n this.memory.length = 0;\n this.position.set(0, 0, 0);\n this.velocity.set(0, 0, 0);\n this.age = 0;\n this.life = 1;\n this.size.set(1, 1, 1);\n this.rotation = 0;\n this.color.set(1, 1, 1, 1);\n this.uvTile = 0;\n }\n}\n/**\n * Particle implementation for sprite-based particle.\n */\nclass SpriteParticle {\n /**\n * Initial speed of the particle, kept in the store's `startSpeed` column.\n * @type {number}\n */\n get startSpeed() {\n return this.store.startSpeed[this.storeIndex];\n }\n set startSpeed(value) {\n this.store.startSpeed[this.storeIndex] = value;\n }\n /**\n * Age of the particle.\n * @type {number}\n */\n get age() {\n return this.scalars[this.scalarOffset];\n }\n set age(value) {\n this.scalars[this.scalarOffset] = value;\n }\n /**\n * Life duration of the particle.\n * @type {number}\n */\n get life() {\n return this.scalars[this.scalarOffset + 1];\n }\n set life(value) {\n this.scalars[this.scalarOffset + 1] = value;\n }\n /**\n * Speed modifier of the particle.\n * @type {number}\n */\n get speedModifier() {\n return this.scalars[this.scalarOffset + 2];\n }\n set speedModifier(value) {\n this.scalars[this.scalarOffset + 2] = value;\n }\n /**\n * Angular velocity of the particle: a rate in radians per second for an\n * angle rotation, one step's turn for a quaternion rotation. Both live in\n * the store so the renderer and compiled behaviors read them as ranges;\n * assigning a quaternion copies it into the particle's row and returns a\n * view of that row from then on.\n * @type {number | Quaternion}\n */\n get angularVelocity() {\n const q = this.angularVelocityQuaternion;\n return q !== undefined ? q : this.store.angularVelocity[this.storeIndex];\n }\n set angularVelocity(value) {\n if (typeof value === 'number') {\n this.angularVelocityQuaternion = undefined;\n this.store.angularVelocity[this.storeIndex] = value;\n }\n else if (value === undefined) {\n this.angularVelocityQuaternion = undefined;\n this.store.angularVelocity[this.storeIndex] = 0;\n }\n else {\n let view = this.angularVelocityQuaternion;\n if (view === undefined) {\n this.store.ensureQuaternionColumns();\n view = new QuaternionView(this.store.angularVelocityQuaternion, this.storeIndex * 4);\n this.angularVelocityQuaternion = view;\n }\n if (view !== value) {\n view.copy(value);\n }\n }\n }\n /**\n * Rotation of the particle: an angle, or a quaternion for mesh particles.\n * Both live in the store; see {@link angularVelocity} for how assigning a\n * quaternion behaves.\n * @type {number | Quaternion}\n */\n get rotation() {\n const q = this.rotationQuaternion;\n return q !== undefined ? q : this.store.rotation[this.storeIndex];\n }\n set rotation(value) {\n if (typeof value === 'number') {\n this.rotationQuaternion = undefined;\n this.store.rotation[this.storeIndex] = value;\n }\n else {\n let view = this.rotationQuaternion;\n if (view === undefined) {\n this.store.ensureQuaternionColumns();\n view = new QuaternionView(this.store.rotationQuaternion, this.storeIndex * 4);\n this.rotationQuaternion = view;\n }\n if (view !== value) {\n view.copy(value);\n }\n }\n }\n /**\n * UV tile index, kept in the store's `uvTile` column.\n * @type {number}\n */\n get uvTile() {\n return this.store.uvTile[this.storeIndex];\n }\n set uvTile(value) {\n this.store.uvTile[this.storeIndex] = value;\n }\n /**\n * Mirroring picked at birth from the system's `flip` fractions: bit 1\n * mirrors the sprite along U, bit 2 along V. 0 draws it as is. Kept in\n * the store's `flip` column.\n * @type {number}\n */\n get flip() {\n return this.store.flip[this.storeIndex];\n }\n set flip(value) {\n this.store.flip[this.storeIndex] = value;\n }\n /**\n * @param store - Column storage to bind to. A private single-row store is\n * created when omitted, so a standalone `new SpriteParticle()` still works.\n * @param storeIndex - Row this particle owns.\n */\n constructor(store = new ParticleStore(1), storeIndex = 0) {\n /**\n * View of this particle's row in the store's quaternion rotation column,\n * when it rotates by quaternion (mesh render mode); undefined while it\n * rotates by an angle, which then lives in the store's `rotation` column.\n * Always present so every sprite particle keeps one hidden class.\n */\n this.rotationQuaternion = undefined;\n /** Same split for the turn rate: a quaternion step here, a scalar rate in the store. */\n this.angularVelocityQuaternion = undefined;\n this.memory = [];\n this.store = store;\n this.storeIndex = storeIndex;\n const offset3 = storeIndex * 3;\n const offset4 = storeIndex * 4;\n this.position = new Vector3View(store.position, offset3);\n this.previousPosition = new Vector3View(store.previousPosition, offset3);\n this.previousVelocity = new Vector3View(store.previousVelocity, offset3);\n this.velocity = new Vector3View(store.velocity, offset3);\n this.size = new Vector3View(store.size, offset3);\n this.startSize = new Vector3View(store.startSize, offset3);\n this.color = new Vector4View(store.color, offset4);\n this.startColor = new Vector4View(store.startColor, offset4);\n this.scalars = store.scalars;\n this.scalarOffset = storeIndex * ParticleStore.SCALAR_STRIDE;\n this.size.set(1, 1, 1);\n this.startSize.set(1, 1, 1);\n this.life = 1;\n this.speedModifier = 1;\n }\n /**\n * Moves this particle onto a different store row. The caller is responsible\n * for having moved the row contents too.\n */\n setStoreIndex(index) {\n this.storeIndex = index;\n this.rebind();\n }\n /** Re-points the vector views after the store grew its arrays. */\n rebind() {\n const store = this.store;\n const offset3 = this.storeIndex * 3;\n const offset4 = this.storeIndex * 4;\n this.position.bind(store.position, offset3);\n this.previousPosition.bind(store.previousPosition, offset3);\n this.previousVelocity.bind(store.previousVelocity, offset3);\n this.velocity.bind(store.velocity, offset3);\n this.size.bind(store.size, offset3);\n this.startSize.bind(store.startSize, offset3);\n this.color.bind(store.color, offset4);\n this.startColor.bind(store.startColor, offset4);\n this.rotationQuaternion?.bind(store.rotationQuaternion, offset4);\n this.angularVelocityQuaternion?.bind(store.angularVelocityQuaternion, offset4);\n this.scalars = store.scalars;\n this.scalarOffset = this.storeIndex * ParticleStore.SCALAR_STRIDE;\n }\n /**\n * Indicates if the particle has died.\n * @type {boolean}\n */\n get died() {\n return this.age >= this.life;\n }\n reset() {\n this.memory.length = 0;\n }\n}\n/** Shared zero-length placeholder so trail buffers are never null. */\nconst EMPTY_HISTORY = new Float32Array(0);\nclass RecordState {\n /**\n * Creates a new record state.\n * @param {Vector3} position - The position of the particle.\n * @param {number} size - The size of the particle.\n * @param {Vector4} color - The color of the particle.\n */\n constructor(position, size, color) {\n this.position = position;\n this.size = size;\n this.color = color;\n }\n}\n/**\n * Particle implementation for trail-based particles.\n */\nclass TrailParticle {\n /**\n * Initial speed of the particle, kept in the store's `startSpeed` column.\n * @type {number}\n */\n get startSpeed() {\n return this.store.startSpeed[this.storeIndex];\n }\n set startSpeed(value) {\n this.store.startSpeed[this.storeIndex] = value;\n }\n /**\n * Age of the particle.\n * @type {number}\n */\n get age() {\n return this.scalars[this.scalarOffset];\n }\n set age(value) {\n this.scalars[this.scalarOffset] = value;\n }\n /**\n * Life duration of the particle.\n * @type {number}\n */\n get life() {\n return this.scalars[this.scalarOffset + 1];\n }\n set life(value) {\n this.scalars[this.scalarOffset + 1] = value;\n }\n /**\n * Speed modifier of the particle.\n * @type {number}\n */\n get speedModifier() {\n return this.scalars[this.scalarOffset + 2];\n }\n set speedModifier(value) {\n this.scalars[this.scalarOffset + 2] = value;\n }\n /**\n * Previous states of the particle.\n *\n * @deprecated The trail history now lives in the flat ring buffer below\n * (`historyPositions` / `historySizes` / `historyColors`), which records a\n * sample without allocating. This list is no longer populated or rendered.\n * @type {LinkedList<RecordState>}\n */\n get previous() {\n return (this._previous ?? (this._previous = new LinkedList()));\n }\n set previous(value) {\n this._previous = value;\n }\n /**\n * UV tile index, kept in the store's `uvTile` column.\n * @type {number}\n */\n get uvTile() {\n return this.store.uvTile[this.storeIndex];\n }\n set uvTile(value) {\n this.store.uvTile[this.storeIndex] = value;\n }\n /**\n * @param store - Column storage to bind to. A private single-row store is\n * created when omitted, so a standalone `new TrailParticle()` still works.\n * @param storeIndex - Row this particle owns.\n */\n constructor(store = new ParticleStore(1), storeIndex = 0) {\n /**\n * Length of the trail.\n * @type {number}\n */\n this.length = 100;\n this._previous = undefined;\n /** Ring buffer of recorded positions, 3 floats per sample. */\n this.historyPositions = EMPTY_HISTORY;\n /** Ring buffer of the widths the renderer draws, 1 float per sample. */\n this.historySizes = EMPTY_HISTORY;\n /**\n * Ring buffer of the particle's size (`size.x`) at each sample, before any\n * behavior rescaled it. Width behaviors scale this rather than\n * `historySizes`, so their factor is never compounded step after step.\n */\n this.historyBaseSizes = EMPTY_HISTORY;\n /**\n * Factor the next recorded sample's width is drawn with — what a width\n * behavior gives the head of the trail, which is recorded after the\n * behaviors have run. 1 unless such a behavior sets it.\n */\n this.headWidthScale = 1;\n /** Ring buffer of recorded colors, 4 floats per sample. */\n this.historyColors = EMPTY_HISTORY;\n /** Number of samples the ring buffers can hold. */\n this.historyCapacity = 0;\n /** Slot the next sample is written to. */\n this.historyHead = 0;\n /** Number of valid samples currently held. */\n this.historyCount = 0;\n this.memory = [];\n this.store = store;\n this.storeIndex = storeIndex;\n const offset3 = storeIndex * 3;\n const offset4 = storeIndex * 4;\n this.position = new Vector3View(store.position, offset3);\n this.previousPosition = new Vector3View(store.previousPosition, offset3);\n this.previousVelocity = new Vector3View(store.previousVelocity, offset3);\n this.velocity = new Vector3View(store.velocity, offset3);\n this.size = new Vector3View(store.size, offset3);\n this.startSize = new Vector3View(store.startSize, offset3);\n this.color = new Vector4View(store.color, offset4);\n this.startColor = new Vector4View(store.startColor, offset4);\n this.scalars = store.scalars;\n this.scalarOffset = storeIndex * ParticleStore.SCALAR_STRIDE;\n this.size.set(1, 1, 1);\n this.startSize.set(1, 1, 1);\n this.life = 1;\n this.speedModifier = 1;\n }\n /**\n * Moves this particle onto a different store row. The caller is responsible\n * for having moved the row contents too.\n */\n setStoreIndex(index) {\n this.storeIndex = index;\n this.rebind();\n }\n /** Re-points the vector views after the store grew its arrays. */\n rebind() {\n const store = this.store;\n const offset3 = this.storeIndex * 3;\n const offset4 = this.storeIndex * 4;\n this.position.bind(store.position, offset3);\n this.previousPosition.bind(store.previousPosition, offset3);\n this.previousVelocity.bind(store.previousVelocity, offset3);\n this.velocity.bind(store.velocity, offset3);\n this.size.bind(store.size, offset3);\n this.startSize.bind(store.startSize, offset3);\n this.color.bind(store.color, offset4);\n this.startColor.bind(store.startColor, offset4);\n this.scalars = store.scalars;\n this.scalarOffset = this.storeIndex * ParticleStore.SCALAR_STRIDE;\n }\n /**\n * Allocates the trail ring buffers, reusing them when the capacity is unchanged.\n * @param {number} capacity - Number of samples to hold.\n */\n ensureHistoryCapacity(capacity) {\n if (this.historyCapacity === capacity) {\n return;\n }\n this.historyCapacity = capacity;\n this.historyPositions = new Float32Array(capacity * 3);\n this.historySizes = new Float32Array(capacity);\n this.historyBaseSizes = new Float32Array(capacity);\n this.historyColors = new Float32Array(capacity * 4);\n this.historyHead = 0;\n this.historyCount = 0;\n }\n /** Drops every recorded sample without releasing the buffers. */\n resetHistory() {\n this.historyHead = 0;\n this.historyCount = 0;\n }\n /**\n * Ring buffer slot of the i-th sample counting from the oldest one.\n * @param {number} i - Sample offset, `0` being the oldest live sample.\n */\n getHistoryIndex(i) {\n const capacity = this.historyCapacity;\n return (this.historyHead - this.historyCount + capacity + i) % capacity;\n }\n /**\n * Records the current state into the trail ring buffer, or retires the\n * oldest sample once the particle is dead. Allocation free.\n */\n update() {\n // Sized at spawn; this only catches a particle driven without one.\n if (this.historyCapacity === 0) {\n this.ensureHistoryCapacity(Math.max(1, Math.ceil(this.length)));\n }\n const capacity = this.historyCapacity;\n const store = this.store;\n const row = this.storeIndex;\n const scalar = row * ParticleStore.SCALAR_STRIDE;\n if (store.scalars[scalar + ParticleStore.AGE] > store.scalars[scalar + ParticleStore.LIFE]) {\n if (this.historyCount > 0) {\n this.historyCount--;\n }\n return;\n }\n // Straight off the store's columns rather than through the vector views.\n const head = this.historyHead;\n const positionIndex = head * 3;\n const positions = this.historyPositions;\n const storePositions = store.position;\n const o3 = row * 3;\n positions[positionIndex] = storePositions[o3];\n positions[positionIndex + 1] = storePositions[o3 + 1];\n positions[positionIndex + 2] = storePositions[o3 + 2];\n const size = store.size[o3];\n this.historyBaseSizes[head] = size;\n this.historySizes[head] = size * this.headWidthScale;\n const colorIndex = head * 4;\n const colors = this.historyColors;\n const storeColors = store.color;\n const o4 = row * 4;\n colors[colorIndex] = storeColors[o4];\n colors[colorIndex + 1] = storeColors[o4 + 1];\n colors[colorIndex + 2] = storeColors[o4 + 2];\n colors[colorIndex + 3] = storeColors[o4 + 3];\n this.historyHead = (head + 1) % capacity;\n if (this.historyCount < capacity) {\n this.historyCount++;\n }\n }\n /**\n * Indicates if the particle has died.\n * @type {boolean}\n */\n get died() {\n return this.age >= this.life;\n }\n /**\n * Resets the particle properties and clears the previous states.\n */\n reset() {\n this.memory.length = 0;\n this.headWidthScale = 1;\n this.resetHistory();\n }\n}\n\n/**\n * Shapes a trail's width along its length — Unity's Width over Trail.\n *\n * The curve runs from the head (0) to the tail (1) and, by default, is a\n * multiplier on the width each sample was recorded with (the particle's\n * `size.x` at that moment): a curve from 1 to 0 tapers the trail from the\n * particle's size at the head down to nothing at the tail, whatever that size\n * is. The head itself gets the curve's value at 0.\n *\n * With `absolute` set the curve is the width itself, in world units, ignoring\n * the particle's size; the head keeps the particle's size. That is how this\n * behavior read every curve up to 0.21, and an effect JSON written by those\n * versions (it has no `absolute` field) still loads that way.\n */\nclass WidthOverLength {\n initialize(particle) {\n this.width.startGen(particle.memory);\n }\n /**\n * @param width - Width along the trail, head (0) to tail (1).\n * @param absolute - Read `width` as world units instead of a multiplier on the particle's size.\n */\n constructor(width, absolute = false) {\n this.width = width;\n this.absolute = absolute;\n this.type = 'WidthOverLength';\n }\n update(particle) {\n if (!(particle instanceof TrailParticle)) {\n return;\n }\n const memory = particle.memory;\n // The head is recorded after the behaviors run; give it its factor now\n // so the strip has no step at the tip.\n particle.headWidthScale = this.absolute ? 1 : this.width.genValue(memory, 0);\n const count = particle.historyCount;\n if (count === 0) {\n return;\n }\n const capacity = particle.historyCapacity;\n const sizes = particle.historySizes;\n const baseSizes = particle.historyBaseSizes;\n const invLength = 1 / particle.length;\n const absolute = this.absolute;\n // Walk the ring buffer oldest-first, wrapping by hand so the loop stays\n // free of divisions.\n let slot = particle.getHistoryIndex(0);\n for (let i = 0; i < count; i++) {\n const factor = this.width.genValue(memory, (count - i) * invLength);\n sizes[slot] = absolute ? factor : baseSizes[slot] * factor;\n slot++;\n if (slot === capacity) {\n slot = 0;\n }\n }\n }\n frameUpdate(delta) { }\n toJSON() {\n return {\n type: this.type,\n width: this.width.toJSON(),\n absolute: this.absolute,\n };\n }\n static fromJSON(json) {\n // JSON from before `absolute` existed was authored against absolute widths.\n return new WidthOverLength(ValueGeneratorFromJSON(json.width), json.absolute ?? true);\n }\n clone() {\n return new WidthOverLength(this.width.clone(), this.absolute);\n }\n reset() { }\n}\n\nconst BehaviorTypes = {\n ApplyForce: {\n type: 'ApplyForce',\n constructor: ApplyForce,\n params: [\n ['direction', ['vec3']],\n ['magnitude', ['value']],\n ],\n loadJSON: ApplyForce.fromJSON,\n },\n Noise: {\n type: 'Noise',\n constructor: Noise,\n params: [\n ['frequency', ['value']],\n ['power', ['value']],\n ['positionAmount', ['value']],\n ['rotationAmount', ['value']],\n ],\n loadJSON: Noise.fromJSON,\n },\n TurbulenceField: {\n type: 'TurbulenceField',\n constructor: TurbulenceField,\n params: [\n ['scale', ['vec3']],\n ['octaves', ['number']],\n ['velocityMultiplier', ['vec3']],\n ['timeScale', ['vec3']],\n ],\n loadJSON: TurbulenceField.fromJSON,\n },\n GravityForce: {\n type: 'GravityForce',\n constructor: GravityForce,\n params: [\n ['center', ['vec3']],\n ['magnitude', ['number']],\n ],\n loadJSON: GravityForce.fromJSON,\n },\n ColorOverLife: {\n type: 'ColorOverLife',\n constructor: ColorOverLife,\n params: [['color', ['colorFunc']]],\n loadJSON: ColorOverLife.fromJSON,\n },\n RotationOverLife: {\n type: 'RotationOverLife',\n constructor: RotationOverLife,\n params: [['angularVelocity', ['value', 'valueFunc']]],\n loadJSON: RotationOverLife.fromJSON,\n },\n Rotation3DOverLife: {\n type: 'Rotation3DOverLife',\n constructor: Rotation3DOverLife,\n params: [['angularVelocity', ['rotationFunc']]],\n loadJSON: Rotation3DOverLife.fromJSON,\n },\n SizeOverLife: {\n type: 'SizeOverLife',\n constructor: SizeOverLife,\n params: [['size', ['value', 'valueFunc', 'vec3Func']]],\n loadJSON: SizeOverLife.fromJSON,\n },\n ColorBySpeed: {\n type: 'ColorBySpeed',\n constructor: ColorBySpeed,\n params: [\n ['color', ['colorFunc']],\n ['speedRange', ['range']],\n ],\n loadJSON: ColorBySpeed.fromJSON,\n },\n RotationBySpeed: {\n type: 'RotationBySpeed',\n constructor: RotationBySpeed,\n params: [\n ['angularVelocity', ['value', 'valueFunc']],\n ['speedRange', ['range']],\n ],\n loadJSON: RotationBySpeed.fromJSON,\n },\n SizeBySpeed: {\n type: 'SizeBySpeed',\n constructor: SizeBySpeed,\n params: [\n ['size', ['value', 'valueFunc', 'vec3Func']],\n ['speedRange', ['range']],\n ],\n loadJSON: SizeBySpeed.fromJSON,\n },\n SpeedOverLife: {\n type: 'SpeedOverLife',\n constructor: SpeedOverLife,\n params: [['speed', ['value', 'valueFunc']]],\n loadJSON: SpeedOverLife.fromJSON,\n },\n FrameOverLife: {\n type: 'FrameOverLife',\n constructor: FrameOverLife,\n params: [['frame', ['value', 'valueFunc']]],\n loadJSON: FrameOverLife.fromJSON,\n },\n ForceOverLife: {\n type: 'ForceOverLife',\n constructor: ForceOverLife,\n params: [\n ['x', ['value', 'valueFunc']],\n ['y', ['value', 'valueFunc']],\n ['z', ['value', 'valueFunc']],\n ],\n loadJSON: ForceOverLife.fromJSON,\n },\n VelocityOverLife: {\n type: 'VelocityOverLife',\n constructor: VelocityOverLife,\n params: [\n ['linearX', ['value', 'valueFunc']],\n ['linearY', ['value', 'valueFunc']],\n ['linearZ', ['value', 'valueFunc']],\n ['orbitalX', ['value', 'valueFunc']],\n ['orbitalY', ['value', 'valueFunc']],\n ['orbitalZ', ['value', 'valueFunc']],\n ['space', ['string']],\n ],\n loadJSON: VelocityOverLife.fromJSON,\n },\n InheritVelocity: {\n type: 'InheritVelocity',\n constructor: InheritVelocity,\n params: [\n ['multiplier', ['value', 'valueFunc']],\n ['mode', ['string']],\n ],\n loadJSON: InheritVelocity.fromJSON,\n },\n OrbitOverLife: {\n type: 'OrbitOverLife',\n constructor: OrbitOverLife,\n params: [\n ['orbitSpeed', ['value', 'valueFunc']],\n ['axis', ['vec3']],\n ],\n loadJSON: OrbitOverLife.fromJSON,\n },\n WidthOverLength: {\n type: 'WidthOverLength',\n constructor: WidthOverLength,\n params: [['width', ['value', 'valueFunc']]],\n loadJSON: WidthOverLength.fromJSON,\n },\n ChangeEmitDirection: {\n type: 'ChangeEmitDirection',\n constructor: ChangeEmitDirection,\n params: [['angle', ['value']]],\n loadJSON: ChangeEmitDirection.fromJSON,\n },\n EmitSubParticleSystem: {\n type: 'EmitSubParticleSystem',\n constructor: EmitSubParticleSystem,\n params: [\n ['particleSystem', ['self']],\n ['useVelocityAsBasis', ['boolean']],\n ['subParticleSystem', ['particleSystem']],\n ['mode', ['number']],\n ['emitProbability', ['number']],\n ],\n loadJSON: EmitSubParticleSystem.fromJSON,\n },\n LimitSpeedOverLife: {\n type: 'LimitSpeedOverLife',\n constructor: LimitSpeedOverLife,\n params: [\n ['speed', ['value', 'valueFunc']],\n ['dampen', ['number']],\n ],\n loadJSON: LimitSpeedOverLife.fromJSON,\n },\n ApplyCollision: {\n type: 'ApplyCollision',\n constructor: ApplyCollision,\n // The resolver is host-provided (getPhysicsResolver), not serialized; only bounce round-trips.\n params: [['bounce', ['number']]],\n loadJSON: ApplyCollision.fromJSON,\n },\n};\nfunction BehaviorFromJSON(json, particleSystem) {\n if (BehaviorTypes[json.type]) {\n return BehaviorTypes[json.type].loadJSON(json, particleSystem);\n }\n return null;\n}\n\n/** Constructors and helpers the generated code needs. */\nconst DEPS = {\n PiecewiseBezier,\n Vector3Function,\n Quaternion,\n ConstantValue,\n Gradient,\n Vector4View,\n AxisAngleGenerator,\n IntervalValue,\n ColorRange,\n};\n/**\n * Setup for a scalar generator read from `expr`, bound to names prefixed `n`.\n *\n * The generator's kind is decided once per pass: a sampled {@link PiecewiseBezier}\n * is interpolated inline, a {@link ConstantValue} is read once, anything else is\n * called. The table is only used when the owning behavior has refreshed it,\n * exactly as the behavior's own update would.\n */\nfunction scalarSetup(n, expr) {\n return `const ${n} = ${expr};\n const ${n}_tbl = ${n} instanceof deps.PiecewiseBezier ? ${n}.sampledTable() : null;\n const ${n}_last = ${n}_tbl !== null ? ${n}_tbl.length - 1 : 0;\n const ${n}_const = ${n} instanceof deps.ConstantValue;\n const ${n}_cv = ${n}_const ? ${n}.value : 0;\n const ${n}_iv = ${n} instanceof deps.IntervalValue;\n const ${n}_slot = ${n}_iv ? ${n}.indexCount : -1;\n const ${n}_col = ${n}_slot >= 0 && ${n}_slot < ms;\n const ${n}_a = ${n}_iv ? ${n}.a : 0, ${n}_b = ${n}_iv ? ${n}.b : 0;`;\n}\n/** Statements that declare `out` and set it to the generator's value at `t`. */\nfunction scalarValue(n, out, t) {\n return `let ${out};\n if (${n}_tbl !== null) {\n const tt = ${t};\n if (tt <= 0) ${out} = ${n}_tbl[0];\n else if (tt >= 1) ${out} = ${n}_tbl[${n}_last];\n else {\n const x = tt * ${n}_last;\n const ix = x | 0;\n const v0 = ${n}_tbl[ix];\n ${out} = v0 + (${n}_tbl[ix + 1] - v0) * (x - ix);\n }\n } else if (${n}_const) ${out} = ${n}_cv;\n else if (${n}_iv) {\n // The particle's own sample, from the memory column when it holds it.\n let r = ${n}_col ? mem[row * ms + ${n}_slot] : NaN;\n if (r !== r) r = p.memory[${n}_slot];\n ${out} = (1 - r) * ${n}_a + r * ${n}_b;\n } else ${out} = ${n}.genValue(p.memory, ${t});`;\n}\n/** Setup for a colour generator read from `expr`, bound to names prefixed `n`. */\nfunction colorSetup(n, expr) {\n return `const ${n} = ${expr};\n const ${n}_tbl = ${n} instanceof deps.Gradient ? ${n}.sampledTable() : null;\n const ${n}_last = ${n}_tbl !== null ? ${n}_tbl.length / 4 - 1 : 0;\n const ${n}_cr = ${n} instanceof deps.ColorRange;\n const ${n}_slot = ${n}_cr ? ${n}.indexCount : -1;\n const ${n}_col = ${n}_slot >= 0 && ${n}_slot < ms;\n // Rounded to float32 as copying the colour into the particle does.\n const ${n}_ax = ${n}_cr ? Math.fround(${n}.a.x) : 0, ${n}_ay = ${n}_cr ? Math.fround(${n}.a.y) : 0;\n const ${n}_az = ${n}_cr ? Math.fround(${n}.a.z) : 0, ${n}_aw = ${n}_cr ? Math.fround(${n}.a.w) : 0;\n const ${n}_bx = ${n}_cr ? ${n}.b.x : 0, ${n}_by = ${n}_cr ? ${n}.b.y : 0;\n const ${n}_bz = ${n}_cr ? ${n}.b.z : 0, ${n}_bw = ${n}_cr ? ${n}.b.w : 0;`;\n}\n/**\n * Statements writing the generator's colour at `t`, times the start colour,\n * into row `o4` of the colour column. Each channel is rounded to float32\n * before the multiply, as it is when the generator writes into the particle's\n * colour view first, so both paths produce the same bits.\n */\nfunction colorWrite(n, t) {\n return `if (${n}_tbl !== null) {\n const tt = ${t};\n const tbl = ${n}_tbl;\n let r, g, b, a;\n if (tt <= 0) {\n r = tbl[0]; g = tbl[1]; b = tbl[2]; a = tbl[3];\n } else if (tt >= 1) {\n const o = ${n}_last * 4;\n r = tbl[o]; g = tbl[o + 1]; b = tbl[o + 2]; a = tbl[o + 3];\n } else {\n const x = tt * ${n}_last;\n const ix = x | 0;\n const fr = x - ix;\n const o = ix * 4;\n const nx = o + 4;\n r = tbl[o] + (tbl[nx] - tbl[o]) * fr;\n g = tbl[o + 1] + (tbl[nx + 1] - tbl[o + 1]) * fr;\n b = tbl[o + 2] + (tbl[nx + 2] - tbl[o + 2]) * fr;\n a = tbl[o + 3] + (tbl[nx + 3] - tbl[o + 3]) * fr;\n }\n color[o4] = Math.fround(r) * startColor[o4];\n color[o4 + 1] = Math.fround(g) * startColor[o4 + 1];\n color[o4 + 2] = Math.fround(b) * startColor[o4 + 2];\n color[o4 + 3] = Math.fround(a) * startColor[o4 + 3];\n } else if (${n}_cr) {\n let r = ${n}_col ? mem[row * ms + ${n}_slot] : NaN;\n if (r !== r) r = p.memory[${n}_slot];\n color[o4] = Math.fround(${n}_ax + (${n}_bx - ${n}_ax) * r) * startColor[o4];\n color[o4 + 1] = Math.fround(${n}_ay + (${n}_by - ${n}_ay) * r) * startColor[o4 + 1];\n color[o4 + 2] = Math.fround(${n}_az + (${n}_bz - ${n}_az) * r) * startColor[o4 + 2];\n color[o4 + 3] = Math.fround(${n}_aw + (${n}_bw - ${n}_aw) * r) * startColor[o4 + 3];\n } else {\n ${n}.genColor(p.memory, tmpColor, ${t});\n color[o4] = tmpColor.x * startColor[o4];\n color[o4 + 1] = tmpColor.y * startColor[o4 + 1];\n color[o4 + 2] = tmpColor.z * startColor[o4 + 2];\n color[o4 + 3] = tmpColor.w * startColor[o4 + 3];\n }`;\n}\n/** Statements turning the quaternion components into a rotation applied to `(x, y, z)` in place. */\nfunction rotateInPlace(x, y, z, qx, qy, qz, qw) {\n return `{\n const cx = 2 * (${qy} * ${z} - ${qz} * ${y});\n const cy = 2 * (${qz} * ${x} - ${qx} * ${z});\n const cz = 2 * (${qx} * ${y} - ${qy} * ${x});\n const nx = ${x} + ${qw} * cx + ${qy} * cz - ${qz} * cy;\n const ny = ${y} + ${qw} * cy + ${qz} * cx - ${qx} * cz;\n ${z} = ${z} + ${qw} * cz + ${qx} * cy - ${qy} * cx;\n ${x} = nx;\n ${y} = ny;\n }`;\n}\n/** Setup reading a quaternion's components once, as `${n}x..${n}w`. */\nfunction quaternionSetup(n, expr) {\n return `const ${n}_q = ${expr};\n const ${n}x = ${n}_q.x, ${n}y = ${n}_q.y, ${n}z = ${n}_q.z, ${n}w = ${n}_q.w;`;\n}\n/** Setup reading a vector's components once, as `${n}x..${n}z`. */\nfunction vectorSetup(n, expr) {\n return `const ${n}_v = ${expr};\n const ${n}x = ${n}_v.x, ${n}y = ${n}_v.y, ${n}z = ${n}_v.z;`;\n}\n/**\n * Statements orbiting the float32-rounded point `(px, py, pz)` by `angle`\n * around the unit axis `(ax, ay, az)`, as `Quaternion.setFromAxisAngle`\n * followed by `Vector3.applyQuaternion` on a stored vector would.\n */\nfunction orbitInPlace(angle, ax, ay, az) {\n return `{\n const half = ${angle} / 2;\n const sn = Math.sin(half);\n const qx = ${ax} * sn, qy = ${ay} * sn, qz = ${az} * sn, qw = Math.cos(half);\n ${rotateInPlace('px', 'py', 'pz', 'qx', 'qy', 'qz', 'qw')}\n px = Math.fround(px); py = Math.fround(py); pz = Math.fround(pz);\n }`;\n}\n/**\n * Source for one behavior, or null when it is not one this module knows.\n *\n * Everything is read out of `behaviors[k]` at pass time rather than captured,\n * so swapping a behavior's generator takes effect on the next frame without\n * recompiling.\n */\nfunction fragmentFor(behavior, k) {\n switch (behavior.type) {\n case 'ColorOverLife':\n return {\n setup: colorSetup(`g${k}`, `behaviors[${k}].color`),\n body: `{${colorWrite(`g${k}`, 't')}}`,\n };\n case 'SizeOverLife':\n return {\n setup: `const g${k} = behaviors[${k}].size;\n const vec3_${k} = g${k} instanceof deps.Vector3Function;\n ${scalarSetup(`sg${k}`, `g${k}`)}`,\n body: `if (vec3_${k}) {\n g${k}.genValue(p.memory, p.size, t).multiply(p.startSize);\n } else {\n ${scalarValue(`sg${k}`, 'v', 't')}\n size[o3] = startSize[o3] * v;\n size[o3 + 1] = startSize[o3 + 1] * v;\n size[o3 + 2] = startSize[o3 + 2] * v;\n }`,\n };\n case 'ApplyForce':\n return {\n setup: `const b${k} = behaviors[${k}];\n const f${k} = b${k}.magnitudeValue * delta;\n const dx${k} = b${k}.direction.x * f${k};\n const dy${k} = b${k}.direction.y * f${k};\n const dz${k} = b${k}.direction.z * f${k};`,\n body: `vel[o3] += dx${k}; vel[o3 + 1] += dy${k}; vel[o3 + 2] += dz${k};`,\n };\n case 'RotationOverLife':\n return {\n // Whether the particles rotate by an angle or by quaternion is a\n // property of the system (billboard or mesh; trails do neither),\n // so it is read off the first particle once rather than per particle.\n setup: `${scalarSetup(`g${k}`, `behaviors[${k}].angularVelocity`)}\n const rotation_${k} = count > 0 ? particles[0].rotation : undefined;\n const angle_${k} = typeof rotation_${k} === 'number';\n const rq${k} = store.rotationQuaternion, aq${k} = store.angularVelocityQuaternion;\n const quat_${k} = !angle_${k} && rq${k}.length > 0 && rotation_${k} instanceof deps.Quaternion;`,\n // The rate (or the step's turn) is kept for the renderer, which\n // draws between simulation steps. A mesh particle turns about its\n // own Z, as RotationOverLife.turnAboutZ does.\n body: `if (angle_${k}) {\n ${scalarValue(`g${k}`, 'rate', 't')}\n rot[row] += delta * rate;\n angVel[row] = rate;\n } else if (quat_${k}) {\n ${scalarValue(`g${k}`, 'rate', 't')}\n const half = (rate * delta) / 2;\n const qz = Math.sin(half), qw = Math.cos(half);\n const ax = rq${k}[o4], ay = rq${k}[o4 + 1], az = rq${k}[o4 + 2], aw = rq${k}[o4 + 3];\n rq${k}[o4] = ax * qw + ay * qz;\n rq${k}[o4 + 1] = ay * qw - ax * qz;\n rq${k}[o4 + 2] = az * qw + aw * qz;\n rq${k}[o4 + 3] = aw * qw - az * qz;\n aq${k}[o4] = 0; aq${k}[o4 + 1] = 0; aq${k}[o4 + 2] = qz; aq${k}[o4 + 3] = qw;\n }`,\n };\n case 'FrameOverLife':\n return {\n setup: scalarSetup(`g${k}`, `behaviors[${k}].frame`),\n body: `{${scalarValue(`g${k}`, 'v', 't')} uvTile[row] = v;}`,\n };\n case 'SpeedOverLife':\n return {\n setup: scalarSetup(`g${k}`, `behaviors[${k}].speed`),\n body: `{${scalarValue(`g${k}`, 'v', 't')} scalars[s + 2] = v;}`,\n };\n case 'ForceOverLife':\n return {\n setup: `const b${k} = behaviors[${k}];\n ${scalarSetup(`gx${k}`, `b${k}.x`)}\n ${scalarSetup(`gy${k}`, `b${k}.y`)}\n ${scalarSetup(`gz${k}`, `b${k}.z`)}\n const local${k} = b${k}.ps !== undefined && !b${k}.ps.worldSpace;\n ${vectorSetup(`sc${k}`, `b${k}._tempScale`)}\n ${quaternionSetup(`q${k}`, `b${k}._tempQ`)}`,\n body: `{\n ${scalarValue(`gx${k}`, 'fx', 't')}\n ${scalarValue(`gy${k}`, 'fy', 't')}\n ${scalarValue(`gz${k}`, 'fz', 't')}\n if (local${k}) {\n fx *= sc${k}x; fy *= sc${k}y; fz *= sc${k}z;\n ${rotateInPlace('fx', 'fy', 'fz', `q${k}x`, `q${k}y`, `q${k}z`, `q${k}w`)}\n }\n vel[o3] += fx * delta; vel[o3 + 1] += fy * delta; vel[o3 + 2] += fz * delta;}`,\n };\n case 'LimitSpeedOverLife':\n return {\n setup: `const b${k} = behaviors[${k}];\n ${scalarSetup(`g${k}`, `b${k}.speed`)}\n const dampen${k} = b${k}.dampen * delta * 20;`,\n body: `{const vx = vel[o3], vy = vel[o3 + 1], vz = vel[o3 + 2];\n const speed = Math.sqrt(vx * vx + vy * vy + vz * vz);\n ${scalarValue(`g${k}`, 'limit', 't')}\n if (speed > limit) {\n const f = 1 - ((speed - limit) / speed) * dampen${k};\n vel[o3] = vx * f; vel[o3 + 1] = vy * f; vel[o3 + 2] = vz * f;\n }}`,\n };\n case 'GravityForce':\n return {\n setup: `const b${k} = behaviors[${k}];\n const cx${k} = b${k}.center.x, cy${k} = b${k}.center.y, cz${k} = b${k}.center.z;\n const gm${k} = b${k}.magnitude * delta;`,\n body: `{const dx = cx${k} - pos[o3], dy = cy${k} - pos[o3 + 1], dz = cz${k} - pos[o3 + 2];\n const d2 = dx * dx + dy * dy + dz * dz;\n if (d2 > 0) {\n const f = gm${k} / (d2 * Math.sqrt(d2));\n vel[o3] += dx * f; vel[o3 + 1] += dy * f; vel[o3 + 2] += dz * f;\n }}`,\n };\n case 'ColorBySpeed':\n return {\n setup: `const b${k} = behaviors[${k}];\n ${colorSetup(`g${k}`, `b${k}.color`)}\n const lo${k} = b${k}.speedRange.a;\n const span${k} = b${k}.speedRange.b - lo${k};`,\n body: `{const ts = (startSpeed[row] - lo${k}) / span${k};\n ${colorWrite(`g${k}`, 'ts')}}`,\n };\n case 'SizeBySpeed':\n return {\n setup: `const b${k} = behaviors[${k}];\n const g${k} = b${k}.size;\n const lo${k} = b${k}.speedRange.a;\n const span${k} = b${k}.speedRange.b - lo${k};\n const vec3_${k} = g${k} instanceof deps.Vector3Function;\n ${scalarSetup(`sg${k}`, `g${k}`)}`,\n body: `{const ts = (startSpeed[row] - lo${k}) / span${k};\n if (vec3_${k}) {\n g${k}.genValue(p.memory, p.size, ts).multiply(p.startSize);\n } else {\n ${scalarValue(`sg${k}`, 'v', 'ts')}\n size[o3] = startSize[o3] * v;\n size[o3 + 1] = startSize[o3 + 1] * v;\n size[o3 + 2] = startSize[o3 + 2] * v;\n }}`,\n };\n case 'RotationBySpeed':\n return {\n setup: `const b${k} = behaviors[${k}];\n ${scalarSetup(`g${k}`, `b${k}.angularVelocity`)}\n const lo${k} = b${k}.speedRange.a;\n const span${k} = b${k}.speedRange.b - lo${k};\n const angle_${k} = count > 0 && typeof particles[0].rotation === 'number';`,\n body: `if (angle_${k}) {\n const ts = (startSpeed[row] - lo${k}) / span${k};\n ${scalarValue(`g${k}`, 'rate', 'ts')}\n rot[row] += delta * rate;\n angVel[row] = rate;\n }`,\n };\n case 'OrbitOverLife':\n return {\n // A constant orbit speed turns every particle by the same\n // quaternion, built once here instead of a sin/cos per particle.\n setup: `const b${k} = behaviors[${k}];\n ${scalarSetup(`g${k}`, `b${k}.orbitSpeed`)}\n ${vectorSetup(`ax${k}`, `b${k}.axis`)}\n const alen${k} = ax${k}x * ax${k}x + ax${k}y * ax${k}y + ax${k}z * ax${k}z;\n const chalf${k} = (g${k}_cv * delta) / 2;\n const csn${k} = Math.sin(chalf${k});\n const cqx${k} = ax${k}x * csn${k}, cqy${k} = ax${k}y * csn${k}, cqz${k} = ax${k}z * csn${k};\n const cqw${k} = Math.cos(chalf${k});`,\n body: `{let px = pos[o3], py = pos[o3 + 1], pz = pos[o3 + 2];\n let tx = 0, ty = 0, tz = 0;\n if (alen${k} !== 0) {\n const f = (ax${k}x * px + ax${k}y * py + ax${k}z * pz) / alen${k};\n tx = ax${k}x * f; ty = ax${k}y * f; tz = ax${k}z * f;\n }\n let qx, qy, qz, qw;\n if (g${k}_const) {\n qx = cqx${k}; qy = cqy${k}; qz = cqz${k}; qw = cqw${k};\n } else {\n ${scalarValue(`g${k}`, 'sp', 't')}\n const half = (sp * delta) / 2;\n const sn = Math.sin(half);\n qx = ax${k}x * sn; qy = ax${k}y * sn; qz = ax${k}z * sn; qw = Math.cos(half);\n }\n px = Math.fround(px - tx); py = Math.fround(py - ty); pz = Math.fround(pz - tz);\n ${rotateInPlace('px', 'py', 'pz', 'qx', 'qy', 'qz', 'qw')}\n pos[o3] = Math.fround(px) + tx;\n pos[o3 + 1] = Math.fround(py) + ty;\n pos[o3 + 2] = Math.fround(pz) + tz;}`,\n };\n case 'Rotation3DOverLife':\n return {\n // Whether the particles rotate by quaternion is a property of the\n // system (mesh render mode), read off the first particle once. A\n // fixed axis-angle rate turns every particle by the same step,\n // built once here instead of a sin/cos per particle.\n setup: `const b${k} = behaviors[${k}];\n const g${k} = b${k}.angularVelocity;\n const q${k} = b${k}.tempQuat;\n const rq${k} = store.rotationQuaternion, aq${k} = store.angularVelocityQuaternion;\n const quat_${k} = rq${k}.length > 0 && count > 0 && particles[0].rotation instanceof deps.Quaternion;\n const fixed_${k} = g${k} instanceof deps.AxisAngleGenerator && g${k}.angle instanceof deps.ConstantValue;\n let cqx${k} = 0, cqy${k} = 0, cqz${k} = 0, cqw${k} = 1;\n if (fixed_${k}) {\n g${k}.genValue(undefined, q${k}, delta, 0);\n cqx${k} = q${k}.x; cqy${k} = q${k}.y; cqz${k} = q${k}.z; cqw${k} = q${k}.w;\n }`,\n // The step's turn is kept for the renderer, which draws a fraction\n // of it when the frame falls between steps.\n body: `if (quat_${k}) {\n let qx, qy, qz, qw;\n if (fixed_${k}) {\n qx = cqx${k}; qy = cqy${k}; qz = cqz${k}; qw = cqw${k};\n } else {\n g${k}.genValue(p.memory, q${k}, delta, t);\n qx = q${k}.x; qy = q${k}.y; qz = q${k}.z; qw = q${k}.w;\n }\n const ax = rq${k}[o4], ay = rq${k}[o4 + 1], az = rq${k}[o4 + 2], aw = rq${k}[o4 + 3];\n rq${k}[o4] = ax * qw + aw * qx + ay * qz - az * qy;\n rq${k}[o4 + 1] = ay * qw + aw * qy + az * qx - ax * qz;\n rq${k}[o4 + 2] = az * qw + aw * qz + ax * qy - ay * qx;\n rq${k}[o4 + 3] = aw * qw - ax * qx - ay * qy - az * qz;\n aq${k}[o4] = qx; aq${k}[o4 + 1] = qy; aq${k}[o4 + 2] = qz; aq${k}[o4 + 3] = qw;\n }`,\n };\n case 'VelocityOverLife':\n return {\n setup: `const b${k} = behaviors[${k}];\n ${scalarSetup(`lx${k}`, `b${k}.linearX`)}\n ${scalarSetup(`ly${k}`, `b${k}.linearY`)}\n ${scalarSetup(`lz${k}`, `b${k}.linearZ`)}\n ${scalarSetup(`ox${k}`, `b${k}.orbitalX`)}\n ${scalarSetup(`oy${k}`, `b${k}.orbitalY`)}\n ${scalarSetup(`oz${k}`, `b${k}.orbitalZ`)}\n ${vectorSetup(`aX${k}`, `b${k}._axisX`)}\n ${vectorSetup(`aY${k}`, `b${k}._axisY`)}\n ${vectorSetup(`aZ${k}`, `b${k}._axisZ`)}\n ${vectorSetup(`pv${k}`, `b${k}._tempEmitterPos`)}\n const world${k} = b${k}.ps !== undefined && b${k}.ps.worldSpace;\n const toWorld${k} = world${k} && b${k}.space === 'local';\n const convert${k} = toWorld${k} || (!world${k} && b${k}.space === 'world');\n ${vectorSetup(`sc${k}`, `toWorld${k} ? b${k}._tempScale : b${k}._tempScaleInv`)}\n ${quaternionSetup(`q${k}`, `toWorld${k} ? b${k}._tempQ : b${k}._tempQInv`)}`,\n body: `{\n ${scalarValue(`lx${k}`, 'fx', 't')}\n ${scalarValue(`ly${k}`, 'fy', 't')}\n ${scalarValue(`lz${k}`, 'fz', 't')}\n if (convert${k}) {\n fx *= sc${k}x; fy *= sc${k}y; fz *= sc${k}z;\n ${rotateInPlace('fx', 'fy', 'fz', `q${k}x`, `q${k}y`, `q${k}z`, `q${k}w`)}\n }\n let px = Math.fround(pos[o3] + fx * delta);\n let py = Math.fround(pos[o3 + 1] + fy * delta);\n let pz = Math.fround(pos[o3 + 2] + fz * delta);\n ${scalarValue(`ox${k}`, 'rx', 't')}\n ${scalarValue(`oy${k}`, 'ry', 't')}\n ${scalarValue(`oz${k}`, 'rz', 't')}\n rx *= delta; ry *= delta; rz *= delta;\n if (rx !== 0 || ry !== 0 || rz !== 0) {\n if (world${k}) {\n px = Math.fround(px - pv${k}x); py = Math.fround(py - pv${k}y); pz = Math.fround(pz - pv${k}z);\n }\n if (rx !== 0) ${orbitInPlace('rx', `aX${k}x`, `aX${k}y`, `aX${k}z`)}\n if (ry !== 0) ${orbitInPlace('ry', `aY${k}x`, `aY${k}y`, `aY${k}z`)}\n if (rz !== 0) ${orbitInPlace('rz', `aZ${k}x`, `aZ${k}y`, `aZ${k}z`)}\n if (world${k}) {\n px = Math.fround(px + pv${k}x); py = Math.fround(py + pv${k}y); pz = Math.fround(pz + pv${k}z);\n }\n }\n pos[o3] = px; pos[o3 + 1] = py; pos[o3 + 2] = pz;}`,\n };\n case 'InheritVelocity':\n return {\n // The inherited velocity is the emitter's, the same for every\n // particle: converted into the system's space once per pass.\n setup: `const b${k} = behaviors[${k}];\n const ps${k} = b${k}.ps;\n const ev${k} = b${k}.mode === 'current' && ps${k} !== undefined ? ps${k}.emitterVelocity : undefined;\n const active${k} = ev${k} !== undefined;\n let ivx${k} = 0, ivy${k} = 0, ivz${k} = 0;\n if (active${k}) {\n ivx${k} = ev${k}.x; ivy${k} = ev${k}.y; ivz${k} = ev${k}.z;\n if (!ps${k}.worldSpace) {\n ${vectorSetup(`sc${k}`, `b${k}._tempScaleInv`)}\n ${quaternionSetup(`q${k}`, `b${k}._tempQInv`)}\n ivx${k} *= sc${k}x; ivy${k} *= sc${k}y; ivz${k} *= sc${k}z;\n ${rotateInPlace(`ivx${k}`, `ivy${k}`, `ivz${k}`, `q${k}x`, `q${k}y`, `q${k}z`, `q${k}w`)}\n }\n }\n ${scalarSetup(`gm${k}`, `b${k}.multiplier`)}`,\n body: `if (active${k}) {\n ${scalarValue(`gm${k}`, 'm', 't')}\n const f = m * delta;\n pos[o3] += ivx${k} * f; pos[o3 + 1] += ivy${k} * f; pos[o3 + 2] += ivz${k} * f;\n }`,\n };\n default:\n return null;\n }\n}\n/**\n * Compiled passes shared by every system whose behaviors line up the same way.\n *\n * The generated code depends only on the behavior types and their positions, so\n * a scene full of copies of one effect compiles once rather than once per\n * system. `null` records a shape that could not be compiled, so an environment\n * without code generation does not retry on every system.\n */\nconst passCache = new Map();\n/**\n * Compiles the fragments of a run into one pass, reusing an earlier compile of\n * the same shape. Returns undefined when the environment forbids code\n * generation.\n */\nfunction compile(fragments, indices, key) {\n const cached = passCache.get(key);\n if (cached !== undefined) {\n return cached ?? undefined;\n }\n const compiled = generate(fragments, indices);\n passCache.set(key, compiled ?? null);\n return compiled;\n}\nfunction generate(fragments, indices) {\n const source = `\n if (count === 0) return;\n if (store === undefined) {\n store = particles[0].store;\n if (store === undefined) {\n // Particles of some other implementation, without columns: run the behaviors as they are.\n for (const k of [${indices.join(', ')}]) {\n const b = behaviors[k];\n for (let i = 0; i < count; i++) {\n const p = particles[i];\n if (p.age < p.life) b.update(p, delta);\n }\n }\n return;\n }\n }\n const pos = store.position, vel = store.velocity;\n const size = store.size, startSize = store.startSize;\n const color = store.color, startColor = store.startColor;\n const scalars = store.scalars;\n const rot = store.rotation, angVel = store.angularVelocity;\n const uvTile = store.uvTile, startSpeed = store.startSpeed;\n const mem = store.memory, ms = store.memoryStride;\n ${fragments.map((f) => f.setup).join('\\n')}\n // The system keeps particles[i] on row i. Anything else (a hand-built\n // list) is caught by its ends and read through each particle's row.\n const mapped = particles[0].storeIndex !== 0 || particles[count - 1].storeIndex !== count - 1;\n for (let i = 0; i < count; i++) {\n const p = particles[i];\n const row = mapped ? p.storeIndex : i;\n const s = row * 3;\n const age = scalars[s], life = scalars[s + 1];\n if (age >= life) continue;\n const t = age / life;\n const o3 = row * 3, o4 = row * 4;\n ${fragments.map((f) => f.body).join('\\n')}\n }`;\n try {\n // eslint-disable-next-line @typescript-eslint/no-implied-eval\n const factory = new Function('deps', `const tmpColor = new deps.Vector4View(new Float32Array(4), 0);\n return function (behaviors, particles, count, delta, store) {${source}};`);\n return factory(DEPS);\n }\n catch (error) {\n // A page served under a Content-Security-Policy without 'unsafe-eval'\n // cannot build functions at runtime. Behaviors then keep their own\n // passes, which is only slower, never wrong.\n return undefined;\n }\n}\n/**\n * Splits `behaviors` into steps, merging consecutive recognised ones.\n *\n * Only consecutive behaviors are merged: a behavior that stays on its own must\n * still see the particles exactly where the original order left them. A lone\n * recognised behavior is compiled too: the gain is not only the merged loop\n * but the column access, which its own `updateAll` does not have.\n */\nfunction planBehaviorFusion(behaviors) {\n const steps = [];\n let runBehaviors = [];\n let runFragments = [];\n let runIndices = [];\n let runStart = 0;\n const flush = () => {\n if (runFragments.length === 0) {\n return;\n }\n const key = `${runStart}:${runBehaviors.map((b) => b.type).join(',')}`;\n const run = compile(runFragments, runIndices, key);\n if (run !== undefined) {\n steps.push({ behaviors: runBehaviors, run });\n }\n else {\n for (const behavior of runBehaviors) {\n steps.push({ behaviors: [behavior] });\n }\n }\n runBehaviors = [];\n runFragments = [];\n runIndices = [];\n };\n for (let i = 0; i < behaviors.length; i++) {\n const behavior = behaviors[i];\n const fragment = fragmentFor(behavior, i);\n if (fragment === null) {\n flush();\n steps.push({ behaviors: [behavior] });\n continue;\n }\n if (runFragments.length === 0) {\n runStart = i;\n }\n runBehaviors.push(behavior);\n runFragments.push(fragment);\n runIndices.push(i);\n }\n flush();\n return steps;\n}\n\n/**\n * Which part of the box particles start from.\n */\nvar BoxEmitFrom;\n(function (BoxEmitFrom) {\n /** Anywhere inside the box. */\n BoxEmitFrom[BoxEmitFrom[\"Volume\"] = 0] = \"Volume\";\n /** On the six faces. */\n BoxEmitFrom[BoxEmitFrom[\"Shell\"] = 1] = \"Shell\";\n /** On the twelve edges. */\n BoxEmitFrom[BoxEmitFrom[\"Edge\"] = 2] = \"Edge\";\n})(BoxEmitFrom || (BoxEmitFrom = {}));\n/**\n * A particle emitter that emits particles from a box centered on the emitter, all moving along +Z\n * like Unity's Box shape. A box with no depth is a flat rectangle (Unity's Rectangle shape).\n */\nclass BoxEmitter {\n constructor(parameters = {}) {\n this.type = 'box';\n this._point = [0, 0, 0];\n this.width = parameters.width ?? 1;\n this.height = parameters.height ?? 1;\n this.depth = parameters.depth ?? 1;\n this.emitFrom = parameters.emitFrom ?? BoxEmitFrom.Volume;\n this.boxThickness = parameters.boxThickness ? [...parameters.boxThickness] : [0, 0, 0];\n }\n update(_system, _delta) { }\n initialize(p, _emissionState) {\n const point = this._point;\n for (let axis = 0; axis < 3; axis++) {\n point[axis] = Math.random() * 2 - 1;\n }\n // Unity picks the face (or the edge direction) evenly per axis rather than by area.\n const axis = Math.floor(Math.random() * 3) % 3;\n if (this.emitFrom === BoxEmitFrom.Shell) {\n point[axis] = this.onSurface(axis);\n }\n else if (this.emitFrom === BoxEmitFrom.Edge) {\n point[(axis + 1) % 3] = this.onSurface((axis + 1) % 3);\n point[(axis + 2) % 3] = this.onSurface((axis + 2) % 3);\n }\n p.position.set((point[0] * this.width) / 2, (point[1] * this.height) / 2, (point[2] * this.depth) / 2);\n p.velocity.set(0, 0, p.startSpeed);\n }\n /**\n * A coordinate on one of the two faces across `axis`, in -1..1. As measured in Unity, a\n * thickness leaves half the particles on the face and sinks the rest evenly up to\n * 2 × thickness of the half-size into the box.\n */\n onSurface(axis) {\n const side = Math.random() < 0.5 ? -1 : 1;\n const thickness = this.boxThickness[axis];\n if (thickness <= 0 || Math.random() < 0.5) {\n return side;\n }\n return side * (1 - 2 * thickness * Math.random());\n }\n toJSON() {\n return {\n type: 'box',\n width: this.width,\n height: this.height,\n depth: this.depth,\n emitFrom: this.emitFrom,\n boxThickness: [...this.boxThickness],\n };\n }\n static fromJSON(json) {\n return new BoxEmitter({\n width: json.width,\n height: json.height,\n depth: json.depth,\n emitFrom: json.emitFrom,\n boxThickness: Array.isArray(json.boxThickness) ? json.boxThickness : undefined,\n });\n }\n clone() {\n return new BoxEmitter({\n width: this.width,\n height: this.height,\n depth: this.depth,\n emitFrom: this.emitFrom,\n boxThickness: this.boxThickness,\n });\n }\n}\n\n/**\n * Enum representing the emitter modes for particles.\n */\nvar EmitterMode;\n(function (EmitterMode) {\n /**\n * Emit particles randomly over the specified duration.\n */\n EmitterMode[EmitterMode[\"Random\"] = 0] = \"Random\";\n /**\n * Emit particles in a continuous loop.\n */\n EmitterMode[EmitterMode[\"Loop\"] = 1] = \"Loop\";\n /**\n * Emit particles back and forth in a ping-pong manner.\n */\n EmitterMode[EmitterMode[\"PingPong\"] = 2] = \"PingPong\";\n /**\n * Emit particles in bursts.\n */\n EmitterMode[EmitterMode[\"Burst\"] = 3] = \"Burst\";\n})(EmitterMode || (EmitterMode = {}));\nfunction getValueFromEmitterMode(mode, currentValue, spread, emissionState) {\n let u;\n if (EmitterMode.Random === mode) {\n currentValue = Math.random();\n }\n else if (EmitterMode.Burst === mode && emissionState.isBursting) {\n currentValue = emissionState.burstParticleIndex / emissionState.burstParticleCount;\n }\n if (spread > 0) {\n u = Math.floor(currentValue / spread) * spread;\n }\n else {\n u = currentValue;\n }\n switch (mode) {\n case EmitterMode.Loop:\n u = u % 1;\n break;\n case EmitterMode.PingPong:\n u = Math.abs((u % 2) - 1);\n break;\n }\n return u;\n}\n\n/**\n * Local transform of an emitter shape inside its particle system, like the\n * Position / Rotation / Scale of Unity's Shape module.\n *\n * A spawn point `p` lands at `position + rotation * (scale * p)`. The start\n * direction goes through the same scale and rotation and is then brought back\n * to its old length, so a squashed shape bends directions without changing the\n * start speed — which is what Unity does.\n */\nclass ShapeTransform {\n constructor(position, rotation, scale) {\n this.position = position ?? new Vector3();\n this.rotation = rotation ?? new Quaternion();\n this.scale = scale ?? new Vector3(1, 1, 1);\n }\n /** Moves a freshly initialized particle from shape space into system space. */\n apply(p) {\n p.position.multiply(this.scale).applyQuaternion(this.rotation).add(this.position);\n const velocity = p.velocity;\n const speed = velocity.length();\n if (speed === 0) {\n return;\n }\n velocity.multiply(this.scale).applyQuaternion(this.rotation);\n const length = velocity.length();\n if (length > 0) {\n velocity.multiplyScalar(speed / length);\n }\n }\n isIdentity() {\n const { position: t, rotation: r, scale: s } = this;\n return (t.x === 0 &&\n t.y === 0 &&\n t.z === 0 &&\n r.x === 0 &&\n r.y === 0 &&\n r.z === 0 &&\n r.w === 1 &&\n s.x === 1 &&\n s.y === 1 &&\n s.z === 1);\n }\n toJSON() {\n const json = {};\n const { position: t, rotation: r, scale: s } = this;\n if (t.x !== 0 || t.y !== 0 || t.z !== 0)\n json.position = [t.x, t.y, t.z];\n if (r.x !== 0 || r.y !== 0 || r.z !== 0 || r.w !== 1)\n json.rotation = [r.x, r.y, r.z, r.w];\n if (s.x !== 1 || s.y !== 1 || s.z !== 1)\n json.scale = [s.x, s.y, s.z];\n return json;\n }\n /** Returns undefined when there is no transform in the JSON. */\n static fromJSON(json) {\n if (!json) {\n return undefined;\n }\n const { position: t, rotation: r, scale: s } = json;\n return new ShapeTransform(t ? new Vector3(t[0], t[1], t[2]) : undefined, r ? new Quaternion(r[0], r[1], r[2], r[3]) : undefined, s ? new Vector3(s[0], s[1], s[2]) : undefined);\n }\n /**\n * The `transform` entry of a shape's JSON: empty when the shape has no\n * transform or an identity one, so shapes without one serialize as before.\n */\n static toShapeJSON(transform) {\n return transform && !transform.isIdentity() ? { transform: transform.toJSON() } : {};\n }\n clone() {\n return new ShapeTransform(this.position.clone(), this.rotation.clone(), this.scale.clone());\n }\n}\n\n/**\n * a particle emitter that emits particles from a circle.\n */\nclass CircleEmitter {\n constructor(parameters = {}) {\n this.type = 'circle';\n this.currentValue = 0;\n this.radius = parameters.radius ?? 10;\n this.arc = parameters.arc ?? 2.0 * Math.PI;\n this.thickness = parameters.thickness ?? 1;\n this.mode = parameters.mode ?? EmitterMode.Random;\n this.spread = parameters.spread ?? 0;\n this.speed = parameters.speed ?? new ConstantValue(1);\n this.memory = [];\n this.transform = parameters.transform;\n }\n update(system, delta) {\n this.currentValue += this.speed.genValue(this.memory, system.emissionState.time / system.duration) * delta;\n }\n initialize(p, emissionState) {\n const u = getValueFromEmitterMode(this.mode, this.currentValue, this.spread, emissionState);\n const r = MathUtils.lerp(1 - this.thickness, 1, Math.random());\n const theta = u * this.arc;\n p.position.x = Math.cos(theta);\n p.position.y = Math.sin(theta);\n p.position.z = 0;\n p.velocity.copy(p.position).multiplyScalar(p.startSpeed);\n //const v = Math.random();\n p.position.multiplyScalar(this.radius * r);\n this.transform?.apply(p);\n }\n toJSON() {\n return {\n type: 'circle',\n radius: this.radius,\n arc: this.arc,\n thickness: this.thickness,\n mode: this.mode,\n spread: this.spread,\n speed: this.speed.toJSON(),\n ...ShapeTransform.toShapeJSON(this.transform),\n };\n }\n static fromJSON(json) {\n return new CircleEmitter({\n radius: json.radius,\n arc: json.arc,\n thickness: json.thickness,\n mode: json.mode,\n speed: json.speed ? ValueGeneratorFromJSON(json.speed) : undefined,\n transform: ShapeTransform.fromJSON(json.transform),\n spread: json.spread,\n });\n }\n clone() {\n return new CircleEmitter({\n radius: this.radius,\n arc: this.arc,\n thickness: this.thickness,\n mode: this.mode,\n speed: this.speed.clone(),\n transform: this.transform?.clone(),\n spread: this.spread,\n });\n }\n}\n\nclass ConeEmitter {\n constructor(parameters = {}) {\n this.type = 'cone';\n this.currentValue = 0;\n this.radius = parameters.radius ?? 10;\n this.arc = parameters.arc ?? 2.0 * Math.PI;\n this.thickness = parameters.thickness ?? 1;\n this.angle = parameters.angle ?? Math.PI / 6;\n this.mode = parameters.mode ?? EmitterMode.Random;\n this.spread = parameters.spread ?? 0;\n this.speed = parameters.speed ?? new ConstantValue(1);\n this.memory = [];\n this.transform = parameters.transform;\n }\n update(system, delta) {\n if (EmitterMode.Random != this.mode) {\n this.currentValue += this.speed.genValue(this.memory, system.emissionState.time / system.duration) * delta;\n }\n }\n initialize(p, emissionState) {\n const u = getValueFromEmitterMode(this.mode, this.currentValue, this.spread, emissionState);\n const rand = MathUtils.lerp(1 - this.thickness, 1, Math.random());\n const theta = u * this.arc;\n const r = Math.sqrt(rand);\n const sinTheta = Math.sin(theta);\n const cosTheta = Math.cos(theta);\n p.position.x = r * cosTheta;\n p.position.y = r * sinTheta;\n p.position.z = 0;\n const angle = this.angle * r;\n p.velocity.set(0, 0, Math.cos(angle)).addScaledVector(p.position, Math.sin(angle)).multiplyScalar(p.startSpeed);\n //const v = Math.random();\n p.position.multiplyScalar(this.radius);\n this.transform?.apply(p);\n }\n toJSON() {\n return {\n type: 'cone',\n radius: this.radius,\n arc: this.arc,\n thickness: this.thickness,\n angle: this.angle,\n mode: this.mode,\n spread: this.spread,\n speed: this.speed.toJSON(),\n ...ShapeTransform.toShapeJSON(this.transform),\n };\n }\n static fromJSON(json) {\n return new ConeEmitter({\n radius: json.radius,\n arc: json.arc,\n thickness: json.thickness,\n angle: json.angle,\n mode: json.mode,\n speed: json.speed ? ValueGeneratorFromJSON(json.speed) : undefined,\n transform: ShapeTransform.fromJSON(json.transform),\n spread: json.spread,\n });\n }\n clone() {\n return new ConeEmitter({\n radius: this.radius,\n arc: this.arc,\n thickness: this.thickness,\n angle: this.angle,\n mode: this.mode,\n speed: this.speed.clone(),\n transform: this.transform?.clone(),\n spread: this.spread,\n });\n }\n}\n\nclass DonutEmitter {\n constructor(parameters = {}) {\n this.type = 'donut';\n this.currentValue = 0;\n this.radius = parameters.radius ?? 10;\n this.arc = parameters.arc ?? 2.0 * Math.PI;\n this.thickness = parameters.thickness ?? 1;\n this.donutRadius = parameters.donutRadius ?? this.radius * 0.2;\n this.mode = parameters.mode ?? EmitterMode.Random;\n this.spread = parameters.spread ?? 0;\n this.speed = parameters.speed ?? new ConstantValue(1);\n this.memory = [];\n this.transform = parameters.transform;\n this._m1 = new Matrix4();\n }\n update(system, delta) {\n if (EmitterMode.Random != this.mode) {\n this.currentValue += this.speed.genValue(this.memory, system.emissionState.time / system.duration) * delta;\n }\n }\n initialize(p, emissionState) {\n const u = getValueFromEmitterMode(this.mode, this.currentValue, this.spread, emissionState);\n const v = Math.random();\n const rand = MathUtils.lerp(1 - this.thickness, 1, Math.random());\n const theta = u * this.arc;\n const phi = v * Math.PI * 2;\n //const r = Math.sqrt(rand);\n const sinTheta = Math.sin(theta);\n const cosTheta = Math.cos(theta);\n p.position.x = this.radius * cosTheta;\n p.position.y = this.radius * sinTheta;\n p.position.z = 0;\n p.velocity.z = this.donutRadius * rand * Math.sin(phi);\n p.velocity.x = this.donutRadius * rand * Math.cos(phi) * cosTheta;\n p.velocity.y = this.donutRadius * rand * Math.cos(phi) * sinTheta;\n p.position.add(p.velocity);\n p.velocity.normalize().multiplyScalar(p.startSpeed);\n //const angle = this.angle * r;\n //p.velocity.set(0, 0, Math.cos(angle)).addScaledVector(p.position, Math.sin(angle)).multiplyScalar(p.startSpeed);\n //const v = Math.random();\n //.multiplyScalar(this.radius);\n // Default facing-velocity orientation, but defer to startRotation if set.\n if (p.rotation instanceof Quaternion) {\n const r = p.rotation;\n if (r.x === 0 && r.y === 0 && r.z === 0 && r.w === 1) {\n this._m1.lookAt(ZERO_VEC3, p.velocity, UP_VEC3);\n p.rotation.setFromRotationMatrix(this._m1);\n }\n }\n this.transform?.apply(p);\n }\n toJSON() {\n return {\n type: 'donut',\n radius: this.radius,\n arc: this.arc,\n thickness: this.thickness,\n donutRadius: this.donutRadius,\n mode: this.mode,\n spread: this.spread,\n speed: this.speed.toJSON(),\n ...ShapeTransform.toShapeJSON(this.transform),\n };\n }\n static fromJSON(json) {\n return new DonutEmitter({\n radius: json.radius,\n arc: json.arc,\n thickness: json.thickness,\n donutRadius: json.donutRadius,\n mode: json.mode,\n speed: json.speed ? ValueGeneratorFromJSON(json.speed) : undefined,\n transform: ShapeTransform.fromJSON(json.transform),\n spread: json.spread,\n });\n }\n clone() {\n return new DonutEmitter({\n radius: this.radius,\n arc: this.arc,\n thickness: this.thickness,\n donutRadius: this.donutRadius,\n mode: this.mode,\n speed: this.speed.clone(),\n transform: this.transform?.clone(),\n spread: this.spread,\n });\n }\n}\n\n/**\n * A particle emitter that emits particles from a line along X, all moving along +Y like Unity's\n * single-sided Edge shape.\n */\nclass EdgeEmitter {\n constructor(parameters = {}) {\n this.type = 'edge';\n this.currentValue = 0;\n this.radius = parameters.radius ?? 1;\n this.mode = parameters.mode ?? EmitterMode.Random;\n this.spread = parameters.spread ?? 0;\n this.speed = parameters.speed ?? new ConstantValue(1);\n this.memory = [];\n }\n update(system, delta) {\n if (EmitterMode.Random != this.mode) {\n this.currentValue += this.speed.genValue(this.memory, system.emissionState.time / system.duration) * delta;\n }\n }\n initialize(p, emissionState) {\n const u = getValueFromEmitterMode(this.mode, this.currentValue, this.spread, emissionState);\n p.position.set((u * 2 - 1) * this.radius, 0, 0);\n p.velocity.set(0, p.startSpeed, 0);\n }\n toJSON() {\n return {\n type: 'edge',\n radius: this.radius,\n mode: this.mode,\n spread: this.spread,\n speed: this.speed.toJSON(),\n };\n }\n static fromJSON(json) {\n return new EdgeEmitter({\n radius: json.radius,\n mode: json.mode,\n speed: json.speed ? ValueGeneratorFromJSON(json.speed) : undefined,\n spread: json.spread,\n });\n }\n clone() {\n return new EdgeEmitter({\n radius: this.radius,\n mode: this.mode,\n speed: this.speed.clone(),\n spread: this.spread,\n });\n }\n}\n\nclass GridEmitter {\n constructor(parameters = {}) {\n this.type = 'grid';\n this.width = parameters.width ?? 1;\n this.height = parameters.height ?? 1;\n this.column = parameters.column ?? 10;\n this.row = parameters.row ?? 10;\n this.transform = parameters.transform;\n }\n initialize(p) {\n const r = Math.floor(Math.random() * this.row);\n const c = Math.floor(Math.random() * this.column);\n p.position.x = (c * this.width) / this.column - this.width / 2;\n p.position.y = (r * this.height) / this.row - this.height / 2;\n p.position.z = 0;\n p.velocity.set(0, 0, p.startSpeed);\n this.transform?.apply(p);\n }\n toJSON() {\n return {\n type: 'grid',\n width: this.width,\n height: this.height,\n column: this.column,\n row: this.row,\n ...ShapeTransform.toShapeJSON(this.transform),\n };\n }\n static fromJSON(json) {\n return new GridEmitter({ ...json, transform: ShapeTransform.fromJSON(json.transform) });\n }\n clone() {\n return new GridEmitter({\n width: this.width,\n height: this.height,\n column: this.column,\n row: this.row,\n transform: this.transform?.clone(),\n });\n }\n update(system, delta) { }\n}\n\nclass HemisphereEmitter {\n constructor(parameters = {}) {\n this.type = 'hemisphere';\n this.currentValue = 0;\n this.radius = parameters.radius ?? 10;\n this.arc = parameters.arc ?? 2.0 * Math.PI;\n this.thickness = parameters.thickness ?? 1;\n this.mode = parameters.mode ?? EmitterMode.Random;\n this.spread = parameters.spread ?? 0;\n this.speed = parameters.speed ?? new ConstantValue(1);\n this.memory = [];\n this.transform = parameters.transform;\n this._m1 = new Matrix4();\n }\n update(system, delta) {\n if (EmitterMode.Random != this.mode) {\n this.currentValue += this.speed.genValue(this.memory, system.emissionState.time / system.duration) * delta;\n }\n }\n initialize(p, emissionState) {\n const u = getValueFromEmitterMode(this.mode, this.currentValue, this.spread, emissionState);\n const v = Math.random();\n const rand = MathUtils.lerp(1 - this.thickness, 1, Math.random());\n const theta = u * this.arc;\n const phi = Math.acos(v);\n //const r = Math.cbrt(rand);\n const sinTheta = Math.sin(theta);\n const cosTheta = Math.cos(theta);\n const sinPhi = Math.sin(phi);\n const cosPhi = Math.cos(phi);\n p.position.x = sinPhi * cosTheta;\n p.position.y = sinPhi * sinTheta;\n p.position.z = cosPhi;\n p.velocity.copy(p.position).multiplyScalar(p.startSpeed);\n p.position.multiplyScalar(this.radius * rand);\n // Default facing-outward orientation, but defer to startRotation if set.\n if (p.rotation instanceof Quaternion) {\n const r = p.rotation;\n if (r.x === 0 && r.y === 0 && r.z === 0 && r.w === 1) {\n this._m1.lookAt(ZERO_VEC3, p.position, UP_VEC3);\n p.rotation.setFromRotationMatrix(this._m1);\n }\n }\n this.transform?.apply(p);\n }\n toJSON() {\n return {\n type: 'hemisphere',\n radius: this.radius,\n arc: this.arc,\n thickness: this.thickness,\n mode: this.mode,\n spread: this.spread,\n speed: this.speed.toJSON(),\n ...ShapeTransform.toShapeJSON(this.transform),\n };\n }\n static fromJSON(json) {\n return new HemisphereEmitter({\n radius: json.radius,\n arc: json.arc,\n thickness: json.thickness,\n mode: json.mode,\n speed: json.speed ? ValueGeneratorFromJSON(json.speed) : undefined,\n transform: ShapeTransform.fromJSON(json.transform),\n spread: json.spread,\n });\n }\n clone() {\n return new HemisphereEmitter({\n radius: this.radius,\n arc: this.arc,\n thickness: this.thickness,\n mode: this.mode,\n speed: this.speed.clone(),\n transform: this.transform?.clone(),\n spread: this.spread,\n });\n }\n}\n\n/**\n * A point emitter emits particles from a single point.\n */\nclass PointEmitter {\n constructor(transform) {\n this.type = 'point';\n this._m1 = new Matrix4();\n this.transform = transform;\n }\n update(system, delta) { }\n initialize(p) {\n const u = Math.random();\n const v = Math.random();\n const theta = u * Math.PI * 2;\n const phi = Math.acos(2.0 * v - 1.0);\n const r = Math.cbrt(Math.random());\n const sinTheta = Math.sin(theta);\n const cosTheta = Math.cos(theta);\n const sinPhi = Math.sin(phi);\n const cosPhi = Math.cos(phi);\n p.velocity.x = r * sinPhi * cosTheta;\n p.velocity.y = r * sinPhi * sinTheta;\n p.velocity.z = r * cosPhi;\n p.velocity.multiplyScalar(p.startSpeed);\n p.position.setScalar(0);\n // Only set a default facing-along-velocity orientation if the user's\n // startRotation didn't already write a non-identity rotation.\n // (lookAt(ZERO, p.position, UP) would be degenerate here since\n // p.position is zero — use velocity instead.)\n if (p.rotation instanceof Quaternion) {\n const r = p.rotation;\n if (r.x === 0 && r.y === 0 && r.z === 0 && r.w === 1) {\n this._m1.lookAt(ZERO_VEC3, p.velocity, UP_VEC3);\n p.rotation.setFromRotationMatrix(this._m1);\n }\n }\n this.transform?.apply(p);\n }\n toJSON() {\n return {\n type: 'point',\n ...ShapeTransform.toShapeJSON(this.transform),\n };\n }\n static fromJSON(json) {\n return new PointEmitter(ShapeTransform.fromJSON(json?.transform));\n }\n clone() {\n return new PointEmitter(this.transform?.clone());\n }\n}\n\nclass SphereEmitter {\n constructor(parameters = {}) {\n this.type = 'sphere';\n this.currentValue = 0;\n this.radius = parameters.radius ?? 10;\n this.arc = parameters.arc ?? 2.0 * Math.PI;\n this.thickness = parameters.thickness ?? 1;\n this.mode = parameters.mode ?? EmitterMode.Random;\n this.spread = parameters.spread ?? 0;\n this.speed = parameters.speed ?? new ConstantValue(1);\n this.memory = [];\n this.transform = parameters.transform;\n this._m1 = new Matrix4();\n }\n update(system, delta) {\n if (EmitterMode.Random != this.mode) {\n this.currentValue += this.speed.genValue(this.memory, system.emissionState.time / system.duration) * delta;\n }\n }\n initialize(p, emissionState) {\n const u = getValueFromEmitterMode(this.mode, this.currentValue, this.spread, emissionState);\n const v = Math.random();\n const rand = MathUtils.lerp(1 - this.thickness, 1, Math.random());\n const theta = u * this.arc;\n const phi = Math.acos(2.0 * v - 1.0);\n const sinTheta = Math.sin(theta);\n const cosTheta = Math.cos(theta);\n const sinPhi = Math.sin(phi);\n const cosPhi = Math.cos(phi);\n p.position.x = sinPhi * cosTheta;\n p.position.y = sinPhi * sinTheta;\n p.position.z = cosPhi;\n p.velocity.copy(p.position).multiplyScalar(p.startSpeed);\n p.position.multiplyScalar(this.radius * rand);\n // Default facing-outward orientation, but defer to startRotation if set.\n if (p.rotation instanceof Quaternion) {\n const r = p.rotation;\n if (r.x === 0 && r.y === 0 && r.z === 0 && r.w === 1) {\n this._m1.lookAt(ZERO_VEC3, p.position, UP_VEC3);\n p.rotation.setFromRotationMatrix(this._m1);\n }\n }\n this.transform?.apply(p);\n }\n toJSON() {\n return {\n type: 'sphere',\n radius: this.radius,\n arc: this.arc,\n thickness: this.thickness,\n mode: this.mode,\n spread: this.spread,\n speed: this.speed.toJSON(),\n ...ShapeTransform.toShapeJSON(this.transform),\n };\n }\n static fromJSON(json) {\n return new SphereEmitter({\n radius: json.radius,\n arc: json.arc,\n thickness: json.thickness,\n mode: json.mode,\n speed: json.speed ? ValueGeneratorFromJSON(json.speed) : undefined,\n transform: ShapeTransform.fromJSON(json.transform),\n spread: json.spread,\n });\n }\n clone() {\n return new SphereEmitter({\n radius: this.radius,\n arc: this.arc,\n thickness: this.thickness,\n mode: this.mode,\n speed: this.speed.clone(),\n transform: this.transform?.clone(),\n spread: this.spread,\n });\n }\n}\n\n/**\n * a particle emitter that emits particles from a rectangle.\n */\nclass RectangleEmitter {\n constructor(parameters = {}) {\n this.type = 'rectangle';\n this.currentValue = 0;\n this.width = parameters.width ?? 10;\n this.height = parameters.height ?? 10;\n this.thickness = parameters.thickness ?? 1;\n this.mode = parameters.mode ?? EmitterMode.Random;\n this.spread = parameters.spread ?? 0;\n this.speed = parameters.speed ?? new ConstantValue(1);\n this.memory = [];\n this.transform = parameters.transform;\n this._m1 = new Matrix4();\n }\n update(system, delta) {\n this.currentValue += this.speed.genValue(this.memory, system.emissionState.time / system.duration) * delta;\n }\n initialize(p, emissionState) {\n const u = getValueFromEmitterMode(this.mode, this.currentValue, this.spread, emissionState);\n // Calculate perimeter points\n const totalPerimeter = 2 * (this.width + this.height);\n const point = u * totalPerimeter;\n // Map perimeter position to x,y coordinates\n let x, y;\n if (point < this.width) {\n // Bottom edge\n x = point - this.width / 2;\n y = -this.height / 2;\n }\n else if (point < this.width + this.height) {\n // Right edge\n x = this.width / 2;\n y = point - this.width - this.height / 2;\n }\n else if (point < 2 * this.width + this.height) {\n // Top edge\n x = this.width / 2 - (point - this.width - this.height);\n y = this.height / 2;\n }\n else {\n // Left edge\n x = -this.width / 2;\n y = this.height / 2 - (point - 2 * this.width - this.height);\n }\n // Apply thickness - lerp from edge point toward center\n const rand = Math.random();\n const thicknessScale = 1 - this.thickness * rand;\n p.position.x = x * thicknessScale;\n p.position.y = y * thicknessScale;\n p.position.z = 0;\n // Set velocity outward from center\n p.velocity.x = x;\n p.velocity.y = y;\n p.velocity.z = 0;\n p.velocity.normalize().multiplyScalar(p.startSpeed);\n // Default facing-velocity orientation, but defer to startRotation if set.\n if (p.rotation instanceof Quaternion) {\n const r = p.rotation;\n if (r.x === 0 && r.y === 0 && r.z === 0 && r.w === 1) {\n this._m1.lookAt(ZERO_VEC3, p.velocity, UP_VEC3);\n p.rotation.setFromRotationMatrix(this._m1);\n }\n }\n this.transform?.apply(p);\n }\n toJSON() {\n return {\n type: 'rectangle',\n width: this.width,\n height: this.height,\n thickness: this.thickness,\n mode: this.mode,\n spread: this.spread,\n speed: this.speed.toJSON(),\n ...ShapeTransform.toShapeJSON(this.transform),\n };\n }\n static fromJSON(json) {\n return new RectangleEmitter({\n width: json.width,\n height: json.height,\n thickness: json.thickness,\n mode: json.mode,\n speed: json.speed ? ValueGeneratorFromJSON(json.speed) : undefined,\n transform: ShapeTransform.fromJSON(json.transform),\n spread: json.spread,\n });\n }\n clone() {\n return new RectangleEmitter({\n width: this.width,\n height: this.height,\n thickness: this.thickness,\n mode: this.mode,\n speed: this.speed.clone(),\n transform: this.transform?.clone(),\n spread: this.spread,\n });\n }\n}\n\nconst EmitterShapes = {\n box: {\n type: 'box',\n params: [\n ['width', ['number']],\n ['height', ['number']],\n ['depth', ['number']],\n ['emitFrom', ['number']],\n ['boxThickness', ['vec3']],\n ],\n constructor: BoxEmitter,\n loadJSON: BoxEmitter.fromJSON,\n },\n circle: {\n type: 'circle',\n params: [\n ['radius', ['number']],\n ['arc', ['radian']],\n ['thickness', ['number']],\n ['mode', ['emitterMode']],\n ['spread', ['number']],\n ['speed', ['valueFunc', 'value']],\n ],\n constructor: CircleEmitter,\n loadJSON: CircleEmitter.fromJSON,\n },\n cone: {\n type: 'cone',\n params: [\n ['radius', ['number']],\n ['arc', ['radian']],\n ['thickness', ['number']],\n ['angle', ['radian']],\n ['mode', ['emitterMode']],\n ['spread', ['number']],\n ['speed', ['valueFunc', 'value']],\n ],\n constructor: ConeEmitter,\n loadJSON: ConeEmitter.fromJSON,\n },\n donut: {\n type: 'donut',\n params: [\n ['radius', ['number']],\n ['arc', ['radian']],\n ['thickness', ['number']],\n ['donutRadius', ['number']],\n ['mode', ['emitterMode']],\n ['spread', ['number']],\n ['speed', ['valueFunc', 'value']],\n ],\n constructor: DonutEmitter,\n loadJSON: DonutEmitter.fromJSON,\n },\n edge: {\n type: 'edge',\n params: [\n ['radius', ['number']],\n ['mode', ['emitterMode']],\n ['spread', ['number']],\n ['speed', ['valueFunc', 'value']],\n ],\n constructor: EdgeEmitter,\n loadJSON: EdgeEmitter.fromJSON,\n },\n point: { type: 'point', params: [], constructor: PointEmitter, loadJSON: PointEmitter.fromJSON },\n sphere: {\n type: 'sphere',\n params: [\n ['radius', ['number']],\n ['arc', ['radian']],\n ['thickness', ['number']],\n ['angle', ['radian']],\n ['mode', ['emitterMode']],\n ['spread', ['number']],\n ['speed', ['valueFunc', 'value']],\n ],\n constructor: SphereEmitter,\n loadJSON: SphereEmitter.fromJSON,\n },\n hemisphere: {\n type: 'hemisphere',\n params: [\n ['radius', ['number']],\n ['arc', ['radian']],\n ['thickness', ['number']],\n ['angle', ['radian']],\n ['mode', ['emitterMode']],\n ['spread', ['number']],\n ['speed', ['valueFunc', 'value']],\n ],\n constructor: HemisphereEmitter,\n loadJSON: HemisphereEmitter.fromJSON,\n },\n grid: {\n type: 'grid',\n params: [\n ['width', ['number']],\n ['height', ['number']],\n ['rows', ['number']],\n ['column', ['number']],\n ],\n constructor: GridEmitter,\n loadJSON: GridEmitter.fromJSON,\n },\n rectangle: {\n type: 'rectangle',\n params: [\n ['width', ['number']],\n ['height', ['number']],\n ['thickness', ['number']],\n ['mode', ['emitterMode']],\n ['spread', ['number']],\n ['speed', ['valueFunc', 'value']],\n ],\n constructor: RectangleEmitter,\n loadJSON: RectangleEmitter.fromJSON,\n },\n};\nfunction EmitterFromJSON(json, meta) {\n return EmitterShapes[json.type].loadJSON(json, meta);\n}\n\nconst Plugins = [];\nfunction loadPlugin(plugin) {\n const existing = Plugins.find((item) => item.id === plugin.id);\n if (!existing) {\n plugin.initialize();\n for (const emitterShape of plugin.emitterShapes) {\n if (!EmitterShapes[emitterShape.type]) {\n EmitterShapes[emitterShape.type] = emitterShape;\n }\n }\n for (const behavior of plugin.behaviors) {\n if (!BehaviorTypes[behavior.type]) {\n BehaviorTypes[behavior.type] = behavior;\n }\n }\n }\n}\nfunction unloadPlugin(pluginId) {\n const plugin = Plugins.find((item) => item.id === pluginId);\n if (plugin) {\n for (const emitterShape of plugin.emitterShapes) {\n if (EmitterShapes[emitterShape.type]) {\n delete EmitterShapes[emitterShape.type];\n }\n }\n for (const behavior of plugin.behaviors) {\n if (BehaviorTypes[behavior.type]) {\n delete BehaviorTypes[behavior.type];\n }\n }\n }\n}\n\nexport { ApplyCollision, ApplyForce, ApplySequences, AxisAngleGenerator, BehaviorFromJSON, BehaviorTypes, Bezier, BoxEmitFrom, BoxEmitter, ChangeEmitDirection, CircleEmitter, ColorBySpeed, ColorGeneratorFromJSON, ColorOverLife, ColorRange, ConeEmitter, ConstantColor, ConstantValue, DEG2RAD, DonutEmitter, EdgeEmitter, EmitSubParticleSystem, EmitterFromJSON, EmitterMode, EmitterShapes, Euler, EulerGenerator, ForceOverLife, FrameOverLife, GeneratorFromJSON, Gradient, GravityForce, GridEmitter, HemisphereEmitter, InheritVelocity, IntervalValue, LimitSpeedOverLife, MathUtils, Matrix3, Matrix4, NodeParticle, Noise, OrbitOverLife, ParticleStore, PiecewiseBezier, PiecewiseFunction, Plugins, PointEmitter, Quaternion, QuaternionView, RAD2DEG, RandomColor, RandomColorBetweenGradient, RandomQuatGenerator, RecordState, RectangleEmitter, Rotation3DOverLife, RotationBySpeed, RotationGeneratorFromJSON, RotationOverLife, SequencerFromJSON, ShapeTransform, SizeBySpeed, SizeOverLife, SpeedOverLife, SphereEmitter, SpriteParticle, SubParticleEmitMode, TextureSequencer, TrailParticle, TurbulenceField, ValueGeneratorFromJSON, Vector2, Vector3, Vector3Function, Vector3GeneratorFromJSON, Vector3View, Vector4, Vector4View, VelocityOverLife, WebGLCoordinateSystem, WebGPUCoordinateSystem, WidthOverLength, ceilPowerOfTwo, clamp, damp, degToRad, denormalize, euclideanModulo, floorPowerOfTwo, generateUUID, getPhysicsResolver, getValueFromEmitterMode, inverseLerp, isPowerOfTwo, lerp, loadPlugin, mapLinear, normalize, pingpong, planBehaviorFusion, radToDeg, randFloat, randFloatSpread, randInt, seededRandom, setPhysicsResolver, setQuaternionFromProperEuler, smootherstep, smoothstep, unloadPlugin };\n","import {VertexBuffer} from '@babylonjs/core/Buffers/buffer';\nimport {Mesh} from '@babylonjs/core/Meshes/mesh';\nimport {EmitterShape, IParticleSystem, Particle, Plugin, ShapeJSON, ShapeTransform, Vector3} from 'quarks.core';\n\nexport class MeshSurfaceEmitter implements EmitterShape {\n type = 'mesh_surface';\n\n private _triangleIndexToArea: number[] = [];\n private _mesh?: Mesh;\n private _positions?: Float32Array;\n private _indices?: Uint32Array | Int32Array;\n private _meshReferenceId?: string;\n /** Offset, rotation and scale of the mesh within the particle system. */\n transform?: ShapeTransform;\n\n get mesh() {\n return this._mesh;\n }\n\n set mesh(mesh: Mesh | undefined) {\n this._mesh = mesh;\n if (!mesh) return;\n\n const positions = mesh.getVerticesData(VertexBuffer.PositionKind);\n const indices = mesh.getIndices();\n if (!positions || !indices) return;\n\n this._positions = new Float32Array(positions);\n this._indices = new Int32Array(indices);\n\n this._triangleIndexToArea.length = 0;\n let area = 0;\n const triCount = indices.length / 3;\n this._triangleIndexToArea.push(0);\n\n const a = new Vector3();\n const b = new Vector3();\n const c = new Vector3();\n\n for (let i = 0; i < triCount; i++) {\n const i0 = indices[i * 3];\n const i1 = indices[i * 3 + 1];\n const i2 = indices[i * 3 + 2];\n\n a.set(positions[i0 * 3], positions[i0 * 3 + 1], positions[i0 * 3 + 2]);\n b.set(positions[i1 * 3], positions[i1 * 3 + 1], positions[i1 * 3 + 2]);\n c.set(positions[i2 * 3], positions[i2 * 3 + 1], positions[i2 * 3 + 2]);\n\n b.sub(a);\n c.sub(a);\n const cross = new Vector3();\n cross.crossVectors(b, c);\n area += cross.length() * 0.5;\n this._triangleIndexToArea.push(area);\n }\n }\n\n constructor(mesh?: Mesh, meshReferenceId?: string, transform?: ShapeTransform) {\n this._meshReferenceId = meshReferenceId;\n this.transform = transform;\n if (mesh) this.mesh = mesh;\n }\n\n initialize(p: Particle) {\n if (!this._positions || !this._indices) {\n p.position.set(0, 0, 0);\n p.velocity.set(0, 0, 1).multiplyScalar(p.startSpeed);\n this.transform?.apply(p);\n return;\n }\n\n const triCount = this._triangleIndexToArea.length - 1;\n let left = 0,\n right = triCount;\n const target = Math.random() * this._triangleIndexToArea[triCount];\n\n while (left + 1 < right) {\n const mid = Math.floor((left + right) / 2);\n if (target < this._triangleIndexToArea[mid]) {\n right = mid;\n } else {\n left = mid;\n }\n }\n\n let u1 = Math.random();\n let u2 = Math.random();\n if (u1 + u2 > 1) {\n u1 = 1 - u1;\n u2 = 1 - u2;\n }\n\n const idx0 = this._indices[left * 3];\n const idx1 = this._indices[left * 3 + 1];\n const idx2 = this._indices[left * 3 + 2];\n\n const ax = this._positions[idx0 * 3],\n ay = this._positions[idx0 * 3 + 1],\n az = this._positions[idx0 * 3 + 2];\n const bx = this._positions[idx1 * 3] - ax,\n by = this._positions[idx1 * 3 + 1] - ay,\n bz = this._positions[idx1 * 3 + 2] - az;\n const cx = this._positions[idx2 * 3] - ax,\n cy = this._positions[idx2 * 3 + 1] - ay,\n cz = this._positions[idx2 * 3 + 2] - az;\n\n p.position.set(ax + bx * u1 + cx * u2, ay + by * u1 + cy * u2, az + bz * u1 + cz * u2);\n\n const nx = by * cz - bz * cy;\n const ny = bz * cx - bx * cz;\n const nz = bx * cy - by * cx;\n const len = Math.sqrt(nx * nx + ny * ny + nz * nz) || 1;\n p.velocity.set(nx / len, ny / len, nz / len).multiplyScalar(p.startSpeed);\n this.transform?.apply(p);\n }\n\n toJSON(): ShapeJSON {\n return {\n type: 'mesh_surface',\n mesh: this._mesh ? (this._mesh as any).uniqueId?.toString() : (this._meshReferenceId ?? ''),\n ...ShapeTransform.toShapeJSON(this.transform),\n };\n }\n\n static fromJSON(json: any): MeshSurfaceEmitter {\n return new MeshSurfaceEmitter(undefined, json?.mesh, ShapeTransform.fromJSON(json?.transform));\n }\n\n clone(): EmitterShape {\n return new MeshSurfaceEmitter(this._mesh, this._meshReferenceId, this.transform?.clone());\n }\n\n update(_system: IParticleSystem, _delta: number): void {}\n}\n\nexport const MeshSurfaceEmitterPlugin: Plugin = {\n id: 'babylon.quarks',\n initialize: () => {},\n emitterShapes: [\n {\n type: 'mesh_surface',\n params: [['mesh', ['mesh']]],\n constructor: MeshSurfaceEmitter,\n loadJSON: (json: any) => MeshSurfaceEmitter.fromJSON(json),\n },\n ],\n behaviors: [],\n};\n","import softFragment from './soft_fragment.glsl';\nimport softParsFragment from './soft_pars_fragment.glsl';\nimport softParsVertex from './soft_pars_vertex.glsl';\nimport softVertex from './soft_vertex.glsl';\nimport tileFragment from './tile_fragment.glsl';\nimport tileParsFragment from './tile_pars_fragment.glsl';\nimport tileParsVertex from './tile_pars_vertex.glsl';\nimport tileVertex from './tile_vertex.glsl';\n\nconst shaderChunks: Record<string, string> = {};\nlet registered = false;\n\nexport function registerShaderChunks(): void {\n if (registered) return;\n shaderChunks.tile_pars_vertex = tileParsVertex;\n shaderChunks.tile_vertex = tileVertex;\n shaderChunks.tile_pars_fragment = tileParsFragment;\n shaderChunks.tile_fragment = tileFragment;\n shaderChunks.soft_pars_vertex = softParsVertex;\n shaderChunks.soft_vertex = softVertex;\n shaderChunks.soft_pars_fragment = softParsFragment;\n shaderChunks.soft_fragment = softFragment;\n registered = true;\n}\n\nexport function getShaderChunk(chunkName: string): string | undefined {\n return shaderChunks[chunkName];\n}\n\nexport function getRegisteredShaderChunks(): Readonly<Record<string, string>> {\n return shaderChunks;\n}\n","export default /* glsl */ `\n#ifdef UV_TILE\n attribute float uvTile;\n uniform vec2 tileCount;\n\n mat3 makeTileTransform(float tileIndex) {\n float col = mod(tileIndex, tileCount.x);\n float row = (tileCount.y - floor(tileIndex / tileCount.x) - 1.0);\n return mat3(\n 1.0 / tileCount.x, 0.0, 0.0,\n 0.0, 1.0 / tileCount.y, 0.0,\n col / tileCount.x, row / tileCount.y, 1.0\n );\n }\n#else\n mat3 makeTileTransform(float tileIndex) {\n return mat3(1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0);\n }\n#endif\n\n#if defined(USE_UV)\n varying vec2 vUv;\n #ifdef TILE_BLEND\n varying vec2 vUvNext;\n varying float vUvBlend;\n #endif\n#endif\n`;\n","export default /* glsl */ `\n#ifdef UV_TILE\n mat3 tileTransform = makeTileTransform(floor(uvTile));\n #ifdef TILE_BLEND\n mat3 nextTileTransform = makeTileTransform(ceil(uvTile));\n vUvBlend = fract(uvTile);\n #endif\n#else\n mat3 tileTransform = makeTileTransform(0.0);\n#endif\n\n#if defined(USE_UV)\n vUv = (tileTransform * vec3(uv, 1.0)).xy;\n #if defined(TILE_BLEND) && defined(UV_TILE)\n vUvNext = (nextTileTransform * vec3(uv, 1.0)).xy;\n #endif\n#endif\n`;\n","export default /* glsl */ `\n#if defined(USE_UV)\n varying vec2 vUv;\n #ifdef TILE_BLEND\n varying vec2 vUvNext;\n varying float vUvBlend;\n #endif\n#endif\n`;\n","export default /* glsl */ `\n#ifdef USE_MAP\n vec4 texelColor = texture2D(map, vUv);\n #ifdef TILE_BLEND\n texelColor = mix(texelColor, texture2D(map, vUvNext), vUvBlend);\n #endif\n diffuseColor *= texelColor;\n#endif\n`;\n","export default /* glsl */ `\n#ifdef SOFT_PARTICLES\n varying vec4 projPosition;\n varying float linearDepth;\n#endif\n`;\n","export default /* glsl */ `\n#ifdef SOFT_PARTICLES\n projPosition = gl_Position;\n linearDepth = -mvPosition.z;\n#endif\n`;\n","export default /* glsl */ `\n#ifdef SOFT_PARTICLES\n uniform sampler2D depthTexture;\n uniform vec4 projParams;\n uniform vec2 softParams;\n\n varying vec4 projPosition;\n varying float linearDepth;\n\n #define SOFT_NEAR_FADE softParams.x\n #define SOFT_INV_FADE_DISTANCE softParams.y\n\n #define zNear projParams.x\n #define zFar projParams.y\n\n float linearize_depth(float d) {\n return (zFar * zNear) / (zFar - d * (zFar - zNear));\n }\n#endif\n`;\n","export default /* glsl */ `\n#ifdef SOFT_PARTICLES\n\n vec2 p2 = projPosition.xy / projPosition.w;\n p2 = 0.5 * p2 + 0.5;\n\n float readDepth = texture2D(depthTexture, p2.xy).r;\n float viewDepth = linearize_depth(readDepth);\n float softParticlesFade = saturate(SOFT_INV_FADE_DISTANCE * ((viewDepth - SOFT_NEAR_FADE) - linearDepth));\n\n gl_FragColor *= softParticlesFade;\n#endif\n`;\n","export default /* glsl */ `\nattribute vec3 position;\nattribute vec2 uv;\nattribute vec3 normal;\nattribute vec3 offset;\nattribute vec4 color;\nattribute vec3 size;\nattribute vec4 rotation;\nattribute float uvTile;\n\nuniform mat4 world;\nuniform mat4 view;\nuniform mat4 projection;\n\n#ifdef UV_TILE\nuniform float tileCountX;\nuniform float tileCountY;\n#endif\n\nvarying vec2 vUV;\nvarying vec4 vColor;\nvarying vec3 vNormal;\nvarying vec3 vWorldPos;\n\n#ifdef TILE_BLEND\nvarying vec2 vUV2;\nvarying float vTileBlend;\n#endif\n\n#ifdef SOFT_PARTICLES\nvarying vec4 projPosition;\nvarying float linearDepth;\n#endif\n\nvec3 applyQuaternion(vec3 v, vec4 q) {\n vec3 qVec = q.xyz;\n float qW = q.w;\n vec3 t = 2.0 * cross(qVec, v);\n return v + qW * t + cross(qVec, t);\n}\n\nvoid main() {\n vec3 scaledPosition = position * size;\n vec3 rotatedPosition = applyQuaternion(scaledPosition, rotation);\n vec3 rotatedNormal = normalize(applyQuaternion(normal, rotation));\n vec3 localPos = rotatedPosition + offset;\n\n vec4 worldPos = world * vec4(localPos, 1.0);\n vec4 viewPos = view * worldPos;\n gl_Position = projection * viewPos;\n\n vWorldPos = worldPos.xyz;\n vNormal = normalize((world * vec4(rotatedNormal, 0.0)).xyz);\n\n#ifdef SOFT_PARTICLES\n projPosition = gl_Position;\n linearDepth = -viewPos.z;\n#endif\n\n#ifdef UV_TILE\n vec2 tc = vec2(tileCountX, tileCountY);\n float baseTile = floor(uvTile);\n float tileU = mod(baseTile, tc.x) / tc.x;\n float tileV = 1.0 - floor(baseTile / tc.x) / tc.y - 1.0 / tc.y;\n vUV = uv / tc + vec2(tileU, tileV);\n #ifdef TILE_BLEND\n float nextTile = ceil(uvTile);\n float nextU = mod(nextTile, tc.x) / tc.x;\n float nextV = 1.0 - floor(nextTile / tc.x) / tc.y - 1.0 / tc.y;\n vUV2 = uv / tc + vec2(nextU, nextV);\n vTileBlend = fract(uvTile);\n #endif\n#else\n vUV = uv;\n#endif\n\n vColor = color;\n}\n`;\n","export default /* glsl */ `\nvarying vec2 vUV;\nvarying vec4 vColor;\n\n#ifdef TILE_BLEND\nvarying vec2 vUV2;\nvarying float vTileBlend;\n#endif\n\n#ifdef USE_MAP\nuniform sampler2D map;\n#endif\n\n#ifdef SOFT_PARTICLES\nuniform sampler2D depthTexture;\nuniform vec2 softParams;\nuniform vec4 projParams;\nvarying vec4 projPosition;\nvarying float linearDepth;\n#endif\n\n#ifdef USE_ALPHATEST\nuniform float alphaTest;\n#endif\n\nvoid main() {\n vec4 baseColor = vColor;\n\n#ifdef USE_MAP\n vec4 texColor = texture2D(map, vUV);\n #ifdef TILE_BLEND\n vec4 texColor2 = texture2D(map, vUV2);\n texColor = mix(texColor, texColor2, vTileBlend);\n #endif\n baseColor *= texColor;\n#endif\n\n#ifdef USE_COLOR_AS_ALPHA\n baseColor.a *= (baseColor.r + baseColor.g + baseColor.b) / 3.0;\n#endif\n\n#ifdef USE_ALPHATEST\n if (baseColor.a < alphaTest) discard;\n#else\n if (baseColor.a < 0.01) discard;\n#endif\n\n gl_FragColor = baseColor;\n\n#ifdef SOFT_PARTICLES\n vec2 p2 = projPosition.xy / projPosition.w;\n p2 = 0.5 * p2 + 0.5;\n float readDepth = texture2D(depthTexture, p2.xy).r;\n float zNear = projParams.x;\n float zFar = projParams.y;\n float viewDepth = (zFar * zNear) / (zFar - readDepth * (zFar - zNear));\n float fade = clamp(softParams.y * ((viewDepth - softParams.x) - linearDepth), 0.0, 1.0);\n gl_FragColor *= fade;\n#endif\n}\n`;\n","export default /* glsl */ `\nvarying vec2 vUV;\nvarying vec4 vColor;\nvarying vec3 vNormal;\nvarying vec3 vWorldPos;\n\n#ifndef MESH_UNLIT\nuniform vec3 lightDirection;\nuniform vec3 lightColor;\nuniform vec3 ambientColor;\n#endif\n\n#ifdef TILE_BLEND\nvarying vec2 vUV2;\nvarying float vTileBlend;\n#endif\n\n#ifdef USE_MAP\nuniform sampler2D map;\n#endif\n\n#if defined(USE_ENVMAP_ATLAS) || defined(MESH_RIM)\nuniform vec3 eyePosition;\n#endif\n\n#ifdef MESH_RIM\nuniform vec3 rimColor;\nuniform vec2 rimParams;\n#endif\n\n// One 3×2 atlas (px py pz / nx ny nz). Avoids samplerCube and multi-face\n// sampler bindings that raise GL_INVALID_OPERATION on iOS WebKit.\n#ifdef USE_ENVMAP_ATLAS\nuniform sampler2D envAtlas;\nuniform float reflectionLevel;\n\nvec3 sampleEnvAtlas(vec3 r) {\n vec3 a = abs(r);\n vec2 localUV;\n float cellX;\n float cellY;\n // Atlas layout: +X +Y +Z on row 0, -X -Y -Z on row 1.\n if (a.x >= a.y && a.x >= a.z) {\n cellX = 0.0;\n if (r.x >= 0.0) {\n cellY = 0.0;\n localUV = vec2(-r.z, -r.y) / a.x * 0.5 + 0.5;\n } else {\n cellY = 1.0;\n localUV = vec2(r.z, -r.y) / a.x * 0.5 + 0.5;\n }\n } else if (a.y >= a.z) {\n cellX = 1.0;\n if (r.y >= 0.0) {\n cellY = 0.0;\n localUV = vec2(r.x, r.z) / a.y * 0.5 + 0.5;\n } else {\n cellY = 1.0;\n localUV = vec2(r.x, -r.z) / a.y * 0.5 + 0.5;\n }\n } else {\n cellX = 2.0;\n if (r.z >= 0.0) {\n cellY = 0.0;\n localUV = vec2(r.x, -r.y) / a.z * 0.5 + 0.5;\n } else {\n cellY = 1.0;\n localUV = vec2(-r.x, -r.y) / a.z * 0.5 + 0.5;\n }\n }\n vec2 uv = (vec2(cellX, cellY) + clamp(localUV, 0.0, 1.0)) / vec2(3.0, 2.0);\n return texture2D(envAtlas, uv).rgb;\n}\n#endif\n\n#ifdef SOFT_PARTICLES\nuniform sampler2D depthTexture;\nuniform vec2 softParams;\nuniform vec4 projParams;\nvarying vec4 projPosition;\nvarying float linearDepth;\n#endif\n\n#ifdef USE_ALPHATEST\nuniform float alphaTest;\n#endif\n\nvoid main() {\n vec4 baseColor = vColor;\n\n#ifdef USE_MAP\n vec4 texColor = texture2D(map, vUV);\n #ifdef TILE_BLEND\n vec4 texColor2 = texture2D(map, vUV2);\n texColor = mix(texColor, texColor2, vTileBlend);\n #endif\n baseColor *= texColor;\n#endif\n\n#ifdef USE_ALPHATEST\n if (baseColor.a < alphaTest) discard;\n#else\n if (baseColor.a < 0.01) discard;\n#endif\n\n vec3 N = normalize(vNormal);\n#ifdef MESH_UNLIT\n vec3 color = baseColor.rgb;\n#else\n vec3 L = normalize(-lightDirection);\n float NdotL = max(dot(N, L), 0.0);\n vec3 litColor = ambientColor + lightColor * NdotL;\n\n vec3 color = baseColor.rgb * litColor;\n#endif\n\n#ifdef USE_ENVMAP_ATLAS\n vec3 viewDir = normalize(vWorldPos - eyePosition);\n vec3 reflectionCoords = reflect(viewDir, N);\n color += sampleEnvAtlas(reflectionCoords) * reflectionLevel;\n#endif\n\n#ifdef MESH_RIM\n // Fresnel: strongest where the surface turns away from the camera.\n vec3 V = normalize(eyePosition - vWorldPos);\n float rim = pow(1.0 - abs(dot(N, V)), rimParams.x) * rimParams.y;\n #ifdef MESH_RIM_MIX\n color = mix(color, rimColor, clamp(rim, 0.0, 1.0));\n #else\n color += rimColor * rim;\n #endif\n#endif\n\n gl_FragColor = vec4(color, baseColor.a);\n\n#ifdef SOFT_PARTICLES\n vec2 p2 = projPosition.xy / projPosition.w;\n p2 = 0.5 * p2 + 0.5;\n float readDepth = texture2D(depthTexture, p2.xy).r;\n float zNear = projParams.x;\n float zFar = projParams.y;\n float viewDepth = (zFar * zNear) / (zFar - readDepth * (zFar - zNear));\n float fade = clamp(softParams.y * ((viewDepth - softParams.x) - linearDepth), 0.0, 1.0);\n gl_FragColor *= fade;\n#endif\n}\n`;\n","export default /* glsl */ `\n// Per-vertex attributes\nattribute vec3 position;\nattribute vec2 uv;\n\n// Per-instance attributes\nattribute vec3 offset;\nattribute vec4 color;\nattribute vec3 size;\nattribute float rotation;\nattribute float uvTile;\n\n// Uniforms\nuniform mat4 world;\nuniform mat4 view;\nuniform mat4 projection;\nuniform mat4 worldViewProjection;\n\n#ifdef UV_TILE\nuniform float tileCountX;\nuniform float tileCountY;\n#endif\n\n#ifdef PIVOT\n// Quad offset in particle-size units: xy in the quad's plane, z toward the camera.\nuniform vec3 pivot;\n#endif\n\n// Varyings\nvarying vec2 vUV;\nvarying vec4 vColor;\n#ifdef TILE_BLEND\nvarying vec2 vUV2;\nvarying float vTileBlend;\n#endif\n#ifdef SOFT_PARTICLES\nvarying vec4 projPosition;\nvarying float linearDepth;\n#endif\n\nvoid main() {\n float c = cos(rotation);\n float s = sin(rotation);\n\n // A negative size mirrors the quad, which is how flipped particles arrive.\n vec2 alignedPosition = position.xy * size.xy;\n#ifdef PIVOT\n // The pivot turns with the particle but is not mirrored with it.\n alignedPosition += pivot.xy * abs(size.xy);\n#endif\n vec2 rotatedPosition;\n rotatedPosition.x = c * alignedPosition.x - s * alignedPosition.y;\n rotatedPosition.y = s * alignedPosition.x + c * alignedPosition.y;\n\n#ifdef HORIZONTAL\n vec4 mvPosition = world * vec4(offset, 1.0);\n mvPosition.x += rotatedPosition.x;\n mvPosition.z -= rotatedPosition.y;\n#ifdef PIVOT\n mvPosition.y += pivot.z * abs(size.x);\n#endif\n mvPosition = view * mvPosition;\n#elif defined(VERTICAL)\n vec4 mvPosition = world * vec4(offset, 1.0);\n mvPosition.y += rotatedPosition.y;\n mvPosition = view * mvPosition;\n mvPosition.x += rotatedPosition.x;\n#else\n vec4 mvPosition = view * world * vec4(offset, 1.0);\n mvPosition.xy += rotatedPosition;\n#endif\n#ifdef PIVOT\n#ifndef HORIZONTAL\n // Toward the camera along its view axis, whichever way the view space\n // faces: anything in front of the camera has the sign of the far side.\n mvPosition.z -= sign(mvPosition.z) * pivot.z * abs(size.x);\n#endif\n#endif\n\n gl_Position = projection * mvPosition;\n#ifdef SOFT_PARTICLES\n projPosition = gl_Position;\n linearDepth = -mvPosition.z;\n#endif\n\n #ifdef UV_TILE\n vec2 tc = vec2(tileCountX, tileCountY);\n float baseTile = floor(uvTile);\n float tileU = mod(baseTile, tc.x) / tc.x;\n float tileV = 1.0 - floor(baseTile / tc.x) / tc.y - 1.0 / tc.y;\n vUV = uv / tc + vec2(tileU, tileV);\n #ifdef TILE_BLEND\n float nextTile = ceil(uvTile);\n float nextU = mod(nextTile, tc.x) / tc.x;\n float nextV = 1.0 - floor(nextTile / tc.x) / tc.y - 1.0 / tc.y;\n vUV2 = uv / tc + vec2(nextU, nextV);\n vTileBlend = fract(uvTile);\n #endif\n #else\n vUV = uv;\n #endif\n\n vColor = color;\n}\n`;\n","export default /* glsl */ `\n// Per-vertex attributes\nattribute vec3 position;\nattribute vec2 uv;\n\n// Per-instance attributes\nattribute vec3 offset;\nattribute vec4 color;\nattribute vec3 size;\nattribute float rotation;\nattribute float uvTile;\nattribute vec4 velocity;\n\n// Uniforms\nuniform mat4 world;\nuniform mat4 view;\nuniform mat4 projection;\nuniform float speedFactor;\n\n#ifdef UV_TILE\nuniform float tileCountX;\nuniform float tileCountY;\n#endif\n\n#ifdef PIVOT\n// Streak offset in particle-size units: x from head to tail, y across.\nuniform vec3 pivot;\n#endif\n\n// Varyings\nvarying vec2 vUV;\nvarying vec4 vColor;\n#ifdef TILE_BLEND\nvarying vec2 vUV2;\nvarying float vTileBlend;\n#endif\n#ifdef SOFT_PARTICLES\nvarying vec4 projPosition;\nvarying float linearDepth;\n#endif\n\nvoid main() {\n float lengthFactor = velocity.w;\n // A flipped particle arrives with a negative size: the streak keeps its\n // extent and mirrors its texture instead (see quadUV below).\n float avgSize = (abs(size.x) + abs(size.y)) * 0.5;\n vec4 mvPosition = view * world * vec4(offset, 1.0);\n vec3 viewVelocity = mat3(view * world) * velocity.xyz;\n float vlength = length(viewVelocity);\n // Stretch direction is the velocity direction; only a genuinely motionless particle has none.\n // Deriving it via normalize keeps the stretch aligned even when the speed contribution is ~0\n // (e.g. speedFactor 0), instead of collapsing the whole burst onto a fixed screen axis.\n vec3 vdir = vlength > 0.000001 ? viewVelocity / vlength : vec3(0.0, 0.0, 1.0);\n vec3 side = normalize(cross(mvPosition.xyz, vdir));\n mvPosition.xyz += position.y * side * avgSize;\n // Equivalent to viewVelocity * (1.0 + lengthFactor / vlength) for moving particles, but the\n // size-based term (vdir * lengthFactor) survives when the velocity contribution vanishes.\n mvPosition.xyz -= (position.x + 0.5) * (viewVelocity + vdir * lengthFactor) * avgSize;\n#ifdef PIVOT\n // In particle-size units along the quad's own axes: x from head to tail, y across.\n mvPosition.xyz += (pivot.y * side - pivot.x * vdir) * avgSize;\n#endif\n gl_Position = projection * mvPosition;\n vec2 quadUV = vec2(size.x < 0.0 ? 1.0 - uv.x : uv.x, size.y < 0.0 ? 1.0 - uv.y : uv.y);\n#ifdef SOFT_PARTICLES\n projPosition = gl_Position;\n linearDepth = -mvPosition.z;\n#endif\n\n #ifdef UV_TILE\n vec2 tc = vec2(tileCountX, tileCountY);\n float baseTile = floor(uvTile);\n float tileU = mod(baseTile, tc.x) / tc.x;\n float tileV = 1.0 - floor(baseTile / tc.x) / tc.y - 1.0 / tc.y;\n vUV = quadUV / tc + vec2(tileU, tileV);\n #ifdef TILE_BLEND\n float nextTile = ceil(uvTile);\n float nextU = mod(nextTile, tc.x) / tc.x;\n float nextV = 1.0 - floor(nextTile / tc.x) / tc.y - 1.0 / tc.y;\n vUV2 = quadUV / tc + vec2(nextU, nextV);\n vTileBlend = fract(uvTile);\n #endif\n #else\n vUV = quadUV;\n #endif\n\n vColor = color;\n}\n`;\n","export default /* glsl */ `\nvarying vec2 vUV;\nvarying vec4 vColor;\n\n#ifdef USE_MAP\nuniform sampler2D map;\n#endif\n\nvoid main() {\n vec4 baseColor = vColor;\n\n#ifdef USE_MAP\n vec4 texColor = texture2D(map, vUV);\n baseColor *= texColor;\n#endif\n\n if (baseColor.a < 0.01) discard;\n\n gl_FragColor = baseColor;\n}\n`;\n","export default /* glsl */ `\nattribute vec3 position;\nattribute vec3 previous;\nattribute vec3 next;\nattribute float side;\nattribute float width;\nattribute vec2 uv;\nattribute vec4 color;\n\nuniform mat4 view;\nuniform mat4 projection;\nuniform float lineWidth;\nuniform vec2 resolution;\nuniform float sizeAttenuation;\n\nvarying vec2 vUV;\nvarying vec4 vColor;\n\nvec2 fix(vec4 i, float aspect) {\n vec2 res = i.xy / i.w;\n res.x *= aspect;\n return res;\n}\n\nvoid main() {\n float aspect = resolution.x / resolution.y;\n vec4 finalPosition = projection * view * vec4(position, 1.0);\n vec4 prevPos = projection * view * vec4(previous, 1.0);\n vec4 nextPos = projection * view * vec4(next, 1.0);\n\n vec2 currentP = fix(finalPosition, aspect);\n vec2 prevP = fix(prevPos, aspect);\n vec2 nextP = fix(nextPos, aspect);\n\n float w = lineWidth * width;\n vec2 dir;\n if (distance(nextP, currentP) < 0.0001) {\n dir = normalize(currentP - prevP);\n } else if (distance(prevP, currentP) < 0.0001) {\n dir = normalize(nextP - currentP);\n } else {\n vec2 dir1 = normalize(currentP - prevP);\n vec2 dir2 = normalize(nextP - currentP);\n dir = normalize(dir1 + dir2);\n }\n vec4 normal = vec4(-dir.y, dir.x, 0.0, 1.0);\n normal.xy *= 0.5 * w;\n normal *= projection;\n if (sizeAttenuation == 0.0) {\n normal.xy *= finalPosition.w;\n normal.xy /= (vec4(resolution, 0.0, 1.0) * projection).xy;\n }\n finalPosition.xy += normal.xy * side;\n gl_Position = finalPosition;\n vUV = uv;\n vColor = color;\n}\n`;\n","export default /* wgsl */ `\nvarying vUV: vec2f;\nvarying vColor: vec4f;\n\n#ifdef TILE_BLEND\nvarying vUV2: vec2f;\nvarying vTileBlend: f32;\n#endif\n\n#ifdef USE_MAP\nvar mapSampler: sampler;\nvar map: texture_2d<f32>;\n#endif\n\n#ifdef SOFT_PARTICLES\nvar depthTextureSampler: sampler;\nvar depthTexture: texture_2d<f32>;\nuniform softParams: vec2f;\nuniform projParams: vec4f;\nvarying projPosition: vec4f;\nvarying linearDepth: f32;\n#endif\n\n#ifdef USE_ALPHATEST\nuniform alphaTest: f32;\n#endif\n\n@fragment\nfn main(input: FragmentInputs) -> FragmentOutputs {\n var baseColor = fragmentInputs.vColor;\n\n#ifdef USE_MAP\n var texColor = textureSample(map, mapSampler, fragmentInputs.vUV);\n #ifdef TILE_BLEND\n let texColor2 = textureSample(map, mapSampler, fragmentInputs.vUV2);\n texColor = mix(texColor, texColor2, fragmentInputs.vTileBlend);\n #endif\n baseColor *= texColor;\n#endif\n\n#ifdef USE_COLOR_AS_ALPHA\n baseColor.a *= (baseColor.r + baseColor.g + baseColor.b) / 3.0;\n#endif\n\n#ifdef USE_ALPHATEST\n if (baseColor.a < uniforms.alphaTest) { discard; }\n#else\n if (baseColor.a < 0.01) { discard; }\n#endif\n\n#ifdef SOFT_PARTICLES\n var p2 = fragmentInputs.projPosition.xy / fragmentInputs.projPosition.w;\n p2 = 0.5 * p2 + 0.5;\n let readDepth = textureSample(depthTexture, depthTextureSampler, p2).r;\n let zNear = uniforms.projParams.x;\n let zFar = uniforms.projParams.y;\n let viewDepth = (zFar * zNear) / (zFar - readDepth * (zFar - zNear));\n let fade = clamp(uniforms.softParams.y * ((viewDepth - uniforms.softParams.x) - fragmentInputs.linearDepth), 0.0, 1.0);\n baseColor *= fade;\n#endif\n\n fragmentOutputs.color = baseColor;\n}\n`;\n","import type {AbstractEngine} from '@babylonjs/core/Engines/abstractEngine';\nimport {ShaderStore} from '@babylonjs/core/Engines/shaderStore';\nimport {Effect} from '@babylonjs/core/Materials/effect';\nimport {ShaderLanguage} from '@babylonjs/core/Materials/shaderLanguage';\n\n/**\n * Picking the shader language a batch compiles in, and putting the source where\n * the engine will look for it.\n *\n * WebGPU speaks WGSL. Handing it GLSL is not an error — Babylon transpiles —\n * but the transpilers are two WASM modules it downloads from cdn.babylonjs.com\n * the first time a GLSL shader is compiled. That is a third-party request on\n * first draw, a hard failure under a Content-Security-Policy that does not list\n * the CDN or with no network at all, and a GLSL to SPIR-V to WGSL round trip\n * before the first particle appears. Shipping the WGSL means none of that\n * happens.\n *\n * The two languages live in separate stores keyed by the same name, so a scene\n * that somehow ran both would not collide.\n */\nexport interface ShaderSources {\n /** GLSL source, used on every WebGL engine. */\n glsl: string;\n /** WGSL source, used on WebGPU. */\n wgsl: string;\n}\n\n/** The language `engine` wants: WGSL on WebGPU, GLSL everywhere else. */\nexport function shaderLanguageFor(engine: AbstractEngine): ShaderLanguage {\n return engine.isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL;\n}\n\n/**\n * Registers a vertex/fragment pair under `name` in the store for `language`,\n * and returns that language so the caller can pass it to the material.\n *\n * Registration is by name rather than per material instance: the sources only\n * depend on the render mode, so a fresh name per rebuild would grow the store\n * without bound and defeat Babylon's compiled-effect cache.\n */\nexport function registerShaders(\n name: string,\n vertex: ShaderSources,\n fragment: ShaderSources,\n language: ShaderLanguage\n): void {\n if (language === ShaderLanguage.WGSL) {\n ShaderStore.ShadersStoreWGSL[name + 'VertexShader'] = vertex.wgsl;\n ShaderStore.ShadersStoreWGSL[name + 'FragmentShader'] = fragment.wgsl;\n return;\n }\n Effect.ShadersStore[name + 'VertexShader'] = vertex.glsl;\n Effect.ShadersStore[name + 'FragmentShader'] = fragment.glsl;\n}\n","export default /* wgsl */ `\n// Per-vertex attributes\nattribute position: vec3f;\nattribute uv: vec2f;\n\n// Per-instance attributes\nattribute offset: vec3f;\nattribute color: vec4f;\nattribute size: vec3f;\nattribute rotation: f32;\nattribute uvTile: f32;\nattribute velocity: vec4f;\n\n// Uniforms\nuniform world: mat4x4f;\nuniform view: mat4x4f;\nuniform projection: mat4x4f;\nuniform speedFactor: f32;\n\n#ifdef UV_TILE\nuniform tileCountX: f32;\nuniform tileCountY: f32;\n#endif\n\n#ifdef PIVOT\n// Streak offset in particle-size units: x from head to tail, y across.\nuniform pivot: vec3f;\n#endif\n\n// Varyings\nvarying vUV: vec2f;\nvarying vColor: vec4f;\n#ifdef TILE_BLEND\nvarying vUV2: vec2f;\nvarying vTileBlend: f32;\n#endif\n#ifdef SOFT_PARTICLES\nvarying projPosition: vec4f;\nvarying linearDepth: f32;\n#endif\n\n@vertex\nfn main(input: VertexInputs) -> FragmentInputs {\n let lengthFactor = vertexInputs.velocity.w;\n // A flipped particle arrives with a negative size: the streak keeps its\n // extent and mirrors its texture instead (see quadUV below).\n let avgSize = (abs(vertexInputs.size.x) + abs(vertexInputs.size.y)) * 0.5;\n var mvPosition = uniforms.view * uniforms.world * vec4f(vertexInputs.offset, 1.0);\n let viewWorld = uniforms.view * uniforms.world;\n let viewWorld3 = mat3x3f(viewWorld[0].xyz, viewWorld[1].xyz, viewWorld[2].xyz);\n let viewVelocity = viewWorld3 * vertexInputs.velocity.xyz;\n let vlength = length(viewVelocity);\n // Stretch direction is the velocity direction; only a genuinely motionless particle has none.\n // Deriving it via normalize keeps the stretch aligned even when the speed contribution is ~0\n // (e.g. speedFactor 0), instead of collapsing the whole burst onto a fixed screen axis.\n var vdir = vec3f(0.0, 0.0, 1.0);\n if (vlength > 0.000001) {\n vdir = viewVelocity / vlength;\n }\n let side = normalize(cross(mvPosition.xyz, vdir));\n let widthOffset = vertexInputs.position.y * side * avgSize;\n // Equivalent to viewVelocity * (1.0 + lengthFactor / vlength) for moving particles, but the\n // size-based term (vdir * lengthFactor) survives when the velocity contribution vanishes.\n let lengthOffset = (vertexInputs.position.x + 0.5) * (viewVelocity + vdir * lengthFactor) * avgSize;\n var stretched = mvPosition.xyz + widthOffset - lengthOffset;\n#ifdef PIVOT\n // In particle-size units along the quad's own axes: x from head to tail, y across.\n stretched += (uniforms.pivot.y * side - uniforms.pivot.x * vdir) * avgSize;\n#endif\n mvPosition.x = stretched.x;\n mvPosition.y = stretched.y;\n mvPosition.z = stretched.z;\n\n let clipPosition = uniforms.projection * mvPosition;\n vertexOutputs.position = clipPosition;\n let quadUV = select(vertexInputs.uv, 1.0 - vertexInputs.uv, vertexInputs.size.xy < vec2f(0.0));\n#ifdef SOFT_PARTICLES\n vertexOutputs.projPosition = clipPosition;\n vertexOutputs.linearDepth = -mvPosition.z;\n#endif\n\n #ifdef UV_TILE\n let tc = vec2f(uniforms.tileCountX, uniforms.tileCountY);\n let baseTile = floor(vertexInputs.uvTile);\n let tileU = (baseTile % tc.x) / tc.x;\n let tileV = 1.0 - floor(baseTile / tc.x) / tc.y - 1.0 / tc.y;\n vertexOutputs.vUV = quadUV / tc + vec2f(tileU, tileV);\n #ifdef TILE_BLEND\n let nextTile = ceil(vertexInputs.uvTile);\n let nextU = (nextTile % tc.x) / tc.x;\n let nextV = 1.0 - floor(nextTile / tc.x) / tc.y - 1.0 / tc.y;\n vertexOutputs.vUV2 = quadUV / tc + vec2f(nextU, nextV);\n vertexOutputs.vTileBlend = fract(vertexInputs.uvTile);\n #endif\n #else\n vertexOutputs.vUV = quadUV;\n #endif\n\n vertexOutputs.vColor = vertexInputs.color;\n}\n`;\n","import {BaseTexture} from '@babylonjs/core/Materials/Textures/baseTexture';\nimport {ShaderMaterial} from '@babylonjs/core/Materials/shaderMaterial';\nimport {Color3} from '@babylonjs/core/Maths/math.color';\nimport {Vector3 as BVector3} from '@babylonjs/core/Maths/math.vector';\nimport {Mesh} from '@babylonjs/core/Meshes/mesh';\nimport {Scene} from '@babylonjs/core/scene';\nimport {IParticleSystem, Vector3} from 'quarks.core';\nimport {VFXBatchSettings} from './BatchedRenderer';\n\nexport enum RenderMode {\n BillBoard = 0,\n StretchedBillBoard = 1,\n Mesh = 2,\n Trail = 3,\n HorizontalBillBoard = 4,\n VerticalBillBoard = 5,\n}\n\n/**\n * How mesh particles are lit.\n *\n * - `'fixed'` (default): one directional light plus ambient, the same for every\n * mesh batch of a renderer, set with {@link BatchedRenderer.setMeshLighting}.\n * - `'unlit'`: no lighting term — the texture times the particle colour, for\n * emissive meshes (fire, energy, glowing blades).\n * - `'scene'`: follows the scene's first enabled `DirectionalLight` or\n * `HemisphericLight` every frame, falling back to the fixed light when there\n * is none.\n *\n * Only mesh particles are lit; other render modes ignore it.\n */\nexport type MeshLighting = 'unlit' | 'fixed' | 'scene';\n\n/** The light {@link MeshLighting} `'fixed'` mesh particles are lit by. */\nexport interface MeshLightingSettings {\n /** Direction the light travels in, world space. Default `(0.4, -1, 0.6)`. */\n direction: BVector3;\n /** Light colour, intensity folded in. Default white. */\n color: Color3;\n /** Light every face gets regardless of its direction. Default `(0.35, 0.35, 0.35)`. */\n ambient: Color3;\n}\n\n/** The light mesh particles have always been lit by. */\nexport function defaultMeshLighting(): MeshLightingSettings {\n return {\n direction: new BVector3(0.4, -1, 0.6),\n color: new Color3(1, 1, 1),\n ambient: new Color3(0.35, 0.35, 0.35),\n };\n}\n\n/**\n * A rim (Fresnel) term on mesh particles: a colour that grows where the surface\n * turns away from the camera, `pow(1 - |N·V|, power) * strength`. Unset: no rim.\n * Only mesh particles draw it.\n */\nexport interface MeshRim {\n /** Edge colour, linear RGB. Default `[1, 1, 1]`. */\n color: [number, number, number];\n /** Falloff exponent; higher keeps the rim to a thinner edge. Default 2. */\n power: number;\n /** How much of the rim is applied, usually 0…1. Default 1. */\n strength: number;\n /**\n * `'add'` (default) adds the colour, for a glowing edge; `'mix'` blends the\n * surface toward it, for an outline (a dark ink line with a dark colour).\n */\n mode: 'add' | 'mix';\n}\n\n/**\n * A complete rim from a partial one, every field defaulted and kept in range,\n * or undefined when `rim` is unset.\n */\nexport function normalizeMeshRim(rim: Partial<MeshRim> | null | undefined): MeshRim | undefined {\n if (!rim || typeof rim !== 'object') {\n return undefined;\n }\n const color = Array.isArray(rim.color) ? rim.color : [1, 1, 1];\n const channel = (value: unknown, fallback: number) =>\n typeof value === 'number' && Number.isFinite(value) ? value : fallback;\n return {\n color: [channel(color[0], 1), channel(color[1], 1), channel(color[2], 1)],\n power: Math.max(0.01, channel(rim.power, 2)),\n strength: Math.max(0, channel(rim.strength, 1)),\n mode: rim.mode === 'mix' ? 'mix' : 'add',\n };\n}\n\n/** True when both describe the same rim (or both none). */\nexport function meshRimEqual(a: MeshRim | undefined, b: MeshRim | undefined): boolean {\n if (a === b) {\n return true;\n }\n if (!a || !b) {\n return false;\n }\n return (\n a.mode === b.mode &&\n a.power === b.power &&\n a.strength === b.strength &&\n a.color[0] === b.color[0] &&\n a.color[1] === b.color[1] &&\n a.color[2] === b.color[2]\n );\n}\n\nexport interface StoredBatchSettings {\n instancingGeometry: Float32Array;\n instancingIndices: Uint32Array | Uint16Array;\n instancingUVs?: Float32Array;\n instancingNormals?: Float32Array;\n renderMode: RenderMode;\n renderOrder: number;\n uTileCount: number;\n vTileCount: number;\n blendTiles: boolean;\n softParticles: boolean;\n softNearFade: number;\n softFarFade: number;\n materialBlendMode: number;\n materialTransparent: boolean;\n materialDepthTest: boolean;\n materialDepthWrite: boolean;\n materialAlphaTest: number;\n texture: any;\n reflectionTexture: BaseTexture | null;\n reflectionLevel: number;\n reflectionFaces: BaseTexture[] | null;\n reflectionAtlas: BaseTexture | null;\n layerMask: number;\n /** Billboard pivot in particle-size units, see {@link VFXBatchSettings.pivot}. */\n pivot?: Vector3;\n /** Mesh particle lighting, see {@link VFXBatchSettings.lighting}. */\n lighting?: MeshLighting;\n /** Mesh particle rim, see {@link VFXBatchSettings.rim}. */\n rim?: MeshRim;\n}\n\nexport abstract class VFXBatch {\n mesh: Mesh;\n systems: Set<IParticleSystem>;\n settings: StoredBatchSettings;\n protected maxParticles: number;\n protected scene: Scene;\n private readonly visibleSystems: IParticleSystem[] = [];\n\n protected constructor(settings: VFXBatchSettings, scene: Scene) {\n this.scene = scene;\n this.maxParticles = 1000;\n this.systems = new Set<IParticleSystem>();\n this.settings = {\n instancingGeometry: settings.instancingGeometry,\n instancingIndices: settings.instancingIndices,\n instancingUVs: settings.instancingUVs,\n instancingNormals: settings.instancingNormals,\n renderMode: settings.renderMode,\n renderOrder: settings.renderOrder,\n uTileCount: settings.uTileCount,\n vTileCount: settings.vTileCount,\n blendTiles: settings.blendTiles,\n softParticles: settings.softParticles,\n softNearFade: settings.softNearFade,\n softFarFade: settings.softFarFade,\n materialBlendMode: settings.materialBlendMode,\n materialTransparent: settings.materialTransparent,\n materialDepthTest: settings.materialDepthTest,\n materialDepthWrite: settings.materialDepthWrite,\n materialAlphaTest: settings.materialAlphaTest,\n texture: settings.texture,\n reflectionTexture: settings.reflectionTexture ?? null,\n reflectionLevel: settings.reflectionLevel ?? 1,\n reflectionFaces: settings.reflectionFaces ?? null,\n reflectionAtlas: settings.reflectionAtlas ?? null,\n pivot: settings.pivot?.clone(),\n layerMask: settings.layerMask,\n lighting: settings.lighting,\n rim: normalizeMeshRim(settings.rim),\n };\n this.mesh = new Mesh('vfxBatch', scene);\n this.mesh.alwaysSelectAsActiveMesh = true;\n }\n\n addSystem(system: IParticleSystem) {\n this.systems.add(system);\n }\n\n removeSystem(system: IParticleSystem) {\n this.systems.delete(system);\n }\n\n /**\n * Visible systems of this batch, written into a buffer owned by the batch.\n * Called once per frame per batch, so the result is reused rather than\n * reallocated; treat it as valid only until the next call.\n */\n getVisibleSystems(): IParticleSystem[] {\n const visibleSystems = this.visibleSystems;\n let count = 0;\n for (const system of this.systems) {\n if (system.emitter.visible) {\n visibleSystems[count++] = system;\n }\n }\n visibleSystems.length = count;\n return visibleSystems;\n }\n\n applyDepthTexture(depthTexture: BaseTexture | null): void {\n const material = this.mesh.material;\n if (material && material instanceof ShaderMaterial) {\n material.setTexture('depthTexture', depthTexture);\n }\n }\n\n /** Sets the light `'fixed'` mesh particles are lit by. Batches that draw no meshes ignore it. */\n applyMeshLighting(_lighting: MeshLightingSettings): void {}\n\n abstract setupBuffers(): void;\n abstract expandBuffers(target: number): void;\n abstract rebuildMaterial(): void;\n abstract update(): void;\n\n dispose(): void {\n this.mesh.dispose();\n }\n}\n","import {VertexBuffer} from '@babylonjs/core/Buffers/buffer';\nimport {Constants} from '@babylonjs/core/Engines/constants';\nimport {ShaderMaterial} from '@babylonjs/core/Materials/shaderMaterial';\nimport {RawTexture} from '@babylonjs/core/Materials/Textures/rawTexture';\nimport {Vector2 as BVector2, Vector3 as BVector3, Vector4 as BVector4} from '@babylonjs/core/Maths/math.vector';\nimport {Mesh} from '@babylonjs/core/Meshes/mesh';\nimport {VertexData} from '@babylonjs/core/Meshes/mesh.vertexData';\nimport {Scene} from '@babylonjs/core/scene';\nimport {\n IParticle,\n IParticleSystem,\n Matrix3,\n ParticleStore,\n Quaternion,\n SpriteParticle,\n StretchedBillBoardSettings,\n Vector3,\n} from 'quarks.core';\nimport {VFXBatchSettings} from './BatchedRenderer';\nimport local_particle_physics_vert from './shaders/local_particle_physics_vert.glsl';\nimport local_particle_physics_vert_wgsl from './shaders/local_particle_physics_vert.wgsl';\nimport particle_frag from './shaders/particle_frag.glsl';\nimport particle_frag_wgsl from './shaders/particle_frag.wgsl';\nimport particle_physics_frag from './shaders/particle_physics_frag.glsl';\nimport particle_physics_frag_wgsl from './shaders/particle_physics_frag.wgsl';\nimport particle_vert from './shaders/particle_vert.glsl';\nimport particle_vert_wgsl from './shaders/particle_vert.wgsl';\nimport {registerShaders, shaderLanguageFor, ShaderSources} from './shaders/shaderLanguageSupport';\nimport stretched_bb_particle_vert from './shaders/stretched_bb_particle_vert.glsl';\nimport stretched_bb_particle_vert_wgsl from './shaders/stretched_bb_particle_vert.wgsl';\nimport {defaultMeshLighting, MeshLightingSettings, RenderMode, VFXBatch} from './VFXBatch';\n\nexport class SpriteBatch extends VFXBatch {\n private static whiteTextureByScene = new WeakMap<Scene, RawTexture>();\n\n /** 1×1 white map so mesh batches always have a sampler2D (iOS WebKit). */\n private static whiteTexture(scene: Scene): RawTexture {\n let texture = SpriteBatch.whiteTextureByScene.get(scene);\n if (!texture) {\n texture = RawTexture.CreateRGBATexture(new Uint8Array([255, 255, 255, 255]), 1, 1, scene);\n texture.name = 'quarksMeshWhite';\n SpriteBatch.whiteTextureByScene.set(scene, texture);\n }\n return texture;\n }\n private offsetBuffer!: Float32Array;\n private rotationBuffer!: Float32Array;\n private sizeBuffer!: Float32Array;\n private colorBuffer!: Float32Array;\n private uvTileBuffer!: Float32Array;\n private velocityBuffer?: Float32Array;\n\n /** Concretely typed handle on the batch material, see syncStretchedSpeedFactor. */\n private shaderMaterial: ShaderMaterial | null = null;\n /** The `'fixed'` mesh light, as shader uniforms; see applyMeshLighting. */\n private readonly fixedLightDirection = new BVector3();\n private readonly fixedLightColor = new BVector3();\n private readonly fixedAmbientColor = new BVector3();\n\n private offsetVB!: VertexBuffer;\n private rotationVB!: VertexBuffer;\n private sizeVB!: VertexBuffer;\n private colorVB!: VertexBuffer;\n private uvTileVB!: VertexBuffer;\n private velocityVB?: VertexBuffer;\n\n constructor(settings: VFXBatchSettings, scene: Scene) {\n super(settings, scene);\n this.storeFixedLighting(defaultMeshLighting());\n this.maxParticles = 1000;\n this.setupBuffers();\n this.rebuildMaterial();\n }\n\n setupBuffers(): void {\n this.mesh.dispose();\n this.mesh = new Mesh('spriteBatch', this.scene);\n this.mesh.alwaysSelectAsActiveMesh = true;\n\n const vertexData = new VertexData();\n vertexData.positions = this.settings.instancingGeometry;\n vertexData.indices = this.settings.instancingIndices;\n const vertexCount = this.settings.instancingGeometry.length / 3;\n const uvs = this.settings.instancingUVs;\n // WebGL (especially iOS) raises INVALID_OPERATION if the shader reads\n // `attribute vec2 uv` but the buffer is missing or shorter than vertices.\n if (uvs && uvs.length >= vertexCount * 2) {\n vertexData.uvs = uvs;\n } else {\n vertexData.uvs = new Float32Array(vertexCount * 2);\n }\n if (this.settings.instancingNormals) {\n vertexData.normals = this.settings.instancingNormals;\n }\n vertexData.applyToMesh(this.mesh, false);\n\n this.buildExpandableBuffers();\n }\n\n /** Releases the instance vertex buffers so a resize does not leak GPU memory. */\n private disposeExpandableBuffers(): void {\n this.offsetVB?.dispose();\n this.colorVB?.dispose();\n this.sizeVB?.dispose();\n this.uvTileVB?.dispose();\n this.rotationVB?.dispose();\n this.velocityVB?.dispose();\n this.velocityVB = undefined;\n this.velocityBuffer = undefined;\n }\n\n private buildExpandableBuffers(): void {\n const engine = this.scene.getEngine();\n\n this.offsetBuffer = new Float32Array(this.maxParticles * 3);\n this.offsetVB = new VertexBuffer(engine, this.offsetBuffer, 'offset', true, false, 3, true);\n this.mesh.setVerticesBuffer(this.offsetVB);\n\n this.colorBuffer = new Float32Array(this.maxParticles * 4);\n this.colorVB = new VertexBuffer(engine, this.colorBuffer, 'color', true, false, 4, true);\n this.mesh.setVerticesBuffer(this.colorVB);\n\n this.sizeBuffer = new Float32Array(this.maxParticles * 3);\n this.sizeVB = new VertexBuffer(engine, this.sizeBuffer, 'size', true, false, 3, true);\n this.mesh.setVerticesBuffer(this.sizeVB);\n\n this.uvTileBuffer = new Float32Array(this.maxParticles);\n this.uvTileVB = new VertexBuffer(engine, this.uvTileBuffer, 'uvTile', true, false, 1, true);\n this.mesh.setVerticesBuffer(this.uvTileVB);\n\n if (this.settings.renderMode === RenderMode.Mesh) {\n this.rotationBuffer = new Float32Array(this.maxParticles * 4);\n this.rotationVB = new VertexBuffer(engine, this.rotationBuffer, 'rotation', true, false, 4, true);\n } else {\n this.rotationBuffer = new Float32Array(this.maxParticles);\n this.rotationVB = new VertexBuffer(engine, this.rotationBuffer, 'rotation', true, false, 1, true);\n }\n this.mesh.setVerticesBuffer(this.rotationVB);\n\n if (this.settings.renderMode === RenderMode.StretchedBillBoard) {\n this.velocityBuffer = new Float32Array(this.maxParticles * 4);\n this.velocityVB = new VertexBuffer(engine, this.velocityBuffer, 'velocity', true, false, 4, true);\n this.mesh.setVerticesBuffer(this.velocityVB);\n }\n\n this.mesh.forcedInstanceCount = 0;\n this.mesh.doNotSyncBoundingInfo = true;\n }\n\n expandBuffers(target: number): void {\n while (target >= this.maxParticles) {\n this.maxParticles *= 2;\n }\n this.disposeExpandableBuffers();\n this.buildExpandableBuffers();\n }\n\n rebuildMaterial(): void {\n // The shader sources only depend on the render mode, so the store entry is\n // registered once per mode. A unique name per rebuild would leak entries in\n // Effect.ShadersStore and defeat Babylon's compiled-effect cache.\n const shaderName = `quarksParticle_${this.settings.renderMode}`;\n this.lastStretchedSpeedFactor = Number.NaN;\n const defines: string[] = [];\n\n let vertexShader: ShaderSources;\n let fragmentShader: ShaderSources;\n if (this.settings.renderMode === RenderMode.Mesh) {\n vertexShader = {glsl: local_particle_physics_vert, wgsl: local_particle_physics_vert_wgsl};\n fragmentShader = {glsl: particle_physics_frag, wgsl: particle_physics_frag_wgsl};\n } else if (this.settings.renderMode === RenderMode.StretchedBillBoard) {\n vertexShader = {glsl: stretched_bb_particle_vert, wgsl: stretched_bb_particle_vert_wgsl};\n fragmentShader = {glsl: particle_frag, wgsl: particle_frag_wgsl};\n } else {\n vertexShader = {glsl: particle_vert, wgsl: particle_vert_wgsl};\n fragmentShader = {glsl: particle_frag, wgsl: particle_frag_wgsl};\n }\n\n // Mesh batches without a diffuse map still need a sampler2D on iOS WebKit —\n // a zero-sampler particle mesh effect often never becomes drawable there.\n const mapTexture =\n this.settings.texture ??\n (this.settings.renderMode === RenderMode.Mesh ? SpriteBatch.whiteTexture(this.scene) : null);\n if (mapTexture) {\n defines.push('USE_MAP');\n }\n const atlas = this.settings.reflectionAtlas;\n const atlasPending = this.settings.renderMode === RenderMode.Mesh && !!atlas && !atlas.isReady();\n if (atlasPending && atlas) {\n const onLoad = (atlas as {onLoadObservable?: {addOnce: (cb: () => void) => void}}).onLoadObservable;\n onLoad?.addOnce(() => {\n this.rebuildMaterial();\n });\n }\n const useEnvAtlas = this.settings.renderMode === RenderMode.Mesh && !!atlas && atlas.isReady();\n if (useEnvAtlas) {\n defines.push('USE_ENVMAP_ATLAS');\n }\n if (this.settings.uTileCount > 1 || this.settings.vTileCount > 1) {\n defines.push('UV_TILE');\n }\n if (this.settings.blendTiles) {\n defines.push('TILE_BLEND');\n }\n if (this.settings.softParticles) {\n defines.push('SOFT_PARTICLES');\n }\n if (this.settings.materialAlphaTest > 0) {\n defines.push('USE_ALPHATEST');\n }\n if (this.settings.renderMode === RenderMode.VerticalBillBoard) {\n defines.push('VERTICAL');\n }\n if (this.settings.renderMode === RenderMode.HorizontalBillBoard) {\n defines.push('HORIZONTAL');\n }\n const pivot = SpriteBatch.takesPivotAndFlip(this.settings.renderMode) ? this.settings.pivot : undefined;\n if (pivot) {\n defines.push('PIVOT');\n }\n const isMesh = this.settings.renderMode === RenderMode.Mesh;\n const lighting = this.settings.lighting ?? 'fixed';\n const lit = isMesh && lighting !== 'unlit';\n if (isMesh && !lit) {\n defines.push('MESH_UNLIT');\n }\n const rim = isMesh ? this.settings.rim : undefined;\n if (rim) {\n defines.push('MESH_RIM');\n if (rim.mode === 'mix') {\n defines.push('MESH_RIM_MIX');\n }\n }\n const needsEyePosition = useEnvAtlas || !!rim;\n\n const shaderLanguage = shaderLanguageFor(this.scene.getEngine());\n registerShaders(shaderName, vertexShader, fragmentShader, shaderLanguage);\n\n const attributes = ['position', 'uv', 'offset', 'color', 'size', 'rotation', 'uvTile'];\n if (this.settings.renderMode === RenderMode.Mesh) {\n attributes.push('normal');\n }\n if (this.settings.renderMode === RenderMode.StretchedBillBoard) {\n attributes.push('velocity');\n }\n\n const uniforms = ['world', 'view', 'projection', 'worldView', 'worldViewProjection'];\n const samplers: string[] = [];\n\n if (this.settings.uTileCount > 1 || this.settings.vTileCount > 1) {\n uniforms.push('tileCountX');\n uniforms.push('tileCountY');\n }\n if (mapTexture) {\n samplers.push('map');\n }\n if (useEnvAtlas) {\n samplers.push('envAtlas');\n uniforms.push('reflectionLevel');\n }\n if (needsEyePosition) {\n uniforms.push('eyePosition');\n }\n if (rim) {\n uniforms.push('rimColor');\n uniforms.push('rimParams');\n }\n if (this.settings.renderMode === RenderMode.StretchedBillBoard) {\n uniforms.push('speedFactor');\n }\n if (this.settings.softParticles) {\n uniforms.push('softParams');\n uniforms.push('projParams');\n samplers.push('depthTexture');\n }\n if (this.settings.materialAlphaTest > 0) {\n uniforms.push('alphaTest');\n }\n if (pivot) {\n uniforms.push('pivot');\n }\n if (lit) {\n uniforms.push('lightDirection');\n uniforms.push('lightColor');\n uniforms.push('ambientColor');\n }\n\n const mat = new ShaderMaterial(\n shaderName,\n this.scene,\n {vertex: shaderName, fragment: shaderName},\n {\n attributes,\n uniforms,\n samplers,\n defines,\n needAlphaBlending: this.settings.materialTransparent,\n shaderLanguage,\n }\n );\n\n if (mapTexture) {\n mat.setTexture('map', mapTexture);\n }\n if (useEnvAtlas && atlas) {\n mat.setTexture('envAtlas', atlas);\n mat.setFloat('reflectionLevel', this.settings.reflectionLevel);\n }\n if (rim) {\n mat.setVector3('rimColor', new BVector3(rim.color[0], rim.color[1], rim.color[2]));\n mat.setVector2('rimParams', new BVector2(rim.power, rim.strength));\n }\n if (needsEyePosition) {\n const eyePosition = new BVector3();\n mat.setVector3('eyePosition', eyePosition);\n mat.onBindObservable.add(() => {\n const camera = this.scene.activeCamera;\n if (!camera) {\n return;\n }\n eyePosition.copyFrom(camera.globalPosition);\n mat.setVector3('eyePosition', eyePosition);\n });\n }\n if (this.settings.uTileCount > 1 || this.settings.vTileCount > 1) {\n mat.setFloat('tileCountX', this.settings.uTileCount);\n mat.setFloat('tileCountY', this.settings.vTileCount);\n }\n if (this.settings.renderMode === RenderMode.StretchedBillBoard) {\n mat.setFloat('speedFactor', this.settings.softNearFade > 0 ? this.settings.softNearFade : 1.0);\n }\n if (this.settings.softParticles) {\n mat.setVector2(\n 'softParams',\n new BVector2(\n this.settings.softNearFade,\n 1.0 / Math.max(this.settings.softFarFade - this.settings.softNearFade, 0.0001)\n )\n );\n // Reused across binds: this runs on every draw call.\n const projParams = new BVector4(0, 0, 0, 0);\n mat.onBindObservable.add(() => {\n const camera = this.scene.activeCamera;\n if (camera) {\n projParams.x = camera.minZ;\n projParams.y = camera.maxZ;\n mat.setVector4('projParams', projParams);\n }\n });\n }\n if (this.settings.materialAlphaTest > 0) {\n mat.setFloat('alphaTest', this.settings.materialAlphaTest);\n }\n if (pivot) {\n mat.setVector3('pivot', new BVector3(pivot.x, pivot.y, pivot.z));\n }\n if (lit) {\n this.writeFixedLighting(mat);\n if (lighting === 'scene') {\n const direction = new BVector3();\n const color = new BVector3();\n const ambient = new BVector3();\n mat.onBindObservable.add(() => {\n if (SpriteBatch.readSceneLight(this.scene, direction, color, ambient)) {\n mat.setVector3('lightDirection', direction);\n mat.setVector3('lightColor', color);\n mat.setVector3('ambientColor', ambient);\n } else {\n this.writeFixedLighting(mat);\n }\n });\n }\n }\n\n mat.backFaceCulling = false;\n\n if (this.settings.materialTransparent) {\n mat.alphaMode = this.settings.materialBlendMode;\n } else {\n mat.alphaMode = Constants.ALPHA_DISABLE;\n }\n mat.needDepthPrePass = this.settings.materialDepthWrite;\n mat.forceDepthWrite = this.settings.materialDepthWrite;\n mat.disableDepthWrite = !this.settings.materialDepthWrite;\n\n this.mesh.material = mat;\n this.shaderMaterial = mat;\n }\n\n applyMeshLighting(lighting: MeshLightingSettings): void {\n this.storeFixedLighting(lighting);\n const material = this.shaderMaterial;\n if (material !== null && this.settings.renderMode === RenderMode.Mesh && this.settings.lighting !== 'unlit') {\n this.writeFixedLighting(material);\n }\n }\n\n private storeFixedLighting(lighting: MeshLightingSettings): void {\n this.fixedLightDirection.copyFrom(lighting.direction);\n this.fixedLightColor.set(lighting.color.r, lighting.color.g, lighting.color.b);\n this.fixedAmbientColor.set(lighting.ambient.r, lighting.ambient.g, lighting.ambient.b);\n }\n\n private writeFixedLighting(material: ShaderMaterial): void {\n material.setVector3('lightDirection', this.fixedLightDirection);\n material.setVector3('lightColor', this.fixedLightColor);\n material.setVector3('ambientColor', this.fixedAmbientColor);\n }\n\n /**\n * Reads the scene's key light for `'scene'` mesh lighting: the first\n * enabled directional or hemispheric light, its diffuse colour times its\n * intensity, plus the scene's ambient colour. A hemispheric light lights\n * from its `direction` (which points at the sky) and adds its ground colour\n * to the ambient, which approximates its sky-to-ground blend with the one\n * directional term the shader has. False when there is no such light.\n */\n static readSceneLight(scene: Scene, direction: BVector3, color: BVector3, ambient: BVector3): boolean {\n const lights = scene.lights;\n for (let i = 0; i < lights.length; i++) {\n const light = lights[i];\n const kind = light.getClassName();\n if ((kind !== 'DirectionalLight' && kind !== 'HemisphericLight') || !light.isEnabled()) {\n continue;\n }\n const intensity = light.intensity;\n const diffuse = light.diffuse;\n const sceneAmbient = scene.ambientColor;\n color.set(diffuse.r * intensity, diffuse.g * intensity, diffuse.b * intensity);\n ambient.set(sceneAmbient.r, sceneAmbient.g, sceneAmbient.b);\n const lightDirection = (light as unknown as {direction: BVector3}).direction;\n if (kind === 'DirectionalLight') {\n direction.copyFrom(lightDirection);\n } else {\n direction.copyFrom(lightDirection).scaleInPlace(-1);\n const ground = (light as unknown as {groundColor?: {r: number; g: number; b: number}}).groundColor;\n if (ground) {\n ambient.x += ground.r * intensity;\n ambient.y += ground.g * intensity;\n ambient.z += ground.b * intensity;\n }\n }\n return true;\n }\n return false;\n }\n\n private vector_ = new Vector3();\n private vector2_ = new Vector3();\n private vector3_ = new Vector3();\n private quaternion_ = new Quaternion();\n private quaternion2_ = new Quaternion();\n private quaternion3_ = new Quaternion();\n private quaternion4_ = new Quaternion();\n private quaternion5_ = new Quaternion();\n private rotationMat_ = new Matrix3();\n private rotationMat2_ = new Matrix3();\n private lastStretchedSpeedFactor = Number.NaN;\n /** Slot 0 holds the zero-alpha instance since the batch last went empty. */\n private clearedInstanceUploaded = false;\n\n update(): void {\n let index = 0;\n let particleCount = 0;\n const renderMode = this.settings.renderMode;\n const isMeshRender = renderMode === RenderMode.Mesh;\n const isStretchedRender = renderMode === RenderMode.StretchedBillBoard;\n const flipsSprites = SpriteBatch.takesPivotAndFlip(renderMode);\n\n const visibleSystems = this.getVisibleSystems();\n for (let i = 0; i < visibleSystems.length; i++) {\n particleCount += visibleSystems[i].particleNum;\n }\n if (particleCount > this.maxParticles) {\n this.expandBuffers(particleCount);\n }\n\n for (let s = 0; s < visibleSystems.length; s++) {\n const system = visibleSystems[s];\n const particleNum = system.particleNum;\n // A finished or between-bursts system adds nothing to the batch. With many effects\n // loaded most systems are idle at any moment, so skip their per-system setup.\n if (particleNum === 0) {\n continue;\n }\n const particles = system.particles;\n const rotation = this.quaternion2_;\n const translation = this.vector2_;\n const scale = this.vector3_;\n const systemWorldSpace = system.worldSpace;\n const emitterMatrix = system.emitter.matrixWorld;\n // Only a local-space mesh needs the emitter's turn as a quaternion, and only a\n // local-space stretched billboard its rotation matrix. Everything else needs at most\n // the scale, which the basis column lengths give without a full decompose.\n if (isMeshRender && !systemWorldSpace) {\n emitterMatrix.decompose(translation, rotation, scale);\n } else {\n const e = emitterMatrix.elements;\n scale.set(\n Math.sqrt(e[0] * e[0] + e[1] * e[1] + e[2] * e[2]),\n Math.sqrt(e[4] * e[4] + e[5] * e[5] + e[6] * e[6]),\n Math.sqrt(e[8] * e[8] + e[9] * e[9] + e[10] * e[10])\n );\n }\n if (isStretchedRender && !systemWorldSpace) {\n this.rotationMat_.setFromMatrix4(emitterMatrix);\n }\n const absScaleX = Math.abs(scale.x);\n const absScaleY = Math.abs(scale.y);\n const absScaleZ = Math.abs(scale.z);\n // Stretched-billboard settings are per system, not per particle.\n const stretchedSettings = isStretchedRender\n ? (system.rendererEmitterSettings as StretchedBillBoardSettings)\n : undefined;\n const speedFactor =\n stretchedSettings === undefined || stretchedSettings.speedFactor === 0\n ? 0.001\n : stretchedSettings.speedFactor;\n const lengthFactor = stretchedSettings?.lengthFactor ?? 0;\n\n // Live particles occupy store rows [0, particleNum) in the same order\n // this loop writes them, so attributes that need no per-particle\n // transform can be copied as one range instead of gathered.\n const store = system.store;\n const copiedColor = store !== undefined;\n // Particles only carry their own parent transform when the system\n // emits through another one; otherwise the whole range shares the\n // emitter's matrix and can be transformed in place after the copy.\n const sharedTransform = store !== undefined && system.onlyUsedByOther !== true;\n // The simulation runs on a fixed step that the display does not\n // share, so the last step is usually in the past by the time the\n // frame is drawn. Continuing the motion that step produced puts each\n // particle where it belongs now; without it they visibly stutter on\n // any display that is not exactly 60Hz and in phase.\n //\n // The motion is measured, not predicted from velocity: plenty of\n // behaviors move a particle by writing its position — orbits, noise,\n // turbulence, anything a plugin does — and a velocity based guess\n // leaves every one of those stuttering exactly as before.\n const residual = system.simulationResidual ?? 0;\n const stepFraction = residual === 0 ? 0 : residual / (system.simulationStep ?? residual);\n if (copiedColor) {\n // An aliased previous column means nothing changed since the\n // step; the copy is then the carried value.\n if (stepFraction !== 0 && particleNum > 0 && store!.previousColor !== store!.color) {\n SpriteBatch.continueColor(this.colorBuffer, index * 4, store!, particleNum, stepFraction);\n } else {\n this.colorBuffer.set(store!.color.subarray(0, particleNum * 4), index * 4);\n }\n }\n let copiedPositionAndSize = false;\n if (store !== undefined && systemWorldSpace) {\n if (stepFraction !== 0 && particleNum > 0) {\n SpriteBatch.extrapolate(this.offsetBuffer, index * 3, store, particleNum, stepFraction);\n } else {\n this.offsetBuffer.set(store.position.subarray(0, particleNum * 3), index * 3);\n }\n if (stepFraction !== 0 && particleNum > 0 && store.previousSize !== store.size) {\n SpriteBatch.continueVector3(\n this.sizeBuffer,\n index * 3,\n store.size,\n store.previousSize,\n particleNum,\n stepFraction\n );\n } else {\n this.sizeBuffer.set(store.size.subarray(0, particleNum * 3), index * 3);\n }\n copiedPositionAndSize = true;\n } else if (sharedTransform && particleNum > 0) {\n const base = index * 3;\n const end = base + particleNum * 3;\n const offsets = this.offsetBuffer;\n if (stepFraction !== 0) {\n SpriteBatch.extrapolate(offsets, base, store!, particleNum, stepFraction);\n } else {\n offsets.set(store!.position.subarray(0, particleNum * 3), base);\n }\n const me = emitterMatrix.elements;\n const m00 = me[0],\n m01 = me[1],\n m02 = me[2],\n m03 = me[3];\n const m10 = me[4],\n m11 = me[5],\n m12 = me[6],\n m13 = me[7];\n const m20 = me[8],\n m21 = me[9],\n m22 = me[10],\n m23 = me[11];\n const m30 = me[12],\n m31 = me[13],\n m32 = me[14],\n m33 = me[15];\n for (let o = base; o < end; o += 3) {\n const px = offsets[o];\n const py = offsets[o + 1];\n const pz = offsets[o + 2];\n const w = 1 / (m03 * px + m13 * py + m23 * pz + m33);\n offsets[o] = (m00 * px + m10 * py + m20 * pz + m30) * w;\n offsets[o + 1] = (m01 * px + m11 * py + m21 * pz + m31) * w;\n offsets[o + 2] = (m02 * px + m12 * py + m22 * pz + m32) * w;\n }\n const sizes = this.sizeBuffer;\n if (stepFraction !== 0 && store!.previousSize !== store!.size) {\n SpriteBatch.continueVector3(\n sizes,\n base,\n store!.size,\n store!.previousSize,\n particleNum,\n stepFraction\n );\n } else {\n sizes.set(store!.size.subarray(0, particleNum * 3), base);\n }\n for (let o = base; o < end; o += 3) {\n sizes[o] *= absScaleX;\n sizes[o + 1] *= absScaleY;\n sizes[o + 2] *= absScaleZ;\n }\n copiedPositionAndSize = true;\n }\n\n const firstIndex = index;\n // Every particle of a system that emits for itself shares the emitter's transform and,\n // outside mesh mode, rotates by an angle: its scalar attributes are then store columns\n // and go to the buffers as ranges. Only meshes (quaternion rotations) and particles that\n // carry their own parent transform still need to be visited one by one.\n if (sharedTransform && !isMeshRender) {\n const columns = store!;\n this.uvTileBuffer.set(columns.uvTile.subarray(0, particleNum), firstIndex);\n const rotations = this.rotationBuffer;\n rotations.set(columns.rotation.subarray(0, particleNum), firstIndex);\n if (residual !== 0) {\n // Carry the spin on by the time since the last step, as the\n // per-particle path does.\n const rates = columns.angularVelocity;\n for (let j = 0; j < particleNum; j++) {\n rotations[firstIndex + j] += rates[j] * residual;\n }\n }\n if (isStretchedRender && this.velocityBuffer) {\n SpriteBatch.writeVelocities(\n this.velocityBuffer,\n firstIndex * 4,\n columns,\n particleNum,\n stepFraction,\n systemWorldSpace ? null : this.rotationMat_,\n speedFactor,\n lengthFactor\n );\n }\n index += particleNum;\n } else if (sharedTransform && store!.rotationQuaternion.length > 0) {\n // Meshes rotate by quaternion, kept in the store too: turn them in\n // bulk, by the emitter's rotation when the system is local.\n const columns = store!;\n this.uvTileBuffer.set(columns.uvTile.subarray(0, particleNum), firstIndex);\n SpriteBatch.writeQuaternions(\n this.rotationBuffer,\n firstIndex * 4,\n columns,\n particleNum,\n stepFraction,\n systemWorldSpace ? null : rotation\n );\n index += particleNum;\n } else {\n for (let j = 0; j < particleNum; j++, index++) {\n const particle = particles[j] as SpriteParticle;\n\n if (isMeshRender) {\n // Turning behaviors leave the last step's turn on the\n // particle; a fraction of it carries the mesh the rest of\n // the way to now.\n let own = particle.rotation as Quaternion;\n const step = particle.angularVelocity;\n if (stepFraction !== 0 && step instanceof Quaternion) {\n own = this.quaternion4_\n .copy(own)\n .multiply(SpriteBatch.partialTurn(step, stepFraction, this.quaternion5_));\n }\n let q: Quaternion;\n if (systemWorldSpace) {\n q = own;\n } else {\n let parentQ: Quaternion;\n if (particle.parentMatrix) {\n parentQ = this.quaternion3_.setFromRotationMatrix(particle.parentMatrix);\n } else {\n parentQ = rotation;\n }\n q = this.quaternion_;\n q.copy(parentQ).multiply(own);\n }\n const ri = index * 4;\n this.rotationBuffer[ri] = q.x;\n this.rotationBuffer[ri + 1] = q.y;\n this.rotationBuffer[ri + 2] = q.z;\n this.rotationBuffer[ri + 3] = q.w;\n } else {\n const spin = particle.angularVelocity;\n this.rotationBuffer[index] =\n (particle.rotation as number) + (typeof spin === 'number' ? spin * residual : 0);\n }\n\n if (!copiedPositionAndSize) {\n const position = particle.position;\n const previous = particle.previousPosition;\n let px = position.x + (position.x - previous.x) * stepFraction;\n let py = position.y + (position.y - previous.y) * stepFraction;\n let pz = position.z + (position.z - previous.z) * stepFraction;\n if (!systemWorldSpace) {\n // Inlined point transform: this is the default (local space)\n // path and runs for every particle every frame.\n const me = (particle.parentMatrix ?? emitterMatrix).elements;\n const w = 1 / (me[3] * px + me[7] * py + me[11] * pz + me[15]);\n const tx = (me[0] * px + me[4] * py + me[8] * pz + me[12]) * w;\n const ty = (me[1] * px + me[5] * py + me[9] * pz + me[13]) * w;\n pz = (me[2] * px + me[6] * py + me[10] * pz + me[14]) * w;\n px = tx;\n py = ty;\n }\n\n const oi = index * 3;\n this.offsetBuffer[oi] = px;\n this.offsetBuffer[oi + 1] = py;\n this.offsetBuffer[oi + 2] = pz;\n\n const size = particle.size;\n const si = index * 3;\n // Particle size is already in world units when the system is in world\n // space or the particle carries its own parent transform.\n if (systemWorldSpace || particle.parentMatrix) {\n this.sizeBuffer[si] = size.x;\n this.sizeBuffer[si + 1] = size.y;\n this.sizeBuffer[si + 2] = size.z;\n } else {\n this.sizeBuffer[si] = size.x * absScaleX;\n this.sizeBuffer[si + 1] = size.y * absScaleY;\n this.sizeBuffer[si + 2] = size.z * absScaleZ;\n }\n }\n\n if (!copiedColor) {\n const color = particle.color;\n const ci = index * 4;\n this.colorBuffer[ci] = color.x;\n this.colorBuffer[ci + 1] = color.y;\n this.colorBuffer[ci + 2] = color.z;\n this.colorBuffer[ci + 3] = color.w;\n }\n\n this.uvTileBuffer[index] = particle.uvTile;\n\n if (isStretchedRender && this.velocityBuffer) {\n // The streak points along the velocity and is as long as it,\n // so a velocity frozen between steps makes the sprite's\n // outline pop at the step rate while its position glides.\n const velocity = particle.velocity;\n const previousVelocity = particle.previousVelocity;\n const vx = velocity.x + (velocity.x - previousVelocity.x) * stepFraction;\n const vy = velocity.y + (velocity.y - previousVelocity.y) * stepFraction;\n const vz = velocity.z + (velocity.z - previousVelocity.z) * stepFraction;\n let vel: Vector3 = this.vector_;\n vel.set(vx, vy, vz);\n if (!systemWorldSpace) {\n if (particle.parentMatrix) {\n this.rotationMat2_.setFromMatrix4(particle.parentMatrix);\n vel.applyMatrix3(this.rotationMat2_);\n } else {\n vel.applyMatrix3(this.rotationMat_);\n }\n }\n const vi = index * 4;\n this.velocityBuffer[vi] = vel.x * speedFactor;\n this.velocityBuffer[vi + 1] = vel.y * speedFactor;\n this.velocityBuffer[vi + 2] = vel.z * speedFactor;\n this.velocityBuffer[vi + 3] = lengthFactor;\n }\n }\n }\n\n if (flipsSprites && system.flip !== undefined) {\n if (store !== undefined) {\n SpriteBatch.applyFlip(this.sizeBuffer, firstIndex * 3, store.flip, particleNum);\n } else {\n SpriteBatch.applyFlipFromParticles(this.sizeBuffer, firstIndex * 3, particles, particleNum);\n }\n }\n }\n\n if (isStretchedRender && visibleSystems.length > 0) {\n this.syncStretchedSpeedFactor(visibleSystems[0]);\n }\n\n // Keep the mesh enabled even when count is 0 — toggling visibility off for a\n // single frame (common with short lifetimes + low emission overlap) causes flicker.\n this.mesh.forcedInstanceCount = index;\n\n if (index === 0) {\n // Slot 0 only needs clearing once per stretch of empty frames; re-uploading it every\n // frame cost five buffer uploads per idle batch per frame.\n if (!this.clearedInstanceUploaded) {\n this.uploadClearedInstance(isMeshRender, isStretchedRender);\n this.clearedInstanceUploaded = true;\n }\n return;\n }\n this.clearedInstanceUploaded = false;\n\n // Upload only the slots actually filled this frame: the buffers are sized\n // for the high-water mark and are usually far larger than the live count.\n this.offsetVB.update(this.offsetBuffer.subarray(0, index * 3));\n this.sizeVB.update(this.sizeBuffer.subarray(0, index * 3));\n this.colorVB.update(this.colorBuffer.subarray(0, index * 4));\n this.uvTileVB.update(this.uvTileBuffer.subarray(0, index));\n this.rotationVB.update(this.rotationBuffer.subarray(0, isMeshRender ? index * 4 : index));\n if (isStretchedRender && this.velocityVB && this.velocityBuffer) {\n this.velocityVB.update(this.velocityBuffer.subarray(0, index * 4));\n }\n }\n\n /**\n * Pushes the stretched-billboard speed factor to the shader when it changed.\n *\n * Deliberately kept out of `update`: touching the loosely typed\n * `mesh.material` from inside that function gives V8 a generic property\n * access it has no feedback for, which knocks the whole particle loop out of\n * optimised code on every frame.\n */\n private syncStretchedSpeedFactor(system: IParticleSystem): void {\n const material = this.shaderMaterial;\n if (material === null) {\n return;\n }\n const speedFactor = (system.rendererEmitterSettings as StretchedBillBoardSettings).speedFactor ?? 1.0;\n const clampedSpeedFactor = speedFactor === 0 ? 0.001 : speedFactor;\n if (clampedSpeedFactor !== this.lastStretchedSpeedFactor) {\n material.setFloat('speedFactor', clampedSpeedFactor);\n this.lastStretchedSpeedFactor = clampedSpeedFactor;\n }\n }\n\n /** The quads that take a pivot and flip: every billboard kind, stretched included, but not meshes. */\n private static takesPivotAndFlip(renderMode: RenderMode): boolean {\n return (\n renderMode === RenderMode.BillBoard ||\n renderMode === RenderMode.StretchedBillBoard ||\n renderMode === RenderMode.VerticalBillBoard ||\n renderMode === RenderMode.HorizontalBillBoard\n );\n }\n\n /**\n * Negates the size of each flipped particle along the axes it flips on,\n * starting at `base` in `sizes`. The billboard shader scales the quad by\n * the size, so a negative one mirrors it — and with it the texture, the\n * quad being centred — the way Unity's renderer Flip mirrors U and V. The\n * stretched shader reads the sign and mirrors the texture coordinates.\n */\n private static applyFlip(sizes: Float32Array, base: number, flips: Uint8Array, count: number): void {\n for (let j = 0, o = base; j < count; j++, o += 3) {\n const flip = flips[j];\n if (flip !== 0) {\n if (flip & 1) sizes[o] = -sizes[o];\n if (flip & 2) sizes[o + 1] = -sizes[o + 1];\n }\n }\n }\n\n /** The same for a system without a store, read off the particles. */\n private static applyFlipFromParticles(\n sizes: Float32Array,\n base: number,\n particles: IParticle[],\n count: number\n ): void {\n for (let j = 0, o = base; j < count; j++, o += 3) {\n const flip = (particles[j] as SpriteParticle).flip;\n if (flip !== 0) {\n if (flip & 1) sizes[o] = -sizes[o];\n if (flip & 2) sizes[o + 1] = -sizes[o + 1];\n }\n }\n }\n\n /**\n * Writes the mesh rotations for rows `[0, count)` of a store: each\n * particle's quaternion, carried on by `fraction` of its last turn (see\n * {@link partialTurn}) and, for a local-space system, turned by the\n * emitter's rotation `parent`.\n */\n private static writeQuaternions(\n target: Float32Array,\n base: number,\n store: ParticleStore,\n count: number,\n fraction: number,\n parent: Quaternion | null\n ): void {\n const rotations = store.rotationQuaternion;\n const turns = store.angularVelocityQuaternion;\n const hasParent = parent !== null;\n const px = hasParent ? parent.x : 0;\n const py = hasParent ? parent.y : 0;\n const pz = hasParent ? parent.z : 0;\n const pw = hasParent ? parent.w : 1;\n for (let i = 0, o = 0, t = base; i < count; i++, o += 4, t += 4) {\n let x = rotations[o];\n let y = rotations[o + 1];\n let z = rotations[o + 2];\n let w = rotations[o + 3];\n if (fraction !== 0) {\n // The fraction of the step's turn, as a normalised lerp from no\n // rotation, then own = own * turn.\n const sx = turns[o] * fraction;\n const sy = turns[o + 1] * fraction;\n const sz = turns[o + 2] * fraction;\n const sw = 1 + (turns[o + 3] - 1) * fraction;\n const inverseLength = 1 / Math.sqrt(sx * sx + sy * sy + sz * sz + sw * sw);\n const tx = sx * inverseLength;\n const ty = sy * inverseLength;\n const tz = sz * inverseLength;\n const tw = sw * inverseLength;\n const nx = x * tw + w * tx + y * tz - z * ty;\n const ny = y * tw + w * ty + z * tx - x * tz;\n const nz = z * tw + w * tz + x * ty - y * tx;\n w = w * tw - x * tx - y * ty - z * tz;\n x = nx;\n y = ny;\n z = nz;\n }\n if (hasParent) {\n // q = parent * own\n const nx = px * w + pw * x + py * z - pz * y;\n const ny = py * w + pw * y + pz * x - px * z;\n const nz = pz * w + pw * z + px * y - py * x;\n w = pw * w - px * x - py * y - pz * z;\n x = nx;\n y = ny;\n z = nz;\n }\n target[t] = x;\n target[t + 1] = y;\n target[t + 2] = z;\n target[t + 3] = w;\n }\n }\n\n /**\n * Writes the stretched billboards' velocity attribute for rows `[0, count)`\n * of a store: the velocity carried on by `fraction` of the last step (see\n * {@link extrapolate}), turned into world space by `rotation` when the\n * system simulates locally, scaled by the speed factor, with the length\n * factor in `w`.\n */\n private static writeVelocities(\n target: Float32Array,\n base: number,\n store: ParticleStore,\n count: number,\n fraction: number,\n rotation: Matrix3 | null,\n speedFactor: number,\n lengthFactor: number\n ): void {\n const velocities = store.velocity;\n // Empty until the first stretched step has run; the velocity then has no history yet.\n const previous = store.previousVelocity.length >= count * 3 ? store.previousVelocity : velocities;\n const e = rotation !== null ? rotation.elements : null;\n for (let i = 0, o = 0, t = base; i < count; i++, o += 3, t += 4) {\n let vx = velocities[o];\n let vy = velocities[o + 1];\n let vz = velocities[o + 2];\n if (fraction !== 0) {\n vx += (vx - previous[o]) * fraction;\n vy += (vy - previous[o + 1]) * fraction;\n vz += (vz - previous[o + 2]) * fraction;\n }\n if (e !== null) {\n const x = e[0] * vx + e[3] * vy + e[6] * vz;\n const y = e[1] * vx + e[4] * vy + e[7] * vz;\n vz = e[2] * vx + e[5] * vy + e[8] * vz;\n vx = x;\n vy = y;\n }\n target[t] = vx * speedFactor;\n target[t + 1] = vy * speedFactor;\n target[t + 2] = vz * speedFactor;\n target[t + 3] = lengthFactor;\n }\n }\n\n /**\n * The fraction `f` of a turn, as a normalised lerp from no rotation toward\n * `step`, written into `out`.\n *\n * A true slerp would be exact, but `step` is one simulation step of turning\n * and `f` is below 1, so the arc being split is small enough that the lerp\n * is within a rounding error of it and costs a fraction as much.\n */\n private static partialTurn(step: Quaternion, f: number, out: Quaternion): Quaternion {\n const x = step.x * f;\n const y = step.y * f;\n const z = step.z * f;\n const w = 1 + (step.w - 1) * f;\n const inverseLength = 1 / Math.sqrt(x * x + y * y + z * z + w * w);\n out.x = x * inverseLength;\n out.y = y * inverseLength;\n out.z = z * inverseLength;\n out.w = w * inverseLength;\n return out;\n }\n\n /**\n * Continues a three-component column by `fraction` of the step it just took,\n * never below zero.\n *\n * Size fades to nothing at the end of a life, so the last step before death\n * can point past zero; a negative size turns a sprite inside out.\n */\n private static continueVector3(\n target: Float32Array,\n base: number,\n current: Float32Array,\n previous: Float32Array,\n count: number,\n fraction: number\n ): void {\n for (let i = 0, o = 0; i < count; i++, o += 3) {\n const x = current[o] + (current[o] - previous[o]) * fraction;\n const y = current[o + 1] + (current[o + 1] - previous[o + 1]) * fraction;\n const z = current[o + 2] + (current[o + 2] - previous[o + 2]) * fraction;\n target[base + o] = x > 0 ? x : 0;\n target[base + o + 1] = y > 0 ? y : 0;\n target[base + o + 2] = z > 0 ? z : 0;\n }\n }\n\n /** The same for colour, whose alpha runs out at the end of a life too. */\n private static continueColor(\n target: Float32Array,\n base: number,\n store: ParticleStore,\n count: number,\n fraction: number\n ): void {\n const current = store.color;\n const previous = store.previousColor;\n for (let i = 0, o = 0; i < count; i++, o += 4) {\n const r = current[o] + (current[o] - previous[o]) * fraction;\n const g = current[o + 1] + (current[o + 1] - previous[o + 1]) * fraction;\n const b = current[o + 2] + (current[o + 2] - previous[o + 2]) * fraction;\n const a = current[o + 3] + (current[o + 3] - previous[o + 3]) * fraction;\n target[base + o] = r > 0 ? r : 0;\n target[base + o + 1] = g > 0 ? g : 0;\n target[base + o + 2] = b > 0 ? b : 0;\n target[base + o + 3] = a > 0 ? a : 0;\n }\n }\n\n /**\n * Writes rows `[0, count)` of the store's positions into `target` at `base`,\n * each carried on by `fraction` of the step it just took.\n *\n * Continuing the measured last step covers every way a particle can move —\n * velocity integration, an orbit, noise, a plugin's own behavior — because\n * it reads what happened rather than predicting from one term of it. Over\n * less than a step it is a straight line through a path that may curve,\n * which for a sixtieth of a second is well under a pixel.\n *\n * A particle born during the step has the same position on both sides and\n * so does not move at all, which is what puts it at the emitter rather than\n * a step's travel away from it.\n */\n private static extrapolate(\n target: Float32Array,\n base: number,\n store: ParticleStore,\n count: number,\n fraction: number\n ): void {\n const positions = store.position;\n const previous = store.previousPosition;\n for (let i = 0, o = 0; i < count; i++, o += 3) {\n const x = positions[o];\n const y = positions[o + 1];\n const z = positions[o + 2];\n target[base + o] = x + (x - previous[o]) * fraction;\n target[base + o + 1] = y + (y - previous[o + 1]) * fraction;\n target[base + o + 2] = z + (z - previous[o + 2]) * fraction;\n }\n }\n\n /** Pushes a zero-alpha instance so stale instancing data cannot linger on screen. */\n private uploadClearedInstance(isMeshRender: boolean, isStretchedRender: boolean): void {\n this.colorBuffer[3] = 0;\n this.sizeBuffer[0] = 0;\n this.sizeBuffer[1] = 0;\n this.sizeBuffer[2] = 0;\n this.colorVB.update(this.colorBuffer.subarray(0, 4));\n this.sizeVB.update(this.sizeBuffer.subarray(0, 3));\n this.offsetVB.update(this.offsetBuffer.subarray(0, 3));\n this.uvTileVB.update(this.uvTileBuffer.subarray(0, 1));\n if (isMeshRender) {\n this.rotationVB.update(this.rotationBuffer.subarray(0, 4));\n } else {\n this.rotationVB.update(this.rotationBuffer.subarray(0, 1));\n }\n if (isStretchedRender && this.velocityVB && this.velocityBuffer) {\n this.velocityVB.update(this.velocityBuffer.subarray(0, 4));\n }\n }\n\n dispose(): void {\n if (this.mesh.material) {\n this.mesh.material.dispose();\n }\n super.dispose();\n }\n}\n","export default /* wgsl */ `\nattribute position: vec3f;\nattribute uv: vec2f;\nattribute normal: vec3f;\nattribute offset: vec3f;\nattribute color: vec4f;\nattribute size: vec3f;\nattribute rotation: vec4f;\nattribute uvTile: f32;\n\nuniform world: mat4x4f;\nuniform view: mat4x4f;\nuniform projection: mat4x4f;\n\n#ifdef UV_TILE\nuniform tileCountX: f32;\nuniform tileCountY: f32;\n#endif\n\nvarying vUV: vec2f;\nvarying vColor: vec4f;\nvarying vNormal: vec3f;\nvarying vWorldPos: vec3f;\n\n#ifdef TILE_BLEND\nvarying vUV2: vec2f;\nvarying vTileBlend: f32;\n#endif\n\n#ifdef SOFT_PARTICLES\nvarying projPosition: vec4f;\nvarying linearDepth: f32;\n#endif\n\nfn applyQuaternion(v: vec3f, q: vec4f) -> vec3f {\n let qVec = q.xyz;\n let qW = q.w;\n let t = 2.0 * cross(qVec, v);\n return v + qW * t + cross(qVec, t);\n}\n\n@vertex\nfn main(input: VertexInputs) -> FragmentInputs {\n let scaledPosition = vertexInputs.position * vertexInputs.size;\n let rotatedPosition = applyQuaternion(scaledPosition, vertexInputs.rotation);\n let rotatedNormal = normalize(applyQuaternion(vertexInputs.normal, vertexInputs.rotation));\n let localPos = rotatedPosition + vertexInputs.offset;\n\n let worldPos = uniforms.world * vec4f(localPos, 1.0);\n let viewPos = uniforms.view * worldPos;\n let clipPosition = uniforms.projection * viewPos;\n vertexOutputs.position = clipPosition;\n\n vertexOutputs.vWorldPos = worldPos.xyz;\n vertexOutputs.vNormal = normalize((uniforms.world * vec4f(rotatedNormal, 0.0)).xyz);\n\n#ifdef SOFT_PARTICLES\n vertexOutputs.projPosition = clipPosition;\n vertexOutputs.linearDepth = -viewPos.z;\n#endif\n\n#ifdef UV_TILE\n let tc = vec2f(uniforms.tileCountX, uniforms.tileCountY);\n let baseTile = floor(vertexInputs.uvTile);\n let tileU = (baseTile % tc.x) / tc.x;\n let tileV = 1.0 - floor(baseTile / tc.x) / tc.y - 1.0 / tc.y;\n vertexOutputs.vUV = vertexInputs.uv / tc + vec2f(tileU, tileV);\n #ifdef TILE_BLEND\n let nextTile = ceil(vertexInputs.uvTile);\n let nextU = (nextTile % tc.x) / tc.x;\n let nextV = 1.0 - floor(nextTile / tc.x) / tc.y - 1.0 / tc.y;\n vertexOutputs.vUV2 = vertexInputs.uv / tc + vec2f(nextU, nextV);\n vertexOutputs.vTileBlend = fract(vertexInputs.uvTile);\n #endif\n#else\n vertexOutputs.vUV = vertexInputs.uv;\n#endif\n\n vertexOutputs.vColor = vertexInputs.color;\n}\n`;\n","export default /* wgsl */ `\nvarying vUV: vec2f;\nvarying vColor: vec4f;\nvarying vNormal: vec3f;\nvarying vWorldPos: vec3f;\n\n#ifndef MESH_UNLIT\nuniform lightDirection: vec3f;\nuniform lightColor: vec3f;\nuniform ambientColor: vec3f;\n#endif\n\n#ifdef TILE_BLEND\nvarying vUV2: vec2f;\nvarying vTileBlend: f32;\n#endif\n\n#ifdef USE_MAP\nvar mapSampler: sampler;\nvar map: texture_2d<f32>;\n#endif\n\n#if defined(USE_ENVMAP_ATLAS) || defined(MESH_RIM)\nuniform eyePosition: vec3f;\n#endif\n\n#ifdef MESH_RIM\nuniform rimColor: vec3f;\nuniform rimParams: vec2f;\n#endif\n\n#ifdef USE_ENVMAP_ATLAS\nvar envAtlasSampler: sampler;\nvar envAtlas: texture_2d<f32>;\nuniform reflectionLevel: f32;\n\nfn sampleEnvAtlas(r: vec3f) -> vec3f {\n let a = abs(r);\n var localUV: vec2f;\n var cellX: f32;\n var cellY: f32;\n if (a.x >= a.y && a.x >= a.z) {\n cellX = 0.0;\n if (r.x >= 0.0) {\n cellY = 0.0;\n localUV = vec2f(-r.z, -r.y) / a.x * 0.5 + 0.5;\n } else {\n cellY = 1.0;\n localUV = vec2f(r.z, -r.y) / a.x * 0.5 + 0.5;\n }\n } else if (a.y >= a.z) {\n cellX = 1.0;\n if (r.y >= 0.0) {\n cellY = 0.0;\n localUV = vec2f(r.x, r.z) / a.y * 0.5 + 0.5;\n } else {\n cellY = 1.0;\n localUV = vec2f(r.x, -r.z) / a.y * 0.5 + 0.5;\n }\n } else {\n cellX = 2.0;\n if (r.z >= 0.0) {\n cellY = 0.0;\n localUV = vec2f(r.x, -r.y) / a.z * 0.5 + 0.5;\n } else {\n cellY = 1.0;\n localUV = vec2f(-r.x, -r.y) / a.z * 0.5 + 0.5;\n }\n }\n let uv = (vec2f(cellX, cellY) + clamp(localUV, vec2f(0.0), vec2f(1.0))) / vec2f(3.0, 2.0);\n return textureSample(envAtlas, envAtlasSampler, uv).rgb;\n}\n#endif\n\n#ifdef SOFT_PARTICLES\nvar depthTextureSampler: sampler;\nvar depthTexture: texture_2d<f32>;\nuniform softParams: vec2f;\nuniform projParams: vec4f;\nvarying projPosition: vec4f;\nvarying linearDepth: f32;\n#endif\n\n#ifdef USE_ALPHATEST\nuniform alphaTest: f32;\n#endif\n\n@fragment\nfn main(input: FragmentInputs) -> FragmentOutputs {\n var baseColor = fragmentInputs.vColor;\n\n#ifdef USE_MAP\n var texColor = textureSample(map, mapSampler, fragmentInputs.vUV);\n #ifdef TILE_BLEND\n let texColor2 = textureSample(map, mapSampler, fragmentInputs.vUV2);\n texColor = mix(texColor, texColor2, fragmentInputs.vTileBlend);\n #endif\n baseColor *= texColor;\n#endif\n\n#ifdef USE_ALPHATEST\n if (baseColor.a < uniforms.alphaTest) { discard; }\n#else\n if (baseColor.a < 0.01) { discard; }\n#endif\n\n let N = normalize(fragmentInputs.vNormal);\n#ifdef MESH_UNLIT\n var color = baseColor.rgb;\n#else\n let L = normalize(-uniforms.lightDirection);\n let NdotL = max(dot(N, L), 0.0);\n let litColor = uniforms.ambientColor + uniforms.lightColor * NdotL;\n\n var color = baseColor.rgb * litColor;\n#endif\n\n#ifdef USE_ENVMAP_ATLAS\n let viewDir = normalize(fragmentInputs.vWorldPos - uniforms.eyePosition);\n let reflectionCoords = reflect(viewDir, N);\n color += sampleEnvAtlas(reflectionCoords) * uniforms.reflectionLevel;\n#endif\n\n#ifdef MESH_RIM\n // Fresnel: strongest where the surface turns away from the camera.\n let V = normalize(uniforms.eyePosition - fragmentInputs.vWorldPos);\n let rimTerm = pow(1.0 - abs(dot(N, V)), uniforms.rimParams.x) * uniforms.rimParams.y;\n #ifdef MESH_RIM_MIX\n color = mix(color, uniforms.rimColor, clamp(rimTerm, 0.0, 1.0));\n #else\n color += uniforms.rimColor * rimTerm;\n #endif\n#endif\n\n var finalColor = vec4f(color, baseColor.a);\n\n#ifdef SOFT_PARTICLES\n var p2 = fragmentInputs.projPosition.xy / fragmentInputs.projPosition.w;\n p2 = 0.5 * p2 + 0.5;\n let readDepth = textureSample(depthTexture, depthTextureSampler, p2).r;\n let zNear = uniforms.projParams.x;\n let zFar = uniforms.projParams.y;\n let viewDepth = (zFar * zNear) / (zFar - readDepth * (zFar - zNear));\n let fade = clamp(uniforms.softParams.y * ((viewDepth - uniforms.softParams.x) - fragmentInputs.linearDepth), 0.0, 1.0);\n finalColor *= fade;\n#endif\n\n fragmentOutputs.color = finalColor;\n}\n`;\n","export default /* wgsl */ `\n// Per-vertex attributes\nattribute position: vec3f;\nattribute uv: vec2f;\n\n// Per-instance attributes\nattribute offset: vec3f;\nattribute color: vec4f;\nattribute size: vec3f;\nattribute rotation: f32;\nattribute uvTile: f32;\n\n// Uniforms\nuniform world: mat4x4f;\nuniform view: mat4x4f;\nuniform projection: mat4x4f;\n\n#ifdef UV_TILE\nuniform tileCountX: f32;\nuniform tileCountY: f32;\n#endif\n\n#ifdef PIVOT\n// Quad offset in particle-size units: xy in the quad's plane, z toward the camera.\nuniform pivot: vec3f;\n#endif\n\n// Varyings\nvarying vUV: vec2f;\nvarying vColor: vec4f;\n#ifdef TILE_BLEND\nvarying vUV2: vec2f;\nvarying vTileBlend: f32;\n#endif\n#ifdef SOFT_PARTICLES\nvarying projPosition: vec4f;\nvarying linearDepth: f32;\n#endif\n\n@vertex\nfn main(input: VertexInputs) -> FragmentInputs {\n let c = cos(vertexInputs.rotation);\n let s = sin(vertexInputs.rotation);\n\n // A negative size mirrors the quad, which is how flipped particles arrive.\n var alignedPosition = vertexInputs.position.xy * vertexInputs.size.xy;\n#ifdef PIVOT\n // The pivot turns with the particle but is not mirrored with it.\n alignedPosition += uniforms.pivot.xy * abs(vertexInputs.size.xy);\n#endif\n let rotatedPosition = vec2f(\n c * alignedPosition.x - s * alignedPosition.y,\n s * alignedPosition.x + c * alignedPosition.y);\n\n#ifdef HORIZONTAL\n var mvPosition = uniforms.world * vec4f(vertexInputs.offset, 1.0);\n mvPosition.x += rotatedPosition.x;\n mvPosition.z -= rotatedPosition.y;\n#ifdef PIVOT\n mvPosition.y += uniforms.pivot.z * abs(vertexInputs.size.x);\n#endif\n mvPosition = uniforms.view * mvPosition;\n#elif defined(VERTICAL)\n var mvPosition = uniforms.world * vec4f(vertexInputs.offset, 1.0);\n mvPosition.y += rotatedPosition.y;\n mvPosition = uniforms.view * mvPosition;\n mvPosition.x += rotatedPosition.x;\n#else\n var mvPosition = uniforms.view * uniforms.world * vec4f(vertexInputs.offset, 1.0);\n mvPosition.x += rotatedPosition.x;\n mvPosition.y += rotatedPosition.y;\n#endif\n#ifdef PIVOT\n#ifndef HORIZONTAL\n // Toward the camera along its view axis, whichever way the view space\n // faces: anything in front of the camera has the sign of the far side.\n mvPosition.z -= sign(mvPosition.z) * uniforms.pivot.z * abs(vertexInputs.size.x);\n#endif\n#endif\n\n let clipPosition = uniforms.projection * mvPosition;\n vertexOutputs.position = clipPosition;\n#ifdef SOFT_PARTICLES\n vertexOutputs.projPosition = clipPosition;\n vertexOutputs.linearDepth = -mvPosition.z;\n#endif\n\n #ifdef UV_TILE\n let tc = vec2f(uniforms.tileCountX, uniforms.tileCountY);\n let baseTile = floor(vertexInputs.uvTile);\n let tileU = (baseTile % tc.x) / tc.x;\n let tileV = 1.0 - floor(baseTile / tc.x) / tc.y - 1.0 / tc.y;\n vertexOutputs.vUV = vertexInputs.uv / tc + vec2f(tileU, tileV);\n #ifdef TILE_BLEND\n let nextTile = ceil(vertexInputs.uvTile);\n let nextU = (nextTile % tc.x) / tc.x;\n let nextV = 1.0 - floor(nextTile / tc.x) / tc.y - 1.0 / tc.y;\n vertexOutputs.vUV2 = vertexInputs.uv / tc + vec2f(nextU, nextV);\n vertexOutputs.vTileBlend = fract(vertexInputs.uvTile);\n #endif\n #else\n vertexOutputs.vUV = vertexInputs.uv;\n #endif\n\n vertexOutputs.vColor = vertexInputs.color;\n}\n`;\n","import {VertexBuffer} from '@babylonjs/core/Buffers/buffer';\nimport {BoundingInfo} from '@babylonjs/core/Culling/boundingInfo';\nimport {Constants} from '@babylonjs/core/Engines/constants';\nimport {ShaderMaterial} from '@babylonjs/core/Materials/shaderMaterial';\nimport {Vector2 as BVector2, Vector3 as BVector3} from '@babylonjs/core/Maths/math.vector';\nimport {Mesh} from '@babylonjs/core/Meshes/mesh';\nimport {Scene} from '@babylonjs/core/scene';\nimport {IParticleSystem, Matrix4, Quaternion, TrailParticle, TrailSettings, Vector3} from 'quarks.core';\nimport {VFXBatchSettings} from './BatchedRenderer';\nimport {registerShaders, shaderLanguageFor} from './shaders/shaderLanguageSupport';\nimport trail_frag from './shaders/trail_frag.glsl';\nimport trail_frag_wgsl from './shaders/trail_frag.wgsl';\nimport trail_vert from './shaders/trail_vert.glsl';\nimport trail_vert_wgsl from './shaders/trail_vert.wgsl';\nimport {VFXBatch} from './VFXBatch';\n\nexport class TrailBatch extends VFXBatch {\n private positionBuffer!: Float32Array;\n private previousBuffer!: Float32Array;\n private nextBuffer!: Float32Array;\n private uvBuffer!: Float32Array;\n private sideBuffer!: Float32Array;\n private widthBuffer!: Float32Array;\n private colorBuffer!: Float32Array;\n private indexBuffer!: Uint32Array;\n /** True while the batch is parked on the degenerate draw, see uploadGeometry. */\n private drawsNothing = false;\n private previousVB!: VertexBuffer;\n private nextVB!: VertexBuffer;\n private sideVB!: VertexBuffer;\n private widthVB!: VertexBuffer;\n\n constructor(settings: VFXBatchSettings, scene: Scene) {\n super(settings, scene);\n // Trail buffers hold two vertices per recorded sample and are the largest\n // per-batch allocation in the library, so start small and let\n // expandBuffers grow to whatever the batch actually needs.\n this.maxParticles = 1024;\n this.setupBuffers();\n this.rebuildMaterial();\n }\n\n setupBuffers(): void {\n this.mesh.dispose();\n this.mesh = new Mesh('trailBatch', this.scene);\n this.mesh.alwaysSelectAsActiveMesh = true;\n this.buildGeometryBuffers();\n }\n\n private buildGeometryBuffers(): void {\n this.positionBuffer = new Float32Array(this.maxParticles * 6);\n this.previousBuffer = new Float32Array(this.maxParticles * 6);\n this.nextBuffer = new Float32Array(this.maxParticles * 6);\n this.uvBuffer = new Float32Array(this.maxParticles * 4);\n this.sideBuffer = new Float32Array(this.maxParticles * 2);\n this.widthBuffer = new Float32Array(this.maxParticles * 2);\n this.colorBuffer = new Float32Array(this.maxParticles * 8);\n this.indexBuffer = new Uint32Array(this.maxParticles * 6);\n // Vertices come in pairs, one per side of the ribbon, so the side never\n // changes: written once here and never uploaded again.\n for (let i = 0; i < this.sideBuffer.length; i += 2) {\n this.sideBuffer[i] = 1;\n this.sideBuffer[i + 1] = -1;\n }\n\n // Initialize with full-capacity buffers (updatable) and a dummy triangle\n this.positionBuffer[0] = 0;\n this.positionBuffer[1] = 0;\n this.positionBuffer[2] = 0;\n this.positionBuffer[3] = 1;\n this.positionBuffer[4] = 0;\n this.positionBuffer[5] = 0;\n this.positionBuffer[6] = 0;\n this.positionBuffer[7] = 1;\n this.positionBuffer[8] = 0;\n this.positionBuffer[9] = 1;\n this.positionBuffer[10] = 1;\n this.positionBuffer[11] = 0;\n this.indexBuffer[0] = 0;\n this.indexBuffer[1] = 1;\n this.indexBuffer[2] = 2;\n this.indexBuffer[3] = 1;\n this.indexBuffer[4] = 3;\n this.indexBuffer[5] = 2;\n\n // Set standard vertex data with full buffer capacity (updatable)\n this.mesh.setVerticesData(VertexBuffer.PositionKind, this.positionBuffer, true);\n this.mesh.setVerticesData(VertexBuffer.UVKind, this.uvBuffer, true);\n this.mesh.setVerticesData(VertexBuffer.ColorKind, this.colorBuffer, true, 4);\n // The whole array, not just the dummy triangle: this call is what sizes\n // the GPU index buffer, and updateIndices later writes into it without\n // resizing it. Handing it six indices here left a 24 byte buffer that\n // every later frame overran — WebGL tolerated it, WebGPU rejects the\n // draw outright (\"index range does not fit in index buffer size\").\n // The vertex buffers above are already created at full capacity; this\n // was the one that was not.\n this.mesh.setIndices(this.indexBuffer, null, true);\n this.drawsNothing = false;\n if (this.mesh.subMeshes && this.mesh.subMeshes.length > 0) {\n // Until the first update, only the dummy triangle is real.\n this.mesh.subMeshes[0].indexCount = 6;\n }\n const engine = this.scene.getEngine();\n this.previousVB = new VertexBuffer(engine, this.previousBuffer, 'previous', true, false, 3, false);\n this.nextVB = new VertexBuffer(engine, this.nextBuffer, 'next', true, false, 3, false);\n this.sideVB = new VertexBuffer(engine, this.sideBuffer, 'side', true, false, 1, false);\n this.widthVB = new VertexBuffer(engine, this.widthBuffer, 'width', true, false, 1, false);\n this.mesh.setVerticesBuffer(this.previousVB);\n this.mesh.setVerticesBuffer(this.nextVB);\n this.mesh.setVerticesBuffer(this.sideVB);\n this.mesh.setVerticesBuffer(this.widthVB);\n\n // Disable bounding info recomputation\n this.mesh.doNotSyncBoundingInfo = true;\n const min = new BVector3(-10000, -10000, -10000);\n const max = new BVector3(10000, 10000, 10000);\n this.mesh.setBoundingInfo(new BoundingInfo(min, max));\n if (this.mesh.subMeshes) {\n for (const sub of this.mesh.subMeshes) {\n (sub as any)._boundingInfo = this.mesh.getBoundingInfo();\n }\n }\n }\n\n expandBuffers(target: number): void {\n while (target >= this.maxParticles) {\n this.maxParticles *= 2;\n }\n // Release the previous custom attribute buffers; setVerticesBuffer only\n // replaces the reference, so skipping this leaks GPU memory on every grow.\n this.previousVB?.dispose();\n this.nextVB?.dispose();\n this.sideVB?.dispose();\n this.widthVB?.dispose();\n this.buildGeometryBuffers();\n }\n\n rebuildMaterial(): void {\n // Stable name: the trail shader source never varies, so registering it once\n // keeps Effect.ShadersStore bounded and lets Babylon reuse compiled effects.\n const shaderName = 'quarksTrail';\n const defines: string[] = [];\n\n if (this.settings.texture) {\n defines.push('USE_MAP');\n }\n\n const shaderLanguage = shaderLanguageFor(this.scene.getEngine());\n registerShaders(\n shaderName,\n {glsl: trail_vert, wgsl: trail_vert_wgsl},\n {glsl: trail_frag, wgsl: trail_frag_wgsl},\n shaderLanguage\n );\n\n const attributes = ['position', 'previous', 'next', 'side', 'width', 'uv', 'color'];\n const uniforms = [\n 'world',\n 'view',\n 'projection',\n 'worldViewProjection',\n 'lineWidth',\n 'resolution',\n 'sizeAttenuation',\n ];\n const samplers: string[] = [];\n\n if (this.settings.texture) {\n samplers.push('map');\n }\n\n const mat = new ShaderMaterial(\n shaderName,\n this.scene,\n {vertex: shaderName, fragment: shaderName},\n {\n attributes,\n uniforms,\n samplers,\n defines,\n needAlphaBlending: this.settings.materialTransparent,\n shaderLanguage,\n }\n );\n\n if (this.settings.texture) {\n mat.setTexture('map', this.settings.texture);\n }\n const engine = this.scene.getEngine();\n mat.setFloat('lineWidth', 1);\n // Reused across binds, and only re-uploaded when the render target resizes.\n const resolution = new BVector2(engine.getRenderWidth(), engine.getRenderHeight());\n mat.setVector2('resolution', resolution);\n mat.setFloat('sizeAttenuation', 1);\n mat.onBindObservable.add(() => {\n const renderEngine = this.scene.getEngine();\n const width = renderEngine.getRenderWidth();\n const height = renderEngine.getRenderHeight();\n if (resolution.x !== width || resolution.y !== height) {\n resolution.x = width;\n resolution.y = height;\n mat.setVector2('resolution', resolution);\n }\n });\n\n mat.backFaceCulling = false;\n\n if (this.settings.materialTransparent) {\n mat.alphaMode = this.settings.materialBlendMode;\n } else {\n mat.alphaMode = Constants.ALPHA_DISABLE;\n }\n mat.needDepthPrePass = this.settings.materialDepthWrite;\n mat.forceDepthWrite = this.settings.materialDepthWrite;\n mat.disableDepthWrite = !this.settings.materialDepthWrite;\n\n this.mesh.material = mat;\n }\n\n private vector_ = new Vector3();\n private vector2_ = new Vector3();\n private vector3_ = new Vector3();\n private quaternion_ = new Quaternion();\n\n /**\n * Brings the emitter's world matrix up to date when its transform changed.\n *\n * Babylon only recomputes a world matrix once per render id, so a frame that\n * moves the emitter after that (or a step driven without rendering) would\n * draw the ribbon against the old one. Recomputing unconditionally every\n * frame costs a matrix compose per system; checking the transform cache\n * first makes a still emitter free.\n */\n private static ensureWorldMatrix(system: IParticleSystem): void {\n const emitter = system.emitter as {\n computeWorldMatrix?: (force: boolean) => void;\n isSynchronized?: () => boolean;\n };\n if (emitter.computeWorldMatrix && (!emitter.isSynchronized || !emitter.isSynchronized())) {\n emitter.computeWorldMatrix(true);\n }\n }\n\n update(): void {\n let index = 0;\n let triangles = 0;\n\n let particleCount = 0;\n const visibleSystems = this.getVisibleSystems();\n for (let s = 0; s < visibleSystems.length; s++) {\n const system = visibleSystems[s];\n const particles = system.particles;\n for (let j = 0; j < system.particleNum; j++) {\n const historyCount = (particles[j] as TrailParticle).historyCount;\n if (historyCount === 0) {\n continue;\n }\n // +2 reserves the live tip vertex pair that frames between\n // simulation steps append ahead of the recorded head.\n particleCount += historyCount * 2 + 2;\n }\n }\n if (particleCount > this.maxParticles) {\n this.expandBuffers(particleCount);\n }\n\n for (let s = 0; s < visibleSystems.length; s++) {\n const system = visibleSystems[s];\n TrailBatch.ensureWorldMatrix(system);\n const rotation = this.quaternion_;\n const translation = this.vector2_;\n const scale = this.vector3_;\n const emitterMatrix = system.emitter.matrixWorld;\n emitterMatrix.decompose(translation, rotation, scale);\n\n const particles = system.particles;\n const particleNum = system.particleNum;\n const uTileCount = this.settings.uTileCount;\n const vTileCount = this.settings.vTileCount;\n const tileWidth = 1 / uTileCount;\n const tileHeight = 1 / vTileCount;\n const systemWorldSpace = system.worldSpace;\n const objectScale = (Math.abs(scale.x) + Math.abs(scale.y) + Math.abs(scale.z)) / 3;\n // A ribbon's samples were recorded at past steps and stay where they\n // were. The particle itself has moved on since the step that wrote\n // the newest sample, so frames that run no step would freeze the\n // whole trail if that head were left behind. Moving the recorded\n // head forward to catch up stretches the last segment from one\n // step of travel to almost two, then snaps it back when the next\n // step lands — a rubber-band the eye reads as lost smoothness,\n // especially at 120Hz where every other frame is between steps.\n // Appending a live tip ahead of the recorded samples keeps the\n // body still and the tip moving without that pulse. A trail pinned\n // to the emitter's origin is driven by the emitter's transform\n // rather than by the particle's velocity, so it is left alone.\n const trailSettings = system.rendererEmitterSettings as TrailSettings;\n const uvFromHead = Boolean(trailSettings.uvFromHead);\n const colorFromParticle = Boolean(trailSettings.colorFromParticle);\n // Recorded samples already sit in world space; the live tip still comes\n // from the particle's own (local) position.\n const samplesInWorld = systemWorldSpace || Boolean(trailSettings.recordWorldSpace);\n const residual = trailSettings.followLocalOrigin ? 0 : (system.simulationResidual ?? 0);\n // Measured from the step the particle just took, not from its\n // velocity: a trail pulled along by an orbit or by a plugin's own\n // behavior has motion no velocity term describes.\n const stepFraction = residual === 0 ? 0 : residual / (system.simulationStep ?? residual);\n\n for (let j = 0; j < particleNum; j++) {\n const particle = particles[j] as TrailParticle;\n const particleHistoryLength = particle.historyCount;\n if (particleHistoryLength === 0) {\n continue;\n }\n const historyCapacity = particle.historyCapacity;\n const historyPositions = particle.historyPositions;\n const historySizes = particle.historySizes;\n // Every sample takes its color from one place: its own recorded slot, or\n // the particle's current row in the store.\n const colors = colorFromParticle ? particle.store.color : particle.historyColors;\n const particleColorIndex = particle.storeIndex * 4;\n const col = particle.uvTile % vTileCount;\n const row = Math.floor(particle.uvTile / vTileCount + 0.001);\n const particleMatrix = particle.parentMatrix as unknown as Matrix4 | undefined;\n const me = (particleMatrix ?? emitterMatrix).elements;\n const m00 = me[0],\n m01 = me[1],\n m02 = me[2],\n m03 = me[3];\n const m10 = me[4],\n m11 = me[5],\n m12 = me[6],\n m13 = me[7];\n const m20 = me[8],\n m21 = me[9],\n m22 = me[10],\n m23 = me[11];\n const m30 = me[12],\n m31 = me[13],\n m32 = me[14],\n m33 = me[15];\n // The texture spans the ribbon end to end: up to the live tip when one is\n // drawn, otherwise up to the newest recorded sample.\n const invHistoryLength =\n 1 / (stepFraction !== 0 ? particleHistoryLength : Math.max(1, particleHistoryLength - 1));\n\n // Walk the ring buffer oldest-first with hand-rolled wrapping so the\n // inner loop stays free of modulo operations. Each sample is brought\n // into world space once: the point written as `next` on one\n // iteration is `current` on the following one and `previous` on\n // the one after that.\n let currentSlot = particle.getHistoryIndex(0);\n let currentX = historyPositions[currentSlot * 3];\n let currentY = historyPositions[currentSlot * 3 + 1];\n let currentZ = historyPositions[currentSlot * 3 + 2];\n if (!samplesInWorld) {\n const w = 1 / (m03 * currentX + m13 * currentY + m23 * currentZ + m33);\n const tx = (m00 * currentX + m10 * currentY + m20 * currentZ + m30) * w;\n const ty = (m01 * currentX + m11 * currentY + m21 * currentZ + m31) * w;\n currentZ = (m02 * currentX + m12 * currentY + m22 * currentZ + m32) * w;\n currentX = tx;\n currentY = ty;\n }\n let previousX = currentX;\n let previousY = currentY;\n let previousZ = currentZ;\n\n for (let i = 0; i < particleHistoryLength; i++, index += 2) {\n let nextX = currentX;\n let nextY = currentY;\n let nextZ = currentZ;\n let nextSlot = currentSlot;\n if (i + 1 < particleHistoryLength) {\n nextSlot = currentSlot + 1 === historyCapacity ? 0 : currentSlot + 1;\n const nextPosIndex = nextSlot * 3;\n nextX = historyPositions[nextPosIndex];\n nextY = historyPositions[nextPosIndex + 1];\n nextZ = historyPositions[nextPosIndex + 2];\n if (!samplesInWorld) {\n const w = 1 / (m03 * nextX + m13 * nextY + m23 * nextZ + m33);\n const tx = (m00 * nextX + m10 * nextY + m20 * nextZ + m30) * w;\n const ty = (m01 * nextX + m11 * nextY + m21 * nextZ + m31) * w;\n nextZ = (m02 * nextX + m12 * nextY + m22 * nextZ + m32) * w;\n nextX = tx;\n nextY = ty;\n }\n }\n\n const currentSize = historySizes[currentSlot];\n const currentColorIndex = colorFromParticle ? particleColorIndex : currentSlot * 4;\n const currentColorX = colors[currentColorIndex];\n const currentColorY = colors[currentColorIndex + 1];\n const currentColorZ = colors[currentColorIndex + 2];\n const currentColorW = colors[currentColorIndex + 3];\n\n const pi = index * 3;\n this.positionBuffer[pi] = currentX;\n this.positionBuffer[pi + 1] = currentY;\n this.positionBuffer[pi + 2] = currentZ;\n this.positionBuffer[pi + 3] = currentX;\n this.positionBuffer[pi + 4] = currentY;\n this.positionBuffer[pi + 5] = currentZ;\n\n this.previousBuffer[pi] = previousX;\n this.previousBuffer[pi + 1] = previousY;\n this.previousBuffer[pi + 2] = previousZ;\n this.previousBuffer[pi + 3] = previousX;\n this.previousBuffer[pi + 4] = previousY;\n this.previousBuffer[pi + 5] = previousZ;\n\n this.nextBuffer[pi] = nextX;\n this.nextBuffer[pi + 1] = nextY;\n this.nextBuffer[pi + 2] = nextZ;\n this.nextBuffer[pi + 3] = nextX;\n this.nextBuffer[pi + 4] = nextY;\n this.nextBuffer[pi + 5] = nextZ;\n\n if (systemWorldSpace || particle.parentMatrix) {\n this.widthBuffer[index] = currentSize;\n this.widthBuffer[index + 1] = currentSize;\n } else {\n this.widthBuffer[index] = currentSize * objectScale;\n this.widthBuffer[index + 1] = currentSize * objectScale;\n }\n\n const ui = index * 2;\n const along = i * invHistoryLength;\n const u = ((uvFromHead ? 1 - along : along) + col) * tileWidth;\n this.uvBuffer[ui] = u;\n this.uvBuffer[ui + 1] = (vTileCount - row - 1) * tileHeight;\n this.uvBuffer[ui + 2] = u;\n this.uvBuffer[ui + 3] = (vTileCount - row) * tileHeight;\n\n const cci = index * 4;\n this.colorBuffer[cci] = currentColorX;\n this.colorBuffer[cci + 1] = currentColorY;\n this.colorBuffer[cci + 2] = currentColorZ;\n this.colorBuffer[cci + 3] = currentColorW;\n this.colorBuffer[cci + 4] = currentColorX;\n this.colorBuffer[cci + 5] = currentColorY;\n this.colorBuffer[cci + 6] = currentColorZ;\n this.colorBuffer[cci + 7] = currentColorW;\n\n if (i + 1 < particleHistoryLength) {\n this.indexBuffer[triangles * 3] = index;\n this.indexBuffer[triangles * 3 + 1] = index + 1;\n this.indexBuffer[triangles * 3 + 2] = index + 2;\n triangles++;\n this.indexBuffer[triangles * 3] = index + 2;\n this.indexBuffer[triangles * 3 + 1] = index + 1;\n this.indexBuffer[triangles * 3 + 2] = index + 3;\n triangles++;\n }\n\n previousX = currentX;\n previousY = currentY;\n previousZ = currentZ;\n currentX = nextX;\n currentY = nextY;\n currentZ = nextZ;\n currentSlot = nextSlot;\n }\n\n // Live tip: same place a sprite would be drawn this frame, past\n // the last recorded sample. The recorded ribbon stays put.\n if (stepFraction !== 0) {\n const previousHead = particle.previousPosition;\n const position = particle.position;\n let tipX = position.x + (position.x - previousHead.x) * stepFraction;\n let tipY = position.y + (position.y - previousHead.y) * stepFraction;\n let tipZ = position.z + (position.z - previousHead.z) * stepFraction;\n const headIndex = index - 2;\n const headX = this.positionBuffer[headIndex * 3];\n const headY = this.positionBuffer[headIndex * 3 + 1];\n const headZ = this.positionBuffer[headIndex * 3 + 2];\n\n if (!systemWorldSpace) {\n const w = 1 / (m03 * tipX + m13 * tipY + m23 * tipZ + m33);\n const tx = (m00 * tipX + m10 * tipY + m20 * tipZ + m30) * w;\n const ty = (m01 * tipX + m11 * tipY + m21 * tipZ + m31) * w;\n tipZ = (m02 * tipX + m12 * tipY + m22 * tipZ + m32) * w;\n tipX = tx;\n tipY = ty;\n }\n\n const tipPi = index * 3;\n this.positionBuffer[tipPi] = tipX;\n this.positionBuffer[tipPi + 1] = tipY;\n this.positionBuffer[tipPi + 2] = tipZ;\n this.positionBuffer[tipPi + 3] = tipX;\n this.positionBuffer[tipPi + 4] = tipY;\n this.positionBuffer[tipPi + 5] = tipZ;\n\n this.previousBuffer[tipPi] = headX;\n this.previousBuffer[tipPi + 1] = headY;\n this.previousBuffer[tipPi + 2] = headZ;\n this.previousBuffer[tipPi + 3] = headX;\n this.previousBuffer[tipPi + 4] = headY;\n this.previousBuffer[tipPi + 5] = headZ;\n\n this.nextBuffer[tipPi] = tipX;\n this.nextBuffer[tipPi + 1] = tipY;\n this.nextBuffer[tipPi + 2] = tipZ;\n this.nextBuffer[tipPi + 3] = tipX;\n this.nextBuffer[tipPi + 4] = tipY;\n this.nextBuffer[tipPi + 5] = tipZ;\n\n // The recorded head's `next` was itself; point it at the tip\n // so the shader builds the live segment from one version of\n // each endpoint.\n const headPi = headIndex * 3;\n this.nextBuffer[headPi] = tipX;\n this.nextBuffer[headPi + 1] = tipY;\n this.nextBuffer[headPi + 2] = tipZ;\n this.nextBuffer[headPi + 3] = tipX;\n this.nextBuffer[headPi + 4] = tipY;\n this.nextBuffer[headPi + 5] = tipZ;\n\n const tipSize = particle.size.x;\n if (systemWorldSpace || particle.parentMatrix) {\n this.widthBuffer[index] = tipSize;\n this.widthBuffer[index + 1] = tipSize;\n } else {\n this.widthBuffer[index] = tipSize * objectScale;\n this.widthBuffer[index + 1] = tipSize * objectScale;\n }\n\n const tipUi = index * 2;\n const tipU = ((uvFromHead ? 0 : 1) + col) * tileWidth;\n this.uvBuffer[tipUi] = tipU;\n this.uvBuffer[tipUi + 1] = (vTileCount - row - 1) * tileHeight;\n this.uvBuffer[tipUi + 2] = tipU;\n this.uvBuffer[tipUi + 3] = (vTileCount - row) * tileHeight;\n\n const tipColor = particle.color;\n const tipCi = index * 4;\n this.colorBuffer[tipCi] = tipColor.x;\n this.colorBuffer[tipCi + 1] = tipColor.y;\n this.colorBuffer[tipCi + 2] = tipColor.z;\n this.colorBuffer[tipCi + 3] = tipColor.w;\n this.colorBuffer[tipCi + 4] = tipColor.x;\n this.colorBuffer[tipCi + 5] = tipColor.y;\n this.colorBuffer[tipCi + 6] = tipColor.z;\n this.colorBuffer[tipCi + 7] = tipColor.w;\n\n this.indexBuffer[triangles * 3] = headIndex;\n this.indexBuffer[triangles * 3 + 1] = headIndex + 1;\n this.indexBuffer[triangles * 3 + 2] = index;\n triangles++;\n this.indexBuffer[triangles * 3] = index;\n this.indexBuffer[triangles * 3 + 1] = headIndex + 1;\n this.indexBuffer[triangles * 3 + 2] = index + 1;\n triangles++;\n\n index += 2;\n }\n }\n }\n\n this.uploadGeometry(index, triangles);\n }\n\n /**\n * Uploads the vertex data written by `update` and resizes the sub mesh.\n *\n * Split out of `update` on purpose: the Babylon mesh/sub-mesh plumbing here\n * runs a handful of times per frame, and folding it into the per-vertex loop\n * costs that loop its optimised code.\n */\n private uploadGeometry(index: number, triangles: number): void {\n const geometry = this.mesh.geometry;\n const indexBuffer = geometry?.getIndexBuffer();\n if (index > 0 && triangles > 0) {\n // Upload only the vertices written this frame; the buffers are sized for\n // the high-water mark of every system in the batch.\n this.mesh.updateVerticesData(VertexBuffer.PositionKind, this.positionBuffer.subarray(0, index * 3));\n this.mesh.updateVerticesData(VertexBuffer.UVKind, this.uvBuffer.subarray(0, index * 2));\n // Straight to the GPU buffer. Going through `mesh.updateIndices` with a\n // range whose length changes every frame makes Babylon copy the\n // indices, rebuild the sub mesh and recompute its bounds from the\n // whole position buffer, all of which this batch then undoes.\n if (indexBuffer) {\n this.scene\n .getEngine()\n .updateDynamicIndexBuffer(indexBuffer, this.indexBuffer.subarray(0, triangles * 3), 0);\n }\n this.previousVB.update(this.previousBuffer.subarray(0, index * 3));\n this.nextVB.update(this.nextBuffer.subarray(0, index * 3));\n this.widthVB.update(this.widthBuffer.subarray(0, index));\n\n const colorVB = this.mesh.getVertexBuffer(VertexBuffer.ColorKind);\n if (colorVB) colorVB.update(this.colorBuffer.subarray(0, index * 4));\n\n if (this.mesh.subMeshes && this.mesh.subMeshes.length > 0) {\n this.mesh.subMeshes[0].indexCount = triangles * 3;\n this.mesh.subMeshes[0].verticesCount = index;\n }\n this.drawsNothing = false;\n } else if (this.mesh.subMeshes && this.mesh.subMeshes.length > 0) {\n // Nothing to draw. Leaving the count at zero still submits the draw,\n // and WebGPU complains about it once per frame for as long as the\n // batch stays empty — which, for a looping effect, is every gap\n // between passes. Disabling the mesh instead costs a frame coming\n // back, the flicker the sprite batch already works around.\n //\n // So draw a triangle whose corners are all the same vertex: it is a\n // legal draw that rasterises nothing, whatever stale geometry is\n // still in the buffers. Only written on the way into empty, not on\n // every empty frame.\n if (!this.drawsNothing) {\n this.indexBuffer.fill(0, 0, 6);\n if (indexBuffer) {\n this.scene.getEngine().updateDynamicIndexBuffer(indexBuffer, this.indexBuffer.subarray(0, 6), 0);\n }\n this.drawsNothing = true;\n }\n this.mesh.subMeshes[0].indexCount = 6;\n this.mesh.subMeshes[0].verticesCount = 1;\n }\n }\n\n /**\n * Points every sub mesh at the mesh's own bounds.\n *\n * Updating indices rebuilds the sub meshes, and a fresh one computes its\n * bounds from the vertex data — which this batch keeps deliberately stale\n * beyond the range it draws. Transparent sorting reads those bounds every\n * frame, so they have to be replaced again after every index update, not\n * only when the geometry is built.\n */\n private adoptMeshBounds(): void {\n const meshBoundingInfo = this.mesh.getBoundingInfo();\n for (const subMesh of this.mesh.subMeshes) {\n (subMesh as any)._boundingInfo = meshBoundingInfo;\n }\n }\n\n dispose(): void {\n if (this.mesh.material) {\n this.mesh.material.dispose();\n }\n super.dispose();\n }\n}\n","export default /* wgsl */ `\nattribute position: vec3f;\nattribute previous: vec3f;\nattribute next: vec3f;\nattribute side: f32;\nattribute width: f32;\nattribute uv: vec2f;\nattribute color: vec4f;\n\nuniform view: mat4x4f;\nuniform projection: mat4x4f;\nuniform lineWidth: f32;\nuniform resolution: vec2f;\nuniform sizeAttenuation: f32;\n\nvarying vUV: vec2f;\nvarying vColor: vec4f;\n\nfn fix(i: vec4f, aspect: f32) -> vec2f {\n var res = i.xy / i.w;\n res.x *= aspect;\n return res;\n}\n\n@vertex\nfn main(input: VertexInputs) -> FragmentInputs {\n let aspect = uniforms.resolution.x / uniforms.resolution.y;\n var finalPosition = uniforms.projection * uniforms.view * vec4f(vertexInputs.position, 1.0);\n let prevPos = uniforms.projection * uniforms.view * vec4f(vertexInputs.previous, 1.0);\n let nextPos = uniforms.projection * uniforms.view * vec4f(vertexInputs.next, 1.0);\n\n let currentP = fix(finalPosition, aspect);\n let prevP = fix(prevPos, aspect);\n let nextP = fix(nextPos, aspect);\n\n let w = uniforms.lineWidth * vertexInputs.width;\n var dir: vec2f;\n if (distance(nextP, currentP) < 0.0001) {\n dir = normalize(currentP - prevP);\n } else if (distance(prevP, currentP) < 0.0001) {\n dir = normalize(nextP - currentP);\n } else {\n let dir1 = normalize(currentP - prevP);\n let dir2 = normalize(nextP - currentP);\n dir = normalize(dir1 + dir2);\n }\n var normal = vec4f(-dir.y, dir.x, 0.0, 1.0);\n normal.x *= 0.5 * w;\n normal.y *= 0.5 * w;\n normal = normal * uniforms.projection;\n if (uniforms.sizeAttenuation == 0.0) {\n let screen = (vec4f(uniforms.resolution, 0.0, 1.0) * uniforms.projection).xy;\n normal.x = normal.x * finalPosition.w / screen.x;\n normal.y = normal.y * finalPosition.w / screen.y;\n }\n finalPosition.x += normal.x * vertexInputs.side;\n finalPosition.y += normal.y * vertexInputs.side;\n\n vertexOutputs.position = finalPosition;\n vertexOutputs.vUV = vertexInputs.uv;\n vertexOutputs.vColor = vertexInputs.color;\n}\n`;\n","export default /* wgsl */ `\nvarying vUV: vec2f;\nvarying vColor: vec4f;\n\n#ifdef USE_MAP\nvar mapSampler: sampler;\nvar map: texture_2d<f32>;\n#endif\n\n@fragment\nfn main(input: FragmentInputs) -> FragmentOutputs {\n var baseColor = fragmentInputs.vColor;\n\n#ifdef USE_MAP\n let texColor = textureSample(map, mapSampler, fragmentInputs.vUV);\n baseColor *= texColor;\n#endif\n\n if (baseColor.a < 0.01) { discard; }\n\n fragmentOutputs.color = baseColor;\n}\n`;\n","import {BaseTexture} from '@babylonjs/core/Materials/Textures/baseTexture';\nimport {Texture} from '@babylonjs/core/Materials/Textures/texture';\nimport {TransformNode} from '@babylonjs/core/Meshes/transformNode';\nimport {Scene} from '@babylonjs/core/scene';\nimport {EmitSubParticleSystem, IParticleSystem, Vector3} from 'quarks.core';\nimport {ParticleSystem} from './ParticleSystem';\nimport {SpriteBatch} from './SpriteBatch';\nimport {TrailBatch} from './TrailBatch';\nimport {\n defaultMeshLighting,\n MeshLighting,\n MeshLightingSettings,\n MeshRim,\n meshRimEqual,\n RenderMode,\n StoredBatchSettings,\n VFXBatch,\n} from './VFXBatch';\n\nexport interface VFXBatchSettings {\n instancingGeometry: Float32Array;\n instancingIndices: Uint32Array | Uint16Array;\n instancingUVs?: Float32Array;\n instancingNormals?: Float32Array;\n renderMode: RenderMode;\n renderOrder: number;\n uTileCount: number;\n vTileCount: number;\n blendTiles: boolean;\n softParticles: boolean;\n softNearFade: number;\n softFarFade: number;\n materialBlendMode: number;\n materialTransparent: boolean;\n materialDepthTest: boolean;\n materialDepthWrite: boolean;\n materialAlphaTest: number;\n texture: Texture | null;\n /**\n * Cubemap (or other reflection texture) harvested from a Babylon material's\n * `reflectionTexture`. Mesh batches sample it like StandardMaterial cubic\n * reflection; other render modes ignore it.\n */\n reflectionTexture: BaseTexture | null;\n /** Multiplier for the reflection sample — mirrors `texture.level`. */\n reflectionLevel: number;\n /**\n * Optional six cube-face 2D textures (px,py,pz,nx,ny,nz). Prefer\n * `reflectionAtlas` on iOS — many simultaneous face samplers still trip\n * GL_INVALID_OPERATION on WebKit.\n */\n reflectionFaces: BaseTexture[] | null;\n /**\n * Single 3×2 atlas of cube faces (px py pz / nx ny nz). One sampler2D —\n * the path that stays valid on iOS WebKit ShaderMaterial draws.\n */\n reflectionAtlas: BaseTexture | null;\n layerMask: number;\n /**\n * Offset of billboard quads from their particle, in particle-size units\n * (Unity's renderer Pivot). On billboards x/y move the quad in its own plane\n * before it is rotated and z moves it toward the camera (up for horizontal\n * billboards). On stretched billboards x runs from the head to the tail and\n * y across, and z is unused. Absent or zero: no offset. Meshes ignore it.\n */\n pivot?: Vector3;\n /**\n * How mesh particles are lit (`'unlit'`, `'fixed'` or `'scene'`); unset is\n * `'fixed'`. See {@link MeshLighting}. Other render modes ignore it.\n */\n lighting?: MeshLighting;\n /** Rim (Fresnel) term on mesh particles; unset draws none. See {@link MeshRim}. */\n rim?: MeshRim;\n}\n\nexport interface AdaptivePerformanceOptions {\n targetFrameMs: number;\n minQuality: number;\n maxQuality: number;\n decreaseStep: number;\n increaseStep: number;\n}\n\n/** True when both pivots put the quad in the same place; a missing pivot is zero. */\nfunction pivotEqual(a: Vector3 | undefined, b: Vector3 | undefined): boolean {\n return (a?.x ?? 0) === (b?.x ?? 0) && (a?.y ?? 0) === (b?.y ?? 0) && (a?.z ?? 0) === (b?.z ?? 0);\n}\n\n/** True when both face lists are the same six texture references (or both empty). */\nfunction reflectionFacesEqual(a: BaseTexture[] | null | undefined, b: BaseTexture[] | null | undefined): boolean {\n if (a === b) {\n return true;\n }\n if (!a || !b || a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n return true;\n}\n\nexport interface AdaptivePerformanceState extends AdaptivePerformanceOptions {\n enabled: boolean;\n currentQuality: number;\n lastFrameCpuMs: number;\n}\n\nexport class BatchedRenderer extends TransformNode {\n batches: Array<VFXBatch> = [];\n systemToBatchIndex: Map<IParticleSystem, number> = new Map<IParticleSystem, number>();\n depthTexture: BaseTexture | null = null;\n /** Systems in insertion order — iterated every frame, unlike the map. */\n private systems: Array<IParticleSystem> = [];\n /**\n * The same systems, ordered so that one emitting into another comes first.\n *\n * A sub emitter's particles are created by its parent's behaviors, part way\n * through the parent's step. A sub system updated before its parent has\n * already fixed the list of particles it will run behaviors over, so those\n * new particles are drawn that frame with nothing but their start values —\n * white where a colour curve would have coloured them, at their start size,\n * sitting at the point they were born. Rebuilt only when the set of systems\n * or their behaviors changes, not per frame.\n */\n private orderedSystems: Array<IParticleSystem> = [];\n private orderedSystemsStale = true;\n /** Consecutive frames each batch has held no system, parallel to `batches`. */\n private batchEmptyFrames: Array<number> = [];\n /**\n * How long an empty batch is kept before it is disposed. Systems that toggle\n * a setting back and forth reuse the batch within this window instead of\n * rebuilding a mesh and material every time.\n */\n private static readonly EMPTY_BATCH_GRACE_FRAMES = 120;\n private adaptivePerformanceState: AdaptivePerformanceState = {\n enabled: false,\n targetFrameMs: 16.7,\n minQuality: 0.35,\n maxQuality: 1,\n decreaseStep: 0.08,\n increaseStep: 0.02,\n currentQuality: 1,\n lastFrameCpuMs: 0,\n };\n private lastAppliedQuality = Number.NaN;\n private meshLighting: MeshLightingSettings = defaultMeshLighting();\n\n constructor(name: string, scene: Scene) {\n super(name, scene);\n }\n\n private static clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n }\n\n private static equals(a: StoredBatchSettings, b: VFXBatchSettings): boolean {\n return (\n a.materialBlendMode === b.materialBlendMode &&\n a.materialTransparent === b.materialTransparent &&\n a.materialDepthTest === b.materialDepthTest &&\n a.materialDepthWrite === b.materialDepthWrite &&\n a.materialAlphaTest === b.materialAlphaTest &&\n a.texture === b.texture &&\n a.reflectionTexture === b.reflectionTexture &&\n a.reflectionLevel === b.reflectionLevel &&\n reflectionFacesEqual(a.reflectionFaces, b.reflectionFaces) &&\n a.reflectionAtlas === b.reflectionAtlas &&\n a.renderMode === b.renderMode &&\n a.blendTiles === b.blendTiles &&\n a.softParticles === b.softParticles &&\n a.softFarFade === b.softFarFade &&\n a.softNearFade === b.softNearFade &&\n a.uTileCount === b.uTileCount &&\n a.vTileCount === b.vTileCount &&\n a.instancingGeometry === b.instancingGeometry &&\n a.renderOrder === b.renderOrder &&\n a.layerMask === b.layerMask &&\n pivotEqual(a.pivot, b.pivot) &&\n (a.lighting ?? 'fixed') === (b.lighting ?? 'fixed') &&\n meshRimEqual(a.rim, b.rim)\n );\n }\n\n addSystem(system: IParticleSystem) {\n const particleSystem = system as ParticleSystem;\n particleSystem._renderer = this;\n if (!this.systemToBatchIndex.has(system) && this.systems.indexOf(system) === -1) {\n this.systems.push(system);\n this.orderedSystemsStale = true;\n }\n if (this.adaptivePerformanceState.enabled) {\n particleSystem.setQualityFactor(this.adaptivePerformanceState.currentQuality);\n }\n this.assignToBatch(particleSystem);\n }\n\n /** Places a system into a compatible batch, creating one when none matches. */\n private assignToBatch(particleSystem: ParticleSystem) {\n const system = particleSystem as IParticleSystem;\n const settings = particleSystem.getRendererSettings();\n for (let i = 0; i < this.batches.length; i++) {\n if (BatchedRenderer.equals(this.batches[i].settings, settings)) {\n this.batches[i].addSystem(system);\n this.systemToBatchIndex.set(system, i);\n return;\n }\n }\n let batch: VFXBatch;\n const scene = this.getScene();\n switch (settings.renderMode) {\n case RenderMode.Trail:\n batch = new TrailBatch(settings, scene);\n break;\n case RenderMode.Mesh:\n case RenderMode.BillBoard:\n case RenderMode.VerticalBillBoard:\n case RenderMode.HorizontalBillBoard:\n case RenderMode.StretchedBillBoard:\n batch = new SpriteBatch(settings, scene);\n break;\n default:\n throw new Error(`Unsupported render mode: ${settings.renderMode}`);\n }\n batch.mesh.parent = this;\n if (this.depthTexture) {\n batch.applyDepthTexture(this.depthTexture);\n }\n batch.applyMeshLighting(this.meshLighting);\n batch.addSystem(system);\n this.batches.push(batch);\n this.batchEmptyFrames.push(0);\n this.systemToBatchIndex.set(system, this.batches.length - 1);\n }\n\n deleteSystem(system: IParticleSystem) {\n const removed = this.removeFromBatch(system);\n const index = this.systems.indexOf(system);\n if (index !== -1) {\n this.systems.splice(index, 1);\n this.orderedSystemsStale = true;\n }\n // Also out of the ordered copy, which update() may be iterating right\n // now: a system that disposes itself from inside its own update leaves\n // the loop expecting the slot it vacated to hold the next one.\n const ordered = this.orderedSystems.indexOf(system);\n if (ordered !== -1) {\n this.orderedSystems.splice(ordered, 1);\n }\n return removed;\n }\n\n /** Detaches a system from its batch, leaving the renderer's system list alone. */\n private removeFromBatch(system: IParticleSystem): boolean {\n const batchIndex = this.systemToBatchIndex.get(system);\n if (batchIndex === undefined) {\n return false;\n }\n this.batches[batchIndex].removeSystem(system);\n this.systemToBatchIndex.delete(system);\n return true;\n }\n\n /**\n * Re-buckets a system whose render settings changed. The system keeps its\n * place in the update order, so this is safe to call mid-frame.\n */\n updateSystem(system: IParticleSystem) {\n this.removeFromBatch(system);\n this.addSystem(system);\n }\n\n setDepthTexture(depthTexture: BaseTexture | null) {\n this.depthTexture = depthTexture;\n for (const batch of this.batches) {\n batch.applyDepthTexture(depthTexture);\n }\n }\n\n /**\n * Sets the light mesh particles with `lighting: 'fixed'` (the default) are\n * lit by, for every mesh batch of this renderer, including ones created\n * later. Fields left out keep their current value. Also the fallback for\n * `'scene'` lighting when the scene has no directional or hemispheric light.\n *\n * @example\n * ```ts\n * renderer.setMeshLighting({direction: new Vector3(-0.3, -1, 0.2), color: new Color3(1, 0.9, 0.75)});\n * ```\n */\n setMeshLighting(lighting: Partial<MeshLightingSettings>): void {\n const current = this.meshLighting;\n if (lighting.direction) {\n current.direction = lighting.direction.clone();\n }\n if (lighting.color) {\n current.color = lighting.color.clone();\n }\n if (lighting.ambient) {\n current.ambient = lighting.ambient.clone();\n }\n for (const batch of this.batches) {\n batch.applyMeshLighting(current);\n }\n }\n\n /** A copy of the light set with {@link setMeshLighting}. */\n getMeshLighting(): MeshLightingSettings {\n const current = this.meshLighting;\n return {\n direction: current.direction.clone(),\n color: current.color.clone(),\n ambient: current.ambient.clone(),\n };\n }\n\n configureAdaptivePerformance(options: Partial<AdaptivePerformanceOptions> = {}) {\n const state = this.adaptivePerformanceState;\n const minQuality = BatchedRenderer.clamp(options.minQuality ?? state.minQuality, 0.05, 1);\n const maxQuality = BatchedRenderer.clamp(options.maxQuality ?? state.maxQuality, minQuality, 1);\n state.targetFrameMs = Math.max(options.targetFrameMs ?? state.targetFrameMs, 0.1);\n state.minQuality = minQuality;\n state.maxQuality = maxQuality;\n state.decreaseStep = Math.max(options.decreaseStep ?? state.decreaseStep, 0.001);\n state.increaseStep = Math.max(options.increaseStep ?? state.increaseStep, 0.001);\n state.currentQuality = BatchedRenderer.clamp(state.currentQuality, state.minQuality, state.maxQuality);\n state.enabled = true;\n this.lastAppliedQuality = Number.NaN;\n }\n\n disableAdaptivePerformance(resetQuality = true) {\n this.adaptivePerformanceState.enabled = false;\n if (resetQuality) {\n this.adaptivePerformanceState.currentQuality = this.adaptivePerformanceState.maxQuality;\n this.applyAdaptiveQuality();\n }\n }\n\n getAdaptivePerformanceState(): AdaptivePerformanceState {\n return {...this.adaptivePerformanceState};\n }\n\n private applyAdaptiveQuality() {\n const quality = this.adaptivePerformanceState.currentQuality;\n if (quality === this.lastAppliedQuality) {\n return;\n }\n for (let i = 0; i < this.systems.length; i++) {\n (this.systems[i] as ParticleSystem).setQualityFactor(quality);\n }\n this.lastAppliedQuality = quality;\n }\n\n /** @internal Called when a system's behaviors change, which can add a sub emitter. */\n _invalidateUpdateOrder(): void {\n this.orderedSystemsStale = true;\n }\n\n /**\n * Orders the systems so a system emitting into another runs first.\n *\n * Depth first over \"emits into\" edges, recording each system once all the\n * systems it feeds have been recorded, then reversed — a system therefore\n * lands ahead of everything it emits into, however deep the chain. A cycle\n * cannot be satisfied by any order; it is left as found rather than dropped.\n */\n private orderSystems(): Array<IParticleSystem> {\n if (!this.orderedSystemsStale) {\n return this.orderedSystems;\n }\n const ordered: Array<IParticleSystem> = [];\n const visiting = new Set<IParticleSystem>();\n const done = new Set<IParticleSystem>();\n const known = new Set<IParticleSystem>(this.systems);\n\n const subTargetsOf = (system: IParticleSystem): Array<IParticleSystem> => {\n const targets: Array<IParticleSystem> = [];\n for (const behavior of (system as ParticleSystem).behaviors ?? []) {\n if (behavior.type !== 'EmitSubParticleSystem') {\n continue;\n }\n const target = (behavior as EmitSubParticleSystem).subParticleSystem?.system;\n if (target !== undefined && known.has(target)) {\n targets.push(target);\n }\n }\n return targets;\n };\n\n const visit = (system: IParticleSystem): void => {\n if (done.has(system) || visiting.has(system)) {\n return;\n }\n visiting.add(system);\n for (const target of subTargetsOf(system)) {\n visit(target);\n }\n visiting.delete(system);\n done.add(system);\n ordered.push(system);\n };\n\n for (const system of this.systems) {\n visit(system);\n }\n ordered.reverse();\n this.orderedSystems = ordered;\n this.orderedSystemsStale = false;\n return ordered;\n }\n\n update(delta: number) {\n const adaptiveState = this.adaptivePerformanceState;\n const frameStart = adaptiveState.enabled ? performance.now() : 0;\n if (adaptiveState.enabled) {\n this.applyAdaptiveQuality();\n }\n const systems = this.orderSystems();\n for (let i = 0; i < systems.length; i++) {\n const system = systems[i];\n // A disabled emitter holds its particles frozen instead of simulating\n // them unseen, matching how Unity treats a disabled ParticleSystem.\n // Pooled effects parked with setEnabled(false) then cost nothing.\n if (system.emitter.visible) {\n (system as ParticleSystem).update(delta);\n }\n // An autoDestroy system disposes itself from inside update and drops\n // out of the list; stay on the slot it vacated.\n if (systems[i] !== system) {\n i--;\n }\n }\n this.refreshBatches();\n if (!adaptiveState.enabled) {\n return;\n }\n\n adaptiveState.lastFrameCpuMs = performance.now() - frameStart;\n if (adaptiveState.lastFrameCpuMs > adaptiveState.targetFrameMs) {\n adaptiveState.currentQuality = BatchedRenderer.clamp(\n adaptiveState.currentQuality - adaptiveState.decreaseStep,\n adaptiveState.minQuality,\n adaptiveState.maxQuality\n );\n } else {\n adaptiveState.currentQuality = BatchedRenderer.clamp(\n adaptiveState.currentQuality + adaptiveState.increaseStep,\n adaptiveState.minQuality,\n adaptiveState.maxQuality\n );\n }\n }\n\n /** Rebuild instance buffers from current particle state without advancing simulation. */\n refreshBatches(): void {\n const emptyFrames = this.batchEmptyFrames;\n for (let i = 0; i < this.batches.length; i++) {\n const batch = this.batches[i];\n if (batch.systems.size > 0) {\n emptyFrames[i] = 0;\n batch.update();\n continue;\n }\n const framesEmpty = (emptyFrames[i] ?? 0) + 1;\n emptyFrames[i] = framesEmpty;\n if (framesEmpty === 1) {\n // One last update clears the instance data left on screen.\n batch.update();\n } else if (framesEmpty > BatchedRenderer.EMPTY_BATCH_GRACE_FRAMES) {\n // Nothing has used these settings for a while: give the mesh,\n // material and GPU buffers back instead of re-uploading empty\n // instance data forever.\n this.removeBatch(i);\n i--;\n }\n }\n }\n\n /** Disposes the batch at `index` and repairs the system→batch mapping. */\n private removeBatch(index: number): void {\n this.batches[index].dispose();\n this.batches.splice(index, 1);\n this.batchEmptyFrames.splice(index, 1);\n for (const [system, batchIndex] of this.systemToBatchIndex) {\n if (batchIndex > index) {\n this.systemToBatchIndex.set(system, batchIndex - 1);\n }\n }\n }\n\n /** Per-batch particle vs GPU instance counts — for diagnosing stale render state. */\n getBatchRenderStats(): Array<{\n batchIndex: number;\n renderMode: RenderMode;\n instanceCount: number;\n particleCount: number;\n systemNames: string[];\n }> {\n return this.batches.map((batch, batchIndex) => {\n let particleCount = 0;\n const systemNames: string[] = [];\n for (const system of batch.systems) {\n const ps = system as ParticleSystem;\n particleCount += ps.particleNum;\n systemNames.push(ps.emitter.name);\n }\n return {\n batchIndex,\n renderMode: batch.settings.renderMode,\n instanceCount: batch.mesh.forcedInstanceCount ?? 0,\n particleCount,\n systemNames,\n };\n });\n }\n\n dispose(): void {\n for (const batch of this.batches) {\n batch.dispose();\n }\n this.batches = [];\n this.batchEmptyFrames.length = 0;\n this.systems.length = 0;\n this.systemToBatchIndex.clear();\n super.dispose();\n }\n}\n","import {BatchedRenderer} from './BatchedRenderer';\n\nexport const BatchedParticleRenderer = BatchedRenderer;\n","import {BaseTexture} from '@babylonjs/core/Materials/Textures/baseTexture';\nimport {Texture} from '@babylonjs/core/Materials/Textures/texture';\nimport {Scene} from '@babylonjs/core/scene';\n\nconst atlasByCube = new WeakMap<BaseTexture, Texture>();\nconst pendingByCube = new WeakMap<BaseTexture, Promise<Texture | null>>();\n\n/** Reads the six face URLs from a Babylon CubeTexture (px py pz nx ny nz). */\nexport function cubeFaceUrls(reflection: BaseTexture | null | undefined): string[] | null {\n if (!reflection?.isCube) {\n return null;\n }\n const files =\n (reflection as {files?: string[]; _files?: string[]}).files ?? (reflection as {_files?: string[]})._files;\n return files?.length === 6 ? files.slice() : null;\n}\n\n/** Returns a previously built atlas for this cube, if any. */\nexport function getCachedEnvAtlas(cube: BaseTexture): Texture | null {\n return atlasByCube.get(cube) ?? null;\n}\n\n/** Stores an atlas for a cube source (tests / prebuilt atlases). */\nexport function cacheEnvAtlas(cube: BaseTexture, atlas: Texture): void {\n atlasByCube.set(cube, atlas);\n}\n\n/**\n * Packs six cube-face images into one 3×2 atlas Texture (px py pz / nx ny nz).\n * Uses invertY:false so UV cellY=0 maps to the +faces row matching the shader.\n */\nexport async function createEnvAtlasFromFaceUrls(urls: string[], scene: Scene): Promise<Texture> {\n if (typeof document === 'undefined' || typeof Image === 'undefined') {\n throw new Error('createEnvAtlasFromFaceUrls requires a DOM Image/canvas environment');\n }\n const images = await Promise.all(urls.map((url) => loadImage(url)));\n const size = images[0].width || images[0].naturalWidth;\n if (!size) {\n throw new Error('Env atlas face image has zero size');\n }\n const canvas = document.createElement('canvas');\n canvas.width = size * 3;\n canvas.height = size * 2;\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n throw new Error('Could not create env atlas canvas');\n }\n for (let i = 0; i < 6; i++) {\n ctx.drawImage(images[i], (i % 3) * size, Math.floor(i / 3) * size, size, size);\n }\n const atlas = new Texture(canvas.toDataURL('image/jpeg', 0.92), scene, {\n noMipmap: true,\n invertY: false,\n samplingMode: Texture.LINEAR_LINEAR,\n });\n atlas.name = 'quarksEnvAtlas';\n return atlas;\n}\n\n/** Overridable builder hook (tests replace this to avoid needing DOM Image/canvas). */\nexport const envAtlasBuilder = {\n createFromFaceUrls: createEnvAtlasFromFaceUrls,\n};\n\n/**\n * Ensures a 3×2 env atlas exists for a CubeTexture. Returns a cached atlas\n * synchronously when available; otherwise starts (or joins) an async build and\n * invokes onReady when the atlas is usable.\n */\nexport function ensureEnvAtlasFromCube(\n cube: BaseTexture,\n scene: Scene,\n onReady: (atlas: Texture) => void\n): Texture | null {\n const cached = atlasByCube.get(cube);\n if (cached) {\n onReady(cached);\n return cached;\n }\n\n const kick = () => {\n const existingPending = pendingByCube.get(cube);\n if (existingPending) {\n existingPending.then((atlas) => {\n if (atlas) {\n onReady(atlas);\n }\n });\n return;\n }\n\n const urls = cubeFaceUrls(cube);\n if (!urls) {\n return;\n }\n\n const pending = envAtlasBuilder\n .createFromFaceUrls(urls, scene)\n .then((atlas) => {\n atlasByCube.set(cube, atlas);\n pendingByCube.delete(cube);\n onReady(atlas);\n return atlas;\n })\n .catch((err) => {\n pendingByCube.delete(cube);\n console.warn('[babylon.quarks] Failed to build env atlas from cubemap faces', err);\n return null;\n });\n pendingByCube.set(cube, pending);\n };\n\n if (cube.isReady()) {\n kick();\n } else {\n const observable = (cube as {onLoadObservable?: {addOnce: (cb: () => void) => void}}).onLoadObservable;\n if (observable) {\n observable.addOnce(() => kick());\n } else {\n kick();\n }\n }\n\n return atlasByCube.get(cube) ?? null;\n}\n\n/** Loads one image URL as an HTMLImageElement. */\nfunction loadImage(url: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const image = new Image();\n image.crossOrigin = 'anonymous';\n image.onload = () => resolve(image);\n image.onerror = () => reject(new Error(`Failed to load env face ${url}`));\n image.src = url;\n });\n}\n","import {PBRMaterial} from '@babylonjs/core/Materials/PBR/pbrMaterial';\nimport {StandardMaterial} from '@babylonjs/core/Materials/standardMaterial';\nimport {Scene} from '@babylonjs/core/scene';\n\nexport type BabylonParticleMaterialParameters = Record<string, any>;\n\nexport class ParticleMeshStandardMaterial extends StandardMaterial {\n readonly isParticleMeshStandardMaterial = true;\n\n constructor(name: string, scene?: Scene, parameters: BabylonParticleMaterialParameters = {}) {\n super(name, scene);\n Object.assign(this, parameters);\n }\n}\n\nexport class ParticleMeshPhysicsMaterial extends PBRMaterial {\n readonly isParticleMeshPhysicsMaterial = true;\n\n constructor(name: string, scene?: Scene, parameters: BabylonParticleMaterialParameters = {}) {\n super(name, scene);\n Object.assign(this, parameters);\n }\n}\n","import {TransformNode} from '@babylonjs/core/Meshes/transformNode';\nimport {Scene} from '@babylonjs/core/scene';\nimport {IParticleSystem, Matrix4, SerializationOptions} from 'quarks.core';\n\nexport class ParticleEmitter extends TransformNode {\n system: IParticleSystem;\n private _matrixWorld: Matrix4 = new Matrix4();\n private _matrixWorldFlag = -1;\n\n /**\n * The node's world matrix in quarks.core form. Mirrored from Babylon's\n * matrix only when that matrix actually changed (tracked by its\n * `updateFlag`), so repeated reads inside a frame are free.\n */\n get matrixWorld(): Matrix4 {\n const m = this.getWorldMatrix();\n const flag = m.updateFlag;\n if (flag === this._matrixWorldFlag) {\n return this._matrixWorld;\n }\n this._matrixWorldFlag = flag;\n const e = this._matrixWorld.elements;\n const s = m.m;\n e[0] = s[0];\n e[1] = s[1];\n e[2] = s[2];\n e[3] = s[3];\n e[4] = s[4];\n e[5] = s[5];\n e[6] = s[6];\n e[7] = s[7];\n e[8] = s[8];\n e[9] = s[9];\n e[10] = s[10];\n e[11] = s[11];\n e[12] = s[12];\n e[13] = s[13];\n e[14] = s[14];\n e[15] = s[15];\n return this._matrixWorld;\n }\n\n get visible(): boolean {\n return this.isEnabled();\n }\n\n set visible(value: boolean) {\n this.setEnabled(value);\n }\n\n get uuid(): string {\n return this.uniqueId.toString();\n }\n\n constructor(system: IParticleSystem, scene?: Scene) {\n super('particleEmitter', scene || undefined);\n this.system = system;\n }\n\n dispose(): void {\n super.dispose();\n }\n\n extractFromCache(cache: any): any[] {\n const values: any[] = [];\n for (const key in cache) {\n const data = cache[key];\n if (data && typeof data === 'object') {\n delete data.metadata;\n }\n values.push(data);\n }\n return values;\n }\n\n clone(name?: string): ParticleEmitter {\n const clonedSystem = this.system.clone();\n const clonedEmitter = clonedSystem.emitter as ParticleEmitter;\n clonedEmitter.name = name ?? this.name;\n clonedEmitter.position.copyFrom(this.position);\n clonedEmitter.rotation.copyFrom(this.rotation);\n clonedEmitter.scaling.copyFrom(this.scaling);\n if (this.rotationQuaternion) {\n clonedEmitter.rotationQuaternion = this.rotationQuaternion.clone();\n }\n clonedEmitter.setEnabled(this.isEnabled());\n return clonedEmitter;\n }\n\n toJSON(meta?: any, options: SerializationOptions = {}): any {\n return {\n uuid: (this as any)._quarksUUID ?? this.uniqueId.toString(),\n type: 'ParticleEmitter',\n name: this.name,\n position: [this.position.x, this.position.y, this.position.z],\n rotation: [this.rotation.x, this.rotation.y, this.rotation.z],\n quaternion: this.rotationQuaternion\n ? [\n this.rotationQuaternion.x,\n this.rotationQuaternion.y,\n this.rotationQuaternion.z,\n this.rotationQuaternion.w,\n ]\n : undefined,\n scale: [this.scaling.x, this.scaling.y, this.scaling.z],\n visible: this.isEnabled(),\n ps: this.system.toJSON(meta, options),\n };\n }\n}\n","/** Sequential 0..N-1 indices for non-indexed triangle-list BufferGeometry (Three.js drawArrays). */\nexport function ensureTriangleIndices(\n positions: Float32Array,\n indices?: Uint32Array | Uint16Array\n): Uint32Array | Uint16Array {\n if (indices && indices.length > 0) {\n return indices;\n }\n const vertexCount = positions.length / 3;\n const out = new Uint32Array(vertexCount);\n for (let i = 0; i < vertexCount; i++) {\n out[i] = i;\n }\n return out;\n}\n","import {Constants} from '@babylonjs/core/Engines/constants';\nimport {BaseTexture} from '@babylonjs/core/Materials/Textures/baseTexture';\nimport {Texture} from '@babylonjs/core/Materials/Textures/texture';\nimport {Scene} from '@babylonjs/core/scene';\nimport {\n AxisAngleGenerator,\n Behavior,\n BehaviorFromJSON,\n ColorGenerator,\n ColorGeneratorFromJSON,\n ConstantColor,\n ConstantValue,\n EmissionState,\n EmitterFromJSON,\n EmitterShape,\n FunctionColorGenerator,\n FunctionJSON,\n FunctionValueGenerator,\n FusionStep,\n GeneratorFromJSON,\n GeneratorMemory,\n IParticleSystem,\n Matrix3,\n Matrix4,\n Particle,\n ParticleStore,\n ParticleSystemEvent,\n ParticleSystemEventType,\n planBehaviorFusion,\n Quaternion,\n RendererEmitterSettings,\n RotationGenerator,\n SerializationOptions,\n SphereEmitter,\n SpriteParticle,\n StretchedBillBoardSettings,\n TrailParticle,\n TrailSettings,\n ValueGenerator,\n ValueGeneratorFromJSON,\n Vector2,\n Vector3,\n Vector3Generator,\n Vector4,\n} from 'quarks.core';\nimport {BatchedRenderer, VFXBatchSettings} from './BatchedRenderer';\nimport {ensureEnvAtlasFromCube, getCachedEnvAtlas} from './envAtlas';\nimport {ensureTriangleIndices} from './geometryUtil';\nimport {ParticleEmitter} from './ParticleEmitter';\nimport {MeshLighting, MeshRim, normalizeMeshRim, RenderMode} from './VFXBatch';\n\nexport interface BurstParameters {\n time: number;\n count: ValueGenerator | FunctionValueGenerator;\n cycle: number;\n interval: number;\n probability: number;\n}\n\n/** Particle backed by a {@link ParticleStore} row, as this system always creates. */\ntype StoreBackedParticle = Particle & {storeIndex: number; setStoreIndex(index: number): void};\n\nconst UP = new Vector3(0, 0, 1);\nconst tempQ = new Quaternion();\nconst IDENTITY_QUATERNION = new Quaternion();\nconst tempV = new Vector3();\nconst tempV2 = new Vector3();\nconst PREWARM_FPS = 60;\nconst SIMULATION_STEP = 1 / PREWARM_FPS;\nconst MAX_SIMULATION_STEPS_PER_FRAME = 8;\n// Math.round() breaks an exact tie (accumulator sitting at precisely half a\n// step) by rounding up. At exactly 120Hz that tie is not a corner case — it is\n// every single frame — and rounding it up would run a step on every one of\n// them instead of every other one. Nudging the tie down costs nothing on a\n// real display (real frame times essentially never land on the tie exactly)\n// and keeps the well-tested \"half a step is no step yet\" behavior.\nconst ROUND_TIE_BIAS = 1e-9;\n\n/** Built-in behaviors that write a particle's size / colour, and those that touch neither. */\nconst SIZE_BEHAVIORS = new Set(['SizeOverLife', 'SizeBySpeed']);\nconst COLOR_BEHAVIORS = new Set(['ColorOverLife', 'ColorBySpeed']);\nconst INERT_FOR_SIZE_AND_COLOR = new Set([\n 'ApplyForce',\n 'Noise',\n 'TurbulenceField',\n 'GravityForce',\n 'RotationOverLife',\n 'Rotation3DOverLife',\n 'RotationBySpeed',\n 'SpeedOverLife',\n 'FrameOverLife',\n 'ForceOverLife',\n 'VelocityOverLife',\n 'InheritVelocity',\n 'OrbitOverLife',\n 'WidthOverLength',\n 'ChangeEmitDirection',\n 'EmitSubParticleSystem',\n 'LimitSpeedOverLife',\n 'ApplyCollision',\n]);\n\nconst DEFAULT_POSITIONS = new Float32Array([-0.5, -0.5, 0, 0.5, -0.5, 0, 0.5, 0.5, 0, -0.5, 0.5, 0]);\nconst DEFAULT_UVS = new Float32Array([0, 0, 1, 0, 1, 1, 0, 1]);\n\n/** Zero UVs sized to a position buffer — missing/mismatched uv attrs → GL_INVALID_OPERATION on iOS. */\nfunction fallbackUVsForPositions(positions: Float32Array): Float32Array {\n return new Float32Array((positions.length / 3) * 2);\n}\nconst DEFAULT_INDICES = new Uint32Array([0, 1, 2, 0, 2, 3]);\n\n/** The optional trail flags that are switched on, so JSON and clones only carry the ones in use. */\nfunction trailFlags(settings: TrailSettings | undefined): Partial<TrailSettings> {\n const flags: Partial<TrailSettings> = {};\n if (settings?.uvFromHead) flags.uvFromHead = true;\n if (settings?.colorFromParticle) flags.colorFromParticle = true;\n if (settings?.dieWithParticle) flags.dieWithParticle = true;\n if (settings?.recordWorldSpace) flags.recordWorldSpace = true;\n return flags;\n}\n\nexport interface ParticleSystemParameters {\n autoDestroy?: boolean;\n looping?: boolean;\n prewarm?: boolean;\n duration?: number;\n startDelay?: ValueGenerator | FunctionValueGenerator;\n shape?: EmitterShape;\n startLife?: ValueGenerator | FunctionValueGenerator;\n startSpeed?: ValueGenerator | FunctionValueGenerator;\n startRotation?: ValueGenerator | FunctionValueGenerator | RotationGenerator;\n startSize?: ValueGenerator | FunctionValueGenerator | Vector3Generator;\n startLength?: ValueGenerator | FunctionValueGenerator;\n startColor?: ColorGenerator | FunctionColorGenerator;\n emissionOverTime?: ValueGenerator | FunctionValueGenerator;\n emissionOverDistance?: ValueGenerator | FunctionValueGenerator;\n emissionBursts?: Array<BurstParameters>;\n /** Most particles alive at once; emission past it is dropped. Leave unset for no limit. */\n maxParticles?: number;\n onlyUsedByOther?: boolean;\n behaviors?: Array<Behavior>;\n instancingGeometry?: Float32Array;\n instancingIndices?: Uint32Array | Uint16Array;\n instancingUVs?: Float32Array;\n instancingNormals?: Float32Array;\n renderMode?: RenderMode;\n rendererEmitterSettings?: RendererEmitterSettings;\n speedFactor?: number;\n material?: any;\n texture?: Texture | null;\n startTileIndex?: ValueGenerator;\n uTileCount?: number;\n vTileCount?: number;\n blendTiles?: boolean;\n softParticles?: boolean;\n softFarFade?: number;\n softNearFade?: number;\n renderOrder?: number;\n worldSpace?: boolean;\n blendMode?: number;\n transparent?: boolean;\n depthTest?: boolean;\n depthWrite?: boolean;\n alphaTest?: number;\n layerMask?: number;\n /** Billboard pivot in particle-size units, see {@link VFXBatchSettings.pivot}. */\n pivot?: Vector3;\n /** Fraction of billboard particles mirrored along U (x) and V (y), see {@link ParticleSystem.flip}. */\n flip?: Vector2;\n /** How mesh particles are lit, see {@link ParticleSystem.lighting}. Default `'fixed'`. */\n lighting?: MeshLighting;\n /** Rim (Fresnel) term on mesh particles, see {@link ParticleSystem.rim}. Default none. */\n rim?: Partial<MeshRim>;\n scene?: Scene;\n}\n\nexport interface BurstParametersJSON {\n time: number;\n count: FunctionJSON | number;\n cycle: number;\n interval: number;\n probability: number;\n}\n\nexport interface ParticleSystemJSONParameters {\n version: string;\n autoDestroy: boolean;\n looping: boolean;\n prewarm: boolean;\n duration: number;\n startDelay?: FunctionJSON;\n shape: any;\n startLife: FunctionJSON;\n startSpeed: FunctionJSON;\n startRotation: FunctionJSON;\n startSize: FunctionJSON;\n startColor: FunctionJSON;\n emissionOverTime: FunctionJSON;\n emissionOverDistance: FunctionJSON;\n emissionBursts?: Array<BurstParametersJSON>;\n maxParticles?: number;\n onlyUsedByOther: boolean;\n rendererEmitterSettings: RendererEmitterSettings;\n instancingGeometry?: any;\n renderMode: number;\n renderOrder?: number;\n speedFactor?: number;\n texture?: string;\n material?: string;\n layers?: number;\n startTileIndex: FunctionJSON | number;\n uTileCount: number;\n vTileCount: number;\n blendTiles?: boolean;\n softParticles?: boolean;\n softFarFade?: number;\n softNearFade?: number;\n blending?: number;\n transparent?: boolean;\n depthTest?: boolean;\n depthWrite?: boolean;\n alphaTest?: number;\n behaviors: Array<any>;\n worldSpace: boolean;\n /** `[x, y, z]`; written only when non-zero. */\n pivot?: number[];\n /** `[u, v]`; written only when non-zero. */\n flip?: number[];\n}\n\nexport interface BabylonMetaData {\n textures: {[uuid: string]: Texture | null};\n materials: {[uuid: string]: any};\n geometries: {[uuid: string]: any};\n images?: {[uuid: string]: any};\n shapes?: {[uuid: string]: any};\n skeletons?: {[uuid: string]: any};\n animations?: {[uuid: string]: any};\n nodes?: {[uuid: string]: any};\n}\n\nexport class ParticleSystem implements IParticleSystem {\n private static serializationCounter = 0;\n\n autoDestroy: boolean;\n prewarm: boolean;\n looping: boolean;\n duration: number;\n startDelay: ValueGenerator | FunctionValueGenerator;\n startLife: ValueGenerator | FunctionValueGenerator;\n startSpeed: ValueGenerator | FunctionValueGenerator;\n startRotation: ValueGenerator | FunctionValueGenerator | RotationGenerator;\n startSize: ValueGenerator | FunctionValueGenerator | Vector3Generator;\n startColor: ColorGenerator | FunctionColorGenerator;\n startTileIndex: ValueGenerator;\n rendererEmitterSettings: RendererEmitterSettings;\n /**\n * Fraction of billboard particles mirrored along U (x) and V (y), each\n * picked at random when the particle is born — Unity's renderer Flip.\n * Undefined: nothing is mirrored. Meshes ignore it.\n */\n flip?: Vector2;\n emissionOverTime: ValueGenerator | FunctionValueGenerator;\n emissionOverDistance: ValueGenerator | FunctionValueGenerator;\n emissionBursts: Array<BurstParameters>;\n /** Most particles alive at once (Unity's Max Particles); emission past it is dropped. Undefined means no limit. */\n maxParticles?: number;\n onlyUsedByOther: boolean;\n worldSpace: boolean;\n particleNum: number;\n paused: boolean;\n particles: Array<Particle>;\n /** Column storage shared by this system's particles. */\n readonly store: ParticleStore = new ParticleStore(64);\n emitterShape: EmitterShape;\n emitter: ParticleEmitter;\n rendererSettings: VFXBatchSettings;\n neededToUpdateRender: boolean;\n behaviors: Array<Behavior>;\n emissionState: EmissionState;\n emitterVelocity: Vector3 = new Vector3();\n\n private prewarmed: boolean;\n private emitEnded: boolean;\n private markForDestroy: boolean;\n private finishedEventFired = false;\n private startDelayTimeLeft = 0;\n private previousEmitterPos?: Vector3;\n private tempEmitterPos: Vector3 = new Vector3();\n private temp: Vector3 = new Vector3();\n /** Emitter matrix moved along the step's path, see spawnAlongPath. */\n private pathMatrix: Matrix4 = new Matrix4();\n private normalMatrix: Matrix3 = new Matrix3();\n private memory: GeneratorMemory = [];\n private listeners: {[event: string]: Array<(event: ParticleSystemEvent) => void>} = {};\n private readonly layerMaskProxy: {mask: number};\n private materialRef: any = null;\n private sceneRef: Scene | undefined;\n private qualityFactor = 1;\n private simulationAccumulator = 0;\n private destroyed = false;\n /** Behaviors the cached plan was built from, compared by identity. */\n private fusionPlan?: Array<Behavior>;\n private fusionSteps: Array<FusionStep> = [];\n /**\n * Whether any behavior in the plan can change a particle's size or colour\n * after birth. Only then does a step have to snapshot them for the renderer.\n */\n private planChangesSize = true;\n private planChangesColor = true;\n /** @internal **/\n _renderer?: BatchedRenderer;\n\n set time(time: number) {\n this.emissionState.time = time;\n }\n\n get time(): number {\n return this.emissionState.time;\n }\n\n get isEmitEnded(): boolean {\n return this.emitEnded;\n }\n\n /** Whether continuous or queued emission can still spawn particles before the system is done. */\n hasPendingEmission(): boolean {\n if (this.looping) {\n return true;\n }\n if (this.emitEnded) {\n return false;\n }\n if (this.onlyUsedByOther) {\n return false;\n }\n const state = this.emissionState;\n if (state.waitEmiting > 0) {\n return true;\n }\n if (state.burstIndex < this.emissionBursts.length) {\n return true;\n }\n if (this.hasPendingBurstWaves(state)) {\n return true;\n }\n if (state.time >= this.duration) {\n return false;\n }\n const timeRatio = state.time / this.duration;\n if (this.emissionOverTime.genValue(this.memory, timeRatio) > 0) {\n return true;\n }\n return this.emissionOverDistance.genValue(this.memory, timeRatio) > 0;\n }\n\n /** Non-looping system with no particles left and nothing left to emit. */\n isFinished(): boolean {\n if (this.looping) {\n return false;\n }\n if (this.particleNum > 0) {\n return false;\n }\n if (this.onlyUsedByOther) {\n return true;\n }\n return !this.hasPendingEmission();\n }\n\n get layers() {\n return this.layerMaskProxy;\n }\n\n get texture() {\n return this.rendererSettings.texture;\n }\n\n set texture(texture: Texture | null) {\n this.rendererSettings.texture = texture;\n this.neededToUpdateRender = true;\n }\n\n get material() {\n return this.materialRef;\n }\n\n set material(material: any) {\n this.materialRef = material;\n this.applyMaterialSettings(material);\n }\n\n get uTileCount() {\n return this.rendererSettings.uTileCount;\n }\n\n set uTileCount(u: number) {\n this.rendererSettings.uTileCount = u;\n this.neededToUpdateRender = true;\n }\n\n get vTileCount() {\n return this.rendererSettings.vTileCount;\n }\n\n set vTileCount(v: number) {\n this.rendererSettings.vTileCount = v;\n this.neededToUpdateRender = true;\n }\n\n get blendTiles() {\n return this.rendererSettings.blendTiles;\n }\n\n set blendTiles(v: boolean) {\n this.rendererSettings.blendTiles = v;\n this.neededToUpdateRender = true;\n }\n\n get softParticles() {\n return this.rendererSettings.softParticles;\n }\n\n set softParticles(v: boolean) {\n this.rendererSettings.softParticles = v;\n this.neededToUpdateRender = true;\n }\n\n /**\n * Billboard pivot in particle-size units (Unity's renderer Pivot), see\n * {@link VFXBatchSettings.pivot}. Assign a new vector to change it: editing\n * the returned one in place does not reach the renderer.\n */\n get pivot(): Vector3 | undefined {\n return this.rendererSettings.pivot;\n }\n\n set pivot(v: Vector3 | undefined) {\n this.rendererSettings.pivot = ParticleSystem.nonZeroPivot(v);\n this.neededToUpdateRender = true;\n }\n\n /**\n * How mesh particles are lit: `'fixed'` (the default — the renderer's\n * light, see {@link BatchedRenderer.setMeshLighting}), `'unlit'` (texture\n * times colour, for emissive meshes) or `'scene'` (the scene's first\n * directional or hemispheric light). Saved with the material in the effect\n * JSON. Other render modes ignore it.\n */\n get lighting(): MeshLighting {\n return this.rendererSettings.lighting ?? 'fixed';\n }\n\n set lighting(lighting: MeshLighting) {\n this.rendererSettings.lighting = ParticleSystem.validLighting(lighting);\n this.neededToUpdateRender = true;\n }\n\n /**\n * Rim (Fresnel) term on mesh particles — a glowing edge (`mode: 'add'`) or\n * an outline (`'mix'`), see {@link MeshRim}. Undefined (the default) draws\n * none. Fields left out of an assigned rim take their defaults; assign a\n * new object to change it, editing the returned one does not reach the\n * renderer. Saved with the material in the effect JSON. Other render modes\n * ignore it.\n */\n get rim(): MeshRim | undefined {\n return this.rendererSettings.rim;\n }\n\n set rim(rim: Partial<MeshRim> | undefined) {\n this.rendererSettings.rim = normalizeMeshRim(rim);\n this.neededToUpdateRender = true;\n }\n\n /** `lighting` if it is one of the modes, else the default. */\n private static validLighting(lighting: unknown): MeshLighting {\n return lighting === 'unlit' || lighting === 'scene' ? lighting : 'fixed';\n }\n\n private static nonZeroPivot(v: Vector3 | undefined): Vector3 | undefined {\n return v && (v.x !== 0 || v.y !== 0 || v.z !== 0) ? v.clone() : undefined;\n }\n\n private static nonZeroFlip(v: Vector2 | undefined): Vector2 | undefined {\n return v && (v.x > 0 || v.y > 0) ? v.clone() : undefined;\n }\n\n get softNearFade() {\n return this.rendererSettings.softNearFade;\n }\n\n set softNearFade(v: number) {\n this.rendererSettings.softNearFade = v;\n this.neededToUpdateRender = true;\n }\n\n get softFarFade() {\n return this.rendererSettings.softFarFade;\n }\n\n set softFarFade(v: number) {\n this.rendererSettings.softFarFade = v;\n this.neededToUpdateRender = true;\n }\n\n get instancingGeometry(): Float32Array {\n return this.rendererSettings.instancingGeometry;\n }\n\n set instancingGeometry(geometry: Float32Array) {\n this.restart();\n this.particles.length = 0;\n this.rendererSettings.instancingGeometry = geometry;\n this.neededToUpdateRender = true;\n }\n\n get blending() {\n return this.rendererSettings.materialBlendMode;\n }\n\n set blending(blending: number) {\n this.rendererSettings.materialBlendMode = blending;\n this.neededToUpdateRender = true;\n }\n\n get renderMode(): RenderMode {\n return this.rendererSettings.renderMode;\n }\n\n set renderMode(renderMode: RenderMode) {\n if (this.rendererSettings.renderMode !== renderMode) {\n let needRestart = false;\n if (this.rendererSettings.renderMode === RenderMode.Trail) {\n needRestart = true;\n }\n if (this.rendererSettings.renderMode === RenderMode.Mesh) {\n this.startRotation = new ConstantValue(0);\n }\n switch (renderMode) {\n case RenderMode.Trail:\n this.rendererEmitterSettings = {startLength: new ConstantValue(30), followLocalOrigin: false};\n needRestart = true;\n break;\n case RenderMode.Mesh:\n this.rendererEmitterSettings = {};\n this.startRotation = new AxisAngleGenerator(new Vector3(0, 1, 0), new ConstantValue(0));\n break;\n case RenderMode.StretchedBillBoard:\n this.rendererEmitterSettings = {speedFactor: 0, lengthFactor: 2};\n break;\n case RenderMode.BillBoard:\n case RenderMode.VerticalBillBoard:\n case RenderMode.HorizontalBillBoard:\n this.rendererEmitterSettings = {};\n break;\n }\n this.rendererSettings.renderMode = renderMode;\n if (needRestart) {\n this.restart();\n this.particles.length = 0;\n }\n this.neededToUpdateRender = true;\n }\n }\n\n get renderOrder(): number {\n return this.rendererSettings.renderOrder;\n }\n\n set renderOrder(renderOrder: number) {\n this.rendererSettings.renderOrder = renderOrder;\n this.neededToUpdateRender = true;\n }\n\n constructor(parameters: ParticleSystemParameters) {\n this.sceneRef = parameters.scene;\n this.layerMaskProxy = {mask: parameters.layerMask ?? 0x0fffffff};\n Object.defineProperty(this.layerMaskProxy, 'mask', {\n enumerable: true,\n get: () => this.rendererSettings.layerMask,\n set: (mask: number) => {\n this.rendererSettings.layerMask = mask;\n this.neededToUpdateRender = true;\n },\n });\n\n this.autoDestroy = parameters.autoDestroy ?? false;\n this.duration = parameters.duration ?? 1;\n this.startDelay = parameters.startDelay ?? new ConstantValue(0);\n this.looping = parameters.looping ?? true;\n this.prewarm = parameters.prewarm ?? false;\n this.startLife = parameters.startLife ?? new ConstantValue(5);\n this.startSpeed = parameters.startSpeed ?? new ConstantValue(0);\n this.startRotation = parameters.startRotation ?? new ConstantValue(0);\n this.startSize = parameters.startSize ?? new ConstantValue(1);\n this.startColor = parameters.startColor ?? new ConstantColor(new Vector4(1, 1, 1, 1));\n this.emissionOverTime = parameters.emissionOverTime ?? new ConstantValue(10);\n this.emissionOverDistance = parameters.emissionOverDistance ?? new ConstantValue(0);\n this.emissionBursts = parameters.emissionBursts ?? [];\n this.maxParticles = parameters.maxParticles;\n this.onlyUsedByOther = parameters.onlyUsedByOther ?? false;\n this.emitterShape = parameters.shape ?? new SphereEmitter();\n this.behaviors = parameters.behaviors ?? [];\n this.worldSpace = parameters.worldSpace ?? false;\n this.rendererEmitterSettings = parameters.rendererEmitterSettings ?? {};\n\n if (parameters.renderMode === RenderMode.StretchedBillBoard) {\n const settings = this.rendererEmitterSettings as StretchedBillBoardSettings;\n if (parameters.speedFactor !== undefined) {\n settings.speedFactor = parameters.speedFactor;\n }\n settings.speedFactor = settings.speedFactor ?? 0;\n settings.lengthFactor = settings.lengthFactor ?? 0;\n }\n\n this.rendererSettings = {\n instancingGeometry: parameters.instancingGeometry ?? DEFAULT_POSITIONS,\n instancingIndices: parameters.instancingIndices ?? DEFAULT_INDICES,\n instancingUVs:\n parameters.instancingUVs ??\n (parameters.instancingGeometry ? fallbackUVsForPositions(parameters.instancingGeometry) : DEFAULT_UVS),\n instancingNormals: parameters.instancingNormals,\n renderMode: parameters.renderMode ?? RenderMode.BillBoard,\n renderOrder: parameters.renderOrder ?? 0,\n uTileCount: parameters.uTileCount ?? 1,\n vTileCount: parameters.vTileCount ?? 1,\n blendTiles: parameters.blendTiles ?? false,\n softParticles: parameters.softParticles ?? false,\n softNearFade: parameters.softNearFade ?? 0,\n softFarFade: parameters.softFarFade ?? 0,\n materialBlendMode: parameters.blendMode ?? Constants.ALPHA_ADD,\n materialTransparent: parameters.transparent ?? true,\n materialDepthTest: parameters.depthTest ?? true,\n materialDepthWrite: parameters.depthWrite ?? false,\n materialAlphaTest: parameters.alphaTest ?? 0,\n texture: parameters.texture ?? null,\n reflectionTexture: null,\n reflectionLevel: 1,\n reflectionFaces: null,\n reflectionAtlas: null,\n layerMask: parameters.layerMask ?? 0x0fffffff,\n pivot: ParticleSystem.nonZeroPivot(parameters.pivot),\n lighting: ParticleSystem.validLighting(parameters.lighting),\n rim: normalizeMeshRim(parameters.rim),\n };\n this.flip = ParticleSystem.nonZeroFlip(parameters.flip);\n if (this.rendererSettings.renderMode === RenderMode.Mesh && !this.rendererSettings.instancingNormals) {\n this.rendererSettings.instancingNormals = ParticleSystem.createFallbackNormals(\n this.rendererSettings.instancingGeometry\n );\n }\n\n this.materialRef = parameters.material ?? null;\n this.applyMaterialSettings(this.materialRef, {\n blendMode: parameters.blendMode,\n transparent: parameters.transparent,\n depthTest: parameters.depthTest,\n depthWrite: parameters.depthWrite,\n alphaTest: parameters.alphaTest,\n texture: parameters.texture,\n layerMask: parameters.layerMask,\n });\n this.neededToUpdateRender = true;\n\n this.particles = [];\n this.startTileIndex = parameters.startTileIndex || new ConstantValue(0);\n this.emitter = new ParticleEmitter(this, parameters.scene);\n\n this.paused = false;\n this.particleNum = 0;\n this.emissionState = {\n isBursting: false,\n burstParticleIndex: 0,\n burstParticleCount: 0,\n burstIndex: 0,\n burstWaveIndex: 0,\n time: 0,\n waitEmiting: 0,\n travelDistance: 0,\n };\n\n this.emissionBursts.forEach((burst) => burst.count.startGen(this.memory));\n this.emissionOverDistance.startGen(this.memory);\n this.startDelay.startGen(this.memory);\n this.startDelayTimeLeft = this.startDelay.genValue(this.memory, 0);\n\n this.emitEnded = false;\n this.markForDestroy = false;\n this.prewarmed = false;\n }\n\n private applyMaterialSettings(\n material: any,\n overrides: {\n blendMode?: number;\n transparent?: boolean;\n depthTest?: boolean;\n depthWrite?: boolean;\n alphaTest?: number;\n texture?: Texture | null;\n reflectionAtlas?: BaseTexture | null;\n layerMask?: number;\n } = {}\n ) {\n /* istanbul ignore if -- rendererSettings is always assigned in the constructor before any code path can call this private method */\n if (!this.rendererSettings) {\n return;\n }\n\n const resolvedTexture =\n overrides.texture !== undefined\n ? overrides.texture\n : (material?.albedoTexture ??\n material?.diffuseTexture ??\n material?.emissiveTexture ??\n material?.opacityTexture ??\n material?.baseTexture ??\n this.rendererSettings.texture ??\n null);\n const resolvedReflection =\n material?.reflectionTexture ??\n material?.environmentTexture ??\n this.rendererSettings.reflectionTexture ??\n null;\n const resolvedReflectionLevel = typeof resolvedReflection?.level === 'number' ? resolvedReflection.level : 1;\n const resolvedBlendMode =\n overrides.blendMode ??\n (typeof material?.alphaMode === 'number' ? material.alphaMode : this.rendererSettings.materialBlendMode);\n const resolvedTransparent =\n overrides.transparent ??\n (typeof material?.needAlphaBlending === 'function'\n ? material.needAlphaBlending()\n : typeof material?.alpha === 'number'\n ? material.alpha < 1\n : this.rendererSettings.materialTransparent);\n const resolvedDepthTest =\n overrides.depthTest ??\n (typeof material?.disableDepthTest === 'boolean'\n ? !material.disableDepthTest\n : this.rendererSettings.materialDepthTest);\n const resolvedDepthWrite =\n overrides.depthWrite ??\n (typeof material?.disableDepthWrite === 'boolean'\n ? !material.disableDepthWrite\n : typeof material?.forceDepthWrite === 'boolean'\n ? material.forceDepthWrite\n : this.rendererSettings.materialDepthWrite);\n const resolvedAlphaTest =\n overrides.alphaTest ??\n (() => {\n // StandardMaterial always has alphaCutOff (default 0.4). Only treat it as\n // particle alpha-test when the material is actually in an alpha-test mode —\n // otherwise Mesh Material demos wrongly enable USE_ALPHATEST.\n const mode = material?.transparencyMode;\n const alphaTestMode = mode === 1 || mode === 3;\n if (alphaTestMode && typeof material?.alphaCutOff === 'number') {\n return material.alphaCutOff;\n }\n if (alphaTestMode && typeof material?.alphaCutOffValue === 'number') {\n return material.alphaCutOffValue;\n }\n if (material) {\n return 0;\n }\n return this.rendererSettings.materialAlphaTest;\n })();\n\n this.rendererSettings.texture = resolvedTexture;\n this.rendererSettings.reflectionTexture = resolvedReflection;\n this.rendererSettings.reflectionLevel =\n typeof material?.reflectionLevel === 'number' ? material.reflectionLevel : resolvedReflectionLevel;\n // Prefer an explicit atlas; otherwise build a 3×2 atlas from CubeTexture\n // face URLs (iOS-safe single sampler2D — not samplerCube / six faces).\n let resolvedAtlas =\n material?.reflectionAtlas ?? overrides.reflectionAtlas ?? this.rendererSettings.reflectionAtlas ?? null;\n if (!resolvedAtlas && resolvedReflection?.isCube) {\n resolvedAtlas = getCachedEnvAtlas(resolvedReflection);\n if (!resolvedAtlas && this.sceneRef) {\n ensureEnvAtlasFromCube(resolvedReflection, this.sceneRef, (atlas) => {\n if (this.rendererSettings.reflectionAtlas === atlas) {\n return;\n }\n this.rendererSettings.reflectionAtlas = atlas;\n if (material && material.reflectionAtlas == null) {\n material.reflectionAtlas = atlas;\n }\n this.neededToUpdateRender = true;\n });\n resolvedAtlas = getCachedEnvAtlas(resolvedReflection);\n }\n }\n this.rendererSettings.reflectionAtlas = resolvedAtlas;\n // Do not expand cube files into six face textures anymore — that path\n // still trips GL_INVALID_OPERATION on iOS. Prefer a single atlas.\n this.rendererSettings.reflectionFaces =\n material?.reflectionFaces?.length === 6 ? material.reflectionFaces : null;\n this.rendererSettings.materialBlendMode = resolvedBlendMode;\n this.rendererSettings.materialTransparent = resolvedTransparent;\n this.rendererSettings.materialDepthTest = resolvedDepthTest;\n this.rendererSettings.materialDepthWrite = resolvedDepthWrite;\n this.rendererSettings.materialAlphaTest = resolvedAlphaTest;\n if (overrides.layerMask !== undefined) {\n this.rendererSettings.layerMask = overrides.layerMask;\n }\n this.neededToUpdateRender = true;\n }\n\n pause() {\n this.paused = true;\n }\n play() {\n this.paused = false;\n }\n stop() {\n this.restart();\n this.pause();\n }\n\n setQualityFactor(qualityFactor: number) {\n this.qualityFactor = Math.max(0.1, Math.min(1, qualityFactor));\n }\n\n /**\n * Appends one particle to the pool, giving it the next row of the store.\n *\n * Growing the store replaces its arrays, so every particle already bound to\n * it has to be re-pointed at the new ones.\n */\n /** Points every particle at the store's columns again, after any were replaced. */\n private rebindParticles(): void {\n const particles = this.particles;\n for (let i = 0; i < particles.length; i++) {\n (particles[i] as SpriteParticle | TrailParticle).rebind();\n }\n }\n\n private growParticlePool(isTrailMode: boolean): void {\n const index = this.particles.length;\n if (this.store.ensureCapacity(index + 1)) {\n this.rebindParticles();\n }\n this.particles.push(isTrailMode ? new TrailParticle(this.store, index) : new SpriteParticle(this.store, index));\n }\n\n private spawn(count: number, emissionState: EmissionState, matrix: Matrix4) {\n const translation = tempV;\n const scale = tempV2;\n // decompose writes tempQ, so no separate setFromRotationMatrix is needed.\n matrix.decompose(translation, tempQ, scale);\n const behaviors = this.behaviors;\n const behaviorCount = behaviors.length;\n const renderMode = this.rendererSettings.renderMode;\n const isTrailMode = renderMode === RenderMode.Trail;\n const isSpriteMode = !isTrailMode;\n const isMeshMode = renderMode === RenderMode.Mesh;\n const startRotationIsRotation = this.startRotation.type === 'rotation';\n const startSizeIsVector3 = this.startSize.type === 'vec3function';\n const timeRatio = emissionState.time / this.duration;\n const trailSettings = isTrailMode ? (this.rendererEmitterSettings as TrailSettings) : undefined;\n const followLocalOrigin = Boolean(trailSettings?.followLocalOrigin);\n if (this.maxParticles !== undefined) {\n // Like Unity, a full system skips the particles it has no room for rather than queueing them.\n count = Math.min(count, Math.max(0, this.maxParticles - this.particleNum));\n }\n\n for (let i = 0; i < count; i++) {\n emissionState.burstParticleIndex = i;\n this.particleNum++;\n if (this.particles.length < this.particleNum) {\n this.growParticlePool(isTrailMode);\n }\n const particle = this.particles[this.particleNum - 1];\n particle.reset();\n particle.speedModifier = 1;\n // Parent EmitSub can refill an onlyUsedByOther system after it had\n // already finished empty; clear the flag so update does not treat it\n // as done while it has live particles again.\n this.finishedEventFired = false;\n this.startColor.startGen(particle.memory);\n this.startColor.genColor(particle.memory, particle.startColor, this.emissionState.time);\n particle.color.copy(particle.startColor);\n this.startSpeed.startGen(particle.memory);\n particle.startSpeed = this.startSpeed.genValue(particle.memory, timeRatio);\n this.startLife.startGen(particle.memory);\n particle.life = this.startLife.genValue(particle.memory, timeRatio);\n particle.age = 0;\n this.startSize.startGen(particle.memory);\n if (startSizeIsVector3) {\n (this.startSize as Vector3Generator).genValue(particle.memory, particle.startSize, timeRatio);\n } else {\n const size = (this.startSize as FunctionValueGenerator).genValue(particle.memory, timeRatio);\n particle.startSize.set(size, size, size);\n }\n this.startTileIndex.startGen(particle.memory);\n particle.uvTile = this.startTileIndex.genValue(particle.memory);\n particle.size.copy(particle.startSize);\n\n if (isSpriteMode) {\n const sprite = particle as SpriteParticle;\n this.startRotation.startGen(particle.memory);\n if (isMeshMode) {\n if (!(sprite.rotation instanceof Quaternion)) {\n // Assigning a quaternion gives the particle a row in the\n // store's quaternion column; the value is overwritten below.\n sprite.rotation = IDENTITY_QUATERNION;\n }\n // A recycled particle can still carry the turn of whatever\n // it was last time; the renderer would draw a fraction of it\n // before any behavior has had a chance to say otherwise.\n if (sprite.angularVelocity instanceof Quaternion) {\n sprite.angularVelocity.set(0, 0, 0, 1);\n }\n if (startRotationIsRotation) {\n (this.startRotation as RotationGenerator).genValue(\n particle.memory,\n sprite.rotation as Quaternion,\n 1,\n timeRatio\n );\n } else {\n (sprite.rotation as Quaternion).setFromAxisAngle(\n UP,\n (this.startRotation as FunctionValueGenerator).genValue(sprite.memory, timeRatio)\n );\n }\n } else {\n if (startRotationIsRotation) {\n sprite.rotation = 0;\n } else {\n sprite.rotation = (this.startRotation as FunctionValueGenerator).genValue(\n sprite.memory,\n timeRatio\n );\n }\n // Set until a turning behavior says otherwise, so the\n // renderer never carries a recycled particle's old spin.\n sprite.angularVelocity = 0;\n const flip = this.flip;\n sprite.flip =\n flip === undefined ? 0 : (Math.random() < flip.x ? 1 : 0) | (Math.random() < flip.y ? 2 : 0);\n }\n } else if (trailSettings) {\n const trail = particle as TrailParticle;\n trailSettings.startLength.startGen(trail.memory);\n trail.length = trailSettings.startLength.genValue(trail.memory, timeRatio);\n trail.ensureHistoryCapacity(Math.max(1, Math.ceil(trail.length)));\n trail.resetHistory();\n }\n\n this.emitterShape.initialize(particle, emissionState);\n\n if (isTrailMode && followLocalOrigin) {\n const trail = particle as TrailParticle;\n if (!trail.localPosition) {\n trail.localPosition = new Vector3();\n }\n trail.localPosition.copy(trail.position);\n }\n\n if (this.worldSpace) {\n particle.position.applyMatrix4(matrix);\n particle.startSize.multiply(scale).abs();\n particle.size.copy(particle.startSize);\n particle.velocity.multiply(scale).applyMatrix3(this.normalMatrix);\n if (particle.rotation && particle.rotation instanceof Quaternion) {\n particle.rotation.multiplyQuaternions(tempQ, particle.rotation);\n }\n } else {\n if (this.onlyUsedByOther) {\n particle.parentMatrix = matrix;\n }\n }\n\n for (let j = 0; j < behaviorCount; j++) {\n behaviors[j].initialize(particle, this);\n }\n // Every generator has claimed its slot by now; give the compiled\n // behavior passes a column copy of the samples.\n this.store.recordMemory((particle as StoreBackedParticle).storeIndex, particle.memory);\n }\n }\n\n endEmit() {\n this.emitEnded = true;\n if (this.autoDestroy) {\n this.markForDestroy = true;\n }\n this.fire({type: 'emitEnd', particleSystem: this});\n }\n\n dispose() {\n if (this.destroyed) {\n return;\n }\n this.destroyed = true;\n if (this._renderer) this._renderer.deleteSystem(this);\n this.emitter.dispose();\n this.fire({type: 'destroy', particleSystem: this});\n }\n\n restart() {\n this.memory.length = 0;\n this.paused = false;\n this.particleNum = 0;\n this.emissionState.isBursting = false;\n this.emissionState.burstIndex = 0;\n this.emissionState.burstWaveIndex = 0;\n this.emissionState.burstWaves = undefined;\n this.emissionState.time = 0;\n this.emissionState.waitEmiting = 0;\n this.behaviors.forEach((behavior) => behavior.reset());\n this.emitEnded = false;\n this.markForDestroy = false;\n this.finishedEventFired = false;\n this.prewarmed = false;\n this.emissionBursts.forEach((burst) => burst.count.startGen(this.memory));\n this.emissionOverDistance.startGen(this.memory);\n this.startDelay.startGen(this.memory);\n this.startDelayTimeLeft = this.startDelay.genValue(this.memory, 0);\n this.previousEmitterPos = undefined;\n this.emitterVelocity.set(0, 0, 0);\n this.simulationAccumulator = 0;\n this.destroyed = false;\n }\n\n private firstTimeUpdate = true;\n\n /** @internal */\n update(delta: number) {\n if (this.paused) return;\n\n if (this.firstTimeUpdate) {\n this.firstTimeUpdate = false;\n this.emitter.computeWorldMatrix(true);\n }\n\n if (!this.looping && this.finishedEventFired && this.particleNum === 0) {\n // Still tick the fixed-step clock. A sub-emitter target\n // (onlyUsedByOther) goes empty between parent bursts; skipping the\n // accumulator here desyncs it from the parent, so the next particles\n // the parent emits into it sit at age 0 / startColor until the phase\n // catches up — white flashes scattered wherever the parent was.\n if (delta > 0.1) {\n delta = 0.1;\n }\n this.simulationAccumulator += delta;\n const stepsToRun = Math.min(\n MAX_SIMULATION_STEPS_PER_FRAME,\n Math.max(0, Math.round(this.simulationAccumulator / SIMULATION_STEP - ROUND_TIE_BIAS))\n );\n this.simulationAccumulator -= stepsToRun * SIMULATION_STEP;\n return;\n }\n\n if (this.looping && this.prewarm && !this.prewarmed) {\n this.prewarmed = true;\n for (let i = 0; i < this.duration * PREWARM_FPS; i++) {\n this.update(1.0 / PREWARM_FPS);\n }\n }\n\n if (delta > 0.1) {\n delta = 0.1;\n }\n\n if (this.neededToUpdateRender) {\n if (this._renderer) this._renderer.updateSystem(this);\n this.neededToUpdateRender = false;\n }\n\n const emitterElements = this.emitter.matrixWorld.elements;\n this.tempEmitterPos.set(emitterElements[12], emitterElements[13], emitterElements[14]);\n if (this.previousEmitterPos !== undefined && delta > 0) {\n this.emitterVelocity.copy(this.tempEmitterPos).sub(this.previousEmitterPos).divideScalar(delta);\n }\n (this.previousEmitterPos ??= new Vector3()).copy(this.tempEmitterPos);\n\n // Start delay holds back emission once per play/restart (ignored with\n // prewarm, matching Unity). Carry the remainder so a large frame does\n // not lose time.\n if (this.startDelayTimeLeft > 0 && !(this.prewarm && this.looping)) {\n this.startDelayTimeLeft -= delta;\n if (this.startDelayTimeLeft >= 0) return;\n delta = Math.min(-this.startDelayTimeLeft, 0.1);\n this.startDelayTimeLeft = 0;\n }\n\n this.simulationAccumulator += delta;\n const stepsToRun = Math.min(\n MAX_SIMULATION_STEPS_PER_FRAME,\n Math.max(0, Math.round(this.simulationAccumulator / SIMULATION_STEP - ROUND_TIE_BIAS))\n );\n for (let i = 0; i < stepsToRun; i++) {\n this.simulateStep(SIMULATION_STEP);\n }\n this.simulationAccumulator -= stepsToRun * SIMULATION_STEP;\n }\n\n /**\n * Time the display is ahead of (positive) or still ahead of the simulation\n * (negative — the simulation ran a hair early), in seconds. Magnitude never\n * exceeds one step.\n *\n * The simulation runs on a fixed 1/60 step so that emission and lifetimes\n * stay in phase — without it a slow emitter flickers when the frame rate\n * wobbles. But frames do not arrive on that grid: a display running at\n * anything other than exactly 60Hz leaves some frames with no step at all\n * (half of them at 120Hz, three in five at 144Hz) and others with two, so\n * the particles are drawn stuttering even while the frame rate is perfect.\n *\n * The steps-per-frame count below is chosen by *rounding* the accumulated\n * time to the nearest step, not flooring it. Flooring always leaves the\n * accumulator positive, and when the real frame rate sits very close to\n * 60Hz (as most displays do) that leftover creeps toward a full step for\n * many consecutive frames before tipping over into a frame that runs two\n * steps at once and resets it to near zero — a visible lurch, every particle\n * in the system at once, with a perfectly steady frame rate the whole time.\n * Rounding lets the leftover go negative instead, which keeps it centered\n * near zero and stops it from ever building up toward that reset.\n *\n * Renderers close the gap by advancing what they draw along each particle's\n * velocity by this much. That reproduces the straight-line part of the\n * motion exactly — it is the same term the next step would integrate — so\n * the simulation stays fixed-step while the picture moves continuously.\n */\n /** Length of one simulation step, in seconds. See {@link simulationResidual}. */\n get simulationStep(): number {\n return SIMULATION_STEP;\n }\n\n get simulationResidual(): number {\n if (this.paused) {\n return 0;\n }\n // Magnitude never more than a step, even if a frame long enough to hit\n // the per-frame step cap left the accumulator with more than that.\n if (this.simulationAccumulator > SIMULATION_STEP) return SIMULATION_STEP;\n if (this.simulationAccumulator < -SIMULATION_STEP) return -SIMULATION_STEP;\n return this.simulationAccumulator;\n }\n\n /**\n * Execution plan for this system's behaviors, rebuilt when the list changes.\n *\n * Consecutive behaviors that can be compiled into one loop are merged, so\n * the particles are walked once instead of once per behavior. The plan is\n * keyed on the behavior instances, not their types: swapping one out has to\n * change the generated code's indices.\n */\n private behaviorSteps(): Array<FusionStep> {\n const behaviors = this.behaviors;\n const cached = this.fusionPlan;\n if (cached !== undefined && cached.length === behaviors.length) {\n let same = true;\n for (let i = 0; i < behaviors.length; i++) {\n if (cached[i] !== behaviors[i]) {\n same = false;\n break;\n }\n }\n if (same) {\n return this.fusionSteps;\n }\n }\n this.fusionPlan = behaviors.slice();\n this.fusionSteps = planBehaviorFusion(behaviors);\n let changesSize = false;\n let changesColor = false;\n for (let i = 0; i < behaviors.length; i++) {\n const type = behaviors[i].type;\n if (SIZE_BEHAVIORS.has(type)) {\n changesSize = true;\n } else if (COLOR_BEHAVIORS.has(type)) {\n changesColor = true;\n } else if (!INERT_FOR_SIZE_AND_COLOR.has(type)) {\n // Unknown to this list, so it may write anything.\n changesSize = true;\n changesColor = true;\n }\n }\n this.planChangesSize = changesSize;\n this.planChangesColor = changesColor;\n return this.fusionSteps;\n }\n\n /** Advances emission, behaviors, motion and culling by one fixed timestep. */\n private simulateStep(delta: number): void {\n if (!this.onlyUsedByOther) {\n this.emit(delta, this.emissionState, this.emitter.matrixWorld);\n }\n\n const particles = this.particles;\n const behaviors = this.behaviors;\n const behaviorCount = behaviors.length;\n const particleCount = this.particleNum;\n const isTrailMode = this.rendererSettings.renderMode === RenderMode.Trail;\n // Only stretched billboards draw from velocity, and only they pay for\n // keeping the previous one.\n const stretched = this.rendererSettings.renderMode === RenderMode.StretchedBillBoard;\n\n // Remember where everything starts this step, so the renderer can carry\n // the motion the step produces on into the part of the frame that comes\n // after it. Taken after emission on purpose: a particle born this step\n // then starts from where it was born rather than from whatever the row\n // held before, and so is drawn at the emitter instead of jumping.\n const columns = this.store;\n const vector3Rows = particleCount * 3;\n const steps = this.behaviorSteps();\n // Size and colour are only snapshotted when some behavior can change\n // them; otherwise the columns stay what spawn wrote and the renderer\n // reads them as they are.\n const snapshotSize = this.planChangesSize;\n const snapshotColor = this.planChangesColor;\n columns.useSizeSnapshot(snapshotSize);\n columns.useColorSnapshot(snapshotColor);\n columns.previousPosition.set(columns.position.subarray(0, vector3Rows));\n if (snapshotSize) {\n columns.previousSize.set(columns.size.subarray(0, vector3Rows));\n }\n if (stretched) {\n if (columns.keepPreviousVelocity()) {\n this.rebindParticles();\n }\n columns.previousVelocity.set(columns.velocity.subarray(0, vector3Rows));\n }\n if (snapshotColor) {\n columns.previousColor.set(columns.color.subarray(0, particleCount * 4));\n }\n\n this.emitterShape.update(this, delta);\n for (let s = 0; s < steps.length; s++) {\n const step = steps[s];\n const stepBehaviors = step.behaviors;\n for (let j = 0; j < stepBehaviors.length; j++) {\n stepBehaviors[j].frameUpdate(delta);\n }\n // Nothing to update: skip, matching what the per-particle loop did.\n // A behavior may set up state before its loop that is only valid\n // once it has seen a particle.\n if (particleCount === 0) {\n continue;\n }\n if (step.run !== undefined) {\n step.run(behaviors, particles, particleCount, delta, this.store);\n continue;\n }\n const behavior = stepBehaviors[0];\n if (behavior.updateAll !== undefined) {\n behavior.updateAll(particles, particleCount, delta);\n continue;\n }\n for (let i = 0; i < particleCount; i++) {\n const particle = particles[i];\n // Inlined `died` — this runs once per behavior per particle.\n if (particle.age < particle.life) {\n behavior.update(particle, delta);\n }\n }\n }\n\n const notifyDeaths = this.hasListeners('particleDied');\n const store = this.store;\n const scalars = store.scalars;\n const stride = ParticleStore.SCALAR_STRIDE;\n let liveParticleCount = this.particleNum;\n\n if (!isTrailMode) {\n // One pass over the columns does three things the sprite path needs,\n // none of which touches a particle object until a death:\n //\n // Newborns were snapshotted above with their spawn size and colour,\n // before SizeOverLife / ColorOverLife ran. That false jump would be\n // extrapolated by the renderer when the residual is negative (common\n // with the rounded fixed step) and flash the start appearance at the\n // emitter, so the snapshot is collapsed onto the curves' t=0 value.\n // Age is still 0 at that point; the same iteration then ages it.\n //\n // Position is integrated along the velocity.\n //\n // A particle whose age reached its life is swapped with the last live\n // one, rows included, so slot k always owns row k and the live\n // particles stay one contiguous range the renderer copies as is. The\n // survivor moved into the slot has not been visited yet, so the slot\n // is processed again.\n const positions = store.position;\n const velocities = store.velocity;\n const prevSize = store.previousSize;\n const curSize = store.size;\n const prevColor = store.previousColor;\n const curColor = store.color;\n const collapseSize = snapshotSize;\n const collapseColor = snapshotColor;\n for (let i = 0; i < liveParticleCount; i++) {\n const scalar = i * stride;\n let age = scalars[scalar + ParticleStore.AGE];\n const offset = i * 3;\n if (age === 0) {\n if (collapseSize) {\n prevSize[offset] = curSize[offset];\n prevSize[offset + 1] = curSize[offset + 1];\n prevSize[offset + 2] = curSize[offset + 2];\n }\n if (collapseColor) {\n const o4 = i * 4;\n prevColor[o4] = curColor[o4];\n prevColor[o4 + 1] = curColor[o4 + 1];\n prevColor[o4 + 2] = curColor[o4 + 2];\n prevColor[o4 + 3] = curColor[o4 + 3];\n }\n }\n const step = delta * scalars[scalar + ParticleStore.SPEED_MODIFIER];\n positions[offset] += velocities[offset] * step;\n positions[offset + 1] += velocities[offset + 1] * step;\n positions[offset + 2] += velocities[offset + 2] * step;\n age += delta;\n scalars[scalar + ParticleStore.AGE] = age;\n if (age >= scalars[scalar + ParticleStore.LIFE]) {\n const last = liveParticleCount - 1;\n const particle = particles[i];\n const survivor = particles[last] as StoreBackedParticle;\n particles[i] = survivor;\n particles[last] = particle;\n if (i !== last) {\n store.swapRows(i, last);\n survivor.setStoreIndex(i);\n (particle as StoreBackedParticle).setStoreIndex(last);\n }\n liveParticleCount--;\n i--;\n if (notifyDeaths) {\n this.fire({type: 'particleDied', particleSystem: this, particle: particle});\n }\n }\n }\n this.particleNum = liveParticleCount;\n this.notifyFinished();\n return;\n }\n\n // Trails: the newborn collapse, then motion, then the trail history,\n // then removal, each over the particle objects the history lives on.\n if (particleCount > 0) {\n const prevSize = columns.previousSize;\n const curSize = columns.size;\n const prevColor = columns.previousColor;\n const curColor = columns.color;\n for (let i = 0, o3 = 0, o4 = 0, s = 0; i < particleCount; i++, o3 += 3, o4 += 4, s += stride) {\n if (scalars[s + ParticleStore.AGE] !== 0) {\n continue;\n }\n if (snapshotSize) {\n prevSize[o3] = curSize[o3];\n prevSize[o3 + 1] = curSize[o3 + 1];\n prevSize[o3 + 2] = curSize[o3 + 2];\n }\n if (snapshotColor) {\n prevColor[o4] = curColor[o4];\n prevColor[o4 + 1] = curColor[o4 + 1];\n prevColor[o4 + 2] = curColor[o4 + 2];\n prevColor[o4 + 3] = curColor[o4 + 3];\n }\n }\n }\n\n const followLocalOrigin = (this.rendererEmitterSettings as TrailSettings).followLocalOrigin;\n if (followLocalOrigin) {\n const emitterMatrix = this.emitter.matrixWorld;\n for (let i = 0; i < particleCount; i++) {\n const particle = particles[i];\n if ((particle as TrailParticle).localPosition) {\n particle.position.copy((particle as TrailParticle).localPosition!);\n particle.position.applyMatrix4(particle.parentMatrix ?? emitterMatrix);\n } else {\n particle.position.addScaledVector(particle.velocity, delta * particle.speedModifier);\n }\n particle.age += delta;\n }\n } else {\n const positions = store.position;\n const velocities = store.velocity;\n for (let i = 0, offset = 0, scalar = 0; i < particleCount; i++, offset += 3, scalar += stride) {\n const step = delta * scalars[scalar + ParticleStore.SPEED_MODIFIER];\n positions[offset] += velocities[offset] * step;\n positions[offset + 1] += velocities[offset + 1] * step;\n positions[offset + 2] += velocities[offset + 2] * step;\n scalars[scalar + ParticleStore.AGE] += delta;\n }\n }\n\n {\n const trailSettings = this.rendererEmitterSettings as TrailSettings;\n const dieWithParticle = trailSettings.dieWithParticle;\n // A world-space system records world positions already.\n const recordWorldSpace = trailSettings.recordWorldSpace && !this.worldSpace;\n const emitterMatrix = this.emitter.matrixWorld;\n for (let i = 0; i < particleCount; i++) {\n const trail = particles[i] as TrailParticle;\n // Emptying the history lets the removal pass below take the\n // particle this same step.\n if (dieWithParticle && trail.age >= trail.life) {\n trail.resetHistory();\n continue;\n }\n trail.update();\n // update() wrote a sample only while the particle is alive.\n if (recordWorldSpace && trail.age <= trail.life) {\n const offset = ((trail.historyHead + trail.historyCapacity - 1) % trail.historyCapacity) * 3;\n const positions = trail.historyPositions;\n tempV.set(positions[offset], positions[offset + 1], positions[offset + 2]);\n tempV.applyMatrix4(trail.parentMatrix ?? emitterMatrix);\n positions[offset] = tempV.x;\n positions[offset + 1] = tempV.y;\n positions[offset + 2] = tempV.z;\n }\n }\n }\n\n for (let i = 0; i < liveParticleCount; i++) {\n const particle = particles[i] as TrailParticle;\n const scalar = i * stride;\n const dead = scalars[scalar + ParticleStore.AGE] >= scalars[scalar + ParticleStore.LIFE];\n if (dead && particle.historyCount === 0) {\n const last = liveParticleCount - 1;\n const survivor = particles[last] as StoreBackedParticle;\n particles[i] = survivor;\n particles[last] = particle;\n if (i !== last) {\n store.swapRows(i, last);\n survivor.setStoreIndex(i);\n (particle as StoreBackedParticle).setStoreIndex(last);\n }\n liveParticleCount--;\n i--;\n if (notifyDeaths) {\n this.fire({type: 'particleDied', particleSystem: this, particle: particle});\n }\n }\n }\n this.particleNum = liveParticleCount;\n this.notifyFinished();\n }\n\n private notifyFinished(): void {\n if (!this.isFinished()) {\n return;\n }\n if (!this.finishedEventFired) {\n this.finishedEventFired = true;\n this.fire({type: 'finished', particleSystem: this});\n }\n if (this.autoDestroy) {\n this.markForDestroy = true;\n this.dispose();\n }\n }\n\n /** Waves a burst fires per loop: its `cycle`, and never fewer than one. */\n private static burstWaveCount(burst: BurstParameters): number {\n return burst.cycle >= 1 ? Math.floor(burst.cycle) : 1;\n }\n\n /** Seconds between a burst's waves; a missing or negative interval fires them all at once. */\n private static burstInterval(burst: BurstParameters): number {\n return burst.interval > 0 ? burst.interval : 0;\n }\n\n /**\n * Fires the burst waves that are due by `emissionState.time`.\n *\n * Wave `w` of a burst is due at `burst.time + w * burst.interval`, and the\n * burst fires `cycle` of them, each rolling `probability` on its own — the\n * way Unity repeats a burst. Bursts start in time order, as they always\n * have; their repeats are tracked per burst so a burst that is still\n * repeating never holds back a later one. Repeats falling past the\n * system's duration are dropped (a looping system starts them over on its\n * next loop), matching Unity, which never emits a burst cycle beyond the\n * end of the duration.\n */\n private emitBursts(emissionState: EmissionState, emitterMatrix: Matrix4): void {\n const bursts = this.emissionBursts;\n const burstCount = bursts.length;\n const time = emissionState.time;\n const waves = (emissionState.burstWaves ??= []);\n while (emissionState.burstIndex < burstCount && bursts[emissionState.burstIndex].time <= time) {\n waves[emissionState.burstIndex] = 0;\n emissionState.burstIndex++;\n }\n const started = emissionState.burstIndex;\n for (let b = 0; b < started; b++) {\n const burst = bursts[b];\n const cycles = ParticleSystem.burstWaveCount(burst);\n let wave = waves[b] ?? 0;\n if (wave >= cycles) {\n continue;\n }\n const interval = ParticleSystem.burstInterval(burst);\n while (wave < cycles) {\n const waveTime = burst.time + wave * interval;\n if (wave > 0 && waveTime > this.duration) {\n wave = cycles;\n break;\n }\n if (waveTime > time) {\n break;\n }\n emissionState.burstWaveIndex = wave;\n this.fireBurstWave(burst, emissionState, emitterMatrix);\n wave++;\n }\n waves[b] = wave;\n }\n }\n\n /** Spawns one wave of `burst`, if its probability roll passes. */\n private fireBurstWave(burst: BurstParameters, emissionState: EmissionState, emitterMatrix: Matrix4): void {\n if (Math.random() >= burst.probability) {\n return;\n }\n const rawCount = burst.count.genValue(this.memory, this.time);\n const qualityFactor = this.qualityFactor;\n const count = qualityFactor >= 0.999 ? rawCount : Math.floor(rawCount * qualityFactor);\n emissionState.isBursting = true;\n emissionState.burstParticleCount = count;\n this.spawn(count, emissionState, emitterMatrix);\n emissionState.isBursting = false;\n }\n\n /** True while a burst that has started still has a wave due within the duration. */\n private hasPendingBurstWaves(state: EmissionState): boolean {\n const waves = state.burstWaves;\n if (waves === undefined) {\n return false;\n }\n const bursts = this.emissionBursts;\n for (let b = 0; b < state.burstIndex && b < bursts.length; b++) {\n const burst = bursts[b];\n const wave = waves[b] ?? 0;\n if (\n wave < ParticleSystem.burstWaveCount(burst) &&\n (wave === 0 || burst.time + wave * ParticleSystem.burstInterval(burst) <= this.duration)\n ) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Spawns `count` particles owed to emission over distance, each where the\n * emitter crossed its metre mark on the way from `from` to where\n * `emitterMatrix` has it now, rather than all of them at the end of the\n * path: a fast emitter then leaves a continuous trail instead of one clump\n * per step.\n *\n * `carried` is how far the emitter had already gone past its last mark\n * before this step, so the marks keep their spacing across steps. Only the\n * position is interpolated; the emitter's current rotation and scale are\n * used for every particle.\n */\n private spawnAlongPath(\n count: number,\n emissionState: EmissionState,\n emitterMatrix: Matrix4,\n from: Vector3,\n carried: number,\n spacing: number,\n length: number\n ): void {\n const matrix = this.pathMatrix.copy(emitterMatrix);\n const target = emitterMatrix.elements;\n const elements = matrix.elements;\n const tx = target[12];\n const ty = target[13];\n const tz = target[14];\n for (let k = 1; k <= count; k++) {\n const travelled = k * spacing - carried;\n const f = travelled <= 0 ? 0 : travelled >= length ? 1 : travelled / length;\n elements[12] = from.x + (tx - from.x) * f;\n elements[13] = from.y + (ty - from.y) * f;\n elements[14] = from.z + (tz - from.z) * f;\n this.spawn(1, emissionState, matrix);\n }\n }\n\n emit(delta: number, emissionState: EmissionState, emitterMatrix: Matrix4) {\n if (emissionState.time > this.duration) {\n if (this.looping) {\n emissionState.time -= this.duration;\n emissionState.burstIndex = 0;\n if (emissionState.burstWaves !== undefined) {\n emissionState.burstWaves.length = 0;\n }\n for (let i = 0; i < this.behaviors.length; i++) {\n this.behaviors[i].reset();\n }\n } else {\n if (!this.emitEnded && !this.onlyUsedByOther) {\n this.endEmit();\n }\n }\n }\n\n // Only spawns in world space consume the normal matrix, and computing it\n // inverts a 4x4 — skip it for local-space systems.\n if (this.worldSpace) {\n this.normalMatrix.getNormalMatrix(emitterMatrix);\n }\n const emissionBurstCount = this.emissionBursts.length;\n const qualityFactor = this.qualityFactor;\n\n if (emissionBurstCount > 0) {\n this.emitBursts(emissionState, emitterMatrix);\n }\n\n // Particles owed to the distance travelled this step, spawned along it.\n let pathSpawn = 0;\n let pathSpacing = 0;\n let pathCarried = 0;\n let pathLength = 0;\n const previousWorldPos = emissionState.previousWorldPos;\n if (!this.emitEnded) {\n const timeRatio = emissionState.time / this.duration;\n emissionState.waitEmiting += delta * this.emissionOverTime.genValue(this.memory, timeRatio) * qualityFactor;\n\n if (previousWorldPos !== undefined) {\n this.temp.set(emitterMatrix.elements[12], emitterMatrix.elements[13], emitterMatrix.elements[14]);\n pathLength = previousWorldPos.distanceTo(this.temp);\n pathCarried = emissionState.travelDistance;\n emissionState.travelDistance += pathLength;\n const emitPerMeter = this.emissionOverDistance.genValue(this.memory, timeRatio) * qualityFactor;\n if (emissionState.travelDistance * emitPerMeter > 0) {\n const count = Math.floor(emissionState.travelDistance * emitPerMeter);\n emissionState.travelDistance -= count / emitPerMeter;\n // A world-space particle stays where it is born, so it is born\n // where the emitter passed its mark. A local-space one moves\n // with the emitter and has no path to be spread along.\n if (this.worldSpace && pathLength > 0) {\n pathSpawn = count;\n pathSpacing = 1 / emitPerMeter;\n } else {\n emissionState.waitEmiting += count;\n }\n }\n }\n }\n\n // Accrue before spawning so replacement particles can appear on the same\n // frame an old one dies (rate * lifetime ≈ 1 would otherwise flicker).\n const totalSpawn = Math.floor(emissionState.waitEmiting);\n if (totalSpawn > 0) {\n this.spawn(totalSpawn, emissionState, emitterMatrix);\n emissionState.waitEmiting -= totalSpawn;\n }\n if (pathSpawn > 0) {\n this.spawnAlongPath(\n pathSpawn,\n emissionState,\n emitterMatrix,\n previousWorldPos!,\n pathCarried,\n pathSpacing,\n pathLength\n );\n }\n\n if (emissionState.previousWorldPos === undefined) emissionState.previousWorldPos = new Vector3();\n emissionState.previousWorldPos.set(\n emitterMatrix.elements[12],\n emitterMatrix.elements[13],\n emitterMatrix.elements[14]\n );\n emissionState.time += delta;\n }\n\n toJSON(metaData?: BabylonMetaData | string, _options: SerializationOptions = {}): ParticleSystemJSONParameters {\n const isRootObject = metaData === undefined || typeof metaData === 'string';\n const meta: BabylonMetaData = isRootObject\n ? {\n geometries: {},\n materials: {},\n textures: {},\n images: {},\n shapes: {},\n skeletons: {},\n animations: {},\n nodes: {},\n }\n : metaData;\n\n const geometryUUID = this.ensureGeometryMeta(meta);\n const materialUUID = this.ensureMaterialMeta(meta);\n const rendererEmitterSettingsJSON = this.toRendererSettingsJSON();\n\n return {\n version: '3.0',\n autoDestroy: this.autoDestroy,\n looping: this.looping,\n prewarm: this.prewarm,\n duration: this.duration,\n startDelay: this.startDelay.toJSON(),\n shape: this.emitterShape.toJSON(),\n startLife: this.startLife.toJSON(),\n startSpeed: this.startSpeed.toJSON(),\n startRotation: this.startRotation.toJSON(),\n startSize: this.startSize.toJSON(),\n startColor: this.startColor.toJSON(),\n emissionOverTime: this.emissionOverTime.toJSON(),\n emissionOverDistance: this.emissionOverDistance.toJSON(),\n emissionBursts: this.emissionBursts.map((burst) => ({\n time: burst.time,\n count: burst.count.toJSON(),\n probability: burst.probability,\n interval: burst.interval,\n cycle: burst.cycle,\n })),\n ...(this.maxParticles !== undefined ? {maxParticles: this.maxParticles} : {}),\n onlyUsedByOther: this.onlyUsedByOther,\n instancingGeometry: geometryUUID,\n renderMode: this.renderMode,\n renderOrder: this.renderOrder,\n rendererEmitterSettings: rendererEmitterSettingsJSON,\n material: materialUUID,\n layers: this.rendererSettings.layerMask,\n startTileIndex: this.startTileIndex.toJSON(),\n uTileCount: this.rendererSettings.uTileCount,\n vTileCount: this.rendererSettings.vTileCount,\n blendTiles: this.rendererSettings.blendTiles,\n softParticles: this.rendererSettings.softParticles,\n softFarFade: this.rendererSettings.softFarFade,\n softNearFade: this.rendererSettings.softNearFade,\n blending: this.rendererSettings.materialBlendMode,\n transparent: this.rendererSettings.materialTransparent,\n depthTest: this.rendererSettings.materialDepthTest,\n depthWrite: this.rendererSettings.materialDepthWrite,\n alphaTest: this.rendererSettings.materialAlphaTest,\n behaviors: this.behaviors.map((b) => b.toJSON()),\n worldSpace: this.worldSpace,\n ...(this.pivot ? {pivot: [this.pivot.x, this.pivot.y, this.pivot.z]} : {}),\n ...(this.flip ? {flip: [this.flip.x, this.flip.y]} : {}),\n };\n }\n\n static fromJSON(\n json: ParticleSystemJSONParameters,\n meta: BabylonMetaData,\n dependencies: {[uuid: string]: Behavior} = {},\n scene?: Scene\n ): ParticleSystem {\n const shape = EmitterFromJSON(json.shape, meta as any);\n let rendererEmitterSettings: RendererEmitterSettings;\n if (json.renderMode === RenderMode.Trail) {\n const trailSettings = json.rendererEmitterSettings as TrailSettings;\n rendererEmitterSettings = {\n startLength:\n trailSettings?.startLength !== undefined\n ? ValueGeneratorFromJSON(trailSettings.startLength)\n : new ConstantValue(30),\n followLocalOrigin: trailSettings?.followLocalOrigin ?? false,\n ...trailFlags(trailSettings),\n };\n } else if (json.renderMode === RenderMode.StretchedBillBoard) {\n rendererEmitterSettings = {...(json.rendererEmitterSettings ?? {})};\n if (json.speedFactor !== undefined) {\n (rendererEmitterSettings as StretchedBillBoardSettings).speedFactor = json.speedFactor;\n }\n } else {\n rendererEmitterSettings = {};\n }\n\n const materialMeta = json.material ? meta.materials?.[json.material] : undefined;\n const materialTextureRef = materialMeta?.texture ?? json.texture;\n const texture =\n typeof materialTextureRef === 'string'\n ? (meta.textures?.[materialTextureRef] ?? null)\n : (materialTextureRef ?? null);\n const resolvedGeometryEntry =\n typeof json.instancingGeometry === 'string'\n ? meta.geometries?.[json.instancingGeometry]\n : json.instancingGeometry;\n const resolvedGeometry = ParticleSystem.resolveGeometryData(resolvedGeometryEntry);\n\n const ps = new ParticleSystem({\n scene,\n autoDestroy: json.autoDestroy,\n looping: json.looping,\n prewarm: json.prewarm,\n duration: json.duration,\n startDelay: json.startDelay ? ValueGeneratorFromJSON(json.startDelay) : undefined,\n shape,\n startLife: ValueGeneratorFromJSON(json.startLife),\n startSpeed: ValueGeneratorFromJSON(json.startSpeed),\n startRotation: GeneratorFromJSON(json.startRotation) as\n | RotationGenerator\n | ValueGenerator\n | FunctionValueGenerator,\n startSize: GeneratorFromJSON(json.startSize) as Vector3Generator | ValueGenerator | FunctionValueGenerator,\n startColor: ColorGeneratorFromJSON(json.startColor) as ColorGenerator,\n emissionOverTime: ValueGeneratorFromJSON(json.emissionOverTime),\n emissionOverDistance: ValueGeneratorFromJSON(json.emissionOverDistance),\n emissionBursts: json.emissionBursts?.map((burst: any) => ({\n time: burst.time,\n count:\n typeof burst.count === 'number'\n ? new ConstantValue(burst.count)\n : ValueGeneratorFromJSON(burst.count),\n probability: burst.probability ?? 1,\n interval: burst.interval ?? 0.1,\n cycle: burst.cycle ?? burst.cycleCount ?? 1,\n })),\n maxParticles: typeof json.maxParticles === 'number' ? json.maxParticles : undefined,\n onlyUsedByOther: json.onlyUsedByOther,\n instancingGeometry: resolvedGeometry.positions,\n instancingIndices: resolvedGeometry.indices,\n instancingUVs: resolvedGeometry.uvs,\n instancingNormals: resolvedGeometry.normals,\n renderMode: json.renderMode,\n rendererEmitterSettings,\n renderOrder: json.renderOrder,\n texture,\n material: materialMeta?.sourceMaterial ?? materialMeta,\n blendMode: materialMeta?.alphaMode ?? json.blending ?? Constants.ALPHA_ADD,\n transparent: materialMeta?.transparent ?? json.transparent ?? true,\n depthTest: materialMeta?.depthTest ?? json.depthTest ?? true,\n depthWrite: materialMeta?.depthWrite ?? json.depthWrite ?? false,\n alphaTest: materialMeta?.alphaTest ?? json.alphaTest ?? 0,\n startTileIndex:\n typeof json.startTileIndex === 'number'\n ? new ConstantValue(json.startTileIndex)\n : (ValueGeneratorFromJSON(json.startTileIndex) as ValueGenerator),\n uTileCount: json.uTileCount,\n vTileCount: json.vTileCount,\n blendTiles: json.blendTiles,\n softParticles: json.softParticles,\n softFarFade: json.softFarFade,\n softNearFade: json.softNearFade,\n behaviors: [],\n worldSpace: json.worldSpace,\n layerMask: json.layers,\n pivot: json.pivot ? new Vector3(json.pivot[0] ?? 0, json.pivot[1] ?? 0, json.pivot[2] ?? 0) : undefined,\n flip: json.flip ? new Vector2(json.flip[0] ?? 0, json.flip[1] ?? 0) : undefined,\n lighting: materialMeta?.lighting,\n rim: materialMeta?.rim,\n });\n ps.behaviors = (json.behaviors ?? [])\n .map((behaviorJson) => {\n const behavior = BehaviorFromJSON(behaviorJson, ps);\n if (behavior && behavior.type === 'EmitSubParticleSystem') {\n dependencies[(behaviorJson as any).subParticleSystem] = behavior;\n }\n return behavior;\n })\n .filter((behavior) => behavior !== null) as Behavior[];\n return ps;\n }\n\n private static nextSerializationId(prefix: string): string {\n ParticleSystem.serializationCounter += 1;\n return `${prefix}_${ParticleSystem.serializationCounter}`;\n }\n\n private static createFallbackNormals(positions: Float32Array): Float32Array {\n const normals = new Float32Array(positions.length);\n for (let i = 0; i < normals.length; i += 3) {\n normals[i] = 0;\n normals[i + 1] = 0;\n normals[i + 2] = 1;\n }\n return normals;\n }\n\n private toRendererSettingsJSON(): RendererEmitterSettings {\n if (this.renderMode === RenderMode.Trail) {\n return {\n startLength: (this.rendererEmitterSettings as TrailSettings).startLength.toJSON(),\n followLocalOrigin: (this.rendererEmitterSettings as TrailSettings).followLocalOrigin,\n ...trailFlags(this.rendererEmitterSettings as TrailSettings),\n };\n }\n if (this.renderMode === RenderMode.StretchedBillBoard) {\n return {\n speedFactor: (this.rendererEmitterSettings as StretchedBillBoardSettings).speedFactor,\n lengthFactor: (this.rendererEmitterSettings as StretchedBillBoardSettings).lengthFactor,\n };\n }\n return {};\n }\n\n private ensureGeometryMeta(meta: BabylonMetaData): string {\n const geometryUUID = ParticleSystem.nextSerializationId('quarks_geometry');\n meta.geometries[geometryUUID] = {\n uuid: geometryUUID,\n type: 'QuarksGeometry',\n positions: Array.from(this.rendererSettings.instancingGeometry),\n indices: Array.from(this.rendererSettings.instancingIndices),\n uvs: this.rendererSettings.instancingUVs ? Array.from(this.rendererSettings.instancingUVs) : undefined,\n normals: this.rendererSettings.instancingNormals\n ? Array.from(this.rendererSettings.instancingNormals)\n : undefined,\n };\n return geometryUUID;\n }\n\n private ensureMaterialMeta(meta: BabylonMetaData): string {\n const texture = this.rendererSettings.texture;\n let textureUUID: string | undefined;\n if (texture) {\n textureUUID = ParticleSystem.nextSerializationId('quarks_texture');\n meta.textures[textureUUID] = texture;\n }\n\n const reflectionAtlas = this.rendererSettings.reflectionAtlas;\n let reflectionAtlasUUID: string | undefined;\n if (reflectionAtlas instanceof Texture) {\n reflectionAtlasUUID = ParticleSystem.nextSerializationId('quarks_texture');\n meta.textures[reflectionAtlasUUID] = reflectionAtlas;\n }\n\n const materialUUID = ParticleSystem.nextSerializationId('quarks_material');\n meta.materials[materialUUID] = {\n uuid: materialUUID,\n type: 'QuarksMaterial',\n transparent: this.rendererSettings.materialTransparent,\n alphaMode: this.rendererSettings.materialBlendMode,\n depthTest: this.rendererSettings.materialDepthTest,\n depthWrite: this.rendererSettings.materialDepthWrite,\n alphaTest: this.rendererSettings.materialAlphaTest,\n texture: textureUUID,\n reflectionAtlas: reflectionAtlasUUID,\n reflectionLevel: this.rendererSettings.reflectionLevel,\n // Written only when not the default, so existing effects serialise as before.\n ...(this.lighting !== 'fixed' ? {lighting: this.lighting} : {}),\n ...(this.rim ? {rim: {...this.rim, color: [...this.rim.color]}} : {}),\n sourceMaterial: this.materialRef ?? undefined,\n };\n return materialUUID;\n }\n\n private static resolveGeometryData(entry: any): {\n positions: Float32Array;\n indices: Uint32Array | Uint16Array;\n uvs?: Float32Array;\n normals?: Float32Array;\n } {\n if (entry?.positions) {\n const positions =\n entry.positions instanceof Float32Array ? entry.positions : new Float32Array(entry.positions);\n const rawIndices =\n entry.indices instanceof Uint16Array || entry.indices instanceof Uint32Array\n ? entry.indices\n : entry.indices\n ? new Uint32Array(entry.indices)\n : undefined;\n return {\n positions,\n indices: ensureTriangleIndices(positions, rawIndices),\n uvs: entry.uvs\n ? entry.uvs instanceof Float32Array\n ? entry.uvs\n : new Float32Array(entry.uvs)\n : undefined,\n normals: entry.normals\n ? entry.normals instanceof Float32Array\n ? entry.normals\n : new Float32Array(entry.normals)\n : undefined,\n };\n }\n\n const data = entry?.data ?? entry;\n if (data?.attributes?.position?.array) {\n const positions = new Float32Array(data.attributes.position.array);\n let indices: Uint32Array | Uint16Array | undefined;\n if (data.index?.array) {\n const indexType = data.index.type === 'Uint16Array' ? Uint16Array : Uint32Array;\n indices = new indexType(data.index.array);\n }\n return {\n positions,\n indices: ensureTriangleIndices(positions, indices),\n uvs: data.attributes.uv?.array ? new Float32Array(data.attributes.uv.array) : undefined,\n normals: data.attributes.normal?.array ? new Float32Array(data.attributes.normal.array) : undefined,\n };\n }\n\n return {\n positions: DEFAULT_POSITIONS,\n indices: DEFAULT_INDICES,\n uvs: DEFAULT_UVS,\n };\n }\n\n addBehavior(behavior: Behavior) {\n this.behaviors.push(behavior);\n // A sub emitter added here changes which system has to update first.\n this._renderer?._invalidateUpdateOrder();\n }\n\n getRendererSettings(): VFXBatchSettings {\n return this.rendererSettings;\n }\n\n addEventListener(event: ParticleSystemEventType, callback: (event: ParticleSystemEvent) => void): void {\n if (!this.listeners[event]) this.listeners[event] = [];\n this.listeners[event].push(callback);\n }\n\n removeAllEventListeners(event: ParticleSystemEventType): void {\n if (this.listeners[event]) this.listeners[event] = [];\n }\n\n removeEventListener(event: ParticleSystemEventType, callback: (event: ParticleSystemEvent) => void): void {\n if (this.listeners[event]) {\n const index = this.listeners[event].indexOf(callback);\n if (index !== -1) this.listeners[event].splice(index, 1);\n }\n }\n\n /** True when at least one callback is registered for the event type. */\n private hasListeners(event: ParticleSystemEventType): boolean {\n const callbacks = this.listeners[event];\n return callbacks !== undefined && callbacks.length > 0;\n }\n\n private fire(event: ParticleSystemEvent) {\n const callbacks = this.listeners[event.type];\n if (callbacks === undefined) {\n return;\n }\n for (let i = 0; i < callbacks.length; i++) {\n callbacks[i](event);\n }\n }\n\n clone(): ParticleSystem {\n const newBehaviors: Array<Behavior> = this.behaviors.map((b) => b.clone());\n let rendererEmitterSettings: RendererEmitterSettings;\n\n if (this.renderMode === RenderMode.Trail) {\n rendererEmitterSettings = {\n startLength: (this.rendererEmitterSettings as TrailSettings).startLength.clone(),\n followLocalOrigin: (this.rendererEmitterSettings as TrailSettings).followLocalOrigin,\n ...trailFlags(this.rendererEmitterSettings as TrailSettings),\n };\n } else if (this.renderMode === RenderMode.StretchedBillBoard) {\n rendererEmitterSettings = {\n lengthFactor: (this.rendererEmitterSettings as StretchedBillBoardSettings).lengthFactor,\n speedFactor: (this.rendererEmitterSettings as StretchedBillBoardSettings).speedFactor,\n };\n } else {\n rendererEmitterSettings = {};\n }\n\n return new ParticleSystem({\n autoDestroy: this.autoDestroy,\n looping: this.looping,\n prewarm: this.prewarm,\n duration: this.duration,\n startDelay: this.startDelay.clone(),\n shape: this.emitterShape.clone(),\n startLife: this.startLife.clone(),\n startSpeed: this.startSpeed.clone(),\n startRotation: this.startRotation.clone(),\n startSize: this.startSize.clone(),\n startColor: this.startColor.clone(),\n emissionOverTime: this.emissionOverTime.clone(),\n emissionOverDistance: this.emissionOverDistance.clone(),\n emissionBursts: this.emissionBursts.map((b) => ({...b})),\n maxParticles: this.maxParticles,\n onlyUsedByOther: this.onlyUsedByOther,\n instancingGeometry: this.rendererSettings.instancingGeometry,\n instancingIndices: this.rendererSettings.instancingIndices,\n instancingUVs: this.rendererSettings.instancingUVs,\n instancingNormals: this.rendererSettings.instancingNormals,\n renderMode: this.renderMode,\n renderOrder: this.renderOrder,\n rendererEmitterSettings,\n material: this.materialRef,\n texture: this.rendererSettings.texture,\n startTileIndex: this.startTileIndex,\n uTileCount: this.rendererSettings.uTileCount,\n vTileCount: this.rendererSettings.vTileCount,\n blendTiles: this.rendererSettings.blendTiles,\n softParticles: this.rendererSettings.softParticles,\n softFarFade: this.rendererSettings.softFarFade,\n softNearFade: this.rendererSettings.softNearFade,\n behaviors: newBehaviors,\n worldSpace: this.worldSpace,\n blendMode: this.rendererSettings.materialBlendMode,\n transparent: this.rendererSettings.materialTransparent,\n depthTest: this.rendererSettings.materialDepthTest,\n depthWrite: this.rendererSettings.materialDepthWrite,\n alphaTest: this.rendererSettings.materialAlphaTest,\n layerMask: this.rendererSettings.layerMask,\n pivot: this.pivot,\n flip: this.flip,\n lighting: this.lighting,\n rim: this.rim,\n scene: this.emitter.getScene(),\n });\n }\n}\n","import {TransformNode} from '@babylonjs/core/Meshes/transformNode';\nimport {Scene} from '@babylonjs/core/scene';\nimport {IAnimationData, IPrefab} from 'quarks.core';\nimport {BatchedRenderer} from './BatchedRenderer';\nimport {ParticleEmitter} from './ParticleEmitter';\n\nexport interface QuarksTimelineClip {\n uuid?: string;\n duration?: number;\n play?: () => void;\n pause?: () => void;\n stop?: () => void;\n setTime?: (time: number) => void;\n}\n\nexport interface AnimationData extends IAnimationData {\n type: 'three' | 'ps';\n target: TransformNode;\n loop: boolean;\n clip?: QuarksTimelineClip;\n clipUUID?: string;\n}\n\ninterface AnimationJSON {\n startTime: number;\n duration: number;\n type: 'three' | 'ps';\n targetUUID: string;\n clipUUID?: string;\n loop: boolean;\n}\n\nexport class QuarksPrefab extends TransformNode implements IPrefab {\n type = 'QuarksPrefab';\n animationData: Array<AnimationData> = [];\n isPlaying = false;\n currentTime = -0.00001;\n timeScale = 1;\n duration = 0;\n\n private _lastUpdateTimeMs = Date.now();\n private _batchedRenderer?: BatchedRenderer;\n private _tempAnimationJSON: Array<AnimationJSON> = [];\n\n constructor(name = 'QuarksPrefab', scene?: Scene) {\n super(name, scene);\n }\n\n registerBatchedRenderer(renderer: BatchedRenderer): void {\n this._batchedRenderer = renderer;\n }\n\n addParticleSystemAnimation(emitter: ParticleEmitter, startTime = 0, duration = 0, loop = false): AnimationData {\n const animationDuration = duration > 0 ? duration : emitter.system.duration;\n const data: AnimationData = {\n startTime,\n duration: animationDuration,\n type: 'ps',\n loop,\n target: emitter,\n };\n this.animationData.push(data);\n this.pause();\n this.updateDuration();\n return data;\n }\n\n addThreeAnimation(\n target: TransformNode,\n clip?: QuarksTimelineClip,\n startTime = 0,\n duration = clip?.duration ?? 0,\n loop = false,\n clipUUID?: string\n ): AnimationData {\n const animationDuration = duration > 0 ? duration : (clip?.duration ?? 0);\n const data: AnimationData = {\n startTime,\n duration: animationDuration,\n type: 'three',\n loop,\n target,\n clip,\n clipUUID: clipUUID ?? clip?.uuid,\n };\n this.animationData.push(data);\n this.updateDuration();\n return data;\n }\n\n removeAnimation(index: number): void {\n this.animationData.splice(index, 1);\n this.updateDuration();\n }\n\n play(): void {\n if (this.isPlaying) return;\n this.isPlaying = true;\n this._lastUpdateTimeMs = Date.now();\n }\n\n pause(): void {\n if (!this.isPlaying) return;\n this.isPlaying = false;\n this.animationData.forEach((animation) => {\n if (animation.type === 'ps' && animation.target instanceof ParticleEmitter) {\n animation.target.system.pause();\n return;\n }\n animation.clip?.pause?.();\n });\n }\n\n stop(): void {\n this.pause();\n this.currentTime = -0.00001;\n this.animationData.forEach((animation) => {\n if (animation.type === 'ps' && animation.target instanceof ParticleEmitter) {\n animation.target.system.stop();\n return;\n }\n animation.clip?.stop?.();\n });\n }\n\n update(forceDelta?: number): void {\n if (!this.isPlaying) return;\n const now = Date.now();\n const delta = forceDelta ?? Math.max((now - this._lastUpdateTimeMs) / 1000, 0);\n this._lastUpdateTimeMs = now;\n const previousTime = this.currentTime;\n this.currentTime += delta * this.timeScale;\n\n if (this.currentTime > this.duration) {\n this.stop();\n return;\n }\n\n this.animationData.forEach((animation) => {\n const startTime = animation.startTime;\n const endTime = animation.startTime + animation.duration;\n const isActive = this.currentTime >= startTime && this.currentTime <= endTime;\n const wasActive = previousTime >= startTime && previousTime <= endTime;\n if (isActive && !wasActive) {\n if (animation.type === 'ps' && animation.target instanceof ParticleEmitter) {\n animation.target.system.restart();\n if (this._batchedRenderer) {\n this._batchedRenderer.addSystem(animation.target.system);\n }\n } else {\n animation.clip?.play?.();\n }\n return;\n }\n\n if (!isActive && wasActive) {\n if (animation.loop && animation.type === 'ps' && animation.target instanceof ParticleEmitter) {\n animation.target.system.restart();\n return;\n }\n if (animation.type === 'ps' && animation.target instanceof ParticleEmitter) {\n animation.target.system.endEmit();\n } else if (animation.loop) {\n animation.clip?.play?.();\n } else {\n animation.clip?.stop?.();\n }\n }\n });\n }\n\n setTime(time: number): void {\n const previousTime = this.currentTime;\n this.currentTime = time;\n this.animationData.forEach((animation) => {\n const startTime = animation.startTime;\n const endTime = animation.startTime + animation.duration;\n const isActive = this.currentTime >= startTime && this.currentTime < endTime;\n const wasActive = previousTime >= startTime && previousTime < endTime;\n if (isActive && !wasActive) {\n if (animation.type === 'ps' && animation.target instanceof ParticleEmitter) {\n animation.target.system.restart();\n } else {\n animation.clip?.play?.();\n }\n return;\n }\n if (!isActive && wasActive) {\n if (animation.type === 'ps' && animation.target instanceof ParticleEmitter) {\n animation.target.system.endEmit();\n } else {\n animation.clip?.stop?.();\n }\n return;\n }\n if (isActive && animation.type === 'three') {\n animation.clip?.setTime?.(Math.max(time - startTime, 0));\n }\n });\n }\n\n getDuration(): number {\n return this.duration;\n }\n\n resolveReferences(root: TransformNode): void {\n const nodesMap: {[uuid: string]: TransformNode} = {};\n const traverse = (node: TransformNode) => {\n if ((node as any)._quarksUUID) {\n nodesMap[(node as any)._quarksUUID] = node;\n }\n nodesMap[node.uniqueId.toString()] = node;\n const children = node.getChildren();\n for (const child of children) {\n if (child instanceof TransformNode) {\n traverse(child);\n }\n }\n };\n traverse(root);\n\n this._tempAnimationJSON.forEach((animationJSON) => {\n const target = nodesMap[animationJSON.targetUUID];\n if (animationJSON.type === 'ps' && target instanceof ParticleEmitter) {\n this.addParticleSystemAnimation(\n target,\n animationJSON.startTime,\n animationJSON.duration,\n animationJSON.loop\n );\n return;\n }\n if (animationJSON.type === 'three' && target) {\n const clip = this.resolveTimelineClip(target, animationJSON.clipUUID);\n this.addThreeAnimation(\n target,\n clip,\n animationJSON.startTime,\n animationJSON.duration,\n animationJSON.loop,\n animationJSON.clipUUID\n );\n }\n });\n this.updateDuration();\n this._tempAnimationJSON = [];\n }\n\n toJSON(): any {\n return {\n type: this.type,\n name: this.name,\n animationData: this.animationData.map((animation) => ({\n startTime: animation.startTime,\n duration: animation.duration,\n type: animation.type,\n targetUUID: (animation.target as any)._quarksUUID ?? animation.target.uniqueId.toString(),\n clipUUID: animation.type === 'three' ? (animation.clipUUID ?? animation.clip?.uuid) : undefined,\n loop: animation.loop,\n })),\n };\n }\n\n static fromJSON(json: any, scene?: Scene): QuarksPrefab {\n const prefab = new QuarksPrefab(json.name || 'QuarksPrefab', scene);\n if (Array.isArray(json.animationData)) {\n prefab._tempAnimationJSON = json.animationData.filter(\n (item: any) => item?.type === 'ps' || item?.type === 'three'\n );\n }\n return prefab;\n }\n\n private resolveTimelineClip(target: TransformNode, clipUUID?: string): QuarksTimelineClip | undefined {\n const animationSources = [\n (target as any).animations,\n (target as any).animationGroups,\n (target.metadata as any)?.animations,\n (target.metadata as any)?.animationGroups,\n ];\n for (const source of animationSources) {\n if (!Array.isArray(source)) continue;\n if (!clipUUID) {\n return source[0];\n }\n const found = source.find((item: any) => item?.uuid === clipUUID);\n if (found) {\n return found;\n }\n }\n return undefined;\n }\n\n private updateDuration(): void {\n let maxDuration = 0;\n this.animationData.forEach((animation) => {\n const endTime = animation.startTime + animation.duration;\n if (endTime > maxDuration) {\n maxDuration = endTime;\n }\n });\n this.duration = maxDuration;\n }\n}\n","import {Constants} from '@babylonjs/core/Engines/constants';\nimport {Texture} from '@babylonjs/core/Materials/Textures/texture';\nimport {StandardMaterial} from '@babylonjs/core/Materials/standardMaterial';\nimport {Matrix, Quaternion, Vector3} from '@babylonjs/core/Maths/math.vector';\nimport {Mesh} from '@babylonjs/core/Meshes/mesh';\nimport {VertexData} from '@babylonjs/core/Meshes/mesh.vertexData';\nimport {TransformNode} from '@babylonjs/core/Meshes/transformNode';\nimport {Scene} from '@babylonjs/core/scene';\nimport {Behavior, EmitSubParticleSystem} from 'quarks.core';\nimport {ParticleEmitter} from './ParticleEmitter';\nimport {ParticleSystem} from './ParticleSystem';\nimport {QuarksPrefab} from './QuarksPrefab';\nimport {ensureTriangleIndices} from './geometryUtil';\n\n/** Kind of linked asset the loader asks a {@link QuarksResourceResolver} to handle. */\nexport type QuarksResourceKind = 'effect' | 'geometry' | 'image';\n\n/**\n * Hooks for resolving relative source links (textures, geometry files) and loading their JSON.\n * Omit either method to keep the default (`baseUrl` join / `fetch`).\n */\nexport interface QuarksResourceResolver {\n /** Resolve a relative url to an absolute / blob / data url. Default: {@link QuarksLoader.joinUrl}. */\n resolve?(url: string, kind: QuarksResourceKind, baseUrl: string): string | Promise<string>;\n /** Load a JSON asset (geometry files). Default: `fetch(resolvedUrl).json()`. */\n fetchJson?(resolvedUrl: string): Promise<unknown>;\n}\n\nexport interface QuarksLoaderOptions {\n baseUrl?: string;\n /**\n * Reuse one Texture per scene for every effect that references the same image with the same\n * sampling, and one copy of the data for identical mesh geometry. The renderer only batches\n * systems that share the texture (and geometry) object, so without this every loaded effect\n * gets batches — draw calls and buffer uploads — of its own even when its images are the same\n * as another effect's. Default true; turn off to give each effect private textures, e.g. to\n * change one effect's texture settings without touching the others.\n */\n shareResources?: boolean;\n /** Custom url / fetch backend (File picker, CDN, IndexedDB). */\n resolver?: QuarksResourceResolver;\n}\n\n/** One in-memory effect for {@link QuarksLoader.loadFromJSONAll}. */\nexport interface QuarksJSONLoadEntry {\n json: unknown;\n /** Overrides loader `baseUrl` for relative texture / geometry links in this effect. */\n baseUrl?: string;\n}\n\n/**\n * Options for {@link QuarksLoader.loadAll} / {@link QuarksLoader.loadFromJSONAll}.\n * Batch loads share the per-scene fetch cache and `shareResources`, so N effects that point at\n * the same `assets/geometries/*.json` or texture only pay for that asset once.\n */\nexport interface QuarksBatchLoadOptions {\n /**\n * Max concurrent effect-document fetches (phase 1). Linked geometry/image resolve still runs\n * across the whole pack in parallel so shared urls coalesce. Default: all at once.\n */\n concurrency?: number;\n /**\n * Called once per effect when it has fully settled (parsed successfully, or failed under\n * `continueOnError`). `done` is how many of `total` have settled so far.\n */\n onProgress?: (done: number, total: number) => void;\n /**\n * When true, a failed effect becomes `null` in the result array and the rest keep loading.\n * When false (default), the first failure rejects the whole batch.\n */\n continueOnError?: boolean;\n}\n\ninterface ParsedGeometry {\n positions: Float32Array;\n indices: Uint32Array | Uint16Array;\n uvs?: Float32Array;\n normals?: Float32Array;\n}\n\n/** Textures and geometries reused across loads, per scene. See QuarksLoaderOptions.shareResources. */\nconst sharedTextures = new WeakMap<Scene, Map<string, Texture>>();\nconst sharedGeometries = new WeakMap<Scene, Map<string, ParsedGeometry>>();\n/** In-flight / completed JSON fetches keyed by `json|resolvedUrl`, per scene. */\nconst sharedFetches = new WeakMap<Scene, Map<string, Promise<unknown>>>();\n\nfunction sceneMap<T>(maps: WeakMap<Scene, Map<string, T>>, scene: Scene): Map<string, T> {\n let map = maps.get(scene);\n if (map === undefined) {\n map = new Map();\n maps.set(scene, map);\n }\n return map;\n}\n\n/** Content key for a geometry: two independent 32-bit hashes over every array's bytes, plus lengths. */\nfunction geometryKey(geometry: ParsedGeometry): string {\n let h1 = 0x811c9dc5;\n let h2 = 0x9e3779b9;\n const parts: Array<ArrayBufferView | undefined> = [\n geometry.positions,\n geometry.indices,\n geometry.uvs,\n geometry.normals,\n ];\n let lengths = '';\n for (const part of parts) {\n if (part === undefined) {\n lengths += '-,';\n continue;\n }\n const bytes = new Uint8Array(part.buffer, part.byteOffset, part.byteLength);\n lengths += bytes.length + ',';\n for (let i = 0; i < bytes.length; i++) {\n h1 = Math.imul(h1 ^ bytes[i], 0x01000193);\n h2 = Math.imul(h2 ^ bytes[i], 0x5bd1e995) ^ (h2 >>> 15);\n }\n }\n return `${lengths}${(h1 >>> 0).toString(16)}${(h2 >>> 0).toString(16)}`;\n}\n\ninterface LoadedMeta {\n textures: {[uuid: string]: Texture | null};\n geometries: {[uuid: string]: ParsedGeometry};\n materials: {[uuid: string]: any};\n}\n\nexport class QuarksLoader {\n private scene: Scene;\n private options: QuarksLoaderOptions;\n\n constructor(scene: Scene, options: QuarksLoaderOptions = {}) {\n this.scene = scene;\n this.options = options;\n }\n\n /** Fetches an effect JSON from `url`, resolves linked sources, and parses it. */\n async load(url: string): Promise<TransformNode> {\n const {json, baseUrl} = await this.fetchEffectDocument(url);\n return this.loadFromJSON(json, baseUrl);\n }\n\n /**\n * Resolves linked geometry / image urls on `json` (via {@link resolveResources}) then parses.\n * Use when the effect JSON is already in hand (File, CDN payload, editor import).\n */\n async loadFromJSON(json: any, baseUrl?: string): Promise<TransformNode> {\n const resolvedBase = baseUrl ?? this.options.baseUrl ?? '';\n await this.resolveResources(json, resolvedBase);\n return this.parse(json, resolvedBase);\n }\n\n /**\n * Loads many effects in parallel for battle / level preload. Phase 1 fetches every effect\n * JSON (optionally concurrency-limited); phase 2 resolves all linked geometries/images across\n * the pack together so shared asset urls hit the fetch cache once; phase 3 parses.\n *\n * @example\n * ```ts\n * const roots = await loader.loadAll([\n * 'fx/hit.json', 'fx/explosion.json', 'fx/heal.json',\n * ], { concurrency: 6, continueOnError: true });\n * ```\n */\n loadAll(urls: string[], options?: QuarksBatchLoadOptions & {continueOnError?: false}): Promise<TransformNode[]>;\n loadAll(\n urls: string[],\n options: QuarksBatchLoadOptions & {continueOnError: true}\n ): Promise<(TransformNode | null)[]>;\n async loadAll(urls: string[], options: QuarksBatchLoadOptions = {}): Promise<(TransformNode | null)[]> {\n const docs = await QuarksLoader.mapPool(urls, options.concurrency, async (url, index) => {\n try {\n return await this.fetchEffectDocument(url);\n } catch (err) {\n if (!options.continueOnError) {\n throw err;\n }\n console.warn(`[QuarksLoader] Failed to fetch effect \"${url}\" (${index + 1}/${urls.length}):`, err);\n return null;\n }\n });\n return this.loadDocuments(docs, options);\n }\n\n /**\n * Same two-phase batch as {@link loadAll}, but effect JSON is already in memory (asset pack,\n * IndexedDB, editor). Entries may be bare JSON or `{ json, baseUrl }`.\n */\n loadFromJSONAll(\n entries: Array<QuarksJSONLoadEntry | unknown>,\n options?: QuarksBatchLoadOptions & {continueOnError?: false}\n ): Promise<TransformNode[]>;\n loadFromJSONAll(\n entries: Array<QuarksJSONLoadEntry | unknown>,\n options: QuarksBatchLoadOptions & {continueOnError: true}\n ): Promise<(TransformNode | null)[]>;\n async loadFromJSONAll(\n entries: Array<QuarksJSONLoadEntry | unknown>,\n options: QuarksBatchLoadOptions = {}\n ): Promise<(TransformNode | null)[]> {\n const docs: Array<{json: any; baseUrl: string} | null> = entries.map((entry) => {\n if (entry !== null && typeof entry === 'object' && 'json' in (entry as object)) {\n const typed = entry as QuarksJSONLoadEntry;\n return {json: typed.json as any, baseUrl: typed.baseUrl ?? this.options.baseUrl ?? ''};\n }\n return {json: entry as any, baseUrl: this.options.baseUrl ?? ''};\n });\n return this.loadDocuments(docs, options);\n }\n\n /**\n * Inlines external geometry files and rewrites relative image urls through the loader's\n * {@link QuarksResourceResolver}. Idempotent for already-inlined geometries. Failures warn\n * and leave the entry as is.\n */\n async resolveResources(json: any, baseUrl: string = ''): Promise<void> {\n await QuarksLoader.resolveLinkedResources(json, {\n baseUrl,\n resolver: this.options.resolver,\n scene: this.scene,\n });\n }\n\n /**\n * Same as instance {@link resolveResources}, but usable without constructing a loader (e.g.\n * editor import that only prepares JSON). Pass `scene` to share the per-scene fetch cache.\n */\n static async resolveLinkedResources(\n json: any,\n options: {baseUrl?: string; resolver?: QuarksResourceResolver; scene?: Scene} = {}\n ): Promise<void> {\n const baseUrl = options.baseUrl ?? '';\n const resolver = options.resolver;\n const scene = options.scene;\n\n await QuarksLoader.inlineGeometryEntries(json, async (geometryUrl) => {\n const resolved = await QuarksLoader.resolveWith(resolver, geometryUrl, 'geometry', baseUrl);\n return QuarksLoader.fetchJsonWith(resolver, resolved, scene);\n });\n\n const images: any[] = Array.isArray(json?.images) ? json.images : [];\n await Promise.all(\n images.map(async (img) => {\n if (typeof img?.url !== 'string' || !img.url) {\n return;\n }\n img.url = await QuarksLoader.resolveWith(resolver, img.url, 'image', baseUrl);\n })\n );\n }\n\n /**\n * Inlines geometries that an export wrote to their own file (`{uuid, type: 'QuarksGeometry',\n * url}`). Prefer {@link load}, {@link loadFromJSON}, or {@link resolveResources} — those use\n * the loader's resolver and fetch cache. Kept for callers that already have a custom\n * `loadGeometry` and no `QuarksLoader` instance.\n */\n static async resolveExternalGeometries(json: any, loadGeometry: (url: string) => Promise<any>): Promise<void> {\n await QuarksLoader.inlineGeometryEntries(json, loadGeometry);\n }\n\n parse(json: any, baseUrl: string = ''): TransformNode {\n const meta: LoadedMeta = {\n textures: {},\n geometries: {},\n materials: {},\n };\n\n if (json.geometries) {\n this.parseGeometries(json.geometries, meta);\n }\n if (json.images) {\n this.parseImages(json.images, baseUrl, meta);\n }\n if (json.textures) {\n this.parseTextures(json.textures, meta);\n }\n if (json.materials) {\n this.parseMaterials(json.materials, meta);\n }\n\n const root = this.parseObject(json.object, meta);\n this.linkReferences(root);\n return root;\n }\n\n private parseGeometries(geometries: any[], meta: LoadedMeta): void {\n for (const geom of geometries) {\n if (geom.type === 'PlaneGeometry') {\n const w = geom.width || 1;\n const h = geom.height || 1;\n const hw = w / 2;\n const hh = h / 2;\n meta.geometries[geom.uuid] = {\n positions: new Float32Array([-hw, -hh, 0, hw, -hh, 0, hw, hh, 0, -hw, hh, 0]),\n indices: new Uint32Array([0, 1, 2, 0, 2, 3]),\n uvs: new Float32Array([0, 0, 1, 0, 1, 1, 0, 1]),\n normals: new Float32Array([0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1]),\n };\n } else if (geom.type === 'SphereGeometry') {\n meta.geometries[geom.uuid] = this.parseSphereGeometry(geom);\n } else if (geom.type === 'BufferGeometry' && geom.data) {\n const parsed = this.parseBufferGeometry(geom.data);\n meta.geometries[geom.uuid] = parsed;\n } else if (geom.type === 'QuarksGeometry') {\n if (typeof geom.url === 'string' && !geom.positions) {\n console.warn(\n `[QuarksLoader] Geometry \"${geom.url}\" is an external file; use load(), ` +\n 'loadFromJSON(), or resolveResources() before parse().'\n );\n }\n meta.geometries[geom.uuid] = this.share({\n positions: new Float32Array(geom.positions ?? []),\n indices: geom.indices ? new Uint32Array(geom.indices) : new Uint32Array(0),\n uvs: geom.uvs ? new Float32Array(geom.uvs) : undefined,\n normals: geom.normals ? new Float32Array(geom.normals) : undefined,\n });\n }\n }\n }\n\n /** The scene's copy of an identical geometry when resources are shared, else `geometry` itself. */\n private share(geometry: ParsedGeometry): ParsedGeometry {\n if (this.options.shareResources === false) {\n return geometry;\n }\n const geometries = sceneMap(sharedGeometries, this.scene);\n const key = geometryKey(geometry);\n const existing = geometries.get(key);\n if (existing !== undefined) {\n return existing;\n }\n geometries.set(key, geometry);\n return geometry;\n }\n\n /**\n * Forgets the textures, geometries, and in-flight JSON fetches shared between loads into\n * `scene` (see {@link QuarksLoaderOptions.shareResources}). Effects already loaded keep\n * theirs; the next load creates new ones. Textures are not disposed — they may still be in use.\n */\n static clearSharedResources(scene: Scene): void {\n sharedTextures.delete(scene);\n sharedGeometries.delete(scene);\n sharedFetches.delete(scene);\n }\n\n /** Joins `baseUrl` with a relative `url`; leaves data/blob/absolute/root-absolute urls alone. */\n static joinUrl(baseUrl: string, url: string): string {\n if (/^(data|blob):/i.test(url) || /^[a-z][a-z0-9+.-]*:\\/\\//i.test(url) || url.startsWith('/')) {\n return url;\n }\n return baseUrl + url;\n }\n\n private parseSphereGeometry(geom: any): ParsedGeometry {\n const radius = geom.radius ?? 0.5;\n const widthSegments = Math.max(3, Math.floor(geom.widthSegments ?? 16));\n const heightSegments = Math.max(2, Math.floor(geom.heightSegments ?? 8));\n const phiStart = geom.phiStart ?? 0;\n const phiLength = geom.phiLength ?? Math.PI * 2;\n const thetaStart = geom.thetaStart ?? 0;\n const thetaLength = geom.thetaLength ?? Math.PI;\n\n const positions: number[] = [];\n const normals: number[] = [];\n const uvs: number[] = [];\n const indices: number[] = [];\n const grid: number[][] = [];\n\n let index = 0;\n\n for (let iy = 0; iy <= heightSegments; iy++) {\n const verticesRow: number[] = [];\n const v = iy / heightSegments;\n const theta = thetaStart + v * thetaLength;\n\n for (let ix = 0; ix <= widthSegments; ix++) {\n const u = ix / widthSegments;\n const phi = phiStart + u * phiLength;\n\n const x = -radius * Math.cos(phi) * Math.sin(theta);\n const y = radius * Math.cos(theta);\n const z = radius * Math.sin(phi) * Math.sin(theta);\n\n positions.push(x, y, z);\n const length = Math.hypot(x, y, z) || 1;\n normals.push(x / length, y / length, z / length);\n uvs.push(u, 1 - v);\n\n verticesRow.push(index++);\n }\n\n grid.push(verticesRow);\n }\n\n const thetaEnd = thetaStart + thetaLength;\n const isTopFull = thetaStart <= 0;\n const isBottomFull = thetaEnd >= Math.PI;\n\n for (let iy = 0; iy < heightSegments; iy++) {\n for (let ix = 0; ix < widthSegments; ix++) {\n const a = grid[iy][ix + 1];\n const b = grid[iy][ix];\n const c = grid[iy + 1][ix];\n const d = grid[iy + 1][ix + 1];\n\n if (iy !== 0 || !isTopFull) {\n indices.push(a, b, d);\n }\n if (iy !== heightSegments - 1 || !isBottomFull) {\n indices.push(b, c, d);\n }\n }\n }\n\n const typedIndices = positions.length / 3 > 65535 ? new Uint32Array(indices) : new Uint16Array(indices);\n return {\n positions: new Float32Array(positions),\n indices: typedIndices,\n uvs: new Float32Array(uvs),\n normals: new Float32Array(normals),\n };\n }\n\n private parseBufferGeometry(data: any): ParsedGeometry {\n let positions = new Float32Array(0);\n let indices: Uint32Array | Uint16Array = new Uint32Array(0);\n let uvs: Float32Array | undefined;\n let normals: Float32Array | undefined;\n\n if (data.interleavedBuffers && data.arrayBuffers) {\n const buffers: {[uuid: string]: {data: Float32Array; stride: number}} = {};\n for (const [uuid, ibDef] of Object.entries(data.interleavedBuffers) as any[]) {\n const arrayBuffer = data.arrayBuffers[ibDef.buffer];\n if (arrayBuffer) {\n const floatArray = new Float32Array(\n Array.isArray(arrayBuffer) ? this.int32ArrayToFloat32(arrayBuffer) : arrayBuffer\n );\n buffers[uuid] = {data: floatArray, stride: ibDef.stride};\n }\n }\n\n if (data.attributes) {\n if (data.attributes.position?.isInterleavedBufferAttribute) {\n const attr = data.attributes.position;\n const buf = buffers[attr.data];\n if (buf)\n positions = this.extractInterleavedAttribute(buf.data, buf.stride, attr.offset, attr.itemSize);\n }\n if (data.attributes.uv?.isInterleavedBufferAttribute) {\n const attr = data.attributes.uv;\n const buf = buffers[attr.data];\n if (buf) uvs = this.extractInterleavedAttribute(buf.data, buf.stride, attr.offset, attr.itemSize);\n }\n if (data.attributes.normal?.isInterleavedBufferAttribute) {\n const attr = data.attributes.normal;\n const buf = buffers[attr.data];\n if (buf)\n normals = this.extractInterleavedAttribute(buf.data, buf.stride, attr.offset, attr.itemSize);\n }\n }\n } else if (data.attributes) {\n if (data.attributes.position?.array) {\n positions = new Float32Array(data.attributes.position.array);\n }\n if (data.attributes.uv?.array) {\n uvs = new Float32Array(data.attributes.uv.array);\n }\n if (data.attributes.normal?.array) {\n normals = new Float32Array(data.attributes.normal.array);\n }\n }\n\n if (data.index) {\n if (data.index.type === 'Uint16Array') {\n indices = new Uint16Array(data.index.array);\n } else {\n indices = new Uint32Array(data.index.array);\n }\n }\n\n indices = ensureTriangleIndices(positions, indices);\n\n return {positions, indices, uvs, normals};\n }\n\n private extractInterleavedAttribute(buffer: Float32Array, stride: number, offset: number, itemSize: number): any {\n const count = Math.floor(buffer.length / stride);\n const result = new Float32Array(count * itemSize);\n for (let i = 0; i < count; i++) {\n for (let j = 0; j < itemSize; j++) {\n result[i * itemSize + j] = buffer[i * stride + offset + j];\n }\n }\n return result;\n }\n\n private int32ArrayToFloat32(intArray: number[]): Float32Array {\n const buffer = new ArrayBuffer(intArray.length * 4);\n const int32View = new Int32Array(buffer);\n for (let i = 0; i < intArray.length; i++) {\n int32View[i] = intArray[i];\n }\n return new Float32Array(buffer) as any;\n }\n\n private async resolveResourceUrl(url: string, kind: QuarksResourceKind, baseUrl: string): Promise<string> {\n return QuarksLoader.resolveWith(this.options.resolver, url, kind, baseUrl);\n }\n\n /** Fetches one effect JSON; documents are not fetch-cached because resolve mutates them. */\n private async fetchEffectDocument(url: string): Promise<{json: any; baseUrl: string}> {\n const baseUrl = this.options.baseUrl || url.substring(0, url.lastIndexOf('/') + 1);\n const resolvedEffect = await this.resolveResourceUrl(url, 'effect', baseUrl);\n const json = await QuarksLoader.fetchJsonWith(this.options.resolver, resolvedEffect, undefined);\n return {json, baseUrl};\n }\n\n /**\n * Resolve every document's linked resources in parallel (shared urls coalesce via the\n * scene fetch cache), then parse. Each index settles exactly once for `onProgress`.\n */\n private async loadDocuments(\n docs: Array<{json: any; baseUrl: string} | null>,\n options: QuarksBatchLoadOptions\n ): Promise<(TransformNode | null)[]> {\n const total = docs.length;\n if (total === 0) {\n return [];\n }\n\n const results: (TransformNode | null)[] = new Array(total);\n const settled = new Array<boolean>(total).fill(false);\n let done = 0;\n const settle = (index: number, value: TransformNode | null) => {\n if (settled[index]) {\n return;\n }\n settled[index] = true;\n results[index] = value;\n done++;\n options.onProgress?.(done, total);\n };\n\n await Promise.all(\n docs.map(async (doc, i) => {\n if (!doc) {\n return;\n }\n try {\n await this.resolveResources(doc.json, doc.baseUrl);\n } catch (err) {\n if (!options.continueOnError) {\n throw err;\n }\n console.warn(`[QuarksLoader] Failed to resolve resources for effect ${i + 1}/${total}:`, err);\n docs[i] = null;\n settle(i, null);\n }\n })\n );\n\n for (let i = 0; i < total; i++) {\n if (settled[i]) {\n continue;\n }\n const doc = docs[i];\n if (!doc) {\n settle(i, null);\n continue;\n }\n try {\n settle(i, this.parse(doc.json, doc.baseUrl));\n } catch (err) {\n if (!options.continueOnError) {\n throw err;\n }\n console.warn(`[QuarksLoader] Failed to parse effect ${i + 1}/${total}:`, err);\n settle(i, null);\n }\n }\n return results;\n }\n\n /** Runs `fn` over `items` with at most `concurrency` in flight (or all if unset/≤0). */\n private static async mapPool<T, R>(\n items: T[],\n concurrency: number | undefined,\n fn: (item: T, index: number) => Promise<R>\n ): Promise<R[]> {\n if (items.length === 0) {\n return [];\n }\n const limit = concurrency !== undefined && concurrency > 0 ? concurrency : items.length;\n const results = new Array<R>(items.length);\n let next = 0;\n\n const worker = async () => {\n while (next < items.length) {\n const index = next++;\n results[index] = await fn(items[index], index);\n }\n };\n\n const workers = Math.min(limit, items.length);\n await Promise.all(Array.from({length: workers}, () => worker()));\n return results;\n }\n\n private static async resolveWith(\n resolver: QuarksResourceResolver | undefined,\n url: string,\n kind: QuarksResourceKind,\n baseUrl: string\n ): Promise<string> {\n if (resolver?.resolve) {\n return resolver.resolve(url, kind, baseUrl);\n }\n return QuarksLoader.joinUrl(baseUrl, url);\n }\n\n /** One in-flight fetch per scene + resolved url when `scene` is set; otherwise uncached. */\n private static fetchJsonWith(\n resolver: QuarksResourceResolver | undefined,\n resolvedUrl: string,\n scene: Scene | undefined\n ): Promise<unknown> {\n const load = async () => {\n if (resolver?.fetchJson) {\n return resolver.fetchJson(resolvedUrl);\n }\n const response = await fetch(resolvedUrl);\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n return response.json();\n };\n\n if (!scene) {\n return load();\n }\n\n const cache = sceneMap(sharedFetches, scene);\n const key = `json|${resolvedUrl}`;\n let pending = cache.get(key);\n if (pending === undefined) {\n pending = load().catch((err) => {\n if (cache.get(key) === pending) {\n cache.delete(key);\n }\n throw err;\n });\n cache.set(key, pending);\n }\n return pending;\n }\n\n private static async inlineGeometryEntries(json: any, loadGeometry: (url: string) => Promise<any>): Promise<void> {\n const geometries: any[] = Array.isArray(json?.geometries) ? json.geometries : [];\n await Promise.all(\n geometries\n .filter((geom) => typeof geom?.url === 'string' && !geom.positions)\n .map(async (geom) => {\n try {\n const data = await loadGeometry(geom.url);\n // Copy arrays so a shared fetch-cache document is not aliased across\n // effects — mutating one effect's inlined geometry must not corrupt others.\n for (const key of ['positions', 'indices', 'uvs', 'normals']) {\n const value = data?.[key];\n if (value === undefined) {\n continue;\n }\n geom[key] = Array.isArray(value) ? value.slice() : value;\n }\n delete geom.url;\n } catch (err) {\n console.warn(`[QuarksLoader] Could not load geometry \"${geom.url}\":`, err);\n }\n })\n );\n }\n\n private parseImages(images: any[], baseUrl: string, _meta: LoadedMeta): void {\n (this as any)._images = {};\n for (const img of images) {\n if (img.url) {\n QuarksLoader.warnIfNotAnImageUrl(img.url);\n }\n // Urls are usually already absolute after resolveResources; joinUrl is a no-op for\n // data/blob/http(s) and still supports callers that use parse() with a baseUrl only.\n (this as any)._images[img.uuid] = img.url ? QuarksLoader.joinUrl(baseUrl, img.url) : null;\n }\n }\n\n /**\n * Flags an image entry that is plainly not an image, which otherwise only\n * shows up as a texture that silently fails to load.\n *\n * The case worth naming: an exporter that could not embed a texture falls\n * back to writing the source asset's path, and a Unity built-in texture\n * reports a virtual path such as `Resources/unity_builtin_extra` that no\n * file backs.\n */\n private static warnIfNotAnImageUrl(url: string): void {\n if (/^(data|blob):/i.test(url) || /\\.(png|jpe?g|webp|gif|bmp|ktx2?|dds|env|basis)(\\?|#|$)/i.test(url)) {\n return;\n }\n console.warn(\n `[QuarksLoader] Image \"${url}\" does not look like an image; its texture will fail to load. ` +\n 'This usually means the effect was exported without embedding that texture.'\n );\n }\n\n private parseTextures(textures: any[], meta: LoadedMeta): void {\n const images = (this as any)._images || {};\n for (const texDef of textures) {\n const imageUrl = images[texDef.image];\n if (imageUrl) {\n const invertY = texDef.invertY !== undefined ? !!texDef.invertY : true;\n const noMipmap = !!texDef.noMipmap;\n // Everything below that ends up on the Texture object is part of the key, so a\n // shared texture always looks the way each of its effects asked for.\n const share = this.options.shareResources !== false;\n const key = share\n ? [\n invertY,\n noMipmap,\n texDef.samplingMode,\n texDef.wrap,\n texDef.repeat,\n texDef.offset,\n texDef.rotation,\n ].join('|') +\n '|' +\n imageUrl\n : '';\n const cache = share ? sceneMap(sharedTextures, this.scene) : undefined;\n const cached = cache?.get(key);\n if (cached !== undefined) {\n meta.textures[texDef.uuid] = cached;\n continue;\n }\n const texture = new Texture(imageUrl, this.scene, {\n noMipmap,\n invertY,\n samplingMode: typeof texDef.samplingMode === 'number' ? texDef.samplingMode : undefined,\n });\n if (Array.isArray(texDef.wrap)) {\n texture.wrapU = this.mapWrapMode(texDef.wrap[0]);\n texture.wrapV = this.mapWrapMode(texDef.wrap[1] ?? texDef.wrap[0]);\n }\n if (Array.isArray(texDef.repeat)) {\n texture.uScale = texDef.repeat[0] ?? 1;\n texture.vScale = texDef.repeat[1] ?? 1;\n }\n if (Array.isArray(texDef.offset)) {\n texture.uOffset = texDef.offset[0] ?? 0;\n texture.vOffset = texDef.offset[1] ?? 0;\n }\n if (typeof texDef.rotation === 'number') {\n texture.wAng = texDef.rotation;\n }\n if (cache !== undefined) {\n cache.set(key, texture);\n // Something outside the library may dispose it; never hand out a dead texture.\n texture.onDisposeObservable.addOnce(() => {\n if (cache.get(key) === texture) {\n cache.delete(key);\n }\n });\n }\n meta.textures[texDef.uuid] = texture;\n } else {\n meta.textures[texDef.uuid] = null;\n }\n }\n }\n\n private mapWrapMode(wrapMode?: number): number {\n switch (wrapMode) {\n case 1001: // ClampToEdgeWrapping (three.js)\n return Texture.CLAMP_ADDRESSMODE;\n case 1002: // MirroredRepeatWrapping (three.js)\n return Texture.MIRROR_ADDRESSMODE;\n case 1000: // RepeatWrapping (three.js)\n default:\n return Texture.WRAP_ADDRESSMODE;\n }\n }\n\n private parseMaterials(materials: any[], meta: LoadedMeta): void {\n for (const matDef of materials) {\n const matInfo: any = {\n uuid: matDef.uuid,\n transparent: matDef.transparent ?? true,\n blending: matDef.blending ?? 1,\n side: matDef.side ?? 2,\n depthTest: matDef.depthTest ?? true,\n depthWrite: matDef.depthWrite ?? false,\n alphaTest: matDef.alphaTest ?? 0,\n texture: null,\n };\n\n // three.js MeshBasicMaterial uses `map`; QuarksMaterial (what ParticleSystem.toJSON\n // emits) uses `texture`. Accept both so library-exported effects round-trip.\n const textureRef = matDef.map ?? matDef.texture;\n if (textureRef) {\n matInfo.texture = meta.textures[textureRef] || null;\n }\n\n const reflectionAtlasRef = matDef.reflectionAtlas;\n if (reflectionAtlasRef) {\n matInfo.reflectionAtlas = meta.textures[reflectionAtlasRef] || null;\n }\n if (typeof matDef.reflectionLevel === 'number') {\n matInfo.reflectionLevel = matDef.reflectionLevel;\n }\n // Mesh particle lighting (QuarksMaterial): 'unlit' | 'fixed' | 'scene'.\n if (matDef.lighting === 'unlit' || matDef.lighting === 'fixed' || matDef.lighting === 'scene') {\n matInfo.lighting = matDef.lighting;\n }\n // Mesh particle rim (QuarksMaterial): {color, power, strength, mode}.\n if (matDef.rim && typeof matDef.rim === 'object') {\n matInfo.rim = matDef.rim;\n }\n\n // QuarksMaterial (what ParticleSystem.ensureMaterialMeta emits) writes `alphaMode`\n // directly as a Babylon alpha-mode constant; three.js materials (MeshBasicMaterial\n // etc.) instead use `blending` with three.js's own 1..4 numbering, which does NOT\n // line up with Babylon's constants (e.g. three.js Additive=2 vs Babylon ALPHA_ADD=1)\n // — only convert through the table when there's no native alphaMode to trust.\n if (typeof matDef.alphaMode === 'number') {\n matInfo.alphaMode = matDef.alphaMode;\n } else {\n const blendingToAlphaMode: {[key: number]: number} = {\n 1: Constants.ALPHA_COMBINE,\n 2: Constants.ALPHA_ADD,\n 3: Constants.ALPHA_SUBTRACT,\n 4: Constants.ALPHA_MULTIPLY,\n };\n matInfo.alphaMode = blendingToAlphaMode[matDef.blending] || Constants.ALPHA_COMBINE;\n }\n\n meta.materials[matDef.uuid] = matInfo;\n }\n }\n\n private getGeometry(meta: LoadedMeta, geometryId: string | undefined): ParsedGeometry | undefined {\n if (!geometryId) return undefined;\n return meta.geometries[geometryId];\n }\n\n private getMaterial(meta: LoadedMeta, materialId: string | string[] | undefined): any | undefined {\n if (!materialId) return undefined;\n const selectedId = Array.isArray(materialId) ? materialId[0] : materialId;\n return meta.materials[selectedId];\n }\n\n private createPlaceholderNode(type: string, name?: string): TransformNode {\n const node = new TransformNode(name || type || 'node', this.scene);\n (node as any).quarksOriginalType = type;\n return node;\n }\n\n private createMeshNode(data: any, meta: LoadedMeta): Mesh {\n const mesh = new Mesh(data.name || data.type || 'mesh', this.scene);\n const geometry = this.getGeometry(meta, data.geometry);\n if (geometry && geometry.positions.length > 0 && geometry.indices.length > 0) {\n const vertexData = new VertexData();\n vertexData.positions = geometry.positions;\n vertexData.indices = geometry.indices;\n if (geometry.uvs && geometry.uvs.length > 0) {\n vertexData.uvs = geometry.uvs;\n }\n if (geometry.normals && geometry.normals.length > 0) {\n vertexData.normals = geometry.normals;\n }\n vertexData.applyToMesh(mesh, true);\n }\n\n const materialInfo = this.getMaterial(meta, data.material);\n if (materialInfo) {\n const material = new StandardMaterial(`quarks_loader_material_${materialInfo.uuid}`, this.scene);\n material.alphaMode = materialInfo.alphaMode ?? Constants.ALPHA_COMBINE;\n material.backFaceCulling = materialInfo.side !== 2;\n material.alphaCutOff = materialInfo.alphaTest ?? 0;\n material.disableDepthWrite = !(materialInfo.depthWrite ?? false);\n if (materialInfo.texture) {\n material.diffuseTexture = materialInfo.texture;\n material.opacityTexture = materialInfo.texture;\n }\n mesh.material = material;\n }\n return mesh;\n }\n\n private parseObject(data: any, meta: LoadedMeta): TransformNode {\n let node: TransformNode;\n switch (data.type) {\n case 'QuarksPrefab':\n node = QuarksPrefab.fromJSON(data, this.scene);\n break;\n case 'ParticleEmitter':\n if (data.ps) {\n const ps = this.parseParticleSystem(data.ps, meta);\n node = ps.emitter;\n break;\n }\n node = this.createPlaceholderNode(data.type, data.name);\n break;\n case 'Mesh':\n case 'SkinnedMesh':\n case 'InstancedMesh':\n case 'BatchedMesh':\n node = this.createMeshNode(data, meta);\n break;\n case 'Scene':\n case 'Group':\n case 'Object3D':\n case 'PerspectiveCamera':\n case 'OrthographicCamera':\n case 'AmbientLight':\n case 'DirectionalLight':\n case 'PointLight':\n case 'RectAreaLight':\n case 'SpotLight':\n case 'HemisphereLight':\n case 'LightProbe':\n case 'LOD':\n case 'Line':\n case 'LineSegments':\n case 'LineLoop':\n case 'PointCloud':\n case 'Points':\n case 'Sprite':\n case 'Bone':\n node = this.createPlaceholderNode(data.type, data.name);\n break;\n default:\n node = new TransformNode(data.name || data.type || 'node', this.scene);\n }\n\n if (data.uuid) (node as any)._quarksUUID = data.uuid;\n if (data.name) node.name = data.name;\n\n if (data.matrix) {\n const matrix = Matrix.FromArray(data.matrix);\n const scaling = new Vector3(1, 1, 1);\n const rotation = Quaternion.Identity();\n const translation = new Vector3(0, 0, 0);\n matrix.decompose(scaling, rotation, translation);\n node.position.copyFrom(translation);\n node.scaling.copyFrom(scaling);\n node.rotationQuaternion = rotation;\n } else {\n if (data.position) node.position.set(data.position[0], data.position[1], data.position[2]);\n if (data.scale) node.scaling.set(data.scale[0], data.scale[1], data.scale[2]);\n if (data.quaternion) {\n node.rotationQuaternion = new Quaternion(\n data.quaternion[0],\n data.quaternion[1],\n data.quaternion[2],\n data.quaternion[3]\n );\n } else if (data.rotation) {\n node.rotation.set(data.rotation[0], data.rotation[1], data.rotation[2]);\n }\n }\n\n if (data.visible !== undefined) node.setEnabled(data.visible);\n\n if (data.children) {\n for (const childData of data.children) {\n const child = this.parseObject(childData, meta);\n child.parent = node;\n }\n }\n\n return node;\n }\n\n private parseParticleSystem(json: any, meta: LoadedMeta): ParticleSystem {\n const dependencies: {[uuid: string]: Behavior} = {};\n const ps = ParticleSystem.fromJSON(json, meta as any, dependencies, this.scene);\n (ps as any)._meshSurfaceReferenceUUID = json?.shape?.type === 'mesh_surface' ? json?.shape?.mesh : undefined;\n return ps;\n }\n\n private linkReferences(root: TransformNode): void {\n const nodesMap: {[uuid: string]: TransformNode} = {};\n\n const traverse = (node: TransformNode) => {\n if ((node as any)._quarksUUID) {\n nodesMap[(node as any)._quarksUUID] = node;\n }\n for (const child of node.getChildren()) {\n if (child instanceof TransformNode) {\n traverse(child);\n }\n }\n };\n traverse(root);\n\n const linkNode = (node: TransformNode) => {\n if (node instanceof QuarksPrefab) {\n node.resolveReferences(root);\n }\n if (node instanceof ParticleEmitter) {\n const system = node.system as ParticleSystem;\n const meshSurfaceUUID = (system as any)._meshSurfaceReferenceUUID;\n if (meshSurfaceUUID && (system.emitterShape as any).type === 'mesh_surface') {\n const targetNode = nodesMap[meshSurfaceUUID];\n if (targetNode instanceof Mesh) {\n (system.emitterShape as any).mesh = targetNode;\n }\n }\n for (let i = 0; i < system.behaviors.length; i++) {\n if (system.behaviors[i] instanceof EmitSubParticleSystem) {\n const subEmitter = system.behaviors[i] as EmitSubParticleSystem;\n const targetUUID = subEmitter.subParticleSystem as any;\n if (typeof targetUUID !== 'string') {\n continue;\n }\n const resolved = nodesMap[targetUUID];\n if (resolved instanceof ParticleEmitter) {\n (subEmitter as any).subParticleSystem = resolved;\n (resolved.system as ParticleSystem).onlyUsedByOther = true;\n } else {\n // An export that dropped the target emitter, or kept only\n // some emitters of a prefab: emit nothing rather than leave\n // a string the behavior would treat as an emitter.\n subEmitter.subParticleSystem = undefined;\n if (targetUUID !== '') {\n console.warn(\n `[QuarksLoader] Emitter \"${node.name}\" has a sub emitter targeting \"${targetUUID}\", ` +\n (resolved ? 'which is not a particle emitter' : 'which is not in the effect') +\n '; that sub emitter is skipped.'\n );\n }\n }\n }\n }\n }\n for (const child of node.getChildren()) {\n if (child instanceof TransformNode) {\n linkNode(child);\n }\n }\n };\n linkNode(root);\n }\n}\n","import {Node} from '@babylonjs/core/node';\nimport {BatchedRenderer} from './BatchedRenderer';\nimport {ParticleEmitter} from './ParticleEmitter';\nimport {ParticleSystem} from './ParticleSystem';\n\nexport class QuarksUtil {\n static runOnAllParticleEmitters(root: Node, callback: (emitter: ParticleEmitter) => void): void {\n QuarksUtil.traverseNode(root, (node) => {\n if (node instanceof ParticleEmitter) {\n callback(node);\n }\n });\n }\n\n static addToBatchRenderer(root: Node, batchRenderer: BatchedRenderer): void {\n QuarksUtil.runOnAllParticleEmitters(root, (emitter) => {\n batchRenderer.addSystem(emitter.system);\n });\n }\n\n static play(root: Node): void {\n QuarksUtil.runOnAllParticleEmitters(root, (emitter) => {\n (emitter.system as unknown as ParticleSystem).play();\n });\n }\n\n static stop(root: Node): void {\n QuarksUtil.runOnAllParticleEmitters(root, (emitter) => {\n (emitter.system as unknown as ParticleSystem).stop();\n });\n }\n\n static pause(root: Node): void {\n QuarksUtil.runOnAllParticleEmitters(root, (emitter) => {\n (emitter.system as unknown as ParticleSystem).pause();\n });\n }\n\n static restart(root: Node): void {\n QuarksUtil.runOnAllParticleEmitters(root, (emitter) => {\n (emitter.system as unknown as ParticleSystem).restart();\n });\n }\n\n static setAutoDestroy(root: Node, autoDestroy: boolean): void {\n QuarksUtil.runOnAllParticleEmitters(root, (emitter) => {\n (emitter.system as unknown as ParticleSystem).autoDestroy = autoDestroy;\n });\n }\n\n static endEmit(root: Node): void {\n QuarksUtil.runOnAllParticleEmitters(root, (emitter) => {\n (emitter.system as unknown as ParticleSystem).endEmit();\n });\n }\n\n /** True when every emitter under `root` is a finished non-looping system (or looping). */\n static isEffectFinished(root: Node): boolean {\n let found = false;\n let finished = true;\n QuarksUtil.runOnAllParticleEmitters(root, (emitter) => {\n found = true;\n const system = emitter.system as unknown as ParticleSystem;\n if (system.looping) {\n finished = false;\n return;\n }\n if (!system.isFinished()) {\n finished = false;\n }\n });\n return found && finished;\n }\n\n private static traverseNode(node: Node, callback: (node: Node) => void): void {\n callback(node);\n const children = node.getChildren();\n for (const child of children) {\n QuarksUtil.traverseNode(child, callback);\n }\n }\n}\n","import {loadPlugin} from 'quarks.core';\nimport {MeshSurfaceEmitterPlugin} from './MeshSurfaceEmitter';\nimport {registerShaderChunks} from './shaders';\n\nexport * from 'quarks.core';\nexport {BatchedParticleRenderer} from './BatchedParticleRenderer';\nexport {BatchedRenderer} from './BatchedRenderer';\nexport type {AdaptivePerformanceOptions, AdaptivePerformanceState, VFXBatchSettings} from './BatchedRenderer';\nexport {\n cacheEnvAtlas,\n createEnvAtlasFromFaceUrls,\n cubeFaceUrls,\n ensureEnvAtlasFromCube,\n getCachedEnvAtlas,\n} from './envAtlas';\nexport * from './materials/';\nexport {MeshSurfaceEmitter, MeshSurfaceEmitterPlugin} from './MeshSurfaceEmitter';\nexport {ParticleEmitter} from './ParticleEmitter';\nexport {ParticleSystem} from './ParticleSystem';\nexport type {\n BabylonMetaData,\n BurstParameters,\n BurstParametersJSON,\n ParticleSystemJSONParameters,\n ParticleSystemParameters,\n} from './ParticleSystem';\nexport {QuarksLoader} from './QuarksLoader';\nexport type {\n QuarksBatchLoadOptions,\n QuarksJSONLoadEntry,\n QuarksLoaderOptions,\n QuarksResourceKind,\n QuarksResourceResolver,\n} from './QuarksLoader';\nexport {QuarksPrefab} from './QuarksPrefab';\nexport type {AnimationData, QuarksTimelineClip} from './QuarksPrefab';\nexport {QuarksUtil} from './QuarksUtil';\nexport * from './shaders/';\nexport {SpriteBatch} from './SpriteBatch';\nexport {TrailBatch} from './TrailBatch';\nexport {defaultMeshLighting, meshRimEqual, normalizeMeshRim, RenderMode, VFXBatch} from './VFXBatch';\nexport type {MeshLighting, MeshLightingSettings, MeshRim, StoredBatchSettings} from './VFXBatch';\n\n// Re-export quarks.core types (interfaces - type-only)\nexport type {\n Behavior,\n BillBoardSettings,\n ColorGenerator,\n EmissionState,\n EmitterShape,\n FunctionColorGenerator,\n FunctionValueGenerator,\n IEmitter,\n IParticle,\n IParticleSystem,\n MeshSettings,\n Particle,\n ParticleSystemEvent,\n ParticleSystemEventType,\n RendererEmitterSettings,\n RotationGenerator,\n SerializationOptions,\n StretchedBillBoardSettings,\n TrailSettings,\n ValueGenerator,\n Vector3Generator,\n} from 'quarks.core';\n\nregisterShaderChunks();\nloadPlugin(MeshSurfaceEmitterPlugin);\n","export default /* glsl */ `\n// Per-vertex attributes\nattribute vec3 position;\nattribute vec2 uv;\n\n// Per-instance attributes\nattribute vec3 offset;\nattribute vec4 color;\nattribute vec3 size;\nattribute vec4 rotation;\nattribute float uvTile;\n\n// Uniforms\nuniform mat4 worldViewProjection;\n\n#ifdef UV_TILE\nuniform float tileCountX;\nuniform float tileCountY;\n#endif\n\n// Varyings\nvarying vec2 vUV;\nvarying vec4 vColor;\n\nvec3 applyQuaternion(vec3 v, vec4 q) {\n vec3 qVec = q.xyz;\n float qW = q.w;\n vec3 t = 2.0 * cross(qVec, v);\n return v + qW * t + cross(qVec, t);\n}\n\nvoid main() {\n vec3 rotatedPosition = applyQuaternion(position * size, rotation);\n vec3 worldPos = rotatedPosition + offset;\n\n gl_Position = worldViewProjection * vec4(worldPos, 1.0);\n\n #ifdef UV_TILE\n vec2 tc = vec2(tileCountX, tileCountY);\n float baseTile = floor(uvTile);\n float tileU = mod(baseTile, tc.x) / tc.x;\n float tileV = 1.0 - floor(baseTile / tc.x) / tc.y - 1.0 / tc.y;\n vUV = uv / tc + vec2(tileU, tileV);\n #else\n vUV = uv;\n #endif\n\n vColor = color;\n}\n`;\n"],"names":["_lut","_seed","DEG2RAD","Math","PI","RAD2DEG","generateUUID","d0","random","d1","d2","d3","toLowerCase","clamp","value","min","max","euclideanModulo","n","m","mapLinear","x","a1","a2","b1","b2","inverseLerp","y","lerp","t","damp","lambda","dt","exp","pingpong","length","abs","smoothstep","smootherstep","randInt","low","high","floor","randFloat","randFloatSpread","range","seededRandom","s","undefined","imul","degToRad","degrees","radToDeg","radians","isPowerOfTwo","ceilPowerOfTwo","pow","ceil","log","LN2","floorPowerOfTwo","setQuaternionFromProperEuler","q","a","b","c","order","cos","sin","c2","s2","c13","s13","c1_3","s1_3","c3_1","s3_1","set","console","warn","denormalize","array","constructor","Float32Array","Uint32Array","Uint16Array","Uint8Array","Int32Array","Int16Array","Int8Array","Error","normalize","round","MathUtils","Quaternion","z","w","this","_x","_y","_z","_w","slerpFlat","dst","dstOffset","src0","srcOffset0","src1","srcOffset1","x0","y0","z0","w0","x1","y1","z1","w1","dir","sqrSin","Number","EPSILON","sqrt","len","atan2","tDir","f","multiplyQuaternionsFlat","_onChangeCallback","clone","copy","quaternion","setFromEuler","euler","update","_order","c1","c3","s1","s3","setFromAxisAngle","axis","angle","halfAngle","setFromRotationMatrix","te","elements","m11","m12","m13","m21","m22","m23","m31","m32","m33","trace","setFromUnitVectors","vFrom","vTo","r","dot","angleTo","acos","rotateTowards","step","slerp","identity","invert","conjugate","v","lengthSq","l","multiply","multiplyQuaternions","premultiply","qax","qay","qaz","qaw","qbx","qby","qbz","qbw","qb","cosHalfTheta","sqrSinHalfTheta","sinHalfTheta","halfTheta","ratioA","ratioB","slerpQuaternions","qa","theta1","theta2","r1","r2","equals","fromArray","offset","toArray","toJSON","_onChange","callback","Symbol","iterator","prototype","isQuaternion","Vector3","setScalar","scalar","setX","setY","setZ","setComponent","index","getComponent","add","addScalar","addVectors","addScaledVector","sub","subScalar","subVectors","multiplyScalar","multiplyVectors","applyEuler","applyQuaternion","_quaternion$1","applyAxisAngle","applyMatrix3","e","applyNormalMatrix","applyMatrix4","vx","vy","vz","qx","qy","qz","qw","tx","ty","tz","transformDirection","divide","divideScalar","clampScalar","minVal","maxVal","clampLength","roundToZero","trunc","negate","manhattanLength","setLength","alpha","lerpVectors","v1","v2","cross","crossVectors","ax","ay","az","bx","by","bz","projectOnVector","denominator","projectOnPlane","planeNormal","_vector","reflect","normal","theta","distanceTo","distanceToSquared","dx","dy","dz","manhattanDistanceTo","setFromSphericalCoords","radius","phi","sinPhiRadius","setFromCylindricalCoords","setFromMatrixPosition","setFromMatrixScale","sx","setFromMatrixColumn","sy","sz","setFromMatrix3Column","randomDirection","u","isVector3","WebGLCoordinateSystem","WebGPUCoordinateSystem","Matrix4","n11","n12","n13","n14","n21","n22","n23","n24","n31","n32","n33","n34","n41","n42","n43","n44","extractPosition","copyPosition","multiplyToArray","error","setRotationFromQuaternion","makeRotationFromQuaternion","me","setFromMatrix3","extractBasis","xAxis","yAxis","zAxis","makeBasis","extractRotation","scaleX","_v1","scaleY","scaleZ","makeRotationFromEuler","d","ae","af","be","bf","ce","cf","de","df","ac","ad","bc","bd","compose","_zero","_one","lookAt","eye","target","up","multiplyMatrices","a11","a12","a13","a14","a21","a22","a23","a24","a31","a32","a33","a34","a41","a42","a43","a44","b11","b12","b13","b14","b21","b22","b23","b24","b31","b32","b33","b34","b41","b42","b43","b44","determinant","transpose","tmp","setPosition","t11","t12","t13","t14","det","detInv","scale","getMaxScaleOnAxis","scaleXSq","scaleYSq","scaleZSq","makeTranslation","makeRotationX","makeRotationY","makeRotationZ","makeRotationAxis","makeScale","makeShear","xy","xz","yx","yz","zx","zy","position","x2","y2","z2","xx","yy","zz","wx","wy","wz","decompose","_m1","invSX","invSY","invSZ","makePerspective","left","right","top","bottom","near","far","coordinateSystem","makeOrthographic","h","p","zInv","matrix","i","isMatrix4","_matrix","_quaternion","Euler","DEFAULT_ORDER","asin","setFromQuaternion","setFromVector3","reorder","newOrder","isEuler","Matrix3","setFromMatrix4","g","getNormalMatrix","matrix4","transposeIntoArray","setUvTransform","rotation","cx","cy","_m3","rotate","makeRotation","translate","isVector2","isMatrix3","UNBOUND$2","QuaternionView","data","super","bind","prototype$2","Object","defineProperties","get","Vector2","width","height","rotateAround","center","UNBOUND$1","Vector3View","prototype$1","Vector4","setW","setAxisAngleFromQuaternion","setAxisAngleFromRotationMatrix","epsilon","epsilon2","isVector4","UNBOUND","Vector4View","physicsResolver","getPhysicsResolver","ApplyCollision","resolver","bounce","type","tempV","initialize","particle","delta","resolve","velocity","frameUpdate","fromJSON","json","reset","ConstantValue","startGen","memory","genValue","IntervalValue","indexCount","push","Bezier","p1","p2","p3","p4","t2","mt","mt2","derivativeCoefficients","points","dpoints","list","j","dpt","getSlope","controlCurve","hull","pt","_p","idx","split","span","p0","PiecewiseFunction","functions","Array","findFunction","last","mid","getEndX","getStartX","setStartX","setEndX","insertFunction","func","splice","removeFunction","getFunction","setFunction","numOfFunctions","PiecewiseBezier","curves","table","tableSignature","refreshTable","count","signatureLength","signature","changed","Float64Array","start","size","TABLE_SIZE","genValueExact","sampledTable","clearTable","fraction","startX","toSVG","segments","result","join","map","bezier","function","piecewiseFunction","ValueGeneratorFromJSON","AxisAngleGenerator","quat","ColorToJSON","color","JSONToColor","JSONToValue","ValueToJSON","ColorRange","genColor","ContinuousLinearFunction","keys","subType","findKey","name","pos","pair","tempColor$1","Gradient","colorKeys","alphaKeys","sample","genColorExact","next","lastColor","colorIndex","key","from","to","ratio","lastAlpha","alphaIndex","gradient","RandomColor","rand","tempColor","RandomColorBetweenGradient","gradient1","gradient2","ConstantColor","memoryGenerator","ColorGeneratorFromJSON","EulerGenerator","angleX","angleY","angleZ","eulerOrder","eular","RandomQuatGenerator","RotationGeneratorFromJSON","Vector3Function","vec","Vector3GeneratorFromJSON","GeneratorFromJSON","ApplyForce","direction","magnitude","dataCount","magnitudeValue","updateAll","particles","age","life","force","TextureSequencer","locations","transform","textureSequencer","loc","fromImage","img","threshold","canvas","document","createElement","ctx","getContext","drawImage","getImageData","colorSpace","remove","SequencerFromJSON","ApplySequences","delayBetweenParticles","sequencers","time","pCount","delay","id","begin","inMotion","sequencer","BEZIER","appendSequencer","seq","forEach","sequencerJson","applySequences","ChangeEmitDirection","_temp","_q","ColorBySpeed","speedRange","startSpeed","startColor","ColorOverLife","generator","randomInt","UP_VEC3","ZERO_VEC3","ONE_VEC3","Z_VEC3","SubParticleEmitMode","EmitSubParticleSystem","particleSystem","useVelocityAsBasis","subParticleSystem","mode","Frame","emitProbability","q_","v_","v2_","subEmissions","spareEmissions","onlyUsedByOther","Birth","Death","emit","system","spare","pop","state","burstParticleCount","burstParticleIndex","isBursting","burstIndex","burstWaveIndex","waitEmiting","travelDistance","previousWorldPos","setMatrixFromParticle","duration","finished","subEmissionState","uuid","len2","worldSpace","emitter","matrixWorld","ForceOverLife","ps","_tempScale","_tempQ","temp","generatorX","generatorY","generatorZ","translation","FrameOverLife","frame","_frame","uvTile","sampleFrame","GravityForce","distanceSquared","cz","InheritVelocity","multiplier","_tempPos","_tempQInv","_tempScaleInv","emitterVelocity","decomposeInverse","LimitSpeedOverLife","speed","dampen","limit","percent","dampenStep","ParticleStore","capacity","previousVelocity","EMPTY","rotationQuaternion","angularVelocityQuaternion","memoryStride","previousPosition","previousSize","previousColor","startSize","scalars","SCALAR_STRIDE","angularVelocity","flip","ensureCapacity","grow","sizeAliased","colorAliased","previousLength","growDouble","grown","fill","NaN","keepPreviousVelocity","recordMemory","row","slots","stride","widened","previousStride","previous","rows","base","useSizeSnapshot","enabled","useColorSnapshot","ensureQuaternionColumns","swapRows","a3","b3","swap3","a4","b4","swap4","ma","mb","swap1","source","AGE","LIFE","SPEED_MODIFIER","F2","G2","F3","G3","F4","G4","grad3","grad4","SimplexNoise","randomOrSeed","seed","s0","mash","toString","charCodeAt","masher","alea","aux","buildPermutationTable","perm","permMod12","noise2D","n0","n1","n2","i1","j1","ii","jj","t0","gi0","t1","gi1","gi2","noise3D","n3","k","k1","i2","j2","k2","x3","y3","z3","kk","t3","gi3","noise4D","n4","rankx","ranky","rankz","rankw","l1","l2","i3","j3","k3","l3","w2","w3","x4","y4","z4","w4","ll","t4","gi4","GENERATOR_COUNT","generators","tempQ","getGenerator","Noise","frequency","power","positionAmount","rotationAmount","_frequency","_power","_positionAmount","_rotationAmount","isScalarRotation","_noiseState","lastPos","lastRot","lastRotQ","generatorW","constantOf","_","cp","cpa","cra","noiseTime","amount","noise","store","positions","rotations","o3","nx","ny","nz","fround","OrbitOverLife","orbitSpeed","Rotation3DOverLife","tempQuat","RotationBySpeed","rate","RotationOverLife","turnAboutZ","kept","SizeBySpeed","SizeOverLife","_sizeIsVector3","_size","SpeedOverLife","speedModifier","TurbulenceField","octaves","velocityMultiplier","timeScale","timeOffset","temp2","lvl","velocities","inverseScaleX","inverseScaleY","inverseScaleZ","multiplierX","multiplierY","multiplierZ","timeX","timeY","timeZ","octave","lx","ly","lz","UNIT_X","UNIT_Y","UNIT_Z","VelocityOverLife","linearX","linearY","linearZ","orbitalX","orbitalY","orbitalZ","space","_tempEmitterPos","_tempRot","_axisX","_axisY","_axisZ","orbit","readValue","field","LinkedListNode","prev","hasPrev","hasNext","LinkedList","head","tail","isEmpty","clear","front","back","dequeue","queue","node","insertBefore","newNode","tempNode","values","current","SpriteParticle","storeIndex","scalarOffset","view","offset3","offset4","setStoreIndex","rebind","died","EMPTY_HISTORY","TrailParticle","_previous","historyPositions","historySizes","historyBaseSizes","headWidthScale","historyColors","historyCapacity","historyHead","historyCount","ensureHistoryCapacity","resetHistory","getHistoryIndex","positionIndex","storePositions","colors","storeColors","o4","WidthOverLength","absolute","sizes","baseSizes","invLength","slot","factor","BehaviorTypes","params","loadJSON","BehaviorFromJSON","DEPS","scalarSetup","expr","scalarValue","out","colorSetup","colorWrite","rotateInPlace","quaternionSetup","vectorSetup","orbitInPlace","fragmentFor","behavior","setup","body","passCache","Map","compile","fragments","indices","cached","compiled","Function","factory","generate","planBehaviorFusion","behaviors","steps","runBehaviors","runFragments","runIndices","runStart","flush","run","fragment","BoxEmitFrom","EmitterMode","BoxEmitter","parameters","_point","depth","emitFrom","Volume","boxThickness","_system","_delta","_emissionState","point","Shell","onSurface","Edge","side","thickness","isArray","getValueFromEmitterMode","currentValue","spread","emissionState","Random","Burst","Loop","PingPong","ShapeTransform","apply","isIdentity","toShapeJSON","CircleEmitter","arc","ConeEmitter","sinTheta","cosTheta","DonutEmitter","donutRadius","EdgeEmitter","GridEmitter","column","HemisphereEmitter","sinPhi","cosPhi","PointEmitter","cbrt","SphereEmitter","RectangleEmitter","thicknessScale","EmitterShapes","box","circle","cone","donut","edge","sphere","hemisphere","grid","rectangle","EmitterFromJSON","meta","Plugins","loadPlugin","plugin","find","item","emitterShape","emitterShapes","MeshSurfaceEmitter","mesh","_mesh","getVerticesData","VertexBuffer","PositionKind","getIndices","_positions","_indices","_triangleIndexToArea","area","triCount","i0","meshReferenceId","_meshReferenceId","u1","u2","idx0","idx1","idx2","uniqueId","MeshSurfaceEmitterPlugin","shaderChunks","registered","registerShaderChunks","tile_pars_vertex","tile_vertex","tile_pars_fragment","tile_fragment","soft_pars_vertex","soft_vertex","soft_pars_fragment","soft_fragment","local_particle_physics_vert","particle_frag","particle_physics_frag","particle_vert","stretched_bb_particle_vert","trail_frag","trail_vert","particle_frag_wgsl","shaderLanguageFor","engine","isWebGPU","ShaderLanguage","WGSL","GLSL","registerShaders","vertex","language","ShaderStore","ShadersStoreWGSL","wgsl","Effect","ShadersStore","glsl","RenderMode","defaultMeshLighting","BVector3","Color3","ambient","normalizeMeshRim","rim","channel","fallback","isFinite","strength","meshRimEqual","VFXBatch","settings","scene","visibleSystems","maxParticles","systems","Set","instancingGeometry","instancingIndices","instancingUVs","instancingNormals","renderMode","renderOrder","uTileCount","vTileCount","blendTiles","softParticles","softNearFade","softFarFade","materialBlendMode","materialTransparent","materialDepthTest","materialDepthWrite","materialAlphaTest","texture","reflectionTexture","reflectionLevel","reflectionFaces","reflectionAtlas","pivot","layerMask","lighting","Mesh","alwaysSelectAsActiveMesh","addSystem","removeSystem","delete","getVisibleSystems","visible","applyDepthTexture","depthTexture","material","ShaderMaterial","setTexture","applyMeshLighting","_lighting","dispose","SpriteBatch","whiteTexture","whiteTextureByScene","RawTexture","CreateRGBATexture","shaderMaterial","fixedLightDirection","fixedLightColor","fixedAmbientColor","vector_","vector2_","vector3_","quaternion_","quaternion2_","quaternion3_","quaternion4_","quaternion5_","rotationMat_","rotationMat2_","lastStretchedSpeedFactor","clearedInstanceUploaded","storeFixedLighting","setupBuffers","rebuildMaterial","vertexData","VertexData","vertexCount","uvs","normals","applyToMesh","buildExpandableBuffers","disposeExpandableBuffers","offsetVB","colorVB","sizeVB","uvTileVB","rotationVB","velocityVB","velocityBuffer","getEngine","offsetBuffer","setVerticesBuffer","colorBuffer","sizeBuffer","uvTileBuffer","rotationBuffer","StretchedBillBoard","forcedInstanceCount","doNotSyncBoundingInfo","expandBuffers","shaderName","defines","vertexShader","fragmentShader","mapTexture","atlas","isReady","onLoad","onLoadObservable","addOnce","useEnvAtlas","VerticalBillBoard","HorizontalBillBoard","takesPivotAndFlip","isMesh","lit","needsEyePosition","shaderLanguage","attributes","uniforms","samplers","mat","needAlphaBlending","setFloat","setVector3","setVector2","BVector2","eyePosition","onBindObservable","camera","activeCamera","copyFrom","globalPosition","projParams","BVector4","minZ","maxZ","setVector4","writeFixedLighting","readSceneLight","backFaceCulling","alphaMode","Constants","ALPHA_DISABLE","needDepthPrePass","forceDepthWrite","disableDepthWrite","lights","light","kind","getClassName","isEnabled","intensity","diffuse","sceneAmbient","ambientColor","lightDirection","scaleInPlace","ground","groundColor","particleCount","isMeshRender","isStretchedRender","flipsSprites","particleNum","systemWorldSpace","emitterMatrix","absScaleX","absScaleY","absScaleZ","stretchedSettings","rendererEmitterSettings","speedFactor","lengthFactor","copiedColor","sharedTransform","residual","simulationResidual","stepFraction","simulationStep","continueColor","subarray","copiedPositionAndSize","extrapolate","continueVector3","end","offsets","m00","m01","m02","m03","m10","m20","m30","o","px","py","pz","firstIndex","columns","rates","writeVelocities","writeQuaternions","own","partialTurn","parentQ","parentMatrix","ri","spin","oi","si","ci","vel","vi","applyFlip","applyFlipFromParticles","syncStretchedSpeedFactor","uploadClearedInstance","clampedSpeedFactor","BillBoard","flips","parent","turns","hasParent","pw","sw","inverseLength","tw","WeakMap","TrailBatch","drawsNothing","buildGeometryBuffers","positionBuffer","previousBuffer","nextBuffer","uvBuffer","sideBuffer","widthBuffer","indexBuffer","setVerticesData","UVKind","ColorKind","setIndices","subMeshes","previousVB","nextVB","sideVB","widthVB","setBoundingInfo","BoundingInfo","_boundingInfo","getBoundingInfo","resolution","getRenderWidth","getRenderHeight","renderEngine","ensureWorldMatrix","computeWorldMatrix","isSynchronized","triangles","tileWidth","tileHeight","objectScale","trailSettings","uvFromHead","Boolean","colorFromParticle","samplesInWorld","recordWorldSpace","followLocalOrigin","particleHistoryLength","particleColorIndex","col","invHistoryLength","currentSlot","currentX","currentY","currentZ","previousX","previousY","previousZ","nextX","nextY","nextZ","nextSlot","nextPosIndex","currentSize","currentColorIndex","currentColorX","currentColorY","currentColorZ","currentColorW","pi","ui","along","cci","previousHead","tipX","tipY","tipZ","headIndex","headX","headY","headZ","tipPi","headPi","tipSize","tipUi","tipU","tipColor","tipCi","uploadGeometry","geometry","getIndexBuffer","updateVerticesData","updateDynamicIndexBuffer","getVertexBuffer","verticesCount","adoptMeshBounds","meshBoundingInfo","subMesh","BatchedRenderer","TransformNode","batches","systemToBatchIndex","orderedSystems","orderedSystemsStale","batchEmptyFrames","adaptivePerformanceState","targetFrameMs","minQuality","maxQuality","decreaseStep","increaseStep","currentQuality","lastFrameCpuMs","lastAppliedQuality","meshLighting","reflectionFacesEqual","pivotEqual","_renderer","has","indexOf","setQualityFactor","assignToBatch","getRendererSettings","batch","getScene","Trail","deleteSystem","removed","removeFromBatch","ordered","batchIndex","updateSystem","setDepthTexture","setMeshLighting","getMeshLighting","configureAdaptivePerformance","options","disableAdaptivePerformance","resetQuality","applyAdaptiveQuality","getAdaptivePerformanceState","quality","_invalidateUpdateOrder","orderSystems","visiting","done","known","visit","targets","subTargetsOf","reverse","adaptiveState","frameStart","performance","now","refreshBatches","emptyFrames","framesEmpty","EMPTY_BATCH_GRACE_FRAMES","removeBatch","getBatchRenderStats","systemNames","instanceCount","BatchedParticleRenderer","atlasByCube","pendingByCube","cubeFaceUrls","reflection","isCube","files","_files","slice","getCachedEnvAtlas","cube","async","createEnvAtlasFromFaceUrls","urls","Image","images","Promise","all","url","reject","image","crossOrigin","onload","onerror","src","loadImage","naturalWidth","Texture","toDataURL","noMipmap","invertY","samplingMode","LINEAR_LINEAR","envAtlasBuilder","createFromFaceUrls","ensureEnvAtlasFromCube","onReady","kick","existingPending","then","pending","catch","err","observable","ParticleMeshStandardMaterial","StandardMaterial","isParticleMeshStandardMaterial","assign","ParticleMeshPhysicsMaterial","PBRMaterial","isParticleMeshPhysicsMaterial","ParticleEmitter","getWorldMatrix","flag","updateFlag","_matrixWorldFlag","_matrixWorld","setEnabled","extractFromCache","cache","metadata","clonedEmitter","scaling","_quarksUUID","ensureTriangleIndices","UP","IDENTITY_QUATERNION","tempV2","SIMULATION_STEP","SIZE_BEHAVIORS","COLOR_BEHAVIORS","INERT_FOR_SIZE_AND_COLOR","DEFAULT_POSITIONS","DEFAULT_UVS","DEFAULT_INDICES","trailFlags","flags","dieWithParticle","ParticleSystem","isEmitEnded","emitEnded","hasPendingEmission","looping","emissionBursts","hasPendingBurstWaves","timeRatio","emissionOverTime","emissionOverDistance","isFinished","layers","layerMaskProxy","rendererSettings","neededToUpdateRender","materialRef","applyMaterialSettings","nonZeroPivot","validLighting","nonZeroFlip","restart","blending","needRestart","startRotation","startLength","finishedEventFired","startDelayTimeLeft","tempEmitterPos","pathMatrix","normalMatrix","listeners","qualityFactor","simulationAccumulator","destroyed","fusionSteps","planChangesSize","planChangesColor","firstTimeUpdate","sceneRef","mask","defineProperty","enumerable","autoDestroy","startDelay","prewarm","startLife","shape","blendMode","ALPHA_ADD","transparent","depthTest","depthWrite","alphaTest","createFallbackNormals","startTileIndex","paused","burst","markForDestroy","prewarmed","overrides","resolvedTexture","albedoTexture","diffuseTexture","emissiveTexture","opacityTexture","baseTexture","resolvedReflection","environmentTexture","resolvedReflectionLevel","level","resolvedBlendMode","resolvedTransparent","resolvedDepthTest","disableDepthTest","resolvedDepthWrite","resolvedAlphaTest","transparencyMode","alphaTestMode","alphaCutOff","alphaCutOffValue","resolvedAtlas","pause","play","stop","rebindParticles","growParticlePool","isTrailMode","spawn","behaviorCount","isSpriteMode","isMeshMode","startRotationIsRotation","startSizeIsVector3","sprite","trail","localPosition","endEmit","fire","burstWaves","previousEmitterPos","stepsToRun","emitterElements","simulateStep","behaviorSteps","fusionPlan","same","changesSize","changesColor","stretched","vector3Rows","snapshotSize","snapshotColor","stepBehaviors","notifyDeaths","hasListeners","liveParticleCount","prevSize","curSize","prevColor","curColor","collapseSize","collapseColor","survivor","notifyFinished","burstWaveCount","cycle","burstInterval","interval","emitBursts","bursts","burstCount","waves","started","cycles","wave","waveTime","fireBurstWave","probability","rawCount","spawnAlongPath","carried","spacing","travelled","emissionBurstCount","pathSpawn","pathSpacing","pathCarried","pathLength","emitPerMeter","totalSpawn","metaData","_options","geometries","materials","textures","shapes","skeletons","animations","nodes","geometryUUID","ensureGeometryMeta","materialUUID","ensureMaterialMeta","rendererEmitterSettingsJSON","toRendererSettingsJSON","version","dependencies","materialMeta","materialTextureRef","resolvedGeometryEntry","resolvedGeometry","resolveGeometryData","cycleCount","sourceMaterial","behaviorJson","filter","nextSerializationId","prefix","serializationCounter","textureUUID","reflectionAtlasUUID","entry","uv","addBehavior","addEventListener","event","removeAllEventListeners","removeEventListener","callbacks","newBehaviors","QuarksPrefab","animationData","isPlaying","currentTime","_lastUpdateTimeMs","Date","_tempAnimationJSON","registerBatchedRenderer","renderer","_batchedRenderer","addParticleSystemAnimation","startTime","loop","updateDuration","addThreeAnimation","clip","clipUUID","removeAnimation","animation","forceDelta","previousTime","endTime","isActive","wasActive","setTime","getDuration","resolveReferences","root","nodesMap","traverse","children","getChildren","child","animationJSON","targetUUID","resolveTimelineClip","prefab","animationSources","animationGroups","found","maxDuration","sharedTextures","sharedGeometries","sharedFetches","sceneMap","maps","QuarksLoader","load","baseUrl","fetchEffectDocument","loadFromJSON","resolvedBase","resolveResources","parse","loadAll","docs","mapPool","concurrency","continueOnError","loadDocuments","loadFromJSONAll","entries","typed","resolveLinkedResources","inlineGeometryEntries","geometryUrl","resolved","resolveWith","fetchJsonWith","resolveExternalGeometries","loadGeometry","parseGeometries","parseImages","parseTextures","parseMaterials","parseObject","object","linkReferences","geom","hw","hh","parseSphereGeometry","parsed","parseBufferGeometry","share","shareResources","h1","h2","parts","lengths","part","bytes","buffer","byteOffset","byteLength","geometryKey","existing","clearSharedResources","joinUrl","test","startsWith","widthSegments","heightSegments","phiStart","phiLength","thetaStart","thetaLength","iy","verticesRow","ix","hypot","isTopFull","isBottomFull","typedIndices","interleavedBuffers","arrayBuffers","buffers","ibDef","arrayBuffer","floatArray","int32ArrayToFloat32","isInterleavedBufferAttribute","attr","buf","extractInterleavedAttribute","itemSize","intArray","ArrayBuffer","int32View","resolveResourceUrl","substring","lastIndexOf","resolvedEffect","total","results","settled","settle","onProgress","doc","items","fn","workers","worker","resolvedUrl","fetchJson","response","fetch","ok","status","_meta","_images","warnIfNotAnImageUrl","texDef","imageUrl","wrap","repeat","wrapU","mapWrapMode","wrapV","uScale","vScale","uOffset","vOffset","wAng","onDisposeObservable","wrapMode","CLAMP_ADDRESSMODE","MIRROR_ADDRESSMODE","WRAP_ADDRESSMODE","matDef","matInfo","textureRef","reflectionAtlasRef","blendingToAlphaMode","ALPHA_COMBINE","ALPHA_SUBTRACT","ALPHA_MULTIPLY","getGeometry","geometryId","getMaterial","materialId","selectedId","createPlaceholderNode","quarksOriginalType","createMeshNode","materialInfo","parseParticleSystem","Matrix","FromArray","Identity","childData","_meshSurfaceReferenceUUID","linkNode","meshSurfaceUUID","targetNode","subEmitter","QuarksUtil","runOnAllParticleEmitters","traverseNode","addToBatchRenderer","batchRenderer","setAutoDestroy","isEffectFinished","chunkName","pluginId"],"mappings":"gzDAKA,MAAMA,EAAO,CACT,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KA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"}