badgecraft 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.
- package/CHANGELOG.md +31 -0
- package/LICENSE +21 -0
- package/README.md +406 -0
- package/cli/index.mjs +143 -0
- package/cli/render.d.ts +20 -0
- package/cli/render.mjs +87 -0
- package/cli/studio.mjs +98 -0
- package/dist/badge-B-g_9WFj.d.ts +79 -0
- package/dist/badge-CCjUxNIG.d.cts +79 -0
- package/dist/chunk-3OMN635U.js +44 -0
- package/dist/chunk-3OMN635U.js.map +1 -0
- package/dist/chunk-BRT5S5PF.cjs +3418 -0
- package/dist/chunk-BRT5S5PF.cjs.map +1 -0
- package/dist/chunk-EBDSIGZR.cjs +48 -0
- package/dist/chunk-EBDSIGZR.cjs.map +1 -0
- package/dist/chunk-RRYBMB25.js +3410 -0
- package/dist/chunk-RRYBMB25.js.map +1 -0
- package/dist/cli-browser.js +526 -0
- package/dist/element.cjs +176 -0
- package/dist/element.cjs.map +1 -0
- package/dist/element.d.cts +31 -0
- package/dist/element.d.ts +31 -0
- package/dist/element.js +174 -0
- package/dist/element.js.map +1 -0
- package/dist/index.cjs +47 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +58 -0
- package/dist/index.d.ts +58 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/react.cjs +60 -0
- package/dist/react.cjs.map +1 -0
- package/dist/react.d.cts +29 -0
- package/dist/react.d.ts +29 -0
- package/dist/react.js +55 -0
- package/dist/react.js.map +1 -0
- package/dist/studio/assets/badge-9Zq6e9Ht.js +524 -0
- package/dist/studio/assets/base-ItCYnbux.css +1 -0
- package/dist/studio/assets/base-LFa9cTPp.js +1 -0
- package/dist/studio/assets/element-CCTxyf61.js +1 -0
- package/dist/studio/assets/index-BVuSTaz-.css +1 -0
- package/dist/studio/assets/index-CTTcx2pV.js +28 -0
- package/dist/studio/assets/option-keys-CKi71y0n.js +1 -0
- package/dist/studio/assets/react-Cq5Erey2.js +9 -0
- package/dist/studio/assets/react-DyJFYpWJ.js +1 -0
- package/dist/studio/assets/studio-C6plMNOe.css +1 -0
- package/dist/studio/assets/studio-DBcSY6tV.js +1 -0
- package/dist/studio/assets/style-C2sJ2Xy3.css +1 -0
- package/dist/studio/assets/vue-BpGwr3iF.js +1 -0
- package/dist/studio/element.html +31 -0
- package/dist/studio/env/studio.hdr +5 -0
- package/dist/studio/index.html +24 -0
- package/dist/studio/logos/apple.svg +1 -0
- package/dist/studio/logos/atlassian.svg +1 -0
- package/dist/studio/logos/google.svg +1 -0
- package/dist/studio/logos/meta.svg +1 -0
- package/dist/studio/react.html +16 -0
- package/dist/studio/studio.html +27 -0
- package/dist/studio/vue.html +15 -0
- package/dist/types-CHM3-ZZV.d.cts +204 -0
- package/dist/types-CHM3-ZZV.d.ts +204 -0
- package/dist/vue.cjs +93 -0
- package/dist/vue.cjs.map +1 -0
- package/dist/vue.d.cts +115 -0
- package/dist/vue.d.ts +115 -0
- package/dist/vue.js +87 -0
- package/dist/vue.js.map +1 -0
- package/docs/cli.md +146 -0
- package/docs/gallery.jpg +0 -0
- package/docs/performance.md +151 -0
- package/docs/render-quality.md +220 -0
- package/docs/studio.jpg +0 -0
- package/package.json +163 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/util.ts","../src/environment.ts","../src/materials.ts","../src/options.ts","../src/svg/frames.ts","../src/color.ts","../src/bake/edt.ts","../src/bake/filters.ts","../src/bake/bake.ts","../src/bake/worker-code.generated.ts","../src/bake/client.ts","../src/svg/prepare.ts","../src/svg/rasterize.ts","../src/pipeline.ts","../src/render/hdr.ts","../src/render/mesh.ts","../src/render/math.ts","../src/render/shaders.ts","../src/render/renderer.ts","../src/scheduler.ts","../src/svg/load.ts","../src/badge.ts"],"names":["spec","stripUndefined","bake","f","d","num","metal","t"],"mappings":"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;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAiTD,IAAM,YAAA;AAAA;AAAA,EAA0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","file":"chunk-RRYBMB25.js","sourcesContent":["/** Deterministic JSON with sorted keys, for cache keys and change detection. */\nexport function stableStringify(value: unknown): string {\n if (value === null || typeof value !== 'object') return JSON.stringify(value) ?? 'undefined'\n if (Array.isArray(value)) return `[${value.map(stableStringify).join(',')}]`\n const obj = value as Record<string, unknown>\n const keys = Object.keys(obj)\n .filter((k) => obj[k] !== undefined && typeof obj[k] !== 'function')\n .sort()\n return `{${keys.map((k) => `${JSON.stringify(k)}:${stableStringify(obj[k])}`).join(',')}}`\n}\n\n/** 53-bit string hash (cyrb53). */\nexport function hashString(str: string, seed = 0): string {\n let h1 = 0xdeadbeef ^ seed\n let h2 = 0x41c6ce57 ^ seed\n for (let i = 0; i < str.length; i++) {\n const ch = str.charCodeAt(i)\n h1 = Math.imul(h1 ^ ch, 2654435761)\n h2 = Math.imul(h2 ^ ch, 1597334677)\n }\n h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507) ^ Math.imul(h2 ^ (h2 >>> 13), 3266489909)\n h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^ Math.imul(h1 ^ (h1 >>> 13), 3266489909)\n return (4294967296 * (2097151 & h2) + (h1 >>> 0)).toString(36)\n}\n\nexport const clamp = (v: number, lo: number, hi: number) => (v < lo ? lo : v > hi ? hi : v)\n","import type { EnvironmentInput, EnvironmentPreset, ImageEnvironment, ProceduralEnvironment } from './types'\nimport { clamp, stableStringify } from './util'\n\n/**\n * Procedural HDR studio environments. Light positions are relative to the\n * viewer: azimuth 0 is directly behind the camera (what a flat badge face\n * reflects), elevation is degrees above the horizon.\n */\nexport const environments: Record<EnvironmentPreset, ProceduralEnvironment> = {\n studio: {\n top: '#727984',\n horizon: '#20232a',\n bottom: '#101116',\n intensity: 1,\n // Product-photo softboxes separated by dark space: the gaps give polished\n // metal its contrast, while the wide key still lights coloured enamel.\n lights: [\n { azimuth: -12, elevation: 8, size: [90, 65], intensity: 0.22, color: '#ffffff', softness: 1 },\n { azimuth: -36, elevation: 38, size: [58, 65], intensity: 4.5, color: '#fff8ef', softness: 0.45 },\n { azimuth: 48, elevation: 12, size: [16, 85], intensity: 3.2, color: '#e9f1ff', softness: 0.35 },\n { azimuth: 0, elevation: 72, size: [135, 24], intensity: 3.8, color: '#ffffff', softness: 0.5 },\n { azimuth: -120, elevation: 20, size: [24, 65], intensity: 1.8, color: '#ffffff', softness: 0.4 },\n { azimuth: 135, elevation: 30, size: 34, shape: 'circle', intensity: 2, color: '#fff2dd', softness: 0.6 },\n ],\n },\n soft: {\n top: '#c9ccd2',\n horizon: '#8a8c91',\n bottom: '#3a3a3d',\n intensity: 1,\n lights: [\n { azimuth: 0, elevation: 25, size: [160, 70], intensity: 1.2, color: '#ffffff', softness: 1 },\n { azimuth: -60, elevation: 45, size: [80, 60], intensity: 2, color: '#fffaf0', softness: 1 },\n ],\n },\n sunset: {\n top: '#3b3f7a',\n horizon: '#e0806a',\n bottom: '#1a1012',\n intensity: 1,\n lights: [\n { azimuth: -55, elevation: 12, size: 26, shape: 'circle', intensity: 14, color: '#ffb46b', softness: 0.6 },\n { azimuth: 0, elevation: 15, size: [120, 40], intensity: 0.9, color: '#ffc7a8', softness: 1 },\n { azimuth: 70, elevation: 40, size: [60, 40], intensity: 1.6, color: '#8fa6ff', softness: 0.8 },\n ],\n },\n night: {\n top: '#101218',\n horizon: '#07080b',\n bottom: '#020203',\n intensity: 1,\n lights: [\n { azimuth: -30, elevation: 40, size: [30, 22], intensity: 9, color: '#ffffff', softness: 0.35 },\n { azimuth: 115, elevation: 25, size: [16, 60], intensity: 5, color: '#dfe8ff', softness: 0.3 },\n { azimuth: -135, elevation: 15, size: [14, 50], intensity: 4, color: '#ffffff', softness: 0.3 },\n { azimuth: 0, elevation: 10, size: [90, 30], intensity: 0.45, color: '#ffffff', softness: 1 },\n ],\n },\n neon: {\n top: '#1a1030',\n horizon: '#101018',\n bottom: '#050508',\n intensity: 1,\n lights: [\n { azimuth: -45, elevation: 25, size: [20, 80], intensity: 6, color: '#ff3fa4', softness: 0.4 },\n { azimuth: 45, elevation: 25, size: [20, 80], intensity: 6, color: '#2fd8ff', softness: 0.4 },\n { azimuth: 0, elevation: 60, size: [120, 18], intensity: 3, color: '#b98cff', softness: 0.6 },\n { azimuth: 0, elevation: 10, size: [100, 40], intensity: 0.8, color: '#ffffff', softness: 1 },\n ],\n },\n}\n\nexport type ResolvedEnvironment =\n | { kind: 'procedural'; spec: ProceduralEnvironment; key: string }\n | { kind: 'image'; spec: ImageEnvironment; key: string }\n\nexport function resolveEnvironment(input: EnvironmentInput | undefined): ResolvedEnvironment {\n if (!input) input = 'studio'\n if (typeof input === 'string') {\n const spec = Object.prototype.hasOwnProperty.call(environments, input) ? environments[input as EnvironmentPreset] : undefined\n if (spec) return { kind: 'procedural', spec, key: `preset:${input}` }\n // Any other string is treated as an image URL.\n return { kind: 'image', spec: { url: input }, key: `url:${input}|1` }\n }\n const finite = (value: number | undefined, fallback: number, lo: number, hi: number) =>\n typeof value === 'number' && Number.isFinite(value) ? clamp(value, lo, hi) : fallback\n const intensity = finite(input.intensity, 1, 0, 10000)\n if ('url' in input) {\n const spec = { url: input.url, intensity }\n return { kind: 'image', spec, key: `url:${spec.url}|${intensity}` }\n }\n const spec: ProceduralEnvironment = {\n ...input,\n intensity,\n lights: input.lights?.map((light) => {\n const size = light.size ?? 30\n const dimensions = Array.isArray(size) ? size : [size, size]\n return {\n ...light,\n azimuth: finite(light.azimuth, 0, -Infinity, Infinity) % 360,\n elevation: finite(light.elevation, 0, -90, 90),\n intensity: finite(light.intensity, 1, 0, 10000),\n softness: finite(light.softness, 0.5, 0, 1),\n size: dimensions.map((value) => finite(value, 30, 0.001, 170)) as [number, number],\n }\n }),\n }\n return { kind: 'procedural', spec, key: `proc:${stableStringify(spec)}` }\n}\n","import type { Material, MaterialInput, MaterialPreset, MaterialSlot } from './types'\nimport { clamp } from './util'\n\nexport type ResolvedMaterial = Required<Material>\n\nconst BASE: ResolvedMaterial = {\n color: '#ffffff',\n useSvgColor: false,\n metalness: 0,\n roughness: 0.4,\n clearcoat: 0,\n clearcoatRoughness: 0.05,\n ior: 1.5,\n iridescence: 0,\n iridescenceThickness: 450,\n flakes: 0,\n flakeScale: 220,\n brushed: 0,\n brushDirection: 'circular',\n emissive: 0,\n}\n\nconst metal = (color: string, roughness: number, extra: Material = {}): Material => ({\n color,\n metalness: 1,\n roughness,\n ...extra,\n})\n\n/** Built-in materials. Metal colours are artist-tuned sRGB approximations of measured F0 values. */\nexport const materials: Record<MaterialPreset, Material> = {\n gold: metal('#f7dc8f', 0.24),\n 'rose-gold': metal('#f6b99c', 0.22),\n 'white-gold': metal('#efe7d2', 0.2),\n 'matte-gold': metal('#f0d284', 0.48),\n 'brushed-gold': metal('#f7dc8f', 0.34, { brushed: 0.7, brushDirection: 'circular' }),\n silver: metal('#f1f0ee', 0.24),\n 'brushed-silver': metal('#e9e9ea', 0.3, { brushed: 0.7, brushDirection: 'circular' }),\n platinum: metal('#d8d3cb', 0.22),\n chrome: metal('#e6e9ec', 0.04),\n copper: metal('#f2a27c', 0.24),\n bronze: metal('#d69a5c', 0.32),\n brass: metal('#e9c46f', 0.26),\n titanium: metal('#b9b2a9', 0.3),\n gunmetal: metal('#6b6d73', 0.28),\n 'black-chrome': metal('#3c3d42', 0.1),\n enamel: { useSvgColor: true, metalness: 0, roughness: 0.28, clearcoat: 1, clearcoatRoughness: 0.09 },\n 'matte-enamel': { useSvgColor: true, metalness: 0, roughness: 0.62, clearcoat: 0.15, clearcoatRoughness: 0.4 },\n candy: { useSvgColor: true, metalness: 0.85, roughness: 0.3, clearcoat: 1, clearcoatRoughness: 0.04 },\n glitter: {\n useSvgColor: true,\n metalness: 0.2,\n roughness: 0.35,\n clearcoat: 1,\n clearcoatRoughness: 0.04,\n flakes: 0.9,\n flakeScale: 260,\n },\n pearl: {\n color: '#f4eee6',\n metalness: 0.15,\n roughness: 0.28,\n clearcoat: 1,\n clearcoatRoughness: 0.05,\n iridescence: 0.7,\n iridescenceThickness: 560,\n },\n holographic: metal('#f2f2f4', 0.18, { iridescence: 1, iridescenceThickness: 420, flakes: 0.4 }),\n onyx: { color: '#191b20', metalness: 0, roughness: 0.28, clearcoat: 1, clearcoatRoughness: 0.1 },\n obsidian: { color: '#0e0e10', metalness: 0, roughness: 0.2, clearcoat: 1, clearcoatRoughness: 0.03 },\n}\n\nexport const defaultSlotMaterials: Record<MaterialSlot, MaterialInput> = {\n metal: 'gold',\n enamel: 'enamel',\n base: 'onyx',\n accent: 'silver',\n}\n\nexport function resolveMaterial(input: MaterialInput | undefined, slot: MaterialSlot): ResolvedMaterial {\n const value = input ?? defaultSlotMaterials[slot]\n let spec: Material\n if (typeof value === 'string') {\n spec = materials[value as MaterialPreset] ?? materials[defaultSlotMaterials[slot] as MaterialPreset]\n } else {\n const { preset, ...rest } = value\n spec = { ...(preset ? materials[preset] : {}), ...stripUndefined(rest) }\n }\n const out: ResolvedMaterial = { ...BASE, ...stripUndefined(spec) }\n const ranges = {\n metalness: [0, 1], roughness: [0, 1], clearcoat: [0, 1], clearcoatRoughness: [0, 1],\n ior: [1, 3], iridescence: [0, 1], iridescenceThickness: [100, 1200],\n flakes: [0, 1], flakeScale: [1, 10000], brushed: [0, 1], emissive: [0, 1],\n } as const\n for (const key of Object.keys(ranges) as (keyof typeof ranges)[]) {\n const [lo, hi] = ranges[key]\n out[key] = Number.isFinite(out[key]) ? clamp(out[key], lo, hi) : BASE[key]\n }\n // The enamel slot shows SVG colours unless the material brings its own colour.\n if (spec.useSvgColor === undefined && slot === 'enamel' && !spec.color) out.useSvgColor = true\n return out\n}\n\nfunction stripUndefined<T extends object>(obj: T): Partial<T> {\n const out: Partial<T> = {}\n for (const key of Object.keys(obj) as (keyof T)[]) if (obj[key] !== undefined) out[key] = obj[key]\n return out\n}\n","import { resolveEnvironment, type ResolvedEnvironment } from './environment'\nimport { resolveMaterial, type ResolvedMaterial } from './materials'\nimport type { BadgeMode, BadgeOptions, FrameOptions, IdleAnimation, Interaction, ToneMapping } from './types'\nimport { clamp, stableStringify } from './util'\n\nexport const defaults = {\n mode: 'auto' as BadgeMode,\n color: '#ffffff',\n rim: 0.03,\n outline: 'auto' as const,\n autoOutline: 0.012,\n fillHoles: true,\n relief: {\n depth: 0.05,\n thickness: 0.03,\n floor: 0.3,\n profile: 'round' as const,\n bevel: 0.02,\n edge: 0.014,\n enamelLevel: 0.16,\n enamelDome: 0.12,\n domeWidth: 0.05,\n smoothing: 0.9,\n ao: 0.45,\n },\n exposure: 1,\n toneMapping: 'neutral' as ToneMapping,\n interaction: 'tilt' as Interaction,\n tiltMax: 18,\n pose: { pitch: -5, yaw: -8, roll: 0 },\n idle: 'none' as IdleAnimation,\n lockedColor: '#3a3a3c',\n shadow: 0.35,\n padding: 0.06,\n}\n\nconst PROFILE = { round: 0, soft: 1, chamfer: 2 } as const\nconst TONE = { neutral: 0, aces: 1, agx: 2, none: 3 } as const\n\n/** Options that change the baked relief maps (expensive). */\nexport interface BakeSettings {\n depth: number\n mode: BadgeMode\n color: string\n frame: FrameOptions | null\n rim: number\n outline: number | 'auto'\n autoOutline: number\n fillHoles: boolean\n floor: number\n profile: number\n bevel: number\n edge: number\n enamelLevel: number\n enamelDome: number\n domeWidth: number\n smoothing: number\n}\n\n/** Options applied at draw time (cheap). */\nexport interface RenderSettings {\n materials: [ResolvedMaterial, ResolvedMaterial, ResolvedMaterial, ResolvedMaterial]\n environment: ResolvedEnvironment\n envRotation: number\n thickness: number\n edge: number\n ao: number\n exposure: number\n toneMapping: number\n interaction: Interaction\n tiltMax: number\n pose: { pitch: number; yaw: number; roll: number }\n idle: IdleAnimation\n locked: boolean\n lockedColor: string\n shadow: number\n padding: number\n}\n\nexport interface Resolved {\n bake: BakeSettings\n bakeKey: string\n render: RenderSettings\n renderKey: string\n quality: 'auto' | number\n}\n\nconst num = (v: number | undefined, fallback: number, lo = -Infinity, hi = Infinity) =>\n typeof v === 'number' && Number.isFinite(v) ? clamp(v, lo, hi) : fallback\n\nexport function resolveOptions(o: BadgeOptions): Resolved {\n const r = { ...defaults.relief, ...stripUndefined(o.relief ?? {}) }\n const frame: FrameOptions | null =\n o.frame == null ? null : typeof o.frame === 'string' ? { shape: o.frame } : { shape: 'circle', ...o.frame }\n\n if (frame) {\n frame.padding = num(frame.padding, 0.22, 0, 0.45)\n frame.innerRing = num(frame.innerRing, 0, 0, 0.3)\n }\n\n const bake: BakeSettings = {\n depth: num(r.depth, defaults.relief.depth, 0.001, 0.5),\n mode: o.mode ?? defaults.mode,\n color: o.color ?? defaults.color,\n frame,\n rim: num(o.rim, defaults.rim, 0, 0.3),\n outline: o.outline === undefined || o.outline === 'auto' ? 'auto' : num(o.outline, 0, 0, 0.3),\n autoOutline: defaults.autoOutline,\n fillHoles: o.fillHoles ?? defaults.fillHoles,\n floor: num(r.floor, defaults.relief.floor, 0, 0.95),\n profile: PROFILE[r.profile] ?? 0,\n bevel: num(r.bevel, defaults.relief.bevel, 0.001, 0.5),\n edge: num(r.edge, defaults.relief.edge, 0.001, 0.2),\n enamelLevel: num(r.enamelLevel, defaults.relief.enamelLevel, 0, 1),\n enamelDome: num(r.enamelDome, defaults.relief.enamelDome, -1, 1),\n domeWidth: num(r.domeWidth, defaults.relief.domeWidth, 0.001, 0.5),\n smoothing: num(r.smoothing, defaults.relief.smoothing, 0, 8),\n }\n\n const render: RenderSettings = {\n materials: [\n resolveMaterial(o.metal, 'metal'),\n resolveMaterial(o.enamel, 'enamel'),\n resolveMaterial(o.base, 'base'),\n resolveMaterial(o.accent, 'accent'),\n ],\n environment: resolveEnvironment(o.environment),\n envRotation: ((num(o.environmentRotation, 0) % 360) * Math.PI) / 180,\n thickness: num(r.thickness, defaults.relief.thickness, 0, 0.5),\n edge: bake.edge,\n ao: num(r.ao, defaults.relief.ao, 0, 1),\n exposure: num(o.exposure, defaults.exposure, 0, 16),\n toneMapping: TONE[o.toneMapping ?? defaults.toneMapping] ?? 0,\n interaction: o.interaction ?? defaults.interaction,\n tiltMax: num(o.tiltMax, defaults.tiltMax, 0, 80),\n pose: {\n pitch: num(o.pose?.pitch, defaults.pose.pitch, -89, 89),\n yaw: num(o.pose?.yaw, defaults.pose.yaw, -180, 180),\n roll: num(o.pose?.roll, defaults.pose.roll, -180, 180),\n },\n idle: o.idle ?? defaults.idle,\n locked: !!o.locked,\n lockedColor: o.lockedColor ?? defaults.lockedColor,\n shadow: num(o.shadow, defaults.shadow, 0, 1),\n padding: num(o.padding, defaults.padding, 0, 0.4),\n }\n\n const quality = typeof o.quality !== 'number' || !Number.isFinite(o.quality) ? 'auto' : clamp(Math.round(o.quality), 64, 2048)\n return {\n bake,\n bakeKey: stableStringify(bake),\n render,\n renderKey: stableStringify(render),\n quality,\n }\n}\n\nfunction stripUndefined<T extends object>(obj: T): Partial<T> {\n const out: Partial<T> = {}\n for (const k of Object.keys(obj) as (keyof T)[]) if (obj[k] !== undefined) out[k] = obj[k]\n return out\n}\n","import type { FrameShape } from '../types'\n\ntype Pt = [number, number]\n\nconst f = (n: number) => Math.round(n * 1000) / 1000\n\n/** Closed polygon path with rounded corners. */\nexport function roundedPolygon(points: Pt[], radius: number): string {\n const n = points.length\n let d = ''\n for (let i = 0; i < n; i++) {\n const p = points[i]\n const prev = points[(i - 1 + n) % n]\n const next = points[(i + 1) % n]\n const lenPrev = Math.hypot(prev[0] - p[0], prev[1] - p[1])\n const lenNext = Math.hypot(next[0] - p[0], next[1] - p[1])\n const r = Math.min(radius, lenPrev / 2, lenNext / 2)\n const a: Pt = [p[0] + ((prev[0] - p[0]) / lenPrev) * r, p[1] + ((prev[1] - p[1]) / lenPrev) * r]\n const b: Pt = [p[0] + ((next[0] - p[0]) / lenNext) * r, p[1] + ((next[1] - p[1]) / lenNext) * r]\n d += `${i === 0 ? 'M' : 'L'}${f(a[0])} ${f(a[1])}Q${f(p[0])} ${f(p[1])} ${f(b[0])} ${f(b[1])}`\n }\n return `${d}Z`\n}\n\nfunction regular(count: number, radius: number, startDeg: number, corner: number, cx = 50, cy = 50): string {\n const pts: Pt[] = []\n for (let i = 0; i < count; i++) {\n const a = ((startDeg + (360 / count) * i) * Math.PI) / 180\n pts.push([cx + Math.cos(a) * radius, cy + Math.sin(a) * radius])\n }\n return roundedPolygon(pts, corner)\n}\n\nfunction star(points: number, outer: number, inner: number, corner: number): string {\n const pts: Pt[] = []\n for (let i = 0; i < points * 2; i++) {\n const r = i % 2 === 0 ? outer : inner\n const a = ((-90 + (180 / points) * i) * Math.PI) / 180\n pts.push([50 + Math.cos(a) * r, 50 + Math.sin(a) * r])\n }\n return roundedPolygon(pts, corner)\n}\n\n/** Frame outlines in a 0..100 box. */\nexport const framePaths: Record<FrameShape, string> = {\n circle: 'M50 3A47 47 0 1 1 50 97A47 47 0 1 1 50 3Z',\n hexagon: regular(6, 48, -90, 9),\n octagon: regular(8, 48, -67.5, 6),\n shield: 'M14 13Q50 1 86 13L86 47C86 72 70 88 50 97C30 88 14 72 14 47Z',\n square: roundedPolygon(\n [\n [5, 5],\n [95, 5],\n [95, 95],\n [5, 95],\n ],\n 16,\n ),\n diamond: regular(4, 48, -90, 8),\n star: star(5, 49, 27, 5),\n}\n","export type RGB = [number, number, number]\n\nlet probe: CanvasRenderingContext2D | null | undefined\n\nfunction normalizeWithCanvas(color: string): string | null {\n if (probe === undefined) {\n probe = typeof document !== 'undefined' ? document.createElement('canvas').getContext('2d') : null\n }\n if (!probe) return null\n probe.fillStyle = '#000000'\n probe.fillStyle = color\n const a = String(probe.fillStyle)\n probe.fillStyle = '#ffffff'\n probe.fillStyle = color\n const b = String(probe.fillStyle)\n // An invalid colour leaves the previous value in place, so the two differ.\n if (a !== b) return null\n // Modern CSS colours (oklch, lab, color(display-p3 ...)) need conversion\n // through the canvas's sRGB pixel buffer; fillStyle may preserve their syntax.\n if (!/^#|^rgba?\\(/i.test(a)) {\n probe.clearRect(0, 0, 1, 1)\n probe.fillRect(0, 0, 1, 1)\n const p = probe.getImageData(0, 0, 1, 1).data\n return `rgb(${p[0]},${p[1]},${p[2]})`\n }\n return a\n}\n\n/** Parse any CSS colour to sRGB components in 0..1. Falls back to white. */\nexport function parseColor(color: string | undefined, fallback: RGB = [1, 1, 1]): RGB {\n if (!color) return fallback\n let c = color.trim()\n const normalized = /^#|^rgba?\\(/i.test(c) ? c : normalizeWithCanvas(c)\n if (!normalized) return fallback\n c = normalized\n if (c[0] === '#') {\n let hex = c.slice(1)\n if (!/^(?:[\\da-f]{3,4}|[\\da-f]{6}|[\\da-f]{8})$/i.test(hex)) return fallback\n if (hex.length === 3 || hex.length === 4) hex = [...hex.slice(0, 3)].map((h) => h + h).join('')\n if (hex.length >= 6) {\n const v = parseInt(hex.slice(0, 6), 16)\n if (!Number.isNaN(v)) return [((v >> 16) & 255) / 255, ((v >> 8) & 255) / 255, (v & 255) / 255]\n }\n return fallback\n }\n const m = c.match(/rgba?\\(([^)]+)\\)/i)\n if (m) {\n const parts = m[1].split(/[\\s,/]+/).filter(Boolean)\n const ch = parts.slice(0, 3).map((p) => (p.endsWith('%') ? parseFloat(p) / 100 : parseFloat(p) / 255))\n if (ch.length === 3 && ch.every((v) => Number.isFinite(v))) return ch.map((v) => Math.max(0, Math.min(1, v))) as RGB\n }\n return fallback\n}\n\nexport function srgbToLinear(c: number): number {\n return c <= 0.04045 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4)\n}\n\nexport function linearRgb(color: string | undefined, fallback?: RGB): RGB {\n const [r, g, b] = parseColor(color, fallback)\n return [srgbToLinear(r), srgbToLinear(g), srgbToLinear(b)]\n}\n\nexport function toHex([r, g, b]: RGB): string {\n const h = (v: number) =>\n Math.round(Math.min(1, Math.max(0, v)) * 255)\n .toString(16)\n .padStart(2, '0')\n return `#${h(r)}${h(g)}${h(b)}`\n}\n","/**\n * Exact Euclidean distance transforms (Felzenszwalb & Huttenlocher, 2012).\n *\n * All grids hold *squared* distances. Seeds are 0 (or a small squared sub-pixel\n * offset for anti-aliased edges), everything else is INF.\n */\n\nexport const INF = 1e20\n\ninterface Scratch {\n f: Float64Array\n z: Float64Array\n v: Int32Array\n}\n\nfunction scratch(n: number): Scratch {\n return { f: new Float64Array(n), z: new Float64Array(n + 1), v: new Int32Array(n) }\n}\n\n/** 1D squared distance transform over a strided line of `grid`, optionally recording the source index. */\nfunction edt1d(\n grid: Float32Array,\n offset: number,\n stride: number,\n length: number,\n s: Scratch,\n arg?: Int32Array,\n): void {\n const { f, z, v } = s\n v[0] = 0\n z[0] = -INF\n z[1] = INF\n f[0] = grid[offset]\n for (let q = 1, k = 0; q < length; q++) {\n f[q] = grid[offset + q * stride]\n const q2 = q * q\n let sq: number\n do {\n const r = v[k]\n sq = (f[q] - f[r] + q2 - r * r) / (q - r) / 2\n } while (sq <= z[k] && --k > -1)\n k++\n v[k] = q\n z[k] = sq\n z[k + 1] = INF\n }\n for (let q = 0, k = 0; q < length; q++) {\n while (z[k + 1] < q) k++\n const r = v[k]\n const qr = q - r\n grid[offset + q * stride] = f[r] + qr * qr\n if (arg) arg[offset + q * stride] = r\n }\n}\n\n/** In-place 2D squared EDT. */\nexport function edt2d(grid: Float32Array, width: number, height: number): void {\n const s = scratch(Math.max(width, height))\n for (let x = 0; x < width; x++) edt1d(grid, x, width, height, s)\n for (let y = 0; y < height; y++) edt1d(grid, y * width, 1, width, s)\n}\n\n/**\n * In-place 2D squared EDT that also returns, for every pixel, the flat index of\n * its nearest seed.\n */\nexport function edt2dNearest(grid: Float32Array, width: number, height: number): Int32Array {\n const s = scratch(Math.max(width, height))\n const rowOf = new Int32Array(width * height)\n const colOf = new Int32Array(width * height)\n for (let x = 0; x < width; x++) edt1d(grid, x, width, height, s, rowOf)\n for (let y = 0; y < height; y++) edt1d(grid, y * width, 1, width, s, colOf)\n const nearest = new Int32Array(width * height)\n for (let y = 0; y < height; y++) {\n const row = y * width\n for (let x = 0; x < width; x++) {\n const sx = colOf[row + x]\n const sy = rowOf[row + sx]\n nearest[row + x] = sy * width + sx\n }\n }\n return nearest\n}\n\n/**\n * Offset from a pixel centre to a straight edge along its inward normal, given\n * the pixel's coverage (Gustavson & Strand, \"Anti-aliased Euclidean distance transform\").\n */\nfunction edgeOffset(nx: number, ny: number, a: number): number {\n let gx = Math.abs(nx)\n let gy = Math.abs(ny)\n if (gx < gy) {\n const t = gx\n gx = gy\n gy = t\n }\n if (gy < 1e-6) return 0.5 - a\n const a1 = (0.5 * gy) / gx\n if (a < a1) return 0.5 * (gx + gy) - Math.sqrt(2 * gx * gy * a)\n if (a < 1 - a1) return (0.5 - a) * gx\n return -0.5 * (gx + gy) + Math.sqrt(2 * gx * gy * (1 - a))\n}\n\n/**\n * Signed distance in pixels to the boundary of an anti-aliased coverage mask,\n * positive inside.\n *\n * Every boundary pixel gets a sub-pixel edge point, estimated from its\n * coverage and the coverage gradient. The exact EDT finds the nearest boundary\n * pixel, and the distance is measured to that pixel's edge point. That is far\n * smoother than seeding squared offsets (TinySDF), which leaves ripples that\n * show up in mirror-like reflections.\n */\nexport interface DistanceOptions {\n /** Only distances inside the mask are needed; outside pixels are left at 0. */\n insideOnly?: boolean\n /** Beyond this many pixels from the edge, skip sub-pixel refinement (error ≤ 0.5px). */\n refineWithin?: number\n}\n\nexport function signedDistance(\n coverage: Float32Array,\n width: number,\n height: number,\n options: DistanceOptions = {},\n): Float32Array {\n const insideOnly = options.insideOnly ?? false\n const refineSq = (options.refineWithin ?? Infinity) ** 2\n const wideSq = Math.min(refineSq, 2304)\n const n = width * height\n const grid = new Float32Array(n)\n // Edge point (ex, ey) and inward normal (nx, ny) for boundary pixels.\n const ex = new Float32Array(n)\n const ey = new Float32Array(n)\n const nx = new Float32Array(n)\n const ny = new Float32Array(n)\n let seeds = 0\n const at = (x: number, y: number) =>\n coverage[(y < 0 ? 0 : y >= height ? height - 1 : y) * width + (x < 0 ? 0 : x >= width ? width - 1 : x)]\n\n for (let y = 0; y < height; y++) {\n const interiorRow = y > 0 && y < height - 1\n for (let x = 0; x < width; x++) {\n const i = y * width + x\n const a = coverage[i]\n // Partial pixels carry the edge; solid pixels only when the edge falls exactly on a pixel border.\n let boundary: boolean\n if (a > 0 && a < 1) boundary = true\n else if (interiorRow && x > 0 && x < width - 1) {\n const l = coverage[i - 1]\n const r = coverage[i + 1]\n const u = coverage[i - width]\n const d = coverage[i + width]\n boundary = a <= 0 ? l >= 1 || r >= 1 || u >= 1 || d >= 1 : l <= 0 || r <= 0 || u <= 0 || d <= 0\n } else {\n boundary =\n a <= 0\n ? Math.max(at(x - 1, y), at(x + 1, y), at(x, y - 1), at(x, y + 1)) >= 1\n : Math.min(at(x - 1, y), at(x + 1, y), at(x, y - 1), at(x, y + 1)) <= 0\n }\n if (!boundary) {\n grid[i] = INF\n continue\n }\n grid[i] = 0\n seeds++\n // Sobel gradient of coverage points inwards.\n const gx =\n at(x + 1, y - 1) + 2 * at(x + 1, y) + at(x + 1, y + 1) - at(x - 1, y - 1) - 2 * at(x - 1, y) - at(x - 1, y + 1)\n const gy =\n at(x - 1, y + 1) + 2 * at(x, y + 1) + at(x + 1, y + 1) - at(x - 1, y - 1) - 2 * at(x, y - 1) - at(x + 1, y - 1)\n const gl = Math.hypot(gx, gy)\n if (gl > 1e-4) {\n const ux = gx / gl\n const uy = gy / gl\n nx[i] = ux\n ny[i] = uy\n const off = edgeOffset(ux, uy, a)\n ex[i] = x + ux * off\n ey[i] = y + uy * off\n } else {\n ex[i] = x\n ey[i] = y\n }\n }\n }\n\n const sd = new Float32Array(n)\n if (seeds === 0) {\n const v = coverage[0] >= 0.5 ? width + height : -(width + height)\n sd.fill(v)\n return sd\n }\n const isSeed = new Uint8Array(n)\n for (let i = 0; i < n; i++) isSeed[i] = grid[i] === 0 ? 1 : 0\n const nearest = edt2dNearest(grid, width, height)\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const i = y * width + x\n if (insideOnly && coverage[i] <= 0) continue\n const c = nearest[i]\n if (grid[i] > refineSq) {\n const d = Math.sqrt(grid[i])\n sd[i] = coverage[i] >= 0.5 ? d : -d\n continue\n }\n // The nearest seed *centre* is not always the nearest *edge point*: check its neighbours,\n // more widely near edges where profiles are shaped.\n const R = grid[i] < wideSq ? 2 : 1\n const cx = c % width\n const cy = (c - cx) / width\n let s = c\n let best = Infinity\n for (let oy = -R; oy <= R; oy++) {\n const yy = cy + oy\n if (yy < 0 || yy >= height) continue\n for (let ox = -R; ox <= R; ox++) {\n const xx = cx + ox\n if (xx < 0 || xx >= width) continue\n const q = yy * width + xx\n if (!isSeed[q]) continue\n const qx = x - ex[q]\n const qy = y - ey[q]\n const d2 = qx * qx + qy * qy\n if (d2 < best) {\n best = d2\n s = q\n }\n }\n }\n const dx = x - ex[s]\n const dy = y - ey[s]\n const d = Math.sqrt(best)\n // Near the edge the normal decides the side; further away the pixel's own coverage does.\n const along = dx * nx[s] + dy * ny[s]\n const inside = d < 1.5 && (nx[s] !== 0 || ny[s] !== 0) ? along >= 0 : coverage[i] >= 0.5\n sd[i] = inside ? d : -d\n }\n }\n return sd\n}\n\n/** Distance in pixels from pixels inside a coverage mask to its boundary; 0 outside. */\nexport function insideDistance(\n coverage: Float32Array,\n width: number,\n height: number,\n refineWithin?: number,\n): Float32Array {\n const sd = signedDistance(coverage, width, height, { insideOnly: true, refineWithin })\n for (let i = 0; i < sd.length; i++) sd[i] = coverage[i] > 0 ? Math.max(0, sd[i]) : 0\n return sd\n}\n","/** Image filters on single-channel float images. */\n\n/** Exact separable Gaussian blur; use for small sigmas. */\nexport function gaussianBlur(src: Float32Array, width: number, height: number, sigma: number): Float32Array {\n if (sigma <= 0.01) return src.slice()\n const radius = Math.max(1, Math.ceil(sigma * 3))\n const kernel = new Float32Array(radius * 2 + 1)\n let sum = 0\n for (let i = -radius; i <= radius; i++) {\n const w = Math.exp((-i * i) / (2 * sigma * sigma))\n kernel[i + radius] = w\n sum += w\n }\n for (let i = 0; i < kernel.length; i++) kernel[i] /= sum\n\n const tmp = new Float32Array(width * height)\n const out = new Float32Array(width * height)\n const taps = kernel.length\n // Horizontal: clamp only near the borders.\n for (let y = 0; y < height; y++) {\n const row = y * width\n for (let x = 0; x < width; x++) {\n let acc = 0\n if (x >= radius && x < width - radius) {\n const start = row + x - radius\n for (let k = 0; k < taps; k++) acc += src[start + k] * kernel[k]\n } else {\n for (let k = -radius; k <= radius; k++) {\n const xx = x + k < 0 ? 0 : x + k >= width ? width - 1 : x + k\n acc += src[row + xx] * kernel[k + radius]\n }\n }\n tmp[row + x] = acc\n }\n }\n // Vertical, accumulated row by row for cache-friendly access.\n for (let k = -radius; k <= radius; k++) {\n const w = kernel[k + radius]\n for (let y = 0; y < height; y++) {\n const yy = y + k < 0 ? 0 : y + k >= height ? height - 1 : y + k\n const srcRow = yy * width\n const dstRow = y * width\n for (let x = 0; x < width; x++) out[dstRow + x] += tmp[srcRow + x] * w\n }\n }\n return out\n}\n\n/** One separable box blur pass (running sums, O(n) for any radius), clamped edges. */\nfunction boxBlurPass(src: Float32Array, dst: Float32Array, width: number, height: number, r: number): void {\n const tmp = new Float32Array(width * height)\n const inv = 1 / (2 * r + 1)\n for (let y = 0; y < height; y++) {\n const row = y * width\n let acc = src[row] * (r + 1)\n for (let k = 1; k <= r; k++) acc += src[row + Math.min(k, width - 1)]\n for (let x = 0; x < width; x++) {\n tmp[row + x] = acc * inv\n const add = src[row + Math.min(x + r + 1, width - 1)]\n const sub = src[row + Math.max(x - r, 0)]\n acc += add - sub\n }\n }\n for (let x = 0; x < width; x++) {\n let acc = tmp[x] * (r + 1)\n for (let k = 1; k <= r; k++) acc += tmp[Math.min(k, height - 1) * width + x]\n for (let y = 0; y < height; y++) {\n dst[y * width + x] = acc * inv\n const add = tmp[Math.min(y + r + 1, height - 1) * width + x]\n const sub = tmp[Math.max(y - r, 0) * width + x]\n acc += add - sub\n }\n }\n}\n\n/** Fast Gaussian approximation from three box blurs; use for large sigmas. */\nexport function fastBlur(src: Float32Array, width: number, height: number, sigma: number): Float32Array {\n if (sigma < 2) return gaussianBlur(src, width, height, sigma)\n // Box sizes approximating a Gaussian (Kovesi 2010).\n const n = 3\n const wIdeal = Math.sqrt((12 * sigma * sigma) / n + 1)\n let wl = Math.floor(wIdeal)\n if (wl % 2 === 0) wl--\n const wu = wl + 2\n const m = Math.round((12 * sigma * sigma - n * wl * wl - 4 * n * wl - 3 * n) / (-4 * wl - 4))\n let a = src.slice()\n let b = new Float32Array(width * height)\n for (let i = 0; i < n; i++) {\n const size = i < m ? wl : wu\n boxBlurPass(a, b, width, height, (size - 1) >> 1)\n const t = a\n a = b\n b = t\n }\n return a\n}\n\n/** Blur a quantity only where `mask` is set, so values don't bleed from empty space. */\nexport function maskedBlur(\n value: Float32Array,\n mask: Float32Array,\n width: number,\n height: number,\n sigma: number,\n): Float32Array {\n const n = width * height\n const weighted = new Float32Array(n)\n for (let i = 0; i < n; i++) weighted[i] = value[i] * mask[i]\n const num = fastBlur(weighted, width, height, sigma)\n const den = fastBlur(mask, width, height, sigma)\n const out = new Float32Array(n)\n for (let i = 0; i < n; i++) out[i] = den[i] > 1e-4 ? num[i] / den[i] : value[i]\n return out\n}\n\n/** Bilinear sample with clamped edges. */\nexport function sampleBilinear(src: Float32Array, width: number, height: number, x: number, y: number): number {\n x = x < 0 ? 0 : x > width - 1 ? width - 1 : x\n y = y < 0 ? 0 : y > height - 1 ? height - 1 : y\n const x0 = Math.floor(x)\n const y0 = Math.floor(y)\n const x1 = x0 + 1 < width ? x0 + 1 : x0\n const y1 = y0 + 1 < height ? y0 + 1 : y0\n const fx = x - x0\n const fy = y - y0\n const a = src[y0 * width + x0]\n const b = src[y0 * width + x1]\n const c = src[y1 * width + x0]\n const d = src[y1 * width + x1]\n return (a + (b - a) * fx) * (1 - fy) + (c + (d - c) * fx) * fy\n}\n","/**\n * The relief bake: turns rasterised role/material masks of an SVG into the maps\n * the renderer needs. Pure, DOM-free, runs in a Web Worker.\n *\n * Output maps (all size × size):\n * - surface RGBA float: height (0..1), dh/dx, dh/dy (per texel), signed distance to silhouette (texels)\n * - albedo RGBA8: SVG colour (dilated into empty space), cavity/occlusion in alpha\n * - weights RGBA8: material slot weights (metal, enamel, base, accent)\n */\n\nimport { edt2dNearest, INF, insideDistance, signedDistance } from './edt'\nimport { fastBlur, gaussianBlur, maskedBlur, sampleBilinear } from './filters'\n\nexport interface BakeParams {\n /** Maximum relief height (fraction of size). */\n depth: number\n /** Outer rim wire width (fraction of size). */\n rim: number\n fillHoles: boolean\n /** Floor height relative to wire tops. */\n floor: number\n /** 0 = round, 1 = soft, 2 = chamfer */\n profile: number\n /** Bevel width of raised fills (fraction of size). */\n bevel: number\n /** Outer edge rounding (fraction of size). */\n edge: number\n enamelLevel: number\n enamelDome: number\n /** Dome width (fraction of size). */\n domeWidth: number\n /** Height-field smoothing in px at 512. */\n smoothing: number\n}\n\ntype Pixels = Uint8ClampedArray | Uint8Array\n\nexport interface BakeInput {\n size: number\n /** R = wire strokes, G = raised fills, B = inset fills */\n roles: Pixels\n /** R = flat fills, G = accent slot, B = base slot */\n slotsA: Pixels\n /** R = metal slot, G = enamel slot */\n slotsB: Pixels\n /** SVG colours with straight alpha */\n albedo: Pixels\n params: BakeParams\n}\n\nexport interface BakeOutput {\n size: number\n surface: Float32Array\n albedo: Uint8Array\n weights: Uint8Array\n /** Object-space height (fraction of badge size) of a normalised height of 1. */\n heightScale: number\n /** Fraction of the map covered by the badge. */\n coverage: number\n}\n\n/** Wires are shaped like tubes: height above the floor ≈ this × half-width. */\nconst TUBE_ASPECT = 0.6\n\nexport function profileCurve(t: number, kind: number): number {\n if (t <= 0) return 0\n if (t >= 1) return 1\n if (kind === 0) {\n const u = 1 - t\n return Math.sqrt(1 - u * u)\n }\n if (kind === 1) return Math.sin((t * Math.PI) / 2)\n return t\n}\n\nfunction channel(src: Pixels, c: number, n: number): Float32Array {\n const out = new Float32Array(n)\n for (let i = 0; i < n; i++) out[i] = src[i * 4 + c] / 255\n return out\n}\n\n/**\n * Fill enclosed holes: anything not reachable from the border through empty\n * pixels becomes solid. Outer-boundary pixels keep their anti-aliased coverage.\n */\nexport function fillHoles(union: Float32Array, size: number): Float32Array {\n const n = size * size\n const outside = new Uint8Array(n)\n const stack = new Int32Array(n)\n let sp = 0\n const seed = (i: number) => {\n if (!outside[i] && union[i] < 0.5) {\n outside[i] = 1\n stack[sp++] = i\n }\n }\n for (let x = 0; x < size; x++) {\n seed(x)\n seed((size - 1) * size + x)\n }\n for (let y = 0; y < size; y++) {\n seed(y * size)\n seed(y * size + size - 1)\n }\n while (sp > 0) {\n const i = stack[--sp]\n const x = i % size\n if (x > 0) seed(i - 1)\n if (x < size - 1) seed(i + 1)\n if (i >= size) seed(i - size)\n if (i < n - size) seed(i + size)\n }\n const out = new Float32Array(n)\n for (let i = 0; i < n; i++) {\n if (outside[i]) {\n out[i] = union[i]\n continue\n }\n const x = i % size\n const touchesOutside =\n (x > 0 && outside[i - 1]) ||\n (x < size - 1 && outside[i + 1]) ||\n (i >= size && outside[i - size]) ||\n (i < n - size && outside[i + size])\n out[i] = touchesOutside ? union[i] : 1\n }\n return out\n}\n\n/**\n * Local half-width of raised shapes: march from each pixel up the distance\n * gradient until the distance stops growing (the medial ridge). Using it as the\n * profile radius gives crease-free round wires of any width.\n */\nfunction localHalfWidth(\n dist: Float32Array,\n mask: Float32Array,\n wire: Float32Array,\n size: number,\n bevelPx: number,\n): Float32Array {\n const n = size * size\n const out = new Float32Array(n)\n const wireCap = size * 0.15\n const step = 0.75\n for (let y = 0; y < size; y++) {\n for (let x = 0; x < size; x++) {\n const i = y * size + x\n if (mask[i] <= 0.01) continue\n const d0 = dist[i]\n const cap = wire[i] >= mask[i] * 0.5 ? wireCap : bevelPx * 1.05\n const gx = (dist[x < size - 1 ? i + 1 : i] - dist[x > 0 ? i - 1 : i]) * 0.5\n const gy = (dist[y < size - 1 ? i + size : i] - dist[y > 0 ? i - size : i]) * 0.5\n const gl = Math.hypot(gx, gy)\n if (gl < 0.2) {\n out[i] = d0\n continue\n }\n const ux = (gx / gl) * step\n const uy = (gy / gl) * step\n let px = x\n let py = y\n let prev = d0\n let best = d0\n const maxSteps = Math.ceil(cap / step) + 2\n for (let s = 0; s < maxSteps && best < cap; s++) {\n px += ux\n py += uy\n const v = sampleBilinear(dist, size, size, px, py)\n if (v <= prev + 1e-3) break\n prev = v\n best = v\n }\n out[i] = best\n }\n }\n return out\n}\n\nexport function bake(input: BakeInput): BakeOutput {\n const { size, params } = input\n const n = size * size\n const kind = params.profile\n const rimPx = params.rim * size\n const bevelPx = Math.max(1, params.bevel * size)\n const edgePx = Math.max(1, params.edge * size)\n const domePx = Math.max(1, params.domeWidth * size)\n const floor = params.floor\n\n const wire = channel(input.roles, 0, n)\n const raisedF = channel(input.roles, 1, n)\n const inset = channel(input.roles, 2, n)\n const flat = channel(input.slotsA, 0, n)\n const accent = channel(input.slotsA, 1, n)\n const base = channel(input.slotsA, 2, n)\n const metal = channel(input.slotsB, 0, n)\n const enamel = channel(input.slotsB, 1, n)\n\n const union = new Float32Array(n)\n for (let i = 0; i < n; i++) union[i] = Math.min(1, wire[i] + raisedF[i] + inset[i] + flat[i])\n const silhouette = params.fillHoles ? fillHoles(union, size) : union\n const backplate = new Float32Array(n)\n for (let i = 0; i < n; i++) backplate[i] = Math.max(0, silhouette[i] - union[i])\n\n // Only the band near the silhouette edge needs sub-pixel accuracy (alpha, rounded edge, shadow).\n const sd = signedDistance(silhouette, size, size, { refineWithin: Math.max(edgePx, rimPx) * 2 + 8 })\n\n // Outer rim: a band of metal wire just inside the silhouette.\n if (rimPx > 0.5) {\n for (let i = 0; i < n; i++) {\n if (silhouette[i] <= 0) continue\n const band = Math.min(silhouette[i], Math.max(0, Math.min(1, rimPx + 0.5 - sd[i])))\n if (band <= 0) continue\n const keep = 1 - band\n wire[i] = Math.max(wire[i], band)\n raisedF[i] *= keep\n inset[i] *= keep\n flat[i] *= keep\n backplate[i] *= keep\n metal[i] = Math.max(metal[i], band)\n enamel[i] *= keep\n base[i] *= keep\n accent[i] *= keep\n }\n }\n\n const up = new Float32Array(n)\n for (let i = 0; i < n; i++) up[i] = Math.min(1, wire[i] + raisedF[i])\n const dUp = insideDistance(up, size, size, size * 0.16)\n // Smooth the pool distance so domes don't crease along the medial axis.\n const dIn = maskedBlur(insideDistance(inset, size, size, domePx * 1.5), inset, size, size, Math.max(1, domePx * 0.3))\n // The estimated medial radius is a slowly varying property of the wire.\n // Filter it at a consistent object-space scale so raster-sized fluctuations\n // do not turn smooth circular wires into rippled metal highlights.\n const wLocal = maskedBlur(localHalfWidth(dUp, up, wire, size, bevelPx), up, size, size, 3 * size / 512)\n\n // Typical wire half-width sets the relief scale so wires come out round, not wall-like.\n const ridge: number[] = []\n for (let i = 0; i < n; i++) {\n if (wire[i] > 0.5 && dUp[i] > 0.75 * wLocal[i] && wLocal[i] > 0.5) ridge.push(wLocal[i])\n }\n ridge.sort((a, b) => a - b)\n const wMedian = ridge.length > 8 ? ridge[ridge.length >> 1] : 0\n const tubeScale = wMedian > 0 ? (TUBE_ASPECT * wMedian) / size / Math.max(0.05, 1 - floor) : Infinity\n const heightScale = Math.max(params.depth * 0.2, Math.min(params.depth, tubeScale))\n // Wires thinner than typical are proportionally lower, so every wire stays round.\n const tubeRef = wMedian > 0 ? (heightScale * size * Math.max(0.05, 1 - floor)) / TUBE_ASPECT : Infinity\n\n // Compose the height field.\n let h: Float32Array = new Float32Array(n)\n let covered = 0\n for (let i = 0; i < n; i++) {\n if (silhouette[i] <= 0) continue\n covered += silhouette[i]\n const e = sd[i] <= 0 ? 0 : profileCurve(sd[i] / edgePx, 0)\n const body = floor * e\n const cu = up[i]\n const ci = inset[i]\n const cf = flat[i] + backplate[i]\n const total = cu + ci + cf\n if (total < 1e-4) {\n h[i] = body\n continue\n }\n let acc = cf * body\n if (cu > 0) {\n const wf = Math.min(1, wire[i] / Math.max(cu, 1e-4))\n const wl = Math.max(0.75, wLocal[i])\n const wEff = Math.max(0.75, wf * wl + (1 - wf) * Math.min(bevelPx, wl))\n const t = dUp[i] / wEff\n const rise = wf * Math.min(1, wl / tubeRef) + (1 - wf)\n acc += cu * (body + (1 - body) * rise * profileCurve(t, kind))\n }\n if (ci > 0) {\n const t = Math.min(1, dIn[i] / domePx)\n const dome = 1 - (1 - t) * (1 - t)\n acc += ci * (body + e * (params.enamelLevel + params.enamelDome * dome))\n }\n h[i] = acc / total\n }\n\n const scale = size / 512\n h = gaussianBlur(h, size, size, params.smoothing * scale)\n\n // Cavity: how much the neighbourhood rises above each point, at two scales.\n const near = fastBlur(h, size, size, Math.max(1, size * 0.008))\n const far = fastBlur(h, size, size, Math.max(2, size * 0.03))\n\n const surface = new Float32Array(n * 4)\n const cavity = new Float32Array(n)\n for (let y = 0; y < size; y++) {\n for (let x = 0; x < size; x++) {\n const i = y * size + x\n const gx = (h[x < size - 1 ? i + 1 : i] - h[x > 0 ? i - 1 : i]) * 0.5\n const gy = (h[y < size - 1 ? i + size : i] - h[y > 0 ? i - size : i]) * 0.5\n surface[i * 4] = h[i]\n surface[i * 4 + 1] = gx\n surface[i * 4 + 2] = gy\n surface[i * 4 + 3] = sd[i]\n cavity[i] = Math.min(1, Math.max(0, near[i] - h[i]) * 2.2 + Math.max(0, far[i] - h[i]) * 1.1)\n }\n }\n\n // Albedo: dilate colours into transparent space so filtering never pulls in black.\n const albedo = new Uint8Array(n * 4)\n const seeds = new Float32Array(n)\n let seedCount = 0\n for (let i = 0; i < n; i++) {\n const opaque = input.albedo[i * 4 + 3] >= 128\n seeds[i] = opaque ? 0 : INF\n if (opaque) seedCount++\n }\n const nearest = seedCount > 0 ? edt2dNearest(seeds, size, size) : null\n for (let i = 0; i < n; i++) {\n const src = input.albedo[i * 4 + 3] >= 128 || !nearest ? i : nearest[i]\n if (nearest || input.albedo[i * 4 + 3] > 0) {\n albedo[i * 4] = input.albedo[src * 4]\n albedo[i * 4 + 1] = input.albedo[src * 4 + 1]\n albedo[i * 4 + 2] = input.albedo[src * 4 + 2]\n } else {\n albedo[i * 4] = albedo[i * 4 + 1] = albedo[i * 4 + 2] = 255\n }\n albedo[i * 4 + 3] = Math.round(cavity[i] * 255)\n }\n\n // Material weights, normalised; the backplate belongs to the base slot.\n const weights = new Uint8Array(n * 4)\n for (let i = 0; i < n; i++) {\n const m = metal[i]\n const en = enamel[i]\n const b = base[i] + backplate[i]\n const a = accent[i]\n const sum = m + en + b + a\n if (sum > 1e-3) {\n const inv = 255 / sum\n weights[i * 4] = Math.round(m * inv)\n weights[i * 4 + 1] = Math.round(en * inv)\n weights[i * 4 + 2] = Math.round(b * inv)\n weights[i * 4 + 3] = Math.round(a * inv)\n } else if (silhouette[i] > 0) {\n weights[i * 4 + 2] = 255\n }\n }\n\n return { size, surface, albedo, weights, heightScale, coverage: covered / n }\n}\n","// Generated by scripts/build-worker.mjs. Do not edit.\nexport default \"\\\"use strict\\\";(()=>{function An(a){return{f:new Float64Array(a),z:new Float64Array(a+1),v:new Int32Array(a)}}function cn(a,n,e,t,c,u){let{f:m,z:f,v:s}=c;s[0]=0,f[0]=-1e20,f[1]=1e20,m[0]=a[n];for(let l=1,r=0;l<t;l++){m[l]=a[n+l*e];let b=l*l,x;do{let d=s[r];x=(m[l]-m[d]+b-d*d)/(l-d)/2}while(x<=f[r]&&--r>-1);r++,s[r]=l,f[r]=x,f[r+1]=1e20}for(let l=0,r=0;l<t;l++){for(;f[r+1]<l;)r++;let b=s[r],x=l-b;a[n+l*e]=m[b]+x*x,u&&(u[n+l*e]=b)}}function nn(a,n,e){let t=An(Math.max(n,e)),c=new Int32Array(n*e),u=new Int32Array(n*e);for(let f=0;f<n;f++)cn(a,f,n,e,t,c);for(let f=0;f<e;f++)cn(a,f*n,1,n,t,u);let m=new Int32Array(n*e);for(let f=0;f<e;f++){let s=f*n;for(let l=0;l<n;l++){let r=u[s+l],b=c[s+r];m[s+l]=b*n+r}}return m}function Mn(a,n,e){let t=Math.abs(a),c=Math.abs(n);if(t<c){let m=t;t=c,c=m}if(c<1e-6)return .5-e;let u=.5*c/t;return e<u?.5*(t+c)-Math.sqrt(2*t*c*e):e<1-u?(.5-e)*t:-.5*(t+c)+Math.sqrt(2*t*c*(1-e))}function tn(a,n,e,t={}){let c=t.insideOnly??!1,u=(t.refineWithin??1/0)**2,m=Math.min(u,2304),f=n*e,s=new Float32Array(f),l=new Float32Array(f),r=new Float32Array(f),b=new Float32Array(f),x=new Float32Array(f),d=0,A=(y,I)=>a[(I<0?0:I>=e?e-1:I)*n+(y<0?0:y>=n?n-1:y)];for(let y=0;y<e;y++){let I=y>0&&y<e-1;for(let i=0;i<n;i++){let F=y*n+i,B=a[F],O;if(B>0&&B<1)O=!0;else if(I&&i>0&&i<n-1){let U=a[F-1],W=a[F+1],D=a[F-n],j=a[F+n];O=B<=0?U>=1||W>=1||D>=1||j>=1:U<=0||W<=0||D<=0||j<=0}else O=B<=0?Math.max(A(i-1,y),A(i+1,y),A(i,y-1),A(i,y+1))>=1:Math.min(A(i-1,y),A(i+1,y),A(i,y-1),A(i,y+1))<=0;if(!O){s[F]=1e20;continue}s[F]=0,d++;let E=A(i+1,y-1)+2*A(i+1,y)+A(i+1,y+1)-A(i-1,y-1)-2*A(i-1,y)-A(i-1,y+1),q=A(i-1,y+1)+2*A(i,y+1)+A(i+1,y+1)-A(i-1,y-1)-2*A(i,y-1)-A(i+1,y-1),v=Math.hypot(E,q);if(v>1e-4){let U=E/v,W=q/v;b[F]=U,x[F]=W;let D=Mn(U,W,B);l[F]=i+U*D,r[F]=y+W*D}else l[F]=i,r[F]=y}}let k=new Float32Array(f);if(d===0){let y=a[0]>=.5?n+e:-(n+e);return k.fill(y),k}let P=new Uint8Array(f);for(let y=0;y<f;y++)P[y]=s[y]===0?1:0;let _=nn(s,n,e);for(let y=0;y<e;y++)for(let I=0;I<n;I++){let i=y*n+I;if(c&&a[i]<=0)continue;let F=_[i];if(s[i]>u){let R=Math.sqrt(s[i]);k[i]=a[i]>=.5?R:-R;continue}let B=s[i]<m?2:1,O=F%n,E=(F-O)/n,q=F,v=1/0;for(let R=-B;R<=B;R++){let K=E+R;if(!(K<0||K>=e))for(let Q=-B;Q<=B;Q++){let V=O+Q;if(V<0||V>=n)continue;let C=K*n+V;if(!P[C])continue;let X=I-l[C],N=y-r[C],Y=X*X+N*N;Y<v&&(v=Y,q=C)}}let U=I-l[q],W=y-r[q],D=Math.sqrt(v),j=U*b[q]+W*x[q],S=D<1.5&&(b[q]!==0||x[q]!==0)?j>=0:a[i]>=.5;k[i]=S?D:-D}return k}function on(a,n,e,t){let c=tn(a,n,e,{insideOnly:!0,refineWithin:t});for(let u=0;u<c.length;u++)c[u]=a[u]>0?Math.max(0,c[u]):0;return c}function en(a,n,e,t){if(t<=.01)return a.slice();let c=Math.max(1,Math.ceil(t*3)),u=new Float32Array(c*2+1),m=0;for(let r=-c;r<=c;r++){let b=Math.exp(-r*r/(2*t*t));u[r+c]=b,m+=b}for(let r=0;r<u.length;r++)u[r]/=m;let f=new Float32Array(n*e),s=new Float32Array(n*e),l=u.length;for(let r=0;r<e;r++){let b=r*n;for(let x=0;x<n;x++){let d=0;if(x>=c&&x<n-c){let A=b+x-c;for(let k=0;k<l;k++)d+=a[A+k]*u[k]}else for(let A=-c;A<=c;A++){let k=x+A<0?0:x+A>=n?n-1:x+A;d+=a[b+k]*u[A+c]}f[b+x]=d}}for(let r=-c;r<=c;r++){let b=u[r+c];for(let x=0;x<e;x++){let A=(x+r<0?0:x+r>=e?e-1:x+r)*n,k=x*n;for(let P=0;P<n;P++)s[k+P]+=f[A+P]*b}}return s}function Fn(a,n,e,t,c){let u=new Float32Array(e*t),m=1/(2*c+1);for(let f=0;f<t;f++){let s=f*e,l=a[s]*(c+1);for(let r=1;r<=c;r++)l+=a[s+Math.min(r,e-1)];for(let r=0;r<e;r++){u[s+r]=l*m;let b=a[s+Math.min(r+c+1,e-1)],x=a[s+Math.max(r-c,0)];l+=b-x}}for(let f=0;f<e;f++){let s=u[f]*(c+1);for(let l=1;l<=c;l++)s+=u[Math.min(l,t-1)*e+f];for(let l=0;l<t;l++){n[l*e+f]=s*m;let r=u[Math.min(l+c+1,t-1)*e+f],b=u[Math.max(l-c,0)*e+f];s+=r-b}}}function g(a,n,e,t){if(t<2)return en(a,n,e,t);let c=3,u=Math.sqrt(12*t*t/c+1),m=Math.floor(u);m%2===0&&m--;let f=m+2,s=Math.round((12*t*t-c*m*m-4*c*m-3*c)/(-4*m-4)),l=a.slice(),r=new Float32Array(n*e);for(let b=0;b<c;b++){let x=b<s?m:f;Fn(l,r,n,e,x-1>>1);let d=l;l=r,r=d}return l}function rn(a,n,e,t,c){let u=e*t,m=new Float32Array(u);for(let r=0;r<u;r++)m[r]=a[r]*n[r];let f=g(m,e,t,c),s=g(n,e,t,c),l=new Float32Array(u);for(let r=0;r<u;r++)l[r]=s[r]>1e-4?f[r]/s[r]:a[r];return l}function ln(a,n,e,t,c){t=t<0?0:t>n-1?n-1:t,c=c<0?0:c>e-1?e-1:c;let u=Math.floor(t),m=Math.floor(c),f=u+1<n?u+1:u,s=m+1<e?m+1:m,l=t-u,r=c-m,b=a[m*n+u],x=a[m*n+f],d=a[s*n+u],A=a[s*n+f];return(b+(x-b)*l)*(1-r)+(d+(A-d)*l)*r}var fn=.6;function un(a,n){if(a<=0)return 0;if(a>=1)return 1;if(n===0){let e=1-a;return Math.sqrt(1-e*e)}return n===1?Math.sin(a*Math.PI/2):a}function L(a,n,e){let t=new Float32Array(e);for(let c=0;c<e;c++)t[c]=a[c*4+n]/255;return t}function dn(a,n){let e=n*n,t=new Uint8Array(e),c=new Int32Array(e),u=0,m=s=>{!t[s]&&a[s]<.5&&(t[s]=1,c[u++]=s)};for(let s=0;s<n;s++)m(s),m((n-1)*n+s);for(let s=0;s<n;s++)m(s*n),m(s*n+n-1);for(;u>0;){let s=c[--u],l=s%n;l>0&&m(s-1),l<n-1&&m(s+1),s>=n&&m(s-n),s<e-n&&m(s+n)}let f=new Float32Array(e);for(let s=0;s<e;s++){if(t[s]){f[s]=a[s];continue}let l=s%n,r=l>0&&t[s-1]||l<n-1&&t[s+1]||s>=n&&t[s-n]||s<e-n&&t[s+n];f[s]=r?a[s]:1}return f}function In(a,n,e,t,c){let u=t*t,m=new Float32Array(u),f=t*.15,s=.75;for(let l=0;l<t;l++)for(let r=0;r<t;r++){let b=l*t+r;if(n[b]<=.01)continue;let x=a[b],d=e[b]>=n[b]*.5?f:c*1.05,A=(a[r<t-1?b+1:b]-a[r>0?b-1:b])*.5,k=(a[l<t-1?b+t:b]-a[l>0?b-t:b])*.5,P=Math.hypot(A,k);if(P<.2){m[b]=x;continue}let _=A/P*s,y=k/P*s,I=r,i=l,F=x,B=x,O=Math.ceil(d/s)+2;for(let E=0;E<O&&B<d;E++){I+=_,i+=y;let q=ln(a,t,t,I,i);if(q<=F+.001)break;F=q,B=q}m[b]=B}return m}function mn(a){let{size:n,params:e}=a,t=n*n,c=e.profile,u=e.rim*n,m=Math.max(1,e.bevel*n),f=Math.max(1,e.edge*n),s=Math.max(1,e.domeWidth*n),l=e.floor,r=L(a.roles,0,t),b=L(a.roles,1,t),x=L(a.roles,2,t),d=L(a.slotsA,0,t),A=L(a.slotsA,1,t),k=L(a.slotsA,2,t),P=L(a.slotsB,0,t),_=L(a.slotsB,1,t),y=new Float32Array(t);for(let o=0;o<t;o++)y[o]=Math.min(1,r[o]+b[o]+x[o]+d[o]);let I=e.fillHoles?dn(y,n):y,i=new Float32Array(t);for(let o=0;o<t;o++)i[o]=Math.max(0,I[o]-y[o]);let F=tn(I,n,n,{refineWithin:Math.max(f,u)*2+8});if(u>.5)for(let o=0;o<t;o++){if(I[o]<=0)continue;let p=Math.min(I[o],Math.max(0,Math.min(1,u+.5-F[o])));if(p<=0)continue;let M=1-p;r[o]=Math.max(r[o],p),b[o]*=M,x[o]*=M,d[o]*=M,i[o]*=M,P[o]=Math.max(P[o],p),_[o]*=M,k[o]*=M,A[o]*=M}let B=new Float32Array(t);for(let o=0;o<t;o++)B[o]=Math.min(1,r[o]+b[o]);let O=on(B,n,n,n*.16),E=rn(on(x,n,n,s*1.5),x,n,n,Math.max(1,s*.3)),q=rn(In(O,B,r,n,m),B,n,n,3*n/512),v=[];for(let o=0;o<t;o++)r[o]>.5&&O[o]>.75*q[o]&&q[o]>.5&&v.push(q[o]);v.sort((o,p)=>o-p);let U=v.length>8?v[v.length>>1]:0,W=U>0?fn*U/n/Math.max(.05,1-l):1/0,D=Math.max(e.depth*.2,Math.min(e.depth,W)),j=U>0?D*n*Math.max(.05,1-l)/fn:1/0,S=new Float32Array(t),R=0;for(let o=0;o<t;o++){if(I[o]<=0)continue;R+=I[o];let p=F[o]<=0?0:un(F[o]/f,0),M=l*p,H=B[o],w=x[o],Z=d[o]+i[o],T=H+w+Z;if(T<1e-4){S[o]=M;continue}let z=Z*M;if(H>0){let G=Math.min(1,r[o]/Math.max(H,1e-4)),$=Math.max(.75,q[o]),yn=Math.max(.75,G*$+(1-G)*Math.min(m,$)),bn=O[o]/yn,xn=G*Math.min(1,$/j)+(1-G);z+=H*(M+(1-M)*xn*un(bn,c))}if(w>0){let G=Math.min(1,E[o]/s),$=1-(1-G)*(1-G);z+=w*(M+p*(e.enamelLevel+e.enamelDome*$))}S[o]=z/T}let K=n/512;S=en(S,n,n,e.smoothing*K);let Q=g(S,n,n,Math.max(1,n*.008)),V=g(S,n,n,Math.max(2,n*.03)),C=new Float32Array(t*4),X=new Float32Array(t);for(let o=0;o<n;o++)for(let p=0;p<n;p++){let M=o*n+p,H=(S[p<n-1?M+1:M]-S[p>0?M-1:M])*.5,w=(S[o<n-1?M+n:M]-S[o>0?M-n:M])*.5;C[M*4]=S[M],C[M*4+1]=H,C[M*4+2]=w,C[M*4+3]=F[M],X[M]=Math.min(1,Math.max(0,Q[M]-S[M])*2.2+Math.max(0,V[M]-S[M])*1.1)}let N=new Uint8Array(t*4),Y=new Float32Array(t),sn=0;for(let o=0;o<t;o++){let p=a.albedo[o*4+3]>=128;Y[o]=p?0:1e20,p&&sn++}let h=sn>0?nn(Y,n,n):null;for(let o=0;o<t;o++){let p=a.albedo[o*4+3]>=128||!h?o:h[o];h||a.albedo[o*4+3]>0?(N[o*4]=a.albedo[p*4],N[o*4+1]=a.albedo[p*4+1],N[o*4+2]=a.albedo[p*4+2]):N[o*4]=N[o*4+1]=N[o*4+2]=255,N[o*4+3]=Math.round(X[o]*255)}let J=new Uint8Array(t*4);for(let o=0;o<t;o++){let p=P[o],M=_[o],H=k[o]+i[o],w=A[o],Z=p+M+H+w;if(Z>.001){let T=255/Z;J[o*4]=Math.round(p*T),J[o*4+1]=Math.round(M*T),J[o*4+2]=Math.round(H*T),J[o*4+3]=Math.round(w*T)}else I[o]>0&&(J[o*4+2]=255)}return{size:n,surface:C,albedo:N,weights:J,heightScale:D,coverage:R/t}}var an=self;an.onmessage=a=>{let{id:n,input:e}=a.data;try{let t=mn(e);an.postMessage({id:n,out:t},[t.surface.buffer,t.albedo.buffer,t.weights.buffer])}catch(t){an.postMessage({id:n,error:t instanceof Error?t.message:String(t)})}};})();\\n\"\n","import { bake, type BakeInput, type BakeOutput } from './bake'\nimport workerCode from './worker-code.generated'\n\ninterface Job {\n input: BakeInput\n resolve: (out: BakeOutput) => void\n reject: (err: Error) => void\n}\n\ninterface PoolWorker {\n worker: Worker\n jobs: Map<number, Job>\n}\n\nconst MAX_WORKERS = 3\nlet workers: PoolWorker[] = []\nlet workerUrl: string | null = null\nlet workersUnavailable = false\nlet nextId = 1\n\nfunction runOnMainThread(job: Job): void {\n try {\n job.resolve(bake(job.input))\n } catch (error) {\n job.reject(error instanceof Error ? error : new Error(String(error)))\n }\n}\n\nfunction disablePool(): void {\n workersUnavailable = true\n const orphaned = workers.flatMap((w) => [...w.jobs.values()])\n for (const w of workers) w.worker.terminate()\n workers = []\n if (workerUrl) URL.revokeObjectURL(workerUrl)\n workerUrl = null\n orphaned.forEach(runOnMainThread)\n}\n\nfunction spawn(): PoolWorker | null {\n try {\n // One shared URL lives with the module's bounded worker pool; disablePool revokes it.\n // react-doctor-disable-next-line react-doctor/no-create-object-url-without-revoke\n if (!workerUrl) workerUrl = URL.createObjectURL(new Blob([workerCode], { type: 'text/javascript' }))\n const entry: PoolWorker = { worker: new Worker(workerUrl), jobs: new Map() }\n entry.worker.onmessage = (event: MessageEvent<{ id: number; out?: BakeOutput; error?: string }>) => {\n const { id, out, error } = event.data\n const job = entry.jobs.get(id)\n if (!job) return\n entry.jobs.delete(id)\n if (out) job.resolve(out)\n else job.reject(new Error(error ?? 'bake failed'))\n }\n // A worker that cannot boot (e.g. blocked by a Content-Security-Policy) disables the pool.\n entry.worker.onerror = (event) => {\n event.preventDefault()\n disablePool()\n }\n return entry\n } catch {\n disablePool()\n return null\n }\n}\n\nfunction pickWorker(): PoolWorker | null {\n if (workersUnavailable || typeof Worker === 'undefined' || typeof Blob === 'undefined') return null\n const limit = Math.min(MAX_WORKERS, Math.max(1, (navigator.hardwareConcurrency || 2) - 1))\n const idle = workers.find((w) => w.jobs.size === 0)\n if (idle) return idle\n if (workers.length < limit) {\n const fresh = spawn()\n if (fresh) {\n workers.push(fresh)\n return fresh\n }\n }\n return workers.reduce<PoolWorker | null>((a, w) => (!a || w.jobs.size < a.jobs.size ? w : a), null)\n}\n\n/** Bake relief maps off the main thread (falls back to the main thread if workers are unavailable). */\nexport function bakeAsync(input: BakeInput): Promise<BakeOutput> {\n return new Promise<BakeOutput>((resolve, reject) => {\n const job: Job = { input, resolve, reject }\n const entry = pickWorker()\n if (!entry) {\n // Yield first so callers never block synchronously.\n setTimeout(() => runOnMainThread(job), 0)\n return\n }\n const id = nextId++\n entry.jobs.set(id, job)\n // Transfer copies so the main-thread fallback still has intact inputs.\n const copy: BakeInput = {\n ...input,\n roles: input.roles.slice(),\n slotsA: input.slotsA.slice(),\n slotsB: input.slotsB.slice(),\n albedo: input.albedo.slice(),\n }\n try {\n entry.worker.postMessage({ id, input: copy }, [\n copy.roles.buffer,\n copy.slotsA.buffer,\n copy.slotsB.buffer,\n copy.albedo.buffer,\n ] as Transferable[])\n } catch {\n // Synchronous transfer/worker failures must use the same fallback as\n // asynchronous boot errors, without retaining orphaned jobs.\n disablePool()\n }\n })\n}\n","/**\n * SVG front end: normalises arbitrary SVG markup and produces the render passes\n * the bake consumes. Classification uses the browser's own style engine, so\n * classes, <style> blocks, inheritance and currentColor all behave as in the\n * original artwork.\n */\n\nimport type { BadgeMode, FrameOptions, MaterialSlot } from '../types'\nimport { framePaths } from './frames'\n\nconst SVG_NS = 'http://www.w3.org/2000/svg'\nconst XLINK_NS = 'http://www.w3.org/1999/xlink'\n\nconst SHAPES = new Set(['path', 'rect', 'circle', 'ellipse', 'line', 'polyline', 'polygon', 'text', 'tspan', 'textPath', 'image'])\nconst NON_RENDERED =\n 'defs,clipPath,mask,pattern,marker,symbol,linearGradient,radialGradient,filter,foreignObject,style,title,desc,metadata,script'\n\ntype Role = 'wire' | 'raised' | 'inset' | 'flat'\n\ninterface Geom {\n role: Role\n slot: MaterialSlot\n}\n\ninterface ElementInfo {\n hidden: boolean\n shape: boolean\n image: boolean\n fill: Geom | null\n stroke: Geom | null\n outline: Geom | null\n}\n\nexport interface PrepareOptions {\n mode: BadgeMode\n color: string\n frame: FrameOptions | null\n /** Wire width around filled shapes as a fraction of the badge, or 'auto'. */\n outline: number | 'auto'\n /** Outline width used when `outline` is 'auto' and the artwork calls for it. */\n autoOutline: number\n}\n\nexport interface PreparedSvg {\n roles: string\n slotsA: string\n slotsB: string\n albedo: string\n mode: 'cloisonne' | 'embossed'\n outline: number\n}\n\n/** Make loosely written SVG parseable as XML (missing namespaces are common in the wild). */\nfunction ensureNamespaces(source: string): string {\n return source.replace(/<svg\\b[^>]*>/i, (tag) => {\n let out = tag\n if (!/\\sxmlns\\s*=/.test(out)) out = out.replace(/<svg/i, `<svg xmlns=\"${SVG_NS}\"`)\n if (/xlink:/.test(source) && !/xmlns:xlink\\s*=/.test(out)) out = out.replace(/<svg/i, `<svg xmlns:xlink=\"${XLINK_NS}\"`)\n return out\n })\n}\n\nexport function parseSvg(source: string): Element {\n const doc = new DOMParser().parseFromString(ensureNamespaces(source), 'image/svg+xml')\n const root = doc.documentElement\n if (!root || root.localName !== 'svg' || root.namespaceURI !== SVG_NS || doc.getElementsByTagName('parsererror').length > 0) {\n throw new Error('badgecraft: the input is not a valid SVG document')\n }\n // Classification attaches artwork to a live document. Strip executable\n // content before importing it, including handlers nested inside defs.\n for (const el of [root, ...root.querySelectorAll('*')]) {\n if (el.namespaceURI !== SVG_NS || ['script', 'foreignObject', 'animate', 'animateMotion', 'animateTransform', 'set', 'discard'].includes(el.localName)) {\n el.remove()\n continue\n }\n for (const attr of [...el.attributes]) {\n if (/^on/i.test(attr.localName)) el.removeAttributeNode(attr)\n else if (attr.localName === 'href') {\n const value = attr.value.trim()\n const embeddedImage = el.localName === 'image' && /^data:image\\//i.test(value)\n if (!value.startsWith('#') && !embeddedImage) el.removeAttributeNode(attr)\n }\n }\n }\n return root\n}\n\ntype Box = [number, number, number, number]\n\nfunction readViewBox(svg: Element): Box | null {\n const vb = svg.getAttribute('viewBox')\n if (vb) {\n const p = vb.trim().split(/[\\s,]+/).map(Number)\n if (p.length === 4 && p.every(Number.isFinite) && p[2] > 0 && p[3] > 0) return p as Box\n }\n const w = svg.getAttribute('width')\n const h = svg.getAttribute('height')\n if (w && h && !w.includes('%') && !h.includes('%')) {\n const pw = parseFloat(w)\n const ph = parseFloat(h)\n if (pw > 0 && ph > 0) return [0, 0, pw, ph]\n }\n return null\n}\n\nfunction hrefOf(el: Element): string | null {\n return el.getAttribute('href') ?? el.getAttributeNS(XLINK_NS, 'href')\n}\n\n/** Replace <use> with real copies so every instance can be styled independently. */\nfunction inlineUses(root: Element): void {\n for (let pass = 0; pass < 4; pass++) {\n const uses = [...root.getElementsByTagNameNS(SVG_NS, 'use')].filter((u) => !u.closest(NON_RENDERED))\n if (uses.length === 0) return\n for (const use of uses) {\n const href = hrefOf(use)\n const target = href?.startsWith('#') ? [...root.querySelectorAll('[id]')].find((el) => el.id === href.slice(1)) : null\n if (!target || target.contains(use)) {\n use.remove()\n continue\n }\n const doc = use.ownerDocument\n const x = use.getAttribute('x') ?? '0'\n const y = use.getAttribute('y') ?? '0'\n const group = doc.createElementNS(SVG_NS, 'g')\n for (const attr of [...use.attributes]) {\n if (['href', 'xlink:href', 'x', 'y', 'width', 'height', 'transform'].includes(attr.name)) continue\n group.setAttribute(attr.name, attr.value)\n }\n const transform = `${use.getAttribute('transform') ?? ''} translate(${x} ${y})`.trim()\n group.setAttribute('transform', transform)\n if (target.localName === 'symbol') {\n const inner = doc.createElementNS(SVG_NS, 'svg')\n inner.setAttribute('width', use.getAttribute('width') ?? target.getAttribute('width') ?? '100%')\n inner.setAttribute('height', use.getAttribute('height') ?? target.getAttribute('height') ?? '100%')\n for (const name of ['viewBox', 'preserveAspectRatio']) {\n const v = target.getAttribute(name)\n if (v) inner.setAttribute(name, v)\n }\n inner.setAttribute('overflow', 'visible')\n for (const child of [...target.childNodes]) inner.appendChild(child.cloneNode(true))\n group.appendChild(inner)\n } else {\n const copy = target.cloneNode(true) as Element\n copy.removeAttribute('id')\n group.appendChild(copy)\n }\n use.replaceWith(group)\n }\n }\n}\n\nfunction composeFrame(user: Element, userBox: Box, frame: FrameOptions): Element {\n const doc = user.ownerDocument\n const root = doc.createElementNS(SVG_NS, 'svg')\n root.setAttribute('viewBox', '0 0 100 100')\n const d = frame.path ?? framePaths[frame.shape ?? 'circle'] ?? framePaths.circle\n\n const plate = doc.createElementNS(SVG_NS, 'path')\n plate.setAttribute('d', d)\n plate.setAttribute('fill', '#000')\n plate.setAttribute('data-relief', 'flat')\n plate.setAttribute('data-material', frame.material ?? 'base')\n plate.setAttribute('data-mb-frame', '')\n root.appendChild(plate)\n\n if (frame.innerRing && frame.innerRing > 0) {\n const width = frame.innerRing * 100\n const s = 0.84\n const ring = doc.createElementNS(SVG_NS, 'path')\n ring.setAttribute('d', d)\n ring.setAttribute('fill', 'none')\n ring.setAttribute('stroke', '#fff')\n ring.setAttribute('stroke-width', String(width / s))\n ring.setAttribute('stroke-linejoin', 'round')\n ring.setAttribute('transform', `translate(50 50) scale(${s}) translate(-50 -50)`)\n ring.setAttribute('data-material', 'metal')\n ring.setAttribute('data-mb-frame', '')\n root.appendChild(ring)\n }\n\n const pad = Math.min(0.45, Math.max(0, frame.padding ?? 0.22)) * 100\n const inner = doc.createElementNS(SVG_NS, 'svg')\n for (const attr of [...user.attributes]) {\n if (/^(xmlns(:.*)?|width|height|x|y|viewBox|preserveAspectRatio|version|baseProfile)$/.test(attr.name)) continue\n inner.setAttribute(attr.name, attr.value)\n }\n inner.setAttribute('x', String(pad))\n inner.setAttribute('y', String(pad))\n inner.setAttribute('width', String(100 - 2 * pad))\n inner.setAttribute('height', String(100 - 2 * pad))\n inner.setAttribute('viewBox', userBox.join(' '))\n inner.setAttribute('preserveAspectRatio', 'xMidYMid meet')\n inner.setAttribute('overflow', 'visible')\n while (user.firstChild) inner.appendChild(user.firstChild)\n root.appendChild(inner)\n return root\n}\n\nfunction attrUp(el: Element, name: string): string | null {\n return el.closest(`[${name}]`)?.getAttribute(name) ?? null\n}\n\nconst defaultSlot: Record<Role, MaterialSlot> = { wire: 'metal', raised: 'metal', inset: 'enamel', flat: 'base' }\nconst SLOTS = new Set<MaterialSlot>(['metal', 'enamel', 'base', 'accent'])\n\nfunction slotFor(el: Element, specific: string, role: Role): MaterialSlot {\n const v = (el.getAttribute(specific) ?? attrUp(el, specific) ?? attrUp(el, 'data-material')) as MaterialSlot | null\n return v && SLOTS.has(v) ? v : defaultSlot[role]\n}\n\nfunction paintVisible(paint: string, opacity: string): boolean {\n if (!paint || paint === 'none') return false\n if (/^rgba\\(.*,\\s*0\\)$/.test(paint) || paint === 'transparent') return false\n return parseFloat(opacity || '1') > 0.004\n}\n\ntype PassKind = 'roles' | 'slotsA' | 'slotsB' | 'albedo'\n\nfunction passColor(kind: PassKind, g: Geom): string {\n const on = (b: boolean) => (b ? 'ff' : '00')\n if (kind === 'roles') return `#${on(g.role === 'wire')}${on(g.role === 'raised')}${on(g.role === 'inset')}`\n if (kind === 'slotsA') return `#${on(g.role === 'flat')}${on(g.slot === 'accent')}${on(g.slot === 'base')}`\n return `#${on(g.slot === 'metal')}${on(g.slot === 'enamel')}00`\n}\n\nfunction buildPass(\n root: Element,\n infos: ElementInfo[],\n kind: PassKind,\n outlinePx: number,\n): string {\n const clone = root.cloneNode(true) as Element\n const doc = clone.ownerDocument\n const tagged = clone.querySelectorAll('[data-mb-i]')\n const solidFilters = new Map<string, string>()\n const solidFilter = (color: string) => {\n let id = solidFilters.get(color)\n if (!id) {\n id = `mb-solid-${color.slice(1)}`\n solidFilters.set(color, id)\n }\n return `url(#${id})`\n }\n\n for (const el of tagged) {\n const info = infos[Number(el.getAttribute('data-mb-i'))]\n el.removeAttribute('data-mb-i')\n let css = el.getAttribute('style') ?? ''\n if (css && !css.trim().endsWith(';')) css += ';'\n if (info.hidden) {\n el.setAttribute('style', `${css}display:none !important;`)\n continue\n }\n if (kind === 'albedo') {\n css += 'filter:none !important;mix-blend-mode:normal !important;'\n if (info.shape) {\n if (!info.fill && !info.image) css += 'fill:none !important;'\n if (!info.stroke || info.stroke.slot === 'metal') css += 'stroke:none !important;'\n if (info.image && !info.fill) css += 'display:none !important;'\n }\n el.setAttribute('style', css)\n continue\n }\n css += 'opacity:1 !important;filter:none !important;mix-blend-mode:normal !important;'\n if (info.shape) {\n css += 'fill-opacity:1 !important;stroke-opacity:1 !important;marker:none !important;'\n if (info.image) {\n css += info.fill ? `filter:${solidFilter(passColor(kind, info.fill))} !important;` : 'display:none !important;'\n } else {\n css += info.fill ? `fill:${passColor(kind, info.fill)} !important;` : 'fill:none !important;'\n if (info.stroke) css += `stroke:${passColor(kind, info.stroke)} !important;`\n else if (info.outline) {\n css +=\n `stroke:${passColor(kind, info.outline)} !important;stroke-width:${outlinePx}px !important;` +\n 'vector-effect:non-scaling-stroke !important;stroke-linejoin:round !important;stroke-linecap:round !important;stroke-dasharray:none !important;'\n } else css += 'stroke:none !important;'\n }\n }\n el.setAttribute('style', css)\n }\n\n // A root background (e.g. style=\"background:#fff\") would paint over the masks.\n const rootCss = clone.getAttribute('style') ?? ''\n clone.setAttribute('style', `${rootCss}${rootCss && !rootCss.trim().endsWith(';') ? ';' : ''}background:none !important;`)\n\n if (solidFilters.size > 0) {\n const defs = doc.createElementNS(SVG_NS, 'defs')\n for (const [color, id] of solidFilters) {\n const filter = doc.createElementNS(SVG_NS, 'filter')\n filter.setAttribute('id', id)\n filter.setAttribute('color-interpolation-filters', 'sRGB')\n const flood = doc.createElementNS(SVG_NS, 'feFlood')\n flood.setAttribute('flood-color', color)\n const comp = doc.createElementNS(SVG_NS, 'feComposite')\n comp.setAttribute('in2', 'SourceAlpha')\n comp.setAttribute('operator', 'in')\n filter.append(flood, comp)\n defs.appendChild(filter)\n }\n clone.insertBefore(defs, clone.firstChild)\n }\n return new XMLSerializer().serializeToString(clone)\n}\n\n/**\n * Normalise the SVG, classify every painted shape into relief roles and\n * material slots, and emit the four render passes at `size` pixels.\n */\nexport function prepareSvg(source: string, options: PrepareOptions, size: number): PreparedSvg {\n if (typeof document === 'undefined') throw new Error('badgecraft: SVG preparation needs a browser DOM')\n let root = document.importNode(parseSvg(source), true)\n\n const host = document.createElement('div')\n host.setAttribute('aria-hidden', 'true')\n host.style.cssText =\n 'position:fixed;left:-10000px;top:-10000px;width:64px;height:64px;overflow:hidden;opacity:0;pointer-events:none;contain:strict;'\n host.style.color = options.color\n const shadow = host.attachShadow({ mode: 'open' })\n ;(document.body ?? document.documentElement).appendChild(host)\n\n try {\n inlineUses(root)\n shadow.appendChild(root)\n let box = readViewBox(root)\n if (!box) {\n const bb = (root as SVGGraphicsElement).getBBox?.()\n box = bb && bb.width > 0 && bb.height > 0 ? [bb.x, bb.y, bb.width, bb.height] : [0, 0, 100, 100]\n }\n\n if (options.frame) {\n const framed = composeFrame(root, box, options.frame)\n root.replaceWith(framed)\n root = framed\n box = [0, 0, 100, 100]\n }\n\n // Pass 1: gather element facts with the browser's computed styles.\n const all = [...root.querySelectorAll('*')].filter((el) => !el.closest(NON_RENDERED))\n const hiddenCache = new Map<Element, boolean>()\n const isHidden = (el: Element | null): boolean => {\n if (!el || el === root.parentNode) return false\n const cached = hiddenCache.get(el)\n if (cached !== undefined) return cached\n const cs = getComputedStyle(el)\n const hidden =\n cs.display === 'none' || parseFloat(cs.opacity || '1') <= 0.004 || (el !== root && isHidden(el.parentElement))\n hiddenCache.set(el, hidden)\n return hidden\n }\n\n interface Raw {\n el: Element\n hidden: boolean\n shape: boolean\n image: boolean\n hasFill: boolean\n hasStroke: boolean\n fillPaint: string\n frame: boolean\n }\n const raws: Raw[] = all.map((el) => {\n const shape = SHAPES.has(el.localName)\n const image = el.localName === 'image'\n const hidden = isHidden(el) || (shape && getComputedStyle(el).visibility === 'hidden')\n let hasFill = false\n let hasStroke = false\n let fillPaint = ''\n if (shape && !hidden) {\n const cs = getComputedStyle(el)\n hasFill = image || (el.localName !== 'line' && paintVisible(cs.fill, cs.fillOpacity))\n hasStroke = !image && paintVisible(cs.stroke, cs.strokeOpacity) && parseFloat(cs.strokeWidth) > 0\n fillPaint = cs.fill\n }\n return { el, hidden, shape, image, hasFill, hasStroke, fillPaint, frame: !!el.closest('[data-mb-frame]') }\n })\n\n // Resolve the mode.\n const art = raws.filter((r) => r.shape && !r.hidden && !r.frame)\n const hasStrokes = art.some((r) => r.hasStroke && attrUp(r.el, 'data-stroke-relief') !== 'none')\n const fillColors = new Set(art.filter((r) => r.hasFill && !r.image).map((r) => r.fillPaint))\n const hasImages = art.some((r) => r.image)\n const mode: 'cloisonne' | 'embossed' =\n options.mode !== 'auto'\n ? options.mode\n : hasStrokes || hasImages || fillColors.size > 1 || [...fillColors].some((paint) => paint.startsWith('url('))\n ? 'cloisonne'\n : 'embossed'\n // Multi-colour artwork without strokes has nothing separating its colours: add wires.\n const outline =\n options.outline === 'auto'\n ? mode === 'cloisonne' && !hasStrokes && fillColors.size > 1\n ? options.autoOutline\n : 0\n : Math.max(0, options.outline)\n\n const infos: ElementInfo[] = raws.map((r) => {\n const info: ElementInfo = { hidden: r.hidden, shape: r.shape, image: r.image, fill: null, stroke: null, outline: null }\n if (r.hidden || !r.shape) return info\n if (r.hasFill) {\n const relief = attrUp(r.el, 'data-relief') ?? (mode === 'embossed' ? 'raised' : 'inset')\n if (relief === 'raised' || relief === 'inset' || relief === 'flat') {\n info.fill = { role: relief, slot: slotFor(r.el, 'data-fill-material', relief) }\n }\n }\n if (r.hasStroke) {\n const relief = attrUp(r.el, 'data-stroke-relief') ?? 'raised'\n const role: Role | null = relief === 'raised' ? 'wire' : relief === 'inset' || relief === 'flat' ? relief : null\n if (role) info.stroke = { role, slot: slotFor(r.el, 'data-stroke-material', role) }\n } else if (outline > 0 && info.fill && info.fill.role === 'inset' && !r.image && !r.frame) {\n info.outline = { role: 'wire', slot: slotFor(r.el, 'data-stroke-material', 'wire') }\n }\n return info\n })\n all.forEach((el, i) => el.setAttribute('data-mb-i', String(i)))\n\n // Square, padded viewport so strokes, rims and the distance field have room.\n const margin = 0.03 + outline * 0.6\n const [bx, by, bw, bh] = box\n const side = Math.max(bw, bh) * (1 + 2 * margin)\n root.setAttribute('viewBox', `${bx + bw / 2 - side / 2} ${by + bh / 2 - side / 2} ${side} ${side}`)\n root.setAttribute('width', String(size))\n root.setAttribute('height', String(size))\n root.setAttribute('preserveAspectRatio', 'xMidYMid meet')\n root.removeAttribute('x')\n root.removeAttribute('y')\n if (!root.getAttribute('color')) root.setAttribute('color', options.color)\n\n const outlinePx = outline * size\n return {\n roles: buildPass(root, infos, 'roles', outlinePx),\n slotsA: buildPass(root, infos, 'slotsA', outlinePx),\n slotsB: buildPass(root, infos, 'slotsB', outlinePx),\n albedo: buildPass(root, infos, 'albedo', outlinePx),\n mode,\n outline,\n }\n } finally {\n host.remove()\n }\n}\n","function loadImage(url: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const img = new Image()\n img.decoding = 'async'\n img.onload = () => resolve(img)\n img.onerror = () => reject(new Error('badgecraft: the browser could not render the SVG'))\n img.src = url\n })\n}\n\n/**\n * Rasterise SVG markup with the browser's own renderer. With a background the\n * result is opaque, so each channel holds exact anti-aliased coverage.\n */\nexport async function rasterizeSvg(svg: string, size: number, background?: string): Promise<Uint8ClampedArray> {\n const url = URL.createObjectURL(new Blob([svg], { type: 'image/svg+xml;charset=utf-8' }))\n try {\n const img = await loadImage(url)\n const canvas = document.createElement('canvas')\n canvas.width = size\n canvas.height = size\n const ctx = canvas.getContext('2d', { willReadFrequently: true })\n if (!ctx) throw new Error('badgecraft: 2D canvas unavailable')\n if (background) {\n ctx.fillStyle = background\n ctx.fillRect(0, 0, size, size)\n }\n ctx.drawImage(img, 0, 0, size, size)\n return ctx.getImageData(0, 0, size, size).data\n } finally {\n URL.revokeObjectURL(url)\n }\n}\n","import type { BakeOutput } from './bake/bake'\nimport { bakeAsync } from './bake/client'\nimport type { BakeSettings } from './options'\nimport type { BadgeTextures, Renderer } from './render/renderer'\nimport { prepareSvg } from './svg/prepare'\nimport { rasterizeSvg } from './svg/rasterize'\nimport { hashString } from './util'\n\nexport function mapsKey(source: string, bakeKey: string, size: number): string {\n return `${hashString(source)}:${hashString(bakeKey)}:${size}`\n}\n\n/** SVG → relief maps. Runs the DOM work here and the heavy lifting in a worker. */\nexport async function bakeSvg(source: string, settings: BakeSettings, size: number): Promise<BakeOutput> {\n const prepared = prepareSvg(\n source,\n {\n mode: settings.mode,\n color: settings.color,\n frame: settings.frame,\n outline: settings.outline,\n autoOutline: settings.autoOutline,\n },\n size,\n )\n const [roles, slotsA, slotsB, albedo] = await Promise.all([\n rasterizeSvg(prepared.roles, size, '#000'),\n rasterizeSvg(prepared.slotsA, size, '#000'),\n rasterizeSvg(prepared.slotsB, size, '#000'),\n rasterizeSvg(prepared.albedo, size),\n ])\n return bakeAsync({\n size,\n roles,\n slotsA,\n slotsB,\n albedo,\n params: {\n depth: settings.depth,\n rim: settings.rim,\n fillHoles: settings.fillHoles,\n floor: settings.floor,\n profile: settings.profile,\n bevel: settings.bevel,\n edge: settings.edge,\n enamelLevel: settings.enamelLevel,\n enamelDome: settings.enamelDome,\n domeWidth: settings.domeWidth,\n smoothing: settings.smoothing,\n },\n })\n}\n\n// Recently baked maps, so remounts and context restores skip the bake.\nconst cpuCache = new Map<string, Promise<BakeOutput>>()\nconst cpuBytes = new Map<string, number>()\nconst CPU_CACHE_ENTRIES = 8\nconst CPU_CACHE_BYTES = 48 * 1024 * 1024\n\nfunction cachedBake(key: string, produce: () => Promise<BakeOutput>): Promise<BakeOutput> {\n let pending = cpuCache.get(key)\n if (pending) {\n cpuCache.delete(key)\n cpuCache.set(key, pending)\n return pending\n }\n const job = produce()\n job.then(\n (out) => {\n if (cpuCache.get(key) !== job) return\n cpuBytes.set(key, out.surface.byteLength + out.albedo.byteLength + out.weights.byteLength)\n trimCpuCache()\n },\n () => cpuCache.get(key) === job && cpuCache.delete(key),\n )\n pending = job\n cpuCache.set(key, pending)\n trimCpuCache()\n return pending\n}\n\nfunction trimCpuCache(): void {\n let total = 0\n for (const bytes of cpuBytes.values()) total += bytes\n // Evict oldest first, but always keep the newest entry.\n while (cpuCache.size > 1 && (cpuCache.size > CPU_CACHE_ENTRIES || total > CPU_CACHE_BYTES)) {\n const oldest = cpuCache.keys().next().value!\n total -= cpuBytes.get(oldest) ?? 0\n cpuCache.delete(oldest)\n cpuBytes.delete(oldest)\n }\n}\n\nexport interface MapsHandle {\n key: string\n textures: BadgeTextures\n /** The cache entry this handle holds a reference on. */\n entry: GpuEntry\n}\n\ninterface GpuEntry {\n refs: number\n promise: Promise<BadgeTextures>\n textures?: BadgeTextures\n /** Renderer generation the textures were created in (they die with a lost context). */\n generation: number\n disposeTimer?: ReturnType<typeof setTimeout>\n}\n\n// Uploaded textures shared by every badge showing the same artwork.\nconst gpuCache = new Map<string, GpuEntry>()\n\nexport async function acquireMaps(\n renderer: Renderer,\n key: string,\n produce: () => Promise<BakeOutput>,\n): Promise<MapsHandle> {\n let entry = gpuCache.get(key)\n // Textures from before a context loss are gone; start over.\n if (entry?.textures && entry.generation !== renderer.generation) entry = undefined\n if (!entry) {\n const created: GpuEntry = {\n refs: 0,\n generation: renderer.generation,\n promise: cachedBake(key, produce).then((out) => {\n created.textures = renderer.createBadgeTextures(out)\n created.generation = renderer.generation\n return created.textures\n }),\n }\n created.promise.catch(() => gpuCache.get(key) === created && gpuCache.delete(key))\n gpuCache.set(key, created)\n entry = created\n }\n entry.refs++\n if (entry.disposeTimer) {\n clearTimeout(entry.disposeTimer)\n entry.disposeTimer = undefined\n }\n try {\n return { key, textures: await entry.promise, entry }\n } catch (error) {\n entry.refs--\n throw error\n }\n}\n\nexport function releaseMaps(renderer: Renderer, handle: MapsHandle): void {\n const entry = handle.entry\n entry.refs--\n if (entry.refs > 0) return\n // Keep textures briefly so quick remounts (StrictMode, route changes) reuse them.\n entry.disposeTimer = setTimeout(() => {\n if (entry.refs > 0) return\n if (gpuCache.get(handle.key) === entry) gpuCache.delete(handle.key)\n if (entry.textures && entry.generation === renderer.generation) renderer.deleteBadgeTextures(entry.textures)\n }, 4000)\n}\n","/** Radiance RGBE (.hdr) decoder → linear float RGBA. */\nexport function decodeHdr(buffer: ArrayBuffer): { width: number; height: number; data: Float32Array } {\n const bytes = new Uint8Array(buffer)\n let pos = 0\n const readLine = () => {\n let s = ''\n while (pos < bytes.length && bytes[pos] !== 0x0a) s += String.fromCharCode(bytes[pos++])\n if (pos >= bytes.length) throw new Error('badgecraft: truncated HDR header')\n pos++\n return s.replace(/\\r$/, '')\n }\n const magic = readLine()\n if (!magic.startsWith('#?')) throw new Error('badgecraft: not a Radiance HDR file')\n let line = readLine()\n while (line.length > 0) line = readLine()\n const size = readLine().match(/-Y\\s+(\\d+)\\s+\\+X\\s+(\\d+)/)\n if (!size) throw new Error('badgecraft: unsupported HDR orientation')\n const height = Number(size[1])\n const width = Number(size[2])\n // Bound allocations before trusting dimensions from an external file.\n if (width < 1 || height < 1 || width * height > 16_777_216) {\n throw new Error('badgecraft: invalid or oversized HDR dimensions')\n }\n const requireBytes = (count: number) => {\n if (pos + count > bytes.length) throw new Error('badgecraft: truncated HDR pixels')\n }\n const rgbe = new Uint8Array(width * height * 4)\n const scan = new Uint8Array(width * 4)\n\n for (let y = 0; y < height; y++) {\n requireBytes(4)\n const rle = width >= 8 && width < 32768 && bytes[pos] === 2 && bytes[pos + 1] === 2 && !(bytes[pos + 2] & 0x80)\n if (!rle) {\n // Flat (uncompressed) scanlines.\n requireBytes(width * 4)\n rgbe.set(bytes.subarray(pos, pos + width * 4), y * width * 4)\n pos += width * 4\n continue\n }\n if ((bytes[pos + 2] << 8 | bytes[pos + 3]) !== width) {\n throw new Error('badgecraft: HDR scanline width mismatch')\n }\n pos += 4\n for (let c = 0; c < 4; c++) {\n let x = 0\n while (x < width) {\n requireBytes(1)\n let count = bytes[pos++]\n const length = count > 128 ? count - 128 : count\n if (length === 0 || x + length > width) throw new Error('badgecraft: invalid HDR run length')\n requireBytes(count > 128 ? 1 : length)\n if (count > 128) {\n count -= 128\n const v = bytes[pos++]\n for (let k = 0; k < count; k++) scan[(x++) * 4 + c] = v\n } else {\n for (let k = 0; k < count; k++) scan[(x++) * 4 + c] = bytes[pos++]\n }\n }\n }\n rgbe.set(scan, y * width * 4)\n }\n\n const data = new Float32Array(width * height * 4)\n for (let i = 0; i < width * height; i++) {\n const e = rgbe[i * 4 + 3]\n const f = e ? Math.pow(2, e - 136) : 0\n data[i * 4] = rgbe[i * 4] * f\n data[i * 4 + 1] = rgbe[i * 4 + 1] * f\n data[i * 4 + 2] = rgbe[i * 4 + 2] * f\n data[i * 4 + 3] = 1\n }\n return { width, height, data }\n}\n","/** Clip the relief grid to the distance-field contour so edge triangles never\n * collapse across empty texels. Shared intersections keep adjacent cells welded. */\nexport function reliefMesh(surface: Float32Array, size: number): {\n vertices: Float32Array\n indices: Uint32Array\n faceCount: number\n} {\n const steps = Math.min(size, 384)\n const vertices: number[] = []\n const indices: number[] = []\n const distances: number[] = []\n const edges = new Map<string, number>()\n const boundary: [number, number][] = []\n const sample = (u: number, v: number) => {\n const x = Math.max(0, Math.min(size - 1, u * size - 0.5))\n const y = Math.max(0, Math.min(size - 1, v * size - 0.5))\n const ix = Math.floor(x), iy = Math.floor(y)\n const jx = Math.min(ix + 1, size - 1), jy = Math.min(iy + 1, size - 1)\n const a = surface[(iy * size + ix) * 4 + 3] * (1 - x + ix) + surface[(iy * size + jx) * 4 + 3] * (x - ix)\n const b = surface[(jy * size + ix) * 4 + 3] * (1 - x + ix) + surface[(jy * size + jx) * 4 + 3] * (x - ix)\n return a * (1 - y + iy) + b * (y - iy)\n }\n for (let y = 0; y <= steps; y++) for (let x = 0; x <= steps; x++) {\n vertices.push(x / steps, y / steps, 0)\n distances.push(sample(x / steps, y / steps))\n }\n const crossing = (a: number, b: number) => {\n if (distances[a] === 0) return a\n if (distances[b] === 0) return b\n const key = a < b ? `${a}:${b}` : `${b}:${a}`\n const found = edges.get(key)\n if (found !== undefined) return found\n // Refine against the bilinear field, rather than interpolating a long\n // diagonal through the curved silhouette.\n let lo = 0, hi = 1\n for (let i = 0; i < 12; i++) {\n const t = (lo + hi) / 2\n const d = sample(vertices[a * 3] * (1 - t) + vertices[b * 3] * t, vertices[a * 3 + 1] * (1 - t) + vertices[b * 3 + 1] * t)\n if ((d >= 0) === (distances[a] >= 0)) lo = t\n else hi = t\n }\n const t = (lo + hi) / 2\n const id = vertices.length / 3\n vertices.push(vertices[a * 3] * (1 - t) + vertices[b * 3] * t, vertices[a * 3 + 1] * (1 - t) + vertices[b * 3 + 1] * t, 0)\n distances.push(0)\n edges.set(key, id)\n return id\n }\n const triangle = (a: number, b: number, c: number) => {\n const input = [a, b, c], poly: number[] = []\n for (let i = 0; i < 3; i++) {\n const p = input[i], q = input[(i + 1) % 3]\n if (distances[p] >= 0) poly.push(p)\n if ((distances[p] >= 0) !== (distances[q] >= 0)) poly.push(crossing(p, q))\n }\n for (let i = poly.length - 1; i >= 0; i--) {\n if (poly[i] === poly[(i + 1) % poly.length]) poly.splice(i, 1)\n }\n if (poly.length < 3) return\n for (let i = 1; i + 1 < poly.length; i++) indices.push(poly[0], poly[i], poly[i + 1])\n for (let i = 0; i < poly.length; i++) {\n const p = poly[i], q = poly[(i + 1) % poly.length]\n const onMapEdge = [0, 1].some(axis =>\n vertices[p * 3 + axis] === vertices[q * 3 + axis] &&\n (vertices[p * 3 + axis] === 0 || vertices[p * 3 + axis] === 1))\n if ((distances[p] === 0 && distances[q] === 0) || onMapEdge) boundary.push([p, q])\n }\n }\n for (let y = 0; y < steps; y++) for (let x = 0; x < steps; x++) {\n const a = y * (steps + 1) + x, b = a + 1, c = a + steps + 1, d = c + 1\n // Most cells are wholly inside or outside the silhouette. Avoid allocating\n // and clipping two polygons per cell when no contour can cross either one.\n // Keep map-border cells on the clipping path so their side walls are emitted,\n // and keep zero-distance vertices there for exact contour welding.\n const da = distances[a], db = distances[b], dc = distances[c], dd = distances[d]\n if (da < 0 && db < 0 && dc < 0 && dd < 0) continue\n if (da > 0 && db > 0 && dc > 0 && dd > 0 && x > 0 && y > 0 && x < steps - 1 && y < steps - 1) {\n indices.push(a, c, b, b, c, d)\n continue\n }\n triangle(a, c, b)\n triangle(b, c, d)\n }\n const faceCount = indices.length\n for (const [a, b] of boundary) {\n const i = vertices.length / 3\n // +1 is the front lip, -1 the back lip; 0 uses the face pass.\n for (const [id, side] of [[a, 1], [a, -1], [b, 1], [b, -1]]) vertices.push(vertices[id * 3], vertices[id * 3 + 1], side)\n indices.push(i, i + 1, i + 2, i + 2, i + 1, i + 3)\n }\n return { vertices: new Float32Array(vertices), indices: new Uint32Array(indices), faceCount }\n}\n","/** Minimal column-major 4x4 matrix helpers. */\nexport type Mat4 = Float32Array\n\nexport function perspective(fovY: number, aspect: number, near: number, far: number): Mat4 {\n const f = 1 / Math.tan(fovY / 2)\n const nf = 1 / (near - far)\n const m = new Float32Array(16)\n m[0] = f / aspect\n m[5] = f\n m[10] = (far + near) * nf\n m[11] = -1\n m[14] = 2 * far * near * nf\n return m\n}\n\nexport function multiply(a: Mat4, b: Mat4): Mat4 {\n const out = new Float32Array(16)\n for (let c = 0; c < 4; c++) {\n for (let r = 0; r < 4; r++) {\n out[c * 4 + r] =\n a[r] * b[c * 4] + a[4 + r] * b[c * 4 + 1] + a[8 + r] * b[c * 4 + 2] + a[12 + r] * b[c * 4 + 3]\n }\n }\n return out\n}\n\nexport function translation(x: number, y: number, z: number): Mat4 {\n const m = identity()\n m[12] = x\n m[13] = y\n m[14] = z\n return m\n}\n\nexport function identity(): Mat4 {\n const m = new Float32Array(16)\n m[0] = m[5] = m[10] = m[15] = 1\n return m\n}\n\n/** Rotation: yaw around Y applied after pitch around X, then roll around Z. */\nexport function rotation(pitch: number, yaw: number, roll = 0): Mat4 {\n const cx = Math.cos(pitch)\n const sx = Math.sin(pitch)\n const cy = Math.cos(yaw)\n const sy = Math.sin(yaw)\n const rx = identity()\n rx[5] = cx\n rx[6] = sx\n rx[9] = -sx\n rx[10] = cx\n const ry = identity()\n ry[0] = cy\n ry[2] = -sy\n ry[8] = sy\n ry[10] = cy\n let m = multiply(ry, rx)\n if (roll) {\n const cz = Math.cos(roll)\n const sz = Math.sin(roll)\n const rz = identity()\n rz[0] = cz\n rz[1] = sz\n rz[4] = -sz\n rz[5] = cz\n m = multiply(m, rz)\n }\n return m\n}\n\nexport function normalMatrix(m: Mat4): Float32Array {\n // Pure rotations: the upper 3x3 is its own inverse-transpose.\n return new Float32Array([m[0], m[1], m[2], m[4], m[5], m[6], m[8], m[9], m[10]])\n}\n","/** GLSL ES 3.00 sources. */\n\nconst common = /* glsl */ `\nconst float PI = 3.14159265359;\n\n// Equirectangular mapping. u = 0.5 looks along +z (towards the viewer), v = 0 is straight up.\nvec2 dirToUv(vec3 d, float rotation) {\n float u = atan(d.x, d.z) * (0.5 / PI) + 0.5 + rotation;\n float v = acos(clamp(d.y, -1.0, 1.0)) / PI;\n return vec2(u, v);\n}\n\nvec3 uvToDir(vec2 uv) {\n float phi = (uv.x - 0.5) * 2.0 * PI;\n float theta = uv.y * PI;\n return vec3(sin(theta) * sin(phi), cos(theta), sin(theta) * cos(phi));\n}\n`\n\nexport const fullscreenVertex = /* glsl */ `#version 300 es\nvoid main() {\n vec2 p = vec2(float((gl_VertexID << 1) & 2), float(gl_VertexID & 2));\n gl_Position = vec4(p * 2.0 - 1.0, 0.0, 1.0);\n}\n`\n\nexport const MAX_LIGHTS = 8\n\nexport const envGenerateFragment = /* glsl */ `#version 300 es\nprecision highp float;\n${common}\nuniform vec2 uSize;\nuniform vec3 uTop;\nuniform vec3 uHorizon;\nuniform vec3 uBottom;\nuniform int uLightCount;\nuniform vec3 uLightDir[${MAX_LIGHTS}];\nuniform vec3 uLightColor[${MAX_LIGHTS}];\nuniform vec4 uLightShape[${MAX_LIGHTS}]; // tan(half width), tan(half height), softness, circle?\nuniform float uScale;\nout vec4 outColor;\n\nvoid main() {\n vec2 uv = gl_FragCoord.xy / uSize;\n vec3 d = uvToDir(uv);\n vec3 col = d.y > 0.0\n ? mix(uHorizon, uTop, pow(d.y, 0.55))\n : mix(uHorizon, uBottom, pow(-d.y, 0.4));\n for (int i = 0; i < ${MAX_LIGHTS}; i++) {\n if (i >= uLightCount) break;\n vec3 c = uLightDir[i];\n float cd = dot(d, c);\n if (cd <= 0.02) continue;\n vec3 up = abs(c.y) > 0.99 ? vec3(0.0, 0.0, 1.0) : vec3(0.0, 1.0, 0.0);\n vec3 right = normalize(cross(up, c));\n vec3 upv = cross(c, right);\n vec2 p = vec2(dot(d, right), dot(d, upv)) / cd;\n vec4 s = uLightShape[i];\n float soft = clamp(s.z, 0.02, 1.0);\n float e;\n if (s.w > 0.5) {\n e = length(p) / s.x;\n } else {\n vec2 q = abs(p) / s.xy;\n e = pow(pow(q.x, 8.0) + pow(q.y, 8.0), 0.125);\n }\n float m = 1.0 - smoothstep(1.0 - soft, 1.0, e);\n col += uLightColor[i] * m;\n }\n outColor = vec4(col * uScale, 1.0);\n}\n`\n\nconst sampling = /* glsl */ `\nvec2 hammersley(int i, int n) {\n uint b = uint(i);\n b = (b << 16u) | (b >> 16u);\n b = ((b & 0x55555555u) << 1u) | ((b & 0xAAAAAAAAu) >> 1u);\n b = ((b & 0x33333333u) << 2u) | ((b & 0xCCCCCCCCu) >> 2u);\n b = ((b & 0x0F0F0F0Fu) << 4u) | ((b & 0xF0F0F0F0u) >> 4u);\n b = ((b & 0x00FF00FFu) << 8u) | ((b & 0xFF00FF00u) >> 8u);\n return vec2(float(i) / float(n), float(b) * 2.3283064365386963e-10);\n}\n\nmat3 tangentFrame(vec3 n) {\n vec3 up = abs(n.z) < 0.999 ? vec3(0.0, 0.0, 1.0) : vec3(1.0, 0.0, 0.0);\n vec3 t = normalize(cross(up, n));\n return mat3(t, cross(n, t), n);\n}\n`\n\nexport const prefilterFragment = /* glsl */ `#version 300 es\nprecision highp float;\n${common}\n${sampling}\nuniform sampler2D uSrc;\nuniform vec2 uSize;\nuniform float uRoughness;\nuniform float uTexelSolidAngle;\nout vec4 outColor;\nconst int SAMPLES = 256;\n\nvoid main() {\n vec2 uv = gl_FragCoord.xy / uSize;\n // The mirror level is a resample, not a convolution. Preserve crisp studio\n // cards and skip 256 identical GGX samples over the largest mip level.\n if (uRoughness <= 0.001) {\n outColor = vec4(textureLod(uSrc, uv, 0.0).rgb, 1.0);\n return;\n }\n vec3 N = uvToDir(uv);\n float a = max(uRoughness * uRoughness, 1e-4);\n float a2 = a * a;\n mat3 tbn = tangentFrame(N);\n vec3 sum = vec3(0.0);\n float wsum = 0.0;\n for (int i = 0; i < SAMPLES; i++) {\n vec2 xi = hammersley(i, SAMPLES);\n float phi = 2.0 * PI * xi.x;\n float cosT = sqrt((1.0 - xi.y) / (1.0 + (a2 - 1.0) * xi.y));\n float sinT = sqrt(1.0 - cosT * cosT);\n vec3 H = tbn * vec3(cos(phi) * sinT, sin(phi) * sinT, cosT);\n float NdH = dot(N, H);\n vec3 L = 2.0 * NdH * H - N;\n float NdL = dot(N, L);\n if (NdL > 0.0) {\n float d = NdH * NdH * (a2 - 1.0) + 1.0;\n float D = a2 / (PI * d * d);\n float pdf = D * 0.25;\n float saSample = 1.0 / (float(SAMPLES) * pdf + 1e-5);\n float lod = max(0.5 * log2(saSample / uTexelSolidAngle) + 1.0, 0.0);\n sum += textureLod(uSrc, dirToUv(L, 0.0), lod).rgb * NdL;\n wsum += NdL;\n }\n }\n outColor = vec4(sum / max(wsum, 1e-4), 1.0);\n}\n`\n\nexport const irradianceFragment = /* glsl */ `#version 300 es\nprecision highp float;\n${common}\n${sampling}\nuniform sampler2D uSrc;\nuniform vec2 uSize;\nuniform float uTexelSolidAngle;\nout vec4 outColor;\nconst int SAMPLES = 512;\n\nvoid main() {\n vec2 uv = gl_FragCoord.xy / uSize;\n vec3 N = uvToDir(uv);\n mat3 tbn = tangentFrame(N);\n vec3 sum = vec3(0.0);\n for (int i = 0; i < SAMPLES; i++) {\n vec2 xi = hammersley(i, SAMPLES);\n float phi = 2.0 * PI * xi.x;\n float cosT = sqrt(1.0 - xi.y);\n float sinT = sqrt(xi.y);\n vec3 L = tbn * vec3(cos(phi) * sinT, sin(phi) * sinT, cosT);\n float pdf = cosT / PI;\n float saSample = 1.0 / (float(SAMPLES) * pdf + 1e-5);\n float lod = max(0.5 * log2(saSample / uTexelSolidAngle) + 1.0, 0.0);\n sum += textureLod(uSrc, dirToUv(L, 0.0), lod).rgb;\n }\n outColor = vec4(sum / float(SAMPLES), 1.0);\n}\n`\n\nexport const badgeVertex = /* glsl */ `#version 300 es\nprecision highp float;\nlayout(location = 0) in vec2 aUv;\nlayout(location = 1) in float aLip;\nuniform sampler2D uSurface;\nuniform mat4 uModel;\nuniform mat4 uViewProj;\nuniform float uDepth;\nuniform float uThickness;\nuniform float uEdgeTexels;\nuniform float uSide;\nout vec2 vUv;\nout vec3 vWorld;\nout vec3 vLocal;\n\nfloat roundProfile(float t) {\n float u = 1.0 - clamp(t, 0.0, 1.0);\n return sqrt(max(0.0, 1.0 - u * u));\n}\n\nvoid main() {\n vec4 s = textureLod(uSurface, aUv, 0.0);\n float side = uSide == 0.0 ? aLip : uSide;\n float z = side > 0.0 ? s.r * uDepth : -uThickness * roundProfile(max(s.a, 0.0) / uEdgeTexels);\n vec3 p = vec3(aUv.x - 0.5, 0.5 - aUv.y, z);\n vec4 w = uModel * vec4(p, 1.0);\n vUv = aUv;\n vWorld = w.xyz;\n vLocal = p;\n gl_Position = uViewProj * w;\n}\n`\n\nexport const badgeFragment = /* glsl */ `#version 300 es\nprecision highp float;\n${common}\nin vec2 vUv;\nin vec3 vWorld;\nin vec3 vLocal;\n\nuniform sampler2D uSurface;\nuniform sampler2D uAlbedo;\nuniform sampler2D uWeights;\nuniform sampler2D uEnvSpec;\nuniform sampler2D uEnvIrr;\nuniform float uEnvMaxLod;\nuniform float uEnvRotation;\nuniform float uEnvScale;\n\nuniform vec4 uMatColor[4]; // linear rgb, useSvgColor\nuniform vec4 uMatA[4]; // metalness, roughness, clearcoat, clearcoat roughness\nuniform vec4 uMatB[4]; // dielectric f0, iridescence, film thickness (nm), flakes\nuniform vec4 uMatC[4]; // brushed, brush direction, flake scale, emissive\n\nuniform mat3 uNormalMatrix;\nuniform vec3 uCamPos;\nuniform float uMapSize;\nuniform float uPixelScale;\nuniform float uDepth;\nuniform float uThickness;\nuniform float uEdgeTexels;\nuniform float uAo;\nuniform float uExposure;\nuniform float uSide;\nuniform int uToneMap;\nuniform float uLocked;\nuniform vec3 uLockedColor;\nuniform float uShine;\n\nout vec4 outColor;\n\nvec3 envSpec(vec3 dir, float roughness) {\n return textureLod(uEnvSpec, dirToUv(dir, uEnvRotation), roughness * uEnvMaxLod).rgb * uEnvScale;\n}\n\nvec3 envIrr(vec3 dir) {\n return textureLod(uEnvIrr, dirToUv(dir, uEnvRotation), 0.0).rgb * uEnvScale;\n}\n\n// Karis' analytic approximation of the split-sum BRDF integral.\nvec2 envBRDF(float roughness, float NdV) {\n const vec4 c0 = vec4(-1.0, -0.0275, -0.572, 0.022);\n const vec4 c1 = vec4(1.0, 0.0425, 1.04, -0.04);\n vec4 r = roughness * c0 + c1;\n float a004 = min(r.x * r.x, exp2(-9.28 * NdV)) * r.x + r.y;\n return vec2(-1.04, 1.04) * a004 + r.zw;\n}\n\nfloat hash12(vec2 p) {\n vec3 p3 = fract(vec3(p.xyx) * 0.1031);\n p3 += dot(p3, p3.yzx + 33.33);\n return fract((p3.x + p3.y) * p3.z);\n}\n\nvec3 hash32(vec2 p) {\n vec3 p3 = fract(vec3(p.xyx) * vec3(0.1031, 0.1030, 0.0973));\n p3 += dot(p3, p3.yxz + 33.33);\n return fract((p3.xxy + p3.yzz) * p3.zyx);\n}\n\nfloat noise1(float x) {\n float i = floor(x);\n float f = fract(x);\n float a = hash12(vec2(i, 17.0));\n float b = hash12(vec2(i + 1.0, 17.0));\n return mix(a, b, f * f * (3.0 - 2.0 * f));\n}\n\n// Thin-film interference tint (cheap spectral approximation).\nvec3 thinFilm(float cosTheta, float thicknessNm) {\n float n = 1.4;\n float cosT = sqrt(max(0.0, 1.0 - (1.0 - cosTheta * cosTheta) / (n * n)));\n float opd = 2.0 * n * thicknessNm * cosT;\n vec3 phase = 2.0 * PI * opd / vec3(650.0, 532.0, 450.0);\n return 0.5 + 0.5 * cos(phase);\n}\n\nvec3 srgbToLinear(vec3 c) {\n return mix(c / 12.92, pow((c + 0.055) / 1.055, vec3(2.4)), step(0.04045, c));\n}\n\nvec3 linearToSrgb(vec3 c) {\n c = clamp(c, 0.0, 1.0);\n return mix(c * 12.92, 1.055 * pow(c, vec3(1.0 / 2.4)) - 0.055, step(0.0031308, c));\n}\n\n// Khronos PBR Neutral: keeps base colours faithful, rolls off highlights.\nvec3 toneNeutral(vec3 color) {\n const float startCompression = 0.8 - 0.04;\n const float desaturation = 0.15;\n float x = min(color.r, min(color.g, color.b));\n float offset = x < 0.08 ? x - 6.25 * x * x : 0.04;\n color -= offset;\n float peak = max(color.r, max(color.g, color.b));\n if (peak < startCompression) return color;\n const float d = 1.0 - startCompression;\n float newPeak = 1.0 - d * d / (peak + d - startCompression);\n color *= newPeak / peak;\n float g = 1.0 - 1.0 / (desaturation * (peak - newPeak) + 1.0);\n return mix(color, vec3(newPeak), g);\n}\n\nvec3 toneAces(vec3 x) {\n x *= 0.6;\n return clamp((x * (2.51 * x + 0.03)) / (x * (2.43 * x + 0.59) + 0.14), 0.0, 1.0);\n}\n\nvec3 toneAgx(vec3 v) {\n const mat3 m = mat3(0.842479062253094, 0.0423282422610123, 0.0423756549057051,\n 0.0784335999999992, 0.878468636469772, 0.0784336,\n 0.0792237451477643, 0.0791661274605434, 0.879142973793104);\n const mat3 mi = mat3(1.19687900512017, -0.0528968517574562, -0.0529716355144438,\n -0.0980208811401368, 1.15190312990417, -0.0980434501171241,\n -0.0990297440797205, -0.0989611768448433, 1.15107367264116);\n const float minEv = -12.47393;\n const float maxEv = 4.026069;\n v = m * v;\n v = clamp(log2(max(v, 1e-10)), minEv, maxEv);\n v = (v - minEv) / (maxEv - minEv);\n vec3 v2 = v * v;\n vec3 v4 = v2 * v2;\n v = 15.5 * v4 * v2 - 40.14 * v4 * v + 31.96 * v4 - 6.868 * v2 * v + 0.4298 * v2 + 0.1191 * v - 0.00232;\n v = mi * v;\n return pow(max(v, 0.0), vec3(2.2));\n}\n\nvec3 toneMap(vec3 c) {\n if (uToneMap == 0) return toneNeutral(c);\n if (uToneMap == 1) return toneAces(c);\n if (uToneMap == 2) return toneAgx(c);\n return c;\n}\n\nvoid main() {\n vec4 s = texture(uSurface, vUv);\n float sd = s.a;\n // The contour mesh supplies silhouette coverage through MSAA. A second\n // distance-field alpha cut would expose cracks at the front/back seam.\n float alpha = 1.0;\n\n vec4 w = texture(uWeights, vUv);\n w /= max(w.r + w.g + w.b + w.a, 1e-4);\n\n if (uLocked > 0.5) {\n float line = alpha * clamp(w.r + w.a, 0.0, 1.0);\n if (line <= 0.001) discard;\n outColor = vec4(linearToSrgb(uLockedColor) * line, line);\n return;\n }\n\n vec3 nLocal;\n if (uSide > 0.0) {\n float k = uDepth * uMapSize;\n nLocal = normalize(vec3(-s.g * k, s.b * k, 1.0));\n } else {\n // Flat back with the same rounded edge as the front.\n float texel = 1.0 / uMapSize;\n float sx = texture(uSurface, vUv + vec2(texel, 0.0)).a - texture(uSurface, vUv - vec2(texel, 0.0)).a;\n float sy = texture(uSurface, vUv + vec2(0.0, texel)).a - texture(uSurface, vUv - vec2(0.0, texel)).a;\n float t = clamp(sd / uEdgeTexels, 0.0, 1.0);\n float u = 1.0 - t;\n float dp = t < 1.0 ? u / max(sqrt(max(1.0 - u * u, 1e-4)), 0.05) : 0.0;\n float k = uThickness * dp / uEdgeTexels * uMapSize * 0.5;\n nLocal = uSide == 0.0 ? normalize(vec3(-sx, sy, 0.0)) : normalize(vec3(-k * sx, k * sy, -1.0));\n w = vec4(1.0, 0.0, 0.0, 0.0);\n }\n vec3 N = normalize(uNormalMatrix * nLocal);\n vec3 V = normalize(uCamPos - vWorld);\n\n vec4 albedo = texture(uAlbedo, vUv);\n vec3 svg = albedo.rgb; // sRGB texture: already linear\n float cavity = uSide > 0.0 ? albedo.a : 0.0;\n\n vec3 baseColor = vec3(0.0);\n vec4 A = vec4(0.0);\n vec4 B = vec4(0.0);\n vec4 C = vec4(0.0);\n float brushDir = 0.0;\n float brushBest = -1.0;\n for (int i = 0; i < 4; i++) {\n float wi = w[i];\n baseColor += wi * mix(uMatColor[i].rgb, svg, uMatColor[i].a);\n A += wi * uMatA[i];\n B += wi * uMatB[i];\n C += wi * uMatC[i];\n float bw = wi * uMatC[i].x;\n if (bw > brushBest) {\n brushBest = bw;\n brushDir = uMatC[i].y;\n }\n }\n float metalness = clamp(A.x, 0.0, 1.0);\n float roughness = clamp(A.y, 0.02, 1.0);\n float clearcoat = clamp(A.z, 0.0, 1.0);\n float ccRoughness = clamp(A.w, 0.02, 1.0);\n float f0d = B.x;\n float irid = B.y;\n float filmNm = B.z;\n float flakes = B.w;\n float brushed = C.x;\n if (uSide < 0.0) {\n // The back plate gets a lathe-turned finish.\n brushed = max(brushed, 0.55);\n brushDir = 0.0;\n }\n float flakeScale = max(C.z, 1.0);\n float emissive = C.w;\n\n // Brushed metal: streaky normal perturbation along the brushing direction.\n vec3 Nb = N;\n if (brushed > 0.001) {\n vec2 p = vLocal.xy;\n float coord;\n vec2 across;\n if (brushDir < 0.5) { coord = length(p) * 700.0; across = normalize(p + 1e-5); }\n else if (brushDir < 1.5) { coord = atan(p.y, p.x) * 160.0; across = normalize(vec2(-p.y, p.x) + 1e-5); }\n else if (brushDir < 2.5) { coord = p.y * 700.0; across = vec2(0.0, 1.0); }\n else { coord = p.x * 700.0; across = vec2(1.0, 0.0); }\n // Streaks finer than a pixel would alias into moiré; fade them and let roughness carry the look.\n float footprint = fwidth(coord) * uPixelScale;\n float n = (noise1(coord) - 0.5) * clamp(1.4 - footprint * 0.9, 0.0, 1.0)\n + 0.5 * (noise1(coord * 3.7 + 11.0) - 0.5) * clamp(1.4 - footprint * 3.3, 0.0, 1.0);\n Nb = normalize(N + uNormalMatrix * vec3(across * n * 0.22 * brushed, 0.0));\n roughness = mix(roughness, min(1.0, roughness + 0.12), brushed);\n }\n\n float NdV = clamp(dot(Nb, V), 1e-4, 1.0);\n // Resolve normal detail below a pixel into roughness instead of sparkling\n // pinprick highlights. This uses derivatives, with no additional map reads.\n vec3 dx = dFdx(N) * uPixelScale;\n vec3 dy = dFdy(N) * uPixelScale;\n float variance = min(0.15 * (dot(dx, dx) + dot(dy, dy)), 0.025);\n roughness = sqrt(clamp(roughness * roughness + variance, 0.0004, 1.0));\n ccRoughness = sqrt(clamp(ccRoughness * ccRoughness + variance, 0.0004, 1.0));\n\n vec3 F0 = mix(vec3(f0d), baseColor, metalness);\n if (irid > 0.001) {\n vec3 film = thinFilm(NdV, filmNm);\n F0 = mix(F0, mix(film, film * baseColor * 1.6, metalness * 0.5), irid);\n }\n vec2 ab = envBRDF(roughness, NdV);\n vec3 FssEss = F0 * ab.x + ab.y;\n float Ems = 1.0 - (ab.x + ab.y);\n vec3 Favg = F0 + (1.0 - F0) / 21.0;\n vec3 Fms = FssEss * Favg / (1.0 - Ems * Favg);\n vec3 specWeight = FssEss + Fms * Ems;\n\n float ao = 1.0 - uAo * cavity;\n float specAo = mix(1.0, ao, 0.65);\n vec3 R = reflect(-V, Nb);\n vec3 irradiance = envIrr(Nb);\n vec3 diffuse = baseColor * (1.0 - metalness) * (1.0 - specWeight) * irradiance * ao;\n // Multiple scattering is broad, so it follows irradiance rather than the\n // sharp reflected softbox. Reuse the diffuse lookup already in this pass.\n vec3 color = diffuse + envSpec(R, roughness) * FssEss * specAo\n + irradiance * Fms * Ems * ao;\n\n // Metallic flakes: each cell reflects the environment at its own random angle.\n if (flakes > 0.001) {\n vec2 cuv = vUv * flakeScale;\n vec2 cell = floor(cuv);\n vec3 rnd = hash32(cell);\n vec2 f = fract(cuv) - 0.5 - (rnd.xy - 0.5) * 0.4;\n float footprint = max(fwidth(cuv.x), fwidth(cuv.y)) * uPixelScale;\n float edge = max(0.025, footprint * 0.35);\n float mask = (1.0 - smoothstep(0.23 - edge, 0.23 + edge, length(f))) * step(0.3, rnd.z);\n // Unresolved flakes become the average coverage, avoiding crawling pixels.\n float resolved = 1.0 - smoothstep(0.6, 1.8, footprint);\n mask = mix(0.116, mask, resolved);\n vec3 fn = normalize(Nb + uNormalMatrix * vec3((rnd.xy - 0.5) * 1.3 * resolved, 0.0));\n vec3 fr = reflect(-V, fn);\n vec3 flakeColor = envSpec(fr, mix(max(roughness, 0.25), 0.06, resolved)) * mix(vec3(0.85), baseColor, 0.55) * specAo;\n color = mix(color, flakeColor, mask * clamp(flakes, 0.0, 1.0));\n }\n\n // Clear-coat layer (uses the unperturbed normal).\n if (clearcoat > 0.001) {\n float NdVc = clamp(dot(N, V), 1e-4, 1.0);\n float Fc = 0.04 + 0.96 * pow(1.0 - NdVc, 5.0);\n vec2 abc = envBRDF(ccRoughness, NdVc);\n vec3 cc = envSpec(reflect(-V, N), ccRoughness) * (0.04 * abc.x + abc.y);\n float transmission = 1.0 - clearcoat * Fc;\n color = color * transmission * transmission + clearcoat * cc * specAo;\n }\n\n color += baseColor * emissive;\n\n // Optional travelling glint across the face.\n if (uShine > 0.0) {\n float band = dot(vLocal.xy, normalize(vec2(1.0, 0.6))) - (uShine * 2.6 - 1.3);\n color += exp(-band * band * 90.0) * 0.9 * specWeight;\n }\n\n color = toneMap(color * uExposure);\n color = linearToSrgb(color);\n color += (hash12(gl_FragCoord.xy) - 0.5) / 255.0;\n outColor = vec4(color * alpha, alpha);\n}\n`\n\nexport const shadowVertex = /* glsl */ `#version 300 es\nprecision highp float;\nlayout(location = 0) in vec2 aUv;\nuniform mat4 uModel;\nuniform mat4 uViewProj;\nuniform float uZ;\nuniform float uOffset;\nuniform float uSpread;\nout vec2 vUv;\n\nvoid main() {\n vec2 uv = (aUv - 0.5) * uSpread + 0.5;\n vec3 p = vec3(uv.x - 0.5, 0.5 - uv.y, uZ);\n vec4 w = uModel * vec4(p, 1.0);\n w.y -= uOffset;\n vUv = uv;\n gl_Position = uViewProj * w;\n}\n`\n\nexport const shadowFragment = /* glsl */ `#version 300 es\nprecision highp float;\nin vec2 vUv;\nuniform sampler2D uSurface;\nuniform float uOpacity;\nuniform float uBlur;\nout vec4 outColor;\n\nvoid main() {\n float sd = texture(uSurface, clamp(vUv, 0.0, 1.0)).a;\n float a = smoothstep(-uBlur, uBlur * 0.5, sd);\n a = a * a * uOpacity;\n if (a <= 0.002) discard;\n outColor = vec4(0.0, 0.0, 0.0, a);\n}\n`\n","/**\n * WebGL2 renderer. One context is shared by every badge on the page: each\n * badge is drawn into the shared canvas and copied into its own 2D canvas,\n * which sidesteps the browser's limit on live WebGL contexts.\n */\n\nimport type { BakeOutput } from '../bake/bake'\nimport { linearRgb } from '../color'\nimport type { ResolvedEnvironment } from '../environment'\nimport type { ResolvedMaterial } from '../materials'\nimport type { EnvironmentLight, ProceduralEnvironment } from '../types'\nimport { decodeHdr } from './hdr'\nimport { reliefMesh } from './mesh'\nimport { multiply, normalMatrix, perspective, rotation, translation } from './math'\nimport {\n badgeFragment,\n badgeVertex,\n envGenerateFragment,\n fullscreenVertex,\n irradianceFragment,\n MAX_LIGHTS,\n prefilterFragment,\n shadowFragment,\n shadowVertex,\n} from './shaders'\n\nexport interface BadgeTextures {\n surface: WebGLTexture\n albedo: WebGLTexture\n weights: WebGLTexture\n size: number\n heightScale: number\n mesh: WebGLVertexArrayObject\n vertexBuffer: WebGLBuffer\n indexBuffer: WebGLBuffer\n faceCount: number\n sideCount: number\n}\n\nexport interface EnvTextures {\n spec: WebGLTexture\n irr: WebGLTexture\n maxLod: number\n scale: number\n}\n\nexport interface DrawParams {\n width: number\n height: number\n maps: BadgeTextures\n env: EnvTextures\n materials: [ResolvedMaterial, ResolvedMaterial, ResolvedMaterial, ResolvedMaterial]\n pitch: number\n yaw: number\n roll: number\n thickness: number\n edge: number\n ao: number\n exposure: number\n toneMapping: number\n envRotation: number\n locked: boolean\n lockedColor: [number, number, number]\n shadow: number\n shadowBlur: number\n padding: number\n shine: number\n}\n\ntype Uniforms = Record<string, WebGLUniformLocation | null>\n\ninterface EnvEntry {\n refs: number\n promise: Promise<EnvTextures>\n textures?: EnvTextures\n disposeTimer?: ReturnType<typeof setTimeout>\n}\n\n/** A reference to shared environment textures; release it when done. */\nexport interface EnvHandle {\n key: string\n textures: EnvTextures\n}\n\ninterface Program {\n program: WebGLProgram\n u: Uniforms\n}\n\nconst ENV_WIDTH = 512\nconst ENV_LEVELS = 6\nconst IRR_WIDTH = 64\nconst BRUSH_DIRS = { circular: 0, radial: 1, horizontal: 2, vertical: 3 } as const\n\nfunction compile(gl: WebGL2RenderingContext, type: number, source: string): WebGLShader {\n const shader = gl.createShader(type)!\n gl.shaderSource(shader, source)\n gl.compileShader(shader)\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS) && !gl.isContextLost()) {\n const log = gl.getShaderInfoLog(shader)\n gl.deleteShader(shader)\n throw new Error(`badgecraft: shader compile failed\\n${log}`)\n }\n return shader\n}\n\nfunction link(gl: WebGL2RenderingContext, vs: string, fs: string): Program {\n const program = gl.createProgram()!\n const v = compile(gl, gl.VERTEX_SHADER, vs)\n const f = compile(gl, gl.FRAGMENT_SHADER, fs)\n gl.attachShader(program, v)\n gl.attachShader(program, f)\n gl.linkProgram(program)\n gl.deleteShader(v)\n gl.deleteShader(f)\n if (!gl.getProgramParameter(program, gl.LINK_STATUS) && !gl.isContextLost()) {\n throw new Error(`badgecraft: program link failed\\n${gl.getProgramInfoLog(program)}`)\n }\n const u: Uniforms = {}\n const count = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS) as number\n for (let i = 0; i < count; i++) {\n const info = gl.getActiveUniform(program, i)\n if (!info) continue\n const name = info.name.replace(/\\[0\\]$/, '')\n u[name] = gl.getUniformLocation(program, info.name)\n }\n return { program, u }\n}\n\nlet shared: Renderer | null | undefined\n\nexport class Renderer {\n readonly canvas: HTMLCanvasElement\n readonly gl: WebGL2RenderingContext\n /** Incremented whenever the context is restored; GPU resources must be re-created. */\n generation = 0\n private floatTargets = false\n private anisotropy: EXT_texture_filter_anisotropic | null = null\n private maxAnisotropy = 1\n private renderLimit = 2048\n private badgeProgram!: Program\n private shadowProgram!: Program\n private envProgram!: Program\n private prefilterProgram!: Program\n private irrProgram!: Program\n private shadowQuad!: WebGLVertexArrayObject\n private emptyVao!: WebGLVertexArrayObject\n private fbo!: WebGLFramebuffer\n private envCache = new Map<string, EnvEntry>()\n private listeners = new Set<() => void>()\n\n /** The page-wide renderer, or null when WebGL2 is unavailable. */\n static shared(): Renderer | null {\n if (shared === undefined) {\n try {\n shared = new Renderer()\n } catch (error) {\n console.warn(error)\n shared = null\n }\n }\n return shared\n }\n\n constructor() {\n this.canvas = document.createElement('canvas')\n this.canvas.width = 256\n this.canvas.height = 256\n const gl = this.canvas.getContext('webgl2', {\n alpha: true,\n premultipliedAlpha: true,\n antialias: true,\n depth: true,\n stencil: false,\n preserveDrawingBuffer: false,\n })\n if (!gl) throw new Error('badgecraft: WebGL2 is not available')\n this.gl = gl\n this.canvas.addEventListener('webglcontextlost', (e) => e.preventDefault())\n this.canvas.addEventListener('webglcontextrestored', () => {\n this.envCache.clear()\n this.init()\n this.generation++\n this.listeners.forEach((fn) => fn())\n })\n this.init()\n }\n\n /** Called after a lost context has been restored. */\n onRestore(fn: () => void): () => void {\n this.listeners.add(fn)\n return () => this.listeners.delete(fn)\n }\n\n private init(): void {\n const gl = this.gl\n this.renderLimit = Math.min(2048, gl.getParameter(gl.MAX_RENDERBUFFER_SIZE) as number)\n this.floatTargets = !!gl.getExtension('EXT_color_buffer_float')\n this.anisotropy = gl.getExtension('EXT_texture_filter_anisotropic')\n this.maxAnisotropy = this.anisotropy\n ? Math.min(2, gl.getParameter(this.anisotropy.MAX_TEXTURE_MAX_ANISOTROPY_EXT) as number)\n : 1\n gl.getExtension('OES_texture_float_linear')\n this.badgeProgram = link(gl, badgeVertex, badgeFragment)\n this.shadowProgram = link(gl, shadowVertex, shadowFragment)\n this.envProgram = link(gl, fullscreenVertex, envGenerateFragment)\n this.prefilterProgram = link(gl, fullscreenVertex, prefilterFragment)\n this.irrProgram = link(gl, fullscreenVertex, irradianceFragment)\n this.fbo = gl.createFramebuffer()!\n this.emptyVao = gl.createVertexArray()!\n\n // The shadow is planar: perspective-correct UV interpolation is identical\n // across a quad and a subdivided grid. Relief detail lives in the texture.\n const verts = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1])\n const indices = new Uint16Array([0, 2, 1, 1, 2, 3])\n this.shadowQuad = gl.createVertexArray()!\n gl.bindVertexArray(this.shadowQuad)\n const vb = gl.createBuffer()\n gl.bindBuffer(gl.ARRAY_BUFFER, vb)\n gl.bufferData(gl.ARRAY_BUFFER, verts, gl.STATIC_DRAW)\n gl.enableVertexAttribArray(0)\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0)\n const ib = gl.createBuffer()\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, ib)\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW)\n gl.bindVertexArray(null)\n }\n\n get contextLost(): boolean {\n return this.gl.isContextLost()\n }\n\n // ---------------------------------------------------------------- textures\n\n private texture(\n internal: number,\n format: number,\n type: number,\n size: number,\n data: ArrayBufferView,\n mipmaps: boolean,\n ): WebGLTexture {\n const gl = this.gl\n const tex = gl.createTexture()!\n gl.bindTexture(gl.TEXTURE_2D, tex)\n gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1)\n gl.texImage2D(gl.TEXTURE_2D, 0, internal, size, size, 0, format, type, data)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR)\n if (mipmaps) {\n gl.generateMipmap(gl.TEXTURE_2D)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR)\n // Preserve wire and colour detail at oblique angles. Cap the sampling\n // cost; environment maps use their own roughness convolution instead.\n if (this.anisotropy) {\n gl.texParameterf(gl.TEXTURE_2D, this.anisotropy.TEXTURE_MAX_ANISOTROPY_EXT, this.maxAnisotropy)\n }\n } else {\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR)\n }\n return tex\n }\n\n createBadgeTextures(out: BakeOutput): BadgeTextures {\n const gl = this.gl\n const data = reliefMesh(out.surface, out.size)\n const mesh = gl.createVertexArray()!\n const vertexBuffer = gl.createBuffer()!\n const indexBuffer = gl.createBuffer()!\n gl.bindVertexArray(mesh)\n gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer)\n gl.bufferData(gl.ARRAY_BUFFER, data.vertices, gl.STATIC_DRAW)\n gl.enableVertexAttribArray(0)\n gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 12, 0)\n gl.enableVertexAttribArray(1)\n gl.vertexAttribPointer(1, 1, gl.FLOAT, false, 12, 8)\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer)\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, data.indices, gl.STATIC_DRAW)\n gl.bindVertexArray(null)\n return {\n mesh, vertexBuffer, indexBuffer, faceCount: data.faceCount, sideCount: data.indices.length - data.faceCount,\n surface: this.texture(gl.RGBA16F, gl.RGBA, gl.FLOAT, out.size, out.surface, this.floatTargets),\n albedo: this.texture(gl.SRGB8_ALPHA8, gl.RGBA, gl.UNSIGNED_BYTE, out.size, out.albedo, true),\n weights: this.texture(gl.RGBA8, gl.RGBA, gl.UNSIGNED_BYTE, out.size, out.weights, true),\n size: out.size,\n heightScale: out.heightScale,\n }\n }\n\n deleteBadgeTextures(t: BadgeTextures): void {\n const gl = this.gl\n gl.deleteVertexArray(t.mesh)\n gl.deleteBuffer(t.vertexBuffer)\n gl.deleteBuffer(t.indexBuffer)\n gl.deleteTexture(t.surface)\n gl.deleteTexture(t.albedo)\n gl.deleteTexture(t.weights)\n }\n\n // ------------------------------------------------------------- environment\n\n /** Pre-filtered environment textures, shared and reference-counted across badges. */\n async acquireEnvironment(env: ResolvedEnvironment): Promise<EnvHandle> {\n const key = env.key\n let entry = this.envCache.get(key)\n if (!entry) {\n const created: EnvEntry = { refs: 0, promise: this.buildEnvironment(env) }\n created.promise.then(\n (t) => (created.textures = t),\n () => this.envCache.get(key) === created && this.envCache.delete(key),\n )\n this.envCache.set(key, created)\n entry = created\n }\n entry.refs++\n if (entry.disposeTimer) {\n clearTimeout(entry.disposeTimer)\n entry.disposeTimer = undefined\n }\n try {\n return { key, textures: await entry.promise }\n } catch (error) {\n entry.refs--\n throw error\n }\n }\n\n releaseEnvironment(handle: EnvHandle): void {\n const entry = this.envCache.get(handle.key)\n if (!entry || entry.textures !== handle.textures) return\n entry.refs--\n if (entry.refs > 0) return\n // Kept briefly so switching back and forth (e.g. a preset picker) stays instant.\n entry.disposeTimer = setTimeout(() => {\n if (entry.refs > 0 || this.envCache.get(handle.key) !== entry) return\n this.envCache.delete(handle.key)\n if (entry.textures && !this.gl.isContextLost()) {\n this.gl.deleteTexture(entry.textures.spec)\n this.gl.deleteTexture(entry.textures.irr)\n }\n }, 5000)\n }\n\n private envFormat(): { internal: number; type: number; scale: number } {\n const gl = this.gl\n return this.floatTargets\n ? { internal: gl.RGBA16F, type: gl.HALF_FLOAT, scale: 1 }\n : { internal: gl.RGBA8, type: gl.UNSIGNED_BYTE, scale: 8 }\n }\n\n private allocEnvTexture(width: number, height: number, levels: number): WebGLTexture {\n const gl = this.gl\n const { internal } = this.envFormat()\n const tex = gl.createTexture()!\n gl.bindTexture(gl.TEXTURE_2D, tex)\n gl.texStorage2D(gl.TEXTURE_2D, levels, internal, width, height)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, levels > 1 ? gl.LINEAR_MIPMAP_LINEAR : gl.LINEAR)\n return tex\n }\n\n private async buildEnvironment(env: ResolvedEnvironment): Promise<EnvTextures> {\n const gl = this.gl\n const { scale } = this.envFormat()\n const generation = this.generation\n // Fetch/decode before allocating GPU resources: an in-flight download can\n // outlive the context that requested it.\n const image = env.kind === 'image'\n ? await this.loadImageEnvironment(env.spec.url, (env.spec.intensity ?? 1) / scale)\n : null\n if (gl.isContextLost() || generation !== this.generation) {\n throw new Error('badgecraft: environment invalidated by context loss')\n }\n const srcW = ENV_WIDTH * 2\n const srcH = ENV_WIDTH\n const srcLevels = Math.floor(Math.log2(srcW)) + 1\n const src = this.allocEnvTexture(srcW, srcH, srcLevels)\n\n try {\n if (env.kind === 'procedural') {\n this.renderProcedural(src, srcW, srcH, env.spec, scale)\n } else if (image) {\n this.uploadImageEnvironment(src, srcW, srcH, image)\n }\n } catch (error) {\n gl.deleteTexture(src)\n throw error\n }\n gl.bindTexture(gl.TEXTURE_2D, src)\n gl.generateMipmap(gl.TEXTURE_2D)\n\n const spec = this.allocEnvTexture(ENV_WIDTH, ENV_WIDTH / 2, ENV_LEVELS)\n const texelSA = (4 * Math.PI) / (srcW * srcH)\n const pre = this.prefilterProgram\n gl.useProgram(pre.program)\n gl.activeTexture(gl.TEXTURE0)\n gl.bindTexture(gl.TEXTURE_2D, src)\n gl.uniform1i(pre.u.uSrc, 0)\n gl.uniform1f(pre.u.uTexelSolidAngle, texelSA)\n for (let level = 0; level < ENV_LEVELS; level++) {\n const w = ENV_WIDTH >> level\n const h = Math.max(1, (ENV_WIDTH / 2) >> level)\n this.bindTarget(spec, level, w, h)\n gl.uniform2f(pre.u.uSize, w, h)\n gl.uniform1f(pre.u.uRoughness, level / (ENV_LEVELS - 1))\n this.fullscreen()\n }\n\n const irr = this.allocEnvTexture(IRR_WIDTH, IRR_WIDTH / 2, 1)\n const ip = this.irrProgram\n gl.useProgram(ip.program)\n gl.bindTexture(gl.TEXTURE_2D, src)\n gl.uniform1i(ip.u.uSrc, 0)\n gl.uniform1f(ip.u.uTexelSolidAngle, texelSA)\n this.bindTarget(irr, 0, IRR_WIDTH, IRR_WIDTH / 2)\n gl.uniform2f(ip.u.uSize, IRR_WIDTH, IRR_WIDTH / 2)\n this.fullscreen()\n\n gl.bindFramebuffer(gl.FRAMEBUFFER, null)\n gl.deleteTexture(src)\n return { spec, irr, maxLod: ENV_LEVELS - 1, scale }\n }\n\n private bindTarget(tex: WebGLTexture, level: number, w: number, h: number): void {\n const gl = this.gl\n gl.bindFramebuffer(gl.FRAMEBUFFER, this.fbo)\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tex, level)\n gl.viewport(0, 0, w, h)\n gl.disable(gl.BLEND)\n gl.disable(gl.DEPTH_TEST)\n gl.disable(gl.CULL_FACE)\n gl.disable(gl.SCISSOR_TEST)\n }\n\n private fullscreen(): void {\n const gl = this.gl\n gl.bindVertexArray(this.emptyVao)\n gl.drawArrays(gl.TRIANGLES, 0, 3)\n gl.bindVertexArray(null)\n }\n\n private renderProcedural(\n target: WebGLTexture,\n w: number,\n h: number,\n spec: ProceduralEnvironment,\n scale: number,\n ): void {\n const gl = this.gl\n const p = this.envProgram\n const intensity = spec.intensity ?? 1\n const lights = (spec.lights ?? []).slice(0, MAX_LIGHTS)\n const dirs = new Float32Array(MAX_LIGHTS * 3)\n const colors = new Float32Array(MAX_LIGHTS * 3)\n const shapes = new Float32Array(MAX_LIGHTS * 4)\n lights.forEach((l: EnvironmentLight, i) => {\n const az = (l.azimuth * Math.PI) / 180\n const el = (l.elevation * Math.PI) / 180\n dirs.set([Math.sin(az) * Math.cos(el), Math.sin(el), Math.cos(az) * Math.cos(el)], i * 3)\n const c = linearRgb(l.color ?? '#ffffff')\n const k = (l.intensity ?? 1) * intensity\n colors.set([c[0] * k, c[1] * k, c[2] * k], i * 3)\n const size = l.size ?? 30\n const [sw, sh] = Array.isArray(size) ? size : [size, size]\n const t = (deg: number) => Math.tan((Math.min(deg, 170) * Math.PI) / 360)\n shapes.set([t(sw), t(sh), l.softness ?? 0.5, l.shape === 'circle' ? 1 : 0], i * 4)\n })\n const top = linearRgb(spec.top ?? '#555555').map((v) => v * intensity)\n const horizon = linearRgb(spec.horizon ?? '#222222').map((v) => v * intensity)\n const bottom = linearRgb(spec.bottom ?? '#080808').map((v) => v * intensity)\n\n gl.useProgram(p.program)\n this.bindTarget(target, 0, w, h)\n gl.uniform2f(p.u.uSize, w, h)\n gl.uniform3fv(p.u.uTop, top)\n gl.uniform3fv(p.u.uHorizon, horizon)\n gl.uniform3fv(p.u.uBottom, bottom)\n gl.uniform1i(p.u.uLightCount, lights.length)\n gl.uniform3fv(p.u.uLightDir, dirs)\n gl.uniform3fv(p.u.uLightColor, colors)\n gl.uniform4fv(p.u.uLightShape, shapes)\n gl.uniform1f(p.u.uScale, 1 / scale)\n this.fullscreen()\n }\n\n private async loadImageEnvironment(\n url: string,\n intensity: number,\n ): Promise<{ width: number; height: number; data: Float32Array }> {\n let width: number\n let height: number\n let data: Float32Array\n if (/\\.hdr(\\?|#|$)/i.test(url)) {\n const res = await fetch(url)\n if (!res.ok) throw new Error(`badgecraft: failed to load environment ${url}`)\n ;({ width, height, data } = decodeHdr(await res.arrayBuffer()))\n } else {\n const img = new Image()\n img.crossOrigin = 'anonymous'\n img.src = url\n await img.decode()\n const scale = Math.min(1, 2048 / Math.max(img.naturalWidth, img.naturalHeight))\n width = Math.max(1, Math.round(img.naturalWidth * scale))\n height = Math.max(1, Math.round(img.naturalHeight * scale))\n const c = document.createElement('canvas')\n c.width = width\n c.height = height\n const ctx = c.getContext('2d')!\n ctx.drawImage(img, 0, 0, width, height)\n const px = ctx.getImageData(0, 0, width, height).data\n data = new Float32Array(width * height * 4)\n const lut = new Float32Array(256)\n for (let i = 0; i < 256; i++) {\n const v = i / 255\n lut[i] = v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4)\n }\n for (let i = 0; i < width * height; i++) {\n data[i * 4] = lut[px[i * 4]]\n data[i * 4 + 1] = lut[px[i * 4 + 1]]\n data[i * 4 + 2] = lut[px[i * 4 + 2]]\n data[i * 4 + 3] = 1\n }\n }\n for (let i = 0; i < data.length; i++) if ((i & 3) !== 3) data[i] *= intensity\n return { width, height, data }\n }\n\n private uploadImageEnvironment(\n target: WebGLTexture,\n w: number,\n h: number,\n image: { width: number; height: number; data: Float32Array },\n ): void {\n const gl = this.gl\n const { width, height, data } = image\n const limit = gl.getParameter(gl.MAX_TEXTURE_SIZE) as number\n if (width > limit || height > limit) {\n throw new Error(`badgecraft: environment dimensions exceed the GPU texture limit (${limit}px)`)\n }\n // Upload at native size, then resample into the environment's base level.\n const tmp = gl.createTexture()!\n gl.bindTexture(gl.TEXTURE_2D, tmp)\n gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1)\n const floatLinear = !!gl.getExtension('OES_texture_float_linear')\n gl.texImage2D(gl.TEXTURE_2D, 0, floatLinear ? gl.RGBA32F : gl.RGBA16F, width, height, 0, gl.RGBA, gl.FLOAT, data)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT)\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)\n const pre = this.prefilterProgram\n gl.useProgram(pre.program)\n gl.activeTexture(gl.TEXTURE0)\n gl.uniform1i(pre.u.uSrc, 0)\n gl.uniform1f(pre.u.uRoughness, 0)\n gl.uniform1f(pre.u.uTexelSolidAngle, (4 * Math.PI) / (width * height))\n this.bindTarget(target, 0, w, h)\n gl.bindTexture(gl.TEXTURE_2D, tmp)\n gl.uniform2f(pre.u.uSize, w, h)\n this.fullscreen()\n gl.deleteTexture(tmp)\n }\n\n // ------------------------------------------------------------------ drawing\n\n private ensureSize(w: number, h: number): void {\n const c = this.canvas\n if (c.width >= w && c.height >= h) return\n c.width = Math.max(c.width, Math.ceil(w / 128) * 128)\n c.height = Math.max(c.height, Math.ceil(h / 128) * 128)\n }\n\n /** Draw a badge and copy the result into `target`. */\n draw(p: DrawParams, target: CanvasRenderingContext2D): void {\n const gl = this.gl\n if (gl.isContextLost()) return\n // MSAA only covers triangle edges. Shade four samples per output pixel\n // as well, then resolve to the public canvas to smooth wires/reflections.\n // Bound the shared backing store for large exports and high-DPI canvases.\n const sampleScale = Math.max(1, Math.min(2, this.renderLimit / Math.max(p.width, p.height)))\n const w = Math.round(p.width * sampleScale)\n const h = Math.round(p.height * sampleScale)\n this.ensureSize(w, h)\n\n gl.bindFramebuffer(gl.FRAMEBUFFER, null)\n gl.viewport(0, 0, w, h)\n gl.enable(gl.SCISSOR_TEST)\n gl.scissor(0, 0, w, h)\n gl.clearColor(0, 0, 0, 0)\n gl.clearDepth(1)\n gl.depthMask(true)\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT)\n gl.enable(gl.BLEND)\n gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA)\n gl.enable(gl.DEPTH_TEST)\n gl.depthFunc(gl.LEQUAL)\n\n // Camera framing: the badge square fills the canvas minus padding.\n const fov = (22 * Math.PI) / 180\n const aspect = w / h\n const extent = 0.5 / (1 - 2 * Math.min(0.4, Math.max(0, p.padding)))\n const fit = aspect >= 1 ? extent : extent / aspect\n const dist = fit / Math.tan(fov / 2)\n const proj = perspective(fov, aspect, Math.max(0.05, dist - 2), dist + 2)\n const viewProj = multiply(proj, translation(0, 0, -dist))\n const model = rotation(p.pitch, p.yaw, p.roll)\n const nMat = normalMatrix(model)\n const depth = p.locked ? 0 : p.maps.heightScale\n const thickness = p.locked ? 0 : p.thickness\n const edgeTexels = Math.max(1, p.edge * p.maps.size)\n\n gl.activeTexture(gl.TEXTURE0)\n gl.bindTexture(gl.TEXTURE_2D, p.maps.surface)\n\n if (p.shadow > 0 && !p.locked) {\n const s = this.shadowProgram\n gl.useProgram(s.program)\n gl.depthMask(false)\n gl.disable(gl.CULL_FACE)\n gl.uniformMatrix4fv(s.u.uModel, false, model)\n gl.uniformMatrix4fv(s.u.uViewProj, false, viewProj)\n gl.uniform1i(s.u.uSurface, 0)\n gl.uniform1f(s.u.uZ, -thickness - 0.01)\n gl.uniform1f(s.u.uOffset, 0.018)\n gl.uniform1f(s.u.uSpread, 1)\n gl.uniform1f(s.u.uOpacity, p.shadow)\n gl.uniform1f(s.u.uBlur, p.shadowBlur * p.maps.size)\n gl.bindVertexArray(this.shadowQuad)\n gl.drawElements(gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0)\n gl.depthMask(true)\n }\n\n const b = this.badgeProgram\n gl.useProgram(b.program)\n gl.activeTexture(gl.TEXTURE1)\n gl.bindTexture(gl.TEXTURE_2D, p.maps.albedo)\n gl.activeTexture(gl.TEXTURE2)\n gl.bindTexture(gl.TEXTURE_2D, p.maps.weights)\n gl.activeTexture(gl.TEXTURE3)\n gl.bindTexture(gl.TEXTURE_2D, p.env.spec)\n gl.activeTexture(gl.TEXTURE4)\n gl.bindTexture(gl.TEXTURE_2D, p.env.irr)\n gl.uniform1i(b.u.uSurface, 0)\n gl.uniform1i(b.u.uAlbedo, 1)\n gl.uniform1i(b.u.uWeights, 2)\n gl.uniform1i(b.u.uEnvSpec, 3)\n gl.uniform1i(b.u.uEnvIrr, 4)\n gl.uniform1f(b.u.uEnvMaxLod, p.env.maxLod)\n gl.uniform1f(b.u.uEnvScale, p.env.scale)\n gl.uniform1f(b.u.uEnvRotation, p.envRotation / (2 * Math.PI))\n gl.uniformMatrix4fv(b.u.uModel, false, model)\n gl.uniformMatrix4fv(b.u.uViewProj, false, viewProj)\n gl.uniformMatrix3fv(b.u.uNormalMatrix, false, nMat)\n gl.uniform3f(b.u.uCamPos, 0, 0, dist)\n gl.uniform1f(b.u.uMapSize, p.maps.size)\n gl.uniform1f(b.u.uPixelScale, sampleScale)\n gl.uniform1f(b.u.uDepth, depth)\n gl.uniform1f(b.u.uThickness, thickness)\n gl.uniform1f(b.u.uEdgeTexels, edgeTexels)\n gl.uniform1f(b.u.uAo, p.ao)\n gl.uniform1f(b.u.uExposure, p.exposure)\n gl.uniform1i(b.u.uToneMap, p.toneMapping)\n gl.uniform1f(b.u.uLocked, p.locked ? 1 : 0)\n gl.uniform3fv(b.u.uLockedColor, p.lockedColor)\n gl.uniform1f(b.u.uShine, p.shine)\n this.setMaterials(b.u, p.materials)\n\n gl.enable(gl.CULL_FACE)\n gl.cullFace(gl.BACK)\n gl.bindVertexArray(p.maps.mesh)\n if (!p.locked) {\n gl.frontFace(gl.CW)\n gl.uniform1f(b.u.uSide, -1)\n gl.drawElements(gl.TRIANGLES, p.maps.faceCount, gl.UNSIGNED_INT, 0)\n }\n gl.frontFace(gl.CCW)\n gl.uniform1f(b.u.uSide, 1)\n gl.drawElements(gl.TRIANGLES, p.maps.faceCount, gl.UNSIGNED_INT, 0)\n if (!p.locked && p.maps.sideCount > 0) {\n gl.uniform1f(b.u.uSide, 0)\n gl.drawElements(gl.TRIANGLES, p.maps.sideCount, gl.UNSIGNED_INT, p.maps.faceCount * 4)\n }\n gl.bindVertexArray(null)\n gl.disable(gl.SCISSOR_TEST)\n\n target.clearRect(0, 0, target.canvas.width, target.canvas.height)\n target.imageSmoothingEnabled = true\n target.imageSmoothingQuality = 'high'\n target.drawImage(this.canvas, 0, this.canvas.height - h, w, h, 0, 0, target.canvas.width, target.canvas.height)\n }\n\n private setMaterials(u: Uniforms, mats: DrawParams['materials']): void {\n const gl = this.gl\n const color = new Float32Array(16)\n const a = new Float32Array(16)\n const b = new Float32Array(16)\n const c = new Float32Array(16)\n mats.forEach((m, i) => {\n const lin = linearRgb(m.color)\n color.set([lin[0], lin[1], lin[2], m.useSvgColor ? 1 : 0], i * 4)\n a.set([m.metalness, m.roughness, m.clearcoat, m.clearcoatRoughness], i * 4)\n const f0 = ((m.ior - 1) / (m.ior + 1)) ** 2\n // A dielectric beneath lacquer (IOR 1.5) has less index contrast than\n // against air. Compute per material, not for every shaded pixel.\n const coatedF0 = ((m.ior - 1.5) / (m.ior + 1.5)) ** 2\n const coat = Math.min(1, Math.max(0, m.clearcoat))\n b.set([f0 + (coatedF0 - f0) * coat, m.iridescence, m.iridescenceThickness, m.flakes], i * 4)\n c.set([m.brushed, BRUSH_DIRS[m.brushDirection] ?? 0, m.flakeScale, m.emissive], i * 4)\n })\n gl.uniform4fv(u.uMatColor, color)\n gl.uniform4fv(u.uMatA, a)\n gl.uniform4fv(u.uMatB, b)\n gl.uniform4fv(u.uMatC, c)\n }\n}\n","/** One requestAnimationFrame loop for every badge on the page. */\nexport interface FrameTask {\n /** Advance by `dt` seconds. Return true to keep receiving frames. */\n frame(dt: number, now: number): boolean\n}\n\nconst active = new Set<FrameTask>()\n// Tasks that asked for another frame while being ticked (e.g. `spin()` from an onReady handler).\nconst rescheduled = new Set<FrameTask>()\nlet raf = 0\nlet last = 0\nlet ticking = false\n\nfunction tick(now: number): void {\n raf = 0\n ticking = true\n const dt = last ? Math.min(0.05, (now - last) / 1000) : 1 / 60\n last = now\n rescheduled.clear()\n for (const task of [...active]) {\n let keep = false\n try {\n keep = task.frame(dt, now)\n } catch (error) {\n console.error(error)\n }\n if (!keep && !rescheduled.has(task)) active.delete(task)\n }\n rescheduled.clear()\n ticking = false\n if (active.size > 0) raf = requestAnimationFrame(tick)\n else last = 0\n}\n\nexport function schedule(task: FrameTask): void {\n active.add(task)\n if (ticking) {\n rescheduled.add(task)\n return\n }\n if (!raf && typeof requestAnimationFrame !== 'undefined') raf = requestAnimationFrame(tick)\n}\n\nexport function unschedule(task: FrameTask): void {\n active.delete(task)\n rescheduled.delete(task)\n}\n","const fetched = new Map<string, Promise<string>>()\n\n/** Resolve markup, a data URL, a URL or an element into SVG markup. */\nexport async function loadSvgSource(input: string | SVGElement): Promise<string> {\n if (typeof input !== 'string') return Promise.resolve(new XMLSerializer().serializeToString(input))\n const s = input.trim()\n if (!s) throw new Error('badgecraft: SVG source is empty')\n if (s.startsWith('<')) return Promise.resolve(s)\n if (s.startsWith('data:')) {\n const comma = s.indexOf(',')\n if (comma < 0) throw new Error('badgecraft: invalid SVG data URL')\n const meta = s.slice(0, comma)\n const body = s.slice(comma + 1)\n return Promise.resolve(meta.includes(';base64') ? decodeURIComponent(escape(atob(body))) : decodeURIComponent(body))\n }\n const key = new URL(s, document.baseURI).href\n let pending = fetched.get(key)\n if (pending) {\n // Refresh recency for the LRU.\n fetched.delete(key)\n fetched.set(key, pending)\n return pending\n }\n const job = fetch(key).then((res) => {\n if (!res.ok) throw new Error(`badgecraft: failed to load SVG from ${s} (${res.status})`)\n return res.text()\n })\n job.catch(() => fetched.get(key) === job && fetched.delete(key))\n fetched.set(key, job)\n while (fetched.size > 32) fetched.delete(fetched.keys().next().value!)\n return job\n}\n","import { linearRgb } from './color'\nimport { resolveOptions, type Resolved } from './options'\nimport { acquireMaps, bakeSvg, mapsKey, releaseMaps, type MapsHandle } from './pipeline'\nimport { Renderer, type EnvHandle } from './render/renderer'\nimport { schedule, unschedule, type FrameTask } from './scheduler'\nimport { loadSvgSource } from './svg/load'\nimport { parseSvg } from './svg/prepare'\nimport type { BadgeOptions, BadgecraftHandle } from './types'\nimport { clamp } from './util'\n\nconst MAX_PIXELS = 2048\n\ninterface Spring {\n x: number\n v: number\n target: number\n}\n\nfunction stepSpring(s: Spring, dt: number, stiffness: number, damping: number): boolean {\n // Semi-implicit Euler in small sub-steps for stability.\n const steps = Math.ceil(dt / (1 / 240))\n const h = dt / steps\n for (let i = 0; i < steps; i++) {\n const a = stiffness * (s.target - s.x) - damping * s.v\n s.v += a * h\n s.x += s.v * h\n }\n if (Math.abs(s.target - s.x) < 0.02 && Math.abs(s.v) < 0.2) {\n s.x = s.target\n s.v = 0\n return false\n }\n return true\n}\n\nconst prefersReducedMotion = () =>\n typeof matchMedia !== 'undefined' && matchMedia('(prefers-reduced-motion: reduce)').matches\n\n/**\n * A badge rendered into `host`. Framework wrappers (React, Vue, the\n * custom element) are thin layers over this class.\n */\nexport class Badgecraft implements BadgecraftHandle, FrameTask {\n readonly host: HTMLElement\n readonly canvas: HTMLCanvasElement\n /** Resolves once the badge has been baked and drawn; rejects if that fails. */\n readonly ready: Promise<void>\n\n private ctx: CanvasRenderingContext2D\n private options: BadgeOptions\n private resolved: Resolved\n private renderer: Renderer | null\n private maps: MapsHandle | null = null\n private mapSize = 0\n private pendingSize = 0\n private env: EnvHandle | null = null\n private fallbackImage: HTMLImageElement | null = null\n private bakeToken = 0\n private envToken = 0\n private visible = true\n private destroyed = false\n private dirty = true\n private isReady = false\n private resolveReady!: () => void\n private rejectReady!: (error: Error) => void\n private cleanups: (() => void)[] = []\n\n // Motion state, in degrees.\n private pitch: Spring = { x: 0, v: 0, target: 0 }\n private yaw: Spring = { x: 0, v: 0, target: 0 }\n private hover: { x: number; y: number } | null = null\n private drag: { id: number; x: number; y: number; yaw: number; pitch: number; t: number; vx: number } | null = null\n private coasting = false\n private spinning = false\n private time = 0\n private shine = 0\n private shineStart = -1\n\n constructor(host: HTMLElement, options: BadgeOptions) {\n this.host = host\n this.options = { ...options }\n this.resolved = resolveOptions(this.options)\n this.ready = new Promise((resolve, reject) => {\n this.resolveReady = resolve\n this.rejectReady = reject\n })\n // Failures are reported through onError; don't also surface an unhandled rejection.\n this.ready.catch(() => {})\n\n this.canvas = document.createElement('canvas')\n this.canvas.setAttribute('aria-hidden', 'true')\n this.canvas.style.cssText = 'display:block;width:100%;height:100%;'\n // Zero until the first layout so nothing is baked at a guessed size.\n this.canvas.width = 0\n this.canvas.height = 0\n host.appendChild(this.canvas)\n if (!host.hasAttribute('role')) host.setAttribute('role', 'img')\n this.ensureHostSize()\n const ctx = this.canvas.getContext('2d')\n if (!ctx) {\n this.canvas.remove()\n throw new Error('badgecraft: 2D canvas unavailable')\n }\n this.ctx = ctx\n\n this.renderer = Renderer.shared()\n if (this.renderer) {\n this.cleanups.push(this.renderer.onRestore(() => this.handleContextRestore()))\n }\n\n this.observe()\n this.bindPointer()\n this.applyInteractionStyle()\n this.loadEnvironment()\n }\n\n private ensureHostSize(): void {\n const host = this.host\n // Give an unsized host a sensible default. Skip hosts that aren't rendered yet\n // (display:none, hidden tabs): their stylesheet size will apply once shown.\n if (host.getClientRects().length > 0) {\n const style = getComputedStyle(host)\n if (host.clientHeight === 0 && !style.aspectRatio.includes('/')) host.style.aspectRatio = '1 / 1'\n if (host.clientWidth === 0 && style.display === 'inline') host.style.display = 'inline-block'\n if (host.clientWidth === 0 && !host.style.width) host.style.width = '160px'\n }\n }\n\n // ------------------------------------------------------------------ public\n\n /** Merge new options. Only what changed is recomputed. */\n update(partial: Partial<BadgeOptions>): void {\n this.setOptions({ ...this.options, ...partial })\n }\n\n /** Replace all options. */\n setOptions(options: BadgeOptions): void {\n if (this.destroyed) return\n const prev = this.resolved\n const prevSvg = this.options.svg\n this.options = { ...options }\n this.resolved = resolveOptions(this.options)\n const next = this.resolved\n const needsLargerMaps = next.quality === 'auto' && next.render.padding !== prev.render.padding && this.targetMapSize() > this.mapSize * 1.25\n if (next.bakeKey !== prev.bakeKey || this.options.svg !== prevSvg || next.quality !== prev.quality || needsLargerMaps) {\n this.rebuild()\n }\n if (next.render.environment.key !== prev.render.environment.key) this.loadEnvironment()\n if (next.render.interaction !== prev.render.interaction || next.render.locked !== prev.render.locked) {\n this.stopMotion()\n this.applyInteractionStyle()\n }\n if (next.renderKey !== prev.renderKey) this.invalidate()\n }\n\n spin(turns = 1): void {\n if (this.destroyed || this.resolved.render.locked || !Number.isFinite(turns * 360) || prefersReducedMotion()) return\n this.spinning = true\n this.coasting = false\n this.yaw.target = Math.round(this.yaw.x / 360) * 360 + 360 * turns\n this.pitch.target = 0\n this.invalidate()\n }\n\n /** Sweep a highlight across the badge once. */\n glint(): void {\n if (this.destroyed || this.resolved.render.locked || prefersReducedMotion()) return\n this.shineStart = this.time\n this.invalidate()\n }\n\n toDataURL(type = 'image/png', quality?: number): string {\n this.renderNow()\n return this.canvas.toDataURL(type, quality)\n }\n\n toBlob(type = 'image/png', quality?: number): Promise<Blob | null> {\n this.renderNow()\n return new Promise((resolve) => this.canvas.toBlob(resolve, type, quality))\n }\n\n destroy(): void {\n if (this.destroyed) return\n this.destroyed = true\n this.bakeToken++\n this.envToken++\n if (!this.isReady) this.rejectReady(new DOMException('badgecraft: destroyed before ready', 'AbortError'))\n unschedule(this)\n this.cleanups.forEach((fn) => fn())\n if (this.maps && this.renderer) releaseMaps(this.renderer, this.maps)\n if (this.env && this.renderer) this.renderer.releaseEnvironment(this.env)\n this.maps = null\n this.env = null\n this.fallbackImage = null\n this.canvas.remove()\n }\n\n // --------------------------------------------------------------- lifecycle\n\n private observe(): void {\n const ro = new ResizeObserver((entries) => {\n const entry = entries[entries.length - 1]\n const box = entry.devicePixelContentBoxSize?.[0]\n const dpr = window.devicePixelRatio || 1\n const w = box ? box.inlineSize : Math.round(entry.contentRect.width * dpr)\n const h = box ? box.blockSize : Math.round(entry.contentRect.height * dpr)\n this.resize(w, h)\n })\n try {\n ro.observe(this.canvas, { box: 'device-pixel-content-box' })\n } catch {\n ro.observe(this.canvas)\n }\n this.cleanups.push(() => ro.disconnect())\n\n if (typeof IntersectionObserver !== 'undefined') {\n const io = new IntersectionObserver(\n (entries) => {\n this.visible = entries[entries.length - 1].isIntersecting\n // Resume idle animations when scrolled back into view.\n if (this.visible) this.invalidate()\n },\n { rootMargin: '200px' },\n )\n io.observe(this.canvas)\n this.cleanups.push(() => io.disconnect())\n }\n }\n\n private resize(w: number, h: number): void {\n if (w <= 0 || h <= 0) {\n // Size defaults can change layout. Apply them outside ResizeObserver\n // delivery to avoid a feedback-loop error on newly attached hosts.\n if (this.host.getClientRects().length > 0) {\n requestAnimationFrame(() => { if (!this.destroyed) this.ensureHostSize() })\n }\n return\n }\n const scale = Math.min(1, MAX_PIXELS / Math.max(w, h))\n w = Math.max(1, Math.round(w * scale))\n h = Math.max(1, Math.round(h * scale))\n if (this.canvas.width !== w || this.canvas.height !== h) {\n this.canvas.width = w\n this.canvas.height = h\n this.dirty = true\n }\n const wanted = this.targetMapSize()\n const grow = !this.maps || wanted > this.mapSize * 1.25\n if (grow && wanted !== this.pendingSize && this.renderer) this.rebuild()\n else if (!this.renderer && !this.fallbackImage) this.rebuild()\n // Draw synchronously so a resize never shows an empty frame.\n if (this.renderer) this.renderNow()\n else this.paintFallback()\n }\n\n private targetMapSize(): number {\n const q = this.resolved.quality\n if (q !== 'auto') return q\n const px = Math.max(this.canvas.width, this.canvas.height) * (1 - 2 * this.resolved.render.padding)\n return clamp(Math.ceil((px * 1.2) / 64) * 64, 256, 1024)\n }\n\n private async rebuild(): Promise<void> {\n const token = ++this.bakeToken\n if (this.canvas.width <= 0 && this.resolved.quality === 'auto') return\n const size = this.targetMapSize()\n this.pendingSize = size\n try {\n const source = await loadSvgSource(this.options.svg)\n if (token !== this.bakeToken || this.destroyed) return\n if (!this.renderer) {\n const image = await this.loadFallback(source)\n if (token !== this.bakeToken || this.destroyed) return\n this.fallbackImage = image\n this.paintFallback()\n this.markReady()\n return\n }\n const { bake, bakeKey } = this.resolved\n const key = mapsKey(source, bakeKey, size)\n if (this.maps?.key === key) return\n const handle = await acquireMaps(this.renderer, key, () => bakeSvg(source, bake, size))\n if (token !== this.bakeToken || this.destroyed) {\n releaseMaps(this.renderer, handle)\n return\n }\n if (this.maps) releaseMaps(this.renderer, this.maps)\n this.maps = handle\n this.mapSize = size\n this.invalidate()\n } catch (error) {\n if (token === this.bakeToken) this.fail(error)\n } finally {\n if (token === this.bakeToken) this.pendingSize = 0\n }\n }\n\n private async loadEnvironment(): Promise<void> {\n if (!this.renderer) return\n const token = ++this.envToken\n const env = this.resolved.render.environment\n try {\n const handle = await this.renderer.acquireEnvironment(env)\n if (token !== this.envToken || this.destroyed) {\n this.renderer.releaseEnvironment(handle)\n return\n }\n if (this.env) this.renderer.releaseEnvironment(this.env)\n this.env = handle\n this.invalidate()\n } catch (error) {\n if (token === this.envToken && !this.renderer.contextLost) this.fail(error)\n }\n }\n\n private handleContextRestore(): void {\n if (this.destroyed) return\n this.maps = null\n this.env = null\n this.mapSize = 0\n this.loadEnvironment()\n this.rebuild()\n }\n\n private fail(error: unknown): void {\n if (this.destroyed) return\n const err = error instanceof Error ? error : new Error(String(error))\n if (!this.isReady) this.rejectReady(err)\n if (this.options.onError) this.options.onError(err)\n else console.error(err)\n }\n\n private markReady(): void {\n if (this.isReady) return\n this.isReady = true\n this.resolveReady()\n this.options.onReady?.()\n }\n\n /** Without WebGL2, show the flat artwork. */\n private async loadFallback(source: string): Promise<HTMLImageElement> {\n const root = parseSvg(source)\n if (!root.hasAttribute('color')) root.setAttribute('color', this.resolved.bake.color)\n source = new XMLSerializer().serializeToString(root)\n // The finally block revokes this URL on both successful and failed image decoding.\n // react-doctor-disable-next-line react-doctor/no-create-object-url-without-revoke\n const url = URL.createObjectURL(new Blob([source], { type: 'image/svg+xml' }))\n try {\n const img = new Image()\n img.src = url\n await img.decode()\n return img\n } finally {\n URL.revokeObjectURL(url)\n }\n }\n\n private paintFallback(): void {\n const img = this.fallbackImage\n if (!img) return\n const { width, height } = this.canvas\n this.ctx.clearRect(0, 0, width, height)\n const s = Math.min(width, height) * (1 - 2 * this.resolved.render.padding)\n const scale = s / Math.max(img.naturalWidth, img.naturalHeight)\n const w = img.naturalWidth * scale\n const h = img.naturalHeight * scale\n this.ctx.drawImage(img, (width - w) / 2, (height - h) / 2, w, h)\n }\n\n // ---------------------------------------------------------------- drawing\n\n private invalidate(): void {\n this.dirty = true\n if (!this.destroyed) schedule(this)\n }\n\n private renderNow(): void {\n const r = this.renderer\n if (!r || !this.maps || !this.env || this.destroyed || r.contextLost) return\n if (this.canvas.width <= 0) return\n const s = this.resolved.render\n const rad = Math.PI / 180\n r.draw(\n {\n width: this.canvas.width,\n height: this.canvas.height,\n maps: this.maps.textures,\n env: this.env.textures,\n materials: s.materials,\n pitch: (this.pitch.x + (s.locked ? 0 : s.pose.pitch)) * rad,\n yaw: (this.yaw.x + (s.locked ? 0 : s.pose.yaw)) * rad,\n roll: (s.locked ? 0 : s.pose.roll) * rad,\n thickness: s.thickness,\n edge: s.edge,\n ao: s.ao,\n exposure: s.exposure,\n toneMapping: s.toneMapping,\n envRotation: s.envRotation,\n locked: s.locked,\n lockedColor: linearRgb(s.lockedColor),\n shadow: s.shadow,\n shadowBlur: 0.022,\n padding: s.padding,\n shine: this.shine,\n },\n this.ctx,\n )\n this.dirty = false\n this.markReady()\n }\n\n /** Scheduler callback: advance motion, redraw if needed. */\n frame(dt: number): boolean {\n if (this.destroyed) return false\n this.time += dt\n const s = this.resolved.render\n const reduced = prefersReducedMotion()\n let moving = false\n const before = this.pitch.x + this.yaw.x * 1e3 + this.shine * 1e7\n\n // Targets from interaction and idle animation.\n if (!this.drag && !this.spinning && !this.coasting) {\n let tp = 0\n let ty = 0\n if (this.hover && s.interaction === 'tilt' && !s.locked) {\n const max = reduced ? s.tiltMax * 0.4 : s.tiltMax\n tp = this.hover.y * max\n ty = this.hover.x * max\n } else if (s.idle === 'float' && !reduced && !s.locked) {\n tp = Math.sin(this.time * 0.9) * 4\n ty = Math.sin(this.time * 0.6 + 1.3) * 7\n moving = true\n }\n this.pitch.target = tp\n this.yaw.target = Math.round(this.yaw.x / 360) * 360 + ty\n }\n\n if (this.drag) {\n moving = true\n } else if (this.coasting) {\n this.yaw.x += this.yaw.v * dt\n this.yaw.v *= Math.exp(-dt * 1.6)\n stepSpring(this.pitch, dt, 120, 18)\n if (Math.abs(this.yaw.v) < 120) {\n // Hand over to the soft spin spring to settle face-forward.\n this.coasting = false\n this.spinning = true\n this.yaw.target = Math.round(this.yaw.x / 360) * 360\n }\n moving = true\n } else {\n const k = this.spinning ? 26 : 140\n const c = this.spinning ? 2 * Math.sqrt(k) * 0.82 : 2 * Math.sqrt(k) * 0.72\n const a = stepSpring(this.pitch, dt, k, c)\n const b = stepSpring(this.yaw, dt, k, c)\n if (!a && !b && this.spinning) {\n this.spinning = false\n this.yaw.x = this.yaw.target = ((this.yaw.x % 360) + 360) % 360\n }\n moving = moving || a || b\n }\n\n // Travelling glint.\n if (s.idle === 'shine' && !reduced && !s.locked && this.shineStart < 0) {\n if (this.time % 5 < dt) this.shineStart = this.time\n moving = true\n }\n if (this.shineStart >= 0) {\n const t = (this.time - this.shineStart) / 1.3\n this.shine = t >= 1 ? 0 : Math.max(0.0001, t)\n if (t >= 1) this.shineStart = -1\n moving = true\n }\n\n // Redraw whenever the pose changed, including the frame a spring snaps to rest.\n if (this.pitch.x + this.yaw.x * 1e3 + this.shine * 1e7 !== before) this.dirty = true\n // Static redraws happen even off-screen (cheap, and nothing is blank when scrolled to);\n // continuous animation only runs while visible.\n if (this.dirty) {\n if (this.renderer) this.renderNow()\n else {\n this.paintFallback()\n this.dirty = false\n }\n }\n return moving && this.visible\n }\n\n // ------------------------------------------------------------ interaction\n\n private stopMotion(): void {\n const id = this.drag?.id\n this.drag = null\n if (id !== undefined && this.canvas.hasPointerCapture(id)) this.canvas.releasePointerCapture(id)\n this.hover = null\n this.coasting = false\n this.spinning = false\n this.pitch.v = this.yaw.v = 0\n this.pitch.target = 0\n this.yaw.target = Math.round(this.yaw.x / 360) * 360\n }\n\n private applyInteractionStyle(): void {\n const mode = this.resolved.render.locked ? 'none' : this.resolved.render.interaction\n this.canvas.style.touchAction = mode === 'drag' ? 'none' : 'pan-y'\n this.canvas.style.cursor = mode === 'drag' ? 'grab' : ''\n }\n\n private bindPointer(): void {\n const el = this.canvas\n const local = (e: PointerEvent) => {\n const rect = el.getBoundingClientRect()\n return {\n x: clamp(((e.clientX - rect.left) / rect.width) * 2 - 1, -1, 1),\n y: clamp(((e.clientY - rect.top) / rect.height) * 2 - 1, -1, 1),\n }\n }\n const onMove = (e: PointerEvent) => {\n const mode = this.resolved.render.interaction\n if (mode === 'tilt' && e.pointerType !== 'touch') {\n this.hover = local(e)\n this.invalidate()\n }\n if (this.drag && e.pointerId === this.drag.id) {\n const dx = e.clientX - this.drag.x\n const dy = e.clientY - this.drag.y\n const now = performance.now()\n const prevYaw = this.yaw.x\n this.yaw.x = this.drag.yaw + dx * 0.7\n this.pitch.x = clamp(this.drag.pitch + dy * 0.35, -30, 30)\n const dt = Math.max(1, now - this.drag.t) / 1000\n this.drag.vx = this.drag.vx * 0.6 + ((this.yaw.x - prevYaw) / dt) * 0.4\n this.drag.t = now\n this.yaw.v = 0\n this.pitch.v = 0\n this.invalidate()\n }\n }\n const onLeave = () => {\n this.hover = null\n this.invalidate()\n }\n const onDown = (e: PointerEvent) => {\n if (this.drag || e.button !== 0 || this.resolved.render.interaction !== 'drag' || this.resolved.render.locked) return\n el.setPointerCapture(e.pointerId)\n this.spinning = false\n this.coasting = false\n this.drag = { id: e.pointerId, x: e.clientX, y: e.clientY, yaw: this.yaw.x, pitch: this.pitch.x, t: performance.now(), vx: 0 }\n el.style.cursor = 'grabbing'\n this.invalidate()\n }\n const onUp = (e: PointerEvent) => {\n if (!this.drag || e.pointerId !== this.drag.id) return\n const idle = performance.now() - this.drag.t > 80\n this.yaw.v = idle || e.type !== 'pointerup' || prefersReducedMotion() ? 0 : clamp(this.drag.vx, -2400, 2400)\n this.drag = null\n el.style.cursor = 'grab'\n this.pitch.target = 0\n if (Math.abs(this.yaw.v) > 120) this.coasting = true\n else {\n this.spinning = true\n this.yaw.target = Math.round(this.yaw.x / 360) * 360\n }\n this.invalidate()\n }\n el.addEventListener('pointermove', onMove)\n el.addEventListener('pointerleave', onLeave)\n el.addEventListener('pointerdown', onDown)\n el.addEventListener('pointerup', onUp)\n el.addEventListener('pointercancel', onUp)\n el.addEventListener('lostpointercapture', onUp)\n this.cleanups.push(() => {\n el.removeEventListener('pointermove', onMove)\n el.removeEventListener('pointerleave', onLeave)\n el.removeEventListener('pointerdown', onDown)\n el.removeEventListener('pointerup', onUp)\n el.removeEventListener('pointercancel', onUp)\n el.removeEventListener('lostpointercapture', onUp)\n })\n }\n}\n\n/** Convenience factory. */\nexport function createBadge(host: HTMLElement, options: BadgeOptions): Badgecraft {\n return new Badgecraft(host, options)\n}\n"]}
|