@adatechnology/game-shapes 0.2.0 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-IFXQIDSA.js → chunk-M5N2SHNL.js} +6 -6
- package/dist/chunk-M5N2SHNL.js.map +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.global.js +6 -5
- package/dist/index.global.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/{worker-BZ7plgyI.d.ts → worker-DUZKXhCw.d.ts} +7 -1
- package/dist/worker.d.ts +1 -1
- package/dist/worker.js +1 -1
- package/package.json +2 -2
- package/dist/chunk-IFXQIDSA.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/color.ts","../src/hash.ts","../src/math.ts","../src/primitives/three-generators.ts","../src/primitives/difference.ts","../src/primitives/earcut.ts","../src/primitives/extrude.ts","../src/primitives/index.ts","../src/random.ts","../src/registry.ts","../schema/shape.schema.json","../src/schema.ts","../src/generate.ts","../src/merge.ts","../src/worker.ts"],"sourcesContent":["import type { Color } from './types'\n\n/** A colour as `0xRRGGBB`: numbers as given (floored, as three's `setHex`), `'#rrggbb'` strings parsed. */\nexport function colorHex(color: Color | undefined, fallback = 0xffffff): number {\n if (color === undefined) return fallback\n if (typeof color === 'number') return Math.floor(color)\n const match = /^#([0-9a-fA-F]{6})$/.exec(color)\n if (!match) throw new Error(`game-shapes: colour \"${color}\" is not 0xRRGGBB or #rrggbb`)\n return parseInt(match[1] as string, 16)\n}\n\n/** three's `SRGBToLinear` (r160 `ColorManagement`), the same constants. */\nexport const srgbToLinear = (c: number): number => (c < 0.04045 ? c * 0.0773993808 : Math.pow(c * 0.9478672986 + 0.0521327014, 2.4))\n\n/**\n * The rgb floats of a hex colour as three's `Color.setHex` stores them: the channels over 255 (`'srgb'`), converted to the linear working space\n * when colour management is on (`'linear'`).\n */\nexport function colorChannels(hex: number, space: 'linear' | 'srgb'): [number, number, number] {\n const r = ((hex >> 16) & 255) / 255\n const g = ((hex >> 8) & 255) / 255\n const b = (hex & 255) / 255\n return space === 'linear' ? [srgbToLinear(r), srgbToLinear(g), srgbToLinear(b)] : [r, g, b]\n}\n","/**\n * Canonical JSON (keys sorted, `undefined` left out, `-0` kept as `-0`, typed arrays as plain lists) and a 64-bit FNV-1a of it in two 32-bit\n * lanes: the key a shape is cached and shared by.\n */\nexport function canonicalJson(value: unknown): string {\n if (value === null) return 'null'\n if (typeof value === 'number') return Object.is(value, -0) ? '-0' : Number.isFinite(value) ? String(value) : JSON.stringify(String(value))\n if (typeof value === 'string') return JSON.stringify(value)\n if (typeof value === 'boolean') return value ? 'true' : 'false'\n if (typeof value === 'function') throw new Error('game-shapes: a function cannot be part of a shape (register it as a generator)')\n if (ArrayBuffer.isView(value)) return canonicalJson(Array.from(value as unknown as ArrayLike<number>))\n if (Array.isArray(value)) return `[${value.map((item) => (item === undefined ? 'null' : canonicalJson(item))).join(',')}]`\n if (typeof value === 'object') {\n const record = value as Record<string, unknown>\n const keys = Object.keys(record).filter((key) => record[key] !== undefined).sort()\n return `{${keys.map((key) => `${JSON.stringify(key)}:${canonicalJson(record[key])}`).join(',')}}`\n }\n return 'null'\n}\n\nconst lane = (text: string, offset: number, prime: number): string => {\n let hash = offset\n for (let index = 0; index < text.length; index++) {\n hash ^= text.charCodeAt(index)\n hash = Math.imul(hash, prime)\n }\n return (hash >>> 0).toString(16).padStart(8, '0')\n}\n\n/** 64-bit FNV-1a of a text as 16 hex digits (two independent 32-bit lanes). */\nexport const hash64 = (text: string): string => lane(text, 0x811c9dc5, 0x01000193) + lane(text, 0x050c5d1f, 0x5bd1e995)\n\n/** `hash64(canonicalJson(value))`. */\nexport const hashValue = (value: unknown): string => hash64(canonicalJson(value))\n","/*\n * Matrix and quaternion arithmetic as three.js r160 does it (MIT, https://github.com/mrdoob/three.js): the same expressions in the same order, so a\n * vertex baked here has the same bits as one baked by `Matrix4.compose` / `multiplyMatrices` / `Matrix3.getNormalMatrix` / `Vector3.normalize`.\n * Matrices are column-major arrays of 16 (4 x 4) or 9 (3 x 3) numbers, the layout of three's `elements`.\n */\nimport type { Mat4, RotationOrder, Transform, Vec3 } from './types'\n\nexport type Matrix4 = number[]\nexport type Matrix3 = number[]\n\nexport const identity4 = (): Matrix4 => [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]\n\n/** `Quaternion.setFromEuler` (x, y, z, w). */\nexport function quaternionFromEuler(x: number, y: number, z: number, order: RotationOrder = 'XYZ'): [number, number, number, number] {\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 return [s1 * c2 * c3 + c1 * s2 * s3, c1 * s2 * c3 - s1 * c2 * s3, c1 * c2 * s3 + s1 * s2 * c3, c1 * c2 * c3 - s1 * s2 * s3]\n case 'YXZ':\n return [s1 * c2 * c3 + c1 * s2 * s3, c1 * s2 * c3 - s1 * c2 * s3, c1 * c2 * s3 - s1 * s2 * c3, c1 * c2 * c3 + s1 * s2 * s3]\n case 'ZXY':\n return [s1 * c2 * c3 - c1 * s2 * s3, c1 * s2 * c3 + s1 * c2 * s3, c1 * c2 * s3 + s1 * s2 * c3, c1 * c2 * c3 - s1 * s2 * s3]\n case 'ZYX':\n return [s1 * c2 * c3 - c1 * s2 * s3, c1 * s2 * c3 + s1 * c2 * s3, c1 * c2 * s3 - s1 * s2 * c3, c1 * c2 * c3 + s1 * s2 * s3]\n case 'YZX':\n return [s1 * c2 * c3 + c1 * s2 * s3, c1 * s2 * c3 + s1 * c2 * s3, c1 * c2 * s3 - s1 * s2 * c3, c1 * c2 * c3 - s1 * s2 * s3]\n case 'XZY':\n return [s1 * c2 * c3 - c1 * s2 * s3, c1 * s2 * c3 - s1 * c2 * s3, c1 * c2 * s3 + s1 * s2 * c3, c1 * c2 * c3 + s1 * s2 * s3]\n default:\n throw new Error(`game-shapes: unknown rotation order \"${String(order)}\"`)\n }\n}\n\n/** `Matrix4.compose(position, quaternion, scale)`. */\nexport function compose(px: number, py: number, pz: number, q: readonly [number, number, number, number], sx: number, sy: number, sz: number): Matrix4 {\n const [x, y, z, w] = q\n const x2 = x + x\n const y2 = y + y\n const z2 = z + z\n const xx = x * x2\n const xy = x * y2\n const xz = x * z2\n const yy = y * y2\n const yz = y * z2\n const zz = z * z2\n const wx = w * x2\n const wy = w * y2\n const wz = w * z2\n return [\n (1 - (yy + zz)) * sx, (xy + wz) * sx, (xz - wy) * sx, 0,\n (xy - wz) * sy, (1 - (xx + zz)) * sy, (yz + wx) * sy, 0,\n (xz + wy) * sz, (yz - wx) * sz, (1 - (xx + yy)) * sz, 0,\n px, py, pz, 1,\n ]\n}\n\n/** `Matrix4.makeRotationY(theta)` followed by `setPosition(x, y, z)`. */\nexport function headingMatrix(theta: number, x = 0, y = 0, z = 0): Matrix4 {\n const c = Math.cos(theta)\n const s = Math.sin(theta)\n return [c, 0, -s, 0, 0, 1, 0, 0, s, 0, c, 0, x, y, z, 1]\n}\n\n/** `Matrix4.multiplyMatrices(a, b)`: a x b. */\nexport function multiply(ae: readonly number[], be: readonly number[]): Matrix4 {\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 return [\n a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41,\n a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41,\n a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41,\n a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41,\n a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42,\n a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42,\n a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42,\n a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42,\n a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43,\n a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43,\n a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43,\n a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43,\n a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44,\n a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44,\n a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44,\n a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44,\n ]\n}\n\n/** `Matrix3.getNormalMatrix(m)`: the inverse transpose of the upper 3 x 3 (all zeros when singular, as three). */\nexport function normalMatrix(me: readonly number[]): Matrix3 {\n // setFromMatrix4\n const n11 = me[0]!, n21 = me[1]!, n31 = me[2]!\n const n12 = me[4]!, n22 = me[5]!, n32 = me[6]!\n const n13 = me[8]!, n23 = me[9]!, n33 = me[10]!\n // invert\n const t11 = n33 * n22 - n32 * n23\n const t12 = n32 * n13 - n33 * n12\n const t13 = n23 * n12 - n22 * n13\n const det = n11 * t11 + n21 * t12 + n31 * t13\n if (det === 0) return [0, 0, 0, 0, 0, 0, 0, 0, 0]\n const detInv = 1 / det\n const te = [\n t11 * detInv,\n (n31 * n23 - n33 * n21) * detInv,\n (n32 * n21 - n31 * n22) * detInv,\n t12 * detInv,\n (n33 * n11 - n31 * n13) * detInv,\n (n31 * n12 - n32 * n11) * detInv,\n t13 * detInv,\n (n21 * n13 - n23 * n11) * detInv,\n (n22 * n11 - n21 * n12) * detInv,\n ]\n // transpose\n let tmp = te[1]!\n te[1] = te[3]!\n te[3] = tmp\n tmp = te[2]!\n te[2] = te[6]!\n te[6] = tmp\n tmp = te[5]!\n te[5] = te[7]!\n te[7] = tmp\n return te\n}\n\n/** True when the last row is (0, 0, 0, 1): `applyMatrix4`'s divide by w is then a multiply by exactly 1. */\nexport const isAffine = (e: readonly number[]): boolean => e[3] === 0 && e[7] === 0 && e[11] === 0 && e[15] === 1\n\n/** `Vector3.applyMatrix4`. */\nexport function transformPoint(e: readonly number[], x: number, y: number, z: number): [number, number, number] {\n const w = 1 / (e[3]! * x + e[7]! * y + e[11]! * z + e[15]!)\n return [(e[0]! * x + e[4]! * y + e[8]! * z + e[12]!) * w, (e[1]! * x + e[5]! * y + e[9]! * z + e[13]!) * w, (e[2]! * x + e[6]! * y + e[10]! * z + e[14]!) * w]\n}\n\nconst toVec3 = (scale: number | Vec3 | undefined): Vec3 => (scale === undefined ? [1, 1, 1] : typeof scale === 'number' ? [scale, scale, scale] : scale)\n\n/** True when the transform has no field set. */\nexport const isIdentityTransform = (t: Transform): boolean =>\n t.matrix === undefined && t.heading === undefined && t.position === undefined && t.rotation === undefined && t.scale === undefined\n\n/** The local matrix of a transform, or `null` when it has none. */\nexport function matrixOf(t: Transform): Matrix4 | null {\n if (t.matrix !== undefined) return [...t.matrix]\n if (t.heading !== undefined) {\n const p = t.position ?? [0, 0, 0]\n return headingMatrix(t.heading, p[0], p[1], p[2])\n }\n if (t.position === undefined && t.rotation === undefined && t.scale === undefined) return null\n const p = t.position ?? [0, 0, 0]\n const r = t.rotation ?? [0, 0, 0]\n const s = toVec3(t.scale)\n return compose(p[0], p[1], p[2], quaternionFromEuler(r[0], r[1], r[2], t.rotationOrder ?? 'XYZ'), s[0], s[1], s[2])\n}\n\n/** The matrix as given, as a plain array (for `ShapePart.matrix`). */\nexport const asMat4 = (m: Matrix4 | null): Mat4 => (m ? [...m] : identity4())\n","/*\n * The geometry generators of three.js r160 (MIT, https://github.com/mrdoob/three.js, src/geometries/*.js), ported line by line: the same loops,\n * the same expressions in the same order, numbers pushed into plain arrays and stored as Float32 at the end, exactly as `Float32BufferAttribute`\n * does. A test compares every array of every generator with three's, bit for bit, over a grid of parameters.\n */\nimport type { GeometryGroup, PrimitiveBuffers } from '../types'\n\nexport interface Arrays {\n vertices: number[]\n normals: number[]\n uvs: number[]\n indices: number[] | null\n groups: GeometryGroup[]\n}\n\n/** three's `arrayNeedsUint32`: 32-bit indices once any index reaches 65535. */\nexport function needsUint32(array: ArrayLike<number>): boolean {\n for (let i = array.length - 1; i >= 0; --i) if ((array[i] as number) >= 65535) return true\n return false\n}\n\nexport const indexArray = (indices: ArrayLike<number>): Uint16Array | Uint32Array => (needsUint32(indices) ? new Uint32Array(indices) : new Uint16Array(indices))\n\nexport function pack(type: string, parameters: Record<string, unknown>, a: Arrays): PrimitiveBuffers {\n return {\n type,\n parameters,\n positions: new Float32Array(a.vertices),\n normals: new Float32Array(a.normals),\n uvs: new Float32Array(a.uvs),\n ...(a.indices ? { indices: indexArray(a.indices) } : {}),\n groups: a.groups,\n }\n}\n\nconst normalize3 = (x: number, y: number, z: number): [number, number, number] => {\n const length = Math.sqrt(x * x + y * y + z * z)\n const s = 1 / (length || 1)\n return [x * s, y * s, z * s]\n}\n\nexport function box(width = 1, height = 1, depth = 1, widthSegments = 1, heightSegments = 1, depthSegments = 1): PrimitiveBuffers {\n const parameters = { width, height, depth, widthSegments, heightSegments, depthSegments }\n widthSegments = Math.floor(widthSegments)\n heightSegments = Math.floor(heightSegments)\n depthSegments = Math.floor(depthSegments)\n const indices: number[] = []\n const vertices: number[] = []\n const normals: number[] = []\n const uvs: number[] = []\n const groups: GeometryGroup[] = []\n let numberOfVertices = 0\n let groupStart = 0\n type Axis = 'x' | 'y' | 'z'\n const buildPlane = (u: Axis, v: Axis, w: Axis, udir: number, vdir: number, width: number, height: number, depth: number, gridX: number, gridY: number, materialIndex: number): void => {\n const segmentWidth = width / gridX\n const segmentHeight = height / gridY\n const widthHalf = width / 2\n const heightHalf = height / 2\n const depthHalf = depth / 2\n const gridX1 = gridX + 1\n const gridY1 = gridY + 1\n let vertexCounter = 0\n let groupCount = 0\n const vector = { x: 0, y: 0, z: 0 }\n for (let iy = 0; iy < gridY1; iy++) {\n const y = iy * segmentHeight - heightHalf\n for (let ix = 0; ix < gridX1; ix++) {\n const x = ix * segmentWidth - widthHalf\n vector[u] = x * udir\n vector[v] = y * vdir\n vector[w] = depthHalf\n vertices.push(vector.x, vector.y, vector.z)\n vector[u] = 0\n vector[v] = 0\n vector[w] = depth > 0 ? 1 : -1\n normals.push(vector.x, vector.y, vector.z)\n uvs.push(ix / gridX)\n uvs.push(1 - iy / gridY)\n vertexCounter += 1\n }\n }\n for (let iy = 0; iy < gridY; iy++) {\n for (let ix = 0; ix < gridX; ix++) {\n const a = numberOfVertices + ix + gridX1 * iy\n const b = numberOfVertices + ix + gridX1 * (iy + 1)\n const c = numberOfVertices + (ix + 1) + gridX1 * (iy + 1)\n const d = numberOfVertices + (ix + 1) + gridX1 * iy\n indices.push(a, b, d)\n indices.push(b, c, d)\n groupCount += 6\n }\n }\n groups.push({ start: groupStart, count: groupCount, materialIndex })\n groupStart += groupCount\n numberOfVertices += vertexCounter\n }\n buildPlane('z', 'y', 'x', -1, -1, depth, height, width, depthSegments, heightSegments, 0)\n buildPlane('z', 'y', 'x', 1, -1, depth, height, -width, depthSegments, heightSegments, 1)\n buildPlane('x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2)\n buildPlane('x', 'z', 'y', 1, -1, width, depth, -height, widthSegments, depthSegments, 3)\n buildPlane('x', 'y', 'z', 1, -1, width, height, depth, widthSegments, heightSegments, 4)\n buildPlane('x', 'y', 'z', -1, -1, width, height, -depth, widthSegments, heightSegments, 5)\n return pack('BoxGeometry', parameters, { vertices, normals, uvs, indices, groups })\n}\n\nfunction cylinderArrays(radiusTop: number, radiusBottom: number, height: number, radialSegments: number, heightSegments: number, openEnded: boolean, thetaStart: number, thetaLength: number): Arrays {\n radialSegments = Math.floor(radialSegments)\n heightSegments = Math.floor(heightSegments)\n const indices: number[] = []\n const vertices: number[] = []\n const normals: number[] = []\n const uvs: number[] = []\n const groups: GeometryGroup[] = []\n let index = 0\n const indexArray: number[][] = []\n const halfHeight = height / 2\n let groupStart = 0\n\n const generateTorso = (): void => {\n let groupCount = 0\n const slope = (radiusBottom - radiusTop) / height\n for (let y = 0; y <= heightSegments; y++) {\n const indexRow: number[] = []\n const v = y / heightSegments\n const radius = v * (radiusBottom - radiusTop) + radiusTop\n for (let x = 0; x <= radialSegments; x++) {\n const u = x / radialSegments\n const theta = u * thetaLength + thetaStart\n const sinTheta = Math.sin(theta)\n const cosTheta = Math.cos(theta)\n vertices.push(radius * sinTheta, -v * height + halfHeight, radius * cosTheta)\n const n = normalize3(sinTheta, slope, cosTheta)\n normals.push(n[0], n[1], n[2])\n uvs.push(u, 1 - v)\n indexRow.push(index++)\n }\n indexArray.push(indexRow)\n }\n for (let x = 0; x < radialSegments; x++) {\n for (let y = 0; y < heightSegments; y++) {\n const a = indexArray[y]![x]!\n const b = indexArray[y + 1]![x]!\n const c = indexArray[y + 1]![x + 1]!\n const d = indexArray[y]![x + 1]!\n indices.push(a, b, d)\n indices.push(b, c, d)\n groupCount += 6\n }\n }\n groups.push({ start: groupStart, count: groupCount, materialIndex: 0 })\n groupStart += groupCount\n }\n\n const generateCap = (top: boolean): void => {\n const centerIndexStart = index\n let groupCount = 0\n const radius = top === true ? radiusTop : radiusBottom\n const sign = top === true ? 1 : -1\n for (let x = 1; x <= radialSegments; x++) {\n vertices.push(0, halfHeight * sign, 0)\n normals.push(0, sign, 0)\n uvs.push(0.5, 0.5)\n index++\n }\n const centerIndexEnd = index\n for (let x = 0; x <= radialSegments; x++) {\n const u = x / radialSegments\n const theta = u * thetaLength + thetaStart\n const cosTheta = Math.cos(theta)\n const sinTheta = Math.sin(theta)\n vertices.push(radius * sinTheta, halfHeight * sign, radius * cosTheta)\n normals.push(0, sign, 0)\n uvs.push(cosTheta * 0.5 + 0.5, sinTheta * 0.5 * sign + 0.5)\n index++\n }\n for (let x = 0; x < radialSegments; x++) {\n const c = centerIndexStart + x\n const i = centerIndexEnd + x\n if (top === true) indices.push(i, i + 1, c)\n else indices.push(i + 1, i, c)\n groupCount += 3\n }\n groups.push({ start: groupStart, count: groupCount, materialIndex: top === true ? 1 : 2 })\n groupStart += groupCount\n }\n\n generateTorso()\n if (openEnded === false) {\n if (radiusTop > 0) generateCap(true)\n if (radiusBottom > 0) generateCap(false)\n }\n return { vertices, normals, uvs, indices, groups }\n}\n\nexport function cylinder(radiusTop = 1, radiusBottom = 1, height = 1, radialSegments = 32, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2): PrimitiveBuffers {\n const parameters = { radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength }\n return pack('CylinderGeometry', parameters, cylinderArrays(radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength))\n}\n\nexport function cone(radius = 1, height = 1, radialSegments = 32, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2): PrimitiveBuffers {\n const parameters = { radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength }\n return pack('ConeGeometry', parameters, cylinderArrays(0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength))\n}\n\nexport function sphere(radius = 1, widthSegments = 32, heightSegments = 16, phiStart = 0, phiLength = Math.PI * 2, thetaStart = 0, thetaLength = Math.PI): PrimitiveBuffers {\n const parameters = { radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength }\n widthSegments = Math.max(3, Math.floor(widthSegments))\n heightSegments = Math.max(2, Math.floor(heightSegments))\n const thetaEnd = Math.min(thetaStart + thetaLength, Math.PI)\n let index = 0\n const grid: number[][] = []\n const indices: number[] = []\n const vertices: number[] = []\n const normals: number[] = []\n const uvs: number[] = []\n for (let iy = 0; iy <= heightSegments; iy++) {\n const verticesRow: number[] = []\n const v = iy / heightSegments\n let uOffset = 0\n if (iy === 0 && thetaStart === 0) uOffset = 0.5 / widthSegments\n else if (iy === heightSegments && thetaEnd === Math.PI) uOffset = -0.5 / widthSegments\n for (let ix = 0; ix <= widthSegments; ix++) {\n const u = ix / widthSegments\n const x = -radius * Math.cos(phiStart + u * phiLength) * Math.sin(thetaStart + v * thetaLength)\n const y = radius * Math.cos(thetaStart + v * thetaLength)\n const z = radius * Math.sin(phiStart + u * phiLength) * Math.sin(thetaStart + v * thetaLength)\n vertices.push(x, y, z)\n const n = normalize3(x, y, z)\n normals.push(n[0], n[1], n[2])\n uvs.push(u + uOffset, 1 - v)\n verticesRow.push(index++)\n }\n grid.push(verticesRow)\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 if (iy !== 0 || thetaStart > 0) indices.push(a, b, d)\n if (iy !== heightSegments - 1 || thetaEnd < Math.PI) indices.push(b, c, d)\n }\n }\n return pack('SphereGeometry', parameters, { vertices, normals, uvs, indices, groups: [] })\n}\n\nexport function plane(width = 1, height = 1, widthSegments = 1, heightSegments = 1): PrimitiveBuffers {\n const parameters = { width, height, widthSegments, heightSegments }\n const widthHalf = width / 2\n const heightHalf = height / 2\n const gridX = Math.floor(widthSegments)\n const gridY = Math.floor(heightSegments)\n const gridX1 = gridX + 1\n const gridY1 = gridY + 1\n const segmentWidth = width / gridX\n const segmentHeight = height / gridY\n const indices: number[] = []\n const vertices: number[] = []\n const normals: number[] = []\n const uvs: number[] = []\n for (let iy = 0; iy < gridY1; iy++) {\n const y = iy * segmentHeight - heightHalf\n for (let ix = 0; ix < gridX1; ix++) {\n const x = ix * segmentWidth - widthHalf\n vertices.push(x, -y, 0)\n normals.push(0, 0, 1)\n uvs.push(ix / gridX)\n uvs.push(1 - iy / gridY)\n }\n }\n for (let iy = 0; iy < gridY; iy++) {\n for (let ix = 0; ix < gridX; ix++) {\n const a = ix + gridX1 * iy\n const b = ix + gridX1 * (iy + 1)\n const c = ix + 1 + gridX1 * (iy + 1)\n const d = ix + 1 + gridX1 * iy\n indices.push(a, b, d)\n indices.push(b, c, d)\n }\n }\n return pack('PlaneGeometry', parameters, { vertices, normals, uvs, indices, groups: [] })\n}\n\nexport function circle(radius = 1, segments = 32, thetaStart = 0, thetaLength = Math.PI * 2): PrimitiveBuffers {\n const parameters = { radius, segments, thetaStart, thetaLength }\n segments = Math.max(3, segments)\n const indices: number[] = []\n const vertices: number[] = []\n const normals: number[] = []\n const uvs: number[] = []\n vertices.push(0, 0, 0)\n normals.push(0, 0, 1)\n uvs.push(0.5, 0.5)\n for (let s = 0, i = 3; s <= segments; s++, i += 3) {\n const segment = thetaStart + (s / segments) * thetaLength\n // the vector's z stays 0, as three's Vector3\n vertices.push(radius * Math.cos(segment), radius * Math.sin(segment), 0)\n normals.push(0, 0, 1)\n uvs.push(((vertices[i] as number) / radius + 1) / 2, ((vertices[i + 1] as number) / radius + 1) / 2)\n }\n for (let i = 1; i <= segments; i++) indices.push(i, i + 1, 0)\n return pack('CircleGeometry', parameters, { vertices, normals, uvs, indices, groups: [] })\n}\n\nexport function ring(innerRadius = 0.5, outerRadius = 1, thetaSegments = 32, phiSegments = 1, thetaStart = 0, thetaLength = Math.PI * 2): PrimitiveBuffers {\n const parameters = { innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength }\n thetaSegments = Math.max(3, thetaSegments)\n phiSegments = Math.max(1, phiSegments)\n const indices: number[] = []\n const vertices: number[] = []\n const normals: number[] = []\n const uvs: number[] = []\n let radius = innerRadius\n const radiusStep = (outerRadius - innerRadius) / phiSegments\n for (let j = 0; j <= phiSegments; j++) {\n for (let i = 0; i <= thetaSegments; i++) {\n const segment = thetaStart + (i / thetaSegments) * thetaLength\n const x = radius * Math.cos(segment)\n const y = radius * Math.sin(segment)\n vertices.push(x, y, 0)\n normals.push(0, 0, 1)\n uvs.push((x / outerRadius + 1) / 2, (y / outerRadius + 1) / 2)\n }\n radius += radiusStep\n }\n for (let j = 0; j < phiSegments; j++) {\n const thetaSegmentLevel = j * (thetaSegments + 1)\n for (let i = 0; i < thetaSegments; i++) {\n const segment = i + thetaSegmentLevel\n const a = segment\n const b = segment + thetaSegments + 1\n const c = segment + thetaSegments + 2\n const d = segment + 1\n indices.push(a, b, d)\n indices.push(b, c, d)\n }\n }\n return pack('RingGeometry', parameters, { vertices, normals, uvs, indices, groups: [] })\n}\n\nexport function lathe(points: ReadonlyArray<readonly [number, number]>, segments = 12, phiStart = 0, phiLength = Math.PI * 2): PrimitiveBuffers {\n const parameters = { points: points.map(([x, y]) => ({ x, y })), segments, phiStart, phiLength }\n segments = Math.floor(segments)\n phiLength = Math.max(0, Math.min(Math.PI * 2, phiLength))\n const indices: number[] = []\n const vertices: number[] = []\n const uvs: number[] = []\n const initNormals: number[] = []\n const normals: number[] = []\n const inverseSegments = 1.0 / segments\n const normal = { x: 0, y: 0, z: 0 }\n const curNormal = { x: 0, y: 0, z: 0 }\n const prevNormal = { x: 0, y: 0, z: 0 }\n let dx = 0\n let dy = 0\n const last = points.length - 1\n const px = (j: number): number => (points[j] as readonly [number, number])[0]\n const py = (j: number): number => (points[j] as readonly [number, number])[1]\n const setNormalized = (): void => {\n const n = normalize3(normal.x, normal.y, normal.z)\n normal.x = n[0]\n normal.y = n[1]\n normal.z = n[2]\n }\n for (let j = 0; j <= last; j++) {\n if (j === 0) {\n dx = px(j + 1) - px(j)\n dy = py(j + 1) - py(j)\n normal.x = dy * 1.0\n normal.y = -dx\n normal.z = dy * 0.0\n prevNormal.x = normal.x\n prevNormal.y = normal.y\n prevNormal.z = normal.z\n setNormalized()\n initNormals.push(normal.x, normal.y, normal.z)\n } else if (j === last) {\n initNormals.push(prevNormal.x, prevNormal.y, prevNormal.z)\n } else {\n dx = px(j + 1) - px(j)\n dy = py(j + 1) - py(j)\n normal.x = dy * 1.0\n normal.y = -dx\n normal.z = dy * 0.0\n curNormal.x = normal.x\n curNormal.y = normal.y\n curNormal.z = normal.z\n normal.x += prevNormal.x\n normal.y += prevNormal.y\n normal.z += prevNormal.z\n setNormalized()\n initNormals.push(normal.x, normal.y, normal.z)\n prevNormal.x = curNormal.x\n prevNormal.y = curNormal.y\n prevNormal.z = curNormal.z\n }\n }\n for (let i = 0; i <= segments; i++) {\n const phi = phiStart + i * inverseSegments * phiLength\n const sin = Math.sin(phi)\n const cos = Math.cos(phi)\n for (let j = 0; j <= last; j++) {\n vertices.push(px(j) * sin, py(j), px(j) * cos)\n uvs.push(i / segments, j / (points.length - 1))\n const x = (initNormals[3 * j + 0] as number) * sin\n const y = initNormals[3 * j + 1] as number\n const z = (initNormals[3 * j + 0] as number) * cos\n normals.push(x, y, z)\n }\n }\n for (let i = 0; i < segments; i++) {\n for (let j = 0; j < points.length - 1; j++) {\n const base = j + i * points.length\n const a = base\n const b = base + points.length\n const c = base + points.length + 1\n const d = base + 1\n indices.push(a, b, d)\n indices.push(c, d, b)\n }\n }\n return pack('LatheGeometry', parameters, { vertices, normals, uvs, indices, groups: [] })\n}\n\nexport function torus(radius = 1, tube = 0.4, radialSegments = 12, tubularSegments = 48, arc = Math.PI * 2): PrimitiveBuffers {\n const parameters = { radius, tube, radialSegments, tubularSegments, arc }\n radialSegments = Math.floor(radialSegments)\n tubularSegments = Math.floor(tubularSegments)\n const indices: number[] = []\n const vertices: number[] = []\n const normals: number[] = []\n const uvs: number[] = []\n for (let j = 0; j <= radialSegments; j++) {\n for (let i = 0; i <= tubularSegments; i++) {\n const u = (i / tubularSegments) * arc\n const v = (j / radialSegments) * Math.PI * 2\n const x = (radius + tube * Math.cos(v)) * Math.cos(u)\n const y = (radius + tube * Math.cos(v)) * Math.sin(u)\n const z = tube * Math.sin(v)\n vertices.push(x, y, z)\n const cx = radius * Math.cos(u)\n const cy = radius * Math.sin(u)\n const n = normalize3(x - cx, y - cy, z - 0)\n normals.push(n[0], n[1], n[2])\n uvs.push(i / tubularSegments)\n uvs.push(j / radialSegments)\n }\n }\n for (let j = 1; j <= radialSegments; j++) {\n for (let i = 1; i <= tubularSegments; i++) {\n const a = (tubularSegments + 1) * j + i - 1\n const b = (tubularSegments + 1) * (j - 1) + i - 1\n const c = (tubularSegments + 1) * (j - 1) + i\n const d = (tubularSegments + 1) * j + i\n indices.push(a, b, d)\n indices.push(b, c, d)\n }\n }\n return pack('TorusGeometry', parameters, { vertices, normals, uvs, indices, groups: [] })\n}\n","import type { HoleSpec, PrimitiveBuffers, Vec3 } from '../types'\nimport { indexArray } from './three-generators'\n\n/**\n * A box (centred, `size = [w, h, d]`) minus rectangular prisms that go all the way through it along z: the cheap, exact boolean (walls with\n * windows and doors). The face is cut into a grid at every hole edge; each solid cell gets its front and back quads, and every cell edge between\n * solid and empty (a hole or the outside) gets a quad over the depth facing the empty side, so the outer sides and the reveals come out of the\n * same rule. Front uvs map the face to [0, 1]; side uvs run along the edge and the depth.\n */\nexport function difference(size: Vec3, subtract: readonly HoleSpec[]): PrimitiveBuffers {\n const [w, h, d] = size\n const hw = w / 2\n const hh = h / 2\n const hd = d / 2\n const holes = subtract\n .map((hole) => ({ x0: Math.max(-hw, Math.min(hole.min[0], hole.max[0])), x1: Math.min(hw, Math.max(hole.min[0], hole.max[0])), y0: Math.max(-hh, Math.min(hole.min[1], hole.max[1])), y1: Math.min(hh, Math.max(hole.min[1], hole.max[1])) }))\n .filter((hole) => hole.x1 > hole.x0 && hole.y1 > hole.y0)\n const cuts = (lo: number, hi: number, values: number[]): number[] => [...new Set([lo, hi, ...values.filter((v) => v > lo && v < hi)])].sort((a, b) => a - b)\n const xs = cuts(-hw, hw, holes.flatMap((hole) => [hole.x0, hole.x1]))\n const ys = cuts(-hh, hh, holes.flatMap((hole) => [hole.y0, hole.y1]))\n const nx = xs.length - 1\n const ny = ys.length - 1\n const solid = (i: number, j: number): boolean => {\n if (i < 0 || j < 0 || i >= nx || j >= ny) return false\n const cx = ((xs[i] as number) + (xs[i + 1] as number)) / 2\n const cy = ((ys[j] as number) + (ys[j + 1] as number)) / 2\n return !holes.some((hole) => cx > hole.x0 && cx < hole.x1 && cy > hole.y0 && cy < hole.y1)\n }\n const positions: number[] = []\n const normals: number[] = []\n const uvs: number[] = []\n const indices: number[] = []\n const quad = (corners: readonly (readonly [number, number, number])[], normal: readonly [number, number, number], uv: readonly (readonly [number, number])[]): void => {\n const base = positions.length / 3\n for (let k = 0; k < 4; k++) {\n positions.push(...(corners[k] as [number, number, number]))\n normals.push(...normal)\n uvs.push(...(uv[k] as [number, number]))\n }\n indices.push(base, base + 1, base + 2, base, base + 2, base + 3)\n }\n const fu = (x: number): number => (x + hw) / w\n const fv = (y: number): number => (y + hh) / h\n for (let j = 0; j < ny; j++) {\n for (let i = 0; i < nx; i++) {\n if (!solid(i, j)) continue\n const x0 = xs[i] as number\n const x1 = xs[i + 1] as number\n const y0 = ys[j] as number\n const y1 = ys[j + 1] as number\n quad([[x0, y0, hd], [x1, y0, hd], [x1, y1, hd], [x0, y1, hd]], [0, 0, 1], [[fu(x0), fv(y0)], [fu(x1), fv(y0)], [fu(x1), fv(y1)], [fu(x0), fv(y1)]])\n quad([[x1, y0, -hd], [x0, y0, -hd], [x0, y1, -hd], [x1, y1, -hd]], [0, 0, -1], [[1 - fu(x1), fv(y0)], [1 - fu(x0), fv(y0)], [1 - fu(x0), fv(y1)], [1 - fu(x1), fv(y1)]])\n const zu = (z: number): number => (z + hd) / d\n if (!solid(i - 1, j)) quad([[x0, y0, -hd], [x0, y0, hd], [x0, y1, hd], [x0, y1, -hd]], [-1, 0, 0], [[zu(-hd), fv(y0)], [zu(hd), fv(y0)], [zu(hd), fv(y1)], [zu(-hd), fv(y1)]])\n if (!solid(i + 1, j)) quad([[x1, y0, hd], [x1, y0, -hd], [x1, y1, -hd], [x1, y1, hd]], [1, 0, 0], [[zu(hd), fv(y0)], [zu(-hd), fv(y0)], [zu(-hd), fv(y1)], [zu(hd), fv(y1)]])\n if (!solid(i, j - 1)) quad([[x0, y0, -hd], [x1, y0, -hd], [x1, y0, hd], [x0, y0, hd]], [0, -1, 0], [[fu(x0), zu(-hd)], [fu(x1), zu(-hd)], [fu(x1), zu(hd)], [fu(x0), zu(hd)]])\n if (!solid(i, j + 1)) quad([[x0, y1, hd], [x1, y1, hd], [x1, y1, -hd], [x0, y1, -hd]], [0, 1, 0], [[fu(x0), zu(hd)], [fu(x1), zu(hd)], [fu(x1), zu(-hd)], [fu(x0), zu(-hd)]])\n }\n }\n return {\n type: 'BufferGeometry',\n parameters: { size: [w, h, d], subtract: holes.map((hole) => ({ min: [hole.x0, hole.y0], max: [hole.x1, hole.y1] })) },\n positions: new Float32Array(positions),\n normals: new Float32Array(normals),\n uvs: new Float32Array(uvs),\n indices: indexArray(indices),\n groups: [],\n }\n}\n","/* eslint-disable */\n// @ts-nocheck -- verbatim copy of three.js r160 src/extras/Earcut.js (MIT), itself a port of mapbox/earcut v2.2.4 (ISC); kept as is so triangulation matches three\n/**\n * Port from https://github.com/mapbox/earcut (v2.2.4)\n */\n\nconst Earcut = {\n\n\ttriangulate: function ( data, holeIndices, dim = 2 ) {\n\n\t\tconst hasHoles = holeIndices && holeIndices.length;\n\t\tconst outerLen = hasHoles ? holeIndices[ 0 ] * dim : data.length;\n\t\tlet outerNode = linkedList( data, 0, outerLen, dim, true );\n\t\tconst triangles = [];\n\n\t\tif ( ! outerNode || outerNode.next === outerNode.prev ) return triangles;\n\n\t\tlet minX, minY, maxX, maxY, x, y, invSize;\n\n\t\tif ( hasHoles ) outerNode = eliminateHoles( data, holeIndices, outerNode, dim );\n\n\t\t// if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox\n\t\tif ( data.length > 80 * dim ) {\n\n\t\t\tminX = maxX = data[ 0 ];\n\t\t\tminY = maxY = data[ 1 ];\n\n\t\t\tfor ( let i = dim; i < outerLen; i += dim ) {\n\n\t\t\t\tx = data[ i ];\n\t\t\t\ty = data[ i + 1 ];\n\t\t\t\tif ( x < minX ) minX = x;\n\t\t\t\tif ( y < minY ) minY = y;\n\t\t\t\tif ( x > maxX ) maxX = x;\n\t\t\t\tif ( y > maxY ) maxY = y;\n\n\t\t\t}\n\n\t\t\t// minX, minY and invSize are later used to transform coords into integers for z-order calculation\n\t\t\tinvSize = Math.max( maxX - minX, maxY - minY );\n\t\t\tinvSize = invSize !== 0 ? 32767 / invSize : 0;\n\n\t\t}\n\n\t\tearcutLinked( outerNode, triangles, dim, minX, minY, invSize, 0 );\n\n\t\treturn triangles;\n\n\t}\n\n};\n\n// create a circular doubly linked list from polygon points in the specified winding order\nfunction linkedList( data, start, end, dim, clockwise ) {\n\n\tlet i, last;\n\n\tif ( clockwise === ( signedArea( data, start, end, dim ) > 0 ) ) {\n\n\t\tfor ( i = start; i < end; i += dim ) last = insertNode( i, data[ i ], data[ i + 1 ], last );\n\n\t} else {\n\n\t\tfor ( i = end - dim; i >= start; i -= dim ) last = insertNode( i, data[ i ], data[ i + 1 ], last );\n\n\t}\n\n\tif ( last && equals( last, last.next ) ) {\n\n\t\tremoveNode( last );\n\t\tlast = last.next;\n\n\t}\n\n\treturn last;\n\n}\n\n// eliminate colinear or duplicate points\nfunction filterPoints( start, end ) {\n\n\tif ( ! start ) return start;\n\tif ( ! end ) end = start;\n\n\tlet p = start,\n\t\tagain;\n\tdo {\n\n\t\tagain = false;\n\n\t\tif ( ! p.steiner && ( equals( p, p.next ) || area( p.prev, p, p.next ) === 0 ) ) {\n\n\t\t\tremoveNode( p );\n\t\t\tp = end = p.prev;\n\t\t\tif ( p === p.next ) break;\n\t\t\tagain = true;\n\n\t\t} else {\n\n\t\t\tp = p.next;\n\n\t\t}\n\n\t} while ( again || p !== end );\n\n\treturn end;\n\n}\n\n// main ear slicing loop which triangulates a polygon (given as a linked list)\nfunction earcutLinked( ear, triangles, dim, minX, minY, invSize, pass ) {\n\n\tif ( ! ear ) return;\n\n\t// interlink polygon nodes in z-order\n\tif ( ! pass && invSize ) indexCurve( ear, minX, minY, invSize );\n\n\tlet stop = ear,\n\t\tprev, next;\n\n\t// iterate through ears, slicing them one by one\n\twhile ( ear.prev !== ear.next ) {\n\n\t\tprev = ear.prev;\n\t\tnext = ear.next;\n\n\t\tif ( invSize ? isEarHashed( ear, minX, minY, invSize ) : isEar( ear ) ) {\n\n\t\t\t// cut off the triangle\n\t\t\ttriangles.push( prev.i / dim | 0 );\n\t\t\ttriangles.push( ear.i / dim | 0 );\n\t\t\ttriangles.push( next.i / dim | 0 );\n\n\t\t\tremoveNode( ear );\n\n\t\t\t// skipping the next vertex leads to less sliver triangles\n\t\t\tear = next.next;\n\t\t\tstop = next.next;\n\n\t\t\tcontinue;\n\n\t\t}\n\n\t\tear = next;\n\n\t\t// if we looped through the whole remaining polygon and can't find any more ears\n\t\tif ( ear === stop ) {\n\n\t\t\t// try filtering points and slicing again\n\t\t\tif ( ! pass ) {\n\n\t\t\t\tearcutLinked( filterPoints( ear ), triangles, dim, minX, minY, invSize, 1 );\n\n\t\t\t\t// if this didn't work, try curing all small self-intersections locally\n\n\t\t\t} else if ( pass === 1 ) {\n\n\t\t\t\tear = cureLocalIntersections( filterPoints( ear ), triangles, dim );\n\t\t\t\tearcutLinked( ear, triangles, dim, minX, minY, invSize, 2 );\n\n\t\t\t\t// as a last resort, try splitting the remaining polygon into two\n\n\t\t\t} else if ( pass === 2 ) {\n\n\t\t\t\tsplitEarcut( ear, triangles, dim, minX, minY, invSize );\n\n\t\t\t}\n\n\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n}\n\n// check whether a polygon node forms a valid ear with adjacent nodes\nfunction isEar( ear ) {\n\n\tconst a = ear.prev,\n\t\tb = ear,\n\t\tc = ear.next;\n\n\tif ( area( a, b, c ) >= 0 ) return false; // reflex, can't be an ear\n\n\t// now make sure we don't have other points inside the potential ear\n\tconst ax = a.x, bx = b.x, cx = c.x, ay = a.y, by = b.y, cy = c.y;\n\n\t// triangle bbox; min & max are calculated like this for speed\n\tconst x0 = ax < bx ? ( ax < cx ? ax : cx ) : ( bx < cx ? bx : cx ),\n\t\ty0 = ay < by ? ( ay < cy ? ay : cy ) : ( by < cy ? by : cy ),\n\t\tx1 = ax > bx ? ( ax > cx ? ax : cx ) : ( bx > cx ? bx : cx ),\n\t\ty1 = ay > by ? ( ay > cy ? ay : cy ) : ( by > cy ? by : cy );\n\n\tlet p = c.next;\n\twhile ( p !== a ) {\n\n\t\tif ( p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 &&\n\t\t\tpointInTriangle( ax, ay, bx, by, cx, cy, p.x, p.y ) &&\n\t\t\tarea( p.prev, p, p.next ) >= 0 ) return false;\n\t\tp = p.next;\n\n\t}\n\n\treturn true;\n\n}\n\nfunction isEarHashed( ear, minX, minY, invSize ) {\n\n\tconst a = ear.prev,\n\t\tb = ear,\n\t\tc = ear.next;\n\n\tif ( area( a, b, c ) >= 0 ) return false; // reflex, can't be an ear\n\n\tconst ax = a.x, bx = b.x, cx = c.x, ay = a.y, by = b.y, cy = c.y;\n\n\t// triangle bbox; min & max are calculated like this for speed\n\tconst x0 = ax < bx ? ( ax < cx ? ax : cx ) : ( bx < cx ? bx : cx ),\n\t\ty0 = ay < by ? ( ay < cy ? ay : cy ) : ( by < cy ? by : cy ),\n\t\tx1 = ax > bx ? ( ax > cx ? ax : cx ) : ( bx > cx ? bx : cx ),\n\t\ty1 = ay > by ? ( ay > cy ? ay : cy ) : ( by > cy ? by : cy );\n\n\t// z-order range for the current triangle bbox;\n\tconst minZ = zOrder( x0, y0, minX, minY, invSize ),\n\t\tmaxZ = zOrder( x1, y1, minX, minY, invSize );\n\n\tlet p = ear.prevZ,\n\t\tn = ear.nextZ;\n\n\t// look for points inside the triangle in both directions\n\twhile ( p && p.z >= minZ && n && n.z <= maxZ ) {\n\n\t\tif ( p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c &&\n\t\t\tpointInTriangle( ax, ay, bx, by, cx, cy, p.x, p.y ) && area( p.prev, p, p.next ) >= 0 ) return false;\n\t\tp = p.prevZ;\n\n\t\tif ( n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c &&\n\t\t\tpointInTriangle( ax, ay, bx, by, cx, cy, n.x, n.y ) && area( n.prev, n, n.next ) >= 0 ) return false;\n\t\tn = n.nextZ;\n\n\t}\n\n\t// look for remaining points in decreasing z-order\n\twhile ( p && p.z >= minZ ) {\n\n\t\tif ( p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c &&\n\t\t\tpointInTriangle( ax, ay, bx, by, cx, cy, p.x, p.y ) && area( p.prev, p, p.next ) >= 0 ) return false;\n\t\tp = p.prevZ;\n\n\t}\n\n\t// look for remaining points in increasing z-order\n\twhile ( n && n.z <= maxZ ) {\n\n\t\tif ( n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c &&\n\t\t\tpointInTriangle( ax, ay, bx, by, cx, cy, n.x, n.y ) && area( n.prev, n, n.next ) >= 0 ) return false;\n\t\tn = n.nextZ;\n\n\t}\n\n\treturn true;\n\n}\n\n// go through all polygon nodes and cure small local self-intersections\nfunction cureLocalIntersections( start, triangles, dim ) {\n\n\tlet p = start;\n\tdo {\n\n\t\tconst a = p.prev,\n\t\t\tb = p.next.next;\n\n\t\tif ( ! equals( a, b ) && intersects( a, p, p.next, b ) && locallyInside( a, b ) && locallyInside( b, a ) ) {\n\n\t\t\ttriangles.push( a.i / dim | 0 );\n\t\t\ttriangles.push( p.i / dim | 0 );\n\t\t\ttriangles.push( b.i / dim | 0 );\n\n\t\t\t// remove two nodes involved\n\t\t\tremoveNode( p );\n\t\t\tremoveNode( p.next );\n\n\t\t\tp = start = b;\n\n\t\t}\n\n\t\tp = p.next;\n\n\t} while ( p !== start );\n\n\treturn filterPoints( p );\n\n}\n\n// try splitting polygon into two and triangulate them independently\nfunction splitEarcut( start, triangles, dim, minX, minY, invSize ) {\n\n\t// look for a valid diagonal that divides the polygon into two\n\tlet a = start;\n\tdo {\n\n\t\tlet b = a.next.next;\n\t\twhile ( b !== a.prev ) {\n\n\t\t\tif ( a.i !== b.i && isValidDiagonal( a, b ) ) {\n\n\t\t\t\t// split the polygon in two by the diagonal\n\t\t\t\tlet c = splitPolygon( a, b );\n\n\t\t\t\t// filter colinear points around the cuts\n\t\t\t\ta = filterPoints( a, a.next );\n\t\t\t\tc = filterPoints( c, c.next );\n\n\t\t\t\t// run earcut on each half\n\t\t\t\tearcutLinked( a, triangles, dim, minX, minY, invSize, 0 );\n\t\t\t\tearcutLinked( c, triangles, dim, minX, minY, invSize, 0 );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tb = b.next;\n\n\t\t}\n\n\t\ta = a.next;\n\n\t} while ( a !== start );\n\n}\n\n// link every hole into the outer loop, producing a single-ring polygon without holes\nfunction eliminateHoles( data, holeIndices, outerNode, dim ) {\n\n\tconst queue = [];\n\tlet i, len, start, end, list;\n\n\tfor ( i = 0, len = holeIndices.length; i < len; i ++ ) {\n\n\t\tstart = holeIndices[ i ] * dim;\n\t\tend = i < len - 1 ? holeIndices[ i + 1 ] * dim : data.length;\n\t\tlist = linkedList( data, start, end, dim, false );\n\t\tif ( list === list.next ) list.steiner = true;\n\t\tqueue.push( getLeftmost( list ) );\n\n\t}\n\n\tqueue.sort( compareX );\n\n\t// process holes from left to right\n\tfor ( i = 0; i < queue.length; i ++ ) {\n\n\t\touterNode = eliminateHole( queue[ i ], outerNode );\n\n\t}\n\n\treturn outerNode;\n\n}\n\nfunction compareX( a, b ) {\n\n\treturn a.x - b.x;\n\n}\n\n// find a bridge between vertices that connects hole with an outer ring and link it\nfunction eliminateHole( hole, outerNode ) {\n\n\tconst bridge = findHoleBridge( hole, outerNode );\n\tif ( ! bridge ) {\n\n\t\treturn outerNode;\n\n\t}\n\n\tconst bridgeReverse = splitPolygon( bridge, hole );\n\n\t// filter collinear points around the cuts\n\tfilterPoints( bridgeReverse, bridgeReverse.next );\n\treturn filterPoints( bridge, bridge.next );\n\n}\n\n// David Eberly's algorithm for finding a bridge between hole and outer polygon\nfunction findHoleBridge( hole, outerNode ) {\n\n\tlet p = outerNode,\n\t\tqx = - Infinity,\n\t\tm;\n\n\tconst hx = hole.x, hy = hole.y;\n\n\t// find a segment intersected by a ray from the hole's leftmost point to the left;\n\t// segment's endpoint with lesser x will be potential connection point\n\tdo {\n\n\t\tif ( hy <= p.y && hy >= p.next.y && p.next.y !== p.y ) {\n\n\t\t\tconst x = p.x + ( hy - p.y ) * ( p.next.x - p.x ) / ( p.next.y - p.y );\n\t\t\tif ( x <= hx && x > qx ) {\n\n\t\t\t\tqx = x;\n\t\t\t\tm = p.x < p.next.x ? p : p.next;\n\t\t\t\tif ( x === hx ) return m; // hole touches outer segment; pick leftmost endpoint\n\n\t\t\t}\n\n\t\t}\n\n\t\tp = p.next;\n\n\t} while ( p !== outerNode );\n\n\tif ( ! m ) return null;\n\n\t// look for points inside the triangle of hole point, segment intersection and endpoint;\n\t// if there are no points found, we have a valid connection;\n\t// otherwise choose the point of the minimum angle with the ray as connection point\n\n\tconst stop = m,\n\t\tmx = m.x,\n\t\tmy = m.y;\n\tlet tanMin = Infinity, tan;\n\n\tp = m;\n\n\tdo {\n\n\t\tif ( hx >= p.x && p.x >= mx && hx !== p.x &&\n\t\t\t\tpointInTriangle( hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y ) ) {\n\n\t\t\ttan = Math.abs( hy - p.y ) / ( hx - p.x ); // tangential\n\n\t\t\tif ( locallyInside( p, hole ) && ( tan < tanMin || ( tan === tanMin && ( p.x > m.x || ( p.x === m.x && sectorContainsSector( m, p ) ) ) ) ) ) {\n\n\t\t\t\tm = p;\n\t\t\t\ttanMin = tan;\n\n\t\t\t}\n\n\t\t}\n\n\t\tp = p.next;\n\n\t} while ( p !== stop );\n\n\treturn m;\n\n}\n\n// whether sector in vertex m contains sector in vertex p in the same coordinates\nfunction sectorContainsSector( m, p ) {\n\n\treturn area( m.prev, m, p.prev ) < 0 && area( p.next, m, m.next ) < 0;\n\n}\n\n// interlink polygon nodes in z-order\nfunction indexCurve( start, minX, minY, invSize ) {\n\n\tlet p = start;\n\tdo {\n\n\t\tif ( p.z === 0 ) p.z = zOrder( p.x, p.y, minX, minY, invSize );\n\t\tp.prevZ = p.prev;\n\t\tp.nextZ = p.next;\n\t\tp = p.next;\n\n\t} while ( p !== start );\n\n\tp.prevZ.nextZ = null;\n\tp.prevZ = null;\n\n\tsortLinked( p );\n\n}\n\n// Simon Tatham's linked list merge sort algorithm\n// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html\nfunction sortLinked( list ) {\n\n\tlet i, p, q, e, tail, numMerges, pSize, qSize,\n\t\tinSize = 1;\n\n\tdo {\n\n\t\tp = list;\n\t\tlist = null;\n\t\ttail = null;\n\t\tnumMerges = 0;\n\n\t\twhile ( p ) {\n\n\t\t\tnumMerges ++;\n\t\t\tq = p;\n\t\t\tpSize = 0;\n\t\t\tfor ( i = 0; i < inSize; i ++ ) {\n\n\t\t\t\tpSize ++;\n\t\t\t\tq = q.nextZ;\n\t\t\t\tif ( ! q ) break;\n\n\t\t\t}\n\n\t\t\tqSize = inSize;\n\n\t\t\twhile ( pSize > 0 || ( qSize > 0 && q ) ) {\n\n\t\t\t\tif ( pSize !== 0 && ( qSize === 0 || ! q || p.z <= q.z ) ) {\n\n\t\t\t\t\te = p;\n\t\t\t\t\tp = p.nextZ;\n\t\t\t\t\tpSize --;\n\n\t\t\t\t} else {\n\n\t\t\t\t\te = q;\n\t\t\t\t\tq = q.nextZ;\n\t\t\t\t\tqSize --;\n\n\t\t\t\t}\n\n\t\t\t\tif ( tail ) tail.nextZ = e;\n\t\t\t\telse list = e;\n\n\t\t\t\te.prevZ = tail;\n\t\t\t\ttail = e;\n\n\t\t\t}\n\n\t\t\tp = q;\n\n\t\t}\n\n\t\ttail.nextZ = null;\n\t\tinSize *= 2;\n\n\t} while ( numMerges > 1 );\n\n\treturn list;\n\n}\n\n// z-order of a point given coords and inverse of the longer side of data bbox\nfunction zOrder( x, y, minX, minY, invSize ) {\n\n\t// coords are transformed into non-negative 15-bit integer range\n\tx = ( x - minX ) * invSize | 0;\n\ty = ( y - minY ) * invSize | 0;\n\n\tx = ( x | ( x << 8 ) ) & 0x00FF00FF;\n\tx = ( x | ( x << 4 ) ) & 0x0F0F0F0F;\n\tx = ( x | ( x << 2 ) ) & 0x33333333;\n\tx = ( x | ( x << 1 ) ) & 0x55555555;\n\n\ty = ( y | ( y << 8 ) ) & 0x00FF00FF;\n\ty = ( y | ( y << 4 ) ) & 0x0F0F0F0F;\n\ty = ( y | ( y << 2 ) ) & 0x33333333;\n\ty = ( y | ( y << 1 ) ) & 0x55555555;\n\n\treturn x | ( y << 1 );\n\n}\n\n// find the leftmost node of a polygon ring\nfunction getLeftmost( start ) {\n\n\tlet p = start,\n\t\tleftmost = start;\n\tdo {\n\n\t\tif ( p.x < leftmost.x || ( p.x === leftmost.x && p.y < leftmost.y ) ) leftmost = p;\n\t\tp = p.next;\n\n\t} while ( p !== start );\n\n\treturn leftmost;\n\n}\n\n// check if a point lies within a convex triangle\nfunction pointInTriangle( ax, ay, bx, by, cx, cy, px, py ) {\n\n\treturn ( cx - px ) * ( ay - py ) >= ( ax - px ) * ( cy - py ) &&\n ( ax - px ) * ( by - py ) >= ( bx - px ) * ( ay - py ) &&\n ( bx - px ) * ( cy - py ) >= ( cx - px ) * ( by - py );\n\n}\n\n// check if a diagonal between two polygon nodes is valid (lies in polygon interior)\nfunction isValidDiagonal( a, b ) {\n\n\treturn a.next.i !== b.i && a.prev.i !== b.i && ! intersectsPolygon( a, b ) && // dones't intersect other edges\n ( locallyInside( a, b ) && locallyInside( b, a ) && middleInside( a, b ) && // locally visible\n ( area( a.prev, a, b.prev ) || area( a, b.prev, b ) ) || // does not create opposite-facing sectors\n equals( a, b ) && area( a.prev, a, a.next ) > 0 && area( b.prev, b, b.next ) > 0 ); // special zero-length case\n\n}\n\n// signed area of a triangle\nfunction area( p, q, r ) {\n\n\treturn ( q.y - p.y ) * ( r.x - q.x ) - ( q.x - p.x ) * ( r.y - q.y );\n\n}\n\n// check if two points are equal\nfunction equals( p1, p2 ) {\n\n\treturn p1.x === p2.x && p1.y === p2.y;\n\n}\n\n// check if two segments intersect\nfunction intersects( p1, q1, p2, q2 ) {\n\n\tconst o1 = sign( area( p1, q1, p2 ) );\n\tconst o2 = sign( area( p1, q1, q2 ) );\n\tconst o3 = sign( area( p2, q2, p1 ) );\n\tconst o4 = sign( area( p2, q2, q1 ) );\n\n\tif ( o1 !== o2 && o3 !== o4 ) return true; // general case\n\n\tif ( o1 === 0 && onSegment( p1, p2, q1 ) ) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1\n\tif ( o2 === 0 && onSegment( p1, q2, q1 ) ) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1\n\tif ( o3 === 0 && onSegment( p2, p1, q2 ) ) return true; // p2, q2 and p1 are collinear and p1 lies on p2q2\n\tif ( o4 === 0 && onSegment( p2, q1, q2 ) ) return true; // p2, q2 and q1 are collinear and q1 lies on p2q2\n\n\treturn false;\n\n}\n\n// for collinear points p, q, r, check if point q lies on segment pr\nfunction onSegment( p, q, r ) {\n\n\treturn q.x <= Math.max( p.x, r.x ) && q.x >= Math.min( p.x, r.x ) && q.y <= Math.max( p.y, r.y ) && q.y >= Math.min( p.y, r.y );\n\n}\n\nfunction sign( num ) {\n\n\treturn num > 0 ? 1 : num < 0 ? - 1 : 0;\n\n}\n\n// check if a polygon diagonal intersects any polygon segments\nfunction intersectsPolygon( a, b ) {\n\n\tlet p = a;\n\tdo {\n\n\t\tif ( p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i &&\n\t\t\tintersects( p, p.next, a, b ) ) return true;\n\t\tp = p.next;\n\n\t} while ( p !== a );\n\n\treturn false;\n\n}\n\n// check if a polygon diagonal is locally inside the polygon\nfunction locallyInside( a, b ) {\n\n\treturn area( a.prev, a, a.next ) < 0 ?\n\t\tarea( a, b, a.next ) >= 0 && area( a, a.prev, b ) >= 0 :\n\t\tarea( a, b, a.prev ) < 0 || area( a, a.next, b ) < 0;\n\n}\n\n// check if the middle point of a polygon diagonal is inside the polygon\nfunction middleInside( a, b ) {\n\n\tlet p = a,\n\t\tinside = false;\n\tconst px = ( a.x + b.x ) / 2,\n\t\tpy = ( a.y + b.y ) / 2;\n\tdo {\n\n\t\tif ( ( ( p.y > py ) !== ( p.next.y > py ) ) && p.next.y !== p.y &&\n\t\t\t( px < ( p.next.x - p.x ) * ( py - p.y ) / ( p.next.y - p.y ) + p.x ) )\n\t\t\tinside = ! inside;\n\t\tp = p.next;\n\n\t} while ( p !== a );\n\n\treturn inside;\n\n}\n\n// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;\n// if one belongs to the outer ring and another to a hole, it merges it into a single ring\nfunction splitPolygon( a, b ) {\n\n\tconst a2 = new Node( a.i, a.x, a.y ),\n\t\tb2 = new Node( b.i, b.x, b.y ),\n\t\tan = a.next,\n\t\tbp = b.prev;\n\n\ta.next = b;\n\tb.prev = a;\n\n\ta2.next = an;\n\tan.prev = a2;\n\n\tb2.next = a2;\n\ta2.prev = b2;\n\n\tbp.next = b2;\n\tb2.prev = bp;\n\n\treturn b2;\n\n}\n\n// create a node and optionally link it with previous one (in a circular doubly linked list)\nfunction insertNode( i, x, y, last ) {\n\n\tconst p = new Node( i, x, y );\n\n\tif ( ! last ) {\n\n\t\tp.prev = p;\n\t\tp.next = p;\n\n\t} else {\n\n\t\tp.next = last.next;\n\t\tp.prev = last;\n\t\tlast.next.prev = p;\n\t\tlast.next = p;\n\n\t}\n\n\treturn p;\n\n}\n\nfunction removeNode( p ) {\n\n\tp.next.prev = p.prev;\n\tp.prev.next = p.next;\n\n\tif ( p.prevZ ) p.prevZ.nextZ = p.nextZ;\n\tif ( p.nextZ ) p.nextZ.prevZ = p.prevZ;\n\n}\n\nfunction Node( i, x, y ) {\n\n\t// vertex index in coordinates array\n\tthis.i = i;\n\n\t// vertex coordinates\n\tthis.x = x;\n\tthis.y = y;\n\n\t// previous and next vertex nodes in a polygon ring\n\tthis.prev = null;\n\tthis.next = null;\n\n\t// z-order curve value\n\tthis.z = 0;\n\n\t// previous and next nodes in z-order\n\tthis.prevZ = null;\n\tthis.nextZ = null;\n\n\t// indicates whether this is a steiner point\n\tthis.steiner = false;\n\n}\n\nfunction signedArea( data, start, end, dim ) {\n\n\tlet sum = 0;\n\tfor ( let i = start, j = end - dim; i < end; i += dim ) {\n\n\t\tsum += ( data[ j ] - data[ i ] ) * ( data[ i + 1 ] + data[ j + 1 ] );\n\t\tj = i;\n\n\t}\n\n\treturn sum;\n\n}\n\nexport { Earcut };\n","/*\n * three.js r160 `ExtrudeGeometry` (MIT) for straight-edged shapes, ported line by line: the outline is sampled as `Shape.extractPoints` samples a\n * path of `LineCurve`s, triangulated by three's `ShapeUtils.triangulateShape` (Earcut), bevelled and walled in the same order, with the\n * `WorldUVGenerator` uvs and `computeVertexNormals` on the Float32 positions. Path extrusion (`extrudePath`) is not supported.\n */\nimport type { BevelSpec, GeometryGroup, PrimitiveBuffers, ShapeOutline, Vec2 } from '../types'\nimport { Earcut } from './earcut'\n\ninterface P {\n x: number\n y: number\n}\n\nconst equals = (a: P, b: P): boolean => a.x === b.x && a.y === b.y\n\n/** `LineCurve.getPoint(t)`. */\nconst linePoint = (v1: P, v2: P, t: number): P => (t === 1 ? { x: v2.x, y: v2.y } : { x: (v2.x - v1.x) * t + v1.x, y: (v2.y - v1.y) * t + v1.y })\n\n/** `Path.setFromPoints(points).getPoints()`: one `LineCurve` per edge, resolution 1, consecutive duplicates dropped, not closed. */\nfunction pathPoints(points: readonly Vec2[]): P[] {\n const out: P[] = []\n let last: P | undefined\n for (let i = 1; i < points.length; i++) {\n const v1 = { x: (points[i - 1] as Vec2)[0], y: (points[i - 1] as Vec2)[1] }\n const v2 = { x: (points[i] as Vec2)[0], y: (points[i] as Vec2)[1] }\n for (let d = 0; d <= 1; d++) {\n const point = linePoint(v1, v2, d / 1)\n if (last && equals(last, point)) continue\n out.push(point)\n last = point\n }\n }\n return out\n}\n\nfunction area(contour: readonly P[]): number {\n const n = contour.length\n let a = 0.0\n for (let p = n - 1, q = 0; q < n; p = q++) a += (contour[p] as P).x * (contour[q] as P).y - (contour[q] as P).x * (contour[p] as P).y\n return a * 0.5\n}\nconst isClockWise = (pts: readonly P[]): boolean => area(pts) < 0\n\nfunction removeDupEndPts(points: P[]): void {\n const l = points.length\n if (l > 2 && equals(points[l - 1] as P, points[0] as P)) points.pop()\n}\n\nfunction triangulateShape(contour: P[], holes: P[][]): number[][] {\n const vertices: number[] = []\n const holeIndices: number[] = []\n const faces: number[][] = []\n removeDupEndPts(contour)\n for (const p of contour) vertices.push(p.x, p.y)\n let holeIndex = contour.length\n holes.forEach(removeDupEndPts)\n for (let i = 0; i < holes.length; i++) {\n holeIndices.push(holeIndex)\n holeIndex += (holes[i] as P[]).length\n for (const p of holes[i] as P[]) vertices.push(p.x, p.y)\n }\n const triangles: number[] = Earcut.triangulate(vertices, holeIndices)\n for (let i = 0; i < triangles.length; i += 3) faces.push(triangles.slice(i, i + 3))\n return faces\n}\n\n/** `BufferGeometry.computeVertexNormals` for non-indexed Float32 positions, then `normalizeNormals`, both stored as Float32. */\nexport function computeVertexNormals(positions: Float32Array, indices?: ArrayLike<number>): Float32Array {\n const normals = new Float32Array(positions.length)\n const get = (array: Float32Array, i: number): [number, number, number] => [array[i * 3] as number, array[i * 3 + 1] as number, array[i * 3 + 2] as number]\n const face = (vA: number, vB: number, vC: number): [number, number, number] => {\n const pA = get(positions, vA)\n const pB = get(positions, vB)\n const pC = get(positions, vC)\n const cb = [pC[0] - pB[0], pC[1] - pB[1], pC[2] - pB[2]] as const\n const ab = [pA[0] - pB[0], pA[1] - pB[1], pA[2] - pB[2]] as const\n // Vector3.cross\n return [cb[1] * ab[2] - cb[2] * ab[1], cb[2] * ab[0] - cb[0] * ab[2], cb[0] * ab[1] - cb[1] * ab[0]]\n }\n const set = (i: number, x: number, y: number, z: number): void => {\n normals[i * 3] = x\n normals[i * 3 + 1] = y\n normals[i * 3 + 2] = z\n }\n if (indices) {\n for (let i = 0; i < indices.length; i += 3) {\n const vA = indices[i] as number\n const vB = indices[i + 1] as number\n const vC = indices[i + 2] as number\n const cb = face(vA, vB, vC)\n for (const v of [vA, vB, vC]) {\n const n = get(normals, v)\n set(v, n[0] + cb[0], n[1] + cb[1], n[2] + cb[2])\n }\n }\n } else {\n for (let i = 0; i < positions.length / 3; i += 3) {\n const cb = face(i, i + 1, i + 2)\n set(i, cb[0], cb[1], cb[2])\n set(i + 1, cb[0], cb[1], cb[2])\n set(i + 2, cb[0], cb[1], cb[2])\n }\n }\n for (let i = 0; i < normals.length / 3; i++) {\n const [x, y, z] = get(normals, i)\n const s = 1 / (Math.sqrt(x * x + y * y + z * z) || 1)\n set(i, x * s, y * s, z * s)\n }\n return normals\n}\n\nexport function extrude(outline: ShapeOutline, depth = 1, steps = 1, bevel: false | BevelSpec | undefined = undefined): PrimitiveBuffers {\n const parameters = { shape: outline, depth, steps, bevel: bevel ?? {} }\n const verticesArray: number[] = []\n const uvArray: number[] = []\n const groups: GeometryGroup[] = []\n const placeholder: number[] = []\n\n const bevelEnabled = bevel !== false\n const spec: BevelSpec = bevel === false || bevel === undefined ? {} : bevel\n let bevelThickness = spec.thickness !== undefined ? spec.thickness : 0.2\n let bevelSize = spec.size !== undefined ? spec.size : bevelThickness - 0.1\n let bevelOffset = spec.offset !== undefined ? spec.offset : 0\n let bevelSegments = spec.segments !== undefined ? spec.segments : 3\n if (!bevelEnabled) {\n bevelSegments = 0\n bevelThickness = 0\n bevelSize = 0\n bevelOffset = 0\n }\n\n let vertices = pathPoints(outline.outer)\n const holes = (outline.holes ?? []).map(pathPoints)\n const reverse = !isClockWise(vertices)\n if (reverse) {\n vertices = vertices.reverse()\n for (let h = 0; h < holes.length; h++) {\n const ahole = holes[h] as P[]\n if (isClockWise(ahole)) holes[h] = ahole.reverse()\n }\n }\n const faces = triangulateShape(vertices, holes)\n const contour = vertices\n for (const ahole of holes) vertices = vertices.concat(ahole)\n\n const scalePt2 = (pt: P, vec: P, size: number): P => ({ x: pt.x + vec.x * size, y: pt.y + vec.y * size })\n const vlen = vertices.length\n const flen = faces.length\n\n const getBevelVec = (inPt: P, inPrev: P, inNext: P): P => {\n let vTransX: number\n let vTransY: number\n let shrinkBy: number\n const vPrevX = inPt.x - inPrev.x\n const vPrevY = inPt.y - inPrev.y\n const vNextX = inNext.x - inPt.x\n const vNextY = inNext.y - inPt.y\n const vPrevLensq = vPrevX * vPrevX + vPrevY * vPrevY\n const collinear0 = vPrevX * vNextY - vPrevY * vNextX\n if (Math.abs(collinear0) > Number.EPSILON) {\n const vPrevLen = Math.sqrt(vPrevLensq)\n const vNextLen = Math.sqrt(vNextX * vNextX + vNextY * vNextY)\n const ptPrevShiftX = inPrev.x - vPrevY / vPrevLen\n const ptPrevShiftY = inPrev.y + vPrevX / vPrevLen\n const ptNextShiftX = inNext.x - vNextY / vNextLen\n const ptNextShiftY = inNext.y + vNextX / vNextLen\n const sf = ((ptNextShiftX - ptPrevShiftX) * vNextY - (ptNextShiftY - ptPrevShiftY) * vNextX) / (vPrevX * vNextY - vPrevY * vNextX)\n vTransX = ptPrevShiftX + vPrevX * sf - inPt.x\n vTransY = ptPrevShiftY + vPrevY * sf - inPt.y\n const vTransLensq = vTransX * vTransX + vTransY * vTransY\n if (vTransLensq <= 2) return { x: vTransX, y: vTransY }\n shrinkBy = Math.sqrt(vTransLensq / 2)\n } else {\n let directionEq = false\n if (vPrevX > Number.EPSILON) {\n if (vNextX > Number.EPSILON) directionEq = true\n } else if (vPrevX < -Number.EPSILON) {\n if (vNextX < -Number.EPSILON) directionEq = true\n } else if (Math.sign(vPrevY) === Math.sign(vNextY)) {\n directionEq = true\n }\n if (directionEq) {\n vTransX = -vPrevY\n vTransY = vPrevX\n shrinkBy = Math.sqrt(vPrevLensq)\n } else {\n vTransX = vPrevX\n vTransY = vPrevY\n shrinkBy = Math.sqrt(vPrevLensq / 2)\n }\n }\n return { x: vTransX / shrinkBy, y: vTransY / shrinkBy }\n }\n\n const movements = (ring: readonly P[]): P[] => {\n const out: P[] = []\n for (let i = 0, il = ring.length, j = il - 1, k = i + 1; i < il; i++, j++, k++) {\n if (j === il) j = 0\n if (k === il) k = 0\n out[i] = getBevelVec(ring[i] as P, ring[j] as P, ring[k] as P)\n }\n return out\n }\n const contourMovements = movements(contour)\n const holesMovements: P[][] = []\n let verticesMovements = contourMovements.concat()\n for (const ahole of holes) {\n const oneHoleMovements = movements(ahole)\n holesMovements.push(oneHoleMovements)\n verticesMovements = verticesMovements.concat(oneHoleMovements)\n }\n\n const v = (x: number, y: number, z: number): void => {\n placeholder.push(x)\n placeholder.push(y)\n placeholder.push(z)\n }\n const bevelLayer = (b: number, zOf: (z: number) => number): void => {\n const t = b / bevelSegments\n const z = bevelThickness * Math.cos((t * Math.PI) / 2)\n const bs = bevelSize * Math.sin((t * Math.PI) / 2) + bevelOffset\n for (let i = 0; i < contour.length; i++) {\n const vert = scalePt2(contour[i] as P, contourMovements[i] as P, bs)\n v(vert.x, vert.y, zOf(z))\n }\n for (let h = 0; h < holes.length; h++) {\n const ahole = holes[h] as P[]\n const oneHoleMovements = holesMovements[h] as P[]\n for (let i = 0; i < ahole.length; i++) {\n const vert = scalePt2(ahole[i] as P, oneHoleMovements[i] as P, bs)\n v(vert.x, vert.y, zOf(z))\n }\n }\n }\n for (let b = 0; b < bevelSegments; b++) bevelLayer(b, (z) => -z)\n const bs = bevelSize + bevelOffset\n for (let i = 0; i < vlen; i++) {\n const vert = bevelEnabled ? scalePt2(vertices[i] as P, verticesMovements[i] as P, bs) : (vertices[i] as P)\n v(vert.x, vert.y, 0)\n }\n for (let s = 1; s <= steps; s++) {\n for (let i = 0; i < vlen; i++) {\n const vert = bevelEnabled ? scalePt2(vertices[i] as P, verticesMovements[i] as P, bs) : (vertices[i] as P)\n v(vert.x, vert.y, (depth / steps) * s)\n }\n }\n for (let b = bevelSegments - 1; b >= 0; b--) bevelLayer(b, (z) => depth + z)\n\n const addVertex = (index: number): void => {\n verticesArray.push(placeholder[index * 3 + 0] as number)\n verticesArray.push(placeholder[index * 3 + 1] as number)\n verticesArray.push(placeholder[index * 3 + 2] as number)\n }\n const addUV = (x: number, y: number): void => {\n uvArray.push(x)\n uvArray.push(y)\n }\n const at = (index: number, axis: number): number => verticesArray[index * 3 + axis] as number\n const f3 = (a: number, b: number, c: number): void => {\n addVertex(a)\n addVertex(b)\n addVertex(c)\n const nextIndex = verticesArray.length / 3\n for (const index of [nextIndex - 3, nextIndex - 2, nextIndex - 1]) addUV(at(index, 0), at(index, 1))\n }\n const f4 = (a: number, b: number, c: number, d: number): void => {\n addVertex(a)\n addVertex(b)\n addVertex(d)\n addVertex(b)\n addVertex(c)\n addVertex(d)\n const nextIndex = verticesArray.length / 3\n const iA = nextIndex - 6\n const iB = nextIndex - 3\n const iC = nextIndex - 2\n const iD = nextIndex - 1\n const byX = Math.abs(at(iA, 1) - at(iB, 1)) < Math.abs(at(iA, 0) - at(iB, 0))\n const uv = (index: number): [number, number] => [byX ? at(index, 0) : at(index, 1), 1 - at(index, 2)]\n const uvs = [uv(iA), uv(iB), uv(iC), uv(iD)]\n for (const k of [0, 1, 3, 1, 2, 3]) addUV(...(uvs[k] as [number, number]))\n }\n\n // lid faces\n let start = verticesArray.length / 3\n if (bevelEnabled) {\n let offset = 0\n for (let i = 0; i < flen; i++) {\n const face = faces[i] as number[]\n f3((face[2] as number) + offset, (face[1] as number) + offset, (face[0] as number) + offset)\n }\n const layer = steps + bevelSegments * 2\n offset = vlen * layer\n for (let i = 0; i < flen; i++) {\n const face = faces[i] as number[]\n f3((face[0] as number) + offset, (face[1] as number) + offset, (face[2] as number) + offset)\n }\n } else {\n for (let i = 0; i < flen; i++) {\n const face = faces[i] as number[]\n f3(face[2] as number, face[1] as number, face[0] as number)\n }\n for (let i = 0; i < flen; i++) {\n const face = faces[i] as number[]\n f3((face[0] as number) + vlen * steps, (face[1] as number) + vlen * steps, (face[2] as number) + vlen * steps)\n }\n }\n groups.push({ start, count: verticesArray.length / 3 - start, materialIndex: 0 })\n\n // side faces\n start = verticesArray.length / 3\n const sidewalls = (ring: readonly P[], layeroffset: number): void => {\n let i = ring.length\n while (--i >= 0) {\n const j = i\n let k = i - 1\n if (k < 0) k = ring.length - 1\n for (let s = 0, sl = steps + bevelSegments * 2; s < sl; s++) {\n const slen1 = vlen * s\n const slen2 = vlen * (s + 1)\n f4(layeroffset + j + slen1, layeroffset + k + slen1, layeroffset + k + slen2, layeroffset + j + slen2)\n }\n }\n }\n let layeroffset = 0\n sidewalls(contour, layeroffset)\n layeroffset += contour.length\n for (const ahole of holes) {\n sidewalls(ahole, layeroffset)\n layeroffset += ahole.length\n }\n groups.push({ start, count: verticesArray.length / 3 - start, materialIndex: 1 })\n\n const positions = new Float32Array(verticesArray)\n return { type: 'ExtrudeGeometry', parameters, positions, normals: computeVertexNormals(positions), uvs: new Float32Array(uvArray), groups }\n}\n","import { canonicalJson } from '../hash'\nimport type { PrimitiveBuffers, PrimitiveNode } from '../types'\nimport { difference } from './difference'\nimport { computeVertexNormals, extrude } from './extrude'\nimport { box, circle, cone, cylinder, indexArray, lathe, plane, ring, sphere, torus } from './three-generators'\n\nexport { box, circle, cone, cylinder, lathe, plane, ring, sphere, torus } from './three-generators'\nexport { computeVertexNormals, extrude } from './extrude'\nexport { difference } from './difference'\n\n/** How a level of detail changes a primitive. */\nexport interface DetailOptions {\n /** Multiplies the segment counts of round primitives (1 leaves them as given). */\n readonly detail?: number\n /** Floor of the scaled segment counts (default 3). */\n readonly minSegments?: number\n}\n\nconst PARAMETER_KEYS: Readonly<Record<PrimitiveNode['kind'], readonly string[]>> = {\n box: ['size', 'segments'],\n cylinder: ['radiusTop', 'radiusBottom', 'height', 'radialSegments', 'heightSegments', 'openEnded', 'thetaStart', 'thetaLength'],\n cone: ['radius', 'height', 'radialSegments', 'heightSegments', 'openEnded', 'thetaStart', 'thetaLength'],\n sphere: ['radius', 'widthSegments', 'heightSegments', 'phiStart', 'phiLength', 'thetaStart', 'thetaLength'],\n plane: ['width', 'height', 'widthSegments', 'heightSegments'],\n circle: ['radius', 'segments', 'thetaStart', 'thetaLength'],\n ring: ['innerRadius', 'outerRadius', 'thetaSegments', 'phiSegments', 'thetaStart', 'thetaLength'],\n lathe: ['points', 'segments', 'phiStart', 'phiLength'],\n torus: ['radius', 'tube', 'radialSegments', 'tubularSegments', 'arc'],\n extrude: ['shape', 'depth', 'steps', 'bevel'],\n difference: ['size', 'subtract'],\n mesh: ['positions', 'normals', 'uvs', 'indices'],\n}\n\n/** The segment fields `detail` scales, per kind. */\nconst SEGMENT_KEYS: Readonly<Partial<Record<PrimitiveNode['kind'], readonly string[]>>> = {\n cylinder: ['radialSegments'],\n cone: ['radialSegments'],\n sphere: ['widthSegments', 'heightSegments'],\n circle: ['segments'],\n ring: ['thetaSegments'],\n lathe: ['segments'],\n torus: ['radialSegments', 'tubularSegments'],\n}\n/** three's defaults of the segment fields, so a scaled default is scaled from the right number. */\nconst SEGMENT_DEFAULTS: Readonly<Record<string, number>> = { radialSegments: 32, widthSegments: 32, heightSegments: 16, segments: 12, thetaSegments: 32, tubularSegments: 48 }\nconst segmentDefault = (kind: string, key: string): number => (kind === 'circle' && key === 'segments' ? 32 : kind === 'torus' && key === 'radialSegments' ? 12 : (SEGMENT_DEFAULTS[key] as number))\n\n/** The parameters of a primitive node (no transform, colour or name), with the level of detail applied: what its geometry depends on. */\nexport function primitiveParameters(node: PrimitiveNode, options: DetailOptions = {}): Record<string, unknown> {\n const out: Record<string, unknown> = {}\n const source = node as unknown as Record<string, unknown>\n for (const key of PARAMETER_KEYS[node.kind]) if (source[key] !== undefined) out[key] = source[key]\n const detail = options.detail ?? 1\n if (detail !== 1) {\n const floor = options.minSegments ?? 3\n for (const key of SEGMENT_KEYS[node.kind] ?? []) {\n const given = (out[key] as number | undefined) ?? segmentDefault(node.kind, key)\n out[key] = Math.max(floor, Math.round(given * detail))\n }\n }\n return out\n}\n\nfunction mesh(p: Record<string, unknown>): PrimitiveBuffers {\n const positions = new Float32Array(p.positions as number[])\n const indices = p.indices ? indexArray(p.indices as number[]) : undefined\n return {\n type: 'BufferGeometry',\n parameters: {},\n positions,\n normals: p.normals ? new Float32Array(p.normals as number[]) : computeVertexNormals(positions, indices),\n uvs: p.uvs ? new Float32Array(p.uvs as number[]) : new Float32Array((positions.length / 3) * 2),\n ...(indices ? { indices } : {}),\n groups: [],\n }\n}\n\nfunction make(kind: PrimitiveNode['kind'], p: Record<string, any>): PrimitiveBuffers {\n switch (kind) {\n case 'box': {\n const size = (p.size ?? [1, 1, 1]) as number[]\n const segments = (p.segments ?? [1, 1, 1]) as number[]\n return box(size[0], size[1], size[2], segments[0], segments[1], segments[2])\n }\n case 'cylinder':\n return cylinder(p.radiusTop, p.radiusBottom, p.height, p.radialSegments, p.heightSegments, p.openEnded, p.thetaStart, p.thetaLength)\n case 'cone':\n return cone(p.radius, p.height, p.radialSegments, p.heightSegments, p.openEnded, p.thetaStart, p.thetaLength)\n case 'sphere':\n return sphere(p.radius, p.widthSegments, p.heightSegments, p.phiStart, p.phiLength, p.thetaStart, p.thetaLength)\n case 'plane':\n return plane(p.width, p.height, p.widthSegments, p.heightSegments)\n case 'circle':\n return circle(p.radius, p.segments, p.thetaStart, p.thetaLength)\n case 'ring':\n return ring(p.innerRadius, p.outerRadius, p.thetaSegments, p.phiSegments, p.thetaStart, p.thetaLength)\n case 'lathe':\n return lathe(p.points, p.segments, p.phiStart, p.phiLength)\n case 'torus':\n return torus(p.radius, p.tube, p.radialSegments, p.tubularSegments, p.arc)\n case 'extrude':\n return extrude(p.shape, p.depth, p.steps, p.bevel)\n case 'difference':\n return difference(p.size, p.subtract ?? [])\n case 'mesh':\n return mesh(p)\n default:\n throw new Error(`game-shapes: unknown primitive kind \"${String(kind)}\"`)\n }\n}\n\n/** Templates by their parameter text: the same cylinder is generated once per process. Read-only by contract. */\nconst templates = new Map<string, PrimitiveBuffers>()\nlet templateLimit = 4096\nconst stats = { hits: 0, misses: 0 }\n\n/** Sets how many primitive templates are kept (least recently used out; 0 turns the cache off). */\nexport function setTemplateCacheSize(size: number): void {\n templateLimit = Math.max(0, Math.floor(size))\n while (templates.size > templateLimit) templates.delete(templates.keys().next().value as string)\n}\nexport function clearTemplateCache(): void {\n templates.clear()\n stats.hits = 0\n stats.misses = 0\n}\nexport const templateCacheStats = (): { size: number; hits: number; misses: number } => ({ size: templates.size, ...stats })\n\n/**\n * The geometry of one primitive on its own, not baked: the arrays three's generator of the same kind builds, bit for bit (meshes and differences\n * are `BufferGeometry`). The result comes from a shared template cache and must not be written to (copy it with `clonePrimitive`).\n */\nexport function buildPrimitive(node: PrimitiveNode, options: DetailOptions = {}): PrimitiveBuffers {\n const parameters = primitiveParameters(node, options)\n // raw meshes are not worth a key of their whole arrays; they are cheap to wrap\n if (node.kind === 'mesh' || templateLimit === 0) return make(node.kind, parameters)\n const key = `${node.kind}:${canonicalJson(parameters)}`\n const cached = templates.get(key)\n if (cached) {\n stats.hits++\n templates.delete(key)\n templates.set(key, cached)\n return cached\n }\n stats.misses++\n const built = make(node.kind, parameters)\n templates.set(key, built)\n if (templates.size > templateLimit) templates.delete(templates.keys().next().value as string)\n return built\n}\n\n/** A copy that owns its arrays. */\nexport function clonePrimitive(p: PrimitiveBuffers): PrimitiveBuffers {\n return {\n type: p.type,\n parameters: p.parameters,\n positions: p.positions.slice(),\n normals: p.normals.slice(),\n uvs: p.uvs.slice(),\n ...(p.indices ? { indices: p.indices.slice() } : {}),\n groups: p.groups.map((group) => ({ ...group })),\n }\n}\n","import { hash64 } from './hash'\n\n/** mulberry32: a small, fast 32-bit seeded stream in [0, 1). */\nexport function mulberry32(seed: number): () => number {\n let state = seed >>> 0\n return () => {\n state = (state + 0x6d2b79f5) >>> 0\n let t = state\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 }\n}\n\n/** The stream of one node: its own per (seed, generator, path), so adding a node never shifts another node's draws. */\nexport const streamFor = (seed: number | string, generator: string, path: string): (() => number) =>\n mulberry32(parseInt(hash64(`${String(seed)}\\u0000${generator}\\u0000${path}`).slice(0, 8), 16))\n","import type { ShapeGenerator } from './types'\n\nconst GENERATOR_NAME = /^[a-zA-Z][\\w.:-]*$/\n\n/** The generators of one set: what `{ kind: 'custom', generator: name, params }` nodes look up. */\nexport interface ShapeGenerators {\n /**\n * Registers a generator: a pure function of its params and a seeded stream that returns a node. A worker that generates shapes with custom nodes must\n * register the same generators (import the same module in the worker script).\n */\n register(name: string, generator: ShapeGenerator): void\n unregister(name: string): boolean\n get(name: string): ShapeGenerator | undefined\n list(): string[]\n /** The generators by name, as `GenerateOptions.generators` takes them. */\n record(): Readonly<Record<string, ShapeGenerator>>\n}\n\nexport const generatorsOver = (generators: Map<string, ShapeGenerator>): ShapeGenerators => ({\n register(name, generator) {\n if (!GENERATOR_NAME.test(name)) throw new Error(`game-shapes: generator name \"${name}\" must start with a letter and use letters, digits, \".\", \":\", \"-\" or \"_\"`)\n generators.set(name, generator)\n },\n unregister: (name) => generators.delete(name),\n get: (name) => generators.get(name),\n list: () => [...generators.keys()].sort(),\n record: () => Object.fromEntries(generators),\n})\n\nlet defaultGenerators: ShapeGenerators | undefined\n\n/** The set behind `registerGenerator`, `getGenerator` and the rest of the global functions, created on first use. */\nexport const defaultShapeGenerators = (): ShapeGenerators => (defaultGenerators ??= generatorsOver(new Map()))\n\n/** @deprecated use `createShapes(...).register`. */\nexport const registerGenerator = (name: string, generator: ShapeGenerator): void => defaultShapeGenerators().register(name, generator)\n/** @deprecated use `createShapes(...).unregister`. */\nexport const unregisterGenerator = (name: string): boolean => defaultShapeGenerators().unregister(name)\n/** @deprecated use `createShapes(...).get`. */\nexport const getGenerator = (name: string): ShapeGenerator | undefined => defaultShapeGenerators().get(name)\n/** @deprecated use `createShapes(...).list`. */\nexport const listGenerators = (): string[] => defaultShapeGenerators().list()\n","{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://github.com/Andersonfrfilho/adatechnology-game-kit/packages/game-shapes/schema/shape.schema.json\",\n \"title\": \"game-shapes shape\",\n \"type\": \"object\",\n \"required\": [\n \"version\",\n \"root\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"version\": {\n \"const\": 1\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"materials\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"$ref\": \"#/$defs/material\"\n }\n },\n \"root\": {\n \"$ref\": \"#/$defs/node\"\n },\n \"lod\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/lodLevel\"\n }\n },\n \"cullDistance\": {\n \"type\": \"number\",\n \"exclusiveMinimum\": 0\n }\n },\n \"$defs\": {\n \"number\": {\n \"type\": \"number\"\n },\n \"count\": {\n \"type\": \"integer\",\n \"minimum\": 0\n },\n \"vec2\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"number\"\n },\n \"minItems\": 2,\n \"maxItems\": 2\n },\n \"vec3\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"number\"\n },\n \"minItems\": 3,\n \"maxItems\": 3\n },\n \"mat4\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"number\"\n },\n \"minItems\": 16,\n \"maxItems\": 16\n },\n \"color\": {\n \"oneOf\": [\n {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"maximum\": 16777215\n },\n {\n \"type\": \"string\",\n \"pattern\": \"^#[0-9a-fA-F]{6}$\"\n }\n ]\n },\n \"uvRect\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"u0\",\n \"v0\",\n \"u1\",\n \"v1\"\n ],\n \"properties\": {\n \"u0\": {\n \"type\": \"number\"\n },\n \"v0\": {\n \"type\": \"number\"\n },\n \"u1\": {\n \"type\": \"number\"\n },\n \"v1\": {\n \"type\": \"number\"\n }\n }\n },\n \"rotationOrder\": {\n \"enum\": [\n \"XYZ\",\n \"YXZ\",\n \"ZXY\",\n \"ZYX\",\n \"YZX\",\n \"XZY\"\n ]\n },\n \"transform\": {\n \"type\": \"object\",\n \"properties\": {\n \"position\": {\n \"$ref\": \"#/$defs/vec3\"\n },\n \"rotation\": {\n \"$ref\": \"#/$defs/vec3\"\n },\n \"rotationOrder\": {\n \"$ref\": \"#/$defs/rotationOrder\"\n },\n \"scale\": {\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"$ref\": \"#/$defs/vec3\"\n }\n ]\n },\n \"heading\": {\n \"type\": \"number\"\n },\n \"matrix\": {\n \"$ref\": \"#/$defs/mat4\"\n }\n }\n },\n \"instance\": {\n \"allOf\": [\n {\n \"$ref\": \"#/$defs/transform\"\n }\n ],\n \"properties\": {\n \"position\": true,\n \"rotation\": true,\n \"rotationOrder\": true,\n \"scale\": true,\n \"heading\": true,\n \"matrix\": true,\n \"color\": {\n \"$ref\": \"#/$defs/color\"\n }\n },\n \"unevaluatedProperties\": false\n },\n \"material\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"color\": {\n \"$ref\": \"#/$defs/color\"\n },\n \"roughness\": {\n \"type\": \"number\",\n \"minimum\": 0,\n \"maximum\": 1\n },\n \"metalness\": {\n \"type\": \"number\",\n \"minimum\": 0,\n \"maximum\": 1\n },\n \"opacity\": {\n \"type\": \"number\",\n \"minimum\": 0,\n \"maximum\": 1\n },\n \"transparent\": {\n \"type\": \"boolean\"\n },\n \"emissive\": {\n \"$ref\": \"#/$defs/color\"\n },\n \"emissiveIntensity\": {\n \"type\": \"number\",\n \"minimum\": 0\n },\n \"side\": {\n \"enum\": [\n \"front\",\n \"back\",\n \"double\"\n ]\n },\n \"flatShading\": {\n \"type\": \"boolean\"\n },\n \"vertexColors\": {\n \"type\": \"boolean\"\n },\n \"depthWrite\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"lodLevel\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\n \"distance\",\n \"detail\"\n ],\n \"properties\": {\n \"distance\": {\n \"type\": \"number\",\n \"minimum\": 0\n },\n \"detail\": {\n \"type\": \"number\",\n \"exclusiveMinimum\": 0,\n \"maximum\": 1\n },\n \"minSize\": {\n \"type\": \"number\",\n \"minimum\": 0\n },\n \"minSegments\": {\n \"type\": \"integer\",\n \"minimum\": 3\n }\n }\n },\n \"common\": {\n \"allOf\": [\n {\n \"$ref\": \"#/$defs/transform\"\n }\n ],\n \"properties\": {\n \"kind\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"part\": {\n \"type\": \"string\"\n },\n \"material\": {\n \"type\": \"string\"\n },\n \"color\": {\n \"$ref\": \"#/$defs/color\"\n },\n \"uv\": {\n \"$ref\": \"#/$defs/uvRect\"\n },\n \"instances\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/instance\"\n }\n },\n \"minDetail\": {\n \"type\": \"number\",\n \"exclusiveMinimum\": 0,\n \"maximum\": 1\n },\n \"tags\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n }\n }\n },\n \"node\": {\n \"type\": \"object\",\n \"required\": [\n \"kind\"\n ],\n \"allOf\": [\n {\n \"$ref\": \"#/$defs/common\"\n }\n ],\n \"oneOf\": [\n {\n \"properties\": {\n \"kind\": {\n \"const\": \"group\"\n },\n \"children\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/node\"\n }\n }\n }\n },\n {\n \"properties\": {\n \"kind\": {\n \"const\": \"box\"\n },\n \"size\": {\n \"$ref\": \"#/$defs/vec3\"\n },\n \"segments\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"integer\",\n \"minimum\": 1\n },\n \"minItems\": 3,\n \"maxItems\": 3\n }\n }\n },\n {\n \"properties\": {\n \"kind\": {\n \"const\": \"cylinder\"\n },\n \"radiusTop\": {\n \"type\": \"number\"\n },\n \"radiusBottom\": {\n \"type\": \"number\"\n },\n \"height\": {\n \"type\": \"number\"\n },\n \"radialSegments\": {\n \"type\": \"integer\",\n \"minimum\": 1\n },\n \"heightSegments\": {\n \"type\": \"integer\",\n \"minimum\": 1\n },\n \"openEnded\": {\n \"type\": \"boolean\"\n },\n \"thetaStart\": {\n \"type\": \"number\"\n },\n \"thetaLength\": {\n \"type\": \"number\"\n }\n }\n },\n {\n \"properties\": {\n \"kind\": {\n \"const\": \"cone\"\n },\n \"radius\": {\n \"type\": \"number\"\n },\n \"height\": {\n \"type\": \"number\"\n },\n \"radialSegments\": {\n \"type\": \"integer\",\n \"minimum\": 1\n },\n \"heightSegments\": {\n \"type\": \"integer\",\n \"minimum\": 1\n },\n \"openEnded\": {\n \"type\": \"boolean\"\n },\n \"thetaStart\": {\n \"type\": \"number\"\n },\n \"thetaLength\": {\n \"type\": \"number\"\n }\n }\n },\n {\n \"properties\": {\n \"kind\": {\n \"const\": \"sphere\"\n },\n \"radius\": {\n \"type\": \"number\"\n },\n \"widthSegments\": {\n \"type\": \"integer\",\n \"minimum\": 3\n },\n \"heightSegments\": {\n \"type\": \"integer\",\n \"minimum\": 2\n },\n \"phiStart\": {\n \"type\": \"number\"\n },\n \"phiLength\": {\n \"type\": \"number\"\n },\n \"thetaStart\": {\n \"type\": \"number\"\n },\n \"thetaLength\": {\n \"type\": \"number\"\n }\n }\n },\n {\n \"properties\": {\n \"kind\": {\n \"const\": \"plane\"\n },\n \"width\": {\n \"type\": \"number\"\n },\n \"height\": {\n \"type\": \"number\"\n },\n \"widthSegments\": {\n \"type\": \"integer\",\n \"minimum\": 1\n },\n \"heightSegments\": {\n \"type\": \"integer\",\n \"minimum\": 1\n }\n }\n },\n {\n \"properties\": {\n \"kind\": {\n \"const\": \"circle\"\n },\n \"radius\": {\n \"type\": \"number\"\n },\n \"segments\": {\n \"type\": \"integer\",\n \"minimum\": 3\n },\n \"thetaStart\": {\n \"type\": \"number\"\n },\n \"thetaLength\": {\n \"type\": \"number\"\n }\n }\n },\n {\n \"properties\": {\n \"kind\": {\n \"const\": \"ring\"\n },\n \"innerRadius\": {\n \"type\": \"number\"\n },\n \"outerRadius\": {\n \"type\": \"number\"\n },\n \"thetaSegments\": {\n \"type\": \"integer\",\n \"minimum\": 3\n },\n \"phiSegments\": {\n \"type\": \"integer\",\n \"minimum\": 1\n },\n \"thetaStart\": {\n \"type\": \"number\"\n },\n \"thetaLength\": {\n \"type\": \"number\"\n }\n }\n },\n {\n \"required\": [\n \"points\"\n ],\n \"properties\": {\n \"kind\": {\n \"const\": \"lathe\"\n },\n \"points\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/vec2\"\n },\n \"minItems\": 2\n },\n \"segments\": {\n \"type\": \"integer\",\n \"minimum\": 1\n },\n \"phiStart\": {\n \"type\": \"number\"\n },\n \"phiLength\": {\n \"type\": \"number\"\n }\n }\n },\n {\n \"properties\": {\n \"kind\": {\n \"const\": \"torus\"\n },\n \"radius\": {\n \"type\": \"number\"\n },\n \"tube\": {\n \"type\": \"number\"\n },\n \"radialSegments\": {\n \"type\": \"integer\",\n \"minimum\": 1\n },\n \"tubularSegments\": {\n \"type\": \"integer\",\n \"minimum\": 1\n },\n \"arc\": {\n \"type\": \"number\"\n }\n }\n },\n {\n \"required\": [\n \"shape\"\n ],\n \"properties\": {\n \"kind\": {\n \"const\": \"extrude\"\n },\n \"shape\": {\n \"type\": \"object\",\n \"required\": [\n \"outer\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"outer\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/vec2\"\n },\n \"minItems\": 3\n },\n \"holes\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/vec2\"\n },\n \"minItems\": 3\n }\n }\n }\n },\n \"depth\": {\n \"type\": \"number\"\n },\n \"steps\": {\n \"type\": \"integer\",\n \"minimum\": 1\n },\n \"bevel\": {\n \"oneOf\": [\n {\n \"const\": false\n },\n {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"thickness\": {\n \"type\": \"number\"\n },\n \"size\": {\n \"type\": \"number\"\n },\n \"offset\": {\n \"type\": \"number\"\n },\n \"segments\": {\n \"type\": \"integer\",\n \"minimum\": 1\n }\n }\n }\n ]\n }\n }\n },\n {\n \"required\": [\n \"size\",\n \"subtract\"\n ],\n \"properties\": {\n \"kind\": {\n \"const\": \"difference\"\n },\n \"size\": {\n \"$ref\": \"#/$defs/vec3\"\n },\n \"subtract\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"required\": [\n \"min\",\n \"max\"\n ],\n \"additionalProperties\": false,\n \"properties\": {\n \"min\": {\n \"$ref\": \"#/$defs/vec2\"\n },\n \"max\": {\n \"$ref\": \"#/$defs/vec2\"\n }\n }\n }\n }\n }\n },\n {\n \"required\": [\n \"positions\"\n ],\n \"properties\": {\n \"kind\": {\n \"const\": \"mesh\"\n },\n \"positions\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"number\"\n }\n },\n \"normals\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"number\"\n }\n },\n \"uvs\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"number\"\n }\n },\n \"indices\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/$defs/count\"\n }\n }\n }\n },\n {\n \"properties\": {\n \"kind\": {\n \"const\": \"point\"\n },\n \"data\": {}\n }\n },\n {\n \"required\": [\n \"generator\"\n ],\n \"properties\": {\n \"kind\": {\n \"const\": \"custom\"\n },\n \"generator\": {\n \"type\": \"string\"\n },\n \"params\": {}\n }\n }\n ]\n }\n }\n}\n","import schemaJson from '../schema/shape.schema.json'\nimport type { ShapeSchema } from './types'\n\n/** The JSON Schema (draft 2020-12) of a shape document; the same file ships as `@adatechnology/game-shapes/schema.json`. */\nexport const SHAPE_SCHEMA: Readonly<Record<string, unknown>> = schemaJson\n\ntype Check = (value: unknown) => string | null\n\nconst num: Check = (v) => (typeof v === 'number' && Number.isFinite(v) ? null : 'expected a finite number')\nconst bool: Check = (v) => (typeof v === 'boolean' ? null : 'expected a boolean')\nconst str: Check = (v) => (typeof v === 'string' ? null : 'expected a string')\nconst int = (min: number): Check => (v) => (typeof v === 'number' && Number.isInteger(v) && v >= min ? null : `expected an integer >= ${min}`)\nconst range = (lo: number, hi: number, loOpen = false): Check => (v) =>\n typeof v === 'number' && (loOpen ? v > lo : v >= lo) && v <= hi ? null : `expected a number in ${loOpen ? '(' : '['}${lo}, ${hi}]`\nconst tuple = (n: number, item: Check = num): Check => (v) => {\n if (!Array.isArray(v) || v.length !== n) return `expected an array of ${n}`\n for (const x of v) if (item(x)) return `expected an array of ${n} numbers`\n return null\n}\nconst list = (item: Check, min = 0): Check => (v) => {\n if (!Array.isArray(v)) return 'expected an array'\n if (v.length < min) return `expected at least ${min} items`\n for (let i = 0; i < v.length; i++) {\n const e = item(v[i])\n if (e) return `[${i}]: ${e}`\n }\n return null\n}\nconst color: Check = (v) =>\n (typeof v === 'number' && Number.isInteger(v) && v >= 0 && v <= 0xffffff) || (typeof v === 'string' && /^#[0-9a-fA-F]{6}$/.test(v)) ? null : 'expected 0xRRGGBB or \"#rrggbb\"'\nconst oneOf = (values: readonly unknown[]): Check => (v) => (values.includes(v) ? null : `expected one of ${values.map((x) => JSON.stringify(x)).join(', ')}`)\nconst object = (fields: Readonly<Record<string, Check>>, required: readonly string[] = []): Check => (v) => {\n if (!v || typeof v !== 'object' || Array.isArray(v)) return 'expected an object'\n const record = v as Record<string, unknown>\n for (const key of required) if (record[key] === undefined) return `${key}: required`\n for (const key of Object.keys(record)) {\n if (record[key] === undefined) continue\n const check = fields[key]\n if (!check) return `${key}: unknown field`\n const e = check(record[key])\n if (e) return `${key}: ${e}`\n }\n return null\n}\n\nconst ORDERS = ['XYZ', 'YXZ', 'ZXY', 'ZYX', 'YZX', 'XZY'] as const\nconst TRANSFORM: Record<string, Check> = {\n position: tuple(3),\n rotation: tuple(3),\n rotationOrder: oneOf(ORDERS),\n scale: (v) => (typeof v === 'number' ? num(v) : tuple(3)(v)),\n heading: num,\n matrix: tuple(16),\n}\nconst UV = object({ u0: num, v0: num, u1: num, v1: num }, ['u0', 'v0', 'u1', 'v1'])\nconst INSTANCE = object({ ...TRANSFORM, color })\nconst COMMON: Record<string, Check> = {\n ...TRANSFORM,\n kind: str,\n name: str,\n part: str,\n material: str,\n color,\n uv: UV,\n instances: list(INSTANCE),\n minDetail: range(0, 1, true),\n tags: list(str),\n}\nconst vec2 = tuple(2)\nconst BEVEL: Check = (v) => (v === false ? null : object({ thickness: num, size: num, offset: num, segments: int(1) })(v))\nconst KINDS: Readonly<Record<string, { fields: Record<string, Check>; required?: string[] }>> = {\n group: { fields: {} },\n box: { fields: { size: tuple(3), segments: tuple(3, int(1)) } },\n cylinder: { fields: { radiusTop: num, radiusBottom: num, height: num, radialSegments: int(1), heightSegments: int(1), openEnded: bool, thetaStart: num, thetaLength: num } },\n cone: { fields: { radius: num, height: num, radialSegments: int(1), heightSegments: int(1), openEnded: bool, thetaStart: num, thetaLength: num } },\n sphere: { fields: { radius: num, widthSegments: int(3), heightSegments: int(2), phiStart: num, phiLength: num, thetaStart: num, thetaLength: num } },\n plane: { fields: { width: num, height: num, widthSegments: int(1), heightSegments: int(1) } },\n circle: { fields: { radius: num, segments: int(3), thetaStart: num, thetaLength: num } },\n ring: { fields: { innerRadius: num, outerRadius: num, thetaSegments: int(3), phiSegments: int(1), thetaStart: num, thetaLength: num } },\n lathe: { fields: { points: list(vec2, 2), segments: int(1), phiStart: num, phiLength: num }, required: ['points'] },\n torus: { fields: { radius: num, tube: num, radialSegments: int(1), tubularSegments: int(1), arc: num } },\n extrude: {\n fields: { shape: object({ outer: list(vec2, 3), holes: list(list(vec2, 3)) }, ['outer']), depth: num, steps: int(1), bevel: BEVEL },\n required: ['shape'],\n },\n difference: { fields: { size: tuple(3), subtract: list(object({ min: vec2, max: vec2 }, ['min', 'max'])) }, required: ['size', 'subtract'] },\n mesh: {\n fields: {\n positions: (v) => list(num)(v) ?? ((v as unknown[]).length % 3 === 0 ? null : 'expected a multiple of 3 numbers'),\n normals: list(num),\n uvs: list(num),\n indices: list(int(0)),\n },\n required: ['positions'],\n },\n point: { fields: { data: () => null } },\n custom: { fields: { generator: str, params: () => null }, required: ['generator'] },\n}\n\nfunction validateNode(node: unknown, path: string, errors: string[]): void {\n if (!node || typeof node !== 'object' || Array.isArray(node)) {\n errors.push(`${path}: expected a node object`)\n return\n }\n const record = node as Record<string, unknown>\n const spec = typeof record.kind === 'string' ? KINDS[record.kind] : undefined\n if (!spec) {\n errors.push(`${path}.kind: expected one of ${Object.keys(KINDS).join(', ')}`)\n return\n }\n for (const key of spec.required ?? []) if (record[key] === undefined) errors.push(`${path}.${key}: required`)\n for (const key of Object.keys(record)) {\n if (record[key] === undefined || key === 'children') continue\n const check = spec.fields[key] ?? COMMON[key]\n if (!check) {\n errors.push(`${path}.${key}: unknown field for a ${String(record.kind)}`)\n continue\n }\n const e = check(record[key])\n if (e) errors.push(`${path}.${key}: ${e}`)\n }\n const exclusive = ['matrix', 'heading'].filter((key) => record[key] !== undefined)\n if (record.matrix !== undefined && (record.position !== undefined || record.rotation !== undefined || record.scale !== undefined || record.heading !== undefined))\n errors.push(`${path}.matrix: cannot be combined with position, rotation, scale or heading`)\n else if (exclusive.includes('heading') && (record.rotation !== undefined || record.scale !== undefined)) errors.push(`${path}.heading: cannot be combined with rotation or scale`)\n if (record.children !== undefined) {\n if (record.kind !== 'group') errors.push(`${path}.children: only a group has children`)\n else if (!Array.isArray(record.children)) errors.push(`${path}.children: expected an array`)\n else record.children.forEach((child, index) => validateNode(child, `${path}.children[${index}]`, errors))\n }\n}\n\n/** Every rule of the JSON Schema, checked without a schema engine: one message per problem, with its path (`root.children[3].radialSegments: ...`). */\nexport function validateShape(schema: unknown): string[] {\n const errors: string[] = []\n if (!schema || typeof schema !== 'object' || Array.isArray(schema)) return ['expected a shape object']\n const record = schema as Record<string, unknown>\n for (const key of Object.keys(record)) if (!['version', 'name', 'materials', 'root', 'lod', 'cullDistance'].includes(key) && record[key] !== undefined) errors.push(`${key}: unknown field`)\n if (record.version !== 1) errors.push('version: expected 1')\n if (record.name !== undefined && typeof record.name !== 'string') errors.push('name: expected a string')\n if (record.materials !== undefined) {\n if (!record.materials || typeof record.materials !== 'object' || Array.isArray(record.materials)) errors.push('materials: expected an object')\n else {\n const material = object({\n color,\n roughness: range(0, 1),\n metalness: range(0, 1),\n opacity: range(0, 1),\n transparent: bool,\n emissive: color,\n emissiveIntensity: (v) => (typeof v === 'number' && v >= 0 ? null : 'expected a number >= 0'),\n side: oneOf(['front', 'back', 'double']),\n flatShading: bool,\n vertexColors: bool,\n depthWrite: bool,\n })\n for (const [id, hint] of Object.entries(record.materials)) {\n const e = material(hint)\n if (e) errors.push(`materials.${id}: ${e}`)\n }\n }\n }\n if (record.lod !== undefined) {\n const e = list(object({ distance: (v) => (typeof v === 'number' && v >= 0 ? null : 'expected a number >= 0'), detail: range(0, 1, true), minSize: (v) => (typeof v === 'number' && v >= 0 ? null : 'expected a number >= 0'), minSegments: int(3) }, ['distance', 'detail']))(record.lod)\n if (e) errors.push(`lod${e.startsWith('[') ? '' : ': '}${e}`)\n }\n if (record.cullDistance !== undefined && !(typeof record.cullDistance === 'number' && record.cullDistance > 0)) errors.push('cullDistance: expected a number > 0')\n if (record.root === undefined) errors.push('root: required')\n else validateNode(record.root, 'root', errors)\n return errors\n}\n\n/** Throws with every problem when the schema is not valid. */\nexport function assertValidShape(schema: unknown): asserts schema is ShapeSchema {\n const errors = validateShape(schema)\n if (errors.length) throw new Error(`game-shapes: invalid shape\\n ${errors.slice(0, 20).join('\\n ')}${errors.length > 20 ? `\\n ... ${errors.length - 20} more` : ''}`)\n}\n","import { colorChannels, colorHex } from './color'\nimport { hashValue } from './hash'\nimport { asMat4, identity4, isAffine, matrixOf, multiply, normalMatrix, transformPoint } from './math'\nimport type { Matrix4 } from './math'\nimport { buildPrimitive, primitiveParameters } from './primitives'\nimport { canonicalJson } from './hash'\nimport { streamFor } from './random'\nimport { getGenerator } from './registry'\nimport { assertValidShape } from './schema'\nimport type {\n Bounds,\n GenerateOptions,\n InstancedBatch,\n NamedRange,\n PrimitiveBuffers,\n PrimitiveNode,\n ShapeBatch,\n ShapeBuffers,\n ShapeLevel,\n ShapeNode,\n ShapePart,\n ShapePoint,\n ShapeSchema,\n UvRect,\n} from './types'\n\nconst PRIMITIVE_KINDS = new Set(['box', 'cylinder', 'cone', 'sphere', 'plane', 'circle', 'ring', 'lathe', 'torus', 'extrude', 'difference', 'mesh'])\nexport const isPrimitiveNode = (node: ShapeNode): node is PrimitiveNode => PRIMITIVE_KINDS.has(node.kind)\n\n/** The options that change the output, as they enter the cache key. */\nexport function keyOptions(options: GenerateOptions = {}): Record<string, unknown> {\n return {\n seed: options.seed ?? 0,\n colors: options.colors ?? 'linear',\n indexed: options.indexed ?? true,\n materials: options.materials,\n fallbackMaterial: options.fallbackMaterial,\n materialAlias: options.materialAlias,\n instancing: options.instancing,\n levels: options.levels,\n }\n}\n\n/** The cache key of a shape under some options: 64-bit FNV-1a of the canonical schema text and the options that change the output. */\nexport const shapeKey = (schema: ShapeSchema, options: GenerateOptions = {}): string => hashValue({ schema, options: keyOptions(options) })\n\nconst IDENTITY_UV: UvRect = { u0: 0, v0: 0, u1: 1, v1: 1 }\n\nclass FloatList {\n array: Float32Array\n length = 0\n constructor(capacity = 256) {\n this.array = new Float32Array(capacity)\n }\n reserve(extra: number): void {\n if (this.length + extra <= this.array.length) return\n let capacity = this.array.length * 2\n while (capacity < this.length + extra) capacity *= 2\n const next = new Float32Array(capacity)\n next.set(this.array.subarray(0, this.length))\n this.array = next\n }\n done(): Float32Array {\n return this.array.slice(0, this.length)\n }\n}\nclass IndexList {\n array: Uint32Array\n length = 0\n constructor(capacity = 256) {\n this.array = new Uint32Array(capacity)\n }\n reserve(extra: number): void {\n if (this.length + extra <= this.array.length) return\n let capacity = this.array.length * 2\n while (capacity < this.length + extra) capacity *= 2\n const next = new Uint32Array(capacity)\n next.set(this.array.subarray(0, this.length))\n this.array = next\n }\n}\n\n/** Growing buffers of one (target, material). */\nclass Accumulator {\n readonly positions = new FloatList()\n readonly normals = new FloatList()\n readonly uvs = new FloatList(170)\n readonly colors = new FloatList()\n readonly indices = new IndexList()\n readonly ranges: NamedRange[] = []\n vertices = 0\n constructor(\n readonly material: string,\n readonly part: string | null,\n ) {}\n}\n\ninterface Target {\n readonly part: string | null\n readonly accs: Map<string, Accumulator>\n}\n\ninterface Settings {\n readonly colors: 'linear' | 'srgb' | 'none'\n readonly indexed: boolean\n readonly materials?: ReadonlySet<string>\n readonly fallback?: string\n readonly alias?: Readonly<Record<string, string>>\n readonly seed: number | string\n readonly generators?: GenerateOptions['generators']\n readonly isolatedGenerators?: boolean\n readonly autoMin?: number\n}\n\ninterface LevelSpec {\n readonly distance: number\n readonly detail: number\n readonly minSize?: number\n readonly minSegments?: number\n readonly index: number\n}\n\ninterface Inherited {\n readonly material: string\n readonly color: number\n readonly uv: UvRect\n readonly target: Target\n}\n\n/**\n * Bakes a template into an accumulator: positions by the world matrix, normals by its normal matrix and normalised, uvs into the atlas cell,\n * one colour for all, indices offset. The arithmetic is three's (`createMeshApi`, `BufferGeometry.applyMatrix4`), so the bits match.\n */\nfunction bake(acc: Accumulator, t: PrimitiveBuffers, world: readonly number[], rgb: readonly number[] | null, u: UvRect, indexed: boolean): void {\n const e = world\n const nm = normalMatrix(world)\n const affine = isAffine(world)\n const source = t.positions\n const count = source.length / 3\n const order: ArrayLike<number> | null = indexed ? null : t.indices ?? null\n const emitted = order ? order.length : count\n acc.positions.reserve(emitted * 3)\n acc.normals.reserve(emitted * 3)\n acc.uvs.reserve(emitted * 2)\n if (rgb) acc.colors.reserve(emitted * 3)\n const P = acc.positions.array\n const N = acc.normals.array\n const U = acc.uvs.array\n const C = acc.colors.array\n let pi = acc.positions.length\n let ni = acc.normals.length\n let ui = acc.uvs.length\n let ci = acc.colors.length\n const du = u.u1 - u.u0\n const dv = u.v1 - u.v0\n const tn = t.normals\n const tu = t.uvs\n for (let k = 0; k < emitted; k++) {\n const i = order ? (order[k] as number) : k\n const x = source[i * 3] as number\n const y = source[i * 3 + 1] as number\n const z = source[i * 3 + 2] as number\n if (affine) {\n P[pi++] = e[0]! * x + e[4]! * y + e[8]! * z + e[12]!\n P[pi++] = e[1]! * x + e[5]! * y + e[9]! * z + e[13]!\n P[pi++] = e[2]! * x + e[6]! * y + e[10]! * z + e[14]!\n } else {\n const p = transformPoint(e, x, y, z)\n P[pi++] = p[0]\n P[pi++] = p[1]\n P[pi++] = p[2]\n }\n const nx = tn[i * 3] as number\n const ny = tn[i * 3 + 1] as number\n const nz = tn[i * 3 + 2] as number\n const vx = nm[0]! * nx + nm[3]! * ny + nm[6]! * nz\n const vy = nm[1]! * nx + nm[4]! * ny + nm[7]! * nz\n const vz = nm[2]! * nx + nm[5]! * ny + nm[8]! * nz\n const s = 1 / (Math.sqrt(vx * vx + vy * vy + vz * vz) || 1)\n N[ni++] = vx * s\n N[ni++] = vy * s\n N[ni++] = vz * s\n U[ui++] = u.u0 + (tu[i * 2] as number) * du\n U[ui++] = u.v0 + (tu[i * 2 + 1] as number) * dv\n if (rgb) {\n C[ci++] = rgb[0]!\n C[ci++] = rgb[1]!\n C[ci++] = rgb[2]!\n }\n }\n acc.positions.length = pi\n acc.normals.length = ni\n acc.uvs.length = ui\n acc.colors.length = ci\n if (indexed) {\n const base = acc.vertices\n const idx = t.indices\n const n = idx ? idx.length : count\n acc.indices.reserve(n)\n const I = acc.indices.array\n let ii = acc.indices.length\n for (let k = 0; k < n; k++) I[ii++] = base + (idx ? (idx[k] as number) : k)\n acc.indices.length = ii\n }\n acc.vertices += emitted\n}\n\nfunction boundsOf(positions: Float32Array): Bounds {\n const min: [number, number, number] = [Infinity, Infinity, Infinity]\n const max: [number, number, number] = [-Infinity, -Infinity, -Infinity]\n for (let i = 0; i < positions.length; i += 3) {\n for (let axis = 0; axis < 3; axis++) {\n const v = positions[i + axis] as number\n if (v < min[axis]!) min[axis] = v\n if (v > max[axis]!) max[axis] = v\n }\n }\n return { min, max }\n}\n\nfunction finish(acc: Accumulator, indexed: boolean, withColors: boolean): ShapeBatch {\n const positions = acc.positions.done()\n const indices = indexed ? (acc.vertices > 65535 ? acc.indices.array.slice(0, acc.indices.length) : Uint16Array.from(acc.indices.array.subarray(0, acc.indices.length))) : undefined\n return {\n material: acc.material,\n part: acc.part,\n positions,\n normals: acc.normals.done(),\n uvs: acc.uvs.done(),\n ...(withColors ? { colors: acc.colors.done() } : {}),\n ...(indices ? { indices } : {}),\n ranges: acc.ranges,\n bounds: boundsOf(positions),\n }\n}\n\nconst radiusOf = (t: PrimitiveBuffers, world: readonly number[]): number => {\n let r = 0\n const p = t.positions\n for (let i = 0; i < p.length; i += 3) r = Math.max(r, Math.hypot(p[i] as number, p[i + 1] as number, p[i + 2] as number))\n const sx = Math.hypot(world[0]!, world[1]!, world[2]!)\n const sy = Math.hypot(world[4]!, world[5]!, world[6]!)\n const sz = Math.hypot(world[8]!, world[9]!, world[10]!)\n return r * Math.max(sx, sy, sz)\n}\n\ninterface LevelResult {\n readonly level: ShapeLevel\n readonly parts: ShapePart[]\n readonly points: ShapePoint[]\n readonly primitives: number\n}\n\n/** Expands a custom node into the node its generator returns (wrapped so that the custom node's own fields still apply). */\nfunction expandCustom(node: Extract<ShapeNode, { kind: 'custom' }>, settings: Settings, detail: number, path: string): ShapeNode {\n const generator = settings.generators?.[node.generator] ?? (settings.isolatedGenerators ? undefined : getGenerator(node.generator))\n if (!generator) throw new Error(`game-shapes: no generator \"${node.generator}\" (register it with registerGenerator, in the worker too) at ${path}`)\n const generated = generator(node.params, { random: streamFor(settings.seed, node.generator, path), seed: settings.seed, detail, path })\n const { kind: _kind, generator: _generator, params: _params, ...common } = node\n return { ...common, kind: 'group', children: [generated] }\n}\n\n/** The key two leaf primitives share when one can stand for the other as an instance. */\nconst leafKey = (node: PrimitiveNode, material: string, color: number, uv: UvRect, level: LevelSpec): string =>\n `${node.kind}|${canonicalJson(primitiveParameters(node, level))}|${material}|${color}|${uv.u0},${uv.v0},${uv.u1},${uv.v1}`\n\nfunction runLevel(schema: ShapeSchema, settings: Settings, level: LevelSpec): LevelResult {\n const bakeParts = level.index > 0\n const root: Target = { part: null, accs: new Map() }\n const targets: Target[] = [root]\n const partTargets = new Map<string, Target>()\n const parts: ShapePart[] = []\n const points: ShapePoint[] = []\n const instanced: InstancedBatch[] = []\n let primitives = 0\n const space = settings.colors === 'none' ? null : settings.colors\n const channels = new Map<number, readonly number[]>()\n const rgbOf = (hex: number): readonly number[] | null => {\n if (!space) return null\n let c = channels.get(hex)\n if (!c) {\n c = colorChannels(hex, space)\n channels.set(hex, c)\n }\n return c\n }\n const resolveMaterial = (id: string): string => {\n let out = id\n if (settings.materials && !settings.materials.has(out)) out = settings.fallback ?? out\n return settings.alias?.[out] ?? out\n }\n const accOf = (target: Target, material: string): Accumulator => {\n let acc = target.accs.get(material)\n if (!acc) {\n acc = new Accumulator(material, target.part)\n target.accs.set(material, acc)\n }\n return acc\n }\n\n // automatic instancing: count the leaves first\n const autoCounts = new Map<string, number>()\n const autoGroups = new Map<string, { node: PrimitiveNode; material: string; color: number; part: string | null; matrices: number[] }>()\n\n const count = (node: ShapeNode, inherited: { material: string; color: number; uv: UvRect; inPart: boolean }, path: string): void => {\n if (node.minDetail !== undefined && level.detail < node.minDetail) return\n if (node.kind === 'custom') return count(expandCustom(node, settings, level.detail, path), inherited, path)\n const next = {\n material: node.material !== undefined ? resolveMaterial(node.material) : inherited.material,\n color: node.color !== undefined ? colorHex(node.color) : inherited.color,\n uv: node.uv ?? inherited.uv,\n inPart: inherited.inPart || (node.part !== undefined && !bakeParts),\n }\n if (node.instances) return\n if (node.kind === 'group') {\n node.children?.forEach((child, index) => count(child, next, `${path}/${index}`))\n return\n }\n if (isPrimitiveNode(node) && node.name === undefined && !next.inPart) {\n const key = leafKey(node, next.material, next.color, next.uv, level)\n autoCounts.set(key, (autoCounts.get(key) ?? 0) + 1)\n }\n }\n const rootMaterial = resolveMaterial('default')\n if (settings.autoMin !== undefined) count(schema.root, { material: rootMaterial, color: 0xffffff, uv: IDENTITY_UV, inPart: false }, 'root')\n\n /** Draws a subtree into `collector` (a target) under `parent` (null: identity). */\n const visit = (node: ShapeNode, parent: Matrix4 | null, inherited: Inherited, path: string): void => {\n if (node.minDetail !== undefined && level.detail < node.minDetail) return\n if (node.kind === 'custom') return visit(expandCustom(node, settings, level.detail, path), parent, inherited, path)\n let target = inherited.target\n let parentWorld = parent\n if (node.part !== undefined) {\n if (bakeParts) {\n // far levels freeze the parts at rest: the part's pivot is relative to the root\n parentWorld = null\n } else {\n let partTarget = partTargets.get(node.part)\n if (!partTarget) {\n partTarget = { part: node.part, accs: new Map() }\n partTargets.set(node.part, partTarget)\n targets.push(partTarget)\n const { position, rotation, rotationOrder, scale, heading, matrix } = node\n parts.push({\n id: node.part,\n ...(position ? { position } : {}),\n ...(rotation ? { rotation } : {}),\n ...(rotationOrder ? { rotationOrder } : {}),\n ...(scale !== undefined ? { scale } : {}),\n ...(heading !== undefined ? { heading } : {}),\n ...(matrix ? { matrix } : { matrix: asMat4(matrixOf(node)) }),\n })\n }\n target = partTarget\n }\n }\n const isPart = node.part !== undefined && !bakeParts\n const local = isPart ? null : matrixOf(node)\n const world = isPart ? null : local ? (parentWorld ? multiply(parentWorld, local) : local) : parentWorld\n const next: Inherited = {\n material: node.material !== undefined ? resolveMaterial(node.material) : inherited.material,\n color: node.color !== undefined ? colorHex(node.color) : inherited.color,\n uv: node.uv ?? inherited.uv,\n target,\n }\n\n if (node.instances) {\n drawInstanced(node, parentWorld, next, path)\n return\n }\n\n const snapshot = node.name !== undefined ? new Map([...target.accs].map(([m, a]) => [m, { v: a.vertices, i: a.indices.length }])) : null\n\n if (node.kind === 'group') {\n node.children?.forEach((child, index) => visit(child, world, next, `${path}/${index}`))\n } else if (node.kind === 'point') {\n const p = node.position ?? [0, 0, 0]\n points.push({\n ...(node.name !== undefined ? { name: node.name } : {}),\n part: target.part,\n position: parent ? transformPoint(parent, p[0], p[1], p[2]) : [p[0], p[1], p[2]],\n ...(node.data !== undefined ? { data: node.data } : {}),\n ...(node.tags ? { tags: node.tags } : {}),\n })\n } else if (isPrimitiveNode(node)) {\n const template = buildPrimitive(node, level)\n const m = world ?? identity4()\n if (level.minSize !== undefined && radiusOf(template, m) < level.minSize) return\n primitives++\n if (settings.autoMin !== undefined && node.name === undefined && target.part === null) {\n const key = leafKey(node, next.material, next.color, next.uv, level)\n if ((autoCounts.get(key) ?? 0) >= settings.autoMin) {\n let group = autoGroups.get(key)\n if (!group) {\n group = { node, material: next.material, color: next.color, part: null, matrices: [] }\n autoGroups.set(key, group)\n }\n group.matrices.push(...m)\n return\n }\n }\n bake(accOf(target, next.material), template, m, rgbOf(next.color), next.uv, settings.indexed)\n }\n\n if (snapshot) {\n for (const [material, acc] of target.accs) {\n const before = snapshot.get(material) ?? { v: 0, i: 0 }\n if (acc.vertices === before.v) continue\n acc.ranges.push({\n name: node.name as string,\n ...(node.tags ? { tags: node.tags } : {}),\n vertexStart: before.v,\n vertexCount: acc.vertices - before.v,\n indexStart: before.i,\n indexCount: acc.indices.length - before.i,\n })\n }\n }\n }\n\n const drawInstanced = (node: ShapeNode, parentWorld: Matrix4 | null, inherited: Inherited, path: string): void => {\n const collector: Target = { part: inherited.target.part, accs: new Map() }\n const { instances, ...single } = node as ShapeNode & { instances: NonNullable<ShapeNode['instances']> }\n const before = parts.length\n visit(single as ShapeNode, null, { ...inherited, target: collector }, path)\n if (parts.length !== before) throw new Error(`game-shapes: an instanced node cannot hold parts (${path})`)\n const matrices = new Float32Array(instances.length * 16)\n const hasColors = instances.some((instance) => instance.color !== undefined)\n const colors = hasColors ? new Float32Array(instances.length * 3) : undefined\n instances.forEach((instance, index) => {\n const local = matrixOf(instance)\n const m = local ? (parentWorld ? multiply(parentWorld, local) : local) : parentWorld ?? identity4()\n matrices.set(m, index * 16)\n if (colors) colors.set(colorChannels(colorHex(instance.color), space ?? 'srgb'), index * 3)\n })\n for (const acc of collector.accs.values()) {\n const batch = finish(acc, settings.indexed, false)\n instanced.push({\n material: acc.material,\n part: collector.part,\n ...(node.name !== undefined ? { name: node.name } : {}),\n geometry: { type: 'BufferGeometry', parameters: {}, positions: batch.positions, normals: batch.normals, uvs: batch.uvs, ...(batch.indices ? { indices: batch.indices } : {}), groups: [] },\n matrices: matrices.slice(),\n ...(colors ? { colors: colors.slice() } : {}),\n count: instances.length,\n })\n }\n }\n\n visit(schema.root, null, { material: rootMaterial, color: 0xffffff, uv: IDENTITY_UV, target: root }, 'root')\n\n for (const group of autoGroups.values()) {\n const template = buildPrimitive(group.node, level)\n const n = group.matrices.length / 16\n const rgb = colorChannels(group.color, space ?? 'srgb')\n const colors = new Float32Array(n * 3)\n for (let i = 0; i < n; i++) colors.set(rgb, i * 3)\n instanced.push({\n material: group.material,\n part: null,\n geometry: { type: template.type, parameters: template.parameters, positions: template.positions.slice(), normals: template.normals.slice(), uvs: template.uvs.slice(), ...(template.indices ? { indices: template.indices.slice() } : {}), groups: template.groups.map((g) => ({ ...g })) },\n matrices: new Float32Array(group.matrices),\n ...(space ? { colors } : {}),\n count: n,\n })\n }\n\n const batches: ShapeBatch[] = []\n for (const target of targets) for (const acc of target.accs.values()) if (acc.vertices > 0 && (!settings.indexed || acc.indices.length > 0)) batches.push(finish(acc, settings.indexed, space !== null))\n return { level: { distance: level.distance, detail: level.detail, batches, instanced }, parts, points, primitives }\n}\n\n/**\n * Turns a shape into buffers: one batch per (part, material) per level, baked; instanced nodes as instance batches; parts with their pivots;\n * points. Pure: the same schema and options give the same bytes, here or in a worker.\n */\nexport function generate(schema: ShapeSchema, options: GenerateOptions = {}): ShapeBuffers {\n if (options.validate !== false) assertValidShape(schema)\n const settings: Settings = {\n colors: options.colors ?? 'linear',\n indexed: options.indexed ?? true,\n ...(options.materials ? { materials: new Set(options.materials) } : {}),\n ...(options.fallbackMaterial !== undefined ? { fallback: options.fallbackMaterial } : {}),\n ...(options.materialAlias ? { alias: options.materialAlias } : {}),\n seed: options.seed ?? 0,\n ...(options.generators ? { generators: options.generators } : {}),\n ...(options.isolatedGenerators ? { isolatedGenerators: true } : {}),\n ...(options.instancing ? { autoMin: Math.max(2, options.instancing.minCount) } : {}),\n }\n const specs: LevelSpec[] = [{ distance: 0, detail: 1, index: 0 }, ...(schema.lod ?? []).map((rule, index) => ({ ...rule, index: index + 1 }))]\n const wanted = options.levels ? specs.filter((spec) => options.levels!.includes(spec.index)) : specs\n let parts: ShapePart[] = []\n let points: ShapePoint[] = []\n let primitives = 0\n const levels: ShapeLevel[] = []\n for (const spec of wanted) {\n const result = runLevel(schema, settings, spec)\n if (spec.index === 0 || levels.length === 0) {\n parts = result.parts\n points = result.points\n primitives = result.primitives\n }\n levels.push(result.level)\n }\n const first = levels[0]\n const vertices = first ? first.batches.reduce((sum, batch) => sum + batch.positions.length / 3, 0) : 0\n const triangles = first\n ? first.batches.reduce((sum, batch) => sum + (batch.indices ? batch.indices.length : batch.positions.length / 3) / 3, 0) +\n first.instanced.reduce((sum, batch) => sum + ((batch.geometry.indices ? batch.geometry.indices.length : batch.geometry.positions.length / 3) / 3) * batch.count, 0)\n : 0\n return {\n key: options.key === false ? '' : options.key ?? shapeKey(schema, options),\n ...(schema.name !== undefined ? { name: schema.name } : {}),\n levels,\n parts,\n points,\n ...(schema.materials ? { materials: schema.materials } : {}),\n ...(schema.cullDistance !== undefined ? { cullDistance: schema.cullDistance } : {}),\n stats: { vertices, triangles, batches: first ? first.batches.length : 0, instances: first ? first.instanced.reduce((sum, batch) => sum + batch.count, 0) : 0, primitives },\n }\n}\n","import { normalMatrix, transformPoint } from './math'\nimport type { InstancedBatch, PrimitiveBuffers, ShapeBatch, ShapeBuffers } from './types'\n\n/** One piece for `mergeTransformed`: arrays (any may be missing) and the matrix that takes them into the merged space. */\nexport interface TransformedPiece {\n readonly positions: ArrayLike<number>\n readonly normals?: ArrayLike<number>\n readonly uvs?: ArrayLike<number>\n readonly indices?: ArrayLike<number> | null\n /** Column-major 4 x 4. */\n readonly matrix: readonly number[]\n}\n\nexport interface MergedArrays {\n readonly positions: Float32Array\n readonly normals: Float32Array\n readonly uvs: Float32Array\n}\n\n/**\n * Joins pieces into one non-indexed set of arrays, each piece de-indexed, its missing normals and uvs zero-filled, its positions by\n * `Vector3.applyMatrix4` and its normals by the normal matrix and normalised: what three's `toNonIndexed` + `applyMatrix4` + a join do,\n * bit for bit (the port of `mergeByMaterial`).\n */\nexport function mergeTransformed(pieces: readonly TransformedPiece[]): MergedArrays {\n let total = 0\n for (const piece of pieces) total += piece.indices ? piece.indices.length : piece.positions.length / 3\n const positions = new Float32Array(total * 3)\n const normals = new Float32Array(total * 3)\n const uvs = new Float32Array(total * 2)\n let at = 0\n for (const piece of pieces) {\n const e = piece.matrix\n const nm = normalMatrix(e)\n const count = piece.indices ? piece.indices.length : piece.positions.length / 3\n // de-index into Float32 first, as toNonIndexed does, then transform the stored values\n const p = new Float32Array(count * 3)\n const n = new Float32Array(count * 3)\n for (let k = 0; k < count; k++) {\n const i = piece.indices ? (piece.indices[k] as number) : k\n for (let c = 0; c < 3; c++) {\n p[k * 3 + c] = piece.positions[i * 3 + c] as number\n if (piece.normals) n[k * 3 + c] = piece.normals[i * 3 + c] as number\n }\n if (piece.uvs) {\n uvs[(at + k) * 2] = piece.uvs[i * 2] as number\n uvs[(at + k) * 2 + 1] = piece.uvs[i * 2 + 1] as number\n }\n }\n for (let k = 0; k < count; k++) {\n const q = transformPoint(e, p[k * 3] as number, p[k * 3 + 1] as number, p[k * 3 + 2] as number)\n positions[(at + k) * 3] = q[0]\n positions[(at + k) * 3 + 1] = q[1]\n positions[(at + k) * 3 + 2] = q[2]\n const x = n[k * 3] as number\n const y = n[k * 3 + 1] as number\n const z = n[k * 3 + 2] as number\n const vx = nm[0]! * x + nm[3]! * y + nm[6]! * z\n const vy = nm[1]! * x + nm[4]! * y + nm[7]! * z\n const vz = nm[2]! * x + nm[5]! * y + nm[8]! * z\n const s = 1 / (Math.sqrt(vx * vx + vy * vy + vz * vz) || 1)\n normals[(at + k) * 3] = vx * s\n normals[(at + k) * 3 + 1] = vy * s\n normals[(at + k) * 3 + 2] = vz * s\n }\n at += count\n }\n return { positions, normals, uvs }\n}\n\nconst primitiveArrays = (p: PrimitiveBuffers): ArrayBuffer[] => [p.positions, p.normals, p.uvs, ...(p.indices ? [p.indices] : [])].map((a) => a.buffer as ArrayBuffer)\nconst batchArrays = (b: ShapeBatch): ArrayBuffer[] => [b.positions, b.normals, b.uvs, ...(b.colors ? [b.colors] : []), ...(b.indices ? [b.indices] : [])].map((a) => a.buffer as ArrayBuffer)\nconst instancedArrays = (b: InstancedBatch): ArrayBuffer[] => [...primitiveArrays(b.geometry), b.matrices.buffer as ArrayBuffer, ...(b.colors ? [b.colors.buffer as ArrayBuffer] : [])]\n\n/** Every `ArrayBuffer` of a result, for `postMessage(buffers, transferablesOf(buffers))`. */\nexport function transferablesOf(buffers: ShapeBuffers): ArrayBuffer[] {\n const out = new Set<ArrayBuffer>()\n for (const level of buffers.levels) {\n for (const batch of level.batches) for (const a of batchArrays(batch)) out.add(a)\n for (const batch of level.instanced) for (const a of instancedArrays(batch)) out.add(a)\n }\n return [...out]\n}\n\nconst copyPrimitive = (p: PrimitiveBuffers): PrimitiveBuffers => ({\n ...p,\n positions: p.positions.slice(),\n normals: p.normals.slice(),\n uvs: p.uvs.slice(),\n ...(p.indices ? { indices: p.indices.slice() } : {}),\n groups: p.groups.map((g) => ({ ...g })),\n})\n\n/** A deep copy whose arrays are its own (cached results are shared and read-only; copy before deforming). */\nexport function cloneBuffers(buffers: ShapeBuffers): ShapeBuffers {\n return {\n ...buffers,\n levels: buffers.levels.map((level) => ({\n ...level,\n batches: level.batches.map((b) => ({\n ...b,\n positions: b.positions.slice(),\n normals: b.normals.slice(),\n uvs: b.uvs.slice(),\n ...(b.colors ? { colors: b.colors.slice() } : {}),\n ...(b.indices ? { indices: b.indices.slice() } : {}),\n ranges: b.ranges.map((r) => ({ ...r })),\n bounds: { min: [...b.bounds.min], max: [...b.bounds.max] },\n })),\n instanced: level.instanced.map((b) => ({ ...b, geometry: copyPrimitive(b.geometry), matrices: b.matrices.slice(), ...(b.colors ? { colors: b.colors.slice() } : {}) })),\n })),\n }\n}\n\n/** Bytes held by the arrays of a result (what the cache counts). */\nexport function byteSizeOf(buffers: ShapeBuffers): number {\n return transferablesOf(buffers).reduce((sum, buffer) => sum + buffer.byteLength, 0)\n}\n","import { generate } from './generate'\nimport { transferablesOf } from './merge'\nimport type { GenerateOptions, ShapeBuffers, ShapeGenerator, ShapeSchema } from './types'\n\n/** A job the pool posts: `options` without `generators` (functions do not cross threads; register them in the worker script). */\nexport interface ShapeJob {\n readonly id: number\n readonly schema: ShapeSchema\n readonly options?: Omit<GenerateOptions, 'generators'>\n}\n\nexport type ShapeReply = { readonly id: number; readonly ok: true; readonly buffers: ShapeBuffers } | { readonly id: number; readonly ok: false; readonly error: string }\n\n/** What a worker scope looks like: `self` in a browser worker, a `worker_threads` `parentPort` wrapper in Node, or an in-thread fake. */\nexport interface WorkerScopeLike {\n onmessage: ((event: { data: unknown }) => void) | null\n postMessage(message: unknown, transfer?: ArrayBuffer[]): void\n}\n\nexport interface ShapeWorkerOptions {\n /** Generators of the `custom` nodes, the same ones the main thread registers. */\n readonly generators?: Readonly<Record<string, ShapeGenerator>>\n /** Transfer the arrays back (default true: zero copy, the worker keeps nothing). */\n readonly transfer?: boolean\n}\n\n/**\n * The worker side of `createShapePool`: answers each job with `generate(schema, options)`, transferring every array.\n *\n * ```ts\n * // shape-worker.ts\n * import { installShapeWorker } from '@adatechnology/game-shapes/worker'\n * installShapeWorker(self as never, { generators: myGenerators })\n * ```\n */\nexport function installShapeWorker(scope: WorkerScopeLike, options: ShapeWorkerOptions = {}): void {\n const transfer = options.transfer !== false\n scope.onmessage = (event) => {\n const job = event.data as ShapeJob\n try {\n const buffers = generate(job.schema, { ...(job.options ?? {}), ...(options.generators ? { generators: options.generators } : {}) })\n const reply: ShapeReply = { id: job.id, ok: true, buffers }\n scope.postMessage(reply, transfer ? transferablesOf(buffers) : [])\n } catch (error) {\n const reply: ShapeReply = { id: job.id, ok: false, error: error instanceof Error ? error.message : String(error) }\n scope.postMessage(reply)\n }\n }\n}\n"],"mappings":"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","names":["color","p","width","height","depth","indexArray","sign","list","num","equals","area","ring","bs","layeroffset","color"]}
|