babylon.quarks 0.18.0 → 0.19.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/particle_vert.glsl.ts","../src/VFXBatch.ts","../src/shaders/particle_frag.glsl.ts","../src/shaders/local_particle_physics_vert.glsl.ts","../src/shaders/particle_physics_frag.glsl.ts","../src/shaders/stretched_bb_particle_vert.glsl.ts","../src/shaders/trail_vert.glsl.ts","../src/shaders/trail_frag.glsl.ts","../src/SpriteBatch.ts","../src/TrailBatch.ts","../src/BatchedRenderer.ts","../src/BatchedParticleRenderer.ts","../src/ParticleEmitter.ts","../src/geometryUtil.ts","../src/ParticleSystem.ts","../src/QuarksUtil.ts","../src/QuarksPrefab.ts","../src/materials/ParticleMaterials.ts","../src/index.ts","../src/QuarksLoader.ts","../src/shaders/local_particle_vert.glsl.ts"],"sourcesContent":["/**\n * quarks.core v0.18.0 build Tue Jul 14 2026\n * https://quarks.art\n * Copyright 2026 Alchemist0823 <the.forrest.sun@gmail.com>, MIT\n */\nconst _lut = ['00', '01', '02', '03', '04', '05', '06', '07', '08', '09', '0a', '0b', '0c', '0d', '0e', '0f', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '1a', '1b', '1c', '1d', '1e', '1f', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '2a', '2b', '2c', '2d', '2e', '2f', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '3a', '3b', '3c', '3d', '3e', '3f', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '4a', '4b', '4c', '4d', '4e', '4f', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '5a', '5b', '5c', '5d', '5e', '5f', '60', '61', '62', '63', '64', '65', '66', '67', '68', '69', '6a', '6b', '6c', '6d', '6e', '6f', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '7a', '7b', '7c', '7d', '7e', '7f', '80', '81', '82', '83', '84', '85', '86', '87', '88', '89', '8a', '8b', '8c', '8d', '8e', '8f', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99', '9a', '9b', '9c', '9d', '9e', '9f', 'a0', 'a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'a8', 'a9', 'aa', 'ab', 'ac', 'ad', 'ae', 'af', 'b0', 'b1', 'b2', 'b3', 'b4', 'b5', 'b6', 'b7', 'b8', 'b9', 'ba', 'bb', 'bc', 'bd', 'be', 'bf', 'c0', 'c1', 'c2', 'c3', 'c4', 'c5', 'c6', 'c7', 'c8', 'c9', 'ca', 'cb', 'cc', 'cd', 'ce', 'cf', 'd0', 'd1', 'd2', 'd3', 'd4', 'd5', 'd6', 'd7', 'd8', 'd9', 'da', 'db', 'dc', 'dd', 'de', 'df', 'e0', 'e1', 'e2', 'e3', 'e4', 'e5', 'e6', 'e7', 'e8', 'e9', 'ea', 'eb', 'ec', 'ed', 'ee', 'ef', 'f0', 'f1', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'fa', 'fb', 'fc', 'fd', 'fe', 'ff'];\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] + _lut[d0 >> 8 & 0xff] + _lut[d0 >> 16 & 0xff] + _lut[d0 >> 24 & 0xff] + '-' +\n _lut[d1 & 0xff] + _lut[d1 >> 8 & 0xff] + '-' + _lut[d1 >> 16 & 0x0f | 0x40] + _lut[d1 >> 24 & 0xff] + '-' +\n _lut[d2 & 0x3f | 0x80] + _lut[d2 >> 8 & 0xff] + '-' + _lut[d2 >> 16 & 0xff] + _lut[d2 >> 24 & 0xff] +\n _lut[d3 & 0xff] + _lut[d3 >> 8 & 0xff] + _lut[d3 >> 16 & 0xff] + _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.isQuaternion = true;\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) && (quaternion._y === this._y) && (quaternion._z === this._z) && (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}\n\nclass Vector3 {\n constructor(x = 0, y = 0, z = 0) {\n this.isVector3 = true;\n Vector3.prototype.isVector3 = true;\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}\nconst _vector = /*@__PURE__*/ new Vector3();\nconst _quaternion$1 = /*@__PURE__*/ new Quaternion();\n\n//import {WebGLCoordinateSystem, WebGPUCoordinateSystem} from 'constants.js';\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.isMatrix4 = true;\n Matrix4.prototype.isMatrix4 = true;\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}\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.isEuler = true;\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';\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\nclass Vector4 {\n constructor(x = 0, y = 0, z = 0, w = 1) {\n Vector4.prototype.isVector4 = true;\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}\n\nclass Matrix3 {\n constructor(n11, n12, n13, n21, n22, n23, n31, n32, n33) {\n Matrix3.prototype.isMatrix3 = true;\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}\nconst _m3 = /*@__PURE__*/ new Matrix3();\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\nclass Bezier {\n constructor(p1, p2, p3, p4) {\n this.p = [p1, p2, p3, p4];\n }\n genValue(t) {\n const t2 = t * t;\n const t3 = t * t * t;\n const mt = 1 - t;\n const mt2 = mt * mt;\n const mt3 = mt2 * mt;\n return this.p[0] * mt3 + this.p[1] * mt2 * t * 3 + this.p[2] * mt * t2 * 3 + this.p[3] * t3;\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\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 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\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 let mid = 0;\n let left = 0, right = this.keys.length - 1;\n while (left + 1 < right) {\n mid = Math.floor((left + right) / 2);\n if (t < this.getStartX(mid))\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 >= this.getStartX(i) && 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 index = this.findKey(t);\n if (this.subType === 'Number') {\n if (index === -1) {\n return this.keys[0][0];\n }\n else if (index + 1 >= this.keys.length) {\n return this.keys[this.keys.length - 1][0];\n }\n return ((this.keys[index + 1][0] - this.keys[index][0]) *\n ((t - this.getStartX(index)) / (this.getEndX(index) - this.getStartX(index))) +\n this.keys[index][0]);\n }\n else {\n if (index === -1) {\n return value.copy(this.keys[0][0]);\n }\n if (index + 1 >= this.keys.length) {\n return value.copy(this.keys[this.keys.length - 1][0]);\n }\n return value\n .copy(this.keys[index][0])\n .lerp(this.keys[index + 1][0], (t - this.getStartX(index)) / (this.getEndX(index) - this.getStartX(index)));\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\nconst tempVec3 = new Vector3();\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 this.type = 'function';\n this.color = new ContinuousLinearFunction(color, 'Color');\n this.alpha = new ContinuousLinearFunction(alpha, 'Number');\n }\n genColor(memory, color, t) {\n this.color.genValue(tempVec3, t);\n return color.set(tempVec3.x, tempVec3.y, tempVec3.z, this.alpha.genValue(1, t));\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\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 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 PiecewiseFunction {\n constructor() {\n this.functions = new Array();\n }\n findFunction(t) {\n let mid = 0;\n let left = 0, right = this.functions.length - 1;\n while (left + 1 < right) {\n mid = Math.floor((left + right) / 2);\n if (t < this.getStartX(mid))\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 >= this.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 this.type = 'function';\n this.functions = curves;\n }\n genValue(memory, t = 0) {\n const index = this.findFunction(t);\n if (index === -1) {\n return 0;\n }\n return this.functions[index][0].genValue((t - this.getStartX(index)) / (this.getEndX(index) - this.getStartX(index)));\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\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 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\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\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\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\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 }\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 }\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 };\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 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 spread: this.spread,\n });\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 }\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 }\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 };\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 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 spread: this.spread,\n });\n }\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\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._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 }\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 };\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 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 spread: this.spread,\n });\n }\n}\n\n/**\n * A point emitter emits particles from a single point.\n */\nclass PointEmitter {\n constructor() {\n this.type = 'point';\n this._m1 = new Matrix4();\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 }\n toJSON() {\n return {\n type: 'point',\n };\n }\n static fromJSON(json) {\n return new PointEmitter();\n }\n clone() {\n return new PointEmitter();\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._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 }\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 };\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 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 spread: this.spread,\n });\n }\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._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 }\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 };\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 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 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 }\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 }\n toJSON() {\n return {\n type: 'grid',\n width: this.width,\n height: this.height,\n column: this.column,\n row: this.row,\n };\n }\n static fromJSON(json) {\n return new GridEmitter(json);\n }\n clone() {\n return new GridEmitter({\n width: this.width,\n height: this.height,\n column: this.column,\n row: this.row,\n });\n }\n update(system, delta) { }\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._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 }\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 };\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 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 spread: this.spread,\n });\n }\n}\n\nconst EmitterShapes = {\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 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\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 this.color.genColor(particle.memory, particle.color, particle.age / particle.life);\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 };\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\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 particle.rotation +=\n delta *\n this.angularVelocity.genValue(particle.memory, particle.age / particle.life);\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 clone() {\n return new RotationOverLife(this.angularVelocity.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 this.tempQuat = new Quaternion();\n this.tempQuat2 = 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 }\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 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 if (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 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\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 this._tempAxis = new Vector3();\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 }\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 // Convert the authored space into the particle simulation space.\n if (this.ps.worldSpace && this.space === 'local') {\n this._temp.multiply(this._tempScale).applyQuaternion(this._tempQ);\n }\n else if (!this.ps.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 const worldPivot = this.ps.worldSpace;\n if (worldPivot) {\n particle.position.sub(this._tempEmitterPos);\n }\n this.orbit(particle.position, UNIT_X, angleX, worldPivot);\n this.orbit(particle.position, UNIT_Y, angleY, worldPivot);\n this.orbit(particle.position, UNIT_Z, angleZ, worldPivot);\n if (worldPivot) {\n particle.position.add(this._tempEmitterPos);\n }\n }\n }\n orbit(position, axis, angle, worldAxes) {\n if (angle === 0) {\n return;\n }\n this._tempAxis.copy(axis);\n if (worldAxes) {\n this._tempAxis.applyQuaternion(this._tempQ);\n }\n this._tempRot.setFromAxisAngle(this._tempAxis, 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 * 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 if (this.mode !== 'current' || !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 ? ValueGeneratorFromJSON(json.multiplier) : 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 * Apply size to particles based on their life.\n */\nclass SizeOverLife {\n initialize(particle) {\n this.size.startGen(particle.memory);\n }\n constructor(size) {\n this.size = size;\n this.type = 'SizeOverLife';\n }\n update(particle) {\n if (this.size instanceof Vector3Function) {\n this.size.genValue(particle.memory, particle.size, particle.age / particle.life).multiply(particle.startSize);\n }\n else {\n particle.size.copy(particle.startSize).multiplyScalar(this.size.genValue(particle.memory, particle.age / particle.life));\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 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 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 clone() {\n return new SpeedOverLife(this.speed.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.frame = frame;\n this.type = 'FrameOverLife';\n }\n initialize(particle) {\n this.frame.startGen(particle.memory);\n }\n update(particle, delta) {\n if (this.frame instanceof PiecewiseBezier) {\n particle.uvTile = this.frame.genValue(particle.memory, particle.age / particle.life);\n }\n }\n frameUpdate(delta) { }\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 * 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 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\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 constructor() {\n /**\n * Initial speed of the particle.\n * @type {number}\n */\n this.startSpeed = 0;\n /**\n * Initial color of the particle.\n * @type {Vector4}\n */\n this.startColor = new Vector4();\n /**\n * Initial size of the particle.\n * @type {Vector3}\n */\n this.startSize = new Vector3(1, 1, 1);\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(1, 1, 1);\n /**\n * Speed modifier of the particle.\n * @type {number}\n */\n this.speedModifier = 1;\n // GPU properties\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();\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 reset() {\n this.memory.length = 0;\n }\n}\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 constructor() {\n /**\n * Initial speed of the particle.\n * @type {number}\n */\n this.startSpeed = 0;\n /**\n * Initial color of the particle.\n * @type {Vector4}\n */\n this.startColor = new Vector4();\n /**\n * Initial size of the particle.\n * @type {Vector3}\n */\n this.startSize = new Vector3(1, 1, 1);\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(1, 1, 1);\n /**\n * Length of the trail.\n * @type {number}\n */\n this.length = 100;\n /**\n * Speed modifier of the particle.\n * @type {number}\n */\n this.speedModifier = 1;\n // GPU properties\n /**\n * Color of the particle.\n * @type {Vector4}\n */\n this.color = new Vector4();\n /**\n * Previous states of the particle.\n * @type {LinkedList<RecordState>}\n */\n this.previous = new LinkedList();\n /**\n * UV tile index.\n * @type {number}\n */\n this.uvTile = 0;\n this.memory = [];\n }\n /**\n * Updates the particle state.\n */\n update() {\n if (this.age <= this.life) {\n this.previous.push(new RecordState(this.position.clone(), this.size.x, this.color.clone()));\n }\n else {\n if (this.previous.length > 0) {\n this.previous.dequeue();\n }\n }\n while (this.previous.length > this.length) {\n this.previous.dequeue();\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.previous.clear();\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 const iter = particle.previous.values();\n for (let i = 0; i < particle.previous.length; i++) {\n const cur = iter.next();\n cur.value.size = this.width.genValue(particle.memory, (particle.previous.length - i) / particle.length);\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\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 particle.velocity.addScaledVector(this.direction, this.magnitudeValue * delta);\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\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 this.temp.copy(this.center).sub(particle.position).normalize();\n particle.velocity.addScaledVector(this.temp, (this.magnitude / particle.position.distanceToSquared(this.center)) * delta);\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 * 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\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 * 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([1, 1, 0,\n -1, 1, 0,\n 1, -1, 0,\n -1, -1, 0,\n 1, 0, 1,\n -1, 0, 1,\n 1, 0, -1,\n -1, 0, -1,\n 0, 1, 1,\n 0, -1, 1,\n 0, 1, -1,\n 0, -1, -1]);\nconst grad4 = new Float32Array([0, 1, 1, 1, 0, 1, 1, -1, 0, 1, -1, 1, 0, 1, -1, -1,\n 0, -1, 1, 1, 0, -1, 1, -1, 0, -1, -1, 1, 0, -1, -1, -1,\n 1, 0, 1, 1, 1, 0, 1, -1, 1, 0, -1, 1, 1, 0, -1, -1,\n -1, 0, 1, 1, -1, 0, 1, -1, -1, 0, -1, 1, -1, 0, -1, -1,\n 1, 1, 0, 1, 1, 1, 0, -1, 1, -1, 0, 1, 1, -1, 0, -1,\n -1, 1, 0, 1, -1, 1, 0, -1, -1, -1, 0, 1, -1, -1, 0, -1,\n 1, 1, 1, 0, 1, 1, -1, 0, 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]);\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 { // 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\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 generators = [];\nconst tempV = new Vector3();\nconst tempQ = new Quaternion();\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 if (generators.length === 0) {\n for (let i = 0; i < 100; i++) {\n generators.push(new SimplexNoise());\n }\n }\n }\n initialize(particle) {\n particle.lastPosNoise = new Vector3();\n if (typeof particle.rotation === 'number') {\n particle.lastRotNoise = 0;\n }\n else {\n particle.lastRotNoise = new Quaternion();\n }\n particle.generatorIndex = [randomInt(0, 100), randomInt(0, 100), randomInt(0, 100), randomInt(0, 100)];\n this.positionAmount.startGen(particle.memory);\n this.rotationAmount.startGen(particle.memory);\n this.frequency.startGen(particle.memory);\n this.power.startGen(particle.memory);\n }\n update(particle, _) {\n let frequency = this.frequency.genValue(particle.memory, particle.age / particle.life);\n let power = this.power.genValue(particle.memory, particle.age / particle.life);\n let positionAmount = this.positionAmount.genValue(particle.memory, particle.age / particle.life);\n let rotationAmount = this.rotationAmount.genValue(particle.memory, particle.age / particle.life);\n if (positionAmount > 0 && particle.lastPosNoise !== undefined) {\n particle.position.sub(particle.lastPosNoise);\n tempV.set(generators[particle.generatorIndex[0]].noise2D(0, particle.age * frequency) *\n power *\n positionAmount, generators[particle.generatorIndex[1]].noise2D(0, particle.age * frequency) *\n power *\n positionAmount, generators[particle.generatorIndex[2]].noise2D(0, particle.age * frequency) *\n power *\n positionAmount);\n particle.position.add(tempV);\n particle.lastPosNoise.copy(tempV);\n }\n if (rotationAmount > 0 && particle.lastRotNoise !== undefined) {\n if (typeof particle.rotation === 'number') {\n particle.rotation -= particle.lastRotNoise;\n particle.rotation +=\n generators[particle.generatorIndex[3]].noise2D(0, particle.age * frequency) *\n Math.PI *\n power *\n rotationAmount;\n }\n else {\n particle.lastRotNoise.invert();\n particle.rotation.multiply(particle.lastRotNoise);\n tempQ\n .set(generators[particle.generatorIndex[0]].noise2D(0, particle.age * frequency) *\n power *\n rotationAmount, generators[particle.generatorIndex[1]].noise2D(0, particle.age * frequency) *\n power *\n rotationAmount, generators[particle.generatorIndex[2]].noise2D(0, particle.age * frequency) *\n power *\n rotationAmount, generators[particle.generatorIndex[3]].noise2D(0, particle.age * frequency) *\n power *\n rotationAmount)\n .normalize();\n particle.rotation.multiply(tempQ);\n particle.lastRotNoise.copy(tempQ);\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\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\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\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 * 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.copy(particle.startSize).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 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 particle.rotation +=\n delta * this.angularVelocity.genValue(particle.memory, t);\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 * 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 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 clone() {\n return new LimitSpeedOverLife(this.speed.clone(), this.dampen);\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\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, ChangeEmitDirection, CircleEmitter, ColorBySpeed, ColorGeneratorFromJSON, ColorOverLife, ColorRange, ConeEmitter, ConstantColor, ConstantValue, DEG2RAD, DonutEmitter, EmitSubParticleSystem, EmitterFromJSON, EmitterMode, EmitterShapes, Euler, EulerGenerator, ForceOverLife, FrameOverLife, GeneratorFromJSON, Gradient, GravityForce, GridEmitter, HemisphereEmitter, InheritVelocity, IntervalValue, LimitSpeedOverLife, MathUtils, Matrix3, Matrix4, NodeParticle, Noise, OrbitOverLife, PiecewiseBezier, PiecewiseFunction, Plugins, PointEmitter, Quaternion, RAD2DEG, RandomColor, RandomColorBetweenGradient, RandomQuatGenerator, RecordState, RectangleEmitter, Rotation3DOverLife, RotationBySpeed, RotationGeneratorFromJSON, RotationOverLife, SequencerFromJSON, SizeBySpeed, SizeOverLife, SpeedOverLife, SphereEmitter, SpriteParticle, SubParticleEmitMode, TextureSequencer, TrailParticle, TurbulenceField, ValueGeneratorFromJSON, Vector2, Vector3, Vector3Function, Vector3GeneratorFromJSON, Vector4, VelocityOverLife, WebGLCoordinateSystem, WebGPUCoordinateSystem, WidthOverLength, ceilPowerOfTwo, clamp, damp, degToRad, denormalize, euclideanModulo, floorPowerOfTwo, generateUUID, getPhysicsResolver, getValueFromEmitterMode, inverseLerp, isPowerOfTwo, lerp, loadPlugin, mapLinear, normalize, pingpong, radToDeg, randFloat, randFloatSpread, randInt, seededRandom, setPhysicsResolver, setQuaternionFromProperEuler, smootherstep, smoothstep, unloadPlugin };\n","import {Mesh} from '@babylonjs/core/Meshes/mesh';\nimport {VertexBuffer} from '@babylonjs/core/Buffers/buffer';\nimport {\n Particle,\n EmitterShape,\n ShapeJSON,\n IParticleSystem,\n Vector3,\n Plugin,\n} 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\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) {\n this._meshReferenceId = meshReferenceId;\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 return;\n }\n\n const triCount = this._triangleIndexToArea.length - 1;\n let left = 0, 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], ay = this._positions[idx0 * 3 + 1], az = this._positions[idx0 * 3 + 2];\n const bx = this._positions[idx1 * 3] - ax, by = this._positions[idx1 * 3 + 1] - ay, bz = this._positions[idx1 * 3 + 2] - az;\n const cx = this._positions[idx2 * 3] - ax, cy = this._positions[idx2 * 3 + 1] - ay, 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 }\n\n toJSON(): ShapeJSON {\n return {type: 'mesh_surface', mesh: this._mesh ? (this._mesh as any).uniqueId?.toString() : this._meshReferenceId ?? ''};\n }\n\n static fromJSON(json: any): MeshSurfaceEmitter {\n return new MeshSurfaceEmitter(undefined, json?.mesh);\n }\n\n clone(): EmitterShape {\n return new MeshSurfaceEmitter(this._mesh, this._meshReferenceId);\n }\n\n update(_system: IParticleSystem, _delta: number): void {}\n}\n\nexport const MeshSurfaceEmitterPlugin: Plugin = {\n id: 'babylon.quarks',\n initialize: () => {},\n emitterShapes: [{\n type: 'mesh_surface',\n params: [['mesh', ['mesh']]],\n constructor: MeshSurfaceEmitter,\n loadJSON: (json: any) => MeshSurfaceEmitter.fromJSON(json),\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 */ `\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// 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 vec2 alignedPosition = position.xy * size.xy;\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 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\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","import {Mesh} from '@babylonjs/core/Meshes/mesh';\nimport {Scene} from '@babylonjs/core/scene';\nimport {BaseTexture} from '@babylonjs/core/Materials/Textures/baseTexture';\nimport {ShaderMaterial} from '@babylonjs/core/Materials/shaderMaterial';\nimport {IParticleSystem} 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 layerMask: number;\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\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 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 getVisibleSystems(): IParticleSystem[] {\n const visibleSystems: IParticleSystem[] = [];\n for (const system of this.systems) {\n if (system.emitter.visible) {\n visibleSystems.push(system);\n }\n }\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","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 */ `\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;\nvarying vec3 vNormal;\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#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 gl_FragColor = vec4(baseColor.rgb * litColor, 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;\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// 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 float avgSize = (size.x + 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 mvPosition.xyz += position.y * normalize(cross(mvPosition.xyz, vdir)) * 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 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 */ `\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 /* 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","import {Mesh} from '@babylonjs/core/Meshes/mesh';\nimport {VertexData} from '@babylonjs/core/Meshes/mesh.vertexData';\nimport {VertexBuffer} from '@babylonjs/core/Buffers/buffer';\nimport {Effect} from '@babylonjs/core/Materials/effect';\nimport {ShaderMaterial} from '@babylonjs/core/Materials/shaderMaterial';\nimport {Scene} from '@babylonjs/core/scene';\nimport {Constants} from '@babylonjs/core/Engines/constants';\nimport {Vector2 as BVector2, Vector3 as BVector3, Vector4 as BVector4} from '@babylonjs/core/Maths/math.vector';\nimport {\n Vector3,\n Vector4,\n Quaternion,\n Matrix3,\n SpriteParticle,\n StretchedBillBoardSettings,\n} from 'quarks.core';\nimport {VFXBatch, RenderMode} from './VFXBatch';\nimport {VFXBatchSettings} from './BatchedRenderer';\nimport particle_vert from './shaders/particle_vert.glsl';\nimport particle_frag from './shaders/particle_frag.glsl';\nimport particle_physics_frag from './shaders/particle_physics_frag.glsl';\nimport stretched_bb_particle_vert from './shaders/stretched_bb_particle_vert.glsl';\nimport local_particle_physics_vert from './shaders/local_particle_physics_vert.glsl';\n\nexport class SpriteBatch extends VFXBatch {\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 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 if (this.settings.instancingUVs) {\n vertexData.uvs = this.settings.instancingUVs;\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 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.buildExpandableBuffers();\n }\n\n rebuildMaterial(): void {\n const shaderName = `quarksParticle_${this.settings.renderMode}_${Date.now()}`;\n this.lastStretchedSpeedFactor = Number.NaN;\n let vertexShader: string;\n let fragmentShader: string;\n const defines: string[] = [];\n\n if (this.settings.renderMode === RenderMode.Mesh) {\n vertexShader = local_particle_physics_vert;\n fragmentShader = particle_physics_frag;\n } else if (this.settings.renderMode === RenderMode.StretchedBillBoard) {\n vertexShader = stretched_bb_particle_vert;\n fragmentShader = particle_frag;\n } else {\n vertexShader = particle_vert;\n fragmentShader = particle_frag;\n }\n\n if (this.settings.texture) {\n defines.push('USE_MAP');\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\n Effect.ShadersStore[shaderName + 'VertexShader'] = vertexShader;\n Effect.ShadersStore[shaderName + 'FragmentShader'] = fragmentShader;\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 (this.settings.texture) {\n samplers.push('map');\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 (this.settings.renderMode === RenderMode.Mesh) {\n uniforms.push('lightDirection');\n uniforms.push('lightColor');\n uniforms.push('ambientColor');\n }\n\n const mat = new ShaderMaterial(shaderName, this.scene,\n {vertex: shaderName, fragment: shaderName},\n {\n attributes,\n uniforms,\n samplers,\n defines,\n needAlphaBlending: this.settings.materialTransparent,\n }\n );\n\n if (this.settings.texture) {\n mat.setTexture('map', this.settings.texture);\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('softParams', new BVector2(this.settings.softNearFade, 1.0 / Math.max(this.settings.softFarFade - this.settings.softNearFade, 0.0001)));\n mat.onBindObservable.add(() => {\n const camera = this.scene.activeCamera;\n if (camera) {\n mat.setVector4('projParams', new BVector4(camera.minZ, camera.maxZ, 0, 0));\n }\n });\n }\n if (this.settings.materialAlphaTest > 0) {\n mat.setFloat('alphaTest', this.settings.materialAlphaTest);\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 }\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 rotationMat_ = new Matrix3();\n private rotationMat2_ = new Matrix3();\n private lastStretchedSpeedFactor = Number.NaN;\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\n const visibleSystems = this.getVisibleSystems();\n for (const system of visibleSystems) {\n particleCount += system.particleNum;\n }\n if (particleCount > this.maxParticles) {\n this.expandBuffers(particleCount);\n }\n\n for (const system of visibleSystems) {\n const particles = system.particles;\n const particleNum = system.particleNum;\n const rotation = this.quaternion2_;\n const translation = this.vector2_;\n const scale = this.vector3_;\n const systemWorldSpace = system.worldSpace;\n system.emitter.matrixWorld.decompose(translation, rotation, scale);\n this.rotationMat_.setFromMatrix4(system.emitter.matrixWorld);\n const absScaleX = Math.abs(scale.x);\n const absScaleY = Math.abs(scale.y);\n const absScaleZ = Math.abs(scale.z);\n\n for (let j = 0; j < particleNum; j++, index++) {\n const particle = particles[j] as SpriteParticle;\n\n if (isMeshRender) {\n let q: Quaternion;\n if (systemWorldSpace) {\n q = particle.rotation as Quaternion;\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(particle.rotation as Quaternion);\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 this.rotationBuffer[index] = particle.rotation as number;\n }\n\n let vec: Vector3;\n if (systemWorldSpace) {\n vec = particle.position;\n } else {\n vec = this.vector_;\n if (particle.parentMatrix) {\n vec.copy(particle.position).applyMatrix4(particle.parentMatrix);\n } else {\n vec.copy(particle.position).applyMatrix4(system.emitter.matrixWorld);\n }\n }\n\n const oi = index * 3;\n this.offsetBuffer[oi] = vec.x;\n this.offsetBuffer[oi + 1] = vec.y;\n this.offsetBuffer[oi + 2] = vec.z;\n\n const ci = index * 4;\n this.colorBuffer[ci] = particle.color.x;\n this.colorBuffer[ci + 1] = particle.color.y;\n this.colorBuffer[ci + 2] = particle.color.z;\n this.colorBuffer[ci + 3] = particle.color.w;\n\n const si = index * 3;\n if (systemWorldSpace) {\n this.sizeBuffer[si] = particle.size.x;\n this.sizeBuffer[si + 1] = particle.size.y;\n this.sizeBuffer[si + 2] = particle.size.z;\n } else {\n if (particle.parentMatrix) {\n this.sizeBuffer[si] = particle.size.x;\n this.sizeBuffer[si + 1] = particle.size.y;\n this.sizeBuffer[si + 2] = particle.size.z;\n } else {\n this.sizeBuffer[si] = particle.size.x * absScaleX;\n this.sizeBuffer[si + 1] = particle.size.y * absScaleY;\n this.sizeBuffer[si + 2] = particle.size.z * absScaleZ;\n }\n }\n\n this.uvTileBuffer[index] = particle.uvTile;\n\n if (isStretchedRender && this.velocityBuffer) {\n let speedFactor = (system.rendererEmitterSettings as StretchedBillBoardSettings).speedFactor;\n if (speedFactor === 0) speedFactor = 0.001;\n const lengthFactor = (system.rendererEmitterSettings as StretchedBillBoardSettings).lengthFactor;\n let vel: Vector3;\n if (systemWorldSpace) {\n vel = particle.velocity;\n } else {\n vel = this.vector_;\n if (particle.parentMatrix) {\n this.rotationMat2_.setFromMatrix4(particle.parentMatrix);\n vel.copy(particle.velocity).applyMatrix3(this.rotationMat2_);\n } else {\n vel.copy(particle.velocity).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 (isStretchedRender && this.mesh.material instanceof ShaderMaterial && visibleSystems.length > 0) {\n const speedFactor = (visibleSystems[0].rendererEmitterSettings as StretchedBillBoardSettings).speedFactor ?? 1.0;\n const clampedSpeedFactor = speedFactor === 0 ? 0.001 : speedFactor;\n if (clampedSpeedFactor !== this.lastStretchedSpeedFactor) {\n this.mesh.material.setFloat('speedFactor', clampedSpeedFactor);\n this.lastStretchedSpeedFactor = clampedSpeedFactor;\n }\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 this.uploadClearedInstance(isMeshRender, isStretchedRender);\n return;\n }\n\n this.offsetVB.update(this.offsetBuffer);\n this.sizeVB.update(this.sizeBuffer);\n this.colorVB.update(this.colorBuffer);\n this.uvTileVB.update(this.uvTileBuffer);\n this.rotationVB.update(this.rotationBuffer);\n if (isStretchedRender && this.velocityVB && this.velocityBuffer) {\n this.velocityVB.update(this.velocityBuffer);\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","import {Mesh} from '@babylonjs/core/Meshes/mesh';\nimport {VertexBuffer} from '@babylonjs/core/Buffers/buffer';\nimport {Effect} from '@babylonjs/core/Materials/effect';\nimport {ShaderMaterial} from '@babylonjs/core/Materials/shaderMaterial';\nimport {Scene} from '@babylonjs/core/scene';\nimport {BoundingInfo} from '@babylonjs/core/Culling/boundingInfo';\nimport {Vector3 as BVector3} from '@babylonjs/core/Maths/math.vector';\nimport {Vector2 as BVector2} from '@babylonjs/core/Maths/math.vector';\nimport {Constants} from '@babylonjs/core/Engines/constants';\nimport {Matrix4, Quaternion, RecordState, TrailParticle, Vector3} from 'quarks.core';\nimport {VFXBatch, RenderMode} from './VFXBatch';\nimport {VFXBatchSettings} from './BatchedRenderer';\nimport trail_vert from './shaders/trail_vert.glsl';\nimport trail_frag from './shaders/trail_frag.glsl';\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 private previousVB!: VertexBuffer;\n private nextVB!: VertexBuffer;\n private sideVB!: VertexBuffer;\n private widthVB!: VertexBuffer;\n\n private getTrailHistoryCount(particle: TrailParticle): number {\n const trailAny = particle as any;\n const fastHistoryCount = trailAny._trailHistoryCount;\n if (typeof fastHistoryCount === 'number') {\n return fastHistoryCount;\n }\n return particle.previous.length;\n }\n\n constructor(settings: VFXBatchSettings, scene: Scene) {\n super(settings, scene);\n this.maxParticles = 10000;\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; this.positionBuffer[1] = 0; this.positionBuffer[2] = 0;\n this.positionBuffer[3] = 1; this.positionBuffer[4] = 0; this.positionBuffer[5] = 0;\n this.positionBuffer[6] = 0; this.positionBuffer[7] = 1; this.positionBuffer[8] = 0;\n this.positionBuffer[9] = 1; this.positionBuffer[10] = 1; this.positionBuffer[11] = 0;\n this.indexBuffer[0] = 0; this.indexBuffer[1] = 1; this.indexBuffer[2] = 2;\n this.indexBuffer[3] = 1; this.indexBuffer[4] = 3; 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 this.mesh.setIndices(this.indexBuffer.subarray(0, 6), null, true);\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 this.buildGeometryBuffers();\n }\n\n rebuildMaterial(): void {\n const shaderName = `quarksTrail_${Date.now()}`;\n const defines: string[] = [];\n\n if (this.settings.texture) {\n defines.push('USE_MAP');\n }\n\n Effect.ShadersStore[shaderName + 'VertexShader'] = trail_vert;\n Effect.ShadersStore[shaderName + 'FragmentShader'] = trail_frag;\n\n const attributes = ['position', 'previous', 'next', 'side', 'width', 'uv', 'color'];\n const uniforms = ['world', 'view', 'projection', 'worldViewProjection', 'lineWidth', 'resolution', 'sizeAttenuation'];\n const samplers: string[] = [];\n\n if (this.settings.texture) {\n samplers.push('map');\n }\n\n const mat = new ShaderMaterial(shaderName, this.scene,\n {vertex: shaderName, fragment: shaderName},\n {\n attributes,\n uniforms,\n samplers,\n defines,\n needAlphaBlending: this.settings.materialTransparent,\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 mat.setVector2('resolution', new BVector2(engine.getRenderWidth(), engine.getRenderHeight()));\n mat.setFloat('sizeAttenuation', 1);\n mat.onBindObservable.add(() => {\n const renderEngine = this.scene.getEngine();\n mat.setVector2('resolution', new BVector2(renderEngine.getRenderWidth(), renderEngine.getRenderHeight()));\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 update(): void {\n let index = 0;\n let triangles = 0;\n\n let particleCount = 0;\n const visibleSystems = this.getVisibleSystems();\n for (const system of visibleSystems) {\n for (let j = 0; j < system.particleNum; j++) {\n particleCount += this.getTrailHistoryCount(system.particles[j] as TrailParticle) * 2;\n }\n }\n if (particleCount > this.maxParticles) {\n this.expandBuffers(particleCount);\n }\n\n for (const system of visibleSystems) {\n // Ensure world matrix is up to date\n if ((system.emitter as any).computeWorldMatrix) {\n (system.emitter as any).computeWorldMatrix(true);\n }\n const rotation = this.quaternion_;\n const translation = this.vector2_;\n const scale = this.vector3_;\n system.emitter.matrixWorld.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\n for (let j = 0; j < particleNum; j++) {\n const particle = particles[j] as TrailParticle;\n const particleAny = particle as any;\n const fastHistoryCount = particleAny._trailHistoryCount as number | undefined;\n const fastHistoryCapacity = particleAny._trailHistoryCapacity as number | undefined;\n const fastHistoryHead = particleAny._trailHistoryHead as number | undefined;\n const fastHistoryPositions = particleAny._trailHistoryPositions as Float32Array | undefined;\n const fastHistorySizes = particleAny._trailHistorySizes as Float32Array | undefined;\n const fastHistoryColors = particleAny._trailHistoryColors as Float32Array | undefined;\n const hasFastHistory =\n typeof fastHistoryCount === 'number' &&\n fastHistoryCount > 0 &&\n typeof fastHistoryCapacity === 'number' &&\n typeof fastHistoryHead === 'number' &&\n fastHistoryPositions instanceof Float32Array &&\n fastHistorySizes instanceof Float32Array &&\n fastHistoryColors instanceof Float32Array;\n const historyCapacity = hasFastHistory ? (fastHistoryCapacity as number) : 0;\n const historyHead = hasFastHistory ? (fastHistoryHead as number) : 0;\n const historyPositions = fastHistoryPositions as Float32Array;\n const historySizes = fastHistorySizes as Float32Array;\n const historyColors = fastHistoryColors as Float32Array;\n const particleHistory = particle.previous;\n const particleHistoryLength = hasFastHistory ? fastHistoryCount : particleHistory.length;\n if (particleHistoryLength === 0) {\n continue;\n }\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 matrixToUse = particleMatrix ?? system.emitter.matrixWorld;\n\n let previousNode = particleHistory.head;\n let currentNode = previousNode;\n let nextNode = currentNode?.next ?? currentNode;\n const oldestFastHistoryIndex = hasFastHistory\n ? (historyHead - particleHistoryLength + historyCapacity) % historyCapacity\n : 0;\n\n for (let i = 0; i < particleHistoryLength; i++, index += 2) {\n let currentX: number;\n let currentY: number;\n let currentZ: number;\n let currentSize: number;\n let currentColorX: number;\n let currentColorY: number;\n let currentColorZ: number;\n let currentColorW: number;\n let previousX: number;\n let previousY: number;\n let previousZ: number;\n let nextX: number;\n let nextY: number;\n let nextZ: number;\n\n if (hasFastHistory) {\n const currentHistoryIndex = (oldestFastHistoryIndex + i) % historyCapacity;\n const previousHistoryIndex = i === 0 ? currentHistoryIndex : (oldestFastHistoryIndex + i - 1) % historyCapacity;\n const nextHistoryIndex =\n i + 1 < particleHistoryLength\n ? (oldestFastHistoryIndex + i + 1) % historyCapacity\n : currentHistoryIndex;\n\n const currentPosIndex = currentHistoryIndex * 3;\n const previousPosIndex = previousHistoryIndex * 3;\n const nextPosIndex = nextHistoryIndex * 3;\n\n currentX = historyPositions[currentPosIndex];\n currentY = historyPositions[currentPosIndex + 1];\n currentZ = historyPositions[currentPosIndex + 2];\n previousX = historyPositions[previousPosIndex];\n previousY = historyPositions[previousPosIndex + 1];\n previousZ = historyPositions[previousPosIndex + 2];\n nextX = historyPositions[nextPosIndex];\n nextY = historyPositions[nextPosIndex + 1];\n nextZ = historyPositions[nextPosIndex + 2];\n\n currentSize = historySizes[currentHistoryIndex];\n const currentColorIndex = currentHistoryIndex * 4;\n currentColorX = historyColors[currentColorIndex];\n currentColorY = historyColors[currentColorIndex + 1];\n currentColorZ = historyColors[currentColorIndex + 2];\n currentColorW = historyColors[currentColorIndex + 3];\n } else {\n const previous = previousNode!.data as RecordState;\n const current = currentNode!.data as RecordState;\n const next = nextNode!.data as RecordState;\n currentX = current.position.x;\n currentY = current.position.y;\n currentZ = current.position.z;\n previousX = previous.position.x;\n previousY = previous.position.y;\n previousZ = previous.position.z;\n nextX = next.position.x;\n nextY = next.position.y;\n nextZ = next.position.z;\n currentSize = current.size;\n currentColorX = current.color.x;\n currentColorY = current.color.y;\n currentColorZ = current.color.z;\n currentColorW = current.color.w;\n }\n\n if (!systemWorldSpace) {\n this.vector_.set(currentX, currentY, currentZ).applyMatrix4(matrixToUse);\n currentX = this.vector_.x;\n currentY = this.vector_.y;\n currentZ = this.vector_.z;\n this.vector_.set(previousX, previousY, previousZ).applyMatrix4(matrixToUse);\n previousX = this.vector_.x;\n previousY = this.vector_.y;\n previousZ = this.vector_.z;\n this.vector_.set(nextX, nextY, nextZ).applyMatrix4(matrixToUse);\n nextX = this.vector_.x;\n nextY = this.vector_.y;\n nextZ = this.vector_.z;\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 this.uvBuffer[ui] = (i / particleHistoryLength + col) * tileWidth;\n this.uvBuffer[ui + 1] = (vTileCount - row - 1) * tileHeight;\n this.uvBuffer[ui + 2] = (i / particleHistoryLength + col) * tileWidth;\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 if (!hasFastHistory) {\n previousNode = currentNode;\n currentNode = nextNode;\n nextNode = nextNode?.next ?? nextNode;\n }\n }\n }\n }\n\n if (index > 0 && triangles > 0) {\n this.mesh.updateVerticesData(VertexBuffer.PositionKind, this.positionBuffer);\n this.mesh.updateVerticesData(VertexBuffer.UVKind, this.uvBuffer);\n this.mesh.updateIndices(this.indexBuffer.subarray(0, triangles * 3));\n this.previousVB.update(this.previousBuffer);\n this.nextVB.update(this.nextBuffer);\n this.sideVB.update(this.sideBuffer);\n this.widthVB.update(this.widthBuffer);\n\n const colorVB = this.mesh.getVertexBuffer(VertexBuffer.ColorKind);\n if (colorVB) colorVB.update(this.colorBuffer);\n\n if (this.mesh.subMeshes && this.mesh.subMeshes.length > 0) {\n const meshBoundingInfo = this.mesh.getBoundingInfo();\n for (const subMesh of this.mesh.subMeshes) {\n (subMesh as any)._boundingInfo = meshBoundingInfo;\n }\n this.mesh.subMeshes[0].indexCount = triangles * 3;\n this.mesh.subMeshes[0].verticesCount = index;\n }\n } else if (this.mesh.subMeshes && this.mesh.subMeshes.length > 0) {\n this.mesh.subMeshes[0].indexCount = 0;\n this.mesh.subMeshes[0].verticesCount = 0;\n }\n }\n\n dispose(): void {\n if (this.mesh.material) {\n this.mesh.material.dispose();\n }\n super.dispose();\n }\n}\n","import {TransformNode} from '@babylonjs/core/Meshes/transformNode';\nimport {Scene} from '@babylonjs/core/scene';\nimport {Texture} from '@babylonjs/core/Materials/Textures/texture';\nimport {BaseTexture} from '@babylonjs/core/Materials/Textures/baseTexture';\nimport {IParticleSystem} from 'quarks.core';\nimport {VFXBatch, RenderMode, StoredBatchSettings} from './VFXBatch';\nimport {SpriteBatch} from './SpriteBatch';\nimport {TrailBatch} from './TrailBatch';\nimport {ParticleSystem} from './ParticleSystem';\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 layerMask: number;\n}\n\nexport interface AdaptivePerformanceOptions {\n targetFrameMs: number;\n minQuality: number;\n maxQuality: number;\n decreaseStep: number;\n increaseStep: number;\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 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.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 );\n }\n\n addSystem(system: IParticleSystem) {\n const particleSystem = system as ParticleSystem;\n particleSystem._renderer = this;\n if (this.adaptivePerformanceState.enabled) {\n particleSystem.setQualityFactor(this.adaptivePerformanceState.currentQuality);\n }\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.systemToBatchIndex.set(system, this.batches.length - 1);\n }\n\n deleteSystem(system: IParticleSystem) {\n const batchIndex = this.systemToBatchIndex.get(system);\n if (batchIndex !== undefined) {\n this.batches[batchIndex].removeSystem(system);\n this.systemToBatchIndex.delete(system);\n }\n }\n\n updateSystem(system: IParticleSystem) {\n this.deleteSystem(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 (const ps of this.systemToBatchIndex.keys()) {\n (ps as ParticleSystem).setQualityFactor(quality);\n }\n this.lastAppliedQuality = quality;\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 for (const ps of this.systemToBatchIndex.keys()) {\n (ps as ParticleSystem).update(delta);\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 for (let i = 0; i < this.batches.length; i++) {\n this.batches[i].update();\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.systemToBatchIndex.clear();\n super.dispose();\n }\n}\n","import {BatchedRenderer} from './BatchedRenderer';\n\nexport const BatchedParticleRenderer = BatchedRenderer;\n","import {TransformNode} from '@babylonjs/core/Meshes/transformNode';\nimport {Scene} from '@babylonjs/core/scene';\nimport {Matrix4, IParticleSystem, SerializationOptions} from 'quarks.core';\n\nexport class ParticleEmitter extends TransformNode {\n system: IParticleSystem;\n private _matrixWorld: Matrix4 = new Matrix4();\n\n get matrixWorld(): Matrix4 {\n const m = this.getWorldMatrix();\n const e = this._matrixWorld.elements;\n e[0] = m.m[0]; e[1] = m.m[1]; e[2] = m.m[2]; e[3] = m.m[3];\n e[4] = m.m[4]; e[5] = m.m[5]; e[6] = m.m[6]; e[7] = m.m[7];\n e[8] = m.m[8]; e[9] = m.m[9]; e[10] = m.m[10]; e[11] = m.m[11];\n e[12] = m.m[12]; e[13] = m.m[13]; e[14] = m.m[14]; e[15] = m.m[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 {Scene} from '@babylonjs/core/scene';\nimport {Texture} from '@babylonjs/core/Materials/Textures/texture';\nimport {Constants} from '@babylonjs/core/Engines/constants';\nimport {\n AxisAngleGenerator,\n ColorGenerator,\n ColorGeneratorFromJSON,\n ConstantColor,\n ConstantValue,\n FunctionColorGenerator,\n FunctionJSON,\n FunctionValueGenerator,\n GeneratorFromJSON,\n ValueGenerator,\n ValueGeneratorFromJSON,\n Behavior,\n BehaviorFromJSON,\n Particle,\n SpriteParticle,\n TrailParticle,\n EmitterFromJSON,\n EmitterShape,\n SphereEmitter,\n RendererEmitterSettings,\n RotationGenerator,\n IParticleSystem,\n EmissionState,\n GeneratorMemory,\n TrailSettings,\n StretchedBillBoardSettings,\n SerializationOptions,\n Vector3,\n Vector4,\n Matrix3,\n Matrix4,\n Quaternion,\n Vector3Generator,\n ParticleSystemEvent,\n ParticleSystemEventType,\n} from 'quarks.core';\nimport {ParticleEmitter} from './ParticleEmitter';\nimport {RenderMode} from './VFXBatch';\nimport {BatchedRenderer, VFXBatchSettings} from './BatchedRenderer';\nimport {ensureTriangleIndices} from './geometryUtil';\n\nexport interface BurstParameters {\n time: number;\n count: ValueGenerator | FunctionValueGenerator;\n cycle: number;\n interval: number;\n probability: number;\n}\n\nconst UP = new Vector3(0, 0, 1);\nconst tempQ = new Quaternion();\nconst tempV = new Vector3();\nconst tempV2 = new Vector3();\nconst PREWARM_FPS = 60;\n\nconst DEFAULT_POSITIONS = new Float32Array([\n -0.5, -0.5, 0,\n 0.5, -0.5, 0,\n 0.5, 0.5, 0,\n -0.5, 0.5, 0,\n]);\nconst DEFAULT_UVS = new Float32Array([0, 0, 1, 0, 1, 1, 0, 1]);\nconst DEFAULT_INDICES = new Uint32Array([0, 1, 2, 0, 2, 3]);\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 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 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 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}\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 emissionOverTime: ValueGenerator | FunctionValueGenerator;\n emissionOverDistance: ValueGenerator | FunctionValueGenerator;\n emissionBursts: Array<BurstParameters>;\n onlyUsedByOther: boolean;\n worldSpace: boolean;\n particleNum: number;\n paused: boolean;\n particles: Array<Particle>;\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 qualityFactor = 1;\n private useFastTrailHistory = 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 (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 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.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.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: parameters.instancingUVs ?? 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 layerMask: parameters.layerMask ?? 0x0FFFFFFF,\n };\n if (this.rendererSettings.renderMode === RenderMode.Mesh && !this.rendererSettings.instancingNormals) {\n this.rendererSettings.instancingNormals = ParticleSystem.createFallbackNormals(this.rendererSettings.instancingGeometry);\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 this.refreshTrailHistoryMode();\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 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 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 (typeof material?.alphaCutOff === 'number'\n ? material.alphaCutOff\n : typeof material?.alphaCutOffValue === 'number'\n ? material.alphaCutOffValue\n : this.rendererSettings.materialAlphaTest);\n\n this.rendererSettings.texture = resolvedTexture;\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() { this.paused = true; }\n play() { this.paused = false; }\n stop() { this.restart(); this.pause(); }\n\n private refreshTrailHistoryMode() {\n this.useFastTrailHistory = !this.behaviors.some((behavior) => (behavior as any).type === 'WidthOverLength');\n }\n\n private ensureTrailHistoryCapacity(particle: TrailParticle, capacity: number) {\n const trailAny = particle as any;\n if (trailAny._trailHistoryCapacity === capacity && trailAny._trailHistoryPositions) {\n return;\n }\n trailAny._trailHistoryCapacity = capacity;\n trailAny._trailHistoryPositions = new Float32Array(capacity * 3);\n trailAny._trailHistorySizes = new Float32Array(capacity);\n trailAny._trailHistoryColors = new Float32Array(capacity * 4);\n trailAny._trailHistoryHead = 0;\n trailAny._trailHistoryCount = 0;\n }\n\n private resetTrailHistory(particle: TrailParticle) {\n const trailAny = particle as any;\n trailAny._trailHistoryHead = 0;\n trailAny._trailHistoryCount = 0;\n }\n\n private getTrailHistoryCount(particle: TrailParticle): number {\n const trailAny = particle as any;\n const fastHistoryCount = trailAny._trailHistoryCount;\n if (typeof fastHistoryCount === 'number') {\n return fastHistoryCount;\n }\n return particle.previous.length;\n }\n\n private updateFastTrailHistory(particle: TrailParticle) {\n const trailAny = particle as any;\n const capacity = Math.max(1, Math.ceil(particle.length));\n this.ensureTrailHistoryCapacity(particle, capacity);\n let head = trailAny._trailHistoryHead as number;\n let count = trailAny._trailHistoryCount as number;\n const positions = trailAny._trailHistoryPositions as Float32Array;\n const sizes = trailAny._trailHistorySizes as Float32Array;\n const colors = trailAny._trailHistoryColors as Float32Array;\n\n if (particle.age <= particle.life) {\n const posIndex = head * 3;\n positions[posIndex] = particle.position.x;\n positions[posIndex + 1] = particle.position.y;\n positions[posIndex + 2] = particle.position.z;\n sizes[head] = particle.size.x;\n const colorIndex = head * 4;\n colors[colorIndex] = particle.color.x;\n colors[colorIndex + 1] = particle.color.y;\n colors[colorIndex + 2] = particle.color.z;\n colors[colorIndex + 3] = particle.color.w;\n head = (head + 1) % capacity;\n if (count < capacity) {\n count++;\n }\n } else if (count > 0) {\n count--;\n }\n\n trailAny._trailHistoryHead = head;\n trailAny._trailHistoryCount = count;\n }\n\n setQualityFactor(qualityFactor: number) {\n this.qualityFactor = Math.max(0.1, Math.min(1, qualityFactor));\n }\n\n private spawn(count: number, emissionState: EmissionState, matrix: Matrix4) {\n tempQ.setFromRotationMatrix(matrix);\n const translation = tempV;\n const scale = tempV2;\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 timeRatio = emissionState.time / this.duration;\n const trailSettings = isTrailMode ? (this.rendererEmitterSettings as TrailSettings) : undefined;\n const followLocalOrigin = Boolean(trailSettings?.followLocalOrigin);\n\n for (let i = 0; i < count; i++) {\n emissionState.burstParticleIndex = i;\n this.particleNum++;\n if (this.particles.length < this.particleNum) {\n if (isTrailMode) {\n this.particles.push(new TrailParticle());\n } else {\n this.particles.push(new SpriteParticle());\n }\n }\n const particle = this.particles[this.particleNum - 1];\n particle.reset();\n particle.speedModifier = 1;\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 (this.startSize.type === 'vec3function') {\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 (\n this.rendererSettings.renderMode === RenderMode.Mesh ||\n this.rendererSettings.renderMode === RenderMode.BillBoard ||\n this.rendererSettings.renderMode === RenderMode.VerticalBillBoard ||\n this.rendererSettings.renderMode === RenderMode.HorizontalBillBoard ||\n this.rendererSettings.renderMode === RenderMode.StretchedBillBoard\n ) {\n const sprite = particle as SpriteParticle;\n this.startRotation.startGen(particle.memory);\n if (renderMode === RenderMode.Mesh) {\n if (!(sprite.rotation instanceof Quaternion)) {\n sprite.rotation = new Quaternion();\n }\n if (this.startRotation.type === 'rotation') {\n this.startRotation.genValue(particle.memory, sprite.rotation as Quaternion, 1, timeRatio);\n } else {\n (sprite.rotation as Quaternion).setFromAxisAngle(UP, this.startRotation.genValue(sprite.memory, timeRatio));\n }\n } else {\n if (this.startRotation.type === 'rotation') {\n sprite.rotation = 0;\n } else {\n sprite.rotation = this.startRotation.genValue(sprite.memory, timeRatio);\n }\n }\n } else if (isTrailMode && trailSettings) {\n const trail = particle as TrailParticle;\n trailSettings.startLength.startGen(trail.memory);\n trail.length = trailSettings.startLength.genValue(trail.memory, timeRatio);\n if (this.useFastTrailHistory) {\n this.ensureTrailHistoryCapacity(trail, Math.max(1, Math.ceil(trail.length)));\n this.resetTrailHistory(trail);\n }\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._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 }\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 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\n .copy(this.tempEmitterPos)\n .sub(this.previousEmitterPos)\n .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 if (!this.onlyUsedByOther) {\n this.emit(delta, this.emissionState, this.emitter.matrixWorld);\n }\n\n const particles = this.particles;\n const behaviorCount = this.behaviors.length;\n const particleCount = this.particleNum;\n this.emitterShape.update(this, delta);\n for (let j = 0; j < behaviorCount; j++) {\n const behavior = this.behaviors[j];\n behavior.frameUpdate(delta);\n for (let i = 0; i < particleCount; i++) {\n const particle = particles[i];\n if (!particle.died) {\n behavior.update(particle, delta);\n }\n }\n }\n\n const followLocalOrigin =\n this.rendererSettings.renderMode === RenderMode.Trail &&\n (this.rendererEmitterSettings as TrailSettings).followLocalOrigin;\n const emitterMatrix = this.emitter.matrixWorld;\n for (let i = 0; i < particleCount; i++) {\n const particle = particles[i];\n if (followLocalOrigin && (particle as TrailParticle).localPosition) {\n particle.position.copy((particle as TrailParticle).localPosition!);\n if (particle.parentMatrix) {\n particle.position.applyMatrix4(particle.parentMatrix);\n } else {\n particle.position.applyMatrix4(emitterMatrix);\n }\n } else {\n particle.position.addScaledVector(particle.velocity, delta * particle.speedModifier);\n }\n particle.age += delta;\n }\n\n if (this.rendererSettings.renderMode === RenderMode.Trail) {\n for (let i = 0; i < particleCount; i++) {\n const trailParticle = particles[i] as TrailParticle;\n if (this.useFastTrailHistory) {\n this.updateFastTrailHistory(trailParticle);\n } else {\n trailParticle.update();\n }\n }\n }\n\n let liveParticleCount = this.particleNum;\n for (let i = 0; i < liveParticleCount; i++) {\n const particle = particles[i];\n if (\n particle.died &&\n (!(particle instanceof TrailParticle) || this.getTrailHistoryCount(particle as TrailParticle) === 0)\n ) {\n particles[i] = particles[liveParticleCount - 1];\n particles[liveParticleCount - 1] = particle;\n liveParticleCount--;\n i--;\n this.fire({type: 'particleDied', particleSystem: this, particle: particle});\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 this.behaviors.forEach((behavior) => behavior.reset());\n } else {\n if (!this.emitEnded && !this.onlyUsedByOther) {\n this.endEmit();\n }\n }\n }\n\n this.normalMatrix.getNormalMatrix(emitterMatrix);\n const emissionBursts = this.emissionBursts;\n const emissionBurstCount = emissionBursts.length;\n const qualityFactor = this.qualityFactor;\n\n const totalSpawn = Math.floor(emissionState.waitEmiting);\n if (totalSpawn > 0) {\n this.spawn(totalSpawn, emissionState, emitterMatrix);\n emissionState.waitEmiting -= totalSpawn;\n }\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 if (emissionState.previousWorldPos === undefined) emissionState.previousWorldPos = new Vector3();\n emissionState.previousWorldPos.set(emitterMatrix.elements[12], emitterMatrix.elements[13], emitterMatrix.elements[14]);\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 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 };\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 };\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 RotationGenerator | ValueGenerator | 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: typeof burst.count === 'number' ? new ConstantValue(burst.count) : ValueGeneratorFromJSON(burst.count),\n probability: burst.probability ?? 1,\n interval: burst.interval ?? 0.1,\n cycle: burst.cycle ?? burst.cycleCount ?? 1,\n })),\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 });\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 };\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 ? Array.from(this.rendererSettings.instancingNormals) : 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 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 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 this.refreshTrailHistoryMode();\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 private fire(event: ParticleSystemEvent) {\n if (this.listeners[event.type]) {\n this.listeners[event.type].forEach((callback) => callback(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 };\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 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 scene: this.emitter.getScene(),\n });\n }\n}\n","import {Node} from '@babylonjs/core/node';\nimport {TransformNode} from '@babylonjs/core/Meshes/transformNode';\nimport {ParticleEmitter} from './ParticleEmitter';\nimport {ParticleSystem} from './ParticleSystem';\nimport {BatchedRenderer} from './BatchedRenderer';\nimport {IParticleSystem} from 'quarks.core';\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 {IAnimationData, IPrefab} from 'quarks.core';\nimport {TransformNode} from '@babylonjs/core/Meshes/transformNode';\nimport {Scene} from '@babylonjs/core/scene';\nimport {ParticleEmitter} from './ParticleEmitter';\nimport {BatchedRenderer} from './BatchedRenderer';\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(\n emitter: ParticleEmitter,\n startTime = 0,\n duration = 0,\n loop = false\n ): 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((item: any) => item?.type === 'ps' || item?.type === 'three');\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 {Scene} from '@babylonjs/core/scene';\nimport {PBRMaterial} from '@babylonjs/core/Materials/PBR/pbrMaterial';\nimport {StandardMaterial} from '@babylonjs/core/Materials/standardMaterial';\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 {loadPlugin} from 'quarks.core';\nimport {MeshSurfaceEmitterPlugin} from './MeshSurfaceEmitter';\nimport {registerShaderChunks} from './shaders';\n\nexport {BatchedRenderer} from './BatchedRenderer';\nexport type {VFXBatchSettings, AdaptivePerformanceOptions, AdaptivePerformanceState} from './BatchedRenderer';\nexport {BatchedParticleRenderer} from './BatchedParticleRenderer';\nexport {VFXBatch, RenderMode} from './VFXBatch';\nexport type {StoredBatchSettings} from './VFXBatch';\nexport {SpriteBatch} from './SpriteBatch';\nexport {TrailBatch} from './TrailBatch';\nexport {ParticleSystem} from './ParticleSystem';\nexport type {\n ParticleSystemParameters,\n BurstParameters,\n BurstParametersJSON,\n ParticleSystemJSONParameters,\n BabylonMetaData,\n} from './ParticleSystem';\nexport {ParticleEmitter} from './ParticleEmitter';\nexport {QuarksUtil} from './QuarksUtil';\nexport {QuarksLoader} from './QuarksLoader';\nexport type {QuarksLoaderOptions} from './QuarksLoader';\nexport {QuarksPrefab} from './QuarksPrefab';\nexport type {AnimationData, QuarksTimelineClip} from './QuarksPrefab';\nexport {MeshSurfaceEmitter, MeshSurfaceEmitterPlugin} from './MeshSurfaceEmitter';\nexport * from './shaders/';\nexport * from './materials/';\nexport * from 'quarks.core';\n\n\n// Re-export quarks.core types (interfaces - type-only)\nexport type {\n IParticleSystem,\n IParticle,\n Particle,\n EmissionState,\n RendererEmitterSettings,\n TrailSettings,\n StretchedBillBoardSettings,\n BillBoardSettings,\n MeshSettings,\n IEmitter,\n ParticleSystemEvent,\n ParticleSystemEventType,\n SerializationOptions,\n Behavior,\n EmitterShape,\n ValueGenerator,\n FunctionValueGenerator,\n ColorGenerator,\n FunctionColorGenerator,\n RotationGenerator,\n Vector3Generator,\n} from 'quarks.core';\n\nregisterShaderChunks();\nloadPlugin(MeshSurfaceEmitterPlugin);\n\n","import {Scene} from '@babylonjs/core/scene';\nimport {TransformNode} from '@babylonjs/core/Meshes/transformNode';\nimport {Mesh} from '@babylonjs/core/Meshes/mesh';\nimport {VertexData} from '@babylonjs/core/Meshes/mesh.vertexData';\nimport {Texture} from '@babylonjs/core/Materials/Textures/texture';\nimport {StandardMaterial} from '@babylonjs/core/Materials/standardMaterial';\nimport {Constants} from '@babylonjs/core/Engines/constants';\nimport {Matrix, Quaternion, Vector3} from '@babylonjs/core/Maths/math.vector';\nimport {\n Behavior,\n EmitSubParticleSystem,\n} from 'quarks.core';\nimport {ParticleSystem} from './ParticleSystem';\nimport {ParticleEmitter} from './ParticleEmitter';\nimport {QuarksPrefab} from './QuarksPrefab';\nimport {ensureTriangleIndices} from './geometryUtil';\n\nexport interface QuarksLoaderOptions {\n baseUrl?: string;\n}\n\ninterface ParsedGeometry {\n positions: Float32Array;\n indices: Uint32Array | Uint16Array;\n uvs?: Float32Array;\n normals?: Float32Array;\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 return this.parse(json, baseUrl);\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 meta.geometries[geom.uuid] = {\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 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) 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) 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 (this as any)._images[img.uuid] = img.url ? baseUrl + img.url : null;\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 texture = new Texture(imageUrl, this.scene);\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 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 // 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(data.quaternion[0], data.quaternion[1], data.quaternion[2], data.quaternion[3]);\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","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","isQuaternion","_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","Vector3","isVector3","prototype","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","WebGLCoordinateSystem","WebGPUCoordinateSystem","Matrix4","n11","n12","n13","n14","n21","n22","n23","n24","n31","n32","n33","n34","n41","n42","n43","n44","isMatrix4","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","_matrix","_quaternion","Euler","DEFAULT_ORDER","isEuler","asin","setFromQuaternion","setFromVector3","reorder","newOrder","Vector2","width","height","rotateAround","center","isVector2","Vector4","isVector4","setW","setAxisAngleFromQuaternion","setAxisAngleFromRotationMatrix","epsilon","epsilon2","Matrix3","isMatrix3","setFromMatrix4","g","getNormalMatrix","matrix4","transposeIntoArray","setUvTransform","rotation","cx","cy","_m3","rotate","makeRotation","translate","EmitterMode","getValueFromEmitterMode","mode","currentValue","spread","emissionState","Random","Burst","isBursting","burstParticleIndex","burstParticleCount","Loop","PingPong","Bezier","p1","p2","p3","p4","genValue","t2","t3","mt","mt2","mt3","derivativeCoefficients","points","dpoints","list","j","dpt","push","getSlope","controlCurve","hull","pt","_p","idx","split","span","p0","fromJSON","json","ColorToJSON","color","JSONToColor","JSONToValue","type","ValueToJSON","RandomColor","startGen","memory","genColor","rand","ColorRange","indexCount","ContinuousLinearFunction","keys","subType","findKey","mid","getStartX","getEndX","name","map","pos","pair","tempVec3","Gradient","functions","func","function","start","key","gradient","tempColor","RandomColorBetweenGradient","gradient1","gradient2","ConstantColor","memoryGenerator","ColorGeneratorFromJSON","ConstantValue","IntervalValue","PiecewiseFunction","Array","findFunction","setStartX","setEndX","insertFunction","splice","removeFunction","getFunction","setFunction","numOfFunctions","PiecewiseBezier","curves","super","toSVG","segments","result","join","bezier","piecewiseFunction","ValueGeneratorFromJSON","RandomQuatGenerator","quat","delta","AxisAngleGenerator","EulerGenerator","angleX","angleY","angleZ","eulerOrder","eular","RotationGeneratorFromJSON","Vector3Function","vec","Vector3GeneratorFromJSON","GeneratorFromJSON","ConeEmitter","parameters","arc","thickness","speed","system","time","duration","initialize","sinTheta","cosTheta","velocity","startSpeed","CircleEmitter","randomInt","UP_VEC3","ZERO_VEC3","ONE_VEC3","Z_VEC3","DonutEmitter","donutRadius","PointEmitter","cbrt","sinPhi","cosPhi","SphereEmitter","HemisphereEmitter","GridEmitter","column","row","RectangleEmitter","point","thicknessScale","EmitterShapes","circle","params","loadJSON","cone","donut","sphere","hemisphere","grid","rectangle","EmitterFromJSON","meta","ColorOverLife","particle","age","life","startColor","frameUpdate","reset","RotationOverLife","angularVelocity","Rotation3DOverLife","tempQuat","tempQuat2","ForceOverLife","particleSystem","ps","_temp","_tempScale","_tempQ","worldSpace","translation","emitter","matrixWorld","UNIT_X","UNIT_Y","UNIT_Z","VelocityOverLife","linearX","linearY","linearZ","orbitalX","orbitalY","orbitalZ","space","_tempEmitterPos","_tempQInv","_tempScaleInv","_tempRot","_tempAxis","worldPivot","orbit","worldAxes","readValue","field","InheritVelocity","multiplier","_tempPos","emitterVelocity","decomposeInverse","SizeOverLife","size","startSize","SpeedOverLife","speedModifier","FrameOverLife","frame","uvTile","OrbitOverLife","orbitSpeed","temp","LinkedListNode","data","next","prev","hasPrev","hasNext","LinkedList","head","tail","isEmpty","clear","front","back","dequeue","pop","queue","node","insertBefore","newNode","remove","tempNode","values","current","SpriteParticle","died","RecordState","TrailParticle","previous","WidthOverLength","iter","ApplyForce","direction","magnitude","dataCount","magnitudeValue","force","GravityForce","ChangeEmitDirection","_q","SubParticleEmitMode","EmitSubParticleSystem","useVelocityAsBasis","subParticleSystem","Frame","emitProbability","q_","v_","v2_","subEmissions","onlyUsedByOther","Birth","Death","emit","setMatrixFromParticle","burstIndex","burstWaveIndex","waitEmiting","travelDistance","subEmissionState","uuid","len2","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","gi3","noise4D","n4","rankx","ranky","rankz","rankw","l1","l2","i3","j3","k3","l3","w2","w3","x4","y4","z4","w4","ll","t4","gi4","TurbulenceField","octaves","velocityMultiplier","timeScale","generator","timeOffset","temp2","lvl","generators","tempV","tempQ","Noise","frequency","power","positionAmount","rotationAmount","lastPosNoise","lastRotNoise","generatorIndex","_","TextureSequencer","locations","transform","textureSequencer","loc","fromImage","img","threshold","canvas","document","createElement","ctx","getContext","drawImage","getImageData","colorSpace","SequencerFromJSON","ApplySequences","delayBetweenParticles","sequencers","pCount","delay","id","begin","inMotion","sequencer","BEZIER","appendSequencer","seq","forEach","sequencerJson","applySequences","physicsResolver","getPhysicsResolver","ApplyCollision","resolver","bounce","resolve","ColorBySpeed","speedRange","SizeBySpeed","RotationBySpeed","LimitSpeedOverLife","dampen","limit","percent","BehaviorTypes","BehaviorFromJSON","Plugins","loadPlugin","plugin","find","item","emitterShape","emitterShapes","behavior","behaviors","MeshSurfaceEmitter","mesh","_mesh","positions","getVerticesData","VertexBuffer","PositionKind","indices","getIndices","_positions","_indices","_triangleIndexToArea","area","triCount","i0","meshReferenceId","_meshReferenceId","u1","u2","idx0","idx1","idx2","cz","nx","ny","nz","uniqueId","_system","_delta","MeshSurfaceEmitterPlugin","shaderChunks","registered","registerShaderChunks","tile_pars_vertex","tile_vertex","tile_pars_fragment","tile_fragment","soft_pars_vertex","soft_vertex","soft_pars_fragment","soft_fragment","RenderMode","particle_vert","particle_frag","local_particle_physics_vert","particle_physics_frag","stretched_bb_particle_vert","trail_vert","trail_frag","VFXBatch","settings","scene","maxParticles","systems","Set","instancingGeometry","instancingIndices","instancingUVs","instancingNormals","renderMode","renderOrder","uTileCount","vTileCount","blendTiles","softParticles","softNearFade","softFarFade","materialBlendMode","materialTransparent","materialDepthTest","materialDepthWrite","materialAlphaTest","texture","layerMask","Mesh","alwaysSelectAsActiveMesh","addSystem","removeSystem","delete","getVisibleSystems","visibleSystems","visible","applyDepthTexture","depthTexture","material","ShaderMaterial","setTexture","dispose","SpriteBatch","vector_","vector2_","vector3_","quaternion_","quaternion2_","quaternion3_","rotationMat_","rotationMat2_","lastStretchedSpeedFactor","NaN","setupBuffers","rebuildMaterial","vertexData","VertexData","uvs","normals","applyToMesh","buildExpandableBuffers","engine","getEngine","offsetBuffer","offsetVB","setVerticesBuffer","colorBuffer","colorVB","sizeBuffer","sizeVB","uvTileBuffer","uvTileVB","rotationBuffer","rotationVB","StretchedBillBoard","velocityBuffer","velocityVB","forcedInstanceCount","doNotSyncBoundingInfo","expandBuffers","shaderName","Date","now","vertexShader","fragmentShader","defines","VerticalBillBoard","HorizontalBillBoard","Effect","ShadersStore","attributes","uniforms","samplers","mat","vertex","fragment","needAlphaBlending","setFloat","setVector2","BVector2","onBindObservable","camera","activeCamera","setVector4","BVector4","minZ","maxZ","setVector3","BVector3","backFaceCulling","alphaMode","Constants","ALPHA_DISABLE","needDepthPrePass","forceDepthWrite","disableDepthWrite","particleCount","isMeshRender","isStretchedRender","particleNum","particles","systemWorldSpace","absScaleX","absScaleY","absScaleZ","parentQ","parentMatrix","ri","oi","ci","si","speedFactor","rendererEmitterSettings","lengthFactor","vel","vi","clampedSpeedFactor","uploadClearedInstance","subarray","TrailBatch","getTrailHistoryCount","fastHistoryCount","_trailHistoryCount","buildGeometryBuffers","positionBuffer","previousBuffer","nextBuffer","uvBuffer","sideBuffer","widthBuffer","indexBuffer","setVerticesData","UVKind","ColorKind","setIndices","previousVB","nextVB","sideVB","widthVB","setBoundingInfo","BoundingInfo","subMeshes","_boundingInfo","getBoundingInfo","getRenderWidth","getRenderHeight","renderEngine","triangles","computeWorldMatrix","tileWidth","tileHeight","objectScale","particleAny","fastHistoryCapacity","_trailHistoryCapacity","fastHistoryHead","_trailHistoryHead","fastHistoryPositions","_trailHistoryPositions","fastHistorySizes","_trailHistorySizes","fastHistoryColors","_trailHistoryColors","hasFastHistory","historyCapacity","historyHead","historyPositions","historySizes","historyColors","particleHistory","particleHistoryLength","col","matrixToUse","previousNode","currentNode","nextNode","oldestFastHistoryIndex","currentX","currentY","currentZ","currentSize","currentColorX","currentColorY","currentColorZ","currentColorW","previousX","previousY","previousZ","nextX","nextY","nextZ","currentHistoryIndex","currentPosIndex","previousPosIndex","nextPosIndex","currentColorIndex","pi","ui","cci","updateVerticesData","updateIndices","getVertexBuffer","meshBoundingInfo","subMesh","verticesCount","BatchedRenderer","TransformNode","batches","systemToBatchIndex","Map","adaptivePerformanceState","enabled","targetFrameMs","minQuality","maxQuality","decreaseStep","increaseStep","currentQuality","lastFrameCpuMs","lastAppliedQuality","_renderer","setQualityFactor","getRendererSettings","batch","getScene","Trail","BillBoard","parent","deleteSystem","batchIndex","get","updateSystem","setDepthTexture","configureAdaptivePerformance","options","state","disableAdaptivePerformance","resetQuality","applyAdaptiveQuality","getAdaptivePerformanceState","quality","adaptiveState","frameStart","performance","refreshBatches","getBatchRenderStats","systemNames","instanceCount","BatchedParticleRenderer","ParticleEmitter","getWorldMatrix","_matrixWorld","isEnabled","setEnabled","extractFromCache","cache","metadata","clonedEmitter","copyFrom","scaling","rotationQuaternion","_quarksUUID","ensureTriangleIndices","vertexCount","out","UP","tempV2","DEFAULT_POSITIONS","DEFAULT_UVS","DEFAULT_INDICES","ParticleSystem","isEmitEnded","emitEnded","hasPendingEmission","looping","emissionBursts","timeRatio","emissionOverTime","emissionOverDistance","isFinished","layers","layerMaskProxy","rendererSettings","neededToUpdateRender","materialRef","applyMaterialSettings","geometry","restart","blending","needRestart","startRotation","startLength","followLocalOrigin","finishedEventFired","startDelayTimeLeft","tempEmitterPos","normalMatrix","listeners","qualityFactor","useFastTrailHistory","firstTimeUpdate","mask","Object","defineProperty","enumerable","autoDestroy","startDelay","prewarm","startLife","shape","blendMode","ALPHA_ADD","transparent","depthTest","depthWrite","alphaTest","createFallbackNormals","startTileIndex","paused","burst","count","refreshTrailHistoryMode","markForDestroy","prewarmed","overrides","resolvedTexture","albedoTexture","diffuseTexture","emissiveTexture","opacityTexture","baseTexture","resolvedBlendMode","resolvedTransparent","resolvedDepthTest","disableDepthTest","resolvedDepthWrite","resolvedAlphaTest","alphaCutOff","alphaCutOffValue","pause","play","stop","some","ensureTrailHistoryCapacity","capacity","trailAny","resetTrailHistory","updateFastTrailHistory","sizes","colors","posIndex","colorIndex","spawn","behaviorCount","isTrailMode","trailSettings","Boolean","sprite","trail","localPosition","endEmit","fire","previousEmitterPos","emitterElements","emitterMatrix","trailParticle","liveParticleCount","notifyFinished","emissionBurstCount","totalSpawn","probability","rawCount","previousWorldPos","emitPerMeter","metaData","_options","geometries","materials","textures","images","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","from","textureUUID","entry","uv","addBehavior","addEventListener","event","removeAllEventListeners","removeEventListener","indexOf","newBehaviors","QuarksUtil","runOnAllParticleEmitters","root","traverseNode","addToBatchRenderer","batchRenderer","setAutoDestroy","isEffectFinished","found","finished","children","getChildren","child","QuarksPrefab","animationData","isPlaying","currentTime","_lastUpdateTimeMs","_tempAnimationJSON","registerBatchedRenderer","renderer","_batchedRenderer","addParticleSystemAnimation","startTime","loop","updateDuration","addThreeAnimation","clip","clipUUID","removeAnimation","animation","forceDelta","previousTime","endTime","isActive","wasActive","setTime","getDuration","resolveReferences","nodesMap","traverse","animationJSON","targetUUID","resolveTimelineClip","prefab","isArray","animationSources","animationGroups","source","maxDuration","ParticleMeshStandardMaterial","StandardMaterial","isParticleMeshStandardMaterial","assign","ParticleMeshPhysicsMaterial","PBRMaterial","isParticleMeshPhysicsMaterial","load","url","baseUrl","substring","lastIndexOf","response","fetch","parse","parseGeometries","parseImages","parseTextures","parseMaterials","parseObject","object","linkReferences","geom","hw","hh","parseSphereGeometry","parsed","parseBufferGeometry","widthSegments","heightSegments","phiStart","phiLength","thetaStart","thetaLength","iy","verticesRow","ix","hypot","isTopFull","isBottomFull","typedIndices","interleavedBuffers","arrayBuffers","buffers","ibDef","entries","arrayBuffer","buffer","floatArray","int32ArrayToFloat32","stride","isInterleavedBufferAttribute","attr","buf","extractInterleavedAttribute","itemSize","intArray","ArrayBuffer","int32View","_meta","_images","texDef","imageUrl","image","Texture","wrap","wrapU","mapWrapMode","wrapV","repeat","uScale","vScale","uOffset","vOffset","wAng","wrapMode","CLAMP_ADDRESSMODE","MIRROR_ADDRESSMODE","WRAP_ADDRESSMODE","matDef","matInfo","side","textureRef","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","chunkName","pluginId"],"mappings":"o5CAKA,MAAMA,EAAO,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,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.19.0 build Mon Jul 27 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 /** Control points the table was built from, used to detect edits. */\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 Float32Array(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. */\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 Float32Array(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 // Cached so the per-particle update does not repeat the instanceof test.\n this._frameIsBezier = false;\n this.frame = frame;\n }\n get frame() {\n return this._frame;\n }\n set frame(frame) {\n this._frame = frame;\n this._frameIsBezier = frame instanceof PiecewiseBezier;\n }\n initialize(particle) {\n this._frame.startGen(particle.memory);\n }\n update(particle, delta) {\n if (this._frameIsBezier) {\n particle.uvTile = this._frame.genValue(particle.memory, particle.age / particle.life);\n }\n }\n updateAll(particles, count, delta) {\n if (!this._frameIsBezier) {\n return;\n }\n const generator = this._frame;\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 = generator.genValue(particle.memory, particle.age / particle.life);\n }\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 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 const bezier_${k} = g${k} instanceof deps.PiecewiseBezier;`,\n body: `if (bezier_${k}) { p.uvTile = g${k}.genValue(p.memory, t); }`,\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 * 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 * 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 }\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 }\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 };\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 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 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 }\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 }\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 };\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 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 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._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 }\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 };\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 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 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 }\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 }\n toJSON() {\n return {\n type: 'grid',\n width: this.width,\n height: this.height,\n column: this.column,\n row: this.row,\n };\n }\n static fromJSON(json) {\n return new GridEmitter(json);\n }\n clone() {\n return new GridEmitter({\n width: this.width,\n height: this.height,\n column: this.column,\n row: this.row,\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._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 }\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 };\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 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 spread: this.spread,\n });\n }\n}\n\n/**\n * A point emitter emits particles from a single point.\n */\nclass PointEmitter {\n constructor() {\n this.type = 'point';\n this._m1 = new Matrix4();\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 }\n toJSON() {\n return {\n type: 'point',\n };\n }\n static fromJSON(json) {\n return new PointEmitter();\n }\n clone() {\n return new PointEmitter();\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._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 }\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 };\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 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 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._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 }\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 };\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 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 spread: this.spread,\n });\n }\n}\n\nconst EmitterShapes = {\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 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, ChangeEmitDirection, CircleEmitter, ColorBySpeed, ColorGeneratorFromJSON, ColorOverLife, ColorRange, ConeEmitter, ConstantColor, ConstantValue, DEG2RAD, DonutEmitter, 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, 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, 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\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) {\n this._meshReferenceId = meshReferenceId;\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 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 }\n\n toJSON(): ShapeJSON {\n return {\n type: 'mesh_surface',\n mesh: this._mesh ? (this._mesh as any).uniqueId?.toString() : (this._meshReferenceId ?? ''),\n };\n }\n\n static fromJSON(json: any): MeshSurfaceEmitter {\n return new MeshSurfaceEmitter(undefined, json?.mesh);\n }\n\n clone(): EmitterShape {\n return new MeshSurfaceEmitter(this._mesh, this._meshReferenceId);\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// 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 vec2 alignedPosition = position.xy * size.xy;\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 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\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// 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 float avgSize = (size.x + 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 mvPosition.xyz += position.y * normalize(cross(mvPosition.xyz, vdir)) * 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 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 */ `\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// 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 let avgSize = (vertexInputs.size.x + 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 widthOffset = vertexInputs.position.y * normalize(cross(mvPosition.xyz, vdir)) * 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 let stretched = mvPosition.xyz + widthOffset - lengthOffset;\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#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 {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} 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}\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 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 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\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 (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 (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\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\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 particles = system.particles;\n const particleNum = system.particleNum;\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 emitterMatrix.decompose(translation, rotation, scale);\n this.rotationMat_.setFromMatrix4(emitterMatrix);\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 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 (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 this.uploadClearedInstance(isMeshRender, isStretchedRender);\n return;\n }\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 /**\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// 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 let alignedPosition = vertexInputs.position.xy * vertexInputs.size.xy;\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 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\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 residual = (system.rendererEmitterSettings as TrailSettings).followLocalOrigin\n ? 0\n : (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 const historyColors = particle.historyColors;\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 const invHistoryLength = 1 / particleHistoryLength;\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 = currentSlot * 4;\n const currentColorX = historyColors[currentColorIndex];\n const currentColorY = historyColors[currentColorIndex + 1];\n const currentColorZ = historyColors[currentColorIndex + 2];\n const currentColorW = historyColors[currentColorIndex + 3];\n\n previousSlot = currentSlot;\n currentSlot = nextSlot;\n\n if (!systemWorldSpace) {\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 u = (i * invHistoryLength + 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 = (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} 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\nexport interface AdaptivePerformanceOptions {\n targetFrameMs: number;\n minQuality: number;\n maxQuality: number;\n decreaseStep: number;\n increaseStep: number;\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 );\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 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\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 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 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 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}\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 emissionOverTime: ValueGenerator | FunctionValueGenerator;\n emissionOverDistance: ValueGenerator | FunctionValueGenerator;\n emissionBursts: Array<BurstParameters>;\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 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.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 };\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\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 }\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 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 for (let i = 0; i < particleCount; i++) {\n (particles[i] as TrailParticle).update();\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 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 };\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 };\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 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 });\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 };\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 };\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 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 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\ninterface ParsedGeometry {\n positions: Float32Array;\n indices: Uint32Array | Uint16Array;\n uvs?: Float32Array;\n normals?: Float32Array;\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 return this.parse(json, baseUrl);\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 meta.geometries[geom.uuid] = {\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 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 ? this.resolveImageUrl(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 resolveImageUrl(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 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 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","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","_frameIsBezier","_frame","uvTile","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","Float64Array","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","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","EmitterMode","getValueFromEmitterMode","currentValue","spread","emissionState","Random","Burst","Loop","PingPong","CircleEmitter","parameters","arc","thickness","ConeEmitter","sinTheta","cosTheta","DonutEmitter","donutRadius","GridEmitter","column","row","HemisphereEmitter","sinPhi","cosPhi","PointEmitter","cbrt","SphereEmitter","RectangleEmitter","point","thicknessScale","EmitterShapes","circle","cone","donut","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","_system","_delta","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","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","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","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","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","own","partialTurn","parentQ","parentMatrix","ri","spin","oi","si","ci","vel","vi","syncStretchedSpeedFactor","uploadClearedInstance","clampedSpeedFactor","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","followLocalOrigin","particleHistoryLength","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","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","_renderer","has","indexOf","setQualityFactor","assignToBatch","getRendererSettings","batch","getScene","Trail","BillBoard","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","ParticleSystem","isEmitEnded","emitEnded","hasPendingEmission","looping","emissionBursts","timeRatio","emissionOverTime","emissionOverDistance","isFinished","layers","layerMaskProxy","rendererSettings","neededToUpdateRender","materialRef","applyMaterialSettings","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","trailSettings","Boolean","sprite","trail","localPosition","endEmit","fire","previousEmitterPos","stepsToRun","emitterElements","simulateStep","behaviorSteps","fusionPlan","same","stretched","columns","vector3Rows","stepBehaviors","velocities","stride","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","isArray","animationSources","animationGroups","found","maxDuration","QuarksLoader","load","baseUrl","substring","lastIndexOf","response","fetch","parse","parseGeometries","parseImages","parseTextures","parseMaterials","parseObject","object","linkReferences","geom","hw","hh","parseSphereGeometry","parsed","parseBufferGeometry","widthSegments","heightSegments","phiStart","phiLength","thetaStart","thetaLength","iy","verticesRow","ix","hypot","isTopFull","isBottomFull","typedIndices","interleavedBuffers","arrayBuffers","buffers","ibDef","entries","arrayBuffer","buffer","floatArray","int32ArrayToFloat32","isInterleavedBufferAttribute","attr","buf","extractInterleavedAttribute","itemSize","intArray","ArrayBuffer","int32View","_meta","_images","warnIfNotAnImageUrl","resolveImageUrl","test","startsWith","texDef","imageUrl","wrap","wrapU","mapWrapMode","wrapV","repeat","uScale","vScale","uOffset","vOffset","wAng","wrapMode","CLAMP_ADDRESSMODE","MIRROR_ADDRESSMODE","WRAP_ADDRESSMODE","matDef","matInfo","side","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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"}