@felbrasil/dreamy 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../viewport/src/math/colors.ts", "../../../viewport/src/math/pixel-palette.ts", "../../../viewport/src/math/sprite-roles.ts", "../../../viewport/src/scene/frame-camera.ts", "../../../viewport/src/create-viewport.ts", "../../../viewport/src/decals/decal-atlas.ts", "../../../viewport/src/decals/builtin-docs.ts", "../../../viewport/src/decals/decal-limits.ts", "../../../viewport/src/decals/design-raster.ts", "../../../viewport/src/decals/builtin-art.ts", "../../../viewport/src/decals/interior-thumbs.ts", "../../../viewport/src/decals/decal-glsl.ts", "../../../viewport/src/decals/decal-catalog.ts", "../../../viewport/src/interaction/bone-tool.ts", "../../../viewport/src/math/convert.ts", "../../../viewport/src/math/picking.ts", "../../../viewport/src/math/screen.ts", "../../../viewport/src/objects/rig-view.ts", "../../../viewport/src/math/skeleton-math.ts", "../../../viewport/src/materials/skin.ts", "../../../viewport/src/objects/sculpt-view.ts", "../../../viewport/src/decals/decal-uniforms.ts", "../../../viewport/src/materials/fleck-material.ts", "../../../viewport/src/scene/render-settings.ts", "../../../viewport/src/objects/mesh-key.ts", "../../../viewport/src/objects/wing-view.ts", "../../../viewport/src/materials/wing-material.ts", "../../../viewport/src/wings/wing-mesh.ts", "../../../viewport/src/wings/wing-outlines.ts", "../../../viewport/src/wings/wing-pattern.ts", "../../../viewport/src/interaction/interaction-context.ts", "../../../viewport/src/interaction/bones-visible.ts", "../../../viewport/src/interaction/cursor.ts", "../../../viewport/src/interaction/decal-tool.ts", "../../../viewport/src/math/decal-pose.ts", "../../../viewport/src/interaction/surface-hit.ts", "../../../viewport/src/interaction/esc-hold.ts", "../../../viewport/src/interaction/gizmo.ts", "../../../viewport/src/interaction/marquee.ts", "../../../viewport/src/interaction/pivot-helper.ts", "../../../viewport/src/interaction/select-tool.ts", "../../../viewport/src/interaction/selection-boxes.ts", "../../../viewport/src/interaction/stamp-tool.ts", "../../../viewport/src/math/smear.ts", "../../../viewport/src/math/symmetry.ts", "../../../viewport/src/interaction/ghost-geometry.ts", "../../../viewport/src/interaction/stamp-wires.ts", "../../../viewport/src/math/lod.ts", "../../../viewport/src/materials/global-uniforms.ts", "../../../viewport/src/objects/mesh-driver.ts", "../../../viewport/src/objects/scene-views.ts", "../../../viewport/src/rig/bone-viz.ts", "../../../viewport/src/scene/camera-motion.ts", "../../../viewport/src/scene/camera-sun.ts", "../../../viewport/src/scene/stage.ts", "../../../viewport/src/scene/environment.ts", "../../../viewport/src/scene/play-mode.ts", "../../../viewport/src/scene/render-pipeline.ts", "../../../viewport/src/scene/resolve-frag.ts", "../../../viewport/src/objects/default-look.ts", "../../../viewport/src/scene/stress-test.ts"],
4
+ "sourcesContent": ["import type { ColorRef, Palette, Rgb } from \"@dreamy/api\";\nimport { Color, LinearSRGBColorSpace, Vector3 } from \"three\";\n\n/** Fixed colors: always available, never edited (the POC's FIXED_COLORS). */\nexport const FIXED_COLORS = { tongue: 0xf4768f, teeth: 0xfbfbfa, black: 0x111111 } as const;\n\n/** The POC's palette order (slot index \u2192 the shader's palette list for pixel art). */\nexport const PALETTE_ORDER = [\"primary\", \"secondary\", \"detail\", \"highlight\", \"eye\", \"pupil\", \"custom\"] as const;\n\nexport function hexOf(ref: ColorRef, palette: Palette): Rgb {\n if (ref === \"tongue\" || ref === \"teeth\" || ref === \"black\") return FIXED_COLORS[ref];\n return palette[ref] ?? 0xff00ff;\n}\n\nexport function cssOf(ref: ColorRef, palette: Palette): string {\n return cssHex(hexOf(ref, palette));\n}\n\nexport const cssHex = (hex: Rgb): string => \"#\" + (hex & 0xffffff).toString(16).padStart(6, \"0\");\n\n/**\n * The POC (three r128, no color management) fed hex / 255 to its shaders as-is. Every palette color the\n * viewport hands a shader goes through here so the look matches (no sRGB \u2192 linear conversion).\n */\nexport function rawColor(hex: Rgb, out = new Color()): Color {\n return out.setRGB(((hex >> 16) & 255) / 255, ((hex >> 8) & 255) / 255, (hex & 255) / 255, LinearSRGBColorSpace);\n}\n\n/** sRGB transfer \u2192 linear, per channel. */\nexport const srgbToLinear = (c: number): number => (c <= 0.04045 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4));\n\n/**\n * Palette colors on materials: the swatch hex is sRGB, so shading works on its linear value and the\n * screen shows the swatch's color (as the wing and decal textures, which three linearizes, already do).\n */\nexport function linearVec(hex: Rgb, out = new Vector3()): Vector3 {\n return out.set(srgbToLinear(((hex >> 16) & 255) / 255), srgbToLinear(((hex >> 8) & 255) / 255), srgbToLinear((hex & 255) / 255));\n}\n\nexport function linearColor(hex: Rgb, out = new Color()): Color {\n const v = linearVec(hex);\n return out.setRGB(v.x, v.y, v.z, LinearSRGBColorSpace);\n}\n\nexport function rawVec(hex: Rgb, out = new Vector3()): Vector3 {\n return out.set(((hex >> 16) & 255) / 255, ((hex >> 8) & 255) / 255, (hex & 255) / 255);\n}\n\n/** A stable key of the palette (re-raster / re-paint triggers). */\nexport const paletteKey = (p: Palette): string => PALETTE_ORDER.map(s => p[s]).join(\",\");\n", "import { Color } from \"three\";\nimport { rawColor } from \"./colors.js\";\n\n/**\n * Pixel art: one light and one shadow variation per palette color (the POC's rendering.js), in the raw\n * (hex / 255) convention the shaders use.\n */\nexport function paletteVariants(hex: number, black: number): { base: Color; light: Color; shade: Color } {\n const base = rawColor(hex);\n const hsl = { h: 0, s: 0, l: 0 };\n // HSL in the raw convention: read the numbers as-is (no color-space conversion).\n rgbToHsl(base.r, base.g, base.b, hsl);\n const { h, s, l } = hsl;\n if (l < 0.08 || hex === black) return { base, light: base.clone(), shade: base.clone() };\n const toward = (from: number, to: number, k: number) => {\n let d = to - from; d -= Math.round(d);\n return (from + d * k + 1) % 1;\n };\n const light = hslToRaw(toward(h, 0.12, 0.1), s * 0.92, Math.min(0.97, l + 0.16 + (1 - l) * 0.18));\n const shade = hslToRaw(toward(h, 0.7, 0.12), Math.min(1, s * 1.05 + 0.04), l * 0.58);\n const lum = (c: Color) => 0.299 * c.r + 0.587 * c.g + 0.114 * c.b;\n if (lum(light) < lum(base)) light.copy(base);\n return { base, light, shade };\n}\n\nexport function rgbToHsl(r: number, g: number, b: number, out: { h: number; s: number; l: number }): void {\n const max = Math.max(r, g, b), min = Math.min(r, g, b);\n const l = (min + max) / 2;\n let h = 0, s = 0;\n if (min !== max) {\n const d = max - min;\n s = l <= 0.5 ? d / (max + min) : d / (2 - max - min);\n if (max === r) h = (g - b) / d + (g < b ? 6 : 0);\n else if (max === g) h = (b - r) / d + 2;\n else h = (r - g) / d + 4;\n h /= 6;\n }\n out.h = h; out.s = s; out.l = l;\n}\n\nfunction hslToRaw(h: number, s: number, l: number): Color {\n const hue = (p: number, q: number, t: number) => {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * 6 * (2 / 3 - t);\n return p;\n };\n const c = new Color();\n if (s === 0) { c.r = c.g = c.b = l; return c; }\n const q = l <= 0.5 ? l * (1 + s) : l + s - l * s, p = 2 * l - q;\n c.r = hue(p, q, h + 1 / 3); c.g = hue(p, q, h); c.b = hue(p, q, h - 1 / 3);\n return c;\n}\n", "import type { Palette, SpriteBake } from \"@dreamy/api\";\nimport type { Color } from \"three\";\nimport { FIXED_COLORS, PALETTE_ORDER } from \"./colors.js\";\nimport { paletteVariants } from \"./pixel-palette.js\";\n\n/** The slots a sprite role can name, in role order (the pixel-art palette list without black, which is ink). */\nexport const SPRITE_SLOTS = [...PALETTE_ORDER, \"tongue\", \"teeth\"] as const;\nexport type SpriteSlot = (typeof SPRITE_SLOTS)[number];\n/** 0 base, 1 light, 2 shade (the pixel-art tones). */\nexport type SpriteTone = 0 | 1 | 2;\n\nexport const ROLE_TRANSPARENT = 0;\nexport const ROLE_INK = 1;\n/** Roles in use: transparent, ink, and three tones per slot. */\nexport const SPRITE_ROLE_COUNT = 2 + SPRITE_SLOTS.length * 3;\n\n/** The role of a slot's tone. */\nexport const spriteRole = (slot: SpriteSlot, tone: SpriteTone): number => 2 + SPRITE_SLOTS.indexOf(slot) * 3 + tone;\n\n/** The slot and tone a role names (undefined for transparent and ink). */\nexport function roleSlot(role: number): { readonly slot: SpriteSlot; readonly tone: SpriteTone } | undefined {\n if (role < 2 || role >= SPRITE_ROLE_COUNT) return undefined;\n const k = role - 2;\n return { slot: SPRITE_SLOTS[Math.floor(k / 3)]!, tone: (k % 3) as SpriteTone };\n}\n\nconst toHex = (c: Color): number =>\n (Math.round(c.r * 255) << 16) | (Math.round(c.g * 255) << 8) | Math.round(c.b * 255);\n\n/**\n * The color of every role for a palette (index = role), as the pixel-art render draws them: a slot's base is its\n * swatch, light and shade its pixel-art variations. Recoloring a sprite is drawing its roles with another table.\n */\nexport function spriteColors(palette: Palette): number[] {\n const out = [0, FIXED_COLORS.black];\n for (const slot of SPRITE_SLOTS) {\n const hex = slot === \"tongue\" || slot === \"teeth\" ? FIXED_COLORS[slot] : palette[slot];\n const v = paletteVariants(hex, FIXED_COLORS.black);\n out.push(toHex(v.base), toHex(v.light), toHex(v.shade));\n }\n return out;\n}\n\n/**\n * Reads the index pass back: `rgba` is the render target's bytes (rows from the bottom, as WebGL reads them), the role\n * in red and an \"approximated\" flag in green. Returns rows from the top.\n */\nexport function decodeRoles(rgba: Uint8Array, width: number, height: number): { roles: Uint8Array; approximated: number } {\n const roles = new Uint8Array(width * height);\n let approximated = 0;\n for (let y = 0; y < height; y++) {\n const src = (height - 1 - y) * width * 4, dst = y * width;\n for (let x = 0; x < width; x++) {\n const role = rgba[src + x * 4]!;\n roles[dst + x] = role < SPRITE_ROLE_COUNT ? role : ROLE_INK;\n if (role && rgba[src + x * 4 + 1]! > 127) approximated++;\n }\n }\n return { roles, approximated };\n}\n\n/** Where a sprite stands: its lowest opaque row and the centre of its opaque pixels' box (0s when empty). */\nexport function spriteAnchor(roles: Uint8Array, width: number, height: number): SpriteBake[\"anchor\"] {\n let minX = width, maxX = -1, minY = height, maxY = -1;\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n if (!roles[y * width + x]) continue;\n if (x < minX) minX = x;\n if (x > maxX) maxX = x;\n if (y < minY) minY = y;\n if (y > maxY) maxY = y;\n }\n }\n if (maxX < 0) return { footY: 0, centerX: 0, centerY: 0 };\n return { footY: maxY, centerX: (minX + maxX) / 2, centerY: (minY + maxY) / 2 };\n}\n", "import type { CameraView, FrameOptions, Quaternion } from \"@dreamy/api\";\nimport { Quaternion as Q, Vector3, type Box3 } from \"three\";\nimport type { Stage } from \"./stage.js\";\n\nconst DEFAULT_PADDING = 0.03;\n\n/**\n * The direction from an object toward the camera for a `CameraView`: around the object's front (+z in its space,\n * turned by `rotation`, kept level), yaw toward its left (+x), pitch up from the ground plane.\n */\nexport function viewDirection(view: CameraView, rotation: Quaternion): Vector3 {\n const front = new Vector3(0, 0, 1).applyQuaternion(new Q(rotation.x, rotation.y, rotation.z, rotation.w));\n front.y = 0;\n if (front.lengthSq() < 1e-8) front.set(0, 0, 1);\n front.normalize();\n const left = new Vector3(front.z, 0, -front.x);\n const yaw = (view.yaw * Math.PI) / 180, pitch = (Math.max(-89.9, Math.min(89.9, view.pitch)) * Math.PI) / 180;\n return front.multiplyScalar(Math.cos(yaw)).addScaledVector(left, Math.sin(yaw)).multiplyScalar(Math.cos(pitch)).add(new Vector3(0, Math.sin(pitch), 0)).normalize();\n}\n\n/** The camera's frame looking along `-dir`: right and up. */\nfunction basis(dir: Vector3): { right: Vector3; up: Vector3 } {\n const forward = dir.clone().negate();\n const right = new Vector3().crossVectors(forward, new Vector3(0, 1, 0));\n if (right.lengthSq() < 1e-8) right.set(1, 0, 0);\n right.normalize();\n return { right, up: new Vector3().crossVectors(right, forward).normalize() };\n}\n\n/**\n * Fits objects in the view like CSS `object-fit: contain`, in 3D. The camera keeps its angle (or takes `direction`)\n * and moves so the silhouette of `points` exactly fills, on its limiting side, a centred area of `aspect` (as large as\n * the view allows, less the padding), centred in it. Starts from the bounding box and refines on the points' actual\n * projection (perspective makes the box loose), a few rounds.\n */\nexport function frameContain(stage: Stage, box: Box3, points: readonly Vector3[], options: FrameOptions = {}): void {\n const { camera, orbit } = stage;\n const dir = options.direction\n ? new Vector3(options.direction.x, options.direction.y, options.direction.z)\n : camera.position.clone().sub(orbit.target);\n if (dir.lengthSq() < 1e-10) dir.set(0, 0.35, 1);\n dir.normalize();\n const { right, up } = basis(dir);\n\n // the area's half extents, in tangents of the view angle\n const tanV = Math.tan(((camera.fov * Math.PI) / 180) / 2), tanH = tanV * camera.aspect;\n const aspect = options.aspect ?? 1;\n const keep = 1 - Math.min(0.5, Math.max(0, options.padding ?? DEFAULT_PADDING));\n const [areaH, areaV] = (tanH / tanV >= aspect ? [tanV * aspect, tanV] : [tanH, tanH / aspect]).map((t) => t * keep) as [number, number];\n\n // a first guess from the box's corners\n const center = box.getCenter(new Vector3());\n let distance = 0;\n for (let i = 0; i < 8; i++) {\n const c = new Vector3(i & 1 ? box.max.x : box.min.x, i & 2 ? box.max.y : box.min.y, i & 4 ? box.max.z : box.min.z).sub(center);\n const toward = c.dot(dir);\n distance = Math.max(distance, Math.abs(c.dot(right)) / areaH + toward, Math.abs(c.dot(up)) / areaV + toward);\n }\n distance = Math.max(distance, camera.near * 4);\n\n // refine on the silhouette: centre it, then scale the distance so its limiting side meets the area's edge\n const sample = points.length ? points : [box.min, box.max];\n for (let round = 0; round < 8; round++) {\n const eye = center.clone().addScaledVector(dir, distance);\n let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity;\n for (const p of sample) {\n const v = p.clone().sub(eye), depth = -v.dot(dir);\n if (depth <= camera.near) continue;\n const x = v.dot(right) / depth, y = v.dot(up) / depth;\n minX = Math.min(minX, x); maxX = Math.max(maxX, x); minY = Math.min(minY, y); maxY = Math.max(maxY, y);\n }\n if (!Number.isFinite(minX)) break;\n // centre: move the target across the view by the silhouette's offset, at the target's depth\n center.addScaledVector(right, ((minX + maxX) / 2) * distance).addScaledVector(up, ((minY + maxY) / 2) * distance);\n const fill = Math.max((maxX - minX) / 2 / areaH, (maxY - minY) / 2 / areaV);\n if (Math.abs(fill - 1) < 0.002 && Math.abs(minX + maxX) < 1e-3 && Math.abs(minY + maxY) < 1e-3) break;\n distance = Math.max(camera.near * 4, distance * fill);\n }\n camera.position.copy(center).addScaledVector(dir, distance);\n orbit.target.copy(center);\n camera.lookAt(center);\n orbit.update();\n}\n", "import type {\n Command, Creation, DispatchResult, Evaluator, FrameOptions, Id, Palette, Quaternion, SceneObject, SpriteBake, SpriteBakeOptions, ViewSession,\n Viewport, ViewportCallbacks,\n} from \"@dreamy/api\";\nimport { frameContain, viewDirection } from \"./scene/frame-camera.js\";\nimport { MOUSE, Raycaster, TOUCH, Vector3, type Object3D } from \"three\";\nimport { DecalAtlas } from \"./decals/decal-atlas.js\";\nimport { DecalCatalog } from \"./decals/decal-catalog.js\";\nimport { BoneTool } from \"./interaction/bone-tool.js\";\nimport { bonesVisible } from \"./interaction/bones-visible.js\";\nimport { cursorFor } from \"./interaction/cursor.js\";\nimport { DecalTool } from \"./interaction/decal-tool.js\";\nimport { EscHold } from \"./interaction/esc-hold.js\";\nimport { Gizmo } from \"./interaction/gizmo.js\";\nimport { createPointer, readPointer, type InteractionContext } from \"./interaction/interaction-context.js\";\nimport { MarqueeOverlay } from \"./interaction/marquee.js\";\nimport { PivotHelper } from \"./interaction/pivot-helper.js\";\nimport { SelectTool } from \"./interaction/select-tool.js\";\nimport { SelectionBoxes } from \"./interaction/selection-boxes.js\";\nimport { StampTool } from \"./interaction/stamp-tool.js\";\nimport { StampWires } from \"./interaction/stamp-wires.js\";\nimport { paletteKey } from \"./math/colors.js\";\nimport { decodeRoles, spriteAnchor, spriteColors } from \"./math/sprite-roles.js\";\nimport { isClick } from \"./math/screen.js\";\nimport { lodLevels, lodWanted, projectedPx } from \"./math/lod.js\";\nimport { createGlobalUniforms } from \"./materials/global-uniforms.js\";\nimport { MeshDriver } from \"./objects/mesh-driver.js\";\nimport { RigView } from \"./objects/rig-view.js\";\nimport { SceneViews } from \"./objects/scene-views.js\";\nimport { SculptView } from \"./objects/sculpt-view.js\";\nimport type { ViewContext } from \"./objects/view-context.js\";\nimport { BoneViz } from \"./rig/bone-viz.js\";\nimport { CameraTween, moveCameraOnFloor } from \"./scene/camera-motion.js\";\nimport { updateCameraSun } from \"./scene/camera-sun.js\";\nimport { PlayMode } from \"./scene/play-mode.js\";\nimport { RenderPipeline } from \"./scene/render-pipeline.js\";\nimport { createStage, DEFAULT_CAMERA, DEFAULT_TARGET, type Stage } from \"./scene/stage.js\";\nimport { stressTestObjects } from \"./scene/stress-test.js\";\n\nexport type ViewportOptions = {\n /** The mesher (the app constructs it and hands it over; the viewport never imports `@dreamy/evaluator`). */\n readonly evaluator: Evaluator;\n};\n\nconst LOD_EVERY = 4;\nconst LOD_CHANGES_PER_TICK = 8;\n/** A bake renders once its objects' meshes have stayed settled for this many checks, one every BAKE_POLL_MS. */\nconst BAKE_SETTLED_CHECKS = 3;\n/** Timers, not animation frames: a hidden page (a background tab, a headless baker) gets no frames. */\nconst BAKE_POLL_MS = 16;\nconst BAKE_TIMEOUT_MS = 30_000;\nconst BAKE_FOV = 25;\nconst IDENTITY_Q: Quaternion = { x: 0, y: 0, z: 0, w: 1 };\n\ntype Mounted = {\n readonly host: HTMLElement;\n readonly stage: Stage;\n readonly ctx: InteractionContext;\n readonly vctx: ViewContext;\n readonly views: SceneViews;\n readonly pipeline: RenderPipeline;\n readonly stamp: StampTool;\n readonly decal: DecalTool;\n readonly bone: BoneTool;\n readonly select: SelectTool;\n readonly gizmo: Gizmo;\n readonly boxes: SelectionBoxes;\n readonly wires: StampWires;\n readonly pivot: PivotHelper;\n readonly marquee: MarqueeOverlay;\n readonly esc: EscHold;\n readonly play: PlayMode;\n readonly tween: CameraTween;\n readonly boneViz: Map<Id, BoneViz>;\n readonly cleanup: (() => void)[];\n raf: number;\n};\n\n/**\n * The 3D view (`Viewport` port): reads a Creation + ViewSession, never mutates the creation, reports gestures as\n * Commands through `callbacks.command` and selection through `callbacks.select`. Meshes come from the evaluator.\n */\nexport function createViewport({ evaluator }: ViewportOptions): Viewport {\n let creation: Creation | null = null;\n let session: ViewSession | null = null;\n let callbacks: ViewportCallbacks | null = null;\n let atlas: DecalAtlas | null = null;\n let catalog: DecalCatalog | null = null;\n let m: Mounted | null = null;\n /** A `frame` call waiting for its objects' meshes. */\n let pendingFrame: { readonly ids: readonly Id[]; readonly options: FrameOptions } | null = null;\n let lastPalette = \"\";\n let lastDesigns: unknown = null;\n let levelsBase = 0;\n let stress: SceneObject[] = [];\n /** Objects a sprite bake is waiting on: distance LOD keeps them at the finest level. */\n const baking = new Set<Id>();\n const driver = new MeshDriver(evaluator);\n\n const getAtlas = (palette: Palette): DecalAtlas => (atlas ??= new DecalAtlas(palette));\n\n const toast = (msg: string) => callbacks?.toast(msg);\n\n function sync(): void {\n if (!m || !creation || !session) return;\n const scope = session.mode === \"sculpt\" ? session.scope : undefined;\n const held = scope && creation.objects.find(o => o.id === scope.objectId)?.kind === \"rig\" ? scope.objectId : undefined;\n m.views.sync(creation, stress, held);\n const finest = m.vctx.levels[0] ?? 36;\n for (const v of m.views.allSculptViews()) if (!v.resolution) v.setResolution(finest);\n applyIsolation();\n }\n\n // Sculpt mode: everything but the scoped sculpt goes gray, sky and ground too\n function applyIsolation(): void {\n if (!m || !session) return;\n const scope = session.mode === \"sculpt\" ? session.scope : undefined;\n m.stage.setIsolation(!!scope);\n const keep = scope ? m.views.sculptView(scope) : undefined;\n for (const v of m.views.allSculptViews()) v.setGrayscale(scope && v !== keep ? 1 : 0);\n for (const w of m.views.allWingViews()) w.setGrayscale(scope ? 1 : 0);\n }\n\n function dispatch(command: Command): DispatchResult {\n const r = callbacks?.command(command) ?? { ok: false as const, reason: \"Viewport is not mounted\" };\n if (!r.ok) { toast(r.reason); sync(); }\n return r;\n }\n\n function mount(hostObj: object, cbs: ViewportCallbacks): void {\n if (m) dispose();\n callbacks = cbs;\n const host = hostObj as HTMLElement;\n if (getComputedStyle(host).position === \"static\") host.style.position = \"relative\";\n const globals = createGlobalUniforms();\n const stage = createStage(host, globals);\n const pal = creation?.palette ?? { primary: 0xf87171, secondary: 0xfbbf24, detail: 0x34d399, highlight: 0x60a5fa, eye: 0xa78bfa, pupil: 0x1e1b3a, custom: 0x888888 };\n const vctx: ViewContext = { globals, atlas: getAtlas(pal), driver, env: stage.env, palette: pal, levels: lodLevels(36), changed: () => undefined, warn: (msg) => callbacks?.toast(msg) };\n const views = new SceneViews(stage.objects, vctx);\n const pointer = createPointer();\n const ctx: InteractionContext = {\n stage, views, pointer, raycaster: new Raycaster(), keys: new Set(),\n creation: () => creation as Creation,\n session: () => session as ViewSession,\n callbacks: () => callbacks,\n dispatch,\n select: sel => callbacks?.select(sel),\n toast,\n locked: () => !!session?.play || !!session?.stressTest,\n };\n const marquee = new MarqueeOverlay(host);\n const mounted: Mounted = {\n host, stage, ctx, vctx, views, pipeline: new RenderPipeline(stage, globals),\n stamp: new StampTool(ctx), decal: new DecalTool(ctx, () => vctx.atlas), bone: new BoneTool(ctx),\n select: new SelectTool(ctx, marquee), gizmo: new Gizmo(ctx), boxes: new SelectionBoxes(ctx, stage.ui),\n wires: new StampWires(ctx), pivot: new PivotHelper(ctx), marquee,\n esc: new EscHold(host, () => callbacks?.scopeOut()), play: new PlayMode(), tween: new CameraTween(),\n boneViz: new Map(), cleanup: [], raf: 0,\n };\n m = mounted;\n lastPalette = \"\"; lastDesigns = null; levelsBase = 0;\n wireEvents(mounted);\n const ro = new ResizeObserver(() => resize(mounted));\n ro.observe(host);\n mounted.cleanup.push(() => ro.disconnect());\n resize(mounted);\n if (creation && session) update(creation, session);\n let last = performance.now(), frames = 0, fpsAt = last, fps = 60, tick = 0;\n const loop = (time: number) => {\n mounted.raf = requestAnimationFrame(loop);\n const now = performance.now();\n const delta = Math.min((now - last) * 0.001, 0.1);\n last = now;\n frames++;\n if (now - fpsAt >= 500) {\n fps = Math.round((frames * 1000) / (now - fpsAt));\n frames = 0; fpsAt = now;\n if (session?.prefs.stats) {\n const sv = mounted.views.allSculptViews();\n const reduced = sv.filter(v => v.resolution && v.resolution < (mounted.vctx.levels[0] ?? 36)).length;\n callbacks?.stats(`FPS: ${fps} | Tri: ${Math.round(mounted.views.triangles())} | Mesh: ${driver.lastMs.toFixed(1)}ms | LOD: ${reduced}/${sv.length}`);\n }\n }\n if (++tick % LOD_EVERY === 0) lodTick(mounted);\n frame(mounted, time, delta);\n };\n mounted.raf = requestAnimationFrame(loop);\n }\n\n function resize(mm: Mounted): void {\n const w = mm.host.clientWidth || 1, h = mm.host.clientHeight || 1;\n mm.stage.renderer.setSize(w, h);\n mm.stage.camera.aspect = w / h;\n mm.stage.camera.updateProjectionMatrix();\n }\n\n // Distance LOD: the coarsest grid that keeps \u2264 LOD_TARGET_PX px per voxel; the edited object stays finest\n function lodTick(mm: Mounted): void {\n if (!session) return;\n const cam = mm.stage.camera, h = mm.host.clientHeight || 1;\n const sel = new Set(session.selection.objectIds);\n const scope = session.mode === \"sculpt\" ? session.scope : undefined;\n const scoped = scope ? mm.views.sculptView(scope) : undefined;\n let changes = 0;\n const ppu = h * 0.5 / Math.tan(cam.fov * Math.PI / 360); // pixels per unit at distance 1\n for (const [id, { view }] of mm.views.views) {\n if (view instanceof SculptView) chunkView(view, cam.position, ppu);\n const list: SculptView[] = view instanceof RigView ? view.sculptViews() : [view];\n for (const v of list) {\n if (changes >= LOD_CHANGES_PER_TICK) return;\n if (!v.bounds) continue;\n v.group.updateWorldMatrix(true, false);\n const c = v.bounds.getCenter(new Vector3()).applyMatrix4(v.group.matrixWorld);\n const size = v.bounds.getSize(new Vector3());\n const px = projectedPx(Math.max(size.x, size.y, size.z) * v.group.matrixWorld.getMaxScaleOnAxis(), cam.position.distanceTo(c), cam.fov, h);\n const want = lodWanted(mm.vctx.levels, px, v.resolution, v === scoped || sel.has(id) || baking.has(id));\n if (want !== v.resolution) { v.setResolution(want); changes++; }\n }\n }\n }\n\n /**\n * Large standalone sculpts (longest side \u2265 8) mesh in chunks around the camera (the evaluator's chunked LOD).\n * The camera, in sculpt space, is quantized to a sixteenth of the size so orbiting re-sends rarely.\n */\n function chunkView(v: SculptView, camWorld: Vector3, ppu: number): void {\n const b = v.bounds;\n const size = b ? b.getSize(new Vector3()) : null;\n const ext = size ? Math.max(size.x, size.y, size.z) : 0;\n if (ext < 7) { v.setView(undefined, \"\"); return; }\n v.group.updateWorldMatrix(true, false);\n const c = v.group.worldToLocal(camWorld.clone());\n const q = ext / 16, sig = `${Math.round(c.x / q)},${Math.round(c.y / q)},${Math.round(c.z / q)},${Math.round(ppu)}`;\n v.setView({ camera: { x: c.x, y: c.y, z: c.z }, pixelsPerUnitAtDistance1: ppu }, sig);\n }\n\n function frame(mm: Mounted, time: number, delta: number): void {\n const s = session, c = creation;\n const { stage } = mm;\n // a waiting frame request: once every object has meshed, fit the camera to them\n if (pendingFrame && pendingFrame.ids.every((id) => !mm.views.worldBounds([id]).isEmpty())) {\n frameContain(stage, mm.views.worldBounds(pendingFrame.ids), mm.views.worldPoints(pendingFrame.ids), withView(pendingFrame.ids, pendingFrame.options));\n pendingFrame = null;\n }\n mm.vctx.globals.uTime.value = time * 0.001;\n if (s && c) {\n const typing = isTyping();\n if (s.play) mm.play.update(stage, typing ? new Set() : mm.ctx.keys);\n else if (!typing) moveCameraOnFloor(stage, mm.ctx.keys, delta);\n // Orbit: off while dragging a gizmo, while Shift / Ctrl select modifiers are held, and left-drag belongs to the smear brush\n const brushing = s.tool === \"stamp\" && s.brush.smear && s.mode === \"sculpt\";\n const mods = s.tool === \"select\" && (mm.ctx.pointer.shift || mm.ctx.pointer.ctrl || s.touchArea || s.touchAdd);\n stage.orbit.enabled = !mm.gizmo.dragging && !mods;\n stage.orbit.mouseButtons.LEFT = (brushing ? null : MOUSE.ROTATE) as MOUSE;\n stage.orbit.mouseButtons.RIGHT = MOUSE.PAN;\n stage.orbit.touches.ONE = (brushing ? null : TOUCH.ROTATE) as TOUCH;\n mm.tween.update(stage);\n stage.orbit.update();\n updateCameraSun(stage, s.prefs.cameraSun);\n mm.vctx.atlas.flush();\n mm.gizmo.sync();\n mm.boxes.update();\n mm.wires.update();\n mm.pivot.update();\n updateBones(mm, s, c);\n for (const v of mm.views.allSculptViews()) v.updateLocalCamera(stage.camera.position);\n mm.vctx.globals.uDecalBoostDist.value = s.prefs.decalBoost;\n const keep = s.prefs.renderSelectedOnly ? renderRoots(mm, s) : null;\n mm.pipeline.render(s.prefs, c.palette, keep, s.mode === \"sculpt\" && !!s.scope);\n } else {\n stage.orbit.update();\n stage.renderer.render(stage.scene, stage.camera);\n }\n }\n\n // Selected objects (a selected rig brings its parts: they live in its group)\n function renderRoots(mm: Mounted, s: ViewSession): Object3D[] {\n return s.selection.objectIds.map(id => mm.views.group(id)).filter((g): g is NonNullable<typeof g> => !!g);\n }\n\n function updateBones(mm: Mounted, s: ViewSession, c: Creation): void {\n const seen = new Set<Id>();\n for (const o of c.objects) {\n if (o.kind !== \"rig\") continue;\n const v = mm.views.views.get(o.id)?.view;\n if (!(v instanceof RigView) || !v.matrices || !v.rig) continue;\n const show = bonesVisible(mm.ctx, o) && !s.stressTest;\n let viz = mm.boneViz.get(o.id);\n if (!show) { if (viz) viz.root.visible = false; continue; }\n seen.add(o.id);\n if (!viz) { viz = new BoneViz(); mm.boneViz.set(o.id, viz); mm.stage.ui.add(viz.root); }\n viz.root.visible = true;\n v.group.updateWorldMatrix(true, false);\n const selected = s.selection.objectIds.includes(o.id) ? s.selection.boneId : undefined;\n viz.update(v.group.matrixWorld, v.rig.bones, v.matrices, v.rig.mode === \"rig\" || (s.mode === \"sculpt\" && s.scope?.objectId === o.id), selected);\n }\n for (const [id, viz] of mm.boneViz) if (!seen.has(id) && !c.objects.some(o => o.id === id)) { viz.dispose(); mm.boneViz.delete(id); }\n }\n\n const isTyping = () => {\n const el = document.activeElement as HTMLElement | null;\n return !!el && (el.tagName === \"INPUT\" || el.tagName === \"TEXTAREA\" || el.isContentEditable);\n };\n\n function wireEvents(mm: Mounted): void {\n const canvas = mm.stage.renderer.domElement;\n const { ctx } = mm;\n let press: { x: number; y: number; kind: \"decal\" | \"bone\" | \"pick\" } | null = null;\n const on = <K extends keyof WindowEventMap>(t: EventTarget, type: K, fn: (e: WindowEventMap[K]) => void) => {\n t.addEventListener(type, fn as EventListener);\n mm.cleanup.push(() => t.removeEventListener(type, fn as EventListener));\n };\n const cursor = () => { if (session) canvas.style.cursor = cursorFor(session, ctx.pointer.shift, ctx.pointer.ctrl); };\n\n on(canvas, \"pointerdown\", e => {\n const macCtrlClick = e.button === 2 && e.ctrlKey; // macOS reports Ctrl+click as a right click\n if ((e.button !== 0 && !macCtrlClick) || !session || !creation) return;\n readPointer(ctx.pointer, e, canvas);\n ctx.pointer.down = true;\n if (mm.gizmo.hovering || mm.gizmo.dragging || ctx.locked()) return;\n const tool = session.tool;\n if (tool === \"stamp\") mm.stamp.press();\n else if (tool === \"decal\") press = { x: ctx.pointer.x, y: ctx.pointer.y, kind: \"decal\" };\n else if (tool === \"select\") mm.select.down();\n else if (tool === \"bone\") press = { x: ctx.pointer.x, y: ctx.pointer.y, kind: \"bone\" };\n else press = { x: ctx.pointer.x, y: ctx.pointer.y, kind: \"pick\" };\n });\n on(window, \"pointermove\", e => {\n if (!session || !creation) return;\n readPointer(ctx.pointer, e, canvas);\n mm.stamp.hover();\n if (ctx.pointer.down) mm.stamp.drag();\n mm.decal.hover();\n mm.select.move();\n });\n on(window, \"pointerup\", e => {\n if (!session || !creation) return;\n const wasDown = ctx.pointer.down;\n readPointer(ctx.pointer, e, canvas);\n ctx.pointer.down = false;\n if (!wasDown) return;\n mm.stamp.release();\n mm.select.up();\n const p = press;\n press = null;\n // A press resolves on release, so orbiting never places, picks or adds\n if (p && isClick(p.x, p.y, ctx.pointer.x, ctx.pointer.y)) {\n if (p.kind === \"decal\") mm.decal.place();\n else if (p.kind === \"bone\") mm.bone.click();\n else mm.select.pick(false);\n }\n });\n on(canvas, \"dblclick\", e => {\n if (e.button !== 0 || !session || mm.gizmo.hovering || mm.gizmo.dragging) return;\n readPointer(ctx.pointer, e, canvas);\n mm.select.doubleClick(center => mm.tween.focus(mm.stage, center));\n });\n on(canvas, \"contextmenu\", e => e.preventDefault());\n on(window, \"keydown\", e => {\n if (!session || isTyping()) return;\n ctx.keys.add(e.code);\n ctx.pointer.shift = e.shiftKey; ctx.pointer.ctrl = e.ctrlKey || e.metaKey;\n cursor();\n if (e.code === \"Space\" && session.play) e.preventDefault();\n if (e.code === \"KeyQ\" && !e.ctrlKey && !e.metaKey && !session.play) {\n if (session.tool === \"decal\") mm.decal.place();\n else mm.stamp.press(true);\n }\n if (e.code === \"Escape\" && !e.repeat) {\n if (mm.select.cancel()) return;\n if (session.mode === \"sculpt\" && !session.play) mm.esc.start();\n }\n });\n on(window, \"keyup\", e => {\n ctx.keys.delete(e.code);\n ctx.pointer.shift = e.shiftKey; ctx.pointer.ctrl = e.ctrlKey || e.metaKey;\n cursor();\n if (e.code === \"Escape\") mm.esc.end();\n });\n on(window, \"blur\", () => {\n ctx.keys.clear();\n ctx.pointer.shift = ctx.pointer.ctrl = ctx.pointer.down = false;\n mm.stamp.cancel();\n mm.esc.end();\n });\n }\n\n function update(c: Creation, s: ViewSession): void {\n const prev = session;\n creation = c;\n session = s;\n if (!m) return;\n const mm = m;\n // Palette: atlas cells, decal tints, pattern colors and meshes that use a changed slot\n const pk = paletteKey(c.palette);\n const paletteChanged = pk !== lastPalette;\n mm.vctx.palette = c.palette;\n if (paletteChanged) mm.vctx.atlas.setPalette(c.palette);\n if (c.designs !== lastDesigns) mm.vctx.atlas.setDesigns(c.designs);\n // Base voxel resolution (prefs): every sculpt restarts at the finest level\n if (s.prefs.voxelResolution !== levelsBase) {\n levelsBase = s.prefs.voxelResolution;\n mm.vctx.levels = lodLevels(levelsBase);\n for (const v of mm.views.allSculptViews()) v.setResolution(mm.vctx.levels[0] ?? 36);\n }\n // Play mode and stress test write nothing to the creation\n if (s.play !== mm.play.active) {\n mm.play.set(mm.stage, s.play);\n if (s.play) mm.stamp.cancel();\n }\n if (s.stressTest !== !!prev?.stressTest || (s.stressTest && !stress.length)) {\n stress = s.stressTest ? stressTestObjects() : [];\n mm.stage.camera.position.copy(s.stressTest ? new Vector3(22, 18, 28) : DEFAULT_CAMERA);\n mm.stage.orbit.target.copy(DEFAULT_TARGET);\n if (s.stressTest) toast(\"Stress Test Active: 24 Meshed Compound Sculptures\");\n }\n sync();\n if (paletteChanged || c.designs !== lastDesigns) mm.views.refreshPalette();\n lastPalette = pk;\n lastDesigns = c.designs;\n if (s.tool !== \"stamp\") mm.stamp.hideGhost();\n if (s.tool !== \"decal\") mm.decal.hide();\n mm.stage.renderer.domElement.style.cursor = cursorFor(s, mm.ctx.pointer.shift, mm.ctx.pointer.ctrl);\n }\n\n function thumbnail(): string | undefined {\n if (!m || !session || !creation) return undefined;\n const { stage } = m;\n const ui = stage.ui.visible;\n stage.ui.visible = false;\n m.pipeline.render(session.prefs, creation.palette, null, false);\n stage.ui.visible = ui;\n const src = stage.renderer.domElement;\n const c = document.createElement(\"canvas\");\n const k = 160 / Math.max(src.width, src.height, 1);\n c.width = Math.max(1, Math.round(src.width * k));\n c.height = Math.max(1, Math.round(src.height * k));\n (c.getContext(\"2d\") as CanvasRenderingContext2D).drawImage(src, 0, 0, c.width, c.height);\n return c.toDataURL(\"image/png\");\n }\n\n /** `options.view` turned into a direction around the first object's front. */\n function withView(ids: readonly Id[], options: FrameOptions): FrameOptions {\n if (!options.view) return options;\n const facing = creation?.objects.find((o) => o.id === ids[0])?.transform.rotation ?? IDENTITY_Q;\n const d = viewDirection(options.view, facing);\n return { ...options, direction: { x: d.x, y: d.y, z: d.z } };\n }\n\n /** The sculpt views drawing objects (a rig's parts included). */\n function sculptViewsOf(mm: Mounted, ids: readonly Id[]): SculptView[] {\n return ids.flatMap((id) => {\n const v = mm.views.views.get(id)?.view;\n return v instanceof RigView ? v.sculptViews() : v instanceof SculptView ? [v] : [];\n });\n }\n\n /** Resolves once the objects have meshed at the finest level and nothing has been in flight for a few checks. */\n function settled(mm: Mounted, ids: readonly Id[]): Promise<void> {\n const finest = mm.vctx.levels[0] ?? 36;\n const started = performance.now();\n return new Promise((resolve, reject) => {\n let calm = 0;\n const check = () => {\n if (m !== mm) { reject(new Error(\"The viewport was disposed during a bake.\")); return; }\n const views = sculptViewsOf(mm, ids);\n const ready = ids.every((id) => !mm.views.worldBounds([id]).isEmpty()) && driver.busy === 0 && views.every((v) => v.resolution === finest);\n calm = ready ? calm + 1 : 0;\n if (calm >= BAKE_SETTLED_CHECKS) { resolve(); return; }\n if (performance.now() - started > BAKE_TIMEOUT_MS) {\n const fine = views.filter((v) => v.resolution === finest).length;\n reject(new Error(`The objects did not finish meshing in time for the bake (${driver.busy} requests in flight, ${fine} of ${views.length} parts at the finest level).`));\n return;\n }\n setTimeout(check, BAKE_POLL_MS);\n };\n setTimeout(check, BAKE_POLL_MS);\n });\n }\n\n async function bakeSprite(options: SpriteBakeOptions): Promise<SpriteBake> {\n const mm = m;\n if (!mm || !creation || !session) throw new Error(\"The viewport is not mounted.\");\n const ids = options.objectIds.filter((id) => mm.views.views.has(id));\n if (!ids.length) throw new Error(\"There is nothing to bake.\");\n const size = Math.round(options.size);\n if (!(size >= 16 && size <= 512)) throw new Error(\"A sprite is 16 to 512 pixels wide.\");\n ids.forEach((id) => baking.add(id));\n try {\n const finest = mm.vctx.levels[0] ?? 36;\n for (const v of sculptViewsOf(mm, ids)) if (v.resolution !== finest) v.setResolution(finest);\n await settled(mm, ids);\n const c = creation;\n if (!c) throw new Error(\"The viewport is not mounted.\");\n const { camera, orbit } = mm.stage;\n const saved = { position: camera.position.clone(), target: orbit.target.clone(), aspect: camera.aspect, fov: camera.fov };\n try {\n camera.aspect = 1;\n camera.fov = Math.min(60, Math.max(5, options.fov ?? BAKE_FOV));\n camera.updateProjectionMatrix();\n frameContain(mm.stage, mm.views.worldBounds(ids), mm.views.worldPoints(ids), withView(ids, { aspect: 1, padding: options.padding ?? 0.03, view: options.view }));\n camera.updateMatrixWorld();\n updateCameraSun(mm.stage, true);\n for (const v of mm.views.allSculptViews()) v.updateLocalCamera(camera.position);\n mm.vctx.atlas.flush();\n const keep = ids.map((id) => mm.views.group(id)).filter((g): g is NonNullable<typeof g> => !!g);\n const { roles, approximated } = decodeRoles(mm.pipeline.renderSprite(size, c.palette, keep), size, size);\n return { width: size, height: size, roles, colors: spriteColors(c.palette), anchor: spriteAnchor(roles, size, size), approximated };\n } finally {\n camera.aspect = saved.aspect;\n camera.fov = saved.fov;\n camera.updateProjectionMatrix();\n camera.position.copy(saved.position);\n orbit.target.copy(saved.target);\n camera.lookAt(saved.target);\n orbit.update();\n }\n } finally {\n ids.forEach((id) => baking.delete(id));\n }\n }\n\n function dispose(): void {\n const mm = m;\n m = null;\n if (!mm) return;\n cancelAnimationFrame(mm.raf);\n mm.cleanup.forEach(f => f());\n mm.boneViz.forEach(v => v.dispose());\n mm.stamp.dispose(); mm.decal.dispose(); mm.gizmo.dispose(); mm.boxes.dispose(); mm.wires.dispose(); mm.pivot.dispose();\n mm.marquee.dispose(); mm.esc.dispose(); mm.play.set(mm.stage, false);\n mm.views.dispose();\n mm.pipeline.dispose();\n mm.stage.dispose();\n callbacks = null;\n }\n\n return {\n decalCatalog(c) {\n catalog ??= new DecalCatalog(() => getAtlas(c.palette));\n return catalog.entries(c);\n },\n mount,\n update,\n frame(objectIds, options = {}) {\n pendingFrame = objectIds.length ? { ids: [...objectIds], options } : null;\n },\n contentBounds(objectId) {\n return m?.views.contentBounds(objectId);\n },\n thumbnail,\n bakeSprite,\n // Releases the canvas, GPU resources and pending meshes, but stays reusable: React StrictMode (and a\n // remounted page) mounts again after dispose. The evaluator's lifetime belongs to the app.\n dispose() {\n dispose();\n driver.reset();\n atlas?.dispose();\n atlas = null;\n catalog = null;\n },\n };\n}\n", "import type { ColorRef, DecalArt, Design, Id, Palette } from \"@dreamy/api\";\nimport { CanvasTexture, LinearFilter, SRGBColorSpace } from \"three\";\nimport { cssOf, hexOf } from \"../math/colors.js\";\nimport { BUILTIN_ART, type BuiltinArt } from \"./builtin-art.js\";\nimport { DECAL_CELL, DECAL_COLS, DECAL_ROWS } from \"./decal-limits.js\";\nimport type { DecalArtInfo } from \"./decal-uniforms.js\";\nimport { paintDesign } from \"./design-raster.js\";\n\ntype Cell = {\n readonly index: number;\n readonly canvas: HTMLCanvasElement;\n /** Palette refs the art used: a palette edit re-rasters only cells that use a changed slot. */\n slots: Set<ColorRef>;\n /** Built-in art, or the design's shapes last rasterized. */\n readonly builtin?: BuiltinArt;\n design?: Design;\n version: number;\n};\n\nconst MISSING: DecalArtInfo = { cell: 0, tintable: false, missing: true };\n\n/**\n * One canvas atlas per viewport (the POC's decal atlas): built-in art first, then one cell per design of the\n * open creation. Palette edits and design saves re-raster only the cells they touch; the GPU upload happens at\n * most once per frame (`flush`).\n */\nexport class DecalAtlas {\n readonly canvas: HTMLCanvasElement;\n readonly texture: CanvasTexture;\n private readonly ctx: CanvasRenderingContext2D;\n private readonly builtins = new Map<BuiltinArt, Cell>();\n private readonly designs = new Map<Id, Cell>();\n private readonly free: number[] = [];\n private palette: Palette | null = null;\n private dirty = false;\n\n constructor(palette: Palette) {\n this.canvas = document.createElement(\"canvas\");\n this.canvas.width = DECAL_COLS * DECAL_CELL;\n this.canvas.height = DECAL_ROWS * DECAL_CELL;\n this.ctx = this.canvas.getContext(\"2d\") as CanvasRenderingContext2D;\n let idx = 0;\n for (const art of BUILTIN_ART) {\n if (art.room !== undefined) continue; // procedural: no atlas cell\n this.builtins.set(art, this.newCell(idx++, art));\n }\n for (let i = idx; i < DECAL_COLS * DECAL_ROWS; i++) this.free.push(i);\n this.texture = new CanvasTexture(this.canvas);\n this.texture.colorSpace = SRGBColorSpace;\n this.texture.minFilter = this.texture.magFilter = LinearFilter;\n this.texture.generateMipmaps = false;\n this.texture.premultiplyAlpha = true;\n this.setPalette(palette);\n }\n\n private newCell(index: number, builtin?: BuiltinArt): Cell {\n const canvas = document.createElement(\"canvas\");\n canvas.width = canvas.height = DECAL_CELL;\n return builtin ? { index, canvas, slots: new Set(), builtin, version: 0 } : { index, canvas, slots: new Set(), version: 0 };\n }\n\n private raster(cell: Cell): void {\n const p = this.palette;\n if (!p) return;\n const g = cell.canvas.getContext(\"2d\") as CanvasRenderingContext2D;\n const slots = new Set<ColorRef>();\n const paint = (ref: ColorRef) => { slots.add(ref); return cssOf(ref, p); };\n g.clearRect(0, 0, DECAL_CELL, DECAL_CELL);\n g.lineCap = \"round\"; g.lineJoin = \"round\";\n if (cell.builtin) cell.builtin.draw(g, DECAL_CELL, paint);\n else if (cell.design) paintDesign(g, cell.design.shapes, paint, slots);\n cell.slots = slots;\n cell.version++;\n const x = (cell.index % DECAL_COLS) * DECAL_CELL, y = Math.floor(cell.index / DECAL_COLS) * DECAL_CELL;\n this.ctx.clearRect(x, y, DECAL_CELL, DECAL_CELL);\n this.ctx.drawImage(cell.canvas, x, y);\n this.dirty = true;\n }\n\n /** Re-rasters the cells that use a slot whose color changed. */\n setPalette(palette: Palette): void {\n const prev = this.palette;\n this.palette = palette;\n const changed = (ref: ColorRef) => !prev || hexOf(ref, prev) !== hexOf(ref, palette);\n for (const c of [...this.builtins.values(), ...this.designs.values()]) {\n if (!prev || [...c.slots].some(changed)) this.raster(c);\n }\n }\n\n /** Cells for the creation's designs: new / changed ones rasterized, deleted ones freed. */\n setDesigns(designs: readonly Design[]): void {\n const keep = new Set(designs.map(d => d.id));\n for (const [id, c] of this.designs) {\n if (keep.has(id)) continue;\n this.designs.delete(id);\n this.ctx.clearRect((c.index % DECAL_COLS) * DECAL_CELL, Math.floor(c.index / DECAL_COLS) * DECAL_CELL, DECAL_CELL, DECAL_CELL);\n this.free.push(c.index);\n this.free.sort((a, b) => a - b);\n this.dirty = true;\n }\n for (const d of designs) {\n let c = this.designs.get(d.id);\n if (!c) {\n const idx = this.free.shift();\n if (idx === undefined) continue; // atlas full: the design draws as missing\n c = this.newCell(idx);\n this.designs.set(d.id, c);\n }\n if (c.design !== d && JSON.stringify(c.design?.shapes) !== JSON.stringify(d.shapes)) { c.design = d; this.raster(c); }\n else c.design = d;\n }\n }\n\n /** At most one GPU upload per frame. */\n flush(): void {\n if (!this.dirty) return;\n this.dirty = false;\n this.texture.needsUpdate = true;\n }\n\n private cellOf(art: DecalArt): Cell | undefined {\n if (art.kind === \"design\") return this.designs.get(art.designId);\n for (const [b, c] of this.builtins) if (b.category === art.category && b.name === art.name) return c;\n return undefined;\n }\n\n builtinOf(art: DecalArt): BuiltinArt | undefined {\n return art.kind === \"builtin\" ? BUILTIN_ART.find(b => b.category === art.category && b.name === art.name) : undefined;\n }\n\n info(art: DecalArt): DecalArtInfo {\n const b = this.builtinOf(art);\n if (b?.room !== undefined) return { cell: 0, tintable: true, room: b.room };\n const c = this.cellOf(art);\n if (!c) return MISSING;\n return { cell: c.index, tintable: !!b?.tintable };\n }\n\n /** The art's own canvas (ghost preview, thumbnails), and a version that changes on every re-raster. */\n cellCanvas(art: DecalArt): { canvas: HTMLCanvasElement; version: number } | undefined {\n const c = this.cellOf(art);\n return c ? { canvas: c.canvas, version: c.version } : undefined;\n }\n\n dispose(): void {\n this.texture.dispose();\n }\n}\n", "import type { DesignShape } from \"@dreamy/api\";\n\n/** Built-in decals drawn as designs (palette-driven), from the POC's BUILTIN_DOCS. */\nexport const BUILTIN_DOCS: Record<string, { readonly name: string; readonly category: \"eye\" | \"mouth\" | \"mark\"; readonly shapes: readonly DesignShape[] }> = {\n u6: {\n name: \"Glossy Eye\", category: \"eye\",\n shapes: [\n { d: \"M106.14 64C106.14 96.41 86.31 122.68 61.84 122.68C37.38 122.68 17.54 96.41 17.54 64C17.54 31.59 37.38 5.32 61.84 5.32C86.31 5.32 106.14 31.59 106.14 64Z\", fill: \"eye\", stroke: \"none\", width: 6, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M105.63 63.86C105.63 95.73 87.39 121.56 64.88 121.56C42.36 121.56 24.12 95.73 24.12 63.86C24.12 31.99 42.36 6.15 64.88 6.15C87.39 6.15 105.63 31.99 105.63 63.86Z\", fill: \"shadow\", stroke: \"black\", width: 0, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M96.08 63.61C96.08 96.02 79.69 122.29 59.48 122.29C39.27 122.29 22.89 96.02 22.89 63.61C22.89 31.2 39.27 4.93 59.48 4.93C79.69 4.93 96.08 31.2 96.08 63.61Z\", fill: \"eye\", stroke: \"none\", width: 6, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M77 66C77 80.36 68.94 92 59 92C49.06 92 41 80.36 41 66C41 51.64 49.06 40 59 40C68.94 40 77 51.64 77 66Z\", fill: \"pupil\", stroke: \"none\", width: 6, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M58.2 36.12C58.2 46.27 52.09 54.5 44.54 54.5C37 54.5 30.88 46.27 30.88 36.12C30.88 25.98 37 17.75 44.54 17.75C52.09 17.75 58.2 25.98 58.2 36.12Z\", fill: \"teeth\", stroke: \"none\", width: 6, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M84.36 105.29C84.36 112.29 73.52 117.96 60.16 117.96C46.8 117.96 35.97 112.29 35.97 105.29C35.97 98.29 46.8 92.62 60.16 92.62C73.52 92.62 84.36 98.29 84.36 105.29Z\", fill: \"light\", stroke: \"none\", width: 6, cap: \"round\", join: \"round\", rule: \"nonzero\" }\n ]\n },\n u9: {\n name: \"Brow Eye\", category: \"eye\",\n shapes: [\n { d: \"M80.23 59.74C80.23 77.52 65 91.92 46.2 91.92C27.41 91.92 12.18 77.52 12.18 59.74C12.18 41.97 27.41 27.56 46.2 27.56C65 27.56 80.23 41.97 80.23 59.74Z\", fill: \"eye\", stroke: \"none\", width: 6, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M64 62C64 71.94 55.94 80 46 80C36.06 80 28 71.94 28 62C28 52.06 36.06 44 46 44C55.94 44 64 52.06 64 62Z\", fill: \"pupil\", stroke: \"none\", width: 6, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M14.98 62.7L22.1 42.28L38.66 31.34L85.32 18.96L114.02 17.34\", fill: \"none\", stroke: \"black\", width: 6, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M45.32 48.2C45.32 53.29 41.14 57.41 35.99 57.41C30.83 57.41 26.66 53.29 26.66 48.2C26.66 43.11 30.83 38.99 35.99 38.99C41.14 38.99 45.32 43.11 45.32 48.2Z\", fill: \"teeth\", stroke: \"none\", width: 6, cap: \"round\", join: \"round\", rule: \"nonzero\" }\n ]\n },\n u7: {\n name: \"Insect Mouth\", category: \"mouth\",\n shapes: [\n { d: \"M38.26 61.78L39.81 71.12L44.29 76.73L53.37 81L49.91 75.41L48.86 70.37L50.11 60.53Z\", fill: \"black\", stroke: \"none\", width: 6, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { twin: true, d: \"M89.74 61.78L88.19 71.12L83.71 76.73L74.63 81L78.09 75.41L79.14 70.37L77.89 60.53Z\", fill: \"black\", stroke: \"none\", width: 6, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M92.28 54.21C92.28 63.03 79.74 70.17 64.28 70.17C48.81 70.17 36.27 63.03 36.27 54.21C36.27 45.39 48.81 38.25 64.28 38.25C79.74 38.25 92.28 45.39 92.28 54.21Z\", fill: \"detail\", stroke: \"none\", width: 1, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M85.77 53.38C85.77 61.45 74.84 67.98 61.36 67.98C47.87 67.98 36.94 61.45 36.94 53.38C36.94 45.32 47.87 38.79 61.36 38.79C74.84 38.79 85.77 45.32 85.77 53.38Z\", fill: \"light\", stroke: \"none\", width: 1, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M61.29 45.48C61.29 47.63 57.45 49.37 52.71 49.37C47.97 49.37 44.13 47.63 44.13 45.48C44.13 43.32 47.97 41.58 52.71 41.58C57.45 41.58 61.29 43.32 61.29 45.48Z\", fill: \"teeth\", stroke: \"none\", width: 6, cap: \"round\", join: \"round\", rule: \"nonzero\" }\n ]\n },\n u10: {\n name: \"Cat Muzzle\", category: \"mouth\",\n shapes: [\n { d: \"M32.79 86.18L39.58 99.34L51.6 101.67L64.09 92.94L64.04 74.56L58.85 73.92L48.54 67.64L39.68 58.98\", fill: \"none\", stroke: \"black\", width: 3.5, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { twin: true, d: \"M95.21 86.18L88.42 99.34L76.4 101.67L63.91 92.94L63.96 74.56L69.15 73.92L79.46 67.64L88.32 58.98\", fill: \"none\", stroke: \"black\", width: 3.5, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M36.03 54.69L33.78 52.95L31.95 54.77L32.33 57.17L35.23 57.94L40.24 59.79Z\", fill: \"black\", stroke: \"black\", width: 3, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { twin: true, d: \"M91.97 54.69L94.22 52.95L96.05 54.77L95.67 57.17L92.77 57.94L87.76 59.79Z\", fill: \"black\", stroke: \"black\", width: 3, cap: \"round\", join: \"round\", rule: \"nonzero\" }\n ]\n },\n u11: {\n name: \"Octopus Eye\", category: \"eye\",\n shapes: [\n { d: \"M112.3 61.21C112.3 88.14 90.51 109.97 63.61 109.97C36.72 109.97 14.92 88.14 14.92 61.21C14.92 34.29 36.72 12.46 63.61 12.46C90.51 12.46 112.3 34.29 112.3 61.21Z\", fill: \"eye\", stroke: \"black\", width: 2.5, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M109.35 60.56C109.35 86.43 88.61 107.4 63.02 107.4C37.44 107.4 16.69 86.43 16.69 60.56C16.69 34.69 37.44 13.72 63.02 13.72C88.61 13.72 109.35 34.69 109.35 60.56Z\", fill: \"light\", stroke: \"none\", width: 2.5, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M109.6 62.73C109.6 87.34 91.83 107.3 69.9 107.3C47.97 107.3 30.19 87.34 30.19 62.73C30.19 38.11 47.97 18.16 69.9 18.16C91.83 18.16 109.6 38.11 109.6 62.73Z\", fill: \"eye\", stroke: \"none\", width: 2.5, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M112.07 63.04C112.07 87.96 93.58 108.16 70.77 108.16C47.96 108.16 29.47 87.96 29.47 63.04C29.47 38.13 47.96 17.93 70.77 17.93C93.58 17.93 112.07 38.13 112.07 63.04Z\", fill: \"shadow\", stroke: \"none\", width: 2.5, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M107.02 60.45C107.02 78.5 87.6 93.14 63.63 93.14C39.66 93.14 20.24 78.5 20.24 60.45C20.24 42.39 39.66 27.76 63.63 27.76C87.6 27.76 107.02 42.39 107.02 60.45Z\", fill: \"eye\", stroke: \"none\", width: 2.5, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M64.23 73.9L74.78 71.6L83.65 71.52L89.74 74.97L99.41 73.74L104.59 69.82L106.88 63.77L106.27 54.47L103.63 50.36L95.11 47.66L85.43 48.03L76.81 52.15L69.83 52.88L63.98 54.18\", fill: \"pupil\", stroke: \"light\", width: 2, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { twin: true, d: \"M63.77 73.9L53.22 71.6L44.35 71.52L38.26 74.97L28.59 73.74L23.41 69.82L21.12 63.77L21.73 54.47L24.37 50.36L32.89 47.66L42.57 48.03L51.19 52.15L58.17 52.88L64.02 54.18\", fill: \"pupil\", stroke: \"light\", width: 2, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M49.95 33.56C49.95 38.93 45.24 43.29 39.42 43.29C33.6 43.29 28.88 38.93 28.88 33.56C28.88 28.18 33.6 23.82 39.42 23.82C45.24 23.82 49.95 28.18 49.95 33.56Z\", fill: \"teeth\", stroke: \"none\", width: 2, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M42.45 82.48C42.45 85.28 39.92 87.54 36.79 87.54C33.66 87.54 31.12 85.28 31.12 82.48C31.12 79.69 33.66 77.42 36.79 77.42C39.92 77.42 42.45 79.69 42.45 82.48Z\", fill: \"teeth\", stroke: \"none\", width: 2, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M112.14 61.15C112.14 88.08 90.35 109.91 63.45 109.91C36.56 109.91 14.76 88.08 14.76 61.15C14.76 34.22 36.56 12.39 63.45 12.39C90.35 12.39 112.14 34.22 112.14 61.15Z\", fill: \"none\", stroke: \"black\", width: 3, cap: \"round\", join: \"round\", rule: \"nonzero\" }\n ]\n },\n // the app's own (not from the POC): a reptile eye for the Dragon, shaded like Glossy / Octopus Eye\n u12: {\n name: \"Dragon Eye\", category: \"eye\",\n shapes: [\n { d: \"M14 66C30 32 98 32 114 66C98 96 30 96 14 66Z\", fill: \"eye\", stroke: \"black\", width: 5, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M14 66C30 32 98 32 114 66C96 50 32 50 14 66Z\", fill: \"shadow\", stroke: \"none\", width: 0, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M36 79A28 10 0 1 0 92 79A28 10 0 1 0 36 79Z\", fill: \"light\", stroke: \"none\", width: 0, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M64 42C72 54 72 78 64 90C56 78 56 54 64 42Z\", fill: \"pupil\", stroke: \"none\", width: 0, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M42 54A8 6 0 1 0 58 54A8 6 0 1 0 42 54Z\", fill: \"teeth\", stroke: \"none\", width: 0, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M76 79A3.5 3.5 0 1 0 83 79A3.5 3.5 0 1 0 76 79Z\", fill: \"teeth\", stroke: \"none\", width: 0, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M14 66C30 32 98 32 114 66C98 96 30 96 14 66Z\", fill: \"none\", stroke: \"black\", width: 5, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n ]\n },\n // the app's own: an insect's compound eye, an oval with no pupil, shaded like Glossy / Octopus Eye\n u13: {\n name: \"Bug Eye\", category: \"eye\",\n shapes: [\n { d: \"M24 64A40 52 0 1 0 104 64A40 52 0 1 0 24 64Z\", fill: \"eye\", stroke: \"black\", width: 4, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M101.6 46.2A40 52 0 0 1 29.4 90C56 98 90 84 101.6 46.2Z\", fill: \"shadow\", stroke: \"none\", width: 0, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M34 52A18 24 0 1 0 70 52A18 24 0 1 0 34 52Z\", fill: \"light\", stroke: \"none\", width: 0, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M42 38A7 9 0 1 0 56 38A7 9 0 1 0 42 38Z\", fill: \"teeth\", stroke: \"none\", width: 0, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M78 94A3 3 0 1 0 84 94A3 3 0 1 0 78 94Z\", fill: \"teeth\", stroke: \"none\", width: 0, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M24 64A40 52 0 1 0 104 64A40 52 0 1 0 24 64Z\", fill: \"none\", stroke: \"black\", width: 4, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n ]\n },\n // the app's own: a fly's compound eye, honeycomb facets\n u14: {\n name: \"Fly Eye\", category: \"eye\",\n shapes: [\n { d: \"M20 64A44 50 0 1 0 108 64A44 50 0 1 0 20 64Z\", fill: \"eye\", stroke: \"black\", width: 4, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M56.6 20.5A2.4 2.4 0 1 0 61.4 20.5A2.4 2.4 0 1 0 56.6 20.5ZM66.6 20.5A2.4 2.4 0 1 0 71.4 20.5A2.4 2.4 0 1 0 66.6 20.5ZM41.6 29.2A2.4 2.4 0 1 0 46.4 29.2A2.4 2.4 0 1 0 41.6 29.2ZM51.6 29.2A2.4 2.4 0 1 0 56.4 29.2A2.4 2.4 0 1 0 51.6 29.2ZM61.6 29.2A2.4 2.4 0 1 0 66.4 29.2A2.4 2.4 0 1 0 61.6 29.2ZM71.6 29.2A2.4 2.4 0 1 0 76.4 29.2A2.4 2.4 0 1 0 71.6 29.2ZM81.6 29.2A2.4 2.4 0 1 0 86.4 29.2A2.4 2.4 0 1 0 81.6 29.2ZM36.6 37.9A2.4 2.4 0 1 0 41.4 37.9A2.4 2.4 0 1 0 36.6 37.9ZM46.6 37.9A2.4 2.4 0 1 0 51.4 37.9A2.4 2.4 0 1 0 46.6 37.9ZM56.6 37.9A2.4 2.4 0 1 0 61.4 37.9A2.4 2.4 0 1 0 56.6 37.9ZM66.6 37.9A2.4 2.4 0 1 0 71.4 37.9A2.4 2.4 0 1 0 66.6 37.9ZM76.6 37.9A2.4 2.4 0 1 0 81.4 37.9A2.4 2.4 0 1 0 76.6 37.9ZM86.6 37.9A2.4 2.4 0 1 0 91.4 37.9A2.4 2.4 0 1 0 86.6 37.9ZM31.6 46.6A2.4 2.4 0 1 0 36.4 46.6A2.4 2.4 0 1 0 31.6 46.6ZM41.6 46.6A2.4 2.4 0 1 0 46.4 46.6A2.4 2.4 0 1 0 41.6 46.6ZM51.6 46.6A2.4 2.4 0 1 0 56.4 46.6A2.4 2.4 0 1 0 51.6 46.6ZM61.6 46.6A2.4 2.4 0 1 0 66.4 46.6A2.4 2.4 0 1 0 61.6 46.6ZM71.6 46.6A2.4 2.4 0 1 0 76.4 46.6A2.4 2.4 0 1 0 71.6 46.6ZM81.6 46.6A2.4 2.4 0 1 0 86.4 46.6A2.4 2.4 0 1 0 81.6 46.6ZM91.6 46.6A2.4 2.4 0 1 0 96.4 46.6A2.4 2.4 0 1 0 91.6 46.6ZM26.6 55.3A2.4 2.4 0 1 0 31.4 55.3A2.4 2.4 0 1 0 26.6 55.3ZM36.6 55.3A2.4 2.4 0 1 0 41.4 55.3A2.4 2.4 0 1 0 36.6 55.3ZM46.6 55.3A2.4 2.4 0 1 0 51.4 55.3A2.4 2.4 0 1 0 46.6 55.3ZM56.6 55.3A2.4 2.4 0 1 0 61.4 55.3A2.4 2.4 0 1 0 56.6 55.3ZM66.6 55.3A2.4 2.4 0 1 0 71.4 55.3A2.4 2.4 0 1 0 66.6 55.3ZM76.6 55.3A2.4 2.4 0 1 0 81.4 55.3A2.4 2.4 0 1 0 76.6 55.3ZM86.6 55.3A2.4 2.4 0 1 0 91.4 55.3A2.4 2.4 0 1 0 86.6 55.3ZM96.6 55.3A2.4 2.4 0 1 0 101.4 55.3A2.4 2.4 0 1 0 96.6 55.3ZM31.6 64A2.4 2.4 0 1 0 36.4 64A2.4 2.4 0 1 0 31.6 64ZM41.6 64A2.4 2.4 0 1 0 46.4 64A2.4 2.4 0 1 0 41.6 64ZM51.6 64A2.4 2.4 0 1 0 56.4 64A2.4 2.4 0 1 0 51.6 64ZM61.6 64A2.4 2.4 0 1 0 66.4 64A2.4 2.4 0 1 0 61.6 64ZM71.6 64A2.4 2.4 0 1 0 76.4 64A2.4 2.4 0 1 0 71.6 64ZM81.6 64A2.4 2.4 0 1 0 86.4 64A2.4 2.4 0 1 0 81.6 64ZM91.6 64A2.4 2.4 0 1 0 96.4 64A2.4 2.4 0 1 0 91.6 64ZM26.6 72.7A2.4 2.4 0 1 0 31.4 72.7A2.4 2.4 0 1 0 26.6 72.7ZM36.6 72.7A2.4 2.4 0 1 0 41.4 72.7A2.4 2.4 0 1 0 36.6 72.7ZM46.6 72.7A2.4 2.4 0 1 0 51.4 72.7A2.4 2.4 0 1 0 46.6 72.7ZM56.6 72.7A2.4 2.4 0 1 0 61.4 72.7A2.4 2.4 0 1 0 56.6 72.7ZM66.6 72.7A2.4 2.4 0 1 0 71.4 72.7A2.4 2.4 0 1 0 66.6 72.7ZM76.6 72.7A2.4 2.4 0 1 0 81.4 72.7A2.4 2.4 0 1 0 76.6 72.7ZM86.6 72.7A2.4 2.4 0 1 0 91.4 72.7A2.4 2.4 0 1 0 86.6 72.7ZM96.6 72.7A2.4 2.4 0 1 0 101.4 72.7A2.4 2.4 0 1 0 96.6 72.7ZM31.6 81.4A2.4 2.4 0 1 0 36.4 81.4A2.4 2.4 0 1 0 31.6 81.4ZM41.6 81.4A2.4 2.4 0 1 0 46.4 81.4A2.4 2.4 0 1 0 41.6 81.4ZM51.6 81.4A2.4 2.4 0 1 0 56.4 81.4A2.4 2.4 0 1 0 51.6 81.4ZM61.6 81.4A2.4 2.4 0 1 0 66.4 81.4A2.4 2.4 0 1 0 61.6 81.4ZM71.6 81.4A2.4 2.4 0 1 0 76.4 81.4A2.4 2.4 0 1 0 71.6 81.4ZM81.6 81.4A2.4 2.4 0 1 0 86.4 81.4A2.4 2.4 0 1 0 81.6 81.4ZM91.6 81.4A2.4 2.4 0 1 0 96.4 81.4A2.4 2.4 0 1 0 91.6 81.4ZM36.6 90.1A2.4 2.4 0 1 0 41.4 90.1A2.4 2.4 0 1 0 36.6 90.1ZM46.6 90.1A2.4 2.4 0 1 0 51.4 90.1A2.4 2.4 0 1 0 46.6 90.1ZM56.6 90.1A2.4 2.4 0 1 0 61.4 90.1A2.4 2.4 0 1 0 56.6 90.1ZM66.6 90.1A2.4 2.4 0 1 0 71.4 90.1A2.4 2.4 0 1 0 66.6 90.1ZM76.6 90.1A2.4 2.4 0 1 0 81.4 90.1A2.4 2.4 0 1 0 76.6 90.1ZM86.6 90.1A2.4 2.4 0 1 0 91.4 90.1A2.4 2.4 0 1 0 86.6 90.1ZM41.6 98.8A2.4 2.4 0 1 0 46.4 98.8A2.4 2.4 0 1 0 41.6 98.8ZM51.6 98.8A2.4 2.4 0 1 0 56.4 98.8A2.4 2.4 0 1 0 51.6 98.8ZM61.6 98.8A2.4 2.4 0 1 0 66.4 98.8A2.4 2.4 0 1 0 61.6 98.8ZM71.6 98.8A2.4 2.4 0 1 0 76.4 98.8A2.4 2.4 0 1 0 71.6 98.8ZM81.6 98.8A2.4 2.4 0 1 0 86.4 98.8A2.4 2.4 0 1 0 81.6 98.8ZM56.6 107.5A2.4 2.4 0 1 0 61.4 107.5A2.4 2.4 0 1 0 56.6 107.5ZM66.6 107.5A2.4 2.4 0 1 0 71.4 107.5A2.4 2.4 0 1 0 66.6 107.5Z\", fill: \"shadow\", stroke: \"none\", width: 0, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M105.3 46.9A44 50 0 0 1 25.9 89C55.2 97 90.4 84 105.3 46.9Z\", fill: \"shadow\", stroke: \"none\", width: 0, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M32 48A18 24 0 1 0 68 48A18 24 0 1 0 32 48Z\", fill: \"light\", stroke: \"none\", width: 0, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M40 36A7 9 0 1 0 54 36A7 9 0 1 0 40 36Z\", fill: \"teeth\", stroke: \"none\", width: 0, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M77 94A3 3 0 1 0 83 94A3 3 0 1 0 77 94Z\", fill: \"teeth\", stroke: \"none\", width: 0, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M20 64A44 50 0 1 0 108 64A44 50 0 1 0 20 64Z\", fill: \"none\", stroke: \"black\", width: 4, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n ]\n },\n // the app's own: a spider's cluster of glossy eyes, one decal\n u15: {\n name: \"Spider Eyes\", category: \"eye\",\n shapes: [\n { d: \"M25 74A19 19 0 1 0 63 74A19 19 0 1 0 25 74Z\", fill: \"pupil\", stroke: \"black\", width: 3, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M32.2 82.5A11.8 6.1 0 1 0 55.8 82.5A11.8 6.1 0 1 0 32.2 82.5Z\", fill: \"light\", stroke: \"none\", width: 0, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M32.4 66.8A4.9 4.9 0 1 0 42.3 66.8A4.9 4.9 0 1 0 32.4 66.8Z\", fill: \"teeth\", stroke: \"none\", width: 0, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M65 74A19 19 0 1 0 103 74A19 19 0 1 0 65 74Z\", fill: \"pupil\", stroke: \"black\", width: 3, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M72.2 82.5A11.8 6.1 0 1 0 95.8 82.5A11.8 6.1 0 1 0 72.2 82.5Z\", fill: \"light\", stroke: \"none\", width: 0, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M72.4 66.8A4.9 4.9 0 1 0 82.3 66.8A4.9 4.9 0 1 0 72.4 66.8Z\", fill: \"teeth\", stroke: \"none\", width: 0, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M10 46A10 10 0 1 0 30 46A10 10 0 1 0 10 46Z\", fill: \"pupil\", stroke: \"black\", width: 3, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M13.8 50.5A6.2 3.2 0 1 0 26.2 50.5A6.2 3.2 0 1 0 13.8 50.5Z\", fill: \"light\", stroke: \"none\", width: 0, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M13.9 42.2A2.6 2.6 0 1 0 19.1 42.2A2.6 2.6 0 1 0 13.9 42.2Z\", fill: \"teeth\", stroke: \"none\", width: 0, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M98 46A10 10 0 1 0 118 46A10 10 0 1 0 98 46Z\", fill: \"pupil\", stroke: \"black\", width: 3, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M101.8 50.5A6.2 3.2 0 1 0 114.2 50.5A6.2 3.2 0 1 0 101.8 50.5Z\", fill: \"light\", stroke: \"none\", width: 0, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M101.9 42.2A2.6 2.6 0 1 0 107.1 42.2A2.6 2.6 0 1 0 101.9 42.2Z\", fill: \"teeth\", stroke: \"none\", width: 0, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M40 36A8 8 0 1 0 56 36A8 8 0 1 0 40 36Z\", fill: \"pupil\", stroke: \"black\", width: 3, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M43 39.6A5 2.6 0 1 0 53 39.6A5 2.6 0 1 0 43 39.6Z\", fill: \"light\", stroke: \"none\", width: 0, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M43.1 33A2.1 2.1 0 1 0 47.3 33A2.1 2.1 0 1 0 43.1 33Z\", fill: \"teeth\", stroke: \"none\", width: 0, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M72 36A8 8 0 1 0 88 36A8 8 0 1 0 72 36Z\", fill: \"pupil\", stroke: \"black\", width: 3, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M75 39.6A5 2.6 0 1 0 85 39.6A5 2.6 0 1 0 75 39.6Z\", fill: \"light\", stroke: \"none\", width: 0, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M75.1 33A2.1 2.1 0 1 0 79.3 33A2.1 2.1 0 1 0 75.1 33Z\", fill: \"teeth\", stroke: \"none\", width: 0, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n ]\n },\n // the app's own: a beetle's glossy dark eye\n u16: {\n name: \"Beetle Eye\", category: \"eye\",\n shapes: [\n { d: \"M30 40C46 18 98 22 104 56C110 90 82 112 58 102C44 96 50 80 42 72C34 64 20 54 30 40Z\", fill: \"pupil\", stroke: \"black\", width: 4, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M40 46A26 10 0 1 0 92 46A26 10 0 1 0 40 46Z\", fill: \"light\", stroke: \"none\", width: 0, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M74 86A10 6 0 1 0 94 86A10 6 0 1 0 74 86Z\", fill: \"light\", stroke: \"none\", width: 0, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M48 40A6 4 0 1 0 60 40A6 4 0 1 0 48 40Z\", fill: \"teeth\", stroke: \"none\", width: 0, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M30 40C46 18 98 22 104 56C110 90 82 112 58 102C44 96 50 80 42 72C34 64 20 54 30 40Z\", fill: \"none\", stroke: \"black\", width: 4, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n ]\n },\n // the app's own: a mantis eye with its pseudopupil\n u17: {\n name: \"Mantis Eye\", category: \"eye\",\n shapes: [\n { d: \"M64 10C92 20 110 60 100 92C92 116 40 118 30 92C20 64 40 22 64 10Z\", fill: \"eye\", stroke: \"black\", width: 4, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M100 92C92 116 40 118 30 92C46 106 84 106 100 92Z\", fill: \"shadow\", stroke: \"none\", width: 0, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M38 46A14 22 0 1 0 66 46A14 22 0 1 0 38 46Z\", fill: \"light\", stroke: \"none\", width: 0, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M59 68A7 9 0 1 0 73 68A7 9 0 1 0 59 68Z\", fill: \"pupil\", stroke: \"none\", width: 0, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M45 34A5 6 0 1 0 55 34A5 6 0 1 0 45 34Z\", fill: \"teeth\", stroke: \"none\", width: 0, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M64 10C92 20 110 60 100 92C92 116 40 118 30 92C20 64 40 22 64 10Z\", fill: \"none\", stroke: \"black\", width: 4, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n ]\n },\n // the app's own: a snake's mouth with nostrils and two white fangs (palette-driven, not a tinted line)\n u18: {\n name: \"Snake Mouth\", category: \"mouth\",\n shapes: [\n { d: \"M47 34A5 3.5 -20 1 0 57 34A5 3.5 -20 1 0 47 34Z\", fill: \"black\", stroke: \"none\", width: 0, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { twin: true, d: \"M71 34A5 3.5 20 1 0 81 34A5 3.5 20 1 0 71 34Z\", fill: \"black\", stroke: \"none\", width: 0, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M36 72L49 75L43 101Z\", fill: \"teeth\", stroke: \"black\", width: 3, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { twin: true, d: \"M92 72L79 75L85 101Z\", fill: \"teeth\", stroke: \"black\", width: 3, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M14 64C34 80 94 80 114 64\", fill: \"none\", stroke: \"black\", width: 6, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n ]\n },\n // the app's own: a cat eye after the user's example: white sclera around a big iris, a tear-drop slit pupil, a\n // bright catchlight, a lighter lower iris and a thick upper lid that flicks out at the outer corner\n u19: {\n name: \"Cat Eye\", category: \"eye\",\n shapes: [\n { d: \"M16 70C16 44 40 30 64 30C90 30 110 44 114 60C112 86 92 104 64 104C38 104 16 94 16 70Z\", fill: \"teeth\", stroke: \"none\", width: 0, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M32 68A31 31 0 1 0 94 68A31 31 0 1 0 32 68Z\", fill: \"eye\", stroke: \"none\", width: 0, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M32 68A31 31 0 0 1 94 68C82 57 44 57 32 68Z\", fill: \"shadow\", stroke: \"none\", width: 0, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M40 85A23 11 0 1 0 86 85A23 11 0 1 0 40 85Z\", fill: \"light\", stroke: \"none\", width: 0, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M63 40C73 56 75 76 63 97C51 76 53 56 63 40Z\", fill: \"pupil\", stroke: \"none\", width: 0, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M64 50A10 10 0 1 0 84 50A10 10 0 1 0 64 50Z\", fill: \"teeth\", stroke: \"none\", width: 0, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M42 84A4 4 0 1 0 50 84A4 4 0 1 0 42 84Z\", fill: \"teeth\", stroke: \"none\", width: 0, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M12 70C16 42 40 26 64 26C92 26 112 40 120 52\", fill: \"none\", stroke: \"black\", width: 8, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n ]\n },\n\n // the app's own: a cat's mouth with its nose: a dark rounded triangle with a highlight, a philtrum and a W mouth\n u20: {\n name: \"Cat Mouth\", category: \"mouth\",\n shapes: [\n { d: \"M46 32C56 27 72 27 82 32C85 34 84 38 82 41L68 55C66 57 62 57 60 55L46 41C44 38 43 34 46 32Z\", fill: \"black\", stroke: \"none\", width: 0, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M53 36A6 3 0 1 0 65 36A6 3 0 1 0 53 36Z\", fill: \"light\", stroke: \"none\", width: 0, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M64 56L64 68\", fill: \"none\", stroke: \"black\", width: 4, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M38 66C44 78 58 78 64 68C70 78 84 78 90 66\", fill: \"none\", stroke: \"black\", width: 4, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n ]\n },\n\n // the app's own: an ape's muzzle: a broad dark nose with nostrils and a wide mouth line\n u21: {\n name: \"Ape Mouth\", category: \"mouth\",\n shapes: [\n { d: \"M40 44C44 30 84 30 88 44C90 56 78 62 64 62C50 62 38 56 40 44Z\", fill: \"shadow\", stroke: \"none\", width: 0, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M47 49A7 5 -20 1 0 61 49A7 5 -20 1 0 47 49Z\", fill: \"black\", stroke: \"none\", width: 0, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { twin: true, d: \"M67 49A7 5 20 1 0 81 49A7 5 20 1 0 67 49Z\", fill: \"black\", stroke: \"none\", width: 0, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M30 86C48 94 80 94 98 86\", fill: \"none\", stroke: \"black\", width: 5, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n ]\n },\n u5: {\n name: \"Wing Circles\", category: \"mark\",\n shapes: [\n { d: \"M72.38 41.13C72.38 56.44 60.08 68.84 44.91 68.84C29.74 68.84 17.45 56.44 17.45 41.13C17.45 25.82 29.74 13.42 44.91 13.42C60.08 13.42 72.38 25.82 72.38 41.13Z\", fill: \"detail\", stroke: \"none\", width: 6, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M112.23 34.99C112.23 42.84 106.03 49.21 98.37 49.21C90.71 49.21 84.5 42.84 84.5 34.99C84.5 27.13 90.71 20.76 98.37 20.76C106.03 20.76 112.23 27.13 112.23 34.99Z\", fill: \"custom\", stroke: \"none\", width: 6, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M94.54 80.71C94.54 90.9 86.43 99.17 76.43 99.17C66.43 99.17 58.32 90.9 58.32 80.71C58.32 70.52 66.43 62.26 76.43 62.26C86.43 62.26 94.54 70.52 94.54 80.71Z\", fill: \"highlight\", stroke: \"none\", width: 6, cap: \"round\", join: \"round\", rule: \"nonzero\" },\n { d: \"M52.35 84.67C52.35 90.9 47.35 95.95 41.18 95.95C35 95.95 30 90.9 30 84.67C30 78.43 35 73.38 41.18 73.38C47.35 73.38 52.35 78.43 52.35 84.67Z\", fill: \"pupil\", stroke: \"none\", width: 6, cap: \"round\", join: \"round\", rule: \"nonzero\" }\n ]\n }\n};\n", "/** Decal budgets and atlas layout (the POC's decals.js). */\nexport const MAX_DECALS = 64;\nexport const MAX_INTERIORS = 8;\n/** Texels per decal: 3 matrix rows, atlas params, tint, extra (kind, room, depth, seed). */\nexport const DECAL_TEX_W = 6;\n/** 1024 \u00D7 2048 atlas: the first cells hold the built-in art, the rest the creation's designs. */\nexport const DECAL_COLS = 8;\nexport const DECAL_ROWS = 16;\nexport const DECAL_CELL = 128;\n/** Half-thickness of the projection box, in decal sizes. */\nexport const DECAL_DEPTH = 0.35;\n", "import type { ColorRef, DesignPaint, DesignShape } from \"@dreamy/api\";\nimport { DECAL_CELL } from \"./decal-limits.js\";\n\n/** Art is clipped this far from the cell border: the atlas has no gutters and samples linearly. */\nexport const DESIGN_INSET = 3;\n\n/** CSS for a design paint; palette refs it used go into `slots` (palette edits re-raster only those). */\nexport function paintCss(p: DesignPaint, css: (ref: ColorRef) => string, slots: Set<ColorRef>): string | null {\n if (p === \"none\") return null;\n if (p === \"light\") return \"rgba(255, 255, 255, 0.42)\";\n if (p === \"shadow\") return \"rgba(0, 0, 0, 0.38)\";\n slots.add(p);\n return css(p);\n}\n\nconst isMod = (p: DesignPaint) => p === \"light\" || p === \"shadow\";\n\nexport function drawDesignShape(g: CanvasRenderingContext2D, sh: DesignShape, css: (ref: ColorRef) => string, slots: Set<ColorRef>, index: number): void {\n const fill = paintCss(sh.fill, css, slots), stroke = paintCss(sh.stroke, css, slots);\n if (!fill && !(stroke && sh.width > 0)) return;\n try {\n const p = new Path2D(sh.d);\n if (fill) {\n g.save();\n // Light / shadow modifiers blend over what lies beneath\n if (isMod(sh.fill) && index > 0) g.globalCompositeOperation = sh.fill === \"light\" ? \"screen\" : \"multiply\";\n g.fillStyle = fill;\n g.fill(p, sh.rule);\n g.restore();\n }\n if (stroke && sh.width > 0) {\n g.save();\n if (isMod(sh.stroke) && index > 0) g.globalCompositeOperation = \"source-atop\";\n g.lineWidth = sh.width;\n g.lineCap = sh.cap;\n g.lineJoin = sh.join;\n g.strokeStyle = stroke;\n g.stroke(p);\n g.restore();\n }\n } catch { /* a bad path draws nothing */ }\n}\n\n/** Paints a whole design (128 \u00D7 128 space) into a cell-sized context. */\nexport function paintDesign(g: CanvasRenderingContext2D, shapes: readonly DesignShape[], css: (ref: ColorRef) => string, slots: Set<ColorRef>): void {\n const S = DECAL_CELL;\n g.clearRect(0, 0, S, S);\n g.save();\n g.beginPath();\n g.rect(DESIGN_INSET, DESIGN_INSET, S - 2 * DESIGN_INSET, S - 2 * DESIGN_INSET);\n g.clip();\n shapes.forEach((sh, i) => drawDesignShape(g, sh, css, slots, i));\n g.restore();\n}\n", "import type { BuiltinDecalCategory, ColorRef, Rgb } from \"@dreamy/api\";\nimport { BUILTIN_DOCS } from \"./builtin-docs.js\";\nimport { paintDesign } from \"./design-raster.js\";\n\n/** Resolves a palette ref to CSS and records that the art used it (palette edits re-raster those cells). */\nexport type Paint = (ref: ColorRef) => string;\n\nexport type BuiltinArt = {\n readonly category: BuiltinDecalCategory;\n readonly name: string;\n readonly tintable: boolean;\n /** Default tint for tintable art. */\n readonly tint?: ColorRef;\n /** Interior room id: ray-traced in the shader, no atlas cell. */\n readonly room?: number;\n /** Interior wall color when the decal has no tint (the POC's raw defaults). */\n readonly wall?: Rgb;\n readonly draw: (g: CanvasRenderingContext2D, S: number, paint: Paint) => void;\n};\n\n/** Category order of the picker (the POC's DECAL_ORDER, built-ins only). */\nexport const DECAL_CATEGORIES: readonly BuiltinDecalCategory[] = [\"eye\", \"mouth\", \"mark\", \"door\", \"emoji\", \"interior\"];\n\nconst circ = (g: CanvasRenderingContext2D, x: number, y: number, r: number, fill: string) => { g.beginPath(); g.arc(x, y, r, 0, Math.PI * 2); g.fillStyle = fill; g.fill(); };\nconst line = (g: CanvasRenderingContext2D, w: number, col: string) => { g.lineWidth = w; g.strokeStyle = col; g.stroke(); };\nconst ell = (g: CanvasRenderingContext2D, x: number, y: number, rx: number, ry: number, fill: string | null, stroke?: string, sw = 5) => {\n g.beginPath(); g.ellipse(x, y, rx, ry, 0, 0, Math.PI * 2);\n if (fill) { g.fillStyle = fill; g.fill(); }\n if (stroke) line(g, sw, stroke);\n};\nconst rect = (g: CanvasRenderingContext2D, x: number, y: number, w: number, h: number, fill: string | null, stroke?: string, sw = 4) => {\n g.beginPath(); g.rect(x, y, w, h);\n if (fill) { g.fillStyle = fill; g.fill(); }\n if (stroke) line(g, sw, stroke);\n};\n\ntype EyeCols = { white: string; ink: string; iris: string; pupil: string };\n// Built-in eyes paint with palette slots: Eye (iris), Pupil, fixed teeth (white) and black (outlines)\nconst eye = (name: string, fn: (g: CanvasRenderingContext2D, c: EyeCols) => void): BuiltinArt => ({\n category: \"eye\", name, tintable: false,\n draw: (g, _S, paint) => fn(g, { white: paint(\"teeth\"), ink: paint(\"black\"), iris: paint(\"eye\"), pupil: paint(\"pupil\") }),\n});\nconst mouth = (name: string, fn: (g: CanvasRenderingContext2D) => void): BuiltinArt => ({\n category: \"mouth\", name, tintable: true, tint: \"black\", draw: g => { g.beginPath(); fn(g); line(g, 9, \"#fff\"); },\n});\nconst mark = (name: string, fn: (g: CanvasRenderingContext2D) => void): BuiltinArt => ({ category: \"mark\", name, tintable: true, tint: \"black\", draw: g => fn(g) });\n// Doors: tintable white art; the POC's default tint was a raw brown (0x8b5a2b), the closest palette ref is Secondary.\nconst door = (name: string, fn: (g: CanvasRenderingContext2D) => void): BuiltinArt => ({ category: \"door\", name, tintable: true, tint: \"secondary\", draw: g => fn(g) });\nconst emoji = (ch: string): BuiltinArt => ({\n category: \"emoji\", name: ch, tintable: false,\n draw: (g, S) => {\n g.font = `${S * 0.72}px \"Apple Color Emoji\",\"Segoe UI Emoji\",\"Noto Color Emoji\",sans-serif`;\n g.textAlign = \"center\"; g.textBaseline = \"middle\";\n g.fillText(ch, S / 2, S / 2 + S * 0.04);\n },\n});\nconst room = (name: string, id: number, wall: Rgb): BuiltinArt => ({ category: \"interior\", name, room: id, wall, tintable: false, draw: () => undefined });\nconst doc = (id: string): BuiltinArt => {\n const d = BUILTIN_DOCS[id];\n if (!d) throw new Error(`unknown built-in design ${id}`);\n return { category: d.category, name: d.name, tintable: false, draw: (g, _S, paint) => paintDesign(g, d.shapes, paint, new Set()) };\n};\n\nexport const BUILTIN_ART: readonly BuiltinArt[] = [\n eye(\"Round\", (g, c) => { ell(g, 64, 64, 40, 40, c.white, c.ink); circ(g, 70, 66, 19, c.iris); circ(g, 70, 66, 10, c.pupil); circ(g, 77, 59, 6, c.white); }),\n eye(\"Dot\", (g, c) => { circ(g, 64, 64, 22, c.pupil); circ(g, 71, 57, 6, c.white); }),\n eye(\"Sleepy\", (g, c) => {\n g.save(); g.beginPath(); g.rect(0, 62, 128, 70); g.clip();\n ell(g, 64, 62, 40, 30, c.white); circ(g, 64, 74, 17, c.iris); circ(g, 64, 74, 8, c.pupil);\n g.restore();\n g.beginPath(); g.ellipse(64, 62, 40, 30, 0, 0, Math.PI); line(g, 5, c.ink);\n g.beginPath(); g.moveTo(22, 62); g.lineTo(106, 62); line(g, 8, c.ink);\n }),\n eye(\"Angry\", (g, c) => {\n g.save(); g.beginPath(); g.moveTo(0, 28.7); g.lineTo(128, 71.3); g.lineTo(128, 128); g.lineTo(0, 128); g.closePath(); g.clip();\n ell(g, 64, 66, 38, 34, c.white, c.ink); circ(g, 64, 72, 16, c.iris); circ(g, 64, 72, 8, c.pupil);\n g.restore();\n g.beginPath(); g.moveTo(24, 36.7); g.lineTo(104, 63.3); line(g, 9, c.ink);\n }),\n eye(\"Cute\", (g, c) => { ell(g, 64, 64, 30, 40, c.iris); ell(g, 64, 60, 24, 33, c.pupil); circ(g, 54, 48, 10, c.white); circ(g, 73, 79, 5, c.white); }),\n eye(\"Happy\", (g, c) => { g.beginPath(); g.arc(64, 82, 32, Math.PI * 1.1, Math.PI * 1.9); line(g, 10, c.ink); }),\n eye(\"Cyclops\", (g, c) => { circ(g, 64, 64, 52, c.white); g.beginPath(); g.arc(64, 64, 52, 0, 7); line(g, 5, c.ink); circ(g, 64, 64, 28, c.iris); circ(g, 64, 64, 13, c.pupil); circ(g, 74, 54, 7, c.white); }),\n eye(\"Slit\", (g, c) => { ell(g, 64, 64, 46, 36, c.iris, c.ink); ell(g, 64, 64, 7, 32, c.pupil); }),\n eye(\"Narrow\", (g, c) => { ell(g, 64, 60, 44, 18, c.white, c.ink); circ(g, 70, 60, 13, c.iris); circ(g, 70, 60, 6, c.pupil); circ(g, 75, 55, 4, c.white); }),\n eye(\"Sparkle\", (g, c) => { ell(g, 64, 64, 36, 44, c.iris); ell(g, 64, 60, 29, 36, c.pupil); circ(g, 54, 50, 11, c.white); circ(g, 72, 78, 6, c.white); circ(g, 78, 46, 4, c.white); }),\n eye(\"Wide\", (g, c) => { circ(g, 64, 64, 44, c.white); g.beginPath(); g.arc(64, 64, 44, 0, 7); line(g, 5, c.ink); circ(g, 64, 64, 24, c.iris); circ(g, 64, 64, 12, c.pupil); circ(g, 72, 56, 8, c.white); }),\n doc(\"u6\"), doc(\"u9\"), doc(\"u11\"), doc(\"u12\"), doc(\"u13\"), doc(\"u14\"), doc(\"u15\"), doc(\"u16\"), doc(\"u17\"), doc(\"u18\"), doc(\"u19\"), doc(\"u20\"), doc(\"u21\"),\n mouth(\"Smile\", g => g.arc(64, 44, 36, Math.PI * 0.2, Math.PI * 0.8)),\n mouth(\"Grin\", g => g.arc(64, 38, 52, Math.PI * 0.18, Math.PI * 0.82)),\n mouth(\"Flat\", g => { g.moveTo(26, 64); g.lineTo(102, 64); }),\n mouth(\"Frown\", g => g.arc(64, 96, 32, Math.PI * 1.2, Math.PI * 1.8)),\n mouth(\"Open\", g => g.ellipse(64, 64, 16, 22, 0, 0, Math.PI * 2)),\n mouth(\"Wavy\", g => { g.moveTo(18, 64); g.bezierCurveTo(38, 38, 52, 90, 64, 64); g.bezierCurveTo(76, 38, 90, 90, 110, 64); }),\n mouth(\"Zigzag\", g => { [[20, 64], [38, 50], [56, 78], [74, 50], [92, 78], [108, 64]].forEach(([x, y], i) => i ? g.lineTo(x as number, y as number) : g.moveTo(x as number, y as number)); }),\n mouth(\"Cat\", g => { g.moveTo(64, 38); g.lineTo(64, 58); g.moveTo(28, 58); g.arc(46, 58, 18, Math.PI, 0, true); g.moveTo(64, 58); g.arc(82, 58, 18, Math.PI, 0, true); }),\n mouth(\"Small\", g => g.arc(64, 52, 18, Math.PI * 0.15, Math.PI * 0.85)),\n mouth(\"Big\", g => { g.ellipse(64, 64, 30, 40, 0, 0, Math.PI * 2); line(g, 8, \"#fff\"); }),\n mouth(\"Fangs\", g => {\n g.moveTo(28, 56); g.lineTo(100, 56);\n g.moveTo(40, 56); g.lineTo(46, 78); g.lineTo(52, 56);\n g.moveTo(76, 56); g.lineTo(82, 78); g.lineTo(88, 56);\n g.arc(64, 56, 36, Math.PI * 0.05, Math.PI * 0.95);\n }),\n doc(\"u7\"), doc(\"u10\"),\n mark(\"Eyespot\", g => { circ(g, 64, 64, 44, \"#fff\"); circ(g, 64, 64, 26, \"#000\"); circ(g, 64, 64, 11, \"#fff\"); }),\n mark(\"Dot Row\", g => { [22, 43, 64, 85, 106].forEach(x => circ(g, x, 64, 11, \"#fff\")); }),\n mark(\"Band\", g => { rect(g, 0, 46, 128, 36, \"#fff\"); }),\n mark(\"Tiger\", g => { [18, 40, 62, 84, 106].forEach((x, i) => { g.beginPath(); g.moveTo(x, 22 + (i % 2) * 12); g.quadraticCurveTo(x - 14, 64, x, 106 - (i % 2) * 12); line(g, 9, \"#fff\"); }); }),\n mark(\"Scale Dots\", g => { for (let r = 0; r < 5; r++) for (let c = 0; c < 5; c++) circ(g, 18 + c * 23 + (r % 2) * 11, 18 + r * 23, 6, \"#fff\"); }),\n doc(\"u5\"),\n door(\"Single\", g => {\n rect(g, 34, 10, 60, 112, \"#fff\", \"#444\");\n rect(g, 42, 18, 44, 40, \"#d4d4d4\"); rect(g, 42, 66, 44, 48, \"#d4d4d4\");\n circ(g, 85, 72, 5, \"#555\");\n }),\n door(\"Double + windows\", g => {\n [18, 66].forEach(x => {\n rect(g, x, 12, 44, 110, \"#fff\", \"#444\");\n [[x + 7, 20], [x + 25, 20], [x + 7, 40], [x + 25, 40]].forEach(([px, py]) => rect(g, px as number, py as number, 12, 16, \"#5c5c5c\", \"#444\", 2));\n rect(g, x + 7, 66, 30, 46, \"#d4d4d4\");\n });\n circ(g, 56, 74, 4, \"#555\"); circ(g, 72, 74, 4, \"#555\");\n }),\n door(\"Arched\", g => {\n g.beginPath(); g.moveTo(32, 122); g.lineTo(32, 50); g.arc(64, 50, 32, Math.PI, 0); g.lineTo(96, 122); g.closePath();\n g.fillStyle = \"#fff\"; g.fill(); line(g, 4, \"#444\");\n g.beginPath(); g.moveTo(42, 114); g.lineTo(42, 52); g.arc(64, 52, 22, Math.PI, 0); g.lineTo(86, 114); g.closePath();\n g.fillStyle = \"#d4d4d4\"; g.fill();\n circ(g, 84, 78, 5, \"#555\");\n }),\n door(\"Plank\", g => {\n rect(g, 30, 12, 68, 110, \"#fff\", \"#444\");\n [45, 60, 75, 90].forEach(x => { g.beginPath(); g.moveTo(x, 14); g.lineTo(x, 120); line(g, 2, \"#8a8a8a\"); });\n rect(g, 30, 34, 68, 10, \"#555\"); rect(g, 30, 88, 68, 10, \"#555\");\n circ(g, 88, 66, 5, \"#444\");\n }),\n door(\"Glass\", g => {\n rect(g, 30, 10, 68, 114, \"#fff\", \"#444\");\n rect(g, 38, 18, 52, 98, \"#4d4d4d\", \"#444\", 2);\n [[44, 70, 84, 28], [44, 100, 84, 58]].forEach(([a, b, c, d]) => { g.beginPath(); g.moveTo(a as number, b as number); g.lineTo(c as number, d as number); line(g, 4, \"#8a8a8a\"); });\n rect(g, 84, 66, 5, 28, \"#fff\", \"#444\", 2);\n }),\n door(\"Round\", g => {\n circ(g, 64, 64, 54, \"#fff\"); g.beginPath(); g.arc(64, 64, 54, 0, 7); line(g, 5, \"#444\");\n g.save(); g.beginPath(); g.arc(64, 64, 52, 0, 7); g.clip();\n [34, 49, 64, 79, 94].forEach(x => { g.beginPath(); g.moveTo(x, 8); g.lineTo(x, 120); line(g, 2, \"#8a8a8a\"); });\n rect(g, 0, 36, 128, 8, \"#555\"); rect(g, 0, 84, 128, 8, \"#555\");\n g.restore();\n circ(g, 64, 64, 9, \"#444\"); circ(g, 64, 64, 4, \"#d4d4d4\");\n }),\n ...[\"\uD83D\uDE00\", \"\uD83D\uDE0D\", \"\uD83D\uDE0E\", \"\uD83E\uDD2A\", \"\uD83D\uDE08\", \"\uD83D\uDC7B\", \"\uD83D\uDC80\", \"\uD83E\uDD16\", \"\uD83D\uDC7D\", \"\uD83D\uDC31\", \"\uD83D\uDC38\", \"\u2B50\", \"\u2764\uFE0F\", \"\uD83D\uDD25\", \"\uD83C\uDF08\", \"\uD83C\uDF55\"].map(emoji),\n room(\"Bedroom\", 0, 0xd9c7a8),\n room(\"Library\", 1, 0x6f8f72),\n room(\"Dining\", 2, 0xd9a08a),\n room(\"Double doors\", 3, 0xb7c7d9),\n room(\"Grid room\", 4, 0xffbb77),\n];\n\nexport const findBuiltin = (category: BuiltinDecalCategory, name: string): BuiltinArt | undefined =>\n BUILTIN_ART.find(a => a.category === category && a.name === name);\n", "import { Color, DoubleSide, Mesh, OrthographicCamera, PlaneGeometry, Scene, ShaderMaterial, WebGLRenderer } from \"three\";\nimport { linearColor } from \"../math/colors.js\";\nimport type { BuiltinArt } from \"./builtin-art.js\";\nimport { DECAL_CELL } from \"./decal-limits.js\";\nimport { cssHex } from \"../math/colors.js\";\nimport { INTERIOR_GLSL } from \"./decal-glsl.js\";\n\n/**\n * Renders each interior room once through the real shader code (a throwaway context) so the picker shows the\n * real art; a plain swatch when WebGL is unavailable.\n */\nexport function renderInteriorThumbs(rooms: readonly BuiltinArt[]): Map<BuiltinArt, HTMLCanvasElement> {\n const out = new Map<BuiltinArt, HTMLCanvasElement>();\n const S = DECAL_CELL;\n let r: WebGLRenderer | null = null;\n try {\n r = new WebGLRenderer({ antialias: true, preserveDrawingBuffer: true });\n r.setPixelRatio(1);\n r.setSize(S, S, false);\n const mat = new ShaderMaterial({\n side: DoubleSide,\n uniforms: { uRoom: { value: 0 }, uDepth: { value: 1 }, uWall: { value: new Color() }, uSeed: { value: 3 } },\n vertexShader: \"varying vec2 vP; void main() { vP = position.xy; gl_Position = vec4(position.xy * 2.0, 0.0, 1.0); }\",\n fragmentShader: `${INTERIOR_GLSL}\n varying vec2 vP; uniform float uRoom; uniform float uDepth; uniform vec3 uWall; uniform float uSeed;\n void main() {\n vec3 d = normalize(vec3(0.18, -0.1, -1.0));\n vec3 c = interiorWindow(vec3(vP, 0.0), d, uRoom, uDepth, uWall, uSeed);\n gl_FragColor = vec4(sqrt(c), 1.0);\n }`,\n });\n const quad = new Mesh(new PlaneGeometry(1, 1), mat);\n quad.frustumCulled = false;\n const sc = new Scene(); sc.add(quad);\n const cam = new OrthographicCamera(-0.5, 0.5, 0.5, -0.5, 0, 1);\n for (const def of rooms) {\n mat.uniforms.uRoom!.value = def.room ?? 0;\n linearColor(def.wall ?? 0xffffff, mat.uniforms.uWall!.value as Color);\n r.render(sc, cam);\n const c = document.createElement(\"canvas\");\n c.width = c.height = S;\n (c.getContext(\"2d\") as CanvasRenderingContext2D).drawImage(r.domElement, 0, 0);\n out.set(def, c);\n }\n quad.geometry.dispose(); mat.dispose();\n } catch (e) {\n console.warn(\"Interior thumbnails unavailable\", e);\n }\n if (r) { r.dispose(); r.forceContextLoss(); }\n for (const def of rooms) {\n if (out.has(def)) continue;\n const c = document.createElement(\"canvas\");\n c.width = c.height = S;\n const g = c.getContext(\"2d\") as CanvasRenderingContext2D;\n g.fillStyle = cssHex(def.wall ?? 0x888888); g.fillRect(8, 8, S - 16, S - 16);\n out.set(def, c);\n }\n return out;\n}\n", "import { DECAL_COLS, DECAL_DEPTH, DECAL_ROWS, DECAL_TEX_W, MAX_DECALS } from \"./decal-limits.js\";\n\n/* Interior rooms (a box behind a flat window, ray-traced in decal space) and the decal projection chunk the\n fleck material includes. Ported verbatim from the POC's decals.js. */\n\nexport const INTERIOR_GLSL = /* glsl */ `\n // ---- Interior rooms: a box behind a flat window, ray-traced in decal space ----\n // Window = x, y in [-0.5, 0.5] on the z = 0 plane; the room runs from z = 0 down to z = -D.\n float rHash(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 vec3 rPal(float h) { return 0.35 + 0.5 * cos(6.2831853 * (h + vec3(0.0, 0.33, 0.67))); }\n\n // Nearest-hit box test (material id, normal and distance are only written when this box is closer)\n void rBox(vec3 o, vec3 d, vec3 mn, vec3 mx, int mat, inout float tB, inout vec3 nB, inout int mB) {\n vec3 inv = 1.0 / d;\n vec3 t1 = (mn - o) * inv, t2 = (mx - o) * inv;\n vec3 tmn = min(t1, t2), tmx = max(t1, t2);\n float tN = max(max(tmn.x, tmn.y), tmn.z);\n float tF = min(min(tmx.x, tmx.y), tmx.z);\n if (tN < tF && tN > 0.0 && tN < tB) {\n tB = tN; mB = mat;\n nB = -sign(d) * step(vec3(tN - 1e-5), tmn);\n }\n }\n\n bool rAabb(vec3 o, vec3 d, vec3 mn, vec3 mx) {\n vec3 inv = 1.0 / d;\n vec3 t1 = (mn - o) * inv, t2 = (mx - o) * inv;\n vec3 a = min(t1, t2), b = max(t1, t2);\n float tF = min(min(b.x, b.y), b.z);\n return max(max(a.x, a.y), a.z) < tF && tF > 0.0;\n }\n\n // Bookcase face: shelf boards plus hashed book spines\n vec3 rBooks(vec3 h, float D, float seed) {\n float ry = (h.y + 0.5) / 0.23;\n if (ry > 4.0) return vec3(0.34, 0.21, 0.11);\n float ri = floor(ry), fy = fract(ry);\n if (fy < 0.07) return vec3(0.34, 0.21, 0.11);\n float s = (-h.z / D) * 26.0;\n float bi = floor(s), fx = fract(s);\n float r1 = rHash(vec2(bi, ri + seed * 3.1));\n float r2 = rHash(vec2(bi + 41.0, ri + seed));\n if (fy > 0.07 + (0.55 + 0.4 * r1) * 0.88) return vec3(0.16, 0.10, 0.06);\n if (fx < 0.08) return vec3(0.10, 0.08, 0.06);\n return rPal(r2) * (0.8 + 0.3 * fract(r1 * 7.0));\n }\n\n // pd: surface point in decal space (flip already applied), d: unit view direction in decal space (z < 0 = into the wall)\n // room ids: 0 bed, 1 books, 2 table + chairs, 3 double doors with small windows, 4 grid\n // returns linear colour\n vec3 interiorRoom(vec3 pd, vec3 d, float variant, float D, vec3 wall, float seed) {\n if (abs(d.x) < 1e-4) d.x = d.x < 0.0 ? -1e-4 : 1e-4;\n if (abs(d.y) < 1e-4) d.y = d.y < 0.0 ? -1e-4 : 1e-4;\n vec3 o = pd - d * (pd.z / d.z); // slide along the ray to the window plane\n o = vec3(clamp(o.xy, -0.499, 0.499), 0.0);\n int V = int(variant + 0.5);\n\n // Shell: floor (1), ceiling (2), side walls (3), back wall (4)\n float tx = ((d.x > 0.0 ? 0.5 : -0.5) - o.x) / d.x;\n float ty = ((d.y > 0.0 ? 0.5 : -0.5) - o.y) / d.y;\n float tz = -D / d.z;\n float tB; vec3 nB; int mB;\n if (tz <= tx && tz <= ty) { tB = tz; nB = vec3(0.0, 0.0, 1.0); mB = 4; }\n else if (tx <= ty) { tB = tx; nB = vec3(-sign(d.x), 0.0, 0.0); mB = 3; }\n else { tB = ty; nB = vec3(0.0, -sign(d.y), 0.0); mB = d.y > 0.0 ? 2 : 1; }\n\n // Contents (materials: 5 wood, 6 accent cloth, 7 linen, 8 bookcase)\n if (V == 0 && rAabb(o, d, vec3(-0.49, -0.50, -D), vec3(-0.17, -0.10, -D * 0.40))) { // bed against the left wall\n float zA = -D * 0.97, zF = -D * 0.40;\n rBox(o, d, vec3(-0.48, -0.50, zA), vec3(-0.18, -0.38, zF), 5, tB, nB, mB);\n rBox(o, d, vec3(-0.47, -0.38, zA), vec3(-0.19, -0.30, zF), 7, tB, nB, mB);\n rBox(o, d, vec3(-0.475, -0.38, -D * 0.72), vec3(-0.185, -0.285, zF), 6, tB, nB, mB);\n rBox(o, d, vec3(-0.44, -0.30, zA), vec3(-0.22, -0.235, -D * 0.86), 7, tB, nB, mB);\n rBox(o, d, vec3(-0.49, -0.50, -D * 0.995), vec3(-0.17, -0.10, zA), 5, tB, nB, mB);\n } else if (V == 1) { // bookcase along the right wall\n rBox(o, d, vec3(0.36, -0.50, -D * 0.92), vec3(0.50, 0.42, -D * 0.12), 8, tB, nB, mB);\n } else if (V == 2 && rAabb(o, d, vec3(-0.42, -0.50, -D * 0.72), vec3(0.42, -0.08, -D * 0.30))) { // table + two chairs\n rBox(o, d, vec3(-0.24, -0.22, -D * 0.72), vec3(0.24, -0.17, -D * 0.30), 5, tB, nB, mB);\n rBox(o, d, vec3(-0.235, -0.50, -D * 0.70), vec3(-0.195, -0.22, -D * 0.66), 5, tB, nB, mB);\n rBox(o, d, vec3(0.195, -0.50, -D * 0.70), vec3(0.235, -0.22, -D * 0.66), 5, tB, nB, mB);\n rBox(o, d, vec3(-0.235, -0.50, -D * 0.36), vec3(-0.195, -0.22, -D * 0.32), 5, tB, nB, mB);\n rBox(o, d, vec3(0.195, -0.50, -D * 0.36), vec3(0.235, -0.22, -D * 0.32), 5, tB, nB, mB);\n rBox(o, d, vec3(-0.40, -0.36, -D * 0.58), vec3(-0.28, -0.31, -D * 0.44), 6, tB, nB, mB);\n rBox(o, d, vec3(-0.41, -0.31, -D * 0.58), vec3(-0.39, -0.08, -D * 0.44), 6, tB, nB, mB);\n rBox(o, d, vec3(-0.36, -0.50, -D * 0.53), vec3(-0.32, -0.36, -D * 0.49), 5, tB, nB, mB);\n rBox(o, d, vec3(0.28, -0.36, -D * 0.58), vec3(0.40, -0.31, -D * 0.44), 6, tB, nB, mB);\n rBox(o, d, vec3(0.39, -0.31, -D * 0.58), vec3(0.41, -0.08, -D * 0.44), 6, tB, nB, mB);\n rBox(o, d, vec3(0.32, -0.50, -D * 0.53), vec3(0.36, -0.36, -D * 0.49), 5, tB, nB, mB);\n }\n\n // Open curtains just inside the window (9), hung from a rod\n float tc = -0.05 / d.z;\n if (tc < tB) {\n vec3 pc = o + d * tc;\n float edge = 0.28 + 0.08 * clamp(abs(pc.y + 0.05) * 2.0, 0.0, 1.0); // tied back at mid height\n if (pc.y > 0.465) { tB = tc; nB = vec3(0.0, 0.0, 1.0); mB = 5; }\n else if (abs(pc.x) > edge && pc.y > -0.46) { tB = tc; nB = vec3(0.0, 0.0, 1.0); mB = 9; }\n }\n\n // Surface colour at the hit\n vec3 h = o + d * tB;\n vec3 col = vec3(0.5);\n float emit = 0.0;\n if (V == 4 && mB <= 4) { // grid room: tiled walls with dark gaps\n vec2 g = mB <= 2 ? vec2(h.x + 0.5, -h.z / D) : (mB == 3 ? vec2(-h.z / D, h.y + 0.5) : vec2(h.x + 0.5, h.y + 0.5));\n vec2 f = fract(g * 4.0);\n col = wall * mix(0.12, 1.0, step(0.1, f.x) * step(0.1, f.y));\n } else if (mB == 1) {\n float pu = h.x * 7.0;\n col = vec3(0.56, 0.38, 0.22) * (0.82 + 0.3 * rHash(vec2(floor(pu), 1.0)));\n if (fract(pu) < 0.06) col *= 0.55;\n } else if (mB == 2) {\n col = vec3(0.93, 0.92, 0.88);\n } else if (mB == 3 || mB == 4) {\n col = h.y < -0.46 ? vec3(0.88, 0.86, 0.82) : wall;\n } else if (mB == 5) {\n col = vec3(0.50, 0.32, 0.17);\n } else if (mB == 6) {\n col = rPal(rHash(vec2(seed, 5.0)));\n } else if (mB == 7) {\n col = vec3(0.93, 0.93, 0.90);\n } else if (mB == 8) {\n col = nB.x < -0.5 ? rBooks(h, D, seed) : vec3(0.50, 0.32, 0.17);\n } else if (mB == 9) {\n col = rPal(rHash(vec2(seed, 13.0))) * (0.72 + 0.28 * abs(fract(h.x * 11.0) - 0.5) * 2.0);\n }\n\n // Door in the middle of the back wall (every room has one)\n if (mB == 4) {\n if (V == 3) { // double doors with small windows\n if (abs(h.x) < 0.26 && h.y < 0.2) {\n float dx = (h.x + 0.26) / 0.52, dy = (h.y + 0.5) / 0.70;\n float lx = fract(dx * 2.0);\n col = vec3(0.82, 0.80, 0.76);\n if (abs(dx - 0.5) < 0.012 || lx < 0.02 || lx > 0.98) col = vec3(0.25, 0.22, 0.2);\n else if (dy < 0.45 && lx > 0.14 && lx < 0.86 && dy > 0.06) col *= 0.88;\n if (lx > 0.14 && lx < 0.86 && dy > 0.52 && dy < 0.92) {\n vec2 q = vec2((lx - 0.14) / 0.72, (dy - 0.52) / 0.4) * 2.0;\n vec2 gq = fract(q);\n if (gq.x > 0.1 && gq.x < 0.9 && gq.y > 0.1 && gq.y < 0.9) { col = vec3(0.65, 0.82, 0.98); emit = 1.0; }\n }\n if (length(vec2(abs(dx - 0.5) - 0.04, dy - 0.42)) < 0.025) col = vec3(0.85, 0.70, 0.20);\n }\n } else if (abs(h.x) < 0.14 && h.y < 0.14) {\n float lx = (h.x + 0.14) / 0.28, ly = (h.y + 0.5) / 0.64;\n col = vec3(0.45, 0.28, 0.14);\n bool pan = lx > 0.18 && lx < 0.82 && ((ly > 0.1 && ly < 0.45) || (ly > 0.55 && ly < 0.9));\n if (pan) col *= 0.82;\n if (lx < 0.05 || lx > 0.95 || ly > 0.96) col = vec3(0.9, 0.88, 0.84);\n if (length(vec2(lx - 0.85, ly - 0.48)) < 0.045) col = vec3(0.85, 0.70, 0.20);\n }\n }\n\n float lit = 0.55 + 0.45 * max(dot(normalize(nB), vec3(0.2494, 0.798, 0.5486)), 0.0);\n lit *= 1.0 - 0.35 * smoothstep(0.0, 2.0, tB);\n col = emit > 0.5 ? col * 1.1 : col * lit;\n col = clamp(col, 0.0, 1.0);\n return col * col; // ~gamma 2.0, cheaper than pow()\n }\n\n // Window frame around the room\n vec3 interiorWindow(vec3 pd, vec3 d, float variant, float D, vec3 wall, float seed) {\n if (max(abs(pd.x), abs(pd.y)) > 0.46) return wall * wall * 0.09;\n return interiorRoom(pd, d, variant, D, wall, seed);\n }\n`;\n\nexport const DECAL_GLSL = /* glsl */ `\n // Sampling happens inside a loop with break / continue, so ask for level 0 explicitly where the GLSL version allows it\n #if __VERSION__ >= 300\n #define DECAL_SAMPLE(s, uv) textureLod(s, uv, 0.0)\n #else\n #define DECAL_SAMPLE(s, uv) texture2D(s, uv)\n #endif\n uniform sampler2D uDecalData;\n uniform sampler2D uDecalAtlas;\n uniform float uDecalCount;\n uniform float uDecalBoostDist;\n uniform vec4 uDecalBounds[${MAX_DECALS}]; // bounding sphere per decal: centre xyz, radius\n uniform vec3 uLocalCam; // camera in the object's local space (interior rays)\n varying vec3 vLocalNormal;\n float gDecalGlow = 0.0; // interior windows read as lit from inside; the fleck material adds this as emission\n ${INTERIOR_GLSL}\n\n vec4 decalTexel(float i, float k) {\n return DECAL_SAMPLE(uDecalData, vec2((k + 0.5) / ${DECAL_TEX_W}.0, (i + 0.5) / ${MAX_DECALS}.0));\n }\n\n // Returns straight-alpha colour (rgb) and coverage (a) of every decal at a bind-pose point\n vec4 evalDecals(vec3 p, vec3 n) {\n vec3 accRGB = vec3(0.0);\n float accA = 0.0;\n for (int i = 0; i < ${MAX_DECALS}; i++) {\n float fi = float(i);\n if (fi >= uDecalCount) break;\n vec4 bs = uDecalBounds[i];\n if (dot(p - bs.xyz, p - bs.xyz) > bs.w * bs.w) continue;\n vec4 r0 = decalTexel(fi, 0.0);\n vec4 r1 = decalTexel(fi, 1.0);\n vec4 r2 = decalTexel(fi, 2.0);\n vec3 pd = vec3(dot(r0.xyz, p) + r0.w, dot(r1.xyz, p) + r1.w, dot(r2.xyz, p) + r2.w);\n if (abs(pd.x) > 0.5 || abs(pd.y) > 0.5 || abs(pd.z) > ${DECAL_DEPTH}) continue;\n\n // Fade out where the surface turns away from the projection direction\n vec3 nd = vec3(dot(r0.xyz, n), dot(r1.xyz, n), dot(r2.xyz, n));\n float facing = smoothstep(0.25, 0.6, nd.z / max(length(nd), 1e-4));\n if (facing <= 0.0) continue;\n\n vec4 pm = decalTexel(fi, 3.0); // atlas col, atlas row, flip, tintable\n vec4 tn = decalTexel(fi, 4.0); // tint rgb, opacity\n vec4 ex = decalTexel(fi, 5.0); // interior: 1, room id, depth, seed\n float k = facing * tn.a;\n vec3 pc;\n float a;\n if (ex.x > 0.5) {\n // Interior: view ray from the camera, expressed in decal space\n vec3 dl = normalize(p - uLocalCam);\n vec3 dd = vec3(dot(r0.xyz, dl), dot(r1.xyz, dl), dot(r2.xyz, dl));\n vec3 pdr = pd;\n if (pm.z > 0.5) { pdr.x = -pdr.x; dd.x = -dd.x; }\n dd = normalize(dd);\n if (dd.z > -0.04) continue; // grazing: the ray would run along the wall\n pc = interiorWindow(pdr, dd, ex.y, ex.z, tn.rgb, ex.w) * k;\n a = k;\n gDecalGlow = gDecalGlow * (1.0 - a) + 0.9 * a;\n } else {\n vec2 uv = pd.xy + 0.5;\n if (pm.z > 0.5) uv.x = 1.0 - uv.x;\n uv = clamp(uv, 0.002, 0.998);\n vec2 auv = vec2((pm.x + uv.x) / ${DECAL_COLS}.0, 1.0 - (pm.y + 1.0 - uv.y) / ${DECAL_ROWS}.0);\n vec4 s = DECAL_SAMPLE(uDecalAtlas, auv); // premultiplied alpha\n\n if (uPixelOut > 0.5) {\n // PIXEL ART MODE: ink survives at any size. A line or a dot thinner than a pixel misses a single\n // centre sample, so the whole footprint of the pixel is searched (a 4 x 4 grid): any dark ink in it\n // makes the pixel solid ink; a highlight stays only where the pixel's centre is on it; anything else\n // is the centre colour, solid or gone (no half-covered blur).\n // past the line boost distance (a view preference), the search spreads up to twice the pixel's\n // area: far-away lines are still caught, and drawn bolder\n float camDist = length(p - uLocalCam);\n float grow = 1.0 + clamp((camDist - uDecalBoostDist) * 0.25, 0.0, 1.0);\n vec2 fx = dFdx(auv) * grow, fy = dFdy(auv) * grow;\n // the samples stay inside this decal's cell of the atlas (its neighbours' art is right next to it)\n vec2 cellLo = vec2(pm.x / ${DECAL_COLS}.0, 1.0 - (pm.y + 1.0) / ${DECAL_ROWS}.0);\n vec2 cellHi = vec2((pm.x + 1.0) / ${DECAL_COLS}.0, 1.0 - pm.y / ${DECAL_ROWS}.0);\n vec2 pad = vec2(0.002 / ${DECAL_COLS}.0, 0.002 / ${DECAL_ROWS}.0);\n float minL = 1.0, inkA = 0.0;\n vec3 inkRGB = vec3(0.0);\n for (int gy = 0; gy < 4; gy++) {\n for (int gx = 0; gx < 4; gx++) {\n vec2 o = (vec2(float(gx), float(gy)) - 1.5) * 0.25;\n vec4 t = DECAL_SAMPLE(uDecalAtlas, clamp(auv + fx * o.x + fy * o.y, cellLo + pad, cellHi - pad));\n if (t.a < 0.35) continue;\n // judged as drawn: a tintable art (a mouth) is white in the atlas and tinted when drawn\n vec3 c = t.rgb / t.a;\n float l = dot(pm.w > 0.5 ? c * tn.rgb : c, vec3(0.299, 0.587, 0.114));\n if (l < minL) { minL = l; inkRGB = c; inkA = t.a; }\n }\n }\n float lC = s.a > 0.01 ? dot(pm.w > 0.5 ? s.rgb / s.a * tn.rgb : s.rgb / s.a, vec3(0.299, 0.587, 0.114)) : 0.5;\n if (s.a > 0.35 && lC > 0.8) {\n s = vec4(1.0); // the centre is on a highlight: keep it\n } else if (minL < 0.22 && inkA > 0.0) {\n s = vec4(inkRGB, 1.0); // dark ink anywhere in the pixel: solid ink\n } else if (s.a > 0.35) {\n s = vec4(s.rgb / s.a, 1.0); // the centre's colour, solid\n } else {\n s = vec4(0.0); // a colour fill only touching the pixel's edge\n }\n } else {\n // NORMAL 3D MODE: Distance boost\n float camDist = length(p - uLocalCam);\n if (camDist > uDecalBoostDist && s.a > 0.01) {\n float intensity = max(s.r, max(s.g, s.b)) / s.a;\n float isDark = 1.0 - smoothstep(0.0, 0.25, intensity);\n float boost = 1.0 + isDark * clamp((camDist - uDecalBoostDist) * 0.5, 0.0, 8.0);\n s.rgb = clamp(s.rgb * boost, 0.0, 1.0);\n s.a = clamp(s.a * boost, 0.0, 1.0);\n }\n }\n\n pc = (pm.w > 0.5 ? s.rgb * tn.rgb : s.rgb) * k;\n a = s.a * k;\n gDecalGlow *= (1.0 - a);\n }\n accRGB = pc + accRGB * (1.0 - a);\n accA = a + accA * (1.0 - a);\n }\n return vec4(accRGB / max(accA, 1e-4), accA);\n }\n`;\n", "import type { Creation, DecalArt, DecalCatalogEntry } from \"@dreamy/api\";\nimport { cssOf, paletteKey } from \"../math/colors.js\";\nimport { BUILTIN_ART, DECAL_CATEGORIES, type BuiltinArt } from \"./builtin-art.js\";\nimport type { DecalAtlas } from \"./decal-atlas.js\";\nimport { renderInteriorThumbs } from \"./interior-thumbs.js\";\n\nexport type CatalogEntry = DecalCatalogEntry & { readonly category: string };\n\n/**\n * The picker's list: built-ins by category, then the creation's designs (category \"custom\"). Thumbnails are\n * 64 px data URLs drawn with the current palette; tintable art is multiplied by its default tint.\n */\nexport class DecalCatalog {\n private interiors: Map<BuiltinArt, HTMLCanvasElement> | null = null;\n private readonly thumbs = new Map<string, string>();\n\n constructor(private readonly atlas: () => DecalAtlas) {}\n\n entries(creation: Creation): CatalogEntry[] {\n const atlas = this.atlas();\n atlas.setPalette(creation.palette);\n atlas.setDesigns(creation.designs);\n const pk = paletteKey(creation.palette);\n const out: CatalogEntry[] = [];\n for (const cat of DECAL_CATEGORIES) {\n for (const b of BUILTIN_ART.filter(a => a.category === cat)) {\n const art: DecalArt = { kind: \"builtin\", category: b.category, name: b.name };\n const thumbnail = this.thumb(art, b, pk, creation);\n out.push(b.tint !== undefined\n ? { category: cat, art, name: b.name, thumbnail, tintable: b.tintable, tint: b.tint }\n : { category: cat, art, name: b.name, thumbnail, tintable: b.tintable });\n }\n }\n for (const d of creation.designs) {\n const art: DecalArt = { kind: \"design\", designId: d.id };\n out.push({ category: \"custom\", art, name: d.name, thumbnail: this.thumb(art, undefined, pk, creation), tintable: false });\n }\n return out;\n }\n\n private thumb(art: DecalArt, b: BuiltinArt | undefined, pk: string, creation: Creation): string {\n let src: HTMLCanvasElement | undefined;\n let version = 0;\n if (b?.room !== undefined) {\n this.interiors ??= renderInteriorThumbs(BUILTIN_ART.filter(a => a.room !== undefined));\n src = this.interiors.get(b);\n } else {\n const c = this.atlas().cellCanvas(art);\n src = c?.canvas; version = c?.version ?? 0;\n }\n if (!src) return \"\";\n const key = JSON.stringify(art) + \"|\" + pk + \"|\" + version;\n const hit = this.thumbs.get(key);\n if (hit) return hit;\n const c = document.createElement(\"canvas\");\n c.width = c.height = 64;\n const g = c.getContext(\"2d\") as CanvasRenderingContext2D;\n g.drawImage(src, 0, 0, 64, 64);\n if (b?.tintable && b.room === undefined && b.tint) {\n g.globalCompositeOperation = \"multiply\";\n g.fillStyle = cssOf(b.tint, creation.palette);\n g.fillRect(0, 0, 64, 64);\n g.globalCompositeOperation = \"destination-in\";\n g.drawImage(src, 0, 0, 64, 64);\n }\n const url = c.toDataURL();\n this.thumbs.set(key, url);\n return url;\n }\n}\n", "import type { Id, RigObject } from \"@dreamy/api\";\nimport { DoubleSide, Plane, Vector3, type Material, type Mesh } from \"three\";\nimport { IDENTITY_QUAT, vec3Of } from \"../math/convert.js\";\nimport { nearestScreenPoint } from \"../math/picking.js\";\nimport { worldToScreen } from \"../math/screen.js\";\nimport { RigView } from \"../objects/rig-view.js\";\nimport { objectById, viewSize, type InteractionContext } from \"./interaction-context.js\";\n\n/** Rig bones tool (the POC's rig.js): a click picks a bone of the selected rig, or adds one with the Add tool. */\nexport class BoneTool {\n constructor(private readonly ctx: InteractionContext) {}\n\n private selectedRig(): { object: RigObject; view: RigView } | undefined {\n const id = this.ctx.session().selection.objectIds.at(-1);\n const o = id !== undefined ? objectById(this.ctx.creation(), id) : undefined;\n const v = id !== undefined ? this.ctx.views.views.get(id)?.view : undefined;\n return o?.kind === \"rig\" && v instanceof RigView ? { object: o, view: v } : undefined;\n }\n\n /** Screen positions of a rig's joints (as drawn). */\n static jointsOnScreen(ctx: InteractionContext, view: RigView) {\n const m = view.matrices;\n if (!m) return [];\n view.group.updateWorldMatrix(true, false);\n ctx.stage.camera.updateMatrixWorld();\n const { w, h } = viewSize(ctx);\n return m.shownGlobal.map(g => worldToScreen(new Vector3().setFromMatrixPosition(g).applyMatrix4(view.group.matrixWorld), ctx.stage.camera, w, h));\n }\n\n click(): void {\n if (this.ctx.locked()) return;\n if (this.ctx.session().boneTool === \"add\") { this.add(); return; }\n const sel = this.selectedRig();\n if (!sel) return;\n const i = nearestScreenPoint(BoneTool.jointsOnScreen(this.ctx, sel.view), this.ctx.pointer.x, this.ctx.pointer.y);\n const bone = i >= 0 ? sel.object.rig.bones[i] : undefined;\n // clicking empty space deselects the bone\n this.ctx.select(bone ? { objectIds: [sel.object.id], stampIds: [], boneId: bone.id } : { objectIds: [sel.object.id], stampIds: [] });\n }\n\n private add(): void {\n let sel = this.selectedRig();\n const ctx = this.ctx;\n ctx.raycaster.setFromCamera(ctx.pointer.ndc, ctx.stage.camera);\n if (!sel) {\n // No rig: start one where the cursor meets the ground\n const hit = ctx.raycaster.intersectObject(ctx.stage.ground, false)[0];\n if (!hit) return;\n const before = new Set(ctx.creation().objects.map(o => o.id));\n const r = ctx.dispatch({ type: \"CreateRig\", payload: { transform: { position: vec3Of(hit.point), rotation: IDENTITY_QUAT, scale: { x: 1, y: 1, z: 1 } } } });\n if (!r.ok) return;\n const rig = r.creation.objects.find(o => !before.has(o.id) && o.kind === \"rig\");\n if (!rig) return;\n this.addBoneAt(rig.id, undefined, { x: 0, y: 0, z: 0 });\n return;\n }\n const { object, view } = sel;\n if (object.rig.mode !== \"rig\") { ctx.toast(\"Switch to Rig mode to add bones\"); return; }\n view.group.updateWorldMatrix(true, true);\n // Place the joint inside the body: midway between where the ray enters and leaves it\n const meshes = [...view.sculptViews().map(v => v.mesh)].filter(m => m.visible);\n const sides = meshes.map(m => [m, (m.material as Material).side] as const);\n meshes.forEach(m => { (m.material as Material).side = DoubleSide; });\n const hits = ctx.raycaster.intersectObjects(meshes as Mesh[], false);\n sides.forEach(([m, s]) => { (m.material as Material).side = s; });\n let world: Vector3 | null = null;\n if (hits.length > 1) world = hits[0]!.point.clone().lerp(hits[1]!.point, 0.5);\n else if (hits[0]) world = hits[0].point.clone();\n const parentId = ctx.session().selection.boneId;\n if (!world) {\n // Missed: a camera-facing plane through the parent joint (tips outside the body)\n const pi = parentId !== undefined ? view.matrices?.index.get(parentId) : undefined;\n const anchor = pi !== undefined && view.matrices ? new Vector3().setFromMatrixPosition(view.matrices.shownGlobal[pi]!) : new Vector3();\n anchor.applyMatrix4(view.group.matrixWorld);\n const plane = new Plane().setFromNormalAndCoplanarPoint(ctx.stage.camera.getWorldDirection(new Vector3()), anchor);\n world = new Vector3();\n if (!ctx.raycaster.ray.intersectPlane(plane, world)) return;\n }\n this.addBoneAt(object.id, parentId, vec3Of(view.group.worldToLocal(world)));\n }\n\n private addBoneAt(rigId: Id, parentId: Id | undefined, head: { x: number; y: number; z: number }): void {\n const ctx = this.ctx;\n const prev = objectById(ctx.creation(), rigId);\n const before = new Set(prev?.kind === \"rig\" ? prev.rig.bones.map(b => b.id) : []);\n const r = ctx.dispatch({ type: \"AddBone\", payload: parentId !== undefined ? { rigId, parentId, head } : { rigId, head } });\n if (!r.ok) return;\n const rig = r.creation.objects.find(o => o.id === rigId);\n const added = rig?.kind === \"rig\" ? rig.rig.bones.find(b => !before.has(b.id)) : undefined;\n ctx.select(added ? { objectIds: [rigId], stampIds: [], boneId: added.id } : { objectIds: [rigId], stampIds: [] });\n }\n}\n", "import type { Quaternion as ApiQuat, Transform, Vec3 } from \"@dreamy/api\";\nimport { Matrix4, Object3D, Quaternion, Vector3 } from \"three\";\n\n/** Contract values \u2194 three.js objects. The contract is plain readonly data; three is mutable. */\n\nexport const v3 = (v: Vec3, out = new Vector3()): Vector3 => out.set(v.x, v.y, v.z);\n\nexport const quat = (q: ApiQuat, out = new Quaternion()): Quaternion => out.set(q.x, q.y, q.z, q.w);\n\nexport const vec3Of = (v: Vector3): Vec3 => ({ x: v.x, y: v.y, z: v.z });\n\nexport const quatOf = (q: Quaternion): ApiQuat => ({ x: q.x, y: q.y, z: q.z, w: q.w });\n\nexport const IDENTITY_QUAT: ApiQuat = { x: 0, y: 0, z: 0, w: 1 };\nexport const ZERO: Vec3 = { x: 0, y: 0, z: 0 };\nexport const ONE: Vec3 = { x: 1, y: 1, z: 1 };\n\nexport function matrixOf(t: Transform, out = new Matrix4()): Matrix4 {\n return out.compose(v3(t.position), quat(t.rotation), v3(t.scale));\n}\n\nexport function applyTransform(obj: Object3D, t: Transform): void {\n v3(t.position, obj.position);\n quat(t.rotation, obj.quaternion);\n v3(t.scale, obj.scale);\n}\n\nexport function transformOf(obj: Object3D): Transform {\n return { position: vec3Of(obj.position), rotation: quatOf(obj.quaternion), scale: vec3Of(obj.scale) };\n}\n\nexport function transformOfMatrix(m: Matrix4): Transform {\n const p = new Vector3(), q = new Quaternion(), s = new Vector3();\n m.decompose(p, q, s);\n return { position: vec3Of(p), rotation: quatOf(q), scale: vec3Of(s) };\n}\n\nconst EPS = 1e-6;\nexport function sameTransform(a: Transform, b: Transform): boolean {\n const d = (x: number, y: number) => Math.abs(x - y) < EPS;\n const dot = a.rotation.x * b.rotation.x + a.rotation.y * b.rotation.y + a.rotation.z * b.rotation.z + a.rotation.w * b.rotation.w;\n return d(a.position.x, b.position.x) && d(a.position.y, b.position.y) && d(a.position.z, b.position.z) &&\n d(a.scale.x, b.scale.x) && d(a.scale.y, b.scale.y) && d(a.scale.z, b.scale.z) && Math.abs(Math.abs(dot) - 1) < 1e-8;\n}\n", "import type { Ray } from \"three\";\nimport type { ScreenPoint } from \"./screen.js\";\n\n/** A shape candidate for sculpt-mode picking: world center and its pick radius (0.6 \u00D7 size \u00D7 object scale). */\nexport type StampPickCandidate = { readonly center: { x: number; y: number; z: number }; readonly radius: number };\n\n/** Index of the shape whose center passes closest to the ray, within its radius, or -1. */\nexport function pickStampOnRay(ray: Ray, candidates: readonly StampPickCandidate[]): number {\n let best = -1, bestD = Infinity;\n const v = ray.origin.clone();\n candidates.forEach((c, i) => {\n v.set(c.center.x, c.center.y, c.center.z);\n const d = ray.distanceToPoint(v);\n if (d < c.radius && d < bestD) { bestD = d; best = i; }\n });\n return best;\n}\n\n/** Index of the screen point nearest to (x, y) within maxPx (bone dots: 16 px), or -1. Null points are skipped. */\nexport function nearestScreenPoint(points: readonly (ScreenPoint | null)[], x: number, y: number, maxPx = 16): number {\n let best = -1, bestD = maxPx;\n points.forEach((p, i) => {\n if (!p) return;\n const d = Math.hypot(p.x - x, p.y - y);\n if (d < bestD) { bestD = d; best = i; }\n });\n return best;\n}\n\n/** Index of the decal nearest to a local point, within 0.6 \u00D7 its size (eraser), or -1. */\nexport function nearestDecal(decals: readonly { position: { x: number; y: number; z: number }; size: number }[], p: { x: number; y: number; z: number }): number {\n let best = -1, bestD = Infinity;\n decals.forEach((d, i) => {\n const dist = Math.hypot(d.position.x - p.x, d.position.y - p.y, d.position.z - p.z);\n if (dist < d.size * 0.6 && dist < bestD) { bestD = dist; best = i; }\n });\n return best;\n}\n\n/** Ctrl+click: toggles one id in a list (order kept, the toggled one last when added). */\nexport function toggleId<T>(list: readonly T[], id: T): T[] {\n return list.includes(id) ? list.filter(x => x !== id) : [...list, id];\n}\n\n/** Ctrl+click on a stamp of a set: toggles every member (a locked group toggles as one). */\nexport function toggleMembers<T>(current: readonly T[], members: readonly T[]): T[] {\n const set = new Set(current);\n const all = members.every(m => set.has(m));\n members.forEach(m => (all ? set.delete(m) : set.add(m)));\n return current.filter(x => set.has(x)).concat(members.filter(m => set.has(m) && !current.includes(m)));\n}\n", "import type { Box3, Camera } from \"three\";\nimport { Vector3 } from \"three\";\n\nexport type ScreenPoint = { x: number; y: number };\nexport type ScreenRect = { x1: number; y1: number; x2: number; y2: number };\n\n/** Pixel position of a world point in a w \u00D7 h view, or null when it is behind the camera (near plane). */\nexport function worldToScreen(v: Vector3, camera: Camera & { near: number }, w: number, h: number): ScreenPoint | null {\n const p = v.clone().applyMatrix4(camera.matrixWorldInverse);\n if (p.z >= -camera.near) return null;\n const n = v.clone().project(camera);\n return { x: (n.x * 0.5 + 0.5) * w, y: (-n.y * 0.5 + 0.5) * h };\n}\n\n/** Screen bounds of a world box, or null when it is entirely behind the camera. */\nexport function screenRectOfBox(box: Box3, camera: Camera & { near: number }, w: number, h: number): ScreenRect | null {\n let x1 = Infinity, y1 = Infinity, x2 = -Infinity, y2 = -Infinity;\n const c = new Vector3();\n for (let i = 0; i < 8; i++) {\n c.set(i & 1 ? box.max.x : box.min.x, i & 2 ? box.max.y : box.min.y, i & 4 ? box.max.z : box.min.z);\n const p = worldToScreen(c, camera, w, h);\n if (!p) continue;\n x1 = Math.min(x1, p.x); x2 = Math.max(x2, p.x);\n y1 = Math.min(y1, p.y); y2 = Math.max(y2, p.y);\n }\n return x1 === Infinity ? null : { x1, y1, x2, y2 };\n}\n\nexport const rectFromDrag = (sx: number, sy: number, ex: number, ey: number): ScreenRect =>\n ({ x1: Math.min(sx, ex), y1: Math.min(sy, ey), x2: Math.max(sx, ex), y2: Math.max(sy, ey) });\n\nexport const rectsOverlap = (a: ScreenRect, b: ScreenRect): boolean => !(a.x2 < b.x1 || a.x1 > b.x2 || a.y2 < b.y1 || a.y1 > b.y2);\n\nexport const rectContains = (r: ScreenRect, p: ScreenPoint): boolean => p.x >= r.x1 && p.x <= r.x2 && p.y >= r.y1 && p.y <= r.y2;\n\n/** A press that moved at most this many pixels is a click (orbiting never places or picks). */\nexport const CLICK_SLOP_PX = 4;\nexport const isClick = (sx: number, sy: number, ex: number, ey: number): boolean => Math.hypot(ex - sx, ey - sy) <= CLICK_SLOP_PX;\n", "import type { Id, Rig } from \"@dreamy/api\";\nimport { Group } from \"three\";\nimport { rigMatrices, skinBones, writeSegmentMatrices, writeSkinMatrices, type RigMatrices } from \"../math/skeleton-math.js\";\nimport { createSkinUniforms, type SkinUniforms } from \"../materials/skin.js\";\nimport { SculptView } from \"./sculpt-view.js\";\nimport type { ViewContext } from \"./view-context.js\";\nimport { WingView } from \"./wing-view.js\";\n\nexport const partKey = (objectId: Id, boneId: Id) => `${objectId}/${boneId}`;\nexport const bodyKey = (objectId: Id) => `${objectId}/body`;\n\n/**\n * A rig on screen: its skeleton's GPU matrices (uBones for the skinned body, uSeg for rigid parts), its body\n * parts (sculpts or flat wings, in the rig's bind space) and its own skinned body. The group is rig space.\n */\nexport class RigView {\n readonly group = new Group();\n readonly skin: SkinUniforms = createSkinUniforms();\n readonly parts = new Map<Id, SculptView | WingView>();\n body: SculptView | null = null;\n rig: Rig | null = null;\n matrices: RigMatrices | null = null;\n private bonesKey = \"\";\n\n constructor(readonly id: Id, private readonly ctx: ViewContext) {}\n\n /** `showPose`: pose mode and not held at bind (a part of this rig is being sculpted). */\n set(rig: Rig, showPose: boolean): void {\n this.rig = rig;\n const m = rigMatrices(rig.bones, showPose);\n this.matrices = m;\n writeSkinMatrices(m, this.skin.uBones.value);\n writeSegmentMatrices(rig.bones, m, this.skin.uSeg.value);\n this.skin.uSkinned.value = rig.bones.length ? 1 : 0;\n const bonesKey = JSON.stringify(rig.bones.map(b => [b.id, b.parentId, b.bind]));\n\n // Parts\n const seen = new Set<Id>();\n for (const part of rig.parts) {\n const slot = m.index.get(part.boneId);\n if (slot === undefined) continue; // a part whose bone is gone draws nothing\n seen.add(part.boneId);\n let v = this.parts.get(part.boneId);\n const wantWing = part.kind === \"wing\";\n if (v && (v instanceof WingView) !== wantWing) { v.dispose(); this.parts.delete(part.boneId); v = undefined; }\n if (!v) {\n v = wantWing\n ? new WingView(partKey(this.id, part.boneId), this.ctx, this.skin, slot)\n : new SculptView(partKey(this.id, part.boneId), this.ctx, this.skin, { kind: \"rigid\", slot });\n this.parts.set(part.boneId, v);\n this.group.add(v.group);\n }\n if (part.kind === \"wing\" && v instanceof WingView) v.set(part.wing, part.material, slot);\n else if (part.kind === \"sculpt\" && v instanceof SculptView) {\n v.setSkinning({ kind: \"rigid\", slot });\n v.set(part.sculpt);\n }\n }\n for (const [boneId, v] of this.parts) if (!seen.has(boneId)) { v.dispose(); this.parts.delete(boneId); }\n\n // Body: auto weights against the bind skeleton (redone when the bind skeleton changes)\n if (rig.body) {\n if (!this.body) {\n this.body = new SculptView(bodyKey(this.id), this.ctx, this.skin, this.autoSkinning());\n this.group.add(this.body.group);\n }\n if (bonesKey !== this.bonesKey) this.body.setSkinning(this.autoSkinning(bonesKey));\n this.body.set(rig.body);\n } else if (this.body) { this.body.dispose(); this.body = null; }\n this.bonesKey = bonesKey;\n }\n\n private autoSkinning(version = this.bonesKey) {\n return {\n kind: \"auto\" as const,\n version,\n weights: (positions: Float32Array, done: (idx: Float32Array, wt: Float32Array) => void) => {\n const rig = this.rig, m = this.matrices;\n if (!rig || !m || !rig.bones.length) {\n const n = positions.length / 3;\n done(new Float32Array(n * 4), new Float32Array(n * 4).map((_, i) => (i % 4 === 0 ? 1 : 0)));\n return;\n }\n this.ctx.driver.skin({ key: bodyKey(this.id) + \"/skin\", positions: positions.slice(), bones: skinBones(rig.bones, m) },\n r => done(r.boneIndices, r.boneWeights));\n },\n };\n }\n\n /** Every sculpt view of the rig (body first, then sculpt parts). */\n sculptViews(): SculptView[] {\n const out: SculptView[] = this.body ? [this.body] : [];\n for (const v of this.parts.values()) if (v instanceof SculptView) out.push(v);\n return out;\n }\n\n dispose(): void {\n this.body?.dispose();\n for (const v of this.parts.values()) v.dispose();\n this.parts.clear();\n this.group.removeFromParent();\n }\n}\n", "import type { Bone, Id, Transform, Vec3 } from \"@dreamy/api\";\nimport { Matrix4, Quaternion, Vector3 } from \"three\";\nimport { matrixOf, vec3Of } from \"./convert.js\";\n\n/** 64 mat4 per array (uBones, uSeg): the shader's uniform budget. */\nexport const MAX_BONES = 64;\n\nexport type RigMatrices = {\n /** Bone id \u2192 slot in the GPU arrays (rig order, at most 64). */\n readonly index: ReadonlyMap<Id, number>;\n readonly bindGlobal: readonly Matrix4[];\n /** The displayed pose (the bind pose itself in rig mode or while a part is sculpted). */\n readonly shownGlobal: readonly Matrix4[];\n readonly heads: readonly Vector3[];\n};\n\nexport const identityArray = <T extends Float32Array<ArrayBufferLike>>(out: T): T => {\n out.fill(0);\n for (let i = 0; i < MAX_BONES; i++) out[i * 16] = out[i * 16 + 5] = out[i * 16 + 10] = out[i * 16 + 15] = 1;\n return out;\n};\n\nfunction globals(bones: readonly Bone[], index: ReadonlyMap<Id, number>, pick: (b: Bone) => Transform): Matrix4[] {\n const out: (Matrix4 | undefined)[] = new Array(bones.length);\n const visiting = new Set<number>();\n const at = (i: number): Matrix4 => {\n const done = out[i];\n if (done) return done;\n const b = bones[i] as Bone;\n const local = matrixOf(pick(b));\n const pi = b.parentId !== undefined ? index.get(b.parentId) : undefined;\n let m = local;\n if (pi !== undefined && !visiting.has(pi)) {\n visiting.add(i);\n m = at(pi).clone().multiply(local);\n visiting.delete(i);\n }\n out[i] = m;\n return m;\n };\n for (let i = 0; i < bones.length; i++) at(i);\n return out as Matrix4[];\n}\n\nexport function rigMatrices(allBones: readonly Bone[], showPose: boolean): RigMatrices {\n const bones = allBones.slice(0, MAX_BONES);\n const index = new Map<Id, number>();\n bones.forEach((b, i) => index.set(b.id, i));\n const bindGlobal = globals(bones, index, b => b.bind);\n const shownGlobal = showPose ? globals(bones, index, b => b.pose) : bindGlobal.map(m => m.clone());\n const heads = bindGlobal.map(m => new Vector3().setFromMatrixPosition(m));\n return { index, bindGlobal, shownGlobal, heads };\n}\n\n/** Children of each bone (slots), in rig order. */\nexport function childSlots(bones: readonly Bone[], index: ReadonlyMap<Id, number>): number[][] {\n const kids: number[][] = bones.slice(0, MAX_BONES).map(() => []);\n bones.slice(0, MAX_BONES).forEach((b, i) => {\n const p = b.parentId !== undefined ? index.get(b.parentId) : undefined;\n if (p !== undefined && p !== i) kids[p]?.push(i);\n });\n return kids;\n}\n\n/** Skinned body: FinalMatrix = shown global \u00D7 inverse bind, per slot. */\nexport function writeSkinMatrices(m: RigMatrices, out: Float32Array): void {\n identityArray(out);\n const t = new Matrix4();\n m.bindGlobal.forEach((bind, i) => {\n t.copy(bind).invert().premultiply(m.shownGlobal[i] as Matrix4);\n t.toArray(out, i * 16);\n });\n}\n\n// Splits a global scale into \"along the segment axis\" and \"across it\", in the bone's own frame.\nfunction frameScales(s: Vector3, axis: Vector3, bindQuat: Quaternion): { along: number; thick: number } {\n const a = axis.clone().applyQuaternion(bindQuat.clone().invert());\n const wx = a.x * a.x, wy = a.y * a.y, wz = a.z * a.z;\n return { along: s.x * wx + s.y * wy + s.z * wz, thick: 0.5 * (s.x * (1 - wx) + s.y * (1 - wy) + s.z * (1 - wz)) };\n}\n\n/**\n * Rigid body parts (the POC's Skeleton.updateSegments): one matrix per bone that aims the part at its primary\n * child (longest bind segment), stretches it along the bone and scales its thickness across. No blending, so\n * nothing twists or shears. Identity when shown = bind and the bone has no size; a bone's size (length, thickness)\n * scales its part on top: its child joints already sit `length` times farther, so the part stretches to meet them.\n */\nexport function writeSegmentMatrices(bones: readonly Bone[], m: RigMatrices, out: Float32Array): void {\n identityArray(out);\n const kids = childSlots(bones, m.index);\n const sp = new Vector3(), sq = new Quaternion(), ss = new Vector3();\n const bp = new Vector3(), bq = new Quaternion(), bs = new Vector3();\n const mS = new Matrix4(), mR = new Matrix4(), mT = new Matrix4();\n m.bindGlobal.forEach((bind, i) => {\n const H0 = m.heads[i] as Vector3;\n bind.decompose(bp, bq, bs);\n // Primary child: the longest bind segment; a leaf borrows the direction that leads into it.\n let segChild = -1, bindLen = 0;\n for (const k of kids[i] ?? []) {\n const L = (m.heads[k] as Vector3).distanceTo(H0);\n if (L > Math.max(bindLen, 1e-6)) { bindLen = L; segChild = k; }\n }\n const axis = new Vector3(0, 1, 0);\n if (segChild >= 0) axis.subVectors(m.heads[segChild] as Vector3, H0).divideScalar(bindLen);\n else {\n const pb = bones[i]?.parentId;\n const pi = pb !== undefined ? m.index.get(pb) : undefined;\n if (pi !== undefined && (m.heads[pi] as Vector3).distanceTo(H0) > 1e-6) axis.subVectors(H0, m.heads[pi] as Vector3).normalize();\n }\n const bindFs = frameScales(bs, axis, bq);\n // The axis a size stretches along: the longest child that isn't a side branch (a centre bone's left / right ears\n // or legs), else the direction leading in (the core's sizeFrame uses the same rule).\n const sided = (b: Bone | undefined) => !!b && (b.tags.includes(\"side:L\") || b.tags.includes(\"side:R\"));\n const sizeAxis = new Vector3(0, 1, 0);\n let sizeChild = -1, sizeLen = 0;\n for (const k of kids[i] ?? []) {\n if (sided(bones[k]) && !sided(bones[i])) continue;\n const L = (m.heads[k] as Vector3).distanceTo(H0);\n if (L > Math.max(sizeLen, 1e-6)) { sizeLen = L; sizeChild = k; }\n }\n if (sizeChild >= 0) sizeAxis.subVectors(m.heads[sizeChild] as Vector3, H0).divideScalar(sizeLen);\n else {\n const pb = bones[i]?.parentId;\n const pi = pb !== undefined ? m.index.get(pb) : undefined;\n if (pi !== undefined && (m.heads[pi] as Vector3).distanceTo(H0) > 1e-6) sizeAxis.subVectors(H0, m.heads[pi] as Vector3).normalize();\n }\n\n (m.shownGlobal[i] as Matrix4).decompose(sp, sq, ss);\n const rel = sq.clone().multiply(bq.clone().invert());\n const fs = frameScales(ss, axis, bq);\n const size = bones[i]?.size;\n const th = Math.max(0.02, (fs.thick / Math.max(bindFs.thick, 1e-6)) * (size?.thickness ?? 1));\n let sL: number;\n let Q = rel;\n if (segChild >= 0) {\n const seg = new Vector3().setFromMatrixPosition(m.shownGlobal[segChild] as Matrix4).sub(sp);\n const L = seg.length();\n sL = bindLen > 1e-6 ? L / bindLen : 1;\n if (L > 1e-6) {\n const from = axis.clone().applyQuaternion(rel);\n Q = new Quaternion().setFromUnitVectors(from, seg.divideScalar(L)).multiply(rel);\n }\n } else {\n sL = fs.along / Math.max(bindFs.along, 1e-6);\n }\n sL = Math.max(0.02, sL * (size?.length ?? 1));\n const a = sizeAxis, c = sL - th;\n mS.set(\n th + c * a.x * a.x, c * a.x * a.y, c * a.x * a.z, 0,\n c * a.y * a.x, th + c * a.y * a.y, c * a.y * a.z, 0,\n c * a.z * a.x, c * a.z * a.y, th + c * a.z * a.z, 0,\n 0, 0, 0, 1);\n mR.makeRotationFromQuaternion(Q).multiply(mS);\n mR.multiply(mT.makeTranslation(-H0.x, -H0.y, -H0.z));\n mR.premultiply(mT.makeTranslation(sp.x, sp.y, sp.z));\n mR.toArray(out, i * 16);\n });\n}\n\n/** Auto-weight input (evaluator.skinWeights): per bone its bind head and each child's head. */\nexport function skinBones(bones: readonly Bone[], m: RigMatrices): { head: Vec3; childHeads: Vec3[] }[] {\n const kids = childSlots(bones, m.index);\n return m.heads.map((h, i) => ({ head: vec3Of(h), childHeads: (kids[i] ?? []).map(k => vec3Of(m.heads[k] as Vector3)) }));\n}\n\n/** World-free local transform of a bone from a target global (gizmo drags): parentGlobal\u207B\u00B9 \u00D7 target. */\nexport function localFromGlobal(parentGlobal: Matrix4 | undefined, target: Matrix4): Matrix4 {\n return parentGlobal ? parentGlobal.clone().invert().multiply(target) : target.clone();\n}\n", "import { MeshDepthMaterial, RGBADepthPacking } from \"three\";\nimport { identityArray, MAX_BONES } from \"../math/skeleton-math.js\";\n\n/** Bone matrices a rig shares with its body and parts (the arrays are written in place every update). */\nexport type SkinUniforms = {\n readonly uBones: { value: Float32Array };\n readonly uSeg: { value: Float32Array };\n readonly uSkinned: { value: number };\n};\n\nexport const createSkinUniforms = (): SkinUniforms => ({\n uBones: { value: identityArray(new Float32Array(MAX_BONES * 16)) },\n uSeg: { value: identityArray(new Float32Array(MAX_BONES * 16)) },\n uSkinned: { value: 0 },\n});\n\n/** boneWt.w < 0 marks a rigid body-part vertex: one segment matrix, no blending. */\nexport const SKIN_GLSL = /* glsl */ `\n attribute vec4 boneIdx;\n attribute vec4 boneWt;\n uniform mat4 uBones[${MAX_BONES}];\n uniform mat4 uSeg[${MAX_BONES}];\n uniform float uSkinned;\n mat4 getSkinMat() {\n if (uSkinned < 0.5) return mat4(1.0);\n if (boneWt.w < -0.5) return uSeg[int(boneIdx.x)];\n return boneWt.x * uBones[int(boneIdx.x)] + boneWt.y * uBones[int(boneIdx.y)]\n + boneWt.z * uBones[int(boneIdx.z)] + boneWt.w * uBones[int(boneIdx.w)];\n }\n // Inverse-transpose (up to scale) so normals stay correct under non-uniform stretch\n mat3 skinNormalMat(mat4 m) {\n vec3 a = m[0].xyz, b = m[1].xyz, c = m[2].xyz;\n return mat3(cross(b, c), cross(c, a), cross(a, b));\n }\n`;\n\n/** Shadow pass must be skinned too, otherwise shadows stay in the bind pose. */\nexport function createSkinDepthMaterial(skin: SkinUniforms): MeshDepthMaterial {\n const m = new MeshDepthMaterial({ depthPacking: RGBADepthPacking });\n m.onBeforeCompile = shader => {\n shader.uniforms.uBones = skin.uBones;\n shader.uniforms.uSkinned = skin.uSkinned;\n shader.uniforms.uSeg = skin.uSeg;\n shader.vertexShader = SKIN_GLSL + shader.vertexShader.replace(\n \"#include <begin_vertex>\",\n \"vec3 transformed = (getSkinMat() * vec4(position, 1.0)).xyz;\",\n );\n };\n return m;\n}\n", "import type { Decal, MeshRequest, MeshResult, Sculpt } from \"@dreamy/api\";\nimport { Box3, BufferAttribute, BufferGeometry, Group, Matrix3, Matrix4, Euler, Mesh, type MeshStandardMaterial, Vector3 } from \"three\";\nimport { createDecalUniforms, packDecals, type DecalArtInfo, type DecalUniforms } from \"../decals/decal-uniforms.js\";\nimport { hexOf, linearVec } from \"../math/colors.js\";\nimport { createFleckMaterial, createFleckUniforms, FLECK_SHAPES, PATTERN_KINDS, type FleckUniforms } from \"../materials/fleck-material.js\";\nimport { createSkinDepthMaterial, type SkinUniforms } from \"../materials/skin.js\";\nimport { meshContentKey } from \"./mesh-key.js\";\nimport type { ViewContext } from \"./view-context.js\";\n\n/** How a sculpt's vertices follow a rig: not at all, rigidly with one bone (a part), or by auto weights (a body). */\nexport type Skinning =\n | { readonly kind: \"none\" }\n | { readonly kind: \"rigid\"; readonly slot: number }\n | { readonly kind: \"auto\"; readonly version: string; readonly weights: (positions: Float32Array, done: (idx: Float32Array, wt: Float32Array) => void) => void };\n\nconst skinSig = (s: Skinning): string => s.kind === \"rigid\" ? \"rigid:\" + s.slot : s.kind === \"auto\" ? \"auto:\" + s.version : \"none\";\n\n/**\n * One sculpt on screen (a sculpt object, a rig's body or a sculpt body part): the mesh from the evaluator with the\n * fleck material, its decals and its LOD. The group is the sculpt's local (bind) space.\n */\nexport class SculptView {\n readonly group = new Group();\n readonly mesh: Mesh<BufferGeometry, MeshStandardMaterial>;\n readonly fleck: FleckUniforms = createFleckUniforms();\n readonly decal: DecalUniforms;\n sculpt: Sculpt | null = null;\n /** Shown instead of `sculpt` while a drag previews (gizmo, smear). */\n private preview: Sculpt | null = null;\n private dropPreview = false;\n bounds: Box3 | null = null;\n private view: MeshRequest[\"view\"] | undefined = undefined;\n private viewSig = \"\";\n resolution = 0;\n private decalKey = \"\";\n private lookKey = \"\";\n\n /** The bone slot a rigid part follows (its segment matrix), if it's one. */\n get rigidSlot(): number | undefined {\n return this.skinning.kind === \"rigid\" ? this.skinning.slot : undefined;\n }\n\n constructor(readonly key: string, private readonly ctx: ViewContext, private readonly skin: SkinUniforms, private skinning: Skinning) {\n this.decal = createDecalUniforms(ctx.atlas.texture);\n this.mesh = new Mesh(new BufferGeometry(), createFleckMaterial(ctx.globals, this.fleck, skin, this.decal, ctx.env));\n this.mesh.frustumCulled = false;\n this.mesh.castShadow = true;\n this.mesh.receiveShadow = true;\n this.mesh.customDepthMaterial = createSkinDepthMaterial(skin);\n this.mesh.visible = false;\n this.mesh.userData.view = this;\n this.group.add(this.mesh);\n }\n\n /** The sculpt shown now (the drag preview while there is one). */\n get shown(): Sculpt | null { return this.preview ?? this.sculpt; }\n\n setSkinning(s: Skinning): void {\n const changed = skinSig(s) !== skinSig(this.skinning);\n this.skinning = s;\n if (changed) { this.ctx.driver.invalidate(this.key); this.remesh(); }\n }\n\n set(sculpt: Sculpt): void {\n this.sculpt = sculpt;\n if (this.dropPreview) { this.dropPreview = false; this.preview = null; }\n this.refresh();\n }\n\n /** A committed drag: keep showing the preview until the creation that includes it arrives (no flicker). */\n clearPreviewOnNextSet(): void { if (this.preview) this.dropPreview = true; }\n\n setPreview(sculpt: Sculpt | null): void {\n this.preview = sculpt;\n this.refresh();\n }\n\n /** Re-applies look, decals and (if needed) the mesh against the current palette. */\n refresh(): void {\n const s = this.shown;\n if (!s) return;\n this.applyLook(s);\n this.applyDecals(s.decals);\n this.remesh();\n }\n\n /** Chunked LOD view for a large standalone sculpt (camera in sculpt space, quantized signature). */\n setView(view: MeshRequest[\"view\"] | undefined, sig: string): void {\n if (sig === this.viewSig) return;\n this.view = view;\n this.viewSig = sig;\n this.remesh();\n }\n\n setResolution(res: number): void {\n if (res === this.resolution) return;\n this.resolution = res;\n this.remesh();\n }\n\n private remesh(): void {\n const s = this.shown;\n if (!s || !this.resolution) return;\n const content = meshContentKey(s, this.ctx.palette) + \"|\" + skinSig(this.skinning);\n this.ctx.driver.mesh(this.key, s, this.ctx.palette, this.resolution, content, r => this.install(r), this.view, this.viewSig);\n }\n\n private install(r: MeshResult): void {\n if (r.overflow) this.ctx.warn(\"Symmetry limit reached: some kaleidoscope copies were skipped. Lower the count.\");\n const geo = new BufferGeometry();\n geo.setAttribute(\"position\", new BufferAttribute(r.positions, 3));\n geo.setAttribute(\"normal\", new BufferAttribute(r.normals, 3));\n geo.setAttribute(\"color\", new BufferAttribute(r.colors, 3));\n geo.setAttribute(\"foundation\", new BufferAttribute(r.foundation, 3));\n geo.setAttribute(\"matProps\", new BufferAttribute(r.material, 4));\n geo.setIndex(new BufferAttribute(r.indices, 1));\n const n = r.positions.length / 3;\n const finish = (idx: Float32Array, wt: Float32Array) => {\n geo.setAttribute(\"boneIdx\", new BufferAttribute(idx, 4));\n geo.setAttribute(\"boneWt\", new BufferAttribute(wt, 4));\n geo.computeBoundingSphere();\n this.mesh.geometry.dispose();\n this.mesh.geometry = geo;\n this.mesh.visible = r.indices.length > 0;\n this.bounds = new Box3(new Vector3(r.boundsMin.x, r.boundsMin.y, r.boundsMin.z), new Vector3(r.boundsMax.x, r.boundsMax.y, r.boundsMax.z));\n this.ctx.changed();\n };\n const sk = this.skinning;\n if (sk.kind === \"auto\" && n > 0) { sk.weights(r.positions, finish); return; }\n const idx = new Float32Array(n * 4), wt = new Float32Array(n * 4);\n if (sk.kind === \"rigid\") for (let v = 0; v < n; v++) { idx[v * 4] = sk.slot; wt[v * 4 + 3] = -1; }\n finish(idx, wt);\n }\n\n private applyLook(s: Sculpt): void {\n const p = this.ctx.palette, { fleck, material, pattern } = s.look;\n const key = JSON.stringify([fleck, material.opacity, pattern, hexOf(pattern.color, p), hexOf(pattern.color2, p)]);\n if (key === this.lookKey) return;\n this.lookKey = key;\n const f = this.fleck;\n f.uFleckScale.value = fleck.size;\n f.uVariation.value = fleck.variation;\n f.uCoverage.value = fleck.coverage;\n f.uFoundationDarkness.value = fleck.foundationDarkness;\n f.uRegularity.value = fleck.regularity;\n f.uBoil.value = fleck.boil;\n f.uNormalStrength.value = fleck.normalStrength;\n f.uFleckShape.value = Math.max(0, FLECK_SHAPES.indexOf(fleck.shape));\n f.uOpacity.value = material.opacity;\n f.uPatternType.value = Math.max(0, PATTERN_KINDS.indexOf(pattern.kind));\n f.uPatternScale.value = pattern.scale;\n f.uPatternStrength.value = pattern.strength;\n const d = Math.PI / 180;\n f.uPatternRot.value = new Matrix3().setFromMatrix4(new Matrix4().makeRotationFromEuler(new Euler(pattern.rotation.x * d, pattern.rotation.y * d, pattern.rotation.z * d, \"XYZ\")));\n linearVec(hexOf(pattern.color, p), f.uPatternColor.value);\n linearVec(hexOf(pattern.color2, p), f.uPatternColor2.value);\n }\n\n /** Decals never remesh: they are uniforms over the mesh. */\n applyDecals(decals: readonly Decal[], force = false): void {\n const p = this.ctx.palette;\n const key = JSON.stringify(decals) + JSON.stringify(p);\n if (!force && key === this.decalKey) return;\n this.decalKey = key;\n const atlas = this.ctx.atlas;\n const tint = (d: Decal, info: DecalArtInfo): readonly [number, number, number] => {\n let hex = 0xffffff;\n if (info.room !== undefined) hex = d.tint ? hexOf(d.tint, p) : (atlas.builtinOf(d.art)?.wall ?? 0xffffff);\n else if (info.tintable) hex = hexOf(d.tint ?? atlas.builtinOf(d.art)?.tint ?? \"black\", p);\n const v = linearVec(hex);\n return [v.x, v.y, v.z];\n };\n const tex = this.decal.uDecalData.value;\n const r = packDecals(decals, d => atlas.info(d.art), tint, tex.image.data as Float32Array, this.decal.uDecalBounds.value);\n this.decal.uDecalCount.value = r.count;\n this.decal.interiors = r.interiors;\n tex.needsUpdate = true;\n }\n\n setGrayscale(v: number): void { this.fleck.uGrayscale.value = v; }\n\n /** Interior rooms need the camera in this sculpt's space. */\n updateLocalCamera(cameraWorld: Vector3): void {\n if (!this.decal.interiors) return;\n this.group.updateWorldMatrix(true, false);\n this.decal.uLocalCam.value.copy(this.group.worldToLocal(cameraWorld.clone()));\n }\n\n triangles(): number { return this.mesh.visible ? (this.mesh.geometry.index?.count ?? 0) / 3 : 0; }\n\n dispose(): void {\n this.ctx.driver.forget(this.key);\n this.mesh.geometry.dispose();\n this.mesh.material.dispose();\n this.mesh.customDepthMaterial?.dispose();\n this.decal.uDecalData.value.dispose();\n this.group.removeFromParent();\n }\n}\n", "import type { Decal } from \"@dreamy/api\";\nimport { DataTexture, FloatType, Matrix4, NearestFilter, Quaternion, RGBAFormat, Vector3, type Texture } from \"three\";\nimport { DECAL_COLS, DECAL_TEX_W, MAX_DECALS } from \"./decal-limits.js\";\n\n/** What the shader needs about a decal's art: its atlas cell (or an interior room) and whether it tints. */\nexport type DecalArtInfo = {\n readonly cell: number;\n readonly tintable: boolean;\n /** Interior room id (ray-traced, no atlas cell). */\n readonly room?: number;\n /** The art is gone (a deleted design): drawn fully transparent. */\n readonly missing?: boolean;\n};\n\nexport type DecalUniforms = {\n readonly uDecalData: { value: DataTexture };\n readonly uDecalCount: { value: number };\n readonly uDecalAtlas: { value: Texture | null };\n readonly uDecalBounds: { value: Float32Array };\n /** Camera in the sculpt's bind space (interior rays). */\n readonly uLocalCam: { value: Vector3 };\n interiors: number;\n};\n\nexport function createDecalUniforms(atlas: Texture | null): DecalUniforms {\n const tex = new DataTexture(new Float32Array(DECAL_TEX_W * MAX_DECALS * 4), DECAL_TEX_W, MAX_DECALS, RGBAFormat, FloatType);\n tex.minFilter = tex.magFilter = NearestFilter;\n tex.generateMipmaps = false;\n tex.needsUpdate = true;\n return {\n uDecalData: { value: tex }, uDecalCount: { value: 0 }, uDecalAtlas: { value: atlas },\n uDecalBounds: { value: new Float32Array(MAX_DECALS * 4) }, uLocalCam: { value: new Vector3() }, interiors: 0,\n };\n}\n\n/**\n * Packs decals into the shader's layout (rows 0\u20132: bind space \u2192 decal space, x / y in [\u22120.5, 0.5], z along the\n * normal; then atlas cell + flip + tintable, tint rgb + opacity, interior kind / room / depth / seed) and a\n * bounding sphere per decal. Returns the count drawn and how many are interiors.\n */\nexport function packDecals(\n decals: readonly Decal[],\n art: (d: Decal) => DecalArtInfo,\n tint: (d: Decal, info: DecalArtInfo) => readonly [number, number, number],\n data: Float32Array,\n bounds: Float32Array,\n): { count: number; interiors: number } {\n const m = new Matrix4(), q = new Quaternion();\n const list = decals.slice(0, MAX_DECALS);\n let interiors = 0;\n list.forEach((d, i) => {\n const base = i * DECAL_TEX_W * 4, s = Math.max(d.size, 1e-4);\n const e = m.makeRotationFromQuaternion(q.set(d.rotation.x, d.rotation.y, d.rotation.z, d.rotation.w)).elements;\n for (let k = 0; k < 3; k++) {\n const ax = e[k * 4] as number, ay = e[k * 4 + 1] as number, az = e[k * 4 + 2] as number;\n data.set([ax / s, ay / s, az / s, -(ax * d.position.x + ay * d.position.y + az * d.position.z) / s], base + k * 4);\n }\n const info = art(d);\n const room = info.room !== undefined;\n if (room) interiors++;\n const [r, g, b] = tint(d, info);\n data.set([info.cell % DECAL_COLS, Math.floor(info.cell / DECAL_COLS), d.flip ? 1 : 0, info.tintable ? 1 : 0], base + 12);\n data.set([r, g, b, info.missing ? 0 : d.opacity], base + 16);\n data.set([room ? 1 : 0, info.room ?? 0, d.depth ?? 1, d.seed ?? 0], base + 20);\n bounds.set([d.position.x, d.position.y, d.position.z, d.size * 0.8], i * 4); // box half-diagonal \u2248 0.79 \u00D7 size\n });\n return { count: list.length, interiors };\n}\n", "import type { FleckShape, PatternKind } from \"@dreamy/api\";\nimport { Matrix3, MeshStandardMaterial, Vector3, type Texture } from \"three\";\nimport { DECAL_GLSL } from \"../decals/decal-glsl.js\";\nimport type { DecalUniforms } from \"../decals/decal-uniforms.js\";\nimport { PIXEL_ALPHA_CUT } from \"../scene/render-settings.js\";\nimport type { GlobalUniforms } from \"./global-uniforms.js\";\nimport { SKIN_GLSL, type SkinUniforms } from \"./skin.js\";\n\n/** The POC's fleck shapes, in shader index order (the contract's FleckShape order). */\nexport const FLECK_SHAPES: readonly FleckShape[] = [\n \"pill\", \"circle\", \"square\", \"diamond\", \"triangle\", \"hexagon\", \"star\", \"cross\", \"ring\", \"streak\", \"leaf\",\n \"sand\", \"gravel\", \"cement\", \"grass\", \"terrazzo\", \"scales\", \"plates\", \"none\",\n];\nexport const PATTERN_KINDS: readonly PatternKind[] = [\"none\", \"stripes\", \"tiger\", \"leopard\", \"cow\", \"thunder\", \"dots\", \"scales\", \"camouflage\"];\n\n/** Per-sculpt look uniforms; the sculpt view writes them, the shader reads them. */\nexport type FleckUniforms = {\n readonly uGrayscale: { value: number };\n readonly uFleckScale: { value: number };\n readonly uVariation: { value: number };\n readonly uCoverage: { value: number };\n readonly uFoundationDarkness: { value: number };\n readonly uRegularity: { value: number };\n readonly uBoil: { value: number };\n readonly uNormalStrength: { value: number };\n readonly uFleckShape: { value: number };\n readonly uOpacity: { value: number };\n readonly uPatternType: { value: number };\n readonly uPatternScale: { value: number };\n readonly uPatternStrength: { value: number };\n readonly uPatternRot: { value: Matrix3 };\n readonly uPatternColor: { value: Vector3 };\n readonly uPatternColor2: { value: Vector3 };\n readonly uTeeth: { value: Vector3 };\n};\n\nexport const createFleckUniforms = (): FleckUniforms => ({\n uGrayscale: { value: 0 }, uFleckScale: { value: 1 }, uVariation: { value: 0 }, uCoverage: { value: 1 },\n uFoundationDarkness: { value: 0.08 }, uRegularity: { value: 0 }, uBoil: { value: 1 }, uNormalStrength: { value: 1 },\n uFleckShape: { value: 0 }, uOpacity: { value: 1 }, uPatternType: { value: 0 }, uPatternScale: { value: 1 },\n uPatternStrength: { value: 1 }, uPatternRot: { value: new Matrix3() }, uPatternColor: { value: new Vector3() },\n uPatternColor2: { value: new Vector3() }, uTeeth: { value: new Vector3(0xfb / 255, 0xfb / 255, 0xfa / 255) },\n});\n\n/**\n * Sculpt surface (the POC's fleck-material.js): MeshStandardMaterial with vertex colors plus the foundation bed,\n * flecks, 3D patterns, per-vertex material channels, decals, skinning, dithered opacity, grayscale isolation and\n * the pixel-art offscreen output.\n */\nexport function createFleckMaterial(g: GlobalUniforms, f: FleckUniforms, skin: SkinUniforms, decal: DecalUniforms, env: Texture | null): MeshStandardMaterial {\n const mat = new MeshStandardMaterial({ roughness: 0.8, metalness: 0, vertexColors: true });\n if (env) { mat.envMap = env; mat.envMapIntensity = 0.6; }\n mat.onBeforeCompile = shader => {\n Object.assign(shader.uniforms, g, f, skin, {\n uDecalData: decal.uDecalData, uDecalCount: decal.uDecalCount, uDecalAtlas: decal.uDecalAtlas,\n uLocalCam: decal.uLocalCam, uDecalBounds: decal.uDecalBounds,\n });\n shader.vertexShader = `\n attribute vec3 foundation;\n attribute vec4 matProps;\n varying vec3 vFoundation;\n varying vec4 vMat;\n varying vec3 vWorldNormal;\n varying vec3 vLocalPos;\n varying vec3 vLocalNormal;\n // Mesh colors are palette hex / 255 (sRGB): shade on the linear value so bodies show their swatch color\n vec3 srgbToLinear3(vec3 c) { return mix(c / 12.92, pow((c + 0.055) / 1.055, vec3(2.4)), step(vec3(0.04045), c)); }\n ${SKIN_GLSL}\n ${shader.vertexShader}\n `.replace(\n '#include <beginnormal_vertex>',\n `\n #include <beginnormal_vertex>\n vWorldNormal = normalize((modelMatrix * vec4(normal, 0.0)).xyz);\n vLocalNormal = normal;\n vLocalPos = position;\n vFoundation = srgbToLinear3(foundation);\n vMat = matProps;\n mat4 skinMat = getSkinMat();\n objectNormal = normalize(skinNormalMat(skinMat) * objectNormal);\n `\n ).replace(\n '#include <color_vertex>',\n `#include <color_vertex>\n #ifdef USE_COLOR\n vColor.rgb = srgbToLinear3(vColor.rgb);\n #endif`\n ).replace(\n '#include <begin_vertex>',\n 'vec3 transformed = (skinMat * vec4(position, 1.0)).xyz;'\n );\n\n shader.fragmentShader = `\n uniform float uTime;\n uniform float uPixelOut;\n uniform float uGrayscale;\n uniform float uFleckScale;\n uniform float uVariation;\n uniform float uCoverage;\n uniform float uFoundationDarkness;\n varying vec3 vFoundation;\n uniform float uRegularity;\n uniform float uBoil;\n uniform float uNormalStrength;\n uniform float uOpacity;\n uniform int uFleckShape;\n varying vec4 vMat;\n\n uniform int uPatternType;\n uniform float uPatternScale;\n uniform float uPatternStrength;\n uniform mat3 uPatternRot;\n uniform vec3 uPatternColor;\n uniform vec3 uPatternColor2;\n uniform vec3 uTeeth;\n\n varying vec3 vWorldNormal;\n varying vec3 vLocalPos;\n\n float gIsBlackPixel = 0.0;\n\n vec2 hash22(vec2 p) {\n vec3 p3 = fract(vec3(p.xyx) * vec3(0.1031, 0.1030, 0.0973));\n p3 += dot(p3, p3.yzx + 33.33);\n return fract((p3.xx + p3.yz) * p3.zy);\n }\n float hash21(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 vec2 rotate2D(vec2 p, float a) {\n float c = cos(a), s = sin(a);\n return vec2(c * p.x - s * p.y, s * p.x + c * p.y);\n }\n\n float sdTriangle(vec2 p, float r) {\n const float k = 1.7320508;\n p.x = abs(p.x) - r;\n p.y = p.y + r / k;\n if (p.x + k * p.y > 0.0) p = vec2(p.x - k * p.y, -k * p.x - p.y) * 0.5;\n p.x -= clamp(p.x, -2.0 * r, 0.0);\n return -length(p) * sign(p.y);\n }\n\n float sdHexagon(vec2 p, float r) {\n const vec3 k = vec3(-0.866025404, 0.5, 0.577350269);\n p = abs(p);\n p -= 2.0 * min(dot(k.xy, p), 0.0) * k.xy;\n p -= vec2(clamp(p.x, -k.z * r, k.z * r), r);\n return length(p) * sign(p.y);\n }\n\n float fleckShapeMetric(vec2 p) {\n if (uFleckShape == 14) {\n vec2 pa = p - vec2(clamp(p.x, -0.4, 0.4), 0.0);\n return length(vec2(pa.x, pa.y * 9.0));\n }\n if (uFleckShape == 15) return 1.0 + sdHexagon(p, 0.26) / 0.26;\n if (uFleckShape == 16) {\n vec2 uv = p;\n uv.y *= 1.15;\n float row = floor(uv.y);\n uv.x += mod(row, 2.0) * 0.5;\n vec2 f = fract(uv) - vec2(0.5, 0.0);\n float d = length(f * vec2(1.0, 0.9));\n return 1.0 - smoothstep(0.62, 0.30, d);\n }\n if (uFleckShape == 17) {\n vec2 uv = p * 1.4;\n vec2 f = fract(uv) - 0.5;\n return smoothstep(0.0, 0.08, length(f));\n }\n if (uFleckShape == 0) {\n vec2 pa = p - vec2(clamp(p.x, -0.22, 0.22), 0.0);\n return length(vec2(pa.x * 1.5, pa.y * 2.2));\n }\n if (uFleckShape == 1) return length(p) * 1.8;\n if (uFleckShape == 2) return max(abs(p.x), abs(p.y)) * 2.0;\n if (uFleckShape == 3) return (abs(p.x) + abs(p.y)) * 1.7;\n if (uFleckShape == 4) return 1.0 + sdTriangle(p, 0.32) / 0.185;\n if (uFleckShape == 5) return 1.0 + sdHexagon(p, 0.36) / 0.36;\n if (uFleckShape == 6) {\n float a = atan(p.y, p.x);\n float f = 0.4 - 0.25 * pow(abs(sin(2.5 * a)), 0.6);\n return length(p) / f;\n }\n if (uFleckShape == 7) {\n return min(max(abs(p.x) * 6.0, abs(p.y) * 2.0),\n max(abs(p.x) * 2.0, abs(p.y) * 6.0));\n }\n if (uFleckShape == 8) return abs(length(p) - 0.3) * 8.0;\n if (uFleckShape == 9) {\n vec2 pa = p - vec2(clamp(p.x, -0.45, 0.45), 0.0);\n return length(vec2(pa.x, pa.y * 6.0)) * 1.0;\n }\n float h = max(0.18 * (1.0 - 4.0 * p.x * p.x), 0.001);\n return max(abs(p.x) * 2.0, abs(p.y) / h);\n }\n\n float fleckBound() {\n if (uFleckShape == 14) return 0.55;\n if (uFleckShape == 15) return 0.3;\n if (uFleckShape == 16) return 0.6;\n if (uFleckShape == 17) return 0.7;\n if (uFleckShape == 0) return 0.9;\n if (uFleckShape == 1) return 0.56;\n if (uFleckShape == 2) return 0.71;\n if (uFleckShape == 3) return 0.6;\n if (uFleckShape == 4) return 0.4;\n if (uFleckShape == 5) return 0.45;\n if (uFleckShape == 6) return 0.4;\n if (uFleckShape == 7) return 0.53;\n if (uFleckShape == 8) return 0.43;\n if (uFleckShape == 9) return 1.5;\n return 0.55;\n }\n\n vec3 gFleckTint = vec3(1.0);\n float gPixLocal = 0.0;\n\n float hash31(vec3 p) {\n p = fract(p * 0.1031);\n p += dot(p, p.zyx + 31.32);\n return fract((p.x + p.y) * p.z);\n }\n float vnoise(vec3 p) {\n vec3 i = floor(p), f = fract(p);\n f = f * f * (3.0 - 2.0 * f);\n return mix(mix(mix(hash31(i), hash31(i + vec3(1.0, 0.0, 0.0)), f.x),\n mix(hash31(i + vec3(0.0, 1.0, 0.0)), hash31(i + vec3(1.0, 1.0, 0.0)), f.x), f.y),\n mix(mix(hash31(i + vec3(0.0, 0.0, 1.0)), hash31(i + vec3(1.0, 0.0, 1.0)), f.x),\n mix(hash31(i + vec3(0.0, 1.0, 1.0)), hash31(i + vec3(1.0, 1.0, 1.0)), f.x), f.y), f.z);\n }\n\n // Procedural 3D Patterns (Evaluated after vnoise is declared)\n void evalPattern(vec3 pos, int type, float scale, vec3 col1, vec3 col2, inout vec3 outCol) {\n if (type == 0 || uPatternStrength <= 0.001) return;\n // Rotate position coordinates in 3D before applying scale\n vec3 p = (uPatternRot * pos) * (scale * 2.0);\n\n if (type == 1) { // Stripes\n float s = sin(p.y * 6.0 + sin(p.x * 2.0) * 0.5) * 0.5 + 0.5;\n float m = smoothstep(0.40, 0.60, s);\n outCol = mix(outCol, col1, m * uPatternStrength);\n } else if (type == 2) { // Tiger\n float n1 = vnoise(p * vec3(1.0, 0.3, 1.0) * 2.0);\n float n2 = vnoise(p * vec3(0.5, 1.5, 0.5) + vec3(11.3));\n float wave = sin(p.y * 7.0 + n1 * 5.0 + n2 * 2.0) * 0.5 + 0.5;\n float m = smoothstep(0.54, 0.64, wave);\n outCol = mix(outCol, col1, m * uPatternStrength);\n } else if (type == 3) { // Leopard (Rosettes: col1 ring, col2 center)\n vec3 fCell = fract(p * 1.4) - 0.5;\n float dCenter = length(fCell) + (vnoise(p * 2.5) - 0.5) * 0.25;\n float innerMask = smoothstep(0.28, 0.20, dCenter);\n float ringMask = smoothstep(0.42, 0.32, dCenter) * (1.0 - innerMask);\n outCol = mix(outCol, col2, innerMask * uPatternStrength);\n outCol = mix(outCol, col1, ringMask * uPatternStrength);\n } else if (type == 4) { // Cow\n float nLow = vnoise(p * 0.65);\n float nMed = vnoise(p * 1.3 + vec3(5.2));\n float cowVal = nLow * 0.7 + nMed * 0.3;\n float cowMask = smoothstep(0.48, 0.52, cowVal);\n outCol = mix(outCol, col1, cowMask * uPatternStrength);\n } else if (type == 5) { // Thunder\n float nCrack = vnoise(p * 1.8);\n float nCrack2 = vnoise(p * 3.6 + vec3(nCrack * 2.0));\n float crack = 1.0 - abs(nCrack2 * 2.0 - 1.0);\n float fissure = smoothstep(0.86, 0.98, crack);\n float glow = smoothstep(0.68, 0.94, crack);\n outCol = mix(outCol, col2, glow * 0.6 * uPatternStrength);\n outCol = mix(outCol, col1, fissure * uPatternStrength);\n } else if (type == 6) { // Dots\n vec3 dCell = fract(p * 1.6) - 0.5;\n float dR = length(dCell) + (vnoise(p * 2.2) - 0.5) * 0.12;\n float dotMask = smoothstep(0.32, 0.24, dR);\n outCol = mix(outCol, col1, dotMask * uPatternStrength);\n } else if (type == 7) { // Scales\n vec2 scUv = vec2(atan(p.x, max(abs(p.z), 0.001)) * 1.5, p.y * 3.0);\n scUv.y += mod(floor(scUv.x), 2.0) * 0.5;\n vec2 scF = fract(scUv) - vec2(0.5, 0.0);\n float scD = length(scF * vec2(1.0, 1.4));\n float scEdge = smoothstep(0.45, 0.52, scD);\n outCol = mix(outCol, col1, (1.0 - scEdge) * uPatternStrength);\n } else if (type == 8) { // Camouflage\n float cNoise = vnoise(p * 0.8) * 0.6 + vnoise(p * 1.6 + vec3(2.1)) * 0.4;\n float camo1 = smoothstep(0.38, 0.45, cNoise) * (1.0 - smoothstep(0.55, 0.62, cNoise));\n float camo2 = smoothstep(0.62, 0.70, cNoise);\n outCol = mix(outCol, col1, camo1 * uPatternStrength);\n outCol = mix(outCol, col2, camo2 * uPatternStrength);\n }\n }\n\n vec3 grainTint(vec3 r, float v) {\n float b = 1.0 + (r.x - 0.5) * v * 1.3;\n return max(vec3(0.0), b * (1.0 + (vec3(r.y, r.z, r.x) - 0.5) * v * 0.35));\n }\n float fleckVar() {\n float base = 0.0;\n if (uFleckShape == 11) base = 0.5;\n else if (uFleckShape == 12) base = 0.4;\n else if (uFleckShape == 13) base = 0.35;\n else if (uFleckShape == 14) base = 0.5;\n else if (uFleckShape == 15) base = 1.0;\n else if (uFleckShape == 16) base = 0.3;\n else if (uFleckShape == 17) base = 0.2;\n return clamp(base + uVariation, 0.0, 1.0);\n }\n float grainLod(float cellsPerUnit) {\n float cpp = gPixLocal * (3.8 / max(uFleckScale, 0.15)) * cellsPerUnit;\n return smoothstep(0.35, 0.8, cpp);\n }\n\n float evalFleckCell(vec2 uv, float boilFlutter) {\n vec2 id = floor(uv);\n vec2 f = fract(uv) - 0.5;\n float minD = 10.0;\n float maxR = fleckBound() + 0.08;\n float maxR2 = maxR * maxR;\n float vEff = fleckVar();\n float cov = uCoverage * (uFleckShape == 15 ? 0.5 : 1.0);\n vec2 bestId = id;\n vec2 bestP = vec2(0.0);\n\n for (int y = -1; y <= 1; y++) {\n for (int x = -1; x <= 1; x++) {\n vec2 neighbor = vec2(float(x), float(y));\n vec2 cellId = id + neighbor;\n if (hash21(cellId + 29.1) > cov) continue;\n vec2 randJitter = hash22(cellId);\n\n vec2 offset = mix((randJitter - 0.5) * 0.72, vec2(0.0), uRegularity);\n vec2 p = f - neighbor - offset;\n\n if (dot(p, p) > maxR2) continue;\n\n vec2 rv = hash22(cellId + 17.3) - 0.5 + vec2(1e-4, 0.0);\n rv = normalize(mix(normalize(rv), vec2(1.0, 0.0), uRegularity) + vec2(1e-4, 0.0));\n p = vec2(rv.x * p.x + rv.y * p.y, -rv.y * p.x + rv.x * p.y);\n p += vec2(boilFlutter * 0.08);\n p *= 1.0 + 0.8 * vEff * hash21(cellId + 5.7);\n\n float m = fleckShapeMetric(p);\n if (m < minD) { minD = m; bestId = cellId; bestP = p; }\n }\n }\n\n if (vEff > 0.001) {\n gFleckTint = grainTint(vec3(hash21(bestId + 1.3), hash21(bestId + 2.9), hash21(bestId + 4.1)), vEff);\n if (uFleckShape == 14) gFleckTint *= 0.7 + 0.6 * smoothstep(-0.4, 0.4, bestP.x);\n if (uFleckShape == 15) {\n vec3 chip = 0.35 + vec3(hash21(bestId + 6.1), hash21(bestId + 8.3), hash21(bestId + 9.7));\n gFleckTint = mix(gFleckTint, chip, 0.75);\n }\n }\n return clamp(1.0 - minD, 0.0, 1.0);\n }\n\n float evalSand(vec3 q) {\n vec3 id = floor(q * 7.0);\n float h = hash31(id);\n float lod = grainLod(7.0);\n float height = hash31(id + 5.3) > uCoverage ? 0.0 : 0.55 + 0.45 * h;\n gFleckTint = mix(grainTint(vec3(h, hash31(id + 1.7), hash31(id + 3.9)), fleckVar()), vec3(1.0), lod);\n return mix(height, 0.75, lod);\n }\n\n float evalGravel(vec3 q, vec3 n) {\n vec3 an = abs(n);\n vec2 uv = ((an.x > an.y && an.x > an.z) ? q.yz : ((an.y > an.z) ? q.xz : q.xy)) * 0.9;\n vec2 id = floor(uv), f = fract(uv);\n float d1 = 8.0, d2 = 8.0;\n vec2 bid = id;\n for (int y = -1; y <= 1; y++) {\n for (int x = -1; x <= 1; x++) {\n vec2 nb = vec2(float(x), float(y));\n vec2 cid = id + nb;\n vec2 pt = nb + 0.15 + 0.7 * hash22(cid) - f;\n float d = dot(pt, pt);\n if (d < d1) { d2 = d1; d1 = d; bid = cid; }\n else if (d < d2) d2 = d;\n }\n }\n float edge = sqrt(d2) - sqrt(d1);\n float dome = smoothstep(0.0, 0.2, edge) * (0.65 + 0.35 * smoothstep(0.0, 0.5, edge));\n if (hash21(bid + 11.0) > uCoverage) dome = 0.0;\n float lod = grainLod(0.9);\n vec3 r = vec3(hash21(bid), hash21(bid + 3.3), hash21(bid + 7.1));\n gFleckTint = mix(grainTint(r, fleckVar()), vec3(1.0), lod);\n return mix(dome, 0.7, lod);\n }\n\n float evalCement(vec3 q) {\n vec3 g = q * 1.4;\n float n1 = vnoise(g), n2 = vnoise(g * 2.3 + 11.7), n3 = vnoise(g * 5.1 + 3.1);\n float n = n1 * 0.55 + n2 * 0.3 + n3 * 0.15;\n float pit = smoothstep(mix(0.55, 0.72, uCoverage), mix(0.68, 0.85, uCoverage), n3);\n float height = (0.85 + 0.3 * (n - 0.5)) * (1.0 - pit * 0.9);\n float lod = grainLod(7.0);\n gFleckTint = mix(vec3(max(1.0 + (n - 0.5) * fleckVar() * 2.4, 0.0)), vec3(1.0), lod);\n return mix(height, 0.8, lod);\n }\n\n float evalFleckImpasto(vec3 p, vec3 n) {\n float scale = max(uFleckScale, 0.15);\n vec3 pScaled = p * (3.8 / scale);\n if (uFleckShape == 11) return evalSand(pScaled);\n if (uFleckShape == 12) return evalGravel(pScaled, n);\n if (uFleckShape == 13) return evalCement(pScaled);\n if (uFleckShape == 14) pScaled *= 2.2;\n if (uFleckShape == 15) pScaled *= 0.8;\n float boilFlutter = sin(uTime * 3.5 * uBoil + dot(p, vec3(12.0))) * 0.15 * uBoil;\n\n vec3 an = abs(n);\n vec2 uvProj = (an.x > an.y && an.x > an.z) ? pScaled.yz : ((an.y > an.z) ? pScaled.xz : pScaled.xy);\n return evalFleckCell(uvProj, boilFlutter);\n }\n\n ${DECAL_GLSL}\n\n ${shader.fragmentShader}\n `.replace(\n '#include <color_fragment>',\n `\n #include <color_fragment>\n vec4 decalC = vec4(0.0);\n if (uDecalCount > 0.5) decalC = evalDecals(vLocalPos, vLocalNormal);\n\n gPixLocal = max(fwidth(vLocalPos.x), max(fwidth(vLocalPos.y), fwidth(vLocalPos.z)));\n float fleckH = 1.0;\n if (decalC.a < 0.99 && uFleckShape != 18 && vMat.w > 0.01) {\n fleckH = mix(1.0, evalFleckImpasto(vLocalPos, vLocalNormal), clamp(vMat.w, 0.0, 1.0));\n }\n\n vec3 fleckCol = diffuseColor.rgb * gFleckTint;\n vec3 bedCol = vFoundation * max(0.2, 1.0 - uFoundationDarkness);\n\n // Blend 3D patterns into fleck and foundation bed\n evalPattern(vLocalPos, uPatternType, uPatternScale, uPatternColor, uPatternColor2, fleckCol);\n evalPattern(vLocalPos, uPatternType, uPatternScale, uPatternColor, uPatternColor2, bedCol);\n\n diffuseColor.rgb = mix(bedCol, fleckCol, fleckH);\n\n if (decalC.a > 0.0) {\n diffuseColor.rgb = mix(diffuseColor.rgb, decalC.rgb, decalC.a);\n fleckH = mix(fleckH, 1.0, decalC.a);\n }\n\n // Detect black decals (e.g. eyes, mouths) and black surface colors\n if (decalC.a > 0.1 && max(decalC.r, max(decalC.g, decalC.b)) < 0.09) {\n gIsBlackPixel = decalC.a;\n } else if (max(diffuseColor.r, max(diffuseColor.g, diffuseColor.b)) < 0.08) {\n gIsBlackPixel = 1.0;\n }\n `\n ).replace(\n '#include <roughnessmap_fragment>',\n `#include <roughnessmap_fragment>\n // Minimum roughness clamp prevents specular blown-out teeth white\n roughnessFactor = clamp(vMat.x, 0.4, 1.0);`\n ).replace(\n '#include <metalnessmap_fragment>',\n `#include <metalnessmap_fragment>\n metalnessFactor = clamp(vMat.y, 0.0, 1.0);`\n ).replace(\n '#include <emissivemap_fragment>',\n `#include <emissivemap_fragment>\n totalEmissiveRadiance += diffuseColor.rgb * (vMat.z + gDecalGlow);`\n ).replace(\n '#include <normal_fragment_maps>',\n `\n #include <normal_fragment_maps>\n {\n float bumpH = fleckH * (2.0 - fleckH);\n vec2 dHdxy = vec2(dFdx(bumpH), dFdy(bumpH)) * (uNormalStrength * 0.09);\n vec3 sigmaX = dFdx(-vViewPosition);\n vec3 sigmaY = dFdy(-vViewPosition);\n vec3 R1 = cross(sigmaY, normal);\n vec3 R2 = cross(normal, sigmaX);\n float fDet = dot(sigmaX, R1) * (float(gl_FrontFacing) * 2.0 - 1.0);\n vec3 vGrad = sign(fDet) * (dHdxy.x * R1 + dHdxy.y * R2);\n normal = normalize(abs(fDet) * normal - vGrad);\n }\n `\n ).replace(\n '#include <dithering_fragment>',\n `\n #include <dithering_fragment>\n if (uGrayscale > 0.0) {\n float gray = dot(gl_FragColor.rgb, vec3(0.299, 0.587, 0.114));\n gl_FragColor.rgb = mix(gl_FragColor.rgb, vec3(gray * 0.45), uGrayscale);\n }\n if (uOpacity < 0.999) {\n // pixel art: a hard cut, not a dither (see the wing material)\n if (uPixelOut > 0.5) {\n if (uOpacity < ${PIXEL_ALPHA_CUT.toFixed(2)}) discard;\n } else {\n float h = fract(52.9829189 * fract(dot(gl_FragCoord.xy, vec2(0.06711056, 0.00583715))));\n if (h > uOpacity) discard;\n }\n }\n // Offscreen pixel art pass\n if (uPixelOut > 0.5) {\n if (decalC.a > 0.03) {\n float boostA = smoothstep(0.03, 0.18, decalC.a);\n vec3 decCol = decalC.rgb;\n\n float maxC = max(decCol.r, max(decCol.g, decCol.b));\n float minC = min(decCol.r, min(decCol.g, decCol.b));\n float sat = maxC - minC;\n float lum = dot(decCol, vec3(0.299, 0.587, 0.114));\n\n // Persistent black: eye pupils, dark mouths, eyebrows, borders\n if (maxC < 0.32 && sat < 0.15) {\n decCol = vec3(0.067);\n boostA = 1.0;\n }\n // Persistent teeth white: sparkles, eye catchlights, sclera, teeth tips\n else if (lum > 0.48 && sat < 0.22) {\n decCol = uTeeth;\n boostA = 1.0;\n }\n\n gl_FragColor.rgb = mix(gl_FragColor.rgb, decCol, boostA);\n gl_FragColor.a = 0.48; // Mark pixel as a decal\n } else {\n if (gIsBlackPixel > 0.01) {\n gl_FragColor.rgb = mix(gl_FragColor.rgb, vec3(0.0), gIsBlackPixel);\n }\n gl_FragColor.a = 1.0 - 0.5 * (1.0 - clamp(roughnessFactor, 0.0, 1.0));\n }\n }\n `\n );\n };\n return mat;\n}\n", "import type { ViewPreferences } from \"@dreamy/api\";\n\n/** Nominal size each preset fits into; the render keeps the view's aspect ratio inside it. */\nexport const RENDER_RES: Record<ViewPreferences[\"renderResolution\"], readonly [number, number] | null> = {\n \"32\": [32, 32], \"64\": [64, 64], \"128\": [128, 128], \"256\": [256, 256], hd: [1280, 720], fhd: [1920, 1080], screen: null,\n};\n/** Filtered; HD and below are nearest neighbour. */\nexport const RENDER_SMOOTH_RES: readonly ViewPreferences[\"renderResolution\"][] = [\"fhd\", \"screen\"];\n\n// Pixel art look\n/** The stage's light budget is ~0.6 of the POC's (see LIGHT in stage.ts), so the POC's thresholds scale with it. */\nconst LIGHT_BUDGET = 0.6;\nexport const PIXEL_SHADE_BELOW = 0.95 * LIGHT_BUDGET;\n/** Only well-lit faces reach the light tone (was 1.55, which lit most of a creature's upper half). */\nexport const PIXEL_LIGHT_ABOVE = 1.85 * LIGHT_BUDGET;\n/** Gloss (1 \u2212 roughness) above which the light tone turns teeth-white: only truly shiny surfaces, not every\n * roughness \u2264 0.5 part (the fleck shader clamps roughness to \u2265 0.4, so flecked sculpts keep their palette light). */\nexport const PIXEL_GLOSS_WHITE = 0.8;\nexport const PIXEL_DITHER = 0.45;\nexport const PIXEL_EDGE = 0.02;\nexport const PIXEL_MAX_PALETTE = 12;\n\n/** Largest size with the canvas' aspect ratio that fits inside the preset's nominal size. */\nexport function renderFitSize(res: ViewPreferences[\"renderResolution\"], w: number, h: number): [number, number] {\n const box = RENDER_RES[res];\n if (!box) return [Math.max(1, w), Math.max(1, h)];\n const aspect = w / h;\n let rw: number, rh: number;\n if (aspect >= box[0] / box[1]) { rw = box[0]; rh = box[0] / aspect; } else { rh = box[1]; rw = box[1] * aspect; }\n return [Math.max(1, Math.round(rw)), Math.max(1, Math.round(rh))];\n}\n\n/** Pixel art has no translucency: coverage (texture alpha \u00D7 opacity) at or above this draws solid, below it is dropped. */\nexport const PIXEL_ALPHA_CUT = 0.2;\n", "import type { ColorRef, Palette, Sculpt } from \"@dreamy/api\";\nimport { hexOf } from \"../math/colors.js\";\n\n/** Palette refs a sculpt's mesh colors depend on (stamps, smear groups, the look's color and foundation). */\nexport function meshColorRefs(s: Sculpt): ColorRef[] {\n const refs = new Set<ColorRef>([s.look.color, s.look.foundationColor]);\n for (const st of s.stamps) { if (st.color) refs.add(st.color); if (st.foundationColor) refs.add(st.foundationColor); }\n for (const g of s.smearGroups) { refs.add(g.color); if (g.foundationColor) refs.add(g.foundationColor); }\n return [...refs].sort();\n}\n\n/**\n * Everything the mesh depends on, as a string: stamps, smear groups, pivot (symmetry copies), the look's colors /\n * material / blend, and the palette colors it uses. Decals, flecks and patterns are shader-only: no remesh.\n */\nexport function meshContentKey(s: Sculpt, palette: Palette): string {\n const { color, foundationColor, material, blend } = s.look;\n return JSON.stringify([s.stamps, s.smearGroups, s.pivot, color, foundationColor, material, blend,\n meshColorRefs(s).map(r => hexOf(r, palette))]);\n}\n", "import type { FlatWing, Material } from \"@dreamy/api\";\nimport { BufferAttribute, BufferGeometry, CanvasTexture, DoubleSide, Group, LineLoop, Mesh, SRGBColorSpace, type MeshStandardMaterial } from \"three\";\nimport { cssOf, hexOf } from \"../math/colors.js\";\nimport { createSkinDepthMaterial, type SkinUniforms } from \"../materials/skin.js\";\nimport { createWingMaterial, createWingUniforms, type WingUniforms } from \"../materials/wing-material.js\";\nimport { buildWingEdgeGeometry, buildWingGeometry } from \"../wings/wing-mesh.js\";\nimport { wingOutlinePoints, wingPatternKey, wingTextureBox } from \"../wings/wing-outlines.js\";\nimport { paintWingPattern } from \"../wings/wing-pattern.js\";\nimport type { ViewContext } from \"./view-context.js\";\n\nconst WING_TEX = 512;\n\n/** A flat wing body part: outline triangulated in its frame, pattern painted on a canvas, rigid to its bone. */\nexport class WingView {\n readonly group = new Group();\n readonly mesh: Mesh<BufferGeometry, MeshStandardMaterial>;\n /** Contour line, pixel art only: keeps a wing seen edge-on a continuous stroke instead of scattered pixels. */\n private readonly edge: LineLoop<BufferGeometry, MeshStandardMaterial>;\n readonly uniforms: WingUniforms = createWingUniforms();\n private readonly canvas = document.createElement(\"canvas\");\n private readonly texture: CanvasTexture;\n private texKey = \"\";\n private geoKey = \"\";\n\n /** The bone slot the wing follows (its segment matrix). */\n get segmentSlot(): number {\n return this.slot;\n }\n\n constructor(readonly key: string, private readonly ctx: ViewContext, skin: SkinUniforms, private slot: number) {\n this.canvas.width = this.canvas.height = WING_TEX;\n this.texture = new CanvasTexture(this.canvas);\n this.texture.colorSpace = SRGBColorSpace;\n this.texture.anisotropy = 4;\n this.mesh = new Mesh(new BufferGeometry(), createWingMaterial(ctx.globals, this.uniforms, skin, this.texture, ctx.env));\n this.mesh.frustumCulled = false;\n this.mesh.castShadow = true;\n this.mesh.receiveShadow = true;\n const depth = createSkinDepthMaterial(skin);\n depth.side = DoubleSide;\n this.mesh.customDepthMaterial = depth;\n this.mesh.userData.view = this;\n this.edge = new LineLoop(new BufferGeometry(), createWingMaterial(ctx.globals, this.uniforms, skin, this.texture, ctx.env, true));\n this.edge.frustumCulled = false;\n this.edge.raycast = () => undefined;\n this.group.add(this.mesh, this.edge);\n }\n\n set(wing: FlatWing, material: Material, slot: number): void {\n const p = this.ctx.palette;\n const pts = wingOutlinePoints(wing);\n const box = wingTextureBox(pts);\n const geoKey = JSON.stringify([wing.outline, wing.part, wing.span, wing.chord, wing.tail, wing.frame, slot]);\n if (geoKey !== this.geoKey || slot !== this.slot) {\n this.geoKey = geoKey;\n this.slot = slot;\n this.mesh.geometry.dispose();\n this.mesh.geometry = rigid(buildWingGeometry(pts, wing.frame, box), slot);\n this.edge.geometry.dispose();\n this.edge.geometry = rigid(buildWingEdgeGeometry(pts, wing.frame, box), slot);\n this.ctx.changed();\n }\n const texKey = wingPatternKey(wing, r => hexOf(r, p));\n if (texKey !== this.texKey) {\n this.texKey = texKey;\n paintWingPattern(this.canvas, wing, pts, box, r => cssOf(r, p));\n this.texture.needsUpdate = true;\n }\n for (const m of [this.mesh.material, this.edge.material]) {\n m.roughness = material.roughness;\n m.metalness = material.metalness;\n }\n this.uniforms.uOpacity.value = material.opacity;\n this.uniforms.uGlow.value = material.glow;\n }\n\n setGrayscale(v: number): void { this.uniforms.uGrayscale.value = v; }\n\n triangles(): number { return (this.mesh.geometry.index?.count ?? 0) / 3; }\n\n dispose(): void {\n this.mesh.geometry.dispose();\n this.mesh.material.dispose();\n this.mesh.customDepthMaterial?.dispose();\n this.edge.geometry.dispose();\n this.edge.material.dispose();\n this.texture.dispose();\n this.group.removeFromParent();\n }\n}\n\n/** Binds every vertex rigidly to the wing's bone segment. */\nfunction rigid(geo: BufferGeometry, slot: number): BufferGeometry {\n const n = geo.attributes.position!.count;\n const idx = new Float32Array(n * 4), wt = new Float32Array(n * 4);\n for (let v = 0; v < n; v++) { idx[v * 4] = slot; wt[v * 4 + 3] = -1; }\n geo.setAttribute(\"boneIdx\", new BufferAttribute(idx, 4));\n geo.setAttribute(\"boneWt\", new BufferAttribute(wt, 4));\n return geo;\n}\n", "import { DoubleSide, MeshStandardMaterial, type Texture } from \"three\";\nimport { PIXEL_ALPHA_CUT } from \"../scene/render-settings.js\";\nimport type { GlobalUniforms } from \"./global-uniforms.js\";\nimport { SKIN_GLSL, type SkinUniforms } from \"./skin.js\";\n\nexport type WingUniforms = {\n readonly uGrayscale: { value: number };\n readonly uOpacity: { value: number };\n readonly uGlow: { value: number };\n};\n\nexport const createWingUniforms = (): WingUniforms => ({ uGrayscale: { value: 0 }, uOpacity: { value: 1 }, uGlow: { value: 0 } });\n\n/**\n * Flat wing membrane: standard material + the rig's skinning, dithered opacity (texture alpha \u00D7 opacity),\n * grayscale isolation and the pixel-art output the fleck material also writes. `edge` makes the material for the\n * wing's contour line, drawn only in pixel art.\n */\nexport function createWingMaterial(g: GlobalUniforms, w: WingUniforms, skin: SkinUniforms, tex: Texture, env: Texture | null, edge = false): MeshStandardMaterial {\n const mat = new MeshStandardMaterial({ map: tex, side: DoubleSide, roughness: 0.6, metalness: 0 });\n if (env) { mat.envMap = env; mat.envMapIntensity = 0.5; }\n mat.onBeforeCompile = shader => {\n Object.assign(shader.uniforms, skin, w, { uPixelOut: g.uPixelOut });\n shader.vertexShader = SKIN_GLSL + shader.vertexShader\n .replace(\"#include <beginnormal_vertex>\", `#include <beginnormal_vertex>\n mat4 skinMat = getSkinMat();\n objectNormal = normalize(skinNormalMat(skinMat) * objectNormal);`)\n .replace(\"#include <begin_vertex>\", \"vec3 transformed = (skinMat * vec4(position, 1.0)).xyz;\");\n shader.fragmentShader = `\n uniform float uPixelOut;\n uniform float uGrayscale;\n uniform float uOpacity;\n uniform float uGlow;\n ` + shader.fragmentShader\n .replace(\"#include <map_fragment>\", `#include <map_fragment>\n {\n // pixel art has no translucency: a screen-space dither at the low offscreen resolution tears the\n // membrane into holes the outline pass then inks, so coverage there is a hard cut\n float cover = diffuseColor.a * uOpacity;\n ${edge ? \"if (uPixelOut < 0.5) discard; // the edge line only exists in pixel art\" : \"\"}\n if (uPixelOut > 0.5) {\n if (cover < ${PIXEL_ALPHA_CUT.toFixed(2)}) discard;\n } else {\n float h = fract(52.9829189 * fract(dot(gl_FragCoord.xy, vec2(0.06711056, 0.00583715))));\n if (h > cover) discard;\n }\n diffuseColor.a = 1.0;\n }`)\n .replace(\"#include <emissivemap_fragment>\", `#include <emissivemap_fragment>\n totalEmissiveRadiance += diffuseColor.rgb * uGlow;`)\n .replace(\"#include <dithering_fragment>\", `#include <dithering_fragment>\n if (uGrayscale > 0.0) {\n float gray = dot(gl_FragColor.rgb, vec3(0.299, 0.587, 0.114));\n gl_FragColor.rgb = mix(gl_FragColor.rgb, vec3(gray * 0.45), uGrayscale);\n }\n if (uPixelOut > 0.5) {\n if (max(diffuseColor.r, max(diffuseColor.g, diffuseColor.b)) < 0.08) gl_FragColor.rgb = vec3(0.0);\n gl_FragColor.a = 1.0 - 0.5 * (1.0 - clamp(roughnessFactor, 0.0, 1.0));\n }`);\n };\n return mat;\n}\n", "import type { WingFrame } from \"@dreamy/api\";\nimport { BufferAttribute, BufferGeometry, ShapeUtils, Vector2, Vector3 } from \"three\";\n\n/** Triangulates a wing outline in its frame (rig bind space): origin + x \u00B7 span axis + y \u00B7 chord axis. */\nexport function buildWingGeometry(pts: readonly (readonly [number, number])[], frame: WingFrame, box: { x0: number; y0: number; side: number }): BufferGeometry {\n const contour = pts.map(([x, y]) => new Vector2(x, y));\n if (ShapeUtils.isClockWise(contour)) contour.reverse();\n const tris = ShapeUtils.triangulateShape(contour, []);\n const O = new Vector3(frame.origin.x, frame.origin.y, frame.origin.z);\n const X = new Vector3(frame.span.x, frame.span.y, frame.span.z);\n const Y = new Vector3(frame.chord.x, frame.chord.y, frame.chord.z);\n const N = new Vector3().crossVectors(X, Y).normalize();\n const n = contour.length, pos = new Float32Array(n * 3), nor = new Float32Array(n * 3), uv = new Float32Array(n * 2);\n const P = new Vector3();\n contour.forEach((p, i) => {\n P.copy(O).addScaledVector(X, p.x).addScaledVector(Y, p.y);\n pos.set([P.x, P.y, P.z], i * 3);\n nor.set([N.x, N.y, N.z], i * 3);\n uv.set([(p.x - box.x0) / box.side, 1 - (p.y - box.y0) / box.side], i * 2);\n });\n const geo = new BufferGeometry();\n geo.setAttribute(\"position\", new BufferAttribute(pos, 3));\n geo.setAttribute(\"normal\", new BufferAttribute(nor, 3));\n geo.setAttribute(\"uv\", new BufferAttribute(uv, 2));\n geo.setIndex(tris.flat());\n return geo;\n}\n\n/**\n * The wing's contour as a line loop for pixel art. A wing seen nearly edge-on is thinner than one offscreen pixel,\n * so its triangles hit only scattered pixel centers; a line always rasterizes at least one pixel wide, and the\n * contour's projection covers the whole edge-on wing. Texture coordinates are pulled slightly inward so the\n * line takes the membrane's color, not the antialiased transparent rim.\n */\nexport function buildWingEdgeGeometry(pts: readonly (readonly [number, number])[], frame: WingFrame, box: { x0: number; y0: number; side: number }): BufferGeometry {\n const geo = buildWingGeometry(pts, frame, box);\n geo.setIndex(null);\n const uv = geo.attributes.uv!;\n let cu = 0, cv = 0;\n for (let i = 0; i < uv.count; i++) { cu += uv.getX(i); cv += uv.getY(i); }\n cu /= uv.count; cv /= uv.count;\n for (let i = 0; i < uv.count; i++) uv.setXY(i, uv.getX(i) + (cu - uv.getX(i)) * EDGE_INSET, uv.getY(i) + (cv - uv.getY(i)) * EDGE_INSET);\n return geo;\n}\n\nconst EDGE_INSET = 0.06;\n", "import type { FlatWing, WingOutline } from \"@dreamy/api\";\nimport { Shape } from \"three\";\n\ntype Seg = readonly number[];\ntype Pt = readonly [number, number];\n\n/** Bat outline: leading edge root \u2192 wrist \u2192 tip, then each scallop between finger tips bows in toward the wrist. */\nconst BAT_OUTLINE: readonly Seg[] = [\n [0, 0],\n [0.2, -0.08, 0.4, -0.12, 0.55, -0.1],\n [0.7, -0.08, 0.9, -0.04, 1.0, 0.04],\n [0.88, 0.2, 0.78, 0.3, 0.82, 0.5],\n [0.7, 0.46, 0.6, 0.5, 0.52, 0.72],\n [0.44, 0.54, 0.32, 0.5, 0.24, 0.62],\n [0.14, 0.44, 0.04, 0.3, 0, 0.18],\n];\n\n/** A preset: fore and hind outlines; a membrane wing (bat) also has a wrist and finger tips the veins follow. */\nexport type WingPreset = {\n readonly name: string;\n readonly fore: readonly Seg[];\n readonly hind: readonly Seg[];\n readonly wrist?: Pt;\n readonly fingers?: readonly Pt[];\n};\n\n/**\n * Outline presets in wing units (the POC's wings.js): x from the root (0) along the span to the tip (~1), y\n * across the chord, positive = backwards. [moveTo, ...bezier triples]; fore and hind shapes per preset.\n */\nexport const WING_OUTLINES: Record<WingOutline, WingPreset> = {\n monarch: {\n name: \"Monarch\",\n fore: [[0, 0], [0.35, -0.12, 0.8, -0.14, 1.0, -0.02], [1.06, 0.12, 0.95, 0.45, 0.75, 0.58], [0.5, 0.62, 0.15, 0.45, 0, 0.12]],\n hind: [[0, 0], [0.35, -0.1, 0.85, -0.05, 1.0, 0.15], [1.05, 0.45, 0.75, 0.75, 0.45, 0.72], [0.2, 0.68, 0.02, 0.4, 0, 0.1]],\n },\n swallowtail: {\n name: \"Swallowtail\",\n fore: [[0, 0], [0.35, -0.1, 0.85, -0.12, 1.0, -0.04], [1.04, 0.08, 0.92, 0.36, 0.76, 0.5], [0.5, 0.54, 0.15, 0.4, 0, 0.1]],\n hind: [[0, 0], [0.35, -0.08, 0.8, -0.02, 0.95, 0.18], [1.0, 0.4, 0.85, 0.6, 0.7, 0.66], [0.4, 0.7, 0.05, 0.4, 0, 0.1]],\n },\n morpho: {\n name: \"Morpho\",\n fore: [[0, 0], [0.3, -0.16, 0.8, -0.2, 1.0, 0.0], [1.12, 0.25, 0.95, 0.62, 0.68, 0.7], [0.4, 0.72, 0.1, 0.5, 0, 0.14]],\n hind: [[0, 0], [0.3, -0.12, 0.8, -0.08, 0.98, 0.22], [1.08, 0.6, 0.7, 0.9, 0.42, 0.86], [0.16, 0.8, 0.0, 0.45, 0, 0.1]],\n },\n moth: {\n name: \"Moth\",\n fore: [[0, 0], [0.4, -0.06, 0.85, -0.06, 1.0, 0.02], [1.02, 0.2, 0.9, 0.48, 0.72, 0.52], [0.45, 0.5, 0.12, 0.3, 0, 0.1]],\n hind: [[0, 0], [0.3, -0.06, 0.65, 0.0, 0.8, 0.18], [0.9, 0.4, 0.65, 0.58, 0.4, 0.56], [0.18, 0.52, 0.02, 0.32, 0, 0.08]],\n },\n dragonfly: {\n name: \"Dragonfly\",\n fore: [[0, 0], [0.3, -0.05, 0.8, -0.06, 1.0, 0.02], [1.03, 0.1, 0.92, 0.17, 0.72, 0.19], [0.4, 0.2, 0.1, 0.16, 0, 0.06]],\n hind: [[0, 0], [0.3, -0.05, 0.8, -0.06, 1.0, 0.02], [1.03, 0.12, 0.9, 0.2, 0.7, 0.23], [0.35, 0.27, 0.08, 0.24, 0, 0.08]],\n },\n bee: {\n name: \"Bee\",\n fore: [[0, 0], [0.3, -0.06, 0.75, -0.08, 0.98, 0.04], [1.04, 0.16, 0.85, 0.28, 0.6, 0.28], [0.35, 0.27, 0.08, 0.2, 0, 0.06]],\n hind: [[0, 0], [0.3, -0.04, 0.7, -0.04, 0.9, 0.06], [0.95, 0.16, 0.75, 0.24, 0.52, 0.23], [0.3, 0.22, 0.06, 0.16, 0, 0.05]],\n },\n fly: {\n name: \"Fly\",\n fore: [[0, 0], [0.3, -0.08, 0.75, -0.12, 0.97, 0.05], [1.05, 0.25, 0.85, 0.4, 0.55, 0.38], [0.3, 0.35, 0.06, 0.22, 0, 0.06]],\n hind: [[0, 0], [0.3, -0.08, 0.75, -0.12, 0.97, 0.05], [1.05, 0.25, 0.85, 0.4, 0.55, 0.38], [0.3, 0.35, 0.06, 0.22, 0, 0.06]],\n },\n bat: {\n // dragon / bat membrane: arm along the leading edge to the wrist, fingers fanning back to a scalloped edge\n name: \"Bat\",\n fore: BAT_OUTLINE,\n hind: BAT_OUTLINE,\n wrist: [0.55, -0.1],\n fingers: [[1.0, 0.04], [0.82, 0.5], [0.52, 0.72], [0.24, 0.62]],\n },\n};\n\nexport type WingShapeParams = Pick<FlatWing, \"outline\" | \"part\" | \"span\" | \"chord\" | \"tail\">;\n\n/** The outline as 2D points in wing units, after span / chord / tail (hindwing tails spike out of the back margin). */\nexport function wingOutlinePoints(w: WingShapeParams): [number, number][] {\n const preset = WING_OUTLINES[w.outline] ?? WING_OUTLINES.monarch;\n const segs = w.part === \"hind\" ? preset.hind : preset.fore;\n const sx = w.span, sy = w.chord;\n const shape = new Shape();\n const s0 = segs[0] as Seg;\n shape.moveTo((s0[0] as number) * sx, (s0[1] as number) * sy);\n const tail = w.part === \"hind\" ? w.tail : 0;\n segs.slice(1).forEach((b, i) => {\n const n = (k: number) => b[k] as number;\n shape.bezierCurveTo(n(0) * sx, n(1) * sy, n(2) * sx, n(3) * sy, n(4) * sx, n(5) * sy);\n if (tail > 0.01 && i === 1) {\n const bx = n(4) * sx, by = n(5) * sy;\n shape.lineTo(bx + 0.06 * sx, by + tail * 0.55 * sy);\n shape.lineTo(bx - 0.06 * sx, by + 0.02 * sy);\n }\n });\n return shape.getPoints(28).map(p => [p.x, p.y]);\n}\n\n/** The square the pattern texture covers: the outline's bounds, centered in a square of its longest side. */\nexport function wingTextureBox(pts: readonly (readonly [number, number])[]): { x0: number; y0: number; side: number } {\n let x0 = Infinity, y0 = Infinity, x1 = -Infinity, y1 = -Infinity;\n pts.forEach(([x, y]) => { x0 = Math.min(x0, x); y0 = Math.min(y0, y); x1 = Math.max(x1, x); y1 = Math.max(y1, y); });\n const side = Math.max(x1 - x0, y1 - y0, 1e-3);\n return { x0: x0 - (side - (x1 - x0)) / 2, y0: y0 - (side - (y1 - y0)) / 2, side };\n}\n\n/** Seeded PRNG (mulberry32) so a wing's pattern is the same on every repaint. */\nexport function wingRng(seed: number): () => number {\n let a = (seed >>> 0) || 1;\n return () => {\n a |= 0; a = (a + 0x6d2b79f5) | 0;\n let t = Math.imul(a ^ (a >>> 15), 1 | a);\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n\n/** The seed a wing's pattern draws from: fore and hind wings of one seed differ. */\nexport const wingPatternSeed = (w: Pick<FlatWing, \"seed\" | \"part\">): number => (w.seed || 1) * 7919 + (w.part === \"hind\" ? 101 : 0);\n\n/** Repaint key: the texture is only repainted when the pattern, outline or the colors it uses change. */\nexport function wingPatternKey(w: FlatWing, hex: (ref: FlatWing[\"base\"]) => number): string {\n return JSON.stringify([w.outline, w.part, w.span, w.chord, w.tail, w.style, w.density, w.seed, w.border, w.spots,\n [w.base, w.base2, w.mark, w.ink, w.dot].map(hex)]);\n}\n", "import type { FlatWing } from \"@dreamy/api\";\nimport { WING_OUTLINES, wingPatternSeed, wingRng } from \"./wing-outlines.js\";\n\n/** Paints the wing's procedural pattern in wing units (the root is the focal point, so fore and hind agree). */\nexport function paintWingPattern(\n canvas: HTMLCanvasElement,\n w: FlatWing,\n pts: readonly (readonly [number, number])[],\n box: { x0: number; y0: number; side: number },\n css: (ref: FlatWing[\"base\"]) => string,\n): void {\n const S = canvas.width, g = canvas.getContext(\"2d\") as CanvasRenderingContext2D;\n const k = S / box.side;\n g.setTransform(1, 0, 0, 1, 0, 0);\n g.clearRect(0, 0, S, S);\n g.setTransform(k, 0, 0, k, -box.x0 * k, -box.y0 * k);\n const base = css(w.base), base2 = css(w.base2), mark = css(w.mark), ink = css(w.ink), dot = css(w.dot);\n const rnd = wingRng(wingPatternSeed(w));\n const dens = Math.max(0, Math.min(1, w.density)), spots = Math.max(0, Math.min(1, w.spots));\n\n const outline = new Path2D();\n pts.forEach(([x, y], i) => (i ? outline.lineTo(x, y) : outline.moveTo(x, y)));\n outline.closePath();\n let R = 0, aMin = Infinity, aMax = -Infinity;\n pts.forEach(([x, y]) => { R = Math.max(R, Math.hypot(x, y)); const a = Math.atan2(y, x); aMin = Math.min(aMin, a); aMax = Math.max(aMax, a); });\n const radial = (c0: string, c1: string) => { const gr = g.createRadialGradient(0, 0, 0, 0, 0, R); gr.addColorStop(0, c0); gr.addColorStop(1, c1); return gr; };\n const circle = (x: number, y: number, r: number, fill: string) => { g.beginPath(); g.arc(x, y, r, 0, Math.PI * 2); g.fillStyle = fill; g.fill(); };\n const atPolar = (a: number, r: number): [number, number] => [Math.cos(a) * r, Math.sin(a) * r];\n const edgeSpots = (count: number, r0: number, r1: number, size: number, fill: string) => {\n for (let i = 0; i < count; i++) {\n const [x, y] = atPolar(aMin + (aMax - aMin) * ((i + 0.5) / count), R * (r0 + (r1 - r0) * rnd()));\n if (g.isPointInPath(outline, (x - box.x0) * k, (y - box.y0) * k)) circle(x, y, size * (0.6 + 0.8 * rnd()), fill);\n }\n };\n const veinLines = (count: number, width: number, color: string, alpha = 1) => {\n g.save(); g.globalAlpha = alpha; g.strokeStyle = color; g.lineWidth = width; g.lineCap = \"round\";\n for (let i = 1; i < count; i++) {\n const a = aMin + (aMax - aMin) * (i / count) + (rnd() - 0.5) * 0.06;\n g.beginPath(); g.moveTo(0, 0);\n const [mx, my] = atPolar(a + (rnd() - 0.5) * 0.08, R * 0.5);\n const [ex, ey] = atPolar(a, R * 1.1);\n g.quadraticCurveTo(mx, my, ex, ey); g.stroke();\n }\n g.restore();\n };\n\n g.save();\n g.clip(outline);\n const style = w.style;\n const preset = WING_OUTLINES[w.outline];\n if (style === \"clear\") {\n g.save(); g.globalAlpha = 0.55; g.fillStyle = radial(base, base2); g.fill(outline); g.restore();\n veinLines(5 + Math.round(dens * 8), 0.008, ink, 0.85);\n for (let j = 1; j <= 2 + Math.round(dens * 3); j++) {\n g.save(); g.globalAlpha = 0.6; g.strokeStyle = ink; g.lineWidth = 0.005;\n g.beginPath(); g.arc(0, 0, (R * j) / (3 + dens * 3), aMin, aMax); g.stroke(); g.restore();\n }\n } else if (style === \"veins\" && preset?.wrist && preset.fingers) {\n // membrane wing: the arm runs root \u2192 wrist along the leading edge, finger bones fan out from the wrist\n g.fillStyle = radial(base, base2); g.fill(outline);\n const sx = w.span, sy = w.chord;\n const [wx, wy] = [preset.wrist[0] * sx, preset.wrist[1] * sy];\n g.strokeStyle = ink; g.lineCap = \"round\"; g.lineJoin = \"round\";\n g.lineWidth = 0.035 + 0.02 * dens;\n preset.fingers.forEach(([fx, fy]) => { g.beginPath(); g.moveTo(wx, wy); g.lineTo(fx * sx, fy * sy); g.stroke(); });\n g.lineWidth = 0.07 + 0.03 * dens;\n g.beginPath(); g.moveTo(0, 0); g.lineTo(wx, wy); g.stroke();\n if (spots > 0.01) edgeSpots(Math.round(spots * 20), 0.75, 0.9, 0.016, dot);\n } else if (style === \"veins\") {\n g.fillStyle = radial(base, base2); g.fill(outline);\n veinLines(6 + Math.round(dens * 12), 0.018, ink);\n for (let j = 1; j <= 1 + Math.round(dens * 3); j++) {\n g.strokeStyle = ink; g.lineWidth = 0.012;\n g.beginPath(); g.arc(0, 0, R * (0.3 + (0.5 * j) / (1 + dens * 3)) * (0.9 + 0.2 * rnd()), aMin, aMax); g.stroke();\n }\n g.lineWidth = 0.14; g.strokeStyle = ink; g.stroke(outline);\n edgeSpots(Math.round(10 + spots * 30), 0.8, 0.93, 0.018, dot);\n } else if (style === \"dots\") {\n g.fillStyle = radial(base, base2); g.fill(outline);\n const rings = 3 + Math.round(dens * 4);\n for (let j = 1; j <= rings; j++) {\n const r = (R * j) / (rings + 0.5), n = Math.max(3, Math.round(((aMax - aMin) * r) / 0.09));\n for (let i = 0; i < n; i++) {\n const [x, y] = atPolar(aMin + (aMax - aMin) * ((i + 0.5) / n), r);\n circle(x, y, 0.022 + 0.02 * spots * (j / rings), mark);\n }\n }\n } else if (style === \"bands\") {\n g.fillStyle = base; g.fill(outline);\n const n = 3 + Math.round(dens * 5);\n for (let i = 0; i < n; i++) {\n const r0 = (R * (i + 0.35 + 0.2 * rnd())) / n, r1 = r0 + (R * (0.25 + 0.2 * rnd())) / n;\n g.beginPath(); g.arc(0, 0, r1, aMin - 0.2, aMax + 0.2); g.arc(0, 0, r0, aMax + 0.2, aMin - 0.2, true); g.closePath();\n g.fillStyle = i % 2 ? base2 : mark; g.fill();\n }\n edgeSpots(Math.round(8 + spots * 24), 0.88, 0.96, 0.016, dot);\n } else if (style === \"eyespots\") {\n g.fillStyle = radial(base, base2); g.fill(outline);\n g.save(); g.globalAlpha = 0.12; g.fillStyle = ink;\n for (let i = 0; i < 40 + dens * 80; i++) circle(rnd() * box.side + box.x0, rnd() * box.side + box.y0, rnd() * 0.08, ink);\n g.restore();\n const eyes = 1 + Math.round(spots * 2);\n for (let i = 0; i < eyes; i++) {\n const [x, y] = atPolar(aMin + (aMax - aMin) * ((i + 0.5) / eyes), R * (0.55 + 0.15 * rnd()));\n const r = 0.07 + 0.06 * rnd();\n circle(x, y, r, ink); circle(x, y, r * 0.72, mark); circle(x, y, r * 0.4, ink);\n circle(x - r * 0.12, y - r * 0.12, r * 0.15, dot);\n }\n g.lineWidth = 0.08; g.strokeStyle = ink; g.stroke(outline);\n } else if (style === \"morpho\") {\n g.fillStyle = ink; g.fill(outline);\n g.save(); g.scale(1, 0.9);\n g.fillStyle = radial(base, base2);\n g.beginPath(); g.arc(0, 0, R * (0.62 + 0.12 * dens), aMin - 0.3, aMax + 0.3); g.lineTo(0, 0); g.fill();\n g.restore();\n edgeSpots(Math.round(10 + spots * 34), 0.78, 0.92, 0.022, dot);\n } else if (style === \"speckled\") {\n g.fillStyle = ink; g.fill(outline);\n circle(0, 0, R * 0.32, base);\n const n = Math.round(120 + dens * 260);\n for (let i = 0; i < n; i++) {\n const a = aMin + (aMax - aMin) * rnd(), r = R * (0.12 + 0.85 * rnd());\n const [x, y] = atPolar(a, r);\n g.save(); g.translate(x, y); g.rotate(a);\n g.beginPath(); g.ellipse(0, 0, 0.012 + 0.025 * rnd(), 0.005 + 0.015 * rnd(), 0, 0, Math.PI * 2);\n g.fillStyle = rnd() > 0.3 ? base2 : base; g.fill(); g.restore();\n }\n edgeSpots(Math.round(spots * 24), 0.86, 0.95, 0.014, dot);\n }\n if (w.border > 0.01) { g.lineWidth = 0.05 * w.border; g.strokeStyle = ink; g.stroke(outline); }\n g.restore();\n}\n", "import type { Command, Creation, DispatchResult, SceneObject, SculptTarget, Selection, ViewSession, ViewportCallbacks } from \"@dreamy/api\";\nimport { Raycaster, Vector2 } from \"three\";\nimport type { SceneViews } from \"../objects/scene-views.js\";\nimport type { Stage } from \"../scene/stage.js\";\n\n/** Pointer state in canvas pixels and normalized device coordinates. */\nexport type PointerState = {\n x: number;\n y: number;\n readonly ndc: Vector2;\n down: boolean;\n shift: boolean;\n ctrl: boolean;\n};\n\n/** What every tool reads and how it reports back. Owned by one viewport instance. */\nexport type InteractionContext = {\n readonly stage: Stage;\n readonly views: SceneViews;\n readonly pointer: PointerState;\n readonly raycaster: Raycaster;\n readonly keys: Set<string>;\n creation(): Creation;\n session(): ViewSession;\n callbacks(): ViewportCallbacks | null;\n /** Sends a command; a rejection becomes a toast. */\n dispatch(command: Command): DispatchResult;\n select(selection: Selection): void;\n toast(message: string): void;\n /** True while play mode or the stress test owns the view. */\n locked(): boolean;\n};\n\nexport const objectById = (c: Creation, id: string): SceneObject | undefined => c.objects.find(o => o.id === id);\n\n/** The scoped sculpt in sculpt mode, if any. */\nexport function scopeOf(ctx: InteractionContext): SculptTarget | undefined {\n const s = ctx.session();\n return s.mode === \"sculpt\" ? s.scope : undefined;\n}\n\nexport function createPointer(): PointerState {\n return { x: 0, y: 0, ndc: new Vector2(), down: false, shift: false, ctrl: false };\n}\n\n/** Updates the pointer from a DOM event relative to the canvas. */\nexport function readPointer(p: PointerState, e: PointerEvent | MouseEvent, canvas: HTMLCanvasElement): void {\n const r = canvas.getBoundingClientRect();\n p.x = e.clientX - r.left;\n p.y = e.clientY - r.top;\n p.ndc.set((p.x / Math.max(r.width, 1)) * 2 - 1, -(p.y / Math.max(r.height, 1)) * 2 + 1);\n p.shift = e.shiftKey;\n p.ctrl = e.ctrlKey || e.metaKey;\n}\n\nexport const viewSize = (ctx: InteractionContext): { w: number; h: number } => {\n const c = ctx.stage.renderer.domElement;\n return { w: c.clientWidth || 1, h: c.clientHeight || 1 };\n};\n\nexport const emptySelection: Selection = { objectIds: [], stampIds: [] };\n", "import type { RigObject } from \"@dreamy/api\";\nimport type { InteractionContext } from \"./interaction-context.js\";\n\n/**\n * When a rig shows its bones (the POC's rigBonesVisible): always with the bone tool on the selected rig, and while\n * one of its parts is sculpted; otherwise when bones are shown and the rig is selected or has no body to see.\n */\nexport function bonesVisible(ctx: InteractionContext, o: RigObject): boolean {\n const s = ctx.session();\n if (s.play) return false;\n const selected = s.selection.objectIds.includes(o.id);\n if (s.tool === \"bone\" && selected) return true;\n if (s.hiddenBones.includes(o.id)) return false; // the object list's eye toggle\n if (s.mode === \"sculpt\" && s.scope?.objectId === o.id) return true;\n return s.showBones && (selected || (!o.rig.parts.length && !o.rig.body));\n}\n", "import type { StampMode, StampShape, ViewSession } from \"@dreamy/api\";\n\nconst DARK = \"#0f172a\";\nconst MODE_COLORS: Record<StampMode, string> = { add: \"#22c55e\", subtract: \"#ef4444\", intersect: \"#3b82f6\", paint: \"#ec4899\" };\n\n// A glyph with a dark outline under a colored stroke so it reads on any background\nconst outlined = (m: string, color: string) =>\n `<g fill='none' stroke-linejoin='round' stroke-linecap='round'><g stroke='${DARK}' stroke-width='4.4'>${m}</g><g stroke='${color}' stroke-width='2'>${m}</g></g>`;\nconst solid = (d: string) => `<path d='${d}' fill='white' stroke='${DARK}' stroke-width='1.8' stroke-linejoin='round'/>`;\n\nfunction stampGlyph(shape: StampShape, color: string): string {\n const m: Partial<Record<StampShape, string>> = {\n sphere: \"<circle cx='16' cy='16' r='10.5'/><ellipse cx='16' cy='16' rx='10.5' ry='4'/>\",\n cylinder: \"<ellipse cx='16' cy='9' rx='9' ry='3.5'/><path d='M7 9 V23 A9 3.5 0 0 0 25 23 V9'/>\",\n torus: \"<ellipse cx='16' cy='16' rx='12' ry='7.5'/><ellipse cx='16' cy='16' rx='5.5' ry='2.6'/>\",\n cone: \"<path d='M16 4 L26 24 A10 4 0 0 1 6 24 Z'/>\",\n pyramid: \"<path d='M16 4 L27 24 L16 29 L5 24 Z M16 4 V29'/>\",\n prism: \"<path d='M4 25 L11 9 L19 25 Z M11 9 L24 7 L28 22 L19 25'/>\",\n octahedron: \"<path d='M16 3 L28 16 L16 29 L4 16 Z M4 16 H28'/>\",\n capsule: \"<rect x='9' y='4' width='14' height='24' rx='7'/>\",\n dome: \"<path d='M5 20 A11 11 0 0 1 27 20 Z'/><ellipse cx='16' cy='20' rx='11' ry='3.5'/>\",\n };\n return outlined(m[shape] ?? \"<path d='M16 4 L26 10 V22 L16 28 L6 22 V10 Z M6 10 L16 16 L26 10 M16 16 V28'/>\", color);\n}\n\nfunction modeBadge(mode: StampMode): string {\n const glyph = {\n add: \"<path d='M26 23.4 V28.6 M23.4 26 H28.6'/>\",\n subtract: \"<path d='M23.4 26 H28.6'/>\",\n intersect: \"<path d='M23.6 28.6 V26.2 A2.4 2.4 0 0 1 28.4 26.2 V28.6'/>\",\n paint: \"<circle cx='26' cy='26' r='1.6' fill='white'/>\",\n }[mode];\n return `<circle cx='26' cy='26' r='5.6' fill='${MODE_COLORS[mode]}' stroke='${DARK}' stroke-width='1.6'/><g stroke='white' stroke-width='1.7' fill='none' stroke-linecap='round'>${glyph}</g>`;\n}\n\nconst sprayDots = () => [[5, 6, 1.4], [9.5, 3.8, 1.1], [3.8, 11, 1.1], [8.5, 8.5, 1.2]]\n .map(([x, y, r]) => `<circle cx='${x}' cy='${y}' r='${r}' fill='white' stroke='${DARK}' stroke-width='0.8'/>`).join(\"\");\n\n// Select badge: dashed rectangle = area (Shift), plus = add (Ctrl / Cmd)\nfunction selectBadge(shift: boolean, ctrl: boolean): string {\n const plus = (cx: number, cy: number, r: number) =>\n `<circle cx='${cx}' cy='${cy}' r='${r}' fill='#22c55e' stroke='${DARK}' stroke-width='1.6'/>` +\n `<path d='M${cx - r * 0.5} ${cy} H${cx + r * 0.5} M${cx} ${cy - r * 0.5} V${cy + r * 0.5}' stroke='white' stroke-width='1.7' fill='none' stroke-linecap='round'/>`;\n if (shift) {\n return `<circle cx='26' cy='26' r='5.6' fill='#3b82f6' stroke='${DARK}' stroke-width='1.6'/><rect x='22.8' y='22.8' width='6.4' height='6.4' fill='none' stroke='white' stroke-width='1.5' stroke-dasharray='1.7 1.3' stroke-linejoin='round'/>` +\n (ctrl ? plus(27, 15.5, 4) : \"\");\n }\n return ctrl ? plus(26, 26, 5.6) : \"\";\n}\n\n/** The canvas cursor for the current tool (the POC's tools-ui.js updateCursor), as a CSS cursor value. */\nexport function cursorFor(s: ViewSession, shift: boolean, ctrl: boolean): string {\n if (s.play) return \"default\";\n if (s.tool === \"decal\") return \"crosshair\";\n let inner: string, hx = 16, hy = 16;\n if (s.tool === \"select\" || s.tool === \"bone\") {\n inner = solid(\"M5.5 3.5 L5.5 24.5 L11 19.3 L14.6 27.2 L18.2 25.6 L14.6 17.8 L22 17.8 Z\");\n if (s.tool === \"bone\") {\n if (s.boneTool === \"add\") inner += \"<g stroke='#f97316' stroke-width='2.6' stroke-linecap='round'><path d='M21 7 L21 25 M12 16 L30 16'/></g>\";\n } else inner += selectBadge(shift || s.touchArea, ctrl || s.touchAdd);\n hx = 5; hy = 3;\n } else if (s.tool === \"translate\") {\n inner = solid(\"M16 3 L11.5 8 L14.5 8 L14.5 14.5 L8 14.5 L8 11.5 L3 16 L8 20.5 L8 17.5 L14.5 17.5 L14.5 24 L11.5 24 L16 29 L20.5 24 L17.5 24 L17.5 17.5 L24 17.5 L24 20.5 L29 16 L24 11.5 L24 14.5 L17.5 14.5 L17.5 8 L20.5 8 Z\");\n } else if (s.tool === \"rotate\") {\n inner = outlined(\"<path d='M16 6 A10 10 0 1 0 26 16'/>\", \"white\") + solid(\"M26 8.5 L31 16 L21 16 Z\");\n } else if (s.tool === \"scale\") {\n inner = solid(\"M5 27 L5 18 L8.5 21.5 L21.5 8.5 L18 5 L27 5 L27 14 L23.5 10.5 L10.5 23.5 L14 27 Z\");\n } else if (s.tool === \"pivot\") {\n inner = outlined(\"<circle cx='16' cy='16' r='6'/>\", \"white\") + solid(\"M16 3 L16 9 M16 23 L16 29 M3 16 L9 16 M23 16 L29 16\");\n } else {\n // Stamp: the shape, outlined in the mode's color; the mode badge only exists in sculpt mode\n const sculpting = s.mode === \"sculpt\";\n inner = stampGlyph(s.brush.shape, sculpting ? MODE_COLORS[s.brush.mode] : \"#facc15\") + (sculpting ? modeBadge(s.brush.mode) : \"\") + (s.brush.smear ? sprayDots() : \"\");\n }\n const svg = `<svg xmlns='http://www.w3.org/2000/svg' width='32' height='32' viewBox='0 0 32 32'>${inner}</svg>`;\n const fallback = s.tool === \"select\" || s.tool === \"bone\" ? \"default\" : \"crosshair\";\n return `url(\"data:image/svg+xml,${encodeURIComponent(svg)}\") ${hx} ${hy}, ${fallback}`;\n}\n", "import type { Decal, SculptTarget } from \"@dreamy/api\";\nimport { CanvasTexture, DoubleSide, Matrix4, Mesh, MeshBasicMaterial, PlaneGeometry, SRGBColorSpace, Vector3 } from \"three\";\nimport type { DecalAtlas } from \"../decals/decal-atlas.js\";\nimport { MAX_DECALS, MAX_INTERIORS } from \"../decals/decal-limits.js\";\nimport { hexOf, linearColor } from \"../math/colors.js\";\nimport { quatOf, vec3Of } from \"../math/convert.js\";\nimport { decalBasis } from \"../math/decal-pose.js\";\nimport { nearestDecal } from \"../math/picking.js\";\nimport { SculptView } from \"../objects/sculpt-view.js\";\nimport { scopeOf, type InteractionContext } from \"./interaction-context.js\";\nimport { hitLocalNormal, surfaceHit, type SurfaceHit } from \"./surface-hit.js\";\n\ntype Placement = { target: SculptTarget; view: SculptView; position: Vector3; rotation: import(\"three\").Quaternion };\n\n/** Decal tool (the POC's decals.js placement): ghost on the surface, click places (or erases), Q places too. */\nexport class DecalTool {\n private readonly ghost: Mesh<PlaneGeometry, MeshBasicMaterial>;\n private tex: { canvas: HTMLCanvasElement; texture: CanvasTexture; version: number } | null = null;\n\n constructor(private readonly ctx: InteractionContext, private readonly atlas: () => DecalAtlas) {\n this.ghost = new Mesh(new PlaneGeometry(1, 1), new MeshBasicMaterial({\n transparent: true, opacity: 0.8, depthWrite: false, side: DoubleSide, polygonOffset: true, polygonOffsetFactor: -2, fog: false,\n }));\n this.ghost.matrixAutoUpdate = false;\n this.ghost.frustumCulled = false;\n this.ghost.renderOrder = 997;\n this.ghost.visible = false;\n ctx.stage.ui.add(this.ghost);\n }\n\n private hit(): SurfaceHit | null {\n const scope = scopeOf(this.ctx);\n const h = surfaceHit(this.ctx, scope ? new Set([scope.objectId]) : undefined);\n if (!h || !(h.owner.view instanceof SculptView)) return null;\n if (scope && ((\"boneId\" in scope ? scope.boneId : undefined) !== h.owner.boneId)) return null;\n return h;\n }\n\n /** Object-local pose: z = surface normal, y = world up (eyes stay upright), then the brush roll. */\n private placement(h: SurfaceHit): Placement | null {\n const view = h.owner.view;\n if (!(view instanceof SculptView)) return null;\n const g = view.group;\n g.updateWorldMatrix(true, false);\n const inv = g.matrixWorld.clone().invert();\n const position = h.hit.point.clone().applyMatrix4(inv);\n const n = hitLocalNormal(h.hit);\n const up = new Vector3(0, 1, 0).transformDirection(inv), alt = new Vector3(0, 0, -1).transformDirection(inv);\n const rotation = decalBasis(n, up, alt, this.ctx.session().decalBrush.roll);\n const target: SculptTarget = h.owner.boneId !== undefined ? { objectId: h.owner.objectId, boneId: h.owner.boneId } : { objectId: h.owner.objectId };\n return { target, view, position, rotation };\n }\n\n hover(): void {\n const s = this.ctx.session(), b = s.decalBrush;\n if (s.tool !== \"decal\" || this.ctx.locked() || b.eraser || !b.art) { this.ghost.visible = false; return; }\n const h = this.hit();\n const p = h && this.placement(h);\n const cell = this.atlas().cellCanvas(b.art);\n const info = this.atlas().info(b.art);\n if (!p || (!cell && info.room === undefined)) { this.ghost.visible = false; return; }\n if (cell && (this.tex?.canvas !== cell.canvas || this.tex.version !== cell.version)) {\n this.tex?.texture.dispose();\n const texture = new CanvasTexture(cell.canvas);\n texture.colorSpace = SRGBColorSpace;\n this.tex = { canvas: cell.canvas, texture, version: cell.version };\n this.ghost.material.map = texture;\n this.ghost.material.needsUpdate = true;\n }\n if (!cell) this.ghost.material.map = null;\n const builtin = this.atlas().builtinOf(b.art);\n this.ghost.material.color.copy(info.room !== undefined\n ? linearColor(builtin?.wall ?? 0xffffff)\n : info.tintable ? linearColor(hexOf(b.tint, this.ctx.creation().palette)) : linearColor(0xffffff));\n const local = new Matrix4().compose(p.position, p.rotation, new Vector3(b.flip ? -b.size : b.size, b.size, 1));\n local.multiply(new Matrix4().makeTranslation(0, 0, 0.02));\n this.ghost.matrix.multiplyMatrices(p.view.group.matrixWorld, local);\n this.ghost.matrixWorldNeedsUpdate = true;\n this.ghost.visible = true;\n }\n\n hide(): void { this.ghost.visible = false; }\n\n /** A click (or Q): place the brush's decal, or erase the nearest one. */\n place(): void {\n const s = this.ctx.session(), b = s.decalBrush;\n if (s.tool !== \"decal\" || this.ctx.locked()) return;\n const h = this.hit();\n const p = h && this.placement(h);\n if (!p) return;\n const decals = p.view.sculpt?.decals ?? [];\n if (b.eraser) {\n const i = nearestDecal(decals, p.position);\n const d = decals[i];\n if (!d) { this.ctx.toast(\"No decal there\"); return; }\n if (this.ctx.dispatch({ type: \"RemoveDecal\", payload: { target: p.target, decalId: d.id } }).ok) this.ctx.toast(\"Decal erased\");\n return;\n }\n if (!b.art) { this.ctx.toast(\"No decal selected. Tap + to create one\"); return; }\n if (decals.length >= MAX_DECALS) { this.ctx.toast(`Decal limit reached (${MAX_DECALS} per object)`); return; }\n const info = this.atlas().info(b.art);\n const room = info.room !== undefined;\n if (room && decals.filter(d => this.atlas().info(d.art).room !== undefined).length >= MAX_INTERIORS) {\n this.ctx.toast(`Interior limit reached (${MAX_INTERIORS} per object)`); return;\n }\n let decal: Omit<Decal, \"id\"> = { art: b.art, position: vec3Of(p.position), rotation: quatOf(p.rotation), size: b.size, flip: b.flip, opacity: 1 };\n if (info.tintable && !room) decal = { ...decal, tint: b.tint };\n if (room) decal = { ...decal, depth: Math.max(0.5, Math.min(2, b.depth)), seed: 1 + Math.floor(Math.random() * 997) };\n if (this.ctx.dispatch({ type: \"AddDecals\", payload: { target: p.target, decals: [decal] } }).ok) {\n const name = b.art.kind === \"builtin\" ? b.art.name : this.ctx.creation().designs.find(d => d.id === (b.art as { designId: string }).designId)?.name ?? \"Decal\";\n this.ctx.toast(`${name} placed`);\n }\n }\n\n dispose(): void {\n this.tex?.texture.dispose();\n this.ghost.geometry.dispose(); this.ghost.material.dispose();\n this.ghost.removeFromParent();\n }\n}\n", "import { Matrix4, Quaternion, Vector3 } from \"three\";\n\n/**\n * Decal orientation from a surface normal (the POC's decalPoseFromHit): z = normal, y = the world up seen in\n * the object's space (eyes stay upright), falling back to world \u2212z when the surface faces straight up / down;\n * then `rollDeg` about the normal.\n */\nexport function decalBasis(normal: Vector3, up: Vector3, fallbackUp: Vector3, rollDeg: number): Quaternion {\n const n = normal.clone().normalize();\n let x = new Vector3().crossVectors(up, n);\n if (x.lengthSq() < 0.01) x = new Vector3().crossVectors(fallbackUp, n);\n x.normalize();\n const y = new Vector3().crossVectors(n, x);\n const q = new Quaternion().setFromRotationMatrix(new Matrix4().makeBasis(x, y, n));\n return q.multiply(new Quaternion().setFromAxisAngle(new Vector3(0, 0, 1), (rollDeg * Math.PI) / 180));\n}\n", "import type { Id } from \"@dreamy/api\";\nimport { Plane, Vector3, type Intersection, type Object3D } from \"three\";\nimport type { MeshOwner } from \"../objects/scene-views.js\";\nimport type { InteractionContext } from \"./interaction-context.js\";\n\nexport type SurfaceHit = { readonly hit: Intersection<Object3D>; readonly owner: MeshOwner };\n\n/** The nearest sculpt / wing surface under the cursor (optionally only some objects' meshes). */\nexport function surfaceHit(ctx: InteractionContext, only?: ReadonlySet<Id>): SurfaceHit | null {\n ctx.raycaster.setFromCamera(ctx.pointer.ndc, ctx.stage.camera);\n for (const hit of ctx.raycaster.intersectObjects(ctx.views.pickables(only), false)) {\n const owner = ctx.views.ownerOf(hit.object);\n if (owner) return { hit, owner };\n }\n return null;\n}\n\n/** Where a stamp would land: a surface, else the ground, else the y = 1.5 plane. */\nexport function stampPoint(ctx: InteractionContext): Vector3 | null {\n ctx.raycaster.setFromCamera(ctx.pointer.ndc, ctx.stage.camera);\n const hits = ctx.raycaster.intersectObjects([...ctx.views.pickables(), ctx.stage.ground], false);\n const first = hits[0];\n if (first) return first.point.clone();\n const target = new Vector3();\n return ctx.raycaster.ray.intersectPlane(new Plane(new Vector3(0, 1, 0), -1.5), target) ? target : null;\n}\n\n/** Average of the three vertex normals of the hit face (smoother than the face normal on a voxel mesh), in mesh space. */\nexport function hitLocalNormal(hit: Intersection<Object3D>): Vector3 {\n const mesh = hit.object as Object3D & { geometry?: { attributes: { normal?: { getX(i: number): number; getY(i: number): number; getZ(i: number): number } } } };\n const na = mesh.geometry?.attributes.normal, f = hit.face;\n if (!na || !f) return new Vector3(0, 0, 1);\n const n = new Vector3(\n na.getX(f.a) + na.getX(f.b) + na.getX(f.c),\n na.getY(f.a) + na.getY(f.b) + na.getY(f.c),\n na.getZ(f.a) + na.getZ(f.b) + na.getZ(f.c));\n return n.lengthSq() > 1e-6 ? n.normalize() : n.copy(f.normal);\n}\n", "/** Holding Esc this long in sculpt mode leaves it (a tap is the module's: Select tool). */\nexport const ESC_HOLD_MS = 1000;\n\n/** Esc tap / hold in sculpt mode, with a small progress bar over the view (the POC's #esc-hint). */\nexport class EscHold {\n private hold: { start: number; raf: number; done: boolean } | null = null;\n private readonly bar: HTMLDivElement;\n private readonly fill: HTMLDivElement;\n\n constructor(host: HTMLElement, private readonly exit: () => void) {\n this.bar = document.createElement(\"div\");\n Object.assign(this.bar.style, {\n position: \"absolute\", left: \"50%\", bottom: \"24px\", transform: \"translateX(-50%)\", width: \"160px\", height: \"6px\",\n borderRadius: \"3px\", background: \"rgba(15, 23, 42, 0.25)\", display: \"none\", pointerEvents: \"none\", zIndex: \"6\", overflow: \"hidden\",\n });\n this.fill = document.createElement(\"div\");\n Object.assign(this.fill.style, { height: \"100%\", width: \"0%\", background: \"#fde047\" });\n this.bar.appendChild(this.fill);\n host.appendChild(this.bar);\n }\n\n start(): void {\n if (this.hold) return;\n const h = { start: performance.now(), raf: 0, done: false };\n this.hold = h;\n this.bar.style.display = \"block\";\n const tick = () => {\n if (this.hold !== h || h.done) return;\n const k = Math.min(1, (performance.now() - h.start) / ESC_HOLD_MS);\n this.fill.style.width = k * 100 + \"%\";\n if (k >= 1) { h.done = true; this.bar.style.display = \"none\"; this.exit(); return; } // one hold = one exit\n h.raf = requestAnimationFrame(tick);\n };\n h.raf = requestAnimationFrame(tick);\n }\n\n end(): void {\n const h = this.hold;\n this.hold = null;\n if (h) cancelAnimationFrame(h.raf);\n this.bar.style.display = \"none\";\n this.fill.style.width = \"0%\";\n }\n\n dispose(): void { this.end(); this.bar.remove(); }\n}\n", "import type { Bone, Id, Rig, SculptTarget, Transform } from \"@dreamy/api\";\nimport { Box3, Matrix4, Object3D, Quaternion, Vector3 } from \"three\";\nimport { TransformControls } from \"three/examples/jsm/controls/TransformControls.js\";\nimport { matrixOf, quatOf, sameTransform, transformOf, transformOfMatrix, vec3Of } from \"../math/convert.js\";\nimport { RigView } from \"../objects/rig-view.js\";\nimport { objectById, scopeOf, type InteractionContext } from \"./interaction-context.js\";\n\ntype Target =\n | { kind: \"objects\"; ids: Id[] }\n | { kind: \"stamps\"; target: SculptTarget; ids: Id[] }\n | { kind: \"pivot\"; target: SculptTarget }\n | { kind: \"bone\"; rigId: Id; boneId: Id; channel: \"rotate\" | \"translate\" | \"scale\" };\n\ntype Drag =\n | { kind: \"objects\"; start: Matrix4; items: { id: Id; world: Matrix4 }[] }\n | { kind: \"stamps\"; start: Matrix4; space: Matrix4; items: { id: Id; local: Matrix4 }[] }\n | { kind: \"pivot\"; space: Matrix4 }\n | { kind: \"bone\"; parentWorld: Matrix4; rig: Rig; bone: Bone };\n\nconst isAncestor = (a: Object3D, b: Object3D): boolean => { for (let p = b.parent; p; p = p.parent) if (p === a) return true; return false; };\n\n/**\n * Transform gizmo (three's TransformControls on a proxy): objects in assembly mode (one, or several about their\n * center), the scoped sculpt's selected stamps, the kaleidoscope pivot, or the selected bone. A drag previews live\n * and becomes one command on release.\n */\nexport class Gizmo {\n readonly controls: TransformControls;\n private readonly proxy = new Object3D();\n private target: Target | null = null;\n private drag: Drag | null = null;\n private previewDirty = false;\n /** Called when a drag starts / ends (orbit is off while dragging). */\n onDragging: (on: boolean) => void = () => undefined;\n\n constructor(private readonly ctx: InteractionContext) {\n this.controls = new TransformControls(ctx.stage.camera, ctx.stage.renderer.domElement);\n ctx.stage.ui.add(this.controls.getHelper(), this.proxy);\n this.controls.addEventListener(\"dragging-changed\", e => {\n const on = !!e.value;\n if (on) this.begin(); else this.end();\n this.onDragging(on);\n });\n this.controls.addEventListener(\"objectChange\", () => { if (this.drag) this.previewDirty = true; });\n }\n\n get dragging(): boolean { return this.controls.dragging; }\n /** The pointer is over a handle (a press there must not pick or stamp). */\n get hovering(): boolean { return this.controls.axis !== null; }\n\n private wanted(): Target | null {\n const ctx = this.ctx, s = ctx.session();\n if (ctx.locked()) return null;\n const scope = scopeOf(ctx);\n if (s.tool === \"translate\" || s.tool === \"rotate\" || s.tool === \"scale\") {\n if (scope) return s.selection.stampIds.length ? { kind: \"stamps\", target: scope, ids: [...s.selection.stampIds] } : null;\n const ids = s.selection.objectIds.filter(id => ctx.views.group(id));\n return ids.length ? { kind: \"objects\", ids } : null;\n }\n if (s.tool === \"pivot\" && scope && !(\"boneId\" in scope)) return { kind: \"pivot\", target: scope };\n if (s.tool === \"bone\" && s.mode === \"assembly\" && (s.boneTool === \"rotate\" || s.boneTool === \"translate\" || s.boneTool === \"scale\")) {\n const rigId = s.selection.objectIds.at(-1), boneId = s.selection.boneId;\n if (rigId !== undefined && boneId !== undefined && objectById(ctx.creation(), rigId)?.kind === \"rig\") return { kind: \"bone\", rigId, boneId, channel: s.boneTool };\n }\n return null;\n }\n\n /** Every frame: attach to what the session asks for and keep the proxy on it (not while dragging). */\n sync(): void {\n if (this.drag) {\n if (this.previewDirty) { this.previewDirty = false; this.preview(); }\n return;\n }\n const t = this.wanted();\n this.target = t;\n const s = this.ctx.session();\n if (!t || !this.place(t)) { if (this.controls.object) this.controls.detach(); return; }\n this.controls.setMode(t.kind === \"pivot\" ? s.pivotGizmo : t.kind === \"bone\" ? t.channel : (s.tool as \"translate\" | \"rotate\" | \"scale\"));\n this.controls.setSpace(s.space);\n if (this.controls.object !== this.proxy) this.controls.attach(this.proxy);\n }\n\n private setProxy(m: Matrix4): void {\n m.decompose(this.proxy.position, this.proxy.quaternion, this.proxy.scale);\n this.proxy.updateMatrixWorld(true);\n }\n\n private place(t: Target): boolean {\n const ctx = this.ctx;\n if (t.kind === \"objects\") {\n const groups = t.ids.map(id => ctx.views.group(id)).filter((g): g is NonNullable<typeof g> => !!g);\n if (!groups.length) return false;\n groups.forEach(g => g.updateWorldMatrix(true, true));\n if (groups.length === 1) { this.setProxy(groups[0]!.matrixWorld.clone()); return true; }\n const box = new Box3();\n groups.forEach(g => box.expandByObject(g));\n this.setProxy(new Matrix4().makeTranslation(box.getCenter(new Vector3())));\n return true;\n }\n if (t.kind === \"stamps\") {\n const v = ctx.views.sculptView(t.target), sc = v?.shown;\n if (!v || !sc) return false;\n const stamps = sc.stamps.filter(s => t.ids.includes(s.id));\n if (!stamps.length) return false;\n v.group.updateWorldMatrix(true, false);\n const W = v.group.matrixWorld;\n if (stamps.length === 1) { this.setProxy(W.clone().multiply(matrixOf(stamps[0]!))); return true; }\n const box = new Box3();\n stamps.forEach(s => {\n const h = new Vector3(s.scale.x, s.scale.y, s.scale.z).multiplyScalar(0.5), p = new Vector3(s.position.x, s.position.y, s.position.z);\n box.expandByPoint(p.clone().sub(h)); box.expandByPoint(p.clone().add(h));\n });\n const wq = v.group.getWorldQuaternion(new Quaternion());\n this.setProxy(new Matrix4().compose(box.getCenter(new Vector3()).applyMatrix4(W), wq, new Vector3(1, 1, 1)));\n return true;\n }\n if (t.kind === \"pivot\") {\n const v = ctx.views.sculptView(t.target), sc = v?.shown;\n if (!v || !sc) return false;\n v.group.updateWorldMatrix(true, false);\n this.setProxy(v.group.matrixWorld.clone().multiply(matrixOf({ position: sc.pivot.position, rotation: sc.pivot.rotation, scale: { x: 1, y: 1, z: 1 } })));\n return true;\n }\n const rv = ctx.views.views.get(t.rigId)?.view;\n const i = rv instanceof RigView ? rv.matrices?.index.get(t.boneId) : undefined;\n if (!(rv instanceof RigView) || i === undefined || !rv.matrices) return false;\n rv.group.updateWorldMatrix(true, false);\n this.setProxy(rv.group.matrixWorld.clone().multiply(rv.matrices.shownGlobal[i]!));\n return true;\n }\n\n private begin(): void {\n const t = this.target, ctx = this.ctx;\n this.drag = null;\n if (!t) return;\n this.proxy.updateMatrixWorld(true);\n const start = this.proxy.matrixWorld.clone();\n if (t.kind === \"objects\") {\n const groups = t.ids.map(id => ({ id, g: ctx.views.group(id) })).filter((x): x is { id: Id; g: NonNullable<ReturnType<typeof ctx.views.group>> } => !!x.g);\n // an object whose ancestor is also selected already moves with that ancestor\n const items = groups.filter(a => !groups.some(b => b !== a && isAncestor(b.g, a.g))).map(({ id, g }) => ({ id, world: g.matrixWorld.clone() }));\n this.drag = { kind: \"objects\", start, items };\n } else if (t.kind === \"stamps\") {\n const v = ctx.views.sculptView(t.target), sc = v?.shown;\n if (!v || !sc) return;\n this.drag = { kind: \"stamps\", start, space: v.group.matrixWorld.clone(), items: sc.stamps.filter(s => t.ids.includes(s.id)).map(s => ({ id: s.id, local: matrixOf(s) })) };\n } else if (t.kind === \"pivot\") {\n const v = ctx.views.sculptView(t.target);\n if (!v) return;\n this.drag = { kind: \"pivot\", space: v.group.matrixWorld.clone() };\n } else {\n const o = objectById(ctx.creation(), t.rigId), rv = ctx.views.views.get(t.rigId)?.view;\n if (o?.kind !== \"rig\" || !(rv instanceof RigView) || !rv.matrices) return;\n const bone = o.rig.bones.find(b => b.id === t.boneId);\n if (!bone) return;\n const pi = bone.parentId !== undefined ? rv.matrices.index.get(bone.parentId) : undefined;\n const parentWorld = rv.group.matrixWorld.clone();\n if (pi !== undefined) parentWorld.multiply(rv.matrices.shownGlobal[pi]!);\n this.drag = { kind: \"bone\", parentWorld, rig: o.rig, bone };\n if (o.rig.mode === \"rig\" && o.rig.parts.length) ctx.toast(\"Rig Mode edits the bind pose, so body parts won't follow. Switch to Pose Mode to deform.\");\n }\n }\n\n /** Delta of the proxy since the drag started, applied to every dragged thing (as a preview). */\n private preview(): void {\n const d = this.drag, t = this.target, ctx = this.ctx;\n if (!d || !t) return;\n this.proxy.updateMatrixWorld(true);\n const P = this.proxy.matrixWorld;\n if (d.kind === \"objects\") {\n const delta = P.clone().multiply(d.start.clone().invert());\n for (const it of d.items) {\n const g = ctx.views.group(it.id);\n if (!g) continue;\n const m = delta.clone().multiply(it.world);\n if (g.parent) { g.parent.updateWorldMatrix(true, false); m.premultiply(g.parent.matrixWorld.clone().invert()); }\n m.decompose(g.position, g.quaternion, g.scale);\n g.updateMatrixWorld(true);\n }\n } else if (d.kind === \"stamps\" && t.kind === \"stamps\") {\n const v = ctx.views.sculptView(t.target), sc = v?.sculpt;\n if (!v || !sc) return;\n const placed = this.stampPlacements(d);\n v.setPreview({ ...sc, stamps: sc.stamps.map(s => { const p = placed.get(s.id); return p ? { ...s, ...p } : s; }) });\n } else if (d.kind === \"pivot\" && t.kind === \"pivot\") {\n const v = ctx.views.sculptView(t.target), sc = v?.sculpt;\n if (!v || !sc) return;\n v.setPreview({ ...sc, pivot: this.pivotOf(d) });\n } else if (d.kind === \"bone\" && t.kind === \"bone\") {\n const rv = ctx.views.views.get(t.rigId)?.view;\n if (!(rv instanceof RigView)) return;\n const tr = this.boneTransform(d, t.channel);\n const field = d.rig.mode === \"rig\" ? \"bind\" : \"pose\";\n rv.set({ ...d.rig, bones: d.rig.bones.map(b => (b.id === d.bone.id ? { ...b, [field]: tr } : b)) }, d.rig.mode === \"pose\");\n }\n }\n\n private stampPlacements(d: Extract<Drag, { kind: \"stamps\" }>): Map<Id, Transform> {\n const inv = d.space.clone().invert();\n const P = inv.clone().multiply(this.proxy.matrixWorld);\n const out = new Map<Id, Transform>();\n if (d.items.length === 1) { out.set(d.items[0]!.id, transformOfMatrix(P)); return out; }\n const D = P.multiply(inv.clone().multiply(d.start).invert());\n for (const it of d.items) out.set(it.id, transformOfMatrix(D.clone().multiply(it.local)));\n return out;\n }\n\n private pivotOf(d: Extract<Drag, { kind: \"pivot\" }>) {\n const t = transformOfMatrix(d.space.clone().invert().multiply(this.proxy.matrixWorld));\n return { position: t.position, rotation: t.rotation };\n }\n\n private boneTransform(d: Extract<Drag, { kind: \"bone\" }>, channel: \"rotate\" | \"translate\" | \"scale\"): Transform {\n const local = d.parentWorld.clone().invert().multiply(this.proxy.matrixWorld);\n const p = new Vector3(), q = new Quaternion(), s = new Vector3();\n local.decompose(p, q, s);\n const cur = d.rig.mode === \"rig\" ? d.bone.bind : d.bone.pose;\n // Rotate = pose (orbits children), Move = stretch, Scale = scale: only the active channel is written.\n if (channel === \"rotate\") return { ...cur, rotation: quatOf(q) };\n if (channel === \"translate\") return { ...cur, position: vec3Of(p) };\n return { ...cur, scale: vec3Of(s) };\n }\n\n private end(): void {\n const d = this.drag, t = this.target, ctx = this.ctx;\n this.drag = null;\n this.previewDirty = false;\n if (!d || !t) return;\n if (d.kind === \"objects\") {\n const changes = d.items.flatMap(it => {\n const g = ctx.views.group(it.id), o = objectById(ctx.creation(), it.id);\n if (!g || !o) return [];\n const tr = transformOf(g);\n return sameTransform(tr, o.transform) ? [] : [{ objectId: it.id, transform: tr }];\n });\n if (changes.length) ctx.dispatch({ type: \"SetObjectTransforms\", payload: { changes } });\n } else if (d.kind === \"stamps\" && t.kind === \"stamps\") {\n const placed = this.stampPlacements(d);\n const changes = [...placed].map(([stampId, p]) => ({ stampId, position: p.position, rotation: p.rotation, scale: p.scale }));\n const v = ctx.views.sculptView(t.target);\n v?.clearPreviewOnNextSet();\n if (!ctx.dispatch({ type: \"SetStampPlacements\", payload: { target: t.target, changes } }).ok) v?.setPreview(null);\n } else if (d.kind === \"pivot\" && t.kind === \"pivot\") {\n const v = ctx.views.sculptView(t.target);\n v?.clearPreviewOnNextSet();\n if (!ctx.dispatch({ type: \"SetPivot\", payload: { target: t.target, pivot: this.pivotOf(d) } }).ok) v?.setPreview(null);\n } else if (d.kind === \"bone\" && t.kind === \"bone\") {\n const tr = this.boneTransform(d, t.channel);\n const cur = d.rig.mode === \"rig\" ? d.bone.bind : d.bone.pose;\n if (!sameTransform(tr, cur)) ctx.dispatch({ type: \"SetBoneTransforms\", payload: { rigId: t.rigId, changes: [{ boneId: d.bone.id, transform: tr }] } });\n }\n }\n\n dispose(): void {\n this.controls.detach();\n this.controls.dispose();\n this.controls.getHelper().removeFromParent();\n this.proxy.removeFromParent();\n }\n}\n", "/** The area-selection rectangle, a DOM overlay over the canvas (the POC's #marquee). */\nexport class MarqueeOverlay {\n private readonly el: HTMLDivElement;\n\n constructor(host: HTMLElement) {\n this.el = document.createElement(\"div\");\n Object.assign(this.el.style, {\n position: \"absolute\", display: \"none\", pointerEvents: \"none\", zIndex: \"5\",\n border: \"1.5px dashed #3b82f6\", background: \"rgba(59, 130, 246, 0.12)\", borderRadius: \"4px\",\n });\n host.appendChild(this.el);\n }\n\n show(x1: number, y1: number, x2: number, y2: number): void {\n Object.assign(this.el.style, {\n display: \"block\", left: Math.min(x1, x2) + \"px\", top: Math.min(y1, y2) + \"px\",\n width: Math.abs(x2 - x1) + \"px\", height: Math.abs(y2 - y1) + \"px\",\n });\n }\n\n hide(): void { this.el.style.display = \"none\"; }\n\n dispose(): void { this.el.remove(); }\n}\n", "import { BufferGeometry, Group, Quaternion, Line, LineBasicMaterial, Mesh, MeshBasicMaterial, SphereGeometry, Vector3, type Material } from \"three\";\nimport { scopeOf, type InteractionContext } from \"./interaction-context.js\";\n\n/**\n * The kaleidoscope pivot marker (3 axis lines + a ball) of the scoped standalone sculpt, at a constant screen size;\n * bright while the pivot tool is on or any shape uses symmetry, dim otherwise.\n */\nexport class PivotHelper {\n private readonly root = new Group();\n private readonly mats: (Material & { opacity: number })[] = [];\n\n constructor(private readonly ctx: InteractionContext) {\n const axis = (dir: Vector3, hex: number) => {\n const m = new LineBasicMaterial({ color: hex, depthTest: false, depthWrite: false, transparent: true, opacity: 0.9 });\n const l = new Line(new BufferGeometry().setFromPoints([new Vector3(), dir]), m);\n l.renderOrder = 1000;\n this.root.add(l);\n this.mats.push(m);\n };\n axis(new Vector3(1, 0, 0), 0xef4444);\n axis(new Vector3(0, 1, 0), 0x22c55e);\n axis(new Vector3(0, 0, 1), 0x3b82f6);\n const bm = new MeshBasicMaterial({ color: 0xffffff, depthTest: false, depthWrite: false, transparent: true, opacity: 0.95 });\n const ball = new Mesh(new SphereGeometry(0.08, 12, 8), bm);\n ball.renderOrder = 1000;\n this.root.add(ball);\n this.mats.push(bm);\n this.root.visible = false;\n ctx.stage.ui.add(this.root);\n }\n\n update(): void {\n const ctx = this.ctx, scope = scopeOf(ctx);\n const v = scope && !(\"boneId\" in scope) ? ctx.views.sculptView(scope) : undefined;\n const sc = v?.shown;\n this.root.visible = !!sc && !ctx.locked();\n if (!v || !sc || !this.root.visible) return;\n v.group.updateWorldMatrix(true, false);\n const p = new Vector3(sc.pivot.position.x, sc.pivot.position.y, sc.pivot.position.z).applyMatrix4(v.group.matrixWorld);\n this.root.position.copy(p);\n this.root.quaternion.copy(v.group.getWorldQuaternion(this.root.quaternion)).multiply(\n new Quaternion(sc.pivot.rotation.x, sc.pivot.rotation.y, sc.pivot.rotation.z, sc.pivot.rotation.w));\n this.root.scale.setScalar(Math.max(0.25, p.distanceTo(ctx.stage.camera.position) * 0.045));\n const anySym = sc.stamps.some(s => s.symmetry && (s.symmetry.count > 1 || s.symmetry.axes.length)) ||\n sc.smearGroups.some(g => g.symmetry && (g.symmetry.count > 1 || g.symmetry.axes.length));\n const bright = ctx.session().tool === \"pivot\" || anySym;\n this.mats.forEach(m => { m.opacity = bright ? 0.95 : 0.32; });\n }\n\n dispose(): void {\n this.root.traverse(o => { const m = o as Mesh; m.geometry?.dispose(); });\n this.mats.forEach(m => m.dispose());\n this.root.removeFromParent();\n }\n}\n", "import type { Id, Sculpt, Selection } from \"@dreamy/api\";\nimport { Box3, Vector3 } from \"three\";\nimport { nearestScreenPoint, pickStampOnRay, toggleId, toggleMembers } from \"../math/picking.js\";\nimport { isClick, rectContains, rectFromDrag, rectsOverlap, screenRectOfBox, worldToScreen, CLICK_SLOP_PX } from \"../math/screen.js\";\nimport { RigView } from \"../objects/rig-view.js\";\nimport { BoneTool } from \"./bone-tool.js\";\nimport { bonesVisible } from \"./bones-visible.js\";\nimport { emptySelection, scopeOf, viewSize, type InteractionContext } from \"./interaction-context.js\";\nimport type { MarqueeOverlay } from \"./marquee.js\";\nimport { surfaceHit } from \"./surface-hit.js\";\n\n/** A stamp of a locked smear group stands for the whole group. */\nexport function stampMembers(sculpt: Sculpt, stampId: Id): Id[] {\n const s = sculpt.stamps.find(x => x.id === stampId);\n const g = s?.smearGroupId !== undefined ? sculpt.smearGroups.find(x => x.id === s.smearGroupId) : undefined;\n return g && !g.unlocked ? sculpt.stamps.filter(x => x.smearGroupId === g.id).map(x => x.id) : [stampId];\n}\n\n/**\n * Selection gestures (the POC's selection.js / multi-select.js): a click picks one thing, Ctrl / Cmd toggles it,\n * Shift + drag draws an area that selects everything it touches, a double-click frames an object. Assembly mode\n * picks objects (bone dots first; a part picks its rig), sculpt mode the scoped sculpt's shapes.\n */\nexport class SelectTool {\n private press: { sx: number; sy: number; area: boolean; additive: boolean; active: boolean } | null = null;\n\n constructor(private readonly ctx: InteractionContext, private readonly marquee: MarqueeOverlay) {}\n\n get dragging(): boolean { return !!this.press?.active; }\n\n down(): void {\n const s = this.ctx.session(), p = this.ctx.pointer;\n this.press = { sx: p.x, sy: p.y, area: p.shift || s.touchArea, additive: p.ctrl || s.touchAdd, active: false };\n }\n\n move(): void {\n const m = this.press, p = this.ctx.pointer;\n if (!m || !m.area) return;\n if (!m.active && Math.hypot(p.x - m.sx, p.y - m.sy) > CLICK_SLOP_PX) m.active = true;\n if (m.active) this.marquee.show(m.sx, m.sy, p.x, p.y);\n }\n\n up(): void {\n const m = this.press, p = this.ctx.pointer;\n this.press = null;\n this.marquee.hide();\n if (!m) return;\n if (m.active) this.finishArea(m.sx, m.sy, p.x, p.y, m.additive);\n else if (!m.area && isClick(m.sx, m.sy, p.x, p.y)) this.pick(m.additive);\n }\n\n /** Esc while dragging an area cancels it. */\n cancel(): boolean {\n if (!this.press?.active) return false;\n this.press = null;\n this.marquee.hide();\n return true;\n }\n\n /** Picks what is under the cursor; a miss changes nothing (finishing an orbit never drops the selection). */\n pick(additive: boolean): void {\n const ctx = this.ctx, s = ctx.session(), sel = s.selection;\n const scope = scopeOf(ctx);\n if (scope) {\n const view = ctx.views.sculptView(scope), sculpt = view?.shown;\n if (!view || !sculpt) return;\n ctx.raycaster.setFromCamera(ctx.pointer.ndc, ctx.stage.camera);\n view.group.updateWorldMatrix(true, false);\n const ws = view.group.getWorldScale(new Vector3());\n const r = Math.max(ws.x, ws.y, ws.z);\n const i = pickStampOnRay(ctx.raycaster.ray, sculpt.stamps.map(st => ({\n center: new Vector3(st.position.x, st.position.y, st.position.z).applyMatrix4(view.group.matrixWorld), radius: st.scale.x * 0.6 * r,\n })));\n const hit = sculpt.stamps[i];\n if (!hit) return;\n const members = stampMembers(sculpt, hit.id);\n ctx.select({ ...sel, stampIds: additive ? toggleMembers(sel.stampIds, members) : members });\n return;\n }\n const id = this.objectUnderCursor();\n if (!id) return;\n ctx.select(additive ? { objectIds: toggleId(sel.objectIds, id), stampIds: [] } : { objectIds: [id], stampIds: [] });\n }\n\n /** The rig or sculpt object under the cursor (bone dots win: they are drawn on top). */\n objectUnderCursor(): Id | undefined {\n const ctx = this.ctx;\n let best: Id | undefined, bestD = 16;\n for (const o of ctx.creation().objects) {\n if (o.kind !== \"rig\" || !bonesVisible(ctx, o)) continue;\n const v = ctx.views.views.get(o.id)?.view;\n if (!(v instanceof RigView)) continue;\n const pts = BoneTool.jointsOnScreen(ctx, v);\n const i = nearestScreenPoint(pts, ctx.pointer.x, ctx.pointer.y, bestD);\n const pt = pts[i];\n if (pt) { bestD = Math.hypot(pt.x - ctx.pointer.x, pt.y - ctx.pointer.y); best = o.id; }\n }\n return best ?? surfaceHit(ctx)?.owner.objectId;\n }\n\n private finishArea(sx: number, sy: number, ex: number, ey: number, additive: boolean): void {\n const ctx = this.ctx, sel = ctx.session().selection, cam = ctx.stage.camera;\n cam.updateMatrixWorld();\n const { w, h } = viewSize(ctx);\n const rect = rectFromDrag(sx, sy, ex, ey);\n const scope = scopeOf(ctx);\n if (!scope) {\n const found = ctx.creation().objects.filter(o => {\n const g = ctx.views.group(o.id);\n if (!g) return false;\n const r = screenRectOfBox(new Box3().setFromObject(g), cam, w, h);\n return !!r && rectsOverlap(r, rect);\n }).map(o => o.id);\n if (!found.length) {\n if (!additive) ctx.select(emptySelection);\n ctx.toast(\"Nothing in that area\");\n return;\n }\n const merged = additive ? sel.objectIds.concat(found.filter(id => !sel.objectIds.includes(id))) : found;\n ctx.select({ objectIds: merged, stampIds: [] });\n ctx.toast(merged.length === 1 ? \"1 object selected\" : `${merged.length} objects selected`);\n return;\n }\n const view = ctx.views.sculptView(scope), sculpt = view?.shown;\n if (!view || !sculpt) return;\n view.group.updateWorldMatrix(true, false);\n const picked = new Set<Id>();\n for (const st of sculpt.stamps) {\n const p = worldToScreen(new Vector3(st.position.x, st.position.y, st.position.z).applyMatrix4(view.group.matrixWorld), cam, w, h);\n if (p && rectContains(rect, p)) stampMembers(sculpt, st.id).forEach(m => picked.add(m));\n }\n if (additive) sel.stampIds.forEach(id => picked.add(id));\n const ids = sculpt.stamps.map(s => s.id).filter(id => picked.has(id));\n if (!ids.length) { ctx.toast(\"No shapes in that area\"); return; }\n ctx.select({ ...sel, stampIds: ids });\n if (ids.length > 1) ctx.toast(`${ids.length} shapes selected`);\n }\n\n /** Double-click in assembly mode: an object is framed and its Properties open; empty space deselects. */\n doubleClick(focus: (center: Vector3) => void): void {\n const ctx = this.ctx, s = ctx.session();\n if (ctx.locked() || s.mode !== \"assembly\" || ![\"select\", \"translate\", \"rotate\", \"scale\"].includes(s.tool)) return;\n const id = this.objectUnderCursor();\n if (!id) { ctx.select(emptySelection); return; }\n const g = ctx.views.group(id);\n if (g) {\n g.updateWorldMatrix(true, true);\n const box = new Box3().setFromObject(g);\n focus(box.isEmpty() ? g.getWorldPosition(new Vector3()) : box.getCenter(new Vector3()));\n }\n const sel: Selection = { objectIds: [id], stampIds: [] };\n ctx.select(sel);\n ctx.callbacks()?.focus(id);\n }\n}\n", "import { Box3Helper, Box3, Color, type Group } from \"three\";\nimport type { InteractionContext } from \"./interaction-context.js\";\n\n/** Assembly-mode outlines: the primary (last) selected object in sky blue, the others lighter. */\nexport class SelectionBoxes {\n private readonly helpers: Box3Helper[] = [];\n\n constructor(private readonly ctx: InteractionContext, private readonly ui: Group) {}\n\n update(): void {\n const s = this.ctx.session();\n const ids = s.mode === \"assembly\" && !this.ctx.locked() ? s.selection.objectIds : [];\n const groups = ids.map(id => this.ctx.views.group(id)).filter((g): g is Group => !!g);\n while (this.helpers.length < groups.length) {\n const h = new Box3Helper(new Box3(), new Color(0x38bdf8));\n this.ui.add(h);\n this.helpers.push(h);\n }\n this.helpers.forEach((h, i) => {\n const g = groups[i];\n h.visible = !!g;\n if (!g) return;\n g.updateWorldMatrix(true, true);\n h.box.setFromObject(g);\n (h.material as unknown as { color: Color }).color.setHex(i === groups.length - 1 ? 0x38bdf8 : 0x7dd3fc);\n });\n }\n\n dispose(): void {\n this.helpers.forEach(h => { h.geometry.dispose(); (h.material as unknown as { dispose(): void }).dispose(); h.removeFromParent(); });\n }\n}\n", "import type { Sculpt, SculptTarget, SmearGroup, Stamp, StampMode, StampSpec } from \"@dreamy/api\";\nimport { Mesh, MeshBasicMaterial, Quaternion, Vector3, type Group } from \"three\";\nimport { IDENTITY_QUAT, quatOf, vec3Of } from \"../math/convert.js\";\nimport { smearBlend, smearDabs } from \"../math/smear.js\";\nimport { SYM_MAX_INSTANCES, symInstances } from \"../math/symmetry.js\";\nimport { ghostGeometry } from \"./ghost-geometry.js\";\nimport { scopeOf, type InteractionContext } from \"./interaction-context.js\";\nimport { stampPoint } from \"./surface-hit.js\";\n\nconst MODE_GHOST: Record<StampMode, number> = { add: 0x86efac, subtract: 0xfca5a5, intersect: 0x93c5fd, paint: 0xfbcfe8 };\n\ntype Stroke = { target: SculptTarget; last: Vector3; dabs: StampSpec[] };\n\n/**\n * Stamp tool (the POC's stamping in input.js + ghost in scene.js + ghost copies in symmetry.js). Assembly mode: a\n * click creates a sculpt. Sculpt mode: a click adds one stamp; with smear on, a drag lays dabs every 0.4 \u00D7 size\n * (\u2264 24 per move), previewed live and committed as ONE AddStamps (a smear group) on release.\n */\nexport class StampTool {\n private readonly ghost: Mesh;\n private readonly ghostMat = new MeshBasicMaterial({ color: 0xfacc15, transparent: true, opacity: 0.5, wireframe: true });\n private readonly copyMat = new MeshBasicMaterial({ color: 0xfacc15, transparent: true, opacity: 0.16, wireframe: true, depthWrite: false });\n private readonly copies: Mesh[] = [];\n private shape = \"\";\n private stroke: Stroke | null = null;\n\n constructor(private readonly ctx: InteractionContext) {\n this.ghost = new Mesh(ghostGeometry(\"cube\"), this.ghostMat);\n this.ghost.visible = false;\n ctx.stage.ui.add(this.ghost);\n for (let i = 0; i < SYM_MAX_INSTANCES - 1; i++) {\n const m = new Mesh(this.ghost.geometry, this.copyMat);\n m.visible = false;\n ctx.stage.ui.add(m);\n this.copies.push(m);\n }\n }\n\n private active(): boolean {\n return this.ctx.session().tool === \"stamp\" && !this.ctx.locked();\n }\n\n /** Scope's sculpt space (sculpt mode), or undefined. */\n private scopeSpace(): { target: SculptTarget; group: Group; sculpt: Sculpt } | undefined {\n const t = scopeOf(this.ctx);\n const v = t && this.ctx.views.sculptView(t);\n return t && v?.shown ? { target: t, group: v.group, sculpt: v.shown } : undefined;\n }\n\n /** Follows the cursor: ghost at the surface / ground point, its symmetry copies about the pivot. */\n hover(): void {\n const s = this.ctx.session();\n if (!this.active()) { this.hideGhost(); return; }\n if (this.shape !== s.brush.shape) {\n this.shape = s.brush.shape;\n this.ghost.geometry.dispose();\n this.ghost.geometry = ghostGeometry(s.brush.shape);\n this.copies.forEach(c => { c.geometry = this.ghost.geometry; });\n }\n this.ghostMat.color.setHex(s.mode === \"sculpt\" ? MODE_GHOST[s.brush.mode] : 0xfde047);\n this.copyMat.color.copy(this.ghostMat.color);\n const p = stampPoint(this.ctx);\n if (!p) { this.hideGhost(); return; }\n this.ghost.position.copy(p);\n this.ghost.quaternion.identity();\n this.ghost.scale.setScalar(s.brush.size / 1.8);\n this.ghost.visible = true;\n this.updateCopies();\n }\n\n private updateCopies(): void {\n const sp = this.scopeSpace();\n const sym = this.ctx.session().brush.symmetry;\n const insts = sp && !(\"boneId\" in sp.target) && this.ghost.visible ? this.ghostInstances(sp.group, sp.sculpt, sym) : [];\n this.copies.forEach((c, i) => {\n const inst = insts[i];\n c.visible = !!inst;\n if (inst) { c.position.copy(inst.position); c.quaternion.copy(inst.quaternion); c.scale.copy(inst.scale); }\n });\n }\n\n private ghostInstances(group: Group, sculpt: Sculpt, sym: Sculpt[\"stamps\"][number][\"symmetry\"]) {\n group.updateWorldMatrix(true, false);\n const inv = group.matrixWorld.clone().invert();\n const oq = group.getWorldQuaternion(new Quaternion());\n const ws = group.getWorldScale(new Vector3());\n const local = { position: this.ghost.position.clone().applyMatrix4(inv), quaternion: oq.clone().invert(), scale: this.ghost.scale.clone().divide(ws) };\n return symInstances(local, sculpt.pivot, sym).map(inst => ({\n position: inst.position.applyMatrix4(group.matrixWorld),\n quaternion: oq.clone().multiply(inst.quaternion),\n scale: inst.scale.multiply(ws),\n }));\n }\n\n hideGhost(): void {\n this.ghost.visible = false;\n this.copies.forEach(c => { c.visible = false; });\n }\n\n /** One dab in the scope's local space: world-aligned like the ghost, at the ghost's world size. */\n private spec(group: Group, world: Vector3, allowSymmetry: boolean): StampSpec {\n const b = this.ctx.session().brush;\n group.updateWorldMatrix(true, false);\n const ws = group.getWorldScale(new Vector3());\n const oq = group.getWorldQuaternion(new Quaternion());\n const local = world.clone().applyMatrix4(group.matrixWorld.clone().invert());\n const base: StampSpec = {\n shape: b.shape, position: vec3Of(local), rotation: quatOf(oq.invert()),\n scale: { x: b.size / ws.x, y: b.size / ws.y, z: b.size / ws.z }, mode: b.mode, color: b.color,\n };\n return allowSymmetry && (b.symmetry.count > 1 || b.symmetry.axes.length) ? { ...base, symmetry: b.symmetry } : base;\n }\n\n /** Pointer down (or Q): stamp once, or start a smear stroke. */\n press(fromKey = false): void {\n if (!this.active()) return;\n this.hover();\n if (!this.ghost.visible) return;\n const s = this.ctx.session();\n if (s.mode === \"assembly\") { this.createSculpt(); return; }\n const sp = this.scopeSpace();\n if (!sp) return;\n const spec = this.spec(sp.group, this.ghost.position, !(\"boneId\" in sp.target));\n if (s.brush.smear && !fromKey) {\n this.stroke = { target: sp.target, last: this.ghost.position.clone(), dabs: [spec] };\n this.preview();\n return;\n }\n this.commit(sp.target, [spec], false);\n }\n\n /** Pointer move while pressed: lay the dabs the cursor passed. */\n drag(): void {\n const st = this.stroke;\n if (!st) return;\n this.hover();\n if (!this.ghost.visible) return;\n const sp = this.scopeSpace();\n if (!sp) return;\n const pts = smearDabs(st.last, this.ghost.position, this.ctx.session().brush.size);\n if (!pts.length) return;\n const sym = !(\"boneId\" in sp.target);\n pts.forEach(p => st.dabs.push(this.spec(sp.group, new Vector3(p.x, p.y, p.z), sym)));\n st.last.copy(this.ghost.position);\n this.preview();\n }\n\n /** Pointer up: the whole stroke becomes one AddStamps (a single dab is a plain stamp). */\n release(): void {\n const st = this.stroke;\n this.stroke = null;\n if (!st) return;\n this.commit(st.target, st.dabs, st.dabs.length > 1);\n }\n\n cancel(): void {\n const st = this.stroke;\n this.stroke = null;\n if (st) this.ctx.views.sculptView(st.target)?.setPreview(null);\n }\n\n get stroking(): boolean { return !!this.stroke; }\n\n private smearGroupFor(sculpt: Sculpt, dabs: readonly StampSpec[]): Omit<SmearGroup, \"id\" | \"name\" | \"unlocked\"> {\n const b = this.ctx.session().brush;\n const s0 = dabs[0]?.scale ?? { x: 1, y: 1, z: 1 };\n const g = { mode: b.mode, color: b.color, blend: smearBlend(sculpt.look.blend, s0) };\n const sym = dabs[0]?.symmetry;\n return sym ? { ...g, symmetry: sym } : g;\n }\n\n private preview(): void {\n const st = this.stroke;\n if (!st) return;\n const v = this.ctx.views.sculptView(st.target);\n const base = v?.sculpt;\n if (!v || !base) return;\n const grp = this.smearGroupFor(base, st.dabs);\n const group: SmearGroup = { id: \"pending-smear\", name: \"Smear\", unlocked: false, ...grp };\n const stamps: Stamp[] = st.dabs.map((d, i) => ({ ...d, id: `pending-${i}`, smearGroupId: group.id }));\n v.setPreview({ ...base, stamps: [...base.stamps, ...stamps], smearGroups: [...base.smearGroups, group] });\n }\n\n private commit(target: SculptTarget, dabs: StampSpec[], smear: boolean): void {\n const v = this.ctx.views.sculptView(target);\n const before = new Set(v?.sculpt?.stamps.map(s => s.id) ?? []);\n const payload = smear && v?.sculpt\n ? (() => { const g = this.smearGroupFor(v.sculpt, dabs); return { target, stamps: dabs, smear: g.symmetry ? { mode: g.mode, color: g.color, blend: g.blend, symmetry: g.symmetry } : { mode: g.mode, color: g.color, blend: g.blend } }; })()\n : { target, stamps: dabs };\n v?.clearPreviewOnNextSet();\n const r = this.ctx.dispatch({ type: \"AddStamps\", payload });\n if (!r.ok) { v?.setPreview(null); return; }\n // Select what was just added (the new shape, or the new smear group)\n const after = sculptOf(r.creation, target);\n const added = after?.stamps.filter(s => !before.has(s.id)).map(s => s.id) ?? [];\n if (added.length) this.ctx.select({ objectIds: [target.objectId], stampIds: added });\n if (smear && added.length) this.ctx.toast(`Smear created (${added.length} shapes)`);\n }\n\n private createSculpt(): void {\n const b = this.ctx.session().brush;\n const size = b.size * (2 / 1.8);\n const before = new Set(this.ctx.creation().objects.map(o => o.id));\n const r = this.ctx.dispatch({\n type: \"CreateSculpt\",\n payload: {\n transform: { position: vec3Of(this.ghost.position), rotation: IDENTITY_QUAT, scale: { x: 1, y: 1, z: 1 } },\n stamp: { shape: b.shape, position: { x: 0, y: 0, z: 0 }, rotation: IDENTITY_QUAT, scale: { x: size, y: size, z: size }, mode: \"add\", color: b.color },\n look: { color: b.color, foundationColor: b.color },\n },\n });\n if (!r.ok) return;\n const created = r.creation.objects.find(o => !before.has(o.id));\n if (created) this.ctx.select({ objectIds: [created.id], stampIds: [] });\n this.ctx.toast(\"New Sculpt Placed\");\n }\n\n dispose(): void {\n this.ghost.geometry.dispose();\n this.ghostMat.dispose(); this.copyMat.dispose();\n this.ghost.removeFromParent();\n this.copies.forEach(c => c.removeFromParent());\n }\n}\n\nexport function sculptOf(c: import(\"@dreamy/api\").Creation, t: SculptTarget): Sculpt | undefined {\n const o = c.objects.find(x => x.id === t.objectId);\n if (!o) return undefined;\n if (o.kind === \"sculpt\") return \"boneId\" in t ? undefined : o.sculpt;\n if (\"boneId\" in t) { const p = o.rig.parts.find(p => p.boneId === t.boneId); return p?.kind === \"sculpt\" ? p.sculpt : undefined; }\n return o.rig.body;\n}\n\n", "/** Smear stroke spacing (the POC's input.js): dabs every 0.4 \u00D7 stamp size, at most 24 per pointer move. */\nexport const SMEAR_SPACING_FACTOR = 0.4;\nexport const SMEAR_MAX_DABS_PER_MOVE = 24;\n\nexport type P3 = { readonly x: number; readonly y: number; readonly z: number };\n\nexport const smearSpacing = (size: number): number => Math.max(0.04, size * SMEAR_SPACING_FACTOR);\n\n/**\n * Dab points for one pointer move from the last dab to the cursor: evenly spaced on the segment, ending on the\n * cursor. Empty while the cursor is closer than one spacing (the stroke waits).\n */\nexport function smearDabs(last: P3, target: P3, size: number): P3[] {\n const spacing = smearSpacing(size);\n const dx = target.x - last.x, dy = target.y - last.y, dz = target.z - last.z;\n const dist = Math.sqrt(dx * dx + dy * dy + dz * dz);\n if (dist < spacing) return [];\n const n = Math.min(Math.ceil(dist / spacing), SMEAR_MAX_DABS_PER_MOVE);\n const out: P3[] = [];\n for (let i = 1; i <= n; i++) out.push({ x: last.x + (dx * i) / n, y: last.y + (dy * i) / n, z: last.z + (dz * i) / n });\n return out;\n}\n\n/** A small brush gets a proportionally small blend so dabs don't melt into one blob (local size \u00D7 0.5). */\nexport const smearBlend = (sculptBlend: number, localSize: { x: number; y: number; z: number }): number =>\n Math.min(sculptBlend, Math.min(localSize.x, localSize.y, localSize.z) * 0.5);\n", "import type { Pivot, Symmetry, SymmetryAxis } from \"@dreamy/api\";\nimport { Matrix4, Quaternion, Vector3 } from \"three\";\n\n/**\n * Kaleidoscope instances (the POC's symmetry.js). The viewport only previews copies (ghost brush, selected\n * shape wires); the evaluator bakes them. Copy k is the source rotated k \u00B7 360 / N about each axis\n * (composed X, Y, Z); N = 2 on an axis mirrors across that axis' plane.\n */\nexport const SYM_MAX_N = 12;\nexport const SYM_MAX_INSTANCES = 128;\nconst AXES: readonly SymmetryAxis[] = [\"x\", \"y\", \"z\"];\nconst AXIS_VEC = { x: new Vector3(1, 0, 0), y: new Vector3(0, 1, 0), z: new Vector3(0, 0, 1) };\n\nexport const symAxesOf = (axes: readonly SymmetryAxis[] | undefined): SymmetryAxis[] => AXES.filter(a => (axes ?? []).includes(a));\n\n/** N clamped to 1\u201312 and to N^(#axes) \u2264 128. */\nexport function symClampN(n: number, axes: readonly SymmetryAxis[] | undefined): number {\n let N = Math.max(1, Math.min(SYM_MAX_N, Math.round(n) || 1));\n const len = symAxesOf(axes).length;\n while (len > 0 && N > 1 && Math.pow(N, len) > SYM_MAX_INSTANCES) N--;\n return N;\n}\n\nconst isIdentity = (m: Matrix4) => m.elements.every((v, i) => Math.abs(v - (i % 5 === 0 ? 1 : 0)) < 1e-6);\n\nconst cache = new Map<string, Matrix4[]>();\n\n/** Every non-identity linear part of the symmetry group (read-only, cached). */\nexport function symInstanceMatrices(n: number, axes: readonly SymmetryAxis[] | undefined): readonly Matrix4[] {\n const key = n + \"|\" + symAxesOf(axes).join(\"\");\n let hit = cache.get(key);\n if (!hit) { hit = buildMatrices(n, axes); cache.set(key, hit); }\n return hit;\n}\n\nfunction buildMatrices(n: number, axes: readonly SymmetryAxis[] | undefined): Matrix4[] {\n const sel = symAxesOf(axes);\n const plan = sel.length ? sel : n > 1 ? ([\"y\"] as SymmetryAxis[]) : [];\n if (!plan.length) return [];\n let list = [new Matrix4()];\n for (const a of AXES) {\n if (!plan.includes(a)) continue;\n const gens: Matrix4[] = [];\n if (n === 2) {\n const sc = { x: [-1, 1, 1], y: [1, -1, 1], z: [1, 1, -1] }[a] as [number, number, number];\n gens.push(new Matrix4(), new Matrix4().makeScale(...sc));\n } else {\n for (let k = 0; k < n; k++) gens.push(new Matrix4().makeRotationAxis(AXIS_VEC[a], (k * Math.PI * 2) / n));\n }\n const next: Matrix4[] = [];\n for (const base of list) for (const g of gens) next.push(base.clone().multiply(g));\n list = next;\n }\n const seen = new Set<string>();\n const out: Matrix4[] = [];\n for (const m of list) {\n if (isIdentity(m)) continue;\n const k = m.elements.map(v => Math.round(v * 1e5)).join(\",\");\n if (seen.has(k)) continue;\n seen.add(k);\n out.push(m);\n }\n return out;\n}\n\nexport type Placement = { position: Vector3; quaternion: Quaternion; scale: Vector3 };\n\nconst FLIP_X = new Matrix4().makeScale(-1, 1, 1);\n\n/** Instance placements of one shape about the sculpt-local pivot (identity excluded). */\nexport function symInstances(src: Placement, pivot: Pivot, sym: Symmetry | undefined): Placement[] {\n if (!sym) return [];\n const n = symClampN(sym.count, sym.axes);\n const mats = symInstanceMatrices(n, sym.axes);\n if (!mats.length) return [];\n const pp = new Vector3(pivot.position.x, pivot.position.y, pivot.position.z);\n const pq = new Matrix4().makeRotationFromQuaternion(new Quaternion(pivot.rotation.x, pivot.rotation.y, pivot.rotation.z, pivot.rotation.w));\n const pqInv = pq.clone().invert();\n const R = new Matrix4().makeRotationFromQuaternion(src.quaternion);\n return mats.map(L0 => {\n const L = pq.clone().multiply(L0).multiply(pqInv);\n const position = src.position.clone().sub(pp).applyMatrix4(L).add(pp);\n const M = L.clone().multiply(R);\n // A reflection has no quaternion; every primitive is symmetric about x = 0, so flip x instead.\n if (L.determinant() < 0) M.multiply(FLIP_X);\n return { position, quaternion: new Quaternion().setFromRotationMatrix(M), scale: src.scale.clone() };\n });\n}\n", "import type { StampShape } from \"@dreamy/api\";\nimport {\n BoxGeometry, BufferGeometry, ConeGeometry, CylinderGeometry, ExtrudeGeometry, Float32BufferAttribute, LatheGeometry, OctahedronGeometry, Shape,\n SphereGeometry, TorusGeometry, Vector2,\n} from \"three\";\n\n/** Ghost preview geometry per shape, modelled at 1.8 units (the POC's getGeometryForType); scale = size / 1.8. */\nexport function ghostGeometry(shape: StampShape): BufferGeometry {\n switch (shape) {\n case \"sphere\": return new SphereGeometry(1.1, 32, 32);\n case \"cylinder\": return new CylinderGeometry(0.9, 0.9, 2.2, 32);\n case \"torus\": return new TorusGeometry(0.9, 0.35, 16, 40).rotateX(Math.PI / 2);\n case \"cone\": return new ConeGeometry(0.9, 1.8, 32);\n case \"pyramid\": return new ConeGeometry(0.9 * Math.SQRT2, 1.8, 4).rotateY(Math.PI / 4);\n case \"prism\": {\n const sh = new Shape();\n sh.moveTo(-0.9, -0.9); sh.lineTo(0.9, -0.9); sh.lineTo(0, 0.9); sh.closePath();\n return new ExtrudeGeometry(sh, { depth: 1.8, bevelEnabled: false }).translate(0, 0, -0.9);\n }\n case \"octahedron\": return new OctahedronGeometry(0.9);\n case \"capsule\": {\n const pts: Vector2[] = [];\n for (let i = 0; i <= 12; i++) { const a = -Math.PI / 2 + (i / 12) * (Math.PI / 2); pts.push(new Vector2(0.9 * Math.cos(a), -0.45 + 0.45 * Math.sin(a))); }\n for (let i = 0; i <= 12; i++) { const a = (i / 12) * (Math.PI / 2); pts.push(new Vector2(0.9 * Math.cos(a), 0.45 + 0.45 * Math.sin(a))); }\n return new LatheGeometry(pts, 32);\n }\n case \"dome\": return new SphereGeometry(0.9, 32, 16, 0, Math.PI * 2, 0, Math.PI / 2).translate(0, -0.9, 0);\n default: return new BoxGeometry(1.8, 1.8, 1.8);\n }\n}\n\n/** Minimal line set per shape in the stamp's unit space (matches the SDF sizes): the selected shape's wireframe. */\nexport function stampWireGeometry(shape: StampShape): BufferGeometry {\n const pts: number[] = [];\n const TAU = Math.PI * 2;\n type P = readonly [number, number, number];\n const line = (a: P, b: P) => pts.push(a[0], a[1], a[2], b[0], b[1], b[2]);\n const loop = (n: number, fn: (t: number) => P) => { let prev = fn(0); for (let i = 1; i <= n; i++) { const cur = fn(i / n); line(prev, cur); prev = cur; } };\n const c = Math.cos, s = Math.sin;\n if (shape === \"sphere\") {\n loop(40, t => [0.5 * c(t * TAU), 0.5 * s(t * TAU), 0]);\n loop(40, t => [0, 0.5 * c(t * TAU), 0.5 * s(t * TAU)]);\n loop(40, t => [0.5 * c(t * TAU), 0, 0.5 * s(t * TAU)]);\n } else if (shape === \"cylinder\") {\n loop(40, t => [0.5 * c(t * TAU), 0.5, 0.5 * s(t * TAU)]);\n loop(40, t => [0.5 * c(t * TAU), -0.5, 0.5 * s(t * TAU)]);\n for (let k = 0; k < 4; k++) { const a = (k * TAU) / 4; line([0.5 * c(a), 0.5, 0.5 * s(a)], [0.5 * c(a), -0.5, 0.5 * s(a)]); }\n } else if (shape === \"torus\") {\n const R = 0.4, r = 0.15;\n loop(40, t => [(R + r) * c(t * TAU), 0, (R + r) * s(t * TAU)]);\n loop(40, t => [(R - r) * c(t * TAU), 0, (R - r) * s(t * TAU)]);\n for (let k = 0; k < 4; k++) { const a = (k * TAU) / 4; loop(20, t => { const g = t * TAU, rad = R + r * c(g); return [rad * c(a), r * s(g), rad * s(a)]; }); }\n } else if (shape === \"cone\") {\n loop(40, t => [0.5 * c(t * TAU), -0.5, 0.5 * s(t * TAU)]);\n for (let k = 0; k < 4; k++) { const a = (k * TAU) / 4; line([0, 0.5, 0], [0.5 * c(a), -0.5, 0.5 * s(a)]); }\n } else if (shape === \"pyramid\") {\n const b: P[] = [[-0.5, -0.5, -0.5], [0.5, -0.5, -0.5], [0.5, -0.5, 0.5], [-0.5, -0.5, 0.5]];\n b.forEach((p, i) => { line(p, b[(i + 1) % 4] as P); line(p, [0, 0.5, 0]); });\n } else if (shape === \"prism\") {\n const tri: [number, number][] = [[-0.5, -0.5], [0.5, -0.5], [0, 0.5]];\n tri.forEach((p, i) => {\n const n = tri[(i + 1) % 3] as [number, number];\n line([p[0], p[1], -0.5], [n[0], n[1], -0.5]); line([p[0], p[1], 0.5], [n[0], n[1], 0.5]); line([p[0], p[1], -0.5], [p[0], p[1], 0.5]);\n });\n } else if (shape === \"octahedron\") {\n const v: P[] = [[0.5, 0, 0], [-0.5, 0, 0], [0, 0.5, 0], [0, -0.5, 0], [0, 0, 0.5], [0, 0, -0.5]];\n for (let i = 0; i < 6; i++) for (let j = i + 1; j < 6; j++) if (i >> 1 !== j >> 1) line(v[i] as P, v[j] as P);\n } else if (shape === \"capsule\") {\n loop(40, t => [0.5 * c(t * TAU), 0.25, 0.5 * s(t * TAU)]);\n loop(40, t => [0.5 * c(t * TAU), -0.25, 0.5 * s(t * TAU)]);\n for (let k = 0; k < 4; k++) { const a = (k * TAU) / 4; line([0.5 * c(a), 0.25, 0.5 * s(a)], [0.5 * c(a), -0.25, 0.5 * s(a)]); }\n [0, 1].forEach(ax => {\n loop(20, t => { const a = t * Math.PI, r = 0.5 * c(a), y = 0.25 + 0.25 * s(a); return ax ? [0, y, r] : [r, y, 0]; });\n loop(20, t => { const a = t * Math.PI, r = 0.5 * c(a), y = -0.25 - 0.25 * s(a); return ax ? [0, y, r] : [r, y, 0]; });\n });\n } else if (shape === \"dome\") {\n loop(40, t => [0.5 * c(t * TAU), -0.5, 0.5 * s(t * TAU)]);\n [0, 1].forEach(ax => loop(20, t => { const a = t * Math.PI, r = 0.5 * c(a), y = -0.5 + 0.5 * s(a); return ax ? [0, y, r] : [r, y, 0]; }));\n } else {\n const h = 0.5, cs: P[] = [];\n for (let i = 0; i < 8; i++) cs.push([i & 1 ? h : -h, i & 2 ? h : -h, i & 4 ? h : -h]);\n [[0, 1], [2, 3], [4, 5], [6, 7], [0, 2], [1, 3], [4, 6], [5, 7], [0, 4], [1, 5], [2, 6], [3, 7]].forEach(([a, b]) => line(cs[a as number] as P, cs[b as number] as P));\n }\n const g = new BufferGeometry();\n g.setAttribute(\"position\", new Float32BufferAttribute(pts, 3));\n return g;\n}\n", "import type { StampMode, StampShape } from \"@dreamy/api\";\nimport { Box3, BufferGeometry, Group, LineBasicMaterial, LineSegments, Quaternion, Vector3 } from \"three\";\nimport { SYM_MAX_INSTANCES, symInstances } from \"../math/symmetry.js\";\nimport { stampWireGeometry } from \"./ghost-geometry.js\";\nimport { scopeOf, type InteractionContext } from \"./interaction-context.js\";\n\nconst MODE_COLORS: Record<StampMode, number> = { add: 0x22c55e, subtract: 0xef4444, intersect: 0x3b82f6, paint: 0xec4899 };\n\n/**\n * Sculpt-mode selection overlays: the selected shape's wireframe (yellow) with dimmed copies of its kaleidoscope\n * instances, or a box around a locked smear group (pink) / an area-selected set (blue).\n */\nexport class StampWires {\n private readonly space = new Group();\n private readonly wire: LineSegments;\n private readonly box: LineSegments;\n private readonly instMat = new LineBasicMaterial({ color: 0xfacc15, depthTest: false, transparent: true, opacity: 0.35, fog: false });\n private readonly inst: LineSegments[] = [];\n private readonly geos = new Map<StampShape, BufferGeometry>();\n\n constructor(private readonly ctx: InteractionContext) {\n const mat = (c: number) => new LineBasicMaterial({ color: c, depthTest: false, transparent: true, opacity: 0.95, fog: false });\n this.wire = new LineSegments(new BufferGeometry(), mat(0xfacc15));\n this.box = new LineSegments(stampWireGeometry(\"cube\"), mat(0xec4899));\n for (const l of [this.wire, this.box]) { l.renderOrder = 999; l.frustumCulled = false; this.space.add(l); }\n for (let i = 0; i < SYM_MAX_INSTANCES - 1; i++) {\n const l = new LineSegments(new BufferGeometry(), this.instMat);\n l.renderOrder = 998; l.frustumCulled = false; l.visible = false;\n this.space.add(l); this.inst.push(l);\n }\n this.space.matrixAutoUpdate = false;\n ctx.stage.ui.add(this.space);\n }\n\n private geo(shape: StampShape): BufferGeometry {\n let g = this.geos.get(shape);\n if (!g) { g = stampWireGeometry(shape); this.geos.set(shape, g); }\n return g;\n }\n\n update(): void {\n const ctx = this.ctx, scope = scopeOf(ctx);\n const v = scope && ctx.views.sculptView(scope), sc = v?.shown;\n const ids = ctx.session().selection.stampIds;\n const stamps = sc ? sc.stamps.filter(s => ids.includes(s.id)) : [];\n this.space.visible = !!v && stamps.length > 0 && !ctx.locked();\n this.inst.forEach(l => { l.visible = false; });\n if (!v || !sc || !this.space.visible) return;\n v.group.updateWorldMatrix(true, false);\n this.space.matrix.copy(v.group.matrixWorld);\n this.space.matrixWorldNeedsUpdate = true;\n const one = stamps.length === 1 ? stamps[0] : undefined;\n this.wire.visible = !!one;\n this.box.visible = !one;\n if (one) {\n this.wire.geometry = this.geo(one.shape);\n this.wire.position.set(one.position.x, one.position.y, one.position.z);\n this.wire.quaternion.set(one.rotation.x, one.rotation.y, one.rotation.z, one.rotation.w);\n this.wire.scale.set(one.scale.x, one.scale.y, one.scale.z);\n const g = one.smearGroupId !== undefined ? sc.smearGroups.find(x => x.id === one.smearGroupId) : undefined;\n const mode = g?.mode ?? one.mode;\n const sym = g ? g.symmetry : one.symmetry;\n this.instMat.color.setHex(MODE_COLORS[mode]);\n if (!scope || \"boneId\" in scope) return; // symmetry belongs to standalone sculpts only\n const insts = symInstances({ position: this.wire.position.clone(), quaternion: this.wire.quaternion.clone(), scale: this.wire.scale.clone() }, sc.pivot, sym);\n insts.forEach((p, i) => {\n const l = this.inst[i];\n if (!l) return;\n l.geometry = this.wire.geometry;\n l.position.copy(p.position); l.quaternion.copy(p.quaternion); l.scale.copy(p.scale);\n l.visible = true;\n });\n return;\n }\n const box = new Box3();\n stamps.forEach(s => {\n const h = new Vector3(s.scale.x, s.scale.y, s.scale.z).multiplyScalar(0.5), p = new Vector3(s.position.x, s.position.y, s.position.z);\n box.expandByPoint(p.clone().sub(h)); box.expandByPoint(p.clone().add(h));\n });\n const gid = stamps[0]?.smearGroupId;\n const wholeGroup = gid !== undefined && stamps.every(s => s.smearGroupId === gid) && sc.stamps.filter(s => s.smearGroupId === gid).length === stamps.length;\n (this.box.material as LineBasicMaterial).color.setHex(wholeGroup ? 0xec4899 : 0x38bdf8);\n box.getCenter(this.box.position);\n this.box.quaternion.copy(new Quaternion());\n this.box.scale.copy(box.getSize(new Vector3()).max(new Vector3(0.3, 0.3, 0.3)));\n }\n\n dispose(): void {\n this.geos.forEach(g => g.dispose());\n this.box.geometry.dispose();\n this.space.removeFromParent();\n }\n}\n", "/**\n * Per-object distance LOD (the POC's lod.js): the voxel grid of each sculpt gets coarser the smaller it is on\n * screen. Runtime only, never saved. The target is 4 px per voxel (the POC used 8, which melted small details\n * such as spikes and claws off rig parts at an ordinary zoom).\n */\nexport const LOD_TARGET_PX = 4;\nexport const LOD_HYST = 0.25;\n\n/** Grid resolutions, finest first, from the base resolution (16\u201364, default 36 \u2192 36 / 24 / 16). */\nexport function lodLevels(base: number): readonly number[] {\n const r = Math.max(16, Math.min(64, Math.round(base) || 36));\n return [r, Math.max(16, Math.round(r * 0.67)), Math.max(12, Math.round(r * 0.44))];\n}\n\n/** On-screen size in pixels of an object of world size `size` at distance `dist` (perspective camera). */\nexport function projectedPx(size: number, dist: number, fovDeg: number, viewHeightPx: number): number {\n const pxPerUnit = (viewHeightPx * 0.5) / (Math.max(dist, 1e-3) * Math.tan((fovDeg * Math.PI) / 360));\n return size * pxPerUnit;\n}\n\n/**\n * Resolution the object should have: the coarsest level that still gives \u2264 LOD_TARGET_PX px per voxel, finer at once,\n * coarser only with 25 % slack (so orbiting doesn't flicker). Pinned objects (being edited) stay finest.\n */\nexport function lodWanted(levels: readonly number[], px: number | null, current: number | undefined, pinned: boolean): number {\n const finest = levels[0] ?? 36;\n if (pinned || px === null) return finest;\n const need = px / LOD_TARGET_PX + 1;\n let ideal = finest;\n for (let i = levels.length - 1; i >= 0; i--) {\n const l = levels[i] as number;\n if (l >= need) { ideal = l; break; }\n }\n if (!current || ideal >= current) return ideal;\n return need * (1 + LOD_HYST) <= ideal ? ideal : current;\n}\n", "/** Uniforms every sculpt / wing material shares, owned by one viewport instance. */\nexport type GlobalUniforms = {\n readonly uTime: { value: number };\n /** 1 while the render pipeline draws the world offscreen: materials write gloss / kind into alpha. */\n readonly uPixelOut: { value: number };\n /** Distance at which thin dark decal lines are boosted. */\n readonly uDecalBoostDist: { value: number };\n};\n\nexport const createGlobalUniforms = (): GlobalUniforms => ({\n uTime: { value: 0 },\n uPixelOut: { value: 0 },\n uDecalBoostDist: { value: 15 },\n});\n", "import type { Evaluator, MeshRequest, MeshResult, Palette, Sculpt, SkinRequest, SkinResult } from \"@dreamy/api\";\n\ntype Pending = { seq: number; content: string; resolution: number };\n\n/**\n * Talks to the evaluator: one request per key (object, part or rig body), newest wins (results of older\n * requests are dropped), identical requests are skipped. The view keeps its last mesh until the new one lands.\n */\nexport class MeshDriver {\n private readonly last = new Map<string, Pending>();\n private seq = 0;\n private inFlight = 0;\n lastMs = 0;\n private disposed = false;\n\n constructor(private readonly evaluator: Evaluator) {}\n\n get busy(): number { return this.inFlight; }\n\n /** Requests a mesh unless the same content at the same resolution was already requested for this key. */\n mesh(key: string, sculpt: Sculpt, palette: Palette, resolution: number, content: string, done: (r: MeshResult) => void,\n view?: MeshRequest[\"view\"], viewSig = \"\"): void {\n content += \"|\" + viewSig;\n const prev = this.last.get(key);\n if (prev && prev.content === content && prev.resolution === resolution) return;\n const seq = ++this.seq;\n this.last.set(key, { seq, content, resolution });\n this.inFlight++;\n this.evaluator.mesh(view ? { key, sculpt, palette, resolution, view } : { key, sculpt, palette, resolution }).then(r => {\n if (this.disposed || this.last.get(key)?.seq !== seq) return;\n this.lastMs = r.ms;\n done(r);\n }, e => {\n if (!this.disposed && !isAbort(e)) console.warn(\"mesh failed\", key, e);\n }).finally(() => { this.inFlight--; });\n }\n\n /** Auto weights for a skinned body, newest wins like meshes. */\n skin(req: SkinRequest, done: (r: SkinResult) => void): void {\n const key = req.key;\n const seq = ++this.seq;\n this.last.set(key, { seq, content: \"\", resolution: 0 });\n this.inFlight++;\n this.evaluator.skinWeights(req).then(r => {\n if (!this.disposed && this.last.get(key)?.seq === seq) done(r);\n }, e => { if (!this.disposed && !isAbort(e)) console.warn(\"skin weights failed\", key, e); }).finally(() => { this.inFlight--; });\n }\n\n /** Forget a key (the object is gone): pending work is dropped. */\n forget(key: string): void {\n if (!this.last.delete(key)) return;\n this.evaluator.cancel(key);\n }\n\n /** Force the next request of a key through (e.g. after a resolution change). */\n invalidate(key: string): void { this.last.delete(key); }\n\n dispose(): void { this.disposed = true; this.last.clear(); }\n\n /** Drop pending results but stay usable (the viewport can be mounted again after dispose). */\n reset(): void { this.last.clear(); }\n}\n\n/** Superseded, cancelled and disposed jobs reject with an AbortError: expected, not a failure. */\nfunction isAbort(e: unknown): boolean {\n return typeof e === \"object\" && e !== null && (e as { name?: unknown }).name === \"AbortError\";\n}\n", "import type { Creation, Id, SceneObject, SculptTarget, Vec3 as Vec3Like } from \"@dreamy/api\";\nimport { Box3, Matrix4, Vector3, type BufferGeometry, type Group, type Object3D } from \"three\";\nimport { applyTransform } from \"../math/convert.js\";\nimport { createSkinUniforms } from \"../materials/skin.js\";\nimport { RigView } from \"./rig-view.js\";\nimport { SculptView } from \"./sculpt-view.js\";\nimport type { ViewContext } from \"./view-context.js\";\nimport { WingView } from \"./wing-view.js\";\n\nexport type ObjectView = { readonly object: SceneObject; readonly view: SculptView | RigView };\n\n/** What a picked mesh belongs to. */\nexport type MeshOwner = { readonly objectId: Id; readonly boneId?: Id; readonly view: SculptView | WingView };\n\nexport const targetKey = (t: SculptTarget): string => (\"boneId\" in t ? `${t.objectId}/${t.boneId}` : t.objectId);\n\n/**\n * Keeps one view per scene object in step with the creation (plus view-only objects: the stress test). Objects nest\n * like the creation's tree; rig parts and bodies live in their rig's group.\n */\nexport class SceneViews {\n readonly views = new Map<Id, ObjectView>();\n\n constructor(private readonly root: Group, private readonly ctx: ViewContext) {}\n\n /** `heldRigId`: the rig whose part / body is being sculpted shows its bind pose. */\n sync(creation: Creation, extra: readonly SceneObject[], heldRigId: Id | undefined): void {\n const all = [...creation.objects, ...extra];\n const seen = new Set<Id>();\n for (const o of all) {\n seen.add(o.id);\n let ov = this.views.get(o.id);\n if (ov && ov.object.kind !== o.kind) { ov.view.dispose(); this.views.delete(o.id); ov = undefined; }\n const view = ov?.view ?? (o.kind === \"sculpt\" ? new SculptView(o.id, this.ctx, createSkinUniforms(), { kind: \"none\" }) : new RigView(o.id, this.ctx));\n view.group.userData.objectId = o.id;\n applyTransform(view.group, o.transform);\n if (o.kind === \"sculpt\" && view instanceof SculptView) view.set(o.sculpt);\n else if (o.kind === \"rig\" && view instanceof RigView) {\n view.set(o.rig, o.rig.mode === \"pose\" && heldRigId !== o.id);\n for (const [boneId, p] of view.parts) Object.assign(p.group.userData, { objectId: o.id, boneId });\n if (view.body) view.body.group.userData.objectId = o.id;\n }\n this.views.set(o.id, { object: o, view });\n }\n for (const [id, ov] of this.views) if (!seen.has(id)) { ov.view.dispose(); this.views.delete(id); }\n // Parenting after every view exists\n for (const o of all) {\n const v = this.views.get(o.id)!.view;\n const parent = (o.parentId !== undefined && this.views.get(o.parentId)?.view.group) || this.root;\n if (v.group.parent !== parent) parent.add(v.group);\n }\n }\n\n /** Refresh everything against a new palette (looks, decals, meshes). */\n refreshPalette(): void {\n for (const v of this.allSculptViews()) { v.refresh(); v.applyDecals(v.shown?.decals ?? [], true); }\n }\n\n sculptView(t: SculptTarget): SculptView | undefined {\n const ov = this.views.get(t.objectId);\n if (!ov) return undefined;\n if (ov.view instanceof SculptView) return \"boneId\" in t ? undefined : ov.view;\n if (\"boneId\" in t) { const p = ov.view.parts.get(t.boneId); return p instanceof SculptView ? p : undefined; }\n return ov.view.body ?? undefined;\n }\n\n group(id: Id): Group | undefined { return this.views.get(id)?.view.group; }\n\n /** Union of an object's meshed sculpt bounds (its own sculpt, or a rig's body and sculpt parts), in object space. */\n contentBounds(id: Id): { center: Vec3Like; halfSize: Vec3Like } | undefined {\n const ov = this.views.get(id);\n if (!ov) return undefined;\n const v = ov.view;\n const sculpts = v instanceof SculptView ? [v] : [v.body, ...v.parts.values()].filter((p): p is SculptView => p instanceof SculptView);\n const box = new Box3();\n for (const s of sculpts) if (s.bounds) box.union(s.bounds);\n if (box.isEmpty()) return undefined;\n const c = box.getCenter(new Vector3()), h = box.getSize(new Vector3()).multiplyScalar(0.5);\n return { center: { x: c.x, y: c.y, z: c.z }, halfSize: { x: h.x, y: h.y, z: h.z } };\n }\n\n /**\n * Objects' bounds in world space as drawn: sculpts by their meshes, a rig's rigid parts and wings through their\n * bones' segment matrices (so a pose moves them), its skinned body by its bind bounds. Empty until something has\n * meshed.\n */\n worldBounds(ids: readonly Id[]): Box3 {\n const out = new Box3();\n const add = (box: Box3 | null, local: Matrix4 | null, world: Matrix4) => {\n if (!box || box.isEmpty()) return;\n const b = box.clone();\n if (local) b.applyMatrix4(local);\n out.union(b.applyMatrix4(world));\n };\n for (const id of ids) {\n const ov = this.views.get(id);\n if (!ov) continue;\n const v = ov.view;\n v.group.updateWorldMatrix(true, false);\n const world = v.group.matrixWorld;\n if (v instanceof SculptView) { add(v.bounds, null, world); continue; }\n const seg = v.skin.uSeg.value as Float32Array;\n const segment = (slot: number) => new Matrix4().fromArray(seg, slot * 16);\n if (v.body) add(v.body.bounds, null, world);\n for (const p of v.parts.values()) {\n if (p instanceof SculptView) add(p.bounds, p.rigidSlot !== undefined ? segment(p.rigidSlot) : null, world);\n else {\n p.mesh.geometry.computeBoundingBox();\n add(p.mesh.geometry.boundingBox, segment(p.segmentSlot), world);\n }\n }\n }\n return out;\n }\n\n /** Up to `max` points of objects' drawn surfaces in world space (mesh vertices, posed as the bounds are). */\n worldPoints(ids: readonly Id[], max = 24000): Vector3[] {\n const meshes: { geo: BufferGeometry; local: Matrix4 | null; world: Matrix4 }[] = [];\n for (const id of ids) {\n const ov = this.views.get(id);\n if (!ov) continue;\n const v = ov.view;\n v.group.updateWorldMatrix(true, false);\n const world = v.group.matrixWorld;\n if (v instanceof SculptView) { meshes.push({ geo: v.mesh.geometry, local: null, world }); continue; }\n const seg = v.skin.uSeg.value as Float32Array;\n if (v.body) meshes.push({ geo: v.body.mesh.geometry, local: null, world });\n for (const p of v.parts.values()) {\n const slot = p instanceof SculptView ? p.rigidSlot : p.segmentSlot;\n meshes.push({ geo: p.mesh.geometry, local: slot !== undefined ? new Matrix4().fromArray(seg, slot * 16) : null, world });\n }\n }\n const total = meshes.reduce((n, m) => n + (m.geo.getAttribute(\"position\")?.count ?? 0), 0);\n const stride = Math.max(1, Math.ceil(total / max));\n const out: Vector3[] = [];\n for (const { geo, local, world } of meshes) {\n const pos = geo.getAttribute(\"position\");\n if (!pos) continue;\n const m = local ? world.clone().multiply(local) : world;\n for (let i = 0; i < pos.count; i += stride) out.push(new Vector3(pos.getX(i), pos.getY(i), pos.getZ(i)).applyMatrix4(m));\n }\n return out;\n }\n\n allSculptViews(): SculptView[] {\n const out: SculptView[] = [];\n for (const { view } of this.views.values()) {\n if (view instanceof SculptView) out.push(view);\n else out.push(...view.sculptViews());\n }\n return out;\n }\n\n allWingViews(): WingView[] {\n const out: WingView[] = [];\n for (const { view } of this.views.values()) if (view instanceof RigView) for (const p of view.parts.values()) if (p instanceof WingView) out.push(p);\n return out;\n }\n\n /** Meshes that can be clicked (optionally only those of some objects). */\n pickables(only?: ReadonlySet<Id>): Object3D[] {\n const out: Object3D[] = [];\n for (const [id, { view }] of this.views) {\n if (id.startsWith(\"stress:\") || (only && !only.has(id))) continue;\n if (view instanceof SculptView) { if (view.mesh.visible) out.push(view.mesh); continue; }\n for (const s of view.sculptViews()) if (s.mesh.visible) out.push(s.mesh);\n for (const p of view.parts.values()) if (p instanceof WingView) out.push(p.mesh);\n }\n return out;\n }\n\n ownerOf(mesh: Object3D): MeshOwner | undefined {\n const view = mesh.userData.view as SculptView | WingView | undefined;\n if (!view) return undefined;\n const ud = view.group.userData as { objectId?: Id; boneId?: Id };\n if (ud.objectId === undefined) return undefined;\n return ud.boneId !== undefined ? { objectId: ud.objectId, boneId: ud.boneId, view } : { objectId: ud.objectId, view };\n }\n\n triangles(): number {\n let n = 0;\n for (const v of this.allSculptViews()) n += v.triangles();\n for (const w of this.allWingViews()) n += w.triangles();\n return n;\n }\n\n dispose(): void {\n for (const { view } of this.views.values()) view.dispose();\n this.views.clear();\n }\n}\n", "import type { Id } from \"@dreamy/api\";\nimport { Box3, BufferAttribute, BufferGeometry, Color, Group, LineBasicMaterial, LineSegments, Points, PointsMaterial, Sphere, Vector3, type Matrix4 } from \"three\";\nimport { MAX_BONES, type RigMatrices } from \"../math/skeleton-math.js\";\nimport type { Bone } from \"@dreamy/api\";\n\nconst COL_RIG = new Color(\"#34d399\"), COL_POSE = new Color(\"#60a5fa\"), COL_SEL = new Color(\"#fde047\");\n\n/** Bone overlay of one rig (the POC's skeleton viz): segments parent \u2192 child and a dot per joint, drawn on top. */\nexport class BoneViz {\n readonly root = new Group();\n private readonly line: LineSegments;\n private readonly points: Points;\n\n constructor() {\n const mk = <T extends LineSegments | Points>(make: (g: BufferGeometry) => T, n: number): T => {\n const g = new BufferGeometry();\n g.setAttribute(\"position\", new BufferAttribute(new Float32Array(n * 3), 3));\n g.setAttribute(\"color\", new BufferAttribute(new Float32Array(n * 3), 3));\n g.boundingBox = new Box3(new Vector3(), new Vector3());\n g.boundingSphere = new Sphere(new Vector3(), 0);\n const o = make(g);\n o.frustumCulled = false;\n o.renderOrder = 998;\n this.root.add(o);\n return o;\n };\n this.line = mk(g => new LineSegments(g, new LineBasicMaterial({ vertexColors: true, depthTest: false, transparent: true, fog: false })), MAX_BONES * 2);\n this.points = mk(g => new Points(g, new PointsMaterial({ size: 11, sizeAttenuation: false, vertexColors: true, depthTest: false, transparent: true, fog: false })), MAX_BONES);\n this.root.matrixAutoUpdate = false;\n }\n\n update(rigWorld: Matrix4, bones: readonly Bone[], m: RigMatrices, rigMode: boolean, selected: Id | undefined): void {\n this.root.matrix.copy(rigWorld);\n this.root.matrixWorldNeedsUpdate = true;\n const lp = this.line.geometry.attributes.position as BufferAttribute, lc = this.line.geometry.attributes.color as BufferAttribute;\n const pp = this.points.geometry.attributes.position as BufferAttribute, pc = this.points.geometry.attributes.color as BufferAttribute;\n const at = (i: number) => new Vector3().setFromMatrixPosition(m.shownGlobal[i] as Matrix4);\n let seg = 0, n = 0;\n bones.slice(0, MAX_BONES).forEach((b, i) => {\n const c = b.id === selected ? COL_SEL : rigMode ? COL_RIG : COL_POSE;\n const p = at(i);\n pp.setXYZ(i, p.x, p.y, p.z); pc.setXYZ(i, c.r, c.g, c.b); n++;\n const pi = b.parentId !== undefined ? m.index.get(b.parentId) : undefined;\n if (pi !== undefined) {\n const q = at(pi);\n lp.setXYZ(seg * 2, q.x, q.y, q.z); lp.setXYZ(seg * 2 + 1, p.x, p.y, p.z);\n lc.setXYZ(seg * 2, c.r, c.g, c.b); lc.setXYZ(seg * 2 + 1, c.r, c.g, c.b);\n seg++;\n }\n });\n this.line.geometry.setDrawRange(0, seg * 2);\n this.points.geometry.setDrawRange(0, n);\n lp.needsUpdate = lc.needsUpdate = pp.needsUpdate = pc.needsUpdate = true;\n }\n\n dispose(): void {\n this.line.geometry.dispose(); (this.line.material as LineBasicMaterial).dispose();\n this.points.geometry.dispose(); (this.points.material as PointsMaterial).dispose();\n this.root.removeFromParent();\n }\n}\n", "import { Vector3 } from \"three\";\nimport type { Stage } from \"./stage.js\";\n\n/** WASD / arrow keys slide the camera and its orbit target over the floor plane (12 units / s). */\nexport function moveCameraOnFloor(stage: Stage, keys: ReadonlySet<string>, delta: number): void {\n const { camera, orbit } = stage;\n const speed = 12 * delta;\n const forward = new Vector3();\n camera.getWorldDirection(forward);\n forward.y = 0;\n if (forward.lengthSq() < 1e-8) return;\n forward.normalize();\n const right = new Vector3().crossVectors(forward, new Vector3(0, 1, 0)).normalize();\n const move = new Vector3();\n if (keys.has(\"KeyW\") || keys.has(\"ArrowUp\")) move.addScaledVector(forward, speed);\n if (keys.has(\"KeyS\") || keys.has(\"ArrowDown\")) move.addScaledVector(forward, -speed);\n if (keys.has(\"KeyD\") || keys.has(\"ArrowRight\")) move.addScaledVector(right, speed);\n if (keys.has(\"KeyA\") || keys.has(\"ArrowLeft\")) move.addScaledVector(right, -speed);\n if (move.lengthSq() > 0) { camera.position.add(move); orbit.target.add(move); }\n}\n\n/** Double-click focus: eases the orbit target to a point in 280 ms, keeping the view direction and distance. */\nexport class CameraTween {\n private tween: { from: Vector3; to: Vector3; start: number } | null = null;\n\n focus(stage: Stage, to: Vector3): void {\n this.tween = { from: stage.orbit.target.clone(), to: to.clone(), start: performance.now() };\n }\n\n update(stage: Stage): void {\n const t = this.tween;\n if (!t) return;\n const k = Math.min(1, (performance.now() - t.start) / 280);\n const e = k * k * (3 - 2 * k);\n const cur = t.from.clone().lerp(t.to, e);\n stage.camera.position.add(cur.clone().sub(stage.orbit.target));\n stage.orbit.target.copy(cur);\n if (k >= 1) this.tween = null;\n }\n}\n", "import { Vector3 } from \"three\";\nimport { DEFAULT_SUN_POS, type Stage } from \"./stage.js\";\n\n/** Camera sun: the sun sits top-front-left of the view and aims at the orbit target; off = the fixed world sun. */\nexport function updateCameraSun(stage: Stage, on: boolean): void {\n const { sun, camera, orbit } = stage;\n if (!on) {\n if (!sun.position.equals(DEFAULT_SUN_POS)) {\n sun.position.copy(DEFAULT_SUN_POS);\n sun.target.position.set(0, 0, 0);\n sun.target.updateMatrixWorld();\n }\n return;\n }\n const target = orbit.target;\n const dist = Math.max(camera.position.distanceTo(target), 8);\n const right = new Vector3(1, 0, 0).applyQuaternion(camera.quaternion);\n const up = new Vector3(0, 1, 0).applyQuaternion(camera.quaternion);\n const fwd = new Vector3(0, 0, -1).applyQuaternion(camera.quaternion);\n sun.position.copy(camera.position).addScaledVector(right, -dist * 0.45).addScaledVector(up, dist * 0.75).addScaledVector(fwd, dist * 0.15);\n sun.target.position.copy(target);\n sun.target.updateMatrixWorld();\n}\n", "import {\n ACESFilmicToneMapping, AmbientLight, Color, DirectionalLight, FogExp2, Group, HemisphereLight, Mesh, MeshStandardMaterial,\n PCFSoftShadowMap, PerspectiveCamera, Scene, SphereGeometry, SRGBColorSpace, Vector3, WebGLRenderer, type Texture,\n} from \"three\";\nimport { OrbitControls } from \"three/examples/jsm/controls/OrbitControls.js\";\nimport { rawColor } from \"../math/colors.js\";\nimport { createSculptEnvironment } from \"./environment.js\";\nimport type { GlobalUniforms } from \"../materials/global-uniforms.js\";\n\nexport const SKY = 0xaecbf7;\nexport const SKY_ISOLATED = 0x8894a6;\nexport const GROUND = 0x86c77d;\nexport const GROUND_ISOLATED = 0x6b7280;\nexport const DEFAULT_SUN_POS = new Vector3(16, 26, -12);\nexport const LIGHT = { ambient: 0.3, hemisphere: 0.25, sun: 0.8, exposure: 1.0 } as const;\nexport const DEFAULT_CAMERA = new Vector3(9, 7, 13);\nexport const DEFAULT_TARGET = new Vector3(0, 1.5, 0);\n\n/**\n * The POC's scene.js init. three r186 lights are physically based, so the POC's (legacy) intensities are\n * multiplied by \u03C0; light / ground / fog colors are raw hex / 255 like the POC; the background is the exact hex.\n */\nexport type Stage = {\n readonly renderer: WebGLRenderer;\n readonly scene: Scene;\n readonly camera: PerspectiveCamera;\n readonly orbit: OrbitControls;\n /** What the picture is made of: objects, ground, lights, the play ball. */\n readonly world: Group;\n /** Objects of the creation (the views' roots). */\n readonly objects: Group;\n /** Editor helpers drawn on top: gizmos, ghosts, wires, bone dots. */\n readonly ui: Group;\n readonly sun: DirectionalLight;\n readonly ground: Mesh<SphereGeometry, MeshStandardMaterial>;\n readonly env: Texture;\n setIsolation(on: boolean): void;\n dispose(): void;\n};\n\nexport function createStage(host: HTMLElement, globals: GlobalUniforms): Stage {\n const renderer = new WebGLRenderer({ antialias: true, alpha: false, powerPreference: \"high-performance\" });\n renderer.setPixelRatio(Math.min(window.devicePixelRatio, 1.5));\n renderer.setSize(host.clientWidth || 1, host.clientHeight || 1);\n renderer.shadowMap.enabled = true;\n renderer.shadowMap.type = PCFSoftShadowMap;\n renderer.outputColorSpace = SRGBColorSpace;\n renderer.toneMapping = ACESFilmicToneMapping;\n renderer.toneMappingExposure = LIGHT.exposure;\n renderer.domElement.style.display = \"block\";\n renderer.domElement.style.touchAction = \"none\";\n host.appendChild(renderer.domElement);\n\n const scene = new Scene();\n scene.background = new Color(SKY);\n scene.fog = new FogExp2(SKY, 0.012); // three converts the fog color to the output space: the exact hex, like the POC\n\n const camera = new PerspectiveCamera(50, (host.clientWidth || 1) / (host.clientHeight || 1), 0.1, 1000);\n camera.position.copy(DEFAULT_CAMERA);\n\n const env = createSculptEnvironment(renderer);\n const world = new Group(), objects = new Group(), ui = new Group();\n world.add(objects);\n scene.add(world, ui);\n\n // Light budget: a sun-facing surface gets ~1.3x its albedo and a shaded one ~0.55x, so after tone mapping a\n // body reads as its palette swatch (the POC's 0.45 / 0.4 / 1.3 summed to ~2.2x and washed colors to white)\n world.add(new AmbientLight(rawColor(0xffffff), LIGHT.ambient * Math.PI));\n world.add(new HemisphereLight(rawColor(0xffffff), rawColor(0x44aa44), LIGHT.hemisphere * Math.PI));\n const sun = new DirectionalLight(rawColor(0xfffaee), LIGHT.sun * Math.PI);\n sun.position.copy(DEFAULT_SUN_POS);\n sun.castShadow = true;\n sun.shadow.mapSize.set(2048, 2048);\n sun.shadow.bias = -0.0005;\n sun.shadow.normalBias = 0.05;\n Object.assign(sun.shadow.camera, { left: -40, right: 40, top: 40, bottom: -40, far: 120 });\n sun.shadow.camera.updateProjectionMatrix();\n world.add(sun, sun.target);\n\n // alpha 0.25 marks \"ground\" for the offscreen renderer (never the source of an outline); on screen it stays opaque\n const ground = new Mesh(new SphereGeometry(300, 64, 64), new MeshStandardMaterial({ color: rawColor(GROUND), roughness: 0.9, metalness: 0 }));\n ground.material.onBeforeCompile = s => {\n s.uniforms.uPixelOut = globals.uPixelOut;\n s.fragmentShader = \"uniform float uPixelOut;\\n\" + s.fragmentShader.replace(\"#include <dithering_fragment>\", \"#include <dithering_fragment>\\n if (uPixelOut > 0.5) gl_FragColor.a = 0.25;\");\n };\n ground.position.y = -300;\n ground.receiveShadow = true;\n ground.userData.isGround = true;\n world.add(ground);\n\n const orbit = new OrbitControls(camera, renderer.domElement);\n orbit.enableDamping = true;\n orbit.dampingFactor = 0.05;\n orbit.target.copy(DEFAULT_TARGET);\n\n const stage: Stage = {\n renderer, scene, camera, orbit, world, objects, ui, sun, ground, env,\n setIsolation(on) {\n (scene.background as Color).setHex(on ? SKY_ISOLATED : SKY);\n (scene.fog as FogExp2).color.setHex(on ? SKY_ISOLATED : SKY);\n rawColor(on ? GROUND_ISOLATED : GROUND, ground.material.color);\n },\n dispose() {\n orbit.dispose();\n env.dispose();\n ground.geometry.dispose(); ground.material.dispose();\n renderer.dispose();\n renderer.domElement.remove();\n },\n };\n return stage;\n}\n", "import { BackSide, Mesh, PMREMGenerator, Scene, ShaderMaterial, SphereGeometry, type Texture, type WebGLRenderer } from \"three\";\n\n/** One-off PMREM environment for the sculpt materials: gradient sky over a green ground (the POC's scene.js). */\nexport function createSculptEnvironment(renderer: WebGLRenderer): Texture {\n const pm = new PMREMGenerator(renderer);\n const envScene = new Scene();\n const geo = new SphereGeometry(10, 32, 16);\n const mat = new ShaderMaterial({\n side: BackSide,\n vertexShader: \"varying vec3 vP; void main(){ vP = position; gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); }\",\n fragmentShader: \"varying vec3 vP; void main(){ float h = normalize(vP).y * 0.5 + 0.5; vec3 c = mix(vec3(0.30, 0.42, 0.28), vec3(0.78, 0.88, 1.0), smoothstep(0.38, 0.75, h)); gl_FragColor = linearToOutputTexel(vec4(c, 1.0)); }\",\n });\n envScene.add(new Mesh(geo, mat));\n const tex = pm.fromScene(envScene).texture;\n pm.dispose(); geo.dispose(); mat.dispose();\n return tex;\n}\n", "import { Mesh, MeshStandardMaterial, SphereGeometry, Vector3 } from \"three\";\nimport { rawColor } from \"../math/colors.js\";\nimport type { Stage } from \"./stage.js\";\n\n/** Play mode: a ball the player rolls with WASD and Space over the floor; the camera follows. Writes nothing. */\nexport class PlayMode {\n private ball: Mesh<SphereGeometry, MeshStandardMaterial> | null = null;\n private readonly velocity = new Vector3();\n\n get active(): boolean { return !!this.ball; }\n\n set(stage: Stage, on: boolean): void {\n if (on === this.active) return;\n if (on) {\n this.ball = new Mesh(new SphereGeometry(0.7, 32, 32), new MeshStandardMaterial({ color: rawColor(0xef4444), roughness: 0.3 }));\n this.ball.position.set(0, 4, 0);\n this.ball.castShadow = true;\n this.velocity.set(0, 0, 0);\n stage.world.add(this.ball);\n } else if (this.ball) {\n this.ball.removeFromParent();\n this.ball.geometry.dispose(); this.ball.material.dispose();\n this.ball = null;\n }\n }\n\n update(stage: Stage, keys: ReadonlySet<string>): void {\n const b = this.ball;\n if (!b) return;\n const speed = 0.02, v = this.velocity;\n if (keys.has(\"KeyW\")) v.z -= speed;\n if (keys.has(\"KeyS\")) v.z += speed;\n if (keys.has(\"KeyA\")) v.x -= speed;\n if (keys.has(\"KeyD\")) v.x += speed;\n v.y -= 0.012;\n b.position.add(v);\n if (b.position.y <= 0.7) {\n b.position.y = 0.7;\n v.y = 0;\n if (keys.has(\"Space\")) v.y = 0.28;\n }\n v.x *= 0.94; v.z *= 0.94;\n stage.camera.position.x = b.position.x + 8;\n stage.camera.position.z = b.position.z + 11;\n stage.orbit.target.copy(b.position);\n }\n}\n", "import type { Palette, ViewPreferences } from \"@dreamy/api\";\nimport {\n Color, DepthTexture, HalfFloatType, LinearFilter, Mesh, NearestFilter, NoToneMapping, Object3D, OrthographicCamera,\n PlaneGeometry, RGBAFormat, Scene, ShaderMaterial, UnsignedByteType, UnsignedIntType, Vector2, Vector3, WebGLRenderTarget,\n} from \"three\";\nimport { FIXED_COLORS, linearVec, PALETTE_ORDER, paletteKey, rawVec } from \"../math/colors.js\";\nimport { paletteVariants } from \"../math/pixel-palette.js\";\nimport type { GlobalUniforms } from \"../materials/global-uniforms.js\";\nimport { RESOLVE_FRAG } from \"./resolve-frag.js\";\nimport {\n PIXEL_DITHER, PIXEL_EDGE, PIXEL_GLOSS_WHITE, PIXEL_LIGHT_ABOVE, PIXEL_MAX_PALETTE, PIXEL_SHADE_BELOW, RENDER_SMOOTH_RES, renderFitSize,\n} from \"./render-settings.js\";\nimport { SKY, type Stage } from \"./stage.js\";\n\n/**\n * Normal rendering at screen resolution with nothing special on is a plain render. Anything else (the POC's\n * renderPost): the world into an offscreen target of the chosen size (linear, with depth and a \"kind\" in alpha),\n * a full-screen resolve to the canvas, then the editor helpers on top at screen resolution.\n */\nexport class RenderPipeline {\n private target: WebGLRenderTarget | null = null;\n private targetKey = \"\";\n private readonly quadMat: ShaderMaterial;\n private readonly quadScene = new Scene();\n private readonly quadCam = new OrthographicCamera(-1, 1, 1, -1, 0, 1);\n private paletteKey = \"\";\n private readonly size = new Vector2();\n /** Sprite bakes: the world pass and the role target, kept apart from the view's target. */\n private bake: { readonly size: number; readonly world: WebGLRenderTarget; readonly roles: WebGLRenderTarget } | null = null;\n\n constructor(private readonly stage: Stage, private readonly globals: GlobalUniforms) {\n const v3 = () => Array.from({ length: PIXEL_MAX_PALETTE }, () => new Vector3());\n this.quadMat = new ShaderMaterial({\n uniforms: {\n tColor: { value: null }, tDepth: { value: null }, uSize: { value: new Vector2(1, 1) },\n uNear: { value: 0.1 }, uFar: { value: 1000 }, uExposure: { value: 1 }, uDpr: { value: 1 },\n uPixel: { value: 0 }, uChecker: { value: 0 }, uBg: { value: new Vector3() },\n uPalCount: { value: 0 }, uPalRaw: { value: v3() }, uPalBase: { value: v3() }, uPalLight: { value: v3() }, uPalShade: { value: v3() },\n uTeeth: { value: new Vector3() }, uInk: { value: new Vector3() },\n uEdge: { value: PIXEL_EDGE }, uTone1: { value: Math.log2(PIXEL_SHADE_BELOW) }, uTone2: { value: Math.log2(PIXEL_LIGHT_ABOVE) },\n uDither: { value: PIXEL_DITHER }, uGlossWhite: { value: PIXEL_GLOSS_WHITE }, uIndexOut: { value: 0 },\n },\n vertexShader: \"varying vec2 vUv; void main() { vUv = uv; gl_Position = vec4(position.xy, 0.0, 1.0); }\",\n fragmentShader: RESOLVE_FRAG,\n depthTest: false, depthWrite: false,\n });\n const quad = new Mesh(new PlaneGeometry(2, 2), this.quadMat);\n quad.frustumCulled = false;\n this.quadScene.add(quad);\n }\n\n render(prefs: ViewPreferences, palette: Palette, keep: readonly Object3D[] | null, isolated: boolean): void {\n const { renderer, scene, camera } = this.stage;\n const selOnly = prefs.renderSelectedOnly && !!keep && keep.length > 0;\n if (prefs.renderMode === \"normal\" && prefs.renderResolution === \"screen\" && !selOnly) {\n renderer.render(scene, camera);\n return;\n }\n const pixel = prefs.renderMode === \"pixel\";\n const smooth = !pixel && RENDER_SMOOTH_RES.includes(prefs.renderResolution);\n renderer.getDrawingBufferSize(this.size);\n const [w, h] = renderFitSize(prefs.renderResolution, this.size.x, this.size.y);\n const rt = this.ensureTarget(w, h, pixel, smooth);\n\n const prev = {\n tm: renderer.toneMapping, bg: scene.background, fog: scene.fog, autoClear: renderer.autoClear,\n shadowAuto: renderer.shadowMap.autoUpdate, clearColor: renderer.getClearColor(new Color()), clearAlpha: renderer.getClearAlpha(),\n };\n const hidden: Object3D[] = [];\n const hide = (n: Object3D) => { if (n.visible) { n.visible = false; hidden.push(n); } };\n const restore = () => { hidden.forEach(n => { n.visible = true; }); hidden.length = 0; };\n try {\n // 1. the world, linear, into the offscreen target\n hide(this.stage.ui);\n if (selOnly && keep) this.hideUnselected(keep, hide);\n renderer.toneMapping = NoToneMapping;\n scene.background = null; scene.fog = null;\n this.globals.uPixelOut.value = 1;\n renderer.setRenderTarget(rt);\n renderer.setClearColor(0x000000, 0);\n renderer.autoClear = true;\n renderer.render(scene, camera);\n this.globals.uPixelOut.value = 0;\n restore();\n\n // 2. resolve to the canvas\n renderer.setRenderTarget(null);\n const u = this.quadMat.uniforms as Record<string, { value: unknown }>;\n u.tColor!.value = rt.texture;\n u.tDepth!.value = rt.depthTexture ?? rt.texture;\n (u.uSize!.value as Vector2).set(w, h);\n u.uNear!.value = camera.near; u.uFar!.value = camera.far;\n u.uExposure!.value = prev.tm === NoToneMapping ? 1 : renderer.toneMappingExposure;\n u.uDpr!.value = renderer.getPixelRatio();\n u.uPixel!.value = pixel ? 1 : 0;\n u.uChecker!.value = selOnly ? 1 : 0;\n rawVec(isolated ? 0x8894a6 : SKY, u.uBg!.value as Vector3);\n if (pixel) this.setPalette(palette, u);\n renderer.render(this.quadScene, this.quadCam);\n\n // 3. editor helpers on top at screen resolution\n if (this.stage.ui.children.some(c => c.visible)) {\n hide(this.stage.world);\n renderer.toneMapping = prev.tm;\n renderer.autoClear = false;\n renderer.shadowMap.autoUpdate = false;\n renderer.clearDepth();\n renderer.render(scene, camera);\n }\n } finally {\n this.globals.uPixelOut.value = 0;\n restore();\n renderer.setRenderTarget(null);\n renderer.toneMapping = prev.tm;\n renderer.autoClear = prev.autoClear;\n renderer.shadowMap.autoUpdate = prev.shadowAuto;\n renderer.setClearColor(prev.clearColor, prev.clearAlpha);\n scene.background = prev.bg; scene.fog = prev.fog;\n }\n }\n\n // Render selected only: the kept objects with their subtrees, the containers they sit in (without their own\n // meshes), and the lights.\n private hideUnselected(keep: readonly Object3D[], hide: (n: Object3D) => void): void {\n const kept = new Set<Object3D>(), path = new Set<Object3D>();\n keep.forEach(o => { o.traverse(n => kept.add(n)); for (let a = o.parent; a; a = a.parent) path.add(a); });\n const walk = (node: Object3D) => {\n for (const c of node.children) {\n if ((c as { isLight?: boolean }).isLight || kept.has(c)) continue;\n if (path.has(c)) { walk(c); continue; }\n hide(c);\n }\n };\n walk(this.stage.world);\n }\n\n private ensureTarget(w: number, h: number, pixel: boolean, smooth: boolean): WebGLRenderTarget {\n const r = this.stage.renderer;\n const half = r.extensions.has(\"EXT_color_buffer_float\") || r.extensions.has(\"EXT_color_buffer_half_float\");\n const key = [w, h, pixel ? 1 : 0, smooth ? 1 : 0, half ? 1 : 0].join(\"x\");\n if (this.target && this.targetKey === key) return this.target;\n if (this.target) { this.target.depthTexture?.dispose(); this.target.dispose(); }\n this.target = this.worldTarget(w, h, pixel, smooth, half);\n this.targetKey = key;\n return this.target;\n }\n\n /** The offscreen world pass: linear, with \"kind\" in alpha, and a depth texture for pixel-art outlines. */\n private worldTarget(w: number, h: number, pixel: boolean, smooth: boolean, half: boolean): WebGLRenderTarget {\n const filter = smooth ? LinearFilter : NearestFilter;\n const rt = new WebGLRenderTarget(w, h, {\n minFilter: filter, magFilter: filter, format: RGBAFormat, type: half ? HalfFloatType : UnsignedByteType,\n depthBuffer: true, stencilBuffer: false,\n });\n if (pixel) {\n // outlines read depth, so it needs to be a texture (and cannot be multisampled)\n rt.depthTexture = new DepthTexture(w, h, UnsignedIntType);\n rt.depthTexture.minFilter = rt.depthTexture.magFilter = NearestFilter;\n } else if (smooth) {\n rt.samples = 4;\n }\n return rt;\n }\n\n /**\n * A sprite bake: `keep` alone (lights stay, ground and helpers go) in pixel art into a `size`-square target, resolved\n * to sprite roles instead of colors, read back as RGBA bytes (rows from the bottom). The camera must already be\n * square. Nothing reaches the canvas.\n */\n renderSprite(size: number, palette: Palette, keep: readonly Object3D[]): Uint8Array {\n const { renderer, scene, camera } = this.stage;\n if (this.bake?.size !== size) {\n this.disposeBake();\n const r = this.stage.renderer;\n const half = r.extensions.has(\"EXT_color_buffer_float\") || r.extensions.has(\"EXT_color_buffer_half_float\");\n const roles = new WebGLRenderTarget(size, size, {\n minFilter: NearestFilter, magFilter: NearestFilter, format: RGBAFormat, type: UnsignedByteType, depthBuffer: false, stencilBuffer: false,\n });\n this.bake = { size, world: this.worldTarget(size, size, true, false, half), roles };\n }\n const { world, roles } = this.bake;\n const prev = {\n tm: renderer.toneMapping, bg: scene.background, fog: scene.fog, autoClear: renderer.autoClear,\n clearColor: renderer.getClearColor(new Color()), clearAlpha: renderer.getClearAlpha(),\n };\n const hidden: Object3D[] = [];\n const hide = (n: Object3D) => { if (n.visible) { n.visible = false; hidden.push(n); } };\n const u = this.quadMat.uniforms as Record<string, { value: unknown }>;\n try {\n hide(this.stage.ui);\n this.hideUnselected(keep, hide);\n renderer.toneMapping = NoToneMapping;\n scene.background = null; scene.fog = null;\n this.globals.uPixelOut.value = 1;\n renderer.setRenderTarget(world);\n renderer.setClearColor(0x000000, 0);\n renderer.autoClear = true;\n renderer.render(scene, camera);\n this.globals.uPixelOut.value = 0;\n\n u.tColor!.value = world.texture;\n u.tDepth!.value = world.depthTexture;\n (u.uSize!.value as Vector2).set(size, size);\n u.uNear!.value = camera.near; u.uFar!.value = camera.far;\n u.uPixel!.value = 1;\n u.uChecker!.value = 0;\n u.uIndexOut!.value = 1;\n this.setPalette(palette, u);\n renderer.setRenderTarget(roles);\n renderer.render(this.quadScene, this.quadCam);\n const out = new Uint8Array(size * size * 4);\n renderer.readRenderTargetPixels(roles, 0, 0, size, size, out);\n return out;\n } finally {\n u.uIndexOut!.value = 0;\n this.globals.uPixelOut.value = 0;\n hidden.forEach(n => { n.visible = true; });\n renderer.setRenderTarget(null);\n renderer.toneMapping = prev.tm;\n renderer.autoClear = prev.autoClear;\n renderer.setClearColor(prev.clearColor, prev.clearAlpha);\n scene.background = prev.bg; scene.fog = prev.fog;\n }\n }\n\n private disposeBake(): void {\n if (!this.bake) return;\n this.bake.world.depthTexture?.dispose();\n this.bake.world.dispose();\n this.bake.roles.dispose();\n this.bake = null;\n }\n\n private setPalette(palette: Palette, u: Record<string, { value: unknown }>): void {\n const hexes = [...PALETTE_ORDER.map(s => palette[s]), FIXED_COLORS.tongue, FIXED_COLORS.teeth, FIXED_COLORS.black].slice(0, PIXEL_MAX_PALETTE);\n const key = paletteKey(palette);\n if (key !== this.paletteKey) {\n this.paletteKey = key;\n hexes.forEach((hx, i) => {\n const t = paletteVariants(hx, FIXED_COLORS.black);\n linearVec(hx, (u.uPalRaw!.value as Vector3[])[i]!); // what a lit surface of this color renders as\n (u.uPalBase!.value as Vector3[])[i]!.set(t.base.r, t.base.g, t.base.b);\n (u.uPalLight!.value as Vector3[])[i]!.set(t.light.r, t.light.g, t.light.b);\n (u.uPalShade!.value as Vector3[])[i]!.set(t.shade.r, t.shade.g, t.shade.b);\n });\n }\n u.uPalCount!.value = hexes.length;\n rawVec(FIXED_COLORS.teeth, u.uTeeth!.value as Vector3);\n rawVec(FIXED_COLORS.black, u.uInk!.value as Vector3);\n }\n\n dispose(): void {\n this.disposeBake();\n this.target?.depthTexture?.dispose();\n this.target?.dispose();\n this.quadMat.dispose();\n }\n}\n", "import { PIXEL_MAX_PALETTE } from \"./render-settings.js\";\n\n/** The teeth color's place in the pixel-art palette list (the palette slots, then tongue, teeth, black). */\nexport const TEETH_INDEX = 8;\n/** A decal color farther than this (raw RGB distance) from every role color counts as approximated in a bake. */\nconst APPROX_DISTANCE = \"0.08\";\n\n/** Full-screen resolve of the offscreen world pass (the POC's rendering.js): tone mapping + sRGB, or pixel-art\n palette cel shading, dithering and depth outlines; background or a checkerboard behind transparent pixels. */\nexport const RESOLVE_FRAG = /* glsl */ `\nuniform sampler2D tColor;\nuniform sampler2D tDepth;\nuniform vec2 uSize;\nuniform float uNear;\nuniform float uFar;\nuniform float uExposure;\nuniform float uDpr;\nuniform float uPixel;\nuniform float uChecker;\nuniform vec3 uBg;\nuniform int uPalCount;\nuniform vec3 uPalRaw[${PIXEL_MAX_PALETTE}];\nuniform vec3 uPalBase[${PIXEL_MAX_PALETTE}];\nuniform vec3 uPalLight[${PIXEL_MAX_PALETTE}];\nuniform vec3 uPalShade[${PIXEL_MAX_PALETTE}];\nuniform vec3 uTeeth;\nuniform vec3 uInk;\nuniform float uEdge;\nuniform float uTone1;\nuniform float uTone2;\nuniform float uDither;\nuniform float uGlossWhite;\nuniform float uIndexOut;\nvarying vec2 vUv;\n\n// same curves three.js applies to a material's output on screen\nvec3 RRTAndODTFit(vec3 v) {\n vec3 a = v * (v + 0.0245786) - 0.000090537;\n vec3 b = v * (0.983729 * v + 0.4329510) + 0.238081;\n return a / b;\n}\nvec3 acesFilmic(vec3 color) {\n const mat3 inMat = mat3(vec3(0.59719, 0.07600, 0.02840), vec3(0.35458, 0.90834, 0.13383), vec3(0.04823, 0.01566, 0.83777));\n const mat3 outMat = mat3(vec3(1.60475, -0.10208, -0.00327), vec3(-0.53108, 1.10813, -0.07276), vec3(-0.07367, -0.00605, 1.07602));\n color *= uExposure / 0.6;\n color = inMat * color;\n color = RRTAndODTFit(color);\n color = outMat * color;\n return clamp(color, 0.0, 1.0);\n}\nvec3 toSRGB(vec3 c) {\n return mix(pow(c, vec3(0.41666)) * 1.055 - vec3(0.055), c * 12.92, vec3(lessThanEqual(c, vec3(0.0031308))));\n}\n\nfloat bayer2(vec2 a) { a = floor(a); return fract(a.x / 2.0 + a.y * a.y * 0.75); }\nfloat bayer4(vec2 a) { return bayer2(0.5 * a) * 0.25 + bayer2(a); }\n\nvec2 pixUv(vec2 p) { return (clamp(p, vec2(0.0), uSize - 1.0) + 0.5) / uSize; }\n\n// 1 / view-space depth: planes are linear in it across the screen, so a flat floor seen at a glancing\n// angle gives no edge while a real depth step does\nfloat invZ(vec2 p) {\n float d = texture2D(tDepth, pixUv(p)).r;\n float z = 2.0 * uNear * uFar / (uFar + uNear - (2.0 * d - 1.0) * (uFar - uNear));\n return 1.0 / z;\n}\nfloat kindAt(vec2 p) { return texture2D(tColor, pixUv(p)).a; }\n\n// A pixel is outline when a neighbour (4-connected) is clearly nearer than the surface around it and\n// that nearer neighbour is an object (not the ground): the line sits on the far side, outside the shape.\nbool outlineAt(vec2 p) {\n float w0 = invZ(p);\n for (int i = 0; i < 4; i++) {\n vec2 dir = (i == 0) ? vec2(1.0, 0.0) : ((i == 1) ? vec2(0.0, 1.0) : ((i == 2) ? vec2(-1.0, 0.0) : vec2(0.0, -1.0)));\n float wq = invZ(p + dir);\n float wq2 = invZ(p - dir);\n if (wq + wq2 - 2.0 * w0 > uEdge * max(wq, wq2)) {\n float nearer = (wq >= wq2) ? kindAt(p + dir) : kindAt(p - dir);\n if (nearer > 0.4) return true;\n }\n }\n return false;\n}\n\n// The pixel-art choice for a lit pixel, as a sprite role: 1 ink, or 2 + palette index \u00D7 3 + tone (0 base, 1 light,\n// 2 shade); a shiny surface's light tone is teeth-white (the teeth base role).\nfloat celRole(vec3 c, float gloss, vec2 p) {\n // Pixels from black decals or unlit black surfaces render directly as solid ink\n if (max(c.r, max(c.g, c.b)) < 0.05) return 1.0;\n\n vec3 base = vec3(0.0);\n float bestScore = 1e9;\n float bestS = 1.0;\n float bestI = 0.0;\n float cl = length(c) + 0.02;\n for (int i = 0; i < ${PIXEL_MAX_PALETTE}; i++) {\n if (i >= uPalCount) break;\n vec3 P = uPalRaw[i];\n float s = clamp(dot(c, P) / max(dot(P, P), 0.0001), 0.2, 4.0);\n float score = length(c - s * P) / cl + 0.12 * abs(log2(s / 1.25));\n if (score < bestScore) {\n bestScore = score; bestS = s; bestI = float(i);\n base = uPalBase[i];\n }\n }\n\n // Black from the palette stays flat: no teeth-white specular, no dithering, no stepping\n if (length(base - uInk) < 0.05 || length(base) < 0.10) return 1.0;\n\n float tau = log2(bestS) + (bayer4(p) - 0.47) * uDither;\n if (tau > uTone2) return (gloss > uGlossWhite) ? ${2 + TEETH_INDEX * 3}.0 : 2.0 + bestI * 3.0 + 1.0; // only shiny materials catch teeth-white light\n if (tau > uTone1) return 2.0 + bestI * 3.0;\n return 2.0 + bestI * 3.0 + 2.0;\n}\n\nvec3 roleColor(float role) {\n if (role < 1.5) return uInk;\n float k = role - 2.0;\n float slot = floor(k / 3.0 + 0.001);\n float tone = k - slot * 3.0;\n vec3 col = uInk;\n for (int i = 0; i < ${PIXEL_MAX_PALETTE}; i++) {\n if (float(i) == slot) col = (tone < 0.5) ? uPalBase[i] : ((tone < 1.5) ? uPalLight[i] : uPalShade[i]);\n }\n return col;\n}\n\nvec3 celShade(vec3 c, float gloss, vec2 p) { return roleColor(celRole(c, gloss, p)); }\n\n// A flat (decal) color as the nearest role: x the role, y 1 when the match is not close (art outside the palette)\nvec2 nearestRole(vec3 c) {\n if (max(c.r, max(c.g, c.b)) < 0.05) return vec2(1.0, 0.0);\n float best = length(c - uInk), role = 1.0;\n for (int i = 0; i < ${PIXEL_MAX_PALETTE}; i++) {\n if (i >= uPalCount) break;\n if (length(uPalBase[i] - uInk) < 0.05) continue;\n float d0 = length(c - uPalBase[i]), d1 = length(c - uPalLight[i]), d2 = length(c - uPalShade[i]);\n if (d0 < best) { best = d0; role = 2.0 + float(i) * 3.0; }\n if (d1 < best) { best = d1; role = 2.0 + float(i) * 3.0 + 1.0; }\n if (d2 < best) { best = d2; role = 2.0 + float(i) * 3.0 + 2.0; }\n }\n return vec2(role, best > ${APPROX_DISTANCE} ? 1.0 : 0.0);\n}\n\nvoid main() {\n vec2 p = floor(vUv * uSize);\n vec4 s = texture2D(tColor, (uPixel > 0.5) ? (p + 0.5) / uSize : vUv);\n // Sprite bake: the role of each pixel in red (/ 255), \"approximated\" in green\n if (uIndexOut > 0.5) {\n vec2 r = vec2(0.0);\n if (s.a > 0.05) {\n if (s.a >= 0.45 && s.a <= 0.50) r = nearestRole(s.rgb);\n else r = vec2(celRole(s.rgb, (s.a < 0.4) ? 0.0 : clamp((1.0 - s.a) * 2.0, 0.0, 1.0), p), 0.0);\n }\n if (outlineAt(p)) r = vec2(1.0, 0.0);\n gl_FragColor = vec4(r.x / 255.0, r.y, 0.0, 1.0);\n return;\n }\n vec3 bg = uBg;\n if (uChecker > 0.5) {\n vec2 g = floor(gl_FragCoord.xy / (9.0 * uDpr));\n bg = (mod(g.x + g.y, 2.0) < 0.5) ? vec3(0.96) : vec3(0.78);\n }\n vec3 col = bg;\n if (uPixel < 0.5) {\n if (s.a > 0.05) col = toSRGB(acesFilmic(s.rgb));\n } else {\n if (s.a > 0.05) {\n // Decal pixel: render flat and clean (no scene light, no shadows, no glossiness)\n // We use a broader threshold to catch blended light/shadow modifier pixels\n if (s.a >= 0.45 && s.a <= 0.50) {\n // Ensure pure black decals stay flat black, others render their flat color\n if (max(s.r, max(s.g, s.b)) < 0.05) col = uInk;\n else col = s.rgb;\n } else {\n float gloss = (s.a < 0.4) ? 0.0 : clamp((1.0 - s.a) * 2.0, 0.0, 1.0);\n col = celShade(s.rgb, gloss, p);\n }\n }\n if (outlineAt(p)) col = uInk;\n }\n gl_FragColor = vec4(col, 1.0);\n}\n`;\n", "import type { ColorRef, SculptLook } from \"@dreamy/api\";\n\n/** The POC's new-sculpt defaults (createNewSculptObject), for view-only sculpts (stress test). */\nexport const defaultLook = (color: ColorRef): SculptLook => ({\n color, foundationColor: color,\n fleck: { shape: \"pill\", size: 1, variation: 0, coverage: 1, regularity: 0, boil: 1, foundationDarkness: 0.08, normalStrength: 1 },\n material: { roughness: 0.8, metalness: 0, glow: 0, opacity: 1 },\n blend: 0.3,\n pattern: { kind: \"none\", scale: 1, strength: 1, rotation: { x: 0, y: 0, z: 0 }, color: \"black\", color2: \"highlight\" },\n});\n", "import type { ColorRef, Sculpt, SculptObject, Stamp, StampShape } from \"@dreamy/api\";\nimport { IDENTITY_QUAT } from \"../math/convert.js\";\nimport { defaultLook } from \"../objects/default-look.js\";\n\nconst SHAPES: readonly StampShape[] = [\"cube\", \"sphere\", \"cylinder\", \"torus\", \"cone\", \"pyramid\", \"prism\", \"octahedron\", \"capsule\", \"dome\"];\nconst COLORS: readonly ColorRef[] = [\"primary\", \"secondary\", \"detail\", \"highlight\", \"eye\", \"custom\"];\n\n/**\n * Stress test (the POC's modes.js): 24 compound sculpts on a 5 \u00D7 5 grid around the origin. View-only objects:\n * meshed and drawn like the creation's, never written to it, never selectable.\n */\nexport function stressTestObjects(rnd: () => number = Math.random): SculptObject[] {\n const pick = <T>(l: readonly T[]) => l[Math.floor(rnd() * l.length)] as T;\n const out: SculptObject[] = [];\n let n = 0;\n for (let x = -2; x <= 2; x++) {\n for (let z = -2; z <= 2; z++) {\n if (x === 0 && z === 0) continue;\n const color = pick(COLORS);\n const stamps: Stamp[] = [{ id: \"s0\", shape: pick(SHAPES), position: { x: 0, y: 0, z: 0 }, rotation: IDENTITY_QUAT, scale: { x: 2, y: 2, z: 2 }, mode: \"add\", color }];\n const adds = 2 + Math.floor(rnd() * 3);\n for (let k = 0; k < adds; k++) {\n const a = rnd() * Math.PI, b = rnd() * Math.PI;\n // XYZ euler (a, b, 0) as a quaternion\n const q = { x: Math.sin(a / 2) * Math.cos(b / 2), y: Math.cos(a / 2) * Math.sin(b / 2), z: Math.sin(a / 2) * Math.sin(b / 2), w: Math.cos(a / 2) * Math.cos(b / 2) };\n stamps.push({\n id: \"s\" + (k + 1), shape: pick(SHAPES), rotation: q, scale: { x: 1.4, y: 1.4, z: 1.4 },\n position: { x: (rnd() - 0.5) * 1.6, y: (rnd() - 0.5) * 1.6, z: (rnd() - 0.5) * 1.6 },\n mode: rnd() > 0.35 ? \"add\" : \"subtract\", color: pick(COLORS),\n });\n }\n const base = defaultLook(color);\n const sculpt: Sculpt = {\n stamps, smearGroups: [], decals: [], pivot: { position: { x: 0, y: 0, z: 0 }, rotation: IDENTITY_QUAT },\n look: {\n ...base,\n fleck: { ...base.fleck, size: 0.8 + rnd() * 0.8, variation: rnd() * 0.4, boil: 0.8 + rnd() * 1.5, shape: pick([\"pill\", \"circle\", \"square\"] as const) },\n },\n };\n out.push({ id: `stress:${n++}`, name: \"Stress\", kind: \"sculpt\", sculpt, transform: { position: { x: x * 5.5, y: 1.5, z: z * 5.5 }, rotation: IDENTITY_QUAT, scale: { x: 1, y: 1, z: 1 } } });\n }\n }\n return out;\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["Color", "p", "q", "Color", "Vector3", "eye", "Raycaster", "Vector3", "Color", "Color", "c", "DoubleSide", "Vector3", "Vector3", "Vector3", "Vector3", "Group", "Matrix4", "Quaternion", "Vector3", "Vector3", "Matrix4", "Quaternion", "Q", "Matrix3", "Matrix4", "Mesh", "Vector3", "Matrix4", "Quaternion", "Vector3", "Vector3", "Matrix4", "Quaternion", "room", "Vector3", "Vector3", "Mesh", "idx", "wt", "Vector3", "Matrix3", "Matrix4", "BufferAttribute", "BufferGeometry", "CanvasTexture", "DoubleSide", "Group", "Mesh", "SRGBColorSpace", "DoubleSide", "MeshStandardMaterial", "MeshStandardMaterial", "DoubleSide", "BufferAttribute", "BufferGeometry", "Vector3", "mark", "CanvasTexture", "SRGBColorSpace", "Mesh", "BufferGeometry", "DoubleSide", "Group", "BufferAttribute", "Group", "Vector2", "Vector3", "DoubleSide", "CanvasTexture", "DoubleSide", "Matrix4", "Mesh", "PlaneGeometry", "SRGBColorSpace", "Vector3", "Matrix4", "Quaternion", "Vector3", "Plane", "Vector3", "Mesh", "PlaneGeometry", "DoubleSide", "Vector3", "CanvasTexture", "SRGBColorSpace", "Matrix4", "room", "Box3", "Matrix4", "Object3D", "Quaternion", "Vector3", "Object3D", "Box3", "Matrix4", "Vector3", "Quaternion", "BufferGeometry", "Group", "Quaternion", "Mesh", "MeshBasicMaterial", "Vector3", "BufferGeometry", "Vector3", "MeshBasicMaterial", "Mesh", "Group", "Quaternion", "Box3", "Vector3", "Vector3", "rect", "Box3", "Box3", "Color", "Mesh", "MeshBasicMaterial", "Quaternion", "Vector3", "Matrix4", "Quaternion", "Vector3", "BufferGeometry", "Shape", "SphereGeometry", "Vector2", "line", "g", "Mesh", "MeshBasicMaterial", "Quaternion", "Vector3", "p", "Box3", "BufferGeometry", "Group", "LineBasicMaterial", "Quaternion", "Vector3", "MODE_COLORS", "LineBasicMaterial", "BufferGeometry", "Group", "Box3", "Vector3", "Quaternion", "Box3", "Matrix4", "Vector3", "Box3", "Vector3", "Matrix4", "Box3", "BufferAttribute", "BufferGeometry", "Color", "Group", "LineBasicMaterial", "LineSegments", "Vector3", "Color", "Group", "BufferGeometry", "BufferAttribute", "Box3", "Vector3", "LineSegments", "LineBasicMaterial", "Vector3", "Vector3", "Color", "Group", "Mesh", "MeshStandardMaterial", "Scene", "SphereGeometry", "SRGBColorSpace", "Vector3", "WebGLRenderer", "Mesh", "Scene", "ShaderMaterial", "SphereGeometry", "Vector3", "globals", "WebGLRenderer", "SRGBColorSpace", "Scene", "Color", "Group", "Mesh", "SphereGeometry", "MeshStandardMaterial", "Vector3", "Mesh", "MeshStandardMaterial", "SphereGeometry", "Vector3", "Vector3", "Mesh", "SphereGeometry", "MeshStandardMaterial", "Color", "LinearFilter", "Mesh", "NearestFilter", "OrthographicCamera", "PlaneGeometry", "RGBAFormat", "Scene", "ShaderMaterial", "Vector2", "Vector3", "globals", "v3", "Vector3", "ShaderMaterial", "Vector2", "Mesh", "PlaneGeometry", "Scene", "OrthographicCamera", "Color", "LinearFilter", "NearestFilter", "RGBAFormat", "roles", "globals", "Raycaster", "Vector3"]
7
+ }