@roomle/web-sdk 3.10.0-alpha.2 → 3.10.0-alpha.4

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-BXU3pZnX.mjs → api-ckpzIPty.mjs} +2 -2
  21. package/lib/{api-BXU3pZnX.mjs.map → api-ckpzIPty.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-5iIw1f_3.mjs → component-dimensioning-DcmDM6gV.mjs} +6 -6
  31. package/lib/{component-dimensioning-5iIw1f_3.mjs.map → component-dimensioning-DcmDM6gV.mjs.map} +1 -1
  32. package/lib/{component-raycast-helper-O27_buEg.mjs → component-raycast-helper-CXN2MHtG.mjs} +4 -4
  33. package/lib/{component-raycast-helper-O27_buEg.mjs.map → component-raycast-helper-CXN2MHtG.mjs.map} +1 -1
  34. package/lib/{configurator-BwxEIDv7.mjs → configurator-D6lTTIlU.mjs} +4 -4
  35. package/lib/{configurator-BwxEIDv7.mjs.map → configurator-D6lTTIlU.mjs.map} +1 -1
  36. package/lib/configurator-DZotRC5_.mjs +2 -0
  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-C0Et5SO6.mjs → glb-viewer-CuRDCxVq.mjs} +6 -6
  51. package/lib/{glb-viewer-C0Et5SO6.mjs.map → glb-viewer-CuRDCxVq.mjs.map} +1 -1
  52. package/lib/glb-viewer-DKWeC8wq.mjs +2 -0
  53. package/lib/{highlight-coordinator-DdQ8yNjO.mjs → highlight-coordinator-CTZ_qcde.mjs} +2 -2
  54. package/lib/{highlight-coordinator-DdQ8yNjO.mjs.map → highlight-coordinator-CTZ_qcde.mjs.map} +1 -1
  55. package/lib/{homag-intelligence-DrKayEjK.mjs → homag-intelligence-CIBPifJk.mjs} +3 -3
  56. package/lib/{homag-intelligence-DrKayEjK.mjs.map → homag-intelligence-CIBPifJk.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-utils-Cj5B4fDD.mjs → kernel-utils-042AuCQh.mjs} +1 -1
  60. package/lib/{kernel-utils-Cj5B4fDD.mjs.map → kernel-utils-042AuCQh.mjs.map} +1 -1
  61. package/lib/{layer-C_JtkhdO.mjs → layer-CFAr2mK_.mjs} +1 -1
  62. package/lib/{layer-C_JtkhdO.mjs.map → layer-CFAr2mK_.mjs.map} +1 -1
  63. package/lib/{main-D2BulNeN.mjs → main-KSs3XdXO.mjs} +21603 -22104
  64. package/lib/main-KSs3XdXO.mjs.map +1 -0
  65. package/lib/{material-viewer-CZQwo8Nc.mjs → material-viewer-Ced_pruD.mjs} +6 -6
  66. package/lib/{material-viewer-CZQwo8Nc.mjs.map → material-viewer-Ced_pruD.mjs.map} +1 -1
  67. package/lib/packages-oEzg5zoT.mjs +4 -0
  68. package/lib/planner-QF8IrfPz.mjs +2 -0
  69. package/lib/{planner-OgIPgZ1m.mjs → planner-ykpwnVZa.mjs} +3 -3
  70. package/lib/{planner-OgIPgZ1m.mjs.map → planner-ykpwnVZa.mjs.map} +1 -1
  71. package/lib/{plugin-system-DlME_5b_.mjs → plugin-system-DRpL0Rer.mjs} +3 -3
  72. package/lib/{plugin-system-DlME_5b_.mjs.map → plugin-system-DRpL0Rer.mjs.map} +1 -1
  73. package/lib/rolldown-runtime-DgwB9i60.mjs +13 -0
  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 +69 -29
  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 +69 -29
  81. package/lib/roomle-sdk.js +7 -7
  82. package/lib/{roomle-webgpu-renderer-5-aG3CMs.mjs → roomle-webgpu-renderer-NhCn2iM-.mjs} +386 -240
  83. package/lib/roomle-webgpu-renderer-NhCn2iM-.mjs.map +1 -0
  84. package/lib/{scene-renderer-DvXjoKHZ.mjs → scene-renderer-DbHi1plp.mjs} +367 -1467
  85. package/lib/scene-renderer-DbHi1plp.mjs.map +1 -0
  86. package/lib/{script-loader-CScqyQhc.mjs → script-loader-DKx7ZvkP.mjs} +3 -3
  87. package/lib/{script-loader-CScqyQhc.mjs.map → script-loader-DKx7ZvkP.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-BYi5TI_H.mjs → stats-helper-Bs79UZne.mjs} +4 -4
  95. package/lib/{stats-helper-BYi5TI_H.mjs.map → stats-helper-Bs79UZne.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-C4J_TZ0o.mjs → threejs-utils-E4yVZATI.mjs} +4 -4
  103. package/lib/threejs-utils-E4yVZATI.mjs.map +1 -0
  104. package/lib/{tools-core-BCkbEbim.mjs → tools-core-D4EbqT91.mjs} +3 -3
  105. package/lib/{tools-core-BCkbEbim.mjs.map → tools-core-D4EbqT91.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-BIyxKNI0.mjs +0 -2
  112. package/lib/dimensioning-helper-pPTkh8pl.mjs +0 -2
  113. package/lib/glb-viewer-DfMzLkqg.mjs +0 -2
  114. package/lib/main-D2BulNeN.mjs.map +0 -1
  115. package/lib/packages-BtLLQZLz.mjs +0 -4
  116. package/lib/planner-BF94NrwH.mjs +0 -2
  117. package/lib/rolldown-runtime-BwvMKf85.mjs +0 -23
  118. package/lib/roomle-renderer-DYQvV88j.mjs.map +0 -1
  119. package/lib/roomle-webgpu-renderer-5-aG3CMs.mjs.map +0 -1
  120. package/lib/scene-renderer-DvXjoKHZ.mjs.map +0 -1
  121. package/lib/threejs-utils-C4J_TZ0o.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
 
@@ -2666,6 +2666,14 @@ export declare interface Element_2 {
2666
2666
  perspectiveImage: AssetUrl;
2667
2667
  }
2668
2668
 
2669
+ export declare interface ElevationPlan {
2670
+ planSvg: string;
2671
+ }
2672
+
2673
+ export declare interface ElevationPlans {
2674
+ plans: ElevationPlan[];
2675
+ }
2676
+
2669
2677
  export declare interface ElevationProfile {
2670
2678
  profileContour: ElevationProfilePoint[];
2671
2679
  }
@@ -2679,7 +2687,7 @@ export declare interface ElevationProfilePoint {
2679
2687
 
2680
2688
  export declare interface ElevationView {
2681
2689
  lineOfSight: KernelVector3f;
2682
- objects: KernelPlanObject[];
2690
+ objects: PlanObject[];
2683
2691
  profile: ElevationProfile;
2684
2692
  }
2685
2693
 
@@ -3332,6 +3340,7 @@ export declare interface FeatureFlags {
3332
3340
  /* Excluded from this release type: interiorLights */
3333
3341
  /* Excluded from this release type: advancedDimensioning */
3334
3342
  /* Excluded from this release type: webGpu */
3343
+ /* Excluded from this release type: webGpuConfig */
3335
3344
  /* Excluded from this release type: advancedHighlighting */
3336
3345
  /* Excluded from this release type: fence */
3337
3346
  }
@@ -6761,7 +6770,7 @@ export declare class PlanViewModel extends ConfiguratorViewModel implements Plan
6761
6770
  private _handleCeilingPlanElementViewModel;
6762
6771
  private _handleNodePlanElementViewModel;
6763
6772
  private _getCeilingLightsDistribution;
6764
- handleInitialCeilingLights(ceilingLightsParameters: GenericGUIParamFolder | undefined, qualityLevel: QualityLevel): void;
6773
+ handleInitialCeilingLights(ceilingLightsParameters: GenericGUIParamFolder | undefined): void;
6765
6774
  handleCeilingLights(): void;
6766
6775
  handleLampLight(lamp: StaticPlanObjectViewModel, options: {
6767
6776
  targetPos: KernelVector3f;
@@ -7269,17 +7278,6 @@ export declare class PromiseQueue<T> {
7269
7278
  get length(): number;
7270
7279
  }
7271
7280
 
7272
- export declare const QUALITY_LEVELS: {
7273
- readonly HIGHEST: "highest";
7274
- readonly HIGH: "high";
7275
- readonly MEDIUM: "medium";
7276
- readonly LOW: "low";
7277
- };
7278
-
7279
- export declare type QualityLevel = Enumify<typeof QUALITY_LEVELS>;
7280
-
7281
- export declare type QualityMap = Map<QualityLevel, any>;
7282
-
7283
7281
  export declare class RangeArray extends EmsArray<KernelRange> {
7284
7282
  }
7285
7283
 
@@ -8203,7 +8201,18 @@ export declare class RoomleConfigurator<P extends readonly PluginName[] = readon
8203
8201
  private _checkInitDone;
8204
8202
  private _onInitDone;
8205
8203
  constructor(creator: string, activePlugins?: P);
8206
- 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;
8207
8216
  private createCameraForElevationPlan;
8208
8217
  exportCanvasScreenshot(quality?: number): Promise<string>;
8209
8218
  initSceneManager(sceneManager?: ConfiguratorSceneManager): void;
@@ -9150,7 +9159,19 @@ export declare class RoomlePlanner<P extends readonly PluginName[] = readonly []
9150
9159
  */
9151
9160
  createPlanFromObject(id: RapiId, position?: Position3, rotation?: number): Promise<number>;
9152
9161
  loadPlanXml(xml: string, options?: InitDataDefinition & GlobalInitDataDefinition): Promise<void>;
9153
- 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;
9154
9175
  loadPlan(id: string, options?: InitDataDefinition & GlobalInitDataDefinition): Promise<RapiPlan | RapiPlanSnapshotGetData>;
9155
9176
  /**
9156
9177
  * Set general configuration parameter
@@ -9846,16 +9867,10 @@ export declare abstract class RoomleRenderer<RendererType extends WebGLRenderer
9846
9867
  switchToConfigurator(): void;
9847
9868
  switchToPlanner(_renderMode: PlannerRenderMode): void;
9848
9869
  abstract setShadingType(shadingType: SceneShadingType): void;
9849
- abstract setAutoQuality(autoQuality: boolean): void;
9850
- abstract setQualityLevel(qualityLevel: QualityLevel): void;
9851
- abstract getQualityLevel(): QualityLevel;
9852
- abstract setQualityMap(qualityMap: QualityMap): void;
9853
- abstract setCustomShadingParameters(customShadingParameters?: CustomShadingParameters, customShadingParametersMoc?: CustomShadingParameters): void;
9854
9870
  abstract setCustomOutlineParameters(outlineCustomParameters: OutlineCustomParameters): void;
9855
9871
  abstract loadLutImages(luts: LutImageDefinition[]): void;
9856
9872
  abstract render(scene: Scene, camera: Camera): void;
9857
9873
  abstract showGUI(updateCallback: () => void): void;
9858
- abstract setOnQualityLevelChangeCallback(callback: (qualityLevel: QualityLevel) => void): void;
9859
9874
  abstract clearCache(): void;
9860
9875
  abstract highlightObjects(selectedMeshes: Object3D[]): void;
9861
9876
  abstract setGroundShadow(enabled: boolean, scene: Scene): void;
@@ -9930,8 +9945,12 @@ export declare class RoomleWebGPURenderer extends RoomleRenderer<WebGPURenderer>
9930
9945
  private readonly renderPasses;
9931
9946
  private readonly guiParameterGroups;
9932
9947
  private lastRenderCamera;
9948
+ private readonly qualityManager;
9949
+ private freezeFrames;
9950
+ private readonly freezeRenderTarget;
9933
9951
  private _domHelper;
9934
9952
  private _webGpuGroundShadowReflection;
9953
+ private _initData;
9935
9954
  constructor(creator: string, renderer: WebGPURenderer, enableSSGI: boolean, outlineColors?: OutlineColors);
9936
9955
  private enableRenderPasses;
9937
9956
  addGroundShadowLightAndFloor(scene: Scene): Promise<void>;
@@ -9939,26 +9958,23 @@ export declare class RoomleWebGPURenderer extends RoomleRenderer<WebGPURenderer>
9939
9958
  clearCache(): void;
9940
9959
  disableUiInteractionMode(): void;
9941
9960
  enableUiInteractionMode(): void;
9942
- getQualityLevel(): QualityLevel;
9943
9961
  setCameraType(cameraType: Enumify_2<typeof CAMERA_TYPE>): void;
9944
9962
  switchToConfigurator(): void;
9945
9963
  switchToPlanner(renderMode: PlannerRenderMode): void;
9946
9964
  highlightObjects(selectedMeshes: Object3D[]): void;
9947
9965
  loadLutImages(_luts: LutImageDefinition[]): void;
9948
9966
  render(scene: Scene, camera: Camera): void;
9967
+ private renderToFreezeTarget;
9949
9968
  private updateCameraProjectionMatrix;
9950
9969
  private assembleRenderPasses;
9951
- setAutoQuality(_autoQuality: boolean): void;
9952
- setCustomShadingParameters(_customShadingParameters: CustomShadingParameters | undefined, _customShadingParametersMoc: CustomShadingParameters | undefined): void;
9953
9970
  setCustomOutlineParameters(customOutlineParameters: OutlineCustomParameters): void;
9954
9971
  setGroundShadow(enabled: boolean, _scene: Scene): void;
9955
- setOnQualityLevelChangeCallback(_callback: (qualityLevel: QualityLevel) => void): void;
9956
9972
  private enableOutline;
9957
9973
  private getOutlinePassOrUndefined;
9958
9974
  private enableSsgiPass;
9959
9975
  private enableTraaPass;
9960
- setQualityLevel(_qualityLevel: QualityLevel): void;
9961
- setQualityMap(_qualityMap: QualityMap): void;
9976
+ private applyQualityParameters;
9977
+ private getSsgiPassOrUndefined;
9962
9978
  setShadingType(shadingType: SceneShadingType): void;
9963
9979
  showGUI(updateCallback: () => void): void;
9964
9980
  private addDebugGUI;
@@ -10985,6 +11001,30 @@ export declare interface WallSide {
10985
11001
  value: Enumify_3<typeof WALL_SIDES>;
10986
11002
  }
10987
11003
 
11004
+ export declare interface WebGpuConfig {
11005
+ /**
11006
+ * @description If true, the initial webgpu quality level is autodetected based on
11007
+ * a benchmark of the graphics hardware. If false, the default quality level is used.
11008
+ * @default true
11009
+ */
11010
+ autoDetectQualityLevel?: boolean;
11011
+ /**
11012
+ * @description This can be used to configure the lower bound of webgpu auto quality
11013
+ * meaning the fps bound which, when hit, will set the quality setting lower
11014
+ * To disable: set to 0
11015
+ * @default 24
11016
+ */
11017
+ autoQualityMinFps?: number;
11018
+ /**
11019
+ * @description This can be used to configure the upper bound of webgpu auto quality
11020
+ * meaning the fps bound which, when hit, will set the quality setting higher
11021
+ * This should be sufficiently larger than the minFps to not cause the quality to go up and down all the time
11022
+ * To disable: set to something very high
11023
+ * @default 59
11024
+ */
11025
+ autoQualityMaxFps?: number;
11026
+ }
11027
+
10988
11028
  export declare class ZoomChangeEvent {
10989
11029
  minZoom: boolean;
10990
11030
  maxZoom: boolean;
@@ -1,14 +1,14 @@
1
1
  import { i as e, t } from "./kernel-C7YDLxq8.mjs";
2
- import { _t as n, mt as r } from "./threejs-utils-C4J_TZ0o.mjs";
2
+ import { _t as n, mt as r } from "./threejs-utils-E4yVZATI.mjs";
3
3
  import { xi as i } from "./three.core-tV_4n8Wg.mjs";
4
- import { A as a, B as o, F as s, G as c, H as l, I as u, J as d, K as f, M as p, N as m, P as h, S as g, U as _, W as v, a as y, b, c as x, ct as S, dt as C, i as w, it as T, k as E, l as D, n as O, nt as k, ot as A, pt as j, rt as M, s as N, st as P, ut as ee, v as F, x as I, y as L } from "./main-D2BulNeN.mjs";
5
- import { n as R } from "./script-loader-CScqyQhc.mjs";
6
- import { t as z } from "./configurator-BwxEIDv7.mjs";
7
- import { t as B } from "./planner-OgIPgZ1m.mjs";
8
- import { n as V, t as H } from "./glb-viewer-C0Et5SO6.mjs";
9
- import { t as U } from "./api-BXU3pZnX.mjs";
10
- import "./packages-BtLLQZLz.mjs";
11
- import "./roomle-headless-setup-CMK-quZI.mjs";
4
+ import { A as a, B as o, F as s, G as c, H as l, I as u, J as d, K as f, M as p, N as m, P as h, S as g, U as _, W as v, a as y, b, c as x, ct as S, dt as C, i as w, it as T, k as E, l as D, n as O, nt as k, ot as A, pt as j, rt as M, s as N, st as P, ut as ee, v as F, x as I, y as L } from "./main-KSs3XdXO.mjs";
5
+ import { n as R } from "./script-loader-DKx7ZvkP.mjs";
6
+ import { t as z } from "./configurator-D6lTTIlU.mjs";
7
+ import { t as B } from "./planner-ykpwnVZa.mjs";
8
+ import { n as V, t as H } from "./glb-viewer-CuRDCxVq.mjs";
9
+ import { t as U } from "./api-ckpzIPty.mjs";
10
+ import "./packages-oEzg5zoT.mjs";
11
+ import "./roomle-headless-setup-Cc8EAnVe.mjs";
12
12
  import { createRequire as W } from "module";
13
13
  //#region packages/headless-core/src/headless-script-loader.ts
14
14
  var G = W(import.meta.url), K = {}, q = [
@@ -1,8 +1,26 @@
1
1
  import { f as e } from "./three.core-tV_4n8Wg.mjs";
2
- //#region packages/common-core/src/roomle-renderer.ts
3
- var t = /* @__PURE__ */ function(e) {
2
+ //#region packages/common-core/src/utils/fps-counter.ts
3
+ var t = 10, n = 20, r = class {
4
+ constructor() {
5
+ this._index = 0, this._prevTime = 0, this._frames = 0, this._fps = -1, this._fpsList = Array(t).fill(0), this._prevTime = (performance || Date).now(), this.reset();
6
+ }
7
+ update() {
8
+ this._frames++;
9
+ let e = (performance || Date).now();
10
+ e >= this._prevTime + n && (this._fpsList[this._index % t] = this._frames * 1e3 / (e - this._prevTime), this._index >= t && (this._fps = this._fpsList.reduce((e, t) => e + t) / this._fpsList.length), this._prevTime = e, this._frames = 0, this._index++);
11
+ }
12
+ start() {
13
+ this._prevTime = (performance || Date).now(), this._frames = 0;
14
+ }
15
+ reset() {
16
+ this._fps = -1, this._fpsList = Array(t).fill(0), this._index = 0;
17
+ }
18
+ getFps() {
19
+ return this._fps;
20
+ }
21
+ }, i = /* @__PURE__ */ function(e) {
4
22
  return e[e.Mode3D = 0] = "Mode3D", e[e.Mode2D = 1] = "Mode2D", e;
5
- }({}), n = class {
23
+ }({}), a = class {
6
24
  constructor(t, n) {
7
25
  this.isConfiguratorMode = !0, this.isCameraMoving = !1, this.shadowNeedsUpdate = !1, this.boundingBox = new e(), this.boundingBoxNeedsUpdate = !1, this._creator_ = t, this.renderer = n;
8
26
  }
@@ -44,6 +62,6 @@ var t = /* @__PURE__ */ function(e) {
44
62
  }
45
63
  };
46
64
  //#endregion
47
- export { n, t };
65
+ export { a as n, r, i as t };
48
66
 
49
- //# sourceMappingURL=roomle-renderer-DYQvV88j.mjs.map
67
+ //# sourceMappingURL=roomle-renderer-BD3ZmpLS.mjs.map