@roomle/web-sdk 3.10.0-alpha.1 → 3.10.0-alpha.3
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/lib/{BufferGeometry-Dxcf7n9V.mjs → BufferGeometry-Dj5loCTL.mjs} +2 -2
- package/lib/{BufferGeometry-Dxcf7n9V.mjs.map → BufferGeometry-Dj5loCTL.mjs.map} +1 -1
- package/lib/ConfiguratorKernel.wasm +0 -0
- package/lib/{GLTFExporter-kpv1e-Ks.mjs → GLTFExporter-CquK-kkI.mjs} +1 -1
- package/lib/{GLTFExporter-kpv1e-Ks.mjs.map → GLTFExporter-CquK-kkI.mjs.map} +1 -1
- package/lib/{GaussianBlurNode-CMVlBe39.mjs → GaussianBlurNode-CDYPio-x.mjs} +3 -3
- package/lib/{GaussianBlurNode-CMVlBe39.mjs.map → GaussianBlurNode-CDYPio-x.mjs.map} +1 -1
- package/lib/{Object3D-BZaiqQIE.mjs → Object3D-YXSPdGeJ.mjs} +1 -1
- package/lib/{Object3D-BZaiqQIE.mjs.map → Object3D-YXSPdGeJ.mjs.map} +1 -1
- package/lib/{PointLightHelper-fzRB58rC.mjs → PointLightHelper-g98giMRd.mjs} +4 -4
- package/lib/{PointLightHelper-fzRB58rC.mjs.map → PointLightHelper-g98giMRd.mjs.map} +1 -1
- package/lib/RoomleCore.wasm +0 -0
- package/lib/RoomleToolsCore.wasm +0 -0
- package/lib/{SpotLightHelper-D5UFwRPb.mjs → SpotLightHelper-xR8lCZau.mjs} +3 -3
- package/lib/{SpotLightHelper-D5UFwRPb.mjs.map → SpotLightHelper-xR8lCZau.mjs.map} +1 -1
- package/lib/{USDZExporter-Y0SSGr5_.mjs → USDZExporter-BMqBymZI.mjs} +2 -2
- package/lib/{USDZExporter-Y0SSGr5_.mjs.map → USDZExporter-BMqBymZI.mjs.map} +1 -1
- package/lib/{Vector4-BfZH1ecw.mjs → Vector4-CqzXUndP.mjs} +2 -2
- package/lib/{Vector4-BfZH1ecw.mjs.map → Vector4-CqzXUndP.mjs.map} +1 -1
- package/lib/{api-DVBX8_mw.mjs → api-BlFJIGaV.mjs} +2 -2
- package/lib/{api-DVBX8_mw.mjs.map → api-BlFJIGaV.mjs.map} +1 -1
- package/lib/{asset-loader.worker-C911tbNL.mjs → asset-loader.worker-CHyN7JB1.mjs} +1 -1
- package/lib/asset-loader.worker-CHyN7JB1.mjs.map +1 -0
- package/lib/{banana-for-scale-B_LIHI9q.mjs → banana-for-scale-Cs2s9dNp.mjs} +3 -3
- package/lib/{banana-for-scale-B_LIHI9q.mjs.map → banana-for-scale-Cs2s9dNp.mjs.map} +1 -1
- package/lib/{budgeteer.sw-D3VxiASa.mjs → budgeteer.sw-BCLEIWCW.mjs} +1 -1
- package/lib/budgeteer.sw-BCLEIWCW.mjs.map +1 -0
- package/lib/{common-utils-B9PC_rvS.mjs → common-utils-DMk5jc_R.mjs} +1 -1
- package/lib/{common-utils-B9PC_rvS.mjs.map → common-utils-DMk5jc_R.mjs.map} +1 -1
- package/lib/{component-dimensioning-DC1Lxdp-.mjs → component-dimensioning-DcmDM6gV.mjs} +6 -6
- package/lib/{component-dimensioning-DC1Lxdp-.mjs.map → component-dimensioning-DcmDM6gV.mjs.map} +1 -1
- package/lib/{component-raycast-helper-Wpay-VAg.mjs → component-raycast-helper-CXN2MHtG.mjs} +4 -4
- package/lib/{component-raycast-helper-Wpay-VAg.mjs.map → component-raycast-helper-CXN2MHtG.mjs.map} +1 -1
- package/lib/configurator-B8jcqVX9.mjs +2 -0
- package/lib/{configurator-DU1NHt_a.mjs → configurator-BkQ6h239.mjs} +4 -4
- package/lib/{configurator-DU1NHt_a.mjs.map → configurator-BkQ6h239.mjs.map} +1 -1
- package/lib/{continuous-drawing-helper-D25YPUle.mjs → continuous-drawing-helper-BlGATN0C.mjs} +2 -2
- package/lib/{continuous-drawing-helper-D25YPUle.mjs.map → continuous-drawing-helper-BlGATN0C.mjs.map} +1 -1
- package/lib/{dat.gui.module-CZ-DIWHM.mjs → dat.gui.module-BLjoST8r.mjs} +1 -1
- package/lib/{dat.gui.module-CZ-DIWHM.mjs.map → dat.gui.module-BLjoST8r.mjs.map} +1 -1
- package/lib/{decorate-C9r0zXzz.mjs → decorate-CTUwswpM.mjs} +1 -1
- package/lib/{decorate-C9r0zXzz.mjs.map → decorate-CTUwswpM.mjs.map} +1 -1
- package/lib/dimensioning-helper-BwBj5QDM.mjs +2 -0
- package/lib/{dimensioning-helper-d6JA4UMr.mjs → dimensioning-helper-DMop5qcu.mjs} +4 -4
- package/lib/{dimensioning-helper-d6JA4UMr.mjs.map → dimensioning-helper-DMop5qcu.mjs.map} +1 -1
- package/lib/dist-DGov-RNo.mjs +438 -0
- package/lib/dist-DGov-RNo.mjs.map +1 -0
- package/lib/{fflate.module-CBz7CLOg.mjs → fflate.module-n0Jozp8Z.mjs} +1 -1
- package/lib/{fflate.module-CBz7CLOg.mjs.map → fflate.module-n0Jozp8Z.mjs.map} +1 -1
- package/lib/{glb-viewer-BPfa4Fz5.mjs → glb-viewer-D58flqDh.mjs} +6 -6
- package/lib/{glb-viewer-BPfa4Fz5.mjs.map → glb-viewer-D58flqDh.mjs.map} +1 -1
- package/lib/glb-viewer-Dg3F2Tz1.mjs +2 -0
- package/lib/{highlight-coordinator-BcJdy2_o.mjs → highlight-coordinator-CTZ_qcde.mjs} +2 -2
- package/lib/{highlight-coordinator-BcJdy2_o.mjs.map → highlight-coordinator-CTZ_qcde.mjs.map} +1 -1
- package/lib/{homag-intelligence-D8Lm2GMZ.mjs → homag-intelligence-D7L2SS4z.mjs} +3 -3
- package/lib/{homag-intelligence-D8Lm2GMZ.mjs.map → homag-intelligence-D7L2SS4z.mjs.map} +1 -1
- package/lib/{imos-ix-poc-export-helper-DU0ag-Lw.mjs → imos-ix-poc-export-helper-D2KaQu_v.mjs} +3 -3
- package/lib/{imos-ix-poc-export-helper-DU0ag-Lw.mjs.map → imos-ix-poc-export-helper-D2KaQu_v.mjs.map} +1 -1
- package/lib/kernel-C7YDLxq8.mjs.map +1 -1
- package/lib/{kernel-utils-Cj5B4fDD.mjs → kernel-utils-042AuCQh.mjs} +1 -1
- package/lib/{kernel-utils-Cj5B4fDD.mjs.map → kernel-utils-042AuCQh.mjs.map} +1 -1
- package/lib/{layer-C_JtkhdO.mjs → layer-CFAr2mK_.mjs} +1 -1
- package/lib/{layer-C_JtkhdO.mjs.map → layer-CFAr2mK_.mjs.map} +1 -1
- package/lib/{main-DXPoPkIG.mjs → main-C2m_IBXL.mjs} +3852 -3643
- package/lib/main-C2m_IBXL.mjs.map +1 -0
- package/lib/{material-viewer-CNTiw7G9.mjs → material-viewer-BJs0W2Gk.mjs} +10 -10
- package/lib/material-viewer-BJs0W2Gk.mjs.map +1 -0
- package/lib/packages-D6zM0aDK.mjs +4 -0
- package/lib/{planner-CWQ8F70q.mjs → planner-B9YA9cmz.mjs} +3 -3
- package/lib/{planner-CWQ8F70q.mjs.map → planner-B9YA9cmz.mjs.map} +1 -1
- package/lib/planner-DJnqYqvP.mjs +2 -0
- package/lib/{plugin-system-DlME_5b_.mjs → plugin-system-DRpL0Rer.mjs} +3 -3
- package/lib/{plugin-system-DlME_5b_.mjs.map → plugin-system-DRpL0Rer.mjs.map} +1 -1
- package/lib/{roomle-headless-setup-CMK-quZI.mjs → roomle-headless-setup-Cc8EAnVe.mjs} +1 -1
- package/lib/{roomle-headless-setup-CMK-quZI.mjs.map → roomle-headless-setup-Cc8EAnVe.mjs.map} +1 -1
- package/lib/roomle-headless.d.ts +81 -32
- package/lib/roomle-headless.js +9 -9
- package/lib/{roomle-renderer-DYQvV88j.mjs → roomle-renderer-BD3ZmpLS.mjs} +23 -5
- package/lib/roomle-renderer-BD3ZmpLS.mjs.map +1 -0
- package/lib/roomle-sdk.d.ts +81 -32
- package/lib/roomle-sdk.js +7 -7
- package/lib/{roomle-webgpu-renderer-CmqMWt2K.mjs → roomle-webgpu-renderer-NhCn2iM-.mjs} +386 -240
- package/lib/roomle-webgpu-renderer-NhCn2iM-.mjs.map +1 -0
- package/lib/{scene-renderer-6t0p4vb4.mjs → scene-renderer-DbHi1plp.mjs} +367 -1467
- package/lib/scene-renderer-DbHi1plp.mjs.map +1 -0
- package/lib/{script-loader-DovMlDVR.mjs → script-loader-CXa3RiUa.mjs} +3 -3
- package/lib/{script-loader-DovMlDVR.mjs.map → script-loader-CXa3RiUa.mjs.map} +1 -1
- package/lib/shading-settings-BWeccIZv.mjs +1108 -0
- package/lib/shading-settings-BWeccIZv.mjs.map +1 -0
- package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/package.json +1 -1
- package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/wasm_modern/ConfiguratorKernel.wasm +0 -0
- package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/wasm_modern/RoomleCore.wasm +0 -0
- package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/wasm_modern/RoomleToolsCore.wasm +0 -0
- package/lib/{stats-helper-B9MDLRpR.mjs → stats-helper-CPeojJW2.mjs} +3 -3
- package/lib/{stats-helper-B9MDLRpR.mjs.map → stats-helper-CPeojJW2.mjs.map} +1 -1
- package/lib/{three.tsl-S0OKwamA.mjs → three.tsl-Bb8l7rD7.mjs} +1 -1
- package/lib/{three.tsl-CAEdYyg3.mjs → three.tsl-Caqi2VRr.mjs} +2 -2
- package/lib/{three.tsl-CAEdYyg3.mjs.map → three.tsl-Caqi2VRr.mjs.map} +1 -1
- package/lib/{three.webgpu-CkP2nkXM.mjs → three.webgpu-CT4fuV2X.mjs} +1 -1
- package/lib/{three.webgpu-CkP2nkXM.mjs.map → three.webgpu-CT4fuV2X.mjs.map} +1 -1
- package/lib/{three.webgpu-qrxDA_v0.mjs → three.webgpu-CxNhl3k-.mjs} +1 -1
- package/lib/{threejs-utils-ZKvz9Qno.mjs → threejs-utils-E4yVZATI.mjs} +17 -17
- package/lib/threejs-utils-E4yVZATI.mjs.map +1 -0
- package/lib/{tools-core-Ks33p1cu.mjs → tools-core-GNj0UaiE.mjs} +3 -3
- package/lib/{tools-core-Ks33p1cu.mjs.map → tools-core-GNj0UaiE.mjs.map} +1 -1
- package/lib/workers-Dc-RTL8D.mjs +6 -0
- package/lib/{workers-HXGCmmZS.mjs.map → workers-Dc-RTL8D.mjs.map} +1 -1
- package/package.json +1 -1
- package/lib/asset-loader.worker-C911tbNL.mjs.map +0 -1
- package/lib/budgeteer.sw-D3VxiASa.mjs.map +0 -1
- package/lib/configurator-BRZ1-AQZ.mjs +0 -2
- package/lib/dimensioning-helper-pPTkh8pl.mjs +0 -2
- package/lib/glb-viewer-Bllsu2_m.mjs +0 -2
- package/lib/main-DXPoPkIG.mjs.map +0 -1
- package/lib/material-viewer-CNTiw7G9.mjs.map +0 -1
- package/lib/packages-D61uTgIK.mjs +0 -4
- package/lib/planner-BO7I35KU.mjs +0 -2
- package/lib/roomle-renderer-DYQvV88j.mjs.map +0 -1
- package/lib/roomle-webgpu-renderer-CmqMWt2K.mjs.map +0 -1
- package/lib/scene-renderer-6t0p4vb4.mjs.map +0 -1
- package/lib/threejs-utils-ZKvz9Qno.mjs.map +0 -1
- package/lib/workers-HXGCmmZS.mjs +0 -6
package/lib/{roomle-headless-setup-CMK-quZI.mjs.map → roomle-headless-setup-Cc8EAnVe.mjs.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"roomle-headless-setup-CMK-quZI.mjs","names":["#registered"],"sources":["../../packages/headless-core/src/setup-environment.ts"],"sourcesContent":["import { createRequire } from 'module';\nimport type { IOptionalBrowserSettings } from 'happy-dom';\n\n// Optional dependencies — must be imported dynamically\nconst napiCanvas = await import('@napi-rs/canvas').catch((): null => null);\nconst happyDom = await import('happy-dom').catch((): null => null);\n\nif (!napiCanvas) {\n throw new Error(\n '[headless] @napi-rs/canvas is required for headless setup. ' +\n 'Install it (it is an optionalDependency of @roomle/web-sdk)',\n );\n}\n\nif (!happyDom) {\n throw new Error(\n '[headless] happy-dom is required for headless setup. ' +\n 'Install it (it is an optionalDependency of @roomle/web-sdk)',\n );\n}\n\nconst {\n createCanvas: createNapiCanvas,\n Image: NapiImage,\n ImageData: NapiImageData,\n} = napiCanvas;\nconst { GlobalWindow, PropertySymbol } = happyDom;\n\n// Network APIs and built-ins that happy-dom must not override —\n// we rely on Node/Bun native implementations for these.\nconst IGNORE_LIST = [\n 'fetch',\n 'Response',\n 'Request',\n 'Headers',\n 'AbortController',\n 'AbortSignal',\n 'ReadableStream',\n 'WritableStream',\n 'TransformStream',\n 'FormData',\n 'URL',\n 'URLSearchParams',\n 'Blob',\n 'File',\n 'constructor',\n 'undefined',\n 'NaN',\n 'global',\n 'globalThis',\n];\n\nclass GlobalRegistrator {\n static #registered: {\n [key: string | symbol]: PropertyDescriptor | null;\n } | null = null;\n\n public static get isRegistered(): boolean {\n return this.#registered !== null;\n }\n\n public static register(options?: {\n width?: number;\n height?: number;\n url?: string;\n settings?: IOptionalBrowserSettings;\n }): void {\n if (this.#registered !== null) {\n throw new Error(\n 'Failed to register. Happy DOM has already been globally registered.',\n );\n }\n\n const window = new GlobalWindow({\n ...options,\n console: globalThis.console,\n });\n\n this.#registered = {};\n\n const propertyDescriptors = Object.getOwnPropertyDescriptors(window);\n\n for (const key of Object.keys(propertyDescriptors)) {\n if (!IGNORE_LIST.includes(key)) {\n const windowPropertyDescriptor = propertyDescriptors[key];\n const globalPropertyDescriptor = Object.getOwnPropertyDescriptor(\n globalThis,\n key,\n );\n\n if (\n globalPropertyDescriptor?.value === undefined ||\n globalPropertyDescriptor?.value !== windowPropertyDescriptor?.value\n ) {\n this.#registered[key] = globalPropertyDescriptor || null;\n\n if (windowPropertyDescriptor?.value === window) {\n (window as any)[key] = globalThis;\n windowPropertyDescriptor.value = globalThis;\n }\n\n Object.defineProperty(globalThis, key, {\n ...windowPropertyDescriptor,\n configurable: true,\n });\n }\n }\n }\n\n const propertySymbols = Object.getOwnPropertySymbols(window);\n\n for (const key of propertySymbols) {\n const propertyDescriptor = Object.getOwnPropertyDescriptor(window, key);\n this.#registered[key] = null;\n\n if (propertyDescriptor!.value === window) {\n (window as any)[key] = globalThis;\n propertyDescriptor!.value = globalThis;\n }\n\n Object.defineProperty(globalThis, key, {\n ...propertyDescriptor,\n configurable: true,\n });\n }\n\n (globalThis as any).document[PropertySymbol.defaultView] = globalThis;\n }\n\n public static async unregister(): Promise<void> {\n if (this.#registered === null) {\n throw new Error(\n 'Failed to unregister. Happy DOM has not previously been globally registered.',\n );\n }\n\n const happyDOM = (globalThis as any).happyDOM;\n\n for (const key of Object.keys(this.#registered)) {\n if (this.#registered[key] !== null) {\n Object.defineProperty(globalThis, key, this.#registered[key]!);\n } else {\n delete (globalThis as any)[key];\n }\n }\n\n this.#registered = null;\n\n if (happyDOM) {\n await happyDOM.close();\n }\n }\n}\n\n// Resolves the bundle directory so root-relative Vite asset URLs like\n// \"/default_256.exr\" can be mapped to real files next to the bundle.\n// We use a bare `import.meta.url` (not wrapped in `new URL(…, import.meta.url)`)\n// because Rollup replaces the latter pattern with a data: URI at build time.\nconst _setupRequire = createRequire(import.meta.url);\nconst _fsSync = _setupRequire('fs');\nconst _pathSync = _setupRequire('path');\nconst _urlSync = _setupRequire('url');\nlet _bundleDir = '';\ntry {\n _bundleDir = _pathSync.dirname(_urlSync.fileURLToPath(import.meta.url));\n} catch {\n // Not a file: URL (e.g. some test runners) — root-relative resolution skipped.\n}\n\n/** Maps a root-relative path (e.g. \"/default_256.exr\") to a local file path\n * next to the bundle. Returns null when the file doesn't exist. */\nconst _resolveRootRelative = (urlPath: string): string | null => {\n if (!_bundleDir || !urlPath.startsWith('/') || urlPath.startsWith('//')) {\n return null;\n }\n const candidate = _pathSync.join(_bundleDir, urlPath);\n return _fsSync.existsSync(candidate) ? candidate : null;\n};\n\n// Patch globalThis.fetch to handle:\n// 1. file:// URLs — Node/undici rejects these natively; Bun accepts them.\n// 2. Root-relative URLs (e.g. \"/default_256.exr\") — emitted by Vite's ?url\n// transform; no web server in Node means native fetch throws \"Invalid URL\".\nconst _nativeFetch = globalThis.fetch;\n// @ts-ignore -- this conflicts with DOM types.\nglobalThis.fetch = async (\n input: string | URL | Request,\n init?: RequestInit,\n): Promise<Response> => {\n const url =\n typeof input === 'string'\n ? input\n : input instanceof URL\n ? input.href\n : (input as any).url ?? String(input);\n\n if (url.startsWith('file://')) {\n const buffer = _fsSync.readFileSync(_urlSync.fileURLToPath(url));\n return new Response(buffer, {\n status: 200,\n headers: { 'Content-Type': 'application/octet-stream' },\n });\n }\n\n if (url.startsWith('/') && !url.startsWith('//')) {\n const localPath = _resolveRootRelative(url);\n if (localPath) {\n return new Response(_fsSync.readFileSync(localPath), {\n status: 200,\n headers: { 'Content-Type': 'application/octet-stream' },\n });\n }\n console.warn(\n `[headless] fetch: root-relative asset not found: ${url} (bundle dir: ${_bundleDir || 'unknown'})`,\n );\n return new Response(null, { status: 404, statusText: 'Not Found' });\n }\n\n return _nativeFetch.call(this, input, init);\n};\n\n// Proxy-wrap globalThis.Request so root-relative paths are converted to\n// file:// URLs before the constructor validates them. Three.js's FileLoader\n// calls `new Request(url)` before fetch(), so our fetch patch above is never\n// reached if the constructor throws first.\nconst _OrigRequest = (globalThis as any).Request;\nif (_OrigRequest) {\n (globalThis as any).Request = new Proxy(_OrigRequest, {\n construct(Target: any, [input, init]: [any, any]) {\n if (\n typeof input === 'string' &&\n input.startsWith('/') &&\n !input.startsWith('//')\n ) {\n const localPath =\n _resolveRootRelative(input) ??\n _pathSync.join(_bundleDir || '/tmp', input);\n input = _urlSync.pathToFileURL(localPath).href;\n }\n return Reflect.construct(\n Target,\n init !== undefined ? [input, init] : [input],\n Target,\n );\n },\n get(target: any, prop: string | symbol) {\n return target[prop];\n },\n });\n}\n\nGlobalRegistrator.register();\n\n// Provide napi-rs/canvas ImageData globally — GLTFExporter uses `new ImageData(…)`\n// directly, and we excluded happy-dom's version from the registration above.\nif (typeof (globalThis as any).ImageData === 'undefined') {\n (globalThis as any).ImageData = NapiImageData;\n}\n\n// FileReader shim — happy-dom's FileReader only accepts happy-dom Blobs, but\n// we keep Node's native Blob (see IGNORE_LIST). The inverse mismatch breaks\n// GLTFExporter which does `new FileReader().readAsArrayBuffer(new Blob(...))`\nclass NodeFileReader {\n public result: ArrayBuffer | string | null = null;\n public error: unknown = null;\n public readyState: number = 0;\n public onload: ((ev: any) => void) | null = null;\n public onloadend: ((ev: any) => void) | null = null;\n public onerror: ((ev: any) => void) | null = null;\n\n readAsArrayBuffer(blob: Blob): void {\n this.readyState = 1;\n blob.arrayBuffer().then(\n (buf) => {\n this.result = buf;\n this.readyState = 2;\n const ev = { target: this };\n this.onload?.(ev);\n this.onloadend?.(ev);\n },\n (err) => {\n this.error = err;\n this.readyState = 2;\n const ev = { target: this };\n this.onerror?.(ev);\n this.onloadend?.(ev);\n },\n );\n }\n\n readAsDataURL(blob: Blob): void {\n this.readyState = 1;\n blob.arrayBuffer().then(\n (buf) => {\n const b64 = Buffer.from(buf).toString('base64');\n const type = (blob as any).type || 'application/octet-stream';\n this.result = `data:${type};base64,${b64}`;\n this.readyState = 2;\n const ev = { target: this };\n this.onload?.(ev);\n this.onloadend?.(ev);\n },\n (err) => {\n this.error = err;\n this.readyState = 2;\n const ev = { target: this };\n this.onerror?.(ev);\n this.onloadend?.(ev);\n },\n );\n }\n\n readAsText(blob: Blob): void {\n this.readyState = 1;\n blob.text().then(\n (text) => {\n this.result = text;\n this.readyState = 2;\n const ev = { target: this };\n this.onload?.(ev);\n this.onloadend?.(ev);\n },\n (err) => {\n this.error = err;\n this.readyState = 2;\n const ev = { target: this };\n this.onerror?.(ev);\n this.onloadend?.(ev);\n },\n );\n }\n\n abort(): void {}\n}\n\n(globalThis as any).FileReader = NodeFileReader;\n\n// Symbol for storing the underlying NapiImage on wrapper elements so that\n// the patched 2d context can unwrap it before calling the native drawImage.\nconst NAPI_IMAGE = Symbol('napiImage');\n\nconst origCreateElement = document.createElement.bind(document);\nconst origCreateElementNS = document.createElementNS.bind(document);\n\n// Patches a napi-rs/canvas 2d context so drawImage() unwraps NAPI_IMAGE wrappers.\n// Skia's native drawImage only accepts its own Image/Canvas types.\nconst patchContext2d = (ctx: any): any => {\n const origDrawImage = ctx.drawImage.bind(ctx);\n ctx.drawImage = (image: any, ...args: any[]) => {\n const real = image?.[NAPI_IMAGE] ?? image;\n return origDrawImage(real, ...args);\n };\n return ctx;\n};\n\nlet createHeadlessGL: ((w: number, h: number, opts?: any) => any) | null = null;\n\ntry {\n // @ts-ignore -- We do not install gl by default during dev, only when consuming the sdk for headless mode, this is temporary.\n const { createContext } = await import('gl');\n createHeadlessGL = createContext;\n console.log('[headless] Using headless-gl (ANGLE) for real WebGL rendering');\n} catch (e) {\n console.log(e);\n console.log('[headless] headless-gl not available, using mock WebGL context');\n}\n\n// No-op WebGL2 context — all draw calls are no-ops but Three.js initialises\n// successfully. Used when headless-gl is unavailable (Bun).\nconst createMockWebGL2Context = (canvas: any): any => {\n let _id = 1;\n const nextId = () => ({ _mockId: _id++ });\n\n const ctx: Record<string, any> = {\n canvas,\n drawingBufferWidth: canvas.width || 300,\n drawingBufferHeight: canvas.height || 150,\n drawingBufferColorSpace: 'srgb',\n\n // ── Capability queries ──\n getParameter(pname: number) {\n const params: Record<number, any> = {\n 0x1f02: 'WebGL 2.0 (Mock)', // VERSION\n 0x8b8c: 'OpenGL ES GLSL ES 3.00', // SHADING_LANGUAGE_VERSION\n 0x1f00: 'Mock', // VENDOR\n 0x1f01: 'Mock Headless Renderer', // RENDERER\n 0x0d33: 16384, // MAX_TEXTURE_SIZE\n 0x851c: 16, // MAX_TEXTURE_IMAGE_UNITS\n 0x8869: 16, // MAX_VERTEX_ATTRIBS\n 0x8872: 32, // MAX_COMBINED_TEXTURE_IMAGE_UNITS\n 0x8dfb: 32, // MAX_VARYING_VECTORS\n 0x8b4c: 4096, // MAX_VERTEX_UNIFORM_VECTORS\n 0x8b49: 4096, // MAX_FRAGMENT_UNIFORM_VECTORS\n 0x88ff: 16, // MAX_VERTEX_TEXTURE_IMAGE_UNITS\n 0x8073: 2048, // MAX_3D_TEXTURE_SIZE\n 0x8cdf: 32, // MAX_COLOR_ATTACHMENTS\n 0x8824: 8, // MAX_DRAW_BUFFERS\n 0x80e9: 65536, // MAX_ELEMENTS_VERTICES\n 0x80ea: 65536, // MAX_ELEMENTS_INDICES\n 0x9122: 16, // MAX_SAMPLES\n 0x8d6b: 2048, // MAX_ARRAY_TEXTURE_LAYERS\n 0x8a2b: 16384, // MAX_UNIFORM_BLOCK_SIZE\n 0x8c2b: 16, // MAX_VERTEX_UNIFORM_BLOCKS\n 0x8a30: 24, // MAX_UNIFORM_BUFFER_BINDINGS\n 0x8a2f: 256, // UNIFORM_BUFFER_OFFSET_ALIGNMENT\n 0x0d32: new Int32Array([16384, 16384]), // MAX_VIEWPORT_DIMS\n 0x84fe: 16, // MAX_TEXTURE_MAX_ANISOTROPY_EXT\n 0x8b4a: 4096, // MAX_FRAGMENT_UNIFORM_COMPONENTS\n 0x8b4d: 4096, // MAX_VERTEX_UNIFORM_COMPONENTS\n 0x8c8a: 0, // MAX_VARYING_COMPONENTS\n 0x0b71: 1, // DEPTH_BITS\n 0x0d55: 4, // PACK_ALIGNMENT\n 0x0cf5: 4, // UNPACK_ALIGNMENT\n 0x9245: 0, // UNPACK_ROW_LENGTH\n 0x9243: 0, // UNPACK_IMAGE_HEIGHT\n 0x9244: 0, // UNPACK_SKIP_PIXELS\n 0x9246: 0, // UNPACK_SKIP_ROWS\n 0x9247: 0, // UNPACK_SKIP_IMAGES\n };\n return params[pname] ?? 0;\n },\n\n getExtension(name: string) {\n if (\n name === 'EXT_texture_filter_anisotropic' ||\n name === 'WEBKIT_EXT_texture_filter_anisotropic'\n ) {\n return {\n TEXTURE_MAX_ANISOTROPY_EXT: 0x84fe,\n MAX_TEXTURE_MAX_ANISOTROPY_EXT: 0x84ff,\n };\n }\n if (\n name === 'EXT_color_buffer_float' ||\n name === 'EXT_color_buffer_half_float' ||\n name === 'OES_texture_float_linear' ||\n name === 'OES_texture_half_float_linear' ||\n name === 'EXT_float_blend'\n ) {\n return {};\n }\n return null;\n },\n\n getSupportedExtensions() {\n return [\n 'EXT_texture_filter_anisotropic',\n 'EXT_color_buffer_float',\n 'OES_texture_float_linear',\n 'OES_texture_half_float_linear',\n 'EXT_float_blend',\n ];\n },\n\n // ── Shader / Program ──\n createShader: () => nextId(),\n shaderSource() {},\n compileShader() {},\n getShaderParameter(_s: any, pname: number) {\n return pname === 0x8b81 ? true : 0; // COMPILE_STATUS\n },\n getShaderInfoLog() {\n return '';\n },\n deleteShader() {},\n createProgram: () => nextId(),\n attachShader() {},\n linkProgram() {},\n getProgramParameter(_p: any, pname: number) {\n if (pname === 0x8b82) {\n return true;\n } // LINK_STATUS\n if (pname === 0x8b86) {\n return 0;\n } // ACTIVE_UNIFORMS\n if (pname === 0x8b89) {\n return 0;\n } // ACTIVE_ATTRIBUTES\n if (pname === 0x8a36) {\n return 0;\n } // ACTIVE_UNIFORM_BLOCKS\n if (pname === 0x8c76) {\n return 0;\n } // TRANSFORM_FEEDBACK_VARYINGS\n return 0;\n },\n getProgramInfoLog() {\n return '';\n },\n useProgram() {},\n deleteProgram() {},\n detachShader() {},\n validateProgram() {},\n\n // ── Precision ──\n getShaderPrecisionFormat() {\n return { rangeMin: 127, rangeMax: 127, precision: 23 };\n },\n\n // ── Uniforms / Attributes ──\n getAttribLocation() {\n return 0;\n },\n getUniformLocation() {\n return nextId();\n },\n getActiveAttrib() {\n return { name: 'a', type: 0x1406, size: 1 };\n },\n getActiveUniform() {\n return { name: 'u', type: 0x1406, size: 1 };\n },\n uniform1f() {},\n uniform2f() {},\n uniform3f() {},\n uniform4f() {},\n uniform1i() {},\n uniform2i() {},\n uniform3i() {},\n uniform4i() {},\n uniform1ui() {},\n uniform2ui() {},\n uniform3ui() {},\n uniform4ui() {},\n uniform1fv() {},\n uniform2fv() {},\n uniform3fv() {},\n uniform4fv() {},\n uniform1iv() {},\n uniform2iv() {},\n uniform3iv() {},\n uniform4iv() {},\n uniform1uiv() {},\n uniform2uiv() {},\n uniform3uiv() {},\n uniform4uiv() {},\n uniformMatrix2fv() {},\n uniformMatrix3fv() {},\n uniformMatrix4fv() {},\n uniformMatrix2x3fv() {},\n uniformMatrix3x2fv() {},\n uniformMatrix2x4fv() {},\n uniformMatrix4x2fv() {},\n uniformMatrix3x4fv() {},\n uniformMatrix4x3fv() {},\n\n // ── Buffers ──\n createBuffer: () => nextId(),\n bindBuffer() {},\n bufferData() {},\n bufferSubData() {},\n deleteBuffer() {},\n getBufferSubData() {},\n copyBufferSubData() {},\n isBuffer() {\n return true;\n },\n bindBufferBase() {},\n bindBufferRange() {},\n\n // ── Vertex Arrays ──\n createVertexArray: () => nextId(),\n bindVertexArray() {},\n deleteVertexArray() {},\n isVertexArray() {\n return true;\n },\n enableVertexAttribArray() {},\n disableVertexAttribArray() {},\n vertexAttribPointer() {},\n vertexAttribIPointer() {},\n vertexAttribDivisor() {},\n vertexAttrib1f() {},\n vertexAttrib2f() {},\n vertexAttrib3f() {},\n vertexAttrib4f() {},\n vertexAttrib1fv() {},\n vertexAttrib2fv() {},\n vertexAttrib3fv() {},\n vertexAttrib4fv() {},\n\n // ── Textures ──\n createTexture: () => nextId(),\n bindTexture() {},\n activeTexture() {},\n pixelStorei() {},\n texImage2D() {},\n texImage3D() {},\n texSubImage2D() {},\n texSubImage3D() {},\n compressedTexImage2D() {},\n compressedTexSubImage2D() {},\n compressedTexImage3D() {},\n compressedTexSubImage3D() {},\n texParameteri() {},\n texParameterf() {},\n texStorage2D() {},\n texStorage3D() {},\n generateMipmap() {},\n deleteTexture() {},\n copyTexImage2D() {},\n copyTexSubImage2D() {},\n isTexture() {\n return true;\n },\n\n // ── Framebuffers ──\n createFramebuffer: () => nextId(),\n bindFramebuffer() {},\n deleteFramebuffer() {},\n framebufferTexture2D() {},\n framebufferTextureLayer() {},\n framebufferRenderbuffer() {},\n checkFramebufferStatus() {\n return 0x8cd5;\n }, // FRAMEBUFFER_COMPLETE\n readPixels() {},\n blitFramebuffer() {},\n invalidateFramebuffer() {},\n readBuffer() {},\n drawBuffers() {},\n isFramebuffer() {\n return true;\n },\n\n // ── Renderbuffers ──\n createRenderbuffer: () => nextId(),\n bindRenderbuffer() {},\n renderbufferStorage() {},\n renderbufferStorageMultisample() {},\n deleteRenderbuffer() {},\n isRenderbuffer() {\n return true;\n },\n getRenderbufferParameter() {\n return 0;\n },\n\n // ── Draw / Clear ──\n clear() {},\n clearColor() {},\n clearDepth() {},\n clearStencil() {},\n colorMask() {},\n depthMask() {},\n stencilMask() {},\n stencilMaskSeparate() {},\n viewport() {},\n scissor() {},\n drawArrays() {},\n drawElements() {},\n drawArraysInstanced() {},\n drawElementsInstanced() {},\n drawRangeElements() {},\n\n // ── State ──\n enable() {},\n disable() {},\n isEnabled() {\n return false;\n },\n blendFunc() {},\n blendFuncSeparate() {},\n blendEquation() {},\n blendEquationSeparate() {},\n blendColor() {},\n depthFunc() {},\n depthRange() {},\n stencilFunc() {},\n stencilFuncSeparate() {},\n stencilOp() {},\n stencilOpSeparate() {},\n cullFace() {},\n frontFace() {},\n lineWidth() {},\n polygonOffset() {},\n sampleCoverage() {},\n\n // ── Transform Feedback ──\n createTransformFeedback: () => nextId(),\n bindTransformFeedback() {},\n beginTransformFeedback() {},\n endTransformFeedback() {},\n transformFeedbackVaryings() {},\n deleteTransformFeedback() {},\n pauseTransformFeedback() {},\n resumeTransformFeedback() {},\n\n // ── Queries ──\n createQuery: () => nextId(),\n deleteQuery() {},\n beginQuery() {},\n endQuery() {},\n getQueryParameter() {\n return 0;\n },\n getQuery(): null {\n return null;\n },\n\n // ── Sync ──\n fenceSync: () => nextId(),\n deleteSync() {},\n clientWaitSync() {\n return 0x911d;\n },\n waitSync() {},\n getSyncParameter() {\n return 0x9119;\n },\n\n // ── Samplers ──\n createSampler: () => nextId(),\n deleteSampler() {},\n bindSampler() {},\n samplerParameteri() {},\n samplerParameterf() {},\n isSampler() {\n return true;\n },\n\n // ── Uniform Blocks ──\n getUniformBlockIndex() {\n return 0;\n },\n uniformBlockBinding() {},\n getActiveUniformBlockParameter() {\n return 0;\n },\n getActiveUniformBlockName() {\n return '';\n },\n getUniformIndices(): any[] {\n return [];\n },\n getActiveUniforms(): any[] {\n return [];\n },\n\n // ── Misc ──\n finish() {},\n flush() {},\n getError() {\n return 0;\n },\n isContextLost() {\n return false;\n },\n getContextAttributes() {\n return {\n alpha: true,\n antialias: true,\n depth: true,\n failIfMajorPerformanceCaveat: false,\n powerPreference: 'default',\n premultipliedAlpha: true,\n preserveDrawingBuffer: false,\n stencil: true,\n desynchronized: false,\n };\n },\n getInternalformatParameter() {\n return new Int32Array([8]);\n },\n hint() {},\n makeXRCompatible() {\n return Promise.resolve();\n },\n };\n\n // WebGL 1 + 2 constants needed by Three.js\n const GL_CONSTANTS: Record<string, number> = {\n DEPTH_BUFFER_BIT: 0x00000100,\n STENCIL_BUFFER_BIT: 0x00000400,\n COLOR_BUFFER_BIT: 0x00004000,\n POINTS: 0x0000,\n LINES: 0x0001,\n LINE_LOOP: 0x0002,\n LINE_STRIP: 0x0003,\n TRIANGLES: 0x0004,\n TRIANGLE_STRIP: 0x0005,\n TRIANGLE_FAN: 0x0006,\n ZERO: 0,\n ONE: 1,\n SRC_COLOR: 0x0300,\n ONE_MINUS_SRC_COLOR: 0x0301,\n SRC_ALPHA: 0x0302,\n ONE_MINUS_SRC_ALPHA: 0x0303,\n DST_ALPHA: 0x0304,\n ONE_MINUS_DST_ALPHA: 0x0305,\n DST_COLOR: 0x0306,\n ONE_MINUS_DST_COLOR: 0x0307,\n SRC_ALPHA_SATURATE: 0x0308,\n CONSTANT_COLOR: 0x8001,\n ONE_MINUS_CONSTANT_COLOR: 0x8002,\n CONSTANT_ALPHA: 0x8003,\n ONE_MINUS_CONSTANT_ALPHA: 0x8004,\n FUNC_ADD: 0x8006,\n FUNC_SUBTRACT: 0x800a,\n FUNC_REVERSE_SUBTRACT: 0x800b,\n MIN: 0x8007,\n MAX: 0x8008,\n BLEND_EQUATION: 0x8009,\n BLEND_EQUATION_RGB: 0x8009,\n BLEND_EQUATION_ALPHA: 0x883d,\n BLEND_DST_RGB: 0x80c8,\n BLEND_SRC_RGB: 0x80c9,\n BLEND_DST_ALPHA: 0x80ca,\n BLEND_SRC_ALPHA: 0x80cb,\n BLEND_COLOR: 0x8005,\n BLEND: 0x0be2,\n ARRAY_BUFFER: 0x8892,\n ELEMENT_ARRAY_BUFFER: 0x8893,\n ARRAY_BUFFER_BINDING: 0x8894,\n ELEMENT_ARRAY_BUFFER_BINDING: 0x8895,\n STREAM_DRAW: 0x88e0,\n STATIC_DRAW: 0x88e4,\n DYNAMIC_DRAW: 0x88e8,\n STREAM_READ: 0x88e1,\n STREAM_COPY: 0x88e2,\n STATIC_READ: 0x88e5,\n STATIC_COPY: 0x88e6,\n DYNAMIC_READ: 0x88e9,\n DYNAMIC_COPY: 0x88ea,\n BUFFER_SIZE: 0x8764,\n BUFFER_USAGE: 0x8765,\n CURRENT_VERTEX_ATTRIB: 0x8626,\n CULL_FACE: 0x0b44,\n FRONT: 0x0404,\n BACK: 0x0405,\n FRONT_AND_BACK: 0x0408,\n DEPTH_TEST: 0x0b71,\n DEPTH_WRITEMASK: 0x0b72,\n STENCIL_TEST: 0x0b90,\n SCISSOR_TEST: 0x0c11,\n POLYGON_OFFSET_FILL: 0x8037,\n SAMPLE_ALPHA_TO_COVERAGE: 0x809e,\n SAMPLE_COVERAGE: 0x80a0,\n DITHER: 0x0bd0,\n NEVER: 0x0200,\n LESS: 0x0201,\n EQUAL: 0x0202,\n LEQUAL: 0x0203,\n GREATER: 0x0204,\n NOTEQUAL: 0x0205,\n GEQUAL: 0x0206,\n ALWAYS: 0x0207,\n KEEP: 0x1e00,\n REPLACE: 0x1e01,\n INCR: 0x1e02,\n DECR: 0x1e03,\n INVERT: 0x150a,\n INCR_WRAP: 0x8507,\n DECR_WRAP: 0x8508,\n NEAREST: 0x2600,\n LINEAR: 0x2601,\n NEAREST_MIPMAP_NEAREST: 0x2700,\n LINEAR_MIPMAP_NEAREST: 0x2701,\n NEAREST_MIPMAP_LINEAR: 0x2702,\n LINEAR_MIPMAP_LINEAR: 0x2703,\n TEXTURE_MAG_FILTER: 0x2800,\n TEXTURE_MIN_FILTER: 0x2801,\n TEXTURE_WRAP_S: 0x2802,\n TEXTURE_WRAP_T: 0x2803,\n TEXTURE_2D: 0x0de1,\n TEXTURE_3D: 0x806f,\n TEXTURE: 0x1702,\n TEXTURE_CUBE_MAP: 0x8513,\n TEXTURE_BINDING_CUBE_MAP: 0x8514,\n TEXTURE_CUBE_MAP_POSITIVE_X: 0x8515,\n TEXTURE_CUBE_MAP_NEGATIVE_X: 0x8516,\n TEXTURE_CUBE_MAP_POSITIVE_Y: 0x8517,\n TEXTURE_CUBE_MAP_NEGATIVE_Y: 0x8518,\n TEXTURE_CUBE_MAP_POSITIVE_Z: 0x8519,\n TEXTURE_CUBE_MAP_NEGATIVE_Z: 0x851a,\n MAX_CUBE_MAP_TEXTURE_SIZE: 0x851c,\n TEXTURE0: 0x84c0,\n TEXTURE1: 0x84c1,\n TEXTURE2: 0x84c2,\n TEXTURE3: 0x84c3,\n TEXTURE4: 0x84c4,\n TEXTURE5: 0x84c5,\n TEXTURE6: 0x84c6,\n TEXTURE7: 0x84c7,\n TEXTURE8: 0x84c8,\n TEXTURE9: 0x84c9,\n TEXTURE10: 0x84ca,\n TEXTURE11: 0x84cb,\n TEXTURE12: 0x84cc,\n TEXTURE13: 0x84cd,\n TEXTURE14: 0x84ce,\n TEXTURE15: 0x84cf,\n TEXTURE16: 0x84d0,\n TEXTURE17: 0x84d1,\n TEXTURE18: 0x84d2,\n TEXTURE19: 0x84d3,\n TEXTURE20: 0x84d4,\n TEXTURE21: 0x84d5,\n TEXTURE22: 0x84d6,\n TEXTURE23: 0x84d7,\n TEXTURE24: 0x84d8,\n TEXTURE25: 0x84d9,\n TEXTURE26: 0x84da,\n TEXTURE27: 0x84db,\n TEXTURE28: 0x84dc,\n TEXTURE29: 0x84dd,\n TEXTURE30: 0x84de,\n TEXTURE31: 0x84df,\n ACTIVE_TEXTURE: 0x84e0,\n REPEAT: 0x2901,\n CLAMP_TO_EDGE: 0x812f,\n MIRRORED_REPEAT: 0x8370,\n FLOAT: 0x1406,\n FLOAT_VEC2: 0x8b50,\n FLOAT_VEC3: 0x8b51,\n FLOAT_VEC4: 0x8b52,\n INT: 0x1404,\n INT_VEC2: 0x8b53,\n INT_VEC3: 0x8b54,\n INT_VEC4: 0x8b55,\n UNSIGNED_INT: 0x1405,\n BOOL: 0x8b56,\n BOOL_VEC2: 0x8b57,\n BOOL_VEC3: 0x8b58,\n BOOL_VEC4: 0x8b59,\n FLOAT_MAT2: 0x8b5a,\n FLOAT_MAT3: 0x8b5b,\n FLOAT_MAT4: 0x8b5c,\n SAMPLER_2D: 0x8b5e,\n SAMPLER_CUBE: 0x8b60,\n BYTE: 0x1400,\n UNSIGNED_BYTE: 0x1401,\n SHORT: 0x1402,\n UNSIGNED_SHORT: 0x1403,\n UNSIGNED_SHORT_4_4_4_4: 0x8033,\n UNSIGNED_SHORT_5_5_5_1: 0x8034,\n UNSIGNED_SHORT_5_6_5: 0x8363,\n UNSIGNED_INT_24_8: 0x84fa,\n HALF_FLOAT: 0x140b,\n FRAGMENT_SHADER: 0x8b30,\n VERTEX_SHADER: 0x8b31,\n MAX_VERTEX_ATTRIBS: 0x8869,\n MAX_VERTEX_UNIFORM_VECTORS: 0x8b4c,\n MAX_VARYING_VECTORS: 0x8dfb,\n MAX_COMBINED_TEXTURE_IMAGE_UNITS: 0x8b4d,\n MAX_VERTEX_TEXTURE_IMAGE_UNITS: 0x88ff,\n MAX_TEXTURE_IMAGE_UNITS: 0x8872,\n MAX_FRAGMENT_UNIFORM_VECTORS: 0x8b49,\n SHADER_TYPE: 0x8b4f,\n DELETE_STATUS: 0x8b80,\n LINK_STATUS: 0x8b82,\n VALIDATE_STATUS: 0x8b83,\n ATTACHED_SHADERS: 0x8b85,\n ACTIVE_UNIFORMS: 0x8b86,\n ACTIVE_ATTRIBUTES: 0x8b89,\n COMPILE_STATUS: 0x8b81,\n FRAMEBUFFER: 0x8d40,\n RENDERBUFFER: 0x8d41,\n RGBA4: 0x8056,\n RGB5_A1: 0x8057,\n RGB565: 0x8d62,\n DEPTH_COMPONENT16: 0x81a5,\n DEPTH_COMPONENT24: 0x81a6,\n DEPTH_COMPONENT32F: 0x8cac,\n DEPTH24_STENCIL8: 0x88f0,\n DEPTH32F_STENCIL8: 0x8cad,\n STENCIL_INDEX8: 0x8d48,\n RENDERBUFFER_WIDTH: 0x8d42,\n RENDERBUFFER_HEIGHT: 0x8d43,\n RENDERBUFFER_INTERNAL_FORMAT: 0x8d44,\n FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: 0x8cd0,\n FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: 0x8cd1,\n FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: 0x8cd2,\n FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: 0x8cd3,\n COLOR_ATTACHMENT0: 0x8ce0,\n COLOR_ATTACHMENT1: 0x8ce1,\n COLOR_ATTACHMENT2: 0x8ce2,\n COLOR_ATTACHMENT3: 0x8ce3,\n DEPTH_ATTACHMENT: 0x8d00,\n STENCIL_ATTACHMENT: 0x8d20,\n DEPTH_STENCIL_ATTACHMENT: 0x821a,\n DEPTH_STENCIL: 0x84f9,\n FRAMEBUFFER_COMPLETE: 0x8cd5,\n FRAMEBUFFER_INCOMPLETE_ATTACHMENT: 0x8cd6,\n FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: 0x8cd7,\n FRAMEBUFFER_INCOMPLETE_DIMENSIONS: 0x8cd9,\n FRAMEBUFFER_UNSUPPORTED: 0x8cdd,\n FRAMEBUFFER_BINDING: 0x8ca6,\n RENDERBUFFER_BINDING: 0x8ca7,\n MAX_RENDERBUFFER_SIZE: 0x84e8,\n INVALID_FRAMEBUFFER_OPERATION: 0x0506,\n UNPACK_FLIP_Y_WEBGL: 0x9240,\n UNPACK_PREMULTIPLY_ALPHA_WEBGL: 0x9241,\n UNPACK_COLORSPACE_CONVERSION_WEBGL: 0x9243,\n READ_BUFFER: 0x0c02,\n UNPACK_ROW_LENGTH: 0x0cf2,\n UNPACK_SKIP_ROWS: 0x0cf3,\n UNPACK_SKIP_PIXELS: 0x0cf4,\n PACK_ROW_LENGTH: 0x0d02,\n PACK_SKIP_ROWS: 0x0d03,\n PACK_SKIP_PIXELS: 0x0d04,\n TEXTURE_BINDING_3D: 0x806a,\n UNPACK_SKIP_IMAGES: 0x806d,\n UNPACK_IMAGE_HEIGHT: 0x806e,\n MAX_3D_TEXTURE_SIZE: 0x8073,\n MAX_ELEMENTS_VERTICES: 0x80e9,\n MAX_ELEMENTS_INDICES: 0x80ea,\n MAX_TEXTURE_LOD_BIAS: 0x84fd,\n MAX_DRAW_BUFFERS: 0x8824,\n DRAW_BUFFER0: 0x8825,\n MAX_FRAGMENT_UNIFORM_COMPONENTS: 0x8b49,\n MAX_VERTEX_UNIFORM_COMPONENTS: 0x8b4a,\n MAX_ARRAY_TEXTURE_LAYERS: 0x88ff,\n MIN_PROGRAM_TEXEL_OFFSET: 0x8904,\n MAX_PROGRAM_TEXEL_OFFSET: 0x8905,\n MAX_VARYING_COMPONENTS: 0x8b4b,\n TEXTURE_2D_ARRAY: 0x8c1a,\n TEXTURE_BINDING_2D_ARRAY: 0x8c1d,\n UNIFORM_BUFFER: 0x8a11,\n UNIFORM_BUFFER_BINDING: 0x8a28,\n MAX_VERTEX_UNIFORM_BLOCKS: 0x8a2b,\n MAX_FRAGMENT_UNIFORM_BLOCKS: 0x8a2d,\n MAX_COMBINED_UNIFORM_BLOCKS: 0x8a2e,\n MAX_UNIFORM_BUFFER_BINDINGS: 0x8a2f,\n MAX_UNIFORM_BLOCK_SIZE: 0x8a30,\n UNIFORM_BUFFER_OFFSET_ALIGNMENT: 0x8a34,\n ACTIVE_UNIFORM_BLOCKS: 0x8a36,\n TRANSFORM_FEEDBACK_BUFFER: 0x8c8e,\n TRANSFORM_FEEDBACK_BUFFER_BINDING: 0x8c8f,\n TRANSFORM_FEEDBACK_VARYINGS: 0x8c83,\n TRANSFORM_FEEDBACK: 0x8e22,\n PIXEL_PACK_BUFFER: 0x88eb,\n PIXEL_UNPACK_BUFFER: 0x88ec,\n COPY_READ_BUFFER: 0x8f36,\n COPY_WRITE_BUFFER: 0x8f37,\n DRAW_FRAMEBUFFER: 0x8ca9,\n READ_FRAMEBUFFER: 0x8ca8,\n DRAW_FRAMEBUFFER_BINDING: 0x8ca6,\n READ_FRAMEBUFFER_BINDING: 0x8caa,\n RENDERBUFFER_SAMPLES: 0x8cab,\n MAX_COLOR_ATTACHMENTS: 0x8cdf,\n TEXTURE_COMPARE_MODE: 0x884c,\n TEXTURE_COMPARE_FUNC: 0x884d,\n COMPARE_REF_TO_TEXTURE: 0x884e,\n TEXTURE_WRAP_R: 0x8072,\n TEXTURE_MIN_LOD: 0x813a,\n TEXTURE_MAX_LOD: 0x813b,\n TEXTURE_BASE_LEVEL: 0x813c,\n TEXTURE_MAX_LEVEL: 0x813d,\n TEXTURE_IMMUTABLE_FORMAT: 0x912f,\n TEXTURE_IMMUTABLE_LEVELS: 0x82df,\n RGBA8: 0x8058,\n RGB8: 0x8051,\n RG8: 0x822b,\n R8: 0x8229,\n RGBA16F: 0x881a,\n RGB16F: 0x881b,\n RG16F: 0x822f,\n R16F: 0x822d,\n RGBA32F: 0x8814,\n RGB32F: 0x8815,\n RG32F: 0x8230,\n R32F: 0x822e,\n RGBA8UI: 0x8d7c,\n RGBA8I: 0x8d8e,\n RGB8UI: 0x8d7d,\n RGB8I: 0x8d8f,\n RGBA16UI: 0x8d76,\n RGBA16I: 0x8d88,\n RGB16UI: 0x8d77,\n RGB16I: 0x8d89,\n RGBA32UI: 0x8d70,\n RGBA32I: 0x8d82,\n RGB32UI: 0x8d71,\n RGB32I: 0x8d83,\n R8I: 0x8231,\n R8UI: 0x8232,\n R16I: 0x8233,\n R16UI: 0x8234,\n R32I: 0x8235,\n R32UI: 0x8236,\n RG8I: 0x8237,\n RG8UI: 0x8238,\n RG16I: 0x8239,\n RG16UI: 0x823a,\n RG32I: 0x823b,\n RG32UI: 0x823c,\n R11F_G11F_B10F: 0x8c3a,\n RGB9_E5: 0x8c3d,\n SRGB8: 0x8c41,\n SRGB8_ALPHA8: 0x8c43,\n SRGB: 0x8c40,\n RGB10_A2: 0x8059,\n RGB10_A2UI: 0x906f,\n RGBA_INTEGER: 0x8d99,\n RGB_INTEGER: 0x8d98,\n RG_INTEGER: 0x8228,\n RED_INTEGER: 0x8d94,\n ALPHA: 0x1906,\n RGB: 0x1907,\n RGBA: 0x1908,\n LUMINANCE: 0x1909,\n LUMINANCE_ALPHA: 0x190a,\n DEPTH_COMPONENT: 0x1902,\n RED: 0x1903,\n RG: 0x8227,\n VERSION: 0x1f02,\n SHADING_LANGUAGE_VERSION: 0x8b8c,\n VENDOR: 0x1f00,\n RENDERER: 0x1f01,\n IMPLEMENTATION_COLOR_READ_TYPE: 0x8b9a,\n IMPLEMENTATION_COLOR_READ_FORMAT: 0x8b9b,\n NO_ERROR: 0,\n INVALID_ENUM: 0x0500,\n INVALID_VALUE: 0x0501,\n INVALID_OPERATION: 0x0502,\n OUT_OF_MEMORY: 0x0505,\n CW: 0x0900,\n CCW: 0x0901,\n DONT_CARE: 0x1100,\n FASTEST: 0x1101,\n NICEST: 0x1102,\n GENERATE_MIPMAP_HINT: 0x8192,\n FRAGMENT_SHADER_DERIVATIVE_HINT: 0x8b8b,\n VERTEX_ATTRIB_ARRAY_DIVISOR: 0x88fe,\n MAX_SAMPLES: 0x8d57,\n RASTERIZER_DISCARD: 0x8c89,\n ANY_SAMPLES_PASSED: 0x8c2f,\n ANY_SAMPLES_PASSED_CONSERVATIVE: 0x8d6a,\n TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN: 0x8c88,\n };\n\n Object.assign(ctx, GL_CONSTANTS);\n\n // Proxy so unknown constants return 0 and unknown methods return a no-op.\n return new Proxy(ctx, {\n get(target, prop) {\n if (prop in target) {\n return target[prop as string];\n }\n if (typeof prop === 'string') {\n if (/^[A-Z][A-Z0-9_]*$/.test(prop)) {\n console.warn(`[headless] Unknown WebGL constant accessed: ${prop}`);\n return 0;\n }\n return () => {};\n }\n },\n });\n};\n\n// Wraps a real headless-gl (ANGLE) context with WebGL2 constants and any\n// missing methods so Three.js sees a fully-featured WebGL2RenderingContext.\nconst createHybridWebGL2Context = (canvas: any, attrs?: any): any => {\n const w = canvas.width || 300;\n const h = canvas.height || 150;\n const realGL = createHeadlessGL!(w, h, {\n createWebGL2Context: true,\n preserveDrawingBuffer: true,\n antialias: attrs?.antialias ?? true,\n alpha: attrs?.alpha ?? true,\n });\n\n const GL2_CONSTANTS: Record<string, number> = {\n TEXTURE_2D_ARRAY: 0x8c1a,\n TEXTURE_BINDING_2D_ARRAY: 0x8c1d,\n TEXTURE_3D: 0x806f,\n TEXTURE_BINDING_3D: 0x806a,\n TEXTURE_WRAP_R: 0x8072,\n TEXTURE_COMPARE_MODE: 0x884c,\n TEXTURE_COMPARE_FUNC: 0x884d,\n COMPARE_REF_TO_TEXTURE: 0x884e,\n TEXTURE_MIN_LOD: 0x813a,\n TEXTURE_MAX_LOD: 0x813b,\n TEXTURE_BASE_LEVEL: 0x813c,\n TEXTURE_MAX_LEVEL: 0x813d,\n TEXTURE_IMMUTABLE_FORMAT: 0x912f,\n TEXTURE_IMMUTABLE_LEVELS: 0x82df,\n UNIFORM_BUFFER: 0x8a11,\n UNIFORM_BUFFER_BINDING: 0x8a28,\n MAX_VERTEX_UNIFORM_BLOCKS: 0x8a2b,\n MAX_FRAGMENT_UNIFORM_BLOCKS: 0x8a2d,\n MAX_COMBINED_UNIFORM_BLOCKS: 0x8a2e,\n MAX_UNIFORM_BUFFER_BINDINGS: 0x8a2f,\n MAX_UNIFORM_BLOCK_SIZE: 0x8a30,\n UNIFORM_BUFFER_OFFSET_ALIGNMENT: 0x8a34,\n ACTIVE_UNIFORM_BLOCKS: 0x8a36,\n TRANSFORM_FEEDBACK_BUFFER: 0x8c8e,\n TRANSFORM_FEEDBACK_BUFFER_BINDING: 0x8c8f,\n TRANSFORM_FEEDBACK_VARYINGS: 0x8c83,\n TRANSFORM_FEEDBACK: 0x8e22,\n PIXEL_PACK_BUFFER: 0x88eb,\n PIXEL_UNPACK_BUFFER: 0x88ec,\n COPY_READ_BUFFER: 0x8f36,\n COPY_WRITE_BUFFER: 0x8f37,\n DRAW_FRAMEBUFFER: 0x8ca9,\n READ_FRAMEBUFFER: 0x8ca8,\n DRAW_FRAMEBUFFER_BINDING: 0x8ca6,\n READ_FRAMEBUFFER_BINDING: 0x8caa,\n RENDERBUFFER_SAMPLES: 0x8cab,\n MAX_COLOR_ATTACHMENTS: 0x8cdf,\n COLOR_ATTACHMENT1: 0x8ce1,\n COLOR_ATTACHMENT2: 0x8ce2,\n COLOR_ATTACHMENT3: 0x8ce3,\n DEPTH_COMPONENT24: 0x81a6,\n DEPTH_COMPONENT32F: 0x8cac,\n DEPTH24_STENCIL8: 0x88f0,\n DEPTH32F_STENCIL8: 0x8cad,\n READ_BUFFER: 0x0c02,\n UNPACK_ROW_LENGTH: 0x0cf2,\n UNPACK_SKIP_ROWS: 0x0cf3,\n UNPACK_SKIP_PIXELS: 0x0cf4,\n UNPACK_IMAGE_HEIGHT: 0x806e,\n UNPACK_SKIP_IMAGES: 0x806d,\n PACK_ROW_LENGTH: 0x0d02,\n PACK_SKIP_ROWS: 0x0d03,\n PACK_SKIP_PIXELS: 0x0d04,\n RGBA8: 0x8058,\n RGB8: 0x8051,\n RG8: 0x822b,\n R8: 0x8229,\n RGBA16F: 0x881a,\n RGB16F: 0x881b,\n RG16F: 0x822f,\n R16F: 0x822d,\n RGBA32F: 0x8814,\n RGB32F: 0x8815,\n RG32F: 0x8230,\n R32F: 0x822e,\n RGBA8UI: 0x8d7c,\n RGBA8I: 0x8d8e,\n RGB8UI: 0x8d7d,\n RGB8I: 0x8d8f,\n RGBA16UI: 0x8d76,\n RGBA16I: 0x8d88,\n RGB16UI: 0x8d77,\n RGB16I: 0x8d89,\n RGBA32UI: 0x8d70,\n RGBA32I: 0x8d82,\n RGB32UI: 0x8d71,\n RGB32I: 0x8d83,\n R8I: 0x8231,\n R8UI: 0x8232,\n R16I: 0x8233,\n R16UI: 0x8234,\n R32I: 0x8235,\n R32UI: 0x8236,\n RG8I: 0x8237,\n RG8UI: 0x8238,\n RG16I: 0x8239,\n RG16UI: 0x823a,\n RG32I: 0x823b,\n RG32UI: 0x823c,\n R11F_G11F_B10F: 0x8c3a,\n RGB9_E5: 0x8c3d,\n SRGB8: 0x8c41,\n SRGB8_ALPHA8: 0x8c43,\n SRGB: 0x8c40,\n RGB10_A2: 0x8059,\n RGB10_A2UI: 0x906f,\n RGBA_INTEGER: 0x8d99,\n RGB_INTEGER: 0x8d98,\n RG_INTEGER: 0x8228,\n RED_INTEGER: 0x8d94,\n RED: 0x1903,\n RG: 0x8227,\n HALF_FLOAT: 0x140b,\n MIN: 0x8007,\n MAX: 0x8008,\n UNSIGNED_INT_24_8: 0x84fa,\n RASTERIZER_DISCARD: 0x8c89,\n ANY_SAMPLES_PASSED: 0x8c2f,\n ANY_SAMPLES_PASSED_CONSERVATIVE: 0x8d6a,\n TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN: 0x8c88,\n VERTEX_ATTRIB_ARRAY_DIVISOR: 0x88fe,\n MAX_3D_TEXTURE_SIZE: 0x8073,\n MAX_ARRAY_TEXTURE_LAYERS: 0x88ff,\n MAX_DRAW_BUFFERS: 0x8824,\n DRAW_BUFFER0: 0x8825,\n FRAGMENT_SHADER_DERIVATIVE_HINT: 0x8b8b,\n STREAM_READ: 0x88e1,\n STREAM_COPY: 0x88e2,\n STATIC_READ: 0x88e5,\n STATIC_COPY: 0x88e6,\n DYNAMIC_READ: 0x88e9,\n DYNAMIC_COPY: 0x88ea,\n VERSION: 0x1f02,\n SHADING_LANGUAGE_VERSION: 0x8b8c,\n VENDOR: 0x1f00,\n RENDERER: 0x1f01,\n };\n\n const origGetParameter = realGL.getParameter.bind(realGL);\n const getParameterOverrides: Record<number, any> = {\n 0x1f02: 'WebGL 2.0 (headless-gl ANGLE)', // VERSION\n 0x8b8c: 'OpenGL ES GLSL ES 3.00', // SHADING_LANGUAGE_VERSION\n 0x1f00: 'headless-gl', // VENDOR\n 0x1f01: 'ANGLE', // RENDERER\n 0x8cdf: 8, // MAX_COLOR_ATTACHMENTS\n 0x8824: 8, // MAX_DRAW_BUFFERS\n 0x8073: 2048, // MAX_3D_TEXTURE_SIZE\n 0x88ff: 2048, // MAX_ARRAY_TEXTURE_LAYERS\n 0x8a2b: 16, // MAX_VERTEX_UNIFORM_BLOCKS\n 0x8a2d: 16, // MAX_FRAGMENT_UNIFORM_BLOCKS\n 0x8a2e: 24, // MAX_COMBINED_UNIFORM_BLOCKS\n 0x8a2f: 24, // MAX_UNIFORM_BUFFER_BINDINGS\n 0x8a30: 16384, // MAX_UNIFORM_BLOCK_SIZE\n 0x8a34: 256, // UNIFORM_BUFFER_OFFSET_ALIGNMENT\n 0x8d57: 4, // MAX_SAMPLES\n 0x8cab: 4, // RENDERBUFFER_SAMPLES\n };\n\n // WebGL2 methods to stub when not present on the native context\n const noop = () => {};\n const webgl2Stubs: Record<string, any> = {\n createVertexArray:\n realGL.createVertexArray?.bind(realGL) ?? (() => ({ _mockId: 1 })),\n bindVertexArray: realGL.bindVertexArray?.bind(realGL) ?? noop,\n deleteVertexArray: realGL.deleteVertexArray?.bind(realGL) ?? noop,\n isVertexArray: realGL.isVertexArray?.bind(realGL) ?? (() => true),\n drawArraysInstanced: realGL.drawArraysInstanced?.bind(realGL) ?? noop,\n drawElementsInstanced: realGL.drawElementsInstanced?.bind(realGL) ?? noop,\n vertexAttribDivisor: realGL.vertexAttribDivisor?.bind(realGL) ?? noop,\n drawBuffers: realGL.drawBuffers?.bind(realGL) ?? noop,\n readBuffer: realGL.readBuffer?.bind(realGL) ?? noop,\n texImage3D: realGL.texImage3D?.bind(realGL) ?? noop,\n texSubImage3D: realGL.texSubImage3D?.bind(realGL) ?? noop,\n texStorage2D: realGL.texStorage2D?.bind(realGL) ?? noop,\n texStorage3D: realGL.texStorage3D?.bind(realGL) ?? noop,\n compressedTexImage3D: realGL.compressedTexImage3D?.bind(realGL) ?? noop,\n compressedTexSubImage3D:\n realGL.compressedTexSubImage3D?.bind(realGL) ?? noop,\n bindBufferBase: realGL.bindBufferBase?.bind(realGL) ?? noop,\n bindBufferRange: realGL.bindBufferRange?.bind(realGL) ?? noop,\n getUniformBlockIndex:\n realGL.getUniformBlockIndex?.bind(realGL) ?? (() => 0),\n uniformBlockBinding: realGL.uniformBlockBinding?.bind(realGL) ?? noop,\n getActiveUniformBlockParameter:\n realGL.getActiveUniformBlockParameter?.bind(realGL) ?? (() => 0),\n getActiveUniformBlockName:\n realGL.getActiveUniformBlockName?.bind(realGL) ?? (() => ''),\n getUniformIndices:\n realGL.getUniformIndices?.bind(realGL) ?? ((): any[] => []),\n getActiveUniforms:\n realGL.getActiveUniforms?.bind(realGL) ?? ((): any[] => []),\n createTransformFeedback:\n realGL.createTransformFeedback?.bind(realGL) ?? (() => ({ _mockId: 1 })),\n bindTransformFeedback: realGL.bindTransformFeedback?.bind(realGL) ?? noop,\n beginTransformFeedback: realGL.beginTransformFeedback?.bind(realGL) ?? noop,\n endTransformFeedback: realGL.endTransformFeedback?.bind(realGL) ?? noop,\n transformFeedbackVaryings:\n realGL.transformFeedbackVaryings?.bind(realGL) ?? noop,\n deleteTransformFeedback:\n realGL.deleteTransformFeedback?.bind(realGL) ?? noop,\n pauseTransformFeedback: realGL.pauseTransformFeedback?.bind(realGL) ?? noop,\n resumeTransformFeedback:\n realGL.resumeTransformFeedback?.bind(realGL) ?? noop,\n createQuery: realGL.createQuery?.bind(realGL) ?? (() => ({ _mockId: 1 })),\n deleteQuery: realGL.deleteQuery?.bind(realGL) ?? noop,\n beginQuery: realGL.beginQuery?.bind(realGL) ?? noop,\n endQuery: realGL.endQuery?.bind(realGL) ?? noop,\n getQueryParameter: realGL.getQueryParameter?.bind(realGL) ?? (() => 0),\n getQuery: realGL.getQuery?.bind(realGL) ?? ((): null => null),\n fenceSync: realGL.fenceSync?.bind(realGL) ?? (() => ({ _mockId: 1 })),\n deleteSync: realGL.deleteSync?.bind(realGL) ?? noop,\n clientWaitSync: realGL.clientWaitSync?.bind(realGL) ?? (() => 0x911d),\n waitSync: realGL.waitSync?.bind(realGL) ?? noop,\n getSyncParameter: realGL.getSyncParameter?.bind(realGL) ?? (() => 0x9119),\n createSampler:\n realGL.createSampler?.bind(realGL) ?? (() => ({ _mockId: 1 })),\n deleteSampler: realGL.deleteSampler?.bind(realGL) ?? noop,\n bindSampler: realGL.bindSampler?.bind(realGL) ?? noop,\n samplerParameteri: realGL.samplerParameteri?.bind(realGL) ?? noop,\n samplerParameterf: realGL.samplerParameterf?.bind(realGL) ?? noop,\n isSampler: realGL.isSampler?.bind(realGL) ?? (() => true),\n blitFramebuffer: realGL.blitFramebuffer?.bind(realGL) ?? noop,\n invalidateFramebuffer: realGL.invalidateFramebuffer?.bind(realGL) ?? noop,\n framebufferTextureLayer:\n realGL.framebufferTextureLayer?.bind(realGL) ?? noop,\n renderbufferStorageMultisample:\n realGL.renderbufferStorageMultisample?.bind(realGL) ?? noop,\n getBufferSubData: realGL.getBufferSubData?.bind(realGL) ?? noop,\n copyBufferSubData: realGL.copyBufferSubData?.bind(realGL) ?? noop,\n drawRangeElements: realGL.drawRangeElements?.bind(realGL) ?? noop,\n vertexAttribIPointer: realGL.vertexAttribIPointer?.bind(realGL) ?? noop,\n uniform1ui: realGL.uniform1ui?.bind(realGL) ?? noop,\n uniform2ui: realGL.uniform2ui?.bind(realGL) ?? noop,\n uniform3ui: realGL.uniform3ui?.bind(realGL) ?? noop,\n uniform4ui: realGL.uniform4ui?.bind(realGL) ?? noop,\n uniform1uiv: realGL.uniform1uiv?.bind(realGL) ?? noop,\n uniform2uiv: realGL.uniform2uiv?.bind(realGL) ?? noop,\n uniform3uiv: realGL.uniform3uiv?.bind(realGL) ?? noop,\n uniform4uiv: realGL.uniform4uiv?.bind(realGL) ?? noop,\n uniformMatrix2x3fv: realGL.uniformMatrix2x3fv?.bind(realGL) ?? noop,\n uniformMatrix3x2fv: realGL.uniformMatrix3x2fv?.bind(realGL) ?? noop,\n uniformMatrix2x4fv: realGL.uniformMatrix2x4fv?.bind(realGL) ?? noop,\n uniformMatrix4x2fv: realGL.uniformMatrix4x2fv?.bind(realGL) ?? noop,\n uniformMatrix3x4fv: realGL.uniformMatrix3x4fv?.bind(realGL) ?? noop,\n uniformMatrix4x3fv: realGL.uniformMatrix4x3fv?.bind(realGL) ?? noop,\n getInternalformatParameter:\n realGL.getInternalformatParameter?.bind(realGL) ??\n (() => new Int32Array([8])),\n };\n\n return new Proxy(realGL, {\n get(target: any, prop: string | symbol) {\n if (typeof prop !== 'string') {\n return target[prop];\n }\n\n if (prop === 'canvas') {\n return canvas;\n }\n if (prop === 'drawingBufferWidth') {\n return canvas.width || 300;\n }\n if (prop === 'drawingBufferHeight') {\n return canvas.height || 150;\n }\n if (prop === 'drawingBufferColorSpace') {\n return 'srgb';\n }\n\n if (prop === 'getParameter') {\n return (pname: number) => {\n if (pname in getParameterOverrides) {\n return getParameterOverrides[pname];\n }\n try {\n return origGetParameter(pname);\n } catch {\n return 0;\n }\n };\n }\n\n if (prop in webgl2Stubs && typeof target[prop] !== 'function') {\n return webgl2Stubs[prop];\n }\n if (prop in GL2_CONSTANTS && !(prop in target)) {\n return GL2_CONSTANTS[prop];\n }\n\n const value = target[prop];\n return typeof value === 'function' ? value.bind(target) : value;\n },\n });\n};\n\n// Wraps a napi-rs/canvas Canvas so it behaves like an HTMLCanvasElement.\n// Fakes the prototype chain via Proxy getPrototypeOf (GLTFExporter checks instanceof).\n// The 2d context's drawImage is patched to unwrap NAPI_IMAGE symbols.\nconst createCanvasProxy = (\n width: number = 300,\n height: number = 150,\n): HTMLCanvasElement => {\n const napiCanvas = createNapiCanvas(width, height);\n let cachedCtx: any = null;\n let cachedWebGLCtx: any = null;\n\n const proxy = new Proxy(napiCanvas as unknown as HTMLCanvasElement, {\n get(target: any, prop: string | symbol) {\n if (prop === 'style') {\n return target._style ?? (target._style = {});\n }\n if (prop === 'classList') {\n return (\n target._classList ??\n (target._classList = {\n add() {},\n remove() {},\n contains() {\n return false;\n },\n toggle() {},\n })\n );\n }\n if (prop === Symbol.toStringTag) {\n return 'HTMLCanvasElement';\n }\n\n if (prop === 'getContext') {\n return (contextType: string, attrs?: any) => {\n if (contextType === '2d') {\n if (!cachedCtx) {\n cachedCtx = patchContext2d(target.getContext('2d', attrs));\n }\n return cachedCtx;\n }\n if (contextType === 'webgl2' || contextType === 'webgl') {\n if (!cachedWebGLCtx) {\n cachedWebGLCtx = createHeadlessGL\n ? createHybridWebGL2Context(proxy, attrs)\n : createMockWebGL2Context(proxy);\n }\n return cachedWebGLCtx;\n }\n return target.getContext(contextType, attrs);\n };\n }\n\n if (prop === 'addEventListener' || prop === 'removeEventListener') {\n return () => {};\n }\n\n if (prop === 'getBoundingClientRect') {\n return () => ({\n x: 0,\n y: 0,\n width: target.width,\n height: target.height,\n top: 0,\n left: 0,\n bottom: target.height,\n right: target.width,\n });\n }\n\n // When a real GL context exists, blit its pixels into the 2d canvas\n // before exporting so the image contains actual rendered content.\n if (prop === 'toDataURL' && cachedWebGLCtx && createHeadlessGL) {\n return (mimeType?: string, quality?: number) => {\n const w = target.width;\n const h = target.height;\n const pixels = new Uint8Array(w * h * 4);\n cachedWebGLCtx.readPixels(\n 0,\n 0,\n w,\n h,\n cachedWebGLCtx.RGBA ?? 0x1908,\n cachedWebGLCtx.UNSIGNED_BYTE ?? 0x1401,\n pixels,\n );\n // GL produces bottom-up rows; flip for canvas coordinate system.\n const flipped = new Uint8Array(w * h * 4);\n const rowSize = w * 4;\n for (let y = 0; y < h; y++) {\n flipped.set(\n pixels.subarray((h - y - 1) * rowSize, (h - y) * rowSize),\n y * rowSize,\n );\n }\n const ctx2d = target.getContext('2d');\n ctx2d.putImageData(\n new NapiImageData(new Uint8ClampedArray(flipped.buffer), w, h),\n 0,\n 0,\n );\n return target.toDataURL(mimeType, quality);\n };\n }\n\n const value = target[prop];\n return typeof value === 'function' ? value.bind(target) : value;\n },\n\n set(target: any, prop: string | symbol, value: any) {\n target[prop] = value;\n // Resize the ANGLE framebuffer when the canvas dimensions change.\n if (\n cachedWebGLCtx &&\n createHeadlessGL &&\n (prop === 'width' || prop === 'height')\n ) {\n const ext = cachedWebGLCtx.getExtension?.(\n 'STACKGL_resize_drawingbuffer',\n );\n if (ext) {\n ext.resize(target.width, target.height);\n }\n }\n return true;\n },\n\n getPrototypeOf() {\n return HTMLCanvasElement.prototype;\n },\n });\n\n return proxy;\n};\n\n// Creates a happy-dom HTMLImageElement backed by a napi-rs/canvas Image so that\n// images are actually decoded and canvas drawImage() works correctly.\nconst createNapiImageElement = (): HTMLImageElement => {\n const el = origCreateElementNS(\n 'http://www.w3.org/1999/xhtml',\n 'img',\n ) as HTMLImageElement;\n const napiImg = new NapiImage();\n\n (el as any)[NAPI_IMAGE] = napiImg;\n\n let currentSrc = '';\n Object.defineProperty(el, 'src', {\n get() {\n return currentSrc;\n },\n set(url: string) {\n currentSrc = url;\n // napi-rs/canvas Image cannot fetch blob: URLs (created by\n // URL.createObjectURL — used heavily by GLTFLoader for embedded\n // textures). Resolve them ourselves via fetch (Node ≥18 understands\n // its own blob URL registry) and feed the bytes in as a Buffer.\n if (typeof url === 'string' && url.startsWith('blob:')) {\n fetch(url)\n .then((r) => r.arrayBuffer())\n .then((ab) => {\n // Guard against a later src reassignment racing this resolution.\n if (currentSrc !== url) {\n return;\n }\n napiImg.src = Buffer.from(ab);\n })\n .catch((err) => {\n const error = err instanceof Error ? err : new Error(String(err));\n el.dispatchEvent(\n new ErrorEvent('error', { error, message: error.message }),\n );\n });\n return;\n }\n napiImg.src = url;\n },\n configurable: true,\n });\n\n napiImg.onload = () => {\n Object.defineProperty(el, 'width', {\n value: napiImg.width,\n writable: true,\n configurable: true,\n });\n Object.defineProperty(el, 'height', {\n value: napiImg.height,\n writable: true,\n configurable: true,\n });\n Object.defineProperty(el, 'naturalWidth', {\n value: napiImg.naturalWidth,\n configurable: true,\n });\n Object.defineProperty(el, 'naturalHeight', {\n value: napiImg.naturalHeight,\n configurable: true,\n });\n Object.defineProperty(el, 'complete', { value: true, configurable: true });\n el.dispatchEvent(new Event('load'));\n };\n\n napiImg.onerror = (err: Error) => {\n el.dispatchEvent(\n new ErrorEvent('error', { error: err, message: err?.message }),\n );\n };\n\n return el;\n};\n\ndocument.createElement = (\n tagName: string,\n options?: ElementCreationOptions,\n) => {\n if (tagName.toLowerCase() === 'canvas') {\n return createCanvasProxy();\n }\n return origCreateElement(tagName, options);\n};\n\ndocument.createElementNS = (\n namespaceURI: string | null,\n qualifiedName: string,\n options?: ElementCreationOptions,\n) => {\n const tag = qualifiedName.toLowerCase();\n if (tag === 'canvas') {\n return createCanvasProxy();\n }\n if (tag === 'img') {\n return createNapiImageElement();\n }\n return origCreateElementNS(namespaceURI, qualifiedName, options);\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"roomle-headless-setup-Cc8EAnVe.mjs","names":["#registered"],"sources":["../../packages/headless-core/src/setup-environment.ts"],"sourcesContent":["import { createRequire } from 'module';\nimport type { IOptionalBrowserSettings } from 'happy-dom';\n\n// Optional dependencies — must be imported dynamically\nconst napiCanvas = await import('@napi-rs/canvas').catch((): null => null);\nconst happyDom = await import('happy-dom').catch((): null => null);\n\nif (!napiCanvas) {\n throw new Error(\n '[headless] @napi-rs/canvas is required for headless setup. ' +\n 'Install it (it is an optionalDependency of @roomle/web-sdk)',\n );\n}\n\nif (!happyDom) {\n throw new Error(\n '[headless] happy-dom is required for headless setup. ' +\n 'Install it (it is an optionalDependency of @roomle/web-sdk)',\n );\n}\n\nconst {\n createCanvas: createNapiCanvas,\n Image: NapiImage,\n ImageData: NapiImageData,\n} = napiCanvas;\nconst { GlobalWindow, PropertySymbol } = happyDom;\n\n// Network APIs and built-ins that happy-dom must not override —\n// we rely on Node/Bun native implementations for these.\nconst IGNORE_LIST = [\n 'fetch',\n 'Response',\n 'Request',\n 'Headers',\n 'AbortController',\n 'AbortSignal',\n 'ReadableStream',\n 'WritableStream',\n 'TransformStream',\n 'FormData',\n 'URL',\n 'URLSearchParams',\n 'Blob',\n 'File',\n 'constructor',\n 'undefined',\n 'NaN',\n 'global',\n 'globalThis',\n];\n\nclass GlobalRegistrator {\n static #registered: {\n [key: string | symbol]: PropertyDescriptor | null;\n } | null = null;\n\n public static get isRegistered(): boolean {\n return this.#registered !== null;\n }\n\n public static register(options?: {\n width?: number;\n height?: number;\n url?: string;\n settings?: IOptionalBrowserSettings;\n }): void {\n if (this.#registered !== null) {\n throw new Error(\n 'Failed to register. Happy DOM has already been globally registered.',\n );\n }\n\n const window = new GlobalWindow({\n ...options,\n console: globalThis.console,\n });\n\n this.#registered = {};\n\n const propertyDescriptors = Object.getOwnPropertyDescriptors(window);\n\n for (const key of Object.keys(propertyDescriptors)) {\n if (!IGNORE_LIST.includes(key)) {\n const windowPropertyDescriptor = propertyDescriptors[key];\n const globalPropertyDescriptor = Object.getOwnPropertyDescriptor(\n globalThis,\n key,\n );\n\n if (\n globalPropertyDescriptor?.value === undefined ||\n globalPropertyDescriptor?.value !== windowPropertyDescriptor?.value\n ) {\n this.#registered[key] = globalPropertyDescriptor || null;\n\n if (windowPropertyDescriptor?.value === window) {\n (window as any)[key] = globalThis;\n windowPropertyDescriptor.value = globalThis;\n }\n\n Object.defineProperty(globalThis, key, {\n ...windowPropertyDescriptor,\n configurable: true,\n });\n }\n }\n }\n\n const propertySymbols = Object.getOwnPropertySymbols(window);\n\n for (const key of propertySymbols) {\n const propertyDescriptor = Object.getOwnPropertyDescriptor(window, key);\n this.#registered[key] = null;\n\n if (propertyDescriptor!.value === window) {\n (window as any)[key] = globalThis;\n propertyDescriptor!.value = globalThis;\n }\n\n Object.defineProperty(globalThis, key, {\n ...propertyDescriptor,\n configurable: true,\n });\n }\n\n (globalThis as any).document[PropertySymbol.defaultView] = globalThis;\n }\n\n public static async unregister(): Promise<void> {\n if (this.#registered === null) {\n throw new Error(\n 'Failed to unregister. Happy DOM has not previously been globally registered.',\n );\n }\n\n const happyDOM = (globalThis as any).happyDOM;\n\n for (const key of Object.keys(this.#registered)) {\n if (this.#registered[key] !== null) {\n Object.defineProperty(globalThis, key, this.#registered[key]!);\n } else {\n delete (globalThis as any)[key];\n }\n }\n\n this.#registered = null;\n\n if (happyDOM) {\n await happyDOM.close();\n }\n }\n}\n\n// Resolves the bundle directory so root-relative Vite asset URLs like\n// \"/default_256.exr\" can be mapped to real files next to the bundle.\n// We use a bare `import.meta.url` (not wrapped in `new URL(…, import.meta.url)`)\n// because Rollup replaces the latter pattern with a data: URI at build time.\nconst _setupRequire = createRequire(import.meta.url);\nconst _fsSync = _setupRequire('fs');\nconst _pathSync = _setupRequire('path');\nconst _urlSync = _setupRequire('url');\nlet _bundleDir = '';\ntry {\n _bundleDir = _pathSync.dirname(_urlSync.fileURLToPath(import.meta.url));\n} catch {\n // Not a file: URL (e.g. some test runners) — root-relative resolution skipped.\n}\n\n/** Maps a root-relative path (e.g. \"/default_256.exr\") to a local file path\n * next to the bundle. Returns null when the file doesn't exist. */\nconst _resolveRootRelative = (urlPath: string): string | null => {\n if (!_bundleDir || !urlPath.startsWith('/') || urlPath.startsWith('//')) {\n return null;\n }\n const candidate = _pathSync.join(_bundleDir, urlPath);\n return _fsSync.existsSync(candidate) ? candidate : null;\n};\n\n// Patch globalThis.fetch to handle:\n// 1. file:// URLs — Node/undici rejects these natively; Bun accepts them.\n// 2. Root-relative URLs (e.g. \"/default_256.exr\") — emitted by Vite's ?url\n// transform; no web server in Node means native fetch throws \"Invalid URL\".\nconst _nativeFetch = globalThis.fetch;\n// @ts-ignore -- this conflicts with DOM types.\nglobalThis.fetch = async (\n input: string | URL | Request,\n init?: RequestInit,\n): Promise<Response> => {\n const url =\n typeof input === 'string'\n ? input\n : input instanceof URL\n ? input.href\n : (input as any).url ?? String(input);\n\n if (url.startsWith('file://')) {\n const buffer = _fsSync.readFileSync(_urlSync.fileURLToPath(url));\n return new Response(buffer, {\n status: 200,\n headers: { 'Content-Type': 'application/octet-stream' },\n });\n }\n\n if (url.startsWith('/') && !url.startsWith('//')) {\n const localPath = _resolveRootRelative(url);\n if (localPath) {\n return new Response(_fsSync.readFileSync(localPath), {\n status: 200,\n headers: { 'Content-Type': 'application/octet-stream' },\n });\n }\n console.warn(\n `[headless] fetch: root-relative asset not found: ${url} (bundle dir: ${_bundleDir || 'unknown'})`,\n );\n return new Response(null, { status: 404, statusText: 'Not Found' });\n }\n\n return _nativeFetch.call(this, input, init);\n};\n\n// Proxy-wrap globalThis.Request so root-relative paths are converted to\n// file:// URLs before the constructor validates them. Three.js's FileLoader\n// calls `new Request(url)` before fetch(), so our fetch patch above is never\n// reached if the constructor throws first.\nconst _OrigRequest = (globalThis as any).Request;\nif (_OrigRequest) {\n (globalThis as any).Request = new Proxy(_OrigRequest, {\n construct(Target: any, [input, init]: [any, any]) {\n if (\n typeof input === 'string' &&\n input.startsWith('/') &&\n !input.startsWith('//')\n ) {\n const localPath =\n _resolveRootRelative(input) ??\n _pathSync.join(_bundleDir || '/tmp', input);\n input = _urlSync.pathToFileURL(localPath).href;\n }\n return Reflect.construct(\n Target,\n init !== undefined ? [input, init] : [input],\n Target,\n );\n },\n get(target: any, prop: string | symbol) {\n return target[prop];\n },\n });\n}\n\nGlobalRegistrator.register();\n\n// Provide napi-rs/canvas ImageData globally — GLTFExporter uses `new ImageData(…)`\n// directly, and we excluded happy-dom's version from the registration above.\nif (typeof (globalThis as any).ImageData === 'undefined') {\n (globalThis as any).ImageData = NapiImageData;\n}\n\n// FileReader shim — happy-dom's FileReader only accepts happy-dom Blobs, but\n// we keep Node's native Blob (see IGNORE_LIST). The inverse mismatch breaks\n// GLTFExporter which does `new FileReader().readAsArrayBuffer(new Blob(...))`\nclass NodeFileReader {\n public result: ArrayBuffer | string | null = null;\n public error: unknown = null;\n public readyState: number = 0;\n public onload: ((ev: any) => void) | null = null;\n public onloadend: ((ev: any) => void) | null = null;\n public onerror: ((ev: any) => void) | null = null;\n\n readAsArrayBuffer(blob: Blob): void {\n this.readyState = 1;\n blob.arrayBuffer().then(\n (buf) => {\n this.result = buf;\n this.readyState = 2;\n const ev = { target: this };\n this.onload?.(ev);\n this.onloadend?.(ev);\n },\n (err) => {\n this.error = err;\n this.readyState = 2;\n const ev = { target: this };\n this.onerror?.(ev);\n this.onloadend?.(ev);\n },\n );\n }\n\n readAsDataURL(blob: Blob): void {\n this.readyState = 1;\n blob.arrayBuffer().then(\n (buf) => {\n const b64 = Buffer.from(buf).toString('base64');\n const type = (blob as any).type || 'application/octet-stream';\n this.result = `data:${type};base64,${b64}`;\n this.readyState = 2;\n const ev = { target: this };\n this.onload?.(ev);\n this.onloadend?.(ev);\n },\n (err) => {\n this.error = err;\n this.readyState = 2;\n const ev = { target: this };\n this.onerror?.(ev);\n this.onloadend?.(ev);\n },\n );\n }\n\n readAsText(blob: Blob): void {\n this.readyState = 1;\n blob.text().then(\n (text) => {\n this.result = text;\n this.readyState = 2;\n const ev = { target: this };\n this.onload?.(ev);\n this.onloadend?.(ev);\n },\n (err) => {\n this.error = err;\n this.readyState = 2;\n const ev = { target: this };\n this.onerror?.(ev);\n this.onloadend?.(ev);\n },\n );\n }\n\n abort(): void {}\n}\n\n(globalThis as any).FileReader = NodeFileReader;\n\n// Symbol for storing the underlying NapiImage on wrapper elements so that\n// the patched 2d context can unwrap it before calling the native drawImage.\nconst NAPI_IMAGE = Symbol('napiImage');\n\nconst origCreateElement = document.createElement.bind(document);\nconst origCreateElementNS = document.createElementNS.bind(document);\n\n// Patches a napi-rs/canvas 2d context so drawImage() unwraps NAPI_IMAGE wrappers.\n// Skia's native drawImage only accepts its own Image/Canvas types.\nconst patchContext2d = (ctx: any): any => {\n const origDrawImage = ctx.drawImage.bind(ctx);\n ctx.drawImage = (image: any, ...args: any[]) => {\n const real = image?.[NAPI_IMAGE] ?? image;\n return origDrawImage(real, ...args);\n };\n return ctx;\n};\n\nlet createHeadlessGL: ((w: number, h: number, opts?: any) => any) | null = null;\n\ntry {\n // @ts-ignore -- We do not install gl by default during dev, only when consuming the sdk for headless mode, this is temporary.\n const { createContext } = await import('gl');\n createHeadlessGL = createContext;\n console.log('[headless] Using headless-gl (ANGLE) for real WebGL rendering');\n} catch (e) {\n console.log(e);\n console.log('[headless] headless-gl not available, using mock WebGL context');\n}\n\n// No-op WebGL2 context — all draw calls are no-ops but Three.js initialises\n// successfully. Used when headless-gl is unavailable (Bun).\nconst createMockWebGL2Context = (canvas: any): any => {\n let _id = 1;\n const nextId = () => ({ _mockId: _id++ });\n\n const ctx: Record<string, any> = {\n canvas,\n drawingBufferWidth: canvas.width || 300,\n drawingBufferHeight: canvas.height || 150,\n drawingBufferColorSpace: 'srgb',\n\n // ── Capability queries ──\n getParameter(pname: number) {\n const params: Record<number, any> = {\n 0x1f02: 'WebGL 2.0 (Mock)', // VERSION\n 0x8b8c: 'OpenGL ES GLSL ES 3.00', // SHADING_LANGUAGE_VERSION\n 0x1f00: 'Mock', // VENDOR\n 0x1f01: 'Mock Headless Renderer', // RENDERER\n 0x0d33: 16384, // MAX_TEXTURE_SIZE\n 0x851c: 16, // MAX_TEXTURE_IMAGE_UNITS\n 0x8869: 16, // MAX_VERTEX_ATTRIBS\n 0x8872: 32, // MAX_COMBINED_TEXTURE_IMAGE_UNITS\n 0x8dfb: 32, // MAX_VARYING_VECTORS\n 0x8b4c: 4096, // MAX_VERTEX_UNIFORM_VECTORS\n 0x8b49: 4096, // MAX_FRAGMENT_UNIFORM_VECTORS\n 0x88ff: 16, // MAX_VERTEX_TEXTURE_IMAGE_UNITS\n 0x8073: 2048, // MAX_3D_TEXTURE_SIZE\n 0x8cdf: 32, // MAX_COLOR_ATTACHMENTS\n 0x8824: 8, // MAX_DRAW_BUFFERS\n 0x80e9: 65536, // MAX_ELEMENTS_VERTICES\n 0x80ea: 65536, // MAX_ELEMENTS_INDICES\n 0x9122: 16, // MAX_SAMPLES\n 0x8d6b: 2048, // MAX_ARRAY_TEXTURE_LAYERS\n 0x8a2b: 16384, // MAX_UNIFORM_BLOCK_SIZE\n 0x8c2b: 16, // MAX_VERTEX_UNIFORM_BLOCKS\n 0x8a30: 24, // MAX_UNIFORM_BUFFER_BINDINGS\n 0x8a2f: 256, // UNIFORM_BUFFER_OFFSET_ALIGNMENT\n 0x0d32: new Int32Array([16384, 16384]), // MAX_VIEWPORT_DIMS\n 0x84fe: 16, // MAX_TEXTURE_MAX_ANISOTROPY_EXT\n 0x8b4a: 4096, // MAX_FRAGMENT_UNIFORM_COMPONENTS\n 0x8b4d: 4096, // MAX_VERTEX_UNIFORM_COMPONENTS\n 0x8c8a: 0, // MAX_VARYING_COMPONENTS\n 0x0b71: 1, // DEPTH_BITS\n 0x0d55: 4, // PACK_ALIGNMENT\n 0x0cf5: 4, // UNPACK_ALIGNMENT\n 0x9245: 0, // UNPACK_ROW_LENGTH\n 0x9243: 0, // UNPACK_IMAGE_HEIGHT\n 0x9244: 0, // UNPACK_SKIP_PIXELS\n 0x9246: 0, // UNPACK_SKIP_ROWS\n 0x9247: 0, // UNPACK_SKIP_IMAGES\n };\n return params[pname] ?? 0;\n },\n\n getExtension(name: string) {\n if (\n name === 'EXT_texture_filter_anisotropic' ||\n name === 'WEBKIT_EXT_texture_filter_anisotropic'\n ) {\n return {\n TEXTURE_MAX_ANISOTROPY_EXT: 0x84fe,\n MAX_TEXTURE_MAX_ANISOTROPY_EXT: 0x84ff,\n };\n }\n if (\n name === 'EXT_color_buffer_float' ||\n name === 'EXT_color_buffer_half_float' ||\n name === 'OES_texture_float_linear' ||\n name === 'OES_texture_half_float_linear' ||\n name === 'EXT_float_blend'\n ) {\n return {};\n }\n return null;\n },\n\n getSupportedExtensions() {\n return [\n 'EXT_texture_filter_anisotropic',\n 'EXT_color_buffer_float',\n 'OES_texture_float_linear',\n 'OES_texture_half_float_linear',\n 'EXT_float_blend',\n ];\n },\n\n // ── Shader / Program ──\n createShader: () => nextId(),\n shaderSource() {},\n compileShader() {},\n getShaderParameter(_s: any, pname: number) {\n return pname === 0x8b81 ? true : 0; // COMPILE_STATUS\n },\n getShaderInfoLog() {\n return '';\n },\n deleteShader() {},\n createProgram: () => nextId(),\n attachShader() {},\n linkProgram() {},\n getProgramParameter(_p: any, pname: number) {\n if (pname === 0x8b82) {\n return true;\n } // LINK_STATUS\n if (pname === 0x8b86) {\n return 0;\n } // ACTIVE_UNIFORMS\n if (pname === 0x8b89) {\n return 0;\n } // ACTIVE_ATTRIBUTES\n if (pname === 0x8a36) {\n return 0;\n } // ACTIVE_UNIFORM_BLOCKS\n if (pname === 0x8c76) {\n return 0;\n } // TRANSFORM_FEEDBACK_VARYINGS\n return 0;\n },\n getProgramInfoLog() {\n return '';\n },\n useProgram() {},\n deleteProgram() {},\n detachShader() {},\n validateProgram() {},\n\n // ── Precision ──\n getShaderPrecisionFormat() {\n return { rangeMin: 127, rangeMax: 127, precision: 23 };\n },\n\n // ── Uniforms / Attributes ──\n getAttribLocation() {\n return 0;\n },\n getUniformLocation() {\n return nextId();\n },\n getActiveAttrib() {\n return { name: 'a', type: 0x1406, size: 1 };\n },\n getActiveUniform() {\n return { name: 'u', type: 0x1406, size: 1 };\n },\n uniform1f() {},\n uniform2f() {},\n uniform3f() {},\n uniform4f() {},\n uniform1i() {},\n uniform2i() {},\n uniform3i() {},\n uniform4i() {},\n uniform1ui() {},\n uniform2ui() {},\n uniform3ui() {},\n uniform4ui() {},\n uniform1fv() {},\n uniform2fv() {},\n uniform3fv() {},\n uniform4fv() {},\n uniform1iv() {},\n uniform2iv() {},\n uniform3iv() {},\n uniform4iv() {},\n uniform1uiv() {},\n uniform2uiv() {},\n uniform3uiv() {},\n uniform4uiv() {},\n uniformMatrix2fv() {},\n uniformMatrix3fv() {},\n uniformMatrix4fv() {},\n uniformMatrix2x3fv() {},\n uniformMatrix3x2fv() {},\n uniformMatrix2x4fv() {},\n uniformMatrix4x2fv() {},\n uniformMatrix3x4fv() {},\n uniformMatrix4x3fv() {},\n\n // ── Buffers ──\n createBuffer: () => nextId(),\n bindBuffer() {},\n bufferData() {},\n bufferSubData() {},\n deleteBuffer() {},\n getBufferSubData() {},\n copyBufferSubData() {},\n isBuffer() {\n return true;\n },\n bindBufferBase() {},\n bindBufferRange() {},\n\n // ── Vertex Arrays ──\n createVertexArray: () => nextId(),\n bindVertexArray() {},\n deleteVertexArray() {},\n isVertexArray() {\n return true;\n },\n enableVertexAttribArray() {},\n disableVertexAttribArray() {},\n vertexAttribPointer() {},\n vertexAttribIPointer() {},\n vertexAttribDivisor() {},\n vertexAttrib1f() {},\n vertexAttrib2f() {},\n vertexAttrib3f() {},\n vertexAttrib4f() {},\n vertexAttrib1fv() {},\n vertexAttrib2fv() {},\n vertexAttrib3fv() {},\n vertexAttrib4fv() {},\n\n // ── Textures ──\n createTexture: () => nextId(),\n bindTexture() {},\n activeTexture() {},\n pixelStorei() {},\n texImage2D() {},\n texImage3D() {},\n texSubImage2D() {},\n texSubImage3D() {},\n compressedTexImage2D() {},\n compressedTexSubImage2D() {},\n compressedTexImage3D() {},\n compressedTexSubImage3D() {},\n texParameteri() {},\n texParameterf() {},\n texStorage2D() {},\n texStorage3D() {},\n generateMipmap() {},\n deleteTexture() {},\n copyTexImage2D() {},\n copyTexSubImage2D() {},\n isTexture() {\n return true;\n },\n\n // ── Framebuffers ──\n createFramebuffer: () => nextId(),\n bindFramebuffer() {},\n deleteFramebuffer() {},\n framebufferTexture2D() {},\n framebufferTextureLayer() {},\n framebufferRenderbuffer() {},\n checkFramebufferStatus() {\n return 0x8cd5;\n }, // FRAMEBUFFER_COMPLETE\n readPixels() {},\n blitFramebuffer() {},\n invalidateFramebuffer() {},\n readBuffer() {},\n drawBuffers() {},\n isFramebuffer() {\n return true;\n },\n\n // ── Renderbuffers ──\n createRenderbuffer: () => nextId(),\n bindRenderbuffer() {},\n renderbufferStorage() {},\n renderbufferStorageMultisample() {},\n deleteRenderbuffer() {},\n isRenderbuffer() {\n return true;\n },\n getRenderbufferParameter() {\n return 0;\n },\n\n // ── Draw / Clear ──\n clear() {},\n clearColor() {},\n clearDepth() {},\n clearStencil() {},\n colorMask() {},\n depthMask() {},\n stencilMask() {},\n stencilMaskSeparate() {},\n viewport() {},\n scissor() {},\n drawArrays() {},\n drawElements() {},\n drawArraysInstanced() {},\n drawElementsInstanced() {},\n drawRangeElements() {},\n\n // ── State ──\n enable() {},\n disable() {},\n isEnabled() {\n return false;\n },\n blendFunc() {},\n blendFuncSeparate() {},\n blendEquation() {},\n blendEquationSeparate() {},\n blendColor() {},\n depthFunc() {},\n depthRange() {},\n stencilFunc() {},\n stencilFuncSeparate() {},\n stencilOp() {},\n stencilOpSeparate() {},\n cullFace() {},\n frontFace() {},\n lineWidth() {},\n polygonOffset() {},\n sampleCoverage() {},\n\n // ── Transform Feedback ──\n createTransformFeedback: () => nextId(),\n bindTransformFeedback() {},\n beginTransformFeedback() {},\n endTransformFeedback() {},\n transformFeedbackVaryings() {},\n deleteTransformFeedback() {},\n pauseTransformFeedback() {},\n resumeTransformFeedback() {},\n\n // ── Queries ──\n createQuery: () => nextId(),\n deleteQuery() {},\n beginQuery() {},\n endQuery() {},\n getQueryParameter() {\n return 0;\n },\n getQuery(): null {\n return null;\n },\n\n // ── Sync ──\n fenceSync: () => nextId(),\n deleteSync() {},\n clientWaitSync() {\n return 0x911d;\n },\n waitSync() {},\n getSyncParameter() {\n return 0x9119;\n },\n\n // ── Samplers ──\n createSampler: () => nextId(),\n deleteSampler() {},\n bindSampler() {},\n samplerParameteri() {},\n samplerParameterf() {},\n isSampler() {\n return true;\n },\n\n // ── Uniform Blocks ──\n getUniformBlockIndex() {\n return 0;\n },\n uniformBlockBinding() {},\n getActiveUniformBlockParameter() {\n return 0;\n },\n getActiveUniformBlockName() {\n return '';\n },\n getUniformIndices(): any[] {\n return [];\n },\n getActiveUniforms(): any[] {\n return [];\n },\n\n // ── Misc ──\n finish() {},\n flush() {},\n getError() {\n return 0;\n },\n isContextLost() {\n return false;\n },\n getContextAttributes() {\n return {\n alpha: true,\n antialias: true,\n depth: true,\n failIfMajorPerformanceCaveat: false,\n powerPreference: 'default',\n premultipliedAlpha: true,\n preserveDrawingBuffer: false,\n stencil: true,\n desynchronized: false,\n };\n },\n getInternalformatParameter() {\n return new Int32Array([8]);\n },\n hint() {},\n makeXRCompatible() {\n return Promise.resolve();\n },\n };\n\n // WebGL 1 + 2 constants needed by Three.js\n const GL_CONSTANTS: Record<string, number> = {\n DEPTH_BUFFER_BIT: 0x00000100,\n STENCIL_BUFFER_BIT: 0x00000400,\n COLOR_BUFFER_BIT: 0x00004000,\n POINTS: 0x0000,\n LINES: 0x0001,\n LINE_LOOP: 0x0002,\n LINE_STRIP: 0x0003,\n TRIANGLES: 0x0004,\n TRIANGLE_STRIP: 0x0005,\n TRIANGLE_FAN: 0x0006,\n ZERO: 0,\n ONE: 1,\n SRC_COLOR: 0x0300,\n ONE_MINUS_SRC_COLOR: 0x0301,\n SRC_ALPHA: 0x0302,\n ONE_MINUS_SRC_ALPHA: 0x0303,\n DST_ALPHA: 0x0304,\n ONE_MINUS_DST_ALPHA: 0x0305,\n DST_COLOR: 0x0306,\n ONE_MINUS_DST_COLOR: 0x0307,\n SRC_ALPHA_SATURATE: 0x0308,\n CONSTANT_COLOR: 0x8001,\n ONE_MINUS_CONSTANT_COLOR: 0x8002,\n CONSTANT_ALPHA: 0x8003,\n ONE_MINUS_CONSTANT_ALPHA: 0x8004,\n FUNC_ADD: 0x8006,\n FUNC_SUBTRACT: 0x800a,\n FUNC_REVERSE_SUBTRACT: 0x800b,\n MIN: 0x8007,\n MAX: 0x8008,\n BLEND_EQUATION: 0x8009,\n BLEND_EQUATION_RGB: 0x8009,\n BLEND_EQUATION_ALPHA: 0x883d,\n BLEND_DST_RGB: 0x80c8,\n BLEND_SRC_RGB: 0x80c9,\n BLEND_DST_ALPHA: 0x80ca,\n BLEND_SRC_ALPHA: 0x80cb,\n BLEND_COLOR: 0x8005,\n BLEND: 0x0be2,\n ARRAY_BUFFER: 0x8892,\n ELEMENT_ARRAY_BUFFER: 0x8893,\n ARRAY_BUFFER_BINDING: 0x8894,\n ELEMENT_ARRAY_BUFFER_BINDING: 0x8895,\n STREAM_DRAW: 0x88e0,\n STATIC_DRAW: 0x88e4,\n DYNAMIC_DRAW: 0x88e8,\n STREAM_READ: 0x88e1,\n STREAM_COPY: 0x88e2,\n STATIC_READ: 0x88e5,\n STATIC_COPY: 0x88e6,\n DYNAMIC_READ: 0x88e9,\n DYNAMIC_COPY: 0x88ea,\n BUFFER_SIZE: 0x8764,\n BUFFER_USAGE: 0x8765,\n CURRENT_VERTEX_ATTRIB: 0x8626,\n CULL_FACE: 0x0b44,\n FRONT: 0x0404,\n BACK: 0x0405,\n FRONT_AND_BACK: 0x0408,\n DEPTH_TEST: 0x0b71,\n DEPTH_WRITEMASK: 0x0b72,\n STENCIL_TEST: 0x0b90,\n SCISSOR_TEST: 0x0c11,\n POLYGON_OFFSET_FILL: 0x8037,\n SAMPLE_ALPHA_TO_COVERAGE: 0x809e,\n SAMPLE_COVERAGE: 0x80a0,\n DITHER: 0x0bd0,\n NEVER: 0x0200,\n LESS: 0x0201,\n EQUAL: 0x0202,\n LEQUAL: 0x0203,\n GREATER: 0x0204,\n NOTEQUAL: 0x0205,\n GEQUAL: 0x0206,\n ALWAYS: 0x0207,\n KEEP: 0x1e00,\n REPLACE: 0x1e01,\n INCR: 0x1e02,\n DECR: 0x1e03,\n INVERT: 0x150a,\n INCR_WRAP: 0x8507,\n DECR_WRAP: 0x8508,\n NEAREST: 0x2600,\n LINEAR: 0x2601,\n NEAREST_MIPMAP_NEAREST: 0x2700,\n LINEAR_MIPMAP_NEAREST: 0x2701,\n NEAREST_MIPMAP_LINEAR: 0x2702,\n LINEAR_MIPMAP_LINEAR: 0x2703,\n TEXTURE_MAG_FILTER: 0x2800,\n TEXTURE_MIN_FILTER: 0x2801,\n TEXTURE_WRAP_S: 0x2802,\n TEXTURE_WRAP_T: 0x2803,\n TEXTURE_2D: 0x0de1,\n TEXTURE_3D: 0x806f,\n TEXTURE: 0x1702,\n TEXTURE_CUBE_MAP: 0x8513,\n TEXTURE_BINDING_CUBE_MAP: 0x8514,\n TEXTURE_CUBE_MAP_POSITIVE_X: 0x8515,\n TEXTURE_CUBE_MAP_NEGATIVE_X: 0x8516,\n TEXTURE_CUBE_MAP_POSITIVE_Y: 0x8517,\n TEXTURE_CUBE_MAP_NEGATIVE_Y: 0x8518,\n TEXTURE_CUBE_MAP_POSITIVE_Z: 0x8519,\n TEXTURE_CUBE_MAP_NEGATIVE_Z: 0x851a,\n MAX_CUBE_MAP_TEXTURE_SIZE: 0x851c,\n TEXTURE0: 0x84c0,\n TEXTURE1: 0x84c1,\n TEXTURE2: 0x84c2,\n TEXTURE3: 0x84c3,\n TEXTURE4: 0x84c4,\n TEXTURE5: 0x84c5,\n TEXTURE6: 0x84c6,\n TEXTURE7: 0x84c7,\n TEXTURE8: 0x84c8,\n TEXTURE9: 0x84c9,\n TEXTURE10: 0x84ca,\n TEXTURE11: 0x84cb,\n TEXTURE12: 0x84cc,\n TEXTURE13: 0x84cd,\n TEXTURE14: 0x84ce,\n TEXTURE15: 0x84cf,\n TEXTURE16: 0x84d0,\n TEXTURE17: 0x84d1,\n TEXTURE18: 0x84d2,\n TEXTURE19: 0x84d3,\n TEXTURE20: 0x84d4,\n TEXTURE21: 0x84d5,\n TEXTURE22: 0x84d6,\n TEXTURE23: 0x84d7,\n TEXTURE24: 0x84d8,\n TEXTURE25: 0x84d9,\n TEXTURE26: 0x84da,\n TEXTURE27: 0x84db,\n TEXTURE28: 0x84dc,\n TEXTURE29: 0x84dd,\n TEXTURE30: 0x84de,\n TEXTURE31: 0x84df,\n ACTIVE_TEXTURE: 0x84e0,\n REPEAT: 0x2901,\n CLAMP_TO_EDGE: 0x812f,\n MIRRORED_REPEAT: 0x8370,\n FLOAT: 0x1406,\n FLOAT_VEC2: 0x8b50,\n FLOAT_VEC3: 0x8b51,\n FLOAT_VEC4: 0x8b52,\n INT: 0x1404,\n INT_VEC2: 0x8b53,\n INT_VEC3: 0x8b54,\n INT_VEC4: 0x8b55,\n UNSIGNED_INT: 0x1405,\n BOOL: 0x8b56,\n BOOL_VEC2: 0x8b57,\n BOOL_VEC3: 0x8b58,\n BOOL_VEC4: 0x8b59,\n FLOAT_MAT2: 0x8b5a,\n FLOAT_MAT3: 0x8b5b,\n FLOAT_MAT4: 0x8b5c,\n SAMPLER_2D: 0x8b5e,\n SAMPLER_CUBE: 0x8b60,\n BYTE: 0x1400,\n UNSIGNED_BYTE: 0x1401,\n SHORT: 0x1402,\n UNSIGNED_SHORT: 0x1403,\n UNSIGNED_SHORT_4_4_4_4: 0x8033,\n UNSIGNED_SHORT_5_5_5_1: 0x8034,\n UNSIGNED_SHORT_5_6_5: 0x8363,\n UNSIGNED_INT_24_8: 0x84fa,\n HALF_FLOAT: 0x140b,\n FRAGMENT_SHADER: 0x8b30,\n VERTEX_SHADER: 0x8b31,\n MAX_VERTEX_ATTRIBS: 0x8869,\n MAX_VERTEX_UNIFORM_VECTORS: 0x8b4c,\n MAX_VARYING_VECTORS: 0x8dfb,\n MAX_COMBINED_TEXTURE_IMAGE_UNITS: 0x8b4d,\n MAX_VERTEX_TEXTURE_IMAGE_UNITS: 0x88ff,\n MAX_TEXTURE_IMAGE_UNITS: 0x8872,\n MAX_FRAGMENT_UNIFORM_VECTORS: 0x8b49,\n SHADER_TYPE: 0x8b4f,\n DELETE_STATUS: 0x8b80,\n LINK_STATUS: 0x8b82,\n VALIDATE_STATUS: 0x8b83,\n ATTACHED_SHADERS: 0x8b85,\n ACTIVE_UNIFORMS: 0x8b86,\n ACTIVE_ATTRIBUTES: 0x8b89,\n COMPILE_STATUS: 0x8b81,\n FRAMEBUFFER: 0x8d40,\n RENDERBUFFER: 0x8d41,\n RGBA4: 0x8056,\n RGB5_A1: 0x8057,\n RGB565: 0x8d62,\n DEPTH_COMPONENT16: 0x81a5,\n DEPTH_COMPONENT24: 0x81a6,\n DEPTH_COMPONENT32F: 0x8cac,\n DEPTH24_STENCIL8: 0x88f0,\n DEPTH32F_STENCIL8: 0x8cad,\n STENCIL_INDEX8: 0x8d48,\n RENDERBUFFER_WIDTH: 0x8d42,\n RENDERBUFFER_HEIGHT: 0x8d43,\n RENDERBUFFER_INTERNAL_FORMAT: 0x8d44,\n FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: 0x8cd0,\n FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: 0x8cd1,\n FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: 0x8cd2,\n FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: 0x8cd3,\n COLOR_ATTACHMENT0: 0x8ce0,\n COLOR_ATTACHMENT1: 0x8ce1,\n COLOR_ATTACHMENT2: 0x8ce2,\n COLOR_ATTACHMENT3: 0x8ce3,\n DEPTH_ATTACHMENT: 0x8d00,\n STENCIL_ATTACHMENT: 0x8d20,\n DEPTH_STENCIL_ATTACHMENT: 0x821a,\n DEPTH_STENCIL: 0x84f9,\n FRAMEBUFFER_COMPLETE: 0x8cd5,\n FRAMEBUFFER_INCOMPLETE_ATTACHMENT: 0x8cd6,\n FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: 0x8cd7,\n FRAMEBUFFER_INCOMPLETE_DIMENSIONS: 0x8cd9,\n FRAMEBUFFER_UNSUPPORTED: 0x8cdd,\n FRAMEBUFFER_BINDING: 0x8ca6,\n RENDERBUFFER_BINDING: 0x8ca7,\n MAX_RENDERBUFFER_SIZE: 0x84e8,\n INVALID_FRAMEBUFFER_OPERATION: 0x0506,\n UNPACK_FLIP_Y_WEBGL: 0x9240,\n UNPACK_PREMULTIPLY_ALPHA_WEBGL: 0x9241,\n UNPACK_COLORSPACE_CONVERSION_WEBGL: 0x9243,\n READ_BUFFER: 0x0c02,\n UNPACK_ROW_LENGTH: 0x0cf2,\n UNPACK_SKIP_ROWS: 0x0cf3,\n UNPACK_SKIP_PIXELS: 0x0cf4,\n PACK_ROW_LENGTH: 0x0d02,\n PACK_SKIP_ROWS: 0x0d03,\n PACK_SKIP_PIXELS: 0x0d04,\n TEXTURE_BINDING_3D: 0x806a,\n UNPACK_SKIP_IMAGES: 0x806d,\n UNPACK_IMAGE_HEIGHT: 0x806e,\n MAX_3D_TEXTURE_SIZE: 0x8073,\n MAX_ELEMENTS_VERTICES: 0x80e9,\n MAX_ELEMENTS_INDICES: 0x80ea,\n MAX_TEXTURE_LOD_BIAS: 0x84fd,\n MAX_DRAW_BUFFERS: 0x8824,\n DRAW_BUFFER0: 0x8825,\n MAX_FRAGMENT_UNIFORM_COMPONENTS: 0x8b49,\n MAX_VERTEX_UNIFORM_COMPONENTS: 0x8b4a,\n MAX_ARRAY_TEXTURE_LAYERS: 0x88ff,\n MIN_PROGRAM_TEXEL_OFFSET: 0x8904,\n MAX_PROGRAM_TEXEL_OFFSET: 0x8905,\n MAX_VARYING_COMPONENTS: 0x8b4b,\n TEXTURE_2D_ARRAY: 0x8c1a,\n TEXTURE_BINDING_2D_ARRAY: 0x8c1d,\n UNIFORM_BUFFER: 0x8a11,\n UNIFORM_BUFFER_BINDING: 0x8a28,\n MAX_VERTEX_UNIFORM_BLOCKS: 0x8a2b,\n MAX_FRAGMENT_UNIFORM_BLOCKS: 0x8a2d,\n MAX_COMBINED_UNIFORM_BLOCKS: 0x8a2e,\n MAX_UNIFORM_BUFFER_BINDINGS: 0x8a2f,\n MAX_UNIFORM_BLOCK_SIZE: 0x8a30,\n UNIFORM_BUFFER_OFFSET_ALIGNMENT: 0x8a34,\n ACTIVE_UNIFORM_BLOCKS: 0x8a36,\n TRANSFORM_FEEDBACK_BUFFER: 0x8c8e,\n TRANSFORM_FEEDBACK_BUFFER_BINDING: 0x8c8f,\n TRANSFORM_FEEDBACK_VARYINGS: 0x8c83,\n TRANSFORM_FEEDBACK: 0x8e22,\n PIXEL_PACK_BUFFER: 0x88eb,\n PIXEL_UNPACK_BUFFER: 0x88ec,\n COPY_READ_BUFFER: 0x8f36,\n COPY_WRITE_BUFFER: 0x8f37,\n DRAW_FRAMEBUFFER: 0x8ca9,\n READ_FRAMEBUFFER: 0x8ca8,\n DRAW_FRAMEBUFFER_BINDING: 0x8ca6,\n READ_FRAMEBUFFER_BINDING: 0x8caa,\n RENDERBUFFER_SAMPLES: 0x8cab,\n MAX_COLOR_ATTACHMENTS: 0x8cdf,\n TEXTURE_COMPARE_MODE: 0x884c,\n TEXTURE_COMPARE_FUNC: 0x884d,\n COMPARE_REF_TO_TEXTURE: 0x884e,\n TEXTURE_WRAP_R: 0x8072,\n TEXTURE_MIN_LOD: 0x813a,\n TEXTURE_MAX_LOD: 0x813b,\n TEXTURE_BASE_LEVEL: 0x813c,\n TEXTURE_MAX_LEVEL: 0x813d,\n TEXTURE_IMMUTABLE_FORMAT: 0x912f,\n TEXTURE_IMMUTABLE_LEVELS: 0x82df,\n RGBA8: 0x8058,\n RGB8: 0x8051,\n RG8: 0x822b,\n R8: 0x8229,\n RGBA16F: 0x881a,\n RGB16F: 0x881b,\n RG16F: 0x822f,\n R16F: 0x822d,\n RGBA32F: 0x8814,\n RGB32F: 0x8815,\n RG32F: 0x8230,\n R32F: 0x822e,\n RGBA8UI: 0x8d7c,\n RGBA8I: 0x8d8e,\n RGB8UI: 0x8d7d,\n RGB8I: 0x8d8f,\n RGBA16UI: 0x8d76,\n RGBA16I: 0x8d88,\n RGB16UI: 0x8d77,\n RGB16I: 0x8d89,\n RGBA32UI: 0x8d70,\n RGBA32I: 0x8d82,\n RGB32UI: 0x8d71,\n RGB32I: 0x8d83,\n R8I: 0x8231,\n R8UI: 0x8232,\n R16I: 0x8233,\n R16UI: 0x8234,\n R32I: 0x8235,\n R32UI: 0x8236,\n RG8I: 0x8237,\n RG8UI: 0x8238,\n RG16I: 0x8239,\n RG16UI: 0x823a,\n RG32I: 0x823b,\n RG32UI: 0x823c,\n R11F_G11F_B10F: 0x8c3a,\n RGB9_E5: 0x8c3d,\n SRGB8: 0x8c41,\n SRGB8_ALPHA8: 0x8c43,\n SRGB: 0x8c40,\n RGB10_A2: 0x8059,\n RGB10_A2UI: 0x906f,\n RGBA_INTEGER: 0x8d99,\n RGB_INTEGER: 0x8d98,\n RG_INTEGER: 0x8228,\n RED_INTEGER: 0x8d94,\n ALPHA: 0x1906,\n RGB: 0x1907,\n RGBA: 0x1908,\n LUMINANCE: 0x1909,\n LUMINANCE_ALPHA: 0x190a,\n DEPTH_COMPONENT: 0x1902,\n RED: 0x1903,\n RG: 0x8227,\n VERSION: 0x1f02,\n SHADING_LANGUAGE_VERSION: 0x8b8c,\n VENDOR: 0x1f00,\n RENDERER: 0x1f01,\n IMPLEMENTATION_COLOR_READ_TYPE: 0x8b9a,\n IMPLEMENTATION_COLOR_READ_FORMAT: 0x8b9b,\n NO_ERROR: 0,\n INVALID_ENUM: 0x0500,\n INVALID_VALUE: 0x0501,\n INVALID_OPERATION: 0x0502,\n OUT_OF_MEMORY: 0x0505,\n CW: 0x0900,\n CCW: 0x0901,\n DONT_CARE: 0x1100,\n FASTEST: 0x1101,\n NICEST: 0x1102,\n GENERATE_MIPMAP_HINT: 0x8192,\n FRAGMENT_SHADER_DERIVATIVE_HINT: 0x8b8b,\n VERTEX_ATTRIB_ARRAY_DIVISOR: 0x88fe,\n MAX_SAMPLES: 0x8d57,\n RASTERIZER_DISCARD: 0x8c89,\n ANY_SAMPLES_PASSED: 0x8c2f,\n ANY_SAMPLES_PASSED_CONSERVATIVE: 0x8d6a,\n TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN: 0x8c88,\n };\n\n Object.assign(ctx, GL_CONSTANTS);\n\n // Proxy so unknown constants return 0 and unknown methods return a no-op.\n return new Proxy(ctx, {\n get(target, prop) {\n if (prop in target) {\n return target[prop as string];\n }\n if (typeof prop === 'string') {\n if (/^[A-Z][A-Z0-9_]*$/.test(prop)) {\n console.warn(`[headless] Unknown WebGL constant accessed: ${prop}`);\n return 0;\n }\n return () => {};\n }\n },\n });\n};\n\n// Wraps a real headless-gl (ANGLE) context with WebGL2 constants and any\n// missing methods so Three.js sees a fully-featured WebGL2RenderingContext.\nconst createHybridWebGL2Context = (canvas: any, attrs?: any): any => {\n const w = canvas.width || 300;\n const h = canvas.height || 150;\n const realGL = createHeadlessGL!(w, h, {\n createWebGL2Context: true,\n preserveDrawingBuffer: true,\n antialias: attrs?.antialias ?? true,\n alpha: attrs?.alpha ?? true,\n });\n\n const GL2_CONSTANTS: Record<string, number> = {\n TEXTURE_2D_ARRAY: 0x8c1a,\n TEXTURE_BINDING_2D_ARRAY: 0x8c1d,\n TEXTURE_3D: 0x806f,\n TEXTURE_BINDING_3D: 0x806a,\n TEXTURE_WRAP_R: 0x8072,\n TEXTURE_COMPARE_MODE: 0x884c,\n TEXTURE_COMPARE_FUNC: 0x884d,\n COMPARE_REF_TO_TEXTURE: 0x884e,\n TEXTURE_MIN_LOD: 0x813a,\n TEXTURE_MAX_LOD: 0x813b,\n TEXTURE_BASE_LEVEL: 0x813c,\n TEXTURE_MAX_LEVEL: 0x813d,\n TEXTURE_IMMUTABLE_FORMAT: 0x912f,\n TEXTURE_IMMUTABLE_LEVELS: 0x82df,\n UNIFORM_BUFFER: 0x8a11,\n UNIFORM_BUFFER_BINDING: 0x8a28,\n MAX_VERTEX_UNIFORM_BLOCKS: 0x8a2b,\n MAX_FRAGMENT_UNIFORM_BLOCKS: 0x8a2d,\n MAX_COMBINED_UNIFORM_BLOCKS: 0x8a2e,\n MAX_UNIFORM_BUFFER_BINDINGS: 0x8a2f,\n MAX_UNIFORM_BLOCK_SIZE: 0x8a30,\n UNIFORM_BUFFER_OFFSET_ALIGNMENT: 0x8a34,\n ACTIVE_UNIFORM_BLOCKS: 0x8a36,\n TRANSFORM_FEEDBACK_BUFFER: 0x8c8e,\n TRANSFORM_FEEDBACK_BUFFER_BINDING: 0x8c8f,\n TRANSFORM_FEEDBACK_VARYINGS: 0x8c83,\n TRANSFORM_FEEDBACK: 0x8e22,\n PIXEL_PACK_BUFFER: 0x88eb,\n PIXEL_UNPACK_BUFFER: 0x88ec,\n COPY_READ_BUFFER: 0x8f36,\n COPY_WRITE_BUFFER: 0x8f37,\n DRAW_FRAMEBUFFER: 0x8ca9,\n READ_FRAMEBUFFER: 0x8ca8,\n DRAW_FRAMEBUFFER_BINDING: 0x8ca6,\n READ_FRAMEBUFFER_BINDING: 0x8caa,\n RENDERBUFFER_SAMPLES: 0x8cab,\n MAX_COLOR_ATTACHMENTS: 0x8cdf,\n COLOR_ATTACHMENT1: 0x8ce1,\n COLOR_ATTACHMENT2: 0x8ce2,\n COLOR_ATTACHMENT3: 0x8ce3,\n DEPTH_COMPONENT24: 0x81a6,\n DEPTH_COMPONENT32F: 0x8cac,\n DEPTH24_STENCIL8: 0x88f0,\n DEPTH32F_STENCIL8: 0x8cad,\n READ_BUFFER: 0x0c02,\n UNPACK_ROW_LENGTH: 0x0cf2,\n UNPACK_SKIP_ROWS: 0x0cf3,\n UNPACK_SKIP_PIXELS: 0x0cf4,\n UNPACK_IMAGE_HEIGHT: 0x806e,\n UNPACK_SKIP_IMAGES: 0x806d,\n PACK_ROW_LENGTH: 0x0d02,\n PACK_SKIP_ROWS: 0x0d03,\n PACK_SKIP_PIXELS: 0x0d04,\n RGBA8: 0x8058,\n RGB8: 0x8051,\n RG8: 0x822b,\n R8: 0x8229,\n RGBA16F: 0x881a,\n RGB16F: 0x881b,\n RG16F: 0x822f,\n R16F: 0x822d,\n RGBA32F: 0x8814,\n RGB32F: 0x8815,\n RG32F: 0x8230,\n R32F: 0x822e,\n RGBA8UI: 0x8d7c,\n RGBA8I: 0x8d8e,\n RGB8UI: 0x8d7d,\n RGB8I: 0x8d8f,\n RGBA16UI: 0x8d76,\n RGBA16I: 0x8d88,\n RGB16UI: 0x8d77,\n RGB16I: 0x8d89,\n RGBA32UI: 0x8d70,\n RGBA32I: 0x8d82,\n RGB32UI: 0x8d71,\n RGB32I: 0x8d83,\n R8I: 0x8231,\n R8UI: 0x8232,\n R16I: 0x8233,\n R16UI: 0x8234,\n R32I: 0x8235,\n R32UI: 0x8236,\n RG8I: 0x8237,\n RG8UI: 0x8238,\n RG16I: 0x8239,\n RG16UI: 0x823a,\n RG32I: 0x823b,\n RG32UI: 0x823c,\n R11F_G11F_B10F: 0x8c3a,\n RGB9_E5: 0x8c3d,\n SRGB8: 0x8c41,\n SRGB8_ALPHA8: 0x8c43,\n SRGB: 0x8c40,\n RGB10_A2: 0x8059,\n RGB10_A2UI: 0x906f,\n RGBA_INTEGER: 0x8d99,\n RGB_INTEGER: 0x8d98,\n RG_INTEGER: 0x8228,\n RED_INTEGER: 0x8d94,\n RED: 0x1903,\n RG: 0x8227,\n HALF_FLOAT: 0x140b,\n MIN: 0x8007,\n MAX: 0x8008,\n UNSIGNED_INT_24_8: 0x84fa,\n RASTERIZER_DISCARD: 0x8c89,\n ANY_SAMPLES_PASSED: 0x8c2f,\n ANY_SAMPLES_PASSED_CONSERVATIVE: 0x8d6a,\n TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN: 0x8c88,\n VERTEX_ATTRIB_ARRAY_DIVISOR: 0x88fe,\n MAX_3D_TEXTURE_SIZE: 0x8073,\n MAX_ARRAY_TEXTURE_LAYERS: 0x88ff,\n MAX_DRAW_BUFFERS: 0x8824,\n DRAW_BUFFER0: 0x8825,\n FRAGMENT_SHADER_DERIVATIVE_HINT: 0x8b8b,\n STREAM_READ: 0x88e1,\n STREAM_COPY: 0x88e2,\n STATIC_READ: 0x88e5,\n STATIC_COPY: 0x88e6,\n DYNAMIC_READ: 0x88e9,\n DYNAMIC_COPY: 0x88ea,\n VERSION: 0x1f02,\n SHADING_LANGUAGE_VERSION: 0x8b8c,\n VENDOR: 0x1f00,\n RENDERER: 0x1f01,\n };\n\n const origGetParameter = realGL.getParameter.bind(realGL);\n const getParameterOverrides: Record<number, any> = {\n 0x1f02: 'WebGL 2.0 (headless-gl ANGLE)', // VERSION\n 0x8b8c: 'OpenGL ES GLSL ES 3.00', // SHADING_LANGUAGE_VERSION\n 0x1f00: 'headless-gl', // VENDOR\n 0x1f01: 'ANGLE', // RENDERER\n 0x8cdf: 8, // MAX_COLOR_ATTACHMENTS\n 0x8824: 8, // MAX_DRAW_BUFFERS\n 0x8073: 2048, // MAX_3D_TEXTURE_SIZE\n 0x88ff: 2048, // MAX_ARRAY_TEXTURE_LAYERS\n 0x8a2b: 16, // MAX_VERTEX_UNIFORM_BLOCKS\n 0x8a2d: 16, // MAX_FRAGMENT_UNIFORM_BLOCKS\n 0x8a2e: 24, // MAX_COMBINED_UNIFORM_BLOCKS\n 0x8a2f: 24, // MAX_UNIFORM_BUFFER_BINDINGS\n 0x8a30: 16384, // MAX_UNIFORM_BLOCK_SIZE\n 0x8a34: 256, // UNIFORM_BUFFER_OFFSET_ALIGNMENT\n 0x8d57: 4, // MAX_SAMPLES\n 0x8cab: 4, // RENDERBUFFER_SAMPLES\n };\n\n // WebGL2 methods to stub when not present on the native context\n const noop = () => {};\n const webgl2Stubs: Record<string, any> = {\n createVertexArray:\n realGL.createVertexArray?.bind(realGL) ?? (() => ({ _mockId: 1 })),\n bindVertexArray: realGL.bindVertexArray?.bind(realGL) ?? noop,\n deleteVertexArray: realGL.deleteVertexArray?.bind(realGL) ?? noop,\n isVertexArray: realGL.isVertexArray?.bind(realGL) ?? (() => true),\n drawArraysInstanced: realGL.drawArraysInstanced?.bind(realGL) ?? noop,\n drawElementsInstanced: realGL.drawElementsInstanced?.bind(realGL) ?? noop,\n vertexAttribDivisor: realGL.vertexAttribDivisor?.bind(realGL) ?? noop,\n drawBuffers: realGL.drawBuffers?.bind(realGL) ?? noop,\n readBuffer: realGL.readBuffer?.bind(realGL) ?? noop,\n texImage3D: realGL.texImage3D?.bind(realGL) ?? noop,\n texSubImage3D: realGL.texSubImage3D?.bind(realGL) ?? noop,\n texStorage2D: realGL.texStorage2D?.bind(realGL) ?? noop,\n texStorage3D: realGL.texStorage3D?.bind(realGL) ?? noop,\n compressedTexImage3D: realGL.compressedTexImage3D?.bind(realGL) ?? noop,\n compressedTexSubImage3D:\n realGL.compressedTexSubImage3D?.bind(realGL) ?? noop,\n bindBufferBase: realGL.bindBufferBase?.bind(realGL) ?? noop,\n bindBufferRange: realGL.bindBufferRange?.bind(realGL) ?? noop,\n getUniformBlockIndex:\n realGL.getUniformBlockIndex?.bind(realGL) ?? (() => 0),\n uniformBlockBinding: realGL.uniformBlockBinding?.bind(realGL) ?? noop,\n getActiveUniformBlockParameter:\n realGL.getActiveUniformBlockParameter?.bind(realGL) ?? (() => 0),\n getActiveUniformBlockName:\n realGL.getActiveUniformBlockName?.bind(realGL) ?? (() => ''),\n getUniformIndices:\n realGL.getUniformIndices?.bind(realGL) ?? ((): any[] => []),\n getActiveUniforms:\n realGL.getActiveUniforms?.bind(realGL) ?? ((): any[] => []),\n createTransformFeedback:\n realGL.createTransformFeedback?.bind(realGL) ?? (() => ({ _mockId: 1 })),\n bindTransformFeedback: realGL.bindTransformFeedback?.bind(realGL) ?? noop,\n beginTransformFeedback: realGL.beginTransformFeedback?.bind(realGL) ?? noop,\n endTransformFeedback: realGL.endTransformFeedback?.bind(realGL) ?? noop,\n transformFeedbackVaryings:\n realGL.transformFeedbackVaryings?.bind(realGL) ?? noop,\n deleteTransformFeedback:\n realGL.deleteTransformFeedback?.bind(realGL) ?? noop,\n pauseTransformFeedback: realGL.pauseTransformFeedback?.bind(realGL) ?? noop,\n resumeTransformFeedback:\n realGL.resumeTransformFeedback?.bind(realGL) ?? noop,\n createQuery: realGL.createQuery?.bind(realGL) ?? (() => ({ _mockId: 1 })),\n deleteQuery: realGL.deleteQuery?.bind(realGL) ?? noop,\n beginQuery: realGL.beginQuery?.bind(realGL) ?? noop,\n endQuery: realGL.endQuery?.bind(realGL) ?? noop,\n getQueryParameter: realGL.getQueryParameter?.bind(realGL) ?? (() => 0),\n getQuery: realGL.getQuery?.bind(realGL) ?? ((): null => null),\n fenceSync: realGL.fenceSync?.bind(realGL) ?? (() => ({ _mockId: 1 })),\n deleteSync: realGL.deleteSync?.bind(realGL) ?? noop,\n clientWaitSync: realGL.clientWaitSync?.bind(realGL) ?? (() => 0x911d),\n waitSync: realGL.waitSync?.bind(realGL) ?? noop,\n getSyncParameter: realGL.getSyncParameter?.bind(realGL) ?? (() => 0x9119),\n createSampler:\n realGL.createSampler?.bind(realGL) ?? (() => ({ _mockId: 1 })),\n deleteSampler: realGL.deleteSampler?.bind(realGL) ?? noop,\n bindSampler: realGL.bindSampler?.bind(realGL) ?? noop,\n samplerParameteri: realGL.samplerParameteri?.bind(realGL) ?? noop,\n samplerParameterf: realGL.samplerParameterf?.bind(realGL) ?? noop,\n isSampler: realGL.isSampler?.bind(realGL) ?? (() => true),\n blitFramebuffer: realGL.blitFramebuffer?.bind(realGL) ?? noop,\n invalidateFramebuffer: realGL.invalidateFramebuffer?.bind(realGL) ?? noop,\n framebufferTextureLayer:\n realGL.framebufferTextureLayer?.bind(realGL) ?? noop,\n renderbufferStorageMultisample:\n realGL.renderbufferStorageMultisample?.bind(realGL) ?? noop,\n getBufferSubData: realGL.getBufferSubData?.bind(realGL) ?? noop,\n copyBufferSubData: realGL.copyBufferSubData?.bind(realGL) ?? noop,\n drawRangeElements: realGL.drawRangeElements?.bind(realGL) ?? noop,\n vertexAttribIPointer: realGL.vertexAttribIPointer?.bind(realGL) ?? noop,\n uniform1ui: realGL.uniform1ui?.bind(realGL) ?? noop,\n uniform2ui: realGL.uniform2ui?.bind(realGL) ?? noop,\n uniform3ui: realGL.uniform3ui?.bind(realGL) ?? noop,\n uniform4ui: realGL.uniform4ui?.bind(realGL) ?? noop,\n uniform1uiv: realGL.uniform1uiv?.bind(realGL) ?? noop,\n uniform2uiv: realGL.uniform2uiv?.bind(realGL) ?? noop,\n uniform3uiv: realGL.uniform3uiv?.bind(realGL) ?? noop,\n uniform4uiv: realGL.uniform4uiv?.bind(realGL) ?? noop,\n uniformMatrix2x3fv: realGL.uniformMatrix2x3fv?.bind(realGL) ?? noop,\n uniformMatrix3x2fv: realGL.uniformMatrix3x2fv?.bind(realGL) ?? noop,\n uniformMatrix2x4fv: realGL.uniformMatrix2x4fv?.bind(realGL) ?? noop,\n uniformMatrix4x2fv: realGL.uniformMatrix4x2fv?.bind(realGL) ?? noop,\n uniformMatrix3x4fv: realGL.uniformMatrix3x4fv?.bind(realGL) ?? noop,\n uniformMatrix4x3fv: realGL.uniformMatrix4x3fv?.bind(realGL) ?? noop,\n getInternalformatParameter:\n realGL.getInternalformatParameter?.bind(realGL) ??\n (() => new Int32Array([8])),\n };\n\n return new Proxy(realGL, {\n get(target: any, prop: string | symbol) {\n if (typeof prop !== 'string') {\n return target[prop];\n }\n\n if (prop === 'canvas') {\n return canvas;\n }\n if (prop === 'drawingBufferWidth') {\n return canvas.width || 300;\n }\n if (prop === 'drawingBufferHeight') {\n return canvas.height || 150;\n }\n if (prop === 'drawingBufferColorSpace') {\n return 'srgb';\n }\n\n if (prop === 'getParameter') {\n return (pname: number) => {\n if (pname in getParameterOverrides) {\n return getParameterOverrides[pname];\n }\n try {\n return origGetParameter(pname);\n } catch {\n return 0;\n }\n };\n }\n\n if (prop in webgl2Stubs && typeof target[prop] !== 'function') {\n return webgl2Stubs[prop];\n }\n if (prop in GL2_CONSTANTS && !(prop in target)) {\n return GL2_CONSTANTS[prop];\n }\n\n const value = target[prop];\n return typeof value === 'function' ? value.bind(target) : value;\n },\n });\n};\n\n// Wraps a napi-rs/canvas Canvas so it behaves like an HTMLCanvasElement.\n// Fakes the prototype chain via Proxy getPrototypeOf (GLTFExporter checks instanceof).\n// The 2d context's drawImage is patched to unwrap NAPI_IMAGE symbols.\nconst createCanvasProxy = (\n width: number = 300,\n height: number = 150,\n): HTMLCanvasElement => {\n const napiCanvas = createNapiCanvas(width, height);\n let cachedCtx: any = null;\n let cachedWebGLCtx: any = null;\n\n const proxy = new Proxy(napiCanvas as unknown as HTMLCanvasElement, {\n get(target: any, prop: string | symbol) {\n if (prop === 'style') {\n return target._style ?? (target._style = {});\n }\n if (prop === 'classList') {\n return (\n target._classList ??\n (target._classList = {\n add() {},\n remove() {},\n contains() {\n return false;\n },\n toggle() {},\n })\n );\n }\n if (prop === Symbol.toStringTag) {\n return 'HTMLCanvasElement';\n }\n\n if (prop === 'getContext') {\n return (contextType: string, attrs?: any) => {\n if (contextType === '2d') {\n if (!cachedCtx) {\n cachedCtx = patchContext2d(target.getContext('2d', attrs));\n }\n return cachedCtx;\n }\n if (contextType === 'webgl2' || contextType === 'webgl') {\n if (!cachedWebGLCtx) {\n cachedWebGLCtx = createHeadlessGL\n ? createHybridWebGL2Context(proxy, attrs)\n : createMockWebGL2Context(proxy);\n }\n return cachedWebGLCtx;\n }\n return target.getContext(contextType, attrs);\n };\n }\n\n if (prop === 'addEventListener' || prop === 'removeEventListener') {\n return () => {};\n }\n\n if (prop === 'getBoundingClientRect') {\n return () => ({\n x: 0,\n y: 0,\n width: target.width,\n height: target.height,\n top: 0,\n left: 0,\n bottom: target.height,\n right: target.width,\n });\n }\n\n // When a real GL context exists, blit its pixels into the 2d canvas\n // before exporting so the image contains actual rendered content.\n if (prop === 'toDataURL' && cachedWebGLCtx && createHeadlessGL) {\n return (mimeType?: string, quality?: number) => {\n const w = target.width;\n const h = target.height;\n const pixels = new Uint8Array(w * h * 4);\n cachedWebGLCtx.readPixels(\n 0,\n 0,\n w,\n h,\n cachedWebGLCtx.RGBA ?? 0x1908,\n cachedWebGLCtx.UNSIGNED_BYTE ?? 0x1401,\n pixels,\n );\n // GL produces bottom-up rows; flip for canvas coordinate system.\n const flipped = new Uint8Array(w * h * 4);\n const rowSize = w * 4;\n for (let y = 0; y < h; y++) {\n flipped.set(\n pixels.subarray((h - y - 1) * rowSize, (h - y) * rowSize),\n y * rowSize,\n );\n }\n const ctx2d = target.getContext('2d');\n ctx2d.putImageData(\n new NapiImageData(new Uint8ClampedArray(flipped.buffer), w, h),\n 0,\n 0,\n );\n return target.toDataURL(mimeType, quality);\n };\n }\n\n const value = target[prop];\n return typeof value === 'function' ? value.bind(target) : value;\n },\n\n set(target: any, prop: string | symbol, value: any) {\n target[prop] = value;\n // Resize the ANGLE framebuffer when the canvas dimensions change.\n if (\n cachedWebGLCtx &&\n createHeadlessGL &&\n (prop === 'width' || prop === 'height')\n ) {\n const ext = cachedWebGLCtx.getExtension?.(\n 'STACKGL_resize_drawingbuffer',\n );\n if (ext) {\n ext.resize(target.width, target.height);\n }\n }\n return true;\n },\n\n getPrototypeOf() {\n return HTMLCanvasElement.prototype;\n },\n });\n\n return proxy;\n};\n\n// Creates a happy-dom HTMLImageElement backed by a napi-rs/canvas Image so that\n// images are actually decoded and canvas drawImage() works correctly.\nconst createNapiImageElement = (): HTMLImageElement => {\n const el = origCreateElementNS(\n 'http://www.w3.org/1999/xhtml',\n 'img',\n ) as HTMLImageElement;\n const napiImg = new NapiImage();\n\n (el as any)[NAPI_IMAGE] = napiImg;\n\n let currentSrc = '';\n Object.defineProperty(el, 'src', {\n get() {\n return currentSrc;\n },\n set(url: string) {\n currentSrc = url;\n // napi-rs/canvas Image cannot fetch blob: URLs (created by\n // URL.createObjectURL — used heavily by GLTFLoader for embedded\n // textures). Resolve them ourselves via fetch (Node ≥18 understands\n // its own blob URL registry) and feed the bytes in as a Buffer.\n if (typeof url === 'string' && url.startsWith('blob:')) {\n fetch(url)\n .then((r) => r.arrayBuffer())\n .then((ab) => {\n // Guard against a later src reassignment racing this resolution.\n if (currentSrc !== url) {\n return;\n }\n napiImg.src = Buffer.from(ab);\n })\n .catch((err) => {\n const error = err instanceof Error ? err : new Error(String(err));\n el.dispatchEvent(\n new ErrorEvent('error', { error, message: error.message }),\n );\n });\n return;\n }\n napiImg.src = url;\n },\n configurable: true,\n });\n\n napiImg.onload = () => {\n Object.defineProperty(el, 'width', {\n value: napiImg.width,\n writable: true,\n configurable: true,\n });\n Object.defineProperty(el, 'height', {\n value: napiImg.height,\n writable: true,\n configurable: true,\n });\n Object.defineProperty(el, 'naturalWidth', {\n value: napiImg.naturalWidth,\n configurable: true,\n });\n Object.defineProperty(el, 'naturalHeight', {\n value: napiImg.naturalHeight,\n configurable: true,\n });\n Object.defineProperty(el, 'complete', { value: true, configurable: true });\n el.dispatchEvent(new Event('load'));\n };\n\n napiImg.onerror = (err: Error) => {\n el.dispatchEvent(\n new ErrorEvent('error', { error: err, message: err?.message }),\n );\n };\n\n return el;\n};\n\ndocument.createElement = (\n tagName: string,\n options?: ElementCreationOptions,\n) => {\n if (tagName.toLowerCase() === 'canvas') {\n return createCanvasProxy();\n }\n return origCreateElement(tagName, options);\n};\n\ndocument.createElementNS = (\n namespaceURI: string | null,\n qualifiedName: string,\n options?: ElementCreationOptions,\n) => {\n const tag = qualifiedName.toLowerCase();\n if (tag === 'canvas') {\n return createCanvasProxy();\n }\n if (tag === 'img') {\n return createNapiImageElement();\n }\n return origCreateElementNS(namespaceURI, qualifiedName, options);\n};\n"],"mappings":";;AAIA,IAAM,IAAa,MAAM,OAAO,mBAAmB,YAAkB,KAAK,EACpE,IAAW,MAAM,OAAO,aAAa,YAAkB,KAAK;AAElE,IAAI,CAAC,EACH,OAAU,MACR,yHAED;AAGH,IAAI,CAAC,EACH,OAAU,MACR,mHAED;AAGH,IAAM,EACJ,cAAc,GACd,OAAO,GACP,WAAW,MACT,GACE,EAAE,iBAAc,sBAAmB,GAInC,IAAc;CAClB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,EAEK,IAAN,MAAwB;CACtB,QAAA,IAEW;CAEX,WAAkB,eAAwB;AACxC,SAAO,MAAA,MAAqB;;CAG9B,OAAc,SAAS,GAKd;AACP,MAAI,MAAA,MAAqB,KACvB,OAAU,MACR,sEACD;EAGH,IAAM,IAAS,IAAI,EAAa;GAC9B,GAAG;GACH,SAAS,WAAW;GACrB,CAAC;AAEF,QAAA,IAAmB,EAAE;EAErB,IAAM,IAAsB,OAAO,0BAA0B,EAAO;AAEpE,OAAK,IAAM,KAAO,OAAO,KAAK,EAAoB,CAChD,KAAI,CAAC,EAAY,SAAS,EAAI,EAAE;GAC9B,IAAM,IAA2B,EAAoB,IAC/C,IAA2B,OAAO,yBACtC,YACA,EACD;AAED,IACE,GAA0B,UAAU,KAAA,KACpC,GAA0B,UAAU,GAA0B,WAE9D,MAAA,EAAiB,KAAO,KAA4B,MAEhD,GAA0B,UAAU,MACrC,EAAe,KAAO,YACvB,EAAyB,QAAQ,aAGnC,OAAO,eAAe,YAAY,GAAK;IACrC,GAAG;IACH,cAAc;IACf,CAAC;;EAKR,IAAM,IAAkB,OAAO,sBAAsB,EAAO;AAE5D,OAAK,IAAM,KAAO,GAAiB;GACjC,IAAM,IAAqB,OAAO,yBAAyB,GAAQ,EAAI;AAQvE,GAPA,MAAA,EAAiB,KAAO,MAEpB,EAAoB,UAAU,MAC/B,EAAe,KAAO,YACvB,EAAoB,QAAQ,aAG9B,OAAO,eAAe,YAAY,GAAK;IACrC,GAAG;IACH,cAAc;IACf,CAAC;;AAGH,aAAmB,SAAS,EAAe,eAAe;;CAG7D,aAAoB,aAA4B;AAC9C,MAAI,MAAA,MAAqB,KACvB,OAAU,MACR,+EACD;EAGH,IAAM,IAAY,WAAmB;AAErC,OAAK,IAAM,KAAO,OAAO,KAAK,MAAA,EAAiB,CAC7C,CAAI,MAAA,EAAiB,OAAS,OAG5B,OAAQ,WAAmB,KAF3B,OAAO,eAAe,YAAY,GAAK,MAAA,EAAiB,GAAM;AAQlE,EAFA,MAAA,IAAmB,MAEf,KACF,MAAM,EAAS,OAAO;;GAStB,IAAgB,EAAc,OAAO,KAAK,IAAI,EAC9C,IAAU,EAAc,KAAK,EAC7B,IAAY,EAAc,OAAO,EACjC,IAAW,EAAc,MAAM,EACjC,IAAa;AACjB,IAAI;AACF,KAAa,EAAU,QAAQ,EAAS,cAAc,OAAO,KAAK,IAAI,CAAC;QACjE;AAMR,IAAM,KAAwB,MAAmC;AAC/D,KAAI,CAAC,KAAc,CAAC,EAAQ,WAAW,IAAI,IAAI,EAAQ,WAAW,KAAK,CACrE,QAAO;CAET,IAAM,IAAY,EAAU,KAAK,GAAY,EAAQ;AACrD,QAAO,EAAQ,WAAW,EAAU,GAAG,IAAY;GAO/C,IAAe,WAAW;AAEhC,WAAW,QAAQ,OACjB,GACA,MACsB;CACtB,IAAM,IACJ,OAAO,KAAU,WACb,IACA,aAAiB,MACf,EAAM,OACL,EAAc,OAAO,OAAO,EAAM;AAE3C,KAAI,EAAI,WAAW,UAAU,EAAE;EAC7B,IAAM,IAAS,EAAQ,aAAa,EAAS,cAAc,EAAI,CAAC;AAChE,SAAO,IAAI,SAAS,GAAQ;GAC1B,QAAQ;GACR,SAAS,EAAE,gBAAgB,4BAA4B;GACxD,CAAC;;AAGJ,KAAI,EAAI,WAAW,IAAI,IAAI,CAAC,EAAI,WAAW,KAAK,EAAE;EAChD,IAAM,IAAY,EAAqB,EAAI;AAU3C,SATI,IACK,IAAI,SAAS,EAAQ,aAAa,EAAU,EAAE;GACnD,QAAQ;GACR,SAAS,EAAE,gBAAgB,4BAA4B;GACxD,CAAC,IAEJ,QAAQ,KACN,oDAAoD,EAAI,gBAAgB,KAAc,UAAU,GACjG,EACM,IAAI,SAAS,MAAM;GAAE,QAAQ;GAAK,YAAY;GAAa,CAAC;;AAGrE,QAAO,EAAa,KAAA,KAAA,GAAW,GAAO,EAAK;;AAO7C,IAAM,IAAgB,WAAmB;AACrC,MACD,WAAmB,UAAU,IAAI,MAAM,GAAc;CACpD,UAAU,GAAa,CAAC,GAAO,IAAmB;AAChD,MACE,OAAO,KAAU,YACjB,EAAM,WAAW,IAAI,IACrB,CAAC,EAAM,WAAW,KAAK,EACvB;GACA,IAAM,IACJ,EAAqB,EAAM,IAC3B,EAAU,KAAK,KAAc,QAAQ,EAAM;AAC7C,OAAQ,EAAS,cAAc,EAAU,CAAC;;AAE5C,SAAO,QAAQ,UACb,GACA,MAAS,KAAA,IAA4B,CAAC,EAAM,GAAvB,CAAC,GAAO,EAAK,EAClC,EACD;;CAEH,IAAI,GAAa,GAAuB;AACtC,SAAO,EAAO;;CAEjB,CAAC,GAGJ,EAAkB,UAAU,EAIhB,WAAmB,cAAc,WAC1C,WAAmB,YAAY,IA+ElC,WAAoB,aAzEpB,MAAqB;;gBAC0B,mBACrB,wBACI,iBACgB,uBACG,qBACF;;CAE7C,kBAAkB,GAAkB;AAElC,EADA,KAAK,aAAa,GAClB,EAAK,aAAa,CAAC,MAChB,MAAQ;AAEP,GADA,KAAK,SAAS,GACd,KAAK,aAAa;GAClB,IAAM,IAAK,EAAE,QAAQ,MAAM;AAE3B,GADA,KAAK,SAAS,EAAG,EACjB,KAAK,YAAY,EAAG;MAErB,MAAQ;AAEP,GADA,KAAK,QAAQ,GACb,KAAK,aAAa;GAClB,IAAM,IAAK,EAAE,QAAQ,MAAM;AAE3B,GADA,KAAK,UAAU,EAAG,EAClB,KAAK,YAAY,EAAG;IAEvB;;CAGH,cAAc,GAAkB;AAE9B,EADA,KAAK,aAAa,GAClB,EAAK,aAAa,CAAC,MAChB,MAAQ;GACP,IAAM,IAAM,OAAO,KAAK,EAAI,CAAC,SAAS,SAAS;AAG/C,GADA,KAAK,SAAS,QADA,EAAa,QAAQ,2BACR,UAAU,KACrC,KAAK,aAAa;GAClB,IAAM,IAAK,EAAE,QAAQ,MAAM;AAE3B,GADA,KAAK,SAAS,EAAG,EACjB,KAAK,YAAY,EAAG;MAErB,MAAQ;AAEP,GADA,KAAK,QAAQ,GACb,KAAK,aAAa;GAClB,IAAM,IAAK,EAAE,QAAQ,MAAM;AAE3B,GADA,KAAK,UAAU,EAAG,EAClB,KAAK,YAAY,EAAG;IAEvB;;CAGH,WAAW,GAAkB;AAE3B,EADA,KAAK,aAAa,GAClB,EAAK,MAAM,CAAC,MACT,MAAS;AAER,GADA,KAAK,SAAS,GACd,KAAK,aAAa;GAClB,IAAM,IAAK,EAAE,QAAQ,MAAM;AAE3B,GADA,KAAK,SAAS,EAAG,EACjB,KAAK,YAAY,EAAG;MAErB,MAAQ;AAEP,GADA,KAAK,QAAQ,GACb,KAAK,aAAa;GAClB,IAAM,IAAK,EAAE,QAAQ,MAAM;AAE3B,GADA,KAAK,UAAU,EAAG,EAClB,KAAK,YAAY,EAAG;IAEvB;;CAGH,QAAc;;AAOhB,IAAM,IAAa,OAAO,YAAY,EAEhC,IAAoB,SAAS,cAAc,KAAK,SAAS,EACzD,IAAsB,SAAS,gBAAgB,KAAK,SAAS,EAI7D,KAAkB,MAAkB;CACxC,IAAM,IAAgB,EAAI,UAAU,KAAK,EAAI;AAK7C,QAJA,EAAI,aAAa,GAAY,GAAG,MAEvB,EADM,IAAQ,MAAe,GACT,GAAG,EAAK,EAE9B;GAGL,IAAuE;AAE3E,IAAI;CAEF,IAAM,EAAE,qBAAkB,MAAM,OAAO;AAEvC,CADA,IAAmB,GACnB,QAAQ,IAAI,gEAAgE;SACrE,GAAG;AAEV,CADA,QAAQ,IAAI,EAAE,EACd,QAAQ,IAAI,iEAAiE;;AAK/E,IAAM,KAA2B,MAAqB;CACpD,IAAI,IAAM,GACJ,WAAgB,EAAE,SAAS,KAAO,GAElC,IAA2B;EAC/B;EACA,oBAAoB,EAAO,SAAS;EACpC,qBAAqB,EAAO,UAAU;EACtC,yBAAyB;EAGzB,aAAa,GAAe;AAuC1B,UAtCoC;IAClC,MAAQ;IACR,OAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,OAAQ;IACR,OAAQ;IACR,OAAQ;IACR,OAAQ;IACR,OAAQ;IACR,OAAQ;IACR,OAAQ;IACR,OAAQ;IACR,OAAQ;IACR,OAAQ;IACR,OAAQ;IACR,OAAQ;IACR,OAAQ;IACR,OAAQ;IACR,OAAQ;IACR,OAAQ;IACR,OAAQ;IACR,OAAQ;IACR,MAAQ,IAAI,WAAW,CAAC,OAAO,MAAM,CAAC;IACtC,OAAQ;IACR,OAAQ;IACR,OAAQ;IACR,OAAQ;IACR,MAAQ;IACR,MAAQ;IACR,MAAQ;IACR,OAAQ;IACR,OAAQ;IACR,OAAQ;IACR,OAAQ;IACR,OAAQ;IACT,CACa,MAAU;;EAG1B,aAAa,GAAc;AAmBzB,UAjBE,MAAS,oCACT,MAAS,0CAEF;IACL,4BAA4B;IAC5B,gCAAgC;IACjC,GAGD,MAAS,4BACT,MAAS,iCACT,MAAS,8BACT,MAAS,mCACT,MAAS,oBAEF,EAAE,GAEJ;;EAGT,yBAAyB;AACvB,UAAO;IACL;IACA;IACA;IACA;IACA;IACD;;EAIH,oBAAoB,GAAQ;EAC5B,eAAe;EACf,gBAAgB;EAChB,mBAAmB,GAAS,GAAe;AACzC,UAAO,MAAU,QAAS,KAAO;;EAEnC,mBAAmB;AACjB,UAAO;;EAET,eAAe;EACf,qBAAqB,GAAQ;EAC7B,eAAe;EACf,cAAc;EACd,oBAAoB,GAAS,GAAe;AAgB1C,UAfI,MAAU,QACL,KAYA;;EAIX,oBAAoB;AAClB,UAAO;;EAET,aAAa;EACb,gBAAgB;EAChB,eAAe;EACf,kBAAkB;EAGlB,2BAA2B;AACzB,UAAO;IAAE,UAAU;IAAK,UAAU;IAAK,WAAW;IAAI;;EAIxD,oBAAoB;AAClB,UAAO;;EAET,qBAAqB;AACnB,UAAO,GAAQ;;EAEjB,kBAAkB;AAChB,UAAO;IAAE,MAAM;IAAK,MAAM;IAAQ,MAAM;IAAG;;EAE7C,mBAAmB;AACjB,UAAO;IAAE,MAAM;IAAK,MAAM;IAAQ,MAAM;IAAG;;EAE7C,YAAY;EACZ,YAAY;EACZ,YAAY;EACZ,YAAY;EACZ,YAAY;EACZ,YAAY;EACZ,YAAY;EACZ,YAAY;EACZ,aAAa;EACb,aAAa;EACb,aAAa;EACb,aAAa;EACb,aAAa;EACb,aAAa;EACb,aAAa;EACb,aAAa;EACb,aAAa;EACb,aAAa;EACb,aAAa;EACb,aAAa;EACb,cAAc;EACd,cAAc;EACd,cAAc;EACd,cAAc;EACd,mBAAmB;EACnB,mBAAmB;EACnB,mBAAmB;EACnB,qBAAqB;EACrB,qBAAqB;EACrB,qBAAqB;EACrB,qBAAqB;EACrB,qBAAqB;EACrB,qBAAqB;EAGrB,oBAAoB,GAAQ;EAC5B,aAAa;EACb,aAAa;EACb,gBAAgB;EAChB,eAAe;EACf,mBAAmB;EACnB,oBAAoB;EACpB,WAAW;AACT,UAAO;;EAET,iBAAiB;EACjB,kBAAkB;EAGlB,yBAAyB,GAAQ;EACjC,kBAAkB;EAClB,oBAAoB;EACpB,gBAAgB;AACd,UAAO;;EAET,0BAA0B;EAC1B,2BAA2B;EAC3B,sBAAsB;EACtB,uBAAuB;EACvB,sBAAsB;EACtB,iBAAiB;EACjB,iBAAiB;EACjB,iBAAiB;EACjB,iBAAiB;EACjB,kBAAkB;EAClB,kBAAkB;EAClB,kBAAkB;EAClB,kBAAkB;EAGlB,qBAAqB,GAAQ;EAC7B,cAAc;EACd,gBAAgB;EAChB,cAAc;EACd,aAAa;EACb,aAAa;EACb,gBAAgB;EAChB,gBAAgB;EAChB,uBAAuB;EACvB,0BAA0B;EAC1B,uBAAuB;EACvB,0BAA0B;EAC1B,gBAAgB;EAChB,gBAAgB;EAChB,eAAe;EACf,eAAe;EACf,iBAAiB;EACjB,gBAAgB;EAChB,iBAAiB;EACjB,oBAAoB;EACpB,YAAY;AACV,UAAO;;EAIT,yBAAyB,GAAQ;EACjC,kBAAkB;EAClB,oBAAoB;EACpB,uBAAuB;EACvB,0BAA0B;EAC1B,0BAA0B;EAC1B,yBAAyB;AACvB,UAAO;;EAET,aAAa;EACb,kBAAkB;EAClB,wBAAwB;EACxB,aAAa;EACb,cAAc;EACd,gBAAgB;AACd,UAAO;;EAIT,0BAA0B,GAAQ;EAClC,mBAAmB;EACnB,sBAAsB;EACtB,iCAAiC;EACjC,qBAAqB;EACrB,iBAAiB;AACf,UAAO;;EAET,2BAA2B;AACzB,UAAO;;EAIT,QAAQ;EACR,aAAa;EACb,aAAa;EACb,eAAe;EACf,YAAY;EACZ,YAAY;EACZ,cAAc;EACd,sBAAsB;EACtB,WAAW;EACX,UAAU;EACV,aAAa;EACb,eAAe;EACf,sBAAsB;EACtB,wBAAwB;EACxB,oBAAoB;EAGpB,SAAS;EACT,UAAU;EACV,YAAY;AACV,UAAO;;EAET,YAAY;EACZ,oBAAoB;EACpB,gBAAgB;EAChB,wBAAwB;EACxB,aAAa;EACb,YAAY;EACZ,aAAa;EACb,cAAc;EACd,sBAAsB;EACtB,YAAY;EACZ,oBAAoB;EACpB,WAAW;EACX,YAAY;EACZ,YAAY;EACZ,gBAAgB;EAChB,iBAAiB;EAGjB,+BAA+B,GAAQ;EACvC,wBAAwB;EACxB,yBAAyB;EACzB,uBAAuB;EACvB,4BAA4B;EAC5B,0BAA0B;EAC1B,yBAAyB;EACzB,0BAA0B;EAG1B,mBAAmB,GAAQ;EAC3B,cAAc;EACd,aAAa;EACb,WAAW;EACX,oBAAoB;AAClB,UAAO;;EAET,WAAiB;AACf,UAAO;;EAIT,iBAAiB,GAAQ;EACzB,aAAa;EACb,iBAAiB;AACf,UAAO;;EAET,WAAW;EACX,mBAAmB;AACjB,UAAO;;EAIT,qBAAqB,GAAQ;EAC7B,gBAAgB;EAChB,cAAc;EACd,oBAAoB;EACpB,oBAAoB;EACpB,YAAY;AACV,UAAO;;EAIT,uBAAuB;AACrB,UAAO;;EAET,sBAAsB;EACtB,iCAAiC;AAC/B,UAAO;;EAET,4BAA4B;AAC1B,UAAO;;EAET,oBAA2B;AACzB,UAAO,EAAE;;EAEX,oBAA2B;AACzB,UAAO,EAAE;;EAIX,SAAS;EACT,QAAQ;EACR,WAAW;AACT,UAAO;;EAET,gBAAgB;AACd,UAAO;;EAET,uBAAuB;AACrB,UAAO;IACL,OAAO;IACP,WAAW;IACX,OAAO;IACP,8BAA8B;IAC9B,iBAAiB;IACjB,oBAAoB;IACpB,uBAAuB;IACvB,SAAS;IACT,gBAAgB;IACjB;;EAEH,6BAA6B;AAC3B,UAAO,IAAI,WAAW,CAAC,EAAE,CAAC;;EAE5B,OAAO;EACP,mBAAmB;AACjB,UAAO,QAAQ,SAAS;;EAE3B;AA+WD,QAHA,OAAO,OAAO,GAzW+B;EAC3C,kBAAkB;EAClB,oBAAoB;EACpB,kBAAkB;EAClB,QAAQ;EACR,OAAO;EACP,WAAW;EACX,YAAY;EACZ,WAAW;EACX,gBAAgB;EAChB,cAAc;EACd,MAAM;EACN,KAAK;EACL,WAAW;EACX,qBAAqB;EACrB,WAAW;EACX,qBAAqB;EACrB,WAAW;EACX,qBAAqB;EACrB,WAAW;EACX,qBAAqB;EACrB,oBAAoB;EACpB,gBAAgB;EAChB,0BAA0B;EAC1B,gBAAgB;EAChB,0BAA0B;EAC1B,UAAU;EACV,eAAe;EACf,uBAAuB;EACvB,KAAK;EACL,KAAK;EACL,gBAAgB;EAChB,oBAAoB;EACpB,sBAAsB;EACtB,eAAe;EACf,eAAe;EACf,iBAAiB;EACjB,iBAAiB;EACjB,aAAa;EACb,OAAO;EACP,cAAc;EACd,sBAAsB;EACtB,sBAAsB;EACtB,8BAA8B;EAC9B,aAAa;EACb,aAAa;EACb,cAAc;EACd,aAAa;EACb,aAAa;EACb,aAAa;EACb,aAAa;EACb,cAAc;EACd,cAAc;EACd,aAAa;EACb,cAAc;EACd,uBAAuB;EACvB,WAAW;EACX,OAAO;EACP,MAAM;EACN,gBAAgB;EAChB,YAAY;EACZ,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,qBAAqB;EACrB,0BAA0B;EAC1B,iBAAiB;EACjB,QAAQ;EACR,OAAO;EACP,MAAM;EACN,OAAO;EACP,QAAQ;EACR,SAAS;EACT,UAAU;EACV,QAAQ;EACR,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM;EACN,MAAM;EACN,QAAQ;EACR,WAAW;EACX,WAAW;EACX,SAAS;EACT,QAAQ;EACR,wBAAwB;EACxB,uBAAuB;EACvB,uBAAuB;EACvB,sBAAsB;EACtB,oBAAoB;EACpB,oBAAoB;EACpB,gBAAgB;EAChB,gBAAgB;EAChB,YAAY;EACZ,YAAY;EACZ,SAAS;EACT,kBAAkB;EAClB,0BAA0B;EAC1B,6BAA6B;EAC7B,6BAA6B;EAC7B,6BAA6B;EAC7B,6BAA6B;EAC7B,6BAA6B;EAC7B,6BAA6B;EAC7B,2BAA2B;EAC3B,UAAU;EACV,UAAU;EACV,UAAU;EACV,UAAU;EACV,UAAU;EACV,UAAU;EACV,UAAU;EACV,UAAU;EACV,UAAU;EACV,UAAU;EACV,WAAW;EACX,WAAW;EACX,WAAW;EACX,WAAW;EACX,WAAW;EACX,WAAW;EACX,WAAW;EACX,WAAW;EACX,WAAW;EACX,WAAW;EACX,WAAW;EACX,WAAW;EACX,WAAW;EACX,WAAW;EACX,WAAW;EACX,WAAW;EACX,WAAW;EACX,WAAW;EACX,WAAW;EACX,WAAW;EACX,WAAW;EACX,WAAW;EACX,gBAAgB;EAChB,QAAQ;EACR,eAAe;EACf,iBAAiB;EACjB,OAAO;EACP,YAAY;EACZ,YAAY;EACZ,YAAY;EACZ,KAAK;EACL,UAAU;EACV,UAAU;EACV,UAAU;EACV,cAAc;EACd,MAAM;EACN,WAAW;EACX,WAAW;EACX,WAAW;EACX,YAAY;EACZ,YAAY;EACZ,YAAY;EACZ,YAAY;EACZ,cAAc;EACd,MAAM;EACN,eAAe;EACf,OAAO;EACP,gBAAgB;EAChB,wBAAwB;EACxB,wBAAwB;EACxB,sBAAsB;EACtB,mBAAmB;EACnB,YAAY;EACZ,iBAAiB;EACjB,eAAe;EACf,oBAAoB;EACpB,4BAA4B;EAC5B,qBAAqB;EACrB,kCAAkC;EAClC,gCAAgC;EAChC,yBAAyB;EACzB,8BAA8B;EAC9B,aAAa;EACb,eAAe;EACf,aAAa;EACb,iBAAiB;EACjB,kBAAkB;EAClB,iBAAiB;EACjB,mBAAmB;EACnB,gBAAgB;EAChB,aAAa;EACb,cAAc;EACd,OAAO;EACP,SAAS;EACT,QAAQ;EACR,mBAAmB;EACnB,mBAAmB;EACnB,oBAAoB;EACpB,kBAAkB;EAClB,mBAAmB;EACnB,gBAAgB;EAChB,oBAAoB;EACpB,qBAAqB;EACrB,8BAA8B;EAC9B,oCAAoC;EACpC,oCAAoC;EACpC,sCAAsC;EACtC,8CAA8C;EAC9C,mBAAmB;EACnB,mBAAmB;EACnB,mBAAmB;EACnB,mBAAmB;EACnB,kBAAkB;EAClB,oBAAoB;EACpB,0BAA0B;EAC1B,eAAe;EACf,sBAAsB;EACtB,mCAAmC;EACnC,2CAA2C;EAC3C,mCAAmC;EACnC,yBAAyB;EACzB,qBAAqB;EACrB,sBAAsB;EACtB,uBAAuB;EACvB,+BAA+B;EAC/B,qBAAqB;EACrB,gCAAgC;EAChC,oCAAoC;EACpC,aAAa;EACb,mBAAmB;EACnB,kBAAkB;EAClB,oBAAoB;EACpB,iBAAiB;EACjB,gBAAgB;EAChB,kBAAkB;EAClB,oBAAoB;EACpB,oBAAoB;EACpB,qBAAqB;EACrB,qBAAqB;EACrB,uBAAuB;EACvB,sBAAsB;EACtB,sBAAsB;EACtB,kBAAkB;EAClB,cAAc;EACd,iCAAiC;EACjC,+BAA+B;EAC/B,0BAA0B;EAC1B,0BAA0B;EAC1B,0BAA0B;EAC1B,wBAAwB;EACxB,kBAAkB;EAClB,0BAA0B;EAC1B,gBAAgB;EAChB,wBAAwB;EACxB,2BAA2B;EAC3B,6BAA6B;EAC7B,6BAA6B;EAC7B,6BAA6B;EAC7B,wBAAwB;EACxB,iCAAiC;EACjC,uBAAuB;EACvB,2BAA2B;EAC3B,mCAAmC;EACnC,6BAA6B;EAC7B,oBAAoB;EACpB,mBAAmB;EACnB,qBAAqB;EACrB,kBAAkB;EAClB,mBAAmB;EACnB,kBAAkB;EAClB,kBAAkB;EAClB,0BAA0B;EAC1B,0BAA0B;EAC1B,sBAAsB;EACtB,uBAAuB;EACvB,sBAAsB;EACtB,sBAAsB;EACtB,wBAAwB;EACxB,gBAAgB;EAChB,iBAAiB;EACjB,iBAAiB;EACjB,oBAAoB;EACpB,mBAAmB;EACnB,0BAA0B;EAC1B,0BAA0B;EAC1B,OAAO;EACP,MAAM;EACN,KAAK;EACL,IAAI;EACJ,SAAS;EACT,QAAQ;EACR,OAAO;EACP,MAAM;EACN,SAAS;EACT,QAAQ;EACR,OAAO;EACP,MAAM;EACN,SAAS;EACT,QAAQ;EACR,QAAQ;EACR,OAAO;EACP,UAAU;EACV,SAAS;EACT,SAAS;EACT,QAAQ;EACR,UAAU;EACV,SAAS;EACT,SAAS;EACT,QAAQ;EACR,KAAK;EACL,MAAM;EACN,MAAM;EACN,OAAO;EACP,MAAM;EACN,OAAO;EACP,MAAM;EACN,OAAO;EACP,OAAO;EACP,QAAQ;EACR,OAAO;EACP,QAAQ;EACR,gBAAgB;EAChB,SAAS;EACT,OAAO;EACP,cAAc;EACd,MAAM;EACN,UAAU;EACV,YAAY;EACZ,cAAc;EACd,aAAa;EACb,YAAY;EACZ,aAAa;EACb,OAAO;EACP,KAAK;EACL,MAAM;EACN,WAAW;EACX,iBAAiB;EACjB,iBAAiB;EACjB,KAAK;EACL,IAAI;EACJ,SAAS;EACT,0BAA0B;EAC1B,QAAQ;EACR,UAAU;EACV,gCAAgC;EAChC,kCAAkC;EAClC,UAAU;EACV,cAAc;EACd,eAAe;EACf,mBAAmB;EACnB,eAAe;EACf,IAAI;EACJ,KAAK;EACL,WAAW;EACX,SAAS;EACT,QAAQ;EACR,sBAAsB;EACtB,iCAAiC;EACjC,6BAA6B;EAC7B,aAAa;EACb,oBAAoB;EACpB,oBAAoB;EACpB,iCAAiC;EACjC,uCAAuC;EACxC,CAE+B,EAGzB,IAAI,MAAM,GAAK,EACpB,IAAI,GAAQ,GAAM;AAChB,MAAI,KAAQ,EACV,QAAO,EAAO;AAEhB,MAAI,OAAO,KAAS,SAKlB,QAJI,oBAAoB,KAAK,EAAK,IAChC,QAAQ,KAAK,+CAA+C,IAAO,EAC5D,WAEI;IAGlB,CAAC;GAKE,KAA6B,GAAa,MAAqB;CACnE,IAAM,IAAI,EAAO,SAAS,KACpB,IAAI,EAAO,UAAU,KACrB,IAAS,EAAkB,GAAG,GAAG;EACrC,qBAAqB;EACrB,uBAAuB;EACvB,WAAW,GAAO,aAAa;EAC/B,OAAO,GAAO,SAAS;EACxB,CAAC,EAEI,IAAwC;EAC5C,kBAAkB;EAClB,0BAA0B;EAC1B,YAAY;EACZ,oBAAoB;EACpB,gBAAgB;EAChB,sBAAsB;EACtB,sBAAsB;EACtB,wBAAwB;EACxB,iBAAiB;EACjB,iBAAiB;EACjB,oBAAoB;EACpB,mBAAmB;EACnB,0BAA0B;EAC1B,0BAA0B;EAC1B,gBAAgB;EAChB,wBAAwB;EACxB,2BAA2B;EAC3B,6BAA6B;EAC7B,6BAA6B;EAC7B,6BAA6B;EAC7B,wBAAwB;EACxB,iCAAiC;EACjC,uBAAuB;EACvB,2BAA2B;EAC3B,mCAAmC;EACnC,6BAA6B;EAC7B,oBAAoB;EACpB,mBAAmB;EACnB,qBAAqB;EACrB,kBAAkB;EAClB,mBAAmB;EACnB,kBAAkB;EAClB,kBAAkB;EAClB,0BAA0B;EAC1B,0BAA0B;EAC1B,sBAAsB;EACtB,uBAAuB;EACvB,mBAAmB;EACnB,mBAAmB;EACnB,mBAAmB;EACnB,mBAAmB;EACnB,oBAAoB;EACpB,kBAAkB;EAClB,mBAAmB;EACnB,aAAa;EACb,mBAAmB;EACnB,kBAAkB;EAClB,oBAAoB;EACpB,qBAAqB;EACrB,oBAAoB;EACpB,iBAAiB;EACjB,gBAAgB;EAChB,kBAAkB;EAClB,OAAO;EACP,MAAM;EACN,KAAK;EACL,IAAI;EACJ,SAAS;EACT,QAAQ;EACR,OAAO;EACP,MAAM;EACN,SAAS;EACT,QAAQ;EACR,OAAO;EACP,MAAM;EACN,SAAS;EACT,QAAQ;EACR,QAAQ;EACR,OAAO;EACP,UAAU;EACV,SAAS;EACT,SAAS;EACT,QAAQ;EACR,UAAU;EACV,SAAS;EACT,SAAS;EACT,QAAQ;EACR,KAAK;EACL,MAAM;EACN,MAAM;EACN,OAAO;EACP,MAAM;EACN,OAAO;EACP,MAAM;EACN,OAAO;EACP,OAAO;EACP,QAAQ;EACR,OAAO;EACP,QAAQ;EACR,gBAAgB;EAChB,SAAS;EACT,OAAO;EACP,cAAc;EACd,MAAM;EACN,UAAU;EACV,YAAY;EACZ,cAAc;EACd,aAAa;EACb,YAAY;EACZ,aAAa;EACb,KAAK;EACL,IAAI;EACJ,YAAY;EACZ,KAAK;EACL,KAAK;EACL,mBAAmB;EACnB,oBAAoB;EACpB,oBAAoB;EACpB,iCAAiC;EACjC,uCAAuC;EACvC,6BAA6B;EAC7B,qBAAqB;EACrB,0BAA0B;EAC1B,kBAAkB;EAClB,cAAc;EACd,iCAAiC;EACjC,aAAa;EACb,aAAa;EACb,aAAa;EACb,aAAa;EACb,cAAc;EACd,cAAc;EACd,SAAS;EACT,0BAA0B;EAC1B,QAAQ;EACR,UAAU;EACX,EAEK,IAAmB,EAAO,aAAa,KAAK,EAAO,EACnD,IAA6C;EACjD,MAAQ;EACR,OAAQ;EACR,MAAQ;EACR,MAAQ;EACR,OAAQ;EACR,OAAQ;EACR,OAAQ;EACR,OAAQ;EACR,OAAQ;EACR,OAAQ;EACR,OAAQ;EACR,OAAQ;EACR,OAAQ;EACR,OAAQ;EACR,OAAQ;EACR,OAAQ;EACT,EAGK,UAAa,IACb,IAAmC;EACvC,mBACE,EAAO,mBAAmB,KAAK,EAAO,YAAY,EAAE,SAAS,GAAG;EAClE,iBAAiB,EAAO,iBAAiB,KAAK,EAAO,IAAI;EACzD,mBAAmB,EAAO,mBAAmB,KAAK,EAAO,IAAI;EAC7D,eAAe,EAAO,eAAe,KAAK,EAAO,WAAW;EAC5D,qBAAqB,EAAO,qBAAqB,KAAK,EAAO,IAAI;EACjE,uBAAuB,EAAO,uBAAuB,KAAK,EAAO,IAAI;EACrE,qBAAqB,EAAO,qBAAqB,KAAK,EAAO,IAAI;EACjE,aAAa,EAAO,aAAa,KAAK,EAAO,IAAI;EACjD,YAAY,EAAO,YAAY,KAAK,EAAO,IAAI;EAC/C,YAAY,EAAO,YAAY,KAAK,EAAO,IAAI;EAC/C,eAAe,EAAO,eAAe,KAAK,EAAO,IAAI;EACrD,cAAc,EAAO,cAAc,KAAK,EAAO,IAAI;EACnD,cAAc,EAAO,cAAc,KAAK,EAAO,IAAI;EACnD,sBAAsB,EAAO,sBAAsB,KAAK,EAAO,IAAI;EACnE,yBACE,EAAO,yBAAyB,KAAK,EAAO,IAAI;EAClD,gBAAgB,EAAO,gBAAgB,KAAK,EAAO,IAAI;EACvD,iBAAiB,EAAO,iBAAiB,KAAK,EAAO,IAAI;EACzD,sBACE,EAAO,sBAAsB,KAAK,EAAO,WAAW;EACtD,qBAAqB,EAAO,qBAAqB,KAAK,EAAO,IAAI;EACjE,gCACE,EAAO,gCAAgC,KAAK,EAAO,WAAW;EAChE,2BACE,EAAO,2BAA2B,KAAK,EAAO,WAAW;EAC3D,mBACE,EAAO,mBAAmB,KAAK,EAAO,WAAkB,EAAE;EAC5D,mBACE,EAAO,mBAAmB,KAAK,EAAO,WAAkB,EAAE;EAC5D,yBACE,EAAO,yBAAyB,KAAK,EAAO,YAAY,EAAE,SAAS,GAAG;EACxE,uBAAuB,EAAO,uBAAuB,KAAK,EAAO,IAAI;EACrE,wBAAwB,EAAO,wBAAwB,KAAK,EAAO,IAAI;EACvE,sBAAsB,EAAO,sBAAsB,KAAK,EAAO,IAAI;EACnE,2BACE,EAAO,2BAA2B,KAAK,EAAO,IAAI;EACpD,yBACE,EAAO,yBAAyB,KAAK,EAAO,IAAI;EAClD,wBAAwB,EAAO,wBAAwB,KAAK,EAAO,IAAI;EACvE,yBACE,EAAO,yBAAyB,KAAK,EAAO,IAAI;EAClD,aAAa,EAAO,aAAa,KAAK,EAAO,YAAY,EAAE,SAAS,GAAG;EACvE,aAAa,EAAO,aAAa,KAAK,EAAO,IAAI;EACjD,YAAY,EAAO,YAAY,KAAK,EAAO,IAAI;EAC/C,UAAU,EAAO,UAAU,KAAK,EAAO,IAAI;EAC3C,mBAAmB,EAAO,mBAAmB,KAAK,EAAO,WAAW;EACpE,UAAU,EAAO,UAAU,KAAK,EAAO,WAAiB;EACxD,WAAW,EAAO,WAAW,KAAK,EAAO,YAAY,EAAE,SAAS,GAAG;EACnE,YAAY,EAAO,YAAY,KAAK,EAAO,IAAI;EAC/C,gBAAgB,EAAO,gBAAgB,KAAK,EAAO,WAAW;EAC9D,UAAU,EAAO,UAAU,KAAK,EAAO,IAAI;EAC3C,kBAAkB,EAAO,kBAAkB,KAAK,EAAO,WAAW;EAClE,eACE,EAAO,eAAe,KAAK,EAAO,YAAY,EAAE,SAAS,GAAG;EAC9D,eAAe,EAAO,eAAe,KAAK,EAAO,IAAI;EACrD,aAAa,EAAO,aAAa,KAAK,EAAO,IAAI;EACjD,mBAAmB,EAAO,mBAAmB,KAAK,EAAO,IAAI;EAC7D,mBAAmB,EAAO,mBAAmB,KAAK,EAAO,IAAI;EAC7D,WAAW,EAAO,WAAW,KAAK,EAAO,WAAW;EACpD,iBAAiB,EAAO,iBAAiB,KAAK,EAAO,IAAI;EACzD,uBAAuB,EAAO,uBAAuB,KAAK,EAAO,IAAI;EACrE,yBACE,EAAO,yBAAyB,KAAK,EAAO,IAAI;EAClD,gCACE,EAAO,gCAAgC,KAAK,EAAO,IAAI;EACzD,kBAAkB,EAAO,kBAAkB,KAAK,EAAO,IAAI;EAC3D,mBAAmB,EAAO,mBAAmB,KAAK,EAAO,IAAI;EAC7D,mBAAmB,EAAO,mBAAmB,KAAK,EAAO,IAAI;EAC7D,sBAAsB,EAAO,sBAAsB,KAAK,EAAO,IAAI;EACnE,YAAY,EAAO,YAAY,KAAK,EAAO,IAAI;EAC/C,YAAY,EAAO,YAAY,KAAK,EAAO,IAAI;EAC/C,YAAY,EAAO,YAAY,KAAK,EAAO,IAAI;EAC/C,YAAY,EAAO,YAAY,KAAK,EAAO,IAAI;EAC/C,aAAa,EAAO,aAAa,KAAK,EAAO,IAAI;EACjD,aAAa,EAAO,aAAa,KAAK,EAAO,IAAI;EACjD,aAAa,EAAO,aAAa,KAAK,EAAO,IAAI;EACjD,aAAa,EAAO,aAAa,KAAK,EAAO,IAAI;EACjD,oBAAoB,EAAO,oBAAoB,KAAK,EAAO,IAAI;EAC/D,oBAAoB,EAAO,oBAAoB,KAAK,EAAO,IAAI;EAC/D,oBAAoB,EAAO,oBAAoB,KAAK,EAAO,IAAI;EAC/D,oBAAoB,EAAO,oBAAoB,KAAK,EAAO,IAAI;EAC/D,oBAAoB,EAAO,oBAAoB,KAAK,EAAO,IAAI;EAC/D,oBAAoB,EAAO,oBAAoB,KAAK,EAAO,IAAI;EAC/D,4BACE,EAAO,4BAA4B,KAAK,EAAO,WACxC,IAAI,WAAW,CAAC,EAAE,CAAC;EAC7B;AAED,QAAO,IAAI,MAAM,GAAQ,EACvB,IAAI,GAAa,GAAuB;AACtC,MAAI,OAAO,KAAS,SAClB,QAAO,EAAO;AAGhB,MAAI,MAAS,SACX,QAAO;AAET,MAAI,MAAS,qBACX,QAAO,EAAO,SAAS;AAEzB,MAAI,MAAS,sBACX,QAAO,EAAO,UAAU;AAE1B,MAAI,MAAS,0BACX,QAAO;AAGT,MAAI,MAAS,eACX,SAAQ,MAAkB;AACxB,OAAI,KAAS,EACX,QAAO,EAAsB;AAE/B,OAAI;AACF,WAAO,EAAiB,EAAM;WACxB;AACN,WAAO;;;AAKb,MAAI,KAAQ,KAAe,OAAO,EAAO,MAAU,WACjD,QAAO,EAAY;AAErB,MAAI,KAAQ,KAAiB,EAAE,KAAQ,GACrC,QAAO,EAAc;EAGvB,IAAM,IAAQ,EAAO;AACrB,SAAO,OAAO,KAAU,aAAa,EAAM,KAAK,EAAO,GAAG;IAE7D,CAAC;GAME,KACJ,IAAgB,KAChB,IAAiB,QACK;CACtB,IAAM,IAAa,EAAiB,GAAO,EAAO,EAC9C,IAAiB,MACjB,IAAsB,MAEpB,IAAQ,IAAI,MAAM,GAA4C;EAClE,IAAI,GAAa,GAAuB;AACtC,OAAI,MAAS,QACX,QAAO,AAAkB,EAAO,WAAS,EAAE;AAE7C,OAAI,MAAS,YACX,QACE,AACC,EAAO,eAAa;IACnB,MAAM;IACN,SAAS;IACT,WAAW;AACT,YAAO;;IAET,SAAS;IACV;AAGL,OAAI,MAAS,OAAO,YAClB,QAAO;AAGT,OAAI,MAAS,aACX,SAAQ,GAAqB,MACvB,MAAgB,QAClB,AACE,MAAY,EAAe,EAAO,WAAW,MAAM,EAAM,CAAC,EAErD,KAEL,MAAgB,YAAY,MAAgB,WAC9C,AACE,MAAiB,IACb,EAA0B,GAAO,EAAM,GACvC,EAAwB,EAAM,EAE7B,KAEF,EAAO,WAAW,GAAa,EAAM;AAIhD,OAAI,MAAS,sBAAsB,MAAS,sBAC1C,cAAa;AAGf,OAAI,MAAS,wBACX,eAAc;IACZ,GAAG;IACH,GAAG;IACH,OAAO,EAAO;IACd,QAAQ,EAAO;IACf,KAAK;IACL,MAAM;IACN,QAAQ,EAAO;IACf,OAAO,EAAO;IACf;AAKH,OAAI,MAAS,eAAe,KAAkB,EAC5C,SAAQ,GAAmB,MAAqB;IAC9C,IAAM,IAAI,EAAO,OACX,IAAI,EAAO,QACX,IAAS,IAAI,WAAW,IAAI,IAAI,EAAE;AACxC,MAAe,WACb,GACA,GACA,GACA,GACA,EAAe,QAAQ,MACvB,EAAe,iBAAiB,MAChC,EACD;IAED,IAAM,IAAU,IAAI,WAAW,IAAI,IAAI,EAAE,EACnC,IAAU,IAAI;AACpB,SAAK,IAAI,IAAI,GAAG,IAAI,GAAG,IACrB,GAAQ,IACN,EAAO,UAAU,IAAI,IAAI,KAAK,IAAU,IAAI,KAAK,EAAQ,EACzD,IAAI,EACL;AAQH,WANc,EAAO,WAAW,KAAK,CAC/B,aACJ,IAAI,EAAc,IAAI,kBAAkB,EAAQ,OAAO,EAAE,GAAG,EAAE,EAC9D,GACA,EACD,EACM,EAAO,UAAU,GAAU,EAAQ;;GAI9C,IAAM,IAAQ,EAAO;AACrB,UAAO,OAAO,KAAU,aAAa,EAAM,KAAK,EAAO,GAAG;;EAG5D,IAAI,GAAa,GAAuB,GAAY;AAGlD,OAFA,EAAO,KAAQ,GAGb,KACA,MACC,MAAS,WAAW,MAAS,WAC9B;IACA,IAAM,IAAM,EAAe,eACzB,+BACD;AACD,IAAI,KACF,EAAI,OAAO,EAAO,OAAO,EAAO,OAAO;;AAG3C,UAAO;;EAGT,iBAAiB;AACf,UAAO,kBAAkB;;EAE5B,CAAC;AAEF,QAAO;GAKH,UAAiD;CACrD,IAAM,IAAK,EACT,gCACA,MACD,EACK,IAAU,IAAI,GAAW;AAE9B,GAAW,KAAc;CAE1B,IAAI,IAAa;AA+DjB,QA9DA,OAAO,eAAe,GAAI,OAAO;EAC/B,MAAM;AACJ,UAAO;;EAET,IAAI,GAAa;AAMf,OALA,IAAa,GAKT,OAAO,KAAQ,YAAY,EAAI,WAAW,QAAQ,EAAE;AACtD,UAAM,EAAI,CACP,MAAM,MAAM,EAAE,aAAa,CAAC,CAC5B,MAAM,MAAO;AAER,WAAe,MAGnB,EAAQ,MAAM,OAAO,KAAK,EAAG;MAC7B,CACD,OAAO,MAAQ;KACd,IAAM,IAAQ,aAAe,QAAQ,IAAU,MAAM,OAAO,EAAI,CAAC;AACjE,OAAG,cACD,IAAI,WAAW,SAAS;MAAE;MAAO,SAAS,EAAM;MAAS,CAAC,CAC3D;MACD;AACJ;;AAEF,KAAQ,MAAM;;EAEhB,cAAc;EACf,CAAC,EAEF,EAAQ,eAAe;AAoBrB,EAnBA,OAAO,eAAe,GAAI,SAAS;GACjC,OAAO,EAAQ;GACf,UAAU;GACV,cAAc;GACf,CAAC,EACF,OAAO,eAAe,GAAI,UAAU;GAClC,OAAO,EAAQ;GACf,UAAU;GACV,cAAc;GACf,CAAC,EACF,OAAO,eAAe,GAAI,gBAAgB;GACxC,OAAO,EAAQ;GACf,cAAc;GACf,CAAC,EACF,OAAO,eAAe,GAAI,iBAAiB;GACzC,OAAO,EAAQ;GACf,cAAc;GACf,CAAC,EACF,OAAO,eAAe,GAAI,YAAY;GAAE,OAAO;GAAM,cAAc;GAAM,CAAC,EAC1E,EAAG,cAAc,IAAI,MAAM,OAAO,CAAC;IAGrC,EAAQ,WAAW,MAAe;AAChC,IAAG,cACD,IAAI,WAAW,SAAS;GAAE,OAAO;GAAK,SAAS,GAAK;GAAS,CAAC,CAC/D;IAGI;;AAGT,SAAS,iBACP,GACA,MAEI,EAAQ,aAAa,KAAK,WACrB,GAAmB,GAErB,EAAkB,GAAS,EAAQ,EAG5C,SAAS,mBACP,GACA,GACA,MACG;CACH,IAAM,IAAM,EAAc,aAAa;AAOvC,QANI,MAAQ,WACH,GAAmB,GAExB,MAAQ,QACH,GAAwB,GAE1B,EAAoB,GAAc,GAAe,EAAQ"}
|
package/lib/roomle-headless.d.ts
CHANGED
|
@@ -642,9 +642,9 @@ export declare class CeilingLight extends PointLight {
|
|
|
642
642
|
private _shouldCastShadow;
|
|
643
643
|
getContainer(): Mesh | null;
|
|
644
644
|
get shouldCastShadow(): boolean;
|
|
645
|
-
constructor(debug
|
|
645
|
+
constructor(debug?: boolean);
|
|
646
646
|
recalculatePower(amountOfLights: number): void;
|
|
647
|
-
update(
|
|
647
|
+
update(): void;
|
|
648
648
|
addDebugUI(ceilingLightsParameters: GenericGUIParamFolder): void;
|
|
649
649
|
}
|
|
650
650
|
|
|
@@ -1604,6 +1604,7 @@ export declare class ConfiguratorSceneManager extends SceneManager implements Co
|
|
|
1604
1604
|
private _sceneEventHandler;
|
|
1605
1605
|
private _isComponentDimensionsVisible;
|
|
1606
1606
|
private _dimensionUpdateDebounced;
|
|
1607
|
+
private _sceneSetupReady;
|
|
1607
1608
|
constructor(creator: string, offset: CanvasOffset, mode: Enumify_2<typeof CAMERA_TYPE>);
|
|
1608
1609
|
/**
|
|
1609
1610
|
* Single point for deciding whether to push HTML label positions to the UI.
|
|
@@ -2582,6 +2583,8 @@ export declare class DraggableNode extends Object3D {
|
|
|
2582
2583
|
getSize(): Vector3;
|
|
2583
2584
|
hoverOn(): void;
|
|
2584
2585
|
hoverOff(): void;
|
|
2586
|
+
setSphereColor(color: number): void;
|
|
2587
|
+
setInnerRingColor(color: number): void;
|
|
2585
2588
|
select(color: number): void;
|
|
2586
2589
|
deselect(color: number): void;
|
|
2587
2590
|
}
|
|
@@ -2663,6 +2666,14 @@ export declare interface Element_2 {
|
|
|
2663
2666
|
perspectiveImage: AssetUrl;
|
|
2664
2667
|
}
|
|
2665
2668
|
|
|
2669
|
+
export declare interface ElevationPlan {
|
|
2670
|
+
planSvg: string;
|
|
2671
|
+
}
|
|
2672
|
+
|
|
2673
|
+
export declare interface ElevationPlans {
|
|
2674
|
+
plans: ElevationPlan[];
|
|
2675
|
+
}
|
|
2676
|
+
|
|
2666
2677
|
export declare interface ElevationProfile {
|
|
2667
2678
|
profileContour: ElevationProfilePoint[];
|
|
2668
2679
|
}
|
|
@@ -2676,7 +2687,7 @@ export declare interface ElevationProfilePoint {
|
|
|
2676
2687
|
|
|
2677
2688
|
export declare interface ElevationView {
|
|
2678
2689
|
lineOfSight: KernelVector3f;
|
|
2679
|
-
objects:
|
|
2690
|
+
objects: PlanObject[];
|
|
2680
2691
|
profile: ElevationProfile;
|
|
2681
2692
|
}
|
|
2682
2693
|
|
|
@@ -3329,6 +3340,7 @@ export declare interface FeatureFlags {
|
|
|
3329
3340
|
/* Excluded from this release type: interiorLights */
|
|
3330
3341
|
/* Excluded from this release type: advancedDimensioning */
|
|
3331
3342
|
/* Excluded from this release type: webGpu */
|
|
3343
|
+
/* Excluded from this release type: webGpuConfig */
|
|
3332
3344
|
/* Excluded from this release type: advancedHighlighting */
|
|
3333
3345
|
/* Excluded from this release type: fence */
|
|
3334
3346
|
}
|
|
@@ -4797,7 +4809,7 @@ export declare interface KernelParameter {
|
|
|
4797
4809
|
viewType: KernelViewType;
|
|
4798
4810
|
source: 'external' | 'internal';
|
|
4799
4811
|
level?: number;
|
|
4800
|
-
objectIds
|
|
4812
|
+
objectIds?: number[];
|
|
4801
4813
|
}
|
|
4802
4814
|
|
|
4803
4815
|
export declare interface KernelParameterGroup {
|
|
@@ -5441,19 +5453,23 @@ export declare interface NodeDimensionTransferable {
|
|
|
5441
5453
|
}
|
|
5442
5454
|
|
|
5443
5455
|
export declare class NodePlanElementViewModel extends PlanElementViewModel {
|
|
5444
|
-
|
|
5456
|
+
protected _nodeUiMesh: DraggableNode;
|
|
5457
|
+
protected _defaultRingColor: number;
|
|
5445
5458
|
constructor(planObject: PlanObject);
|
|
5446
5459
|
update(): void;
|
|
5447
5460
|
setTopView(enabled: boolean): void;
|
|
5448
5461
|
getSize(): Vector3;
|
|
5449
5462
|
show(): void;
|
|
5450
5463
|
hide(): void;
|
|
5464
|
+
protected getSelectionRingColor(): number;
|
|
5451
5465
|
select(): void;
|
|
5452
5466
|
deselect(): void;
|
|
5453
5467
|
hoverOn(): void;
|
|
5454
5468
|
hoverOff(): void;
|
|
5455
5469
|
protected _generateBoundingBox(): RoomleEventedMesh;
|
|
5456
5470
|
setZoom(zoom: number): void;
|
|
5471
|
+
setFillColor(color: number): void;
|
|
5472
|
+
setDefaultRingColor(color: number): void;
|
|
5457
5473
|
}
|
|
5458
5474
|
|
|
5459
5475
|
export declare interface NodePlanObject extends PlanObject {
|
|
@@ -6482,6 +6498,8 @@ export declare class PlannerSceneManager extends ConfiguratorSceneManager implem
|
|
|
6482
6498
|
private _hideAllNodeIfThereAreNoSelections;
|
|
6483
6499
|
protected _onCameraMove(): boolean;
|
|
6484
6500
|
private _showWallNodes;
|
|
6501
|
+
private _applyFenceNodeStyle;
|
|
6502
|
+
private _shouldKeepFenceNodesVisible;
|
|
6485
6503
|
private _updateNodeSize;
|
|
6486
6504
|
private _sendPlanObjectPositions;
|
|
6487
6505
|
private _sendMultiSelectionPosition;
|
|
@@ -6752,7 +6770,7 @@ export declare class PlanViewModel extends ConfiguratorViewModel implements Plan
|
|
|
6752
6770
|
private _handleCeilingPlanElementViewModel;
|
|
6753
6771
|
private _handleNodePlanElementViewModel;
|
|
6754
6772
|
private _getCeilingLightsDistribution;
|
|
6755
|
-
handleInitialCeilingLights(ceilingLightsParameters: GenericGUIParamFolder | undefined
|
|
6773
|
+
handleInitialCeilingLights(ceilingLightsParameters: GenericGUIParamFolder | undefined): void;
|
|
6756
6774
|
handleCeilingLights(): void;
|
|
6757
6775
|
handleLampLight(lamp: StaticPlanObjectViewModel, options: {
|
|
6758
6776
|
targetPos: KernelVector3f;
|
|
@@ -7260,17 +7278,6 @@ export declare class PromiseQueue<T> {
|
|
|
7260
7278
|
get length(): number;
|
|
7261
7279
|
}
|
|
7262
7280
|
|
|
7263
|
-
export declare const QUALITY_LEVELS: {
|
|
7264
|
-
readonly HIGHEST: "highest";
|
|
7265
|
-
readonly HIGH: "high";
|
|
7266
|
-
readonly MEDIUM: "medium";
|
|
7267
|
-
readonly LOW: "low";
|
|
7268
|
-
};
|
|
7269
|
-
|
|
7270
|
-
export declare type QualityLevel = Enumify<typeof QUALITY_LEVELS>;
|
|
7271
|
-
|
|
7272
|
-
export declare type QualityMap = Map<QualityLevel, any>;
|
|
7273
|
-
|
|
7274
7281
|
export declare class RangeArray extends EmsArray<KernelRange> {
|
|
7275
7282
|
}
|
|
7276
7283
|
|
|
@@ -8194,7 +8201,18 @@ export declare class RoomleConfigurator<P extends readonly PluginName[] = readon
|
|
|
8194
8201
|
private _checkInitDone;
|
|
8195
8202
|
private _onInitDone;
|
|
8196
8203
|
constructor(creator: string, activePlugins?: P);
|
|
8197
|
-
|
|
8204
|
+
/**
|
|
8205
|
+
* Creates a 2D elevation plan of the current configuration, returned as raw
|
|
8206
|
+
* SVG markup (wireframe rendering with measurements).
|
|
8207
|
+
*
|
|
8208
|
+
* @returns the elevation plans, containing one plan with its SVG markup
|
|
8209
|
+
*/
|
|
8210
|
+
create2DElevationPlan(): ElevationPlans;
|
|
8211
|
+
/**
|
|
8212
|
+
* Creates the 2D elevation plan of the current configuration (see
|
|
8213
|
+
* {@link create2DElevationPlan}) and downloads it as an SVG file.
|
|
8214
|
+
*/
|
|
8215
|
+
download2DElevationPlan(): void;
|
|
8198
8216
|
private createCameraForElevationPlan;
|
|
8199
8217
|
exportCanvasScreenshot(quality?: number): Promise<string>;
|
|
8200
8218
|
initSceneManager(sceneManager?: ConfiguratorSceneManager): void;
|
|
@@ -9141,7 +9159,19 @@ export declare class RoomlePlanner<P extends readonly PluginName[] = readonly []
|
|
|
9141
9159
|
*/
|
|
9142
9160
|
createPlanFromObject(id: RapiId, position?: Position3, rotation?: number): Promise<number>;
|
|
9143
9161
|
loadPlanXml(xml: string, options?: InitDataDefinition & GlobalInitDataDefinition): Promise<void>;
|
|
9144
|
-
|
|
9162
|
+
/**
|
|
9163
|
+
* Creates 2D elevation plans of the current plan, one per elevation view.
|
|
9164
|
+
* Each plan is returned as raw SVG markup (wireframe rendering with
|
|
9165
|
+
* dimensionings).
|
|
9166
|
+
*
|
|
9167
|
+
* @returns the elevation plans, each containing its SVG markup
|
|
9168
|
+
*/
|
|
9169
|
+
create2DElevationPlan(): ElevationPlans;
|
|
9170
|
+
/**
|
|
9171
|
+
* Creates the 2D elevation plans of the current plan (see
|
|
9172
|
+
* {@link create2DElevationPlan}) and downloads each plan as an SVG file.
|
|
9173
|
+
*/
|
|
9174
|
+
download2DElevationPlan(): void;
|
|
9145
9175
|
loadPlan(id: string, options?: InitDataDefinition & GlobalInitDataDefinition): Promise<RapiPlan | RapiPlanSnapshotGetData>;
|
|
9146
9176
|
/**
|
|
9147
9177
|
* Set general configuration parameter
|
|
@@ -9837,16 +9867,10 @@ export declare abstract class RoomleRenderer<RendererType extends WebGLRenderer
|
|
|
9837
9867
|
switchToConfigurator(): void;
|
|
9838
9868
|
switchToPlanner(_renderMode: PlannerRenderMode): void;
|
|
9839
9869
|
abstract setShadingType(shadingType: SceneShadingType): void;
|
|
9840
|
-
abstract setAutoQuality(autoQuality: boolean): void;
|
|
9841
|
-
abstract setQualityLevel(qualityLevel: QualityLevel): void;
|
|
9842
|
-
abstract getQualityLevel(): QualityLevel;
|
|
9843
|
-
abstract setQualityMap(qualityMap: QualityMap): void;
|
|
9844
|
-
abstract setCustomShadingParameters(customShadingParameters?: CustomShadingParameters, customShadingParametersMoc?: CustomShadingParameters): void;
|
|
9845
9870
|
abstract setCustomOutlineParameters(outlineCustomParameters: OutlineCustomParameters): void;
|
|
9846
9871
|
abstract loadLutImages(luts: LutImageDefinition[]): void;
|
|
9847
9872
|
abstract render(scene: Scene, camera: Camera): void;
|
|
9848
9873
|
abstract showGUI(updateCallback: () => void): void;
|
|
9849
|
-
abstract setOnQualityLevelChangeCallback(callback: (qualityLevel: QualityLevel) => void): void;
|
|
9850
9874
|
abstract clearCache(): void;
|
|
9851
9875
|
abstract highlightObjects(selectedMeshes: Object3D[]): void;
|
|
9852
9876
|
abstract setGroundShadow(enabled: boolean, scene: Scene): void;
|
|
@@ -9921,8 +9945,12 @@ export declare class RoomleWebGPURenderer extends RoomleRenderer<WebGPURenderer>
|
|
|
9921
9945
|
private readonly renderPasses;
|
|
9922
9946
|
private readonly guiParameterGroups;
|
|
9923
9947
|
private lastRenderCamera;
|
|
9948
|
+
private readonly qualityManager;
|
|
9949
|
+
private freezeFrames;
|
|
9950
|
+
private readonly freezeRenderTarget;
|
|
9924
9951
|
private _domHelper;
|
|
9925
9952
|
private _webGpuGroundShadowReflection;
|
|
9953
|
+
private _initData;
|
|
9926
9954
|
constructor(creator: string, renderer: WebGPURenderer, enableSSGI: boolean, outlineColors?: OutlineColors);
|
|
9927
9955
|
private enableRenderPasses;
|
|
9928
9956
|
addGroundShadowLightAndFloor(scene: Scene): Promise<void>;
|
|
@@ -9930,26 +9958,23 @@ export declare class RoomleWebGPURenderer extends RoomleRenderer<WebGPURenderer>
|
|
|
9930
9958
|
clearCache(): void;
|
|
9931
9959
|
disableUiInteractionMode(): void;
|
|
9932
9960
|
enableUiInteractionMode(): void;
|
|
9933
|
-
getQualityLevel(): QualityLevel;
|
|
9934
9961
|
setCameraType(cameraType: Enumify_2<typeof CAMERA_TYPE>): void;
|
|
9935
9962
|
switchToConfigurator(): void;
|
|
9936
9963
|
switchToPlanner(renderMode: PlannerRenderMode): void;
|
|
9937
9964
|
highlightObjects(selectedMeshes: Object3D[]): void;
|
|
9938
9965
|
loadLutImages(_luts: LutImageDefinition[]): void;
|
|
9939
9966
|
render(scene: Scene, camera: Camera): void;
|
|
9967
|
+
private renderToFreezeTarget;
|
|
9940
9968
|
private updateCameraProjectionMatrix;
|
|
9941
9969
|
private assembleRenderPasses;
|
|
9942
|
-
setAutoQuality(_autoQuality: boolean): void;
|
|
9943
|
-
setCustomShadingParameters(_customShadingParameters: CustomShadingParameters | undefined, _customShadingParametersMoc: CustomShadingParameters | undefined): void;
|
|
9944
9970
|
setCustomOutlineParameters(customOutlineParameters: OutlineCustomParameters): void;
|
|
9945
9971
|
setGroundShadow(enabled: boolean, _scene: Scene): void;
|
|
9946
|
-
setOnQualityLevelChangeCallback(_callback: (qualityLevel: QualityLevel) => void): void;
|
|
9947
9972
|
private enableOutline;
|
|
9948
9973
|
private getOutlinePassOrUndefined;
|
|
9949
9974
|
private enableSsgiPass;
|
|
9950
9975
|
private enableTraaPass;
|
|
9951
|
-
|
|
9952
|
-
|
|
9976
|
+
private applyQualityParameters;
|
|
9977
|
+
private getSsgiPassOrUndefined;
|
|
9953
9978
|
setShadingType(shadingType: SceneShadingType): void;
|
|
9954
9979
|
showGUI(updateCallback: () => void): void;
|
|
9955
9980
|
private addDebugGUI;
|
|
@@ -10925,7 +10950,7 @@ export declare class WallPlanElementViewModel extends PlanElementViewModel {
|
|
|
10925
10950
|
constructor(planObject: PlanObject);
|
|
10926
10951
|
get isSelected(): boolean;
|
|
10927
10952
|
private _checkHasAttachedAttic;
|
|
10928
|
-
getWallDimension(zoomFactor: number, clientWidth: number, clientHeight: number): WallDimension;
|
|
10953
|
+
getWallDimension(zoomFactor: number, clientWidth: number, clientHeight: number, preferredSideOverride?: LeftOrRightWallSide): WallDimension;
|
|
10929
10954
|
private calculateNormalVector;
|
|
10930
10955
|
private calculateShiftingFactor;
|
|
10931
10956
|
private calculateAtticInfo;
|
|
@@ -10976,6 +11001,30 @@ export declare interface WallSide {
|
|
|
10976
11001
|
value: Enumify_3<typeof WALL_SIDES>;
|
|
10977
11002
|
}
|
|
10978
11003
|
|
|
11004
|
+
export declare interface WebGpuConfig {
|
|
11005
|
+
/**
|
|
11006
|
+
* @description If true, the initial webgpu quality level is autodetected based on
|
|
11007
|
+
* a benchmark of the graphics hardware. If false, the default quality level is used.
|
|
11008
|
+
* @default true
|
|
11009
|
+
*/
|
|
11010
|
+
autoDetectQualityLevel?: boolean;
|
|
11011
|
+
/**
|
|
11012
|
+
* @description This can be used to configure the lower bound of webgpu auto quality
|
|
11013
|
+
* meaning the fps bound which, when hit, will set the quality setting lower
|
|
11014
|
+
* To disable: set to 0
|
|
11015
|
+
* @default 24
|
|
11016
|
+
*/
|
|
11017
|
+
autoQualityMinFps?: number;
|
|
11018
|
+
/**
|
|
11019
|
+
* @description This can be used to configure the upper bound of webgpu auto quality
|
|
11020
|
+
* meaning the fps bound which, when hit, will set the quality setting higher
|
|
11021
|
+
* This should be sufficiently larger than the minFps to not cause the quality to go up and down all the time
|
|
11022
|
+
* To disable: set to something very high
|
|
11023
|
+
* @default 59
|
|
11024
|
+
*/
|
|
11025
|
+
autoQualityMaxFps?: number;
|
|
11026
|
+
}
|
|
11027
|
+
|
|
10979
11028
|
export declare class ZoomChangeEvent {
|
|
10980
11029
|
minZoom: boolean;
|
|
10981
11030
|
maxZoom: boolean;
|