@oeave/bakery3 0.2.0 → 0.3.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 (46) hide show
  1. package/dist/bake/index.js +3 -3
  2. package/dist/catalog/index.js +1 -1
  3. package/dist/{chunk-KNUAOILG.js → chunk-3T3FJOSD.js} +4 -4
  4. package/dist/{chunk-KNUAOILG.js.map → chunk-3T3FJOSD.js.map} +1 -1
  5. package/dist/{chunk-6FYI6AJM.js → chunk-6FAMQZXB.js} +7 -7
  6. package/dist/{chunk-6FYI6AJM.js.map → chunk-6FAMQZXB.js.map} +1 -1
  7. package/dist/{chunk-QRCT5UGZ.js → chunk-CSSJRP5W.js} +9 -6
  8. package/dist/chunk-CSSJRP5W.js.map +1 -0
  9. package/dist/{chunk-APWUCEEB.js → chunk-EN4ROBYQ.js} +3 -3
  10. package/dist/{chunk-APWUCEEB.js.map → chunk-EN4ROBYQ.js.map} +1 -1
  11. package/dist/{chunk-JFYUDERE.js → chunk-NEK5TBEH.js} +2 -2
  12. package/dist/chunk-NEK5TBEH.js.map +1 -0
  13. package/dist/chunk-OPM2L63B.js +253 -0
  14. package/dist/chunk-OPM2L63B.js.map +1 -0
  15. package/dist/{chunk-UWBP7B54.js → chunk-R5IUPOWI.js} +3 -3
  16. package/dist/{chunk-UWBP7B54.js.map → chunk-R5IUPOWI.js.map} +1 -1
  17. package/dist/{chunk-HNMSWQU7.js → chunk-STRK4SZN.js} +3 -3
  18. package/dist/{chunk-HNMSWQU7.js.map → chunk-STRK4SZN.js.map} +1 -1
  19. package/dist/{chunk-Z7IYVH22.js → chunk-WLEFNUOH.js} +30 -279
  20. package/dist/chunk-WLEFNUOH.js.map +1 -0
  21. package/dist/{chunk-NXBAZGNB.js → chunk-X6GW43EX.js} +3 -3
  22. package/dist/{chunk-NXBAZGNB.js.map → chunk-X6GW43EX.js.map} +1 -1
  23. package/dist/devtools/index.js +7 -6
  24. package/dist/hotspots/index.d.ts +237 -31
  25. package/dist/hotspots/index.js +1013 -118
  26. package/dist/hotspots/index.js.map +1 -1
  27. package/dist/index.d.ts +1 -1
  28. package/dist/index.js +7 -6
  29. package/dist/node/index.cjs +1 -1
  30. package/dist/node/index.cjs.map +1 -1
  31. package/dist/node/index.js +2 -2
  32. package/dist/presets/index.js +2 -2
  33. package/dist/r3f/index.js +9 -8
  34. package/dist/r3f/index.js.map +1 -1
  35. package/dist/{room-FS26KAPQ.js → room-BM7Z7NKG.js} +4 -4
  36. package/dist/{room-FS26KAPQ.js.map → room-BM7Z7NKG.js.map} +1 -1
  37. package/dist/session-NPVBESWA.js +9 -0
  38. package/dist/{session-VCIQEO26.js.map → session-NPVBESWA.js.map} +1 -1
  39. package/dist/tsl/index.d.ts +14 -1
  40. package/dist/tsl/index.js +8 -2
  41. package/dist/tsl/index.js.map +1 -1
  42. package/package.json +1 -1
  43. package/dist/chunk-JFYUDERE.js.map +0 -1
  44. package/dist/chunk-QRCT5UGZ.js.map +0 -1
  45. package/dist/chunk-Z7IYVH22.js.map +0 -1
  46. package/dist/session-VCIQEO26.js +0 -9
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/timeline/easing.ts","../src/timeline/orbit.ts","../src/timeline/properties.ts","../src/protocol/animation.ts","../src/protocol/shader.ts","../src/protocol/complexity.ts","../src/capture/ambient.ts","../src/timeline/bake.ts","../src/timeline/timeline.ts","../src/timeline/adapters.ts","../src/shader/extract.ts","../src/capture/materials.ts","../src/compat/analyze.ts","../src/capture/complexity.ts","../src/capture/color.ts","../src/capture/shaders.ts","../src/capture/room.ts","../src/capture/capture.ts","../src/capture/output.ts","../src/capture/stats.ts","../src/bake/room.ts","../src/bake/prepare.ts"],"names":["s","normalize","color","track","describe","sample","scalar","standIn","copy","DOCS","record","Matrix4","Vector3","pathOf","blob","ambient","isUnder"],"mappings":"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","file":"chunk-Z7IYVH22.js","sourcesContent":["/**\n * Easing, in one implementation.\n *\n * The named easings are the CSS cubic-bezier control points, not hand-rolled\n * polynomials, so `'ease-in-out'` here means what it means in every stylesheet\n * and in gsap: a motion tuned in CSS comes back from the render as the same\n * curve.\n *\n * This is also the only place easing exists. The renderer never sees a curve:\n * the SDK samples the timeline at every output frame and ships the numbers,\n * which is what keeps the browser preview and the rendered frame agreeing on\n * where things are.\n */\n\n/** A CSS easing: one of the four names, or the four control points of a\n * cubic-bezier, `[x1, y1, x2, y2]`, exactly as a stylesheet writes them. */\nexport type Easing =\n | 'linear'\n | 'ease-in'\n | 'ease-out'\n | 'ease-in-out'\n | [number, number, number, number];\n\nconst NAMED: Record<string, [number, number, number, number]> = {\n 'ease-in': [0.42, 0, 1, 1],\n 'ease-out': [0, 0, 0.58, 1],\n 'ease-in-out': [0.42, 0, 0.58, 1],\n};\n\n/**\n * `t` in, eased `t` out. Both in 0–1.\n *\n * Out-of-range input is clamped rather than extrapolated: a bezier evaluated\n * past its endpoints is not a curve anybody asked for, and the caller only\n * ever produces out-of-range values through floating-point drift at a segment\n * boundary.\n */\nexport function ease(easing: Easing | undefined, t: number): number {\n const clamped = t <= 0 ? 0 : t >= 1 ? 1 : t;\n if (!easing || easing === 'linear') return clamped;\n const points = Array.isArray(easing) ? easing : NAMED[easing];\n if (!points) return clamped;\n return cubicBezier(points[0], points[1], points[2], points[3], clamped);\n}\n\n/**\n * The y of a CSS-style cubic bezier at a given x.\n *\n * The curve is parameterized by its own `s`, not by x, so finding y(x) means\n * solving x(s) = t first. Newton converges in three or four steps over almost\n * the whole domain; the bisection fallback exists for the flat regions of a\n * curve like [0, 0, 1, 1] where the derivative is near zero and Newton walks\n * off. Both are cheap: this runs once per track per frame, a few thousand\n * times for a whole bake.\n */\nfunction cubicBezier(\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n t: number,\n): number {\n if (x1 === y1 && x2 === y2) return t; // The identity curve; skip the solve.\n const s = solveForX(x1, x2, t);\n return bezier(y1, y2, s);\n}\n\nfunction bezier(a: number, b: number, s: number): number {\n const inv = 1 - s;\n return 3 * inv * inv * s * a + 3 * inv * s * s * b + s * s * s;\n}\n\nfunction slope(a: number, b: number, s: number): number {\n const inv = 1 - s;\n return 3 * inv * inv * a + 6 * inv * s * (b - a) + 3 * s * s * (1 - b);\n}\n\nfunction solveForX(x1: number, x2: number, target: number): number {\n let s = target;\n for (let i = 0; i < 8; i++) {\n const error = bezier(x1, x2, s) - target;\n if (Math.abs(error) < 1e-6) return s;\n const derivative = slope(x1, x2, s);\n if (Math.abs(derivative) < 1e-6) break;\n s -= error / derivative;\n }\n\n let low = 0;\n let high = 1;\n s = target;\n for (let i = 0; i < 24; i++) {\n const x = bezier(x1, x2, s);\n if (Math.abs(x - target) < 1e-6) return s;\n if (x > target) high = s;\n else low = s;\n s = (low + high) / 2;\n }\n return s;\n}\n","/**\n * Orbits, and the lookAt → quaternion conversion the wire format needs.\n *\n * A camera move between two points has two honest answers and they look\n * nothing alike. Lerping the positions drives the camera through the middle\n * of the product; interpolating in spherical coordinates around the thing\n * being looked at swings around it at a constant distance. The second one is\n * what everybody means by \"orbit the camera 90°\", so it is a first-class path\n * type rather than something you have to build out of forty keyframes.\n *\n * Angles here are in radians and are not wrapped. An orbit of +370° is a full\n * turn plus ten degrees, not minus ten: wrapping it into ±180° would silently\n * reverse a turntable.\n */\n\nexport type Vec3 = [number, number, number];\n/** glTF order (x, y, z, w), matching the protocol's `Quat` and three's own\n * `Quaternion.toArray()`. Nothing on this side of the wire reorders. */\nexport type Quat = [number, number, number, number];\n\n/**\n * A camera position as an offset from what it is looking at.\n *\n * `yaw` is measured about +Y from the +Z axis toward +X, matching three's\n * default camera-behind-the-scene framing, so `orbitY: +90` moves a camera at\n * `(0, 0, 5)` round to `(5, 0, 0)`. `pitch` is elevation above the XZ plane.\n */\nexport type Spherical = { radius: number; yaw: number; pitch: number };\n\n/** A world position as an orbit about `center`. A camera sitting exactly on\n * the center has no direction to report, so it reads as a zero radius rather\n * than as a NaN that would poison every frame after it. */\nexport function toSpherical(position: Vec3, center: Vec3): Spherical {\n const dx = position[0] - center[0];\n const dy = position[1] - center[1];\n const dz = position[2] - center[2];\n const radius = Math.hypot(dx, dy, dz);\n if (radius < 1e-9) return { radius: 0, yaw: 0, pitch: 0 };\n return {\n radius,\n yaw: Math.atan2(dx, dz),\n // Clamped before asin: a normalized component can land at 1.0000000002.\n pitch: Math.asin(Math.max(-1, Math.min(1, dy / radius))),\n };\n}\n\n/** The inverse of `toSpherical`: an orbit back to a world position. */\nexport function fromSpherical(spherical: Spherical, center: Vec3): Vec3 {\n const { radius, yaw, pitch } = spherical;\n const horizontal = radius * Math.cos(pitch);\n return [\n center[0] + horizontal * Math.sin(yaw),\n center[1] + radius * Math.sin(pitch),\n center[2] + horizontal * Math.cos(yaw),\n ];\n}\n\n/**\n * Interpolate an orbit, in spherical space.\n *\n * `to.yaw` is taken literally rather than shortest-path for the reason in the\n * file header: the caller already decided which way round and how far, when\n * they wrote `orbitY: -270`.\n */\nexport function orbitAt(\n from: Spherical,\n to: Spherical,\n center: Vec3,\n t: number,\n): Vec3 {\n return fromSpherical(\n {\n radius: from.radius + (to.radius - from.radius) * t,\n yaw: from.yaw + (to.yaw - from.yaw) * t,\n pitch: from.pitch + (to.pitch - from.pitch) * t,\n },\n center,\n );\n}\n\n/**\n * The rotation a camera at `eye` needs to look at `target`.\n *\n * This is three's `Object3D.lookAt` for a camera, written out: the camera\n * looks down its local -Z, so the basis' z axis is `eye - target`. It is\n * duplicated here rather than called on the live camera because `bake()` must\n * work for a camera that is not attached to anything, must not disturb the\n * live one, and must produce the same answer in a unit test with no three at\n * all.\n *\n * The degenerate case (looking straight up or straight down, where `up` and\n * `z` are parallel and the cross product collapses) is nudged exactly the way\n * three nudges it. Without that, a top-down turntable frame comes out with a\n * random roll and the product spins in the render.\n */\nexport function lookAtQuaternion(\n eye: Vec3,\n target: Vec3,\n up: Vec3 = [0, 1, 0],\n): Quat {\n let z = normalize([\n eye[0] - target[0],\n eye[1] - target[1],\n eye[2] - target[2],\n ]);\n if (lengthOf(z) === 0) z = [0, 0, 1];\n\n let x = cross(up, z);\n if (lengthOf(x) === 0) {\n if (Math.abs(up[2]) === 1) z[0] += 1e-4;\n else z[2] += 1e-4;\n z = normalize(z);\n x = cross(up, z);\n }\n x = normalize(x);\n const y = cross(z, x);\n\n return matrixToQuaternion(x, y, z);\n}\n\n/** A rotation basis as a quaternion, columns given as three axes. */\nfunction matrixToQuaternion(x: Vec3, y: Vec3, z: Vec3): Quat {\n const m00 = x[0];\n const m10 = x[1];\n const m20 = x[2];\n const m01 = y[0];\n const m11 = y[1];\n const m21 = y[2];\n const m02 = z[0];\n const m12 = z[1];\n const m22 = z[2];\n\n const trace = m00 + m11 + m22;\n if (trace > 0) {\n const s = 0.5 / Math.sqrt(trace + 1);\n return [(m21 - m12) * s, (m02 - m20) * s, (m10 - m01) * s, 0.25 / s];\n }\n if (m00 > m11 && m00 > m22) {\n const s = 2 * Math.sqrt(1 + m00 - m11 - m22);\n return [0.25 * s, (m01 + m10) / s, (m02 + m20) / s, (m21 - m12) / s];\n }\n if (m11 > m22) {\n const s = 2 * Math.sqrt(1 + m11 - m00 - m22);\n return [(m01 + m10) / s, 0.25 * s, (m12 + m21) / s, (m02 - m20) / s];\n }\n const s = 2 * Math.sqrt(1 + m22 - m00 - m11);\n return [(m02 + m20) / s, (m12 + m21) / s, 0.25 * s, (m10 - m01) / s];\n}\n\n/**\n * XYZ euler (radians) as a quaternion, three's order.\n *\n * Object rotation is authored as an euler because that is what you read off\n * `mesh.rotation`, and shipped as a quaternion because that is what the\n * manifest and the renderer both take: one conversion, here, rather than a\n * second euler-order convention on the other side.\n */\nexport function eulerToQuaternion(euler: Vec3): Quat {\n const [x, y, z] = euler;\n const c1 = Math.cos(x / 2);\n const c2 = Math.cos(y / 2);\n const c3 = Math.cos(z / 2);\n const s1 = Math.sin(x / 2);\n const s2 = Math.sin(y / 2);\n const s3 = Math.sin(z / 2);\n return [\n s1 * c2 * c3 + c1 * s2 * s3,\n c1 * s2 * c3 - s1 * c2 * s3,\n c1 * c2 * s3 + s1 * s2 * c3,\n c1 * c2 * c3 - s1 * s2 * s3,\n ];\n}\n\nfunction cross(a: Vec3, b: Vec3): Vec3 {\n return [\n a[1] * b[2] - a[2] * b[1],\n a[2] * b[0] - a[0] * b[2],\n a[0] * b[1] - a[1] * b[0],\n ];\n}\n\nfunction lengthOf(v: Vec3): number {\n return Math.hypot(v[0], v[1], v[2]);\n}\n\nfunction normalize(v: Vec3): Vec3 {\n const length = lengthOf(v);\n return length === 0\n ? [0, 0, 0]\n : [v[0] / length, v[1] / length, v[2] / length];\n}\n","/**\n * What can be animated, how to read it off the live object, and how to put it\n * back.\n *\n * One table, because three consumers must agree exactly: the panel (which\n * offers a list), `seek()` (which drives the live three scene, so the browser\n * is the preview) and `bake()` (which writes the numbers the renderer plays).\n * A property that reads differently from how it writes is a preview that lies\n * about the render.\n *\n * Everything is duck-typed rather than `instanceof Mesh`. three is a peer\n * dependency with no runtime import here, and duck typing is what three does\n * internally anyway, so this keeps working across a version that adds a type.\n */\n\nimport type { Camera, Object3D } from 'three';\n\n/** Values are always arrays, scalars included. One interpolation path, one\n * storage shape, and `size` is then simply `value.length`. */\nexport type PropertyValue = number[];\n\ntype AnyMaterial = {\n color?: RGB;\n emissive?: RGB;\n emissiveIntensity?: number;\n roughness?: number;\n metalness?: number;\n opacity?: number;\n transparent?: boolean;\n needsUpdate?: boolean;\n};\n\ntype RGB = {\n r: number;\n g: number;\n b: number;\n setRGB?(r: number, g: number, b: number): void;\n};\n\ntype AnyObject = Object3D & {\n isMesh?: boolean;\n isLight?: boolean;\n material?: AnyMaterial | AnyMaterial[];\n intensity?: number;\n color?: RGB;\n};\n\ntype AnyCamera = Camera & {\n isPerspectiveCamera?: boolean;\n fov?: number;\n updateProjectionMatrix?(): void;\n};\n\n/** One animatable property: how big it is, how to read it, how to write it,\n * and what it becomes on the wire. */\nexport type PropertyDefinition = {\n size: number;\n /** The live value, or undefined when this object does not have the\n * property (a mesh has no `intensity`, a light has no `roughness`). */\n read(object: Object3D): PropertyValue | undefined;\n /** Drive the live object. This is the browser preview. */\n write(object: Object3D, value: PropertyValue): void;\n /**\n * The channel this property becomes on the wire, when that differs.\n * `rotation` is authored as an euler because that is what you read off\n * `mesh.rotation`, and travels as a quaternion because that is what the\n * manifest and the renderer both speak.\n */\n channel?: string;\n /** Linear-RGB, so `bake()` knows not to touch it and the panel can show a\n * color swatch. */\n color?: boolean;\n /**\n * Whether this object has the property at all, when only some kinds do.\n * `track()` refuses the rest at the line that asked, rather than leaving\n * the renderer to refuse the clip.\n */\n appliesTo?(object: Object3D): boolean;\n};\n\ntype AimedLight = Object3D & {\n isDirectionalLight?: boolean;\n isSpotLight?: boolean;\n target?: Object3D;\n};\n\ntype HemisphereLike = Object3D & {\n isHemisphereLight?: boolean;\n groundColor?: RGB;\n};\n\nfunction hemisphereOf(object: Object3D): HemisphereLike | undefined {\n const light = object as HemisphereLike;\n return light.isHemisphereLight ? light : undefined;\n}\n\ntype SceneLike = Object3D & {\n isScene?: boolean;\n environmentIntensity?: number;\n environmentRotation?: {\n x: number;\n y: number;\n z: number;\n set(x: number, y: number, z: number): unknown;\n };\n};\n\n/** The Scene, whose environment a track on it drives. */\nfunction sceneOf(object: Object3D): SceneLike | undefined {\n const scene = object as SceneLike;\n return scene.isScene ? scene : undefined;\n}\n\n/** A directional or spot light: the two three aims at `light.target`. */\nfunction aimedLight(object: Object3D): AimedLight | undefined {\n const light = object as AimedLight;\n return (light.isDirectionalLight || light.isSpotLight) && light.target\n ? light\n : undefined;\n}\n\n/** The material the animation drives: slot zero. A multi-material mesh is\n * usually several visually distinct parts, and guessing which one \"the\n * color\" meant would be worse than asking for the child to be targeted. */\nfunction materialOf(object: Object3D): AnyMaterial | undefined {\n const material = (object as AnyObject).material;\n if (!material) return undefined;\n return Array.isArray(material) ? material[0] : material;\n}\n\nfunction readVector(\n v: { x: number; y: number; z: number } | undefined,\n): PropertyValue | undefined {\n return v ? [v.x, v.y, v.z] : undefined;\n}\n\nfunction scalar(\n get: (material: AnyMaterial) => number | undefined,\n set: (material: AnyMaterial, value: number) => void,\n): PropertyDefinition {\n return {\n size: 1,\n read(object) {\n const material = materialOf(object);\n const value = material ? get(material) : undefined;\n return typeof value === 'number' ? [value] : undefined;\n },\n write(object, value) {\n const material = materialOf(object);\n if (material) set(material, value[0]!);\n },\n };\n}\n\nfunction colorProperty(\n pick: (object: Object3D) => RGB | undefined,\n): PropertyDefinition {\n return {\n size: 3,\n color: true,\n read(object) {\n const target = pick(object);\n // three keeps Color components in its linear working space, which is\n // exactly what the channel wants: no conversion, and no round trip\n // through 8-bit hex at every one of three hundred frames.\n return target ? [target.r, target.g, target.b] : undefined;\n },\n write(object, value) {\n const target = pick(object);\n if (!target) return;\n if (target.setRGB) target.setRGB(value[0]!, value[1]!, value[2]!);\n else Object.assign(target, { r: value[0], g: value[1], b: value[2] });\n },\n };\n}\n\n/**\n * Everything animatable on an object, and nothing else.\n *\n * This list is the answer to \"what can I animate\": the panel builds its\n * picker from it, and `track()` refuses anything absent from it by name. It is\n * the intersection of what three exposes and what the renderer can reproduce.\n * Offering `wireframe` here would mean authoring a motion the render cannot\n * show, which is the silent approximation the SDK refuses everywhere else.\n */\nexport const OBJECT_PROPERTIES: Record<string, PropertyDefinition> = {\n position: {\n size: 3,\n read: (object) => readVector(object.position),\n write: (object, value) =>\n object.position.set(value[0]!, value[1]!, value[2]!),\n },\n rotation: {\n size: 3,\n channel: 'quaternion',\n read: (object) =>\n readVector(\n object.rotation as unknown as { x: number; y: number; z: number },\n ),\n write: (object, value) =>\n object.rotation.set(value[0]!, value[1]!, value[2]!),\n },\n scale: {\n size: 3,\n read: (object) => readVector(object.scale),\n write: (object, value) => object.scale.set(value[0]!, value[1]!, value[2]!),\n },\n // A light's own color (the worker drives the lamp, or for an ambient or\n // hemisphere light the dome), and a mesh's material's.\n color: colorProperty((object) =>\n (object as AnyObject).isLight\n ? (object as AnyObject).color\n : materialOf(object)?.color,\n ),\n emissive: colorProperty((object) => materialOf(object)?.emissive),\n emissiveIntensity: scalar(\n (material) => material.emissiveIntensity,\n (material, value) => {\n material.emissiveIntensity = value;\n },\n ),\n roughness: scalar(\n (material) => material.roughness,\n (material, value) => {\n material.roughness = value;\n },\n ),\n metalness: scalar(\n (material) => material.metalness,\n (material, value) => {\n material.metalness = value;\n },\n ),\n opacity: scalar(\n (material) => material.opacity,\n (material, value) => {\n material.opacity = value;\n // Without this the browser shows no change at all while the render\n // fades, and a preview that disagrees with the render is worse than a\n // flag you did not set yourself. It is only ever turned on, and only for\n // a material that is explicitly animated.\n if (value < 1 && !material.transparent) {\n material.transparent = true;\n material.needsUpdate = true;\n }\n },\n ),\n intensity: {\n size: 1,\n read(object) {\n const light = object as AnyObject;\n return light.isLight && typeof light.intensity === 'number'\n ? [light.intensity]\n : undefined;\n },\n write(object, value) {\n const light = object as AnyObject;\n if (light.isLight) light.intensity = value[0]!;\n },\n },\n /** A HemisphereLight's color from below. Its `color` is the sky. */\n groundColor: {\n ...colorProperty((object) => hemisphereOf(object)?.groundColor),\n appliesTo: (object) => hemisphereOf(object) !== undefined,\n },\n /**\n * The scene's own `environmentIntensity`, on the Scene as a target: the\n * environment's `intensity` channel. It scales the HDRI only, as in three.\n */\n environmentIntensity: {\n size: 1,\n appliesTo: (object) => sceneOf(object) !== undefined,\n read(object) {\n const value = sceneOf(object)?.environmentIntensity;\n return typeof value === 'number' ? [value] : undefined;\n },\n write(object, value) {\n const scene = sceneOf(object);\n if (scene) scene.environmentIntensity = value[0]!;\n },\n },\n /**\n * The scene's `environmentRotation`, radians, XYZ, as three holds it: the\n * environment's `rotation` channel. Unlike an object's rotation it stays\n * an euler on the wire, because that is what the environment carries.\n */\n environmentRotation: {\n size: 3,\n appliesTo: (object) => sceneOf(object) !== undefined,\n read: (object) => readVector(sceneOf(object)?.environmentRotation),\n write(object, value) {\n sceneOf(object)?.environmentRotation?.set(\n value[0]!,\n value[1]!,\n value[2]!,\n );\n },\n },\n /**\n * Where a directional or spot light aims: its `target`'s WORLD position,\n * which is what three aims it at and what the channel carries. Written\n * back through the target's parent, if it has one, so the light points at\n * the same place in the viewport as in the render.\n */\n target: {\n size: 3,\n appliesTo: (object) => aimedLight(object) !== undefined,\n read(object) {\n const target = aimedLight(object)?.target;\n if (!target) return undefined;\n target.updateMatrixWorld();\n const e = target.matrixWorld.elements;\n return [e[12]!, e[13]!, e[14]!];\n },\n write(object, value) {\n const target = aimedLight(object)?.target;\n if (!target) return;\n target.position.set(value[0]!, value[1]!, value[2]!);\n target.parent?.worldToLocal(target.position);\n target.updateMatrixWorld();\n },\n },\n};\n\n/**\n * Camera properties.\n *\n * `lookAt` is authoring-only and has no channel of its own: the wire format\n * carries a quaternion, because a lookAt point is meaningless to a renderer\n * that has already decided what \"up\" is. The conversion happens once, at bake,\n * in orbit.ts; see the note there about the straight-up degenerate case.\n */\nexport const CAMERA_PROPERTIES: Record<string, PropertyDefinition> = {\n position: OBJECT_PROPERTIES.position!,\n lookAt: {\n size: 3,\n // There is no live \"lookAt\" to read; the timeline supplies its own center\n // when a keyframe is captured. Returning undefined keeps the panel from\n // offering a capture button that would silently record the wrong thing.\n read: () => undefined,\n // Applied together with position by the timeline, never alone: aiming at a\n // point before moving to the position it was computed for produces one\n // frame of visible swing.\n write: () => undefined,\n },\n fov: {\n size: 1,\n read(object) {\n const camera = object as AnyCamera;\n return typeof camera.fov === 'number' ? [camera.fov] : undefined;\n },\n write(object, value) {\n const camera = object as AnyCamera;\n if (typeof camera.fov !== 'number') return;\n camera.fov = value[0]!;\n camera.updateProjectionMatrix?.();\n },\n },\n};\n\n/** The one lookup every consumer goes through, so the panel, `seek()` and\n * `bake()` cannot end up disagreeing about what a property means. */\nexport function propertyDefinition(\n target: 'camera' | Object3D,\n property: string,\n): PropertyDefinition | undefined {\n return target === 'camera'\n ? CAMERA_PROPERTIES[property]\n : OBJECT_PROPERTIES[property];\n}\n\n/**\n * Where a live camera is already pointing.\n *\n * A camera has no lookAt to read, only a rotation, so the point is recovered\n * by walking its own forward axis out to the distance it sits from the center\n * of interest. Assuming the origin instead would silently re-aim every camera\n * in every scene whose product is not at (0,0,0).\n */\nexport function readCameraLookAt(\n camera: Camera,\n center: [number, number, number],\n): [number, number, number] {\n camera.updateMatrixWorld();\n const e = camera.matrixWorld.elements;\n const position: [number, number, number] = [e[12]!, e[13]!, e[14]!];\n // A camera looks down its local -Z; that column of the world matrix is the\n // axis, already normalized unless the camera is under a scaled rig.\n const forward = normalize([-e[8]!, -e[9]!, -e[10]!]);\n const distance =\n Math.hypot(\n position[0] - center[0],\n position[1] - center[1],\n position[2] - center[2],\n ) || 1;\n return [\n position[0] + forward[0] * distance,\n position[1] + forward[1] * distance,\n position[2] + forward[2] * distance,\n ];\n}\n\nfunction normalize(v: [number, number, number]): [number, number, number] {\n const length = Math.hypot(v[0], v[1], v[2]);\n return length === 0\n ? [0, 0, -1]\n : [v[0] / length, v[1] / length, v[2] / length];\n}\n\n/**\n * sRGB hex → three's linear working space.\n *\n * three's own transfer function, written out rather than imported, since the\n * SDK keeps three as a peer dependency with no runtime import. Getting it\n * wrong makes every authored color land visibly darker or lighter than the\n * same hex written into the material by hand.\n */\nexport function hexToLinear(hex: string): PropertyValue {\n const value = hex.trim().replace(/^#/, '');\n const full =\n value.length === 3\n ? value\n .split('')\n .map((c) => c + c)\n .join('')\n : value;\n const int = Number.parseInt(full, 16);\n if (!Number.isFinite(int)) return [1, 1, 1];\n return [\n srgbToLinear(((int >> 16) & 255) / 255),\n srgbToLinear(((int >> 8) & 255) / 255),\n srgbToLinear((int & 255) / 255),\n ];\n}\n\n/** One component of `hexToLinear`, for a caller that already has 0–1 floats\n * rather than a hex string. Same curve, so the two cannot drift. */\nexport function srgbToLinear(c: number): number {\n return c < 0.04045\n ? c * 0.0773993808\n : Math.pow(c * 0.9478672986 + 0.0521327014, 2.4);\n}\n\n/**\n * Back the other way, for display only.\n *\n * The panel's color swatch is the one place a linear channel value has to\n * become something a CSS property understands. Nothing on the wire path calls\n * this: a round trip through 8-bit hex would quantize a color you authored\n * exactly.\n */\nexport function linearToSrgbHex(value: PropertyValue): string {\n const channel = (v: number) => {\n const srgb =\n v < 0.0031308\n ? v * 12.92\n : 1.055 * Math.pow(Math.max(v, 0), 0.41666) - 0.055;\n return Math.round(Math.max(0, Math.min(1, srgb)) * 255)\n .toString(16)\n .padStart(2, '0');\n };\n return `#${channel(value[0] ?? 0)}${channel(value[1] ?? 0)}${channel(value[2] ?? 0)}`;\n}\n","/**\n * Animation: authored as keyframes, shipped as baked frames.\n *\n * The SDK's `Timeline` is keyframes, easings and orbit segments; this is\n * not. What travels is one exact value per output frame, and the renderer\n * sets one keyframe per frame with linear interpolation, so there is nothing\n * left for it to interpolate and nothing for the two sides to disagree\n * about. Easing curves and orbit math exist in one implementation, and the\n * browser preview and the traced frame agree on where everything is at\n * frame N. It costs little: 10 s at 30 fps of camera motion is 300 frames of\n * 7 floats.\n */\n\n/**\n * What a channel drives. The camera is not an object id: it may never have\n * been in the scene graph at all (see `CameraSpec`). Neither is the\n * environment: `scene.environment`, its intensity and rotation, and the\n * scene's ambient light are scene state, not objects (see `EnvironmentSpec`).\n */\nexport type AnimationTarget =\n | { type: 'camera' }\n | { type: 'object'; objectId: string }\n | { type: 'environment' };\n\n/**\n * What an `environment` channel may drive, as `EnvironmentSpec` holds it:\n * `intensity` (three's `scene.environmentIntensity`, 1 number), `rotation`\n * (`scene.environmentRotation`, radians XYZ, 3), and the ambient term,\n * `ambientIntensity` (1) and `ambientColor` (linear rgb, 3). A scene with a\n * room preset has the room's sky instead, and refuses all four.\n */\nexport const ENVIRONMENT_CHANNEL_PROPERTIES = [\n 'intensity',\n 'rotation',\n 'ambientIntensity',\n 'ambientColor',\n] as const;\n\n/**\n * Components per frame of an `environment` channel. Kept apart from\n * `ANIMATION_CHANNEL_SIZES` on purpose: the environment's `rotation` is an\n * euler (3), where an object's rotation travels as a `quaternion` (4), and a\n * table keyed by name alone could not hold both.\n */\nexport const ENVIRONMENT_CHANNEL_SIZES: Record<\n (typeof ENVIRONMENT_CHANNEL_PROPERTIES)[number],\n number\n> = {\n intensity: 1,\n rotation: 3,\n ambientIntensity: 1,\n ambientColor: 3,\n};\n\n/**\n * What a channel on a hemisphere light may drive: its `intensity`, its sky\n * `color` and its `groundColor` (both linear rgb). It is a dome in the world\n * rather than a lamp, so it has no place to move or aim.\n */\nexport const HEMISPHERE_CHANNEL_PROPERTIES = [\n 'intensity',\n 'color',\n 'groundColor',\n] as const;\n\n/**\n * One animated property, sampled at every frame.\n *\n * `values` is flat: `frameCount * size` numbers, row-major, frame 0's\n * components and then frame 1's. Nested arrays would cost two bytes of JSON\n * per frame per channel, which for a long sequence is the larger part of\n * the manifest.\n */\nexport type AnimationChannel = {\n target: AnimationTarget;\n /**\n * `position` | `quaternion` | `scale` | `fov` | `color` | `emissive` |\n * `emissiveIntensity` | `roughness` | `metalness` | `opacity` | `intensity`\n * | `target` | `groundColor`, and on the environment target the four in\n * `ENVIRONMENT_CHANNEL_PROPERTIES`.\n *\n * `target` is a directional or spot light's aim, a WORLD point, as three's\n * `light.target` holds it. Such a light is aimed from its position to its\n * target at every frame, as three aims it, so animating either one turns\n * the beam; `quaternion` on one is refused, because three ignores a\n * directional or spot light's rotation.\n *\n * A property the renderer does not implement is refused with the name,\n * the object's path and a fix, never dropped.\n */\n property: string;\n /** Components per frame: 3 position/scale/color, 4 quaternion, 1 scalar. */\n size: number;\n values: number[];\n};\n\n/**\n * The baked sequence.\n *\n * Frame `i` is sampled at `i / fps` seconds, so a `frameCount / fps` second\n * clip never repeats its first pose at the end, which is what makes a 360\n * degree orbit loop without a duplicated frame.\n */\nexport type AnimationSpec = {\n fps: number;\n frameCount: number;\n channels: AnimationChannel[];\n /**\n * Where the browser actually put things: see `WorldCheck`. Optional on the\n * wire so an older worker reads straight through it; a worker that\n * implements it refuses a clip whose frames disagree with the browser's.\n */\n checks?: WorldCheck[];\n};\n\n/**\n * A target's world matrix at a few of the clip's frames, straight off three\n * (`Object3D.matrixWorld` after a seek; the camera's pose composed), in\n * three's own Y-up frame, column-major, sixteen numbers per frame.\n *\n * The channels say what the browser did; this says where it ended up. The\n * worker rebuilds every animated object from the channels through its own\n * up-axis conversion and parent chain, then sets each of these frames, reads\n * its own world matrices back, and refuses the job if they do not match the\n * browser's: a refusal instead of a plausible clip with the motion in the\n * wrong place. Five frames are enough (a convention error shows on the\n * first, an axis error on any, a drift on the last) and cost eighty numbers\n * per target.\n */\nexport type WorldCheck = {\n target: AnimationTarget;\n /** Frame indices, ascending, each in `[0, frameCount)`. */\n frames: number[];\n /** `frames.length * 16` numbers. */\n matrices: number[];\n};\n\n/** How many frames of a clip a `WorldCheck` samples: the first, the last and three between. */\nexport const WORLD_CHECK_FRAMES = 5;\n\n/**\n * Colors in a channel are linear RGB, not sRGB hex.\n *\n * Everywhere else in the manifest a color is a hex string, because that is\n * what a developer wrote in their source. A channel is not written by hand:\n * it is sampled from `Color.r/g/b`, which three keeps in its linear working\n * space, and passing those numbers straight through is cheaper and more\n * faithful than a round trip via 8-bit hex at every frame.\n */\nexport const ANIMATION_COLOR_SPACE = 'linear-rgb';\n\n/**\n * Components each animatable property carries. Used to validate a manifest\n * before it is admitted, and to build channels in the SDK.\n */\nexport const ANIMATION_CHANNEL_SIZES: Record<string, number> = {\n position: 3,\n quaternion: 4,\n scale: 3,\n color: 3,\n emissive: 3,\n fov: 1,\n emissiveIntensity: 1,\n roughness: 1,\n metalness: 1,\n opacity: 1,\n intensity: 1,\n target: 3,\n groundColor: 3,\n};\n\n/**\n * The frame ceiling, enforced before a job is admitted. A video is the one\n * request shape where a single typo (`duration: 600` instead of `6`) buys\n * hours rather than minutes. 1800 frames is a minute at 30 fps, far past\n * what a product turntable needs.\n */\nexport const MAX_ANIMATION_FRAMES = 1800;\n","/**\n * The shader graph: how a TSL node material travels to the renderer.\n *\n * Three.js node materials (`MeshStandardNodeMaterial` and friends) describe a\n * surface as a graph of small typed operations, and so does the renderer.\n * Shader source does not survive the trip to a path tracer; graphs do. The\n * SDK walks the live TSL graph and writes it down in this renderer-neutral\n * form, and the render worker rebuilds it from its own shading nodes: the\n * same shapes, the same wiring, no shader code interpreted.\n *\n * The graph is deliberately smaller than TSL. Every op in the catalog below\n * is one the worker knows how to build; anything else becomes a named,\n * located compatibility issue at `check()` time rather than a gray render.\n *\n * Like the rest of the manifest this is plain JSON: it travels from the\n * browser through the control plane to the render worker, it is stored\n * verbatim for replay, and a developer can read exactly what left their\n * application.\n */\n\n/**\n * Bumped when the graph itself changes shape, not when ops are added. A\n * worker refuses a graph version it does not implement; an op it does not\n * implement is reported per op by preflight instead, with a better message.\n */\nexport const SHADER_GRAPH_VERSION = 1;\n\n// ---------------------------------------------------------------------------\n// The op catalog\n// ---------------------------------------------------------------------------\n\n/**\n * How faithfully an op reproduces in the final render.\n *\n * `exact`: the same math on both sides; any visible difference is a bug.\n * `approximate`: the renderer has an equivalent that computes something\n * visibly similar rather than identical. The SDK reports these as\n * warnings with the op's note, once per material, so the developer\n * decides.\n * `bakery`: no three.js implementation at all. An op the SDK exposes from\n * `@oeave/bakery3/tsl` that previews approximately in the browser and\n * renders exactly in the final image. Reported as info, because the render\n * is the real one.\n */\nexport type ShaderOpTier = 'exact' | 'approximate' | 'bakery';\n\nexport type ShaderOpInfo = {\n tier: ShaderOpTier;\n /** Why an approximate op differs: the sentence the warning shows. */\n note?: string;\n};\n\n/**\n * Every op a manifest may carry. The worker's builder table mirrors this\n * list, and a test guards that the two never drift apart.\n */\nexport const SHADER_OPS: Record<string, ShaderOpInfo> = {\n // ---- values ------------------------------------------------------------\n /** params: { value: number | number[], type } */\n const: { tier: 'exact' },\n /**\n * A uniform, baked to the value it held at capture. A still render is a\n * snapshot; an animated uniform renders the moment the button was pressed.\n * params: { value, type, name? }\n */\n uniform: { tier: 'exact' },\n\n // ---- geometry inputs ---------------------------------------------------\n /** params: { index }. TEXCOORD_<index> of the mesh being shaded. */\n uv: { tier: 'exact' },\n /** COLOR_0, as the mesh carries it. */\n vertex_color: { tier: 'exact' },\n /** params: { space: 'local' | 'world' | 'view' } */\n position: {\n tier: 'exact',\n },\n /**\n * params: { space: 'world' | 'view' | 'local' }. View- and local-space\n * normals are rebuilt from the renderer's world-space normal;\n * rotation-invariant uses (dot products, fresnel) match exactly, raw\n * components differ.\n */\n normal: { tier: 'exact' },\n /**\n * Direction from the shaded point toward the camera, in view space. The\n * worker rebuilds three's exact frame.\n */\n view_direction: { tier: 'exact' },\n /** The world-space camera location. */\n camera_position: { tier: 'exact' },\n\n // ---- textures ----------------------------------------------------------\n /**\n * params: { image: 'sha256:…', colorSpace: 'srgb' | 'linear',\n * wrap: 'repeat' | 'clamp' | 'mirror', filter: 'linear' | 'nearest' }\n * inputs: [uv?]. Sampled at TEXCOORD_0 when the input is omitted.\n */\n texture: { tier: 'exact' },\n /**\n * Tangent-space normal mapping. inputs: [textureColor, scale?].\n */\n normal_map: { tier: 'exact' },\n /** Bump from a height value. inputs: [height, scale?]. */\n bump_map: {\n tier: 'approximate',\n note: 'three.js bump-maps with screen-space derivatives, the renderer with surface derivatives. The relief reads the same; the exact pixels differ.',\n },\n\n // ---- arithmetic --------------------------------------------------------\n add: { tier: 'exact' },\n sub: { tier: 'exact' },\n mul: { tier: 'exact' },\n div: { tier: 'exact' },\n mod: { tier: 'exact' },\n pow: { tier: 'exact' },\n min: { tier: 'exact' },\n max: { tier: 'exact' },\n abs: { tier: 'exact' },\n sign: { tier: 'exact' },\n floor: { tier: 'exact' },\n ceil: { tier: 'exact' },\n round: { tier: 'exact' },\n trunc: { tier: 'exact' },\n fract: { tier: 'exact' },\n sqrt: { tier: 'exact' },\n inverse_sqrt: { tier: 'exact' },\n exp: { tier: 'exact' },\n exp2: { tier: 'exact' },\n log: { tier: 'exact' },\n log2: { tier: 'exact' },\n sin: { tier: 'exact' },\n cos: { tier: 'exact' },\n tan: { tier: 'exact' },\n asin: { tier: 'exact' },\n acos: { tier: 'exact' },\n atan: { tier: 'exact' },\n /** inputs: [y, x], like GLSL's two-argument atan. */\n atan2: { tier: 'exact' },\n radians: { tier: 'exact' },\n degrees: { tier: 'exact' },\n negate: { tier: 'exact' },\n one_minus: { tier: 'exact' },\n reciprocal: { tier: 'exact' },\n saturate: { tier: 'exact' },\n clamp: { tier: 'exact' },\n /** inputs: [a, b, t]. three's `mix`, the same lerp on both sides. */\n mix: { tier: 'exact' },\n step: { tier: 'exact' },\n smoothstep: { tier: 'exact' },\n /** inputs: [value, inLow, inHigh, outLow, outHigh]; params: { clamp } */\n remap: { tier: 'exact' },\n\n // ---- vectors -----------------------------------------------------------\n dot: { tier: 'exact' },\n cross: { tier: 'exact' },\n length: { tier: 'exact' },\n distance: { tier: 'exact' },\n normalize: { tier: 'exact' },\n reflect: { tier: 'exact' },\n refract: { tier: 'exact' },\n faceforward: { tier: 'exact' },\n /** params: { components: 'x' | 'xy' | 'zyx' | … } */\n swizzle: { tier: 'exact' },\n /** inputs: the components, in order. Two to four of them. */\n join: { tier: 'exact' },\n /** params: { to: 'float' | 'vec2' | 'vec3' | 'vec4' | 'color' | 'int' | 'uint' | 'bool' } */\n convert: { tier: 'exact' },\n /** Rotate a vector about an axis. inputs: [vector, axis, angle]. */\n rotate: { tier: 'exact' },\n\n // ---- comparison and choice --------------------------------------------\n less_than: { tier: 'exact' },\n greater_than: { tier: 'exact' },\n less_equal: { tier: 'exact' },\n greater_equal: { tier: 'exact' },\n equal: {\n tier: 'approximate',\n note: 'Float equality is compared exactly on both sides, but GPU rounding differs between the browser and the renderer, so equality on computed values may flip near the boundary.',\n },\n not_equal: {\n tier: 'approximate',\n note: 'Float equality is compared exactly on both sides, but GPU rounding differs between the browser and the renderer, so equality on computed values may flip near the boundary.',\n },\n and: { tier: 'exact' },\n or: { tier: 'exact' },\n not: { tier: 'exact' },\n /** inputs: [condition, ifTrue, ifFalse]. */\n select: { tier: 'exact' },\n\n // ---- color ------------------------------------------------------------\n /**\n * Luminance and color-space ops use Rec.709 weights on both sides.\n */\n luminance: { tier: 'exact' },\n srgb_to_linear: {\n tier: 'approximate',\n note: 'The renderer applies a gamma-2.2 curve rather than the piecewise sRGB transfer function; the toe below 0.04 differs slightly.',\n },\n linear_to_srgb: {\n tier: 'approximate',\n note: 'The renderer applies a gamma-2.2 curve rather than the piecewise sRGB transfer function; the toe below 0.04 differs slightly.',\n },\n\n // ---- procedural (three.js implementations, native equivalents) ---------\n /**\n * three's `checker()`: a 2×2 tile per UV unit.\n */\n checker: {\n tier: 'exact',\n },\n /**\n * MaterialX Perlin noise, rendered through the renderer's own\n * Perlin-derived noise. The lattices differ: the look matches, the exact\n * pattern does not. params: { dimensions: 2 | 3 }\n */\n mx_noise: {\n tier: 'approximate',\n note: \"MaterialX Perlin noise renders through the renderer's own Perlin-based noise. The character matches; the exact pattern placement does not.\",\n },\n /** params: { octaves, lacunarity, diminish }. Fractal (fBm) noise. */\n mx_fractal_noise: {\n tier: 'approximate',\n note: \"MaterialX fractal noise renders through the renderer's own noise with matching octaves. The character matches; the exact pattern placement does not.\",\n },\n /**\n * Worley/cellular noise, as three calls it: SQUARED distances, to the\n * nearest point, or with `vector` to the nearest `features` (2 or 3).\n * inputs: [coordinate, jitter]; params: { vector?, features?, dimensions? },\n * `dimensions: 2` when the coordinate is 2D, which three runs as 2D noise.\n */\n mx_worley_noise: {\n tier: 'approximate',\n note: \"MaterialX Worley noise renders through the renderer's cellular noise. Cell shapes match in character, not placement.\",\n },\n /** Constant pseudo-random value per integer cell. */\n mx_cell_noise: {\n tier: 'approximate',\n note: 'MaterialX cell noise renders as a hash over the floored coordinate. Statistically identical, per-cell values differ.',\n },\n\n // ---- Bakery-only (from @oeave/bakery3/tsl) -------------------------------\n /**\n * These exist because the renderer has procedural textures and shading\n * inputs the browser cannot compute. The SDK exposes them as TSL nodes\n * that preview approximately in WebGPU and serialize exactly here: the\n * render is the real one, the viewport is the sketch.\n */\n /** params: { dimensions, scale, detail, roughness, lacunarity, distortion } */\n bk_noise_texture: { tier: 'bakery' },\n /** params: { dimensions, feature, metric, scale, randomness, exponent } */\n bk_voronoi_texture: { tier: 'bakery' },\n /** params: { type, bands_direction, rings_direction, profile, scale,\n * distortion, detail, detail_scale, detail_roughness, phase } */\n bk_wave_texture: { tier: 'bakery' },\n /** params: { depth, scale, distortion } */\n bk_magic_texture: { tier: 'bakery' },\n /** params: { gradient_type } */\n bk_gradient_texture: { tier: 'bakery' },\n /** params: { offset, frequency, squash, …brick geometry } */\n bk_brick_texture: { tier: 'bakery' },\n /** params: { dimensions }. A hash of the input coordinate. */\n bk_white_noise: { tier: 'bakery' },\n /** Traced ambient occlusion. params: { distance, samples, only_local } */\n bk_ambient_occlusion: { tier: 'bakery' },\n /** Rounds geometry edges at shading time. params: { radius, samples } */\n bk_bevel: { tier: 'bakery' },\n /** Curvature of the surface: concave 0, flat 0.5, convex 1. */\n bk_pointiness: { tier: 'bakery' },\n /** 1 on triangle edges, 0 elsewhere. params: { size, pixel_size } */\n bk_wireframe: { tier: 'bakery' },\n /** Physically correct fresnel. inputs: [ior]. */\n bk_fresnel: { tier: 'bakery' },\n /** Facing/fresnel layer weight. inputs: [blend]; params: { output } */\n bk_layer_weight: { tier: 'bakery' },\n /**\n * A color ramp. inputs: [fac];\n * params: { interpolation, stops: [pos, r, g, b, a, …] flat }\n */\n bk_color_ramp: { tier: 'bakery' },\n /** Blackbody temperature to color. inputs: [kelvin]. */\n bk_blackbody: { tier: 'bakery' },\n /** params: { hue, saturation, value, fac } as defaults; inputs override. */\n bk_hsv: { tier: 'bakery' },\n /** Brightness/contrast. inputs: [color, bright, contrast]. */\n bk_brightness_contrast: { tier: 'bakery' },\n /** A gamma curve. inputs: [color, gamma]. */\n bk_gamma: { tier: 'bakery' },\n};\n\nexport type ShaderOp = keyof typeof SHADER_OPS;\n\n// ---------------------------------------------------------------------------\n// The graph\n// ---------------------------------------------------------------------------\n\n/**\n * One node. `inputs` are ids of earlier nodes: the array arrives\n * topologically sorted, so the worker builds it in one pass. Constants are\n * nodes too, so every input is a reference and nothing is written twice.\n */\nexport type ShaderGraphNode = {\n id: string;\n op: string;\n inputs?: string[];\n params?: Record<string, number | string | boolean | number[]>;\n};\n\n/**\n * Which BSDF slot a graph output drives. Everything not listed here falls\n * back to the material's static properties.\n */\nexport type ShaderSlot =\n | 'color'\n | 'opacity'\n | 'alphaTest'\n | 'roughness'\n | 'metalness'\n | 'normal'\n | 'emissive'\n | 'ao'\n | 'clearcoat'\n | 'clearcoatRoughness'\n | 'sheen'\n | 'sheenRoughness'\n | 'iridescence'\n | 'iridescenceIOR'\n | 'iridescenceThickness'\n | 'transmission'\n | 'thickness'\n | 'ior'\n | 'specularIntensity'\n | 'specularColor'\n | 'anisotropy';\n\nexport type ShaderGraph = {\n version: number;\n /** Topologically sorted: a node's inputs always precede it. */\n nodes: ShaderGraphNode[];\n /** Which node feeds which BSDF slot. */\n outputs: Partial<Record<ShaderSlot, string>>;\n};\n\n/**\n * The static, non-graph half of the material: plain PBR values for every\n * slot no node drives. Captured in full because the glTF exporter does not\n * understand node materials, so the worker rebuilds this material from\n * scratch rather than patching whatever the exporter guessed.\n */\nexport type ShaderMaterialProperties = {\n color?: string;\n roughness?: number;\n metalness?: number;\n emissive?: string;\n emissiveIntensity?: number;\n opacity?: number;\n transparent?: boolean;\n alphaTest?: number;\n ior?: number;\n transmission?: number;\n thickness?: number;\n attenuationColor?: string;\n attenuationDistance?: number;\n clearcoat?: number;\n clearcoatRoughness?: number;\n sheen?: number;\n sheenColor?: string;\n sheenRoughness?: number;\n specularIntensity?: number;\n specularColor?: string;\n iridescence?: number;\n iridescenceIOR?: number;\n anisotropy?: number;\n doubleSided?: boolean;\n};\n\n/**\n * One node material, ready to rebuild. Matched to the mesh by the material's\n * uuid, which the SDK stamps through the exporter the same way object ids\n * are.\n */\nexport type MaterialShaderSpec = {\n materialId: string;\n name?: string;\n /** Which BSDF family the material declared. */\n base: 'standard' | 'physical' | 'basic';\n properties?: ShaderMaterialProperties;\n graph: ShaderGraph;\n};\n","/**\n * How hard a scene is to render, measured from what is in it.\n *\n * Two numbers, and the quote is priced from them (`estimate()` on the control\n * plane), so any scene is priced by its contents: a preset room and the same\n * room a developer built themselves get the same quote.\n *\n * `enclosure` is how much of the sky above the camera is walled in: 0 for a\n * product on an open floor, 1 inside a closed room. Walls and a ceiling keep\n * light bouncing, and that is what doubles the work of a render: measured on\n * the fleet with one thing changed at a time, an empty room traced 2.2 times\n * slower than an open floor, while glass, metal, lamp counts and three\n * million triangles each moved it by a third or less.\n *\n * `objects` is how many meshes the scene draws: what fills a room. A\n * furnished room traced about 1.6 times slower than the same room empty.\n *\n * Pure: no three.js, so the SDK (from the scene in the page), the preset\n * library (from a room's own GLB) and the benches all measure the same way.\n */\n\nimport type { Vec3 } from './manifest.js';\n\nexport type SceneComplexity = {\n /** Share of the sky above the camera that geometry hides: 0 open, 1 closed. */\n enclosure: number;\n /** Meshes the scene draws, instances counted. */\n objects: number;\n};\n\n/** A mesh as the probe sees it: its triangles, and where it is. */\nexport type ProbeMesh = {\n /** x, y, z per vertex, in the mesh's own space. */\n positions: ArrayLike<number>;\n /** Three per triangle; without them, every three vertices are one. */\n indices?: ArrayLike<number> | null;\n /** Column-major, to world space. Absent means identity. */\n matrix?: ArrayLike<number> | null;\n /**\n * A surface that gives light rather than bouncing it (an emissive or\n * unlit material, a sky dome): a ray that reaches it has escaped.\n */\n emitter?: boolean;\n};\n\n/** Rays in the probe. A share measured to a few percent is all the quote needs. */\nexport const ENCLOSURE_RAYS = 128;\n/** A wall further than this does not keep light in. */\nexport const ENCLOSURE_REACH = 60;\n\n/**\n * Directions over the sky above the camera, evenly spread (a Fibonacci\n * lattice), from just above the horizon to straight up. Below the horizon is\n * the floor in every scene, open or not, so it says nothing.\n */\nfunction skyDirections(count: number): Vec3[] {\n const golden = Math.PI * (3 - Math.sqrt(5));\n const lowest = Math.sin((2 * Math.PI) / 180);\n const out: Vec3[] = [];\n for (let i = 0; i < count; i++) {\n const y = lowest + (1 - lowest) * ((i + 0.5) / count);\n const r = Math.sqrt(1 - y * y);\n const a = i * golden;\n out.push([Math.cos(a) * r, y, Math.sin(a) * r]);\n }\n return out;\n}\n\ntype Prepared = { mesh: ProbeMesh; min: Vec3; max: Vec3 };\n\n/** A vertex of a mesh, in world space, into `out`. */\nfunction vertex(mesh: ProbeMesh, v: number, out: number[], at: number): void {\n const p = mesh.positions;\n const m = mesh.matrix;\n const x = p[v * 3]!,\n y = p[v * 3 + 1]!,\n z = p[v * 3 + 2]!;\n if (!m) {\n out[at] = x;\n out[at + 1] = y;\n out[at + 2] = z;\n return;\n }\n out[at] = m[0]! * x + m[4]! * y + m[8]! * z + m[12]!;\n out[at + 1] = m[1]! * x + m[5]! * y + m[9]! * z + m[13]!;\n out[at + 2] = m[2]! * x + m[6]! * y + m[10]! * z + m[14]!;\n}\n\n/**\n * A mesh's world bounds, from the corners of its own (one pass over its\n * vertices, nothing kept): its triangles are only read when a ray reaches\n * the box, so a heavy scene costs the probe no memory.\n */\nfunction prepare(mesh: ProbeMesh): Prepared | null {\n const p = mesh.positions;\n if (p.length < 9) return null;\n const lo = [Infinity, Infinity, Infinity];\n const hi = [-Infinity, -Infinity, -Infinity];\n for (let i = 0; i < p.length; i += 3) {\n for (let k = 0; k < 3; k++) {\n const value = p[i + k]!;\n if (value < lo[k]!) lo[k] = value;\n if (value > hi[k]!) hi[k] = value;\n }\n }\n const min: Vec3 = [Infinity, Infinity, Infinity];\n const max: Vec3 = [-Infinity, -Infinity, -Infinity];\n const corner = [0, 0, 0];\n const probe: ProbeMesh = {\n positions: [0, 0, 0],\n matrix: mesh.matrix ?? null,\n };\n for (let c = 0; c < 8; c++) {\n (probe.positions as number[])[0] = c & 1 ? hi[0]! : lo[0]!;\n (probe.positions as number[])[1] = c & 2 ? hi[1]! : lo[1]!;\n (probe.positions as number[])[2] = c & 4 ? hi[2]! : lo[2]!;\n vertex(probe, 0, corner, 0);\n for (let k = 0; k < 3; k++) {\n if (corner[k]! < min[k]!) min[k] = corner[k]!;\n if (corner[k]! > max[k]!) max[k] = corner[k]!;\n }\n }\n return { mesh, min, max };\n}\n\n/** Where a ray enters a box, or Infinity. Slabs, with a small pad for flat boxes. */\nfunction boxEntry(o: Vec3, d: Vec3, min: Vec3, max: Vec3): number {\n let near = 0;\n let far = ENCLOSURE_REACH;\n for (let k = 0; k < 3; k++) {\n const lo = min[k]! - 1e-4;\n const hi = max[k]! + 1e-4;\n if (Math.abs(d[k]!) < 1e-12) {\n if (o[k]! < lo || o[k]! > hi) return Infinity;\n continue;\n }\n let t1 = (lo - o[k]!) / d[k]!;\n let t2 = (hi - o[k]!) / d[k]!;\n if (t1 > t2) [t1, t2] = [t2, t1];\n if (t1 > near) near = t1;\n if (t2 < far) far = t2;\n if (near > far) return Infinity;\n }\n return near;\n}\n\n/** Whether a ray meets any of a mesh's triangles within reach (Möller–Trumbore, either face). */\nfunction hitsMesh(o: Vec3, d: Vec3, mesh: ProbeMesh): boolean {\n const index = mesh.indices;\n const count = index ? index.length : mesh.positions.length / 3;\n const t = [0, 0, 0, 0, 0, 0, 0, 0, 0];\n for (let i = 0; i + 2 < count; i += 3) {\n vertex(mesh, index ? index[i]! : i, t, 0);\n vertex(mesh, index ? index[i + 1]! : i + 1, t, 3);\n vertex(mesh, index ? index[i + 2]! : i + 2, t, 6);\n const e1x = t[3]! - t[0]!,\n e1y = t[4]! - t[1]!,\n e1z = t[5]! - t[2]!;\n const e2x = t[6]! - t[0]!,\n e2y = t[7]! - t[1]!,\n e2z = t[8]! - t[2]!;\n const px = d[1] * e2z - d[2] * e2y,\n py = d[2] * e2x - d[0] * e2z,\n pz = d[0] * e2y - d[1] * e2x;\n const det = e1x * px + e1y * py + e1z * pz;\n if (Math.abs(det) < 1e-12) continue;\n const inv = 1 / det;\n const sx = o[0] - t[0]!,\n sy = o[1] - t[1]!,\n sz = o[2] - t[2]!;\n const u = (sx * px + sy * py + sz * pz) * inv;\n if (u < 0 || u > 1) continue;\n const qx = sy * e1z - sz * e1y,\n qy = sz * e1x - sx * e1z,\n qz = sx * e1y - sy * e1x;\n const v = (d[0] * qx + d[1] * qy + d[2] * qz) * inv;\n if (v < 0 || u + v > 1) continue;\n const distance = (e2x * qx + e2y * qy + e2z * qz) * inv;\n if (distance > 1e-4 && distance < ENCLOSURE_REACH) return true;\n }\n return false;\n}\n\n/**\n * How much of the sky above `eye` the meshes hide, 0 to 1. Emitters let\n * light in rather than keep it, so a ray that reaches one has escaped.\n */\nexport function enclosureOf(\n meshes: readonly ProbeMesh[],\n eye: Vec3,\n rays = ENCLOSURE_RAYS,\n): number {\n const prepared = meshes\n .filter((mesh) => !mesh.emitter)\n .map(prepare)\n .filter((mesh): mesh is Prepared => mesh !== null);\n if (!prepared.length) return 0;\n let hidden = 0;\n for (const d of skyDirections(rays)) {\n // Nearest boxes first: a wall behind a sofa is not read once the sofa is hit.\n const order = prepared\n .map((candidate) => ({\n mesh: candidate.mesh,\n entry: boxEntry(eye, d, candidate.min, candidate.max),\n }))\n .filter((candidate) => candidate.entry < ENCLOSURE_REACH)\n .sort((a, b) => a.entry - b.entry);\n if (order.some(({ mesh }) => hitsMesh(eye, d, mesh))) hidden++;\n }\n return hidden / rays;\n}\n\n/**\n * Both numbers for a scene: the probe from the camera, and the meshes\n * counted (`objects` when the caller counts instances the probe was not\n * given one by one).\n */\nexport function complexityOf(\n meshes: readonly ProbeMesh[],\n eye: Vec3,\n objects = meshes.length,\n): SceneComplexity {\n return { enclosure: round2(enclosureOf(meshes, eye)), objects };\n}\n\nfunction round2(value: number): number {\n return Math.round(value * 100) / 100;\n}\n","/**\n * The scene's `AmbientLight`s as the one flat term the manifest carries.\n *\n * three adds every ambient light to the irradiance as `color × intensity`,\n * in its linear working space. The manifest has room for one color and one\n * intensity, so several lights are summed that way and the sum is split into\n * its largest component (the intensity) and the color scaled by it. Until\n * this was written, capture summed the intensities and kept the LAST light's\n * color: white 0.5 plus red 0.5 went out as red 1, linear (1, 0, 0), where\n * three draws (1, 0.5, 0.5).\n *\n * One rule for capture and for the timeline (`bake.ts`), which samples the\n * same lights at every frame of a clip, so a still and frame k of a clip\n * light the scene the same way.\n */\n\nimport type { Object3D } from 'three';\nimport { readUserData } from './scene.js';\n\ntype RGB = {\n r: number;\n g: number;\n b: number;\n getHexString(): string;\n clone(): RGB;\n setRGB(r: number, g: number, b: number): RGB;\n};\n\nexport type AmbientLightLike = Object3D & {\n isAmbientLight?: boolean;\n intensity?: number;\n color?: RGB;\n};\n\n/** Linear rgb and an intensity: `color × intensity` is the light. */\nexport type AmbientTerm = {\n color: [number, number, number];\n intensity: number;\n};\n\n/** Every ambient light that reaches a render, in traversal order. */\nexport function ambientLightsIn(root: Object3D): AmbientLightLike[] {\n const lights: AmbientLightLike[] = [];\n root.traverse((object) => {\n const light = object as AmbientLightLike;\n if (\n !light.isAmbientLight ||\n (!light.visible && !readUserData(object).renderOnly)\n )\n return;\n lights.push(light);\n });\n return lights;\n}\n\n/**\n * three's sum of ambient lights, as one term. A single light is passed\n * through as it is, so a scene with one ambient light sends exactly what it\n * always sent; several are summed in linear light and split into the largest\n * component and the color scaled by it. Undefined when nothing is lit.\n */\nexport function combineAmbient(terms: AmbientTerm[]): AmbientTerm | undefined {\n if (terms.length === 1) {\n const [only] = terms;\n return only!.intensity > 0\n ? { color: [...only!.color], intensity: only!.intensity }\n : undefined;\n }\n const sum: [number, number, number] = [0, 0, 0];\n for (const term of terms) {\n for (let c = 0; c < 3; c++) sum[c]! += term.color[c]! * term.intensity;\n }\n const intensity = Math.max(...sum);\n if (!(intensity > 0)) return undefined;\n return {\n color: [sum[0] / intensity, sum[1] / intensity, sum[2] / intensity],\n intensity,\n };\n}\n\n/** One light as a term: its color as three holds it (linear) and its intensity. */\nexport function ambientTermOf(light: AmbientLightLike): AmbientTerm {\n const color = light.color;\n return {\n color: color ? [color.r, color.g, color.b] : [1, 1, 1],\n intensity: light.intensity ?? 0,\n };\n}\n\n/**\n * The manifest's `environment.ambient`: the combined term with its color as\n * sRGB hex. A single light's hex is its own `getHexString()`, unchanged; a\n * sum is written through a clone of a light's own color, so three's color\n * management does the linear-to-sRGB step exactly as it does for one light.\n */\nexport function capturedAmbient(\n root: Object3D,\n): { color: string; intensity: number } | undefined {\n const lights = ambientLightsIn(root);\n const term = combineAmbient(lights.map(ambientTermOf));\n if (!term) return undefined;\n if (lights.length === 1) {\n const color = lights[0]!.color;\n return {\n color: color ? `#${color.getHexString()}` : '#ffffff',\n intensity: term.intensity,\n };\n }\n const color = lights.find((light) => light.color)?.color;\n const hex = color\n ? color\n .clone()\n .setRGB(term.color[0], term.color[1], term.color[2])\n .getHexString()\n : 'ffffff';\n return { color: `#${hex}`, intensity: term.intensity };\n}\n","/**\n * Timeline → `AnimationSpec`: the one place authoring becomes wire format.\n *\n * Every track is sampled at every output frame and written flat. Nothing about\n * easing, orbits or lookAt survives the trip: the renderer plays numbers, it\n * does not evaluate curves, so the preview and the video cannot disagree.\n *\n * Two things this file must not get wrong:\n *\n * Object ids. A channel's `objectId` has to be the id the capture stamps\n * into the GLB (`idOf`, see capture/ids.ts). An id that does not match is a\n * no-op at the render worker: the video comes back looking almost right and\n * there is no way to tell it ignored a motion. So an object that is not in\n * the scene being captured is refused here, before anything is rendered.\n *\n * Color space. Channels carry linear RGB, straight off three's `Color`,\n * because that is the space the browser shades in.\n *\n * It also writes down where three put every animated target at a few frames\n * (`checks`), so the render worker can prove its own frames against the\n * browser's before it renders. A mismatch is a refusal, not a log line.\n */\n\nimport { Matrix4, Quaternion, Vector3, type Object3D, type Scene } from 'three';\nimport type {\n AnimationChannel,\n AnimationSpec,\n WorldCheck,\n} from '../protocol/index.js';\nimport {\n ANIMATION_CHANNEL_SIZES,\n ENVIRONMENT_CHANNEL_SIZES,\n HEMISPHERE_CHANNEL_PROPERTIES,\n MAX_ANIMATION_FRAMES,\n WORLD_CHECK_FRAMES,\n} from '../protocol/index.js';\nimport {\n ambientLightsIn,\n ambientTermOf,\n combineAmbient,\n} from '../capture/ambient.js';\nimport { idOf } from '../capture/ids.js';\nimport { excludedItself } from '../capture/scene.js';\nimport { Bakery3Error } from '../errors.js';\nimport { eulerToQuaternion, type Vec3 } from './orbit.js';\nimport { propertyDefinition } from './properties.js';\nimport type { Timeline, Track } from './timeline.js';\n\n/**\n * Sample a timeline into the manifest's `animation`.\n *\n * `fps` and `duration` override the timeline's own for this bake only, so you\n * can author at 30 and test at 12 without editing the shot. The frame ceiling\n * is checked first, before any sampling: a mistyped duration should cost a\n * refusal, not two hundred megabytes of arrays.\n */\nexport function bakeTimeline(\n timeline: Timeline,\n options: { scene?: Scene; fps?: number; duration?: number } = {},\n): AnimationSpec {\n const fps = Math.max(1, Math.round(options.fps ?? timeline.fps));\n const duration = Math.max(1 / fps, options.duration ?? timeline.duration);\n const frameCount = Math.max(1, Math.round(duration * fps));\n\n if (frameCount > MAX_ANIMATION_FRAMES) {\n throw new Bakery3Error({\n code: 'InvalidRequest',\n message: `${frameCount} frames is above the ${MAX_ANIMATION_FRAMES}-frame ceiling.`,\n why: `${duration}s at ${fps} fps is more render time than any single request is allowed to buy. A video is where one wrong number turns minutes into hours.`,\n fix: 'Shorten the timeline, lower the fps, or render it in sections.',\n docs: 'https://bakery3.com/docs/animation',\n });\n }\n\n const scene = options.scene ?? timeline.scene;\n const channels: AnimationChannel[] = [];\n\n channels.push(...cameraChannels(timeline, fps, frameCount));\n channels.push(...objectChannels(timeline, fps, frameCount, scene));\n channels.push(...environmentChannels(timeline, fps, frameCount, scene));\n\n if (!channels.length) {\n throw new Bakery3Error({\n code: 'InvalidRequest',\n message: 'The timeline has nothing to animate.',\n why: 'A video of an unchanging scene costs one render per frame and looks exactly like the still.',\n fix: \"Add a move, such as tl.push({ object: 'camera', orbitY: 90 }), or render a still with render().\",\n docs: 'https://bakery3.com/docs/animation',\n });\n }\n\n const checks = worldChecks(timeline, fps, frameCount, channels);\n return { fps, frameCount, channels, ...(checks.length ? { checks } : {}) };\n}\n\n/** The frames a `WorldCheck` samples: the first, the last, and three between. */\nexport function checkFrames(frameCount: number): number[] {\n const last = Math.max(0, frameCount - 1);\n const frames = new Set<number>();\n for (let i = 0; i < WORLD_CHECK_FRAMES; i++)\n frames.add(Math.round((last * i) / (WORLD_CHECK_FRAMES - 1)));\n return [...frames].sort((a, b) => a - b);\n}\n\n/**\n * Every animated object's world matrix, and the camera's when it moves, at\n * the check frames, read off the live scene by seeking the timeline there,\n * which is the same evaluator the channels were sampled from. The timeline\n * is put back where it was.\n */\nfunction worldChecks(\n timeline: Timeline,\n fps: number,\n frameCount: number,\n channels: AnimationChannel[],\n): WorldCheck[] {\n const frames = checkFrames(frameCount);\n const objects = new Map<string, Object3D>();\n for (const track of timeline.tracks) {\n // An ambient or hemisphere light is a dome and the scene's environment\n // is the world: none has a place the worker could check.\n if (\n track.target !== 'camera' &&\n !isDome(track.target) &&\n !isScene(track.target)\n )\n objects.set(idOf(track.target), track.target);\n }\n const cameraMoves = channels.some(\n (c) => c.target.type === 'camera' && c.property === 'quaternion',\n );\n if (!objects.size && !cameraMoves) return [];\n\n const perObject = new Map<string, number[]>(\n [...objects.keys()].map((id) => [id, []]),\n );\n const cameraMatrices: number[] = [];\n const matrix = new Matrix4();\n const position = new Vector3();\n const quaternion = new Quaternion();\n const unit = new Vector3(1, 1, 1);\n const was = timeline.time;\n try {\n for (const frame of frames) {\n const time = frame / fps;\n if (objects.size) {\n timeline.seek(time);\n for (const [id, object] of objects) {\n object.updateWorldMatrix(true, false);\n perObject.get(id)!.push(...object.matrixWorld.elements);\n }\n }\n if (cameraMoves) {\n const pose = timeline.cameraPoseAt(time);\n if (pose) {\n matrix.compose(\n position.set(...pose.position),\n quaternion.set(...pose.quaternion),\n unit,\n );\n cameraMatrices.push(...matrix.elements);\n }\n }\n }\n } finally {\n if (objects.size) timeline.seek(was);\n }\n\n const checks: WorldCheck[] = [];\n for (const [objectId, matrices] of perObject)\n checks.push({ target: { type: 'object', objectId }, frames, matrices });\n if (cameraMatrices.length === frames.length * 16)\n checks.push({\n target: { type: 'camera' },\n frames,\n matrices: cameraMatrices,\n });\n return checks;\n}\n\n/**\n * Position, rotation and fov for the camera.\n *\n * A quaternion channel is emitted whenever the camera moves or its aim\n * changes, because the two are the same thing to a renderer: a camera that\n * dollies without re-aiming still ends up looking somewhere new, and shipping\n * the position without the rotation would let the renderer keep the\n * capture-time aim for the whole clip.\n */\nfunction cameraChannels(\n timeline: Timeline,\n fps: number,\n frameCount: number,\n): AnimationChannel[] {\n const tracks = timeline.tracks.filter((track) => track.target === 'camera');\n const moves = tracks.some(\n (track) => track.property === 'position' || track.property === 'lookAt',\n );\n const fovTrack = tracks.find((track) => track.property === 'fov');\n const channels: AnimationChannel[] = [];\n if (!moves && !fovTrack) return channels;\n\n if (moves) {\n const positions: number[] = [];\n const quaternions: number[] = [];\n for (let frame = 0; frame < frameCount; frame++) {\n const pose = timeline.cameraPoseAt(frame / fps);\n if (!pose) break;\n positions.push(...pose.position);\n quaternions.push(...pose.quaternion);\n }\n const animatesPosition = tracks.some(\n (track) => track.property === 'position',\n );\n if (animatesPosition) {\n channels.push({\n target: { type: 'camera' },\n property: 'position',\n size: 3,\n values: positions,\n });\n }\n channels.push({\n target: { type: 'camera' },\n property: 'quaternion',\n size: 4,\n values: quaternions,\n });\n }\n\n if (fovTrack) {\n channels.push({\n target: { type: 'camera' },\n property: 'fov',\n size: 1,\n values: sample(timeline, fovTrack, fps, frameCount, 1),\n });\n }\n\n return channels;\n}\n\nfunction objectChannels(\n timeline: Timeline,\n fps: number,\n frameCount: number,\n scene: Scene | undefined,\n): AnimationChannel[] {\n const channels: AnimationChannel[] = [];\n\n for (const track of timeline.tracks) {\n if (track.target === 'camera') continue;\n const object = track.target;\n // The environment's own channels: see environmentChannels.\n if (isAmbient(object) || isScene(object)) continue;\n requireInScene(object, scene, track.property);\n\n const definition = propertyDefinition(object, track.property);\n const property = definition?.channel ?? track.property;\n const size = ANIMATION_CHANNEL_SIZES[property];\n if (size === undefined) {\n // Reachable only if the property table and the protocol's channel table\n // ever disagree. Refusing here turns that into a clear error instead of\n // a video with a missing motion.\n throw new Bakery3Error({\n code: 'InvalidRequest',\n message: `\"${property}\" has no channel in this protocol version.`,\n why: 'The SDK can author it but the wire format cannot carry it, so the renderer would never see it.',\n fix: 'This is a bug in the SDK. Please report it to hello@bakery3.com with the property name.',\n });\n }\n\n const values =\n track.property === 'rotation'\n ? sampleAsQuaternion(timeline, track, fps, frameCount)\n : sample(timeline, track, fps, frameCount, size);\n\n channels.push({\n target: { type: 'object', objectId: idOf(object) },\n property,\n size,\n values,\n });\n }\n\n return channels;\n}\n\n/**\n * The environment's channels: the scene's `environmentIntensity` and\n * `environmentRotation`, and the ambient term.\n *\n * Capture sends every ambient light as one term (`capture/ambient.ts`), so\n * when any of them is animated all of them are sampled at every frame and\n * combined by the same rule, the animated ones at their track's value and\n * the rest as they stand. Frame k of the clip is then lit exactly as a still\n * captured at frame k's values.\n */\nfunction environmentChannels(\n timeline: Timeline,\n fps: number,\n frameCount: number,\n scene: Scene | undefined,\n): AnimationChannel[] {\n const channels: AnimationChannel[] = [];\n const environment = { type: 'environment' as const };\n\n for (const track of timeline.tracks) {\n if (track.target === 'camera' || !isScene(track.target)) continue;\n requireInScene(track.target, scene, track.property);\n const property =\n track.property === 'environmentIntensity' ? 'intensity' : 'rotation';\n const size = ENVIRONMENT_CHANNEL_SIZES[property];\n channels.push({\n target: environment,\n property,\n size,\n values: sample(timeline, track, fps, frameCount, size),\n });\n }\n\n const ambient = timeline.tracks.filter(\n (track): track is Track & { target: Object3D } =>\n track.target !== 'camera' && isAmbient(track.target),\n );\n if (!ambient.length) return channels;\n for (const track of ambient)\n requireInScene(track.target, scene, track.property);\n\n const lights = ambientLightsIn(scene ?? rootOf(ambient[0]!.target));\n const intensities: number[] = [];\n const colors: number[] = [];\n for (let frame = 0; frame < frameCount; frame++) {\n const terms = lights.map((light) => {\n const term = ambientTermOf(light);\n for (const track of ambient) {\n if (track.target !== light) continue;\n const value = timeline.valueAt(track, frame / fps);\n if (!value) continue;\n if (track.property === 'intensity') term.intensity = value[0]!;\n else term.color = [value[0]!, value[1]!, value[2]!];\n }\n return term;\n });\n const sum = combineAmbient(terms) ?? { color: [1, 1, 1], intensity: 0 };\n intensities.push(sum.intensity);\n colors.push(...sum.color);\n }\n channels.push(\n {\n target: environment,\n property: 'ambientIntensity',\n size: ENVIRONMENT_CHANNEL_SIZES.ambientIntensity,\n values: intensities,\n },\n {\n target: environment,\n property: 'ambientColor',\n size: ENVIRONMENT_CHANNEL_SIZES.ambientColor,\n values: colors,\n },\n );\n return channels;\n}\n\nfunction isAmbient(object: Object3D): boolean {\n return Boolean(\n (object as Object3D & { isAmbientLight?: boolean }).isAmbientLight,\n );\n}\n\nfunction isHemisphere(object: Object3D): boolean {\n return Boolean(\n (object as Object3D & { isHemisphereLight?: boolean }).isHemisphereLight,\n );\n}\n\n/** An ambient or hemisphere light: a dome in the world, not a lamp. */\nfunction isDome(object: Object3D): boolean {\n return isAmbient(object) || isHemisphere(object);\n}\n\nfunction isScene(object: Object3D): boolean {\n return Boolean((object as Object3D & { isScene?: boolean }).isScene);\n}\n\nfunction rootOf(object: Object3D): Object3D {\n let root = object;\n while (root.parent) root = root.parent;\n return root;\n}\n\nfunction sample(\n timeline: Timeline,\n track: Track,\n fps: number,\n frameCount: number,\n size: number,\n): number[] {\n const values: number[] = [];\n for (let frame = 0; frame < frameCount; frame++) {\n const value = timeline.valueAt(track, frame / fps);\n for (let i = 0; i < size; i++) values.push(value?.[i] ?? 0);\n }\n return values;\n}\n\nfunction sampleAsQuaternion(\n timeline: Timeline,\n track: Track,\n fps: number,\n frameCount: number,\n): number[] {\n const values: number[] = [];\n for (let frame = 0; frame < frameCount; frame++) {\n const euler = (timeline.valueAt(track, frame / fps) ?? [0, 0, 0]) as Vec3;\n values.push(...eulerToQuaternion(euler));\n }\n return values;\n}\n\n/**\n * Why an object can never be the target of an animation channel, or null.\n *\n * Being in the scene is not enough: the exporter detaches excluded subtrees\n * (helpers, gizmos, `userData.bakery3.exclude`) before writing the GLB, and\n * captureLights folds ambient and hemisphere lights into the environment\n * rather than emitting a lamp with an objectId. A track on any of these ships\n * an id that matches nothing at the render worker. This is built on the same\n * per-object rule the exporter's `shouldExclude` walks, so the two cannot\n * disagree, and walked here by hand so the message can name the ancestor that\n * is the reason.\n *\n * Exported for `Timeline.track()`, which refuses at authoring time: a\n * TransformControls arrow is a popular first click in an object picker, and\n * \"you cannot animate a gizmo\" belongs at the click, not at export.\n */\nexport function unexportableReason(\n object: Object3D,\n property: string,\n): ConstructorParameters<typeof Bakery3Error>[0] | null {\n const name = () => object.name || object.type;\n\n for (let node: Object3D | null = object; node; node = node.parent) {\n if (!excludedItself(node)) continue;\n const where =\n node === object\n ? `\"${name()}\"`\n : `\"${name()}\" (inside \"${node.name || node.type}\")`;\n const because = readExclusionKind(node);\n return {\n code: 'InvalidRequest',\n message: `The timeline animates \"${property}\" on ${where}, which never reaches a render: ${because}.`,\n why: 'Excluded objects are detached from the GLB before export, so this channel would arrive at the renderer with an id that matches nothing.',\n fix:\n because === EXCLUDED_BY_USERDATA\n ? 'Remove userData.bakery3.exclude from it, or remove the track with timeline.removeTrack().'\n : 'Animate the object you meant instead: helpers and gizmos never render.',\n docs: 'https://bakery3.com/docs/animation',\n };\n }\n\n // An ambient or hemisphere light is a dome in the world: its light can\n // change, but it has no place to move to or way to face.\n const domeProperties: readonly string[] | undefined = isAmbient(object)\n ? AMBIENT_PROPERTIES\n : isHemisphere(object)\n ? HEMISPHERE_CHANNEL_PROPERTIES\n : undefined;\n if (domeProperties && !domeProperties.includes(property)) {\n const kind = isAmbient(object) ? 'an AmbientLight' : 'a HemisphereLight';\n return {\n code: 'InvalidRequest',\n message: `The timeline animates \"${property}\" on \"${name()}\", ${kind}, which has no \"${property}\" in a render.`,\n why: isHemisphere(object)\n ? 'A hemisphere light is a sky above and a ground below, split on its up axis. The renderer builds it into the world, where it has nothing to move, and turning its axis over a clip is not something it reproduces.'\n : 'An ambient light is the same light from every direction, so it has nothing to move or turn.',\n fix: `Animate ${domeProperties.join(', ')} on it instead.`,\n docs: 'https://bakery3.com/docs/animation',\n };\n }\n\n return null;\n}\n\n/** What an ambient light can animate: the term it adds to the environment. */\nconst AMBIENT_PROPERTIES = ['intensity', 'color'] as const;\n\nconst EXCLUDED_BY_USERDATA = 'it is excluded with userData.bakery3.exclude';\n\nfunction readExclusionKind(node: Object3D): string {\n const data = node.userData?.bakery3 as { exclude?: boolean } | undefined;\n if (data?.exclude) return EXCLUDED_BY_USERDATA;\n if (node.type === 'TransformControls')\n return 'it is part of a TransformControls gizmo';\n if (\n (node.userData?.bakery3Preset as { roomPreset?: unknown } | undefined)\n ?.roomPreset\n ) {\n return \"it is part of a room preset's stand-in, which the renderer rebuilds rather than imports\";\n }\n return `${node.type} is debug furniture the exporter always skips`;\n}\n\n/**\n * The object has to be in the scene that is about to be exported, and be\n * something the export can address (see unexportableReason).\n *\n * An id that never reaches the GLB is the silent no-op the file header is\n * about, and it is easy to detect here.\n */\nfunction requireInScene(\n object: Object3D,\n scene: Scene | undefined,\n property: string,\n): void {\n // Re-checked at bake even though track() refuses at creation: a re-parent\n // into a gizmo, a later userData.bakery3.exclude, or a light hidden since\n // authoring are all bake-time facts.\n const reason = unexportableReason(object, property);\n if (reason) throw new Bakery3Error(reason);\n\n if ((object as Object3D & { isLight?: boolean }).isLight && !object.visible) {\n throw new Bakery3Error({\n code: 'InvalidRequest',\n message: `The timeline animates \"${property}\" on \"${\n object.name || object.type\n }\", a light that is currently invisible.`,\n why: 'Invisible lights are left out of the manifest, so this channel would arrive with an id that matches nothing.',\n fix: 'Make the light visible before rendering, or remove the track.',\n docs: 'https://bakery3.com/docs/animation',\n });\n }\n\n if (!scene) return;\n let found = false;\n scene.traverse((candidate) => {\n if (candidate === object) found = true;\n });\n if (found) return;\n throw new Bakery3Error({\n code: 'InvalidRequest',\n message: `The timeline animates \"${property}\" on \"${\n object.name || object.type\n }\", which is not in the scene being rendered.`,\n why: 'Only objects the exporter walks reach the renderer, so this channel would arrive with an id that matches nothing and be silently ignored.',\n fix: 'Add the object to the scene before rendering, or remove the track with timeline.removeTrack().',\n docs: 'https://bakery3.com/docs/animation',\n });\n}\n","/**\n * A timeline you author in keyframes and ship as frames.\n *\n * const tl = createTimeline({ duration: 5, fps: 30, camera, scene });\n *\n * tl.push({ object: 'camera', orbitY: 90 });\n * tl.to(mesh, { color: '#ff2d95' }, { at: 1, duration: 2, easing: 'ease-in-out' });\n *\n * tl.seek(2.5); // the live scene is the preview\n * await bakery3.renderVideo({ timeline: tl });\n *\n * It looks like gsap and differs from it in two ways, because a shot has a\n * known length rather than being a queue of tweens:\n *\n * - `at` defaults to 0 and `duration` to the rest of the timeline, so\n * `tl.push({ object: 'camera', orbitY: 15 })` on a five-second timeline is\n * a five-second move. Nothing appends itself to the end.\n * - `seek()` drives your actual three objects. There is no shadow copy of\n * the scene, so what you scrub to is what gets rendered.\n *\n * Everything that interpolates lives here, in easing.ts and in orbit.ts. The\n * renderer sees none of it: `bake()` samples this evaluator at every output\n * frame and ships the numbers.\n */\n\nimport type { Camera, Object3D, Scene } from 'three';\nimport type { AnimationSpec } from '../protocol/index.js';\nimport { idOf } from '../capture/ids.js';\nimport { Bakery3Error } from '../errors.js';\nimport { ease, type Easing } from './easing.js';\nimport {\n eulerToQuaternion,\n fromSpherical,\n lookAtQuaternion,\n orbitAt,\n toSpherical,\n type Quat,\n type Spherical,\n type Vec3,\n} from './orbit.js';\nimport {\n CAMERA_PROPERTIES,\n OBJECT_PROPERTIES,\n hexToLinear,\n propertyDefinition,\n readCameraLookAt,\n type PropertyValue,\n} from './properties.js';\nimport { bakeTimeline, unexportableReason } from './bake.js';\n\nexport type { Easing } from './easing.js';\nexport type { Vec3, Quat } from './orbit.js';\n\n/** `'camera'` rather than the camera object, because a live R3F camera is\n * frequently swapped out from under the application and an id that survives\n * that is worth more than a reference that does not. */\nexport type TrackTarget = 'camera' | Object3D;\n\n/** One value, at one time, on one track. Times are seconds from the start of\n * the timeline, never relative to the keyframe before, so retiming one\n * keyframe cannot cascade through the rest of the lane. */\nexport type Keyframe = {\n time: number;\n value: PropertyValue;\n /** Governs the segment ending here: the ease passed to the `.to()` that\n * created this keyframe. */\n easing?: Easing;\n path?: 'line' | 'orbit';\n /**\n * Where an orbit segment ends, in spherical coordinates about `center`.\n *\n * Carried alongside the position rather than instead of it, so a consumer\n * that does not understand orbits (the panel's diamonds, a JSON reader)\n * still sees the right endpoint. `yaw` is unwrapped: +370° means a full turn\n * plus ten degrees.\n */\n orbit?: { center: Vec3; radius: number; yaw: number; pitch: number };\n};\n\n/** One property of one target, over time: a lane in the panel and a channel\n * in the bake. One track per (target, property) pair, always: two lanes\n * driving one property would fight over the live object on every `seek()`. */\nexport type Track = {\n id: string;\n target: TrackTarget;\n property: string;\n size: number;\n /** What the panel shows. Falls back to the object's name or type. */\n label: string;\n keyframes: Keyframe[];\n};\n\n/**\n * What a panel can listen for.\n *\n * `time` fires on every `seek()`, sixty times a second while playing, so a\n * listener must be cheap. `change` is structural (a keyframe, the duration,\n * the fps) and also fires the `time` listeners, because every readout that\n * watches the playhead also wants to know the lanes moved underneath it.\n */\nexport type TimelineEvent = 'change' | 'time' | 'play' | 'pause';\n\n/** Everything a timeline needs to know before anything is authored on it.\n * All optional: a timeline with no scene and no camera is still a valid\n * document, which is what makes one testable without a renderer. */\nexport type TimelineOptions = {\n /** Seconds. Default 5. */\n duration?: number;\n /** Frames per second the bake samples at. Default 30. */\n fps?: number;\n camera?: Camera;\n scene?: Scene;\n /**\n * What camera orbits turn around and lookAt tracks default to. Defaults to\n * the center of the scene's bounding box, which is what \"orbit the product\"\n * usually means.\n */\n lookAt?: Vec3;\n loop?: boolean;\n /** The host's orbit-controls target, when it has one. Read on keyframe\n * capture so the After Effects flow (frame it with the mouse, press the\n * button) records the point you were actually orbiting. */\n controlsTarget?: () => Vec3;\n};\n\n/** Where a `.to()`, `.fromTo()` or `.orbit()` sits on the timeline. */\nexport type SegmentOptions = {\n /** Seconds from the start of the timeline. Default 0. */\n at?: number;\n /** Seconds. Default: the rest of the timeline. */\n duration?: number;\n easing?: Easing;\n};\n\n/** A camera swing. Everything is relative to where the camera already is,\n * except `radius`: an orbit is a nudge from the pose you framed, not a jump\n * to coordinates you would have to work out first. */\nexport type OrbitOptions = SegmentOptions & {\n /** Degrees about the up axis. Not wrapped: -540 is one and a half turns. */\n yaw?: number;\n /** Degrees of elevation change. */\n pitch?: number;\n /** Absolute end distance from the center. */\n radius?: number;\n /** Distance change, relative to where the camera starts. */\n dolly?: number;\n lookAt?: Vec3 | Object3D;\n};\n\n/** The one-call shorthand: `tl.push({ object: 'camera', orbitY: +15 })`. */\nexport type PushSpec = SegmentOptions & {\n object: TrackTarget;\n /** Degrees, horizontal. Positive swings the camera to its right. */\n orbitY?: number;\n /** Degrees, vertical. Positive lifts the camera. */\n orbitX?: number;\n /** Distance change, relative to where the camera starts. */\n dolly?: number;\n lookAt?: Vec3 | Object3D;\n} & Record<string, unknown>;\n\n/** Anything `.to()` accepts as a value: a number, a vector, a hex color, or\n * a three Vector3/Color/Euler read straight off the scene. */\nexport type AuthoredValue =\n | number\n | number[]\n | string\n | { x: number; y: number; z: number }\n | { r: number; g: number; b: number };\n\nconst PUSH_OPTION_KEYS = new Set([\n 'object',\n 'at',\n 'duration',\n 'easing',\n 'orbitY',\n 'orbitX',\n 'dolly',\n 'lookAt',\n]);\n\n/** Where a client's timeline finds the scene and camera nobody passed it. */\ntype TimelineContext = () =>\n { scene?: Scene | undefined; camera?: Camera | undefined } | null | undefined;\n\n/**\n * Timelines made by a client's `timeline()`, and how each reads the client's\n * attached scene and camera. Read when they are needed, never copied at\n * creation, so a timeline made before `attach()` (at mount, before R3F has a\n * camera) still drives the camera attached later.\n */\nconst contexts = new WeakMap<Timeline, TimelineContext>();\n\n/** Have `timeline` read the scene and camera it was not given from `context`. */\nexport function bindTimelineContext(\n timeline: Timeline,\n context: TimelineContext,\n): Timeline {\n contexts.set(timeline, context);\n return timeline;\n}\n\n/** Keyframes in, frames out. The file header has the two places this differs\n * from gsap. */\nexport class Timeline {\n private _duration: number;\n private _fps: number;\n private _time = 0;\n private _tracks: Track[] = [];\n private _playing = false;\n private _raf: ReturnType<typeof setTimeout> | number | null = null;\n private _lastTick = 0;\n private _listeners = new Map<\n TimelineEvent,\n Set<(payload: unknown) => void>\n >();\n private _center: Vec3 | null;\n private _nextId = 0;\n\n /** Playback only. A bake is always exactly one pass of the duration, so\n * looping in the panel never changes what a video contains. */\n loop: boolean;\n private _camera?: Camera;\n private _scene?: Scene;\n /** The host's orbit-controls target, when it has one. */\n controlsTarget?: () => Vec3;\n\n constructor(options: TimelineOptions = {}) {\n this._duration = options.duration ?? 5;\n this._fps = options.fps ?? 30;\n this._center = options.lookAt ?? null;\n this.loop = options.loop ?? true;\n if (options.camera) this.camera = options.camera;\n if (options.scene) this.scene = options.scene;\n if (options.controlsTarget) this.controlsTarget = options.controlsTarget;\n }\n\n /**\n * What `seek()` drives and `captureCameraKeyframe()` reads. Settable after\n * construction because an R3F camera is frequently swapped out from under\n * the application. A timeline from `bakery3.timeline()` that was given no\n * camera reads the client's attached one each time it needs it.\n */\n get camera(): Camera | undefined {\n return this._camera ?? contexts.get(this)?.()?.camera ?? undefined;\n }\n\n set camera(camera: Camera | undefined) {\n this._camera = camera;\n }\n\n /** Used to find the orbit center, and to check at bake time that every\n * animated object is actually in what gets exported. Read from the\n * client's attachment, like `camera`, when it was not given. */\n get scene(): Scene | undefined {\n return this._scene ?? contexts.get(this)?.()?.scene ?? undefined;\n }\n\n set scene(scene: Scene | undefined) {\n this._scene = scene;\n }\n\n // -------------------------------------------------------------------------\n // Shape\n // -------------------------------------------------------------------------\n\n get duration(): number {\n return this._duration;\n }\n\n /**\n * Setting this moves the end, not the keyframes.\n *\n * Existing keyframes keep their absolute times, because the common reason to\n * change the duration is \"I need two more seconds at the end\", and silently\n * rescaling every ease you already tuned would be the opposite of that.\n * `scaleToFit()` is the other intent, spelled out.\n */\n set duration(seconds: number) {\n this._duration = Math.max(1 / this._fps, seconds);\n if (this._time > this._duration) this.seek(this._duration);\n this.emit('change');\n }\n\n get fps(): number {\n return this._fps;\n }\n\n set fps(value: number) {\n this._fps = Math.max(1, Math.round(value));\n this.emit('change');\n }\n\n get time(): number {\n return this._time;\n }\n\n get playing(): boolean {\n return this._playing;\n }\n\n get tracks(): readonly Track[] {\n return this._tracks;\n }\n\n /** Frames a bake at the current settings will produce. */\n get frameCount(): number {\n return Math.max(1, Math.round(this._duration * this._fps));\n }\n\n /** Proportionally rescale every keyframe into a new duration. */\n scaleToFit(seconds: number): this {\n const factor = seconds / this._duration;\n for (const track of this._tracks) {\n for (const keyframe of track.keyframes) keyframe.time *= factor;\n }\n this._duration = seconds;\n this.emit('change');\n return this;\n }\n\n /**\n * The point orbits turn around.\n *\n * Resolved lazily so a timeline created before the model finished loading\n * still centers on it. `createTimeline()` at mount is the normal case, and\n * an empty scene's bounding box is the origin, which would be wrong for\n * every model that is not at the origin.\n */\n get center(): Vec3 {\n if (this._center) return this._center;\n if (this.scene) {\n const box = boundingCenter(this.scene);\n if (box) return box;\n }\n return [0, 0, 0];\n }\n\n set center(value: Vec3) {\n this._center = value;\n this.emit('change');\n }\n\n // -------------------------------------------------------------------------\n // Authoring\n // -------------------------------------------------------------------------\n\n /**\n * Tween to a value from wherever the target is at `at`.\n *\n * \"Wherever it is at `at`\" means the timeline's own value if something else\n * already animates that property, and the live object's value if not, so\n * chaining two `.to()` calls on one property does what it looks like.\n */\n to(\n target: TrackTarget,\n props: Record<string, AuthoredValue>,\n options: SegmentOptions = {},\n ): this {\n const { at, end } = this.span(options);\n for (const [property, raw] of Object.entries(props)) {\n const track = this.track(target, property);\n const value = normalize(raw, track.size, property);\n this.anchor(track, at);\n this.insert(track, {\n time: end,\n value,\n ...(options.easing ? { easing: options.easing } : {}),\n });\n }\n this.emit('change');\n return this;\n }\n\n /** Both ends stated. Nothing is read off the live object. */\n fromTo(\n target: TrackTarget,\n from: Record<string, AuthoredValue>,\n to: Record<string, AuthoredValue>,\n options: SegmentOptions = {},\n ): this {\n const { at, end } = this.span(options);\n for (const [property, raw] of Object.entries(to)) {\n const track = this.track(target, property);\n const start = from[property];\n if (start !== undefined) {\n this.insert(track, {\n time: at,\n value: normalize(start, track.size, property),\n });\n } else {\n this.anchor(track, at);\n }\n this.insert(track, {\n time: end,\n value: normalize(raw, track.size, property),\n ...(options.easing ? { easing: options.easing } : {}),\n });\n }\n this.emit('change');\n return this;\n }\n\n /**\n * Swing the camera around what it is looking at.\n *\n * The lookAt point is pinned for the whole segment. That is the difference\n * between an orbit and a camera drifting sideways past the product, and it\n * is why this writes a `lookAt` track as well as a `position` one.\n */\n orbit(camera: TrackTarget, options: OrbitOptions = {}): this {\n const target =\n camera === 'camera' || camera === this.camera ? 'camera' : camera;\n if (target !== 'camera') {\n throw new Bakery3Error({\n code: 'InvalidRequest',\n message: 'orbit() only drives the camera.',\n why: 'An orbit is defined by a camera and the point it is aimed at; an ordinary object has no lookAt to hold.',\n fix: \"Pass 'camera' (or the timeline's camera), or animate the object's position with to().\",\n });\n }\n\n const { at, end } = this.span(options);\n const center = resolveCenter(options.lookAt, this.center);\n const positions = this.track('camera', 'position');\n const looks = this.track('camera', 'lookAt');\n\n const start = (this.valueAt(positions, at) ??\n this.live('camera', 'position') ?? [\n center[0],\n center[1],\n center[2] + 1,\n ]) as Vec3;\n const from = toSpherical(start, center);\n const radius =\n options.radius !== undefined\n ? options.radius\n : from.radius + (options.dolly ?? 0);\n const to: Spherical = {\n radius,\n yaw: from.yaw + degrees(options.yaw ?? 0),\n pitch: from.pitch + degrees(options.pitch ?? 0),\n };\n\n // A segment that ends at `at` already holds the start, with the arc and\n // easing it arrives on; overwriting it would turn that segment into a chord.\n if (!positions.keyframes.some((k) => Math.abs(k.time - at) < 1e-6))\n this.insert(positions, { time: at, value: [...start] });\n this.insert(positions, {\n time: end,\n value: [...fromSpherical(to, center)],\n path: 'orbit',\n orbit: { center, ...to },\n ...(options.easing ? { easing: options.easing } : {}),\n });\n // Both ends, so a lookAt animated elsewhere on the timeline cannot bleed\n // into the middle of the orbit and shear it.\n this.insert(looks, { time: at, value: [...center] });\n this.insert(looks, { time: end, value: [...center] });\n\n this.emit('change');\n return this;\n }\n\n /**\n * One-call shorthand:\n *\n * tl.push({ object: 'camera', orbitY: +15 });\n *\n * The camera starts where it is now and ends fifteen degrees round its\n * current lookAt, holding that lookAt, over the whole timeline. Any other\n * key is treated as if it had been passed to `.to()`.\n */\n push(spec: PushSpec): this {\n const { object, ...rest } = spec;\n const options: SegmentOptions = {\n ...(rest.at !== undefined ? { at: rest.at as number } : {}),\n ...(rest.duration !== undefined\n ? { duration: rest.duration as number }\n : {}),\n ...(rest.easing !== undefined ? { easing: rest.easing as Easing } : {}),\n };\n\n const orbits =\n rest.orbitY !== undefined ||\n rest.orbitX !== undefined ||\n rest.dolly !== undefined;\n if (orbits) {\n this.orbit(object, {\n ...options,\n ...(rest.orbitY !== undefined ? { yaw: rest.orbitY as number } : {}),\n ...(rest.orbitX !== undefined ? { pitch: rest.orbitX as number } : {}),\n ...(rest.dolly !== undefined ? { dolly: rest.dolly as number } : {}),\n ...(rest.lookAt !== undefined ? { lookAt: rest.lookAt as Vec3 } : {}),\n });\n }\n\n const props: Record<string, AuthoredValue> = {};\n for (const [key, value] of Object.entries(rest)) {\n if (PUSH_OPTION_KEYS.has(key)) continue;\n props[key] = value as AuthoredValue;\n }\n if (Object.keys(props).length) this.to(object, props, options);\n else if (!orbits) {\n throw new Bakery3Error({\n code: 'InvalidRequest',\n message: 'push() was given nothing to animate.',\n why: 'Every key was an option (at, duration, easing, …); no property and no orbit remained.',\n fix: \"Add a property: push({ object: 'camera', orbitY: 15 }) or push({ object: mesh, position: [0, 1, 0] }).\",\n });\n }\n return this;\n }\n\n // -------------------------------------------------------------------------\n // Keyframe editing (what the panel drives)\n // -------------------------------------------------------------------------\n\n /**\n * Save a property where it is right now.\n *\n * The After Effects flow: put the playhead somewhere, pose the scene, press\n * the button. Both arguments default to exactly that: the playhead, and the\n * live value.\n */\n keyframe(\n target: TrackTarget,\n property: string,\n time = this._time,\n value?: AuthoredValue,\n ): Keyframe {\n const track = this.track(target, property);\n const resolved =\n value !== undefined\n ? normalize(value, track.size, property)\n : (this.live(target, property) ?? this.valueAt(track, time));\n if (!resolved) {\n throw new Bakery3Error({\n code: 'InvalidRequest',\n message: `Nothing to read for \"${property}\" on ${track.label}.`,\n why: 'The property is not present on that object (a mesh has no intensity, a light has no roughness) and no value was passed.',\n fix: `Pass a value explicitly, or animate a property the object has.`,\n });\n }\n const keyframe = this.insert(track, { time, value: resolved });\n this.emit('change');\n return keyframe;\n }\n\n /**\n * The camera, as the developer framed it.\n *\n * Position and the point it is aimed at, because a camera keyframe that\n * records only position leaves the render free to aim it somewhere else.\n * The aim comes from the host's orbit controls when there are any (that is\n * the point you were dragging around), and is otherwise projected along the\n * camera's own forward axis, never assumed to be the origin.\n */\n captureCameraKeyframe(time = this._time, lookAt?: Vec3): void {\n const camera = this.requireCamera('captureCameraKeyframe');\n camera.updateMatrixWorld();\n const elements = camera.matrixWorld.elements;\n const position: Vec3 = [elements[12]!, elements[13]!, elements[14]!];\n const target =\n lookAt ??\n this.controlsTarget?.() ??\n readCameraLookAt(camera, this.center);\n\n this.insert(this.track('camera', 'position'), {\n time,\n value: [...position],\n });\n this.insert(this.track('camera', 'lookAt'), { time, value: [...target] });\n this.emit('change');\n }\n\n removeKeyframe(trackId: string, index: number): void {\n const track = this._tracks.find((t) => t.id === trackId);\n if (!track) return;\n track.keyframes.splice(index, 1);\n // An empty track is a lane with no meaning; dropping it keeps the panel\n // honest and keeps bake() from emitting a channel with nothing in it.\n if (!track.keyframes.length) this.removeTrack(trackId);\n this.emit('change');\n }\n\n /** Retime one keyframe, clamped into the timeline. A keyframe dragged past\n * the end would still be baked, at a frame nobody renders, so it is pinned\n * to the duration rather than allowed to leave the shot. */\n moveKeyframe(trackId: string, index: number, time: number): void {\n const track = this._tracks.find((t) => t.id === trackId);\n const keyframe = track?.keyframes[index];\n if (!track || !keyframe) return;\n keyframe.time = Math.max(0, Math.min(this._duration, time));\n track.keyframes.sort((a, b) => a.time - b.time);\n this.emit('change');\n }\n\n /** Re-curve the segment ending at this keyframe, the same convention `.to()`\n * writes, so the panel's dropdown and the authoring API mean the same thing\n * by \"the ease on this diamond\". */\n setEasing(trackId: string, index: number, easing: Easing): void {\n const keyframe = this._tracks.find((t) => t.id === trackId)?.keyframes[\n index\n ];\n if (!keyframe) return;\n keyframe.easing = easing;\n this.emit('change');\n }\n\n /** Drop a lane and everything on it. The live object keeps whatever value it\n * last had: removing a track stops driving a property, it does not restore\n * what the property was before the timeline touched it. */\n removeTrack(trackId: string): void {\n this._tracks = this._tracks.filter((track) => track.id !== trackId);\n this.emit('change');\n }\n\n /**\n * Re-attach tracks to the scene as it is now, and report what could not be.\n *\n * An application that rebuilds part of its graph (a configurator swapping a\n * variant, R3F remounting a subtree) leaves tracks pointing at Object3Ds\n * that are no longer in the scene, even though an object that is for every\n * purpose \"the same one\" is standing right there. Rather than fail at\n * export, look for that object: first by the identity you pinned\n * (`userData.bakery3Id`, which is exactly what survives a rebuild), then by\n * an unambiguous name match.\n *\n * Nothing is dropped silently. Every track that could not be healed is\n * returned, so the caller can say what happened; that is the difference\n * between repairing a timeline and quietly losing a motion you authored.\n */\n reconcile(scene: Object3D): {\n healed: Array<{ trackId: string; property: string; label: string }>;\n stale: Array<{\n trackId: string;\n property: string;\n label: string;\n reason: string;\n }>;\n } {\n const healed: Array<{ trackId: string; property: string; label: string }> =\n [];\n const stale: Array<{\n trackId: string;\n property: string;\n label: string;\n reason: string;\n }> = [];\n\n const live = new Set<Object3D>();\n const byId = new Map<string, Object3D>();\n const byName = new Map<string, Object3D[]>();\n scene.traverse((object) => {\n live.add(object);\n const declared = object.userData?.bakery3Id;\n if (typeof declared === 'string' && declared) byId.set(declared, object);\n if (object.name) {\n const bucket = byName.get(object.name);\n if (bucket) bucket.push(object);\n else byName.set(object.name, [object]);\n }\n });\n\n for (const track of this._tracks) {\n if (track.target === 'camera' || live.has(track.target)) continue;\n\n const previous = track.target;\n const declared = previous.userData?.bakery3Id;\n const replacement =\n (typeof declared === 'string' ? byId.get(declared) : undefined) ??\n // Only an unambiguous name match: two meshes called 'seat' and a\n // coin flip between them is worse than saying the track is stale.\n (previous.name && byName.get(previous.name)?.length === 1\n ? byName.get(previous.name)![0]\n : undefined);\n\n const entry = {\n trackId: track.id,\n property: track.property,\n label: track.label,\n };\n if (!replacement) {\n stale.push({ ...entry, reason: 'it is no longer in the scene' });\n continue;\n }\n const blocked = unexportableReason(replacement, track.property);\n if (blocked) {\n stale.push({ ...entry, reason: blocked.message });\n continue;\n }\n if (!propertyDefinition(replacement, track.property)) {\n stale.push({\n ...entry,\n reason: `the object that replaced it has no \"${track.property}\"`,\n });\n continue;\n }\n track.target = replacement;\n track.label = labelFor(replacement);\n healed.push(entry);\n }\n\n if (healed.length) this.emit('change');\n return { healed, stale };\n }\n\n /** Find or create a lane. Public because the panel's \"add track\" picker\n * needs to create one without also writing a keyframe. */\n track(target: TrackTarget, property: string): Track {\n const resolved = this.normalizeTarget(target);\n const existing = this._tracks.find(\n (track) => track.target === resolved && track.property === property,\n );\n if (existing) return existing;\n\n if (resolved !== 'camera') {\n // Refused at the click, not at export: a gizmo arrow or an ambient\n // light can never be an animation target (unexportableReason), and a\n // track that would only ever refuse at render time is a trap, not a\n // lane. Bake re-checks anyway, since parents and userData can change\n // later.\n const reason = unexportableReason(resolved, property);\n if (reason) throw new Bakery3Error(reason);\n }\n\n const definition = propertyDefinition(resolved, property);\n if (!definition) {\n throw new Bakery3Error({\n code: 'InvalidRequest',\n message: `\"${property}\" is not an animatable property${\n resolved === 'camera' ? ' of the camera' : ''\n }.`,\n why: 'Only properties the renderer can reproduce can be animated; animating one it cannot would produce a video that silently ignores it.',\n fix: `Animate one of: ${Object.keys(\n resolved === 'camera' ? CAMERA_PROPERTIES : OBJECT_PROPERTIES,\n ).join(', ')}.`,\n docs: 'https://bakery3.com/docs/animation',\n });\n }\n if (\n resolved !== 'camera' &&\n definition.appliesTo &&\n !definition.appliesTo(resolved)\n ) {\n throw new Bakery3Error({\n code: 'InvalidRequest',\n message: `\"${labelFor(resolved)}\" has no \"${property}\" to animate.`,\n why:\n property === 'target'\n ? 'Only a DirectionalLight or a SpotLight aims at a target.'\n : `\"${property}\" exists on some kinds of object, and this is not one of them.`,\n fix:\n property === 'target'\n ? \"Animate the light's position, or animate a DirectionalLight or SpotLight's target.\"\n : 'Animate the property on an object that has it.',\n docs: 'https://bakery3.com/docs/animation',\n });\n }\n\n const track: Track = {\n id: `t${this._nextId++}`,\n target: resolved,\n property,\n size: definition.size,\n label: labelFor(resolved),\n keyframes: [],\n };\n this._tracks.push(track);\n return track;\n }\n\n // -------------------------------------------------------------------------\n // Playback\n // -------------------------------------------------------------------------\n\n /**\n * Evaluate every track and drive the live scene.\n *\n * The same evaluator `bake()` samples, which is the whole design: what you\n * scrub to and what the renderer traces cannot drift apart, because there is\n * only one of them.\n */\n seek(time: number): this {\n this._time = Math.max(0, Math.min(this._duration, time));\n this.apply(this._time);\n this.emit('time', this._time);\n return this;\n }\n\n play(): this {\n if (this._playing) return this;\n this._playing = true;\n this._lastTick = now();\n this.emit('play');\n this.tick();\n return this;\n }\n\n pause(): this {\n if (!this._playing) return this;\n this._playing = false;\n cancel(this._raf);\n this._raf = null;\n this.emit('pause');\n return this;\n }\n\n /** Pause and rewind. */\n stop(): this {\n this.pause();\n return this.seek(0);\n }\n\n /** Stop the clock and forget every listener. The scene is left exactly where\n * the playhead left it: a timeline being torn down should not also move\n * your camera back. */\n dispose(): void {\n this.pause();\n this._listeners.clear();\n }\n\n private tick(): void {\n if (!this._playing) return;\n const stamp = now();\n const delta = (stamp - this._lastTick) / 1000;\n this._lastTick = stamp;\n\n let next = this._time + delta;\n if (next >= this._duration) {\n if (this.loop) next = next % this._duration;\n else {\n this.seek(this._duration);\n this.pause();\n return;\n }\n }\n this.seek(next);\n this._raf = schedule(() => this.tick());\n }\n\n // -------------------------------------------------------------------------\n // Evaluation\n // -------------------------------------------------------------------------\n\n /** The value of one track at a time, without touching the scene. Exposed\n * because the bake samples it. */\n valueAt(track: Track, time: number): PropertyValue | undefined {\n const keys = track.keyframes;\n if (!keys.length) return undefined;\n if (keys.length === 1 || time <= keys[0]!.time) return [...keys[0]!.value];\n const last = keys[keys.length - 1]!;\n if (time >= last.time) return [...last.value];\n\n let index = 0;\n while (index < keys.length - 1 && keys[index + 1]!.time <= time) index++;\n const a = keys[index]!;\n const b = keys[index + 1]!;\n const span = b.time - a.time;\n const u = span <= 0 ? 1 : (time - a.time) / span;\n const t = ease(b.easing, u);\n\n if (b.path === 'orbit' && b.orbit) {\n const center = b.orbit.center;\n const from = a.orbit ?? toSpherical(a.value as Vec3, center);\n return orbitAt(from, b.orbit, center, t);\n }\n if (track.size === 4 && track.property === 'quaternion') {\n return slerp(a.value as Quat, b.value as Quat, t);\n }\n return a.value.map(\n (value, i) => value + ((b.value[i] ?? value) - value) * t,\n );\n }\n\n /** What the timeline says everything is at `time`, for a panel readout or a\n * test: the same numbers `seek()` applies. */\n sample(time: number): Array<{ track: Track; value: PropertyValue }> {\n const out: Array<{ track: Track; value: PropertyValue }> = [];\n for (const track of this._tracks) {\n const value = this.valueAt(track, time);\n if (value) out.push({ track, value });\n }\n return out;\n }\n\n /** The camera pose at a time: position and the rotation the wire format\n * carries. Shared by `seek()` and `bake()` so the preview cannot aim\n * somewhere the render does not. */\n cameraPoseAt(\n time: number,\n ): { position: Vec3; lookAt: Vec3; quaternion: Quat } | undefined {\n const positions = this.find('camera', 'position');\n const looks = this.find('camera', 'lookAt');\n if (!positions && !looks) return undefined;\n\n const position = (positions ? this.valueAt(positions, time) : undefined) ??\n this.live('camera', 'position') ?? [0, 0, 1];\n const lookAt = (looks ? this.valueAt(looks, time) : undefined) ?? [\n ...this.center,\n ];\n return {\n position: position as Vec3,\n lookAt: lookAt as Vec3,\n quaternion: lookAtQuaternion(position as Vec3, lookAt as Vec3),\n };\n }\n\n private apply(time: number): void {\n const pose = this.cameraPoseAt(time);\n const camera = pose ? this.cameraOrThrow('seek()') : undefined;\n if (pose && camera) {\n // Position first, then aim: a camera aimed before it has moved shows one\n // frame of swing, and at 30 fps that reads as a jitter rather than a bug.\n camera.position.set(pose.position[0], pose.position[1], pose.position[2]);\n const lookable = camera as Camera & {\n lookAt?(x: number, y: number, z: number): void;\n };\n lookable.lookAt?.(pose.lookAt[0], pose.lookAt[1], pose.lookAt[2]);\n camera.updateMatrixWorld();\n }\n\n for (const track of this._tracks) {\n if (\n track.target === 'camera' &&\n (track.property === 'position' || track.property === 'lookAt')\n ) {\n continue; // Applied together above.\n }\n const value = this.valueAt(track, time);\n if (!value) continue;\n const definition = propertyDefinition(track.target, track.property);\n const object = track.target === 'camera' ? this.camera : track.target;\n if (definition && object) definition.write(object as Object3D, value);\n }\n }\n\n // -------------------------------------------------------------------------\n // Baking and serialization\n // -------------------------------------------------------------------------\n\n /**\n * Every track, sampled at every output frame. The wire format is flat\n * samples, so the renderer needs no evaluator of its own.\n */\n bake(\n options: { scene?: Scene; fps?: number; duration?: number } = {},\n ): AnimationSpec {\n if (this._tracks.some((track) => track.target === 'camera'))\n this.cameraOrThrow('bake()');\n return bakeTimeline(this, options);\n }\n\n /** The timeline as a storable document. See `TimelineJSON`, and `fromJSON`\n * for how stored ids find their live objects again. */\n toJSON(): TimelineJSON {\n return {\n version: 1,\n duration: this._duration,\n fps: this._fps,\n center: this.center,\n tracks: this._tracks.map((track) => ({\n target:\n track.target === 'camera'\n ? { type: 'camera' as const }\n : { type: 'object' as const, objectId: idOf(track.target) },\n property: track.property,\n label: track.label,\n keyframes: track.keyframes.map((keyframe) => ({ ...keyframe })),\n })),\n };\n }\n\n /**\n * Rebuild a timeline against a live scene.\n *\n * `resolve` maps a stored object id back to a live object. An id that does\n * not resolve is refused rather than skipped: a track that silently\n * disappears is a video missing a motion you authored, and you would find\n * out by watching the finished render.\n */\n static fromJSON(\n json: TimelineJSON,\n context: {\n resolve?: (objectId: string) => Object3D | undefined;\n camera?: Camera;\n scene?: Scene;\n } = {},\n ): Timeline {\n const timeline = new Timeline({\n duration: json.duration,\n fps: json.fps,\n ...(json.center ? { lookAt: json.center } : {}),\n ...(context.camera ? { camera: context.camera } : {}),\n ...(context.scene ? { scene: context.scene } : {}),\n });\n\n for (const stored of json.tracks) {\n let target: TrackTarget;\n if (stored.target.type === 'camera') {\n target = 'camera';\n } else {\n const object =\n context.resolve?.(stored.target.objectId) ??\n findByUuid(context.scene, stored.target.objectId);\n if (!object) {\n throw new Bakery3Error({\n code: 'InvalidRequest',\n message: `Timeline track \"${stored.property}\" refers to an object that is not in this scene.`,\n why: `Object id ${stored.target.objectId} did not resolve. three assigns a new uuid on every reload, so a timeline saved against one session does not match the next one by default.`,\n fix: 'Pass { resolve } to Timeline.fromJSON to map stored ids onto your own stable names.',\n docs: 'https://bakery3.com/docs/animation',\n });\n }\n target = object;\n }\n const track = timeline.track(target, stored.property);\n if (stored.label) track.label = stored.label;\n track.keyframes = stored.keyframes\n .map((keyframe) => ({ ...keyframe }))\n .sort((a, b) => a.time - b.time);\n }\n return timeline;\n }\n\n // -------------------------------------------------------------------------\n // Events\n // -------------------------------------------------------------------------\n\n /** Subscribe. Returns the unsubscribe, so a panel's teardown is one call and\n * a forgotten listener cannot keep a disposed scene alive. */\n on(event: TimelineEvent, listener: (payload: never) => void): () => void {\n const set = this._listeners.get(event) ?? new Set();\n set.add(listener as (payload: unknown) => void);\n this._listeners.set(event, set);\n return () => set.delete(listener as (payload: unknown) => void);\n }\n\n private emit(event: TimelineEvent, payload?: unknown): void {\n for (const listener of this._listeners.get(event) ?? []) listener(payload);\n // A structural change moves nothing on its own, but every readout that\n // watches 'time' also wants to be told the lanes changed underneath it.\n if (event === 'change') {\n for (const listener of this._listeners.get('time') ?? [])\n listener(this._time);\n }\n }\n\n // -------------------------------------------------------------------------\n // Internals\n // -------------------------------------------------------------------------\n\n /** The live value of a property, read through the shared property table. */\n live(target: TrackTarget, property: string): PropertyValue | undefined {\n const object =\n target === 'camera'\n ? this.cameraOrThrow(`Reading the camera's ${property}`)\n : target;\n if (!object) return undefined;\n return propertyDefinition(target, property)?.read(object as Object3D);\n }\n\n private find(target: TrackTarget, property: string): Track | undefined {\n const resolved = this.normalizeTarget(target);\n return this._tracks.find(\n (t) => t.target === resolved && t.property === property,\n );\n }\n\n private normalizeTarget(target: TrackTarget): TrackTarget {\n // The live camera and the string mean the same lane. Without this, an app\n // that passes its camera object to .to() and the panel's own 'camera'\n // tracks would author two lanes that fight over one object.\n return target === 'camera' || (this.camera && target === this.camera)\n ? 'camera'\n : target;\n }\n\n private span(options: SegmentOptions): { at: number; end: number } {\n const at = Math.max(0, options.at ?? 0);\n const duration = options.duration ?? Math.max(0, this._duration - at);\n return { at, end: at + duration };\n }\n\n /** Make sure a segment has something to start from at `at`. */\n private anchor(track: Track, at: number): void {\n if (track.keyframes.some((keyframe) => Math.abs(keyframe.time - at) < 1e-6))\n return;\n const value =\n this.valueAt(track, at) ?? this.live(track.target, track.property);\n if (value) this.insert(track, { time: at, value });\n }\n\n private insert(track: Track, keyframe: Keyframe): Keyframe {\n const index = track.keyframes.findIndex(\n (existing) => Math.abs(existing.time - keyframe.time) < 1e-6,\n );\n if (index >= 0) {\n track.keyframes[index] = keyframe;\n } else {\n track.keyframes.push(keyframe);\n track.keyframes.sort((a, b) => a.time - b.time);\n }\n return keyframe;\n }\n\n private requireCamera(what: string): Camera {\n const camera = this.camera;\n if (!camera) throw noCamera(`${what}()`, contexts.has(this));\n return camera;\n }\n\n /**\n * The camera, when one is needed. A client's timeline that has none by then\n * refuses, because the move it was asked for would otherwise be authored\n * from a made-up pose, or silently drive nothing. A standalone timeline\n * with no camera is a document that can still be read and sampled.\n */\n private cameraOrThrow(what: string): Camera | undefined {\n const camera = this.camera;\n if (!camera && contexts.has(this)) throw noCamera(what, true);\n return camera;\n }\n}\n\nfunction noCamera(what: string, bound: boolean): Bakery3Error {\n return new Bakery3Error({\n code: 'InvalidRequest',\n message: bound\n ? 'This timeline has no camera. Pass { scene, camera } to timeline(), or call bakery3.attach() first.'\n : 'This timeline has no camera. Pass { camera } to createTimeline(), or use bakery3.timeline() after bakery3.attach().',\n why: `${what} needs the camera, and the timeline was given none${bound ? ' and none is attached' : ''}.`,\n fix: bound\n ? 'Pass { scene, camera } to timeline(), or call bakery3.attach({ scene, camera, renderer }) before you author or play a camera move.'\n : 'Pass { camera } to createTimeline(), or set timeline.camera.',\n docs: 'https://bakery3.com/docs/animation#move-the-camera',\n });\n}\n\n/**\n * A timeline as a document.\n *\n * Targets travel as object ids rather than references, so this survives a page\n * reload, a database column and a git diff. `version` is here so a stored\n * timeline can be migrated rather than silently misread, the same reason the\n * manifest carries `protocolVersion`.\n */\nexport type TimelineJSON = {\n version: 1;\n duration: number;\n fps: number;\n center?: Vec3;\n tracks: Array<{\n target: { type: 'camera' } | { type: 'object'; objectId: string };\n property: string;\n label?: string;\n keyframes: Keyframe[];\n }>;\n};\n\n/**\n * A timeline, standing on its own.\n *\n * `bakery3.timeline()` is the same call with the attached scene and camera\n * filled in, and is what an application should normally use. This one exists\n * for the cases where there is no Bakery3 instance yet (a test, a timeline\n * built at module scope and handed to the panel), because authoring a camera\n * move should not need an API key.\n */\nexport function createTimeline(options: TimelineOptions = {}): Timeline {\n return new Timeline(options);\n}\n\n// ---------------------------------------------------------------------------\n\n/**\n * Anything a developer might reasonably type, as the flat array everything\n * downstream expects. A hex string becomes linear rgb here and only here.\n *\n * The result is exactly `size` long or this throws. A short value must not\n * pass through: `{ scale: 2 }` read as `[2]` would tween x alone, and the last\n * frame would write `scale.set(2, undefined, undefined)`, which is NaN and a\n * mesh that vanishes with no message.\n */\nfunction normalize(\n value: AuthoredValue,\n size: number,\n property: string,\n): PropertyValue {\n const flat = flatten(value, size, property);\n if (flat && flat.length === size && flat.every((n) => Number.isFinite(n)))\n return flat;\n throw new Bakery3Error({\n code: 'InvalidRequest',\n message: flat\n ? `\"${property}\" takes ${size === 1 ? 'one number' : `${size} numbers`}, and got ${describe(value)}.`\n : `Could not read a value for \"${property}\".`,\n why: 'Expected a number, an array, a hex color, or a three Vector3/Color/Euler, of the size the property has.',\n fix:\n size === 1\n ? `Pass a single number for \"${property}\".`\n : `Pass [x, y, z] or a Vector3 for \"${property}\", or \"#ff2d95\" for a color. A bare number is read as a uniform value for scale only.`,\n });\n}\n\nfunction flatten(\n value: AuthoredValue,\n size: number,\n property: string,\n): PropertyValue | null {\n if (typeof value === 'number') {\n // `scale: 2` is what a gsap habit types and it has one obvious meaning.\n // A bare number for a position or a rotation has none, so it is refused.\n return property === 'scale' ? new Array<number>(size).fill(value) : [value];\n }\n if (typeof value === 'string') return hexToLinear(value);\n if (Array.isArray(value)) return [...value];\n if ('x' in value) return [value.x, value.y, value.z];\n if ('r' in value) return [value.r, value.g, value.b];\n return null;\n}\n\nfunction describe(value: AuthoredValue): string {\n if (typeof value === 'number') return `the number ${value}`;\n if (typeof value === 'string') return `\"${value}\"`;\n if (Array.isArray(value)) return `an array of ${value.length}`;\n return 'x' in value ? 'a vector' : 'a color';\n}\n\nfunction resolveCenter(\n lookAt: Vec3 | Object3D | undefined,\n fallback: Vec3,\n): Vec3 {\n if (!lookAt) return fallback;\n if (Array.isArray(lookAt)) return [...lookAt] as Vec3;\n lookAt.updateMatrixWorld();\n const e = lookAt.matrixWorld.elements;\n return [e[12]!, e[13]!, e[14]!];\n}\n\nfunction degrees(value: number): number {\n return (value * Math.PI) / 180;\n}\n\nfunction slerp(a: Quat, b: Quat, t: number): PropertyValue {\n let dot = a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];\n let end: Quat = [...b];\n // The double cover: q and -q are the same rotation, and lerping toward the\n // far one takes the long way round for no reason a viewer can understand.\n if (dot < 0) {\n end = [-b[0], -b[1], -b[2], -b[3]];\n dot = -dot;\n }\n if (dot > 0.9995) {\n const out = a.map((value, i) => value + (end[i]! - value) * t) as number[];\n const length = Math.hypot(out[0]!, out[1]!, out[2]!, out[3]!) || 1;\n return out.map((value) => value / length);\n }\n const theta = Math.acos(dot);\n const sin = Math.sin(theta);\n const wa = Math.sin((1 - t) * theta) / sin;\n const wb = Math.sin(t * theta) / sin;\n return a.map((value, i) => value * wa + end[i]! * wb);\n}\n\nfunction labelFor(target: TrackTarget): string {\n if (target === 'camera') return 'camera';\n return target.name || target.type || 'object';\n}\n\n/**\n * A stored track target, back to a live object.\n *\n * Matches `userData.bakery3Id` first and the raw uuid second. The declared id\n * is the one that survives a reload (see capture/ids.ts) and is what `toJSON`\n * writes; the uuid arm keeps timelines saved with a raw uuid loading.\n */\nfunction findByUuid(\n scene: Scene | undefined,\n id: string,\n): Object3D | undefined {\n if (!scene) return undefined;\n let found: Object3D | undefined;\n scene.traverse((object) => {\n if (!found && (idOf(object) === id || object.uuid === id)) found = object;\n });\n return found;\n}\n\n/** The center of everything the scene draws, world space. */\nfunction boundingCenter(scene: Scene): Vec3 | null {\n let min: Vec3 | null = null;\n let max: Vec3 | null = null;\n scene.traverse((object) => {\n const mesh = object as Object3D & { isMesh?: boolean };\n if (!mesh.isMesh) return;\n object.updateMatrixWorld();\n const e = object.matrixWorld.elements;\n const point: Vec3 = [e[12]!, e[13]!, e[14]!];\n if (!min || !max) {\n min = [...point];\n max = [...point];\n return;\n }\n for (let i = 0; i < 3; i++) {\n min[i] = Math.min(min[i]!, point[i]!);\n max[i] = Math.max(max[i]!, point[i]!);\n }\n });\n if (!min || !max) return null;\n const lo = min as Vec3;\n const hi = max as Vec3;\n return [(lo[0] + hi[0]) / 2, (lo[1] + hi[1]) / 2, (lo[2] + hi[2]) / 2];\n}\n\nexport { eulerToQuaternion, lookAtQuaternion };\n\n// Playback clock. `requestAnimationFrame` when there is a browser to ask, and\n// a timer otherwise, so a timeline can be played (and tested) headlessly.\nfunction now(): number {\n return typeof performance !== 'undefined' ? performance.now() : Date.now();\n}\n\nfunction schedule(\n callback: () => void,\n): ReturnType<typeof setTimeout> | number {\n if (typeof requestAnimationFrame === 'function')\n return requestAnimationFrame(callback);\n return setTimeout(callback, 16);\n}\n\nfunction cancel(handle: ReturnType<typeof setTimeout> | number | null): void {\n if (handle === null) return;\n if (\n typeof cancelAnimationFrame === 'function' &&\n typeof handle === 'number'\n ) {\n cancelAnimationFrame(handle);\n return;\n }\n clearTimeout(handle as ReturnType<typeof setTimeout>);\n}\n","/**\n * gsap and Theatre.js, without a dependency on either.\n *\n * The adapters sample through, they do not translate. Neither library's eases\n * are parsed, no plugin surface is reimplemented, nothing is inspected beyond\n * \"can this thing be told to go to time t\". The adapter seeks the foreign\n * timeline frame by frame and writes down where the named objects ended up.\n *\n * That is a trade. It loses the ability to re-time the result later, and it\n * wins exactness: whatever gsap does (a custom ease, a stagger, a plugin\n * nobody here has heard of) is what gets rendered, because the numbers came\n * out of gsap itself.\n *\n * Both return a plain `Timeline`, so the panel, `seek()` and `renderVideo()`\n * do not know or care where the motion came from.\n */\n\nimport type { Camera, Object3D, Scene } from 'three';\nimport { Bakery3Error } from '../errors.js';\nimport { readCameraLookAt } from './properties.js';\nimport { Timeline, type TrackTarget } from './timeline.js';\n\n/** One property of one object to record. `'camera'` is allowed and behaves\n * the way it does everywhere else in the timeline. */\nexport type SampledTrack = {\n object: TrackTarget;\n property: string;\n label?: string;\n};\n\nexport type AdapterOptions = {\n /** Sampling rate. Also the timeline's own fps unless overridden at bake. */\n fps?: number;\n /** Seconds. Required when the foreign timeline cannot report its own. */\n duration?: number;\n /**\n * What to record. Required, and there is no \"everything\" option: the adapter\n * cannot ask gsap what it animates without reimplementing gsap, so a list it\n * guessed would be a video quietly missing whatever was not guessed.\n */\n tracks: SampledTrack[];\n /** Needed for any camera track: the pose is read off the live camera at\n * each sampled frame, not out of the source timeline. */\n camera?: Camera;\n scene?: Scene;\n};\n\n/**\n * A gsap timeline or tween.\n *\n * `seek(t, suppressEvents)` is gsap 3's API; `time(t)` is the older shape and\n * is still what a few wrappers expose, so both are tried. Events are\n * suppressed where the library allows it: sampling should not fire your\n * `onUpdate` two hundred times.\n */\nexport function timelineFromGsap(\n gsapTimeline: unknown,\n options: AdapterOptions,\n): Timeline {\n const source = gsapTimeline as {\n seek?: (position: number, suppressEvents?: boolean) => unknown;\n time?: ((position?: number, suppressEvents?: boolean) => unknown) | number;\n duration?: (() => number) | number;\n pause?: () => unknown;\n play?: () => unknown;\n paused?: () => boolean;\n };\n\n const duration = options.duration ?? numberFrom(source.duration);\n if (!duration || !Number.isFinite(duration)) {\n throw refusal(\n 'gsap',\n 'the timeline did not report a duration',\n 'Pass { duration }: an infinitely repeating gsap timeline has no length to bake.',\n );\n }\n\n const wasPaused =\n typeof source.paused === 'function' ? source.paused() : true;\n const before =\n typeof source.time === 'function' ? (source.time() as number) : 0;\n source.pause?.();\n\n const seek = (time: number) => {\n if (typeof source.seek === 'function') source.seek(time, false);\n else if (typeof source.time === 'function') source.time(time, false);\n else {\n throw refusal(\n 'gsap',\n 'the object has neither seek() nor time()',\n 'Pass the gsap.timeline() itself rather than a wrapper around it.',\n );\n }\n };\n\n try {\n return record(seek, duration, options);\n } finally {\n // Put the source timeline back exactly as it was found. Sampling is an\n // inspection, and an inspection that leaves an application paused at 4.7\n // seconds is a bug report nobody will connect back to this call.\n seek(before);\n if (!wasPaused) source.play?.();\n }\n}\n\n/**\n * A Theatre.js sequence (`sheet.sequence`).\n *\n * Theatre drives time by assignment (`sequence.position = t`) rather than by a\n * method, and reports its length on `.length` when the project defines one.\n */\nexport function timelineFromTheatre(\n sequence: unknown,\n options: AdapterOptions,\n): Timeline {\n const source = sequence as {\n position?: number;\n length?: number;\n pause?: () => unknown;\n };\n\n const duration =\n options.duration ?? (typeof source.length === 'number' ? source.length : 0);\n if (!duration || !Number.isFinite(duration)) {\n throw refusal(\n 'Theatre.js',\n 'the sequence did not report a length',\n 'Pass { duration }, or set the sequence length in the Theatre studio.',\n );\n }\n\n const before = typeof source.position === 'number' ? source.position : 0;\n source.pause?.();\n\n const seek = (time: number) => {\n source.position = time;\n };\n\n try {\n return record(seek, duration, options);\n } finally {\n seek(before);\n }\n}\n\n/**\n * Seek, read, repeat.\n *\n * One keyframe per frame with no easing: the values already carry whatever\n * curve the source applied, so any ease on top of them would be a second one.\n */\nfunction record(\n seek: (time: number) => void,\n duration: number,\n options: AdapterOptions,\n): Timeline {\n const fps = Math.max(1, Math.round(options.fps ?? 30));\n const frames = Math.max(1, Math.round(duration * fps));\n const timeline = new Timeline({\n duration,\n fps,\n ...(options.camera ? { camera: options.camera } : {}),\n ...(options.scene ? { scene: options.scene } : {}),\n });\n\n const tracks = options.tracks.map((spec) => {\n const track = timeline.track(spec.object, spec.property);\n if (spec.label) track.label = spec.label;\n return { spec, track };\n });\n\n for (let frame = 0; frame < frames; frame++) {\n const time = frame / fps;\n seek(time);\n for (const { spec, track } of tracks) {\n const value = readLive(timeline, spec);\n if (!value) continue;\n track.keyframes.push({ time, value });\n }\n }\n\n for (const { track } of tracks)\n track.keyframes.sort((a, b) => a.time - b.time);\n timeline.seek(0);\n return timeline;\n}\n\n/**\n * The live value, including the one the property table cannot read.\n *\n * `lookAt` has no storage on a camera (it is a method), so it is recovered\n * from the camera's own forward axis. Without this, a gsap timeline that\n * rotates the camera would sample a moving position with a frozen aim, which\n * is a video that pans when the browser did not.\n */\nfunction readLive(\n timeline: Timeline,\n spec: SampledTrack,\n): number[] | undefined {\n if (spec.object === 'camera' && spec.property === 'lookAt') {\n return timeline.camera\n ? readCameraLookAt(timeline.camera, timeline.center)\n : undefined;\n }\n const value = timeline.live(spec.object, spec.property);\n return value ? [...value] : undefined;\n}\n\nfunction numberFrom(value: (() => number) | number | undefined): number {\n if (typeof value === 'function') return value();\n return typeof value === 'number' ? value : 0;\n}\n\nfunction refusal(library: string, why: string, fix: string): Bakery3Error {\n return new Bakery3Error({\n code: 'InvalidRequest',\n message: `Could not sample the ${library} timeline.`,\n why,\n fix,\n docs: 'https://bakery3.com/docs/animation#adapters',\n });\n}\n","/**\n * TSL to a renderer-neutral shader graph.\n *\n * A `MeshStandardNodeMaterial` is already a graph of small typed operations.\n * This walks that live graph structurally and writes it down as the\n * protocol's shader graph (see `protocol/shader.ts`), naming every\n * node it cannot translate instead of skipping or approximating it.\n *\n * Structural, not nominal. Nothing here imports from three: `instanceof`\n * would tie `check()` to `three/tsl`, which only exists from r167, and the\n * checker must run for everyone. TSL nodes are recognized the way three\n * recognizes them internally, by their `.type` string and their `isX` flags,\n * which also keeps this working across three versions.\n *\n * Two things need more than structure:\n * - anonymous singletons (`positionWorld`, `time`) are recognized by uuid,\n * registered when the developer imports `@oeave/bakery3/tsl`\n * - `Fn()` calls are expanded by running their JS function, which works for\n * the pure composition functions TSL libraries are made of and fails\n * safely (a named issue, not a crash) for anything builder-dependent.\n *\n * Uniforms are baked to the value they held at capture. A still render is a\n * snapshot of the application; `time`-driven shaders render the moment the\n * button was pressed, and the report says so.\n */\n\nimport type { Texture } from 'three';\nimport type {\n CompatibilityIssue,\n MaterialShaderSpec,\n ShaderGraph,\n ShaderGraphNode,\n ShaderMaterialProperties,\n ShaderSlot,\n} from '../protocol/index.js';\nimport { SHADER_GRAPH_VERSION, SHADER_OPS } from '../protocol/index.js';\nimport { idOf } from '../capture/ids.js';\nimport {\n BAKERY_NODE_MARKER,\n builtinFor,\n toNodeObject,\n tslRuntimeRegistered,\n type BakeryNodeMarker,\n} from './registry.js';\n\nconst DOCS = 'https://bakery3.com/docs';\n\n/** The structural view of a TSL node: every property this file reads. */\ntype TSLNode = {\n isNode?: boolean;\n uuid: string;\n type?: string;\n nodeType?: string | null;\n // OperatorNode / MathNode\n op?: string;\n method?: string;\n aNode?: TSLNode | null;\n bNode?: TSLNode | null;\n cNode?: TSLNode | null;\n // ConstNode / UniformNode\n value?: unknown;\n isUniformNode?: boolean;\n name?: string | null;\n // SplitNode / ConvertNode / VarNode / pass-throughs\n node?: TSLNode | null;\n components?: string;\n convertTo?: string;\n // JoinNode\n nodes?: TSLNode[];\n // TextureNode\n isTextureNode?: boolean;\n uvNode?: TSLNode | null;\n // AttributeNode\n _attributeName?: string;\n // ConditionalNode\n condNode?: TSLNode;\n ifNode?: TSLNode;\n elseNode?: TSLNode | null;\n // RemapNode\n inLowNode?: TSLNode;\n inHighNode?: TSLNode;\n outLowNode?: TSLNode;\n outHighNode?: TSLNode;\n doClamp?: boolean;\n // RotateNode\n positionNode?: TSLNode;\n rotationNode?: TSLNode;\n // NormalMapNode / BumpMapNode\n scaleNode?: TSLNode | null;\n textureNode?: TSLNode;\n // Fn calls\n isShaderCallNodeInternal?: boolean;\n shaderNode?: {\n jsFunc?: (...args: unknown[]) => unknown;\n layout?: { name?: string; inputs?: Array<{ type?: string }> } | null;\n once?: boolean;\n };\n rawInputs?: unknown;\n // FunctionOverloadingNode: overloadingFn([...]) from TSL libraries\n functionNodes?: Array<{ shaderNode?: { layout?: { name?: string } | null } }>;\n parametersNodes?: unknown[];\n // Marker from @oeave/bakery3/tsl\n [BAKERY_NODE_MARKER]?: BakeryNodeMarker;\n getSelf?: () => TSLNode;\n};\n\n/** A texture the graph samples; capture hashes its pixels and fills the id. */\nexport type ShaderTextureRef = {\n texture: Texture;\n /** Every graph node param waiting for this texture's asset hash. */\n apply: (image: string) => void;\n};\n\nexport type ExtractedShader = {\n /** Null when nothing was extractable at all. */\n spec: MaterialShaderSpec | null;\n /** Slot names that translated cleanly. */\n supportedSlots: ShaderSlot[];\n /** Slot names that had to be dropped, with why in `issues`. */\n failedSlots: ShaderSlot[];\n issues: Omit<\n CompatibilityIssue,\n 'path' | 'materialId' | 'materialName' | 'materialType'\n >[];\n textures: ShaderTextureRef[];\n};\n\n// ---------------------------------------------------------------------------\n// Operator and method tables\n// ---------------------------------------------------------------------------\n\nconst OPERATORS: Record<string, string> = {\n '+': 'add',\n '-': 'sub',\n '*': 'mul',\n '/': 'div',\n '%': 'mod',\n '<': 'less_than',\n '>': 'greater_than',\n '<=': 'less_equal',\n '>=': 'greater_equal',\n '==': 'equal',\n '!=': 'not_equal',\n '&&': 'and',\n '||': 'or',\n};\n\n/** MathNode methods that map one-to-one. Argument order is GLSL's. */\nconst MATH_METHODS: Record<string, string> = {\n radians: 'radians',\n degrees: 'degrees',\n exp: 'exp',\n exp2: 'exp2',\n log: 'log',\n log2: 'log2',\n sqrt: 'sqrt',\n inversesqrt: 'inverse_sqrt',\n floor: 'floor',\n ceil: 'ceil',\n normalize: 'normalize',\n fract: 'fract',\n sin: 'sin',\n cos: 'cos',\n tan: 'tan',\n asin: 'asin',\n acos: 'acos',\n abs: 'abs',\n sign: 'sign',\n length: 'length',\n negate: 'negate',\n oneMinus: 'one_minus',\n round: 'round',\n reciprocal: 'reciprocal',\n trunc: 'trunc',\n min: 'min',\n max: 'max',\n step: 'step',\n reflect: 'reflect',\n distance: 'distance',\n dot: 'dot',\n cross: 'cross',\n pow: 'pow',\n mix: 'mix',\n clamp: 'clamp',\n refract: 'refract',\n smoothstep: 'smoothstep',\n faceforward: 'faceforward',\n saturate: 'saturate',\n};\n\n/** Methods that exist in TSL but have no meaning to a path tracer. */\nconst MATH_REFUSED: Record<string, string> = {\n dFdx: 'Screen-space derivatives do not exist in a path tracer: there is no screen-space neighbor to difference against.',\n dFdy: 'Screen-space derivatives do not exist in a path tracer: there is no screen-space neighbor to difference against.',\n fwidth:\n 'Screen-space derivatives do not exist in a path tracer: there is no screen-space neighbor to difference against.',\n};\n\n/**\n * VarNode / VaryingNode names three itself stamps onto its builtins. This is\n * the recognition path that works without `@oeave/bakery3/tsl`: `normalWorld`\n * is literally `…toVar('normalWorld')` inside three.\n */\nconst NAMED_BUILTINS: Record<\n string,\n { op: string; params?: Record<string, string | number> }\n> = {\n normalView: { op: 'normal', params: { space: 'view' } },\n normalWorld: { op: 'normal', params: { space: 'world' } },\n normalLocal: { op: 'normal', params: { space: 'local' } },\n positionLocal: { op: 'position', params: { space: 'local' } },\n positionWorld: { op: 'position', params: { space: 'world' } },\n positionView: { op: 'position', params: { space: 'view' } },\n positionViewDirection: { op: 'view_direction' },\n};\n\n/**\n * TSL library functions recognized by the layout name their authors gave\n * them. This is how MaterialX noise maps to the renderer's own noise textures\n * instead of being flagged: approximate, and reported as such.\n */\ntype NamedFunction = {\n op: string;\n params?: Record<string, number | string>;\n inputCount?: number;\n /**\n * three runs a 2D variant when the coordinate is a vec2 (its default,\n * `uv()`, is one) and a 3D one otherwise, and the two differ in more than\n * placement: a 3D field sliced flat has larger cells on average. Such an\n * op records `dimensions: 2` when its coordinate is known to be 2D.\n */\n planar?: boolean;\n};\n\nconst NAMED_FUNCTIONS: Record<string, NamedFunction> = {\n mx_perlin_noise_float: { op: 'mx_noise', inputCount: 1 },\n mx_perlin_noise_vec3: {\n op: 'mx_noise',\n params: { vector: 1 },\n inputCount: 1,\n },\n mx_fractal_noise_float: { op: 'mx_fractal_noise', inputCount: 4 },\n mx_fractal_noise_vec2: {\n op: 'mx_fractal_noise',\n params: { vector: 1 },\n inputCount: 4,\n },\n mx_fractal_noise_vec3: {\n op: 'mx_fractal_noise',\n params: { vector: 1 },\n inputCount: 4,\n },\n mx_fractal_noise_vec4: {\n op: 'mx_fractal_noise',\n params: { vector: 1 },\n inputCount: 4,\n },\n mx_worley_noise_float: { op: 'mx_worley_noise', inputCount: 2, planar: true },\n // The squared distances to the nearest two, and three, points.\n mx_worley_noise_vec2: {\n op: 'mx_worley_noise',\n params: { vector: 1, features: 2 },\n inputCount: 2,\n planar: true,\n },\n mx_worley_noise_vec3: {\n op: 'mx_worley_noise',\n params: { vector: 1, features: 3 },\n inputCount: 2,\n planar: true,\n },\n mx_cell_noise_float: { op: 'mx_cell_noise', inputCount: 1 },\n};\n\n// ---------------------------------------------------------------------------\n// Widths\n// ---------------------------------------------------------------------------\n\n/** Components in a value of each type the IR names. */\nconst TYPE_WIDTH: Record<string, number> = {\n float: 1,\n int: 1,\n uint: 1,\n bool: 1,\n vec2: 2,\n vec3: 3,\n color: 3,\n vec4: 4,\n};\n\nconst widest = (widths: (number | undefined)[]): number | undefined =>\n widths.length && widths.every((w) => w !== undefined)\n ? Math.max(...(widths as number[]))\n : undefined;\n\n/**\n * How many components an op's value has: the one part of three's type\n * system the IR does not write down, worked out the way three's own nodes\n * work it out. It matters where three picks between variants by width: a\n * `convert` to `'vec2|vec3'`, and the 2D or 3D Worley behind it. Undefined\n * when the inputs do not say, and then nothing is decided by it.\n */\nfunction outputWidth(\n op: string,\n inputs: (number | undefined)[],\n params?: ShaderGraphNode['params'],\n): number | undefined {\n switch (op) {\n case 'const':\n case 'uniform': {\n const type = TYPE_WIDTH[String(params?.type)];\n if (type) return type;\n return Array.isArray(params?.value) ? params.value.length : 1;\n }\n case 'uv':\n return 2;\n case 'position':\n case 'normal':\n case 'view_direction':\n case 'camera_position':\n case 'normal_map':\n case 'bump_map':\n case 'cross':\n return 3;\n case 'vertex_color':\n case 'texture':\n return 4;\n case 'dot':\n case 'length':\n case 'distance':\n case 'luminance':\n case 'checker':\n return 1;\n case 'swizzle':\n return String(params?.components ?? 'x').length;\n case 'convert':\n return TYPE_WIDTH[String(params?.to)];\n case 'join':\n return inputs.every((w) => w !== undefined)\n ? (inputs as number[]).reduce((sum, w) => sum + w, 0)\n : undefined;\n case 'select':\n return widest(inputs.slice(1));\n case 'reflect':\n case 'refract':\n case 'faceforward':\n case 'rotate':\n case 'remap':\n return inputs[0];\n }\n // A library function's width is its name's (`emitNamed`); a bakery op's is\n // not needed by anything yet.\n if (op.startsWith('mx_') || op.startsWith('bk_')) return undefined;\n // Arithmetic, math and comparison: three widens to the widest operand.\n return widest(inputs);\n}\n\n// ---------------------------------------------------------------------------\n// Extraction\n// ---------------------------------------------------------------------------\n\n/**\n * Thrown internally when a subtree cannot be translated; carries the issue\n * that explains it. Caught per slot: one bad slot falls back to the static\n * property while the others still translate.\n */\nclass Untranslatable extends Error {\n constructor(readonly issue: ExtractedShader['issues'][number]) {\n super(issue.message);\n }\n}\n\nclass GraphWriter {\n nodes: ShaderGraphNode[] = [];\n issues: ExtractedShader['issues'] = [];\n textures = new Map<string, ShaderTextureRef>();\n /** Ops seen, for the once-per-material approximate/bakery notes. */\n opsUsed = new Set<string>();\n\n private memo = new Map<string, string>();\n private nextId = 0;\n /** Fn-expansion results, cached so a shared call node stays shared. */\n private expanded = new Map<string, TSLNode>();\n /** Components in each emitted value, where they can be known (`outputWidth`). */\n private widths = new Map<string, number>();\n\n emit(\n op: string,\n inputs?: (string | null)[],\n params?: ShaderGraphNode['params'],\n ): string {\n const id = `n${this.nextId++}`;\n this.opsUsed.add(op);\n this.nodes.push({\n id,\n op,\n ...(inputs && inputs.length ? { inputs: inputs as string[] } : {}),\n ...(params && Object.keys(params).length ? { params } : {}),\n });\n const width = outputWidth(\n op,\n (inputs ?? []).map((input) =>\n input ? this.widths.get(input) : undefined,\n ),\n params,\n );\n if (width) this.widths.set(id, width);\n return id;\n }\n\n constant(value: number | number[], type: string): string {\n return this.emit('const', undefined, { value, type });\n }\n\n refuse(code: string, message: string, docsAnchor = 'shader-nodes'): never {\n throw new Untranslatable({\n code,\n severity: 'error',\n message,\n docs: `${DOCS}/${docsAnchor}`,\n });\n }\n\n /**\n * The walk. Returns the IR id of the node's value.\n *\n * Dispatch order matters: the bakery-node marker and the uuid registry\n * come before structure, because a marked node's TSL subtree is only its\n * browser preview and must not be extracted.\n */\n visit(input: unknown): string {\n const node = unwrap(input);\n\n if (node === null || node === undefined) {\n this.refuse('shader_node_missing', 'A node input was null.');\n }\n\n // A plain JS number/boolean used directly as an input.\n if (typeof node === 'number') return this.constant(node, 'float');\n if (typeof node === 'boolean') return this.constant(node ? 1 : 0, 'float');\n\n const tsl = node as TSLNode;\n if (!tsl.isNode) {\n const value = serializeValue(tsl);\n if (value) return this.constant(value.value, value.type);\n this.refuse(\n 'shader_node_unknown',\n `A shader input was not a node (${describe(tsl)}).`,\n );\n }\n\n const seen = this.memo.get(tsl.uuid);\n if (seen) return seen;\n const id = this.visitFresh(tsl);\n this.memo.set(tsl.uuid, id);\n return id;\n }\n\n private visitFresh(node: TSLNode): string {\n // 1. A bakery-only node from @oeave/bakery3/tsl. Its marker is the truth;\n // the TSL underneath is the viewport sketch.\n const marker = node[BAKERY_NODE_MARKER];\n if (marker) {\n const inputs = (marker.inputs ?? []).map((input) => this.visit(input));\n return this.emit(marker.op, inputs, marker.params);\n }\n\n // 2. A registered singleton: positionWorld, cameraPosition, time.\n const builtin = builtinFor(node.uuid);\n if (builtin) {\n return this.emit(builtin.op, undefined, builtin.params?.());\n }\n\n // 3. Structure.\n const type = node.type ?? 'Node';\n\n switch (type) {\n case 'ConstNode':\n return this.emitValue(node, 'const');\n\n case 'UniformNode': {\n // Baked. The live value is the captured application state, the same\n // stance the manifest takes on visibility and morphs.\n return this.emitValue(node, 'uniform');\n }\n\n case 'OperatorNode': {\n const op = OPERATORS[node.op ?? ''];\n if (!op) {\n this.refuse(\n 'shader_node_unsupported',\n `The \"${node.op}\" operator cannot be translated: bitwise operations do not exist as shader nodes.`,\n );\n }\n return this.emit(op, [this.visit(node.aNode), this.visit(node.bNode)]);\n }\n\n case 'MathNode': {\n const method = node.method ?? '';\n const refused = MATH_REFUSED[method];\n if (refused) {\n this.refuse(\n 'shader_node_unsupported',\n `\\`${method}()\\` cannot be translated. ${refused}`,\n );\n }\n if (method === 'atan' && node.bNode) {\n return this.emit('atan2', [\n this.visit(node.aNode),\n this.visit(node.bNode),\n ]);\n }\n const op = MATH_METHODS[method];\n if (!op) {\n this.refuse(\n 'shader_node_unsupported',\n `The \\`${method}()\\` math function has no render-engine equivalent.`,\n );\n }\n const inputs = [node.aNode, node.bNode, node.cNode]\n .filter((n) => n !== null && n !== undefined)\n .map((n) => this.visit(n));\n return this.emit(op, inputs);\n }\n\n case 'ConditionalNode':\n return this.emit('select', [\n this.visit(node.condNode),\n this.visit(node.ifNode),\n node.elseNode ? this.visit(node.elseNode) : this.constant(0, 'float'),\n ]);\n\n case 'RemapNode':\n return this.emit(\n 'remap',\n [\n this.visit(node.node),\n this.visit(node.inLowNode),\n this.visit(node.inHighNode),\n this.visit(node.outLowNode),\n this.visit(node.outHighNode),\n ],\n { clamp: node.doClamp ?? false },\n );\n\n case 'SplitNode': {\n const components = node.components ?? 'x';\n if (!/^[xyzwrgba]{1,4}$/.test(components)) {\n this.refuse(\n 'shader_node_unsupported',\n `Swizzle \".${components}\" is not translatable.`,\n );\n }\n return this.emit('swizzle', [this.visit(node.node)], { components });\n }\n\n case 'JoinNode': {\n const parts = (node.nodes ?? []).map((n) => this.visit(n));\n if (parts.length < 2 || parts.length > 4) {\n this.refuse(\n 'shader_node_unsupported',\n `join() of ${parts.length} components is not translatable.`,\n );\n }\n return this.emit('join', parts);\n }\n\n case 'ConvertNode': {\n const inner = this.visit(node.node);\n const width = this.widths.get(inner);\n // three's ConvertNode: the option as wide as the value, else the\n // first. MaterialX's noise converts its coordinate to 'vec2|vec3',\n // so this is what picks its 2D or 3D variant.\n const options = (node.convertTo ?? '').split('|');\n let to = options[0]!;\n for (const option of options)\n if (width !== undefined && TYPE_WIDTH[option] === width) to = option;\n const id = this.emit('convert', [inner], { to });\n // A choice made without knowing the value's width is a guess, and\n // nothing downstream may be decided by a guess.\n if (options.length > 1 && width === undefined) this.widths.delete(id);\n return id;\n }\n\n case 'FlipNode':\n // flip(x) on a float is 1-x; on vectors it flips per component.\n return this.emit('one_minus', [this.visit(node.node)]);\n\n case 'RotateNode':\n return this.emit('rotate', [\n this.visit(node.positionNode),\n this.constant([0, 0, 1], 'vec3'),\n this.visit(node.rotationNode),\n ]);\n\n case 'NormalMapNode':\n return this.emit('normal_map', [\n this.visit(node.node),\n node.scaleNode\n ? this.visit(node.scaleNode)\n : this.constant(1, 'float'),\n ]);\n\n case 'BumpMapNode':\n return this.emit('bump_map', [\n this.visit(node.textureNode),\n node.scaleNode\n ? this.visit(node.scaleNode)\n : this.constant(1, 'float'),\n ]);\n\n case 'AttributeNode':\n return this.emitAttribute(node);\n\n case 'VertexColorNode':\n return this.emit('vertex_color');\n\n case 'TextureNode':\n return this.emitTexture(node);\n\n case 'VarNode':\n case 'VaryingNode': {\n const named = node.name ? NAMED_BUILTINS[node.name] : undefined;\n if (named) return this.emit(named.op, undefined, named.params);\n // A developer's own `.toVar()` is purely organisational; look through.\n if (node.node) return this.visit(node.node);\n this.refuse(\n 'shader_node_unsupported',\n `Variable \"${node.name ?? 'unnamed'}\" has no source node.`,\n );\n }\n\n // Purely organisational wrappers: the value is the wrapped node.\n case 'ContextNode':\n case 'CacheNode':\n case 'DebugNode':\n if (node.node) return this.visit(node.node);\n this.refuse('shader_node_unsupported', `${type} has no inner node.`);\n break;\n\n // overloadingFn([...]): how MaterialX's noise family is published.\n // The variants share a base name ('mx_perlin_noise_float_0/_1'), which\n // is what the catalog knows them by.\n case 'FunctionOverloadingNode': {\n const first = (node.functionNodes ?? [])[0];\n const layout = first?.shaderNode?.layout?.name;\n const base = layout?.replace(/_\\d+$/, '');\n const named = base ? NAMED_FUNCTIONS[base] : undefined;\n if (named) return this.emitNamed(named, base!, node.parametersNodes);\n this.refuse(\n 'shader_fn_opaque',\n `The overloaded shader function ${layout ?? '(unnamed)'} has no render-engine equivalent.`,\n );\n break;\n }\n\n default:\n break;\n }\n\n // 4. An Fn() call: a named library function, or expandable composition.\n if (node.isShaderCallNodeInternal || node.shaderNode) {\n return this.emitFnCall(node);\n }\n\n this.refuse(\n 'shader_node_unsupported',\n `${describeNodeType(type)} cannot be translated.`,\n );\n }\n\n private emitValue(node: TSLNode, op: 'const' | 'uniform'): string {\n const serialized = serializeValue(node.value);\n if (!serialized) {\n this.refuse(\n 'shader_node_unsupported',\n op === 'uniform'\n ? `A uniform holds a ${describe(node.value)}, which cannot travel as a shader value (matrices and textures cannot).`\n : `A constant holds a ${describe(node.value)}, which cannot travel as a shader value.`,\n );\n }\n const params: ShaderGraphNode['params'] = {\n value: serialized.value,\n type: serialized.type,\n };\n if (op === 'uniform' && node.name) params.name = node.name;\n return this.emit(op, undefined, params);\n }\n\n private emitAttribute(node: TSLNode): string {\n const name = node._attributeName ?? '';\n const uvIndex = /^uv(\\d?)$/.exec(name);\n if (uvIndex) {\n return this.emit('uv', undefined, {\n index: uvIndex[1] ? Number(uvIndex[1]) : 0,\n });\n }\n if (name === 'position')\n return this.emit('position', undefined, { space: 'local' });\n if (name === 'normal')\n return this.emit('normal', undefined, { space: 'local' });\n if (name === 'color') return this.emit('vertex_color');\n this.refuse(\n 'shader_attribute_unsupported',\n `The custom geometry attribute \"${name}\" does not survive glTF export, so the renderer cannot read it. Rename it to a COLOR_0/TEXCOORD channel or bake it to a texture.`,\n );\n }\n\n private emitTexture(node: TSLNode): string {\n const texture = node.value as Texture | undefined;\n if (!texture || !(texture as { isTexture?: boolean }).isTexture) {\n this.refuse(\n 'shader_texture_missing',\n 'A texture node has no texture assigned.',\n );\n }\n const uvInput = node.uvNode\n ? this.visit(node.uvNode)\n : this.emit('uv', undefined, { index: 0 });\n return this.sampleTexture(texture, uvInput);\n }\n\n /** A texture sample from a known texture; also used for the static maps. */\n sampleTexture(texture: Texture, uvInput?: string): string {\n const uv = uvInput ?? this.emit('uv', undefined, { index: 0 });\n const params: ShaderGraphNode['params'] = {\n image: '',\n colorSpace: texture.colorSpace === 'srgb' ? 'srgb' : 'linear',\n wrap: wrapMode(texture),\n filter:\n (texture as { magFilter?: number }).magFilter === 1003\n ? 'nearest'\n : 'linear',\n // three's default. A GLTFLoader texture has flipY false, and the\n // renderer compensates with a V flip so both sample the image the same\n // way up.\n flipY: (texture as { flipY?: boolean }).flipY !== false,\n };\n const id = this.emit('texture', [uv], params);\n\n const existing = this.textures.get(texture.uuid);\n if (existing) {\n const previous = existing.apply;\n existing.apply = (image) => {\n previous(image);\n params.image = image;\n };\n } else {\n this.textures.set(texture.uuid, {\n texture,\n apply: (image) => {\n params.image = image;\n },\n });\n }\n return id;\n }\n\n private emitFnCall(node: TSLNode): string {\n const layoutName = node.shaderNode?.layout?.name;\n const named = layoutName\n ? (NAMED_FUNCTIONS[layoutName] ??\n NAMED_FUNCTIONS[layoutName.replace(/_\\d+$/, '')])\n : undefined;\n if (named) {\n return this.emitNamed(\n named,\n layoutName!.replace(/_\\d+$/, ''),\n Array.isArray(node.rawInputs) ? node.rawInputs : [],\n // A variant called directly declares its coordinate's type.\n TYPE_WIDTH[node.shaderNode?.layout?.inputs?.[0]?.type ?? ''],\n );\n }\n\n // Expand: run the function. TSL library functions are pure compositions,\n // so calling them again rebuilds the same subgraph, which then extracts\n // like anything hand-written. Builder-dependent functions throw and are\n // named.\n const expandedNode = this.expand(node);\n if (expandedNode) return this.visit(expandedNode);\n\n const label = layoutName ?? 'an anonymous Fn()';\n this.refuse(\n 'shader_fn_opaque',\n `The shader function ${label} could not be analyzed: it depends on renderer state the SDK cannot see.` +\n (tslRuntimeRegistered()\n ? ''\n : ` If it is a three.js builtin, importing '@oeave/bakery3/tsl' teaches the checker to recognize it.`),\n );\n }\n\n /**\n * A library function by its base name ('mx_worley_noise_vec2'). The name\n * says how wide its value is; a `planar` one records a 2D coordinate.\n */\n private emitNamed(\n named: NamedFunction,\n base: string,\n raw: unknown[] = [],\n declared?: number,\n ): string {\n const inputs = raw\n .slice(0, named.inputCount ?? raw.length)\n .map((input) => this.visit(input));\n const params = { ...named.params };\n const coordinate =\n declared ?? (inputs[0] ? this.widths.get(inputs[0]) : undefined);\n if (named.planar && coordinate === 2) params.dimensions = 2;\n const id = this.emit(named.op, inputs, params);\n const width = TYPE_WIDTH[base.slice(base.lastIndexOf('_') + 1)];\n if (width) this.widths.set(id, width);\n return id;\n }\n\n private expand(node: TSLNode): TSLNode | null {\n const cached = this.expanded.get(node.uuid);\n if (cached) return cached;\n const jsFunc = node.shaderNode?.jsFunc;\n if (typeof jsFunc !== 'function') return null;\n try {\n const raw = node.rawInputs;\n const inputs = Array.isArray(raw) ? raw.map(toNodeObject) : raw;\n const result = unwrap(\n jsFunc(Array.isArray(inputs) ? inputs : (inputs ?? [])),\n );\n if (result && (result as TSLNode).isNode) {\n this.expanded.set(node.uuid, result as TSLNode);\n return result as TSLNode;\n }\n return null;\n } catch {\n return null;\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Material-level extraction\n// ---------------------------------------------------------------------------\n\n/** The material properties this file reads, structurally. */\ntype AnyNodeMaterial = {\n uuid: string;\n name?: string;\n type?: string;\n isNodeMaterial?: boolean;\n isMeshStandardNodeMaterial?: boolean;\n isMeshPhysicalNodeMaterial?: boolean;\n isMeshBasicNodeMaterial?: boolean;\n [key: string]: unknown;\n};\n\nexport function isNodeMaterial(material: unknown): material is AnyNodeMaterial {\n return Boolean((material as AnyNodeMaterial)?.isNodeMaterial);\n}\n\n/** slot → the TSL property that drives it. Order is documentation only. */\nconst SLOT_NODES: Array<[ShaderSlot, string]> = [\n ['color', 'colorNode'],\n ['opacity', 'opacityNode'],\n ['alphaTest', 'alphaTestNode'],\n ['roughness', 'roughnessNode'],\n ['metalness', 'metalnessNode'],\n ['normal', 'normalNode'],\n ['emissive', 'emissiveNode'],\n ['ao', 'aoNode'],\n ['clearcoat', 'clearcoatNode'],\n ['clearcoatRoughness', 'clearcoatRoughnessNode'],\n ['sheen', 'sheenNode'],\n ['sheenRoughness', 'sheenRoughnessNode'],\n ['iridescence', 'iridescenceNode'],\n ['iridescenceIOR', 'iridescenceIORNode'],\n ['iridescenceThickness', 'iridescenceThicknessNode'],\n ['transmission', 'transmissionNode'],\n ['thickness', 'thicknessNode'],\n ['ior', 'iorNode'],\n ['specularIntensity', 'specularIntensityNode'],\n ['specularColor', 'specularColorNode'],\n ['anisotropy', 'anisotropyNode'],\n];\n\n/** Node slots that take over more than a BSDF socket. Named, not ignored. */\nconst REFUSED_SLOTS: Array<[string, string]> = [\n [\n 'fragmentNode',\n 'fragmentNode replaces the whole fragment stage; there is no BSDF left to translate.',\n ],\n [\n 'outputNode',\n 'outputNode replaces the material output; there is no BSDF left to translate.',\n ],\n [\n 'positionNode',\n 'positionNode displaces vertices at shade time; true displacement is not wired up yet.',\n ],\n [\n 'backdropNode',\n 'backdropNode is a screen-space effect with no path-traced equivalent.',\n ],\n [\n 'depthNode',\n 'depthNode overrides rasterizer depth, which a path tracer does not have.',\n ],\n [\n 'envNode',\n 'A per-material environment override is not translated; the scene environment is used.',\n ],\n];\n\n/**\n * Extract one node material.\n *\n * Slots fail independently: a material whose color graph translates but\n * whose roughness graph uses `dFdx` renders with the color graph and the\n * static roughness value, and two issues say exactly that.\n */\nexport function extractMaterialShader(\n material: AnyNodeMaterial,\n): ExtractedShader {\n const writer = new GraphWriter();\n const outputs: ShaderGraph['outputs'] = {};\n const supportedSlots: ShaderSlot[] = [];\n const failedSlots: ShaderSlot[] = [];\n\n for (const [prop, reason] of REFUSED_SLOTS) {\n if (material[prop]) {\n writer.issues.push({\n code: 'shader_slot_unsupported',\n severity: prop === 'envNode' ? 'warning' : 'error',\n message: `${material.type ?? 'NodeMaterial'} sets \\`${prop}\\`. ${reason}`,\n docs: `${DOCS}/shader-nodes#slots`,\n });\n }\n }\n\n for (const [slot, prop] of SLOT_NODES) {\n const driver = material[prop];\n if (!driver) continue;\n try {\n outputs[slot] = writer.visit(driver);\n supportedSlots.push(slot);\n } catch (error) {\n if (!(error instanceof Untranslatable)) throw error;\n // Nodes already emitted for this slot stay: a shared subtree may be\n // memoized into a later slot, so erasing them would leave dangling\n // references. Whatever ends up unreachable is pruned below.\n failedSlots.push(slot);\n writer.issues.push({\n ...error.issue,\n message: `In \\`${prop}\\`: ${error.issue.message}`,\n });\n }\n }\n\n // Static maps. The glTF exporter does not understand node materials, so the\n // renderer rebuilds this material from scratch, which means the classic\n // `.map` slots must travel in the graph too or they would silently vanish.\n synthesizeStaticMaps(material, writer, outputs, supportedSlots);\n\n const hasGraph = Object.keys(outputs).length > 0;\n const nodes = pruneUnreachable(writer.nodes, outputs);\n reportTiers(writer);\n\n return {\n spec: hasGraph\n ? {\n materialId: idOf(material),\n ...(material.name ? { name: material.name } : {}),\n base: material.isMeshPhysicalNodeMaterial\n ? 'physical'\n : material.isMeshBasicNodeMaterial\n ? 'basic'\n : 'standard',\n properties: staticProperties(material),\n graph: {\n version: SHADER_GRAPH_VERSION,\n nodes,\n outputs,\n },\n }\n : null,\n supportedSlots,\n failedSlots,\n issues: writer.issues,\n textures: [...writer.textures.values()],\n };\n}\n\n/**\n * The classic texture slots, emitted as graph nodes for whatever the node\n * slots left undriven. Channel conventions are three's own: roughness reads\n * G, metalness reads B, AO reads R, alpha reads G.\n */\nfunction synthesizeStaticMaps(\n material: AnyNodeMaterial,\n writer: GraphWriter,\n outputs: ShaderGraph['outputs'],\n supportedSlots: ShaderSlot[],\n): void {\n const texture = (prop: string): Texture | null => {\n const value = material[prop] as Texture | null | undefined;\n return value && (value as { isTexture?: boolean }).isTexture ? value : null;\n };\n const claim = (slot: ShaderSlot, id: string) => {\n outputs[slot] = id;\n supportedSlots.push(slot);\n };\n const sample = (map: Texture): string => writer.sampleTexture(map);\n\n try {\n const map = texture('map');\n if (map && !outputs.color) {\n const color = serializeValue(material.color) ?? {\n value: [1, 1, 1],\n type: 'color',\n };\n claim(\n 'color',\n writer.emit('mul', [\n sample(map),\n writer.constant(color.value, 'color'),\n ]),\n );\n }\n\n const roughnessMap = texture('roughnessMap');\n if (roughnessMap && !outputs.roughness) {\n const channel = writer.emit('swizzle', [sample(roughnessMap)], {\n components: 'g',\n });\n claim(\n 'roughness',\n writer.emit('mul', [\n channel,\n writer.constant(num(material.roughness, 1), 'float'),\n ]),\n );\n }\n\n const metalnessMap = texture('metalnessMap');\n if (metalnessMap && !outputs.metalness) {\n const channel = writer.emit('swizzle', [sample(metalnessMap)], {\n components: 'b',\n });\n claim(\n 'metalness',\n writer.emit('mul', [\n channel,\n writer.constant(num(material.metalness, 0), 'float'),\n ]),\n );\n }\n\n const emissiveMap = texture('emissiveMap');\n if (emissiveMap && !outputs.emissive) {\n const emissive = serializeValue(material.emissive) ?? {\n value: [0, 0, 0],\n type: 'color',\n };\n claim(\n 'emissive',\n writer.emit('mul', [\n sample(emissiveMap),\n writer.constant(emissive.value, 'color'),\n ]),\n );\n }\n\n const alphaMap = texture('alphaMap');\n if (alphaMap && !outputs.opacity) {\n const channel = writer.emit('swizzle', [sample(alphaMap)], {\n components: 'g',\n });\n claim(\n 'opacity',\n writer.emit('mul', [\n channel,\n writer.constant(num(material.opacity, 1), 'float'),\n ]),\n );\n }\n\n const normalMap = texture('normalMap');\n if (normalMap && !outputs.normal) {\n const scale = material.normalScale as { x?: number } | undefined;\n claim(\n 'normal',\n writer.emit('normal_map', [\n sample(normalMap),\n writer.constant(num(scale?.x, 1), 'float'),\n ]),\n );\n }\n\n const aoMap = texture('aoMap');\n if (aoMap && !outputs.ao) {\n const channel = writer.emit('swizzle', [sample(aoMap)], {\n components: 'r',\n });\n // three: ao = 1 + intensity * (sample - 1)\n const intensity = writer.constant(\n num(material.aoMapIntensity, 1),\n 'float',\n );\n const one = writer.constant(1, 'float');\n const delta = writer.emit('sub', [channel, one]);\n claim(\n 'ao',\n writer.emit('add', [one, writer.emit('mul', [intensity, delta])]),\n );\n }\n } catch (error) {\n if (!(error instanceof Untranslatable)) throw error;\n writer.issues.push(error.issue);\n }\n}\n\n/**\n * Drop nodes no output can reach, the leftovers of slots that failed\n * mid-extraction. Order is preserved, so the survivors stay topological.\n */\nfunction pruneUnreachable(\n nodes: ShaderGraphNode[],\n outputs: ShaderGraph['outputs'],\n): ShaderGraphNode[] {\n const byId = new Map(nodes.map((node) => [node.id, node]));\n const reachable = new Set<string>();\n const queue = Object.values(outputs).filter((id): id is string =>\n Boolean(id),\n );\n while (queue.length) {\n const id = queue.pop()!;\n if (reachable.has(id)) continue;\n reachable.add(id);\n for (const input of byId.get(id)?.inputs ?? []) queue.push(input);\n }\n return nodes.filter((node) => reachable.has(node.id));\n}\n\n/** Once-per-material notes for approximate and bakery-tier ops used. */\nfunction reportTiers(writer: GraphWriter): void {\n const bakeryOps: string[] = [];\n for (const op of writer.opsUsed) {\n const info = SHADER_OPS[op];\n if (!info) continue;\n if (info.tier === 'approximate' && info.note) {\n writer.issues.push({\n code: 'shader_op_approximated',\n severity: 'warning',\n message: info.note,\n docs: `${DOCS}/shader-nodes#${op}`,\n });\n }\n if (info.tier === 'bakery') bakeryOps.push(op);\n }\n if (bakeryOps.length) {\n writer.issues.push({\n code: 'shader_bakery_nodes',\n severity: 'info',\n message:\n `Uses ${bakeryOps.length} bakery-only node(s) (${bakeryOps.join(', ')}). ` +\n 'The viewport shows an approximation; the render is the real one.',\n docs: `${DOCS}/shader-nodes#bakery-only`,\n });\n }\n}\n\nfunction staticProperties(material: AnyNodeMaterial): ShaderMaterialProperties {\n const properties: ShaderMaterialProperties = {};\n const color = (key: keyof ShaderMaterialProperties, prop: string) => {\n const value = material[prop] as\n { isColor?: boolean; getHexString?: () => string } | undefined;\n if (value?.isColor && value.getHexString) {\n (properties[key] as string) = `#${value.getHexString()}`;\n }\n };\n const scalar = (key: keyof ShaderMaterialProperties, prop: string) => {\n const value = material[prop];\n if (typeof value === 'number' && Number.isFinite(value)) {\n (properties[key] as number) = value;\n }\n };\n\n color('color', 'color');\n color('emissive', 'emissive');\n color('sheenColor', 'sheenColor');\n color('specularColor', 'specularColor');\n color('attenuationColor', 'attenuationColor');\n scalar('roughness', 'roughness');\n scalar('metalness', 'metalness');\n scalar('emissiveIntensity', 'emissiveIntensity');\n scalar('opacity', 'opacity');\n scalar('alphaTest', 'alphaTest');\n scalar('ior', 'ior');\n scalar('transmission', 'transmission');\n scalar('thickness', 'thickness');\n scalar('attenuationDistance', 'attenuationDistance');\n scalar('clearcoat', 'clearcoat');\n scalar('clearcoatRoughness', 'clearcoatRoughness');\n scalar('sheen', 'sheen');\n scalar('sheenRoughness', 'sheenRoughness');\n scalar('specularIntensity', 'specularIntensity');\n scalar('iridescence', 'iridescence');\n scalar('iridescenceIOR', 'iridescenceIOR');\n scalar('anisotropy', 'anisotropy');\n if (material.transparent === true) properties.transparent = true;\n if (material.side === 2) properties.doubleSided = true;\n return properties;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** TSL wraps nodes in proxies; `getSelf()` is the documented unwrap. */\nfunction unwrap(value: unknown): unknown {\n const node = value as TSLNode | null | undefined;\n if (node && typeof node === 'object' && typeof node.getSelf === 'function') {\n try {\n return node.getSelf();\n } catch {\n return node;\n }\n }\n return value;\n}\n\nfunction serializeValue(\n value: unknown,\n): { value: number | number[]; type: string } | null {\n if (typeof value === 'number') return { value, type: 'float' };\n if (typeof value === 'boolean')\n return { value: value ? 1 : 0, type: 'float' };\n const v = value as {\n isColor?: boolean;\n isVector2?: boolean;\n isVector3?: boolean;\n isVector4?: boolean;\n r?: number;\n g?: number;\n b?: number;\n x?: number;\n y?: number;\n z?: number;\n w?: number;\n } | null;\n if (!v || typeof v !== 'object') return null;\n if (v.isColor) return { value: [v.r!, v.g!, v.b!], type: 'color' };\n if (v.isVector2) return { value: [v.x!, v.y!], type: 'vec2' };\n if (v.isVector3) return { value: [v.x!, v.y!, v.z!], type: 'vec3' };\n if (v.isVector4) return { value: [v.x!, v.y!, v.z!, v.w!], type: 'vec4' };\n return null;\n}\n\nfunction wrapMode(texture: Texture): string {\n // three constants: 1000 repeat, 1001 clamp, 1002 mirror.\n const wrap = (texture as { wrapS?: number }).wrapS ?? 1000;\n return wrap === 1001 ? 'clamp' : wrap === 1002 ? 'mirror' : 'repeat';\n}\n\nfunction num(value: unknown, fallback: number): number {\n return typeof value === 'number' && Number.isFinite(value) ? value : fallback;\n}\n\nfunction describe(value: unknown): string {\n if (value === null) return 'null';\n if (typeof value !== 'object') return typeof value;\n const v = value as Record<string, unknown>;\n if (v.isMatrix3) return 'Matrix3';\n if (v.isMatrix4) return 'Matrix4';\n if (v.isQuaternion) return 'Quaternion';\n if (v.isTexture) return 'Texture';\n return (v.constructor as { name?: string })?.name ?? 'object';\n}\n\nfunction describeNodeType(type: string): string {\n const KNOWN: Record<string, string> = {\n ViewportTextureNode: 'Reading the viewport back',\n ScreenNode: 'Screen-space coordinates',\n ViewportNode: 'Screen-space coordinates',\n MatcapUVNode: 'Matcap UVs (they encode the rasterizer camera)',\n ReflectorNode: 'A planar reflector (it renders the scene twice)',\n RTTNode: 'Render-to-texture',\n LoopNode: 'A shader loop',\n ArrayNode: 'A shader array',\n StorageBufferNode: 'A storage buffer',\n FunctionOverloadingNode: 'An overloaded shader function',\n ComputeNode: 'A compute pass',\n };\n return KNOWN[type] ?? `A \"${type}\"`;\n}\n","/**\n * What the GLB carries for a material the exporter cannot write, and for a\n * material the developer gave a fallback.\n *\n * three's `GLTFExporter` writes no material at all for a `ShaderMaterial`: the\n * mesh goes out bare, so a fallback declared on it had nothing to land on and\n * the renderer skipped it without a word. And it throws on any material\n * without a `color` (`MeshNormalMaterial`, `MeshDepthMaterial`,\n * `MeshDistanceMaterial`, a bare `NodeMaterial`), which stopped the whole\n * capture. So the export is handed a stand-in for each, a physically based\n * material carrying the original's name, `side` and `userData`, which is where\n * its id (and its fallback) ride into the material's extras:\n *\n * - with a declared fallback, the fallback itself, as\n * `new MeshPhysicalMaterial(fallback)` would make it, so the GLB already\n * looks like what the renderer will draw;\n * - without one, the flat gray `check()` says it renders as.\n *\n * A fallback declared on an OBJECT covers that object only. Its stand-in is\n * that object's own copy of the material, under an id of its own\n * ({@link objectFallbackId}), and every other mesh using the material keeps\n * the original.\n *\n * A node material the exporter can write is left alone: its graph travels in\n * `manifest.shaders` and the worker finds the exported material by the same\n * id. One it cannot write (no `color`) gets the gray stand-in, which carries\n * that id just the same, so the graph still lands on it.\n *\n * The developer's scene is never touched. The export is asynchronous and the\n * page keeps drawing while it runs, so a material swapped on the mesh itself\n * would flash gray in the viewport for those frames. The exporter is given\n * the stand-ins directly instead ({@link substituteMaterials}).\n */\n\nimport {\n Color,\n LinearSRGBColorSpace,\n MeshPhysicalMaterial,\n MeshStandardMaterial,\n type ColorRepresentation,\n type Material,\n type Object3D,\n} from 'three';\nimport type { GLTFExporter } from 'three/examples/jsm/exporters/GLTFExporter.js';\nimport { ID_KEY, idOf } from './ids.js';\nimport { readUserData, shouldExclude } from './scene.js';\n\n/** A declared fallback, and whether the material or the object declared it. */\nexport type DeclaredFallback = {\n values: Record<string, unknown>;\n declaredOn: 'material' | 'object';\n};\n\n/**\n * The fallback that applies where `object` draws `material`.\n *\n * The material is read first: a fallback declared on a shared material\n * applies everywhere it is used, which is what a developer who wrote it once\n * expects. The object's own applies only where the material has none.\n */\nexport function fallbackFor(\n material: Material,\n object: Object3D,\n): DeclaredFallback | null {\n const own = (material.userData?.bakery3 as { fallback?: unknown } | undefined)\n ?.fallback;\n if (isRecord(own)) return { values: own, declaredOn: 'material' };\n const objects = readUserData(object).fallback;\n if (isRecord(objects)) return { values: objects, declaredOn: 'object' };\n return null;\n}\n\n/**\n * The id an object's own copy of a material travels under, when the fallback\n * was declared on the object. Built from the two ids, so it is as stable as\n * they are (a declared `bakery3Id` on both survives a reload).\n */\nexport function objectFallbackId(material: Material, object: Object3D): string {\n return `${idOf(material)}@${idOf(object)}`;\n}\n\n/** The material id a fallback is matched to in the GLB. */\nexport function fallbackMaterialId(\n material: Material,\n object: Object3D,\n fallback: DeclaredFallback,\n): string {\n return fallback.declaredOn === 'object'\n ? objectFallbackId(material, object)\n : idOf(material);\n}\n\n/**\n * Whether `GLTFExporter` can write this material: it returns nothing for a\n * `ShaderMaterial` (and `RawShaderMaterial`, and anything built on them), and\n * reads `material.color.toArray()` from every other one.\n */\nexport function exporterCannotWrite(material: Material): boolean {\n const m = material as Material & {\n isShaderMaterial?: boolean;\n color?: { toArray?: unknown };\n };\n if (m.isShaderMaterial) return true;\n return typeof m.color?.toArray !== 'function';\n}\n\n/** Whether a declared fallback is a light source to a path tracer. */\nexport function fallbackEmits(values: Record<string, unknown>): boolean {\n if (values.emissive === undefined) return false;\n const intensity =\n typeof values.emissiveIntensity === 'number' ? values.emissiveIntensity : 1;\n if (!(intensity > 0)) return false;\n const color = toColor(values.emissive);\n return Boolean(color && color.r + color.g + color.b > 0);\n}\n\n/** What the exporter writes for each drawable whose materials need a stand-in. */\nexport type MaterialStandIns = Map<Object3D, Material | Material[]>;\n\n/**\n * The stand-in for every material that needs one, per object.\n *\n * A material shared between meshes gets one stand-in, so it is still one\n * material in the GLB; an object-level fallback gets one per object.\n */\nexport function materialStandIns(root: Object3D): MaterialStandIns {\n const shared = new Map<Material, Material>();\n const standIns: MaterialStandIns = new Map();\n\n root.traverse((object) => {\n // Excluded subtrees are detached for the export and never written.\n if (shouldExclude(object)) return;\n const drawable = object as Object3D & {\n isMesh?: boolean;\n isLine?: boolean;\n isPoints?: boolean;\n material?: Material | Material[] | null;\n };\n if (!(drawable.isMesh || drawable.isLine || drawable.isPoints)) return;\n if (!drawable.material) return;\n\n const list = Array.isArray(drawable.material)\n ? drawable.material\n : [drawable.material];\n const own = new Map<Material, Material>();\n let changed = false;\n const written = list.map((material) => {\n if (!material) return material;\n const standIn = standInFor(material, object, shared, own);\n if (standIn !== material) changed = true;\n return standIn;\n });\n if (!changed) return;\n standIns.set(\n object,\n Array.isArray(drawable.material) ? written : written[0]!,\n );\n });\n\n return standIns;\n}\n\nfunction standInFor(\n material: Material,\n object: Object3D,\n shared: Map<Material, Material>,\n own: Map<Material, Material>,\n): Material {\n const fallback = fallbackFor(material, object);\n\n if (fallback?.declaredOn === 'object') {\n let copy = own.get(material);\n if (!copy) {\n copy = standIn(\n material,\n fallback.values,\n objectFallbackId(material, object),\n );\n own.set(material, copy);\n }\n return copy;\n }\n\n if (!fallback && !exporterCannotWrite(material)) return material;\n\n let copy = shared.get(material);\n if (!copy) {\n copy = standIn(material, fallback?.values ?? null, idOf(material));\n shared.set(material, copy);\n }\n return copy;\n}\n\n/**\n * The material the GLB carries instead of `material`.\n *\n * Its `userData` is a copy of the original's with the id set explicitly, so\n * it is right whether or not `stampIds` has run, and the developer's own\n * object is never written to.\n */\nfunction standIn(\n material: Material,\n fallback: Record<string, unknown> | null,\n id: string,\n): Material {\n const out = fallback ? fromFallback(fallback) : flatGray();\n out.name = material.name;\n out.side = material.side;\n const userData: Record<string, unknown> = {\n ...material.userData,\n [ID_KEY]: id,\n };\n if (fallback) {\n const bakery3 = isRecord(userData.bakery3) ? userData.bakery3 : {};\n userData.bakery3 = { ...bakery3, fallback };\n }\n out.userData = userData;\n return out;\n}\n\n/**\n * The gray a material renders as when the renderer cannot know what it\n * should look like: 0.8 in linear light, fully rough, not metal. It is the\n * surface the renderer gave a mesh that arrived with no material at all,\n * which is what such a material was until it had a stand-in.\n */\nfunction flatGray(): MeshStandardMaterial {\n const material = new MeshStandardMaterial({ roughness: 1, metalness: 0 });\n material.color.setRGB(0.8, 0.8, 0.8, LinearSRGBColorSpace);\n return material;\n}\n\n/** Fields of `MaterialFallback` that are plain numbers on the material. */\nconst NUMBER_FIELDS = [\n 'metalness',\n 'roughness',\n 'clearcoat',\n 'clearcoatRoughness',\n 'transmission',\n 'thickness',\n 'ior',\n 'emissiveIntensity',\n 'opacity',\n 'sheen',\n 'iridescence',\n 'anisotropy',\n] as const;\n\n/**\n * `new MeshPhysicalMaterial(fallback)`, field by field, so a field left out\n * keeps three's default for it, exactly as `<meshPhysicalMaterial>` would.\n */\nfunction fromFallback(values: Record<string, unknown>): MeshPhysicalMaterial {\n const material = new MeshPhysicalMaterial();\n const color = toColor(values.color);\n if (color) material.color.copy(color);\n const emissive = toColor(values.emissive);\n if (emissive) material.emissive.copy(emissive);\n const sheenColor = toColor(values.sheenColor);\n if (sheenColor) material.sheenColor.copy(sheenColor);\n\n const target = material as unknown as Record<string, number>;\n for (const field of NUMBER_FIELDS) {\n const value = values[field];\n if (typeof value === 'number' && Number.isFinite(value))\n target[field] = value;\n }\n if (material.opacity < 1) material.transparent = true;\n return material;\n}\n\nfunction toColor(value: unknown): Color | null {\n if (\n typeof value !== 'string' &&\n typeof value !== 'number' &&\n !(value as Color | null)?.isColor\n )\n return null;\n return new Color(value as ColorRepresentation);\n}\n\n/**\n * Have `exporter` write the stand-ins in place of the scene's own materials.\n *\n * The writer's per-mesh step reads `mesh.material` and nothing else of the\n * material, so it is handed a view of the mesh whose `material` is the\n * stand-in: an object whose prototype is the mesh, so every other property is\n * the mesh's own. The developer's mesh is not written to, and the viewport\n * keeps drawing the real materials while the export runs.\n *\n * The step is `processMeshAsync` in r170 and later, `processMesh` in r167\n * and earlier. A three whose writer has neither gets the materials\n * swapped on the scene for the length of the export, which the returned undo\n * puts back. Run it in a `finally`, however the export ends.\n */\nexport function substituteMaterials(\n exporter: GLTFExporter,\n standIns: MaterialStandIns,\n): () => void {\n let undo = () => {};\n if (standIns.size === 0) return undo;\n\n exporter.register((writer) => {\n const steps = writer as unknown as Record<string, unknown>;\n const name = ['processMeshAsync', 'processMesh'].find(\n (key) => typeof steps[key] === 'function',\n );\n if (name) {\n const original = steps[name] as (\n this: unknown,\n mesh: Object3D,\n ) => unknown;\n steps[name] = function (this: unknown, mesh: Object3D) {\n const material = standIns.get(mesh);\n return original.call(\n this,\n material\n ? Object.create(mesh, {\n material: { value: material, enumerable: true },\n })\n : mesh,\n );\n };\n } else {\n undo = swapOnScene(standIns);\n }\n return {};\n });\n\n return () => undo();\n}\n\nfunction swapOnScene(standIns: MaterialStandIns): () => void {\n const originals: Array<{\n object: Object3D & { material?: unknown };\n material: unknown;\n }> = [];\n for (const [object, material] of standIns) {\n const drawable = object as Object3D & { material?: unknown };\n originals.push({ object: drawable, material: drawable.material });\n drawable.material = material;\n }\n return () => {\n for (const { object, material } of originals) object.material = material;\n };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n","/**\n * The compatibility checker.\n *\n * three.js can express things the renderer cannot reproduce faithfully. Those\n * are never rendered gray in silence: an unsupported material produces a\n * named, located, actionable issue, and the developer decides.\n *\n * It runs entirely in the page and costs nothing, so \"will my scene work?\"\n * can be answered before creating an account.\n */\n\nimport type { Material, Mesh, Object3D, Scene, Texture } from 'three';\nimport type {\n CompatibilityIssue,\n CompatibilityReport,\n MaterialFallback,\n} from '../protocol/index.js';\nimport { idOf, scenePath } from '../capture/ids.js';\nimport {\n exporterCannotWrite,\n fallbackEmits,\n fallbackFor,\n fallbackMaterialId,\n type DeclaredFallback,\n} from '../capture/materials.js';\nimport { captureFog, shouldExclude } from '../capture/scene.js';\nimport { extractMaterialShader, isNodeMaterial } from '../shader/extract.js';\n\nconst DOCS = 'https://bakery3.com/docs';\n\n/** Above this, a texture is a VRAM problem before it is a quality gain. */\nconst LARGE_TEXTURE_PX = 4096;\n/** Above this, the scene is worth warning about before it is uploaded. */\nconst LARGE_TRIANGLE_COUNT = 10_000_000;\n\n/**\n * Materials that translate to the renderer's physically based material with\n * confidence.\n *\n * The list is short on purpose. Everything outside it is either approximated\n * with a warning or refused with an explanation, never silently substituted.\n */\nconst TRANSLATABLE = new Set(['MeshStandardMaterial', 'MeshPhysicalMaterial']);\n\n/**\n * Translated, with a caveat the developer should see once.\n *\n * Each says what the render does with the material, which is what three's\n * `GLTFExporter` writes for it, as the renderer's glTF importer reads it. For\n * every type here but Basic that is a fully rough non-metal (metallic 0,\n * roughness 1) in its `color` and `map`, with its `normalMap`, emissive\n * color, opacity and side where it has them, and nothing else. A Basic\n * material goes out unlit, which the importer turns into its color shown to\n * the camera and to no other ray. A type without a `color` goes out as the\n * flat gray stand-in (capture/materials.ts).\n */\nconst APPROXIMATED: Record<string, string> = {\n MeshBasicMaterial:\n 'It shows its color and map unlit, as in the viewport, but it does not light the scene, cast a shadow, or show in reflections or through glass.',\n MeshLambertMaterial:\n 'It renders as a fully rough, non-metal surface in its color and map.',\n MeshPhongMaterial:\n 'It renders as a fully rough, non-metal surface in its color and map, like Lambert. Its `shininess` and `specular` are not used, so it has no sharp highlights.',\n MeshToonMaterial:\n 'It renders as a fully rough, non-metal surface in its color and map, without the cel shading of its `gradientMap`.',\n MeshMatcapMaterial:\n 'It renders as a fully rough, non-metal surface in its color and map, lit by the scene. The `matcap` texture is not used.',\n MeshNormalMaterial:\n 'It renders flat gray. It colors a surface by its normals, which is a debug view, not a look.',\n MeshDepthMaterial:\n 'It renders flat gray. It shows depth, which is a debug view, not a look.',\n MeshDistanceMaterial:\n 'It renders flat gray. It is made for shadow maps, not for a visible surface.',\n};\n\n/**\n * What a material can set that never reaches the render, with what to do\n * instead where there is something. Read against three's `GLTFExporter` and\n * the renderer's glTF importer (Blender 5.1's io_scene_gltf2):\n *\n * - `alphaMap`, `displacementMap` and `specularMap` are not written to glTF;\n * - `bumpMap` goes out as EXT_materials_bump, iridescence as\n * KHR_materials_iridescence and dispersion as KHR_materials_dispersion,\n * and the importer reads none of the three.\n *\n * Not here on purpose: `aoMap` and `thicknessMap` arrive and do nothing,\n * which is right, because the renderer traces the occlusion and the depth of\n * glass from the geometry, and nearly every model a GLTFLoader loads has an\n * `aoMap`. Nor `lightMap` and `envMap`: the render lights every surface from\n * the scene itself.\n *\n * Each is named only when the viewport uses it, so a slot three itself\n * ignores (an `alphaMap` on an opaque material) is not a difference.\n */\nconst IGNORED: Array<{\n name: string;\n /** Whether the viewport draws it on this material. */\n used: (m: Record<string, unknown>) => boolean;\n fix?: string;\n}> = [\n {\n name: 'alphaMap',\n used: (m) =>\n isTexture(m.alphaMap) &&\n Boolean(m.transparent || (m.alphaTest as number) > 0 || m.alphaHash),\n fix: 'For a cutout, use the alpha channel of `map`.',\n },\n {\n name: 'bumpMap',\n used: (m) => isTexture(m.bumpMap) && m.bumpScale !== 0,\n fix: 'Bake bump detail into a `normalMap`.',\n },\n {\n name: 'displacementMap',\n used: (m) => isTexture(m.displacementMap) && m.displacementScale !== 0,\n fix: 'Model the shape, or bake the detail into a `normalMap`.',\n },\n { name: 'specularMap', used: (m) => isTexture(m.specularMap) },\n { name: 'iridescence', used: (m) => (m.iridescence as number) > 0 },\n {\n name: 'iridescenceMap',\n used: (m) => (m.iridescence as number) > 0 && isTexture(m.iridescenceMap),\n },\n {\n name: 'iridescenceThicknessMap',\n used: (m) =>\n (m.iridescence as number) > 0 && isTexture(m.iridescenceThicknessMap),\n },\n {\n name: 'dispersion',\n used: (m) => (m.dispersion as number) > 0 && (m.transmission as number) > 0,\n },\n];\n\nexport type AnalyzeResult = CompatibilityReport & {\n /** Triangles the exporter will write. Feeds the size warning and estimate. */\n triangles: number;\n /** Distinct textures found, and their largest dimension. */\n textures: { count: number; maxDimension: number };\n /** Distinct materials that emit light; see `SceneManifest.stats.emitters`. */\n emitters: number;\n};\n\n/**\n * Whether a material is a light source to a path tracer: a standard or\n * physical material whose emissive color is not black (and whose strength\n * is not zero), an emissive map, an unlit material (rendered as emission),\n * or a node material with an emission graph. Duck-typed, like everything\n * else here.\n */\nexport function emitsLight(material: Material): boolean {\n const m = material as Material & {\n isMeshBasicMaterial?: boolean;\n emissive?: { r: number; g: number; b: number };\n emissiveIntensity?: number;\n emissiveMap?: unknown;\n emissiveNode?: unknown;\n };\n if (m.isMeshBasicMaterial) return true;\n if (m.emissiveNode) return true;\n if ((m.emissiveIntensity ?? 1) <= 0) return false;\n if (m.emissiveMap) return true;\n const e = m.emissive;\n return Boolean(e && e.r + e.g + e.b > 0);\n}\n\nexport function analyzeScene(root: Object3D): AnalyzeResult {\n const issues: CompatibilityIssue[] = [];\n const seenMaterials = new Set<string>();\n /** Materials (by the key below) with an error. */\n const unfaithful = new Set<string>();\n const seenTextures = new Set<string>();\n\n let triangles = 0;\n // Weighted by triangles rather than object count: one unsupported bolt in a\n // car does not make the render 50% wrong, and one unsupported car body does.\n let faithfulTriangles = 0;\n let maxTextureDimension = 0;\n let emitters = 0;\n\n root.traverse((object) => {\n if (shouldExclude(object)) return;\n const mesh = object as Mesh;\n if (!mesh.isMesh) return;\n\n const count = triangleCount(mesh);\n triangles += count;\n\n const materials = Array.isArray(mesh.material)\n ? mesh.material\n : [mesh.material];\n let objectIsFaithful = true;\n\n for (const material of materials) {\n if (!material) continue;\n\n for (const texture of texturesOf(material)) {\n if (seenTextures.has(texture.uuid)) continue;\n seenTextures.add(texture.uuid);\n const dimension = Math.max(\n texture.image?.width ?? 0,\n texture.image?.height ?? 0,\n );\n maxTextureDimension = Math.max(maxTextureDimension, dimension);\n if (dimension > LARGE_TEXTURE_PX) {\n issues.push({\n code: 'texture_large',\n severity: 'warning',\n message:\n `Texture \"${texture.name || texture.uuid.slice(0, 8)}\" is ${dimension}px. ` +\n 'Above 4K a texture costs upload time and VRAM without visibly ' +\n 'improving a product render.',\n path: pathOf(object),\n docs: `${DOCS}/scene-size#textures`,\n });\n }\n }\n\n // A fallback declared on the object gives this object a copy of the\n // material of its own (capture/materials.ts), so it is judged on its\n // own; every other use of a material is judged once.\n const fallback = fallbackFor(material, object);\n const key =\n fallback?.declaredOn === 'object'\n ? `${object.uuid}:${material.uuid}`\n : material.uuid;\n if (seenMaterials.has(key)) {\n // Every mesh drawn with a material that has an error counts against\n // the score, not only the first one found.\n if (unfaithful.has(key)) objectIsFaithful = false;\n continue;\n }\n seenMaterials.add(key);\n if (fallback ? fallbackEmits(fallback.values) : emitsLight(material))\n emitters++;\n\n for (const issue of classifyMaterial(material, object, fallback)) {\n issues.push(issue);\n if (issue.severity === 'error') {\n objectIsFaithful = false;\n unfaithful.add(key);\n }\n }\n }\n\n if (objectIsFaithful) faithfulTriangles += count;\n });\n\n if (triangles > LARGE_TRIANGLE_COUNT) {\n issues.push({\n code: 'scene_large',\n severity: 'warning',\n message: `Scene has ${(triangles / 1e6).toFixed(1)}M triangles.`,\n docs: `${DOCS}/scene-size`,\n });\n }\n\n // Fog is the scene's own, not an object's: what the render will do with it.\n const fog = captureFog(root as Scene).issue;\n if (fog) issues.push(fog);\n\n const counts = { info: 0, warning: 0, error: 0 };\n for (const issue of issues) counts[issue.severity]++;\n\n return {\n // An empty scene is not 0% compatible, it is a different problem, and\n // reporting 0 there would put a red 0% in the devtools panel of a\n // developer whose scene simply had not loaded yet.\n score: triangles === 0 ? 1 : faithfulTriangles / triangles,\n issues,\n counts,\n triangles,\n textures: { count: seenTextures.size, maxDimension: maxTextureDimension },\n emitters,\n };\n}\n\n/**\n * The developer's explicit `userData.bakery3.fallback` overrides, collected,\n * each under the id of the material the GLB carries for it: the material's\n * own for a fallback declared on it, the object's own copy for one declared\n * on the object (capture/materials.ts writes both).\n */\nexport function collectFallbacks(root: Object3D): MaterialFallback[] {\n const fallbacks: MaterialFallback[] = [];\n const seen = new Set<string>();\n\n root.traverse((object) => {\n if (shouldExclude(object)) return;\n const mesh = object as Mesh;\n if (!mesh.isMesh) return;\n const materials = Array.isArray(mesh.material)\n ? mesh.material\n : [mesh.material];\n for (const material of materials) {\n if (!material) continue;\n const fallback = fallbackFor(material, object);\n if (!fallback) continue;\n const materialId = fallbackMaterialId(material, object, fallback);\n if (seen.has(materialId)) continue;\n seen.add(materialId);\n fallbacks.push({\n ...(fallback.values as Omit<MaterialFallback, 'materialId' | 'type'>),\n materialId,\n type: 'physical',\n });\n }\n });\n\n return fallbacks;\n}\n\n/**\n * All the issues one material contributes where `object` draws it.\n *\n * Node materials produce issues rather than a verdict: the shader extractor\n * names each untranslatable node, and a material whose color graph\n * translates while its roughness graph does not gets exactly those two\n * facts, not a single \"unsupported\" stamp.\n */\nfunction classifyMaterial(\n material: Material,\n object: Object3D,\n fallback: DeclaredFallback | null,\n): CompatibilityIssue[] {\n // A declared fallback replaces the material, whatever it was. Reported as\n // info rather than silence so the devtools can still show what was swapped.\n if (fallback) {\n return [\n {\n code: 'material_fallback_used',\n severity: 'info',\n message: `${labelOf(material)} renders with your declared fallback.`,\n path: pathOf(object),\n materialId: fallbackMaterialId(material, object, fallback),\n materialName: material.name,\n materialType: material.type,\n docs: `${DOCS}/material-fallbacks`,\n },\n ];\n }\n\n if (isNodeMaterial(material)) {\n const extracted = extractMaterialShader(material as never);\n const issues: CompatibilityIssue[] = extracted.issues.map((issue) => ({\n ...issue,\n path: pathOf(object),\n materialId: idOf(material),\n materialName: material.name,\n materialType: material.type,\n }));\n // No graph: the renderer gets what the exporter writes for it, which is\n // what it writes for the classic material of the same kind.\n if (!extracted.spec)\n issues.push(...classicIssues(material, object, classicType(material)));\n return issues;\n }\n\n return classicIssues(material, object, material.type);\n}\n\n/** What a material that reaches the render through glTF gets told. */\nfunction classicIssues(\n material: Material,\n object: Object3D,\n type: string,\n): CompatibilityIssue[] {\n const issues: CompatibilityIssue[] = [];\n const verdict = classify(material, object, type);\n if (verdict) issues.push(verdict);\n // A material the exporter cannot write goes out as a stand-in with none of\n // its maps, and the verdict above already says it renders flat gray.\n if (!exporterCannotWrite(material)) {\n const ignored = ignoredSlots(material, object);\n if (ignored) issues.push(ignored);\n }\n return issues;\n}\n\nfunction classify(\n material: Material,\n object: Object3D,\n type: string,\n): CompatibilityIssue | null {\n if (TRANSLATABLE.has(type)) return null;\n\n const about = {\n path: pathOf(object),\n materialId: idOf(material),\n materialName: material.name,\n materialType: material.type,\n };\n\n if ((material as { isShaderMaterial?: boolean }).isShaderMaterial) {\n return {\n code: 'material_custom_shader',\n severity: 'error',\n message: `${labelOf(material)} renders flat gray, because the render cannot run GLSL. Declare a fallback, or port it to TSL.`,\n ...about,\n docs: `${DOCS}/material-fallbacks`,\n };\n }\n\n const approximation = APPROXIMATED[type];\n if (approximation) {\n return {\n code: 'material_approximated',\n severity: 'warning',\n message: `${labelOf(material)} is approximated. ${approximation}${emissiveNote(material)}`,\n ...about,\n docs: `${DOCS}/materials`,\n };\n }\n\n const looks = exporterCannotWrite(material)\n ? 'flat gray'\n : 'as a fully rough, non-metal surface in its color';\n return {\n code: 'material_unknown',\n severity: 'error',\n message: `${labelOf(material)} renders ${looks}, because the render does not support this material. Use MeshStandardMaterial or MeshPhysicalMaterial, or declare a fallback.`,\n ...about,\n docs: `${DOCS}/materials`,\n };\n}\n\n/**\n * The exporter writes `emissive` for every type that has one, but its\n * strength only for a standard material: a Lambert, Phong or Toon material\n * glows at intensity 1 in the render whatever its `emissiveIntensity`.\n */\nfunction emissiveNote(material: Material): string {\n const m = material as Material & {\n isMeshStandardMaterial?: boolean;\n emissive?: { r: number; g: number; b: number };\n emissiveIntensity?: number;\n };\n if (m.isMeshStandardMaterial || !m.emissive) return '';\n if (m.emissiveIntensity === undefined || m.emissiveIntensity === 1) return '';\n if (m.emissive.r + m.emissive.g + m.emissive.b <= 0) return '';\n return ' Its `emissiveIntensity` is not used, so it glows at intensity 1.';\n}\n\n/** One warning naming every slot of `material` the render leaves out. */\nfunction ignoredSlots(\n material: Material,\n object: Object3D,\n): CompatibilityIssue | null {\n const record = material as unknown as Record<string, unknown>;\n const ignored = IGNORED.filter((slot) => slot.used(record));\n if (!ignored.length) return null;\n const names = ignored.map((slot) => `\\`${slot.name}\\``);\n const list =\n names.length === 1\n ? names[0]\n : `${names.slice(0, -1).join(', ')} and ${names[names.length - 1]}`;\n const fixes = ignored.flatMap((slot) => (slot.fix ? [slot.fix] : []));\n return {\n code: 'material_map_ignored',\n severity: 'warning',\n message: [\n `${labelOf(material)} uses ${list}, which the render ignores.`,\n ...fixes,\n ].join(' '),\n path: pathOf(object),\n materialId: idOf(material),\n materialName: material.name,\n materialType: material.type,\n docs: `${DOCS}/materials#slots-the-render-ignores`,\n };\n}\n\n/**\n * The classic material a node material is written as when it has no graph:\n * the exporter reads the properties three copied onto it from that material.\n */\nfunction classicType(material: Material): string {\n const m = material as Material & {\n isMeshPhysicalMaterial?: boolean;\n isMeshStandardMaterial?: boolean;\n };\n if (m.isMeshPhysicalMaterial) return 'MeshPhysicalMaterial';\n if (m.isMeshStandardMaterial) return 'MeshStandardMaterial';\n return material.type.replace(/NodeMaterial$/, 'Material');\n}\n\n/** `MeshPhongMaterial \"chrome\"`: what a message calls a material. */\nfunction labelOf(material: Material): string {\n return `${material.type} \"${material.name || 'unnamed'}\"`;\n}\n\nfunction isTexture(value: unknown): boolean {\n return Boolean((value as { isTexture?: boolean } | null)?.isTexture);\n}\n\nconst TEXTURE_SLOTS = [\n 'map',\n 'normalMap',\n 'bumpMap',\n 'displacementMap',\n 'roughnessMap',\n 'metalnessMap',\n 'aoMap',\n 'emissiveMap',\n 'alphaMap',\n 'clearcoatMap',\n 'clearcoatNormalMap',\n 'clearcoatRoughnessMap',\n 'transmissionMap',\n 'thicknessMap',\n 'sheenColorMap',\n 'sheenRoughnessMap',\n 'iridescenceMap',\n 'iridescenceThicknessMap',\n 'anisotropyMap',\n 'specularMap',\n 'specularColorMap',\n 'specularIntensityMap',\n] as const;\n\nfunction texturesOf(material: Material): Texture[] {\n const out: Texture[] = [];\n const record = material as unknown as Record<string, Texture | null>;\n for (const slot of TEXTURE_SLOTS) {\n const texture = record[slot];\n if (texture?.isTexture) out.push(texture);\n }\n return out;\n}\n\nfunction triangleCount(mesh: Mesh): number {\n const geometry = mesh.geometry;\n if (!geometry) return 0;\n const indexed = geometry.index?.count;\n const positions = geometry.attributes.position?.count ?? 0;\n const vertices = indexed ?? positions;\n const instances = (mesh as unknown as { count?: number }).count;\n const perInstance = Math.floor(vertices / 3);\n // An InstancedMesh draws its geometry `count` times, and the renderer pays\n // for every one of them; so does the estimate, and so does VRAM.\n return (mesh as unknown as { isInstancedMesh?: boolean }).isInstancedMesh\n ? perInstance * (instances ?? 1)\n : perInstance;\n}\n\n/** `<Car>/<Body>/<Paint>`: a path the developer can find in their own code.\n * One implementation, in capture/ids.ts, so a duplicate-id refusal and a\n * compatibility issue point at the same string. */\nconst pathOf = scenePath;\n","/**\n * The scene's two price numbers (`SceneComplexity`), measured in the page.\n *\n * Every drawn mesh that the render will see is handed to the protocol's\n * probe, and so is a preset room's stand-in: it is not uploaded, but it is\n * the room the renderer builds, and a room is priced by what is in it the\n * same way a room the developer built is.\n */\n\nimport {\n Matrix4,\n Vector3,\n type Camera,\n type Material,\n type Mesh,\n type Object3D,\n} from 'three';\nimport {\n complexityOf,\n type ProbeMesh,\n type SceneComplexity,\n} from '../protocol/complexity.js';\nimport { emitsLight } from '../compat/analyze.js';\nimport { excludedItself } from './scene.js';\nimport {\n findPresetRooms,\n roomPresetFactsOf,\n roomShownBaked,\n} from '../presets/roomState.js';\n\n/** Instances of one mesh the probe looks at. Past this, they are counted, not traced. */\nconst PROBED_INSTANCES = 64;\n\nexport function sceneComplexity(\n scene: Object3D,\n camera: Camera,\n): SceneComplexity {\n scene.updateMatrixWorld();\n camera.updateMatrixWorld();\n const rooms = new Set(findPresetRooms(scene));\n const meshes: ProbeMesh[] = [];\n let objects = 0;\n\n const visit = (object: Object3D) => {\n if (!object.visible) return;\n // An excluded subtree is left out, unless it is a preset room's\n // stand-in: the renderer builds that room, so it is traced all the same.\n // A room shown baked is the same room to the renderer: its baked meshes\n // are excluded one by one and traced here all the same.\n const shell = Boolean(object.userData?.bakery3RoomShell);\n if (excludedItself(object) && !rooms.has(object) && !shell) return;\n const mesh = object as Mesh & {\n isInstancedMesh?: boolean;\n count?: number;\n instanceMatrix?: { array: ArrayLike<number> };\n };\n if (mesh.isMesh && mesh.geometry?.attributes?.position) {\n const position = mesh.geometry.attributes.position;\n const index = mesh.geometry.index;\n // Quantized (normalized integers) or interleaved positions are read\n // through three, which knows their scale and stride; plain floats as\n // they are, without a copy.\n const plain =\n !position.normalized &&\n !(position as { isInterleavedBufferAttribute?: boolean })\n .isInterleavedBufferAttribute &&\n position.itemSize === 3;\n const positions: ArrayLike<number> = plain\n ? (position.array as ArrayLike<number>)\n : Float32Array.from({ length: position.count * 3 }, (_, i) =>\n i % 3 === 0\n ? position.getX((i / 3) | 0)\n : i % 3 === 1\n ? position.getY((i / 3) | 0)\n : position.getZ((i / 3) | 0),\n );\n const materials: Material[] = Array.isArray(mesh.material)\n ? mesh.material\n : [mesh.material];\n // A baked room's surfaces carry their light as emission, and are walls\n // all the same.\n const emitter =\n !shell &&\n materials.length > 0 &&\n materials.every((material) => material && emitsLight(material));\n const base = {\n positions,\n indices: (index?.array as ArrayLike<number> | undefined) ?? null,\n emitter,\n };\n if (mesh.isInstancedMesh && mesh.instanceMatrix) {\n const count = mesh.count ?? 0;\n objects += count;\n const local = new Matrix4();\n for (let i = 0; i < Math.min(count, PROBED_INSTANCES); i++) {\n local.fromArray(mesh.instanceMatrix.array as number[], i * 16);\n meshes.push({\n ...base,\n matrix: new Matrix4().multiplyMatrices(mesh.matrixWorld, local)\n .elements,\n });\n }\n } else {\n // A baked room's meshes are joined by the dozen: its count is the\n // published room's, added below.\n if (!shell) objects += 1;\n meshes.push({ ...base, matrix: mesh.matrixWorld.elements });\n }\n }\n for (const child of object.children) visit(child);\n };\n visit(scene);\n for (const room of rooms) {\n if (room.visible && roomShownBaked(room))\n objects += roomPresetFactsOf(room)?.objects ?? 0;\n }\n\n const eye = camera.getWorldPosition(new Vector3());\n return complexityOf(meshes, [eye.x, eye.y, eye.z], objects);\n}\n","/**\n * The WebGL renderer's color settings, read rather than assumed.\n *\n * three's color-management defaults have moved between versions, and\n * applications override them anyway. A render that guesses is subtly wrong\n * in a way the developer cannot explain (\"close, but the whites are off\"). So\n * the live renderer is read, and the values travel in the manifest to be\n * reproduced.\n */\n\nimport type { ColorSpec } from '../protocol/index.js';\n\n/** Structural, not `instanceof WebGLRenderer`: an app may wrap its renderer,\n * and importing three's class here just to type-check would drag it in. */\ntype RendererLike = {\n outputColorSpace?: string;\n toneMapping?: number;\n toneMappingExposure?: number;\n};\n\n/**\n * three's tone-mapping constants. Hard-coded rather than imported so this file\n * works against any three version, including ones where a constant does not\n * exist yet. An unknown value falls through to `none`.\n */\nconst TONE_MAPPING: Record<number, ColorSpec['toneMapping']> = {\n 0: 'none',\n 1: 'linear',\n 2: 'reinhard',\n 3: 'cineon',\n 4: 'aces-filmic',\n // AgX (r162+) and Neutral (r165+) took the next two slots, in that order.\n 6: 'agx',\n 7: 'neutral',\n};\n\nconst COLOR_SPACES: Record<string, ColorSpec['outputColorSpace']> = {\n srgb: 'srgb',\n 'srgb-linear': 'srgb-linear',\n 'display-p3': 'display-p3',\n};\n\nexport function captureColor(renderer?: RendererLike): ColorSpec {\n // No renderer means an offscreen/headless caller. three's own defaults since\n // r155 are the right assumption there, and they are stated rather than\n // silently inherited so the manifest still records what was used.\n if (!renderer) {\n return {\n outputColorSpace: 'srgb',\n toneMapping: 'none',\n toneMappingExposure: 1,\n };\n }\n return {\n outputColorSpace:\n COLOR_SPACES[renderer.outputColorSpace ?? 'srgb'] ?? 'srgb',\n toneMapping: TONE_MAPPING[renderer.toneMapping ?? 0] ?? 'none',\n toneMappingExposure: renderer.toneMappingExposure ?? 1,\n };\n}\n","/**\n * Node materials as manifest shader specs, at capture time.\n *\n * `check()` already ran the same extraction synchronously and reported what\n * would not translate. This is the authoritative pass: it extracts again,\n * pulls the pixels of every texture a graph samples (the GLB does not carry\n * them, since the exporter does not understand node materials), and hashes\n * them into the same content-addressed store as everything else. A texture\n * whose bytes cannot be reached turns the whole material into a named error\n * rather than a graph that renders with a hole in it.\n */\n\nimport type { Material, Mesh, Object3D, Texture } from 'three';\nimport type {\n AssetDescriptor,\n CompatibilityIssue,\n MaterialShaderSpec,\n} from '../protocol/index.js';\nimport { idOf } from './ids.js';\nimport { sha256 } from './hash.js';\nimport { fallbackFor } from './materials.js';\nimport { shouldExclude } from './scene.js';\nimport {\n extractMaterialShader,\n isNodeMaterial,\n type ShaderTextureRef,\n} from '../shader/extract.js';\n\nexport type CapturedShaders = {\n shaders: MaterialShaderSpec[];\n assets: Array<AssetDescriptor & { bytes: number; data: ArrayBuffer }>;\n /** Byte-level failures `check()` could not have seen. */\n issues: CompatibilityIssue[];\n};\n\nexport async function captureShaders(root: Object3D): Promise<CapturedShaders> {\n const shaders: MaterialShaderSpec[] = [];\n const assets: CapturedShaders['assets'] = [];\n const issues: CompatibilityIssue[] = [];\n const seen = new Set<string>();\n /** Texture uuid to asset hash, so a texture shared between materials\n * uploads once. */\n const hashed = new Map<string, string | null>();\n\n const materials: Array<{ material: Material; path: string }> = [];\n root.traverse((object) => {\n if (shouldExclude(object)) return;\n const mesh = object as Mesh;\n if (!mesh.isMesh || !mesh.material) return;\n const list = Array.isArray(mesh.material) ? mesh.material : [mesh.material];\n for (const material of list) {\n if (!material || seen.has(material.uuid)) continue;\n if (!isNodeMaterial(material)) continue;\n // A declared fallback wins over the graph in the renderer too, so the\n // graph ships only for a mesh that draws the material without one. A\n // fallback on the object covers that object alone (its copy of the\n // material travels under an id of its own), and another mesh using the\n // same material may still need the graph.\n if (fallbackFor(material, object)) continue;\n seen.add(material.uuid);\n materials.push({ material, path: pathOf(object) });\n }\n });\n\n for (const { material, path } of materials) {\n const extracted = extractMaterialShader(material as never);\n if (!extracted.spec) continue;\n\n let texturesOk = true;\n for (const ref of extracted.textures) {\n const hash = await resolveTexture(\n ref,\n hashed,\n assets,\n issues,\n material,\n path,\n );\n if (!hash) texturesOk = false;\n }\n\n if (texturesOk) {\n shaders.push(extracted.spec);\n }\n // On failure the material stays out of the manifest entirely: the\n // renderer then uses the exporter's stand-in, and the issue pushed by\n // resolveTexture says why. Half a graph would look like a bug.\n }\n\n return { shaders, assets, issues };\n}\n\nasync function resolveTexture(\n ref: ShaderTextureRef,\n hashed: Map<string, string | null>,\n assets: CapturedShaders['assets'],\n issues: CompatibilityIssue[],\n material: Material,\n path: string,\n): Promise<string | null> {\n const known = hashed.get(ref.texture.uuid);\n if (known !== undefined) {\n if (known) ref.apply(known);\n return known;\n }\n\n const bytes = await textureBytes(ref.texture);\n if (!bytes) {\n hashed.set(ref.texture.uuid, null);\n issues.push({\n code: 'shader_texture_unreadable',\n severity: 'error',\n message:\n `The texture \"${ref.texture.name || ref.texture.uuid.slice(0, 8)}\" used by ` +\n `\"${material.name || material.type}\" has no reachable pixels, so the shader graph was not sent. `,\n path,\n materialId: idOf(material),\n materialName: material.name,\n materialType: material.type,\n docs: 'https://bakery3.com/docs/shader-nodes#textures',\n });\n return null;\n }\n\n const hash = await sha256(bytes.data);\n hashed.set(ref.texture.uuid, hash);\n if (!assets.some((asset) => asset.hash === hash)) {\n assets.push({\n hash,\n kind: 'texture',\n bytes: bytes.data.byteLength,\n contentType: bytes.contentType,\n name: ref.texture.name || 'shader-texture',\n data: bytes.data,\n });\n }\n ref.apply(hash);\n return hash;\n}\n\n/**\n * A texture's bytes, best source first.\n *\n * 1. `texture.userData.bakery3.src`: the developer's own escape hatch, the\n * original file, fetched. Beats any readback for compressed formats.\n * 2. An `<img>` with a URL: fetched, so a JPEG stays a JPEG.\n * 3. Anything drawable (ImageBitmap, canvas, video frame): re-encoded to PNG\n * through a canvas. Lossless, if larger than the original.\n * 4. A `DataTexture` in 8-bit RGBA: the same canvas path.\n *\n * Float data and GPU-only render targets return null: there is nothing here\n * that can honestly be called the texture's pixels.\n */\nasync function textureBytes(\n texture: Texture,\n): Promise<{ data: ArrayBuffer; contentType: string } | null> {\n const declared = (\n texture.userData as { bakery3?: { src?: string } } | undefined\n )?.bakery3?.src;\n if (typeof declared === 'string') {\n const fetched = await fetchBytes(declared);\n if (fetched) return fetched;\n }\n\n const image = texture.image as\n | (Partial<HTMLImageElement> & {\n data?: ArrayBufferView;\n width?: number;\n height?: number;\n })\n | null\n | undefined;\n if (!image) return null;\n\n if (\n typeof image.src === 'string' &&\n image.src &&\n !image.src.startsWith('blob:')\n ) {\n const fetched = await fetchBytes(image.src);\n if (fetched) return fetched;\n }\n\n // DataTexture: raw 8-bit RGBA can be re-encoded honestly; float cannot.\n const raw = image.data;\n if (raw && ArrayBuffer.isView(raw)) {\n if (!(raw instanceof Uint8Array) && !(raw instanceof Uint8ClampedArray)) {\n return null;\n }\n return encodeRGBA(raw, image.width ?? 0, image.height ?? 0);\n }\n\n return drawToPng(\n image as CanvasImageSource,\n image.width ?? 0,\n image.height ?? 0,\n );\n}\n\nasync function fetchBytes(\n url: string,\n): Promise<{ data: ArrayBuffer; contentType: string } | null> {\n if (typeof fetch !== 'function') return null;\n try {\n const response = await fetch(url);\n if (!response.ok) return null;\n return {\n data: await response.arrayBuffer(),\n contentType:\n response.headers.get('content-type') ?? 'application/octet-stream',\n };\n } catch {\n return null;\n }\n}\n\nasync function drawToPng(\n source: CanvasImageSource,\n width: number,\n height: number,\n): Promise<{ data: ArrayBuffer; contentType: string } | null> {\n if (!width || !height) return null;\n const canvas = makeCanvas(width, height);\n if (!canvas) return null;\n const context = canvas.getContext('2d') as CanvasRenderingContext2D | null;\n if (!context) return null;\n try {\n context.drawImage(source, 0, 0);\n } catch {\n return null;\n }\n return canvasToPng(canvas);\n}\n\nasync function encodeRGBA(\n data: Uint8Array | Uint8ClampedArray,\n width: number,\n height: number,\n): Promise<{ data: ArrayBuffer; contentType: string } | null> {\n if (!width || !height || data.length < width * height * 4) return null;\n const canvas = makeCanvas(width, height);\n if (!canvas) return null;\n const context = canvas.getContext('2d') as CanvasRenderingContext2D | null;\n if (!context) return null;\n // Copied rather than viewed: ImageData insists on a plain ArrayBuffer, and\n // the source may sit in a SharedArrayBuffer or at an offset.\n const pixels = new Uint8ClampedArray(width * height * 4);\n pixels.set(data.subarray(0, pixels.length));\n context.putImageData(new ImageData(pixels, width, height), 0, 0);\n return canvasToPng(canvas);\n}\n\nfunction makeCanvas(\n width: number,\n height: number,\n): OffscreenCanvas | HTMLCanvasElement | null {\n if (typeof OffscreenCanvas !== 'undefined')\n return new OffscreenCanvas(width, height);\n if (typeof document !== 'undefined') {\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n return canvas;\n }\n return null;\n}\n\nasync function canvasToPng(\n canvas: OffscreenCanvas | HTMLCanvasElement,\n): Promise<{ data: ArrayBuffer; contentType: string } | null> {\n if ('convertToBlob' in canvas) {\n const blob = await canvas.convertToBlob({ type: 'image/png' });\n return { data: await blob.arrayBuffer(), contentType: 'image/png' };\n }\n const blob = await new Promise<Blob | null>((resolve) =>\n (canvas as HTMLCanvasElement).toBlob(resolve, 'image/png'),\n );\n return blob\n ? { data: await blob.arrayBuffer(), contentType: 'image/png' }\n : null;\n}\n\nfunction pathOf(object: Object3D): string {\n const parts: string[] = [];\n let current: Object3D | null = object;\n while (current && current.parent) {\n parts.unshift(`<${current.name || current.type}>`);\n current = current.parent;\n }\n return parts.join('/');\n}\n","/**\n * The preset room's half of a capture: one record in the manifest, and the\n * notes in the compatibility report that go with it. The renderer rebuilds\n * the room from that record; the stand-in in the viewport does not ship.\n */\n\nimport type { Object3D, Scene } from 'three';\nimport type { CompatibilityIssue, RoomPresetSpec } from '../protocol/index.js';\nimport { Bakery3Error } from '../errors.js';\nimport { scenePath } from './ids.js';\nimport {\n findPresetRooms,\n roomPresetAssetsOf,\n roomPresetFactsOf,\n roomPresetSpecOf,\n type PresetRoomAsset,\n} from '../presets/roomState.js';\n\nconst DOCS = 'https://bakery3.com/docs/presets#room-presets';\n\ntype Report = {\n issues: CompatibilityIssue[];\n counts: { info: number; warning: number; error: number };\n};\n\nexport function captureRoomPreset(\n scene: Scene,\n report: Report,\n context: { environment: boolean },\n): {\n spec: RoomPresetSpec;\n triangles: number;\n assets: PresetRoomAsset[];\n} | null {\n const rooms = findPresetRooms(scene);\n if (!rooms.length) return null;\n if (rooms.length > 1) {\n throw new Bakery3Error({\n code: 'CaptureFailed',\n message: `The scene holds ${rooms.length} room presets (${rooms.map(scenePath).join(', ')}); a render can be inside one room.`,\n why: 'The renderer rebuilds a room around the product from its published definition, and two rooms would be two skies and two suns for one camera.',\n fix: 'Keep one createPresetRoom() group in the scene at render time: hide the others with userData.bakery3.exclude, or remove them.',\n docs: DOCS,\n });\n }\n const group = rooms[0] as Object3D;\n const spec = roomPresetSpecOf(group)!;\n const info = roomPresetFactsOf(group);\n const note = (\n issue: Omit<CompatibilityIssue, 'severity' | 'path' | 'docs'>,\n ) => {\n report.issues.push({\n ...issue,\n severity: 'info',\n path: scenePath(group),\n docs: DOCS,\n });\n report.counts.info++;\n };\n note({\n code: 'RoomPresetReconstructed',\n message: `Room preset \"${info?.label ?? spec.name}\" is rebuilt by the renderer from its full-quality definition; the furniture, lights and materials in the viewport are stand-ins, and the foliage outside its windows exists only in the render.`,\n });\n if (context.environment) {\n note({\n code: 'RoomPresetOwnsSky',\n message:\n 'The room preset provides the sky and the daylight; scene.environment is not used for this render.',\n });\n }\n if (spec.pictures?.some(Boolean)) {\n note({\n code: 'RoomPresetPicturesReplaced',\n message: `${spec.pictures.filter(Boolean).length} of the room's pictures are yours; each is cropped to fill the frame it hangs in, which does not move.`,\n });\n }\n return {\n spec,\n triangles: info?.triangles ?? 0,\n assets: roomPresetAssetsOf(group),\n };\n}\n\n/**\n * What a preset room adds to the triangles a render traces, beyond the\n * upload: its published count, because the renderer builds the room and\n * traces it all the same. Nothing when the room ships its stand-in (a room\n * made with `bake: true`): then the upload carries the room and the scene's\n * own count already has it.\n */\nexport function roomTriangles(\n room: { spec: Pick<RoomPresetSpec, 'standIn'>; triangles: number } | null,\n): number {\n return room && room.spec.standIn !== true ? room.triangles : 0;\n}\n\n/** `roomTriangles` for the one preset room in a scene, read without a capture. */\nexport function presetRoomTriangles(scene: Object3D): number {\n const rooms = findPresetRooms(scene);\n if (rooms.length !== 1) return 0;\n const spec = roomPresetSpecOf(rooms[0]!);\n if (!spec) return 0;\n return roomTriangles({\n spec,\n triangles: roomPresetFactsOf(rooms[0]!)?.triangles ?? 0,\n });\n}\n","/**\n * What leaves the browser: a scene as one GLB plus a manifest.\n *\n * The SDK reads the live scene graph and writes one binary and one small\n * manifest. The manifest holds everything glTF cannot say (camera, lights,\n * color management, the environment, shader graphs, the compatibility report)\n * and names every asset by its sha256. The only URL a manifest may carry is a\n * preset environment on the preset library.\n *\n * Nothing here changes the caller's scene beyond the id stamps, and those are\n * removed in a `finally`: a render must be invisible to the application that\n * asked for it.\n */\n\nimport type { Camera, Object3D, Scene } from 'three';\nimport { GLTFExporter } from 'three/examples/jsm/exporters/GLTFExporter.js';\nimport type {\n AssetDescriptor,\n ColorSpec,\n EnvironmentSpec,\n SceneManifest,\n} from '../protocol/index.js';\nimport { protocolVersionFor } from '../protocol/index.js';\nimport { SDK_VERSION } from '../version.js';\nimport { Bakery3Error } from '../errors.js';\nimport { sha256 } from './hash.js';\nimport { captureCamera } from './camera.js';\nimport { sceneComplexity } from './complexity.js';\nimport { captureColor } from './color.js';\nimport {\n captureEnvironmentSettings,\n captureFog,\n captureLights,\n captureRuntime,\n shouldExclude,\n stampIds,\n} from './scene.js';\nimport { analyzeScene, collectFallbacks } from '../compat/analyze.js';\nimport { captureShaders } from './shaders.js';\nimport {\n environmentSourceFor,\n isPresetEnvironment,\n} from './environmentSource.js';\nimport { scenePath } from './ids.js';\nimport { materialStandIns, substituteMaterials } from './materials.js';\nimport { captureRoomPreset, roomTriangles } from './room.js';\nimport { capturedAmbient } from './ambient.js';\n\n/**\n * What a capture is made from.\n *\n * By the time an HDRI is on `scene.environment` it has usually been through\n * PMREM and is a GPU render target: the original equirectangular pixels are\n * gone, and reading them back would give a blurred cubemap rather than the\n * map the renderer wants. So the SDK asks to be told once, at load:\n *\n * const hdri = await new RGBELoader().loadAsync('/studio.hdr');\n * rememberEnvironmentSource(hdri, '/studio.hdr');\n *\n * `@oeave/bakery3/r3f` does this automatically for drei's `<Environment files>`.\n * Without it the render still happens; it falls back to the flat ambient term\n * and says so in the compatibility report rather than guessing.\n */\nexport type CaptureOptions = {\n scene: Scene;\n camera: Camera;\n renderer?: {\n outputColorSpace?: string;\n toneMapping?: number;\n toneMappingExposure?: number;\n };\n /**\n * An HDRI to light with, when the SDK cannot recover the one in the scene.\n * A URL the page can fetch, or the file's bytes.\n */\n environment?: string | ArrayBuffer;\n /** Opaque application state, stored with the render. Never rendered. */\n productState?: Record<string, unknown>;\n /** Override the transparent-background default. */\n background?: EnvironmentSpec['background'];\n};\n\nexport type CapturedScene = {\n manifest: SceneManifest;\n /** Every blob this manifest refers to, ready to be hashed against storage. */\n assets: Array<AssetDescriptor & { bytes: number; data: ArrayBuffer }>;\n};\n\nexport async function captureScene(\n options: CaptureOptions,\n): Promise<CapturedScene> {\n const { scene, camera } = options;\n // Before anything is read or stamped: a capture outside a browser fails\n // deep in the exporter, with an error that blames the geometry.\n assertCaptureRuntime();\n\n const color: ColorSpec = captureColor(options.renderer);\n const compatibility = analyzeScene(scene);\n const fallbacks = collectFallbacks(scene);\n const lights = captureLights(scene);\n const runtime = captureRuntime(scene, options.productState);\n\n // Node materials, as portable shader graphs, plus the textures they sample,\n // which the GLB does not carry. Failures land in the compatibility report\n // next to what check() already said.\n const shaded = await captureShaders(scene);\n for (const issue of shaded.issues) {\n compatibility.issues.push(issue);\n compatibility.counts[issue.severity]++;\n }\n\n // A preset room around the product: its stand-in is excluded from every\n // capture above and from the export below; what ships is one record the\n // renderer rebuilds the room from.\n const room = captureRoomPreset(scene, compatibility, {\n environment: Boolean(scene.environment || options.environment),\n });\n\n const unstamp = stampIds(scene);\n let glb: ArrayBuffer;\n try {\n glb = await exportGLB(scene);\n } finally {\n // Even on failure: a thrown export must not leave `bakery3Id` keys behind\n // in the developer's userData.\n unstamp();\n }\n\n const sceneAsset = await sha256(glb);\n const assets: CapturedScene['assets'] = [\n {\n hash: sceneAsset,\n kind: 'scene',\n bytes: glb.byteLength,\n contentType: 'model/gltf-binary',\n name: 'scene.glb',\n data: glb,\n },\n ...shaded.assets,\n // A picture the developer hung in a preset room's frame: the one case\n // where the room record names an asset the scene GLB does not carry.\n ...(room?.assets ?? []).map((asset) => ({\n hash: asset.hash,\n kind: 'texture' as const,\n bytes: asset.data.byteLength,\n contentType: asset.contentType,\n name: asset.name,\n data: asset.data,\n })),\n ];\n\n const lit = await captureEnvironment(options, scene, assets, compatibility);\n // The report already says what the render does with the fog (`analyzeScene`).\n const { fog } = captureFog(scene);\n const environment = fog ? { ...lit, fog } : lit;\n\n const manifest: SceneManifest = {\n // A manifest is stamped with the lowest protocol version that can read\n // it, so an older render worker is not refused a still it understands.\n // `renderVideo()` re-stamps once it has added the animation; a preset\n // room raises the version here, because a worker that ignored the room\n // would render the product in a void. See `protocolVersionFor`.\n // Fog raises it too: an older worker would leave the fog out.\n protocolVersion: protocolVersionFor({\n ...(room ? { room: room.spec } : {}),\n ...(environment ? { environment } : {}),\n }),\n sdkVersion: SDK_VERSION,\n sceneAsset,\n ...(assets.length > 1\n ? { assets: assets.slice(1).map((asset) => asset.hash) }\n : {}),\n camera: captureCamera(camera),\n ...(Object.keys(runtime).length ? { runtime } : {}),\n ...(environment ? { environment } : {}),\n ...(lights.length ? { lights } : {}),\n color,\n ...(fallbacks.length ? { fallbacks } : {}),\n ...(shaded.shaders.length ? { shaders: shaded.shaders } : {}),\n ...(room ? { room: room.spec } : {}),\n compatibility: {\n score: compatibility.score,\n issues: compatibility.issues,\n counts: compatibility.counts,\n },\n // The control plane prices what it accepts with the same numbers\n // estimate() was given (see SceneManifest.stats).\n stats: {\n // A preset room's geometry is built by the renderer, not uploaded, but\n // it is traced all the same, so its published count is added. Unless\n // the room shipped its stand-in: then the upload carries it and\n // `compatibility` has already counted it.\n triangles: compatibility.triangles + roomTriangles(room),\n emitters: compatibility.emitters,\n // How enclosed and how full the scene is, from the camera: what the\n // quote reads to price an interior as one (capture/complexity.ts).\n ...sceneComplexity(scene, camera),\n },\n source: {\n three: threeVersion(),\n renderer: options.renderer ? 'WebGLRenderer' : undefined,\n userAgent:\n typeof navigator !== 'undefined' ? navigator.userAgent : undefined,\n },\n };\n\n return { manifest, assets };\n}\n\n/**\n * Binary glTF, from the live graph.\n *\n * `onlyVisible: false` is the load-bearing option. Hidden objects must ship:\n * a configurator that hides three of four fabrics would otherwise export a\n * different GLB for every combination, miss the content-addressed cache every\n * time, and re-upload the whole product on each render. They ship once and\n * are hidden per render instead.\n */\nfunction exportGLB(scene: Scene): Promise<ArrayBuffer> {\n const exporter = new GLTFExporter();\n // A material the exporter cannot write, or one with a declared fallback,\n // goes out as a stand-in carrying its id, handed to the exporter rather\n // than swapped on the scene (./materials.ts).\n const standIns = materialStandIns(scene);\n const reattach = detachExcluded(scene);\n const unmute = muteLightWarnings();\n const unswap = substituteMaterials(exporter, standIns);\n\n return new Promise<ArrayBuffer>((resolve, reject) => {\n exporter.parse(\n scene,\n (result) => {\n if (!(result instanceof ArrayBuffer)) {\n reject(\n new Bakery3Error({\n code: 'CaptureFailed',\n message:\n 'The glTF exporter returned JSON instead of a binary GLB.',\n why: 'binary: true was set, so this should not happen. It usually means a patched or very old GLTFExporter.',\n fix: 'Update three, or file an issue at github.com/oeave/bakery3 with your three version.',\n }),\n );\n return;\n }\n resolve(result);\n },\n (error) =>\n reject(\n new Bakery3Error({\n code: 'CaptureFailed',\n message: `Could not export the scene: ${\n error instanceof Error ? error.message : String(error)\n }`,\n why: 'The glTF exporter walks the scene graph; a geometry with a malformed attribute or a texture from a tainted canvas will stop it.',\n fix: 'Run bakery3.check() to find the object it stopped on.',\n docs: 'https://bakery3.com/docs/troubleshooting#export',\n }),\n ),\n {\n binary: true,\n onlyVisible: false,\n includeCustomExtensions: true,\n },\n );\n }).finally(() => {\n unswap();\n unmute();\n reattach();\n });\n}\n\n/**\n * The exporter's warnings about lights it cannot write into glTF, which are\n * not true of a capture: every light travels in `manifest.lights`, with its\n * type, its world position and aim, its cone, its decay and a hemisphere's\n * colors, and the renderer builds its lamps from that record. The copy in\n * the GLB is inert. Left in, these read as a broken scene to anybody seeing\n * them for the first time.\n */\nconst MUTED_EXPORTER_WARNINGS = [\n 'THREE.GLTFExporter: Only directional, point, and spot lights are supported.',\n 'THREE.GLTFExporter: Light direction may be lost.',\n 'THREE.GLTFExporter: Light decay may be lost.',\n];\n\nlet muted = 0;\nlet mute: {\n original: typeof console.warn;\n filter: typeof console.warn;\n} | null = null;\n\n/**\n * Drop exactly those warnings while an export runs. Counted, so two captures\n * that overlap put back the original `console.warn` and never each other's\n * filter; and a `console.warn` somebody else installed meanwhile is left\n * alone. Returns the undo, which runs however the export ends.\n */\nfunction muteLightWarnings(): () => void {\n if (muted++ === 0) {\n const original = console.warn;\n const filter = function (this: unknown, ...args: unknown[]) {\n const first = args[0];\n if (\n typeof first === 'string' &&\n MUTED_EXPORTER_WARNINGS.some((prefix) => first.startsWith(prefix))\n )\n return;\n original.apply(this, args as Parameters<typeof console.warn>);\n };\n mute = { original, filter };\n console.warn = filter;\n }\n let done = false;\n return () => {\n if (done) return;\n done = true;\n if (--muted > 0 || !mute) return;\n if (console.warn === mute.filter) console.warn = mute.original;\n mute = null;\n };\n}\n\n/**\n * The browser APIs the export needs. three's exporter writes the GLB as a\n * Blob and reads it back with `FileReader`, which Node and Bun do not have.\n */\nfunction assertCaptureRuntime(): void {\n if (typeof (globalThis as { FileReader?: unknown }).FileReader === 'function')\n return;\n throw new Bakery3Error({\n code: 'CaptureFailed',\n message:\n 'render() captures a three.js scene in a browser. In Node, use @oeave/bakery3/node: renderBatch() renders models by URL.',\n why: \"The capture exports your live scene with three.js, which needs the browser's FileReader, and this runtime has none.\",\n fix: \"Call render() from the page that shows the scene. From a server or a script, render .glb files by URL with `new Bakery3Server(key).renderBatch()` from '@oeave/bakery3/node'.\",\n docs: 'https://bakery3.com/docs/catalog',\n });\n}\n\n/**\n * Keep helpers, gizmos and opted-out objects out of the export.\n *\n * They are detached rather than hidden: with `onlyVisible: false` (which\n * hidden product variants depend on) the exporter would write a hidden grid\n * helper into the GLB. Removing an object from its parent is the only\n * exclusion the exporter honors.\n *\n * Returns the undo, which the caller runs in a `finally`. The scene is\n * missing these objects for one synchronous parse, so nothing can render in\n * between and see the gap.\n */\nfunction detachExcluded(scene: Scene): () => void {\n const detached: Array<{ object: Object3D; parent: Object3D; index: number }> =\n [];\n scene.traverse((object) => {\n if (!object.parent || !shouldExclude(object)) return;\n detached.push({\n object,\n parent: object.parent,\n index: object.parent.children.indexOf(object),\n });\n });\n // Detach deepest-last so removing a parent does not invalidate a child's\n // recorded index.\n for (const entry of detached) entry.parent.remove(entry.object);\n return () => {\n for (const entry of [...detached].reverse()) {\n entry.object.parent = entry.parent;\n entry.parent.children.splice(entry.index, 0, entry.object);\n }\n };\n}\n\n/**\n * The lighting environment, plus the background it draws.\n *\n * Transparent is the default background: a still with alpha drops into a\n * catalog, a hero banner or a quote PDF, and a baked-in backdrop can never be\n * removed later.\n */\nasync function captureEnvironment(\n options: CaptureOptions,\n scene: Scene,\n assets: CapturedScene['assets'],\n compatibility: ReturnType<typeof analyzeScene>,\n): Promise<EnvironmentSpec | undefined> {\n const settings = captureEnvironmentSettings(scene);\n const background: EnvironmentSpec['background'] = options.background ?? {\n type: 'transparent',\n };\n\n const explicit = options.environment;\n const remembered = scene.environment\n ? environmentSourceFor(scene.environment)\n : undefined;\n const source = explicit ?? remembered;\n\n if (!source) {\n if (scene.environment) {\n // The scene is lit by an HDRI and the SDK cannot get at its pixels. Say\n // so: a silently unlit render is the worst outcome here.\n compatibility.issues.push({\n code: 'environment_unavailable',\n severity: 'warning',\n message:\n 'The scene has an environment map, but its source pixels are not reachable from the SDK.',\n docs: 'https://bakery3.com/docs/environment',\n });\n compatibility.counts.warning++;\n }\n const ambient = capturedAmbient(scene);\n return {\n ...settings,\n ...(ambient ? { ambient } : {}),\n background,\n };\n }\n\n const preset =\n typeof source === 'string' &&\n (source.startsWith(PRESET_LIBRARY) ||\n (!explicit &&\n scene.environment !== null &&\n isPresetEnvironment(scene.environment)));\n // three adds an AmbientLight to the environment's light rather than using\n // it instead, and so does the renderer: it travels with an HDRI too.\n const ambient = capturedAmbient(scene);\n const fill = ambient ? { ambient } : {};\n\n if (typeof source === 'string' && preset) {\n // A preset environment is named by its URL on the preset library, which\n // the renderer already has, so nobody uploads a map the library serves.\n return { ...settings, ...fill, hdri: source, background };\n }\n\n // Any other URL is the developer's own and is fetched here, in their page,\n // where their cookies, CORS rules and relative paths mean what they expect.\n // The renderer is never asked to fetch a URL somebody typed: it receives a\n // hash like every other asset, and the control plane refuses a manifest\n // that says otherwise.\n const pixels =\n typeof source === 'string' ? await fetchEnvironment(source) : source;\n const hash = await sha256(pixels);\n assets.push({\n hash,\n kind: 'hdri',\n bytes: pixels.byteLength,\n contentType: 'image/vnd.radiance',\n name: 'environment.hdr',\n data: pixels,\n });\n return { ...settings, ...fill, hdri: hash, background };\n}\n\n/** The preset library's public home. The one place a manifest may name by URL. */\nconst PRESET_LIBRARY = 'https://cdn.bakery3.com/presets/';\n\nasync function fetchEnvironment(url: string): Promise<ArrayBuffer> {\n let response: Response;\n try {\n response = await fetch(url);\n } catch (cause) {\n throw environmentUnreachable(\n url,\n cause instanceof Error ? cause.message : String(cause),\n );\n }\n if (!response.ok)\n throw environmentUnreachable(\n url,\n `${response.status} ${response.statusText}`.trim(),\n );\n return response.arrayBuffer();\n}\n\nfunction environmentUnreachable(url: string, detail: string): Bakery3Error {\n return new Bakery3Error({\n code: 'CaptureFailed',\n message: `The environment at ${url} could not be fetched: ${detail}.`,\n why: 'An environment given by URL is downloaded in the page and uploaded with the scene, so the page has to be able to read it.',\n fix: 'Check the URL and its CORS headers, or pass the HDRI bytes as `environment` instead.',\n docs: 'https://bakery3.com/docs/environment',\n });\n}\n\nfunction threeVersion(): string | undefined {\n const three = (globalThis as { __THREE__?: string }).__THREE__;\n return typeof three === 'string' ? three : undefined;\n}\n","/**\n * How big a picture is when nobody said: the long edge from the quality\n * preset, the shape from the camera.\n *\n * The renderer keeps the camera's vertical field of view and takes the width\n * from the output, so an output of another shape than the camera's crops or\n * widens the shot sideways. A 16:9 viewport traced into a square came back\n * with its sides cut off. So the shape is the camera's unless the caller\n * gave one:\n *\n * - neither `width` nor `height`: the preset's long edge, the camera's aspect;\n * - one of them: the other follows from the camera's aspect;\n * - both: exactly as given.\n *\n * The aspect is read from the camera (`PerspectiveCamera.aspect`, or the\n * frustum of an `OrthographicCamera`), then from the renderer's drawing\n * buffer, and is 1 when there is neither.\n *\n * Every call that picks a size goes through `resolveOutput`: `render()`,\n * `renderVideo()`, `estimate()`, `render({ cameras })`, the variants calls\n * and the devtools panel, so a quote and the render it precedes are always\n * the same size.\n */\n\nimport { Vector2, type Camera } from 'three';\nimport type {\n OutputFormat,\n OutputSpec,\n QualityPreset,\n} from '../protocol/index.js';\nimport { QUALITY } from '../protocol/index.js';\n\n/** Width ÷ height of what the camera draws, or what the renderer draws, else 1. */\nexport function aspectOf(camera?: Camera | null, renderer?: unknown): number {\n return cameraAspect(camera) ?? rendererAspect(renderer) ?? 1;\n}\n\n/**\n * A width and a height from what was given, a long edge and an aspect.\n *\n * Sides that are derived are rounded to whole pixels, and to even ones with\n * `even` (a video: H.264 cannot encode an odd side). Sides that were given\n * are left as given.\n */\nexport function outputSize(\n given: { width?: number; height?: number },\n longEdge: number,\n aspect: number,\n options: { even?: boolean } = {},\n): { width: number; height: number } {\n const ratio = Number.isFinite(aspect) && aspect > 0 ? aspect : 1;\n const round = options.even\n ? (value: number) => Math.max(2, Math.round(value / 2) * 2)\n : (value: number) => Math.max(1, Math.round(value));\n const { width, height } = given;\n if (width !== undefined && height !== undefined) return { width, height };\n if (width !== undefined) return { width, height: round(width / ratio) };\n if (height !== undefined) return { width: round(height * ratio), height };\n return ratio >= 1\n ? { width: round(longEdge), height: round(longEdge / ratio) }\n : { width: round(longEdge * ratio), height: round(longEdge) };\n}\n\n/** What a call says about its picture. Every field optional. */\nexport type OutputRequest = {\n width?: number;\n height?: number;\n format?: OutputFormat;\n /** JPEG/WebP only, 1 to 100. `OutputSpec.quality` on the wire. */\n imageQuality?: number;\n};\n\n/**\n * The `OutputSpec` a call renders at.\n *\n * `defaults` is the client's `defaults.output`: every field of it is used,\n * and its size counts as given. A size given to the call replaces the\n * defaults' size as a whole, so `render({ width: 800 })` under defaults of\n * 1920×1080 is 800×450 for a 16:9 camera, never 800×1080.\n */\nexport function resolveOutput(\n call: OutputRequest,\n defaults: Partial<OutputSpec> | undefined,\n context: {\n quality: QualityPreset;\n camera?: Camera | null;\n renderer?: unknown;\n /** Round derived sides to even numbers: a video. */\n even?: boolean;\n },\n): OutputSpec {\n const own = call.width !== undefined || call.height !== undefined;\n const given = own\n ? { width: call.width, height: call.height }\n : { width: defaults?.width, height: defaults?.height };\n const size = outputSize(\n {\n ...(given.width !== undefined ? { width: given.width } : {}),\n ...(given.height !== undefined ? { height: given.height } : {}),\n },\n QUALITY[context.quality].defaultLongEdge,\n aspectOf(context.camera, context.renderer),\n { even: context.even ?? false },\n );\n const quality = call.imageQuality ?? defaults?.quality;\n return {\n ...size,\n format: call.format ?? defaults?.format ?? 'png',\n ...(quality !== undefined ? { quality } : {}),\n ...(defaults?.opaque !== undefined ? { opaque: defaults.opaque } : {}),\n };\n}\n\nfunction cameraAspect(camera?: Camera | null): number | undefined {\n const view = camera as\n | (Camera & {\n isPerspectiveCamera?: boolean;\n isOrthographicCamera?: boolean;\n aspect?: number;\n left?: number;\n right?: number;\n top?: number;\n bottom?: number;\n })\n | null\n | undefined;\n if (!view) return undefined;\n if (view.isPerspectiveCamera) return positive(view.aspect);\n if (view.isOrthographicCamera)\n return positive(\n ((view.right ?? 0) - (view.left ?? 0)) /\n ((view.top ?? 0) - (view.bottom ?? 0)),\n );\n return undefined;\n}\n\nfunction rendererAspect(renderer: unknown): number | undefined {\n const drawing = renderer as\n | {\n getDrawingBufferSize?: (target: Vector2) => Vector2;\n domElement?: { width?: number; height?: number };\n }\n | null\n | undefined;\n if (!drawing || typeof drawing !== 'object') return undefined;\n if (typeof drawing.getDrawingBufferSize === 'function') {\n try {\n const size = drawing.getDrawingBufferSize(new Vector2());\n const aspect = positive(size.x / size.y);\n if (aspect) return aspect;\n } catch {\n // A renderer that has lost its context: the canvas still knows.\n }\n }\n const canvas = drawing.domElement;\n return canvas\n ? positive((canvas.width ?? 0) / (canvas.height ?? 0))\n : undefined;\n}\n\nfunction positive(value: number | undefined): number | undefined {\n return value !== undefined && Number.isFinite(value) && value > 0\n ? value\n : undefined;\n}\n","/**\n * The numbers a quote is priced from, read off the live scene without\n * exporting it: the same ones a capture writes into `manifest.stats`, which\n * is what the control plane prices the accepted render or bake from. One\n * function for both, so an estimate and the job it precedes agree.\n */\n\nimport type { Object3D } from 'three';\nimport { analyzeScene } from '../compat/analyze.js';\nimport { presetRoomTriangles } from './room.js';\n\n/** Every triangle the renderer traces: what uploads, plus a preset room it builds. */\nexport function tracedTriangles(\n scene: Object3D,\n uploaded: number = analyzeScene(scene).triangles,\n): number {\n return uploaded + presetRoomTriangles(scene);\n}\n","/**\n * Baking a product that stands in a preset room the library has already lit.\n *\n * A preset room is the same room for everyone who picks it: the same walls,\n * windows and light rig, so its own lightmaps are a library asset. When the\n * room in the scene is unmodified, the bake can cover only what the library\n * cannot know:\n *\n * - your own objects,\n * - the stand under them, because the product's shadow falls on its top and\n * a prebaked stand was lit with nothing on it,\n * - a shadow plane on the floor (see shadow.ts).\n *\n * Unmodified is strict. The prebake is a photograph of one arrangement of\n * light, and anything that changes what leaves a surface changes every bounce\n * after it: a different floor material, a different map outside the windows,\n * a different pedestal in the middle of the room. Any of those sends the bake\n * back to lighting the room itself.\n *\n * What is lost: the prebaked room never saw the product, so light the product\n * throws is missing (a red vase does not tint the wall behind it, and a lamp\n * you brought lights nothing). The shadow plane recovers what the product\n * blocks, which is what the eye reads as contact, and nothing more.\n */\n\nimport type { Object3D } from 'three';\nimport type { RoomPresetSpec } from '../protocol/index.js';\nimport {\n findPresetRooms,\n roomPresetSpecOf,\n roomShownBaked,\n} from '../presets/roomState.js';\nimport { roomIsPrebaked, roomPrebakeChanges } from '../presets/roomPrebake.js';\nimport type { BakeCandidate } from './candidates.js';\n\n/** How close to the stand's top a product has to be to be standing ON it. */\nconst ON_THE_STAND_METRES = 0.05;\n\nexport type PresetRoomBake = {\n room: RoomPresetSpec;\n /** The room group, so the caller can tell its meshes from the developer's. */\n group: Object3D;\n /** objectIds to bake even though they belong to the room: the stand the\n * product is on. Empty when it stands on the floor. */\n standIds: string[];\n /**\n * objectIds the shadow is cast by: the developer's own objects, and never\n * the stand.\n *\n * The prebaked room was lit with the stand in it, so the stand's shadow is\n * already on that floor. Casting it into the plane as well would lay it\n * down twice. The stand `spans` the plane instead (see `BakeShadow`).\n */\n castIds: string[];\n /** objectIds the plane is placed beneath and sized to cover: the\n * developer's objects and the stand they are on. */\n spanIds: string[];\n};\n\n/** Why a room cannot be taken from the library, in the developer's terms. */\nexport type PresetRoomRefusal = { code: string; message: string };\n\n/**\n * Can this bake stand its objects in a prebaked room?\n *\n * `null` when there is no preset room at all (an ordinary scene, an ordinary\n * bake). A refusal when there is one and it has been changed.\n */\nexport function presetRoomBake(\n scene: Object3D,\n candidates: BakeCandidate[],\n include: string[],\n): { ok: PresetRoomBake } | { refused: PresetRoomRefusal } | null {\n const rooms = findPresetRooms(scene);\n if (rooms.length === 0) return null;\n if (rooms.length > 1) {\n return {\n refused: {\n code: 'BakeManyRooms',\n message: `The scene has ${rooms.length} preset rooms in it, and a prebaked room has to be the only one.`,\n },\n };\n }\n const group = rooms[0]!;\n const room = roomPresetSpecOf(group);\n if (!room) return null;\n\n // Is there a library asset at all? A room with nothing published has no\n // light to take, so the bake lights it itself. Without this check the bake\n // would cover the product alone and the room would arrive unlit, which in\n // an embed (no lights at all) means a black room.\n // A room the page shows BAKED has its light in it already, which is all a\n // library prebake is for.\n if (!roomShownBaked(group) && !roomIsPrebaked(room.name, room.lighting)) {\n return {\n refused: {\n code: 'BakeRoomNotPrebaked',\n message: `There are no prebaked lightmaps for ${room.name} under ${room.lighting} light, so this bake covers the room itself.`,\n },\n };\n }\n\n const changed = roomPrebakeChanges(room);\n if (changed.length) {\n return {\n refused: {\n code: 'BakeRoomModified',\n message: `This room has ${changed.join(' and ')} changed, so its light is not the light we baked.`,\n },\n };\n }\n\n // The developer's own objects are the ones outside the room group.\n const mine = candidates.filter(\n (candidate) =>\n include.includes(candidate.objectId) && !isUnder(candidate.object, group),\n );\n if (!mine.length) {\n return {\n refused: {\n code: 'BakeRoomOnly',\n message:\n 'Everything this bake covers belongs to the room, so there is nothing a prebaked one would not already have.',\n },\n };\n }\n\n const stand = group.getObjectByName('stand');\n const standIds = stand ? standsUnder(candidates, stand, mine) : [];\n const mineIds = mine.map((candidate) => candidate.objectId);\n return {\n ok: {\n room,\n group,\n standIds,\n castIds: mineIds,\n spanIds: [...mineIds, ...standIds],\n },\n };\n}\n\n/**\n * The stand's meshes, when the product is standing on it.\n *\n * A prebaked stand was lit with nothing on it, so its top is missing the one\n * shadow nobody can miss. A product placed on the floor instead leaves the\n * stand exactly as the library has it, and baking it again would buy nothing.\n */\nfunction standsUnder(\n candidates: BakeCandidate[],\n stand: Object3D,\n mine: BakeCandidate[],\n): string[] {\n const top = boundsOf(stand)?.high;\n if (top === undefined) return [];\n const lowest = Math.min(\n ...mine.map((candidate) => boundsOf(candidate.object)?.low ?? Infinity),\n );\n // On it means its underside is at the stand's top, give or take: a product\n // that sinks a millimetre in, or hovers one above, is still on it. A\n // product on the floor is a metre below, and one on a shelf a metre above,\n // and neither casts anything the prebaked stand is missing.\n if (!Number.isFinite(lowest) || Math.abs(lowest - top) > ON_THE_STAND_METRES)\n return [];\n const ids: string[] = [];\n for (const candidate of candidates) {\n if (candidate.bakeable && isUnder(candidate.object, stand))\n ids.push(candidate.objectId);\n }\n return ids;\n}\n\n/** The vertical extent of an object in world space. */\nfunction boundsOf(object: Object3D): { low: number; high: number } | undefined {\n object.updateWorldMatrix(true, true);\n let low = Infinity;\n let high = -Infinity;\n object.traverse((node) => {\n const mesh = node as {\n isMesh?: boolean;\n geometry?: { boundingBox: unknown; computeBoundingBox(): void };\n };\n if (!mesh.isMesh || !mesh.geometry) return;\n if (!mesh.geometry.boundingBox) mesh.geometry.computeBoundingBox();\n const box = mesh.geometry.boundingBox as {\n min: { y: number };\n max: { y: number };\n } | null;\n if (!box) return;\n // Corners through the world matrix would be exact; the vertical extent\n // of a room's furniture is not rotated, so its own box is enough.\n const matrix = (node as unknown as { matrixWorld: { elements: number[] } })\n .matrixWorld.elements;\n const scale = matrix[5] ?? 1;\n const offset = matrix[13] ?? 0;\n low = Math.min(low, box.min.y * scale + offset);\n high = Math.max(high, box.max.y * scale + offset);\n });\n return Number.isFinite(low) ? { low, high } : undefined;\n}\n\nfunction isUnder(object: Object3D, root: Object3D): boolean {\n for (let node: Object3D | null = object; node; node = node.parent)\n if (node === root) return true;\n return false;\n}\n","/**\n * The request half: a live scene becomes a `BakeSpec` plus its assets.\n *\n * `bake()` on the root entry point is a short wrapper over this: prepare,\n * upload the misses, POST `/v1/bakes`, poll. It stays exported on its own so\n * a caller with a bake worker of their own can build the exact request the\n * hosted one takes and post it wherever that worker lives.\n *\n * The capture is the ordinary one: the same graph walk, shader extraction and\n * content-addressed assets as a still. The camera travels with it and is\n * unused by the bake itself, which is what lets you move the viewpoint and\n * still hit the same bake cache entry.\n */\n\nimport type { Camera, Mesh, Object3D, Scene } from 'three';\nimport {\n BAKE_ATLAS_SIZES,\n BAKE_TEXTURE_SIZES,\n MAX_BAKE_OBJECTS,\n MAX_BAKE_SIMPLIFY,\n MAX_BAKE_SIMPLIFY_TRIANGLES,\n MAX_BAKE_TEXELS,\n type BakeAtlas,\n type BakeSimplify,\n type BakeQuality,\n type BakeSettings,\n type BakeSpec,\n type BakeTextureSize,\n type BakeView,\n} from '../protocol/index.js';\nimport {\n captureScene,\n type CaptureOptions,\n type CapturedScene,\n} from '../capture/capture.js';\nimport { Bakery3Error } from '../errors.js';\nimport { idOf } from '../capture/ids.js';\nimport { presetRoomBake, type PresetRoomBake } from './room.js';\nimport { isBakeWrittenUv } from './apply.js';\nimport {\n bakeCandidates,\n defaultIncludeIds,\n type BakeCandidate,\n} from './candidates.js';\nimport { resolveProbe } from './probe.js';\nimport { tracedTriangles } from '../capture/stats.js';\nimport { findPresetRooms, roomShownBaked } from '../presets/roomState.js';\nimport { bakeBounds, quantizeBakeView } from './view.js';\n\n/**\n * Geometry the viewer does not need, delivered as something lighter with\n * its detail baked on: its color, a normal map for the relief it lost, and\n * the light traced at the real surface. The real objects still cast their\n * shadows and bounce their light in the bake; they are only hidden once it\n * is applied.\n *\n * simplify: [\n * { objects: bookcase, to: 'box' }, // a group: every mesh under it\n * { objects: [palm, monstera], to: 'billboard' },\n * { objects: statue, triangles: 800 }, // to: 'lowpoly' is the default\n * { objects: sofa, to: sofaLowPoly }, // a mesh of your own\n * ]\n *\n * Or on the object itself, which travels with the model:\n *\n * bookcase.userData.bakery3 = { simplify: 'box' };\n */\nexport type BakeSimplifyInput = {\n /** What to replace: objects (a group means every mesh under it) or ids. */\n objects: Object3D | string | Array<Object3D | string>;\n /**\n * `'lowpoly'` (default): shrink-wrapped and reduced to `triangles`.\n * `'box'`: the box round them. `'billboard'`: one picture that turns to\n * face the camera, for foliage. `'decimate'`: each object, with fewer\n * triangles and its own materials, for the product itself. Or a mesh of\n * your own to use as the shape: it does not have to be in the scene, and\n * it is never drawn as itself.\n */\n to?: 'lowpoly' | 'box' | 'billboard' | 'decimate' | Mesh;\n /** `'lowpoly'`: default 1500. `'decimate'`: per object, default 20000. */\n triangles?: number;\n /** The stand-in's texture side. Default `textureSize`. */\n textureSize?: BakeTextureSize;\n /**\n * One stand-in for several entries, where there is no group node to hang\n * it on. Every entry with the same `group` becomes a single stand-in.\n *\n * A row of books is thirty meshes lying under the same carcass as the\n * shelves, and one box around the books is the point; naming the carcass\n * would take the shelves with it. Objects that already share a parent\n * need none of this: pass the parent.\n */\n group?: string;\n};\n\nexport type PrepareBakeSettings = {\n quality?: BakeQuality;\n textureSize?: BakeTextureSize;\n /** Explicit objectIds. Omit and the SDK bakes every candidate that is\n * bakeable and on by default. */\n include?: string[];\n /** Removed from whatever `include` resolved to: the panel's unticked\n * boxes, without the panel having to restate the whole list. */\n exclude?: string[];\n sizes?: Record<string, BakeTextureSize>;\n margin?: number;\n deliverGlb?: boolean;\n /**\n * Bake everything into one shared lightmap instead of one per object:\n * one download and one texture bind for the whole room. `true` is a 2048²\n * atlas; pass `{ size, weights }` to choose the size and give a hero\n * product more of the map (`weights: { [heroId]: 4 }` is twice the side\n * and four times the area its surface alone would earn). See `BakeAtlas`\n * for how shares are worked out.\n */\n atlas?: boolean | BakeAtlas;\n /**\n * Where the unwrap hides its seams from.\n *\n * `'camera'` (default): the camera you pass, quantized so that small moves\n * reuse the bake (see view.ts). `'none'`: no viewpoint; seams prefer the\n * underside and hard edges alone, for a scene with no dominant view. Or an\n * explicit position in scene units, sent as given.\n */\n view?: 'camera' | 'none' | BakeView;\n /** See `BakeSimplifyInput`. Entries here are added to the ones found on\n * objects as `userData.bakery3.simplify`. */\n simplify?: BakeSimplifyInput[];\n /**\n * What to do about a preset room in the scene.\n *\n * `'preset'` (the default) takes an unmodified room's own lightmaps from\n * the library and bakes only your objects, the stand they are on and the\n * shadow they cast: a few seconds where a whole room is minutes. A room\n * you have changed, or a scene with no preset room in it, is baked in full\n * either way. `'full'` bakes the room's surfaces too, which is what you\n * want if you have lit it yourself or the product throws light of its own.\n *\n * The report says which happened (`BakeApplyReport.room`), because a bake\n * that quietly covered less than you asked is not a saving.\n */\n room?: 'full' | 'preset';\n};\n\nexport type PrepareBakeOptions = Omit<CaptureOptions, 'scene' | 'camera'> & {\n scene: Scene;\n camera: Camera;\n settings?: PrepareBakeSettings;\n maxCost?: number;\n metadata?: Record<string, unknown>;\n idempotencyKey?: string;\n};\n\nexport type PreparedBake = {\n spec: BakeSpec;\n /** Set when the bake stands its objects in a prebaked preset room, so a\n * caller can say so before the job is even submitted. */\n presetRoom?: { name: string; lighting: string; build: string };\n assets: CapturedScene['assets'];\n /** The classification the include list came from, so a caller can show what\n * was left out and why without walking the scene twice. */\n candidates: BakeCandidate[];\n};\n\n/**\n * What a bake covers, decided from the live scene without exporting it: the\n * include list, the preset-room verdict, the stand-ins, and every bake\n * setting but the capture. `prepareBake()` captures from this, and\n * `estimate({ bake })` quotes from it, so a quote covers exactly the objects,\n * stand-ins and shadow the bake would.\n */\nexport type BakePlan = {\n /** Every setting but the manifest. `view` is there when a camera was given. */\n bake: BakeSettings;\n /** Triangles the unwrap runs over: see `BakeSpec.bakedTriangles`. */\n bakedTriangles: number;\n candidates: BakeCandidate[];\n preset?: PresetRoomBake;\n /** Your own stand-in meshes, which travel in the capture, hidden. */\n shapes: Mesh[];\n};\n\n/**\n * Decide what to bake.\n *\n * The ceilings are checked here as well as in the render worker's preflight,\n * on purpose: exporting a 200 MB GLB and uploading it only to be told the\n * texel budget was blown is a refusal the browser could see coming. You\n * learn the cost before you spend it.\n */\nexport function planBake(\n scene: Scene,\n camera: Camera | undefined,\n settings: PrepareBakeSettings = {},\n): BakePlan {\n const quality = settings.quality ?? 'standard';\n const textureSize = settings.textureSize ?? 1024;\n\n let candidates = bakeCandidates({ scene });\n let include = resolveInclude(candidates, settings);\n\n // A product standing in an unmodified preset room: its lightmaps are a\n // library asset, and this bake covers what the library cannot know. See\n // bake/room.ts. Decided before the stand-ins, so that a room whose\n // surfaces this bake is not paying for does not get stand-ins built for\n // its books and its foliage either.\n let preset: PresetRoomBake | undefined;\n if (settings.room !== 'full') {\n // A room the page shows BAKED keeps its real stand out of every capture\n // (a render builds its own), so the stand is no candidate above. For this\n // question it is one: it is what a bake into that room re-lights.\n const hide = revealBakedStands(scene);\n let seen = candidates;\n let seenInclude = include;\n if (hide.length) {\n try {\n seen = bakeCandidates({ scene });\n seenInclude = resolveInclude(seen, settings);\n } finally {\n for (const undo of hide) undo();\n }\n }\n const verdict = presetRoomBake(scene, seen, seenInclude);\n if (verdict && 'ok' in verdict) {\n preset = verdict.ok;\n candidates = seen;\n const keep = new Set([...preset.spanIds]);\n include = seenInclude.filter((id) => keep.has(id));\n // The stand of a room shown baked is no candidate anywhere else (a\n // panel listing what can be baked never offers it), so a list of the\n // developer's own objects cannot name it. It is re-lit whenever the\n // product stands on it: that is the shadow nobody can miss.\n if (hide.length) {\n for (const id of preset.standIds)\n if (!include.includes(id)) include.push(id);\n }\n }\n }\n\n const standIns = resolveSimplify(scene, candidates, settings);\n // A stand-in for nothing this bake covers is dropped rather than built. A\n // preset room asks for its own (a box where a shelf of books is, a card\n // where a plant is), and those are only worth building when the room's\n // own surfaces are in the bake.\n const covered = new Set(include);\n standIns.entries = standIns.entries.filter((entry) =>\n entry.objects.some((id) => covered.has(id)),\n );\n // A replaced object gets no lightmap of its own: that is the saving.\n const replaced = new Set(standIns.entries.flatMap((entry) => entry.objects));\n include = include.filter((id) => !replaced.has(id));\n\n if (!include.length && !standIns.entries.length) {\n throw new Bakery3Error({\n code: 'InvalidRequest',\n message: 'There is nothing to bake.',\n why: candidates.length\n ? 'Every mesh in the scene is either unbakeable or excluded. Instanced and skinned meshes cannot take a lightmap, and glass is off by default.'\n : 'The scene has no meshes.',\n fix: 'Tick at least one object in the bake panel, or pass { settings: { include: [objectId] } }.',\n docs: 'https://bakery3.com/docs/bake',\n });\n }\n\n if (include.length > MAX_BAKE_OBJECTS) {\n throw new Bakery3Error({\n code: 'InvalidRequest',\n message: `A bake can cover ${MAX_BAKE_OBJECTS} objects; this one asks for ${include.length}.`,\n why: 'Past that the scene wants a shared atlas, which this version does not build. Sampling the list down for you would quietly leave objects unlit.',\n fix: 'Bake the hero objects, or merge small props into fewer meshes.',\n docs: 'https://bakery3.com/docs/bake',\n });\n }\n\n const atlas = resolveAtlas(settings.atlas);\n const texels =\n standIns.entries.reduce(\n (total, entry) => total + (entry.textureSize ?? textureSize) ** 2,\n 0,\n ) +\n (atlas\n ? atlas.size * atlas.size\n : include.reduce((total, id) => {\n const size = settings.sizes?.[id] ?? textureSize;\n return total + size * size;\n }, 0));\n if (texels > MAX_BAKE_TEXELS) {\n throw new Bakery3Error({\n code: 'InvalidRequest',\n message: `This bake asks for ${(texels / 1e6).toFixed(1)}M texels; the ceiling is ${(MAX_BAKE_TEXELS / 1e6).toFixed(0)}M.`,\n why: `${include.length} objects × ${textureSize}² = ${(texels / 1e6).toFixed(1)}M texels, and texels are what a bake costs the way frames are what a video costs.`,\n fix: 'Lower the texture size, or bake fewer objects at a time.',\n docs: 'https://bakery3.com/docs/bake',\n });\n }\n\n const view = camera\n ? resolveView(settings.view ?? 'camera', camera, candidates, include)\n : undefined;\n // Every bake: where the reflection probe is taken and what it hides. See\n // probe.ts for the rule.\n const probe = resolveProbe(candidates, include);\n\n const bake: BakeSettings = {\n quality,\n textureSize,\n include,\n ...(settings.sizes ? { sizes: settings.sizes } : {}),\n ...(atlas ? { atlas } : {}),\n ...(settings.margin !== undefined ? { margin: settings.margin } : {}),\n ...(settings.deliverGlb ? { deliverGlb: true } : {}),\n ...(view ? { view } : {}),\n probe,\n ...(standIns.entries.length ? { simplify: standIns.entries } : {}),\n // This SDK can apply a lightmap to a uv set the mesh already has, so the\n // render worker may keep an object's own layout rather than unwrap it;\n // these are the objects whose `uv1` is your own (a lightmap uv you\n // exported) rather than one a bake applied here wrote.\n existingUv: { uv1: developerUv1(candidates, include) },\n ...(preset\n ? {\n room: 'preset' as const,\n // The plane is placed and sized by the render worker, which sees what\n // the objects stand on; all it is told is whose shadow it is and\n // what it has to clear. The stand is in the second list and not\n // the first: the prebaked floor already has its shadow.\n shadow: { cast: preset.castIds, spans: preset.spanIds },\n }\n : {}),\n };\n\n return {\n bake,\n // For the quote, not for the cache: see `bakedTriangles` in the protocol.\n bakedTriangles: countTriangles(candidates, include),\n candidates,\n ...(preset ? { preset } : {}),\n shapes: standIns.shapes,\n };\n}\n\n/**\n * Put the scene in the state a bake captures it in, and return the undo.\n *\n * Your own stand-in meshes travel in the capture, hidden, so the render\n * worker has their shape and no ray ever meets them. A bake into a prebaked\n * room sends the room's stand and nothing else of it (see `holdRoomBack`).\n * Everything is put back exactly as it was found, in the undo, which the\n * caller runs in a `finally`. Synchronous both ways, so nothing can draw the\n * scene in between.\n */\nexport function stageBake(plan: BakePlan, scene: Scene): () => void {\n const restore = plan.shapes.map((shape) => {\n const parent = shape.parent;\n const visible = shape.visible;\n if (!isUnder(shape, scene)) scene.add(shape);\n shape.visible = false;\n return () => {\n shape.visible = visible;\n if (parent !== shape.parent) {\n if (parent) parent.add(shape);\n else shape.removeFromParent();\n }\n };\n });\n // The room itself is rebuilt by the renderer from its published\n // definition, at full quality, which is what the product's light should be\n // coming off; the stand-in in the page is a quantised preview that may be\n // standing in for its own books and plants. The stand is the exception,\n // and only when the product is on it: its lightmap has to land on a mesh\n // this page holds, so that one mesh travels and the renderer leaves a hole\n // where it would have built its own.\n if (plan.preset)\n restore.push(...holdRoomBack(plan.preset, plan.bake.include));\n return () => {\n for (const undo of restore) undo();\n };\n}\n\n/** What `/v1/estimate` is sent to quote a bake. */\nexport type BakeQuoteRequest = {\n bake: Pick<\n BakeSettings,\n | 'quality'\n | 'textureSize'\n | 'include'\n | 'sizes'\n | 'atlas'\n | 'deliverGlb'\n | 'simplify'\n | 'shadow'\n > & {\n /** The scene is a room interior: a ray that misses keeps going. */\n enclosed?: boolean;\n };\n scene: { triangles: number };\n bakedTriangles: number;\n};\n\n/**\n * The quote request for a bake, from its settings and the facts the control\n * plane reads off the accepted spec (`priceSpec` in the control plane):\n * every triangle traced, the triangles unwrapped, and whether it is inside a\n * preset room. The one place the body is built, for `estimate({ bake })` and\n * for `bake()`'s own `maxCost` check alike.\n */\nexport function bakeQuoteRequest(\n bake: BakeSettings,\n facts: { triangles: number; bakedTriangles: number; enclosed: boolean },\n): BakeQuoteRequest {\n return {\n bake: {\n quality: bake.quality,\n textureSize: bake.textureSize,\n include: bake.include,\n ...(bake.sizes ? { sizes: bake.sizes } : {}),\n ...(bake.atlas ? { atlas: bake.atlas } : {}),\n ...(bake.deliverGlb ? { deliverGlb: true } : {}),\n ...(bake.simplify ? { simplify: bake.simplify } : {}),\n // The shadow plane: two traces of its own.\n ...(bake.shadow ? { shadow: bake.shadow } : {}),\n // Inside a room a ray that misses keeps going, which is most of\n // what one of these bakes costs.\n ...(facts.enclosed ? { enclosed: true } : {}),\n },\n scene: { triangles: facts.triangles },\n bakedTriangles: facts.bakedTriangles,\n };\n}\n\n/** The quote request for a prepared bake: what it will be accepted under. */\nexport function bakeQuoteOf(spec: BakeSpec): BakeQuoteRequest {\n return bakeQuoteRequest(spec.bake, {\n triangles: spec.manifest.stats?.triangles ?? 0,\n bakedTriangles: spec.bakedTriangles ?? 0,\n enclosed: Boolean(spec.manifest.room),\n });\n}\n\n/**\n * The quote request for a bake of the live scene, without exporting it: the\n * plan `prepareBake()` would make, and the triangles its capture would count,\n * counted with the scene staged the same way.\n */\nexport function quoteBake(\n scene: Scene,\n camera: Camera | undefined,\n settings: PrepareBakeSettings = {},\n): BakeQuoteRequest {\n const plan = planBake(scene, camera, settings);\n const undo = stageBake(plan, scene);\n let triangles: number;\n try {\n triangles = tracedTriangles(scene);\n } finally {\n undo();\n }\n return bakeQuoteRequest(plan.bake, {\n triangles,\n bakedTriangles: plan.bakedTriangles,\n enclosed: findPresetRooms(scene).length > 0,\n });\n}\n\n/**\n * Capture the scene and decide what to bake: `planBake()`, then the ordinary\n * capture of the scene staged for it.\n */\nexport async function prepareBake(\n options: PrepareBakeOptions,\n): Promise<PreparedBake> {\n const plan = planBake(options.scene, options.camera, options.settings ?? {});\n const undo = stageBake(plan, options.scene);\n\n let captured: Awaited<ReturnType<typeof captureScene>>;\n try {\n captured = await captureScene({\n scene: options.scene,\n camera: options.camera,\n ...(options.renderer !== undefined ? { renderer: options.renderer } : {}),\n ...(options.environment !== undefined\n ? { environment: options.environment }\n : {}),\n ...(options.productState !== undefined\n ? { productState: options.productState }\n : {}),\n ...(options.background !== undefined\n ? { background: options.background }\n : {}),\n });\n } finally {\n undo();\n }\n const { manifest, assets } = captured;\n\n const spec: BakeSpec = {\n manifest,\n bake: plan.bake,\n bakedTriangles: plan.bakedTriangles,\n ...(options.maxCost !== undefined ? { maxCost: options.maxCost } : {}),\n ...(options.metadata ? { metadata: options.metadata } : {}),\n ...(options.idempotencyKey\n ? { idempotencyKey: options.idempotencyKey }\n : {}),\n };\n\n const preset = plan.preset;\n return {\n spec,\n assets,\n candidates: plan.candidates,\n ...(preset\n ? {\n presetRoom: {\n name: preset.room.name,\n lighting: preset.room.lighting,\n build: preset.room.build,\n },\n }\n : {}),\n };\n}\n\n/**\n * Keep a prebaked room's own geometry out of the capture, and say so in the\n * record, for the length of one capture.\n *\n * `createPresetRoom({ bake: true })` puts the whole stand-in in the GLB,\n * because a lightmap can only land on a mesh the page holds. A bake into a\n * prebaked room keeps no lightmap of the room, so what is left is pure cost:\n * megabytes uploaded, and a renderer that throws away the room it just built\n * at full resolution to bounce the product's light off a compressed preview\n * instead. `room.standIn = 'stand'` tells the renderer to build the room\n * properly and leave out only the stand.\n *\n * Returns the undo functions, in the order they must run.\n */\nexport function holdRoomBack(\n preset: PresetRoomBake,\n include: string[],\n): Array<() => void> {\n const undo: Array<() => void> = [];\n const state = (\n preset.group.userData?.bakery3Preset as {\n roomPreset?: { standIn?: unknown };\n }\n )?.roomPreset;\n // Nothing was shipping in the first place: a room without `bake: true`.\n // A room shown baked ships nothing either until now, and its stand has to.\n if (!state) return undo;\n if (!state.standIn && !roomShownBaked(preset.group)) return undo;\n\n const shipping = new Set(\n include.filter((id) => preset.standIds.includes(id)),\n );\n const stand = preset.group.getObjectByName('stand');\n preset.group.traverse((object) => {\n if (!(object as Mesh).isMesh) return;\n // The stand travels when this bake is re-baking it: that is the whole\n // reason it is in `include`.\n if (stand && isUnder(object, stand) && shipping.has(idOf(object))) return;\n const before = object.userData.bakery3 as\n Record<string, unknown> | undefined;\n object.userData.bakery3 = { ...(before ?? {}), exclude: true };\n undo.push(() => {\n if (before === undefined) delete object.userData.bakery3;\n else object.userData.bakery3 = before;\n });\n });\n\n const was = state.standIn;\n state.standIn = shipping.size ? 'stand' : undefined;\n undo.push(() => {\n state.standIn = was;\n });\n return undo;\n}\n\n/**\n * For the length of one question, let the stand of every room shown baked\n * be seen: `standIn: 'stand'` on its record un-excludes the group, and\n * everything else in such a room is excluded piece by piece already.\n * Returns the undo functions.\n */\nfunction revealBakedStands(scene: Object3D): Array<() => void> {\n const undo: Array<() => void> = [];\n for (const group of findPresetRooms(scene)) {\n if (!roomShownBaked(group)) continue;\n const state = (\n group.userData?.bakery3Preset as { roomPreset?: { standIn?: unknown } }\n )?.roomPreset;\n if (!state || state.standIn) continue;\n state.standIn = 'stand';\n undo.push(() => {\n state.standIn = undefined;\n });\n }\n return undo;\n}\n\n/** The included objects whose `uv1` is their own, not a bake's. */\nexport function developerUv1(\n candidates: BakeCandidate[],\n include: string[],\n): string[] {\n const wanted = new Set(include);\n return candidates\n .filter((candidate) => {\n if (!wanted.has(candidate.objectId)) return false;\n const uv1 = candidate.object.geometry?.getAttribute('uv1');\n return Boolean(uv1) && !isBakeWrittenUv(uv1);\n })\n .map((candidate) => candidate.objectId);\n}\n\n/**\n * Triangles in the objects a bake will actually unwrap and trace.\n *\n * An indexed geometry's triangle count is its index count over three, and a\n * non-indexed one's is its vertex count over three. A geometry shared by two\n * included meshes is counted twice, because it is unwrapped twice: the\n * lightmap is per object, and two objects sharing a mesh are lit\n * differently.\n */\nexport function countTriangles(\n candidates: BakeCandidate[],\n include: string[],\n): number {\n const wanted = new Set(include);\n let total = 0;\n for (const candidate of candidates) {\n if (!wanted.has(candidate.objectId)) continue;\n const geometry = candidate.object.geometry as\n | {\n index?: { count: number } | null;\n attributes?: { position?: { count: number } };\n }\n | undefined;\n const count =\n geometry?.index?.count ?? geometry?.attributes?.position?.count ?? 0;\n total += Math.floor(count / 3);\n }\n return total;\n}\n\nfunction isUnder(object: Object3D, root: Object3D): boolean {\n for (let node: Object3D | null = object; node; node = node.parent)\n if (node === root) return true;\n return false;\n}\n\ntype SimplifyUserData = {\n simplify?: BakeSimplifyInput['to'] | Omit<BakeSimplifyInput, 'objects'>;\n};\n\n/**\n * Entries that share a `group` folded into one, in the order their first\n * member appeared. Everything else is left where it is.\n *\n * The rest of the entry has to agree, because two stand-ins in one place is\n * never what was meant and quietly picking one would leave the other's cost\n * on the bill: the same rule `claimed` applies to objects.\n */\nfunction mergeGroups(\n inputs: BakeSimplifyInput[],\n docs: string,\n): BakeSimplifyInput[] {\n const out: BakeSimplifyInput[] = [];\n const at = new Map<string, number>();\n for (const input of inputs) {\n if (!input.group) {\n out.push(input);\n continue;\n }\n const index = at.get(input.group);\n if (index === undefined) {\n at.set(input.group, out.length);\n out.push({\n ...input,\n objects: [\n ...(Array.isArray(input.objects) ? input.objects : [input.objects]),\n ],\n });\n continue;\n }\n const first = out[index]!;\n const differs =\n (input.to ?? 'lowpoly') !== (first.to ?? 'lowpoly') ||\n input.triangles !== first.triangles ||\n input.textureSize !== first.textureSize;\n if (differs) {\n throw new Bakery3Error({\n code: 'InvalidRequest',\n message: `The stand-ins grouped as \"${input.group}\" do not ask for the same thing.`,\n why: 'A group is one stand-in, so it can only be built one way.',\n fix: 'Give them the same `to`, `triangles` and `textureSize`, or take them out of the group.',\n docs,\n });\n }\n (first.objects as Array<Object3D | string>).push(\n ...(Array.isArray(input.objects) ? input.objects : [input.objects]),\n );\n }\n return out;\n}\n\n/**\n * `settings.simplify` and every `userData.bakery3.simplify` in the scene, as\n * the wire's `BakeSimplify` entries, plus your own shape meshes that have to\n * travel with the capture.\n *\n * An Object3D stands for every mesh under it, which is what makes \"the\n * bookcase\" one argument rather than forty ids. An object claimed twice is a\n * refusal: two stand-ins in one place is never what was meant, and picking\n * one silently would leave the other's cost on the bill.\n */\nexport function resolveSimplify(\n scene: Object3D,\n candidates: BakeCandidate[],\n settings: PrepareBakeSettings,\n): { entries: BakeSimplify[]; shapes: Mesh[] } {\n const docs = 'https://bakery3.com/docs/bake#simplify';\n const inputs: BakeSimplifyInput[] = [...(settings.simplify ?? [])];\n scene.traverse((object) => {\n const declared = (object.userData?.bakery3 as SimplifyUserData | undefined)\n ?.simplify;\n if (declared === undefined || declared === null) return;\n const options =\n typeof declared === 'object' && !(declared as Mesh).isMesh\n ? (declared as Omit<BakeSimplifyInput, 'objects'>)\n : { to: declared as BakeSimplifyInput['to'] };\n inputs.push({ ...options, objects: object });\n });\n if (!inputs.length) return { entries: [], shapes: [] };\n const merged = mergeGroups(inputs, docs);\n\n if (merged.length > MAX_BAKE_SIMPLIFY) {\n throw new Bakery3Error({\n code: 'InvalidRequest',\n message: `A bake can build ${MAX_BAKE_SIMPLIFY} stand-ins; this one asks for ${merged.length}.`,\n why: 'Each stand-in is three traced passes of its own.',\n fix: 'Group more objects under each entry: one stand-in can replace a whole shelf of them.',\n docs,\n });\n }\n\n const byId = new Map(\n candidates.map((candidate) => [candidate.objectId, candidate]),\n );\n const claimed = new Map<string, number>();\n const shapes: Mesh[] = [];\n const entries = merged.map((input, n): BakeSimplify => {\n const shape =\n typeof input.to === 'object' && input.to !== null ? input.to : undefined;\n const shapeId = shape ? idOf(shape) : undefined;\n const ids: string[] = [];\n for (const target of Array.isArray(input.objects)\n ? input.objects\n : [input.objects]) {\n if (typeof target === 'string') {\n if (!byId.has(target)) {\n throw new Bakery3Error({\n code: 'InvalidRequest',\n message: `simplify[${n}] names \"${target}\", which is not a mesh in this scene.`,\n why: 'Ids are matched against userData.bakery3Id, falling back to the object uuid, which three mints anew on every reload.',\n fix: 'Pass the object itself, or take the id from candidates().',\n docs,\n });\n }\n ids.push(target);\n continue;\n }\n for (const candidate of candidates) {\n if (candidate.objectId !== shapeId && isUnder(candidate.object, target))\n ids.push(candidate.objectId);\n }\n }\n const objects = [...new Set(ids)];\n if (!objects.length) {\n throw new Bakery3Error({\n code: 'InvalidRequest',\n message: `simplify[${n}] replaces nothing: there is no mesh under what it names.`,\n why: 'A stand-in is made from the meshes it replaces.',\n fix: 'Pass a mesh, or a group with meshes under it.',\n docs,\n });\n }\n for (const id of objects) {\n const other = claimed.get(id);\n if (other !== undefined) {\n throw new Bakery3Error({\n code: 'InvalidRequest',\n message: `\"${byId.get(id)?.name ?? id}\" is claimed by simplify[${other}] and simplify[${n}].`,\n why: 'An object is replaced by one stand-in. A group and something inside it were probably both named.',\n fix: 'Name the group or its parts, not both.',\n docs,\n });\n }\n claimed.set(id, n);\n }\n if (\n input.textureSize !== undefined &&\n !(BAKE_TEXTURE_SIZES as readonly number[]).includes(input.textureSize)\n ) {\n throw new Bakery3Error({\n code: 'InvalidRequest',\n message: `simplify[${n}].textureSize must be one of ${BAKE_TEXTURE_SIZES.join(', ')}; got ${String(input.textureSize)}.`,\n fix: \"Leave it out to use the bake's textureSize.\",\n docs,\n });\n }\n if (\n input.triangles !== undefined &&\n !(\n Number.isInteger(input.triangles) &&\n input.triangles >= 12 &&\n input.triangles <= MAX_BAKE_SIMPLIFY_TRIANGLES\n )\n ) {\n throw new Bakery3Error({\n code: 'InvalidRequest',\n message: `simplify[${n}].triangles must be a whole number from 12 to ${MAX_BAKE_SIMPLIFY_TRIANGLES}; got ${String(input.triangles)}.`,\n fix: 'A few hundred is a piece of furniture across a room; a few thousand holds up close.',\n docs,\n });\n }\n if (shape) {\n if (!shape.isMesh || !shape.geometry) {\n throw new Bakery3Error({\n code: 'InvalidRequest',\n message: `simplify[${n}].to must be 'lowpoly', 'box', 'billboard', 'decimate' or a Mesh.`,\n fix: 'Pass a THREE.Mesh whose geometry is the low-poly shape, placed where the objects are.',\n docs,\n });\n }\n shapes.push(shape);\n }\n return {\n objects,\n to: shape\n ? { objectId: shapeId! }\n : ((input.to as\n 'lowpoly' | 'box' | 'billboard' | 'decimate' | undefined) ??\n 'lowpoly'),\n ...(input.triangles !== undefined ? { triangles: input.triangles } : {}),\n ...(input.textureSize !== undefined\n ? { textureSize: input.textureSize }\n : {}),\n };\n });\n // A decimated object keeps its own materials and parts, so it is its own\n // stand-in: a pair of shoes named as one group is two entries.\n const expanded = entries.flatMap((entry) =>\n entry.to === 'decimate' && entry.objects.length > 1\n ? entry.objects.map((id) => ({ ...entry, objects: [id] }))\n : [entry],\n );\n if (expanded.length > MAX_BAKE_SIMPLIFY) {\n throw new Bakery3Error({\n code: 'InvalidRequest',\n message: `A bake can build ${MAX_BAKE_SIMPLIFY} stand-ins; decimating every object named here asks for ${expanded.length}.`,\n why: 'Each decimated object is a stand-in of its own.',\n fix: 'Decimate the objects that are heavy and leave the rest as they are.',\n docs,\n });\n }\n return { entries: expanded, shapes };\n}\n\n/**\n * The viewpoint the render worker hides seams from: quantized from the\n * camera by default, so it is stable under small moves and lands in the\n * cache key as a handful of round numbers rather than the camera's every\n * decimal.\n */\nfunction resolveView(\n setting: NonNullable<PrepareBakeSettings['view']>,\n camera: Camera,\n candidates: BakeCandidate[],\n include: string[],\n): BakeView | undefined {\n if (setting === 'none') return undefined;\n if (setting !== 'camera') {\n const position = setting.position;\n if (\n !Array.isArray(position) ||\n position.length !== 3 ||\n position.some(\n (value) => typeof value !== 'number' || !Number.isFinite(value),\n )\n ) {\n throw new Bakery3Error({\n code: 'InvalidRequest',\n message: 'settings.view.position must be three finite numbers.',\n why: 'The render worker places UV seams on the side of each object that faces away from this point, so it has to be a point.',\n fix: \"Pass { view: { position: [x, y, z] } } in scene units, 'camera' to derive it from the camera, or 'none'.\",\n docs: 'https://bakery3.com/docs/bake#seams',\n });\n }\n return { position: [position[0]!, position[1]!, position[2]!] };\n }\n // A camera that is not an Object3D (a test double) has no position to\n // quantize; the bake then falls back to the underside-only placement rather\n // than inventing a viewpoint.\n if (typeof (camera as Partial<Camera>).getWorldPosition !== 'function')\n return undefined;\n const wanted = new Set(include);\n const objects = candidates\n .filter((candidate) => wanted.has(candidate.objectId))\n .map((candidate) => candidate.object);\n return quantizeBakeView(camera, bakeBounds(objects));\n}\n\n/**\n * `true` is a 2048² atlas; an object is checked so a typo in the size or a\n * zero weight is refused here, with the fix, rather than by the render\n * worker after an export.\n */\nexport function resolveAtlas(\n setting: PrepareBakeSettings['atlas'],\n): BakeAtlas | undefined {\n if (!setting) return undefined;\n const atlas: BakeAtlas = setting === true ? { size: 2048 } : { ...setting };\n if (!(BAKE_ATLAS_SIZES as readonly number[]).includes(atlas.size)) {\n throw new Bakery3Error({\n code: 'InvalidRequest',\n message: `settings.atlas.size must be one of ${BAKE_ATLAS_SIZES.join(', ')}; got ${String(atlas.size)}.`,\n why: 'The atlas is one texture shared by every baked object, and its side is what the whole bake costs in texels.',\n fix: 'Pass atlas: true for 2048², or { size: 4096 } for a large room.',\n docs: 'https://bakery3.com/docs/bake#one-map-for-the-room',\n });\n }\n for (const [id, weight] of Object.entries(atlas.weights ?? {})) {\n if (typeof weight !== 'number' || !Number.isFinite(weight) || weight <= 0) {\n throw new Bakery3Error({\n code: 'InvalidRequest',\n message: `settings.atlas.weights[\"${id}\"] must be a positive number; got ${String(weight)}.`,\n why: 'A weight multiplies the texel density an object gets in the shared map; zero or less would leave it with no texels at all.',\n fix: 'Use 1 for an ordinary object and 4 for the hero product (weights round to a power of two in side).',\n docs: 'https://bakery3.com/docs/bake#one-map-for-the-room',\n });\n }\n }\n return atlas;\n}\n\n/**\n * `include` is authoritative, so an id in it that cannot take a lightmap is a\n * refusal, not a quiet drop. A caller who named an object explicitly expects\n * it back lit, and the one thing this must not do is finish successfully\n * without it.\n */\nexport function resolveInclude(\n candidates: BakeCandidate[],\n settings: PrepareBakeSettings,\n): string[] {\n const byId = new Map(\n candidates.map((candidate) => [candidate.objectId, candidate]),\n );\n const excluded = new Set(settings.exclude ?? []);\n\n if (!settings.include) {\n return defaultIncludeIds(candidates).filter((id) => !excluded.has(id));\n }\n\n const resolved: string[] = [];\n for (const id of settings.include) {\n if (excluded.has(id)) continue;\n const candidate = byId.get(id);\n if (!candidate) {\n throw new Bakery3Error({\n code: 'InvalidRequest',\n message: `Asked to bake \"${id}\", which is not a mesh in this scene.`,\n why: 'The include list is matched against userData.bakery3Id, falling back to the object uuid. three mints a new uuid on every reload, so an id saved from a previous session will not match.',\n fix: 'Set userData.bakery3Id on the objects you bake so their ids survive a reload, or take the ids from candidates().',\n docs: 'https://bakery3.com/docs/bake',\n });\n }\n if (!candidate.bakeable) {\n throw new Bakery3Error({\n code: 'InvalidRequest',\n message:\n candidate.reason?.message ??\n `\"${candidate.name}\" cannot take a lightmap.`,\n ...(candidate.reason?.why ? { why: candidate.reason.why } : {}),\n ...(candidate.reason?.fix ? { fix: candidate.reason.fix } : {}),\n path: candidate.path,\n docs: 'https://bakery3.com/docs/bake',\n });\n }\n if (!resolved.includes(id)) resolved.push(id);\n }\n return resolved;\n}\n"]}