@oeave/bakery3 0.0.0-stage → 0.2.0

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 (86) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +562 -2
  3. package/dist/animation-B1h0Ryvj.d.ts +97 -0
  4. package/dist/bake/index.d.ts +369 -0
  5. package/dist/bake/index.js +9 -0
  6. package/dist/bake/index.js.map +1 -0
  7. package/dist/bake-DZ-CJR6f.d.ts +1364 -0
  8. package/dist/catalog/index.d.ts +100 -0
  9. package/dist/catalog/index.js +154 -0
  10. package/dist/catalog/index.js.map +1 -0
  11. package/dist/catalog.gen-BM-aNf7n.d.ts +733 -0
  12. package/dist/chunk-3G5QL4F4.js +145 -0
  13. package/dist/chunk-3G5QL4F4.js.map +1 -0
  14. package/dist/chunk-4E5VV4QY.js +12 -0
  15. package/dist/chunk-4E5VV4QY.js.map +1 -0
  16. package/dist/chunk-62M6XXNX.js +142 -0
  17. package/dist/chunk-62M6XXNX.js.map +1 -0
  18. package/dist/chunk-6FYI6AJM.js +1157 -0
  19. package/dist/chunk-6FYI6AJM.js.map +1 -0
  20. package/dist/chunk-6NYR73Y7.js +832 -0
  21. package/dist/chunk-6NYR73Y7.js.map +1 -0
  22. package/dist/chunk-APWUCEEB.js +118 -0
  23. package/dist/chunk-APWUCEEB.js.map +1 -0
  24. package/dist/chunk-HNMSWQU7.js +1709 -0
  25. package/dist/chunk-HNMSWQU7.js.map +1 -0
  26. package/dist/chunk-JFYUDERE.js +1412 -0
  27. package/dist/chunk-JFYUDERE.js.map +1 -0
  28. package/dist/chunk-KNUAOILG.js +551 -0
  29. package/dist/chunk-KNUAOILG.js.map +1 -0
  30. package/dist/chunk-KZLVTSBI.js +191 -0
  31. package/dist/chunk-KZLVTSBI.js.map +1 -0
  32. package/dist/chunk-LAKXC4WR.js +2028 -0
  33. package/dist/chunk-LAKXC4WR.js.map +1 -0
  34. package/dist/chunk-NXBAZGNB.js +1107 -0
  35. package/dist/chunk-NXBAZGNB.js.map +1 -0
  36. package/dist/chunk-QRCT5UGZ.js +3286 -0
  37. package/dist/chunk-QRCT5UGZ.js.map +1 -0
  38. package/dist/chunk-S4AJTLLN.js +23 -0
  39. package/dist/chunk-S4AJTLLN.js.map +1 -0
  40. package/dist/chunk-UWBP7B54.js +92 -0
  41. package/dist/chunk-UWBP7B54.js.map +1 -0
  42. package/dist/chunk-XK35ANPJ.js +346 -0
  43. package/dist/chunk-XK35ANPJ.js.map +1 -0
  44. package/dist/chunk-Z7IYVH22.js +4781 -0
  45. package/dist/chunk-Z7IYVH22.js.map +1 -0
  46. package/dist/chunk-ZEBVAIJJ.js +156 -0
  47. package/dist/chunk-ZEBVAIJJ.js.map +1 -0
  48. package/dist/devtools/index.d.ts +536 -0
  49. package/dist/devtools/index.js +15 -0
  50. package/dist/devtools/index.js.map +1 -0
  51. package/dist/environments/index.d.ts +93 -0
  52. package/dist/environments/index.js +382 -0
  53. package/dist/environments/index.js.map +1 -0
  54. package/dist/hotspots/index.d.ts +111 -0
  55. package/dist/hotspots/index.js +285 -0
  56. package/dist/hotspots/index.js.map +1 -0
  57. package/dist/index.d.ts +975 -0
  58. package/dist/index.js +15 -0
  59. package/dist/index.js.map +1 -0
  60. package/dist/node/index.cjs +5240 -0
  61. package/dist/node/index.cjs.map +1 -0
  62. package/dist/node/index.d.cts +4927 -0
  63. package/dist/node/index.d.ts +597 -0
  64. package/dist/node/index.js +1328 -0
  65. package/dist/node/index.js.map +1 -0
  66. package/dist/prepare-BtjY4G3q.d.ts +112 -0
  67. package/dist/presets/index.d.ts +562 -0
  68. package/dist/presets/index.js +14 -0
  69. package/dist/presets/index.js.map +1 -0
  70. package/dist/r3f/index.d.ts +159 -0
  71. package/dist/r3f/index.js +592 -0
  72. package/dist/r3f/index.js.map +1 -0
  73. package/dist/room-FS26KAPQ.js +9 -0
  74. package/dist/room-FS26KAPQ.js.map +1 -0
  75. package/dist/rooms.gen-DItzBR9k.d.ts +1462 -0
  76. package/dist/session-VCIQEO26.js +9 -0
  77. package/dist/session-VCIQEO26.js.map +1 -0
  78. package/dist/shapes/index.d.ts +222 -0
  79. package/dist/shapes/index.js +836 -0
  80. package/dist/shapes/index.js.map +1 -0
  81. package/dist/testRun-20OARnQr.d.ts +1139 -0
  82. package/dist/timeline-ChwgD7bT.d.ts +470 -0
  83. package/dist/tsl/index.d.ts +165 -0
  84. package/dist/tsl/index.js +310 -0
  85. package/dist/tsl/index.js.map +1 -0
  86. package/package.json +170 -4
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/presets/hdr.ts","../src/presets/library.ts","../src/presets/bakedRoom.ts","../src/presets/room.ts"],"names":["DataTexture","RGBAFormat","LinearSRGBColorSpace","surface","Color","sharedLoader","GLTFLoader","DoubleSide","DataUtils","Vector3","SRGBColorSpace","Group","MeshStandardMaterial","MathUtils","MeshPhysicalMaterial","DirectionalLight","ShadowMaterial","Mesh","EquirectangularReflectionMapping","Matrix4"],"mappings":"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","file":"chunk-HNMSWQU7.js","sourcesContent":["/**\n * A Radiance `.hdr` reader of our own, for the preset HDRIs' previews.\n *\n * three has one, under two names: `RGBELoader` until r179, `HDRLoader` from\n * r180, with `RGBELoader` left behind as a deprecated subclass that warns\n * and will be removed. No single import of either resolves across the range\n * the SDK supports (r160 onwards), and a bundler resolves every literal\n * `import()` it sees, the one in a `catch` included, so a fallback between\n * the two fails the build of whoever is on the other side of r180. The\n * format is small enough to read here: a text header, then scanlines of\n * RGBE pixels, flat or run-length encoded.\n *\n * The texture it makes is the one three's loader made: half float RGBA,\n * linear, filtered without mipmaps, flipped, with the same mantissa scale\n * (`byte / 255 · 2^(e − 128)`), so a preview reads exactly as it did.\n */\n\nimport {\n DataTexture,\n DataUtils,\n FileLoader,\n HalfFloatType,\n LinearFilter,\n LinearSRGBColorSpace,\n RGBAFormat,\n} from 'three';\n\nexport type RadianceImage = {\n width: number;\n height: number;\n /** Half floats, RGBA, rows top-down. */\n data: Uint16Array;\n};\n\nconst HALF_MAX = 65504;\n\n/** Parse a Radiance file. Throws on anything three's loader would refuse. */\nexport function decodeRadianceHdr(buffer: ArrayBuffer): RadianceImage {\n const bytes = new Uint8Array(buffer);\n let pos = 0;\n const line = (): string | null => {\n const end = bytes.indexOf(0x0a, pos);\n if (end < 0) return null;\n let text = '';\n for (let i = pos; i < end; i++) text += String.fromCharCode(bytes[i]!);\n pos = end + 1;\n return text;\n };\n const refuse = (why: string) =>\n new Error(`@oeave/bakery3/presets: not a readable .hdr file (${why}).`);\n\n const magic = line();\n if (!magic || !/^#\\?\\S+/.test(magic)) throw refuse('no #? header');\n let format = false;\n let width = 0;\n let height = 0;\n for (let text = line(); text !== null; text = line()) {\n if (text.startsWith('#')) continue;\n if (/^\\s*FORMAT=32-bit_rle_rgbe\\s*$/.test(text)) format = true;\n const size = /^\\s*-Y\\s+(\\d+)\\s+\\+X\\s+(\\d+)\\s*$/.exec(text);\n if (size) {\n height = Number(size[1]);\n width = Number(size[2]);\n break;\n }\n }\n if (!format) throw refuse('missing FORMAT=32-bit_rle_rgbe');\n if (!(width > 0 && height > 0)) throw refuse('missing -Y h +X w');\n\n const rgbe = scanlines(bytes.subarray(pos), width, height, refuse);\n const data = new Uint16Array(width * height * 4);\n const one = DataUtils.toHalfFloat(1);\n for (let i = 0; i < width * height; i++) {\n const o = i * 4;\n const e = rgbe[o + 3]!;\n const scale = e ? Math.pow(2, e - 128) / 255 : 0;\n data[o] = DataUtils.toHalfFloat(Math.min(rgbe[o]! * scale, HALF_MAX));\n data[o + 1] = DataUtils.toHalfFloat(\n Math.min(rgbe[o + 1]! * scale, HALF_MAX),\n );\n data[o + 2] = DataUtils.toHalfFloat(\n Math.min(rgbe[o + 2]! * scale, HALF_MAX),\n );\n data[o + 3] = one;\n }\n return { width, height, data };\n}\n\n/** The pixels as interleaved RGBE bytes, from flat or new-style RLE scanlines. */\nfunction scanlines(\n body: Uint8Array,\n width: number,\n height: number,\n refuse: (why: string) => Error,\n): Uint8Array {\n const flat =\n width < 8 ||\n width > 0x7fff ||\n body[0] !== 2 ||\n body[1] !== 2 ||\n (body[2]! & 0x80) !== 0;\n if (flat) {\n if (body.length < width * height * 4) throw refuse('file is cut short');\n return body.subarray(0, width * height * 4);\n }\n const out = new Uint8Array(width * height * 4);\n const planes = new Uint8Array(width * 4);\n let pos = 0;\n for (let row = 0; row < height; row++) {\n if (pos + 4 > body.length) throw refuse('file is cut short');\n if (\n body[pos] !== 2 ||\n body[pos + 1] !== 2 ||\n ((body[pos + 2]! << 8) | body[pos + 3]!) !== width\n )\n throw refuse('bad scanline header');\n pos += 4;\n let ptr = 0;\n while (ptr < planes.length) {\n if (pos >= body.length) throw refuse('file is cut short');\n let count = body[pos++]!;\n const run = count > 128;\n if (run) count -= 128;\n if (count === 0 || ptr + count > planes.length)\n throw refuse('bad scanline data');\n if (run) {\n planes.fill(body[pos++]!, ptr, ptr + count);\n } else {\n planes.set(body.subarray(pos, pos + count), ptr);\n pos += count;\n }\n ptr += count;\n }\n const base = row * width * 4;\n for (let col = 0; col < width; col++) {\n const o = base + col * 4;\n out[o] = planes[col]!;\n out[o + 1] = planes[width + col]!;\n out[o + 2] = planes[2 * width + col]!;\n out[o + 3] = planes[3 * width + col]!;\n }\n }\n return out;\n}\n\n/**\n * Load a `.hdr` as three's own loader did: through `FileLoader`, so the\n * default `LoadingManager` (and any progress UI on it) sees the request.\n */\nexport async function loadRadianceHdr(url: string): Promise<DataTexture> {\n const buffer = (await new FileLoader()\n .setResponseType('arraybuffer')\n .loadAsync(url)) as ArrayBuffer;\n const image = decodeRadianceHdr(buffer);\n const texture = new DataTexture(\n image.data,\n image.width,\n image.height,\n RGBAFormat,\n HalfFloatType,\n );\n texture.colorSpace = LinearSRGBColorSpace;\n texture.minFilter = LinearFilter;\n texture.magFilter = LinearFilter;\n texture.generateMipmaps = false;\n texture.flipY = true;\n texture.needsUpdate = true;\n return texture;\n}\n","/**\n * The implementation behind `@oeave/bakery3/presets`: materials, HDR\n * environments, the parametric room and pedestals. `index.ts` lists what is\n * public.\n */\n\nimport {\n BoxGeometry,\n Color,\n DataTexture,\n FloatType,\n LinearSRGBColorSpace,\n RGBAFormat,\n Vector3,\n Quaternion,\n Matrix4,\n Euler,\n DirectionalLight,\n DoubleSide,\n EquirectangularReflectionMapping,\n Group,\n MathUtils,\n Mesh,\n MeshPhysicalMaterial,\n MeshStandardMaterial,\n Object3D,\n Path,\n PlaneGeometry,\n RepeatWrapping,\n Shape,\n ShapeGeometry,\n SRGBColorSpace,\n TextureLoader,\n BufferGeometry,\n type ColorRepresentation,\n type Texture,\n} from 'three';\nimport { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';\nimport { mergeGeometries } from 'three/addons/utils/BufferGeometryUtils.js';\nimport { rememberEnvironmentSource } from '../capture/environmentSource.js';\nimport { Bakery3Error } from '../errors.js';\nimport {\n HDRI_PRESETS,\n MATERIAL_PRESETS,\n PEDESTAL_PRESETS,\n PRESETS_VERSION,\n type HdriPresetName,\n type MaterialPresetName,\n type PedestalPresetName,\n type PresetMapName,\n type PresetTextureSize,\n} from './catalog.gen.js';\nimport { presetBaseUrl } from './baseUrl.js';\nimport { loadRadianceHdr } from './hdr.js';\n\nexport function presetTextureUrl(\n name: MaterialPresetName,\n map: PresetMapName,\n size: PresetTextureSize = '2k',\n base: string = presetBaseUrl(),\n): string {\n return `${base}/v${PRESETS_VERSION}/materials/${name}/${size}/${MATERIAL_PRESETS[name].files[map]}`;\n}\n\nexport function pedestalUrl(\n name: PedestalPresetName,\n base: string = presetBaseUrl(),\n): string {\n return `${base}/v${PRESETS_VERSION}/objects/${name}.glb`;\n}\n\nexport type PresetEnvironmentAsset = 'preview' | 'render';\n\nexport function presetEnvironmentUrl(\n name: HdriPresetName,\n asset: PresetEnvironmentAsset = 'preview',\n base: string = presetBaseUrl(),\n): string {\n const file = asset === 'preview' ? 'preview.hdr' : 'render.exr';\n return `${base}/v${PRESETS_VERSION}/hdri/${name}/${file}`;\n}\n\nexport type PresetEnvironmentOptions = {\n /** Override the preset CDN, primarily for a local development server. */\n baseUrl?: string;\n};\n\n/**\n * Load the lightweight HDR preview while registering the EXR render master\n * with the core SDK. Assign the returned texture to `scene.environment` (and\n * optionally `scene.background`); render with\n * `background: { type: 'environment' }` when the rendered output should show it.\n * captureScene sends only the master URL, so the browser never downloads or\n * uploads the EXR.\n */\nexport async function loadPresetEnvironment(\n name: HdriPresetName,\n options: PresetEnvironmentOptions = {},\n): Promise<Texture> {\n const base = options.baseUrl ?? presetBaseUrl();\n const texture = await loadPresetHdr(name, base);\n rememberEnvironmentSource(\n texture,\n presetEnvironmentUrl(name, 'render', base),\n { preset: true },\n );\n return texture;\n}\n\n/**\n * The lightweight preview of an HDRI preset as an equirectangular texture,\n * and nothing else: not registered as the scene's environment, so the\n * capture never mistakes it for one. `createPresetRoom` puts it on the dome\n * outside a room's windows; `loadPresetEnvironment` is this plus the\n * registration of the 4k master.\n */\nexport async function loadPresetHdr(\n name: HdriPresetName,\n base: string = presetBaseUrl(),\n): Promise<Texture> {\n if (!HDRI_PRESETS[name]) {\n throw new Error(\n `'${String(name)}' is not an HDRI preset. Known: ${Object.keys(HDRI_PRESETS).join(', ')}.`,\n );\n }\n const texture = await loadRadianceHdr(\n presetEnvironmentUrl(name, 'preview', base),\n );\n texture.mapping = EquirectangularReflectionMapping;\n texture.userData.bakery3Preset = {\n kind: 'hdri',\n name,\n version: PRESETS_VERSION,\n previewResolution: HDRI_PRESETS[name].preview.resolution,\n renderResolution: HDRI_PRESETS[name].render.resolution,\n };\n return texture;\n}\n\n// ---------------------------------------------------------------------------\n// Sky\n// ---------------------------------------------------------------------------\n\nexport type SkyEnvironmentOptions = {\n /** Straight overhead. Default a deep clear-day blue. */\n zenith?: ColorRepresentation;\n /**\n * At the horizon, where most of the light that comes through a window\n * comes from. Default a saturated sky blue: a paler, more physical horizon\n * vanishes against a room's sun.\n */\n horizon?: ColorRepresentation;\n /** Below the horizon: the ground's bounce. Default a warm gray. */\n ground?: ColorRepresentation;\n /**\n * Multiplies the whole dome. 1 is a clear sky at exposure 0 seen through\n * the window; a room that is also lit by a sun of 3 to 4 wants 4 to 6\n * here before its shade turns cool, because the physical ratio between\n * sun and sky is far larger than a single exposure can hold.\n */\n intensity?: number;\n /** Equirect width in pixels; height is half. A gradient needs no more than the default 128. */\n width?: number;\n};\n\n/**\n * A sky to put outside the windows.\n *\n * A room with windows lit by a studio probe is lit by a studio through its\n * windows, and it shows: the light that comes in is neutral, and the cool\n * cast a real window throws (the blue of the sky against the warmth of the\n * sun) is missing. This is a generated equirectangular gradient (blue\n * overhead, paling to the horizon, a warm ground below) as an ordinary\n * `DataTexture`, so `scene.environment = createSkyEnvironment()` lights the\n * preview through PMREM like any HDRI, and the SDK ships the same pixels to\n * the render as a small Radiance file: no download, no CDN.\n *\n * It is a sky, not a sun: pair it with `createRoom({ sun })`, which carries\n * the crisp shadows. A room with a closed ceiling only ever sees this\n * through its openings, which is the point.\n */\nexport function createSkyEnvironment(\n options: SkyEnvironmentOptions = {},\n): DataTexture {\n const zenith = new Color(options.zenith ?? 0x2f6fd0);\n const horizon = new Color(options.horizon ?? 0x9cc4f5);\n const ground = new Color(options.ground ?? 0x8f8679);\n const intensity = options.intensity ?? 1;\n const width = Math.max(8, Math.round(options.width ?? 128));\n const height = width / 2;\n\n // Rows top-down like a Radiance file (zenith first); `flipY` puts the\n // zenith at v = 1 for the GPU, which is where equirect sampling looks for it.\n const data = new Float32Array(width * height * 4);\n const color = new Color();\n for (let row = 0; row < height; row++) {\n const elevation = (0.5 - (row + 0.5) / height) * Math.PI;\n if (elevation >= 0) {\n // Blue overhead, paling quickly toward the horizon: the shape of a\n // clear sky's brightness, not a physical sky model.\n color.copy(zenith).lerp(horizon, Math.pow(1 - Math.sin(elevation), 2.2));\n } else {\n // A soft band at the horizon, then ground.\n color\n .copy(horizon)\n .lerp(ground, Math.min(1, -elevation / MathUtils.degToRad(3)));\n }\n for (let col = 0; col < width; col++) {\n const i = (row * width + col) * 4;\n data[i] = color.r * intensity;\n data[i + 1] = color.g * intensity;\n data[i + 2] = color.b * intensity;\n data[i + 3] = 1;\n }\n }\n\n const texture = new DataTexture(data, width, height, RGBAFormat, FloatType);\n texture.mapping = EquirectangularReflectionMapping;\n texture.colorSpace = LinearSRGBColorSpace;\n texture.flipY = true;\n texture.needsUpdate = true;\n texture.userData.bakery3Preset = { kind: 'sky', ...options };\n rememberEnvironmentSource(texture, encodeRadianceHdr(data, width, height));\n return texture;\n}\n\n/**\n * Linear float RGBA, rows top-down, as a Radiance `.hdr`: the format the\n * SDK ships environments in, so a generated sky travels the same road as a\n * loaded one. New-style RLE scanlines written as literal runs: every reader\n * handles them, and a gradient is too small to be worth compressing.\n */\nexport function encodeRadianceHdr(\n data: Float32Array,\n width: number,\n height: number,\n): ArrayBuffer {\n if (width < 8 || width > 0x7fff) {\n throw new Error(\n `@oeave/bakery3/presets: a Radiance scanline is 8 to 32767 pixels wide, not ${width}.`,\n );\n }\n const header = new TextEncoder().encode(\n `#?RADIANCE\\nFORMAT=32-bit_rle_rgbe\\n\\n-Y ${height} +X ${width}\\n`,\n );\n const chunks = Math.ceil(width / 128);\n const scanline = 4 + 4 * (width + chunks);\n const out = new Uint8Array(header.length + height * scanline);\n out.set(header, 0);\n let o = header.length;\n const planes = new Uint8Array(width * 4);\n for (let row = 0; row < height; row++) {\n for (let col = 0; col < width; col++) {\n const i = (row * width + col) * 4;\n const r = data[i]!;\n const g = data[i + 1]!;\n const b = data[i + 2]!;\n const max = Math.max(r, g, b);\n if (max < 1e-32) {\n planes[col] = planes[width + col] = planes[2 * width + col] = 0;\n planes[3 * width + col] = 0;\n continue;\n }\n // frexp: max = m · 2^e with m in [0.5, 1).\n let e = Math.ceil(Math.log2(max));\n let m = max / Math.pow(2, e);\n if (m >= 1) {\n m /= 2;\n e += 1;\n } else if (m < 0.5) {\n m *= 2;\n e -= 1;\n }\n const scale = (m * 256) / max;\n planes[col] = Math.min(255, Math.floor(r * scale));\n planes[width + col] = Math.min(255, Math.floor(g * scale));\n planes[2 * width + col] = Math.min(255, Math.floor(b * scale));\n planes[3 * width + col] = e + 128;\n }\n out[o++] = 2;\n out[o++] = 2;\n out[o++] = (width >> 8) & 0xff;\n out[o++] = width & 0xff;\n for (let plane = 0; plane < 4; plane++) {\n for (let start = 0; start < width; start += 128) {\n const n = Math.min(128, width - start);\n out[o++] = n; // a literal run of n bytes\n out.set(\n planes.subarray(plane * width + start, plane * width + start + n),\n o,\n );\n o += n;\n }\n }\n }\n return out.buffer;\n}\n\n/** texture.repeat that makes UVs-in-meters physically correct. */\nexport function presetRepeat(name: MaterialPresetName): number {\n return 1 / MATERIAL_PRESETS[name].tileMeters;\n}\n\nexport type PresetMaterialOptions = {\n /** Texture resolution to load. 2k is the web default; 4k for close-ups. */\n size?: PresetTextureSize;\n /** Override the CDN base for this material only. */\n baseUrl?: string;\n /** Extra multiplier on the physical repeat (2 = pattern twice as dense). */\n repeat?: number;\n /** Skip the AO map (it needs a second render bounce to matter less). */\n ao?: boolean;\n anisotropy?: number;\n};\n\nconst textureCache = new Map<string, Texture>();\nlet sharedLoader: TextureLoader | undefined;\n\nfunction loadTexture(\n url: string,\n srgb: boolean,\n repeat: number,\n anisotropy: number,\n): Texture {\n // Shareable only when nothing instance-specific differs; repeat lives on\n // the texture in three.js, so the cache key must include it.\n const key = `${url}#${repeat}`;\n const cached = textureCache.get(key);\n if (cached) return cached;\n sharedLoader ??= new TextureLoader();\n const texture = sharedLoader.load(url);\n texture.wrapS = texture.wrapT = RepeatWrapping;\n texture.repeat.set(repeat, repeat);\n if (srgb) texture.colorSpace = SRGBColorSpace;\n texture.anisotropy = anisotropy;\n textureCache.set(key, texture);\n return texture;\n}\n\n/**\n * A MeshStandardMaterial wired to a preset's baked maps. Returns\n * synchronously; textures stream in and the material fills out as they\n * arrive (use loadPresetMaterial to await them). Tint `matte_paint`, or\n * any preset, with `material.color`.\n */\nexport function createPresetMaterial(\n name: MaterialPresetName,\n options: PresetMaterialOptions = {},\n): MeshStandardMaterial {\n const info = MATERIAL_PRESETS[name];\n const size = options.size ?? '2k';\n const base = options.baseUrl ?? presetBaseUrl();\n const repeat = presetRepeat(name) * (options.repeat ?? 1);\n const anisotropy = options.anisotropy ?? 8;\n const url = (map: PresetMapName) => presetTextureUrl(name, map, size, base);\n\n const material = new MeshStandardMaterial({\n metalness: info.metalness,\n roughness: 1,\n map: loadTexture(url('albedo'), true, repeat, anisotropy),\n normalMap: loadTexture(url('normal'), false, repeat, anisotropy),\n roughnessMap: loadTexture(url('roughness'), false, repeat, anisotropy),\n });\n if (options.ao !== false) {\n material.aoMap = loadTexture(url('ao'), false, repeat, anisotropy);\n }\n material.normalScale.setScalar(info.normalScale);\n material.userData.bakery3Preset = { name, size };\n return material;\n}\n\n/** createPresetMaterial, resolved once every map has actually loaded. */\nexport async function loadPresetMaterial(\n name: MaterialPresetName,\n options: PresetMaterialOptions = {},\n): Promise<MeshStandardMaterial> {\n const material = createPresetMaterial(name, options);\n const maps = [\n material.map,\n material.normalMap,\n material.roughnessMap,\n material.aoMap,\n ];\n // Textures may be cache hits from an earlier material and already loading;\n // TextureLoader keeps no per-texture promise, so poll for the decoded\n // image; it settles within a frame of the network finishing.\n await Promise.all(\n maps\n .filter((t): t is Texture => t !== null)\n .map((t) => textureReady(t, name)),\n );\n return material;\n}\n\nfunction textureReady(texture: Texture, presetName: string): Promise<void> {\n return new Promise((resolve, reject) => {\n if (texture.source.data) return resolve();\n const started = Date.now();\n const poll = setInterval(() => {\n if (texture.source.data) {\n clearInterval(poll);\n resolve();\n } else if (Date.now() - started > 30_000) {\n clearInterval(poll);\n reject(\n new Error(\n `@oeave/bakery3/presets: timed out loading a map for '${presetName}'`,\n ),\n );\n }\n }, 50);\n });\n}\n\n/** UVs in meters: the geometry every preset surface uses. */\nfunction planeMeters(width: number, height: number): BufferGeometry {\n const geometry = new PlaneGeometry(width, height);\n const uv = geometry.attributes.uv!;\n for (let i = 0; i < uv.count; i++) {\n uv.setXY(i, uv.getX(i) * width, uv.getY(i) * height);\n }\n return geometry;\n}\n\n// ---------------------------------------------------------------------------\n// Windows\n// ---------------------------------------------------------------------------\n//\n// A window is a real hole in the wall, not a texture trick, because its whole\n// point is what passes through it: put a sun (or an HDRI) outside and the\n// render traces actual daylight falling into the room, and the WebGL preview\n// agrees, because every room surface casts shadows too. The wall face is a\n// shape-with-holes; each opening gets reveal surfaces exposing the wall's\n// thickness, an optional painted frame, and optional glass. Glass is off by\n// default on purpose: an open window lights the scene identically and a\n// transmission surface between the sun and the room just costs render noise.\n\nexport type WindowSpec = {\n /**\n * Meters along the wall from its center; positive is to your right as you\n * face the wall from inside the room. Default 0 (centered).\n */\n offset?: number;\n /** Opening width in meters. Default 1.2. */\n width?: number;\n /** Opening height in meters. Default 1.4. */\n height?: number;\n /** Meters from the floor to the bottom of the opening. Default 0.9. */\n sill?: number;\n /** Painted frame in the opening. Default true. */\n frame?: boolean;\n /** Glass pane (MeshPhysicalMaterial, transmission 1). Default false. */\n glass?: boolean;\n /**\n * Leaves outside the opening, so sun through it arrives dappled rather\n * than as one hard rectangle, the way a window with something outside it\n * does. Default true. Ordinary leaf geometry: it shows through the glass\n * and traces like any other mesh.\n */\n foliage?: boolean;\n};\n\nexport type RoomWallName = 'north' | 'south' | 'west' | 'east';\n\nexport type RoomWindowOpening = {\n /** Opening bounds in wall-local meters: x across the wall from its center, y up from the floor. */\n x0: number;\n y0: number;\n x1: number;\n y1: number;\n frame: boolean;\n glass: boolean;\n foliage: boolean;\n};\n\nconst WINDOW_DEFAULTS = {\n offset: 0,\n width: 1.2,\n height: 1.4,\n sill: 0.9,\n frame: true,\n glass: false,\n foliage: true,\n};\n\n/** Structure a window must keep clear of corners and ceiling, meters. */\nconst WINDOW_MARGIN = 0.05;\n\n/**\n * Validate window specs against a wall and return concrete openings.\n * Refuses loudly: a window that silently vanished or clipped through a\n * corner would surface as a wrong render, which is worse than an error.\n */\nexport function resolveWindows(\n wall: RoomWallName,\n specs: WindowSpec | readonly WindowSpec[] | undefined,\n wallWidth: number,\n roomHeight: number,\n): RoomWindowOpening[] {\n const list =\n specs === undefined\n ? []\n : Array.isArray(specs)\n ? specs\n : [specs as WindowSpec];\n const openings = list.map((spec, index) => {\n const { offset, width, height, sill, frame, glass, foliage } = {\n ...WINDOW_DEFAULTS,\n ...spec,\n };\n const label = `@oeave/bakery3/presets: ${wall} window ${index}`;\n if (width <= 0 || height <= 0) {\n throw new Error(\n `${label} has a non-positive size (${width} × ${height} m).`,\n );\n }\n if (sill < 0) {\n throw new Error(\n `${label} has its sill ${sill} m below the floor. Use sill: 0 or higher.`,\n );\n }\n const opening: RoomWindowOpening = {\n x0: offset - width / 2,\n x1: offset + width / 2,\n y0: sill,\n y1: sill + height,\n frame,\n glass,\n foliage,\n };\n const limit = wallWidth / 2 - WINDOW_MARGIN;\n if (opening.x0 < -limit || opening.x1 > limit) {\n throw new Error(\n `${label} (offset ${offset}, width ${width}) does not fit the ${wallWidth} m wall. ` +\n `Keep it ${WINDOW_MARGIN} m clear of the corners.`,\n );\n }\n if (opening.y1 > roomHeight - WINDOW_MARGIN) {\n throw new Error(\n `${label} reaches ${opening.y1} m but the room is ${roomHeight} m tall. ` +\n `Lower the sill or shrink the height.`,\n );\n }\n return opening;\n });\n for (let i = 0; i < openings.length; i++) {\n for (let j = i + 1; j < openings.length; j++) {\n const a = openings[i]!;\n const b = openings[j]!;\n if (a.x0 < b.x1 && b.x0 < a.x1 && a.y0 < b.y1 && b.y0 < a.y1) {\n throw new Error(\n `@oeave/bakery3/presets: ${wall} windows ${i} and ${j} overlap. Separate their offsets.`,\n );\n }\n }\n }\n return openings;\n}\n\n/**\n * The wall's inner face: a rectangle in wall-local meters (x from -width/2,\n * y from 0 at the floor) with one hole per opening. ShapeGeometry keeps the\n * raw coordinates as UVs, so the meters-per-UV convention survives holes.\n */\nexport function wallFaceGeometry(\n width: number,\n height: number,\n openings: readonly RoomWindowOpening[],\n): BufferGeometry {\n const shape = new Shape();\n shape.moveTo(-width / 2, 0);\n shape.lineTo(width / 2, 0);\n shape.lineTo(width / 2, height);\n shape.lineTo(-width / 2, height);\n shape.closePath();\n for (const opening of openings) {\n const hole = new Path();\n hole.moveTo(opening.x0, opening.y0);\n hole.lineTo(opening.x0, opening.y1);\n hole.lineTo(opening.x1, opening.y1);\n hole.lineTo(opening.x1, opening.y0);\n hole.closePath();\n shape.holes.push(hole);\n }\n return new ShapeGeometry(shape);\n}\n\nconst FRAME_MEMBER = 0.055;\nconst FRAME_DEPTH = 0.045;\n\nfunction buildWindow(\n opening: RoomWindowOpening,\n index: number,\n thickness: number,\n materials: {\n wall: MeshStandardMaterial;\n frame: MeshStandardMaterial;\n glass: MeshPhysicalMaterial;\n foliage: { leaf: MeshStandardMaterial; twig: MeshStandardMaterial };\n },\n): Group {\n const { x0, x1, y0, y1 } = opening;\n const w = x1 - x0;\n const h = y1 - y0;\n const cx = (x0 + x1) / 2;\n const cy = (y0 + y1) / 2;\n const z = -thickness / 2; // into the wall; local +z faces the room\n\n const group = new Group();\n group.name = `window-${index}`;\n\n // Reveals: the four surfaces of the opening, facing inward, painted with\n // the wall material at meter scale like everything else.\n const reveal = (\n geometry: BufferGeometry,\n position: [number, number, number],\n rotation: [number, number, number],\n name: string,\n ) => {\n const mesh = new Mesh(geometry, materials.wall);\n mesh.name = name;\n mesh.position.set(...position);\n mesh.rotation.set(...rotation);\n mesh.castShadow = true;\n mesh.receiveShadow = true;\n group.add(mesh);\n };\n reveal(\n planeMeters(thickness, h),\n [x0, cy, z],\n [0, Math.PI / 2, 0],\n 'reveal-left',\n );\n reveal(\n planeMeters(thickness, h),\n [x1, cy, z],\n [0, -Math.PI / 2, 0],\n 'reveal-right',\n );\n reveal(\n planeMeters(w, thickness),\n [cx, y1, z],\n [Math.PI / 2, 0, 0],\n 'reveal-top',\n );\n reveal(\n planeMeters(w, thickness),\n [cx, y0, z],\n [-Math.PI / 2, 0, 0],\n 'reveal-sill',\n );\n\n if (opening.frame) {\n const bar = (\n bw: number,\n bh: number,\n position: [number, number, number],\n ) => {\n const mesh = new Mesh(\n new BoxGeometry(bw, bh, FRAME_DEPTH),\n materials.frame,\n );\n mesh.name = 'frame';\n mesh.position.set(...position);\n mesh.castShadow = true;\n mesh.receiveShadow = true;\n group.add(mesh);\n };\n bar(w, FRAME_MEMBER, [cx, y0 + FRAME_MEMBER / 2, z]);\n bar(w, FRAME_MEMBER, [cx, y1 - FRAME_MEMBER / 2, z]);\n bar(FRAME_MEMBER, h - 2 * FRAME_MEMBER, [x0 + FRAME_MEMBER / 2, cy, z]);\n bar(FRAME_MEMBER, h - 2 * FRAME_MEMBER, [x1 - FRAME_MEMBER / 2, cy, z]);\n // Wide sashes get a center mullion so they read as a window, not a hole.\n if (w > 1.05) bar(FRAME_MEMBER * 0.7, h - 2 * FRAME_MEMBER, [cx, cy, z]);\n }\n\n if (opening.glass) {\n const pane = new Mesh(planeMeters(w, h), materials.glass);\n pane.name = 'glass';\n pane.position.set(cx, cy, z + FRAME_DEPTH / 2 + 0.002);\n group.add(pane);\n }\n\n if (opening.foliage) {\n group.add(buildFoliage(opening, index, thickness, materials.foliage));\n }\n\n return group;\n}\n\n/**\n * A canopy of leaves outside a window.\n *\n * Sun through a bare opening lands as one hard rectangle, and nothing says\n * \"computer\" faster. Real windows have something outside them, and what that\n * something does to the light (clumps of shadow with clean shafts between)\n * is most of what makes a traced interior read as a photograph. So: leaf\n * shapes in clumps, with gaps, hung outside the opening where the sun has\n * to come through them on its way to the floor.\n *\n * Real geometry, deliberately. A shadow-only card with a noise alpha would\n * need a node material the render cannot carry; a few hundred leaf shapes\n * merged into one mesh (and their twigs into another) travel through glTF\n * like any other mesh, cast the same shadows in the preview and in the\n * trace, and are simply greenery through the glass when the camera looks\n * that way. Seeded from the opening, so the same room grows the same leaves\n * on every load: a capture has to be reproducible.\n */\nfunction buildFoliage(\n opening: RoomWindowOpening,\n index: number,\n thickness: number,\n materials: { leaf: MeshStandardMaterial; twig: MeshStandardMaterial },\n): Group {\n const { x0, x1, y0, y1 } = opening;\n const w = x1 - x0;\n const h = y1 - y0;\n const cx = (x0 + x1) / 2;\n const cy = (y0 + y1) / 2;\n const random = mulberry32(\n Math.round((x0 * 73 + y0 * 151 + x1 * 271 + y1 * 397) * 1000) +\n index * 7919,\n );\n\n // The band the sun has to cross. Rays that reach the floor inside come\n // through the lower part of the opening, and at the canopy's distance\n // outside they are higher still, so the canopy spans the opening sideways\n // with a margin and reaches from just above the sill to well over the head.\n // Laid out as a jittered grid of clumps with cells left empty on purpose:\n // the gaps are the clean shafts, and a shaft beside a dapple is what reads\n // as sun through a tree.\n const depth = -(thickness + 0.7);\n const cell = 0.5;\n const xStart = x0 - 0.35;\n const xEnd = x1 + 0.35;\n const yStart = y0 + h * 0.15;\n const yEnd = y1 + 0.7;\n const cols = Math.max(2, Math.round((xEnd - xStart) / cell));\n const rows = Math.max(2, Math.round((yEnd - yStart) / cell));\n\n const leaves: BufferGeometry[] = [];\n const twigs: BufferGeometry[] = [];\n const position = new Vector3();\n const rotation = new Quaternion();\n const unit = new Vector3(1, 1, 1);\n const matrix = new Matrix4();\n const euler = new Euler();\n const place = (\n geometry: BufferGeometry,\n x: number,\n y: number,\n z: number,\n rx: number,\n ry: number,\n rz: number,\n ) => {\n position.set(x, y, z);\n euler.set(rx, ry, rz);\n rotation.setFromEuler(euler);\n matrix.compose(position, rotation, unit);\n geometry.applyMatrix4(matrix);\n return geometry;\n };\n\n for (let row = 0; row < rows; row++) {\n for (let col = 0; col < cols; col++) {\n if (random() < 0.3) continue; // a gap\n const clumpX =\n xStart +\n ((col + 0.5) * (xEnd - xStart)) / cols +\n (random() - 0.5) * cell * 0.6;\n const clumpY =\n yStart +\n ((row + 0.5) * (yEnd - yStart)) / rows +\n (random() - 0.5) * cell * 0.6;\n const clumpZ = depth + (random() - 0.5) * 0.3;\n const radius = 0.24 + random() * 0.14;\n\n // A few twigs through the clump, so it hangs off something.\n for (let t = 0; t < 3; t++) {\n twigs.push(\n place(\n new BoxGeometry(0.008, 0.008, radius * 1.7),\n clumpX + (random() - 0.5) * radius * 0.5,\n clumpY + (random() - 0.5) * radius * 0.5,\n clumpZ,\n (random() - 0.5) * 0.8,\n (random() - 0.5) * 3.2,\n (random() - 0.5) * 0.8,\n ),\n );\n }\n\n const count = Math.round(radius * radius * Math.PI * 210);\n for (let i = 0; i < count; i++) {\n leaves.push(\n place(\n leafGeometry(0.08 + random() * 0.06),\n clumpX + (random() + random() - 1) * radius,\n clumpY + (random() + random() - 1) * radius * 0.85,\n clumpZ + (random() - 0.5) * 0.2,\n (random() - 0.5) * 1.4,\n (random() - 0.5) * 1.4,\n random() * Math.PI * 2,\n ),\n );\n }\n }\n }\n\n const merge = (\n parts: BufferGeometry[],\n name: string,\n material: MeshStandardMaterial,\n ) => {\n const geometry = mergeGeometries(parts, false) ?? new BufferGeometry();\n for (const part of parts) part.dispose();\n geometry.computeVertexNormals();\n const mesh = new Mesh(geometry, material);\n mesh.name = name;\n mesh.castShadow = true;\n mesh.receiveShadow = false;\n return mesh;\n };\n\n const group = new Group();\n group.name = 'foliage';\n group.add(\n merge(leaves, 'leaves', materials.leaf),\n merge(twigs, 'twigs', materials.twig),\n );\n return group;\n}\n\n/** One leaf: a pointed oval in the XY plane, base at the origin. */\nfunction leafGeometry(length: number): ShapeGeometry {\n const half = length * 0.34;\n const shape = new Shape();\n shape.moveTo(0, 0);\n shape.quadraticCurveTo(half, length * 0.45, 0, length);\n shape.quadraticCurveTo(-half, length * 0.55, 0, 0);\n return new ShapeGeometry(shape, 5);\n}\n\n/** A small seeded generator, so a room's foliage is the same every load. */\nfunction mulberry32(seed: number): () => number {\n let a = seed >>> 0;\n return () => {\n a = (a + 0x6d2b79f5) >>> 0;\n let t = a;\n t = Math.imul(t ^ (t >>> 15), t | 1);\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61);\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n\nexport type SunOptions = {\n /** Degrees above the horizon. Default 32. */\n elevation?: number;\n /**\n * Degrees clockwise from north (the −z wall) as seen from above. Default\n * 0: straight through a north-wall window.\n */\n azimuth?: number;\n /** Light intensity. Default 3.5. */\n intensity?: number;\n color?: ColorRepresentation;\n /**\n * Angular diameter in degrees: how crisp the shadows trace. Default 0.53,\n * the real sun: a leaf two meters outside still draws a leaf on the floor.\n * Without it the renderer's default is a studio-soft 12°, which turns sun\n * through a window into a glow and a canopy into mottling.\n */\n angleDeg?: number;\n};\n\nexport type RoomOptions = {\n /** Meters. Defaults: 4 × 4 × 2.7. */\n width?: number;\n depth?: number;\n height?: number;\n floor?: MaterialPresetName;\n walls?: MaterialPresetName;\n /** Pass null for an open ceiling (studio lighting from above). */\n ceiling?: MaterialPresetName | null;\n /** Wall thickness in meters: the depth of window reveals. Default 0.15. */\n wallThickness?: number;\n /**\n * Window openings per wall. north is the −z wall; offsets are measured to\n * your right as you face each wall from inside.\n */\n windows?: Partial<Record<RoomWallName, WindowSpec | readonly WindowSpec[]>>;\n /**\n * Add a shadow-casting sun outside the room. Aim it through a window\n * (azimuth 0 = through the north wall) and the render traces real daylight\n * falling in; the WebGL preview shows the same shafts, because every\n * room surface casts shadows.\n */\n sun?: SunOptions | true;\n materialOptions?: PresetMaterialOptions;\n};\n\n/**\n * An interior shell: floor at y = 0, centered on the origin, every surface\n * facing inward (from outside the walls are backface-culled, which makes\n * orbiting and debugging pleasant, but they still block light: traced\n * geometry is two-sided, and the preview shadow pass renders both sides).\n *\n * Structure, all by name so surfaces can be restyled or removed:\n * floor, ceiling: meshes\n * wall-north (−z), wall-south, wall-west, wall-east: groups holding a\n * 'face' mesh plus 'window-N' groups (reveal-*, frame and glass\n * meshes, and a 'foliage' group, the canopy outside, on by default)\n * sun: when requested, a group holding 'sun-light' and its aim target\n */\nexport function createRoom(options: RoomOptions = {}): Group {\n const width = options.width ?? 4;\n const depth = options.depth ?? 4;\n const height = options.height ?? 2.7;\n const thickness = options.wallThickness ?? 0.15;\n const materialFor = (name: MaterialPresetName) => {\n const material = createPresetMaterial(name, options.materialOptions);\n // The sun stands outside; walls must occlude it from either side or the\n // preview's light would pour straight through the back of a wall.\n material.shadowSide = DoubleSide;\n return material;\n };\n\n const room = new Group();\n room.name = 'bakery3-room';\n room.userData.bakery3Preset = {\n room: { width, depth, height, windows: options.windows ?? null },\n };\n\n const surface = (\n name: string,\n geometry: BufferGeometry,\n material: MeshStandardMaterial,\n position: [number, number, number],\n rotation: [number, number, number],\n parent: Group = room,\n ) => {\n const mesh = new Mesh(geometry, material);\n mesh.name = name;\n mesh.position.set(...position);\n mesh.rotation.set(...rotation);\n mesh.castShadow = true;\n mesh.receiveShadow = true;\n parent.add(mesh);\n return mesh;\n };\n\n const floor = materialFor(options.floor ?? 'oak_floor');\n surface(\n 'floor',\n planeMeters(width, depth),\n floor,\n [0, 0, 0],\n [-Math.PI / 2, 0, 0],\n );\n\n if (options.ceiling !== null) {\n const ceiling = materialFor(options.ceiling ?? 'matte_paint');\n surface(\n 'ceiling',\n planeMeters(width, depth),\n ceiling,\n [0, height, 0],\n [Math.PI / 2, 0, 0],\n );\n }\n\n const wallMaterial = materialFor(options.walls ?? 'white_plaster');\n const frameMaterial = new MeshStandardMaterial({\n color: 0xf4f3f0,\n roughness: 0.5,\n metalness: 0,\n });\n const glassMaterial = new MeshPhysicalMaterial({\n roughness: 0.04,\n metalness: 0,\n transmission: 1,\n ior: 1.52,\n thickness: 0.006,\n side: DoubleSide,\n });\n const leafMaterial = new MeshStandardMaterial({\n color: 0x3a5a2a,\n roughness: 0.7,\n metalness: 0,\n side: DoubleSide,\n });\n leafMaterial.name = 'foliage-leaf';\n const twigMaterial = new MeshStandardMaterial({\n color: 0x4a3a2c,\n roughness: 0.9,\n metalness: 0,\n });\n twigMaterial.name = 'foliage-twig';\n\n const buildWall = (\n name: RoomWallName,\n wallWidth: number,\n position: [number, number, number],\n rotationY: number,\n ) => {\n const openings = resolveWindows(\n name,\n options.windows?.[name],\n wallWidth,\n height,\n );\n const wall = new Group();\n wall.name = `wall-${name}`;\n wall.position.set(...position);\n wall.rotation.y = rotationY;\n surface(\n 'face',\n wallFaceGeometry(wallWidth, height, openings),\n wallMaterial,\n [0, 0, 0],\n [0, 0, 0],\n wall,\n );\n openings.forEach((opening, index) => {\n wall.add(\n buildWindow(opening, index, thickness, {\n wall: wallMaterial,\n frame: frameMaterial,\n glass: glassMaterial,\n foliage: { leaf: leafMaterial, twig: twigMaterial },\n }),\n );\n });\n room.add(wall);\n };\n buildWall('north', width, [0, 0, -depth / 2], 0);\n buildWall('south', width, [0, 0, depth / 2], Math.PI);\n buildWall('west', depth, [-width / 2, 0, 0], Math.PI / 2);\n buildWall('east', depth, [width / 2, 0, 0], -Math.PI / 2);\n\n if (options.sun) {\n room.add(\n createRoomSun(\n options.sun === true ? {} : options.sun,\n width,\n depth,\n height,\n ),\n );\n }\n\n return room;\n}\n\n/**\n * A sun for the room: a plain DirectionalLight, which the render pipeline\n * translates to a sun lamp like any other scene light. Positioned well\n * outside the shell with a shadow camera sized to cover it. Returned as a\n * group ('sun') holding the light and its aim target; the target must live\n * in room space, not under the light, or moving one would move the other.\n */\nfunction createRoomSun(\n options: SunOptions,\n width: number,\n depth: number,\n height: number,\n): Group {\n const elevation = MathUtils.degToRad(options.elevation ?? 32);\n const azimuth = MathUtils.degToRad(options.azimuth ?? 0);\n const reach = Math.hypot(width, depth, height);\n\n const group = new Group();\n group.name = 'sun';\n\n const sun = new DirectionalLight(\n options.color ?? 0xfff2df,\n options.intensity ?? 3.5,\n );\n sun.name = 'sun-light';\n const horizontal = 2 * reach * Math.cos(elevation);\n sun.position.set(\n horizontal * Math.sin(azimuth),\n 2 * reach * Math.sin(elevation) + height / 2,\n -horizontal * Math.cos(azimuth),\n );\n const target = new Object3D();\n target.name = 'sun-target';\n target.position.set(0, height / 2, 0);\n group.add(sun, target);\n sun.target = target;\n\n sun.userData.bakery3 = { angleDeg: options.angleDeg ?? 0.53 };\n sun.castShadow = true;\n sun.shadow.mapSize.set(2048, 2048);\n sun.shadow.camera.left = sun.shadow.camera.bottom = -reach;\n sun.shadow.camera.right = sun.shadow.camera.top = reach;\n sun.shadow.camera.near = 0.1;\n sun.shadow.camera.far = 6 * reach;\n sun.shadow.bias = -0.0003;\n return group;\n}\n\nexport type PedestalOptions = {\n /** Which pedestal. Default `pedestal_block`; or pass the name first. */\n type?: PedestalPresetName;\n material?: MaterialPresetName;\n materialOptions?: PresetMaterialOptions;\n baseUrl?: string;\n};\n\n/**\n * A pedestal from `createPedestal()`: a plain three.js `Group`, with what a\n * page needs from it typed on `userData`. Anything else on `userData` is\n * yours, as on any object.\n */\nexport interface PresetPedestal extends Group {\n userData: {\n /**\n * The resting height for what it displays, in meters:\n * `product.position.y = pedestal.userData.topY`.\n */\n topY: number;\n /**\n * Resolves with the pedestal once its model is in. Await it before a\n * render: one started earlier gets an empty group.\n */\n ready: Promise<PresetPedestal>;\n // The rest of `userData` is as open as three's own.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any;\n };\n}\n\nlet sharedGltfLoader: GLTFLoader | undefined;\nconst gltfCache = new Map<string, Promise<Group>>();\n\nfunction loadGlb(url: string): Promise<Group> {\n let pending = gltfCache.get(url);\n if (!pending) {\n sharedGltfLoader ??= new GLTFLoader();\n pending = sharedGltfLoader.loadAsync(url).then((gltf) => gltf.scene);\n gltfCache.set(url, pending);\n }\n return pending;\n}\n\n/**\n * A pedestal with a preset material, base at y = 0. Returns a Group\n * immediately; the mesh streams in (await `userData.ready` to know when).\n * `userData.topY` is the resting height for whatever it displays:\n * `product.position.y = pedestal.userData.topY` and the product sits on it.\n *\n * createPedestal('pedestal_column', { material: 'carrara_marble' });\n * createPedestal({ type: 'pedestal_column', material: 'carrara_marble' });\n */\nexport function createPedestal(\n type: PedestalPresetName,\n options?: Omit<PedestalOptions, 'type'>,\n): PresetPedestal;\nexport function createPedestal(options?: PedestalOptions): PresetPedestal;\nexport function createPedestal(\n typeOrOptions: PedestalPresetName | PedestalOptions = {},\n more: Omit<PedestalOptions, 'type'> = {},\n): PresetPedestal {\n const options: PedestalOptions =\n typeof typeOrOptions === 'string'\n ? { ...more, type: typeOrOptions }\n : (typeOrOptions ?? {});\n const type = options.type ?? 'pedestal_block';\n const info = PEDESTAL_PRESETS[type];\n if (!info) {\n throw new Bakery3Error({\n code: 'InvalidRequest',\n message: `\"${String(type)}\" is not a pedestal.`,\n fix: `Use one of: ${Object.keys(PEDESTAL_PRESETS).join(', ')}.`,\n docs: 'https://bakery3.com/docs/presets',\n });\n }\n const material = createPresetMaterial(\n options.material ?? info.defaultMaterial,\n {\n baseUrl: options.baseUrl,\n ...options.materialOptions,\n },\n );\n const pedestal = new Group();\n pedestal.name = `bakery3-${type}`;\n pedestal.userData.topY = info.size.y;\n pedestal.userData.bakery3Preset = { object: type };\n pedestal.userData.ready = loadGlb(\n pedestalUrl(type, options.baseUrl ?? presetBaseUrl()),\n ).then((glb) => {\n const instance = glb.clone();\n instance.traverse((node) => {\n if (!(node as Mesh).isMesh) return;\n const mesh = node as Mesh;\n // The loader cache owns the source geometry. Each instance gets its own\n // clone so disposing one pedestal cannot poison the next.\n mesh.geometry = mesh.geometry.clone();\n mesh.material = material;\n mesh.castShadow = true;\n mesh.receiveShadow = true;\n });\n pedestal.add(instance);\n return pedestal as PresetPedestal;\n });\n return pedestal as PresetPedestal;\n}\n","/**\n * A baked room: a preset room with its traced light already in it.\n *\n * THE ROOM IS AN ORDINARY GLB, and this file is a convenience over it, never\n * a requirement. This is the whole of loading one:\n *\n * new GLTFLoader().load(bakedRoomUrl('atelier_skylight', 'day') + 'room.glb',\n * (gltf) => scene.add(gltf.scene));\n *\n * Its surfaces carry their traced light as emission on a second uv set, so\n * they are lit in any glTF viewer, no lamp in the page can light them twice,\n * and their highlights are still live. Its key lamp is a glTF light. Its\n * exposure is in its numbers, so the renderer stays at 1.\n *\n * What `createBakedRoom` adds is the three things a GLB cannot say:\n *\n * const room = createBakedRoom('atelier_skylight');\n * scene.add(room);\n * await room.userData.ready;\n * product.position.copy(room.userData.stand); // where the stand is\n * scene.environment = room.userData.environment; // what the product reflects\n *\n * and the product's shadow, which it draws with three's own `ShadowMaterial`\n * on a copy of the floor and the stand: no shader of ours is compiled.\n */\n\nimport {\n EquirectangularReflectionMapping,\n Group,\n Mesh,\n ShadowMaterial,\n Vector3,\n type DataTexture,\n type DirectionalLight,\n type Object3D,\n type PerspectiveCamera,\n type SpotLight,\n} from 'three';\nimport { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';\nimport { presetBaseUrl } from './baseUrl.js';\nimport { loadRadianceHdr } from './hdr.js';\n\n/** `room.json`, as the packer writes it. */\nexport type BakedRoomManifest = {\n version: number;\n name: string;\n lighting: string;\n presetsVersion: number;\n size: { width: number; depth: number; height: number };\n exposureBakedIn: number;\n stand: { position: [number, number, number]; top: number };\n camera: {\n position: [number, number, number];\n target: [number, number, number];\n lensMm: number;\n } | null;\n glb: string;\n probe: { uri: string; position: [number, number, number] };\n key: { type: 'directional' | 'spot'; node: string } | null;\n triangles: number;\n bytes: number;\n files: Record<string, number>;\n};\n\nexport type BakedRoomOptions = {\n lighting?: string;\n /** The room's key lamp on the product. Default true. */\n keyLight?: boolean;\n /**\n * The product's shadow on the floor and the stand, cast by the key lamp.\n * A number is how dark it goes, 0 to 1. Default 0.45. The renderer needs\n * `shadowMap.enabled`, and the product `castShadow`.\n */\n shadows?: boolean | number;\n /** Meters around the stand the shadow covers. Default 1.6. */\n shadowReach?: number;\n baseUrl?: string;\n presetsVersion?: number;\n};\n\nexport function bakedRoomUrl(\n name: string,\n lighting: string,\n base: string = presetBaseUrl(),\n presetsVersion = 1,\n): string {\n return `${base.replace(/\\/$/, '')}/v${presetsVersion}/rooms/${name}/baked/${lighting}/`;\n}\n\n/**\n * A baked room around the origin: floor at y = 0, north wall at -z. Returns a\n * Group at once; `userData.ready` resolves to it when everything is in.\n * After that `userData.stand` is where the product goes,\n * `userData.environment` is the probe (give it to `scene.environment`),\n * `userData.keyLight` is the lamp on the product, or null, and\n * `userData.manifest` is the room's own `room.json`.\n */\nexport function createBakedRoom(\n name: string,\n options: BakedRoomOptions = {},\n): Group {\n const room = new Group();\n room.name = `bakery3-baked-room-${name}`;\n const base = options.baseUrl ?? presetBaseUrl();\n\n room.userData.ready = (async () => {\n // The lighting mode is in the path, so the default has to be asked for.\n const lighting =\n options.lighting ??\n (await defaultLighting(name, base, options.presetsVersion));\n const url = bakedRoomUrl(name, lighting, base, options.presetsVersion);\n const manifest = (await (\n await fetchOk(`${url}room.json`)\n ).json()) as BakedRoomManifest;\n\n const [gltf, probe] = await Promise.all([\n new GLTFLoader().loadAsync(`${url}${manifest.glb}`),\n loadRadianceHdr(`${url}${manifest.probe.uri}`),\n ]);\n\n const catchers: Mesh[] = [];\n let keyLight: DirectionalLight | SpotLight | null = null;\n gltf.scene.traverse((node) => {\n // Nothing in a room is the product: a capture leaves it out, and a\n // render of the scene builds the room itself from its record.\n node.userData.bakery3 = {\n ...(node.userData.bakery3 ?? {}),\n exclude: true,\n };\n const light = node as DirectionalLight | SpotLight;\n if (light.isLight) keyLight = light;\n const mesh = node as Mesh;\n if (!mesh.isMesh) return;\n mesh.castShadow = false;\n mesh.receiveShadow = false;\n const role = roleOf(mesh);\n if (role === 'floor' || role === 'stand') catchers.push(mesh);\n });\n room.add(gltf.scene);\n\n const key = keyLight as DirectionalLight | SpotLight | null;\n if (key && options.keyLight === false) {\n key.parent?.remove(key);\n keyLight = null;\n } else if (key) {\n const reach = options.shadowReach ?? 1.6;\n key.castShadow = options.shadows !== false;\n key.shadow.mapSize.set(1024, 1024);\n key.shadow.bias = -0.0002;\n key.shadow.normalBias = 0.02;\n if ((key as DirectionalLight).isDirectionalLight) {\n const camera = (key as DirectionalLight).shadow.camera;\n camera.left = camera.bottom = -reach;\n camera.right = camera.top = reach;\n camera.far = 20;\n }\n }\n\n // The product's shadow. The room's own surfaces are lit by what was\n // traced and listen to no lamp, so the shadow is laid over them: the\n // same triangles again, a hair nearer, in three's own shadow material.\n if (keyLight && options.shadows !== false) {\n const material = new ShadowMaterial({\n opacity: typeof options.shadows === 'number' ? options.shadows : 0.45,\n depthWrite: false,\n polygonOffset: true,\n polygonOffsetFactor: -2,\n polygonOffsetUnits: -2,\n });\n for (const mesh of catchers) {\n const catcher = new Mesh(mesh.geometry, material);\n catcher.name = `${mesh.name}.shadow`;\n catcher.receiveShadow = true;\n catcher.renderOrder = 1;\n catcher.userData.bakery3 = { exclude: true };\n mesh.add(catcher);\n }\n }\n\n probe.mapping = EquirectangularReflectionMapping;\n\n room.userData.manifest = manifest;\n room.userData.stand = new Vector3(...manifest.stand.position);\n room.userData.topY = manifest.stand.top;\n room.userData.environment = probe as DataTexture;\n room.userData.keyLight = keyLight;\n return room;\n })();\n\n return room;\n}\n\n/** What the bake said a mesh is: on the mesh, or on the group it came in. */\nfunction roleOf(mesh: Object3D): string | null {\n for (let at: Object3D | null = mesh; at; at = at.parent) {\n if (typeof at.userData.bakery3Role === 'string')\n return at.userData.bakery3Role;\n }\n return null;\n}\n\n/** Put `camera` where the room was published from, aimed at the stand. */\nexport function applyBakedRoomCamera(\n camera: PerspectiveCamera,\n room: Object3D,\n): void {\n const manifest = room.userData.manifest as BakedRoomManifest | undefined;\n if (!manifest?.camera) return;\n room.updateMatrixWorld();\n camera.position\n .set(...manifest.camera.position)\n .applyMatrix4(room.matrixWorld);\n camera.lookAt(\n new Vector3(...manifest.camera.target).applyMatrix4(room.matrixWorld),\n );\n const aspect = camera.aspect || 1;\n const sensor = aspect >= 1 ? 36 / aspect : 36;\n camera.fov =\n (2 * Math.atan(sensor / (2 * manifest.camera.lensMm)) * 180) / Math.PI;\n camera.updateProjectionMatrix();\n}\n\nasync function fetchOk(url: string): Promise<Response> {\n const response = await fetch(url);\n if (!response.ok)\n throw new Error(`${url}: ${response.status} ${response.statusText}`);\n return response;\n}\n\nasync function defaultLighting(\n name: string,\n base: string,\n presetsVersion = 1,\n): Promise<string> {\n const url = `${base.replace(/\\/$/, '')}/v${presetsVersion}/rooms/${name}/baked/index.json`;\n const index = (await (await fetchOk(url)).json()) as { lighting: string };\n return index.lighting;\n}\n","/**\n * Room presets: a staged interior around the product, in one call.\n *\n * import { createPresetRoom, applyPresetRoomCamera } from '@oeave/bakery3/presets';\n *\n * const room = createPresetRoom('loft_golden', {\n * walls: { material: 'white_plaster', color: '#e9dfd0' },\n * pedestal: 'pedestal_column',\n * });\n * scene.add(room);\n * product.position.copy(room.userData.stand); // on the pedestal\n * applyPresetRoomCamera(camera, room); // the published framing\n * renderer.toneMappingExposure = room.userData.exposure; // as bright as designed\n *\n * What the browser gets is a stand-in: one compressed GLB from the preset\n * CDN (a few MB: furniture with 1k textures, the shell wearing the same\n * preset materials `createPresetMaterial` serves, a sun and a hemisphere\n * fill). It is there so the product can be framed inside the room. None of\n * it is captured. The manifest carries a small record instead (which room,\n * which build, which lighting, which surfaces, which stand, the group's\n * matrix) and the render worker rebuilds the whole set from its own\n * full-resolution copy: 4k maps, the full geometry, the foliage outside the\n * glass that dapples the sun, the light fixtures, the portals, the haze. A\n * product in a room therefore uploads exactly what a bare product uploads.\n *\n * Two things follow. The foliage and the light rig are never in the\n * preview, so the traced image is meant to be richer than the viewport, not\n * identical to it, and the compatibility report says so once, as an info\n * item, at capture. And a room's lights and sky replace the scene's\n * environment for the render: the room owns its daylight.\n */\n\nimport {\n Float32BufferAttribute,\n type BufferGeometry,\n Box3,\n Color,\n DataUtils,\n DirectionalLight,\n DoubleSide,\n EquirectangularReflectionMapping,\n Group,\n HemisphereLight,\n LightProbe,\n MathUtils,\n Matrix4,\n Mesh,\n MeshBasicMaterial,\n MeshPhysicalMaterial,\n MeshStandardMaterial,\n Object3D,\n PerspectiveCamera,\n PointLight,\n ShadowMaterial,\n SpotLight,\n SphericalHarmonics3,\n SRGBColorSpace,\n Texture,\n Vector3,\n type Camera,\n} from 'three';\nimport { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';\nimport { GroundedSkybox } from 'three/addons/objects/GroundedSkybox.js';\nimport { MeshoptDecoder } from 'three/addons/libs/meshopt_decoder.module.js';\nimport type { RoomPresetSpec } from '../protocol/index.js';\nimport { Bakery3Error } from '../errors.js';\nimport { sha256 } from '../capture/hash.js';\nimport {\n HDRI_PRESETS,\n MATERIAL_PRESETS,\n PEDESTAL_PRESETS,\n type HdriPresetName,\n type MaterialPresetName,\n type PedestalPresetName,\n} from './catalog.gen.js';\nimport {\n ROOM_PRESETS,\n type RoomPresetLighting,\n type RoomPresetName,\n} from './rooms.gen.js';\nimport { roomPresetSpecOf, type PresetRoomState } from './roomState.js';\nimport { applyRoomPrebake, type PresetRoomPrebake } from './roomPrebake.js';\nimport {\n createPedestal,\n createPresetMaterial,\n loadPresetHdr,\n type PresetMaterialOptions,\n} from './library.js';\nimport { presetBaseUrl } from './baseUrl.js';\nimport { bakedRoomUrl, type BakedRoomManifest } from './bakedRoom.js';\nimport { loadRadianceHdr } from './hdr.js';\n\n// The full generated record, for the SDK's own code. The public\n// `ROOM_PRESETS` is `roomCatalog.ts`: the same object, typed as a developer\n// reads it.\nexport {\n ROOM_PRESETS,\n type RoomPresetLighting,\n type RoomPresetName,\n} from './rooms.gen.js';\n\n/** A preset material, optionally tinted (plaster and paint take a tint well). */\nexport type RoomSurfaceOption =\n MaterialPresetName | { material: MaterialPresetName; color?: string };\n\nexport type PresetRoomOptions = {\n /** Day, golden, overcast or night. Defaults to the mode the room was designed under. */\n lighting?: RoomPresetLighting;\n floor?: RoomSurfaceOption;\n walls?: RoomSurfaceOption;\n ceiling?: RoomSurfaceOption;\n /** Window sills: stone or timber. Never tinted. */\n sill?: MaterialPresetName;\n /**\n * What the product stands on: a pedestal preset, or `null` for the floor.\n * Defaults to the room's own stand.\n */\n pedestal?: PedestalPresetName | null;\n /** The pedestal's material. A room whose own stand is a table keeps the\n * table's finish. */\n pedestalMaterial?: MaterialPresetName;\n /**\n * Preview lights: the room's sun through its windows, a hemisphere fill,\n * whatever fixtures the published rig had. Default true. Off, the group is\n * geometry only, for an app that lights its own viewport.\n */\n lights?: boolean;\n /**\n * Make the room bakeable. The stand-in's surfaces (floor, walls, ceiling,\n * sills, the stand, the furniture) then ship in the capture like any mesh,\n * so `bake()` lists them and the bake lightmaps the room itself:\n * contact shadows under the product, bounce on the walls. The renderer\n * still owns the light (sky, sun, portals, foliage, fixtures) and builds no\n * shell of its own around the shipped one. Off by default: a plain render\n * of a room uploads only the product.\n */\n bake?: boolean;\n /**\n * What is outside the windows. By default the map the room was published\n * with for its mode: its 1k preview on a dome projected onto the ground,\n * so the view through the glass has a horizon and a floor, turned so the\n * map's sun sits where the room's sun is. Name another `HDRI_PRESETS`\n * entry to put that one there instead (the render turns it to the room's\n * sun the same way), or `false` for nothing outside: the mode's plain sky,\n * in the viewport and in the render alike.\n * The dome never ships; the render builds its own from the 4k master.\n *\n * The dome is 60 m out, so the camera's `far` must reach past it (100 is\n * plenty) or the sky is clipped to black. The console says so once.\n * The render also lays aerial perspective over the distance when the room\n * was published with air; the stand-in shows the map as shot.\n */\n hdri?: HdriPresetName | false;\n /**\n * Let the room ask a bake to stand in for its own heavy pieces: a box\n * where a shelf of books is, a low-poly planter and a flat card where a\n * plant is. Default true, and it only ever applies to a bake that is\n * covering the room's own surfaces.\n *\n * It is the room's geometry, so the room says how it would like to be\n * stood in for. `false` bakes every piece as it is, which is what a bundle\n * shared between pages wants: a card is drawn from one side, and a bundle\n * everybody downloads has to hold up from all of them.\n */\n simplify?: boolean;\n /**\n * Your own images in the room's frames, one per picture it hangs, in the\n * order it hangs them (`ROOM_PRESETS[name].pictures` lists them). A URL\n * the page can fetch, or a `Blob` you already have; `null` leaves that\n * frame as published, and a short list leaves the rest.\n *\n * The frame stays where it is and the image is cropped to fill it, the\n * way `object-fit: cover` fills a box, so a portrait photograph in a\n * landscape frame is centred and cropped rather than letterboxed.\n */\n pictures?: ReadonlyArray<PresetRoomPicture | null>;\n /**\n * Light the room with its prebaked lightmaps, when the library has them\n * for this lighting mode (`ROOM_PRESETS[name].prebaked`). Default true.\n * They arrive after `userData.ready`, and `userData.prebaked` resolves\n * when they are on (or `null` when there are none). The room must be\n * unmodified: another floor, walls, ceiling, sill, map outside or stand is\n * other light, so the room keeps its preview lights. `false` never\n * downloads them; `setPresetRoomPrebaked(room, false)` turns them off.\n */\n prebaked?: boolean;\n /**\n * Show the room's BAKED version when it has one for this lighting (see\n * `ROOM_PRESETS[name].baked`): one optimized file with the room's traced\n * light already in it, so the room in the page looks like its render and\n * costs a few megabytes. Default true.\n *\n * It changes only what the page draws. A render still builds the real\n * room, full geometry and full-size maps, under the same light the baked\n * one was traced with. A bake covers your product, the stand and the\n * product's shadow, traced in that real room.\n *\n * The room must be as published: another floor, walls, ceiling, sill,\n * stand, map outside or picture is a room nobody baked, and `bake: true`\n * and `lights: false` ask for the stand-in by name. In all of those, and\n * when the baked file cannot be fetched, the page gets the stand-in.\n */\n baked?: boolean;\n baseUrl?: string;\n materialOptions?: PresetMaterialOptions;\n};\n\n/**\n * A room from `createPresetRoom()`: a plain three.js `Group`, with what a\n * page needs from it typed on `userData`. Anything else on `userData` is\n * yours, as on any object.\n */\nexport interface PresetRoom extends Group {\n userData: {\n /**\n * Where the product goes: the top of the stand, in the room's own\n * frame. `product.position.copy(room.userData.stand)`.\n */\n stand: Vector3;\n /** The height of `stand`, in meters. */\n topY: number;\n /**\n * The `toneMappingExposure` the room was designed under. Set the\n * renderer to it and the room is as bright as its published pictures.\n */\n exposure: number;\n /**\n * Resolves with the room once its stand-in is in. Await it before a\n * render: one started earlier gets an empty room.\n */\n ready: Promise<PresetRoom>;\n /**\n * Resolves when the room's own traced light is on (see the `prebaked`\n * option), or with `null` when there is none for this room as it is.\n */\n prebaked: Promise<PresetRoomPrebake | null>;\n /**\n * `'baked'` when the page is showing the room's baked version, `'standIn'`\n * when it is showing the stand-in. Set when `ready` resolves.\n */\n shown?: 'baked' | 'standIn';\n /**\n * In a baked room: what the product reflects, traced from where it\n * stands. `scene.environment = room.userData.environment`. Absent in a\n * stand-in.\n */\n environment?: Texture;\n // The rest of `userData` is as open as three's own.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any;\n };\n}\n\n/** The dome's radius: past any room and any camera that frames one. */\nconst DOME_RADIUS = 60;\n/** The outside ground sits this far below the floor, or the two fight for the same pixels. */\nconst GROUND_DROP = 0.05;\n\n/** What the group remembers of the choices: the manifest's record minus the matrix. */\nexport type { PresetRoomState, PresetRoomFacts } from './roomState.js';\n\nexport function presetRoomUrl(\n name: RoomPresetName,\n base: string = presetBaseUrl(),\n): string {\n const info = ROOM_PRESETS[name];\n return `${base.replace(/\\/$/, '')}/v${info.presetsVersion}/${info.preview.glb}`;\n}\n\n/**\n * The accent spot: the renderer's IES lamp lands about 0.006 W/sr per lamp\n * watt on axis, whatever the beam, and the cone is where the IES profile\n * falls to a tenth.\n */\nconst IES_PEAK_PER_WATT = 0.006;\n/**\n * The emission strength a downlight's visible face carries. It is the number\n * the renderer designs its cans at: the stand-in's disc is the only one in\n * the scene, so it has to be the designed one.\n */\nconst FIXTURE_GLOW_STRENGTH = 5;\n/**\n * A can, from the exported candela back to its spec watts and on to the\n * viewport: a room hangs a can at `watts × DOWNLIGHT_SCALE` lamp watts and\n * the exporter writes a point lamp as `W × 683 / 4π` candela; the stand-in\n * draws a can at `CAN_FULL_WATTS` or more as the mode's `point` cap, and a\n * dimmer one in proportion.\n */\nconst DOWNLIGHT_SCALE = 9.0;\nconst CANDELA_PER_WATT = 683 / (4 * Math.PI);\nconst CAN_FULL_WATTS = 20;\nconst ACCENT_BEAM = {\n narrow: { angleDeg: 17.5, penumbra: 0.5 },\n medium: { angleDeg: 31.6, penumbra: 0.5 },\n wide: { angleDeg: 48.6, penumbra: 0.5 },\n} as const;\n\n/**\n * The look of each lighting mode in WebGL. The GLB's lights arrive with\n * photometric values (a sun in W/m², cans in thousands of candela), which\n * blow a viewport out; these renormalizations make the stand-in read the\n * way a competent three.js scene of the room would.\n *\n * `sky` and `ground` are the hemisphere fill's levels. Its hue is the\n * room's, not the mode's: `previewFill` in the catalog carries the color of\n * the light that room's own openings and fixtures deliver, and\n * `hemisphereFill` wears it without changing how much light the fill gives,\n * so a skylit room's fill is blue and a golden loft's warm.\n */\nconst MODE_LOOK: Record<\n RoomPresetLighting,\n { hemi: number; sun: number; point: number; sky: string; ground: string }\n> = {\n day: { hemi: 0.55, sun: 0.42, point: 10, sky: '#e9eef4', ground: '#6a5f52' },\n golden: { hemi: 0.4, sun: 0.5, point: 10, sky: '#f1dcc2', ground: '#6a5f52' },\n overcast: {\n hemi: 0.8,\n sun: 0.3,\n point: 10,\n sky: '#dfe3e8',\n ground: '#6a5f52',\n },\n night: { hemi: 0.06, sun: 0.3, point: 4, sky: '#2a3550', ground: '#1a1712' },\n};\n\n/** Relative luminance of an sRGB hex, linear: the level a fill color carries. */\nfunction hexLuminance(hex: string): number {\n const m = /^#?([0-9a-f]{6})$/i.exec(hex.trim());\n if (!m) return 1;\n const channel = (i: number) => {\n const v = parseInt(m[1]!.slice(i, i + 2), 16) / 255;\n return v <= 0.04045 ? v / 12.92 : ((v + 0.055) / 1.055) ** 2.4;\n };\n return 0.2126 * channel(0) + 0.7152 * channel(2) + 0.0722 * channel(4);\n}\n\n/**\n * The mode's fill wearing the room's own hue: two colors and the factor\n * the intensity must carry so the light delivered is unchanged.\n *\n * `previewFill`'s triples are at luminance 1, so the level lives entirely in\n * the mode's own `sky`/`ground`. Those are near-white, which leaves no gamut\n * room for a saturated hue, so the hue goes in the color at whatever\n * saturation it needs and the level moves into the intensity. A room\n * published without `previewFill` keeps the mode's pair exactly.\n */\nfunction hemisphereFill(\n look: { sky: string; ground: string },\n fill: { sky: readonly number[]; ground: readonly number[] } | undefined,\n): { sky: Color; ground: Color; intensity: number } {\n if (!fill?.sky || !fill?.ground) {\n return {\n sky: new Color(look.sky),\n ground: new Color(look.ground),\n intensity: 1,\n };\n }\n const skyLevel = hexLuminance(look.sky);\n const groundLevel = hexLuminance(look.ground);\n const peak = (rgb: readonly number[]) => Math.max(rgb[0]!, rgb[1]!, rgb[2]!);\n const scale = Math.max(\n skyLevel * peak(fill.sky),\n groundLevel * peak(fill.ground),\n 1e-6,\n );\n const color = (rgb: readonly number[], level: number) =>\n new Color().setRGB(\n (rgb[0]! * level) / scale,\n (rgb[1]! * level) / scale,\n (rgb[2]! * level) / scale,\n );\n return {\n sky: color(fill.sky, skyLevel),\n ground: color(fill.ground, groundLevel),\n intensity: scale,\n };\n}\n\nlet sharedLoader: GLTFLoader | undefined;\nconst glbCache = new Map<string, Promise<Group>>();\n\nfunction loadRoomGlb(url: string): Promise<Group> {\n let pending = glbCache.get(url);\n if (!pending) {\n if (!sharedLoader) {\n sharedLoader = new GLTFLoader();\n // The preview is meshopt-compressed; the decoder ships inside three.\n sharedLoader.setMeshoptDecoder(MeshoptDecoder);\n }\n pending = sharedLoader.loadAsync(url).then((gltf) => gltf.scene);\n glbCache.set(url, pending);\n }\n return pending;\n}\n\n/** Meters around the stand a baked room's key lamp casts the product's shadow over. */\nconst BAKED_SHADOW_REACH = 1.6;\n\nconst bakedCache = new Map<string, Promise<Group>>();\n\n/**\n * A baked room's GLB, brought to the room's own exposure.\n *\n * The file is made to open in any glTF viewer at exposure 1, so the room's\n * exposure is multiplied into every number in it. A page with a preset room\n * in it sets `toneMappingExposure` to the room's (`userData.exposure`), as\n * it does for the stand-in and as the render does, so here those numbers\n * are divided back out, once per file.\n */\nfunction loadBakedGlb(url: string, exposure: number): Promise<Group> {\n let pending = bakedCache.get(url);\n if (!pending) {\n // A stock loader: a baked room needs nothing registered.\n pending = new GLTFLoader().loadAsync(url).then((gltf) => {\n const scale = exposure > 0 ? 1 / exposure : 1;\n const seen = new Set<unknown>();\n gltf.scene.traverse((node) => {\n const light = node as PointLight;\n if (light.isLight) light.intensity *= scale;\n const mesh = node as Mesh;\n if (!mesh.isMesh) return;\n for (const material of Array.isArray(mesh.material)\n ? mesh.material\n : [mesh.material]) {\n if (seen.has(material)) continue;\n seen.add(material);\n // A light's own face is seen from wherever the camera is: a\n // pendant's disc is an open surface, looked at from below.\n if (bakedLit(mesh) === 'glow') material.side = DoubleSide;\n const basic = material as MeshBasicMaterial;\n const standard = material as MeshStandardMaterial;\n // Unlit (foliage, bezels) carries its light in its color.\n if (basic.isMeshBasicMaterial) basic.color.multiplyScalar(scale);\n else if (standard.isMeshStandardMaterial)\n standard.emissiveIntensity *= scale;\n }\n });\n return gltf.scene;\n });\n bakedCache.set(url, pending);\n pending.catch(() => bakedCache.delete(url));\n }\n return pending;\n}\n\n/** Half floats times a number, in place. */\nfunction scaleHalfFloats(data: Uint16Array, scale: number): void {\n if (scale === 1) return;\n for (let i = 0; i < data.length; i += 4) {\n for (let c = 0; c < 3; c++) {\n data[i + c] = DataUtils.toHalfFloat(\n Math.min(DataUtils.fromHalfFloat(data[i + c]!) * scale, 65000),\n );\n }\n }\n}\n\n/**\n * An equirect of half floats as nine spherical harmonics: what a matte\n * surface facing any way receives from it. three's `LightProbeGenerator`\n * does this for a cube map; a probe arrives as one flat image, read here on\n * a coarse grid (irradiance is smooth, and this runs once per room).\n *\n * The image is stored top row first, as three's own HDR loader leaves it,\n * and laid on the sphere as three samples an equirect: u from the direction's\n * angle about y, v from its height.\n */\nfunction irradianceOf(\n data: Uint16Array,\n width: number,\n height: number,\n): SphericalHarmonics3 {\n const sh = new SphericalHarmonics3();\n const basis = new Array<number>(9).fill(0);\n const direction = new Vector3();\n const color = new Vector3();\n const step = Math.max(1, Math.floor(width / 128));\n let total = 0;\n for (let row = Math.floor(step / 2); row < height; row += step) {\n const latitude = (0.5 - (row + 0.5) / height) * Math.PI;\n const weight = Math.cos(latitude);\n for (let column = Math.floor(step / 2); column < width; column += step) {\n const longitude = ((column + 0.5) / width - 0.5) * 2 * Math.PI;\n direction.set(\n Math.cos(latitude) * Math.cos(longitude),\n Math.sin(latitude),\n Math.cos(latitude) * Math.sin(longitude),\n );\n const at = (row * width + column) * 4;\n color.set(\n DataUtils.fromHalfFloat(data[at]!),\n DataUtils.fromHalfFloat(data[at + 1]!),\n DataUtils.fromHalfFloat(data[at + 2]!),\n );\n SphericalHarmonics3.getBasisAt(direction, basis);\n for (let j = 0; j < 9; j++)\n sh.coefficients[j]!.addScaledVector(color, basis[j]! * weight);\n total += weight;\n }\n }\n if (total > 0) sh.scale((4 * Math.PI) / total);\n return sh;\n}\n\n/** How the room baker lit a mesh (`lightmap`, `vertex`, `glow`, `glass`, `flat`, `outside`). */\nfunction bakedLit(mesh: Object3D): string | null {\n for (let at: Object3D | null = mesh; at; at = at.parent) {\n if (typeof at.userData.bakery3Lit === 'string')\n return at.userData.bakery3Lit;\n }\n return null;\n}\n\n/** What the room baker said a mesh is: on the mesh, or on the group it came in. */\nfunction bakedRole(mesh: Object3D): string | null {\n for (let at: Object3D | null = mesh; at; at = at.parent) {\n if (typeof at.userData.bakery3Role === 'string')\n return at.userData.bakery3Role;\n }\n return null;\n}\n\nconst surface = (option: RoomSurfaceOption | undefined) =>\n option === undefined\n ? undefined\n : typeof option === 'string'\n ? { material: option }\n : {\n material: option.material,\n ...(option.color ? { color: option.color } : {}),\n };\n\n/**\n * The parts of a potted plant that are the planter rather than the plant.\n * Every plant in the library is split this way (`<preset>_<part>`), and a\n * part nobody has listed is treated as foliage, because a pot that came\n * through as a card is a worse mistake than leaves that came through as\n * geometry.\n */\nconst PLANTER_PARTS = new Set([\n 'pot',\n 'base',\n 'gravel',\n 'pebbles',\n 'ground',\n 'dirt',\n]);\n\n/** How many stand-ins a room may ask for before it stops asking. */\nconst ROOM_STAND_INS = 12;\n\n/**\n * What the room would like a bake to replace, written onto its own meshes as\n * `userData.bakery3.simplify`, the same field a developer would set by hand.\n *\n * The books: one box per compartment. A shelf with no depth in it stops\n * reading as a shelf, so the carcass stays exactly as it is and only what\n * fills it is stood in for, which is also where the objects are (thirty book\n * meshes in one room, each otherwise a lightmap of its own). One box per\n * compartment and not one for the whole case, so the shelf boards are still\n * in front of something rather than buried inside it.\n *\n * The plants: a low-poly planter and a card for the foliage. A whole plant\n * as one card goes wrong on the floor: the shadow a plant lays down is a\n * pool the width of its leaves, and a card has no width, so half that pool\n * comes out in front of the plant. A planter is not the cheap half of a\n * plant either (a ribbed pot can run to a hundred thousand triangles), so it\n * is reduced rather than left alone, and as a solid it gives the shadow\n * something to sit around. The card carries the leaves, which is the part a\n * card is good at.\n */\nexport function stampRoomStandIns(\n root: Object3D,\n roomPlants: readonly string[],\n): number {\n // Longest first: `potted_monstera_02` must win over `potted_monstera_0`.\n const plants = [...roomPlants].sort((a, b) => b.length - a.length);\n\n const wanted: Array<{\n mesh: Mesh;\n to: 'box' | 'lowpoly' | 'billboard';\n group: string;\n }> = [];\n const groups = new Set<string>();\n root.traverse((node) => {\n const mesh = node as Mesh;\n if (!mesh.isMesh) return;\n const hint = plantPart(mesh, plants) ?? bookPart(mesh.name);\n if (!hint) return;\n wanted.push({ mesh, ...hint });\n groups.add(hint.group);\n });\n // A room with more pieces than this is one where the saving is not worth\n // the refusal a bake would raise; it bakes as it stands.\n if (groups.size > ROOM_STAND_INS) return 0;\n for (const { mesh, to, group } of wanted) {\n const existing = (mesh.userData.bakery3 ?? {}) as Record<string, unknown>;\n // A developer who said what they wanted keeps it.\n if (existing.simplify !== undefined) continue;\n mesh.userData.bakery3 = { ...existing, simplify: { to, group } };\n }\n return groups.size;\n}\n\n/** `book.<element>.<bay>.<column>.<color>`: one box per compartment. */\nfunction bookPart(name: string): { to: 'box'; group: string } | null {\n const parts = name.split('.');\n if (parts[0] !== 'book' || parts.length < 4) return null;\n return { to: 'box', group: `room:books/${parts[1]}.${parts[2]}.${parts[3]}` };\n}\n\n/** `<plant preset>_<part>`: the planter reduced, the rest on a card. */\nfunction plantPart(\n mesh: Mesh,\n plants: string[],\n): { to: 'lowpoly' | 'billboard'; group: string } | null {\n const preset = plants.find((presetName) =>\n mesh.name.startsWith(`${presetName}_`),\n );\n if (!preset) return null;\n const part = mesh.name.slice(preset.length + 1).split('.')[0] ?? '';\n // Per PLANT, not per preset: a room may stand the same palm in two\n // corners, and one card across both would be a card across the room.\n const where = `${mesh.parent?.name ?? 'room'}/${preset}`;\n return PLANTER_PARTS.has(part)\n ? { to: 'lowpoly', group: `room:planter/${where}` }\n : { to: 'billboard', group: `room:foliage/${where}` };\n}\n\n/**\n * A stable `bakery3Id` on every mesh of a room, from the room's name and the\n * mesh's own name in it. Returns how many were named.\n *\n * A bake addresses everything by `objectId`, and without a declared one that\n * is the three uuid, minted afresh on every reload: a room baked before a\n * refresh would match nothing after it. None of this geometry is the\n * developer's to name, so the SDK names it. The same stable ids are what let\n * a prebaked room exist: a bundle baked once and served to every page can\n * only find the floor if the floor has the same id in each of them.\n *\n * Called with the room fully built, after the stand has been resolved,\n * because a pedestal the caller chose is a different mesh from the one the\n * GLB shipped. A developer who named something themselves keeps their name.\n */\nexport function stampRoomIds(root: Object3D, name: string): number {\n const seen = new Map<string, number>();\n let named = 0;\n root.traverse((node) => {\n if (!(node as Mesh).isMesh) return;\n if (typeof node.userData.bakery3Id === 'string' && node.userData.bakery3Id)\n return;\n const base = `room:${name}/${node.name || node.type}`;\n const before = seen.get(base) ?? 0;\n seen.set(base, before + 1);\n // A GLB may repeat a name across nodes; the suffix keeps ids unique in\n // the order the tree is walked, which is stable for one file.\n node.userData.bakery3Id = before === 0 ? base : `${base}#${before}`;\n named++;\n });\n return named;\n}\n\n/**\n * GLTFLoader strips `.` from node names and the room names its pieces with\n * dots and underscores, so pieces are matched with neither.\n */\nconst plainName = (object: Object3D) =>\n object.name.toLowerCase().replace(/[._]/g, '');\n\n// ---------------------------------------------------------------------------\n// The developer's own pictures in the room's frames\n// ---------------------------------------------------------------------------\n\n/** An image to hang: a URL the page can fetch, or bytes you already have. */\nexport type PresetRoomPicture = string | Blob;\n\n/** One hung picture, kept on the group so the capture can upload it. */\nexport type PresetRoomPictureAsset = {\n hash: string;\n contentType: string;\n data: ArrayBuffer;\n name: string;\n};\n\n/**\n * Put the developer's images in the room's frames, cropped to fill.\n *\n * Cover, not contain, and the frame never moves. A picture's moulding, its\n * passepartout and the opening they leave were all built to the shape of the\n * image the room was published with, and that is the geometry the browser is\n * already drawing while the developer frames their shot. Resizing the frame\n * to a replacement's shape would make the render disagree with the viewport\n * about where the picture is on the wall. So the opening stays and the image\n * is cropped into it, centred, exactly as `object-fit: cover` fills a box.\n *\n * The bytes are hashed here and carried on the group. A plain render sends\n * none of the room's geometry (the render worker rebuilds it), so the image\n * travels as an ordinary content-addressed asset with its hash in the\n * record, or the render would hang the published picture while the viewport\n * showed the developer's.\n */\nasync function hangPictures(\n instance: Object3D,\n pictures: ReadonlyArray<PresetRoomPicture | null | undefined>,\n roomName: string,\n): Promise<{ hashes: (string | null)[]; assets: PresetRoomPictureAsset[] }> {\n // `picture.<element index>.art`, sorted by that index, which is the order\n // the room hangs them and the order this list fills them.\n const frames: Mesh[] = [];\n instance.traverse((node) => {\n const mesh = node as Mesh;\n if (mesh.isMesh && /^picture\\.\\d+\\.art$/.test(mesh.name)) frames.push(mesh);\n });\n frames.sort(\n (a, b) => Number(a.name.split('.')[1]) - Number(b.name.split('.')[1]),\n );\n\n if (pictures.length > frames.length) {\n throw new Bakery3Error({\n code: 'InvalidRequest',\n message: `${roomName} hangs ${frames.length} picture${frames.length === 1 ? '' : 's'}, and ${pictures.length} were given.`,\n why: \"Pictures fill the room's own frames in order; there is no wall to hang a spare on.\",\n fix: `ROOM_PRESETS['${roomName}'].pictures says how many there are and which walls they are on.`,\n docs: 'https://bakery3.com/docs/presets#pictures',\n });\n }\n\n const hashes: (string | null)[] = [];\n const assets: PresetRoomPictureAsset[] = [];\n for (const [index, picture] of pictures.entries()) {\n if (!picture) {\n hashes.push(null);\n continue;\n }\n const frame = frames[index]!;\n const { hash, data, contentType, texture } = await loadPicture(picture);\n coverFit(texture, frame);\n const material = (\n Array.isArray(frame.material) ? frame.material[0]! : frame.material\n ) as MeshStandardMaterial;\n const replacement = material.clone();\n replacement.map = texture;\n replacement.needsUpdate = true;\n frame.material = replacement;\n hashes.push(hash);\n assets.push({ hash, data, contentType, name: `picture-${index}` });\n }\n return { hashes, assets };\n}\n\nasync function loadPicture(picture: PresetRoomPicture): Promise<{\n hash: string;\n data: ArrayBuffer;\n contentType: string;\n texture: Texture;\n}> {\n let blob: Blob;\n if (typeof picture === 'string') {\n const response = await fetch(picture);\n if (!response.ok) {\n throw new Bakery3Error({\n code: 'InvalidRequest',\n message: `The picture at ${picture} could not be loaded (${response.status} ${response.statusText}).`,\n why: 'The page fetches it, so it has to be reachable from the browser and CORS-readable.',\n fix: 'Serve it from your own origin, or with an Access-Control-Allow-Origin header.',\n docs: 'https://bakery3.com/docs/presets#pictures',\n });\n }\n blob = await response.blob();\n } else {\n blob = picture;\n }\n const data = await blob.arrayBuffer();\n const hash = await sha256(data);\n // No flip. glTF puts uv (0,0) at the image's top-left and GLTFLoader sets\n // `flipY = false` to match; a bitmap decoded in file order is top row\n // first, so the two agree and the published picture and a replacement sit\n // the same way up in the same frame.\n const bitmap = await createImageBitmap(\n new Blob([data], { type: blob.type || 'image/jpeg' }),\n );\n const texture = new Texture(bitmap as unknown as HTMLImageElement);\n texture.flipY = false;\n texture.colorSpace = SRGBColorSpace;\n texture.needsUpdate = true;\n return { hash, data, contentType: blob.type || 'image/jpeg', texture };\n}\n\n/**\n * `object-fit: cover`, as a uv transform: the image fills the opening and\n * the overflow is cropped off both ends of the long axis.\n */\nexport function coverFit(texture: Texture, frame: Mesh): void {\n const image = texture.image as { width: number; height: number };\n if (!image?.width || !image?.height) return;\n if (!frame.geometry.boundingBox) frame.geometry.computeBoundingBox();\n const box = frame.geometry.boundingBox;\n if (!box) return;\n // A picture hangs on a wall, so its height is its Y extent and its width\n // is whichever of X and Z the wall runs along. The quad is built in the\n // room's own coordinates and hangs with no transform of its own.\n const height = box.max.y - box.min.y;\n const width = Math.max(box.max.x - box.min.x, box.max.z - box.min.z);\n if (!(height > 0) || !(width > 0)) return;\n const opening = width / height;\n const picture = image.width / image.height;\n // Fill the opening and crop the overflow off both ends of the long axis.\n // uv' = repeat * uv + offset, and three leaves uvs clamped at the edge.\n if (picture > opening) texture.repeat.set(opening / picture, 1);\n else texture.repeat.set(1, picture / opening);\n texture.offset.set((1 - texture.repeat.x) / 2, (1 - texture.repeat.y) / 2);\n}\n\n/** The default material for shelves and a bookcase carcass. */\nconst SHELF_MATERIAL = 'oak_veneer_05';\n\n/**\n * The preset material a piece was built with, for a piece that arrives\n * without one.\n *\n * A preset material's maps are not embedded in the room GLB (the SDK\n * rebuilds them from the same library the renderer uses), so the exporter\n * clears the slot and writes the name into the node's extras\n * (`bakery3Material`). A mesh with no material at all is a glTF default\n * material: white, rough and fully metallic, which has no diffuse, so it\n * renders near black in the viewport and bakes to a black lightmap. A room\n * published without the name carries nothing here and falls back to the\n * name chain in `createPresetRoom`.\n */\nfunction strippedPreset(\n mesh: Mesh,\n): { material: string; color?: string } | null {\n const name = mesh.userData?.bakery3Material;\n if (typeof name !== 'string' || !name) return null;\n const color = mesh.userData?.bakery3MaterialColor;\n return {\n material: name,\n ...(typeof color === 'string' && color && color.toLowerCase() !== '#ffffff'\n ? { color }\n : {}),\n };\n}\n\n/**\n * The last line against a black surface: a material that is still the glTF\n * default is one nothing above claimed, so it is a stripped preset this\n * version does not know the name of. Left alone it is a black object in the\n * viewport and a black lightmap in a bake; made plain it is at worst the\n * wrong shade of a real surface, which is recoverable and says so.\n */\nfunction coerceDefaultMaterial(mesh: Mesh): void {\n const materials = Array.isArray(mesh.material)\n ? mesh.material\n : [mesh.material];\n for (const material of materials) {\n const standard = material as MeshStandardMaterial;\n if (!standard.isMeshStandardMaterial) continue;\n const bare =\n standard.metalness === 1 &&\n standard.roughness === 1 &&\n !standard.map &&\n standard.color.getHex() === 0xffffff;\n if (!bare) continue;\n standard.metalness = 0;\n standard.roughness = 0.6;\n standard.color.set('#b9b2a6');\n warnBareMaterial(mesh.name);\n }\n}\n\nconst warnedBare = new Set<string>();\nfunction warnBareMaterial(name: string): void {\n if (warnedBare.has(name)) return;\n warnedBare.add(name);\n console.warn(\n `[bakery3] \"${name}\" arrived with no material and has been given a plain one. ` +\n 'Republish the room so it carries the preset material it was built with.',\n );\n}\n\n/**\n * A staged room around the origin: floor at y = 0, north wall at −z. Returns\n * a Group immediately; the stand-in streams in (`userData.ready` resolves\n * when it has). `userData.stand` is where the product goes (the top of the\n * pedestal, in the room's own frame) and `userData.topY` is its height.\n * `userData.exposure` is the `toneMappingExposure` the room was designed\n * under: the render honors whatever the renderer is set to, so a scene that\n * adopts it gets the room as bright as its published pictures, and one that\n * keeps exposure 1 gets a faithful picture about a stop darker.\n *\n * Every choice is remembered on `userData.bakery3Preset.roomPreset`, which is\n * what the capture reads; move or rotate the group freely, the render\n * rebuilds the room at its world matrix.\n */\nexport function createPresetRoom(\n name: RoomPresetName,\n options: PresetRoomOptions = {},\n): PresetRoom {\n const info = ROOM_PRESETS[name];\n if (!info) {\n throw new Error(\n `'${String(name)}' is not a room preset. Known rooms: ${Object.keys(ROOM_PRESETS).join(', ') || 'none'}.`,\n );\n }\n const lighting = options.lighting ?? info.lighting;\n const materialOptions: PresetMaterialOptions = {\n ...(options.baseUrl ? { baseUrl: options.baseUrl } : {}),\n ...options.materialOptions,\n };\n\n // The stand: the room's own unless told otherwise.\n const standType: string | null =\n options.pedestal === undefined ? info.stand.type : options.pedestal;\n if (options.pedestal && !(options.pedestal in PEDESTAL_PRESETS)) {\n throw new Bakery3Error({\n code: 'InvalidRequest',\n message: `\"${String(options.pedestal)}\" is not a pedestal.`,\n fix: `Use one of: ${Object.keys(PEDESTAL_PRESETS).join(', ')}, or null for the floor.`,\n docs: 'https://bakery3.com/docs/presets',\n });\n }\n const standInfo = standType\n ? PEDESTAL_PRESETS[standType as PedestalPresetName]\n : undefined;\n // A room's own stand may be a piece of furniture (a table); it stays as\n // the stand-in has it.\n const standBaked = Boolean(standInfo);\n const standMaterial: string | null =\n !standType || !standBaked\n ? null\n : (options.pedestalMaterial ??\n (options.pedestal === undefined\n ? info.stand.material\n : (standInfo?.defaultMaterial ?? null)));\n const topY = !standType\n ? 0\n : options.pedestal === undefined\n ? info.stand.top\n : standInfo!.size.y;\n\n // The map outside: the published one for this mode, another, or none.\n // A published map that the SDK's catalog no longer lists is treated as\n // none rather than a broken URL.\n const published = ((info as { hdri?: Record<string, unknown> }).hdri?.[\n lighting\n ] ?? null) as {\n name: string;\n rotationDeg: number;\n groundHeight: number;\n } | null;\n const hdriName: HdriPresetName | null =\n options.hdri === false\n ? null\n : (options.hdri ??\n (published && published.name in HDRI_PRESETS\n ? (published.name as HdriPresetName)\n : null));\n const hdriChoice: {\n name: HdriPresetName;\n rotationDeg: number;\n groundHeight: number;\n exposure: number;\n } | null = hdriName\n ? {\n name: hdriName,\n // Turned so its sun sits at the room's, as the render will turn\n // it: the published map's turn is the room's sun minus that\n // map's sun, so another map's turn is the same sum with its own.\n rotationDeg: options.hdri\n ? hdriTurn(hdriName, published, lighting)\n : published!.rotationDeg,\n groundHeight: HDRI_PRESETS[hdriName].groundHeight,\n // Shown at the room's own exposure: what this mode's sky delivers\n // over what the map's does. The render exposes its dome by the same\n // ratio.\n exposure: hdriExposure(\n info.skyIrradiance[lighting],\n HDRI_PRESETS[hdriName].skyIrradiance,\n ),\n }\n : null;\n\n const state: PresetRoomState = {\n name,\n build: info.build,\n lighting,\n ...(options.bake ? { standIn: true } : {}),\n ...(options.hdri === false\n ? { hdri: null }\n : options.hdri\n ? { hdri: options.hdri }\n : {}),\n ...(options.floor || options.walls || options.ceiling || options.sill\n ? {\n surfaces: {\n ...(options.floor ? { floor: surface(options.floor)! } : {}),\n ...(options.walls ? { walls: surface(options.walls)! } : {}),\n ...(options.ceiling ? { ceiling: surface(options.ceiling)! } : {}),\n ...(options.sill ? { sill: { material: options.sill } } : {}),\n },\n }\n : {}),\n ...(options.pedestal === undefined\n ? {}\n : options.pedestal === null\n ? { pedestal: null }\n : {\n pedestal: {\n type: options.pedestal,\n ...(standMaterial ? { material: standMaterial } : {}),\n },\n }),\n };\n\n const room = new Group();\n room.name = `bakery3-room-${name}`;\n room.userData.bakery3Preset = {\n roomPreset: state,\n // For the capture's compatibility note, so it never opens the catalog.\n roomFacts: {\n label: info.label,\n triangles: info.preview.triangles,\n ...(info.complexity ? { objects: info.complexity.objects } : {}),\n },\n };\n room.userData.topY = topY;\n room.userData.stand = new Vector3(info.stand.x, topY, info.stand.z);\n // The exposure the room was designed under: set `renderer.toneMappingExposure`\n // to it and the viewport and the render both show the room as bright as\n // its published comparisons. Left as advice, not applied: the renderer\n // is the developer's, and the manifest carries whatever they set.\n room.userData.exposure = info.exposure[lighting];\n\n // The effective surfaces, for the stand-in's materials.\n const floor = surface(options.floor) ?? info.surfaces.floor;\n const walls = surface(options.walls) ?? info.surfaces.walls;\n const ceiling = surface(options.ceiling) ?? info.surfaces.ceiling;\n const sill = options.sill ?? info.surfaces.sill.material;\n\n const cache = new Map<string, MeshStandardMaterial>();\n const preset = (material: string, color?: string): MeshStandardMaterial => {\n const key = `${material}|${color ?? ''}`;\n let made = cache.get(key);\n if (!made) {\n if (!(material in MATERIAL_PRESETS)) {\n throw new Error(`'${material}' is not a preset material.`);\n }\n made = createPresetMaterial(\n material as MaterialPresetName,\n materialOptions,\n );\n // The walls occlude the preview sun from either side.\n made.shadowSide = DoubleSide;\n if (color && color.toLowerCase() !== '#ffffff') made.color.set(color);\n cache.set(key, made);\n }\n return made;\n };\n const plain = (color: string, roughness = 0.5) =>\n new MeshStandardMaterial({ color, roughness });\n\n const makeDome = (): Promise<Object3D | null> =>\n hdriChoice\n ? loadPresetHdr(hdriChoice.name, options.baseUrl ?? presetBaseUrl()).then(\n (map) => {\n // three's GroundedSkybox: a sphere flattened under the horizon at\n // the map's camera height, lifted by that height so the flat part is\n // the ground at y = 0, the same dome the render builds from the\n // same numbers. Positive Y rotation turns the map counter-clockwise\n // on the compass; `rotationDeg` is clockwise.\n const dome = new GroundedSkybox(\n map,\n hdriChoice.groundHeight,\n DOME_RADIUS,\n );\n dome.name = 'hdri.dome';\n dome.position.y = hdriChoice.groundHeight - GROUND_DROP;\n dome.rotation.y = -MathUtils.degToRad(hdriChoice.rotationDeg);\n dome.castShadow = false;\n dome.receiveShadow = false;\n // The numbers this dome was built from, written down rather than left\n // to be read back off the mesh. A baked embed has to rebuild the same\n // dome from the same map, and `exposure` is the one that cannot be\n // recovered from `material.color`: that carries exposure times the\n // viewport's own renormalization, which is the wrong scale for a\n // scene whose surfaces are carrying full traced irradiance.\n dome.userData.bakery3Dome = {\n name: hdriChoice.name,\n exposure: hdriChoice.exposure,\n rotationDeg: hdriChoice.rotationDeg,\n groundHeight: hdriChoice.groundHeight,\n radius: DOME_RADIUS,\n };\n // The render builds its own dome from the 4k master; the record\n // already says which map. This one is the viewport's.\n dome.userData.bakery3 = { exclude: true };\n checkDomeReachOnce(dome);\n return dome;\n },\n )\n : Promise.resolve(null);\n\n // ---- the stand-in: the published preview, re-dressed and lit for a viewport\n const buildStandIn = (): Promise<Group> =>\n Promise.all([\n loadRoomGlb(presetRoomUrl(name, options.baseUrl)),\n makeDome(),\n ]).then(async ([glb, dome]) => {\n if (dome) room.add(dome);\n const instance = glb.clone();\n const look = MODE_LOOK[lighting];\n const glass = new MeshPhysicalMaterial({\n transmission: 1,\n roughness: 0.05,\n ior: 1.45,\n thickness: 0.01,\n });\n // A fixture's face is the color of its own lamp. A room builds the\n // emissive and the light from one kelvin, so the GLB's own cans say\n // what that is: a 2700 K room glows warm and a 4000 K one glows cool,\n // instead of every room wearing the same amber. (A room with no cans\n // has no glow meshes either; the fallback is only ever a safety net.)\n let glowColor: Color | null = null;\n instance.traverse((node) => {\n const lamp = node as PointLight;\n if (\n !glowColor &&\n (lamp.isPointLight || (node as SpotLight).isSpotLight) &&\n !/^accent\\./.test(node.name)\n ) {\n glowColor = lamp.color.clone();\n }\n });\n // Emissive, at the strength the room designs its cans for, so this one\n // mesh is right in the viewport, right in the trace, and right in a\n // baked embed. (A MeshBasicMaterial would read to the renderer as an\n // emitter at 1.) The renderer drops its own disc when a stand-in ships,\n // so this is the only one in the scene.\n const glow = new MeshStandardMaterial({\n color: 0x000000,\n emissive: glowColor ?? new Color('#ffd9a8'),\n emissiveIntensity: FIXTURE_GLOW_STRENGTH,\n roughness: 1,\n });\n\n instance.traverse((node) => {\n const mesh = node as Mesh;\n if (mesh.isMesh) {\n // The loader cache owns the source geometry; an instance gets its own.\n // A bakeable room ships it, so it is also made plain: the preview is\n // meshopt-quantized (int16 positions, interleaved), and the render\n // worker reads a shipped mesh back by its float positions to carry\n // the unwrap onto the developer's geometry.\n mesh.geometry = options.bake\n ? plainFloatGeometry(mesh.geometry.clone())\n : mesh.geometry.clone();\n mesh.castShadow = true;\n mesh.receiveShadow = true;\n const n = plainName(mesh);\n if (n.startsWith('wall'))\n mesh.material = preset(walls.material, walls.color);\n else if (n.startsWith('floor'))\n mesh.material = preset(floor.material, floor.color);\n else if (n.startsWith('ceiling'))\n mesh.material = preset(ceiling.material, ceiling.color);\n else if (n.startsWith('sill')) mesh.material = preset(sill);\n else if (n.startsWith('glass') || n.startsWith('skylightglass')) {\n mesh.material = glass;\n mesh.castShadow = false;\n // Preview glass never ships: a transmissive pane would stop the\n // sun and the sky at the window in a path tracer that traces no\n // caustics. The renderer keeps its own panes, which let shadow and\n // diffuse rays through, even when the rest of the stand-in ships.\n mesh.userData.bakery3 = {\n ...(mesh.userData.bakery3 ?? {}),\n exclude: true,\n };\n } else if (n.startsWith('fixtureglow')) {\n mesh.material = glow;\n // A light's own face, not a surface light lands on: it ships (a\n // baked room with holes where its downlights are is the bug this\n // replaced) but it is never a bake candidate.\n mesh.userData.bakery3 = {\n ...(mesh.userData.bakery3 ?? {}),\n bake: false,\n };\n } else if (n.startsWith('covestrip')) {\n mesh.material = glow;\n if (n.startsWith('covestripdetail')) {\n // A detail's own light (a pendant's glowing face, the LED behind\n // a backlit panel) is an open surface seen from either side.\n const both = glow.clone();\n both.side = DoubleSide;\n mesh.material = both;\n }\n // The cove's LED channel. Unlike a can's face this one is\n // concealed (a cove is built so the room sees a lit recess and\n // never the diode), so nothing is lost by leaving it out, and the\n // renderer's own strip is the designed one.\n mesh.userData.bakery3 = {\n ...(mesh.userData.bakery3 ?? {}),\n exclude: true,\n };\n } else if (n.startsWith('fixturebezel'))\n mesh.material = plain('#1a1a1c', 0.4);\n else if (\n n.startsWith('frame') ||\n n.startsWith('baseboard') ||\n n.startsWith('skylightcurb') ||\n n.startsWith('coveledge')\n ) {\n mesh.material = plain('#eeeae2', 0.35);\n } else if (n.startsWith('shelf') || n.startsWith('bookcase')) {\n const wore = strippedPreset(mesh);\n mesh.material = preset(\n wore?.material ?? SHELF_MATERIAL,\n wore?.color,\n );\n } else if (n.startsWith('rug')) {\n mesh.material = new MeshPhysicalMaterial({\n color: '#8a7a68',\n roughness: 0.95,\n sheen: 1,\n sheenRoughness: 0.4,\n });\n } else if (n.startsWith('pedestal')) {\n mesh.material = info.stand.material\n ? preset(info.stand.material)\n : plain('#d9d6d0');\n } else {\n // A piece whose preset material was stripped for export says which\n // one it wore, and gets it back. Anything else keeps the material\n // it came with; only the clone is ours.\n const wore = strippedPreset(mesh);\n if (wore) mesh.material = preset(wore.material, wore.color);\n else {\n const materials = Array.isArray(mesh.material)\n ? mesh.material\n : [mesh.material];\n const cloned = materials.map((m) => m.clone());\n mesh.material = Array.isArray(mesh.material)\n ? cloned\n : cloned[0]!;\n coerceDefaultMaterial(mesh);\n }\n }\n }\n });\n\n // The stand. The published one travels in the GLB under a group named\n // 'stand'; a different choice replaces its contents with that pedestal,\n // placed the way the room places it: footprint centered, base on the floor.\n const standGroup = instance.getObjectByName('stand');\n if (standGroup && options.pedestal !== undefined) {\n for (const child of [...standGroup.children]) standGroup.remove(child);\n standGroup.position.set(0, 0, 0);\n standGroup.rotation.set(0, 0, 0);\n if (standType) {\n const object = createPedestal({\n type: standType as PedestalPresetName,\n ...(standMaterial\n ? { material: standMaterial as MaterialPresetName }\n : {}),\n ...(options.baseUrl ? { baseUrl: options.baseUrl } : {}),\n materialOptions,\n });\n object.rotation.y = MathUtils.degToRad(info.stand.rotationDeg);\n object.position.set(info.stand.x, 0, info.stand.z);\n standGroup.add(object);\n }\n } else if (standGroup && standMaterial) {\n // The published baked pedestal, wearing its published material; the\n // GLB carries none (preset materials are stripped before export).\n standGroup.traverse((node) => {\n if ((node as Mesh).isMesh)\n (node as Mesh).material = preset(standMaterial);\n });\n }\n\n // Lights, renormalized for a viewport (see MODE_LOOK), then the whole\n // rig scaled by the room's published preview brightness: a skylit room\n // gets most of its light from bounce the viewport cannot compute, so\n // one fill per mode reads as a cave in one room and a whiteout in the\n // next. The number is published per mode, and the render never sees it.\n const brightness = info.previewBrightness[lighting];\n // The dome at this rig's scale: every lamp is its W/m² times look.sun\n // times the knob, so the map is the same multiple of its radiance and\n // the view through the glass keeps the render's ratio to the sunlit floor.\n if (dome && hdriChoice) {\n ((dome as Mesh).material as MeshBasicMaterial).color.setScalar(\n hdriChoice.exposure * look.sun * brightness,\n );\n }\n const lights: Object3D[] = [];\n instance.traverse((node) => {\n if ((node as DirectionalLight).isLight) lights.push(node);\n });\n // Whatever ships of the stand-in, its lights never do: they are the\n // viewport's renormalized stand-ins for a rig the renderer builds itself.\n for (const light of lights)\n light.userData.bakery3 = {\n ...(light.userData.bakery3 ?? {}),\n exclude: true,\n };\n if (options.lights === false) {\n for (const light of lights) light.parent?.remove(light);\n } else {\n const reach = Math.max(info.size.width, info.size.depth);\n for (const light of lights) {\n if ((light as DirectionalLight).isDirectionalLight) {\n const sun = light as DirectionalLight;\n // A night or overcast room has no sun; the rig in the GLB is the\n // published mode's, so the sun is simply switched off for those.\n sun.visible = lighting === 'day' || lighting === 'golden';\n sun.intensity = 3.5 * look.sun * brightness;\n sun.castShadow = true;\n sun.shadow.mapSize.set(2048, 2048);\n sun.shadow.camera.left = -reach;\n sun.shadow.camera.right = reach;\n sun.shadow.camera.top = reach;\n sun.shadow.camera.bottom = -reach;\n sun.shadow.camera.far = 60;\n sun.shadow.bias = -0.0002;\n sun.shadow.normalBias = 0.02;\n if (sun.target && !sun.target.parent) instance.add(sun.target);\n } else if (\n /^accent\\./.test(light.name) &&\n ((light as PointLight).isPointLight ||\n (light as SpotLight).isSpotLight)\n ) {\n // The accent: the room's one IES spot over the centerpiece, which\n // the GLB can only carry as a bare point light; capped like a can\n // it would flood the room with light the render never has. Swap in\n // a spot where it hangs, aimed the way it was (glTF lights point\n // down local -Z), its beam from its name, its level from the\n // exported candela put back into watts and through the sun's\n // W to viewport scale.\n const lamp = light as PointLight;\n const beam =\n ACCENT_BEAM[\n light.name.split('.')[1] as keyof typeof ACCENT_BEAM\n ] ?? ACCENT_BEAM.narrow;\n const watts = (lamp.intensity * 4 * Math.PI) / 683;\n const spot = new SpotLight(\n lamp.color,\n watts * IES_PEAK_PER_WATT * look.sun * brightness,\n );\n spot.name = light.name;\n spot.angle = MathUtils.degToRad(beam.angleDeg);\n spot.penumbra = beam.penumbra;\n spot.decay = 2;\n spot.distance = 0;\n spot.castShadow = true;\n spot.shadow.mapSize.set(1024, 1024);\n spot.shadow.bias = -0.0002;\n spot.shadow.normalBias = 0.02;\n spot.position.copy(lamp.position);\n spot.target.position\n .copy(lamp.position)\n .add(new Vector3(0, 0, -2).applyQuaternion(lamp.quaternion));\n spot.userData.bakery3 = { exclude: true };\n spot.target.userData.bakery3 = { exclude: true };\n const parent = lamp.parent ?? instance;\n parent.remove(lamp);\n parent.add(spot, spot.target);\n } else if (\n (light as PointLight).isPointLight ||\n (light as SpotLight).isSpotLight\n ) {\n const lamp = light as PointLight;\n const watts = lamp.intensity / CANDELA_PER_WATT / DOWNLIGHT_SCALE;\n lamp.intensity =\n look.point * Math.min(1, watts / CAN_FULL_WATTS) * brightness;\n lamp.decay = 2;\n lamp.distance = 0;\n lamp.castShadow = false;\n }\n }\n const colors = hemisphereFill(look, info.previewFill?.[lighting]);\n const fill = new HemisphereLight(\n colors.sky,\n colors.ground,\n look.hemi * brightness * colors.intensity,\n );\n fill.name = 'fill';\n fill.userData.bakery3 = { exclude: true };\n instance.add(fill);\n }\n\n // The exporter's camera rides along in the GLB; the developer has their own.\n for (const camera of instance.children.filter(\n (c) => (c as PerspectiveCamera).isCamera,\n )) {\n instance.remove(camera);\n }\n room.add(instance);\n\n // The developer's own pictures in the room's frames. Last, because the\n // material chain above has just given every mesh its material and this\n // replaces one of them; and awaited, because `userData.ready` is what\n // the whole page waits on before it frames a shot.\n if (options.pictures?.length) {\n const hung = await hangPictures(instance, options.pictures, name);\n // A list of nothing but nulls changed no frame, so it says nothing in\n // the record either: the record is in the render cache key, and an\n // empty choice must not re-address a render.\n if (hung.hashes.some(Boolean)) {\n state.pictures = hung.hashes;\n room.userData.bakery3Preset = {\n ...(room.userData.bakery3Preset as object),\n roomPreset: state,\n pictureAssets: hung.assets,\n };\n }\n }\n\n if (options.simplify !== false) stampRoomStandIns(instance, info.plants);\n stampRoomIds(room, name);\n room.userData.shown = 'standIn';\n return room;\n });\n\n // ---- the baked room: one GLB with its traced light in it -----------------\n //\n // What the page draws when the room has one (see the `baked` option). The\n // record on the group is the same either way, so a render builds the real\n // room from it; nothing of the baked file is ever captured.\n const buildBaked = async (): Promise<Group> => {\n const base = options.baseUrl ?? presetBaseUrl();\n const url = bakedRoomUrl(name, lighting, base, info.presetsVersion);\n const response = await fetch(`${url}room.json`);\n if (!response.ok) throw new Error(`${url}room.json: ${response.status}`);\n const manifest = (await response.json()) as BakedRoomManifest;\n const [source, probe, standSource] = await Promise.all([\n loadBakedGlb(`${url}${manifest.glb}`, manifest.exposureBakedIn),\n loadRadianceHdr(`${url}${manifest.probe.uri}`),\n info.standGlb\n ? loadRoomGlb(\n `${base.replace(/\\/$/, '')}/v${info.presetsVersion}/${info.standGlb}`,\n )\n : Promise.resolve(null),\n ]);\n const baked = source.clone();\n baked.name = 'baked';\n\n // The stand under the product is a real one: its own geometry and the\n // materials the renderer knows, because a bake re-lights it and a\n // lightmap can only land on a mesh the page holds. The baked file's own\n // stand is a picture of one, and goes.\n const stand = standSource?.clone() ?? null;\n const catchers: Mesh[] = [];\n const doomed: Object3D[] = [];\n let key: DirectionalLight | SpotLight | null = null;\n baked.traverse((node) => {\n // Nothing in the baked file is the scene: a render builds the room\n // from its record, and a bake is told what stands in it.\n node.userData.bakery3 = {\n ...(node.userData.bakery3 ?? {}),\n exclude: true,\n };\n // ...and all of it is the room the renderer will build, which is what\n // a quote measures (capture/complexity.ts).\n node.userData.bakery3RoomShell = true;\n const light = node as DirectionalLight | SpotLight;\n if (light.isLight) key = light;\n const mesh = node as Mesh;\n if (!mesh.isMesh) return;\n mesh.castShadow = false;\n mesh.receiveShadow = false;\n const role = bakedRole(mesh);\n if (role === 'stand' && stand) doomed.push(mesh);\n else if (role === 'floor') catchers.push(mesh);\n });\n for (const mesh of doomed) mesh.parent?.remove(mesh);\n room.add(baked);\n\n if (stand) {\n stand.traverse((node) => {\n const mesh = node as Mesh;\n if (!mesh.isMesh) return;\n // Plain floats: the render worker reads a shipped stand back by its\n // positions, and the preview's are quantized.\n mesh.geometry = plainFloatGeometry(mesh.geometry.clone());\n mesh.castShadow = true;\n mesh.receiveShadow = true;\n if (plainName(mesh).startsWith('pedestal')) {\n mesh.material = info.stand.material\n ? preset(info.stand.material)\n : plain('#d9d6d0');\n return;\n }\n const wore = strippedPreset(mesh);\n if (wore) mesh.material = preset(wore.material, wore.color);\n else {\n const materials = Array.isArray(mesh.material)\n ? mesh.material\n : [mesh.material];\n const cloned = materials.map((m) => m.clone());\n mesh.material = Array.isArray(mesh.material) ? cloned : cloned[0]!;\n coerceDefaultMaterial(mesh);\n }\n });\n for (const camera of stand.children.filter(\n (c) => (c as PerspectiveCamera).isCamera,\n ))\n stand.remove(camera);\n room.add(stand);\n }\n\n // The light on the product: the room's key lamp, as the bake measured it,\n // and the fill the stand-in uses for what the room bounces back. The\n // room's own surfaces carry their light and listen to neither.\n let lamp = key as DirectionalLight | SpotLight | null;\n if (!lamp) {\n // A room with no key lamp on the stand (a day room whose sun lands by\n // the window) still has to put the product ON the floor. A lamp from\n // straight above that gives no light and casts a shadow: contact, and\n // nothing else.\n const overhead = new DirectionalLight(0xffffff, 1e-4);\n overhead.name = 'contact';\n overhead.position.set(info.stand.x + 0.4, topY + 6, info.stand.z + 0.3);\n overhead.target.position.set(info.stand.x, topY, info.stand.z);\n overhead.userData.bakery3 = { exclude: true };\n overhead.target.userData.bakery3 = { exclude: true };\n overhead.shadow.radius = 6;\n baked.add(overhead, overhead.target);\n lamp = overhead;\n }\n if (lamp) {\n lamp.castShadow = true;\n lamp.shadow.mapSize.set(1024, 1024);\n lamp.shadow.bias = -0.0002;\n lamp.shadow.normalBias = 0.02;\n if ((lamp as DirectionalLight).isDirectionalLight) {\n const camera = (lamp as DirectionalLight).shadow.camera;\n camera.left = camera.bottom = -BAKED_SHADOW_REACH;\n camera.right = camera.top = BAKED_SHADOW_REACH;\n camera.far = 20;\n }\n if (lamp.target && !lamp.target.parent) baked.add(lamp.target);\n // The product's shadow on the floor: the floor again, a hair nearer,\n // in three's own shadow material. The stand takes it as any lit mesh.\n const shadow = new ShadowMaterial({\n opacity: 0.45,\n depthWrite: false,\n polygonOffset: true,\n polygonOffsetFactor: -2,\n polygonOffsetUnits: -2,\n });\n for (const mesh of catchers) {\n const catcher = new Mesh(mesh.geometry, shadow);\n catcher.name = `${mesh.name}.shadow`;\n catcher.receiveShadow = true;\n catcher.renderOrder = 1;\n catcher.userData.bakery3 = { exclude: true };\n mesh.add(catcher);\n }\n }\n probe.mapping = EquirectangularReflectionMapping;\n scaleHalfFloats(\n probe.image.data as Uint16Array,\n 1 / manifest.exposureBakedIn,\n );\n probe.needsUpdate = true;\n // What the room throws back at the product, from every side: the bake's\n // own probe, traced from where the product stands, as a light. Without\n // it a product in the shade of a day room is lit by nothing, because the\n // key lamp is the sun and the sun is on the floor by the window. It\n // lights the diffuse; `userData.environment` is the same probe for a\n // scene that also wants it in its reflections.\n const ambient = new LightProbe(\n irradianceOf(\n probe.image.data as Uint16Array,\n probe.image.width,\n probe.image.height,\n ),\n );\n ambient.name = 'fill';\n ambient.userData.bakery3 = { exclude: true };\n room.add(ambient);\n room.userData.environment = probe;\n room.userData.bakedManifest = manifest;\n\n stampRoomIds(room, name);\n room.userData.bakery3Preset = {\n ...(room.userData.bakery3Preset as object),\n shown: 'baked',\n };\n room.userData.shown = 'baked';\n return room;\n };\n\n // Baked when the room has one for this light and is as published; the\n // stand-in otherwise, and whenever the baked file does not arrive.\n const asPublished =\n options.floor === undefined &&\n options.walls === undefined &&\n options.ceiling === undefined &&\n options.sill === undefined &&\n options.pedestal === undefined &&\n options.pedestalMaterial === undefined &&\n options.hdri === undefined &&\n !options.pictures?.some(Boolean) &&\n !options.bake &&\n options.lights !== false;\n const wantsBaked =\n options.baked !== false &&\n asPublished &&\n (info.baked as readonly string[]).includes(lighting);\n room.userData.ready = wantsBaked\n ? buildBaked().catch((error: unknown) => {\n if (typeof console !== 'undefined') {\n console.warn(\n `[bakery3] The baked version of ${name} (${lighting}) could not be loaded, so the room is shown as its stand-in: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n for (const child of [...room.children]) room.remove(child);\n return buildStandIn();\n })\n : buildStandIn();\n\n // The room's own traced light, from the library, once the stand-in is in.\n // Not part of `ready`: a page frames its shot without waiting on tens of\n // megabytes of lightmaps. A stand in another finish is another stand, so\n // that is a change the record does not show and this has to check itself.\n room.userData.prebaked =\n options.prebaked === false || options.pedestalMaterial\n ? Promise.resolve(null)\n : (room.userData.ready as Promise<Group>).then(\n () =>\n // A baked room carries its light already.\n room.userData.shown === 'baked'\n ? null\n : applyRoomPrebake(\n room,\n state,\n options.baseUrl ?? presetBaseUrl(),\n info.presetsVersion,\n ),\n () => null,\n );\n\n return room as PresetRoom;\n}\n\n/**\n * The room's sky over the map's, luminance only, so a map keeps its color\n * and gains the room's brightness. 1 for a map never measured.\n */\nfunction hdriExposure(roomSky: number, mapSky: number): number {\n if (!(mapSky > 0) || !(roomSky > 0)) return 1;\n return Math.round((roomSky / mapSky) * 1000) / 1000;\n}\n\n/**\n * The dome's sky is a sphere DOME_RADIUS out, well past the near ground, so\n * a camera whose `far` stops short of it draws the grass through the window\n * and clips everything above the horizon to black, with nothing in the\n * console to say why. Checked once, on the dome's first draw, after which\n * the hook removes itself and three's no-op shows through again.\n */\nfunction checkDomeReachOnce(dome: Object3D): void {\n dome.onBeforeRender = (_renderer, _scene, camera: Camera) => {\n delete (dome as Partial<Pick<Object3D, 'onBeforeRender'>>).onBeforeRender;\n const far = (camera as { far?: number }).far;\n if (typeof far !== 'number') return;\n const reach =\n DOME_RADIUS * dome.matrixWorld.getMaxScaleOnAxis() +\n camera\n .getWorldPosition(new Vector3())\n .distanceTo(dome.getWorldPosition(new Vector3()));\n if (far >= reach || typeof console === 'undefined') return;\n console.warn(\n [\n `[bakery3] The map outside this preset room hangs on a dome ${Math.round(reach)} m from the camera, but camera.far is ${far}:`,\n 'the sky through the windows is clipped to black. Set camera.far to 100 or more (then',\n 'camera.updateProjectionMatrix()), or pass hdri: false to createPresetRoom() for no map outside.',\n 'https://bakery3.com/docs/presets#room-presets',\n ].join('\\n'),\n );\n };\n}\n\n/**\n * The clockwise turn another map needs to put its sun where the room's is.\n * The published turn is `room sun − published map's sun`; the catalog does\n * not carry the maps' suns, so the render worker's rule is followed instead:\n * an unmeasured or non-daylit map is not turned, and a daylit one is turned\n * to the room's sun. Without the published map to read the room's sun from,\n * the map stays as shot; the render, which knows every map's sun, still\n * aims it.\n */\nfunction hdriTurn(\n name: HdriPresetName,\n published: { name: string; rotationDeg: number } | null,\n lighting: RoomPresetLighting,\n): number {\n const category = HDRI_PRESETS[name].category;\n if (category !== 'day' && category !== 'golden') return 0;\n if (\n published &&\n HDRI_PRESETS[published.name as HdriPresetName]?.category === category\n )\n return published.rotationDeg;\n return lighting === 'day' || lighting === 'golden'\n ? (published?.rotationDeg ?? 0)\n : 0;\n}\n\n/**\n * The same geometry with every attribute a dense Float32 array. A meshopt\n * preview arrives with normalized int16 positions and normals in one\n * interleaved buffer; three draws that fine, but it is not what a mesh the\n * developer wrote looks like, and the render worker matches a shipped mesh\n * back to the browser's by its float positions. Reading through the\n * attribute's own accessors applies the normalization, so the values are\n * the ones three uses.\n */\nexport function plainFloatGeometry(geometry: BufferGeometry): BufferGeometry {\n for (const name of Object.keys(geometry.attributes)) {\n const attribute = geometry.getAttribute(name);\n const plain =\n (attribute as { isInterleavedBufferAttribute?: boolean })\n .isInterleavedBufferAttribute === undefined &&\n attribute.array instanceof Float32Array &&\n !attribute.normalized;\n if (plain) continue;\n const size = attribute.itemSize;\n const out = new Float32Array(attribute.count * size);\n const get = [\n attribute.getX,\n attribute.getY,\n attribute.getZ,\n attribute.getW,\n ] as Array<(i: number) => number>;\n for (let i = 0; i < attribute.count; i++) {\n for (let c = 0; c < size; c++)\n out[i * size + c] = get[c]!.call(attribute, i);\n }\n geometry.setAttribute(name, new Float32BufferAttribute(out, size));\n }\n return geometry;\n}\n\nexport {\n findPresetRooms,\n roomPresetFactsOf,\n roomPresetSpecOf,\n} from './roomState.js';\n\n/** A room's camera: a 36 mm horizontal sensor, so the vertical FOV follows the aspect. */\nexport function roomLensFovDeg(lensMm: number, aspect: number): number {\n const sensorV = aspect >= 1 ? 36 / aspect : 36;\n return MathUtils.radToDeg(2 * Math.atan(sensorV / (2 * lensMm)));\n}\n\n/**\n * Put `camera` where the room was published from (its own framing, aimed at\n * the stand), in world space, wherever the group sits.\n */\nexport function applyPresetRoomCamera(\n camera: PerspectiveCamera,\n room: Object3D,\n): void {\n const state = roomPresetSpecOf(room);\n if (!state)\n throw new Error(\n 'applyPresetRoomCamera needs a group made by createPresetRoom().',\n );\n const info = ROOM_PRESETS[state.name as RoomPresetName];\n const world = new Matrix4().fromArray(state.matrix);\n const position = new Vector3(...info.camera.position).applyMatrix4(world);\n const target = new Vector3(...info.camera.target).applyMatrix4(world);\n camera.position.copy(position);\n camera.lookAt(target);\n camera.fov = roomLensFovDeg(info.camera.lensMm, camera.aspect || 1);\n camera.updateProjectionMatrix();\n}\n\n/** The room's footprint in its own frame: handy for clamping an orbit inside it. */\nexport function presetRoomBounds(name: RoomPresetName): Box3 {\n const { width, height, depth } = ROOM_PRESETS[name].size;\n return new Box3(\n new Vector3(-width / 2, 0, -depth / 2),\n new Vector3(width / 2, height, depth / 2),\n );\n}\n"]}