@roomle/web-sdk 3.10.0-alpha.1 → 3.10.0-alpha.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/lib/{BufferGeometry-Dxcf7n9V.mjs → BufferGeometry-Dj5loCTL.mjs} +2 -2
  2. package/lib/{BufferGeometry-Dxcf7n9V.mjs.map → BufferGeometry-Dj5loCTL.mjs.map} +1 -1
  3. package/lib/ConfiguratorKernel.wasm +0 -0
  4. package/lib/{GLTFExporter-kpv1e-Ks.mjs → GLTFExporter-CquK-kkI.mjs} +1 -1
  5. package/lib/{GLTFExporter-kpv1e-Ks.mjs.map → GLTFExporter-CquK-kkI.mjs.map} +1 -1
  6. package/lib/{GaussianBlurNode-CMVlBe39.mjs → GaussianBlurNode-CDYPio-x.mjs} +3 -3
  7. package/lib/{GaussianBlurNode-CMVlBe39.mjs.map → GaussianBlurNode-CDYPio-x.mjs.map} +1 -1
  8. package/lib/{Object3D-BZaiqQIE.mjs → Object3D-YXSPdGeJ.mjs} +1 -1
  9. package/lib/{Object3D-BZaiqQIE.mjs.map → Object3D-YXSPdGeJ.mjs.map} +1 -1
  10. package/lib/{PointLightHelper-fzRB58rC.mjs → PointLightHelper-g98giMRd.mjs} +4 -4
  11. package/lib/{PointLightHelper-fzRB58rC.mjs.map → PointLightHelper-g98giMRd.mjs.map} +1 -1
  12. package/lib/RoomleCore.wasm +0 -0
  13. package/lib/RoomleToolsCore.wasm +0 -0
  14. package/lib/{SpotLightHelper-D5UFwRPb.mjs → SpotLightHelper-xR8lCZau.mjs} +3 -3
  15. package/lib/{SpotLightHelper-D5UFwRPb.mjs.map → SpotLightHelper-xR8lCZau.mjs.map} +1 -1
  16. package/lib/{USDZExporter-Y0SSGr5_.mjs → USDZExporter-BMqBymZI.mjs} +2 -2
  17. package/lib/{USDZExporter-Y0SSGr5_.mjs.map → USDZExporter-BMqBymZI.mjs.map} +1 -1
  18. package/lib/{Vector4-BfZH1ecw.mjs → Vector4-CqzXUndP.mjs} +2 -2
  19. package/lib/{Vector4-BfZH1ecw.mjs.map → Vector4-CqzXUndP.mjs.map} +1 -1
  20. package/lib/{api-DVBX8_mw.mjs → api-BlFJIGaV.mjs} +2 -2
  21. package/lib/{api-DVBX8_mw.mjs.map → api-BlFJIGaV.mjs.map} +1 -1
  22. package/lib/{asset-loader.worker-C911tbNL.mjs → asset-loader.worker-CHyN7JB1.mjs} +1 -1
  23. package/lib/asset-loader.worker-CHyN7JB1.mjs.map +1 -0
  24. package/lib/{banana-for-scale-B_LIHI9q.mjs → banana-for-scale-Cs2s9dNp.mjs} +3 -3
  25. package/lib/{banana-for-scale-B_LIHI9q.mjs.map → banana-for-scale-Cs2s9dNp.mjs.map} +1 -1
  26. package/lib/{budgeteer.sw-D3VxiASa.mjs → budgeteer.sw-BCLEIWCW.mjs} +1 -1
  27. package/lib/budgeteer.sw-BCLEIWCW.mjs.map +1 -0
  28. package/lib/{common-utils-B9PC_rvS.mjs → common-utils-DMk5jc_R.mjs} +1 -1
  29. package/lib/{common-utils-B9PC_rvS.mjs.map → common-utils-DMk5jc_R.mjs.map} +1 -1
  30. package/lib/{component-dimensioning-DC1Lxdp-.mjs → component-dimensioning-DcmDM6gV.mjs} +6 -6
  31. package/lib/{component-dimensioning-DC1Lxdp-.mjs.map → component-dimensioning-DcmDM6gV.mjs.map} +1 -1
  32. package/lib/{component-raycast-helper-Wpay-VAg.mjs → component-raycast-helper-CXN2MHtG.mjs} +4 -4
  33. package/lib/{component-raycast-helper-Wpay-VAg.mjs.map → component-raycast-helper-CXN2MHtG.mjs.map} +1 -1
  34. package/lib/configurator-B8jcqVX9.mjs +2 -0
  35. package/lib/{configurator-DU1NHt_a.mjs → configurator-BkQ6h239.mjs} +4 -4
  36. package/lib/{configurator-DU1NHt_a.mjs.map → configurator-BkQ6h239.mjs.map} +1 -1
  37. package/lib/{continuous-drawing-helper-D25YPUle.mjs → continuous-drawing-helper-BlGATN0C.mjs} +2 -2
  38. package/lib/{continuous-drawing-helper-D25YPUle.mjs.map → continuous-drawing-helper-BlGATN0C.mjs.map} +1 -1
  39. package/lib/{dat.gui.module-CZ-DIWHM.mjs → dat.gui.module-BLjoST8r.mjs} +1 -1
  40. package/lib/{dat.gui.module-CZ-DIWHM.mjs.map → dat.gui.module-BLjoST8r.mjs.map} +1 -1
  41. package/lib/{decorate-C9r0zXzz.mjs → decorate-CTUwswpM.mjs} +1 -1
  42. package/lib/{decorate-C9r0zXzz.mjs.map → decorate-CTUwswpM.mjs.map} +1 -1
  43. package/lib/dimensioning-helper-BwBj5QDM.mjs +2 -0
  44. package/lib/{dimensioning-helper-d6JA4UMr.mjs → dimensioning-helper-DMop5qcu.mjs} +4 -4
  45. package/lib/{dimensioning-helper-d6JA4UMr.mjs.map → dimensioning-helper-DMop5qcu.mjs.map} +1 -1
  46. package/lib/dist-DGov-RNo.mjs +438 -0
  47. package/lib/dist-DGov-RNo.mjs.map +1 -0
  48. package/lib/{fflate.module-CBz7CLOg.mjs → fflate.module-n0Jozp8Z.mjs} +1 -1
  49. package/lib/{fflate.module-CBz7CLOg.mjs.map → fflate.module-n0Jozp8Z.mjs.map} +1 -1
  50. package/lib/{glb-viewer-BPfa4Fz5.mjs → glb-viewer-D58flqDh.mjs} +6 -6
  51. package/lib/{glb-viewer-BPfa4Fz5.mjs.map → glb-viewer-D58flqDh.mjs.map} +1 -1
  52. package/lib/glb-viewer-Dg3F2Tz1.mjs +2 -0
  53. package/lib/{highlight-coordinator-BcJdy2_o.mjs → highlight-coordinator-CTZ_qcde.mjs} +2 -2
  54. package/lib/{highlight-coordinator-BcJdy2_o.mjs.map → highlight-coordinator-CTZ_qcde.mjs.map} +1 -1
  55. package/lib/{homag-intelligence-D8Lm2GMZ.mjs → homag-intelligence-D7L2SS4z.mjs} +3 -3
  56. package/lib/{homag-intelligence-D8Lm2GMZ.mjs.map → homag-intelligence-D7L2SS4z.mjs.map} +1 -1
  57. package/lib/{imos-ix-poc-export-helper-DU0ag-Lw.mjs → imos-ix-poc-export-helper-D2KaQu_v.mjs} +3 -3
  58. package/lib/{imos-ix-poc-export-helper-DU0ag-Lw.mjs.map → imos-ix-poc-export-helper-D2KaQu_v.mjs.map} +1 -1
  59. package/lib/kernel-C7YDLxq8.mjs.map +1 -1
  60. package/lib/{kernel-utils-Cj5B4fDD.mjs → kernel-utils-042AuCQh.mjs} +1 -1
  61. package/lib/{kernel-utils-Cj5B4fDD.mjs.map → kernel-utils-042AuCQh.mjs.map} +1 -1
  62. package/lib/{layer-C_JtkhdO.mjs → layer-CFAr2mK_.mjs} +1 -1
  63. package/lib/{layer-C_JtkhdO.mjs.map → layer-CFAr2mK_.mjs.map} +1 -1
  64. package/lib/{main-DXPoPkIG.mjs → main-C2m_IBXL.mjs} +3852 -3643
  65. package/lib/main-C2m_IBXL.mjs.map +1 -0
  66. package/lib/{material-viewer-CNTiw7G9.mjs → material-viewer-BJs0W2Gk.mjs} +10 -10
  67. package/lib/material-viewer-BJs0W2Gk.mjs.map +1 -0
  68. package/lib/packages-D6zM0aDK.mjs +4 -0
  69. package/lib/{planner-CWQ8F70q.mjs → planner-B9YA9cmz.mjs} +3 -3
  70. package/lib/{planner-CWQ8F70q.mjs.map → planner-B9YA9cmz.mjs.map} +1 -1
  71. package/lib/planner-DJnqYqvP.mjs +2 -0
  72. package/lib/{plugin-system-DlME_5b_.mjs → plugin-system-DRpL0Rer.mjs} +3 -3
  73. package/lib/{plugin-system-DlME_5b_.mjs.map → plugin-system-DRpL0Rer.mjs.map} +1 -1
  74. package/lib/{roomle-headless-setup-CMK-quZI.mjs → roomle-headless-setup-Cc8EAnVe.mjs} +1 -1
  75. package/lib/{roomle-headless-setup-CMK-quZI.mjs.map → roomle-headless-setup-Cc8EAnVe.mjs.map} +1 -1
  76. package/lib/roomle-headless.d.ts +81 -32
  77. package/lib/roomle-headless.js +9 -9
  78. package/lib/{roomle-renderer-DYQvV88j.mjs → roomle-renderer-BD3ZmpLS.mjs} +23 -5
  79. package/lib/roomle-renderer-BD3ZmpLS.mjs.map +1 -0
  80. package/lib/roomle-sdk.d.ts +81 -32
  81. package/lib/roomle-sdk.js +7 -7
  82. package/lib/{roomle-webgpu-renderer-CmqMWt2K.mjs → roomle-webgpu-renderer-NhCn2iM-.mjs} +386 -240
  83. package/lib/roomle-webgpu-renderer-NhCn2iM-.mjs.map +1 -0
  84. package/lib/{scene-renderer-6t0p4vb4.mjs → scene-renderer-DbHi1plp.mjs} +367 -1467
  85. package/lib/scene-renderer-DbHi1plp.mjs.map +1 -0
  86. package/lib/{script-loader-DovMlDVR.mjs → script-loader-CXa3RiUa.mjs} +3 -3
  87. package/lib/{script-loader-DovMlDVR.mjs.map → script-loader-CXa3RiUa.mjs.map} +1 -1
  88. package/lib/shading-settings-BWeccIZv.mjs +1108 -0
  89. package/lib/shading-settings-BWeccIZv.mjs.map +1 -0
  90. package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/package.json +1 -1
  91. package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/wasm_modern/ConfiguratorKernel.wasm +0 -0
  92. package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/wasm_modern/RoomleCore.wasm +0 -0
  93. package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/wasm_modern/RoomleToolsCore.wasm +0 -0
  94. package/lib/{stats-helper-B9MDLRpR.mjs → stats-helper-CPeojJW2.mjs} +3 -3
  95. package/lib/{stats-helper-B9MDLRpR.mjs.map → stats-helper-CPeojJW2.mjs.map} +1 -1
  96. package/lib/{three.tsl-S0OKwamA.mjs → three.tsl-Bb8l7rD7.mjs} +1 -1
  97. package/lib/{three.tsl-CAEdYyg3.mjs → three.tsl-Caqi2VRr.mjs} +2 -2
  98. package/lib/{three.tsl-CAEdYyg3.mjs.map → three.tsl-Caqi2VRr.mjs.map} +1 -1
  99. package/lib/{three.webgpu-CkP2nkXM.mjs → three.webgpu-CT4fuV2X.mjs} +1 -1
  100. package/lib/{three.webgpu-CkP2nkXM.mjs.map → three.webgpu-CT4fuV2X.mjs.map} +1 -1
  101. package/lib/{three.webgpu-qrxDA_v0.mjs → three.webgpu-CxNhl3k-.mjs} +1 -1
  102. package/lib/{threejs-utils-ZKvz9Qno.mjs → threejs-utils-E4yVZATI.mjs} +17 -17
  103. package/lib/threejs-utils-E4yVZATI.mjs.map +1 -0
  104. package/lib/{tools-core-Ks33p1cu.mjs → tools-core-GNj0UaiE.mjs} +3 -3
  105. package/lib/{tools-core-Ks33p1cu.mjs.map → tools-core-GNj0UaiE.mjs.map} +1 -1
  106. package/lib/workers-Dc-RTL8D.mjs +6 -0
  107. package/lib/{workers-HXGCmmZS.mjs.map → workers-Dc-RTL8D.mjs.map} +1 -1
  108. package/package.json +1 -1
  109. package/lib/asset-loader.worker-C911tbNL.mjs.map +0 -1
  110. package/lib/budgeteer.sw-D3VxiASa.mjs.map +0 -1
  111. package/lib/configurator-BRZ1-AQZ.mjs +0 -2
  112. package/lib/dimensioning-helper-pPTkh8pl.mjs +0 -2
  113. package/lib/glb-viewer-Bllsu2_m.mjs +0 -2
  114. package/lib/main-DXPoPkIG.mjs.map +0 -1
  115. package/lib/material-viewer-CNTiw7G9.mjs.map +0 -1
  116. package/lib/packages-D61uTgIK.mjs +0 -4
  117. package/lib/planner-BO7I35KU.mjs +0 -2
  118. package/lib/roomle-renderer-DYQvV88j.mjs.map +0 -1
  119. package/lib/roomle-webgpu-renderer-CmqMWt2K.mjs.map +0 -1
  120. package/lib/scene-renderer-6t0p4vb4.mjs.map +0 -1
  121. package/lib/threejs-utils-ZKvz9Qno.mjs.map +0 -1
  122. package/lib/workers-HXGCmmZS.mjs +0 -6
