@roomle/web-sdk 3.10.0-alpha.2 → 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-BXU3pZnX.mjs → api-BlFJIGaV.mjs} +2 -2
- package/lib/{api-BXU3pZnX.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-C911tbNL.mjs.map → asset-loader.worker-CHyN7JB1.mjs.map} +1 -1
- 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-5iIw1f_3.mjs → component-dimensioning-DcmDM6gV.mjs} +6 -6
- package/lib/{component-dimensioning-5iIw1f_3.mjs.map → component-dimensioning-DcmDM6gV.mjs.map} +1 -1
- package/lib/{component-raycast-helper-O27_buEg.mjs → component-raycast-helper-CXN2MHtG.mjs} +4 -4
- package/lib/{component-raycast-helper-O27_buEg.mjs.map → component-raycast-helper-CXN2MHtG.mjs.map} +1 -1
- package/lib/configurator-B8jcqVX9.mjs +2 -0
- package/lib/{configurator-BwxEIDv7.mjs → configurator-BkQ6h239.mjs} +4 -4
- package/lib/{configurator-BwxEIDv7.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-C0Et5SO6.mjs → glb-viewer-D58flqDh.mjs} +6 -6
- package/lib/{glb-viewer-C0Et5SO6.mjs.map → glb-viewer-D58flqDh.mjs.map} +1 -1
- package/lib/glb-viewer-Dg3F2Tz1.mjs +2 -0
- package/lib/{highlight-coordinator-DdQ8yNjO.mjs → highlight-coordinator-CTZ_qcde.mjs} +2 -2
- package/lib/{highlight-coordinator-DdQ8yNjO.mjs.map → highlight-coordinator-CTZ_qcde.mjs.map} +1 -1
- package/lib/{homag-intelligence-DrKayEjK.mjs → homag-intelligence-D7L2SS4z.mjs} +3 -3
- package/lib/{homag-intelligence-DrKayEjK.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-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-D2BulNeN.mjs → main-C2m_IBXL.mjs} +2901 -2907
- package/lib/main-C2m_IBXL.mjs.map +1 -0
- package/lib/{material-viewer-CZQwo8Nc.mjs → material-viewer-BJs0W2Gk.mjs} +6 -6
- package/lib/{material-viewer-CZQwo8Nc.mjs.map → material-viewer-BJs0W2Gk.mjs.map} +1 -1
- package/lib/packages-D6zM0aDK.mjs +4 -0
- package/lib/{planner-OgIPgZ1m.mjs → planner-B9YA9cmz.mjs} +3 -3
- package/lib/{planner-OgIPgZ1m.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 +69 -29
- 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 +69 -29
- package/lib/roomle-sdk.js +7 -7
- package/lib/{roomle-webgpu-renderer-5-aG3CMs.mjs → roomle-webgpu-renderer-NhCn2iM-.mjs} +386 -240
- package/lib/roomle-webgpu-renderer-NhCn2iM-.mjs.map +1 -0
- package/lib/{scene-renderer-DvXjoKHZ.mjs → scene-renderer-DbHi1plp.mjs} +367 -1467
- package/lib/scene-renderer-DbHi1plp.mjs.map +1 -0
- package/lib/{script-loader-CScqyQhc.mjs → script-loader-CXa3RiUa.mjs} +3 -3
- package/lib/{script-loader-CScqyQhc.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-BYi5TI_H.mjs → stats-helper-CPeojJW2.mjs} +3 -3
- package/lib/{stats-helper-BYi5TI_H.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-C4J_TZ0o.mjs → threejs-utils-E4yVZATI.mjs} +4 -4
- package/lib/threejs-utils-E4yVZATI.mjs.map +1 -0
- package/lib/{tools-core-BCkbEbim.mjs → tools-core-GNj0UaiE.mjs} +3 -3
- package/lib/{tools-core-BCkbEbim.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/budgeteer.sw-D3VxiASa.mjs.map +0 -1
- package/lib/configurator-BIyxKNI0.mjs +0 -2
- package/lib/dimensioning-helper-pPTkh8pl.mjs +0 -2
- package/lib/glb-viewer-DfMzLkqg.mjs +0 -2
- package/lib/main-D2BulNeN.mjs.map +0 -1
- package/lib/packages-BtLLQZLz.mjs +0 -4
- package/lib/planner-BF94NrwH.mjs +0 -2
- package/lib/roomle-renderer-DYQvV88j.mjs.map +0 -1
- package/lib/roomle-webgpu-renderer-5-aG3CMs.mjs.map +0 -1
- package/lib/scene-renderer-DvXjoKHZ.mjs.map +0 -1
- package/lib/threejs-utils-C4J_TZ0o.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":"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"}
|
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
|
|
|
@@ -2666,6 +2666,14 @@ export declare interface Element_2 {
|
|
|
2666
2666
|
perspectiveImage: AssetUrl;
|
|
2667
2667
|
}
|
|
2668
2668
|
|
|
2669
|
+
export declare interface ElevationPlan {
|
|
2670
|
+
planSvg: string;
|
|
2671
|
+
}
|
|
2672
|
+
|
|
2673
|
+
export declare interface ElevationPlans {
|
|
2674
|
+
plans: ElevationPlan[];
|
|
2675
|
+
}
|
|
2676
|
+
|
|
2669
2677
|
export declare interface ElevationProfile {
|
|
2670
2678
|
profileContour: ElevationProfilePoint[];
|
|
2671
2679
|
}
|
|
@@ -2679,7 +2687,7 @@ export declare interface ElevationProfilePoint {
|
|
|
2679
2687
|
|
|
2680
2688
|
export declare interface ElevationView {
|
|
2681
2689
|
lineOfSight: KernelVector3f;
|
|
2682
|
-
objects:
|
|
2690
|
+
objects: PlanObject[];
|
|
2683
2691
|
profile: ElevationProfile;
|
|
2684
2692
|
}
|
|
2685
2693
|
|
|
@@ -3332,6 +3340,7 @@ export declare interface FeatureFlags {
|
|
|
3332
3340
|
/* Excluded from this release type: interiorLights */
|
|
3333
3341
|
/* Excluded from this release type: advancedDimensioning */
|
|
3334
3342
|
/* Excluded from this release type: webGpu */
|
|
3343
|
+
/* Excluded from this release type: webGpuConfig */
|
|
3335
3344
|
/* Excluded from this release type: advancedHighlighting */
|
|
3336
3345
|
/* Excluded from this release type: fence */
|
|
3337
3346
|
}
|
|
@@ -6761,7 +6770,7 @@ export declare class PlanViewModel extends ConfiguratorViewModel implements Plan
|
|
|
6761
6770
|
private _handleCeilingPlanElementViewModel;
|
|
6762
6771
|
private _handleNodePlanElementViewModel;
|
|
6763
6772
|
private _getCeilingLightsDistribution;
|
|
6764
|
-
handleInitialCeilingLights(ceilingLightsParameters: GenericGUIParamFolder | undefined
|
|
6773
|
+
handleInitialCeilingLights(ceilingLightsParameters: GenericGUIParamFolder | undefined): void;
|
|
6765
6774
|
handleCeilingLights(): void;
|
|
6766
6775
|
handleLampLight(lamp: StaticPlanObjectViewModel, options: {
|
|
6767
6776
|
targetPos: KernelVector3f;
|
|
@@ -7269,17 +7278,6 @@ export declare class PromiseQueue<T> {
|
|
|
7269
7278
|
get length(): number;
|
|
7270
7279
|
}
|
|
7271
7280
|
|
|
7272
|
-
export declare const QUALITY_LEVELS: {
|
|
7273
|
-
readonly HIGHEST: "highest";
|
|
7274
|
-
readonly HIGH: "high";
|
|
7275
|
-
readonly MEDIUM: "medium";
|
|
7276
|
-
readonly LOW: "low";
|
|
7277
|
-
};
|
|
7278
|
-
|
|
7279
|
-
export declare type QualityLevel = Enumify<typeof QUALITY_LEVELS>;
|
|
7280
|
-
|
|
7281
|
-
export declare type QualityMap = Map<QualityLevel, any>;
|
|
7282
|
-
|
|
7283
7281
|
export declare class RangeArray extends EmsArray<KernelRange> {
|
|
7284
7282
|
}
|
|
7285
7283
|
|
|
@@ -8203,7 +8201,18 @@ export declare class RoomleConfigurator<P extends readonly PluginName[] = readon
|
|
|
8203
8201
|
private _checkInitDone;
|
|
8204
8202
|
private _onInitDone;
|
|
8205
8203
|
constructor(creator: string, activePlugins?: P);
|
|
8206
|
-
|
|
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;
|
|
8207
8216
|
private createCameraForElevationPlan;
|
|
8208
8217
|
exportCanvasScreenshot(quality?: number): Promise<string>;
|
|
8209
8218
|
initSceneManager(sceneManager?: ConfiguratorSceneManager): void;
|
|
@@ -9150,7 +9159,19 @@ export declare class RoomlePlanner<P extends readonly PluginName[] = readonly []
|
|
|
9150
9159
|
*/
|
|
9151
9160
|
createPlanFromObject(id: RapiId, position?: Position3, rotation?: number): Promise<number>;
|
|
9152
9161
|
loadPlanXml(xml: string, options?: InitDataDefinition & GlobalInitDataDefinition): Promise<void>;
|
|
9153
|
-
|
|
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;
|
|
9154
9175
|
loadPlan(id: string, options?: InitDataDefinition & GlobalInitDataDefinition): Promise<RapiPlan | RapiPlanSnapshotGetData>;
|
|
9155
9176
|
/**
|
|
9156
9177
|
* Set general configuration parameter
|
|
@@ -9846,16 +9867,10 @@ export declare abstract class RoomleRenderer<RendererType extends WebGLRenderer
|
|
|
9846
9867
|
switchToConfigurator(): void;
|
|
9847
9868
|
switchToPlanner(_renderMode: PlannerRenderMode): void;
|
|
9848
9869
|
abstract setShadingType(shadingType: SceneShadingType): void;
|
|
9849
|
-
abstract setAutoQuality(autoQuality: boolean): void;
|
|
9850
|
-
abstract setQualityLevel(qualityLevel: QualityLevel): void;
|
|
9851
|
-
abstract getQualityLevel(): QualityLevel;
|
|
9852
|
-
abstract setQualityMap(qualityMap: QualityMap): void;
|
|
9853
|
-
abstract setCustomShadingParameters(customShadingParameters?: CustomShadingParameters, customShadingParametersMoc?: CustomShadingParameters): void;
|
|
9854
9870
|
abstract setCustomOutlineParameters(outlineCustomParameters: OutlineCustomParameters): void;
|
|
9855
9871
|
abstract loadLutImages(luts: LutImageDefinition[]): void;
|
|
9856
9872
|
abstract render(scene: Scene, camera: Camera): void;
|
|
9857
9873
|
abstract showGUI(updateCallback: () => void): void;
|
|
9858
|
-
abstract setOnQualityLevelChangeCallback(callback: (qualityLevel: QualityLevel) => void): void;
|
|
9859
9874
|
abstract clearCache(): void;
|
|
9860
9875
|
abstract highlightObjects(selectedMeshes: Object3D[]): void;
|
|
9861
9876
|
abstract setGroundShadow(enabled: boolean, scene: Scene): void;
|
|
@@ -9930,8 +9945,12 @@ export declare class RoomleWebGPURenderer extends RoomleRenderer<WebGPURenderer>
|
|
|
9930
9945
|
private readonly renderPasses;
|
|
9931
9946
|
private readonly guiParameterGroups;
|
|
9932
9947
|
private lastRenderCamera;
|
|
9948
|
+
private readonly qualityManager;
|
|
9949
|
+
private freezeFrames;
|
|
9950
|
+
private readonly freezeRenderTarget;
|
|
9933
9951
|
private _domHelper;
|
|
9934
9952
|
private _webGpuGroundShadowReflection;
|
|
9953
|
+
private _initData;
|
|
9935
9954
|
constructor(creator: string, renderer: WebGPURenderer, enableSSGI: boolean, outlineColors?: OutlineColors);
|
|
9936
9955
|
private enableRenderPasses;
|
|
9937
9956
|
addGroundShadowLightAndFloor(scene: Scene): Promise<void>;
|
|
@@ -9939,26 +9958,23 @@ export declare class RoomleWebGPURenderer extends RoomleRenderer<WebGPURenderer>
|
|
|
9939
9958
|
clearCache(): void;
|
|
9940
9959
|
disableUiInteractionMode(): void;
|
|
9941
9960
|
enableUiInteractionMode(): void;
|
|
9942
|
-
getQualityLevel(): QualityLevel;
|
|
9943
9961
|
setCameraType(cameraType: Enumify_2<typeof CAMERA_TYPE>): void;
|
|
9944
9962
|
switchToConfigurator(): void;
|
|
9945
9963
|
switchToPlanner(renderMode: PlannerRenderMode): void;
|
|
9946
9964
|
highlightObjects(selectedMeshes: Object3D[]): void;
|
|
9947
9965
|
loadLutImages(_luts: LutImageDefinition[]): void;
|
|
9948
9966
|
render(scene: Scene, camera: Camera): void;
|
|
9967
|
+
private renderToFreezeTarget;
|
|
9949
9968
|
private updateCameraProjectionMatrix;
|
|
9950
9969
|
private assembleRenderPasses;
|
|
9951
|
-
setAutoQuality(_autoQuality: boolean): void;
|
|
9952
|
-
setCustomShadingParameters(_customShadingParameters: CustomShadingParameters | undefined, _customShadingParametersMoc: CustomShadingParameters | undefined): void;
|
|
9953
9970
|
setCustomOutlineParameters(customOutlineParameters: OutlineCustomParameters): void;
|
|
9954
9971
|
setGroundShadow(enabled: boolean, _scene: Scene): void;
|
|
9955
|
-
setOnQualityLevelChangeCallback(_callback: (qualityLevel: QualityLevel) => void): void;
|
|
9956
9972
|
private enableOutline;
|
|
9957
9973
|
private getOutlinePassOrUndefined;
|
|
9958
9974
|
private enableSsgiPass;
|
|
9959
9975
|
private enableTraaPass;
|
|
9960
|
-
|
|
9961
|
-
|
|
9976
|
+
private applyQualityParameters;
|
|
9977
|
+
private getSsgiPassOrUndefined;
|
|
9962
9978
|
setShadingType(shadingType: SceneShadingType): void;
|
|
9963
9979
|
showGUI(updateCallback: () => void): void;
|
|
9964
9980
|
private addDebugGUI;
|
|
@@ -10985,6 +11001,30 @@ export declare interface WallSide {
|
|
|
10985
11001
|
value: Enumify_3<typeof WALL_SIDES>;
|
|
10986
11002
|
}
|
|
10987
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
|
+
|
|
10988
11028
|
export declare class ZoomChangeEvent {
|
|
10989
11029
|
minZoom: boolean;
|
|
10990
11030
|
maxZoom: boolean;
|
package/lib/roomle-headless.js
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { i as e, t } from "./kernel-C7YDLxq8.mjs";
|
|
2
|
-
import { _t as n, mt as r } from "./threejs-utils-
|
|
2
|
+
import { _t as n, mt as r } from "./threejs-utils-E4yVZATI.mjs";
|
|
3
3
|
import { xi as i } from "./three.core-tV_4n8Wg.mjs";
|
|
4
|
-
import { A as a, B as o, F as s, G as c, H as l, I as u, J as d, K as f, M as p, N as m, P as h, S as g, U as _, W as v, a as y, b, c as x, ct as S, dt as C, i as w, it as T, k as E, l as D, n as O, nt as k, ot as A, pt as j, rt as M, s as N, st as P, ut as ee, v as F, x as I, y as L } from "./main-
|
|
5
|
-
import { n as R } from "./script-loader-
|
|
6
|
-
import { t as z } from "./configurator-
|
|
7
|
-
import { t as B } from "./planner-
|
|
8
|
-
import { n as V, t as H } from "./glb-viewer-
|
|
9
|
-
import { t as U } from "./api-
|
|
10
|
-
import "./packages-
|
|
11
|
-
import "./roomle-headless-setup-
|
|
4
|
+
import { A as a, B as o, F as s, G as c, H as l, I as u, J as d, K as f, M as p, N as m, P as h, S as g, U as _, W as v, a as y, b, c as x, ct as S, dt as C, i as w, it as T, k as E, l as D, n as O, nt as k, ot as A, pt as j, rt as M, s as N, st as P, ut as ee, v as F, x as I, y as L } from "./main-C2m_IBXL.mjs";
|
|
5
|
+
import { n as R } from "./script-loader-CXa3RiUa.mjs";
|
|
6
|
+
import { t as z } from "./configurator-BkQ6h239.mjs";
|
|
7
|
+
import { t as B } from "./planner-B9YA9cmz.mjs";
|
|
8
|
+
import { n as V, t as H } from "./glb-viewer-D58flqDh.mjs";
|
|
9
|
+
import { t as U } from "./api-BlFJIGaV.mjs";
|
|
10
|
+
import "./packages-D6zM0aDK.mjs";
|
|
11
|
+
import "./roomle-headless-setup-Cc8EAnVe.mjs";
|
|
12
12
|
import { createRequire as W } from "module";
|
|
13
13
|
//#region packages/headless-core/src/headless-script-loader.ts
|
|
14
14
|
var G = W(import.meta.url), K = {}, q = [
|
|
@@ -1,8 +1,26 @@
|
|
|
1
1
|
import { f as e } from "./three.core-tV_4n8Wg.mjs";
|
|
2
|
-
//#region packages/common-core/src/
|
|
3
|
-
var t =
|
|
2
|
+
//#region packages/common-core/src/utils/fps-counter.ts
|
|
3
|
+
var t = 10, n = 20, r = class {
|
|
4
|
+
constructor() {
|
|
5
|
+
this._index = 0, this._prevTime = 0, this._frames = 0, this._fps = -1, this._fpsList = Array(t).fill(0), this._prevTime = (performance || Date).now(), this.reset();
|
|
6
|
+
}
|
|
7
|
+
update() {
|
|
8
|
+
this._frames++;
|
|
9
|
+
let e = (performance || Date).now();
|
|
10
|
+
e >= this._prevTime + n && (this._fpsList[this._index % t] = this._frames * 1e3 / (e - this._prevTime), this._index >= t && (this._fps = this._fpsList.reduce((e, t) => e + t) / this._fpsList.length), this._prevTime = e, this._frames = 0, this._index++);
|
|
11
|
+
}
|
|
12
|
+
start() {
|
|
13
|
+
this._prevTime = (performance || Date).now(), this._frames = 0;
|
|
14
|
+
}
|
|
15
|
+
reset() {
|
|
16
|
+
this._fps = -1, this._fpsList = Array(t).fill(0), this._index = 0;
|
|
17
|
+
}
|
|
18
|
+
getFps() {
|
|
19
|
+
return this._fps;
|
|
20
|
+
}
|
|
21
|
+
}, i = /* @__PURE__ */ function(e) {
|
|
4
22
|
return e[e.Mode3D = 0] = "Mode3D", e[e.Mode2D = 1] = "Mode2D", e;
|
|
5
|
-
}({}),
|
|
23
|
+
}({}), a = class {
|
|
6
24
|
constructor(t, n) {
|
|
7
25
|
this.isConfiguratorMode = !0, this.isCameraMoving = !1, this.shadowNeedsUpdate = !1, this.boundingBox = new e(), this.boundingBoxNeedsUpdate = !1, this._creator_ = t, this.renderer = n;
|
|
8
26
|
}
|
|
@@ -44,6 +62,6 @@ var t = /* @__PURE__ */ function(e) {
|
|
|
44
62
|
}
|
|
45
63
|
};
|
|
46
64
|
//#endregion
|
|
47
|
-
export { n, t };
|
|
65
|
+
export { a as n, r, i as t };
|
|
48
66
|
|
|
49
|
-
//# sourceMappingURL=roomle-renderer-
|
|
67
|
+
//# sourceMappingURL=roomle-renderer-BD3ZmpLS.mjs.map
|