@@ -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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"}
@@ -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: boolean | undefined, maxQualityLevel: QualityLevel);
645
+ constructor(debug?: boolean);
646
646
  recalculatePower(amountOfLights: number): void;
647
- update(qualityLevel: QualityLevel): void;
647
+ update(): void;
648
648
  addDebugUI(ceilingLightsParameters: GenericGUIParamFolder): void;
649
649
  }
650
650
 
@@ -1604,6 +1604,7 @@ export declare class ConfiguratorSceneManager extends SceneManager implements Co
1604
1604
  private _sceneEventHandler;
1605
1605
  private _isComponentDimensionsVisible;
1606
1606
  private _dimensionUpdateDebounced;
1607
+ private _sceneSetupReady;
1607
1608
  constructor(creator: string, offset: CanvasOffset, mode: Enumify_2<typeof CAMERA_TYPE>);
1608
1609
  /**
1609
1610
  * Single point for deciding whether to push HTML label positions to the UI.
@@ -2582,6 +2583,8 @@ export declare class DraggableNode extends Object3D {
2582
2583
  getSize(): Vector3;
2583
2584
  hoverOn(): void;
2584
2585
  hoverOff(): void;
2586
+ setSphereColor(color: number): void;
2587
+ setInnerRingColor(color: number): void;
2585
2588
  select(color: number): void;
2586
2589
  deselect(color: number): void;
2587
2590
  }
@@ -2663,6 +2666,14 @@ export declare interface Element_2 {
2663
2666
  perspectiveImage: AssetUrl;
2664
2667
  }
2665
2668
 
2669
+ export declare interface ElevationPlan {
2670
+ planSvg: string;
2671
+ }
2672
+
2673
+ export declare interface ElevationPlans {
2674
+ plans: ElevationPlan[];
2675
+ }
2676
+
2666
2677
  export declare interface ElevationProfile {
2667
2678
  profileContour: ElevationProfilePoint[];
2668
2679
  }
@@ -2676,7 +2687,7 @@ export declare interface ElevationProfilePoint {
2676
2687
 
2677
2688
  export declare interface ElevationView {
2678
2689
  lineOfSight: KernelVector3f;
2679
- objects: KernelPlanObject[];
2690
+ objects: PlanObject[];
2680
2691
  profile: ElevationProfile;
2681
2692
  }
2682
2693
 
@@ -3329,6 +3340,7 @@ export declare interface FeatureFlags {
3329
3340
  /* Excluded from this release type: interiorLights */
3330
3341
  /* Excluded from this release type: advancedDimensioning */
3331
3342
  /* Excluded from this release type: webGpu */
3343
+ /* Excluded from this release type: webGpuConfig */
3332
3344
  /* Excluded from this release type: advancedHighlighting */
3333
3345
  /* Excluded from this release type: fence */
3334
3346
  }
@@ -4797,7 +4809,7 @@ export declare interface KernelParameter {
4797
4809
  viewType: KernelViewType;
4798
4810
  source: 'external' | 'internal';
4799
4811
  level?: number;
4800
- objectIds: number[];
4812
+ objectIds?: number[];
4801
4813
  }
4802
4814
 
4803
4815
  export declare interface KernelParameterGroup {
@@ -5441,19 +5453,23 @@ export declare interface NodeDimensionTransferable {
5441
5453
  }
5442
5454
 
5443
5455
  export declare class NodePlanElementViewModel extends PlanElementViewModel {
5444
- private _nodeUiMesh;
5456
+ protected _nodeUiMesh: DraggableNode;
5457
+ protected _defaultRingColor: number;
5445
5458
  constructor(planObject: PlanObject);
5446
5459
  update(): void;
5447
5460
  setTopView(enabled: boolean): void;
5448
5461
  getSize(): Vector3;
5449
5462
  show(): void;
5450
5463
  hide(): void;
5464
+ protected getSelectionRingColor(): number;
5451
5465
  select(): void;
5452
5466
  deselect(): void;
5453
5467
  hoverOn(): void;
5454
5468
  hoverOff(): void;
5455
5469
  protected _generateBoundingBox(): RoomleEventedMesh;
5456
5470
  setZoom(zoom: number): void;
5471
+ setFillColor(color: number): void;
5472
+ setDefaultRingColor(color: number): void;
5457
5473
  }
5458
5474
 
5459
5475
  export declare interface NodePlanObject extends PlanObject {
@@ -6482,6 +6498,8 @@ export declare class PlannerSceneManager extends ConfiguratorSceneManager implem
6482
6498
  private _hideAllNodeIfThereAreNoSelections;
6483
6499
  protected _onCameraMove(): boolean;
6484
6500
  private _showWallNodes;
6501
+ private _applyFenceNodeStyle;
6502
+ private _shouldKeepFenceNodesVisible;
6485
6503
  private _updateNodeSize;
6486
6504
  private _sendPlanObjectPositions;
6487
6505
  private _sendMultiSelectionPosition;
@@ -6752,7 +6770,7 @@ export declare class PlanViewModel extends ConfiguratorViewModel implements Plan
6752
6770
  private _handleCeilingPlanElementViewModel;
6753
6771
  private _handleNodePlanElementViewModel;
6754
6772
  private _getCeilingLightsDistribution;
6755
- handleInitialCeilingLights(ceilingLightsParameters: GenericGUIParamFolder | undefined, qualityLevel: QualityLevel): void;
6773
+ handleInitialCeilingLights(ceilingLightsParameters: GenericGUIParamFolder | undefined): void;
6756
6774
  handleCeilingLights(): void;
6757
6775
  handleLampLight(lamp: StaticPlanObjectViewModel, options: {
6758
6776
  targetPos: KernelVector3f;
@@ -7260,17 +7278,6 @@ export declare class PromiseQueue<T> {
7260
7278
  get length(): number;
7261
7279
  }
7262
7280
 
7263
- export declare const QUALITY_LEVELS: {
7264
- readonly HIGHEST: "highest";
7265
- readonly HIGH: "high";
7266
- readonly MEDIUM: "medium";
7267
- readonly LOW: "low";
7268
- };
7269
-
7270
- export declare type QualityLevel = Enumify<typeof QUALITY_LEVELS>;
7271
-
7272
- export declare type QualityMap = Map<QualityLevel, any>;
7273
-
7274
7281
  export declare class RangeArray extends EmsArray<KernelRange> {
7275
7282
  }
7276
7283
 
@@ -8194,7 +8201,18 @@ export declare class RoomleConfigurator<P extends readonly PluginName[] = readon
8194
8201
  private _checkInitDone;
8195
8202
  private _onInitDone;
8196
8203
  constructor(creator: string, activePlugins?: P);
8197
- create2DElevationPlan(): Promise<void>;
8204
+ /**
8205
+ * Creates a 2D elevation plan of the current configuration, returned as raw
8206
+ * SVG markup (wireframe rendering with measurements).
8207
+ *
8208
+ * @returns the elevation plans, containing one plan with its SVG markup
8209
+ */
8210
+ create2DElevationPlan(): ElevationPlans;
8211
+ /**
8212
+ * Creates the 2D elevation plan of the current configuration (see
8213
+ * {@link create2DElevationPlan}) and downloads it as an SVG file.
8214
+ */
8215
+ download2DElevationPlan(): void;
8198
8216
  private createCameraForElevationPlan;
8199
8217
  exportCanvasScreenshot(quality?: number): Promise<string>;
8200
8218
  initSceneManager(sceneManager?: ConfiguratorSceneManager): void;
@@ -9141,7 +9159,19 @@ export declare class RoomlePlanner<P extends readonly PluginName[] = readonly []
9141
9159
  */
9142
9160
  createPlanFromObject(id: RapiId, position?: Position3, rotation?: number): Promise<number>;
9143
9161
  loadPlanXml(xml: string, options?: InitDataDefinition & GlobalInitDataDefinition): Promise<void>;
9144
- create2DElevationPlan(): Promise<void>;
9162
+ /**
9163
+ * Creates 2D elevation plans of the current plan, one per elevation view.
9164
+ * Each plan is returned as raw SVG markup (wireframe rendering with
9165
+ * dimensionings).
9166
+ *
9167
+ * @returns the elevation plans, each containing its SVG markup
9168
+ */
9169
+ create2DElevationPlan(): ElevationPlans;
9170
+ /**
9171
+ * Creates the 2D elevation plans of the current plan (see
9172
+ * {@link create2DElevationPlan}) and downloads each plan as an SVG file.
9173
+ */
9174
+ download2DElevationPlan(): void;
9145
9175
  loadPlan(id: string, options?: InitDataDefinition & GlobalInitDataDefinition): Promise<RapiPlan | RapiPlanSnapshotGetData>;
9146
9176
  /**
9147
9177
  * Set general configuration parameter
@@ -9837,16 +9867,10 @@ export declare abstract class RoomleRenderer<RendererType extends WebGLRenderer
9837
9867
  switchToConfigurator(): void;
9838
9868
  switchToPlanner(_renderMode: PlannerRenderMode): void;
9839
9869
  abstract setShadingType(shadingType: SceneShadingType): void;
9840
- abstract setAutoQuality(autoQuality: boolean): void;
9841
- abstract setQualityLevel(qualityLevel: QualityLevel): void;
9842
- abstract getQualityLevel(): QualityLevel;
9843
- abstract setQualityMap(qualityMap: QualityMap): void;
9844
- abstract setCustomShadingParameters(customShadingParameters?: CustomShadingParameters, customShadingParametersMoc?: CustomShadingParameters): void;
9845
9870
  abstract setCustomOutlineParameters(outlineCustomParameters: OutlineCustomParameters): void;
9846
9871
  abstract loadLutImages(luts: LutImageDefinition[]): void;
9847
9872
  abstract render(scene: Scene, camera: Camera): void;
9848
9873
  abstract showGUI(updateCallback: () => void): void;
9849
- abstract setOnQualityLevelChangeCallback(callback: (qualityLevel: QualityLevel) => void): void;
9850
9874
  abstract clearCache(): void;
9851
9875
  abstract highlightObjects(selectedMeshes: Object3D[]): void;
9852
9876
  abstract setGroundShadow(enabled: boolean, scene: Scene): void;
@@ -9921,8 +9945,12 @@ export declare class RoomleWebGPURenderer extends RoomleRenderer<WebGPURenderer>
9921
9945
  private readonly renderPasses;
9922
9946
  private readonly guiParameterGroups;
9923
9947
  private lastRenderCamera;
9948
+ private readonly qualityManager;
9949
+ private freezeFrames;
9950
+ private readonly freezeRenderTarget;
9924
9951
  private _domHelper;
9925
9952
  private _webGpuGroundShadowReflection;
9953
+ private _initData;
9926
9954
  constructor(creator: string, renderer: WebGPURenderer, enableSSGI: boolean, outlineColors?: OutlineColors);
9927
9955
  private enableRenderPasses;
9928
9956
  addGroundShadowLightAndFloor(scene: Scene): Promise<void>;
@@ -9930,26 +9958,23 @@ export declare class RoomleWebGPURenderer extends RoomleRenderer<WebGPURenderer>
9930
9958
  clearCache(): void;
9931
9959
  disableUiInteractionMode(): void;
9932
9960
  enableUiInteractionMode(): void;
9933
- getQualityLevel(): QualityLevel;
9934
9961
  setCameraType(cameraType: Enumify_2<typeof CAMERA_TYPE>): void;
9935
9962
  switchToConfigurator(): void;
9936
9963
  switchToPlanner(renderMode: PlannerRenderMode): void;
9937
9964
  highlightObjects(selectedMeshes: Object3D[]): void;
9938
9965
  loadLutImages(_luts: LutImageDefinition[]): void;
9939
9966
  render(scene: Scene, camera: Camera): void;
9967
+ private renderToFreezeTarget;
9940
9968
  private updateCameraProjectionMatrix;
9941
9969
  private assembleRenderPasses;
9942
- setAutoQuality(_autoQuality: boolean): void;
9943
- setCustomShadingParameters(_customShadingParameters: CustomShadingParameters | undefined, _customShadingParametersMoc: CustomShadingParameters | undefined): void;
9944
9970
  setCustomOutlineParameters(customOutlineParameters: OutlineCustomParameters): void;
9945
9971
  setGroundShadow(enabled: boolean, _scene: Scene): void;
9946
- setOnQualityLevelChangeCallback(_callback: (qualityLevel: QualityLevel) => void): void;
9947
9972
  private enableOutline;
9948
9973
  private getOutlinePassOrUndefined;
9949
9974
  private enableSsgiPass;
9950
9975
  private enableTraaPass;
9951
- setQualityLevel(_qualityLevel: QualityLevel): void;
9952
- setQualityMap(_qualityMap: QualityMap): void;
9976
+ private applyQualityParameters;
9977
+ private getSsgiPassOrUndefined;
9953
9978
  setShadingType(shadingType: SceneShadingType): void;
9954
9979
  showGUI(updateCallback: () => void): void;
9955
9980
  private addDebugGUI;
@@ -10925,7 +10950,7 @@ export declare class WallPlanElementViewModel extends PlanElementViewModel {
10925
10950
  constructor(planObject: PlanObject);
10926
10951
  get isSelected(): boolean;
10927
10952
  private _checkHasAttachedAttic;
10928
- getWallDimension(zoomFactor: number, clientWidth: number, clientHeight: number): WallDimension;
10953
+ getWallDimension(zoomFactor: number, clientWidth: number, clientHeight: number, preferredSideOverride?: LeftOrRightWallSide): WallDimension;
10929
10954
  private calculateNormalVector;
10930
10955
  private calculateShiftingFactor;
10931
10956
  private calculateAtticInfo;
@@ -10976,6 +11001,30 @@ export declare interface WallSide {
10976
11001
  value: Enumify_3<typeof WALL_SIDES>;
10977
11002
  }
10978
11003
 
11004
+ export declare interface WebGpuConfig {
11005
+ /**
11006
+ * @description If true, the initial webgpu quality level is autodetected based on
11007
+ * a benchmark of the graphics hardware. If false, the default quality level is used.
11008
+ * @default true
11009
+ */
11010
+ autoDetectQualityLevel?: boolean;
11011
+ /**
11012
+ * @description This can be used to configure the lower bound of webgpu auto quality
11013
+ * meaning the fps bound which, when hit, will set the quality setting lower
11014
+ * To disable: set to 0
11015
+ * @default 24
11016
+ */
11017
+ autoQualityMinFps?: number;
11018
+ /**
11019
+ * @description This can be used to configure the upper bound of webgpu auto quality
11020
+ * meaning the fps bound which, when hit, will set the quality setting higher
11021
+ * This should be sufficiently larger than the minFps to not cause the quality to go up and down all the time
11022
+ * To disable: set to something very high
11023
+ * @default 59
11024
+ */
11025
+ autoQualityMaxFps?: number;
11026
+ }
11027
+
10979
11028
  export declare class ZoomChangeEvent {
10980
11029
  minZoom: boolean;
10981
11030
  maxZoom: boolean;